From 02e0de6273d09f8c7287c0b5827e6f899d91a505 Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Tue, 23 Oct 2018 18:41:49 -0400 Subject: [PATCH] v0.7.0a: bugfixes: - fixed crashes when tengu is healed and then damaged - fixed deaths to arcane and shrapnel bombs not appearing in rankings - fixed runs from before 0.7.0 getting a laboratory every floor - fixed visual bugs involving alchemist's toolkit --- .../actors/mobs/Tengu.java | 21 ++++++++++++------- .../items/bombs/ArcaneBomb.java | 2 ++ .../items/bombs/ShrapnelBomb.java | 2 ++ .../levels/PrisonBossLevel.java | 6 +++++- .../levels/rooms/special/SpecialRoom.java | 5 ++++- .../scenes/AlchemyScene.java | 1 + 6 files changed, 28 insertions(+), 9 deletions(-) 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 aef53e44d..b661da2bf 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 @@ -88,6 +88,15 @@ public class Tengu extends Mob { @Override public void damage(int dmg, Object src) { + + PrisonBossLevel.State state = ((PrisonBossLevel)Dungeon.level).state(); + + int hpBracket; + if (state == PrisonBossLevel.State.FIGHT_START){ + hpBracket = 12; + } else { + hpBracket = 20; + } int beforeHitHP = HP; super.damage(dmg, src); @@ -95,20 +104,18 @@ public class Tengu extends Mob { LockedFloor lock = Dungeon.hero.buff(LockedFloor.class); if (lock != null) { - int multiple = beforeHitHP > HT/2 ? 1 : 4; + int multiple = state == PrisonBossLevel.State.FIGHT_START ? 1 : 4; lock.addTime(dmg*multiple); } //phase 2 of the fight is over - if (HP == 0 && beforeHitHP <= HT/2) { + if (HP == 0 && state == PrisonBossLevel.State.FIGHT_ARENA) { ((PrisonBossLevel)Dungeon.level).progress(); return; } - - int hpBracket = beforeHitHP > HT/2 ? 12 : 20; - + //phase 1 of the fight is over - if (beforeHitHP > HT/2 && HP <= HT/2){ + if (state == PrisonBossLevel.State.FIGHT_START && HP <= HT/2){ HP = (HT/2)-1; yell(Messages.get(this, "interesting")); ((PrisonBossLevel)Dungeon.level).progress(); @@ -175,7 +182,7 @@ public class Tengu extends Mob { int newPos; //if we're in phase 1, want to warp around within the room - if (HP > HT/2) { + if (((PrisonBossLevel)Dungeon.level).state() == PrisonBossLevel.State.FIGHT_START) { //place new traps int tries; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/ArcaneBomb.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/ArcaneBomb.java index bcb9b6ac5..de082f539 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/ArcaneBomb.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/ArcaneBomb.java @@ -72,6 +72,8 @@ public class ArcaneBomb extends Bomb { //regular bomb damage, but pierces armor int damage = Math.round(Random.NormalIntRange( Dungeon.depth+5, 10 + Dungeon.depth * 2 )); ch.damage(damage, this); + if (ch == Dungeon.hero && !ch.isAlive()) + Dungeon.fail(Bomb.class); } } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/ShrapnelBomb.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/ShrapnelBomb.java index 8af35dbdd..bcea9dba4 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/ShrapnelBomb.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/ShrapnelBomb.java @@ -62,6 +62,8 @@ public class ShrapnelBomb extends Bomb { int damage = Math.round(Random.NormalIntRange( Dungeon.depth+5, 10 + Dungeon.depth * 2 )); damage -= ch.drRoll(); ch.damage(damage, this); + if (ch == Dungeon.hero && !ch.isAlive()) + Dungeon.fail(Bomb.class); } } } 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 d8e6f36f9..67e5f1dd2 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/PrisonBossLevel.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/PrisonBossLevel.java @@ -60,7 +60,7 @@ public class PrisonBossLevel extends Level { color2 = 0x88924c; } - private enum State{ + public enum State { START, FIGHT_START, MAZE, @@ -70,6 +70,10 @@ public class PrisonBossLevel extends Level { private State state; private Tengu tengu; + + public State state(){ + return state; + } //keep track of that need to be removed as the level is changed. We dump 'em back into the level at the end. private ArrayList storedItems = new ArrayList<>(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/SpecialRoom.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/SpecialRoom.java index 8e7e83e4d..d18ffd9c2 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/SpecialRoom.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/SpecialRoom.java @@ -149,7 +149,10 @@ public class SpecialRoom extends Room { runSpecials.clear(); if (bundle.contains( ROOMS )) { for (Class type : bundle.getClassArray(ROOMS)) { - if (type != null) runSpecials.add(type); + //pre-0.7.0 saves + if (type != null && type != LaboratoryRoom.class) { + runSpecials.add(type); + } } } else { initForRun(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/AlchemyScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/AlchemyScene.java index c3e7d53dd..052e2d967 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/AlchemyScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/AlchemyScene.java @@ -305,6 +305,7 @@ public class AlchemyScene extends PixelScene { if (item instanceof Dart) { inputs[i].item(item.detachAll(Dungeon.hero.belongings.backpack)); } else if (item instanceof AlchemistsToolkit) { + clearSlots(); inputs[i].item(item); } else { inputs[i].item(item.detach(Dungeon.hero.belongings.backpack));