From c8c05fdd7474aaa2728029f182d6bc57379161b8 Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Tue, 10 Dec 2024 13:29:27 -0500 Subject: [PATCH] v3.0.0: implemented the Hallowed Ground spell/talent --- .../src/main/assets/interfaces/hero_icons.png | Bin 2850 -> 2914 bytes .../main/assets/interfaces/talent_icons.png | Bin 7223 -> 7253 bytes .../assets/messages/actors/actors.properties | 11 +- .../actors/hero/Hero.java | 7 + .../actors/hero/Talent.java | 4 +- .../actors/hero/spells/BlessSpell.java | 7 +- .../actors/hero/spells/ClericSpell.java | 5 + .../actors/hero/spells/HallowedGround.java | 212 ++++++++++++++++++ .../shatteredpixeldungeon/ui/HeroIcon.java | 1 + 9 files changed, 241 insertions(+), 6 deletions(-) create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/HallowedGround.java diff --git a/core/src/main/assets/interfaces/hero_icons.png b/core/src/main/assets/interfaces/hero_icons.png index cb185a633db8aa209bb4c4b95f61233c65e10d44..1c35779253d0797a40ade6f9fa36edd30bc031ee 100644 GIT binary patch delta 1385 zcmV-v1(y1v7UC9=^Z{A1^&16$fd933wkd8SQ50420!@A!ANH z6st`&nuK@bl&!X_&Y`{pmcWAlLLle#)A92!ApUyDG(49lf%}C9J}K-Nf!nP=dhrzk zzAXG0f&1-e&+SVDY-8|aI==JoKkr{7U|XXfOJL3IECKju3-nodKSv;c4Zs%(5P)`U z0_XL>?RMreWD4}hDI1XqoUj$&@Atj{{weMV{9z}fvroqkJn>kgZWm`>NGQ~IfEj$e zJfvP+l@Yhbab)c;rWWs9^&AE2_B} zKj7EkAJfjFh1>nOEdxj`+)H;;$x5-?TIG>&Ts4I7yh_JAixKLIpF+F4+Kq6 z{h+{xzo-xa|7=_?q74MJM-dlSn;QXzC z@$LQqq8><%F3Y9!-w_D$w*t=J4uSFQ{s8L%8(0J|5Z?uyznz4CTfTQd?g5(R!4O~o z-*yEAjK5ii#`pUJya%YdKA5z&Glqkj^L-;~_O{(0;1v>t5wNW_S46=1z7@Bg*G@rH zH0}@InVSJD=bw&8H~8sXbZ<;AcKr{y?jY zmj&jCSppHu5jsZ=VJN~Kca zhR2-fnO;bw>;pX9KafALUO!ZWDl=k-m#OI`_Yb5xF2LozNB%Wv@ESomWr7Y<3>xvs zkCtkfLgW4c;|F~Gi!i_=Wh-EO+6S#C|A6x+_%fi;L^viu^9*ss!XFpwAm)Jaw>=Ov zLG^il;ELj0|O^L+@MukoiX?*SiJ1Z-BDfbne-?(o$C-UB-1abXCA zmPQH!#@`5MJ~W14rw6FIKA5z&Glqkj^L-;~_O|YSAK0moAdG-*t+^rs&iAdj^}Kcp zqM~zsXKoJgROVS-$ZN~tF&HTjLGp*p4gB{J0$?MAhfflIqrmlhp(*2KfjMH9K)!e_ ze)M4Ae4$?zAY8hgNZP9_AmtL-95ew4_Jmo&Dk;kqGH|Mi(MhYB11G&IyIaPpEDwRs5QmIrbl}e>jseJqP{}S+TbNFI=KW}S}!j_(C zig+f_nGO7!U4{I6M$_?R0e&WA%SV7;1K2fx0IhsZAjIc~Qa1b*nST%AKLy_C1fF+! z>PQVhAOK%+J{>?0>jsZ=VJ-#32)i`*Dez89rH00000NkvXXu0mjfA~%kK delta 1321 zcmV+^1=jlF7NQoA^Z^;M^&16$0OTtH|7-6IbKJ&ZC~SfS2KgPpxk0b6N!|OOYqfr5 zLw~B*GgAdF3ceajJhAk>A!Q033rN=K%kl9aApY5C8m{Ys#C@RyP70jM!2RBi*1W<1 zZwsEwz~la{>HZ1>EDStX;2Zz(?eP)=ER8%51FP=m7!dz_18o*QPBD;w6YwGfl7Kv? zfwLlTzn^&=#RYXrO)Uv+?=32E4hey=Fq3CIRZc<-2Wqz`*5lnGJjw zKmNG`pew)rP-lRAjlZIQ<7MInd>y1+FD!0#jA8baL< z4eaojXk|crYwGp~=v;hvMI;Z|XYF&k*W81R)3G4RF$N6HCTlMi>y*J@Dd73Ex@JhQCn;X7@P^xG#&l zTJgD`F!2W%5W@X`=kTdk%K-Niitj6bjDh$Kdjp9d4ubEEKg58qYQwK$3TS}*@dh{v zX#o7uDPZlV0rJOBLP;smdpX$SkG~DMBJnl^e|#ar`ra3!E&m0jmjsr2_q8y>T~Y5IgbX&*po|3JQfV10fV14f$>JG@Nw4Ztt9 z|GVk&o^AOz*MK*7wNoa@y{KAEu}XAzQz|iUU&idQ}E?L zgC@d(0Ss^JRf~SOAV8V}AKx zz-L!~pi-$+DwRs5QmIrbl}e@3moI;o0sb}T=nva(tKJJ+nx@J9$UtM7@T+z$vWkBBsudfj0#~ue-bmWF)|4K>QH-3VjsZ=T) fl}e>jsZ{zG9OMRF1I{v800000NkvXXu0mjfgusGY diff --git a/core/src/main/assets/interfaces/talent_icons.png b/core/src/main/assets/interfaces/talent_icons.png index f3e7ab82873b5a70679f2b64b1749a5f4697c488..78d9b3d662a51e221eab12f157d5bac35fee8570 100644 GIT binary patch delta 6969 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 awa^v9$f|_;EouMFI61oPc(%>=%Kre=nUbgg delta 6939 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 diff --git a/core/src/main/assets/messages/actors/actors.properties b/core/src/main/assets/messages/actors/actors.properties index f9cd577fa..3041f0ceb 100644 --- a/core/src/main/assets/messages/actors/actors.properties +++ b/core/src/main/assets/messages/actors/actors.properties @@ -554,8 +554,15 @@ actors.hero.spells.cleanse.desc=The Cleric instantly clears all harmful effects actors.hero.spells.clericspell.prompt=Choose a target actors.hero.spells.clericspell.no_target=There is no target there. +actors.hero.spells.clericspell.invalid_target=You can't target that location. actors.hero.spells.clericspell.charge_cost=Charge cost: %d +actors.hero.spells.hallowedground.name=hallowed ground +actors.hero.spells.hallowedground.prompt=choose a location +actors.hero.spells.hallowedground.short_desc=Heals allies, slows enemies, and spreads grass in an AOE. +actors.hero.spells.hallowedground.desc=The Priest focuses their divine magic into the ground nearby, creating a %1$dx%1$d area of hallowed terrain for 20 turns.\n\nWhen it is cast, this spell heals all allies for 10 HP (healthy allies and the Priest get shielding), briefly roots enemies, and spreads short grass.\n\nThe hallowed terrain heals allies for 1 HP per turn (healthy allies and the Priest get shielding), cripples enemies, and randomly causes tall grass to grow.\n\nHallowed terrain is destroyed by fire, and will produce furrowed grass if passive regen effects are disabled or the Priest has not gained exp in a while. +actors.hero.spells.hallowedground$hallowedterrain.desc=The ground has been hallowed here. Hallowed ground slowly enemies, heals allies, and causes grass to spread. + actors.hero.spells.holyintuition.name=holy intuition actors.hero.spells.holyintuition.prompt=choose an item actors.hero.spells.holyintuition.cursed=You sense malevolent magic lurking within this item. @@ -1082,8 +1089,8 @@ actors.hero.talent.light_reading.desc=_+1:_ The Cleric can use their holy tome w actors.hero.talent.holy_lance.title=Holy Lance actors.hero.talent.holy_lance.desc=_+1:_ The Priest can cast _Holy Lance,_ a devastating spell that deals _30-55 damage_ at the cost of 4 charges.\n\n_+2:_ The Priest can cast _Holy Lance,_ a devastating spell that deals _45-83 damage_ at the cost of 4 charges.\n\n_+3:_ The Priest can cast _Holy Lance,_ a devastating spell that deals _60-110 damage_ at the cost of 4 charges.\n\nHoly Lance always deals maximum damage to demonic and undead foes. Holy Lance has a 50 turn cooldown before it can be cast again. -actors.hero.talent.priestt3b.title=Unknown -actors.hero.talent.priestt3b.desc=This talent hasn't been implemented yet, it currently does nothing. +actors.hero.talent.hallowed_ground.title=Hallowed Ground +actors.hero.talent.hallowed_ground.desc=_+1:_ The Priest can cast _Hallowed Ground,_ a spell that hallows terrain in a _3x3 area_ for 20 turns, at the cost of 2 charges.\n\n_+2:_ The Priest can cast _Hallowed Ground,_ a spell that hallows terrain in a _5x5 area_ for 20 turns, at the cost of 2 charges.\n\n_+3:_ The Priest can cast _Hallowed Ground,_ a spell that hallows terrain in a _7x7 area_ for 20 turns, at the cost of 2 charges.\n\nWhen it is cast, Hallowed Ground heals allies for 10 HP, briefly roots enemies, and spreads short grass. Afterward, it slowly heals allies, cripples enemies, and causes tall grass to randomly grow. Hallowed ground grants shielding to the Priest instead of healing and is destroyed by fire. actors.hero.talent.priestt3c.title=Unknown actors.hero.talent.priestt3c.desc=This talent hasn't been implemented yet, it currently does nothing. 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 eab21699f..73616c0bf 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 @@ -70,6 +70,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.duelist.Ch import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.duelist.ElementalStrike; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.huntress.NaturesPower; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.warrior.Endure; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.spells.HallowedGround; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mimic; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Monk; @@ -1907,6 +1908,12 @@ public class Hero extends Char { buff(ElementalStrike.ElementalStrikeFurrowCounter.class).detach(); } } + if (buff(HallowedGround.HallowedFurrowTracker.class) != null){ + buff(ElementalStrike.ElementalStrikeFurrowCounter.class).countDown(percent*5f); + if (buff(ElementalStrike.ElementalStrikeFurrowCounter.class).count() <= 0){ + buff(ElementalStrike.ElementalStrikeFurrowCounter.class).detach(); + } + } } boolean levelUp = false; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Talent.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Talent.java index 2f78e811f..fcaea8a65 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Talent.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Talent.java @@ -181,7 +181,7 @@ public enum Talent { //Cleric T3 CLEANSE(169, 3), LIGHT_READING(170, 3), //Priest T3 - HOLY_LANCE(171, 3), PRIESTT3B(172, 3), PRIESTT3C(173, 3), + HOLY_LANCE(171, 3), HALLOWED_GROUND(172, 3), PRIESTT3C(173, 3), //Paladin T3 PALADINT3A(174, 3), PALADINT3B(175, 3), PALADINT3C(176, 3), //Cleric A1 T4 @@ -1019,7 +1019,7 @@ public enum Talent { Collections.addAll(tierTalents, UNENCUMBERED_SPIRIT, MONASTIC_VIGOR, COMBINED_ENERGY); break; case PRIEST: - Collections.addAll(tierTalents, HOLY_LANCE, PRIESTT3B, PRIESTT3C); + Collections.addAll(tierTalents, HOLY_LANCE, HALLOWED_GROUND, PRIESTT3C); break; case PALADIN: Collections.addAll(tierTalents, PALADINT3A, PALADINT3B, PALADINT3C); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/BlessSpell.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/BlessSpell.java index 889df3ffa..8324c8949 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/BlessSpell.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/BlessSpell.java @@ -76,12 +76,15 @@ public class BlessSpell extends TargetedClericSpell { int totalHeal = 5 + 10*hero.pointsInTalent(Talent.BLESS); if (ch.HT - ch.HP < totalHeal){ int barrier = totalHeal - (ch.HT - ch.HP); + barrier = Math.max(barrier, 0); if (ch.HP != ch.HT) { ch.HP = ch.HT; ch.sprite.showStatusWithIcon(CharSprite.POSITIVE, Integer.toString(totalHeal - barrier), FloatingText.HEALING); } - Buff.affect(ch, Barrier.class).setShield(barrier); - ch.sprite.showStatusWithIcon( CharSprite.POSITIVE, Integer.toString(barrier), FloatingText.SHIELDING ); + if (barrier > 0) { + Buff.affect(ch, Barrier.class).setShield(barrier); + ch.sprite.showStatusWithIcon(CharSprite.POSITIVE, Integer.toString(barrier), FloatingText.SHIELDING); + } } else { ch.HP = ch.HP + totalHeal; ch.sprite.showStatusWithIcon( CharSprite.POSITIVE, Integer.toString(totalHeal), FloatingText.HEALING ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/ClericSpell.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/ClericSpell.java index 72ee77918..5612e8178 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/ClericSpell.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/ClericSpell.java @@ -124,6 +124,10 @@ public abstract class ClericSpell { spells.add(HolyLance.INSTANCE); } + if (cleric.hasTalent(Talent.HALLOWED_GROUND)){ + spells.add(HallowedGround.INSTANCE); + } + } return spells; @@ -143,6 +147,7 @@ public abstract class ClericSpell { spells.add(Cleanse.INSTANCE); spells.add(Radiance.INSTANCE); spells.add(HolyLance.INSTANCE); + spells.add(HallowedGround.INSTANCE); return spells; } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/HallowedGround.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/HallowedGround.java new file mode 100644 index 000000000..4395f0219 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/HallowedGround.java @@ -0,0 +1,212 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2015 Oleg Dolya + * + * Shattered Pixel Dungeon + * Copyright (C) 2014-2024 Evan Debenham + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ + +package com.shatteredpixel.shatteredpixeldungeon.actors.hero.spells; + +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.blobs.Blob; +import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Fire; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Barrier; +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.Regeneration; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Roots; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; +import com.shatteredpixel.shatteredpixeldungeon.effects.BlobEmitter; +import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; +import com.shatteredpixel.shatteredpixeldungeon.effects.FloatingText; +import com.shatteredpixel.shatteredpixeldungeon.effects.particles.LeafParticle; +import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ShaftParticle; +import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.HolyTome; +import com.shatteredpixel.shatteredpixeldungeon.levels.Level; +import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; +import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; +import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite; +import com.shatteredpixel.shatteredpixeldungeon.ui.HeroIcon; +import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; +import com.watabou.noosa.audio.Sample; +import com.watabou.utils.BArray; +import com.watabou.utils.PathFinder; +import com.watabou.utils.Random; + +public class HallowedGround extends TargetedClericSpell { + + public static final HallowedGround INSTANCE = new HallowedGround(); + + @Override + public int icon() { + return HeroIcon.HALLOWED_GROUND; + } + + @Override + public float chargeUse(Hero hero) { + return 2; + } + + @Override + protected void onTargetSelected(HolyTome tome, Hero hero, Integer target) { + + if (target == null){ + return; + } + + if (Dungeon.level.solid[target] || !Dungeon.level.heroFOV[target]){ + GLog.w(Messages.get(this, "invalid_target")); + return; + } + + PathFinder.buildDistanceMap(target, BArray.not(Dungeon.level.solid, null), hero.pointsInTalent(Talent.HALLOWED_GROUND)); + for (int i = 0; i < Dungeon.level.length(); i++){ + if (PathFinder.distance[i] != Integer.MAX_VALUE){ + int c = Dungeon.level.map[i]; + if (c == Terrain.EMPTY || c == Terrain.EMBERS || c == Terrain.EMPTY_DECO) { + Level.set( i, Terrain.GRASS); + GameScene.updateMap( i ); + CellEmitter.get(i).burst(LeafParticle.LEVEL_SPECIFIC, 2); + } + GameScene.add(Blob.seed(i, 20, HallowedTerrain.class)); + CellEmitter.get(i).burst(ShaftParticle.FACTORY, 2); + + Char ch = Actor.findChar(i); + if (ch != null){ + if (ch.alignment == Char.Alignment.ALLY){ + + if (ch == Dungeon.hero || ch.HP == ch.HT){ + Buff.affect(ch, Barrier.class).incShield(10); + ch.sprite.showStatusWithIcon( CharSprite.POSITIVE, "10", FloatingText.SHIELDING ); + } else { + int barrier = 10 - (ch.HT - ch.HP); + barrier = Math.max(barrier, 0); + ch.HP += 10 - barrier; + ch.sprite.showStatusWithIcon( CharSprite.POSITIVE, Integer.toString(10-barrier), FloatingText.HEALING ); + if (barrier > 0){ + Buff.affect(ch, Barrier.class).incShield(barrier); + ch.sprite.showStatusWithIcon( CharSprite.POSITIVE, Integer.toString(barrier), FloatingText.SHIELDING ); + } + } + } else if (!ch.flying) { + Buff.affect(ch, Roots.class, 1f); + } + } + } + } + //5 casts per hero level before furrowing + Buff.affect(hero, HallowedFurrowTracker.class).countUp(1); + + Sample.INSTANCE.play(Assets.Sounds.MELD); + hero.sprite.zap(target); + hero.spendAndNext( 1f ); + + onSpellCast(tome, hero); + + } + + public String desc(){ + int area = 1 + 2*Dungeon.hero.pointsInTalent(Talent.HALLOWED_GROUND); + return Messages.get(this, "desc", area) + "\n\n" + Messages.get(this, "charge_cost", (int)chargeUse(Dungeon.hero)); + } + + public static class HallowedTerrain extends Blob { + + @Override + protected void evolve() { + + int cell; + + Fire fire = (Fire)Dungeon.level.blobs.get( Fire.class ); + + // on avg, hallowed ground produces 9/17/25 tiles of grass, 100/67/50% of total tiles + int chance = 10 + 10*Dungeon.hero.pointsInTalent(Talent.HALLOWED_GROUND); + + for (int i = area.left-1; i <= area.right; i++) { + for (int j = area.top-1; j <= area.bottom; j++) { + cell = i + j*Dungeon.level.width(); + if (cur[cell] > 0) { + + //fire destroys hallowed terrain + if (fire != null && fire.volume > 0 && fire.cur[cell] > 0){ + off[cell] = cur[cell] = 0; + continue; + } + + int c = Dungeon.level.map[cell]; + if (c == Terrain.GRASS) { + if (Random.Int(chance) == 0) { + if (!Regeneration.regenOn() + || (Dungeon.hero.buff(HallowedFurrowTracker.class) != null && Dungeon.hero.buff(HallowedFurrowTracker.class).count() > 5)){ + Level.set(cell, Terrain.FURROWED_GRASS); + } else { + Level.set(cell, Terrain.HIGH_GRASS); + } + GameScene.updateMap(cell); + CellEmitter.get(cell).burst(LeafParticle.LEVEL_SPECIFIC, 5); + } + } else if (c == Terrain.EMPTY || c == Terrain.EMBERS || c == Terrain.EMPTY_DECO) { + Level.set(cell, Terrain.GRASS); + GameScene.updateMap(cell); + CellEmitter.get(cell).burst(LeafParticle.LEVEL_SPECIFIC, 2); + } + + Char ch = Actor.findChar(cell); + if (ch != null){ + if (ch.alignment == Char.Alignment.ALLY){ + if (ch == Dungeon.hero || ch.HP == ch.HT){ + Buff.affect(ch, Barrier.class).incShield(1); + ch.sprite.showStatusWithIcon( CharSprite.POSITIVE, "1", FloatingText.SHIELDING ); + } else { + ch.HP++; + ch.sprite.showStatusWithIcon( CharSprite.POSITIVE, "1", FloatingText.HEALING ); + } + } else if (!ch.flying && ch.buff(Roots.class) == null){ + Buff.prolong(ch, Cripple.class, 1f); + } + } + + off[cell] = cur[cell] - 1; + volume += off[cell]; + } else { + off[cell] = 0; + } + } + } + } + + @Override + public void use(BlobEmitter emitter) { + super.use( emitter ); + emitter.pour( ShaftParticle.FACTORY, 1f ); + } + + @Override + public String tileDesc() { + return Messages.get(this, "desc"); + } + } + + public static class HallowedFurrowTracker extends CounterBuff{{revivePersists = true;}} + +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/HeroIcon.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/HeroIcon.java index 55fc14534..7c8c10b2e 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/HeroIcon.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/HeroIcon.java @@ -85,6 +85,7 @@ public class HeroIcon extends Image { public static final int CLEANSE = 49; public static final int RADIANCE = 50; public static final int HOLY_LANCE = 51; + public static final int HALLOWED_GROUND = 52; //all cleric spells have a separate icon with no background for the action indicator public static final int SPELL_ACTION_OFFSET = 32;