diff --git a/core/src/main/assets/messages/misc/misc.properties b/core/src/main/assets/messages/misc/misc.properties index 3945cdfe0..6b84482a8 100644 --- a/core/src/main/assets/messages/misc/misc.properties +++ b/core/src/main/assets/messages/misc/misc.properties @@ -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_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_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 diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Tengu.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Tengu.java index a46db9377..4b7d90231 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Tengu.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Tengu.java @@ -23,6 +23,7 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Badges; +import com.shatteredpixel.shatteredpixeldungeon.Challenges; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; 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.utils.Bundle; import com.watabou.utils.Callback; +import com.watabou.utils.GameMath; import com.watabou.utils.PathFinder; import com.watabou.utils.PointF; import com.watabou.utils.Random; @@ -81,7 +83,7 @@ public class Tengu extends Mob { { spriteClass = TenguSprite.class; - HP = HT = 200; + HP = HT = Dungeon.isChallenged(Challenges.STRONGER_BOSSES) ? 250 : 200; EXP = 20; defenseSkill = 15; @@ -434,8 +436,9 @@ public class Tengu extends Mob { abilityCooldown--; - if (targetAbilityUses() - abilitiesUsed >= 4){ + if (targetAbilityUses() - abilitiesUsed >= 4 && !Dungeon.isChallenged(Challenges.STRONGER_BOSSES)){ //Very behind in ability uses, use one right away! + //but not on bosses challenge, we already cast quickly then abilityCooldown = 0; } else if (targetAbilityUses() - abilitiesUsed >= 3){ @@ -475,6 +478,8 @@ public class Tengu extends Mob { abilityToUse = BOMB_ABILITY; } else if (abilitiesUsed == 1){ 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 { abilityToUse = Random.Int(3); } @@ -502,15 +507,27 @@ public class Tengu extends Mob { } 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 - if (targetAbilityUses() - abilitiesUsed >= 4){ - spend(TICK); + //spend 1 less turn if seriously behind on ability uses + if (Dungeon.isChallenged(Challenges.STRONGER_BOSSES)){ + if (targetAbilityUses() - abilitiesUsed >= 4) { + //spend no time + } else { + spend(TICK); + } } else { - spend(2 * TICK); + if (targetAbilityUses() - abilitiesUsed >= 4) { + spend(TICK); + } else { + spend(2 * TICK); + } } lastAbility = abilityToUse; @@ -527,14 +544,12 @@ public class Tengu extends Mob { 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){ int cell = target.pos + i; - if (Dungeon.level.distance(cell, thrower.pos) >= 3 && !Dungeon.level.solid[cell]){ - if (targetCell == -1 || - Dungeon.level.trueDistance(cell, thrower.pos) < Dungeon.level.trueDistance(targetCell, thrower.pos)){ - targetCell = cell; - } + if (targetCell == -1 || + Dungeon.level.trueDistance(cell, thrower.pos) < Dungeon.level.trueDistance(targetCell, thrower.pos)){ + targetCell = cell; } } @@ -811,7 +826,7 @@ public class Tengu extends Mob { for (int i = area.left; i < area.right; i++){ for (int j = area.top; j < area.bottom; j++){ 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) { volume += off[cell]; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/PrisonBossLevel.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/PrisonBossLevel.java index daa0fa7ae..fb568cb2d 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/PrisonBossLevel.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/PrisonBossLevel.java @@ -23,6 +23,7 @@ package com.shatteredpixel.shatteredpixeldungeon.levels; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Bones; +import com.shatteredpixel.shatteredpixeldungeon.Challenges; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; @@ -572,15 +573,23 @@ public class PrisonBossLevel extends Level { int heroPos = heroPoint.x-(tenguCell.left+1) + (heroPoint.y-(tenguCell.top+1))*7; 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 { + tries++; trapsPatch = Patch.generate(7, 7, fill, 0, false); - + PathFinder.buildDistanceMap(tenguPos, BArray.not(trapsPatch, null)); //note that the effective range of fill is 40%-90% //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)) || (PathFinder.distance[heroPos] > Math.ceil(4 + 4*fill)))); + System.out.println(tries); PathFinder.setMapSize(width(), height()); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/TenguDartTrap.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/TenguDartTrap.java index 8db9d7258..aefb501d0 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/TenguDartTrap.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/TenguDartTrap.java @@ -21,6 +21,8 @@ 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.mobs.Tengu; @@ -33,7 +35,11 @@ public class TenguDartTrap extends PoisonDartTrap { @Override 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