From 3fba4c58417ad414b7ea7af1b897dc63dfcf1c13 Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Fri, 15 Mar 2024 14:55:26 -0400 Subject: [PATCH] v2.4.0: roughly implemented two more trinkets --- .../assets/messages/items/items.properties | 9 ++ core/src/main/assets/sprites/items.png | Bin 22387 -> 22497 bytes .../actors/mobs/npcs/Blacksmith.java | 3 +- .../actors/mobs/npcs/Ghost.java | 3 +- .../items/Generator.java | 16 ++++ .../items/armor/Armor.java | 5 +- .../items/trinkets/ParchmentScrap.java | 80 ++++++++++++++++++ .../items/trinkets/PetrifiedSeed.java | 62 ++++++++++++++ .../items/trinkets/RatSkull.java | 2 +- .../items/trinkets/TrinketCatalyst.java | 4 +- .../items/weapon/Weapon.java | 5 +- .../levels/features/HighGrass.java | 15 +++- .../sprites/ItemSpriteSheet.java | 6 +- 13 files changed, 199 insertions(+), 11 deletions(-) create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/trinkets/ParchmentScrap.java create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/trinkets/PetrifiedSeed.java diff --git a/core/src/main/assets/messages/items/items.properties b/core/src/main/assets/messages/items/items.properties index e8ae8f711..12f38a96b 100644 --- a/core/src/main/assets/messages/items/items.properties +++ b/core/src/main/assets/messages/items/items.properties @@ -1291,6 +1291,15 @@ items.stones.stoneofshock.desc=This runestone unleashes a blast of electrical en ###trinkets +items.trinkets.exoticcrystal.name=exotic crystal +items.trinkets.exoticcrystal.desc=...\n\nAt its current level it will replace %d%% of potion or scroll drops with their exotic equivalents. This trinket does not affect potions of strength or scrolls of upgrade. + +items.trinkets.parchmentscrap.name=parchment scrap +items.trinkets.parchmentscrap.desc=This little scrap of parchment looks like it came from a scroll. It has regained some of its magic, and it seems to be influencing weapons and armor found in the dungeon.\n\nAt its current level it will make enchantments/glyphs _%dx_ as common, and curses on weapons and armor _%sx_ as common. Curses on wands, rings, or artifacts are not affected. + +items.trinkets.petrifiedseed.name=petrified seed +items.trinkets.petrifiedseed.desc=This seed has been fossilised, either by slow geological processes or by magic. The seed seems to be magically influencing the flora of the dungeon, occasionally replacing plant seeds with runestones.\n\nAt its current level it will cause trampled grass to drop runestones instead of seeds _%1$d%%_ of the time, and will also cause high grass to drop items _%2$d%%_ more often. + items.trinkets.ratskull.name=rat skull items.trinkets.ratskull.desc=This macabre trinket isn't much larger than the skull of a normal rat, which is somehow a rarity down in this dungeon. The skull's magical influence seems to attract the more rare denizens of the dungeon, making them appear far more often.\n\nAt its current level it will make rare exotic enemies _%dx_ as likely to appear. The skull is only half as effective at attracting crystal mimics and armored statues, however. diff --git a/core/src/main/assets/sprites/items.png b/core/src/main/assets/sprites/items.png index da78b405fdb759b5793b75532fa4ce3816429775..ecf54021649b0fae9bd7151cc4ccdb4edcd68e83 100644 GIT binary patch literal 22497 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

Gio4#?9^RD0p4{*xeRedw_aue@>!0HO4f?0 zKgL-Onb|QosscZ+@QKCrXIoK=@(WK>`RRw{av{zmOow8??0CfEQ7<)i?m5FCkG)Ue z!saE&p_HLSRo>)chJtK3+nane4=$@{v`_PPxb5kEV3IaFJ9t<)fj`)dsvgMxQqFRb z8STtci%(*_3=j}$!o&UUojXVr!>!K;I`T<4cbc&tmO^%Ux5BRToXaDA<-yt9)*~Ja z*+3|#oTyf^N$_$1%AAhX8$M~pSFpL^KI=Znj4xDB0g=Xl za~lyZn|uOKA+p{ykK+^k;CC^m8H#w2fA1nmlDY1!Jr4*aj=+y zNtbO&2x%?}x5Jh}t>yo4q1)-=&(Ya^(zql(1oqOnf=3rKS%V(J6GC?>=L?O1ywSc_ zqwHQP6$n4W*htmYE@`}ALj#}eD=)=Alwg)Wgf+}%ObJ8MKM-K z?c;^;=N}pyWwf~bnXgCQ8Jc|a>2f4ocqW=QZ!#!#tj=h<((c>g=Fa(?QOr`8(Pptk>a_xmR^}mI*iD9K zF=MCpd5!6yfn+>kU^c@TJ975ALkdkTq_nECR`Ol&59voVj^&4L+N&^3PLy0cBuk$& z^!sr=^1ksb6&X3Jvh>-3|FiJWyv}WZnyPTXUo9ukrXt7Q+{g1DZKyG!azd_s=MY_b z1>FP*Sgt{Uqg4~fs_Ur-#1D_%>`_>{xyb3}$nN7^USs^-t9rx7>S;$5VHumaj^Gya}{jW*v?^_lF8C?v+Cx25I-Q~$=MfFlSsuJnq zg`!zu(vvSWqxTmapqDpn3`WoYsHY5E88<#C6^cpo#p?2Ud}3x?N@kQ>hP^KC>7~+o zvZgKJ!5A*bPkvWm~B{$T)BT6MQ@r$gl5lkQlZ1pQnZ2If_TlLh$gJ7Ug7|m}M5F$uAhANYc89 z3A0tD8vx6fE7|_oQ*=55j83vA!fD!T=j(2FnZ>EsH~HGaaAht0@0mpo-&_OPO;_dB z_~)xK-b4VCg%7rH9iFq0^{yVQl+E@e!%ewCb}uJBO4FHcCZmwtq5CqJt=r4o>7~)3 z5F?L?sS(`=+@F3YyyD|FS!KAz54rh%{q`&xW4IX&Nb3~1ukG}q=(zgv=Y6d}xzgN0 zJ{a@m^dSWxOARjtb)3OyzDo}ndWs>Kzu}&n`|I*B6>pV!cX#zfSH2YwS>?~=RJ4iN z)v~Riq|#nXxOG81y(0!*$K3D9|GCpx(HTBoOHoI&n3XrSeyIIi>e7ztm^N*`7bd8;K{Nl1Vr& zW9Xv0AG~QkLl4>B3o4y12GMhRq2n#r?a=1KnU-)otC-=#MwJpDpO0f6jO-pLjh-(j zsC7kqArc@YrN>lTtn;*oG4Jl~9-cZ1M(3L{LJ&`I$Pn zGYEU`C)42PIX4#eu7HJ3!T1${Gas1dFc~O@CusF{otS2s;;WyaU0{!Ad#xoCP4PUmbY8f3K&v30@d+K@dubc1P zt)>nI(l_BAgq^8}cY zQNu>6%O8f2dM1&496Np6{)LO9?g>6_%ujg8-J z;&5KQw4hJs2grfw4SbBEYLrKP_}3TC{oaA|0j)I*EN6Z4=ndfdjTu0}VB2gHSLjpC zU}_}LkHOA={b?elqy><43w`p}upqk=CW<5L4)w>BKADb|Ir3 z3kJ7I0`EC&;z=sMs20Bg_PhYEJTn>+jHwuh`#oO_!i)y=rhx*>_e?!cU_g9wiX&kq zXROS7J=l^L6d4JDP{mwA%sv}0z6BVdp6vN^x=R6^&v{63mL3sJSy&n7@y872KU5+8 zvC3=md}i~f%%Ub1F9npF_lsuwoN^FniwS6P>pf6Mo2#wX<%RV#-rGZatIS)A>b;;xFPCr?*r5jxjt#}=4{}k#A~ie=;0(ZFlrdD^_o@JwG4Ih(KrvEc*OW__`jOn$aT;PU(% z#qej}^z1is_?D7AE{MdFjd1K6Mm@)BaJ)5ybBUgKbkykMqWP{#c_`wchR8nN zNPb+i?G2TJkmZtdoq8Se*~K0!O5TXRn?P&R|Vw+tdx711B=Ro?csPvP5wnPv5sMs=YyFsG)PnGyU|Cqm8Etx ztQ4yRv7hSD5XLx&L=bzuqQFuaEXZDlNJv0u-WMEdJ1!k}c&`-@VIPo!Ui9vEd(YgJ zL0zL|=Ym_hSi{|E z?;=aah4PT0i9$ff{XJ8=TVP^#zPCJ8Cyaf~VSQu51L#rJzfI~a4>O<$Y}gfntbIVJ z#h3kRRB+m&b2tgy;-a&%Q8Pbb1h3hK&jrpd5NH=Nl5a=fM!G*icowuy} zo2`Y$P17ll7Jb8C?m^;>Dzm)uL-#-D+)vy8oObuI(DWo$`O(wII78Z+&vX7# zb_`>y)pqvNw+*?n+TuN~1a)9n#)T{<^Yt;|q1hT1={n?)lc-(9wVNgu>F{^qSMKGv z$5=?dC|XQ$nojE{uScotWO9?pk8)fw?9B5@ZlW|)@4IZso-5NX&4ja41cWRm%DO4_ zjGZr18F2?+9p6TeK^{dvXT)92*-a%}`5brZJu@UNG@E-eII4QIi_$bv%FPP(wYA$u zr^9kw>4cF!6>k2|pIX+RnekRV3N>$0%@zWUJ&&oG|7nLi(K}{>*sd1cN?gX=cf}A} zl26V2`Y$8>RCzZo`4Qu^_$2PgLiPN$yAc9Y4&fU!EnVR#avs;-3&PmGdThL7xzHHB z(#@GGLxZi*dh$G%3LQCbKZdd+GxNi2b;KnbONe! z%IB!kh$cZ!jdce_5!M*~@ngN=&ZjrR+I0vk>)+KbU!?k9tF#h{Pwsa+b;VBwh(PXr zGAXb|X90)Q|!RXmwbat=lY-r|+=n#Vq3)MwRTP&#R2Hj4r z3qcolLBZafwTIa5)5M%Yr)OAfABFQv=Zg9pi9k=2&`4zk@U+cmNbER2?x1Nhd0@Oi z^jLPv19$P!%W-BQ>+gTdOzMVU?K_1ec0DRomxT#HD&P~nW9C!G@emboiq;@kUHe*1 zJbnU6=90b*W+1DmSiIh5wYr!RrAd~-Lz6up9uLmd?1X>90=)U?y>gnl6k_=Q-EZBm5MMlbtv!Z zi5=yV^g*ao{0W0EDMTVI695kjaDdl43>Y1wj|=HkC9*06{x6Y+y-#sC}pu%p6w$dmL!te0sc%)EGSqp@ztZn6>5y-Quu^ z#~v!7+s;EGent;5+<_PG6-c9dG6El~P3Ys*gvs)E$5)&L-m(fnNc*Q0Fjd@OeV-g+ zaU?8)V_7V{(nC~ZlTS7g;0>*&6t~oROjmZ)KhfyAD0AvrW_vBz{SNSQ9j6>Z5g&=F zs{O0NoZVnHAA->8B==F>>a6Oq(j{ zq73;}AVwIsF3t51RXGa-b#^aQ;~AH#L%$P_=pQN<@-oIZ>UrV}(U5|il{dgVfZf)` zrA7q6z`Cwws*f;kA3sP}BJ(NB!eZTlE>r6#-0EgEr`{b{CI|Yg?}&sDfDL=t(o!$2%wdbQg_8NG9DUrCU zZVgrbD%4v853B%shB$J&xHvA*1mAEB>=1WOY#9r@+RgPXeFPu%b$Li4p}KDnJ4=#Q zlDqdS{ZAJA-79St}!cnZ@*rv&-cwZ9eRCj%M<>mY2V>FpNuLsln%_3Ts>LXj|0Y}lC z(Mok;)8|}T*va|zCq4emt{QHj$c$5oL1sRcc=pI!x2hutkrjv~u8${|bE~;o`<~u^ zQ8j9LVibqn%eq+GpUmxXD3ltt*DUh;-jvT1MRTf|`EO#*1CB3#WRrzY`+n)qc@&;Q z;4syBlxw|?6eKXtf_vfY)i0~(35V%C!{NlHx|96Q@HfHO+_m#kAT}5~)zc*l2EywD zPhP;>i{$}EoZI3c`pan3Zuqk>cE&q~+0u*>dcn~x{;x{a z@~`qwk8LxhW_*L$U!rV}OuKE`^5S@me*~)TLP~3&m+`xh%SrtaAAB26`BTF3!33so zA$;NR^--_pOZq)xS4t9m-hDCHP90P)#IF1JVRXO6-xW*9S1J%03g^^YTk5fiAMjW& zu3XJ!>EH z>GF(0^0990AHiqj8cW&pbk3a`Op;_tthSO)u z8F<$p!ZxkZeCbZFDS;ozMrBJl@1a^-`M5j-8fRMmNFh`GO=iRKEIhPU;ZHx3Zl@zd%mMQH?BmE2_bjWZ>bG(Uvz+2EHph*U z%#nSPX|{fIeU{0a$Eu_dy4e~QJ*!+aScfObd^UoQbBWb0c$2a?bXnW|KkyFvCsXNb z?f5fS3vn*^;g&?CDd%>KvPn2~iG?J19V13N2uIPT@A&@GM*MFUH=wPm=BC!&+3;wTEMk(!U+q!p&VmrStw@R7v7_l^N9o}M131&`SGMb#tL7$5# zb^PdZqHB1>NUXhsi0`gsF5+t`HJ(x^j47UWfTym&a>5QK$ak1?dnRI5G{a2K!I6v2 z_{;Nk>kgdr2sOV;D*YO!U?O{Un_nX8^^gwT9blo ziKgRZ#Gv^H_X86|{=UeK^@--Q%ZAJ?&*;T35)r=xhGaA?3v*T;VkwVn?_D+vdk|4n zY9m;**_DY6dq_=_H8@7;bolxEa@*c}Zq)hp8I9xB^TKU6+QK+@yr1S>UM}lLw>&|~ z$zLPw3e~^-ZHG>!NOWvBc320?*sib2TR5~@e*8hbY57~*#~uTp{s{4s9!_)|YlL_> z(h%|CIEx2#@Pg;FC{F1;#nD(@VWN=SH3IemTuR$c zg-QcrM?o+7iY{KQ+c@Bhd}c!DfUyb)46K6Fi*ouPV+KSqhyp12et&V1aY&#Mg1f7N zpp#3Q0V3V0l^OJuFYAM(I|!@J$cPK~(zU~U+q{OQ@`t>0qrIG8i8R7bhH&((R!gyz zdE@i<-y4SR4lQ`lKcrTsRbw%f#dEpjtL&?_ht3bh2Q-l7z3mbpnhuWv8eDb$b@MTQ zX%US^gW>jpUde(_HH*VJZP&k9sleO#OF2 zj7hJa{CK~XpxSX&Q6;tvdU0qq*i;G_QqHxxJa8Cf8%s?5K*&tS@J|$Va)VdAH+F{TVx5J(Q@U-r z6Y^(|dJra`8Dax^r}pq52)s!QVr&~SZzuT7ydA!ND?Z?J#9=#9loD=+7BH}y|0hs6 z)a#V&v7vm{jClFi$Z0b5sOe(1ySXd&t6C*0wDk>yMGe`89?!;kCo`Jb23~Bk10kf} z>Fyx=?WW6v(F5n=c^z!Gb#$ zb`~V%5xHYX6v|Q%sN}{<84BSRS5_2t-+pn|I@Yu65%uVFhQFv{F)`fC&7?-n!Zvx< z$Q&kelz|##_dyD*aIm4m9({NchQ4XdH7u+V{E)QrZo<|SgvV;8N(h(z--e2NlTR&IsHhxht~;ESuLX9k4bIMPyqxuQ z&r+n?3Il3puL~Rq<@4^5KmIH(O&mH(g@-V*!oXAmPu9Tf5ckou#UGu{&H~;JJ;0eP zsg>qLp9QH6+jU2oNBUj^2>M!9jk-?dHuoOxJ}*94&5i1M$`P~nbyv0M<_zwyF+rbw z2ln!U@y0U+pSD3SK_c*K9>5T8qTB;5mImqKGtwjkT$lu08`obZH?IBKyz%1~bx5Tk zY(uv0H8AWMNZNHmoc@fHsb7>&J<55kCf2XY8^{)DTHA9zCZ?8c;eM=MIWpsHI1$2p6}l|SPjc*OI{Rx5w7^_vQ6%9{%g#`KiF zv?jV1o?QvOB};}G$)_o_tMMWhQxeXfq;tKyaXr{Ybs3l9(LSb(+IJ(w^pFcH2$6Vu zOlTCA`BrAPBCAwC-IPGq&bN7y3(jb?eC#6(w+4B}b6f(Du39D&kJ^&jjy^Dr>i-*A zKa4cV7@r{aukQ-(Nb*d2w0hPu;*N!9Nais1wCVhQk59jKLNx}0X8d43NKL*@Qequ} z#~nlXCOU1EZut-1>@qdB->KjKKBKW_)6B|U;NB%RJp-<+X=KsK^+t2UZ^aT0@br(3 z_3?-G_^n*w2IG-u+9=2PAVpDLn_+Shqqtq`+?NZ~yI#1s-z79WO(!yI?et$_Ig^A& z&tou1iuGo%VN)R=V*6q1><;^Ho*(ZmHqmPqd-9ksk{)#g{qEzR%W}Jo%ZZN?hmg5} zZoWTE=Nls3{eiuz0Tf5h90@sN14PmiR6`>8wN~Ekt=OGTp^u%PZmi(3PY%L-vEv7# z<+8hg;bu&kMatelh%@w2+1LB^a$kmEa7KlvWMp%`qrdD!8~BRuTj{Do&0;l6Ziv^R zbS`i3CSNU0PuCjPR*9;5&n4fv%U|CF94b`ERR{9N$N_gy)(rJHD{8~_-vJf%lyFeN zp#||R5Al&qct~=)4GRL0*P``M!AwG*d@nP|H$)#SGZO@G%Jjs4c^ZHIME8v^g;4B-qZ&+Ca4 zCTw*x_HO2YI>gkIk9T|;TFl0#syz1aAf;A+(?hw~Bh7Kqpg5Kr4QSOxqfiVRo_=Lt zRdtkDi3PcEJ@caJA6#|u@SxWb(eusCCg-t-5fdTw6n=#3deFq=L1Ifm1H?RaS&-yx zpurRD`FdvJaNGW1>vlfePo}TN6Ih#r;f61JZnD{ThRZwEN{BlwWL|VN+F#=Wm?g-d;h z%ADdl&7{qNEVL4~$9H*J|3tZX>nmQc7IT?rCxxRo+{1E&{pGltz`${`izTR2y)C0# z2-`cc@`1-buXb)_zo#s$cSCBB>tysXLx|)^;3^|@O}l%1a`VlbSN)B+P6{1&9%&^AH>Ik^LY;tg`Lsp>CJLMm4ZC>EiHaq8=2y}Tyv!PyVogd zcu?KL9Ks%z0kevYtvuOYBMcvOtRu#AeD8yk#;0<*5FWt|wmTZ&_+YqfenGM`f^mX7 z9;ieM-V6VY&`UIfHlCCi(=!#!&Z#**n%euIrK-@FHP$CLQkWOEui@{z*Ey~>>VYdO zT*Id&eV5UR_B7dSXO!_L`F4HR!E*J9m4Tmz=#UKCa(HI`tVLLVpvbedADF;XgzYSr zYArIy!4<2C(mj#M`b*&?7jolxJr=-4f%m(z()x-zHJU61UQ2=z$_LT&@tlrJ@HI2p zDvs0vz()1BM-I5uI(`mu{Itg7OxQ>(<|)Qmmfq}-YSPg2THUD8PRSp3ykLF~sR3?H zUGDNRBguCt4ZXG##-)M+#xqe8&&y)Sg6Uad@Yn3#AGzZ7)z=c4gV~E4k*kF3d?cN+ zlA~)+YS_0l+oEO}vV4OC|1?Wao7p1y3eyz3P4@5bGDa6}iWoHjdr?OCp~)WxxlkuK ztHUo1E;3-L?(iYu32D6u_tO|~28kSH8<^;~BBX}$Mwel=Uk=S417F2T8b_B4)enHT z-!2I2RHnVV)4E)!#EVMgaq)~kD{C70JjXS;)5UAcV472rAm@$#hm|>I$Xz!o&yDG| zH8p}aFZXjx{pJQKmVaV!herA9c7F_d?cV6kt&@Jas;gcBaiS|$Y(Yp>srkL%b;wS;}C_Nv&ofW7m1 z>kg9py6?6XF?G1>K-{v44=237`wO>^A8q`C^bQa2SH@MHf{=9jP7fbLybOITf%v}A z=?stNfpFMA9kxR?tXB-aln8!{>*?TiPM!%-Fgw%c!Osq zuB}5*pg?4h<~b`7;a;k)g44go`I@n_qW0=(E8tg*>9W}`eC>Bx+dsusZPFwnM(QpL zLhe1;;2HkG`{?J_`w|G*c;-*I3yH`HaE0U~o$31FJwfQiBa z-dPr8Y-p2*R4y(Ki2r$EV*xDubAca*3;E@TI4qELf6LNxkb)krA^NLwV@Ln5e$-aF zmwFzVMm_hsD-E_j)|%junHir7;#`&R!bnt)-zlRfuS&NRxWv{Qbk`-6_s2-;CjGNC z_MR!&7XdTo?j9^TeJ*W!{M^x|X@_v<9z*&|HC>Ay?kJ?85>bT@dyHlSxWU33Eia8t z{vLT;u#x8fFBPN+QUX{LgzJ#PhNpK+aw+x2ZId(F7V+$duK*=O)yONuJK%h-8I?r%R! zPUYDurR0-U`_%C8@Qt)Scw@wqEIrh5m1E(~?Jk$+rpt-rle^4KZLxhwiOunGW$J-llIC;b1e#|^2*;4S^54n^wajc zZHG~K^c70r19`E2@?2TUUKvF$UR%(7e85!xdC~VtN3Sn;+aMeF7~-*sds7mZ4L1jl z`?^J%9C4ygv@3B-^^uu%iz)xQ)c?ZH?Yi_9$&2?g_^l>_w@l<#|9|&$Td_%{i|Kt3 z+D-eq*-abb$5URf@zdwJe`sh z3Bt5YS;&1oa^E{k(T3LiO6?VI;_}VDxT`zQUO$YILHBFYZtiPQwn%Gk|90@?UYX}9 zeML2EssCh+a=oZePv{;Ke^#5WptV&{_fS5>`5z&tzf%(b)X>z>;BiI}HYJ+jKO|!B zWLv$}=~ua(-d)D+^zU1p-oPCh|E-ak+Zq{9?#TSRP_eOzvm8O>Yskdp|F3VrE+xZn z-AY@#@c-(1&=gZZH-4#R3z0Bb@@!1WY|Lx%;HLhK=*8J^w{Ns?6e}Z|6}ED?)Ww~s zjbUjCZ?YW9DV1fEQp@6%6SG4f%84u9MB?;)ncsCMBz8W_)Kf`mt64;q3JBH01-3ZWG%nW$JC27 z#9YR2y=mmjMX5~owR&}A@AuCTWg5nvl*wM3yuoWS638iyp6-VJic^ozAaXXV*ip3o z=x@U>A!4VMVwpBgp1TAv4a>D~OZHGXb}fkzj}_Z#j(IkkArevN14hsT5s)10X4IZ# zc`E<45a+?Cdr0Fp8+J}F1=q7_95_@y>^Tz4TH#~<+DSZS^~I+=pHR8&u`egwB_IVOW|6B}$U^#z38YZrBQ2b6=D`I%%XF9oyg5@w4N-?fx9Lj$8 zHb@N(8>{S`FiuS88T(ecXFPO5U#9o^T;2HyX1OPPbf{TJCE4`v*SHMNs>Lr*|QW!cS|4K-K;m-R1Y zrTfS3{%8+^@j5Ro&VC(I3s(~ipgr)f!2Frm8eu&B8vY3iJ$HAUf^FXmwInWdaC?FD zaLi83-Hxi%kpJEb##{@3wC{Bf^9lFZJS^U!j7SQ{5HQ_FL-#^!f1aD})RQoIcGbL# z#$jv8LtO|g&Di;to+C8Q9l1-&6RRWpV~l6+{?LUGiqq{4ilO6|JAI8mc%$cg)Ax?= zHG3iZeDZRSFLuQZesSyYpNp&yJM&e>GHH*q3kOp??Vf9VD4Z6|%uglf;8JPGeeSWG zS#4MRM%1sB!rBy-6A2a~&t+bd50w4CE%5(!)&I}T5%=!8GPs7Jd z@?E%LD|hO%b8Kh-d3S~S)hzPY` z0PCMG=kQ(QpL*Z@wLeO3wQCaL>Ql23_9oAY{CTIDsulTrTe6O&6Axw)#Efc97j)8E zVPzc`fluzy22{(wXWaJ5gq42Edbs*DlKe@@EK=-8b1D8sqQTq&%|pUpZ@xa(hsM7+ z{Wk}}JOvBRY%cx=i9(4>gmPGgwcizHJimi?a{<6NssciYyaEDG`0UMqcY8kJAn;v8 z>mMR3r{@aEO7-(6tyVocYXe{^r2j-Qy~p7~HJt*= zER>k_$4-HX$g3*g=8)kAh*HKhtev0AGF%P+x!dMQ|L$pu4Z{+FFP1HHlZgSolI91K zA32A(d@ceM1KcGe4&U$}A=%N3zLP&52t9i=zb6>-EzPQ}({>U<&GZANhczFHLC*A# zRrv`m;ox3Z3#^|rQbvuiHgmJcj`>*-_HTa>P&<)%_{9Ou6Pa0WO&q4Jh}T@>VS5N& z_M;vp&HtA7(1!H6u)xFsL`~a*pCbo=TPQ@$0sFD9^~f4o0DZ{>ToS>3i&SDh z1BCtDB_1VX+6eqX0Z9Bn6W77VZ;*i zF7?VahNCYXE=t?jyED^Q=#d%~lbV0*7n_w~cFTs@_l#FL(KUk{Y9$4wJvTpb9#oZ< z9?FUu(&_UbzzA}0y>&k}H|JRqIk}qe^u_0`aELrXnV;qhIs1)7!n%Bq>aykht3KCJ z;@pqzsFf}kS|YioE|;0{8D4s9zs!gaFW0rfGcUR$ z60VyXYJq=V@U1*Es}OKx;FpQ^!n1A75{z)1iW_iqh^^d&9mYxb_1|Sl2Q)~%~ zI-OIemUo?NG|i}9{Le@oN6| zXiRncD{{F(F`4)Gx2aoITfDNUCIj257xZWIp7g_d z>C#Vt^IV!25@>%rtbEhosm%G$uV*va6|yTrM=p8XhN)x9bQ(g1tKr|xwYzKDKMX$W z>5+gV#M=UJ+cy9-FA%IVfqPQ#8FD<}^Aw~mwA=8k*akS$-!9~W1% zahOU$+WIB7zZQAGiJPcQn=o3&S81#o!1ARVCFHHcfh~2m zAVAt2LTMPq!#e46saM)0Qw^nAw?hdN} zH7Nbd$rv|l%$+NUEh#jOw!@1$$tB#@5iIki%$htDOIv(y^oZ=B=b3hoTcYlg>3Qp| z|0s9*{apScT+i4ORHs!Ge8N^}sH=qE+ryr$`Eimb+NtYlS()TIZhpFGYEy{gP1tCp z%hB;+uvF;1J?=aT|Dif+4iEaaI>+Zv^Z!ZG1E5a|fG4i+pPw%z2QRsp zHm6`wb6!l&l0zc`$8C4Io!derd$A?fNB%MrYkmy)mc6vxY|DAdsy+8VdEDam9J#fc zU9`}$W=WDttJ?U{4gSZAw(LH(QYE&}>Cn=4lI4E>g4JlwS^w;eKwq|(xg!^o?|pOW zi2%kKE9I<%(f^nIw+~}l;j}n|dBaGwGhH!Vt|2rM*$ZKQkw(^d?#D-Y`??I7eN|PY zhSsp&v+N^aKU@UvFO4AK14rY^3NT-EdOsBVO-}Ua7?%y<#;%4NQGsx+S z#1}2$v2>Em<;6#n9pjj5*xUT#Hrj^AZD(|%qlOnSI!d&6us!_inW(B&N_$57xmng) zMx0}a2V%I#tTx|ZUg@YU0rQc`(g}=lPXLiUP2052MFkX15$KuMrmO=0Pt)&PY5OIr zsrQ-q*Pqx}GiW^4r9ZZ}+v>MnaK+~S^vR4hgNN=v94HC1xov1z zep(C3ZO=A+U14dH;_s@nNgW#bnNKDFbp04O3T(lYya=1KPCs+Rql%W(wLSQS4f)#D zs0Isssy`;{u@GMLG~GL}iWOLq8dB{$7mTK+y`zKlRM2fHAc06fhB|q9;!TwI9o8$k z0(vHzn;yK}=KRj#H1VY(Cw$PvL^G{)qyXGbpZ(T8{W!Yz{kic+cl^96_ueIsOI<4m zbb?r}$iHX&CEmf|dAlw%A8hahndwe{h7?>=^AKy(b|?E(bf-P`9{*l$iJK~Zg5$O6#^>AvJ`Hr57(3=&Wo5gwLg~Ez25|<;b z#I2U#V&vTWbHdkm2FG0ISal;#hSh~#Tl@NdUZ+I~jFA+28A<-G1f_P~TWYpjb?)%2>(Qt=V8$$WpmJJEiLHn3h z#B5)9zwk;Rf%JB%>iY5nqwI)9*cOR%hR>bp-P2fg1IhbY?R^q*v;HQYwX)c=&$+>m zPCFo-&IKt^67rL~St*{(Qc{^|-=(Ssj!m(eIr-B!eM-Se6m(Y0lcf1sw1>CC%ToME<4XrC5^>6!v^BeK0|La8#yo zr)TU!)a-{kF@Hj(@JH2}fj7t2?HuoN81yIKGY*vp6jq$Ak81+VT*R(|tDbOg1K@Z` zG)mV0GW$jI&lywMV#G#J>r<)}))O2Nf@0nJ4wFWG7MkP?sbwvU?Z;LI8I3^X#cx-9l;-HvDQw?K$i zDz+Ak`!{ko_9zh!qj_c0R1v|!8TX+_OYZ<22}Ta4InNLkW6SQL;ONS6P1SFqiI=PR zE7g?|AZG04u-Bo@`*hT2Tn!Rhqvw}nS_qQ&s$SJ?8w0y1Ulj`Td^|S6Qn6>mwwZ3f_scTBI3439BdkNKgKxU^A!tj6aL~Xv zDM_L)+@gNUCCzm zjm^3V2bkM8*ZQVswL>ENrrxN35DpGZ$)lno?Iu;Q(p_c=eip;-RQ0e*LRtZby|XHi z4{QmRcpaj&PDLR^UwsFl=-B4v%|p()83hMQ7@e?i)IL~IQSj?M2CT>l zKD3`rmI8GR=4IDzm{Mi;ihg_EU@!Ztzmf|@QnWTDTg(ZLS3}-wDmnH$58JJ@Qz#8oPH(7L@P)&1b4!x%tlTY#Wny7Z^g||N;01+U0IOP95WJxo6v)2wuQB%0qp1TUm zjl^F>9SdVv-fp>55)E6LadKfsus4K9Tso8h_;47Ws0wvYxwd5=8gkB%xu zr3%|T#N`>pDkE-iXJQ+CE_yeNQQD>bX&4nKoB#BhrhEOFi2}{HD1MT1IsI^v)tm!G zklkW!?%KQY_4k9?dg{xW8j$)h#$53c9%HxM)ZIx3GYqY8>MQX7Cer2ySoLN6v|!&b ze8)JU%lazan2Kc8RF=$iHk6Cn{CIZX-?6HSuQ89by?b7M>b^{webSI&Pf7j|3)7Y% zNsN3xI>w3Qnb+`6(C#a_6Xb5pxxTfeJS8i1-MU6qrC-x)y>+?MwVT^ap04vfh+(u2 zj6Pmk`YF-{3jt+s)nlWDjmUh1i92zNOPUo`;ptONFOO%Hk4Hz@^9-unve()o-QS{2 zl1J@zrrF^&Z(J7-_e9FgwZ;#|7!(77Rr%1k@GxP~Iw61cfS;^j<2`3dM8y5CYm*p1 zmiANPDb->R>#Ft+g?^H&ds?9U>F>62(8R+clg(DE5u(NDeTf(d)fPO0MPr!tW3r1d zsqeEt+w?b}eo*pzfTV72;AOwuvlTkyGQ12&ELTT^keK#4Uw)V?1J<&Vh7&8Xz{p7S zHuQkD=*?&EWEBXt57)2N-%D5InH!04O0U!?k~CeQoVOSb0wmc8QE_Y%O{>t4OVay3`!UuNK*28hbW(CO;8aG?PrMExliY-fYVuC}L&ULn+I z(UnFV1T{@DH(NASgh>Arq6TcR5X?k3^{xj)LijkblRH!n^$cZD5BT!RY zAp@nX6|jIT!84onNr~6Icgwv~H;*fad)ZL)zyd>Z!~wXJs%g)#n*`e>R)b2WXb;+e;))PbpW1Ow1Vr zeVUMB(5@Z}&VDv?!Byv)Kp15k#UHg@zVVZG;h_FLGVXfZb3I*e6vYw!C>McujR0#) z%#FZ?N;O!_*#+M>8e*_n>zJ=5uI z4mz_`^9cb^&uJ1NPRF1*X_w<=X77R=%beUbvc{e|fn?Tj_91C1{j4g&Btc_@6#EJ9 zgJ$j^v4#xyLR3N-`YCTTI95QwZJ-VW!T1VcnWX~8*41#bWb4z%W3rgfrAM;IOsV;D zIH^YC@~Vfg2QNwb*n94CpVHeAG4@$Io`4IG!weCkj}tc1PQsXNu+*|Z+r#Rh`a=;r z-{H})Kxkz-{Xf?fAJf>WDR$U@vgZZ1wB9)NOKwCy`NZqQI2}7G!K!p7VRG9O1N0LX ze(uRi9HTT)@6vZX8s?qK#*0XCITwX1Jabg*_Fn2W}+8Yf^UW zp5Y%dRt@cd?ACt|>7F0u)Ms8F<-Y$usCWX_NBKcn+r&Yc=2l!64711gS+hdZh~JU~ zbrYF2QkCda%5}lY;_kU_Y9yb!c)RWkd_FEt=!3z5a0{@TyNFS)$5OFz9rAWdBo3Ls z=rFAgDMP^uH=@fsJayFYAAd9feOTt4&mQuJTd2!+ZWl&F31#Q8u(hrRkp&aES}f62 zIgWS@Eph&?gS27{NPXbuF3GXc&}Z8q_{;xK_V%mgU@RwB{l4I&xk33PY~2fX?bzq| I)Si0jUsq&($p8QV literal 22387 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[]{ + RatSkull.class, + ParchmentScrap.class, + PetrifiedSeed.class + }; + TRINKET.defaultProbs = new float[]{ 1, 1, 1 }; + TRINKET.probs = TRINKET.defaultProbs.clone(); + for (Category cat : Category.values()){ if (cat.defaultProbs2 != null){ cat.defaultProbsTotal = new float[cat.defaultProbs.length]; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/Armor.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/Armor.java index 47825fc7a..c2406fe3f 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/Armor.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/Armor.java @@ -58,6 +58,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Swiftness; import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Thorns; import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Viscosity; import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfArcana; +import com.shatteredpixel.shatteredpixeldungeon.items.trinkets.ParchmentScrap; import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.sprites.HeroSprite; @@ -545,10 +546,10 @@ public class Armor extends EquipableItem { //30% chance to be cursed //15% chance to be inscribed float effectRoll = Random.Float(); - if (effectRoll < 0.3f) { + if (effectRoll < 0.3f * ParchmentScrap.curseChanceMultiplier()) { inscribe(Glyph.randomCurse()); cursed = true; - } else if (effectRoll >= 0.85f){ + } else if (effectRoll >= 1f - (0.15f * ParchmentScrap.enchantChanceMultiplier())){ inscribe(); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/trinkets/ParchmentScrap.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/trinkets/ParchmentScrap.java new file mode 100644 index 000000000..68ad49200 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/trinkets/ParchmentScrap.java @@ -0,0 +1,80 @@ +/* + * 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.items.trinkets; + +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; +import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; + +public class ParchmentScrap extends Trinket { + + { + image = ItemSpriteSheet.PARCHMENT_SCRAP; + } + + @Override + protected int upgradeEnergyCost() { + return 1 + level(); //TODO + } + + @Override + public String desc() { + return Messages.get(this, "desc", (int)enchantChanceMultiplier(buffedLvl()), Messages.decimalFormat("#.##", curseChanceMultiplier(buffedLvl()))); + } + + public static float enchantChanceMultiplier(){ + return enchantChanceMultiplier(trinketLevel(ParchmentScrap.class)); + } + + public static float enchantChanceMultiplier( int level ){ + switch (level){ + default: + return 1; + case 0: + return 2; + case 1: + return 4; + case 2: + return 7; + case 3: + return 10; + } + } + + public static float curseChanceMultiplier(){ + return curseChanceMultiplier(trinketLevel(ParchmentScrap.class)); + } + + public static float curseChanceMultiplier( int level ){ + switch (level){ + default: + return 1; + case 0: + return 1.5f; + case 1: + return 2f; + case 2: + return 1f; + case 3: + return 0f; + } + } +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/trinkets/PetrifiedSeed.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/trinkets/PetrifiedSeed.java new file mode 100644 index 000000000..122a04276 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/trinkets/PetrifiedSeed.java @@ -0,0 +1,62 @@ +/* + * 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.items.trinkets; + +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; +import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; + +public class PetrifiedSeed extends Trinket { + + { + image = ItemSpriteSheet.PETRIFIED_SEED; + } + + @Override + protected int upgradeEnergyCost() { + return 1 + level(); //TODO + } + + @Override + public String desc() { + return Messages.get(this, "desc", (int)(100*stoneInsteadOfSeedChance(buffedLvl())), (int)Math.round(100*(grassLootMultiplier(buffedLvl())-1f))); + } + + public static float grassLootMultiplier(){ + return grassLootMultiplier(trinketLevel(PetrifiedSeed.class)); + } + + public static float grassLootMultiplier( int level ){ + return 1f + .4f*level/3f; + } + + public static float stoneInsteadOfSeedChance(){ + return stoneInsteadOfSeedChance(trinketLevel(PetrifiedSeed.class)); + } + + public static float stoneInsteadOfSeedChance( int level ){ + if (level == -1){ + return 0f; + } else { + return 0.35f + .05f*level; + } + } +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/trinkets/RatSkull.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/trinkets/RatSkull.java index af6fbde79..fea02b8e1 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/trinkets/RatSkull.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/trinkets/RatSkull.java @@ -32,7 +32,7 @@ public class RatSkull extends Trinket { @Override protected int upgradeEnergyCost() { - return 5 + 10*level(); + return 1 + level(); //TODO } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/trinkets/TrinketCatalyst.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/trinkets/TrinketCatalyst.java index d922b2ddb..97198df80 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/trinkets/TrinketCatalyst.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/trinkets/TrinketCatalyst.java @@ -119,7 +119,9 @@ public class TrinketCatalyst extends Item { ShatteredPixelDungeon.scene().addToFront(new RewardWindow(item())); } }; - btnReward.item(Generator.randomUsingDefaults()); + //TODO we need to persist these through save/load in case someone quits when the window is up + //alternatively we could just 'peek' at the items and then actually remove them when one is awarded. + btnReward.item(Generator.random(Generator.Category.TRINKET)); btnReward.setRect( i*(WIDTH - BTN_GAP) / NUM_TRINKETS - BTN_SIZE, message.top() + message.height() + BTN_GAP, BTN_SIZE, BTN_SIZE ); add( btnReward ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/Weapon.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/Weapon.java index 163750628..a44eb442a 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/Weapon.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/Weapon.java @@ -34,6 +34,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.KindOfWeapon; import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfArcana; import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfForce; import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfFuror; +import com.shatteredpixel.shatteredpixeldungeon.items.trinkets.ParchmentScrap; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.curses.Annoying; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.curses.Dazzling; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.curses.Displacing; @@ -316,10 +317,10 @@ abstract public class Weapon extends KindOfWeapon { //30% chance to be cursed //10% chance to be enchanted float effectRoll = Random.Float(); - if (effectRoll < 0.3f) { + if (effectRoll < 0.3f * ParchmentScrap.curseChanceMultiplier()) { enchant(Enchantment.randomCurse()); cursed = true; - } else if (effectRoll >= 0.9f){ + } else if (effectRoll >= 1f - (0.1f * ParchmentScrap.enchantChanceMultiplier())){ enchant(); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/features/HighGrass.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/features/HighGrass.java index 836141962..61f3dd47b 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/features/HighGrass.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/features/HighGrass.java @@ -39,6 +39,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Camouflage; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.DriedRose; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.SandalsOfNature; import com.shatteredpixel.shatteredpixeldungeon.items.food.Berry; +import com.shatteredpixel.shatteredpixeldungeon.items.trinkets.PetrifiedSeed; import com.shatteredpixel.shatteredpixeldungeon.levels.Level; import com.shatteredpixel.shatteredpixeldungeon.levels.MiningLevel; import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; @@ -122,8 +123,18 @@ public class HighGrass { if (naturalismLevel >= 0) { // Seed, scales from 1/25 to 1/9 - if (Random.Int(25 - (naturalismLevel * 4)) == 0) { - level.drop(Generator.random(Generator.Category.SEED), pos).sprite.drop(); + float lootChance = 1/(25f - naturalismLevel*4f); + + //absolute max drop rate is ~1/6.5 with footwear of nature, ~1/18 without + lootChance *= PetrifiedSeed.grassLootMultiplier(); + + if (Random.Float() < lootChance) { + if (Random.Float() < PetrifiedSeed.stoneInsteadOfSeedChance()) { + //TODO do we want to use decks here in some way? + level.drop(Generator.randomUsingDefaults(Generator.Category.STONE), pos).sprite.drop(); + } else { + level.drop(Generator.random(Generator.Category.SEED), pos).sprite.drop(); + } } // Dew, scales from 1/6 to 1/4 diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java index 7a659c740..26bcd2330 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java @@ -470,8 +470,12 @@ public class ItemSpriteSheet { private static final int TRINKETS = xy(9, 17); //24 slots public static final int RAT_SKULL = TRINKETS+0; + public static final int PARCHMENT_SCRAP = TRINKETS+1; + public static final int PETRIFIED_SEED = TRINKETS+2; static{ - assignItemRect(RAT_SKULL, 16, 11); + assignItemRect(RAT_SKULL, 16, 11); + assignItemRect(PARCHMENT_SCRAP, 10, 14); + assignItemRect(PETRIFIED_SEED, 10, 10); } private static final int SCROLLS = xy(1, 19); //16 slots