From 2827f0ee968cfe07b221e0a2da678dada2b6966a Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Fri, 25 Oct 2024 17:10:34 -0400 Subject: [PATCH] v3.0.0: implemented the remaining cleric T1 talents/spells --- core/src/main/assets/interfaces/buffs.png | Bin 1745 -> 1765 bytes .../src/main/assets/interfaces/hero_icons.png | Bin 2120 -> 2144 bytes .../main/assets/interfaces/large_buffs.png | Bin 3886 -> 3949 bytes .../assets/messages/actors/actors.properties | 22 ++-- .../shatteredpixeldungeon/actors/Char.java | 6 + .../actors/hero/Talent.java | 13 +- .../actors/hero/spells/ClericSpell.java | 18 ++- .../actors/hero/spells/DetectCurse.java | 5 +- .../actors/hero/spells/GuidingLight.java | 7 +- .../actors/hero/spells/HolyWard.java | 4 +- .../actors/hero/spells/HolyWeapon.java | 5 +- .../actors/hero/spells/ShieldOfLight.java | 115 ++++++++++++++++++ .../ui/BuffIndicator.java | 2 + .../shatteredpixeldungeon/ui/HeroIcon.java | 3 +- 14 files changed, 174 insertions(+), 26 deletions(-) create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/ShieldOfLight.java diff --git a/core/src/main/assets/interfaces/buffs.png b/core/src/main/assets/interfaces/buffs.png index 864d610c18b0ccd7578714245bf988db19e8e898..21a892820b15c2b79d0dd1fe914c81019adfdfec 100644 GIT binary patch delta 1422 zcmV;91#$Y(4do4xS^;j6TlWNSHc{1+RskS?T1iAfRCobgkX2&EFbo8fcx_jY!_2+^ z87nA{=yS(TK1q!%%N!33Zv-P6Fy0LM0szs)xEeR(ZoqgLPviAUlDsI2Tm+r~3zV4( zR8t*8i@#6{{_}{Re|@71$HgYm;Mnb z673Ww;L4H>KvqPaCv-xHdPLxZxUyhwBZ-1=)%hK~lytZ`l2K)5nK$M&Gc)`D|A=%? zOC#4hjNfSD82eMt8_9oz0Q1p63GtL$gY#@0@1BT6f$3Kd9`Jw=z2I>N>t?g(b-#~r_I05wr5{JUOXTS*>X!J%0 z2^Iu8uqeO^3SG$WfU_n5{A$;d8aM3M#M6c+76aAtf z2E?Fn_aW?IQ4u3zR8;*9_?Wq<3pAEUBf`fiFhP2HC#QO+CLxffDFj}n=_?3Kgf;Mj zP+&R;%nZ#yU>5ghHVVuU3d~brVR3PB;ioZYya@=vLIPom@&Z$&w=c~sOZ)oMem)94 zTo4Eg`O`4)nX$3486W;(7zV?COUqq1Q z$U>lhjSWNrHGq5=3=NH84OIn}D-}MNkB$6!7$DzaU}KIBqJR?$@cCoc8lVAZfcdcj zK7R@j&cF+73Dg_F1h9e1QiTmLUjnfKJ%6tY@Iiq_77ztspdmzloBC$qoMRusiC6`15^MpgCMgFi=Ucxg|~#d z0P`V012nL?waEtfNs;;c2N00G?jiHja$oWA=gVFvVx(m&xAOoJdGjF0EHAQNYzQB> zjpC)K2*#qGb5Rw4*uH?k<>e&=wh08T>$`Yt;;Y!UzR$vJ$Y$Dlz?^m{H&w z@k0*Ce3tODMi>mC zfpGRUfmReif%BU?Yzb`Z2#{YBsE(cTAz));$T9@h1$3l;%4aU~`3XOj0n+c`fC3&U zU}51U0v)h{yVwAT4bY%5Hqe872#jG-z*IBybp+;5pFiMPC_k|Z`bRzm++qWK{wU%6 z{O;~fGk^jlfW;w1ew=|G<`+;k?@>7G7*?I@TCiaW<%8J3OP;_J0gl1>4LSb~w*c`) zaDIb35Clwl^u2@MzakRwM+szjWPJ1`c(qIL8Tl3hZZTh(;r0HT2{<;=GqsTM;M1& delta 1402 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 diff --git a/core/src/main/assets/interfaces/large_buffs.png b/core/src/main/assets/interfaces/large_buffs.png index c5f13c099764313a423df3776ceea493e872c0aa..cb182bd2f2222b4ceeb9292ddcf619e989451f86 100644 GIT binary patch delta 3643 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 K=~ultHs^n>T4=Ta delta 3579 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 yDL(`JsXs{ACGAN2Ryd!cB|dON&7$GS3d6m diff --git a/core/src/main/assets/messages/actors/actors.properties b/core/src/main/assets/messages/actors/actors.properties index 5af334609..2a032d050 100644 --- a/core/src/main/assets/messages/actors/actors.properties +++ b/core/src/main/assets/messages/actors/actors.properties @@ -533,6 +533,7 @@ actors.hero.abilities.ratmogrify$transmograt.desc=This enemy has been transforme actors.hero.abilities.ratmogrify$transmograt.rankings_desc=Slain by: ratmogrified enemy ##Cleric Spells +actors.hero.spells.clericspell.no_target=There is no target there. actors.hero.spells.clericspell.charge_cost=Charge cost: %d actors.hero.spells.detectcurse.name=detect curse @@ -543,7 +544,7 @@ actors.hero.spells.detectcurse.short_desc=identifies whether an item is cursed o actors.hero.spells.detectcurse.desc=The Cleric focuses their senses on an item and determines whether it is cursed or not without having to equip it. actors.hero.spells.guidinglight.name=guiding light -actors.hero.spells.guidinglight.prompt=choose a target +actors.hero.spells.guidinglight.prompt=Choose a target actors.hero.spells.guidinglight.short_desc=Deals ranged magic damage and guarantees a hit. actors.hero.spells.guidinglight.desc=The Cleric fires a bolt of magical energy which strikes a target, dealing 2-6 damage and illuminating them. The next physical attack made against an illuminated enemy is guaranteed to hit them. @@ -563,7 +564,12 @@ actors.hero.spells.holyweapon.desc=The Cleric enchants their worn weapon with ho actors.hero.spells.holyweapon$holywepbuff.name=holy weapon actors.hero.spells.holyweapon$holywepbuff.desc=The Cleric has imbued their worn weapon with holy energy, temporarily overriding any existing enchantment and causing the weapon to deal an extra 2 magical damage on each attack.\n\nTurn renaming: %s. - +actors.hero.spells.shieldoflight.name=shield of light +actors.hero.spells.shieldoflight.prompt=Choose a target +actors.hero.spells.shieldoflight.short_desc=Grants temporary armor against a target. +actors.hero.spells.shieldoflight.desc=The Cleric creates a thin barrier of light between themselves and an enemy, increasing their armor's block power against that enemy by 2-4 for %d turns.\n\nThis spell takes no time to cast, but cannot be used against multiple targets simultaneously. +actors.hero.spells.shieldoflight$shieldoflighttracker.name=shield of light +actors.hero.spells.shieldoflight$shieldoflighttracker.desc=A thin shield of light is standing between the Cleric and an enemy. It's not strong enough to outright block attacks, but will soften them.\n\nTurns Remaining: %s ##main hero actors.hero.hero.name=you @@ -674,6 +680,8 @@ actors.hero.talent$preciseassaulttracker.desc=The Duelist's next regular melee a actors.hero.talent$deadlyfollowuptracker.name=deadly followup actors.hero.talent$deadlyfollowuptracker.desc=The Duelist has recently attacked an enemy with a thrown weapon, her melee attacks against the same target will have boosted damage.\n\nTurns remaining: %s. actors.hero.talent$combinedlethalityabilitytracker.executed=executed +actors.hero.talent$satiatedspellstracker.name=Shielding Spell +actors.hero.talent$satiatedspellstracker.desc=The next spell the Cleric casts will grant them a small amount of shielding. #warrior actors.hero.talent.hearty_meal.title=hearty meal @@ -994,16 +1002,16 @@ actors.hero.talent.counter_ability.title=counter ability actors.hero.talent.counter_ability.desc=_+1:_ If the Duelist uses a weapon ability within 3 turns of her afterimage being attacked, she will instantly regain _0.38 charges_.\n\n_+2:_ If the Duelist uses a weapon ability within 3 turns of her afterimage being attacked, she will instantly regain _0.77 charges_.\n\n_+3:_ If the Duelist uses a weapon ability within 3 turns of her afterimage being attacked, she will instantly regain _1.13 charges_.\n\n_+4:_ If the Duelist uses a weapon ability within 3 turns of her afterimage being attacked, she will instantly regain _1.5 charges_. #cleric -actors.hero.talent.clerict1a.title=fasting -actors.hero.talent.clerict1a.desc=_+1:_ The Cleric can cast _???_ at the cost of 1 charge. This spell restores _30 turns of satiety_, grants _3 shielding_, and is cast instantly.\n\n_+2:_ The Cleric can cast _???_ at the cost of 1 charge. This spell restores _50 turns of satiety_, grants _5 shielding_, and is cast instantly. +actors.hero.talent.satiated_spells.title=Satiated Spells +actors.hero.talent.satiated_spells.desc=_+1:_ Eating food causes the Cleric to gain _3 shielding_ the next time they cast a spell.\n\n_+2:_ Eating food causes the Cleric to gain _5 shielding_ the next time they cast a spell. actors.hero.talent.detect_curse.title=detect curse actors.hero.talent.detect_curse.desc=_+1:_ The Cleric can cast _Detect Curse,_ a spell that reveals whether an item is cursed at the cost of _3 charges._\n\n_+2:_ The Cleric can cast _Detect Curse,_ a spell that reveals whether an item is cursed at the cost of _2 charges._ actors.hero.talent.searing_light.title=searing light actors.hero.talent.searing_light.desc=_+1:_ Physical attacks on enemies illuminated by _Guiding Light_ deal _+3 damage._\n\n_+2:_ Physical attacks on enemies illuminated by _Guiding Light_ deal _+5 damage._ -actors.hero.talent.clerict1d.title=circle of healing -actors.hero.talent.clerict1d.desc=_+1:_ The Cleric can cast _Circle of Healing_ at the cost of 2 charges. This spell surrounds the Cleric in a healing aura, restoring 1 HP per turn for _10 turns_ to the Cleric and anything adjacent to them.\n\n_+2:_ The Cleric can cast _Circle of Healing_ at the cost of 2 charges. This spell surrounds the Cleric in a healing aura, restoring 1 HP per turn for _15 turns_ to the Cleric and anything adjacent to them. +actors.hero.talent.shield_of_light.title=shield of light +actors.hero.talent.shield_of_light.desc=_+1:_ The Cleric can cast _Shield of Light,_ a spell that is cast instantly and grants them 2-4 armor against a target for _3 turns_ at the cost of 1 charge.\n\n_+2:_ The Cleric can cast _Shield of Light,_ a spell that is cast instantly and them 2-4 armor against a target for _5 turns_ at the cost of 1 charge. -actors.hero.talent.clerict2a.title=TODO +actors.hero.talent.clerict2a.title=Enlightening Meal actors.hero.talent.clerict2a.desc=TODO actors.hero.talent.clerict2b.title=TODO actors.hero.talent.clerict2b.desc=TODO 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 7791704b5..24c9104cc 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java @@ -80,6 +80,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.duelist.Challenge; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.rogue.DeathMark; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.warrior.Endure; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.spells.ShieldOfLight; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Brute; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.CrystalSpire; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.DwarfKing; @@ -652,6 +653,11 @@ public abstract class Char extends Actor { damage = armor.absorb( damage ); } + ShieldOfLight.ShieldOfLightTracker shield = buff( ShieldOfLight.ShieldOfLightTracker.class); + if (shield != null && shield.object == enemy.id()){ + damage -= Random.NormalIntRange(2, 4); + } + return damage; } 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 8df082e9e..d7537c669 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 @@ -172,7 +172,7 @@ public enum Talent { FEIGNED_RETREAT(151, 4), EXPOSE_WEAKNESS(152, 4), COUNTER_ABILITY(153, 4), //Cleric T1 - CLERICT1A(160), DETECT_CURSE(161), SEARING_LIGHT(162), CLERICT1D(163), + SATIATED_SPELLS(160), DETECT_CURSE(161), SEARING_LIGHT(162), SHIELD_OF_LIGHT(163), //Cleric T2 CLERICT2A(164), CLERICT2B(165), CLERICT2C(166), CLERICT2D(167), CLERICT2E(168), //Cleric T3 @@ -389,6 +389,12 @@ public enum Talent { } } public static class CounterAbilityTacker extends FlavourBuff{}; + public static class SatiatedSpellsTracker extends Buff{ + @Override + public int icon() { + return BuffIndicator.SPELL_FOOD; + } + }; int icon; int maxPoints; @@ -579,6 +585,9 @@ public enum Talent { Buff.affect( hero, PhysicalEmpower.class).set(Math.round(hero.lvl / (4f - hero.pointsInTalent(FOCUSED_MEAL))), 1); } } + if (hero.hasTalent(SATIATED_SPELLS)){ + Buff.affect( hero, SatiatedSpellsTracker.class ); + } } public static class WarriorFoodImmunity extends FlavourBuff{ @@ -869,7 +878,7 @@ public enum Talent { Collections.addAll(tierTalents, STRENGTHENING_MEAL, ADVENTURERS_INTUITION, PATIENT_STRIKE, AGGRESSIVE_BARRIER); break; case CLERIC: - Collections.addAll(tierTalents, CLERICT1A, DETECT_CURSE, SEARING_LIGHT, CLERICT1D); + Collections.addAll(tierTalents, SATIATED_SPELLS, DETECT_CURSE, SEARING_LIGHT, SHIELD_OF_LIGHT); break; } for (Talent talent : tierTalents){ 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 c159c3429..f1b96a21c 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 @@ -22,6 +22,9 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.hero.spells; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Barrier; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.HolyTome; @@ -32,7 +35,7 @@ import java.util.ArrayList; public abstract class ClericSpell { - public abstract void onCast(HolyTome tome, Hero hero ); + public abstract void onCast(HolyTome tome, Hero hero); public float chargeUse( Hero hero ){ return 1; @@ -54,6 +57,15 @@ public abstract class ClericSpell { return HeroIcon.NONE; } + public void onSpellCast(HolyTome tome, Hero hero){ + Invisibility.dispel(); + if (hero.hasTalent(Talent.SATIATED_SPELLS) && hero.buff(Talent.SatiatedSpellsTracker.class) != null){ + Buff.affect(hero, Barrier.class).setShield(1 + 2*hero.pointsInTalent(Talent.SATIATED_SPELLS)); + hero.buff(Talent.SatiatedSpellsTracker.class).detach(); + } + tome.spendCharge(chargeUse(hero)); + } + public static ArrayList getSpellList(Hero cleric){ ArrayList spells = new ArrayList<>(); @@ -61,6 +73,10 @@ public abstract class ClericSpell { spells.add(HolyWeapon.INSTANCE); spells.add(HolyWard.INSTANCE); + if (cleric.hasTalent(Talent.SHIELD_OF_LIGHT)){ + spells.add(ShieldOfLight.INSTANCE); + } + if (cleric.hasTalent(Talent.DETECT_CURSE)){ spells.add(DetectCurse.INSTANCE); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/DetectCurse.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/DetectCurse.java index b4ba60e10..03a79ef2e 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/DetectCurse.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/DetectCurse.java @@ -22,7 +22,6 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.hero.spells; import com.shatteredpixel.shatteredpixeldungeon.Assets; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; import com.shatteredpixel.shatteredpixeldungeon.items.EquipableItem; @@ -70,10 +69,8 @@ public class DetectCurse extends InventoryClericSpell { hero.busy(); hero.sprite.operate(hero.pos); - tome.spendCharge(chargeUse(hero)); - Sample.INSTANCE.play( Assets.Sounds.SCAN ); - Invisibility.dispel(); + onSpellCast(tome, hero); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/GuidingLight.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/GuidingLight.java index d9ceb1130..fb534f346 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/GuidingLight.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/GuidingLight.java @@ -25,7 +25,6 @@ import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.HolyTome; @@ -64,7 +63,7 @@ public class GuidingLight extends TargetedClericSpell { hero.busy(); Sample.INSTANCE.play( Assets.Sounds.ZAP ); hero.sprite.zap(target); - MagicMissile.boltFromChar(hero.sprite.parent, MagicMissile.BEACON, hero.sprite, aim.collisionPos, new Callback() { + MagicMissile.boltFromChar(hero.sprite.parent, MagicMissile.MAGIC_MISSILE, hero.sprite, aim.collisionPos, new Callback() { @Override public void call() { @@ -77,11 +76,11 @@ public class GuidingLight extends TargetedClericSpell { } } - tome.spendCharge( chargeUse(hero) ); hero.spend( 1f ); hero.next(); - Invisibility.dispel(); + onSpellCast(tome, hero); + } }); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/HolyWard.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/HolyWard.java index fff24a00a..1f35da911 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/HolyWard.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/HolyWard.java @@ -24,7 +24,6 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.hero.spells; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FlavourBuff; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.HolyTome; @@ -48,13 +47,12 @@ public class HolyWard extends ClericSpell { Item.updateQuickslot(); Sample.INSTANCE.play(Assets.Sounds.READ); - tome.spendCharge( chargeUse(hero) ); hero.spend( 1f ); hero.busy(); hero.sprite.operate(hero.pos); - Invisibility.dispel(); + onSpellCast(tome, hero); } public static class HolyArmBuff extends FlavourBuff { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/HolyWeapon.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/HolyWeapon.java index 403f658fe..f48ae6d67 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/HolyWeapon.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/HolyWeapon.java @@ -24,7 +24,6 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.hero.spells; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FlavourBuff; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.HolyTome; @@ -53,14 +52,12 @@ public class HolyWeapon extends ClericSpell { Item.updateQuickslot(); Sample.INSTANCE.play(Assets.Sounds.READ); - tome.spendCharge( chargeUse(hero) ); - hero.sprite.operate(hero.pos); hero.spend( 1f ); hero.busy(); hero.sprite.operate(hero.pos); - Invisibility.dispel(); + onSpellCast(tome, hero); } public static class HolyWepBuff extends FlavourBuff { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/ShieldOfLight.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/ShieldOfLight.java new file mode 100644 index 000000000..35afe6b71 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/ShieldOfLight.java @@ -0,0 +1,115 @@ +/* + * 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.buffs.Buff; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FlavourBuff; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; +import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.HolyTome; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; +import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator; +import com.shatteredpixel.shatteredpixeldungeon.ui.HeroIcon; +import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; +import com.watabou.noosa.audio.Sample; +import com.watabou.utils.Bundle; + +public class ShieldOfLight extends TargetedClericSpell { + + public static ShieldOfLight INSTANCE = new ShieldOfLight(); + + @Override + public int icon() { + return HeroIcon.SHIELD_OF_LIGHT; + } + + @Override + protected void onTargetSelected(HolyTome tome, Hero hero, Integer target) { + + if (target == null){ + return; + } + + Char ch = Actor.findChar(target); + if (ch == null || ch.alignment == Char.Alignment.ALLY){ + GLog.w(Messages.get(this, "no_target")); + return; + } + + Sample.INSTANCE.play(Assets.Sounds.READ); + hero.sprite.operate(hero.pos); + + //1 turn less as the casting is instant + Buff.affect( hero, ShieldOfLightTracker.class, 2f*hero.pointsInTalent(Talent.SHIELD_OF_LIGHT)).object = ch.id(); + + hero.busy(); + hero.sprite.operate(hero.pos); + + onSpellCast(tome, hero); + + } + + @Override + public String desc() { + return Messages.get(this, "desc", 1+2*Dungeon.hero.pointsInTalent(Talent.SHIELD_OF_LIGHT)) + "\n\n" + Messages.get(this, "charge_cost", (int)chargeUse(Dungeon.hero)); + } + + public static class ShieldOfLightTracker extends FlavourBuff { + + public int object = 0; + + { + type = buffType.POSITIVE; + } + + @Override + public int icon() { + return BuffIndicator.LIGHT_SHIELD; + } + + @Override + public float iconFadePercent() { + float duration = 1f + 2f* Dungeon.hero.pointsInTalent(Talent.SHIELD_OF_LIGHT); + return Math.max(0, (duration - visualcooldown()) / duration); + } + + private static final String OBJECT = "object"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle( bundle ); + bundle.put( OBJECT, object ); + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle( bundle ); + object = bundle.getInt( OBJECT ); + } + + } + +} 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 3b9162cd5..72451e6ce 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BuffIndicator.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BuffIndicator.java @@ -124,6 +124,8 @@ public class BuffIndicator extends Component { public static final int WAND = 72; public static final int HOLY_WEAPON = 73; public static final int HOLY_ARMOR = 74; + public static final int SPELL_FOOD = 75; + public static final int LIGHT_SHIELD= 76; public static final int SIZE_SMALL = 7; public static final int SIZE_LARGE = 16; 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 412140f9e..594697986 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/HeroIcon.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/HeroIcon.java @@ -71,7 +71,8 @@ public class HeroIcon extends Image { public static final int GUIDING_LIGHT = 40; public static final int HOLY_WEAPON = 41; public static final int HOLY_WARD = 42; - public static final int DETECT_CURSE = 43; + public static final int SHIELD_OF_LIGHT = 43; + public static final int DETECT_CURSE = 44; //action indicator visuals public static final int BERSERK = 80;