diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java index 2913162a7..240f3173a 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java @@ -26,6 +26,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Electricity; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.ToxicGas; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Adrenaline; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AllyBuff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ArcaneArmor; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Barkskin; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Berserk; @@ -884,9 +885,9 @@ public abstract class Char extends Actor { public enum Property{ BOSS ( new HashSet( Arrays.asList(Grim.class, GrimTrap.class, ScrollOfRetribution.class, ScrollOfPsionicBlast.class)), - new HashSet( Arrays.asList(Corruption.class, Dread.class) )), + new HashSet( Arrays.asList(AllyBuff.class, Dread.class) )), MINIBOSS ( new HashSet(), - new HashSet( Arrays.asList(Corruption.class, Dread.class) )), + new HashSet( Arrays.asList(AllyBuff.class, Dread.class) )), UNDEAD, DEMONIC, INORGANIC ( new HashSet(), 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 new file mode 100644 index 000000000..02b9657cd --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/AllyBuff.java @@ -0,0 +1,48 @@ +package com.shatteredpixel.shatteredpixeldungeon.actors.buffs; + +import com.shatteredpixel.shatteredpixeldungeon.Badges; +import com.shatteredpixel.shatteredpixeldungeon.Statistics; +import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; +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{ + + @Override + public boolean attachTo(Char target) { + if (super.attachTo(target)){ + target.alignment = Char.Alignment.ALLY; + if (target.buff(PinCushion.class) != null){ + target.buff(PinCushion.class).detach(); + } + return true; + } else { + return false; + } + } + + //for when applying an ally buff should also cause that enemy to give exp/loot as if they had died + //consider that chars with the ally alignment do not drop items or award exp on death + public static void affectAndLoot(Mob enemy, Hero hero, Class buffCls){ + boolean droppingLoot = enemy.alignment != Char.Alignment.ALLY; + Buff.affect(enemy, buffCls); + + if (enemy.buff(buffCls) != null){ + if (droppingLoot) enemy.rollToDropLoot(); + Statistics.enemiesSlain++; + Badges.validateMonstersSlain(); + Statistics.qualifiedForNoKilling = false; + if (enemy.EXP > 0 && hero.lvl <= enemy.maxLvl) { + hero.sprite.showStatus(CharSprite.POSITIVE, Messages.get(enemy, "exp", enemy.EXP)); + hero.earnExp(enemy.EXP, enemy.getClass()); + } else { + hero.earnExp(0, enemy.getClass()); + } + } + } + +} 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 e7fa874ef..bfa2714e1 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 @@ -91,7 +91,7 @@ public abstract class ChampionEnemy extends Buff { } { - immunities.add(Corruption.class); + immunities.add(AllyBuff.class); } public static void rollForChampion(Mob m){ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Corruption.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Corruption.java index 1aeeeed37..4ed8e5e01 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Corruption.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Corruption.java @@ -26,7 +26,7 @@ import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite; import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator; -public class Corruption extends Buff { +public class Corruption extends AllyBuff { { type = buffType.NEGATIVE; @@ -34,14 +34,15 @@ public class Corruption extends Buff { } private float buildToDamage = 0f; - - @Override - public boolean attachTo(Char target) { - if (super.attachTo(target)){ - target.alignment = Char.Alignment.ALLY; - return true; - } else { - return false; + + //corrupted enemies are usually fully healed and cleansed of most debuffs + public static void corruptionHeal(Char target){ + target.HP = target.HT; + for (Buff buff : target.buffs()) { + if (buff.type == Buff.buffType.NEGATIVE + && !(buff instanceof SoulMark)) { + buff.detach(); + } } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/huntress/SpiritHawk.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/huntress/SpiritHawk.java index 35b6e40f7..636e1c16f 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/huntress/SpiritHawk.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/huntress/SpiritHawk.java @@ -27,6 +27,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Electricity; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Freezing; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AllyBuff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Bleeding; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Blindness; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.BlobImmunity; @@ -158,7 +159,7 @@ public class SpiritHawk extends ArmorAbility { attacksAutomatically = false; immunities.addAll(new BlobImmunity().immunities()); - immunities.add(Corruption.class); + immunities.add(AllyBuff.class); } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/rogue/ShadowClone.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/rogue/ShadowClone.java index e69602459..39ef7f619 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/rogue/ShadowClone.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/rogue/ShadowClone.java @@ -25,6 +25,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Assets; 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.Corruption; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; @@ -150,7 +151,7 @@ public class ShadowClone extends ArmorAbility { HP = HT = 100; - immunities.add(Corruption.class); + immunities.add(AllyBuff.class); } public ShadowAlly(){ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bee.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bee.java index 04570028f..ed43e2ea1 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bee.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bee.java @@ -24,9 +24,9 @@ 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.Amok; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Corruption; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.sprites.BeeSprite; import com.watabou.utils.Bundle; @@ -126,7 +126,8 @@ public class Bee extends Mob { @Override public void add(Buff buff) { super.add(buff); - if (buff instanceof Corruption){ + //TODO maybe handle honeyed bees with their own ally buff? + if (buff instanceof AllyBuff){ intelligentAlly = false; setPotInfo(-1, null); } @@ -183,7 +184,7 @@ public class Bee extends Mob { @Override protected boolean getCloser(int target) { - if (alignment == Alignment.ALLY && enemy == null && buff(Corruption.class) == null){ + if (alignment == Alignment.ALLY && enemy == null && buffs(AllyBuff.class).isEmpty()){ target = Dungeon.hero.pos; } else if (enemy != null && Actor.findById(potHolder) == enemy) { target = enemy.pos; @@ -194,7 +195,7 @@ public class Bee extends Mob { @Override public String description() { - if (alignment == Alignment.ALLY && buff(Corruption.class) == null){ + if (alignment == Alignment.ALLY && buffs(AllyBuff.class).isEmpty()){ return Messages.get(this, "desc_honey"); } else { return super.description(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/CrystalMimic.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/CrystalMimic.java index 9999b5b69..fd20ae442 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/CrystalMimic.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/CrystalMimic.java @@ -25,6 +25,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Assets; 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.Corruption; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Dread; @@ -186,7 +187,7 @@ public class CrystalMimic extends Mimic { @Override protected void nowhereToRun() { if (buff( Terror.class ) == null - && buff( Corruption.class ) == null + && buffs( AllyBuff.class ).isEmpty() && buff( Dread.class ) == null) { if (enemySeen) { sprite.showStatus(CharSprite.NEGATIVE, Messages.get(Mob.class, "rage")); 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 19eafdc5f..7e429a462 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 @@ -24,9 +24,9 @@ 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.ChampionEnemy; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Corruption; import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing; import com.shatteredpixel.shatteredpixeldungeon.items.Gold; import com.shatteredpixel.shatteredpixeldungeon.levels.features.Chasm; @@ -165,8 +165,8 @@ public class Ghoul extends Mob { protected synchronized void onRemove() { if (beingLifeLinked) { for (Buff buff : buffs()) { - //corruption, champion, and king damager are preserved when removed via life link - if (!(buff instanceof Corruption) + //ally buffs, champion, and king damager are preserved when removed via life link + if (!(buff instanceof AllyBuff) && (!(buff instanceof ChampionEnemy)) && !(buff instanceof DwarfKing.KingDamager)) { buff.detach(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Mob.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Mob.java index c2f2840bb..1e87107b1 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Mob.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Mob.java @@ -29,6 +29,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Statistics; 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.Amok; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ChampionEnemy; @@ -347,7 +348,7 @@ public abstract class Mob extends Char { @Override public void add( Buff buff ) { super.add( buff ); - if (buff instanceof Amok || buff instanceof Corruption) { + if (buff instanceof Amok || buff instanceof AllyBuff) { state = HUNTING; } else if (buff instanceof Terror || buff instanceof Dread) { state = FLEEING; 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 d01019ea0..8de8f2f27 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 @@ -25,6 +25,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.actors.buffs.Corruption; @@ -217,8 +218,8 @@ public class Necromancer extends Mob { Dungeon.level.occupyCell( mySkeleton ); ((NecromancerSprite)sprite).finishSummoning(); - if (buff(Corruption.class) != null){ - Buff.affect(mySkeleton, Corruption.class); + for (Buff b : buffs(AllyBuff.class)){ + Buff.affect(mySkeleton, b.getClass()); } for (Buff b : buffs(ChampionEnemy.class)){ 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 0b052f6c2..d469a0afc 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 @@ -3,6 +3,7 @@ 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.ChampionEnemy; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Corruption; @@ -118,8 +119,8 @@ public class SpectralNecromancer extends Necromancer { Dungeon.level.occupyCell( wraith ); ((SpectralNecromancerSprite)sprite).finishSummoning(); - if (buff(Corruption.class) != null){ - Buff.affect(wraith, Corruption.class); + for (Buff b : buffs(AllyBuff.class)){ + Buff.affect( wraith, b.getClass()); } for (Buff b : buffs(ChampionEnemy.class)){ Buff.affect( wraith, b.getClass()); 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 78d361edb..9d4caff85 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,6 +24,7 @@ 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; @@ -128,8 +129,8 @@ public class Swarm extends Mob { if (buff( Poison.class ) != null) { Buff.affect( clone, Poison.class ).set(2); } - if (buff(Corruption.class ) != null) { - Buff.affect( clone, Corruption.class); + for (Buff b : buffs(AllyBuff.class)){ + Buff.affect( clone, b.getClass()); } for (Buff b : buffs(ChampionEnemy.class)){ Buff.affect( clone, b.getClass()); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Thief.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Thief.java index b2aaa196b..0715a3144 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Thief.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Thief.java @@ -23,6 +23,7 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AllyBuff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Corruption; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Dread; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Terror; @@ -199,7 +200,7 @@ public class Thief extends Mob { protected void nowhereToRun() { if (buff( Terror.class ) == null && buff( Dread.class ) == null - && buff( Corruption.class ) == null) { + && buffs( AllyBuff.class ).isEmpty() ) { if (enemySeen) { sprite.showStatus(CharSprite.NEGATIVE, Messages.get(Mob.class, "rage")); state = HUNTING; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/MirrorImage.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/MirrorImage.java index e25c543d5..2b3869164 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/MirrorImage.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/MirrorImage.java @@ -26,6 +26,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.CorrosiveGas; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.ToxicGas; +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.Corruption; @@ -187,7 +188,7 @@ public class MirrorImage extends NPC { immunities.add( ToxicGas.class ); immunities.add( CorrosiveGas.class ); immunities.add( Burning.class ); - immunities.add( Corruption.class ); + immunities.add( AllyBuff.class ); } public static class MirrorInvis extends Invisibility { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/PrismaticImage.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/PrismaticImage.java index 96035a300..768ec7359 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/PrismaticImage.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/PrismaticImage.java @@ -26,6 +26,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.CorrosiveGas; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.ToxicGas; +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.Corruption; @@ -249,7 +250,7 @@ public class PrismaticImage extends NPC { immunities.add( ToxicGas.class ); immunities.add( CorrosiveGas.class ); immunities.add( Burning.class ); - immunities.add( Corruption.class ); + immunities.add( AllyBuff.class ); } private class Wandering extends Mob.Wandering{ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/DriedRose.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/DriedRose.java index 67b07a25b..2a9f89ee3 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/DriedRose.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/DriedRose.java @@ -28,6 +28,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.CorrosiveGas; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.ToxicGas; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AllyBuff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Burning; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Corruption; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor; @@ -809,7 +810,7 @@ public class DriedRose extends Artifact { immunities.add( Burning.class ); immunities.add( ScrollOfRetribution.class ); immunities.add( ScrollOfPsionicBlast.class ); - immunities.add( Corruption.class ); + immunities.add( AllyBuff.class ); } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/PotionOfCleansing.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/PotionOfCleansing.java index 65bdcf354..cf54b003d 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/PotionOfCleansing.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/PotionOfCleansing.java @@ -25,8 +25,8 @@ import com.shatteredpixel.shatteredpixeldungeon.Assets; 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.Corruption; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hunger; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LostInventory; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; @@ -66,7 +66,7 @@ public class PotionOfCleansing extends ExoticPotion { public static void cleanse(Char ch){ for (Buff b : ch.buffs()){ if (b.type == Buff.buffType.NEGATIVE - && !(b instanceof Corruption) + && !(b instanceof AllyBuff) && !(b instanceof LostInventory)){ b.detach(); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfCorruption.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfCorruption.java index 6607e496f..4bd6f6ae4 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfCorruption.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfCorruption.java @@ -22,11 +22,10 @@ package com.shatteredpixel.shatteredpixeldungeon.items.wands; import com.shatteredpixel.shatteredpixeldungeon.Assets; -import com.shatteredpixel.shatteredpixeldungeon.Badges; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; -import com.shatteredpixel.shatteredpixeldungeon.Statistics; 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.Amok; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Bleeding; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Blindness; @@ -46,7 +45,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hex; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicalSleep; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Ooze; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Paralysis; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.PinCushion; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Poison; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Roots; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Slow; @@ -66,7 +64,6 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MagesStaff; import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; -import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.watabou.noosa.audio.Sample; @@ -218,31 +215,9 @@ public class WandOfCorruption extends Wand { } if (!enemy.isImmune(Corruption.class)){ - enemy.HP = enemy.HT; - for (Buff buff : enemy.buffs()) { - if (buff.type == Buff.buffType.NEGATIVE - && !(buff instanceof SoulMark)) { - buff.detach(); - } else if (buff instanceof PinCushion){ - buff.detach(); - } - } + Corruption.corruptionHeal(enemy); - boolean droppingLoot = enemy.alignment != Char.Alignment.ALLY; - Buff.affect(enemy, Corruption.class); - - if (enemy.buff(Corruption.class) != null){ - if (droppingLoot) enemy.rollToDropLoot(); - Statistics.enemiesSlain++; - Badges.validateMonstersSlain(); - Statistics.qualifiedForNoKilling = false; - if (enemy.EXP > 0 && curUser.lvl <= enemy.maxLvl) { - curUser.sprite.showStatus(CharSprite.POSITIVE, Messages.get(enemy, "exp", enemy.EXP)); - curUser.earnExp(enemy.EXP, enemy.getClass()); - } else { - curUser.earnExp(0, enemy.getClass()); - } - } + AllyBuff.affectAndLoot(enemy, curUser, Corruption.class); } else { Buff.affect(enemy, Doom.class); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfLivingEarth.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfLivingEarth.java index 9f37df67e..29e119266 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfLivingEarth.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfLivingEarth.java @@ -26,6 +26,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Challenges; 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.Amok; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Corruption; @@ -350,7 +351,7 @@ public class WandOfLivingEarth extends DamageWand { } { - immunities.add( Corruption.class ); + immunities.add( AllyBuff.class ); } private static final String DEFENSE = "defense"; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfRegrowth.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfRegrowth.java index f93a5bca4..6e8df85d6 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfRegrowth.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfRegrowth.java @@ -25,10 +25,17 @@ import com.shatteredpixel.shatteredpixeldungeon.Assets; 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.Amok; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Corruption; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Doom; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Dread; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Paralysis; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Roots; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Sleep; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Terror; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Vertigo; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.mage.WildMagic; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.NPC; @@ -451,8 +458,14 @@ public class WandOfRegrowth extends Wand { } { - immunities.add(Corruption.class); - immunities.add(Doom.class); + immunities.add( Paralysis.class ); + immunities.add( Amok.class ); + immunities.add( Sleep.class ); + immunities.add( Terror.class ); + immunities.add( Dread.class ); + immunities.add( Vertigo.class ); + immunities.add( AllyBuff.class ); + immunities.add( Doom.class ); } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfWarding.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfWarding.java index d12680178..6dd50ee27 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfWarding.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfWarding.java @@ -4,6 +4,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Assets; 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.Corruption; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; @@ -400,7 +401,7 @@ public class WandOfWarding extends Wand { } { - immunities.add( Corruption.class ); + immunities.add( AllyBuff.class ); } private static final String TIER = "tier"; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/enchantments/Corrupting.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/enchantments/Corrupting.java index 3f5edfb16..c0c4ed0a2 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/enchantments/Corrupting.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/enchantments/Corrupting.java @@ -25,6 +25,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Badges; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.Statistics; 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.Corruption; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.PinCushion; @@ -58,31 +59,10 @@ public class Corrupting extends Weapon.Enchantment { Mob enemy = (Mob) defender; Hero hero = (attacker instanceof Hero) ? (Hero) attacker : Dungeon.hero; - - enemy.HP = enemy.HT; - for (Buff buff : enemy.buffs()) { - if (buff.type == Buff.buffType.NEGATIVE - && !(buff instanceof SoulMark)) { - buff.detach(); - } else if (buff instanceof PinCushion){ - buff.detach(); - } - } - if (enemy.alignment == Char.Alignment.ENEMY){ - enemy.rollToDropLoot(); - } - - Buff.affect(enemy, Corruption.class); - - Statistics.enemiesSlain++; - Badges.validateMonstersSlain(); - Statistics.qualifiedForNoKilling = false; - if (enemy.EXP > 0 && hero.lvl <= enemy.maxLvl) { - hero.sprite.showStatus(CharSprite.POSITIVE, Messages.get(enemy, "exp", enemy.EXP)); - hero.earnExp(enemy.EXP, enemy.getClass()); - } else { - hero.earnExp(0, enemy.getClass()); - } + + Corruption.corruptionHeal(enemy); + + AllyBuff.affectAndLoot(enemy, hero, Corruption.class); return 0; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/MissileWeapon.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/MissileWeapon.java index 042e4189b..54d5aab60 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/MissileWeapon.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/MissileWeapon.java @@ -243,7 +243,7 @@ abstract public class MissileWeapon extends Weapon { decrementDurability(); if (durability > 0){ //attempt to stick the missile weapon to the enemy, just drop it if we can't. - if (sticky && enemy != null && enemy.isAlive() && enemy.buff(Corruption.class) == null){ + if (sticky && enemy != null && enemy.isAlive() && enemy.alignment != Char.Alignment.ALLY){ PinCushion p = Buff.affect(enemy, PinCushion.class); if (p.target == enemy){ p.stick(this);