v0.9.3: adjusted Tengu for bosses challenge:

Baseline changes:
- Tengu can now throw bombs near to himself
- fixed odd behaviour when fire ability stacks
Challenge changes:
- HP up to 250 from 200
- 1st phase traps are much deadlier
- 2nd phase abilities are used more often
This commit is contained in:
Evan Debenham 2021-04-11 21:46:48 -04:00
parent 741420bc34
commit 9a8c127709
4 changed files with 47 additions and 17 deletions

View File

@ -86,6 +86,6 @@ challenges.no_scrolls_desc=A certain rune is harder to find. Unfortunately, it's
challenges.champion_enemies=Hostile champions challenges.champion_enemies=Hostile champions
challenges.champion_enemies_desc=You're not the only one who can level up!\n\n- Regular enemies have a 1/8 chance to spawn with a special champion buff.\n- Champions wake up if they spawn asleep\n- The hero knows when a champion spawns\n- Champions are immune to corruption\n\nThere are six types of champion enemy:\n_Blazing (orange):_ +25% melee damage, ignites on hit, immune to fire, spreads flames on death\n_Projecting (purple):_ +25% melee damage, can attack anything they see\n_Antimagic (green):_ -25% damage taken, immune to magical effects\n_Giant (blue):_ -75% damage taken, +1 melee range, cannot move into tunnels\n_Blessed (yellow):_ +200% accuracy, +200% evasion\n_Growing (red):_ +20% accuracy, evasion, damage, and effective HP. Increases by 1% every 3 turns. challenges.champion_enemies_desc=You're not the only one who can level up!\n\n- Regular enemies have a 1/8 chance to spawn with a special champion buff.\n- Champions wake up if they spawn asleep\n- The hero knows when a champion spawns\n- Champions are immune to corruption\n\nThere are six types of champion enemy:\n_Blazing (orange):_ +25% melee damage, ignites on hit, immune to fire, spreads flames on death\n_Projecting (purple):_ +25% melee damage, can attack anything they see\n_Antimagic (green):_ -25% damage taken, immune to magical effects\n_Giant (blue):_ -75% damage taken, +1 melee range, cannot move into tunnels\n_Blessed (yellow):_ +200% accuracy, +200% evasion\n_Growing (red):_ +20% accuracy, evasion, damage, and effective HP. Increases by 1% every 3 turns.
challenges.stronger_bosses=Badder bosses challenges.stronger_bosses=Badder bosses
challenges.stronger_bosses_desc=TODO\n\n_Goo:_ +20% health\n_-_ Healing in water ramps up, to a max of 3/turn\n_-_ Pumps up in 1 turn instead of 2 challenges.stronger_bosses_desc=TODO\n\n_Goo:_ +20% health\n_-_ Healing in water ramps up, to a max of 3/turn\n_-_ Pumps up in 1 turn instead of 2\n\n_Tengu:_ +25% health\n_-_ 1st phase traps are much deadlier\n_-_ 2nd phase abilities are more frequent
rankings$record.something=Killed by Something rankings$record.something=Killed by Something

View File

@ -23,6 +23,7 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Badges; import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Challenges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
@ -69,6 +70,7 @@ import com.watabou.noosa.audio.Sample;
import com.watabou.noosa.particles.Emitter; import com.watabou.noosa.particles.Emitter;
import com.watabou.utils.Bundle; import com.watabou.utils.Bundle;
import com.watabou.utils.Callback; import com.watabou.utils.Callback;
import com.watabou.utils.GameMath;
import com.watabou.utils.PathFinder; import com.watabou.utils.PathFinder;
import com.watabou.utils.PointF; import com.watabou.utils.PointF;
import com.watabou.utils.Random; import com.watabou.utils.Random;
@ -81,7 +83,7 @@ public class Tengu extends Mob {
{ {
spriteClass = TenguSprite.class; spriteClass = TenguSprite.class;
HP = HT = 200; HP = HT = Dungeon.isChallenged(Challenges.STRONGER_BOSSES) ? 250 : 200;
EXP = 20; EXP = 20;
defenseSkill = 15; defenseSkill = 15;
@ -434,8 +436,9 @@ public class Tengu extends Mob {
abilityCooldown--; abilityCooldown--;
if (targetAbilityUses() - abilitiesUsed >= 4){ if (targetAbilityUses() - abilitiesUsed >= 4 && !Dungeon.isChallenged(Challenges.STRONGER_BOSSES)){
//Very behind in ability uses, use one right away! //Very behind in ability uses, use one right away!
//but not on bosses challenge, we already cast quickly then
abilityCooldown = 0; abilityCooldown = 0;
} else if (targetAbilityUses() - abilitiesUsed >= 3){ } else if (targetAbilityUses() - abilitiesUsed >= 3){
@ -475,6 +478,8 @@ public class Tengu extends Mob {
abilityToUse = BOMB_ABILITY; abilityToUse = BOMB_ABILITY;
} else if (abilitiesUsed == 1){ } else if (abilitiesUsed == 1){
abilityToUse = SHOCKER_ABILITY; abilityToUse = SHOCKER_ABILITY;
} else if (Dungeon.isChallenged(Challenges.STRONGER_BOSSES)) {
abilityToUse = Random.Int(2)*2; //0 or 2, can't roll fire ability with challenge
} else { } else {
abilityToUse = Random.Int(3); abilityToUse = Random.Int(3);
} }
@ -502,15 +507,27 @@ public class Tengu extends Mob {
} }
break; break;
} }
//always use the fire ability with the bosses challenge
if (abilityUsed && abilityToUse != FIRE_ABILITY && Dungeon.isChallenged(Challenges.STRONGER_BOSSES)){
throwFire(Tengu.this, enemy);
}
} }
} }
//spend only 1 turn if seriously behind on ability uses //spend 1 less turn if seriously behind on ability uses
if (targetAbilityUses() - abilitiesUsed >= 4){ if (Dungeon.isChallenged(Challenges.STRONGER_BOSSES)){
spend(TICK); if (targetAbilityUses() - abilitiesUsed >= 4) {
//spend no time
} else {
spend(TICK);
}
} else { } else {
spend(2 * TICK); if (targetAbilityUses() - abilitiesUsed >= 4) {
spend(TICK);
} else {
spend(2 * TICK);
}
} }
lastAbility = abilityToUse; lastAbility = abilityToUse;
@ -527,14 +544,12 @@ public class Tengu extends Mob {
int targetCell = -1; int targetCell = -1;
//Targets closest cell which is adjacent to target, and at least 3 tiles away //Targets closest cell which is adjacent to target
for (int i : PathFinder.NEIGHBOURS8){ for (int i : PathFinder.NEIGHBOURS8){
int cell = target.pos + i; int cell = target.pos + i;
if (Dungeon.level.distance(cell, thrower.pos) >= 3 && !Dungeon.level.solid[cell]){ if (targetCell == -1 ||
if (targetCell == -1 || Dungeon.level.trueDistance(cell, thrower.pos) < Dungeon.level.trueDistance(targetCell, thrower.pos)){
Dungeon.level.trueDistance(cell, thrower.pos) < Dungeon.level.trueDistance(targetCell, thrower.pos)){ targetCell = cell;
targetCell = cell;
}
} }
} }
@ -811,7 +826,7 @@ public class Tengu extends Mob {
for (int i = area.left; i < area.right; i++){ for (int i = area.left; i < area.right; i++){
for (int j = area.top; j < area.bottom; j++){ for (int j = area.top; j < area.bottom; j++){
cell = i + j* Dungeon.level.width(); cell = i + j* Dungeon.level.width();
off[cell] = cur[cell] > 0 ? cur[cell] - 1 : 0; off[cell] = (int)GameMath.gate(0, cur[cell] - 1, 1);
if (off[cell] > 0) { if (off[cell] > 0) {
volume += off[cell]; volume += off[cell];

View File

@ -23,6 +23,7 @@ package com.shatteredpixel.shatteredpixeldungeon.levels;
import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Bones; import com.shatteredpixel.shatteredpixeldungeon.Bones;
import com.shatteredpixel.shatteredpixeldungeon.Challenges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
@ -573,7 +574,14 @@ public class PrisonBossLevel extends Level {
boolean[] trapsPatch; boolean[] trapsPatch;
//fill ramps up much faster during challenge, effectively 78%-90%
if (Dungeon.isChallenged(Challenges.STRONGER_BOSSES)){
fill = 0.675f + fill/4f;
}
int tries = 0;
do { do {
tries++;
trapsPatch = Patch.generate(7, 7, fill, 0, false); trapsPatch = Patch.generate(7, 7, fill, 0, false);
PathFinder.buildDistanceMap(tenguPos, BArray.not(trapsPatch, null)); PathFinder.buildDistanceMap(tenguPos, BArray.not(trapsPatch, null));
@ -581,6 +589,7 @@ public class PrisonBossLevel extends Level {
//so distance to tengu starts at 3-6 tiles and scales up to 7-8 as fill increases //so distance to tengu starts at 3-6 tiles and scales up to 7-8 as fill increases
} while (((PathFinder.distance[heroPos] < Math.ceil(7*fill)) } while (((PathFinder.distance[heroPos] < Math.ceil(7*fill))
|| (PathFinder.distance[heroPos] > Math.ceil(4 + 4*fill)))); || (PathFinder.distance[heroPos] > Math.ceil(4 + 4*fill))));
System.out.println(tries);
PathFinder.setMapSize(width(), height()); PathFinder.setMapSize(width(), height());

View File

@ -21,6 +21,8 @@
package com.shatteredpixel.shatteredpixeldungeon.levels.traps; package com.shatteredpixel.shatteredpixeldungeon.levels.traps;
import com.shatteredpixel.shatteredpixeldungeon.Challenges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Tengu; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Tengu;
@ -33,7 +35,11 @@ public class TenguDartTrap extends PoisonDartTrap {
@Override @Override
protected int poisonAmount() { protected int poisonAmount() {
return 8; //17 damage total if (Dungeon.isChallenged(Challenges.STRONGER_BOSSES)){
return 15; //50 damage total, equal to poison dart traps on floor 10
} else {
return 8; //17 damage total
}
} }
@Override @Override