From d261b73272c08e4f1e4ea3a90d92ecd3e46ad5aa Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Tue, 29 Jun 2021 21:28:12 -0400 Subject: [PATCH] v0.9.4: improved blessed ankh behaviour --- core/src/main/assets/effects/spell_icons.png | Bin 380 -> 427 bytes core/src/main/assets/interfaces/buffs.png | Bin 1285 -> 1308 bytes .../main/assets/interfaces/large_buffs.png | Bin 2665 -> 2723 bytes .../assets/messages/actors/actors.properties | 3 ++ .../actors/buffs/AnkhInvulnerability.java | 45 ++++++++++++++++++ .../actors/hero/Hero.java | 16 ++++--- .../effects/SpellSprite.java | 1 + .../items/artifacts/ChaliceOfBlood.java | 2 +- .../ui/BuffIndicator.java | 1 + 9 files changed, 61 insertions(+), 7 deletions(-) create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/AnkhInvulnerability.java diff --git a/core/src/main/assets/effects/spell_icons.png b/core/src/main/assets/effects/spell_icons.png index f67c8d12b7f132e037244f7c236843965b930f48..a3854cadc0ce7dfa275cfcf3544dc6f6083331f2 100644 GIT binary patch delta 401 zcmV;C0dD^M0;>a%B!4GROjJbx007MY|NsC0|Nj7h4GqlG5&!@H|NsC08XEuqGynhp z<>lqf%*>>5y|@4X01b3fPE!ES&(F`#k!a7)Q_s(FRo)!{00AaRL_t(|0j!dtZo@DT zhCh2z7Z|@mbpw^Qp-JTd0fE)3^0M(gK|z3FXjo+!I6O4EJb%x zLXfq{ncPQC^MaLpe#_fN3m8|Zphao1kA3KSAuluU%WOelpN8RMy*B33pzS*7ut9=` z9P$%rc-@i|Jbw?vmkQ!T{1TiAn(^C~(dIw+*Hph`glU(OySDzeIzqq1KeJ z-5(AqL0sZ-+<`N=>k_91ae8uQN3e*33K*H5(e{1NKtokgF9_lxjRNQ52p6=062M0i vg2XAqB$)1i%q!&|1V1C3nSkkt1^@udFlOjIxrA~6015yANkvXXu0mjfd0f80 delta 353 zcmV-n0iOP=1N;JzB!3}LOjJbx007MY|9}k*|NsC0|NsC0|Nj~q|Nk@p|NrIX<;={? z0zgbZ0000BbW%=J0MF0Qk!a7)Q_s&GWS@Ni0093jz>>sB6B2200000NkvXXu0mjfmPMzK diff --git a/core/src/main/assets/interfaces/buffs.png b/core/src/main/assets/interfaces/buffs.png index 5d724ae27f0b2390175cac8e4767789d6e6e3eb2..f77c4ca574a3e0975b2afb6e18fa3c3b098c40c4 100644 GIT binary patch delta 1016 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 D)?PUd diff --git a/core/src/main/assets/messages/actors/actors.properties b/core/src/main/assets/messages/actors/actors.properties index 56b9f2ccc..f8524d386 100644 --- a/core/src/main/assets/messages/actors/actors.properties +++ b/core/src/main/assets/messages/actors/actors.properties @@ -53,6 +53,9 @@ actors.buffs.adrenalinesurge.desc=A surge of great might, but sadly not permanen actors.buffs.amok.name=Amok actors.buffs.amok.desc=Amok causes a state of great rage and confusion in its target.\n\nWhen a creature is amoked, they will attack whatever is near them, whether they be friend or foe.\n\nTurns of amok remaining: %s. +actors.buffs.ankhinvulnerability.name=Invulnerable +actors.buffs.ankhinvulnerability.desc=Your blessed ankh has expended its energy, granting you some health and a brief period of invulnerability!\n\nTurns remaining: %s. + actors.buffs.arcanearmor.name=Arcane Armor actors.buffs.arcanearmor.desc=A thin shield is surrounding you, blocking some of the damage from magical attacks.\n\nYour magical armor is currently boosted by: 0-%d.\n\nTurns until arcane armor weakens: %s. diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/AnkhInvulnerability.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/AnkhInvulnerability.java new file mode 100644 index 000000000..653bac8a8 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/AnkhInvulnerability.java @@ -0,0 +1,45 @@ +package com.shatteredpixel.shatteredpixeldungeon.actors.buffs; + +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; +import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator; + +public class AnkhInvulnerability extends FlavourBuff { + + { + type = Buff.buffType.POSITIVE; + } + + public static final float DURATION = 3f; + + @Override + public void fx(boolean on) { + if (on) target.sprite.aura( 0xFFFF00 ); + else target.sprite.clearAura(); + } + + @Override + public int icon() { + return BuffIndicator.ANKH; + } + + @Override + public float iconFadePercent() { + return Math.max(0, (DURATION - visualcooldown()) / DURATION); + } + + @Override + public String toString() { + return Messages.get(this, "name"); + } + + @Override + public String desc() { + return Messages.get(this, "desc", dispTurns()); + } + + { + immunities.add(Paralysis.class); + immunities.add(Frost.class); + } + +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java index 5e9fbdab4..2516c9f07 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java @@ -33,6 +33,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Alchemy; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AdrenalineSurge; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Amok; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AnkhInvulnerability; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Awareness; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Barkskin; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Berserk; @@ -61,6 +62,7 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; import com.shatteredpixel.shatteredpixeldungeon.effects.CheckedCell; import com.shatteredpixel.shatteredpixeldungeon.effects.Flare; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; +import com.shatteredpixel.shatteredpixeldungeon.effects.SpellSprite; import com.shatteredpixel.shatteredpixeldungeon.items.Amulet; import com.shatteredpixel.shatteredpixeldungeon.items.Ankh; import com.shatteredpixel.shatteredpixeldungeon.items.Dewdrop; @@ -1610,16 +1612,13 @@ public class Hero extends Char { if (ankh != null && ankh.isBlessed()) { this.HP = HT/4; - //ensures that you'll get to act first in almost any case, to prevent reviving and then instantly dieing again. PotionOfHealing.cure(this); - Buff.detach(this, Paralysis.class); - spend(-cooldown()); - - new Flare(8, 32).color(0xFFFF66, true).show(sprite, 2f); - CellEmitter.get(this.pos).start(Speck.factory(Speck.LIGHT), 0.2f, 3); + Buff.prolong(this, AnkhInvulnerability.class, AnkhInvulnerability.DURATION); ankh.detach(belongings.backpack); + SpellSprite.show(this, SpellSprite.ANKH); + GameScene.flash(0x80FFFF40); Sample.INSTANCE.play( Assets.Sounds.TELEPORT ); GLog.w( Messages.get(this, "revive") ); Statistics.ankhsUsed++; @@ -1848,6 +1847,11 @@ public class Hero extends Char { return super.isImmune(effect); } + @Override + public boolean isInvulnerable(Class effect) { + return buff(AnkhInvulnerability.class) != null; + } + public boolean search( boolean intentional ) { if (!isAlive()) return false; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/effects/SpellSprite.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/effects/SpellSprite.java index e644bfbdc..eeee21bb2 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/effects/SpellSprite.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/effects/SpellSprite.java @@ -38,6 +38,7 @@ public class SpellSprite extends Image { public static final int CHARGE = 2; public static final int MASTERY = 3; public static final int BERSERK = 4; + public static final int ANKH = 5; private static final int SIZE = 16; 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 b9071f80e..243c8c460 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 @@ -52,7 +52,7 @@ public class ChaliceOfBlood extends Artifact { @Override public ArrayList actions( Hero hero ) { ArrayList actions = super.actions( hero ); - if (isEquipped( hero ) && level() < levelCap && !cursed) + if (isEquipped( hero ) && level() < levelCap && !cursed && !hero.isInvulnerable(getClass())) actions.add(AC_PRICK); return actions; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BuffIndicator.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BuffIndicator.java index 2f9828f57..83e5a9e25 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BuffIndicator.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BuffIndicator.java @@ -98,6 +98,7 @@ public class BuffIndicator extends Component { public static final int PINCUSHION = 49; public static final int UPGRADE = 50; public static final int MOMENTUM = 51; + public static final int ANKH = 52; public static final int SIZE = 7;