From 5b9100fed9f71661ef91348c3f40d669c433d11c Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Thu, 5 Dec 2024 16:09:52 -0500 Subject: [PATCH] v3.0.0: improved spell icons/ordering and added the bless talent/spell --- .../src/main/assets/interfaces/hero_icons.png | Bin 2800 -> 2850 bytes .../main/assets/interfaces/talent_icons.png | Bin 7130 -> 7112 bytes .../assets/messages/actors/actors.properties | 8 +- .../actors/hero/Talent.java | 4 +- .../actors/hero/spells/BlessSpell.java | 102 ++++++++++++++++++ .../actors/hero/spells/ClericSpell.java | 44 ++++---- .../actors/hero/spells/ShieldOfLight.java | 2 +- .../shatteredpixeldungeon/ui/HeroIcon.java | 17 +-- 8 files changed, 144 insertions(+), 33 deletions(-) create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/BlessSpell.java diff --git a/core/src/main/assets/interfaces/hero_icons.png b/core/src/main/assets/interfaces/hero_icons.png index 52a2d638a036f2b76dc3ee615dfe4d8f122a78bc..cb185a633db8aa209bb4c4b95f61233c65e10d44 100644 GIT binary patch delta 1345 zcmV-H1-|<56`~f9BmuXPCAAxwnE(J`%L^o}Z~y=R0d!JMQvg8b*k%9#3K_BZA_ad8 zbKJ&ZC~SfS2KgPpxk0b6N!|OOYqfr5Lw~B*GgAdF3ceajJhAk>A!Q033rN=K%kl9a zApY5C8m{Ys#C@RyP70jM!2RBi*1W<1ZwsEwz~la{>HZ1>EDStX;2Zz(?eP)=ER8%5 z1FP=m7!dz_18o*QPBD-Z@FD|}fINSvfwLlTzn^&=#RYXrO)Uv+?=3 z2E4hey=Fq3CIRZc<-2Wqz`*5lnGJjwKmNG`pew)rP-lRAjlZJfW#R?oU&Vh92YJvY zKQKVPt=BL5;o>d>y1+FD!0#jA8baL<4eaojXk|crYwGp~=v;hvMI;Z|XYF&k*W81R)3G4RF$N6HCTl zMi>y*J@Dd73Ex@JhQCn;X7@P^xG#&lTJgD`F!2W%5W@ZE@TpeI0QY|ritj6bjDh$K zdjp9d4ubEEKg58qYQwK$3TS}*@dh{vX#o7uDPZlV0rJOBLP;smdpX$SkG~DMBJnl^ ze|#ar`ra3!E&m0jmjsr2_q8y>T~Y5Igb zX&*po|3JQAeSR1NMw@>TJG@Nw4Ztt9|GVk&o^AOz*MK*7wNoa@y{KAEu}XAzQz|iUU&idQ}E?LgC@d(0Ss^JRf~SOAV8V}AKxz-L#WQmIrbl}dl5QmIrbl}e@3moI;o0sb}T z=nva(tKJJ+nx@J9$UtM7@T+z$vWkBBsudfj0#~ue-bmWF)|4K>QH-3VjsZ=VJN~Kb%RQeSc9OMRF1I{v800000NkvXXu0mjf D|6Ygg delta 1294 zcmY+EYfMvj7{>pn7upKgj;mm#6?HlgQ2{|GwBVI6L3Bo(fEb_*rgjccQF_h+1m<8; zrobv-3mAiDQLc8BF0H~uWzYs$3!2i3xT0lHLb0ViEyE9dSn_;&pXB}U`z24Khryk< z9uik>==1@n`}uqT_FUifGvjjr0F-ki_9$TeGr|UdGSNEkOGK~>s;3Q%Gy1Qi-Uqly zA_KbuZenALoytqw*Y~t4{q9E}tAF^c*L`9&cDy?wy?^@k`9*|MoaR*6G zj$jpP28gv&HZRr%_tIGC8V_GeOW%?FZnclA&@Gf;?%UDC6}^Q~*ybxaFCAP!eS&YS ztBl_;Qj+?io|;0tIc+q@zDHt#i!eI^aKdUE&Nw_lh!Q$AN+CcRK#wk9dQqzeON1S2OSaxet7Al9Om>C_;@T`bU3`eOzp7GQe}uD0Eyb6DMK+#+vff3>sS=AdNm#_Q#a-h-%=_;!bk5|^ zAShuEfd|CqYY2V=g1Djbun!gV|5eJV>@p6RAdc|Uv#X@+=>gwPyRda!1}K2 ztQT%D@S&<(A|>)eM061)SJcRA#usEm$n0s`@Ja)JOOMGk{KS^sRU1%H5yh- z;mV8f53|SISQAdbrk4}%Nf~xFXmC&IjFay)AP}Rm{Ia5sKaDZ(JaBY30HDHH zAJVbXS3B&W-%U-84fdGi>ioOb51l{kegu#v2f_f@;Qaa`bRP@9tiGmu=)AGE@D9>r z-*^7Qcdr6XyN^uNYOt-@`q}=oO<$;I&-JNz|MFco78T)IS$ckB!@c$G-Ms$d(I~~= zO`iqDSvj5NMNw@A|BP)l7VoLhoYgAumlJ=Pmu7a(zQzx+bQ8%=@RD^F+i#)m93$*u7ex zhk|@pxU1P&@MJ=fgy*O?ZS|NjDD}EgO6<)DZ@3~Y3g`NuPq0skpm9@n2XvcWPJGn|C5tTn#j}o-%R%1#q zR|>5+s+Kfr@gFYvPqBkv#DQ4+h{gGf^GMA+@S=Zjgyr47` z?3P4)Fw0B;O5xk?!)Aa;C^SJPJ(P+3$2^$BsRd6Xd4*}if-}w)$@AqZbivybs-}B1 z+n+OBbF^#cwQXrD-+wwhl0Uq{b)aVuZXstr(g+xzzvrU&LspD`rPp?{1=f5S-FeokJbEZ04B^UYlZaqUDjwm4+!8BZD4+ zZlUA^$m=&#!<&e{0P!(UhbT*AAl3H<&DsSj7dqoVSZ=Eco>3t-M$-HxWe7XBW4|n~ z!v6>d2X*LECvb>?M-g%rueZVr`jQbxtymWQ*4Q6RnZ%TT+>C0HOh6;APLSk#52GwS zjtN0KXokgD8#M2QK?*GYuFb>5>Y|gf`aASWW>ul?^kLsUXV~|JW>6UlOfz;Gg2^hTfBRDjevQE)TpRxgO3kShc4_&9r?xf zgBBgP^QH(FP$w?h-iN@shnq#@O_#61SG~QU)(WsvH3t>W?bdn4i?mGzN@@`T&qAvR z(F?$V=Z9n2ZH|{`lA?_e!7Zv9@39M2^hc%J6WC_*yde??(*VGxWBxHk19) zkdVYWe?uUwlN!E*cb(qqlbzG_Y3ll+OG!M`k+kjM*g>}{6hEIcpCT~S%ij#Bs>EfjzNwD%VVHwq8Zn>H9v$1){P`P`VJOV=1ZpaD*g{(MA1ue08d}r7 z{Jm!^cn9tKnh56RrA@){+JLA+KV5Sey2r3`QW@e7n80Fuu z|CeOA?A*_YnwC0MVt{vVg{Dm2YaHba^hrR4Dwh+xQD)=7c-%L@^A`J2q^C04Rc13C zUBMTwvRG$qhk|pbIs7d&#i6mYx@&ctX@FNvf`)7Sw_3VDl3}))IOv z5(SNT^Xa75?~g(xzqcE|-@H$89)FzWii`TKGCF{1U;f6b;QBC?Y@5RJuhX?HNG3=G z4rX4kmd{ZIOAaJMpoGip6|3jy&{cm@o&lCDPK6YkakODI0d6(P8oX|Nv)Hj`Y(XA8 zP7iWekf+Gn-=M6g5gd<0th1X*gKg}Sw_tJYCkqC}@sQggD1Ej9FsQakSEN`*)T##X z_|+#Vr=Vi_goZ$|@B^U{g2m~A45u88H)=84 zO5#r__?0uAT@lJyBJ-YN9C(+*VeEHfZAmf->c97~HxKN7q!H&3g zOWPEsNXzg>6n=wmU5(~kxAzh|0~z~EN+92`jzqf-5DNo<7rk|T+pFD;pW zQOmVb;)w``c8fgHVxG8yipZZqbI^~gM5JZ)f(>2KdIAtV^yci9HW-kPOoB2(i0>8$Kf4zgR#ke1W9Ehm(NN&_~Z&91{ zjreuuv=)QYVy(sBwTb2Kn3H@C#JVCy4}orV3LHppk2nMX=_wQOrt{E>>aqs^;6rimy3ZMTD;KT7jrM;Slk!of{l8ADmp*R~h;623 z-{AzoC`!JzLlCo)8b=wqrsVuyVfQbkioY^rYe4yEL}SXbTUAnWV@w0_L0*~vRHSzl z8(k4ZJ$?D;kA`X7#{m^{Ad@upC)S&s=lx=CV%8%WQuH)!Q|~rr`cx$sO|W} zE(1TaXP%!Ia9#ep9EIOtR$?WdEGkvmHlGm!n>LRhr?ye&Z7c_p6i)*4_P3Jg@@vyUG9h=4mdJ#B{zEiyNMr)%|H#DLcr1|1*M+HpY!d@l=T*q z^m9H&2T)t&NZW>3|FBk>bQ7vz)p}UP>g-fT_8$WMBt{FA`9AvgwIb|U9)}U@2#Z~} zWJ?E9uRZsp^_y=x-UcUt2hH z5E;a{7rKPtp4KNE8__}z(6544#eTubXjAl)h;~ct95=`5FT6s{Wo^pzPQSp`&&=GH z0)&M1dj(6Ja77wrm`t`rS*Kh}VV zP=u@lJpI|UwmN$2RIwHyNDmEQ%^m6K_Ay0W-h7l8TkgPSp)r0!ohiQXm0H-Q%H~2i==Bq8ecb={Mo{dr@-hj}05?qKyL0t~Fy3}y zyDo?~2~|N{9A%c4fdPLGJU|cI0X>Qaj1*v0Pqo~rZmC2sQzYmP-S7)+=}32m3!ofV zy6#(qK^RF4*qSW}A=AnqwJ27$H?1Z)j6S2-KLLB?NGo_xyx2@uk+0*qV zP}DFoumKPF@G1^da%cOht9;Xy{M^#zguURw<&;Hq8+cpxICZ90i-VY#RjM1=zDfM^{EMx z=8#v6;yv8u;(uKJv0kT4((K?B`fAcPWA!c4KhI5N-4dZ^<@5o+r|IH`n`m86Q>`E! zRlS|IP^7F0?;tT!oJ|-@apW2}d9seioMKGHt;y9>v2DiQf9%U@Zd{_)&Oif-H(>Yu z`aV@jb6mR(7aBHYhdy+r_9mnLmPK#zxO$%@ ziJJ48pK=IgfkLjrlhAFg4%B+^QfeQXY%sX#(dmT5DL%1r9j8n&H#^$9wkXpLzF9kV znPzM`9@TEAv5Pyju#_(X`PmEJ#Zj8`+}-Wco(GQ#%b+I{?AJMjDkFFxzW2`_=KTd& z3D{t!%k*k`EDJpB#N*Cp%*C~@c#lCH%--u7YGzv0H+kZD_??JPP{@LqR}Q%5O;jw)tIHMoXq@y+#qxOu2H&ao~1Te`^Q}P zuLsxd8LG$Fq89t%_v@kD zB7Ukouh%+dplntFoTb#m8cqaFB=M9UNzM*j=+k|)7t9S`I#+B}o>soM+ZS0FyAOCq zbq`Zmg^byixQmztI9yE*e%ugg*(OO^-49wtZ{K`p(|&RttU(`>(al;4 zQ*~`$!k4R?5eJ|UC3$BUM~_EEzXxH0czV6IjUnKAsH`cPy`0*u+aT-+*eUL=y?3ee z#AsApW|?2G-JsZ{ZJlr!>RU8bp@;n7_fQ++xEl72PP3q32dbgP$PmX;L~RE~@=a(e zeDhu=V;0b~qm4zlEVQfjKkRxGTGI_W2F)hibTKcP! zb5qoDLKtXG`m-x!jX8tVAkB$n0;EQH)Zo;u4tR-j=cXmW>_H?!31~5LG}va>Rac;Y zze}*Pv}x#jH&TrFXt@a5gV99P?yWrxJDFlcLB1i`2Fg50&mNKB#R0?pFfUAk!Z`|; z59N_8%s@cFN?fs&+5%Kghfg%s*uXlH-)8r z-S+1_I!exT&nmz%uUe?JMlGIf_9q>XXg?o?H@8;*HnwtzcBmKDChlFAQg^K!*smvrANUg4Rkg=}a0Xu}ttT(s6W;;of=6t~~Gf?=l z^by{3$AWGG`)T^!wc?iY1Cv%0**j+21(NW7{JD z+>^*QqyJ@)`h%CG$?U=?9Fo~(46jE9IT&+PLtm!Ps4JE1h>OD01wv`_x#cK5X<)o> zeCk4Os2Exp2&mc!jwlL-;^jMn!6efkk-YA_8`(6a2op~R94S)y3-|>RQ?%-zDv)vm z!7nFA+){qZg+sr{I8rNl#|cveYc4#iKpcZL+t?h8514e)#s*1?ykP>ubH%enp+w2t zN@F`*<_)>gAsGm145u@sJ(bpx1R41$S>j2jn*~C$xO<}ZDAkFOAvpd(28xmb?X7XJ z6fY6#Ecu&SH;N|$HU~C} z@8n?St6$aC=1o4T486=^1KQUIksMKo{G5q?TF^GTM`^S}8{u15&h%oiX!NWasRa-) zv;5k^=Y@v?(ordeoolfsAMRI|*Z#5_=wYK`r0jUwWC;ZSXHrP{Do?)*COt&8VbJ)X zv^>O+ia#p0eIAzqim(G5VMklZ8!bc(+GtC5eyao`RoMp$POlqvMK-msi)ymL2s%$d zdRUeYy-@@5qy;8Cz2L4w=Z8|3z+&gMM-uXXpq;=2vv-mlkix`>F4QSQR#?_1dh|FX z(!q%08l<`TtIc?*bz(D7KMgB5^I&tXF|u!+{O2ZkFii|vtK|Y`(KlUVPmBM#YlZ*^ WjCQ<8x(fBIUn5@+;ptM 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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 b487f5ac3..f444431d2 100644 --- a/core/src/main/assets/messages/actors/actors.properties +++ b/core/src/main/assets/messages/actors/actors.properties @@ -544,6 +544,10 @@ 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.blessspell.name=bless +actors.hero.spells.blessspell.short_desc=Blesses & shields Cleric, blesses & heals others. +actors.hero.spells.blessspell.desc=The Cleric places a holy blessing on themselves or another character they can see.\n\nWhen cast on themselves the effect is weaker, granting %1$d turns of bless and %2$d barrier.\n\nWhen cast on other characters the spell is more powerful, granting %3$d turns of bless and %4$d healing. Excess healing is converted into barrier. + actors.hero.spells.cleanse.name=cleanse actors.hero.spells.cleanse.short_desc=Clears debuffs and grants shielding. actors.hero.spells.cleanse.desc=The Cleric instantly clears all harmful effects on themselves and visible allies. After the spell ends all characters affected also gain %1$d turns of debuff immunity, and %2$d barrier. @@ -1071,8 +1075,8 @@ actors.hero.talent.sunray.title=Sunray actors.hero.talent.sunray.desc=_+1:_ The Cleric can cast _Sunray,_ A spell that deals _2-8 damage_ and blinds the target for _4 turns,_ at the cost of 1 charge.\n\n_+2:_ The Cleric can cast _Sunray,_ A spell that deals _3-12 damage_ and blinds the target for _6 turns,_ at the cost of 1 charge.\n\nSunray can only blind each target once, but if the target is already blinded by Sunray then it paralyses instead. Sunray always deals maximum damage to demonic and undead foes. actors.hero.talent.divine_sense.title=Divine Sense actors.hero.talent.divine_sense.desc=_+1:_ The Cleric can cast _Divine Sense,_ a spell that grants them _8 tiles_ of Mind Vision for 30 turns, at the cost of 2 charges.\n\n_+2:_ The Cleric can cast _Divine Sense,_ a spell that grants them _12 tiles_ of Mind Vision for 30 turns, at the cost of 2 charges. -actors.hero.talent.clerict2e.title=Unknown -actors.hero.talent.clerict2e.desc=This talent hasn't been implemented yet, it currently does nothing. +actors.hero.talent.bless.title=Bless +actors.hero.talent.bless.desc=_+1:_ The Cleric can cast _Bless,_ a spell that grants _4 turns of bless and 10 shielding_ when cast on themselves or _10 turns of bless and 15 healing_ when cast on another character, at the cost of 1 charge.\n\n_+2:_ The Cleric can cast _Bless,_ a spell that grants _6 turns of bless and 15 shielding_ when cast on themselves or _15 turns of bless and 25 healing_ when cast on another character, at the cost of 1 charge.\n\nExcess healing from this spell is converted into shielding. actors.hero.talent.cleanse.title=Cleanse actors.hero.talent.cleanse.desc=_+1:_ The Cleric can cast _Cleanse,_ a spell which is cast instantly, _removes negative status effects_ from the Cleric and any nearby allies, and grants them _10 shielding,_ at the cost of 2 charges.\n\n_+2:_ The Cleric can cast _Cleanse,_ a spell which is cast instantly, _grants 3 turns of negative status immunity_ to the Cleric and any nearby allies, and grants them _20 shielding,_ at the cost of 2 charges.\n\n_+3:_ The Cleric can cast _Cleanse,_ a spell which is cast instantly, _grants 5 turns of negative status immunity_ to the Cleric and any nearby allies, and grants them _30 shielding,_ at the cost of 2 charges. 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 1167e4d1f..d74a66d20 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 @@ -178,7 +178,7 @@ public enum Talent { //Cleric T1 SATIATED_SPELLS(160), DETECT_CURSE(161), SEARING_LIGHT(162), SHIELD_OF_LIGHT(163), //Cleric T2 - ENLIGHTENING_MEAL(164), RECALL_GLYPH(165), SUNRAY(166), DIVINE_SENSE(167), CLERICT2E(168), + ENLIGHTENING_MEAL(164), RECALL_GLYPH(165), SUNRAY(166), DIVINE_SENSE(167), BLESS(168), //Cleric T3 CLEANSE(169, 3), LIGHT_READING(170, 3), //Priest T3 @@ -937,7 +937,7 @@ public enum Talent { Collections.addAll(tierTalents, FOCUSED_MEAL, LIQUID_AGILITY, WEAPON_RECHARGING, LETHAL_HASTE, SWIFT_EQUIP); break; case CLERIC: - Collections.addAll(tierTalents, ENLIGHTENING_MEAL, RECALL_GLYPH, SUNRAY, DIVINE_SENSE, CLERICT2E); + Collections.addAll(tierTalents, ENLIGHTENING_MEAL, RECALL_GLYPH, SUNRAY, DIVINE_SENSE, BLESS); break; } for (Talent talent : tierTalents){ 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 new file mode 100644 index 000000000..fac1fe130 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/BlessSpell.java @@ -0,0 +1,102 @@ +/* + * 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.Barrier; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Bless; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; +import com.shatteredpixel.shatteredpixeldungeon.effects.Flare; +import com.shatteredpixel.shatteredpixeldungeon.effects.FloatingText; +import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.HolyTome; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; +import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite; +import com.shatteredpixel.shatteredpixeldungeon.ui.HeroIcon; +import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; +import com.watabou.noosa.audio.Sample; + +public class BlessSpell extends TargetedClericSpell { + + public static final BlessSpell INSTANCE = new BlessSpell(); + + @Override + public int icon() { + return HeroIcon.BLESS; + } + + @Override + protected void onTargetSelected(HolyTome tome, Hero hero, Integer target) { + if (target == null){ + return; + } + + Char ch = Actor.findChar(target); + if (ch == null || !Dungeon.level.heroFOV[target]){ + GLog.w(Messages.get(this, "no_target")); + return; + } + + Sample.INSTANCE.play(Assets.Sounds.TELEPORT); + + new Flare(6, 32).color(0xFFFF00, true).show(ch.sprite, 2f); + + if (ch == hero){ + Buff.prolong(ch, Bless.class, 2f + 2*hero.pointsInTalent(Talent.BLESS)); + Buff.affect(ch, Barrier.class).setShield(5 + 5*hero.pointsInTalent(Talent.BLESS)); + ch.sprite.showStatusWithIcon( CharSprite.POSITIVE, Integer.toString(5 + 5*hero.pointsInTalent(Talent.BLESS)), FloatingText.SHIELDING ); + hero.sprite.operate(ch.pos); + } else { + Buff.prolong(ch, Bless.class, 5f + 5*hero.pointsInTalent(Talent.BLESS)); + int totalHeal = 5 + 10*hero.pointsInTalent(Talent.BLESS); + if (ch.HT - ch.HP < totalHeal){ + int barrier = totalHeal - (ch.HT - ch.HP); + 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 ); + } else { + ch.HP = ch.HP + totalHeal; + ch.sprite.showStatusWithIcon( CharSprite.POSITIVE, Integer.toString(totalHeal), FloatingText.HEALING ); + } + + hero.sprite.zap(ch.pos); + } + + hero.busy(); + hero.sprite.operate(hero.pos); + + onSpellCast(tome, hero); + } + + public String desc(){ + int talentLvl = Dungeon.hero.pointsInTalent(Talent.BLESS); + return Messages.get(this, "desc", 2+2*talentLvl, 5+5*talentLvl, 5+5*talentLvl, 5+10*talentLvl) + "\n\n" + Messages.get(this, "charge_cost", (int)chargeUse(Dungeon.hero)); + } + +} 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 ca801f2f8..b10d3643a 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 @@ -80,44 +80,48 @@ 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); } - } else if (tier == 2) { - - if (cleric.hasTalent(Talent.SUNRAY)){ - spells.add(Sunray.INSTANCE); + if (cleric.hasTalent(Talent.SHIELD_OF_LIGHT)) { + spells.add(ShieldOfLight.INSTANCE); } + } else if (tier == 2) { + if (cleric.hasTalent(Talent.RECALL_GLYPH)){ spells.add(RecallGlyph.INSTANCE); } + if (cleric.hasTalent(Talent.SUNRAY)){ + spells.add(Sunray.INSTANCE); + } + if (cleric.hasTalent(Talent.DIVINE_SENSE)) { spells.add(DivineSense.INSTANCE); } + if (cleric.hasTalent(Talent.BLESS)){ + spells.add(BlessSpell.INSTANCE); + } + } else if (tier == 3){ + if (cleric.subClass == HeroSubClass.PRIEST) { + spells.add(Radiance.INSTANCE); + + } else if (cleric.subClass == HeroSubClass.PALADIN){ + //TODO innate smite spell + + } + if (cleric.hasTalent(Talent.CLEANSE)){ spells.add(Cleanse.INSTANCE); } - if (cleric.subClass == HeroSubClass.PRIEST) { - spells.add(Radiance.INSTANCE); - - if (cleric.hasTalent(Talent.HOLY_LANCE)){ - spells.add(HolyLance.INSTANCE); - } - - } else if (cleric.subClass == HeroSubClass.PALADIN){ - //TODO innate smite spell - + if (cleric.hasTalent(Talent.HOLY_LANCE)){ + spells.add(HolyLance.INSTANCE); } } @@ -130,10 +134,10 @@ public abstract class ClericSpell { spells.add(GuidingLight.INSTANCE); spells.add(HolyWeapon.INSTANCE); spells.add(HolyWard.INSTANCE); - spells.add(ShieldOfLight.INSTANCE); spells.add(DetectCurse.INSTANCE); - spells.add(Sunray.INSTANCE); + spells.add(ShieldOfLight.INSTANCE); spells.add(RecallGlyph.INSTANCE); + spells.add(Sunray.INSTANCE); spells.add(DivineSense.INSTANCE); spells.add(Cleanse.INSTANCE); spells.add(Radiance.INSTANCE); 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 index 478906bee..c9c25a50e 100644 --- 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 @@ -55,7 +55,7 @@ public class ShieldOfLight extends TargetedClericSpell { } Char ch = Actor.findChar(target); - if (ch == null || ch.alignment == Char.Alignment.ALLY){ + if (ch == null || ch.alignment == Char.Alignment.ALLY || !Dungeon.level.heroFOV[target]){ GLog.w(Messages.get(this, "no_target")); return; } 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 acc2c4392..55fc14534 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/HeroIcon.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/HeroIcon.java @@ -76,14 +76,15 @@ 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 SHIELD_OF_LIGHT = 43; - public static final int DETECT_CURSE = 44; - public static final int SUNRAY = 45; - public static final int DIVINE_SENSE = 46; - public static final int RECALL_GLYPH = 47; - public static final int HOLY_LANCE = 48; - public static final int RADIANCE = 49; - public static final int CLEANSE = 50; + public static final int DETECT_CURSE = 43; + public static final int SHIELD_OF_LIGHT = 44; + public static final int RECALL_GLYPH = 45; + public static final int SUNRAY = 46; + public static final int DIVINE_SENSE = 47; + public static final int BLESS = 48; + public static final int CLEANSE = 49; + public static final int RADIANCE = 50; + public static final int HOLY_LANCE = 51; //all cleric spells have a separate icon with no background for the action indicator public static final int SPELL_ACTION_OFFSET = 32;