From 168911efdac8e3a45abb418d6b996582ae64cf0d Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Wed, 14 Sep 2022 12:49:28 -0400 Subject: [PATCH] v1.4.0: added functionality to replay daily runs as practise --- core/src/main/assets/interfaces/icons.png | Bin 14926 -> 15044 bytes .../assets/messages/scenes/scenes.properties | 2 +- .../messages/windows/windows.properties | 3 ++ .../shatteredpixeldungeon/Dungeon.java | 7 +++- .../GamesInProgress.java | 37 ++++++++--------- .../shatteredpixeldungeon/Rankings.java | 11 ++++- .../scenes/HeroSelectScene.java | 35 ++++++++-------- .../scenes/RankingsScene.java | 2 +- .../scenes/StartScene.java | 6 ++- .../scenes/TitleScene.java | 2 +- .../scenes/WelcomeScene.java | 2 +- .../shatteredpixeldungeon/ui/Icons.java | 38 ++++++++++-------- .../windows/WndDailies.java | 18 +++++++++ .../windows/WndGameInProgress.java | 8 +++- .../windows/WndHero.java | 6 ++- .../windows/WndRanking.java | 6 ++- .../windows/WndStartGame.java | 2 +- 17 files changed, 122 insertions(+), 63 deletions(-) diff --git a/core/src/main/assets/interfaces/icons.png b/core/src/main/assets/interfaces/icons.png index 3c96d8f9c09944389d7793b3cd9d2e43db2d6811..4b83ceee8cb42662808bf5d52962c41eea92a400 100644 GIT binary patch literal 15044 zcmW+-byyVN*PmUMWr?M`OF$$gq`RaM6$FGuBovVD*rmG!1*Am;B>f`Nu(S#il9Ib1 zCAIWQ?aS}|W9GT@%$#%YJ#+GNW)e(|b>U>JWB>rb@9Swj007X<5J178H|IZ%O*c0b zlJ0A%KMVxz6cDHL>%MMWB~WDt={|Re)EY*(P_JyG4CEaMH=ov?{kHr29U{yRsU}J`tgbZ?reb&bcKL2sXFI;{CyxV?In0^0 zbG2w*D^?xVtx8x~MIO9%9ie6(nw6ykc7mKU;w_>Hr_t!12WKT`b$6t^5D+wud~R+* z)*856kJ?5bT2s|HfH83Ae3rXsGkhrJ8DxshzuyiT1D(CbeAKT-0e}Z_;*2*@aZW%- z1KVc6j#9;<3ErF(MR^LS>8iHRLC|%}O*xbxAowbcYoAE1W4|;2X$3DH~_klUu-FMBZa8 zL6ry~8f6rqrUl5^feFhLVAv--c99rh2cZp?L)16LML1vpE~%;GN%+CEg&PP^FQ>V- z78HO0fs2Bzt+Jv3bKtCH0I0afy>bFOqo#cRr`MB=8>Z5m=3YHv22ik_N?nqoh$&H; zR7;vJ(P0Pkk2QxJ*?@ucu2?nqXpfF^MC8CIMDy0EjUZ&LL9=eX7k^##qK$bzT z3Piqh2`K%PiKwOQ;J5~W2c*C(G0JD8uGhpB zSO}hkYH)qtQ-lQXxKfSV1KfWaCCSvPb{B~QFUMVPJ=^o(_-!v@y{;k#WJv>od1FK< zzfO;6q}&Z3l)LP5maGX#7&b|{Ov4S-+8tgqgmVGtI|Sc4U`z@`IITnSJ#!U6#F^3o zmZuAM8`6Bh5Ahs;rS3Hp_&^H`z|aNfL-o3V=T9Ej2_pbAX-lzB<2k5Ayy+l-u+S`y z+kg#kgL_Y>y5mk-kn})hC?hJ>B+O5T9|h7*3KZ3Q0qyr7vT8bS zc9RE<)rK+_Uv(F!meld6_5YD*kpo3nJI?kfKuk);?sDY;Wbf9) zb_Jw=#-8A^nB_Fq&gZ90Od$x;`n|4@U!I+l$q^T1KfC-Ggt_B-1tC495eknx#%sB|4OEg^>Aw!mv)BLiG2AIB}R0XNQ zs3GG?C^+>uSMX|?60zE5(}K6b@1TtW5OC%TZ1(~Z@%PM>n%2w45EgQHaRy9??l)8A35~x%nHm%hKv%{MKd^s{$ojLf6&7SzBvJK>z zM?x0RTa!}0F=tYg{X`5Y@WrNfI!wDqH5i}`(Oz`5VDu4^&q&kw=H-Hs&+Mf5h`ek756 zJ>S_^ytdl?yGe7sGnaZ!SQSlOpW3L1yVk!VP_AAyscL`l;BfKFn8AeCTs3ysMK^fN z&;t7#&IPI0Vj+0t2L(rkW`6K1#VRfiJkduE5o&_dhl49xpA-3>&c}rB-vzb)h}$?6 z3B~6V6w6I6kLZ?)WGA=MqX{{vgIjOkK5u9}Kui}n z*Lw*<4H@HX0CX>a4z2@C?TDy+@~BW_dLwaNM^d^V>L5`j051NXDA`{YaA5^m@_}c6 zJ8%9It4Y1IIVE+2aQXMlH>Lq@K3sFZRVe|&7u3FWRFCTUyq$2V4rpY&OBIl_Bi<+C zrVXF{_p#ho7ueYb7h|<`!pKaMF^U@mFR(7>M^7EnaT*krjpLokj3e9q&6-63AO|nZ zz`KY*U^FSAYLC8nHKc;^^jvbG<0%nhJ`|2FJ#zse>-g5Wcb$DMH} z!6Tyx%3U_Vbb&~x*Ig-gd25*oIJW4H17Qeu-Cy%**xe)fn~{V7kPaNRS)_GZ0e1y( z9mj{&`(SAs&m+LJ%dVp~sw9o~pnh)pG#n zQ5*rj8sDlrgRKkb6vtjjFff+|URVK%pbjM9*~JJf$jBLwC_7O-@y4BcPSjh6Fawcx z;3`o1J7r)_b8>lHH^wlAYmcr6e&N6SRafG`y~A+u^rDIC>Yuzc2)DUd4&+B#?ZF%j|#l>MV&FU>PNB#-Kc!*;FWWEwIs?B5P6 z8(O=qrpp6B^ggAG9r9gAo}Su;tAkJ1qk325y(!y{{I^Nn+)JB&hd#}v)VW)h8;(O_ zvpF+KIOQxh-{L5q^X0;oI4?pnUTO5jAuc5mlf3mGvPG>0qPo@A;S{{sG7docOc%v6 z>3nKUSJSu$psseqeTe`KY6O1SYm?)yGs+kd z%~hD6Pp<~dL*riYkwbyQH0MMYWSbrYfbAj)zX+ODGtOkdaUKJ}93FVJt4f+}&k04X zAx}&^=>g$OiZ*f(8J5W~-zyp8^8o(#DG;wlG&?)Egd|j=kq511;F5lSHzMYGcDU*y z5J9Q)jY?^+DQ26KSp<+yzNru|N;& z1$YF3dgChh-pQbH;CNKriXYcEKQmo7SWFc|3{GoheY*K$wVjds5Z+xEHsCjqYLaCy_@l}iayj+2c+ z%=j@Ov;{kO;T1{O*AQWprz;?_BRwP9lni**aW!4M93=-#DV)*${_TY3pkum-IWh3x zBSgd}+{Cz<8WDu|*Nv_(=7#&>u=rzJ!e_+f`zG$sbrZcMxD4+?=30s$Zo)o|)p=1(u7L^12La#7vh7tu=DD&6 zc8S#oQQAvK@4(p=B@vhU8FRe=V&8dGaKk^=jtHpj?F#*OXfKxP%$nGJrQJug;D8)Z zaEtbM;0uMlYVwB<2$U{nQb^_K){VEWlOq-|)7u4CMMMw&^=LmCYSd z>cC!S6}~mP5LoD@EK!LvHG9hefr$hx2@Lx}Oo`NDVKPuVB9s$;$RsRpKq1As3VU}L z&%${%*YV25g%}l4%N6!d4FJBhj^HM4j-mgI$E;5NCW#Fz^dbqY{zyx86zim2MJ^DZ zge6REGfv1r$og)wcr>oGV++HvhMk~_Npj#kI4FGZ_z5|-e5kd`ogYAVP+jL!Ll^0>+*_ouLVz`;;B>IGU@* zEKXeIrKVV(U-WVn-=%FwzG$m4VChLJ48jGZ(W~F-YHD-=0*~&z1PlvtrwW(#>H;uT4evi*sxM+op^#px zDg_?QGzh4>o@lG)S-P0;u@tAYd7ut_Q{^;Df&v@nE)H#+AOKu69})uL>Lrv=BXFWe znCXbD*R<>8R`Os?W60N!PK3;hxRM|=c|w=>k}Z)UOP;C|)o{>QJPq;q1h>CJz6 zITw?5Wim~`H&*~(U`1tR-v$LPzo$(5@R-JM`6V-l0zxo!FE?)20~sPvP9(+x{ZXjE zaQ+7N7br#pD9313Fffs2o;P^%O{G%4mE4q|{z%E$tj-!3qsH6@MVJx+GLR(_6jj96 ziHMs}&<1u#(#`>Dl|Sp*#7cb?c9mRWa1+`sv4A?j1YKmg?!5(oS|5HjCK>C|&Lf|b z1cVm7XP8=Vbb9DHO>a!0Tx&e`F42Y(>fyvgM~_55I6wuaP)$ZDc9$DKz~-VhUxF0S z*3thPv=r|ag5|JGUyQKX3}SUR*v5@66@Mdc1M9fhJsCXBCy}uDfm^;zeWH|%8 z1JqV~Fj)rf(F~qylEqJ=O?A=;Vy5fU zxQKODpdW+^JC5_=RD1aWSIS*Q*j|D|9kv4{AS6|Ggk{Iuwy8Rbx^%A z4DSb^t9&?7Bo*?tJ0Y0|qBX8kYVe=zM{{GwSo82x z#?|0=?=)N4Q}MgbE^E})|M-2&z=FSQZ+S%xJvdOfQ&wUr7sM=-Jg|k34Zjzs-oEuO?m}I3`a90qEnCYznnog~SXI6gh8lUIDMS zf1Nqs4&~(G6@U%DP6$}W{(OYzce}anHlZF{eHr-}O5&p_GBE>P%;s*nryhUY@=hsI zhKX$Pce@A^@i^4=H)%wb%6m7NbVknjlyTBo>g>dC7=Ryd$vtnuCR4?b;eIDh$L?Q3 zutm`LwFEI|_dD|UQi6do{p0VGMY^?$xv96OtF>)o#d#waFy9;c2c~2zzNev5${1v8 z4%D8f6TM8z6r6i^N1Mqbf0d^CpBnG^9l|OVZMZw1r364aG3qQ0&>{)N(8WyJW_n-u z*o%Ea(vKaij`I$~YnUKuC~szTIwrgt2XAa%_##1N-`aKcq5KUg->a|$ygd8*?9X2i zTYpB0u@!w5lz=ZY9U@11e4Lim)u#or?a-WFGQ7woDlT&HHm~~lwQg1c?=$6O>b1|{ z44!aHM@Pzg1^u2gueHn$PanV2~jT$P%jVG=}T)^OxkyJOd$k(lVZ&OWj3p7_nV-CKZgc7%7PNj;XI?=Gy3 z3%N1>8QGw%ANR495xq8%C%1?BLsypPV2r!~u%86^j~{B-_q{y zvn7vgMs0o*9n(J^iBXSKwLZ|T{co)tB2Rff`wlV0>Wr%~!nnKsfGya>B|YK~zGF^g z$+Fcm@{sCwMknmhJFc>pap$L>y>V4hDKY;zIJciWEZd~sDN0Bq11V(|gnRZ@*lI?o zxKKPzx~WX>;Aw+y? zuji$z54~`sCqF_XW!MTkgL{yt|BkxvoYi8^3&{1pFTn(Lt()iPc^qmK+ZWuhtLrFk zDqZ}+4)w|!N{uNbaDE;=(a&luD~oB9=bfB^Uz~r{2>lR(+v{b!;b`E*bBQ$npK5HK zgkh0ZCF>+`#Q9Y&1qvd>J@EeSX(W1V+detD9r`ryjzcsiyKgyzpzHvgOf@+-3J@lTQHN33(Yo51_;K+pQ7==@hilze}3h{6}qH4IZWlKGZO z-mmWvmXiT`=-kge)=lwNCs<-?Cg_f@4n9i*tra(vZ}1DcQu7%{I&H`wRDqk={q6AY z)SG$sLu9Q)(DC3MtYIYWr>Jb+sd*Uajyz84v08kmNViT!C&hb_=Vsfyal4#}n@>v< zrD&48f}(i+OP7pgQ`04!&slR4eNx-6-hFQk21^YY{y8(ewt7s5nE|?i$Qa z5LH@3WK;0eG@B!lgSe!*rHejlg|)q1sBgFTO>>6_TVLaS7el+0rN2V-ZdNH%^paZ5 zirsm<(K}hDu(mns%+IexLOV>{VMn`RjOp>5KHLVpmnoDw4fZ-jf!XC$*RSJm zL2!`Of~YbjdZNTWYnO>ggU_?S7tilz)A>i}~C`UHE0l zdh>-;j2fSNt=92ts|YRpgF%WYNI>u#)nE5h+P)jvODx@|yglu``C$whkaPFcJ$>-I zoczwxH+3wlIjlO1+O1EgxKN}g*0f@LczZ7Sqs+d-wRf%+)Ce6p~qr6$6wx{oi7iM!@;P z2?OH`ddDB3C88rFZ4ba>%)2T10LcJ_Z&_j_KW+-q(#Q#AaJ655^Q;?-W{*-kfBTaJPFRIy@_XanvPAx#B9(f&8_?Fu_zN7wyz4PA z)~#?i;u*WBWm;Hn$!t+0^yzny3-1BbFR@(Aiv(`#hOHX)`~2wqi39%b%y`w2iTI}9 zNm4AUl~fT?tgmezrf>HR6h=}XlQqv8JbU$oFYa3F)BPFv?b{%-CK-pBya4|q^F7%F%$78AqOq{x<(Qa(;9VJwHK26Z&KSHiyDOdP-H>k(Zr~I*po?4oNF+?WZPw zZ;2%|j6mJl5(f1U3vl@JjES?zqc*B6#;PkxL?*Gu&d(fh2|qa97_|AWk3#G9LKoWHEQ{-#wr#y6ZKwtJ z$RncP#`+aF%gDuU_TxdJ_flDXMt%{iUrJ{#D&Mb| zp}|Y!l|Y8v*td%dE=@G3CyGy|zvHQuoEQpX$K$R~~oIOtAcxH>;?*)4y9jGq&_VjQ0Z^F`~nL z#qr``^e)&^0=3ms2h&Ext-myYjIxgkg|945F7??^6xVAcW6l23KYtLM{yFVI zl*Mr46AE%Ky>yRU?gOckPNuaJ&LOz^OwPj6>%XA9Q1%1;1(b*Q@k&+0Q)ZRP`1u-Z z&ri~nD?6TvP}%nm=D=6&K<;-6BpH+Pmg?&~qTw9RtXL(~J)em<%5T+r(`hf!pT=z! z3k|@xuu9J_-W6w+N50f2p{z6SAE9Q*PoC+^^cH0g$y?2K!Q8JA7#aAazS9s*Lm*WR z%70oODVPPO_*jX3#7e@uU)J1Gm^2ggDbT!=p0Dzg+`4$2lq-Xv|AnwuAJeI~chj0t zpW7UYT9xbhddv!0%(YREFupCA``%=lKY>5rZ7%sbHk94nc(8HxQD9Ido85wZ{AbsT zgQ=P*{JDOvqy~jPfTL1X|ATVNkaN?h)VyBZ+Mqo!*u75hp;ny`X6Fct zsu(t&yV8|VI3ycBz-`3;+`KH?7koWNcdLy+M%%`Ba#ApSoXe@A4XVHUOWi1oYNg#h zUgKA*Bd-=QqK&V&O7F-(`t3Olj}ae!(u2!qKsUxzEaTNs5c=%> zEjG5dL%iL_p#E!CAxcS|S2+xc;Ox@mCi((feYpasR82M`9IrXK>K~Er{r?`}-t}FE zk&@JvHsa(oIL;g<$FOY>le<#~p;9DGL=SP&ws1nQ*X`?bJvwBQ&+TiC<%_STqyZBT z$9GEK1!DTHwZ=a`-Bk5smPuKg4X7t-ayeUmoSmj-XYmKN;MrLPTkKERtc*uvD#dL6 z?y32`1V#e>IJn`Muh)MAogu!3?@HT{*d zR=F|B)h-Ln?U5v!XSC&P=$#aV6V}A}nhzBt25c*vM?B$5_<$D_z(NEr+e5#Je=R_DmKX`Sf8Fa_i{GbO?7k`? zX+FS+7~9IHUJVAkuaM(XuUZ)UZI*%+x5FM4b(S(Bi0A$ed9M6XIp&&;i|FOOJYHnN zV^92&Z4@JC?v2{xvBWl8sxiHe{hOckG|r|W{8~YLZ)KCSl2e3k-&cQX#9F(clw_S& zmsHMzu1>*(^l!O-eR!*n# zj?qajBX>6}Af|-UM|rN7maW6hzG;|w=sree61<~N)pMVgQ252PId|KkrBF69$iJ8* zM#y`NNE<|vJXX#Ce(^@)%ZUA!X@w|>Bxmd_?X%RwMyN}|Sa&J{o@H)T|I>u{M2SHk zbbP=)L58fA?ost`TP;^Gzg!Q$bA7%Ve%Z-SZ5RC#lLY3ZjIBl2oLI>*)TYQ%`LTZ> z_!t%^WcSbEYYjOzXdjwwbTMno9#(ihQS$Z2Y>pKO&UjsXm$B*eW8HZ5w7YER*_W@f z2xm>QuWuN!wsvf`9nIvQ>)|tdi~UWi?cE#8sffW;cl@FUvd4pPNfLU|#^q%tGH}|; z`awXOM@b2m;kqJud_}&{b;SNTd}%g|J?(Wn{m#oewf!Xy%RGAdV-=!w#yvv;i91+v zEr4(UM+6@C<8exc=SJe-fe-ryKhFm4Z>~x=_rhil-M^XWQJ`P<8EdQQEd1`I{6@OU zC;E-(a!p6>0d3T0zWLAD6le{Lr28DQt-sN|J=7xt=Y|`o^uJJv$RbYCWZn7O$s~C{ zo^`wtdCl&avEHN8%X;fBNXB!@z;Tgaqi?0fm2TxVT@@zsAMltTRJ z>aLxbdp!zQyEn}*PdAn^{ojo*@$<`=c@NdWq45nNy(CTl2LiM`ddEEK%-4G|E0I@b z58p+*28d%_kW5xqf5$qIgZN}9H_dfOGNKhU){z_CMGd;V$!N)bm&2&DhNQx-kOm)x zCX3!b<)q9yvo`PaFn9r^{JSgP-ohz`A!5^f%6>bwd;FK2FF$dqWUTO--wXVwE{3=U z2zL}BF$OffZn@FU{)#a+I^sD5uXzNRf2RD;yz&*XKoc z^;7b0xW170>)s?^QJd5atab~>z(tCr*AyusG=T1UD~{7JU$#H+78COCRJR>f1=i#d zboRbRU8;ok+a?v>9bZg!4PfmTRQ=Gw;rFvAIYK`SWyqS08h!mrKS&c5D7tzbEoloc zHDX>GsC@cw+WuY)Zsn6DMZRKUcU!jC#9?LqKjQHC^>+0_ z40*X|aOV=)<=1UT@T4S+F59Bw4>Fb3W>V2n#skZ~k3DmC_ksqI7 z0#Px;fz*Bg_~$IF0m1k4KBaaQz1iW{E2fh85;Cz@9#0Y(#e$M?2e4O)deEDcQ&V*0Q3jwd)h+}C_!T3$KKD#n)EMS4>3qP$##+sClS z@et|o>{f11L8?YF=Ui&ZRb$|o6>3BA@E}f6P{K4n-e~ers$?|g_qz;`B~RaU{tGUB z3PdbPB!B#s;q(6P_5Um#dSX%0TxEi36jJhiEO)qnpi+!v|Es{g?p^J<75JnqS~DZD z+4es&q)I*Qa#O`>k?{+xIL8S7Zti=cmq*I3j|Xx!w57E-CDSMrU(bp@azvCF4_dk5 zYbQ|&KX{q%WP*ggCx%ddO;oh{G&XG$*Ze_GYoJ>D7cG+rC9K1SM8A z-iY6(wjuFa^H&+}Jt`8e=hrMG5pIUZbc>IfB}+OLYhJe#kS0*?+^Oj4OojvIl23%y zr`my9PM$AZm5iAN5gtFRAXd3OsmXkC9#IcHT${zEo^z5qal+TVZ>g21P5Dvu4#p~oi#r5tG^dHjejp{r-ls?t37**H4I_l?YT64^dS1r7r)v3 zdQQr(r|~IPaUTygnh&3OdDz{m^>y!U;Ru>FFHHSg4cn;|)v$Jz_y4-feL#g7Sj}rb z`9nKmt60#C00^CiOscT&l%v(O{2Q-FhaJe!JOWOR;9ifhxuAnm3T}adC(d_4PV_mp zf4`SBog0p=c43~}cx4N=hjfTOgBi7_U;&2NOs0sqjjqvHYyt@u)LlQMG-zCA7*E5m=wc7A7mG09(Vf^@Wz6m|b&sN^Jne_g@ z{r|z<%S^w154M&)ELb!9>Ab3z#ak#XkI@)@rervc{^=rJgi@v4w~dBN2R;xWt*(>E)cguBWAuQzPGRD z?0hHGqOG@gkim#}e6#L8dTaez;Gqq6d!RQqP_=m?Ojq&Vtkv8zqY5ha0vnp0t{Y^( zR&L@U%KU_MQ)EcZ=UgG{ZJGM4O(KWl4=;Bd`?>Kk_VT9zovulMm&zc?EKtiJ}JScFmuh#4hD4JL{ZO8fL^JI@Z3=J{@1o zZt}YL=NCW9t}!(7GO(pBYV=G^b4eiH)yFe`t`MG!)r0%#CU-IUd!%YO>nPQ-|J4aH z=67@7K{&S1o<5d^`5p{JeA1HM7<}JSMsF=-^r`B{dq#V)U-vxJ9D_&?y;pBGq#32= zyKg>+dVLfFLon9!uZ+Ix8sIJf>!n@lKR|626$lbxXfh#AL*JU5gjUQ7$!s4nuY^~EI$b6-T(eXTl^E*3TXEL%2MX4*S2r@; zzjUkq`U{m^CP4A%xxmRo$H1HScCU~Ex2M{r9CSVK;-UK;O?M;WOHB*&KKcajxqhlC zkM8Spo8##|1ab@dWur!Y-iho6PFXq?!?ekbzl_>Mm}u2_sXJD4DHuR1^iN9{kcyEN zeAJz?Fw)8r>OS4~9aZ*+D+LWo&(6u!KNuleQO?Swat(MU3QWiUu*R1!=yD1P1{A1& zBbU?Q=o@)%XISjF67?yyQ%5`73w_|_b^yM(N-4_v!MKBrx#Rs$eNGaZn-sZB&K_f2 zp2?*S#Fh@sGg#-le|~ouj&yYx6N$KK8OU-^7-un~QrCyYA@a;sVoJ=PC_!s~ZQpqh zvmvKD3aF)>`Q|lAV{8rTl?~}c?V)n-oRdE5`zd{YGdLki7Wm|SgzBj$&(eno8&x{D zFBTe~GVd;Yd5+bCBC4uj0koajZ)5{Mev&Y?<>$Bjl`khs`}M35i|@Z`Hspx7S}B;F z7wwBE<=Au;=GDJVE2OqR&Ad}nyr_H|yx5;RTgV})G%MFtTP z(H}@HD68;zp%qvmPAePpzR81x(pHK0W`h$2R2bN zgH{JF0W7S%$}|Qg$n+XgbJcWNK;domuz~t*Fov!=SE#|N$7I|g?cd8GUf&pz>DPFo z?C((?ylFylw}fzyH9Cq|tz^YC9VW@XWNx}fW_=bPgwJO#WNbP{!U9~Q#Vj;G-63%m zqJ{ZSMh=pR?5Cp$I{-qOEbPU# zf%on~F2bprRBJbl!w2In(De5BD7@~_jZj~02 z0~R*y)~d|(uZR7DmR;zJ6oeIoyJN%*Pd*9`{ju8K6-f$H8G$Tu3zYgS*^(Q_sDeoS zlW#UX=2tB-rX7^UWXtiQM-O?Ehu>SZG8Yh@J~X}M8P~{jM4iFE<6P{Ja65UNKucXs zMN`Qq2>Y7OLEdObw(LlTlTMH6>VF1#^36V_jMv+ussvS+^2=0eQhUBcxCOgP)|lq#Vdc%5<^MUV?*#{w%*?OE}+w>v=Wy zUhf6x%Z1Y~E~aemxoYY9U@eO(p5FAABUw@q!H|0H%N7~e^A^zqhEdKD58}`wzJp{y_Ox|1{o-j>_^w#x(x}R zq>74`uQ&*^5aax_HH3Im$!_DvXx~^OV&nT9t2wSlX-DRENm%K=4)2Fo;A}(~g_1H$ZDwt9dbyzD*0-k+ z&V*%Sb4J;G?fTVk+`rW6h}j<7A1Rn*=_+u$HxjQboTRfM67$uh+$gOR-73Hxu0ZuY|yLW5o>oP ztV;Q*>id^%tx1j?%f??hLCy%LV!o5^UeEu8K`kX>!!SuWm1G@tgY+{BL}Vh8w{?Ke z(x=@H(MeOT&lpaUh}OQ!HQC+-TIq z-iVj1lpe(wDLQAUB9-5|R&v1eXyZ3ptwzN1@6yb(5#JojKIibFw8;L+LtIr#7KDTbw5e@pBR`Y6wm5JkjA6|(yu6d3~ zI||q?nDf`BP%$f5W=bzDKfdet!eV@~^KbLPxeZ8}>y7YUWvT)D_35oR#MPj41c7)y XA0EVJ*=ln0cPemS+gPhs0}=UuD=#_J literal 14926 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 G5&sA9JmfV1 diff --git a/core/src/main/assets/messages/scenes/scenes.properties b/core/src/main/assets/messages/scenes/scenes.properties index 97d1310ec..f0b09d250 100644 --- a/core/src/main/assets/messages/scenes/scenes.properties +++ b/core/src/main/assets/messages/scenes/scenes.properties @@ -62,7 +62,7 @@ scenes.heroselectscene.daily=Daily Run scenes.heroselectscene.daily_desc=Every day a new game is available that is the same for everyone! This 'daily run' generates the same dungeon for every person who plays it (so long as they are also playing the same game version).\n\nYou can take as long as you like to complete a daily run, but can only have one active at a time. _Daily runs are not eligible for badges and have their own separate rankings page._\n\nWould you like to start today's daily with your currently selected hero and challenges? scenes.heroselectscene.daily_yes=Yes scenes.heroselectscene.daily_no=No -scenes.heroselectscene.daily_unavailable=A new daily run is available every day at midnight UTC +scenes.heroselectscene.daily_repeat=You have already played today's daily. You can replay it if you like, but only as an unranked practice run.\n\nAfter you complete the replay, you will be able to view it from the daily rankings window for a short time before the record is deleted.\n\nWould you like to replay today's daily with your currently selected hero and challenges? scenes.heroselectscene.daily_unavailable_long=It seems you've started a daily that's in the future! This can happen if you recently changed timezones, or if you changed your system clock. _Your next daily will be available in %d days._ scenes.heroselectscene.daily_existing=You already have a daily run in progress. You must end that run before starting another daily. scenes.heroselectscene.custom_seed_title=Enter a Custom Seed diff --git a/core/src/main/assets/messages/windows/windows.properties b/core/src/main/assets/messages/windows/windows.properties index d89990125..312e536cc 100644 --- a/core/src/main/assets/messages/windows/windows.properties +++ b/core/src/main/assets/messages/windows/windows.properties @@ -54,6 +54,7 @@ windows.wndgameinprogress.depth=Maximum Depth windows.wndgameinprogress.dungeon_seed=Dungeon Seed windows.wndgameinprogress.custom_seed=_Custom Seed_ windows.wndgameinprogress.daily_for=_Daily For_ +windows.wndgameinprogress.replay_for=_Replay For_ windows.wndgameinprogress.continue=Continue windows.wndgameinprogress.erase=Erase windows.wndgameinprogress.erase_warn_title=Are you sure you want to delete this save? @@ -73,6 +74,7 @@ windows.wndhero$statstab.depth=Maximum Depth windows.wndhero$statstab.dungeon_seed=Dungeon Seed windows.wndhero$statstab.custom_seed=_Custom Seed_ windows.wndhero$statstab.daily_for=_Daily For_ +windows.wndhero$statstab.replay_for=_Replay For_ windows.wndheroinfo.talents=talents windows.wndheroinfo.talents_msg=The hero gains one talent point each time they level up. Higher tier talents appear after defeating the second boss. @@ -177,6 +179,7 @@ windows.wndranking$statstab.ascent=Highest Ascent windows.wndranking$statstab.seed=Dungeon Seed windows.wndranking$statstab.custom_seed=_Custom Seed_ windows.wndranking$statstab.daily_for=_Daily For_ +windows.wndranking$statstab.replay_for=_Replay For_ windows.wndranking$statstab.enemies=Mobs Killed windows.wndranking$statstab.gold=Gold Collected windows.wndranking$statstab.food=Food Eaten diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java index 2a586f169..a77b01184 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java @@ -194,6 +194,7 @@ public class Dungeon { public static int version; public static boolean daily; + public static boolean dailyReplay; public static String customSeedText = ""; public static long seed; @@ -518,6 +519,7 @@ public class Dungeon { private static final String SEED = "seed"; private static final String CUSTOM_SEED = "custom_seed"; private static final String DAILY = "daily"; + private static final String DAILY_REPLAY= "daily_replay"; private static final String CHALLENGES = "challenges"; private static final String MOBS_TO_CHAMPION = "mobs_to_champion"; private static final String HERO = "hero"; @@ -542,6 +544,7 @@ public class Dungeon { bundle.put( SEED, seed ); bundle.put( CUSTOM_SEED, customSeedText ); bundle.put( DAILY, daily ); + bundle.put( DAILY_REPLAY, dailyReplay ); bundle.put( CHALLENGES, challenges ); bundle.put( MOBS_TO_CHAMPION, mobsToChampion ); bundle.put( HERO, hero ); @@ -619,7 +622,7 @@ public class Dungeon { saveGame( GamesInProgress.curSlot ); saveLevel( GamesInProgress.curSlot ); - GamesInProgress.set( GamesInProgress.curSlot, depth, challenges, seed, customSeedText, daily, hero ); + GamesInProgress.set( GamesInProgress.curSlot ); } } @@ -644,6 +647,7 @@ public class Dungeon { seed = bundle.contains( SEED ) ? bundle.getLong( SEED ) : DungeonSeed.randomSeed(); customSeedText = bundle.getString( CUSTOM_SEED ); daily = bundle.getBoolean( DAILY ); + dailyReplay = bundle.getBoolean( DAILY_REPLAY ); Actor.clear(); Actor.restoreNextID( bundle ); @@ -779,6 +783,7 @@ public class Dungeon { info.seed = bundle.getLong( SEED ); info.customSeed = bundle.getString( CUSTOM_SEED ); info.daily = bundle.getBoolean( DAILY ); + info.dailyReplay = bundle.getBoolean( DAILY_REPLAY ); Hero.preview( info, bundle.getBundle( HERO ) ); Statistics.preview( info, bundle ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/GamesInProgress.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/GamesInProgress.java index 21d6770f2..1746e7295 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/GamesInProgress.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/GamesInProgress.java @@ -126,28 +126,28 @@ public class GamesInProgress { } } - public static void set(int slot, int depth, int challenges, long seed, String customSeed, boolean daily, - Hero hero) { + public static void set(int slot) { Info info = new Info(); info.slot = slot; - info.depth = depth; - info.challenges = challenges; + info.depth = Dungeon.depth; + info.challenges = Dungeon.challenges; - info.seed = seed; - info.customSeed = customSeed; - info.daily = daily; + info.seed = Dungeon.seed; + info.customSeed = Dungeon.customSeedText; + info.daily = Dungeon.daily; + info.dailyReplay = Dungeon.dailyReplay; - info.level = hero.lvl; - info.str = hero.STR; - info.strBonus = hero.STR() - hero.STR; - info.exp = hero.exp; - info.hp = hero.HP; - info.ht = hero.HT; - info.shld = hero.shielding(); - info.heroClass = hero.heroClass; - info.subClass = hero.subClass; - info.armorTier = hero.tier(); + info.level = Dungeon.hero.lvl; + info.str = Dungeon.hero.STR; + info.strBonus = Dungeon.hero.STR() - Dungeon.hero.STR; + info.exp = Dungeon.hero.exp; + info.hp = Dungeon.hero.HP; + info.ht = Dungeon.hero.HT; + info.shld = Dungeon.hero.shielding(); + info.heroClass = Dungeon.hero.heroClass; + info.subClass = Dungeon.hero.subClass; + info.armorTier = Dungeon.hero.tier(); info.goldCollected = Statistics.goldCollected; info.maxDepth = Statistics.deepestFloor; @@ -173,7 +173,8 @@ public class GamesInProgress { public long seed; public String customSeed; public boolean daily; - + public boolean dailyReplay; + public int level; public int str; public int strBonus; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Rankings.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Rankings.java index 3f1cdb0f4..d8a32b9de 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Rankings.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Rankings.java @@ -68,6 +68,7 @@ public enum Rankings { public int localWon; public Record latestDaily; + public Record latestDailyReplay = null; //not stored, only meant to be temp public LinkedHashMap dailyScoreHistory = new LinkedHashMap<>(); public void submit( boolean win, Class cause ) { @@ -99,6 +100,11 @@ public enum Rankings { rec.gameID = UUID.randomUUID().toString(); if (rec.daily){ + if (Dungeon.dailyReplay){ + latestDailyReplay = rec; + return; + } + latestDaily = rec; if (Dungeon.seed <= DungeonSeed.TOTAL_SEEDS) { dailyScoreHistory.put(Dungeon.seed, rec.score); @@ -215,6 +221,7 @@ public enum Rankings { public static final String SEED = "seed"; public static final String CUSTOM_SEED = "custom_seed"; public static final String DAILY = "daily"; + public static final String DAILY_REPLAY = "daily_replay"; public void saveGameData(Record rec){ rec.gameData = new Bundle(); @@ -276,6 +283,7 @@ public enum Rankings { rec.gameData.put( SEED, Dungeon.seed ); rec.gameData.put( CUSTOM_SEED, Dungeon.customSeedText ); rec.gameData.put( DAILY, Dungeon.daily ); + rec.gameData.put( DAILY_REPLAY, Dungeon.dailyReplay ); } public void loadGameData(Record rec){ @@ -314,10 +322,11 @@ public enum Rankings { Dungeon.seed = rec.gameData.getLong(SEED); Dungeon.customSeedText = rec.gameData.getString(CUSTOM_SEED); Dungeon.daily = rec.gameData.getBoolean(DAILY); + Dungeon.dailyReplay = rec.gameData.getBoolean(DAILY_REPLAY); } else { Dungeon.seed = -1; Dungeon.customSeedText = ""; - Dungeon.daily = false; + Dungeon.daily = Dungeon.dailyReplay = false; } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/HeroSelectScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/HeroSelectScene.java index 3e3a4e8f7..302f847c0 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/HeroSelectScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/HeroSelectScene.java @@ -29,7 +29,6 @@ import com.shatteredpixel.shatteredpixeldungeon.Rankings; import com.shatteredpixel.shatteredpixeldungeon.SPDSettings; import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroClass; -import com.shatteredpixel.shatteredpixeldungeon.journal.Document; import com.shatteredpixel.shatteredpixeldungeon.journal.Journal; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.ui.ActionIndicator; @@ -126,7 +125,7 @@ public class HeroSelectScene extends PixelScene { if (GamesInProgress.selectedClass == null) return; Dungeon.hero = null; - Dungeon.daily = false; + Dungeon.daily = Dungeon.dailyReplay = false; ActionIndicator.action = null; InterlevelScene.mode = InterlevelScene.Mode.DESCEND; @@ -434,12 +433,8 @@ public class HeroSelectScene extends PixelScene { super.onClick(); long diff = (SPDSettings.lastDaily() + DAY) - Game.realTime; - if (diff > 0){ - if (diff > 30*HOUR){ - ShatteredPixelDungeon.scene().addToFront(new WndMessage(Messages.get(HeroSelectScene.class, "daily_unavailable_long", (diff / DAY)+1))); - } else { - ShatteredPixelDungeon.scene().addToFront(new WndMessage(Messages.get(HeroSelectScene.class, "daily_unavailable"))); - } + if (diff > 24*HOUR){ + ShatteredPixelDungeon.scene().addToFront(new WndMessage(Messages.get(HeroSelectScene.class, "daily_unavailable_long", (diff / DAY)+1))); return; } @@ -451,23 +446,31 @@ public class HeroSelectScene extends PixelScene { } Image icon = Icons.get(Icons.CALENDAR); - icon.hardlight(0.5f, 1f, 2f); + if (diff <= 0) icon.hardlight(0.5f, 1f, 2f); + else icon.hardlight(1f, 0.5f, 2f); ShatteredPixelDungeon.scene().addToFront(new WndOptions( icon, Messages.get(HeroSelectScene.class, "daily"), - Messages.get(HeroSelectScene.class, "daily_desc"), + diff > 0 ? + Messages.get(HeroSelectScene.class, "daily_repeat") : + Messages.get(HeroSelectScene.class, "daily_desc"), Messages.get(HeroSelectScene.class, "daily_yes"), Messages.get(HeroSelectScene.class, "daily_no")){ @Override protected void onSelect(int index) { if (index == 0){ - long time = Game.realTime - (Game.realTime % DAY); + if (diff <= 0) { + long time = Game.realTime - (Game.realTime % DAY); - //earliest possible daily for v1.3.0 is June 20 2022 - //which is 19,163 days after Jan 1 1970 - time = Math.max(time, 19_163 * DAY); + //earliest possible daily for v1.4.0 is Sept 10 2022 + //which is 19,245 days after Jan 1 1970 + time = Math.max(time, 19_245 * DAY); - SPDSettings.lastDaily(time); + SPDSettings.lastDaily(time); + Dungeon.dailyReplay = false; + } else { + Dungeon.dailyReplay = true; + } Dungeon.hero = null; Dungeon.daily = true; @@ -500,11 +503,9 @@ public class HeroSelectScene extends PixelScene { } else { text(dateFormat.format(new Date(diff))); } - textColor(0x888888); timeToUpdate = Game.realTime + SECOND; } else { text(Messages.get(HeroSelectScene.class, "daily")); - textColor(0xFFFFFF); timeToUpdate = Long.MAX_VALUE; } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/RankingsScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/RankingsScene.java index ae605947c..cc4cbfa91 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/RankingsScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/RankingsScene.java @@ -173,7 +173,7 @@ public class RankingsScene extends PixelScene { public void destroy() { super.destroy(); //so that opening daily records does not trigger WndDailies opening on future visits - Dungeon.daily = false; + Dungeon.daily = Dungeon.dailyReplay = false; } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/StartScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/StartScene.java index f0bd4bfaa..ff5cfa367 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/StartScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/StartScene.java @@ -204,7 +204,11 @@ public class StartScene extends PixelScene { } if (info.daily){ - steps.hardlight(0.5f, 1f, 2f); + if (info.dailyReplay){ + steps.hardlight(1f, 0.5f, 2f); + } else { + steps.hardlight(0.5f, 1f, 2f); + } } else if (!info.customSeed.isEmpty()){ steps.hardlight(1f, 1.5f, 0.67f); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/TitleScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/TitleScene.java index 27c076c12..9232b26ca 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/TitleScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/TitleScene.java @@ -146,7 +146,7 @@ public class TitleScene extends PixelScene { }; btnRankings.icon(Icons.get(Icons.RANKINGS)); add(btnRankings); - Dungeon.daily = false; + Dungeon.daily = Dungeon.dailyReplay = false; StyledButton btnBadges = new StyledButton(GREY_TR, Messages.get(this, "badges")){ @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/WelcomeScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/WelcomeScene.java index e56670eef..6aca7dbf9 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/WelcomeScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/WelcomeScene.java @@ -280,7 +280,7 @@ public class WelcomeScene extends PixelScene { FileUtils.deleteFile( Rankings.RANKINGS_FILE ); ShatteredPixelDungeon.reportException(e); } - Dungeon.daily = false; + Dungeon.daily = Dungeon.dailyReplay = false; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Icons.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Icons.java index 58e86d566..9fe54d1f4 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Icons.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Icons.java @@ -311,36 +311,28 @@ public enum Icons { icon.frame( icon.texture.uvRectBySize( 40, 72, 8, 8 ) ); break; case DEPTH: - int ofs = Dungeon.daily ? 16 : (!Dungeon.customSeedText.isEmpty() ? 8 : 0); - icon.frame( icon.texture.uvRectBySize( 48, 64 + ofs, 6, 7 ) ); + icon.frame( icon.texture.uvRectBySize( 48, 64 + runTypeOfs(), 6, 7 ) ); break; case DEPTH_CHASM: - ofs = Dungeon.daily ? 16 : (!Dungeon.customSeedText.isEmpty() ? 8 : 0); - icon.frame( icon.texture.uvRectBySize( 56, 64 + ofs, 7, 7 ) ); + icon.frame( icon.texture.uvRectBySize( 56, 64 + runTypeOfs(), 7, 7 ) ); break; case DEPTH_WATER: - ofs = Dungeon.daily ? 16 : (!Dungeon.customSeedText.isEmpty() ? 8 : 0); - icon.frame( icon.texture.uvRectBySize( 64, 64 + ofs, 7, 7 ) ); + icon.frame( icon.texture.uvRectBySize( 64, 64 + runTypeOfs(), 7, 7 ) ); break; case DEPTH_GRASS: - ofs = Dungeon.daily ? 16 : (!Dungeon.customSeedText.isEmpty() ? 8 : 0); - icon.frame( icon.texture.uvRectBySize( 72, 64 + ofs, 7, 7 ) ); + icon.frame( icon.texture.uvRectBySize( 72, 64 + runTypeOfs(), 7, 7 ) ); break; case DEPTH_DARK: - ofs = Dungeon.daily ? 16 : (!Dungeon.customSeedText.isEmpty() ? 8 : 0); - icon.frame( icon.texture.uvRectBySize( 80, 64 + ofs, 7, 7 ) ); + icon.frame( icon.texture.uvRectBySize( 80, 64 + runTypeOfs(), 7, 7 ) ); break; case DEPTH_LARGE: - ofs = Dungeon.daily ? 16 : (!Dungeon.customSeedText.isEmpty() ? 8 : 0); - icon.frame( icon.texture.uvRectBySize( 88, 64 + ofs, 7, 7 ) ); + icon.frame( icon.texture.uvRectBySize( 88, 64 + runTypeOfs(), 7, 7 ) ); break; case DEPTH_TRAPS: - ofs = Dungeon.daily ? 16 : (!Dungeon.customSeedText.isEmpty() ? 8 : 0); - icon.frame( icon.texture.uvRectBySize( 96, 64 + ofs, 7, 7 ) ); + icon.frame( icon.texture.uvRectBySize( 96, 64 + runTypeOfs(), 7, 7 ) ); break; case DEPTH_SECRETS: - ofs = Dungeon.daily ? 16 : (!Dungeon.customSeedText.isEmpty() ? 8 : 0); - icon.frame( icon.texture.uvRectBySize( 104, 64 + ofs, 7, 7 ) ); + icon.frame( icon.texture.uvRectBySize( 104, 64 + runTypeOfs(), 7, 7 ) ); break; case CHAL_COUNT: icon.frame( icon.texture.uvRectBySize( 112, 64, 7, 7 ) ); @@ -381,6 +373,20 @@ public enum Icons { } return icon; } + + private static int runTypeOfs(){ + if (Dungeon.daily){ + if (Dungeon.dailyReplay){ + return 24; + } else { + return 16; + } + } else if (!Dungeon.customSeedText.isEmpty()){ + return 8; + } else { + return 0; + } + } public static Image get( HeroClass cl ) { switch (cl) { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndDailies.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndDailies.java index 474b67a43..55c35a24e 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndDailies.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndDailies.java @@ -62,6 +62,24 @@ public class WndDailies extends Window { title.setPos(0, 0); content.add(title); + if (Rankings.INSTANCE.latestDailyReplay != null){ + IconButton replayInfo = new IconButton(Icons.get(Icons.CALENDAR)){ + @Override + protected void onClick() { + ShatteredPixelDungeon.scene().addToFront(new WndRanking(Rankings.INSTANCE.latestDailyReplay)); + } + + @Override + protected void onPointerUp() { + super.onPointerUp(); + icon.hardlight(1f, 0.5f, 2f); + } + }; + replayInfo.icon().hardlight(1f, 0.5f, 2f); + replayInfo.setRect(WIDTH-16, 0, 16, 16); + add(replayInfo); + } + int top = (int)title.bottom()+3; RenderedTextBlock day = PixelScene.renderTextBlock(Messages.get(this, "date"), 7); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndGameInProgress.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndGameInProgress.java index 7b4a65fec..9a46d4b8f 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndGameInProgress.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndGameInProgress.java @@ -104,7 +104,11 @@ public class WndGameInProgress extends Window { statSlot( Messages.get(this, "gold"), info.goldCollected ); statSlot( Messages.get(this, "depth"), info.maxDepth ); if (info.daily) { - statSlot( Messages.get(this, "daily_for"), "_" + info.customSeed + "_" ); + if (info.dailyReplay) { + statSlot(Messages.get(this, "replay_for"), "_" + info.customSeed + "_"); + } else { + statSlot(Messages.get(this, "daily_for"), "_" + info.customSeed + "_"); + } } else if (!info.customSeed.isEmpty()){ statSlot( Messages.get(this, "custom_seed"), "_" + info.customSeed + "_" ); } else { @@ -121,7 +125,7 @@ public class WndGameInProgress extends Window { GamesInProgress.curSlot = slot; Dungeon.hero = null; - Dungeon.daily = false; + Dungeon.daily = Dungeon.dailyReplay = false; ActionIndicator.action = null; InterlevelScene.mode = InterlevelScene.Mode.CONTINUE; ShatteredPixelDungeon.switchScene(InterlevelScene.class); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndHero.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndHero.java index a3d480278..291a0f374 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndHero.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndHero.java @@ -186,7 +186,11 @@ public class WndHero extends WndTabbed { statSlot( Messages.get(this, "gold"), Statistics.goldCollected ); statSlot( Messages.get(this, "depth"), Statistics.deepestFloor ); if (Dungeon.daily){ - statSlot( Messages.get(this, "daily_for"), "_" + Dungeon.customSeedText + "_" ); + if (!Dungeon.dailyReplay) { + statSlot(Messages.get(this, "daily_for"), "_" + Dungeon.customSeedText + "_"); + } else { + statSlot(Messages.get(this, "replay_for"), "_" + Dungeon.customSeedText + "_"); + } } else if (!Dungeon.customSeedText.isEmpty()){ statSlot( Messages.get(this, "custom_seed"), "_" + Dungeon.customSeedText + "_" ); } else { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndRanking.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndRanking.java index 09e2b2c0b..b5cd6df58 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndRanking.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndRanking.java @@ -194,7 +194,11 @@ public class WndRanking extends WndTabbed { } if (Dungeon.seed != -1) { if (Dungeon.daily){ - pos = statSlot(this, Messages.get(this, "daily_for"), "_" + Dungeon.customSeedText + "_", pos); + if (Dungeon.dailyReplay) { + pos = statSlot(this, Messages.get(this, "replay_for"), "_" + Dungeon.customSeedText + "_", pos); + } else { + pos = statSlot(this, Messages.get(this, "daily_for"), "_" + Dungeon.customSeedText + "_", pos); + } } else if (!Dungeon.customSeedText.isEmpty()){ pos = statSlot(this, Messages.get(this, "custom_seed"), "_" + Dungeon.customSeedText + "_", pos); } else { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndStartGame.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndStartGame.java index 29ea36273..8f831bbd1 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndStartGame.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndStartGame.java @@ -94,7 +94,7 @@ public class WndStartGame extends Window { GamesInProgress.curSlot = slot; Dungeon.hero = null; - Dungeon.daily = false; + Dungeon.daily = Dungeon.dailyReplay = false; ActionIndicator.action = null; InterlevelScene.mode = InterlevelScene.Mode.DESCEND;