From bf4fd5c66f33b4852571cf1e50e7e290a1f8af0f Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Mon, 7 Oct 2024 12:22:43 -0400 Subject: [PATCH] v2.5.4: buffs on enemies can now also use the revivepersists property --- .../actors/buffs/AllyBuff.java | 6 ++++- .../actors/buffs/Buff.java | 2 +- .../actors/buffs/ChampionEnemy.java | 1 + .../actors/hero/HeroClass.java | 4 ++-- .../actors/hero/abilities/Ratmogrify.java | 24 ++++++------------- .../actors/mobs/DwarfKing.java | 4 ++++ .../actors/mobs/Ghoul.java | 15 +++++------- .../actors/mobs/Necromancer.java | 11 ++++----- .../actors/mobs/SpectralNecromancer.java | 11 ++++----- .../actors/mobs/Swarm.java | 11 ++++----- .../items/artifacts/MasterThievesArmband.java | 1 + 11 files changed, 39 insertions(+), 51 deletions(-) diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/AllyBuff.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/AllyBuff.java index 018490a84..a64062095 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/AllyBuff.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/AllyBuff.java @@ -34,7 +34,11 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite; //generic class for buffs which convert an enemy into an ally // There is a decent amount of logic that ties into this, which is why it has its own abstract class -public abstract class AllyBuff extends Buff{ +public abstract class AllyBuff extends Buff { + + { + revivePersists = true; + } @Override public boolean attachTo(Char target) { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Buff.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Buff.java index 1ea74f2f8..829414bd7 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Buff.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Buff.java @@ -45,7 +45,7 @@ public class Buff extends Actor { //whether or not the buff announces its name public boolean announced = false; - //whether a buff should persist through revive effects for the hero + //whether a buff should persist through revive effects or similar (e.g. transmogrify) public boolean revivePersists = false; protected HashSet resistances = new HashSet<>(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ChampionEnemy.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ChampionEnemy.java index 3f4dbd141..d13c6ec38 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ChampionEnemy.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ChampionEnemy.java @@ -41,6 +41,7 @@ public abstract class ChampionEnemy extends Buff { { type = buffType.POSITIVE; + revivePersists = true; } protected int color; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroClass.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroClass.java index 92bb5515f..0e9645e89 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroClass.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroClass.java @@ -28,6 +28,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.QuickSlot; import com.shatteredpixel.shatteredpixeldungeon.SPDSettings; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.ArmorAbility; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.Ratmogrify; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.duelist.Challenge; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.duelist.ElementalStrike; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.duelist.Feint; @@ -40,7 +41,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.mage.WildM import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.rogue.DeathMark; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.rogue.ShadowClone; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.rogue.SmokeBomb; -import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.warrior.Endure; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.warrior.HeroicLeap; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.warrior.Shockwave; import com.shatteredpixel.shatteredpixeldungeon.items.BrokenSeal; @@ -249,7 +249,7 @@ public enum HeroClass { public ArmorAbility[] armorAbilities(){ switch (this) { case WARRIOR: default: - return new ArmorAbility[]{new HeroicLeap(), new Shockwave(), new Endure()}; + return new ArmorAbility[]{new HeroicLeap(), new Shockwave(), new Ratmogrify()}; case MAGE: return new ArmorAbility[]{new ElementalBlast(), new WildMagic(), new WarpBeacon()}; case ROGUE: diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/Ratmogrify.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/Ratmogrify.java index 5d9ae959f..f4fa87bb4 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/Ratmogrify.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/Ratmogrify.java @@ -29,7 +29,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Adrenaline; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AllyBuff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AscensionChallenge; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ChampionEnemy; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; @@ -38,7 +37,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Rat; import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; import com.shatteredpixel.shatteredpixeldungeon.items.armor.ClassArmor; -import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.MasterThievesArmband; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTeleportation; import com.shatteredpixel.shatteredpixeldungeon.journal.Bestiary; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; @@ -140,28 +138,20 @@ public class Ratmogrify extends ArmorAbility { rat.setup((Mob)ch); rat.pos = ch.pos; - //preserve champion enemy buffs - HashSet champBuffs = ch.buffs(ChampionEnemy.class); - for (ChampionEnemy champ : champBuffs){ - if (ch.remove(champ)) { - ch.sprite.clearAura(); + //preserve some buffs + HashSet persistentBuffs = new HashSet<>(); + for (Buff b : ch.buffs()){ + if (b.revivePersists){ + persistentBuffs.add(b); } } - MasterThievesArmband.StolenTracker stealTracker = ch.buff(MasterThievesArmband.StolenTracker.class); - if (stealTracker != null){ - ch.remove(stealTracker); - } - Actor.remove( ch ); ch.sprite.killAndErase(); Dungeon.level.mobs.remove(ch); - for (ChampionEnemy champ : champBuffs){ - ch.add(champ); - } - if (stealTracker != null) { - ch.add(stealTracker); + for (Buff b : persistentBuffs){ + ch.add(b); } GameScene.add(rat); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DwarfKing.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DwarfKing.java index 66ffd3f6c..987a7703e 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DwarfKing.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DwarfKing.java @@ -758,6 +758,10 @@ public class DwarfKing extends Mob { public static class KingDamager extends Buff { + { + revivePersists = true; + } + @Override public boolean act() { if (target.alignment != Alignment.ENEMY){ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Ghoul.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Ghoul.java index 96e1786b3..77474f1be 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Ghoul.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Ghoul.java @@ -25,14 +25,11 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.SacrificialFire; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AllyBuff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ChampionEnemy; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.duelist.Challenge; import com.shatteredpixel.shatteredpixeldungeon.effects.FloatingText; import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing; import com.shatteredpixel.shatteredpixeldungeon.items.Gold; -import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.MasterThievesArmband; import com.shatteredpixel.shatteredpixeldungeon.levels.features.Chasm; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite; @@ -137,8 +134,11 @@ public class Ghoul extends Mob { Actor.add( new Pushing( child, pos, child.pos ) ); } - for (Buff b : buffs(ChampionEnemy.class)){ - Buff.affect( child, b.getClass()); + //champion buff, mainly + for (Buff b : buffs()){ + if (b.revivePersists) { + Buff.affect(child, b.getClass()); + } } } @@ -184,10 +184,7 @@ public class Ghoul extends Mob { if (buff instanceof SacrificialFire.Marked){ //don't remove and postpone so marked stays on Buff.prolong(this, SacrificialFire.Marked.class, timesDowned*5); - } else if (buff instanceof AllyBuff - || buff instanceof ChampionEnemy - || buff instanceof MasterThievesArmband.StolenTracker - || buff instanceof DwarfKing.KingDamager) { + } else if (buff.revivePersists) { //don't remove } else { buff.detach(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Necromancer.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Necromancer.java index f1b5b6ccd..60a710c3a 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Necromancer.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Necromancer.java @@ -26,9 +26,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Adrenaline; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AllyBuff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ChampionEnemy; import com.shatteredpixel.shatteredpixeldungeon.effects.Beam; import com.shatteredpixel.shatteredpixeldungeon.effects.FloatingText; import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing; @@ -247,11 +245,10 @@ public class Necromancer extends Mob { Dungeon.level.occupyCell( mySkeleton ); ((NecromancerSprite)sprite).finishSummoning(); - for (Buff b : buffs(AllyBuff.class)){ - Buff.affect(mySkeleton, b.getClass()); - } - for (Buff b : buffs(ChampionEnemy.class)){ - Buff.affect( mySkeleton, b.getClass()); + for (Buff b : buffs()){ + if (b.revivePersists) { + Buff.affect(mySkeleton, b.getClass()); + } } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/SpectralNecromancer.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/SpectralNecromancer.java index 201c26268..1aabce4f2 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/SpectralNecromancer.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/SpectralNecromancer.java @@ -25,9 +25,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Badges; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AllyBuff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ChampionEnemy; import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRemoveCurse; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; @@ -160,11 +158,10 @@ public class SpectralNecromancer extends Necromancer { Dungeon.level.occupyCell( wraith ); ((SpectralNecromancerSprite)sprite).finishSummoning(); - for (Buff b : buffs(AllyBuff.class)){ - Buff.affect( wraith, b.getClass()); - } - for (Buff b : buffs(ChampionEnemy.class)){ - Buff.affect( wraith, b.getClass()); + for (Buff b : buffs()){ + if (b.revivePersists) { + Buff.affect(wraith, b.getClass()); + } } wraithIDs.add(wraith.id()); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Swarm.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Swarm.java index 2b87dbb69..cc2d92393 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Swarm.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Swarm.java @@ -24,10 +24,8 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AllyBuff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Burning; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ChampionEnemy; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Poison; import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing; import com.shatteredpixel.shatteredpixeldungeon.items.Item; @@ -136,11 +134,10 @@ public class Swarm extends Mob { if (buff( Poison.class ) != null) { Buff.affect( clone, Poison.class ).set(2); } - for (Buff b : buffs(AllyBuff.class)){ - Buff.affect( clone, b.getClass()); - } - for (Buff b : buffs(ChampionEnemy.class)){ - Buff.affect( clone, b.getClass()); + for (Buff b : buffs()){ + if (b.revivePersists) { + Buff.affect(clone, b.getClass()); + } } return clone; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/MasterThievesArmband.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/MasterThievesArmband.java index 8e93ef2b4..71518e636 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/MasterThievesArmband.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/MasterThievesArmband.java @@ -207,6 +207,7 @@ public class MasterThievesArmband extends Artifact { //counter of 0 for attempt but no success, 1 for success public static class StolenTracker extends CounterBuff { + { revivePersists = true; } public void setItemStolen(boolean stolen){ if (stolen) countUp(1); } public boolean itemWasStolen(){ return count() > 0; } }