From 6a627933618bc3d15f547a4f06584e171f8b1737 Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Wed, 11 Dec 2024 15:30:50 -0500 Subject: [PATCH] v3.0.0: implemented the mnemonic prayer talent/spell --- core/src/main/assets/effects/specks.png | Bin 496 -> 513 bytes .../src/main/assets/interfaces/hero_icons.png | Bin 2914 -> 2976 bytes .../main/assets/interfaces/talent_icons.png | Bin 7253 -> 7289 bytes .../assets/messages/actors/actors.properties | 34 ++-- .../actors/buffs/AdrenalineSurge.java | 4 + .../actors/buffs/ArcaneArmor.java | 4 + .../actors/buffs/ArtifactRecharge.java | 2 +- .../actors/buffs/Barkskin.java | 4 + .../actors/buffs/Bleeding.java | 4 + .../actors/buffs/Buff.java | 20 +++ .../actors/buffs/Burning.java | 6 +- .../actors/buffs/Corrosion.java | 4 + .../actors/buffs/Dread.java | 4 + .../actors/buffs/FireImbue.java | 4 + .../actors/buffs/GreaterHaste.java | 4 + .../actors/buffs/MonkEnergy.java | 2 +- .../actors/buffs/Ooze.java | 4 + .../actors/buffs/ShieldBuff.java | 5 + .../actors/buffs/ToxicImbue.java | 4 + .../actors/buffs/WellFed.java | 4 + .../actors/hero/Talent.java | 4 +- .../actors/hero/spells/ClericSpell.java | 5 + .../actors/hero/spells/GuidingLight.java | 3 + .../actors/hero/spells/MnemonicPrayer.java | 166 ++++++++++++++++++ .../actors/hero/spells/Radiance.java | 1 + .../actors/mobs/DwarfKing.java | 2 +- .../actors/mobs/YogFist.java | 2 +- .../shatteredpixeldungeon/effects/Speck.java | 6 + .../items/armor/glyphs/Viscosity.java | 4 +- .../elixirs/ElixirOfAquaticRejuvenation.java | 4 + .../scrolls/exotic/ScrollOfChallenge.java | 4 + .../items/spells/WildEnergy.java | 2 +- .../items/weapon/enchantments/Kinetic.java | 4 + .../shatteredpixeldungeon/ui/HeroIcon.java | 1 + 34 files changed, 296 insertions(+), 25 deletions(-) create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/MnemonicPrayer.java diff --git a/core/src/main/assets/effects/specks.png b/core/src/main/assets/effects/specks.png index 35492943f53d22379e72c8f1515e1090c0107094..3cd15a23381736b859f6bb04872bba09f1bfd38c 100644 GIT binary patch delta 487 zcmV7~R2;PyhjBwlRP% zpp-yS3Y0R?9aNbW6o7YLes4am>w39NA|J=h+(!oA$$fteWF}%zMAFd`-cJ&-gh`#u zp*P99nHM;H`yyh2!(kBV`(BpuAhqz?HIUCXB57|$@N=@4vVW^mD1ap9<-Z}GYm`sC z=yS#(e{A!L{Q38HLJ1JBY5@}2%AVErYKiwCX(C|`gC*$K3z6FwAc&7KhcqdduTD>N zmO}wj`Q%aomSs_kIhav^qy$JWl^_;io@aUSJR>}2e*IZa{;W|0&wSe@?bbB*QU2er zZwV#1PXTy|B!5?CYhiv=&e1%>td=OBd^~*+d9DD{G*JSdHjmfCOKF!oL77oG_yRX$hL> zD4rNJ@gxxCLn=QC&kHcDo1n4do&xCKCnCQAZX&Lgu=cs;B|v`R43L#TcRK^bO+dE&3aD=YR{u4A1+entJrv~!l0#qs`Bf0U#gjdb dT3{560ssp)*GOc*sDc0h002ovPDHLkV1nEf+YSH# delta 470 zcmV;{0V)201n>ipB!9O_L_t(|0qvK8Mg&n5hR<_^5Ks_JdWZlRy}__c02Z+G8UyG7 zA{IgfL=5x>iFtwm=x?v)<2p{=mazl-@tc{mSnK=exN9IY5!(?-YYVvSBw_)bDp`ik zqVHy2X7g|-Vvg0S5vl817V#ye@U>&W&n7|A(&ndJ0Le=%e}9H}u3kRLMQ_tO`7H$~ z$?snu2_-;0DHb4*t>{@*trUL`k~-q%&{%+8jzsn?-pBo*?zdu8`k}HA3J}XDr2-7Y zkRr=qMggJ{AiY?Epa6Z}=hAr=!hQPFTV?WlwQ6|gZI`qdlUREB@Av0~63kP8jUDr2 zvNBr=^R;5umVeXqO7Zf^_2!D`uL5*kmt^~-xfhT8asmA6e;$~Dg4llw(DH^;fDz;a zGYatebfR?C+r@qgkVL2C;)#uT`MYcYc z;c)?)aT6pK+*1I3+z<+|AN-pit$(R>K8Ts307$nCW>0wm{Jm{KxQ`WK?Q@Mwfc)Ya zATELCI|H~)K&JT@P~HHn{we+iu=4#ql;p<*hd_syU&0GNa9~!x0rG{Wyt*xEJpcdz M07*qoM6N<$g2$EMY5)KL diff --git a/core/src/main/assets/interfaces/hero_icons.png b/core/src/main/assets/interfaces/hero_icons.png index 1c35779253d0797a40ade6f9fa36edd30bc031ee..461d8d57c593cf03848bec2cf8bd330db0232915 100644 GIT binary patch delta 2760 zcmX|=dpwg38^`ba-jA@jb$=YxX+ zBC^4!<=mqmya*VVn28%-s?uJp5oonfl9q6f>_2H&>9p-`9_h)|Bo2_-b9HBJXSV;-)?@ys=Z#>WE0j*+*rrX--~kXy~1`k14ORph5` zB{+g1Q0dL6O;*p=fn=vDpNyZ_AMd?+xHjqIPpfiLIs{=I`9PfqIxnH>0W0%UzrAv? z-T}W;%WbLOs*57~ic``Kia9#~cI?c9Kl{9D@B)ir6EV80rv#eIhLx#PQ38Mt4i9{e z>+2Qdt8gSq;^KJ32DI`li~SL{1GJ``R~fwrS7PHRMSCTR`{oEAX)`>%ujSJI{f>bg zSpSAQBn=cln%VExHfTu%$%l~d8PsgNg;$;Sc3(9dQi@s%n|#i zMhCy7AE`&7ebdJvG$?zavr+rySEH?>c)2z7)C`Fsu=0j7^1^^1Kx08YLR+-axiH@w z2umkOf&ezILqH47P7$v_GN=zg=!84}_BmB^{o`7=Q59jg% z1^7q>WmH-8^hIh%I%PWVge>!6F0Y3|Q+!H39Q0$f+Za}b{&0R@BpnaN`eC?jo-J{f zWial>+=-}E!>)b|10YBuv`pA+QZsVzVQ8t$#ziexw-z6eJV1BMP7`B-C0bgIkC>;{ zPR16-I(=W3MDsD4D@Fh}l8RLDMvP@FZic*zKTmH(esD99U&NT)D+{lsI*>d)Io|tv z3dZBYIVyYV4=z?A`>dXKX7b*@wM8+HI3bWK=hM*HQuN1P5^cS24w+m7lpfF)+T8P6 zDkL>#je!(v>b!|`@!*~%9I#ih7JEV4= z&0&xV_{hwBfcUA@M-JY~mu`Rypfh|RYd!$MjgpTaRk3SIXY-4{xT9na*o+9f1@B`3 z$0ugsK5Vx65Pp8X1ie6}nc(2#2GNYrVs=Vlip$hsa{*jn7d|ES~#y1+jk>f-yff8e3A!$HR{01FK^ zWMt$s5*>jE-~iE?+g>^e?mFYB1bn)KwJej7I7{h-Rj49Lag&o`pGbcnfoHq!n2lsS zjIK)e1b^N&x({lh!)xfhHq>N&WksY!Gbxxf$Bf=~p}$2q{0CT(a30{F7+j3$C#URy zK?cx_%5;V3@YG>*SLo)z%k>ec%sVE@tx>Cx$wsUud0Ia!$|IjP@iN+8HoZ|{Fcrd^ zg&UUfUzi%!K2vQ>s#iALkqrE`rh1R5$9h*tTYu_h3G=jp>i)RL#9YeQ+NO>f$S#l? zS9uLPLJ#g3cT0m?&xwfyTjn2@ywe%lI*^U-8D1SuiJagzg)sQsX8aYN_C}(p2ZjOrGGN70a5>oVdT!~?6DL+R#~cC&8pA%+B0VLQ^&;4 z`%H?~P&MsPFxiT|mDS0w-y@IjHoG(|xAOPsaj~}^u0oWw8;>iQ8~hgW`|Xy8UF5DR z8CRnO=%)+BOGMVE!frzKq42n}MJgn84NqglvxIWyNEovL(J=*|AJi=p1ZRsVm=w%L znIZv;+hb8rrD{U6pL3rPtRj#=KHlc`j%V(6;@P#NV-;YRuP=*X2Clk&SQi@0u|K`y zty6&2{)WggTFuC&ZRdD-GL4zSD0PqM>}m4oB25xl{WaMx!4zKNzw1*LE|-n3EGrxt zUyZpYu0y|}#E|LdSuFOY1E;iX1J@0+^>^FQ6PE`)=%1n_9R!gxN|(f3M66f<9qMd5 zSTgO0Hl+y%UY7#TJ;1QFdPVqFwqwd(Y_7#_M(#;OmAx1!DR9Uy1pv8WnIn-jd_rj{kbekR8 zTM7caj1XqsbRdCw{jpJK{+%9zp})a%3KWuNC)K!8+f8c&SOiV*cFFgxiWx)x`Vbdr s>5k`|IHx{~S}-2P{L5+DY?Cx=C z6-C)}kfx(3DA*0j0}-5Ibp-__vWq|xSrQ=2FjZ4iH8tnYt-Alt{mwmk)E-OG1RVae zFE=z9thPSl`Gdd7?x5}W<)p6&A%9-{y z_4=^w4fifncv_L#()i40<7)RdBI;Bt_o^L7ylaov*n}AdIJFwnPQ&9~7po(XT%>R0 z{MM{$A=0u!6gI$b0-qCP_sU2S`dw7kxTM@8pDr?}A4DpIZ5<>unDZGQv#dd6eX=t| zmWx?>2hgw{d9i1j#&ld?)E%laXrfgk!%W%olt6sfGXKXK_q=?nsoJpPpMOWrsXgsb z-I412Yu2RuU2t5OPD3x&MN}N>fB9txPmo^xLa0`y3`<9W8kLu%egeUK4#LJaEcdjtbVAaE|y zslJU2;R75Ma!QC6nc$0-sj>3>0(js&TyMB|1zI|=rC zB)RPZ&H6tE^1F&r{ThAyTT0s8Olk9-6W zA6<&-JjirOA{RcpI|I;Ig{N)gc%ZuF3`WmrXT_Uy!|e~4@|fDJ-YPSf7UgwsHW({_Ev`Yd`|5t}=j zUq-TxtV+Htcst_}=cD1Bm?2$FfCm|8Z#YHuP+>9rmYXKsna0|3_)2@r=07li6l0~I zDx{hEd*Y90w?|?=#!@Pp@;^3*o=K2Aj#$st(BB+BbZSZeww7f@^3da zK}aheuhC5RH@4;m^tLyiiF$0w0d+pJ^8n|)12l8@UNrFZ zCiqF8f&}>|TDSGMS6YgWQ}Pl0)1+q(hio^`+p2_u1lD~E_YimcSL^>4bfIO(%=E!| zB|+}D(vo_wiJz6UkU#^A(T<+u|=ck-3n+8a#aY&y={VT2~^6thn%Eg;Eq z4NVBoj>fc(24drOD|WAzjLX^bC|h1cAw7`SJh~iI#}FsNliB_Z5=u2RMUKZogOlj! z@d1}TMiUJV)|U-)N-etODhZ%-7$az+nT2J+4JK=qVTFgNF_8iG?~;)D{3@^3qp<=Q zu?o#LTT`|1eITH$zQ5YBt^4Bh>B&Ucs>&}U(uJGpfV+^~=YQ%!G^Abj`}6s1+4rb4 zP~CS4F0){Hj|RFy;4Gqa>e(%_9zDZ^S`xkwQgxNS3>2TTN~Q@SV}nApd1!|8fiEEV z{;`XWI`e0iyEzm-J-!j0W(}n}D7Su}LG`qB8P7s~>BEo6?KwA&y@dM7PHlEfJUZ}r!h@__E+2H5k`@QixZET#(o z;7{+H<@!_vVV-7IDt6!Ii%v@{D(<##;)c47k-M{RgUbhVFZz3^ zzwJ1du+b@bbd@I#cA+tNS6k%FjcU0q7WE^LbC+oRgw{Gv$@v=w16kpaS))1Euv^Y- z;^#+E0W;^4>GEy1G8Ltktj1tvjVQLR6{jd1_b0G=7S@!Jg+x#Kv$JN9x8Y87`tT%- zns&IjfxTB{eZJ}7)zZvGGI!h>KGmkw_{^=cz58LlE3MotJoWa406rybv0wa4M_xqY zQEy_*ALzJio4wGvsCNlVTVEWy^tTQ7xBO>(&1lFO%8m@UH-cH)#TKzkBiW&;OI>$m z-YEX|lZt$AwIkYJ?XPp+udw2-+M8nXi?NmR)urnPZ?5arfxURX_8bef-Mfs({{-X3 zOg%ErRJ-K8_Vu*mj2kD`)zYco83Ty2!pqc+JDCbu>k3@PBQE*b*A3DHSg(SgKW<-R zC*#v5xC130CWU%uqneuSV)lnw{9QxZTov%K55cI-TM_6}>3u{| zkc0FvY}~K65oNsjnBqP71;(uION=I@UH3DB>bnUs-fkJZqW^JM``q zuG)2-BS~H%nBd9gI9f1v{COwfQ^`+xa9~9?U4bW{H-v^+3Ai27I~jzvkrLIS!{Fe# zAZI_+E}uxFKh%+FP(+3uk8hrn^MJ)OpJHLZefE+N$zd73%^zLdB=e0sv;N?AX4QEJ zf7}peYHg@WbdMXDW9Slecx_wxZ6{$9sHLv3d z_=t@9V5qu-s-9TM<9B9Rr7FxO(Q&b2)KeOhux#wu?rC${LdxMQ^K^>0iT@4kzjNE| a0b|Z}(Y8pa_c_3veqO)H_aSB-FXdl&_6vFd diff --git a/core/src/main/assets/interfaces/talent_icons.png b/core/src/main/assets/interfaces/talent_icons.png index 78d9b3d662a51e221eab12f157d5bac35fee8570..b06b269b9d0e428462b3058f63cde632fe27ba32 100644 GIT binary patch delta 5857 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%0AA{qtkJ!g*VDLsN0I-OsLw&LUF0O1r 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 z z4J}F5bI#Sx6K9QwxPn*I9^^c}js>b%kCLl`ylDiBzJg<#Pr$pYfZ zcDJ9_3hSmnykrUM^>os0qt?&_gNr_iV;)c%%zkg55# z>Ipi6Bb|$NSfeondBK+YSO9x#@GYlc6}{K%p(LJB99nBO33E zRB`X!prk?3#BQ*|z=&lAkOCZV^#eDG7^}AZ14);!6rJ4bn;}2@NsqT1hEy@#-qXdmtNUo^z&y^!z#{{?m4}e?cVh7??kUq_ z5U>G9&=zo-JqfeWQbvs&Pdl6!K}6e0Z(__Qx>qM^qg%8MALfw!iEmelJYEvV^9Sc3 zNen8@B3SDPZ8HzxOW+|RQ)M`wecKjf+`*xGGvC^Mu2voZ*{E|Z$cO#;HZX%ixF($ZkfLObbC;1^QI9&a|G_EiA-yjo~84aP->8{J5+a`AjxTO@p z!oT#A9rTSFG7PQ;U!CITAr3qUr5x3C2iihQ$5lGC);nyxKAwg#3y-OagW z;AO*ZRB2Z6{1D@t16?Cp4fk+Q;M0&z2;Jq~bkDmEI!YA9(t}u7ny5@`#VjRYsrjqn z5m9&CpTUW(lZMwQOZ=H`F=*zx|TDC15t^yy@S2buFua_gQcZ zMI?o{>mH&wp2NrXVyIb*PBb3C;_$rAs$$SPEOMZi$d@s0OEeNP`kzAzzflL~Xdk%5 zQd6|%strwrT&f$yX&DjC2D|z~O&w5ezsEMR?sLVrEP8Qkkog-E|*&DSi4KfX8bVrmMRX`Q(pG4&&EBZngEm(G(+NDCzNZ%vIo1cgb{GNN$-9k5mPe3b&HzBwHYv0jB=q zQY5Ft`JMskC07q#<*xUqy+mz{f0PE?rkKayOx~HXoXvaQLMnGo=&eg*Jyl$AYgjgO z!R_>&S)`XEs#mvL+7@j2tu7YD>DKZ2BDM_UB}O>I*wGMhOJej+kJ07I4J(lHeZMHk+t&%+V5>^+oW0^P({$gI3d!RIvjrco0~cy zGx|)(4IK`T|KmSlxK-Jr!@Ct(W6-K7V``~f;1V0+1(^A_CXnY4Q_+(Xho8agO+0=2 z^k&5R#(tk|$_f8ZQ!jMcGS+X{OA&5?zl`)bX|{nsE>3CRt64cw||F^_lI8#W;WsR*%Y&`j{DUFVBj_9{vhU}Cv!9~fyf1mQ7(H>5uW z%6BW1z-sNSH?+CghO|Dr)ml3>ONbm1>}uC}LT!ZQIPH3qUY>AouOUi&k=<&|f6@jWJiZ3Y?93g)BH zVJA*?-qKkC|E(f;-9J|iovVd*Oq(eKi>vp#A=nc#x&Z#$CQsfp>UU^RlylTtFtj+iZo|$0wzj+P+Wcf=z@`5Ktm10u diff --git a/core/src/main/assets/messages/actors/actors.properties b/core/src/main/assets/messages/actors/actors.properties index 3041f0ceb..164152664 100644 --- a/core/src/main/assets/messages/actors/actors.properties +++ b/core/src/main/assets/messages/actors/actors.properties @@ -557,19 +557,6 @@ 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. -actors.hero.spells.holyintuition.uncursed=This item is free of malevolent magic. -actors.hero.spells.holyintuition.short_desc=identifies whether an item is cursed or not. -actors.hero.spells.holyintuition.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.divinesense.name=divine sense actors.hero.spells.divinesense.short_desc=Gain temporary mind vision in a wide range. actors.hero.spells.divinesense.desc=The Cleric focuses their senses on their surroundings, gaining mind vision with a %d tile range for 30 turns. @@ -583,6 +570,19 @@ actors.hero.spells.guidinglight.desc_priest=_This spell is more powerful when ca actors.hero.spells.guidinglight$guidinglightpriestcooldown.name=Guiding Light actors.hero.spells.guidinglight$guidinglightpriestcooldown.desc=The Priest will be able to cast Guiding Light for free again after 100 turns elapse.\n\nTurns remaining: %s. +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. +actors.hero.spells.holyintuition.uncursed=This item is free of malevolent magic. +actors.hero.spells.holyintuition.short_desc=identifies whether an item is cursed or not. +actors.hero.spells.holyintuition.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.holylance.name=holy lance actors.hero.spells.holylance.short_desc=Deals heavy ranged magic damage. actors.hero.spells.holylance.desc=The Priest concentrates a large amount of energy into a devastating thrown lance made of light. This lance deals %1$d-%2$d damage and always deals maximum damage to undead and demonic targets.\n\nThis spell is very expensive, and has a cooldown of 50 turns. @@ -605,6 +605,10 @@ 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\nTurns Remaining: %s. +actors.hero.spells.mnemonicprayer.name=mnemonic prayer +actors.hero.spells.mnemonicprayer.short_desc=Extends buffs/debuffs on an ally/enemy, & re-applies illuminated. +actors.hero.spells.mnemonicprayer.desc=The Priest utters a prayer that extends the duration of all buffs or debuffs on a specific target by %1$d turns. Positive effects will last longer on allies (including the Priest themselves), and harmful effects will last longer on enemies. This spell will also re-apply illuminated to an enemy that has been illuminated previously.\n\nMnemonic Prayer can only extend a specific instance of a buff or debuff once, it can't be used repeatedly to make a specific buff or debuff last forever. Each application of illuminated counts as a separate debuff. + actors.hero.spells.radiance.name=radiance actors.hero.spells.radiance.short_desc=Illuminates and briefly stuns visible enemies. actors.hero.spells.radiance.desc=The Priest erupts in holy light, stunning all visible enemies for 2 turns and illuminating them as if they were hit by Guiding Light. Radiance will also cause the Priest to glow for 100 turns if the current floor is dark. @@ -1091,8 +1095,8 @@ 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.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. +actors.hero.talent.mnemonic_prayer.title=Mnemonic Prayer +actors.hero.talent.mnemonic_prayer.desc=_+1:_ The Priest can cast _Mnemonic Prayer,_ a spell that extends buffs/debuffs on an ally/enemy for _3 turns_ at 1 charge cost.\n\n_+1:_ The Priest can cast _Mnemonic Prayer,_ a spell that extends buffs/debuffs on an ally/enemy for _4 turns_ 1 charge cost.\n\n_+1:_ The Priest can cast _Mnemonic Prayer,_ a spell that extends buffs/debuffs on an ally/enemy for _5 turns_ 1 charge cost.\n\nMnemonic Prayer also re-illuminates the target if they were illuminated previously. Mnemonic Prayer can only extend a particular instance of a buff/debuff once. actors.hero.talent.paladint3a.title=Unknown actors.hero.talent.paladint3a.desc=This talent hasn't been implemented yet, it currently does nothing. diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/AdrenalineSurge.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/AdrenalineSurge.java index 21836593f..667046191 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/AdrenalineSurge.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/AdrenalineSurge.java @@ -42,6 +42,10 @@ public class AdrenalineSurge extends Buff { this.interval = interval; spend(interval - cooldown()); } + + public void delay( float value ){ + spend(value); + } public int boost(){ return boost; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ArcaneArmor.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ArcaneArmor.java index cfb8c384e..977690bc9 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ArcaneArmor.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ArcaneArmor.java @@ -67,6 +67,10 @@ public class ArcaneArmor extends Buff { spend(time - cooldown() - 1); } } + + public void delay( float value ){ + spend(value); + } @Override public int icon() { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ArtifactRecharge.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ArtifactRecharge.java index 16be7dcde..6da88bccf 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ArtifactRecharge.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ArtifactRecharge.java @@ -74,7 +74,7 @@ public class ArtifactRecharge extends Buff { return this; } - public ArtifactRecharge prolong( float amount ){ + public ArtifactRecharge extend(float amount ){ left += amount; return this; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Barkskin.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Barkskin.java index 5b488834b..69973d006 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Barkskin.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Barkskin.java @@ -66,6 +66,10 @@ public class Barkskin extends Buff { spend(time - cooldown() - 1); } } + + public void delay( float value ){ + spend(value); + } @Override public int icon() { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Bleeding.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Bleeding.java index 77b505569..640737b72 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Bleeding.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Bleeding.java @@ -78,6 +78,10 @@ public class Bleeding extends Buff { this.source = source; } } + + public void extend( float amount ) { + level += amount; + } @Override public int icon() { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Buff.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Buff.java index 829414bd7..4750208ac 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Buff.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Buff.java @@ -26,6 +26,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator; import com.watabou.noosa.Image; +import com.watabou.utils.Bundle; import com.watabou.utils.Reflection; import java.util.HashSet; @@ -34,6 +35,9 @@ public class Buff extends Actor { public Char target; + //whether this buff was already extended by the mnemonic prayer spell + public boolean mnemonicExtended = false; + { actPriority = BUFF_PRIO; //low priority, towards the end of a turn } @@ -138,6 +142,22 @@ public class Buff extends Actor { return cooldown()+1f; } + private static final String MNEMONIC_EXTENDED = "mnemonic_extended"; + + @Override + public void storeInBundle(Bundle bundle) { + super.storeInBundle(bundle); + if (mnemonicExtended) bundle.put(MNEMONIC_EXTENDED, mnemonicExtended); + } + + @Override + public void restoreFromBundle(Bundle bundle) { + super.restoreFromBundle(bundle); + if (bundle.contains(MNEMONIC_EXTENDED)) { + mnemonicExtended = bundle.getBoolean(MNEMONIC_EXTENDED); + } + } + //creates a fresh instance of the buff and attaches that, this allows duplication. public static T append( Char target, Class buffClass ) { T buff = Reflection.newInstance(buffClass); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Burning.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Burning.java index 0f4c9ebc3..1c18b5893 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Burning.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Burning.java @@ -198,9 +198,13 @@ public class Burning extends Buff implements Hero.Doom { } } } - left = duration; + if (left < duration) left = duration; acted = false; } + + public void extend( float duration ) { + left += duration; + } @Override public int icon() { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Corrosion.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Corrosion.java index 4cb690781..51fd1fc09 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Corrosion.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Corrosion.java @@ -73,6 +73,10 @@ public class Corrosion extends Buff implements Hero.Doom { if (this.damage < damage) this.damage = damage; this.source = source; } + + public void extend( float duration ) { + left += duration; + } @Override public int icon() { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Dread.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Dread.java index fb92ea6e8..c5a7d3085 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Dread.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Dread.java @@ -78,6 +78,10 @@ public class Dread extends Buff { return true; } + public void extend( float duration ) { + left += duration; + } + private static final String LEFT = "left"; private static final String OBJECT = "object"; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/FireImbue.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/FireImbue.java index bb66641d1..d22cbe769 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/FireImbue.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/FireImbue.java @@ -62,6 +62,10 @@ public class FireImbue extends Buff { this.left = duration; } + public void extend( float duration ) { + left += duration; + } + @Override public boolean act() { if (Dungeon.level.map[target.pos] == Terrain.GRASS) { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/GreaterHaste.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/GreaterHaste.java index 530e006f6..3a4b59dba 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/GreaterHaste.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/GreaterHaste.java @@ -57,6 +57,10 @@ public class GreaterHaste extends Buff { left = time; } + public void extend( float duration ) { + left += duration; + } + @Override public int icon() { return BuffIndicator.HASTE; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/MonkEnergy.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/MonkEnergy.java index 810c5f2d2..e2168e960 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/MonkEnergy.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/MonkEnergy.java @@ -651,7 +651,7 @@ public class MonkEnergy extends Buff implements ActionIndicator.Action { @Override protected boolean act() { Buff.affect(hero, Recharging.class, 8f); - Buff.affect(hero, ArtifactRecharge.class).prolong(8f).ignoreHornOfPlenty = false; + Buff.affect(hero, ArtifactRecharge.class).extend(8f).ignoreHornOfPlenty = false; Actor.remove(this); return true; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Ooze.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Ooze.java index 96f583458..5b1948a70 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Ooze.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Ooze.java @@ -82,6 +82,10 @@ public class Ooze extends Buff { acted = false; } + public void extend( float duration ) { + left += duration; + } + @Override public boolean act() { //washing away happens before debuff effects if debuff has gotten to act diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ShieldBuff.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ShieldBuff.java index e33036dcd..d19c8ccc2 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ShieldBuff.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ShieldBuff.java @@ -61,6 +61,11 @@ public abstract class ShieldBuff extends Buff { shielding += amt; if (target != null) target.needsShieldUpdate = true; } + + //doesn't add shield, but postpones it detereorating + public void delay( float value ){ + spend(value); + } public void decShield(){ decShield(1); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ToxicImbue.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ToxicImbue.java index 21d6436c2..f2f46cf48 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ToxicImbue.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ToxicImbue.java @@ -62,6 +62,10 @@ public class ToxicImbue extends Buff { this.left = duration; } + public void extend( float duration ) { + left += duration; + } + @Override public boolean act() { if (left > 0) { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/WellFed.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/WellFed.java index acdb909ba..3579d801c 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/WellFed.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/WellFed.java @@ -72,6 +72,10 @@ public class WellFed extends Buff { left /= 3; } } + + public void extend( float duration ) { + left += duration; + } @Override public int icon() { 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 fcaea8a65..9dc51456a 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), HALLOWED_GROUND(172, 3), PRIESTT3C(173, 3), + HOLY_LANCE(171, 3), HALLOWED_GROUND(172, 3), MNEMONIC_PRAYER(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, HALLOWED_GROUND, PRIESTT3C); + Collections.addAll(tierTalents, HOLY_LANCE, HALLOWED_GROUND, MNEMONIC_PRAYER); break; case PALADIN: Collections.addAll(tierTalents, PALADINT3A, PALADINT3B, PALADINT3C); 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 5612e8178..9cab000ff 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 @@ -128,6 +128,10 @@ public abstract class ClericSpell { spells.add(HallowedGround.INSTANCE); } + if (cleric.hasTalent(Talent.MNEMONIC_PRAYER)){ + spells.add(MnemonicPrayer.INSTANCE); + } + } return spells; @@ -148,6 +152,7 @@ public abstract class ClericSpell { spells.add(Radiance.INSTANCE); spells.add(HolyLance.INSTANCE); spells.add(HallowedGround.INSTANCE); + spells.add(MnemonicPrayer.INSTANCE); return spells; } } 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 3bc6bb336..36ff100ad 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 @@ -79,6 +79,7 @@ public class GuidingLight extends TargetedClericSpell { ch.sprite.burst(0xFFFFFF44, 3); if (ch.isAlive()){ Buff.affect(ch, Illuminated.class); + Buff.affect(ch, WasIlluminatedTracker.class); } } @@ -140,4 +141,6 @@ public class GuidingLight extends TargetedClericSpell { else target.sprite.remove(CharSprite.State.ILLUMINATED); } } + + public static class WasIlluminatedTracker extends Buff {} } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/MnemonicPrayer.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/MnemonicPrayer.java new file mode 100644 index 000000000..fa9b71219 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/MnemonicPrayer.java @@ -0,0 +1,166 @@ +/* + * 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.AdrenalineSurge; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ArcaneArmor; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ArtifactRecharge; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Barkskin; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Bleeding; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Burning; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Corrosion; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Dread; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FireImbue; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FlavourBuff; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.GreaterHaste; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Healing; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Ooze; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Poison; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ShieldBuff; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ToxicImbue; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.WellFed; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; +import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; +import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Viscosity; +import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.HolyTome; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfAquaticRejuvenation; +import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ScrollOfChallenge; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Kinetic; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; +import com.shatteredpixel.shatteredpixeldungeon.plants.Sungrass; +import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator; +import com.shatteredpixel.shatteredpixeldungeon.ui.HeroIcon; +import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; +import com.watabou.noosa.audio.Sample; + +public class MnemonicPrayer extends TargetedClericSpell { + + public static MnemonicPrayer INSTANCE = new MnemonicPrayer(); + + @Override + public int icon() { + return HeroIcon.MNEMONIC_PRAYER; + } + + @Override + @SuppressWarnings("unchecked") + 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; + } + + float extension = 2 + hero.pointsInTalent(Talent.MNEMONIC_PRAYER); + + if (ch.alignment == Char.Alignment.ALLY){ + + Sample.INSTANCE.play(Assets.Sounds.CHARGEUP); + ch.sprite.emitter().start(Speck.factory(Speck.UP), 0.15f, 4); + + for (Buff b : ch.buffs()){ + if (b.type != Buff.buffType.POSITIVE || b.mnemonicExtended || b.icon() == BuffIndicator.NONE){ + continue; + } + + //should consider some buffs that may be OP here, e.g. invuln + if (b instanceof FlavourBuff) Buff.affect(ch, (Class)b.getClass(), extension); + else if (b instanceof AdrenalineSurge) ((AdrenalineSurge) b).delay(extension); + else if (b instanceof ArcaneArmor) ((ArcaneArmor) b).delay(extension); + else if (b instanceof ArtifactRecharge) ((ArtifactRecharge) b).extend(extension); + else if (b instanceof Barkskin) ((Barkskin) b).delay(extension); + else if (b instanceof FireImbue) ((FireImbue) b).extend(extension); + else if (b instanceof GreaterHaste) ((GreaterHaste) b).extend(extension); + else if (b instanceof Healing) ((Healing) b).increaseHeal((int)extension); + else if (b instanceof ToxicImbue) ((ToxicImbue) b).extend(extension); + else if (b instanceof WellFed) ((WellFed) b).extend(extension); + else if (b instanceof ElixirOfAquaticRejuvenation.AquaHealing) ((ElixirOfAquaticRejuvenation.AquaHealing) b).extend(extension); + else if (b instanceof ScrollOfChallenge.ChallengeArena) ((ScrollOfChallenge.ChallengeArena) b).extend(extension); + else if (b instanceof ShieldBuff) ((ShieldBuff) b).delay(extension); + else if (b instanceof Kinetic.ConservedDamage) ((Kinetic.ConservedDamage) b).delay(extension); + else if (b instanceof Sungrass.Health) ((Sungrass.Health) b).boost((int) extension); + + b.mnemonicExtended = true; + + } + + } else { + + Sample.INSTANCE.play(Assets.Sounds.DEBUFF); + ch.sprite.emitter().start(Speck.factory(Speck.DOWN), 0.15f, 4); + + for (Buff b : ch.buffs()){ + if (b instanceof GuidingLight.WasIlluminatedTracker){ + Buff.affect(ch, GuidingLight.Illuminated.class); + continue; + } + + if (b.type != Buff.buffType.NEGATIVE || b.mnemonicExtended){ + continue; + } + + //this might need a nerf of aggression vs bosses. (perhaps nerf the extension?) + if (b instanceof FlavourBuff) Buff.affect(ch, (Class)b.getClass(), extension); + else if (b instanceof Bleeding) ((Bleeding) b).extend( extension ); + else if (b instanceof Burning) ((Burning) b).extend( extension ); + else if (b instanceof Corrosion) ((Corrosion) b).extend( extension ); + else if (b instanceof Dread) ((Dread) b).extend( extension ); + else if (b instanceof Ooze) ((Ooze) b).extend( extension ); + else if (b instanceof Poison) ((Poison) b).extend( extension ); + else if (b instanceof Viscosity.DeferedDamage) ((Viscosity.DeferedDamage) b).extend( extension ); + + b.mnemonicExtended = true; + + } + + } + + if (ch == hero){ + hero.busy(); + hero.sprite.operate(ch.pos); + hero.spend( 1f ); + BuffIndicator.refreshHero(); + } else { + hero.sprite.zap(ch.pos); + hero.spendAndNext( 1f ); + } + + onSpellCast(tome, hero); + + } + + public String desc(){ + return Messages.get(this, "desc", 2 + Dungeon.hero.pointsInTalent(Talent.MNEMONIC_PRAYER)) + "\n\n" + Messages.get(this, "charge_cost", (int)chargeUse(Dungeon.hero)); + } + +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/Radiance.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/Radiance.java index 6f6350413..17d31ef69 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/Radiance.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/spells/Radiance.java @@ -62,6 +62,7 @@ public class Radiance extends ClericSpell { for (Mob mob : Dungeon.level.mobs.toArray( new Mob[0] )) { if (mob.alignment != Char.Alignment.ALLY && Dungeon.level.heroFOV[mob.pos]) { Buff.affect(mob, GuidingLight.Illuminated.class); + Buff.affect(mob, GuidingLight.WasIlluminatedTracker.class); //exactly enough to delay them by 1 turn after the casting Buff.affect(mob, Paralysis.class, mob.cooldown()+1f); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DwarfKing.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DwarfKing.java index 4ed163d65..84c125261 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DwarfKing.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DwarfKing.java @@ -467,7 +467,7 @@ public class DwarfKing extends Mob { } else if (phase == 3 && !(src instanceof Viscosity.DeferedDamage)){ if (dmg >= 0) { Viscosity.DeferedDamage deferred = Buff.affect( this, Viscosity.DeferedDamage.class ); - deferred.prolong( dmg ); + deferred.extend( dmg ); sprite.showStatus( CharSprite.WARNING, Messages.get(Viscosity.class, "deferred", dmg) ); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/YogFist.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/YogFist.java index 58da7ebb0..8c4205568 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/YogFist.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/YogFist.java @@ -467,7 +467,7 @@ public abstract class YogFist extends Mob { if (!isInvulnerable(src.getClass()) && !(src instanceof Viscosity.DeferedDamage)){ dmg = Math.round( dmg * resist( src.getClass() )); if (dmg >= 0) { - Buff.affect(this, Viscosity.DeferedDamage.class).prolong(dmg); + Buff.affect(this, Viscosity.DeferedDamage.class).extend(dmg); sprite.showStatus(CharSprite.WARNING, Messages.get(Viscosity.class, "deferred", dmg)); } } else{ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/effects/Speck.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/effects/Speck.java index cac662b19..9c5da36da 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/effects/Speck.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/effects/Speck.java @@ -49,6 +49,7 @@ public class Speck extends Image { public static final int BUBBLE = 12; public static final int STEAM = 13; public static final int COIN = 14; + public static final int DOWN = 15; public static final int DISCOVER = 101; public static final int EVOKE = 102; @@ -224,6 +225,10 @@ public class Speck extends Image { speed.set( 0, -20 ); lifespan = 1f; break; + case DOWN: + speed.set( 0, 20 ); + lifespan = 1f; + break; case CALM: color(0, 1, 1); @@ -429,6 +434,7 @@ public class Speck extends Image { break; case UP: + case DOWN: scale.set( (float)(Math.sqrt( p < 0.5f ? p : 1 - p ) * 2) ); break; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/glyphs/Viscosity.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/glyphs/Viscosity.java index 804c1d43d..bbefd2ce6 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/glyphs/Viscosity.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/glyphs/Viscosity.java @@ -85,7 +85,7 @@ public class Viscosity extends Glyph { if (amount > 0){ DeferedDamage deferred = Buff.affect( target, DeferedDamage.class ); - deferred.prolong( amount ); + deferred.extend( amount ); target.sprite.showStatus( CharSprite.WARNING, Messages.get(Viscosity.class, "deferred", amount) ); } @@ -123,7 +123,7 @@ public class Viscosity extends Glyph { damage = bundle.getInt( DAMAGE ); } - public void prolong( int damage ) { + public void extend( float damage ) { if (this.damage == 0){ //wait 1 turn before damaging if this is freshly applied postpone(TICK); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfAquaticRejuvenation.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfAquaticRejuvenation.java index a1bcc85cb..c7e7bdf6f 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfAquaticRejuvenation.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfAquaticRejuvenation.java @@ -68,6 +68,10 @@ public class ElixirOfAquaticRejuvenation extends Elixir { public void set( int amount ){ if (amount > left) left = amount; } + + public void extend( float duration ) { + left += duration; + } @Override public boolean act() { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/exotic/ScrollOfChallenge.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/exotic/ScrollOfChallenge.java index 558a75b0a..7f2bb3f2f 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/exotic/ScrollOfChallenge.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/exotic/ScrollOfChallenge.java @@ -143,6 +143,10 @@ public class ScrollOfChallenge extends ExoticScroll { } + public void extend( float duration ) { + left += duration; + } + @Override public boolean act() { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/WildEnergy.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/WildEnergy.java index 64b7b9ec6..24f617ade 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/WildEnergy.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/WildEnergy.java @@ -66,7 +66,7 @@ public class WildEnergy extends TargetedSpell { ArtifactRecharge.chargeArtifacts(hero, 4f); Buff.affect(hero, Recharging.class, 8f); - Buff.affect(hero, ArtifactRecharge.class).prolong( 8 ).ignoreHornOfPlenty = false; + Buff.affect(hero, ArtifactRecharge.class).extend( 8 ).ignoreHornOfPlenty = false; } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/enchantments/Kinetic.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/enchantments/Kinetic.java index 271c7858d..ce0afe5e1 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/enchantments/Kinetic.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/enchantments/Kinetic.java @@ -115,6 +115,10 @@ public class Kinetic extends Weapon.Enchantment { spend(TICK); return true; } + + public void delay( float value ){ + spend(value); + } @Override public String desc() { 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 7c8c10b2e..388129bcd 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/HeroIcon.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/HeroIcon.java @@ -86,6 +86,7 @@ public class HeroIcon extends Image { public static final int RADIANCE = 50; public static final int HOLY_LANCE = 51; public static final int HALLOWED_GROUND = 52; + public static final int MNEMONIC_PRAYER = 53; //all cleric spells have a separate icon with no background for the action indicator public static final int SPELL_ACTION_OFFSET = 32;