From 2644e16d4cce5974d032bc31fc2abc20fd64b970 Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Wed, 3 Aug 2022 15:59:21 -0400 Subject: [PATCH] v1.4.0: fixed magic immune not applying to rings or artifacts --- .../assets/messages/actors/actors.properties | 2 +- .../actors/buffs/MagicImmune.java | 14 ++++++++++-- .../actors/buffs/Regeneration.java | 2 +- .../items/artifacts/AlchemistsToolkit.java | 10 ++++++--- .../items/artifacts/ChaliceOfBlood.java | 9 +++++++- .../items/artifacts/CloakOfShadows.java | 14 +++++++++--- .../items/artifacts/DriedRose.java | 22 +++++++++++++++---- .../items/artifacts/EtherealChains.java | 14 +++++++++--- .../items/artifacts/HornOfPlenty.java | 11 +++++++--- .../items/artifacts/MasterThievesArmband.java | 14 ++++++++++-- .../items/artifacts/SandalsOfNature.java | 13 +++++++++-- .../items/artifacts/TalismanOfForesight.java | 21 ++++++++++++++---- .../items/artifacts/TimekeepersHourglass.java | 15 ++++++++++--- .../items/artifacts/UnstableSpellbook.java | 16 ++++++++++---- .../items/rings/Ring.java | 3 +++ 15 files changed, 144 insertions(+), 36 deletions(-) diff --git a/core/src/main/assets/messages/actors/actors.properties b/core/src/main/assets/messages/actors/actors.properties index e935155e7..f0d7c78e5 100644 --- a/core/src/main/assets/messages/actors/actors.properties +++ b/core/src/main/assets/messages/actors/actors.properties @@ -253,7 +253,7 @@ actors.buffs.magicalsleep.wakeup=You wake up feeling refreshed and healthy. actors.buffs.magicalsleep.desc=This character has fallen into a deep magical sleep which they will not wake from naturally.\n\nMagical sleep is similar to regular sleep, except that only damage will cause the target to wake up.\n\nFor the hero, magical sleep has some restorative properties, allowing them to rapidly heal while resting. actors.buffs.magicimmune.name=Immune to Magic -actors.buffs.magicimmune.desc=All magical effects have lost their hold on you, you are completely impervious to them.\n\nWhile magic immune all harmful and helpful magical effects will not apply to you, including curses, enchants, wands, scrolls, etc.\n\nTurns of magic immunity remaining: %s. +actors.buffs.magicimmune.desc=All magical effects have lost their hold on you, you are completely impervious to them.\n\nWhile magic immune all harmful and helpful magical effects will not apply to you, including curses, enchants, wands, scrolls, rings, artifacts, etc.\n\nTurns of magic immunity remaining: %s. actors.buffs.mindvision.name=Mind vision actors.buffs.mindvision.desc=Somehow you are able to see all creatures on this floor through your mind. It's a weird feeling.\n\nAll characters on this floor are visible to you as long as you have mind vision. Seeing a creature through mind vision counts as it being seen or nearby for the purposes of many magical effects.\n\nTurns of mind vision remaining: %s. diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/MagicImmune.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/MagicImmune.java index 6981f7f94..513aec40a 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/MagicImmune.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/MagicImmune.java @@ -22,6 +22,7 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.buffs; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.AntiMagic; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator; @@ -39,8 +40,6 @@ public class MagicImmune extends FlavourBuff { { immunities.addAll(AntiMagic.RESISTS); } - - //FIXME still a lot of cases not handled here, e.g. rings/artifacts and various damage sources @Override public boolean attachTo(Char target) { @@ -53,12 +52,23 @@ public class MagicImmune extends FlavourBuff { } } } + if (target instanceof Hero){ + ((Hero) target).updateHT(false); + } return true; } else { return false; } } + @Override + public void detach() { + super.detach(); + if (target instanceof Hero){ + ((Hero) target).updateHT(false); + } + } + @Override public int icon() { return BuffIndicator.COMBO; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Regeneration.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Regeneration.java index 51ee26832..7558bd628 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Regeneration.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Regeneration.java @@ -53,7 +53,7 @@ public class Regeneration extends Buff { ChaliceOfBlood.chaliceRegen regenBuff = Dungeon.hero.buff( ChaliceOfBlood.chaliceRegen.class); float delay = REGENERATION_DELAY; - if (regenBuff != null) { + if (regenBuff != null && target.buff(MagicImmune.class) == null) { if (regenBuff.isCursed()) { delay *= 1.5f; } else { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/AlchemistsToolkit.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/AlchemistsToolkit.java index efd52ebfe..f5f92a353 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/AlchemistsToolkit.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/AlchemistsToolkit.java @@ -23,6 +23,7 @@ package com.shatteredpixel.shatteredpixeldungeon.items.artifacts; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicImmune; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.Recipe; @@ -61,7 +62,7 @@ public class AlchemistsToolkit extends Artifact { @Override public ArrayList actions( Hero hero ) { ArrayList actions = super.actions( hero ); - if (isEquipped( hero ) && !cursed) { + if (isEquipped( hero ) && !cursed && hero.buff(MagicImmune.class) == null) { actions.add(AC_BREW); if (level() < levelCap) { actions.add(AC_ENERGIZE); @@ -75,6 +76,8 @@ public class AlchemistsToolkit extends Artifact { super.execute(hero, action); + if (hero.buff(MagicImmune.class) != null) return; + if (action.equals(AC_BREW)){ if (!isEquipped(hero)) GLog.i( Messages.get(this, "need_to_equip") ); else if (cursed) GLog.w( Messages.get(this, "cursed") ); @@ -155,6 +158,7 @@ public class AlchemistsToolkit extends Artifact { @Override public void charge(Hero target, float amount) { + if (target.buff(MagicImmune.class) != null) return; partialCharge += 0.25f*amount; if (partialCharge >= 1){ partialCharge--; @@ -215,7 +219,7 @@ public class AlchemistsToolkit extends Artifact { @Override public boolean act() { - if (warmUpDelay > 0){ + if (warmUpDelay > 0 && !cursed && target.buff(MagicImmune.class) == null){ if (level() == 10){ warmUpDelay = 0; } else if (warmUpDelay == 101){ @@ -232,7 +236,7 @@ public class AlchemistsToolkit extends Artifact { } public void gainCharge(float levelPortion) { - if (cursed) return; + if (cursed || target.buff(MagicImmune.class) != null) return; //generates 2 energy every hero level, +0.1 energy per toolkit level //to a max of 12 energy per hero level diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/ChaliceOfBlood.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/ChaliceOfBlood.java index 466cc16e2..0277fb000 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/ChaliceOfBlood.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/ChaliceOfBlood.java @@ -24,6 +24,7 @@ package com.shatteredpixel.shatteredpixeldungeon.items.artifacts; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Badges; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicImmune; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ShadowParticle; import com.shatteredpixel.shatteredpixeldungeon.items.Item; @@ -53,7 +54,11 @@ public class ChaliceOfBlood extends Artifact { @Override public ArrayList actions( Hero hero ) { ArrayList actions = super.actions( hero ); - if (isEquipped( hero ) && level() < levelCap && !cursed && !hero.isInvulnerable(getClass())) + if (isEquipped( hero ) + && level() < levelCap + && !cursed + && !hero.isInvulnerable(getClass()) + && hero.buff(MagicImmune.class) == null) actions.add(AC_PRICK); return actions; } @@ -148,6 +153,8 @@ public class ChaliceOfBlood extends Artifact { @Override public void charge(Hero target, float amount) { + if (cursed || target.buff(MagicImmune.class) != null) return; + //grants 5 turns of healing up-front float healDelay = 10f - level()*0.9f; healDelay /= amount; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/CloakOfShadows.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/CloakOfShadows.java index 7aa822a0c..6f9b84ae4 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/CloakOfShadows.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/CloakOfShadows.java @@ -28,6 +28,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Barrier; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicImmune; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Preparation; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass; @@ -70,7 +71,9 @@ public class CloakOfShadows extends Artifact { public ArrayList actions( Hero hero ) { ArrayList actions = super.actions( hero ); if ((isEquipped( hero ) || hero.hasTalent(Talent.LIGHT_CLOAK)) - && !cursed && (charge > 0 || activeBuff != null)) { + && !cursed + && hero.buff(MagicImmune.class) == null + && (charge > 0 || activeBuff != null)) { actions.add(AC_STEALTH); } return actions; @@ -81,6 +84,8 @@ public class CloakOfShadows extends Artifact { super.execute(hero, action); + if (hero.buff(MagicImmune.class) != null) return; + if (action.equals( AC_STEALTH )) { if (activeBuff == null){ @@ -171,6 +176,8 @@ public class CloakOfShadows extends Artifact { @Override public void charge(Hero target, float amount) { + if (cursed || target.buff(MagicImmune.class) != null) return; + if (charge < chargeCap) { if (!isEquipped(target)) amount *= 0.75f*target.pointsInTalent(Talent.LIGHT_CLOAK)/3f; partialCharge += 0.25f*amount; @@ -219,7 +226,7 @@ public class CloakOfShadows extends Artifact { public class cloakRecharge extends ArtifactBuff{ @Override public boolean act() { - if (charge < chargeCap) { + if (charge < chargeCap && !cursed && target.buff(MagicImmune.class) == null) { LockedFloor lock = target.buff(LockedFloor.class); if (activeBuff == null && (lock == null || lock.regenOn())) { float missing = (chargeCap - charge); @@ -241,8 +248,9 @@ public class CloakOfShadows extends Artifact { } } - } else + } else { partialCharge = 0; + } if (cooldown > 0) cooldown --; 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 31a834998..5af2f6a7d 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 @@ -31,6 +31,7 @@ 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.LockedFloor; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicImmune; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Belongings; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; @@ -110,7 +111,11 @@ public class DriedRose extends Artifact { actions.remove(AC_EQUIP); return actions; } - if (isEquipped( hero ) && charge == chargeCap && !cursed && ghostID == 0) { + if (isEquipped( hero ) + && charge == chargeCap + && !cursed + && hero.buff(MagicImmune.class) == null + && ghostID == 0) { actions.add(AC_SUMMON); } if (ghostID != 0){ @@ -130,6 +135,8 @@ public class DriedRose extends Artifact { if (action.equals(AC_SUMMON)) { + if (hero.buff(MagicImmune.class) != null) return; + if (!Ghost.Quest.completed()) GameScene.show(new WndUseItem(null, this)); else if (ghost != null) GLog.i( Messages.get(this, "spawned") ); else if (!isEquipped( hero )) GLog.i( Messages.get(Artifact.class, "need_to_equip") ); @@ -275,6 +282,8 @@ public class DriedRose extends Artifact { @Override public void charge(Hero target, float amount) { + if (cursed || target.buff(MagicImmune.class) != null) return; + if (ghost == null){ if (charge < chargeCap) { charge += Math.round(4*amount); @@ -374,7 +383,7 @@ public class DriedRose extends Artifact { } //rose does not charge while ghost hero is alive - if (ghost != null){ + if (ghost != null && !cursed && target.buff(MagicImmune.class) == null){ defaultAction = AC_DIRECT; //heals to full over 500 turns @@ -397,7 +406,10 @@ public class DriedRose extends Artifact { } LockedFloor lock = target.buff(LockedFloor.class); - if (charge < chargeCap && !cursed && (lock == null || lock.regenOn())) { + if (charge < chargeCap + && !cursed + && target.buff(MagicImmune.class) == null + && (lock == null || lock.regenOn())) { //500 turns to a full charge partialCharge += (1/5f * RingOfEnergy.artifactChargeMultiplier(target)); if (partialCharge > 1){ @@ -555,7 +567,9 @@ public class DriedRose extends Artifact { @Override protected boolean act() { updateRose(); - if (rose == null || !rose.isEquipped(Dungeon.hero)){ + if (rose == null + || !rose.isEquipped(Dungeon.hero) + || Dungeon.hero.buff(MagicImmune.class) != null){ damage(1, this); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/EtherealChains.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/EtherealChains.java index 09020fbe9..743e18a9b 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/EtherealChains.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/EtherealChains.java @@ -28,6 +28,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Cripple; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicImmune; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; import com.shatteredpixel.shatteredpixeldungeon.effects.Chains; @@ -69,8 +70,9 @@ public class EtherealChains extends Artifact { @Override public ArrayList actions(Hero hero) { ArrayList actions = super.actions( hero ); - if (isEquipped(hero) && charge > 0 && !cursed) + if (isEquipped(hero) && charge > 0 && !cursed && hero.buff(MagicImmune.class) == null) { actions.add(AC_CAST); + } return actions; } @@ -83,6 +85,8 @@ public class EtherealChains extends Artifact { super.execute(hero, action); + if (hero.buff(MagicImmune.class) != null) return; + if (action.equals(AC_CAST)){ curUser = hero; @@ -266,6 +270,7 @@ public class EtherealChains extends Artifact { @Override public void charge(Hero target, float amount) { + if (cursed || target.buff(MagicImmune.class) != null) return; int chargeTarget = 5+(level()*2); if (charge < chargeTarget*2){ partialCharge += 0.5f*amount; @@ -297,7 +302,10 @@ public class EtherealChains extends Artifact { public boolean act() { int chargeTarget = 5+(level()*2); LockedFloor lock = target.buff(LockedFloor.class); - if (charge < chargeTarget && !cursed && (lock == null || lock.regenOn())) { + if (charge < chargeTarget + && !cursed + && target.buff(MagicImmune.class) == null + && (lock == null || lock.regenOn())) { //gains a charge in 40 - 2*missingCharge turns float chargeGain = (1 / (40f - (chargeTarget - charge)*2f)); chargeGain *= RingOfEnergy.artifactChargeMultiplier(target); @@ -319,7 +327,7 @@ public class EtherealChains extends Artifact { } public void gainExp( float levelPortion ) { - if (cursed || levelPortion == 0) return; + if (cursed || target.buff(MagicImmune.class) != null || levelPortion == 0) return; exp += Math.round(levelPortion*100); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/HornOfPlenty.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/HornOfPlenty.java index 26f923121..1bbf42f29 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/HornOfPlenty.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/HornOfPlenty.java @@ -28,6 +28,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hunger; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicImmune; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Belongings; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; @@ -71,6 +72,7 @@ public class HornOfPlenty extends Artifact { @Override public ArrayList actions( Hero hero ) { ArrayList actions = super.actions( hero ); + if (hero.buff(MagicImmune.class) != null) return actions; if (isEquipped( hero ) && charge > 0) { actions.add(AC_SNACK); actions.add(AC_EAT); @@ -86,6 +88,8 @@ public class HornOfPlenty extends Artifact { super.execute(hero, action); + if (hero.buff(MagicImmune.class) != null) return; + if (action.equals(AC_EAT) || action.equals(AC_SNACK)){ if (!isEquipped(hero)) GLog.i( Messages.get(Artifact.class, "need_to_equip") ); @@ -155,7 +159,7 @@ public class HornOfPlenty extends Artifact { @Override public void charge(Hero target, float amount) { - if (charge < chargeCap){ + if (charge < chargeCap && !cursed && target.buff(MagicImmune.class) == null){ partialCharge += 0.25f*amount; if (partialCharge >= 1){ partialCharge--; @@ -247,7 +251,7 @@ public class HornOfPlenty extends Artifact { public class hornRecharge extends ArtifactBuff{ public void gainCharge(float levelPortion) { - if (cursed) return; + if (cursed || target.buff(MagicImmune.class) != null) return; if (charge < chargeCap) { @@ -276,8 +280,9 @@ public class HornOfPlenty extends Artifact { partialCharge = 0; } } - } else + } else { partialCharge = 0; + } } } 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 098a68b31..af2ce55a0 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 @@ -30,6 +30,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Blindness; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.CounterBuff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Cripple; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicImmune; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; @@ -71,13 +72,21 @@ public class MasterThievesArmband extends Artifact { @Override public ArrayList actions(Hero hero) { ArrayList actions = super.actions(hero); - if (isEquipped(hero) && charge > 0 && !cursed) actions.add(AC_STEAL); + if (isEquipped(hero) + && charge > 0 + && hero.buff(MagicImmune.class) == null + && !cursed) { + actions.add(AC_STEAL); + } return actions; } @Override public void execute(Hero hero, String action) { super.execute(hero, action); + + if (hero.buff(MagicImmune.class) != null) return; + if (action.equals(AC_STEAL)){ curUser = hero; @@ -206,6 +215,7 @@ public class MasterThievesArmband extends Artifact { @Override public void charge(Hero target, float amount) { + if (cursed || target.buff(MagicImmune.class) != null) return; partialCharge += 0.1f * amount; partialCharge = Math.min(partialCharge, chargeCap - charge); while (partialCharge >= 1f){ @@ -261,7 +271,7 @@ public class MasterThievesArmband extends Artifact { } public void gainCharge(float levelPortion) { - if (cursed) return; + if (cursed || target.buff(MagicImmune.class) != null) return; if (charge < chargeCap){ float chargeGain = 3f * levelPortion; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/SandalsOfNature.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/SandalsOfNature.java index db828a9e1..cea870d98 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/SandalsOfNature.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/SandalsOfNature.java @@ -24,6 +24,7 @@ package com.shatteredpixel.shatteredpixeldungeon.items.artifacts; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicImmune; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Roots; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; @@ -67,10 +68,15 @@ public class SandalsOfNature extends Artifact { @Override public ArrayList actions( Hero hero ) { ArrayList actions = super.actions( hero ); - if (isEquipped( hero ) && level() < 3 && !cursed) + if (hero.buff(MagicImmune.class) != null){ + return actions; + } + if (isEquipped( hero ) && level() < 3 && !cursed) { actions.add(AC_FEED); - if (isEquipped( hero ) && charge > 0) + } + if (isEquipped( hero ) && charge > 0) { actions.add(AC_ROOT); + } return actions; } @@ -78,6 +84,8 @@ public class SandalsOfNature extends Artifact { public void execute( Hero hero, String action ) { super.execute(hero, action); + if (hero.buff(MagicImmune.class) != null) return; + if (action.equals(AC_FEED)){ GameScene.selectItem(itemSelector); @@ -171,6 +179,7 @@ public class SandalsOfNature extends Artifact { public class Naturalism extends ArtifactBuff{ public void charge(float amount) { + if (cursed || target.buff(MagicImmune.class) != null) return; if (level() > 0 && charge < target.HT){ //gain 1+(1*level)% of the difference between current charge and max HP. float chargeGain = (target.HT-charge) * (.01f+ level()*0.01f); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/TalismanOfForesight.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/TalismanOfForesight.java index 1b8805900..ff71dd990 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/TalismanOfForesight.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/TalismanOfForesight.java @@ -28,6 +28,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FlavourBuff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicImmune; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; import com.shatteredpixel.shatteredpixeldungeon.effects.CheckedCell; @@ -68,7 +69,11 @@ public class TalismanOfForesight extends Artifact { @Override public ArrayList actions( Hero hero ) { ArrayList actions = super.actions( hero ); - if (isEquipped( hero ) && !cursed) actions.add(AC_SCRY); + if (isEquipped( hero ) + && !cursed + && hero.buff(MagicImmune.class) == null) { + actions.add(AC_SCRY); + } return actions; } @@ -76,6 +81,8 @@ public class TalismanOfForesight extends Artifact { public void execute( Hero hero, String action ) { super.execute(hero, action); + if (hero.buff(MagicImmune.class) != null) return; + if (action.equals(AC_SCRY)){ if (!isEquipped(hero)) GLog.i( Messages.get(Artifact.class, "need_to_equip") ); else if (charge < 5) GLog.i( Messages.get(this, "low_charge") ); @@ -90,6 +97,7 @@ public class TalismanOfForesight extends Artifact { @Override public void charge(Hero target, float amount) { + if (cursed || target.buff(MagicImmune.class) != null) return; if (charge < chargeCap){ charge += Math.round(2*amount); if (charge >= chargeCap) { @@ -290,7 +298,9 @@ public class TalismanOfForesight extends Artifact { } } - if (smthFound && !cursed){ + if (smthFound + && !cursed + && target.buff(MagicImmune.class) == null){ if (!warn){ GLog.w( Messages.get(this, "uneasy") ); if (target instanceof Hero){ @@ -303,7 +313,10 @@ public class TalismanOfForesight extends Artifact { } LockedFloor lock = target.buff(LockedFloor.class); - if (charge < chargeCap && !cursed && (lock == null || lock.regenOn())) { + if (charge < chargeCap + && !cursed + && target.buff(MagicImmune.class) == null + && (lock == null || lock.regenOn())) { //fully charges in 2000 turns at +0, scaling to 1000 turns at +10. float chargeGain = (0.05f+(level()*0.005f)); chargeGain *= RingOfEnergy.artifactChargeMultiplier(target); @@ -323,7 +336,7 @@ public class TalismanOfForesight extends Artifact { } public void charge(int boost){ - if (!cursed) { + if (!cursed && target.buff(MagicImmune.class) == null) { charge = Math.min((charge + boost), chargeCap); updateQuickslot(); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/TimekeepersHourglass.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/TimekeepersHourglass.java index b7f372018..a4944b369 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/TimekeepersHourglass.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/TimekeepersHourglass.java @@ -28,6 +28,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hunger; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicImmune; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; @@ -72,7 +73,10 @@ public class TimekeepersHourglass extends Artifact { @Override public ArrayList actions( Hero hero ) { ArrayList actions = super.actions( hero ); - if (isEquipped( hero ) && !cursed && (charge > 0 || activeBuff != null)) { + if (isEquipped( hero ) + && !cursed + && hero.buff(MagicImmune.class) == null + && (charge > 0 || activeBuff != null)) { actions.add(AC_ACTIVATE); } return actions; @@ -83,6 +87,8 @@ public class TimekeepersHourglass extends Artifact { super.execute(hero, action); + if (hero.buff(MagicImmune.class) != null) return; + if (action.equals(AC_ACTIVATE)){ if (!isEquipped( hero )) GLog.i( Messages.get(Artifact.class, "need_to_equip") ); @@ -152,7 +158,7 @@ public class TimekeepersHourglass extends Artifact { @Override public void charge(Hero target, float amount) { - if (charge < chargeCap){ + if (charge < chargeCap && !cursed && target.buff(MagicImmune.class) == null){ partialCharge += 0.25f*amount; if (partialCharge >= 1){ partialCharge--; @@ -224,7 +230,10 @@ public class TimekeepersHourglass extends Artifact { public boolean act() { LockedFloor lock = target.buff(LockedFloor.class); - if (charge < chargeCap && !cursed && (lock == null || lock.regenOn())) { + if (charge < chargeCap + && !cursed + && target.buff(MagicImmune.class) == null + && (lock == null || lock.regenOn())) { //90 turns to charge at full, 60 turns to charge at 0/10 float chargeGain = 1 / (90f - (chargeCap - charge)*3f); chargeGain *= RingOfEnergy.artifactChargeMultiplier(target); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/UnstableSpellbook.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/UnstableSpellbook.java index 1c1815d38..747cebb9e 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/UnstableSpellbook.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/UnstableSpellbook.java @@ -26,6 +26,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Blindness; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicImmune; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ElmoParticle; @@ -96,10 +97,12 @@ public class UnstableSpellbook extends Artifact { @Override public ArrayList actions( Hero hero ) { ArrayList actions = super.actions( hero ); - if (isEquipped( hero ) && charge > 0 && !cursed) + if (isEquipped( hero ) && charge > 0 && !cursed && hero.buff(MagicImmune.class) == null) { actions.add(AC_READ); - if (isEquipped( hero ) && level() < levelCap && !cursed) + } + if (isEquipped( hero ) && level() < levelCap && !cursed && hero.buff(MagicImmune.class) == null) { actions.add(AC_ADD); + } return actions; } @@ -108,6 +111,8 @@ public class UnstableSpellbook extends Artifact { super.execute( hero, action ); + if (hero.buff(MagicImmune.class) != null) return; + if (action.equals( AC_READ )) { if (hero.buff( Blindness.class ) != null) GLog.w( Messages.get(this, "blinded") ); @@ -218,7 +223,7 @@ public class UnstableSpellbook extends Artifact { @Override public void charge(Hero target, float amount) { - if (charge < chargeCap){ + if (charge < chargeCap && !cursed && target.buff(MagicImmune.class) == null){ partialCharge += 0.1f*amount; if (partialCharge >= 1){ partialCharge--; @@ -282,7 +287,10 @@ public class UnstableSpellbook extends Artifact { @Override public boolean act() { LockedFloor lock = target.buff(LockedFloor.class); - if (charge < chargeCap && !cursed && (lock == null || lock.regenOn())) { + if (charge < chargeCap + && !cursed + && target.buff(MagicImmune.class) == null + && (lock == null || lock.regenOn())) { //120 turns to charge at full, 80 turns to charge at 0/8 float chargeGain = 1 / (120f - (chargeCap - charge)*5f); chargeGain *= RingOfEnergy.artifactChargeMultiplier(target); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/rings/Ring.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/rings/Ring.java index 305c3d2b6..70f8ebdd8 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/rings/Ring.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/rings/Ring.java @@ -26,6 +26,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.EnhancedRings; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicImmune; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; import com.shatteredpixel.shatteredpixeldungeon.items.Generator; @@ -304,6 +305,7 @@ public class Ring extends KindofMisc { } public static int getBonus(Char target, Class type){ + if (target.buff(MagicImmune.class) != null) return 0; int bonus = 0; for (RingBuff buff : target.buffs(type)) { bonus += buff.level(); @@ -312,6 +314,7 @@ public class Ring extends KindofMisc { } public static int getBuffedBonus(Char target, Class type){ + if (target.buff(MagicImmune.class) != null) return 0; int bonus = 0; for (RingBuff buff : target.buffs(type)) { bonus += buff.buffedLvl();