From a1a11426512f6983d782b2b630c2398bf3e8f8c1 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Thu, 2 Nov 2023 03:56:01 +0800 Subject: [PATCH] Refactor: Abstract DungeonState class to be shared in rogue --- .../share/dungeon/state/OCR_SIMUNI_POINT.png | Bin 0 -> 18544 bytes .../OCR_SIMUNI_POINT_OFFSET.SEARCH.png | Bin .../{ui => state}/OCR_SIMUNI_POINT_OFFSET.png | Bin assets/share/dungeon/state/OCR_STAMINA.png | Bin 0 -> 28538 bytes assets/share/dungeon/ui/OCR_SIMUNI_POINT.png | Bin 16420 -> 0 bytes tasks/dungeon/assets/assets_dungeon_state.py | 35 +++++ tasks/dungeon/assets/assets_dungeon_ui.py | 20 --- tasks/dungeon/state.py | 122 ++++++++++++++++++ tasks/dungeon/ui.py | 40 +----- 9 files changed, 161 insertions(+), 56 deletions(-) create mode 100644 assets/share/dungeon/state/OCR_SIMUNI_POINT.png rename assets/share/dungeon/{ui => state}/OCR_SIMUNI_POINT_OFFSET.SEARCH.png (100%) rename assets/share/dungeon/{ui => state}/OCR_SIMUNI_POINT_OFFSET.png (100%) create mode 100644 assets/share/dungeon/state/OCR_STAMINA.png delete mode 100644 assets/share/dungeon/ui/OCR_SIMUNI_POINT.png create mode 100644 tasks/dungeon/assets/assets_dungeon_state.py create mode 100644 tasks/dungeon/state.py diff --git a/assets/share/dungeon/state/OCR_SIMUNI_POINT.png b/assets/share/dungeon/state/OCR_SIMUNI_POINT.png new file mode 100644 index 0000000000000000000000000000000000000000..51bf72943a53422e27f0e8a65892184a664516f8 GIT binary patch literal 18544 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 U8METQZ{auVySK16fB*A;0ci53%K!iX literal 0 HcmV?d00001 diff --git a/assets/share/dungeon/ui/OCR_SIMUNI_POINT.png b/assets/share/dungeon/ui/OCR_SIMUNI_POINT.png deleted file mode 100644 index 540d04be7e6e1c31e3387d3661bdf730444646a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16420 zcmeIY_g7Qt7d{$w>=aQ1r7DalA|OiW#Th`FfP~%^q=jBWXbC!w6cG>!AYFkFLkS`! zApxS&6a<7oC?RwR5R%XXgurFK_uhZu{&GKA>#X;zwa;2P?{ju}_Osul$L5B-=S0o{ z003TNBYhA6aPsK(`0q2vkCq3LCdZDJv%y9VVF1ASOaEQR0J-^B0DyC5zIu9(ANvG_ z2Zi|r1z$7P)4LWN8sz2c?+E}zjuluz?K9XyI+JWqe%rrCR%^2TUjU?}E6@D6;81+w z9pLG|7cM?%f0cO7R`9YwzL8DaKSSq?3KC~N+`@VP^*Yfp*~VFoDLIa+hefj(49+m8 ziIz{>?~Ur?e=cxQCVin83{VHX($W}_OtUa*``P^b_+_K1KdxO^=>G0~vK;_eJrNZN z5C5#Yf2=wPa2yakr10m(&gsLK_{TDKfNSZ1DXELJ^T*zT06!G0e+UA8TmgKxs(p42 zfB*peqhkM-0+jOtRyK`wP69^I8RNo$kzz6Q89>T0K+Y}0KaW2k0G`;q0NpwM^*i80 z+gqeM?)In_lpu`Lj0Lix2!(gQRq>uT35_y*d5|;DUJ{Ys_tao_r#>^Vnwy z(GTqe7_$ZVOzyher=0!Zcj5Qt6%dm9AgAhU$xCj?)4&J}D3#Xz$KOhUY?|~z=c_nws%-y^a*gwy%dgk$ zlW>ov%sQhQLFxL}e`d~HT#CE5CYi-On*rqoRK{C;HE%dw-|hbu&OCNJna_S80`LI7 zA^%3?d^+HQxAMIxHUN-8+)aBRcMQ;zT{;T@G%a3n{)7;I)Nuv?(Esq__UFG&^L!Jm z{K}XAO}y!=@bRao^dIp2`Bm$}->2rDi=F#;CF`%N)?YP7{;2!>2-}n0r%7qsopcfIjMh0JvCB(_q_DlQlg-x zRQr$6(&OmA!RanW((Ce}g6b*G5BA3`F{x^=9;`^P2>NCrS1qGMz#m^Y%d7 zG@ysLy=uf|(XWM1S!ez{p8WjM${E*xFMRj^=j~fV`$zVApKh#3*ImS)u{-}NzV zk}tI?)fu?poBv3L{x;y}#N3%L&nvHGr(@spzqNSB`Pn*$71U@?oOyJ%_)kzN;-U%A zQ+NIkWYN99b3T+?_Mi&~&y*)>6ge6Pe293gXqAAzqzuWu(UT{n*Ig=KGW0vw*V~uv zqqr1~KTCZnVUYbhd%$n;^b&39Ew5feO zi#|IjR564Ww;`ZaFufosDD82drCUjh8~2|*58f~FuO5DgH!89Az;;|sxh~Xk&vVWG zZ*r*Z3Hlws_h#-+Uv^g>MV#b_MkvNSveFAH_p0O61+P*aiymtkb7zDygc$TO79_afLBXAZEsX#THsmZ`1#gLeg{MIJ zmUT!T^r)q?TU}dxOVobDt$@vvE#YMrnbj|;dRO_3%G;~{N@^afzutN*`n~tX^{@Ur z{YjwP2cO>NQ_^o-auX-ROz@rsMhfeARR)QCib|6kU|iQr03hsof$CC&P2#r}qmvntR>cv>oDf)Vk1``N=28z8#xC*8D=`MePZ{ z6Ow=A{DC|TJehKma7vL!=knh?XL%hYLoR=i>{j|wyszqI~u z-YW}(mg1CR%Ni`sMC;u`fo+X6N%m+`^2Vx!X|eR#d>)*n|nTi$OP{m(l|(*$%{NlVmOB0wxbK;T)J(!RTbEl zQJFC^kqV93;Cm^4S#yGgSZS)4i?s7=Hh^sf4lw_rrir+V;)x4zD$WpU(O#GqgN!-7 zZNQ>~!-M?CtBJ%fX9GYgDH28+!Si{~gU0e0xzPGx$J>10|C;}HbFwTpX7=&o$KKZQ z)}G0nIPBILx>1zefCdp#DPI!sLHlDfYw=Ahl2C9ObGQj}MudHq>$#x&{+>QY}9-1abv9#%n{XTc28!+OX@cbnJuzPs4E&%|Ly8yuQ697QtJpdpa^vXd;Tj*{H=u7a|t+S)gN@jL+hVf40Gf9+b5)D4MJqtZvqb8W9P ze`Jbk8aKYPX0G#YUd?x&yDe;74#FTjZSG|MnNhAL=nGPAEqRn)r~kIt=+d=B(v!O= zX7gly=vpC^4R~S_Z198CDI5HoTL>-jI$+h3Yo(4}_kBLJ>cw4mEp@N{< zLbAxwkING-gUmCswmspZF<7gvb@%w7VGT`JN9Wy~xUu27L#kN6vbVppG&m_h)HC9r z-IBya1UPPDY_fe*d7)39-@pJTp*>?r4IT1PFNLu%} zs`JmmfR#KjGtuUL0fA7C04E9F0Hs=UlF^We0cCC4SiocH^KkH2YYWddsvEn3BKB9$OfN-lRR zVGqRk98hxAmZoOAo6=QW+2x(S_EWwGNzj`nzULVAWdpB%PixS_t6Z285~1uzG}L?T zX(p|z%;<(xpM+yJgC70^k3(yX`!I-BoqndkK^edwPXLkXdhR(=JqTGZv5 zd-!bG>j8MfVu|Ddk2B7t#EIeGd8Q;Uj%PT$9s?(*qE?hA+GbWDix|jSA|7RDQgs7Vz!2gRQz=C2e&v)= z)uCLIBu6W|12gZqI**ltnZU6ahZ@!6`-AjXvX}WSf<*o*Kv~Y9bU%bgL`eXST>&f{ zi8rY{X^3pN# zQh(7}thq45PamPyB-r!q&L@;-k`BLj7x#4bdTcZhaQrS{T<%2Qm*4k3lN0SF+p70F zm)0|D-#wug<&8D629|YqQ%r|d`-WopO{%&-+eja{@jnqitxL29O?4kL|^G1Z0qe%_e>*j0UbAeUf24C@!A{&2>yTA%`_wOehkYx>^RHBgQ z2;S{^RgI6MEv>JiyA)`kFA;Cc|1?(2TKmx6Pa|w#{UE@g^wa!cpB~%m>3vR&tpR}k z-@w8Qa&s|n2FB9FMZ&>fIlsAd)#iGg-OP;E@Zf4d<07B9_vsbHGP-#Apdm^G4P&J& zBNq3@A?0gZOFx{mH;UPN>OkKdWcQca&A0anlQcwbS%arZa|FU}J))hv#kGO!2#>ewn6bhKIE+c@^2x~a3Q)WlYc zk8LtwL-(+k|6r&SyEWE>-MHPx&{wSUP(qG(`ke{=54j8M52He{mRV^fJSS)KlhS`#1gfOa;%0 z_t^p(Ub}cod0KYN4f4Ixy=FgSrJ!%X35%)_{ORy~_;a8X2%QdcJ4hLAmEb^!G&lfy zFbfhP+*%!yhuD@5P~YMa*3E)!8+pf+-DL|u0GxU*dHYnK(3=7~%|5p`hLd%P!bN-g zDM30dF}K|O+-s(m?^~4i9fTC1z6=us!{(={3S*>#)a47)LiNp_C+4DWhZSBOr`1n} zKMZd+95?51v$LYM-$3FyuVUieea#gicv(vCMb}h&d5XB=o*knAK3a?KJ=awKh`*|L zeQrd~FaPW~_x6nlf@2qYB)>QEAu0@(y^cC$2ztaUBD{J!x652i35d2a(Lc z&M%YS@nrj|+0`e9t{wBCc4oQIx$=xl#Ml9N#8Kic2d!?>Q##RaaSD-M?^NO1|k0@HkJ zQeWJXDyAAx6jEW+v9)pp(u=T=cN(Ibv0ne8QJ_%$QlE7}eG66t*0FD5f8wLk(9*}> zwIA&I_y)`-4hLM9AlT%L41)_)!e^O+p)igFyI|YvWMANP_<3f{cMUl7R}u0dA+J8V zu%1}noy*dCnSF7q)O0FY1nQ{2fEdGR7p)QOw<3L%s4f=j9-)w~kd2>_%T9XD+KOf8 z*nRTt#n&B$-&Gv+0S*rqkMn-@`^$t>uGM(ewhS#GtCEl`Zz>wl=*^k~#b1V=qC?7~ zs@sEBJhMdBvLr2Niu%5@d2yC$tit9`7A7HUp_8e8gk(*umq$7M>JSk$GXM*j2WzOk zLCnnk>56kLii@bZ6)5p#24QX&!f+9V(s7cKA7B6hmfwNFQt0jy3a3e0N~ULoE66?ywD zxxLH6g@H}UH5m)nZUr%H)uNNqTL~&shUVRuhTF@Vs3c8wQrb2g5P4!v+Xec3)71CvVaX16EAZM|u3*&mwiJ22MH=G$AUl;!JdU!x{o zlx^p-I}_s6-Kdil@M$@yE_W&VE#J1S?`_YT3D#1n-SXzyR8l-4E^GAWP(yvdo>YW5 z)YyBomw7L&Hzovgub0=31Xn z!0p)>G5YmmXTAbfTW?Hjl@dfMhTvp*NSEi5^~DL+G(rk_t6x}@YbDj;LCjA2=6OluYz0;)QwDh& zgMn|Tk~($PX6~mI1r;yd%qAPjPORGR{Z>SU8FGe;?3Q3Gou<$&rey49$E)pi91Kbf zio63`ZCx5~yuTgIBJfo^H*ylt& zBC^Xy?7j7H-m=)#02IEl#aBg(&@1ut&NFgi15Y0E`f){45c_(=jZoe5SXMSr;a5z# z<;aW&gRgehk@-XunfmPvF*1|g;Dw8UiQo6^(FUhy|m4+G~I(yVT`gc?X*ws&ezi$ zLHpjjTWMu>xF0>QlGo@&b>yVT+W2{bcQvb{)m04)rw2`DOW;~6xUuv39<@h4w1mGEl< z7T2Kz2suaPrjcyDoE_e4Mculr&8<| za&eKS2aM|aYMSCfE-bYkAUaWO|Rx--( zb>h*E57r5tL7I`luHDTn@P1p2t3%nj_`K?Pu#5Hu^WRo=}-;d1JeXP5Be(i@|MPlTkh3ig+ zqP7D|Vyk`OA`9MEH!K-<@G32ixqxh-RP4_vmKjRA8npEt4z^psmXbm_pOUN-vVLq0 zCfI-`5Ab#AwzX@&x;yXnu9 z#4eOt3X_~War1|)~W2htbojv{0+P#C#QMD5y+tIBrPakRhjwJ|q2-+G&Q_1q!XaYES zs4CA))cYRfyNk8B#`8Frh@T^>TVy1drhwun>`)2SidG?xy<*JN46isn6Li+St%ySS z$Z}m>5YNeFRM8vi&%vegZc5{lqD)_I9fZc{t^b)GRw~H2*KuNXxc7n&!1WR{-O~*` z#*i}?vC2St)|tuXLUa!rAI5GFI)yjdKT<(Oh}5)Mk2oB6bJ(?s*ch!YnSZr&!(T9v z(s60he2uYz%$mi=w0@hO`G-{ZJEY3v&o^E})fhnm)gUZ=aI>Hgq_0mgPZq5nZd|}f z<=J*O=Z?>BU9nQKXIj3Z|pJ(?Z&t;5f|r9cteU)J8* zh5b6^(U)t^<~GOIjG{Z#)>Ki62t1kWX-|^{uZ$hkpcY?7SJeb~G{2Tf*gyXtmFSKi zw3_uJb^kGiCo&Lm+gPzvYh}A2RiM<&{wuY(>rykC7Gk<_F!lpgUTDOsuv?~cmr);{VlaecCF^pST8JaWlwNHf# zp)4BejT;AlGzNu_*Y7OPiKT<(EyL!Th<5swxjv?KdO@F`Ru59mQ`^Vd%~HK^Bqs2i zb%g~?4jomEZtv9Od;+IvLTC5;-5)p&qrjPL;fG!QhCOxr*K>+A!2VF!D)T!S`#o4f zr%dNI3eFQj;t_U`R<)D{rREpcaigFC2$2fq`sd6-8~qiN!#@dmJ?f65|EEXGhHC6F zFVkHWG%bi0Y>h~h?#gl4?!hp!HB3O@kcO&u`2aF9q=*c0-^7u% zInvFW*s$840_p44#{($2!dT0&;dpR_cKs14m|ucJ1I&~*(U@)%pW(Cq&RMq@tjl_w z8IfdxCRwSWF?nm{R14-zNL>B=;C)?sK-)-8+HMeBLaMqT-! z!#_5wKiTkTX!u~I=FUW~&dY|uz(Z5NCCJqi#J{co3 zCK+hGT?kYxc$2XQGsd+Zz$0;bw)MucGL|UqM!g z@Gr>?`orb7QKK&z*>eoqDwb5SLZ@_>2KU8VwNHh*)p9q$?NO9kqQWnz4{;TF88nS##OF=Pz zCMAf8-R&xxYYBv-BMxm8~sEyAZeyS3b;h~Eu(^09; z{RA|D&W&d$TjiQtgI6M8XH}7K#+0B{-lxFw0M)B%X>P{p@$2hqR_Y)|;RJZ7PYly~ zWmaK^JfK>_)csKAlwK~`F`fl~fn=&;{l*O3T9{0~m;pPOX&c78pazdUA!{JppXGbz zYe7JrC()>o^xL;`JMN|?clPvGH$}70fJk}$No((qUlbN51GA5*(GX!>=xy}|g*`yE zE$4Etqtp_*N}3LW>uO!?>y<{%gCwF zy$KQ*F{N-;RZnigQCPNF*P%eDx(h8=iLx%qZ=0P=@+sC%(r7Y_+>hyhsGpSYk>R0Q zM`VgTHf)Pd{N}P4AjKD2)M|R@yw~4bAu}domfEnbjZArd>caD5Q=S)t&8(I}^X)0f zIs!B+ZXM`5bd7fn<983q2BPFH7nHN?p-Dve8w@f)K``b_i zkyVT@JWdJ5-)C1D7cD8dp_1-|yeN)EDVD3R`+IL!ln}R9puh-~bL9I{1vFc=ZhU{_^nQY8?OJ?=hMA%1(PX65-1w#Fhdpx)`GM%mv%i@w(uoS>)_wp^|6z$dlKB`9Ps z9O$bX+Y)M5UX9-SqVcYvjYKrn$o8P((thnx`KyuVqHX~l^S!~Y> z$jBv$9&U0#CLv#{++h3LnG5>|KeJ0J^JJ)g1~VFIYf8UFQw0Umw6b(oztuS!=#Oj5 z9(L<;zMZ$Is#ea9&)0P7!kK^btv9JBw{S!A9lzloR&hVi-kYp2hNzejing2Vb0ZgN z&Sm<|-~p|uw2}hv8g-px z-)0A~or*~u48bRybbsdKFiIg4MoXIAHg|>SL1=z`g(kL~ifg>6)c5B~)eX#KQEFOm z__?8u?4Gx?X$NzAvvK_`fiSn%%B+0rgv}OeN1)GA?9$(t&=Gi3$7*+={tn?LvJSS3 zqZ(*ZDoSOOhZBdux8o5jms0V;f!kh%W&aQo3w7VpAkD~BiURTlg;Em zhd!=1iD&UK_u%c7BIEM0nemb+h5K0GkO(%g&5kIlIFW>q#-B_9&xxo@@y~uGfPCCX&w4&7x8y`M4+M;dAX;Kgob3{ybX_k6lxdqgud;s zOqk9J`;}r8@}!QWy=v}5{2@eEY7BJLJPGUU<~Z?JVXBIAP&CJQjJZH3bhejq5W}9t z;)7+u%fn|(1coJy3~3y>{SGKIFjTUVHJ(Iib>$yFdO!*Po)YKTGVDfmX~%QOYil#k zhQjW4U1|~RG49ghr%C!6%bd2X>C#siD6wY=5x@o{Gz)TSCU|zju zZV#CW1pWYw`>lIv9zQrCW9m}v5u(U8we!uQsAjpEijaYhv7^TEXaWMqX~lxgSM7-Q z7Un{3TusSFmg-^hW(jM;H3kQp+S+31iWAq^q|Wh~iWV|Mp@my@aJ<^p^^jcc(o0K|9zx9Y z1Q`=IyBjOIm}7f6y3HYt>XR-*KUEGw8-^!2^_+oM1SHvLZ6uF0nakL^dAQI4t2j`h zsI+jilbdssq0&QTNvh52u*Gbz7}$Kr{LtQ9wZ8TuhW7`?TIxs&h3GTA%!tJO54p=^G+KRr~e zk~68#r2ldWWW}EfFZm627g%$VJ0g?%XEBCSziA@mrn*3|#_etWhSpOy<_^_dBNy264ek z5|Ou#^rMy#j`P^2{Fi~cpMxRb!k?t2eNEmMOm|YW4L{%Pw*(Zg1pLVc{~_sgZ&Q;d zwEJ*}sGU*mHZcb&-OE($Oxw4QTK$#}+TY3R<1WUz1U1>K(8I$AhXpC1xWkOTdaNpq zpP$qCO}1ryelKg+^>FBF4ENj3q6+Adfsa5jJu;xS3?~LyTMep3oSHcMpz%9-5Dg7g z##TZRT!9&=ATCZGu+zj6e0`!-`5TO3zIA*j2Nbw`^b=`T(IrFmDW`nm4h#oz ze+mcc;#$U1elP~6j=Xfy0;feIlYDcHe{@y znn4w8Alz?I;(e64PUO!^xr#2t(1uky(r1OxfVujh@n$*x$(bD zk%PLNj)F;UD-Gjc?efboW-`EbEenejsi6+Bw4*|m+(Z%vQoa4wizl2=cZDsq1sDr~ zDUs_-84XpO`I&bOguOvFeFJL_9?Ul1g<35CG*-VNbmAzH7Nt#c3f8xwM+5LbF|MxS zVx^!Na=|vI&!4!nmFKow%V@1Qt>Wtc%DWE@Y?*;?67KHOfgBkJT=JgkBhl?SF%wCc>v^@gDS ztZ{0`?X)%QLlb1mQ{Ys~YeGPYag8H8nVEWC8ks25i8(siAV<^E-hH1U@V>8>F~Dj_ zu_0xbkb;eG6j#+yI=pJ_#qn|@DzXtby6*mtrs`8*n-zmL<^01|wHTxRhW>|hVm+Uy ztnSC|1*F`nq3`9$9y_rgv)g?fuy3}N1}8)$dA`x}a4S|)h-mfAlfg7U<(LvDw07{d zZpRL%Mj0&l<|qqJa82qqT)K-i2wwK@%|ub?0kWN)Tf8);Vu0JTJ9-vnfp3`pk2gR6 z6R7XnUJ#0{LI#vHEZq&lpDpodok}z^8%N)yJ{iIAsRM0t<#(N=!NxS(Jh4W^SjsWx znEQO$coG4+yk=a5CXZwIj);-Q;?W@Z2jNBAYY%4{xA)C@Rn_ zC!jtiLKl;5Hx`Aa%@R4hCpP~(rG-m4JiyX%spdS5vSxDEhaCNWty?EWGp4r(^a$tK znL}lRg3z??jbVypEK%q1S?Z3Pz2*EYEEd2x39&Ml2FiCL{t&p)j&HZi-*-1pbLac9w4Up9) zcuR1kLD>K&DVn{irIoHZhq!BV?8?-T`x#|G-0YCX$+YVRe8wT_9k}F&>H}M>YK(5Z z2%DiSz*gOu?HF8H92_KRJe%dV!|3j6;p|tSJq0t5+kNU|)XzfZOlW{#9K+*UCB)vQ z;SLkJtn4g}9J_p<5PJo}%_xUS3z&yUj7$$=jaU>xRzR@#Mp zPGTrDP~e^8o1>9;uo0?-AcTsPJGP?2>~IvJ5}G>jFmUh1Z=_4U_Pjk(=X$n^ZL8yv zdW#EIF7RxY=)lvAWE&X4bs}i}l#$A^IWgZwH5-n}&dvjqlw0Xm%e|4G3n6zZ`Ws+R zi5xLov%2~sqw$Ar3R3M};?Oi{)W}es!!3{~_={1pbG>|GyE~kLx+S54iGvOY!y74cq^)Fg7sP$Nc@| GpZ^Ql11zBc diff --git a/tasks/dungeon/assets/assets_dungeon_state.py b/tasks/dungeon/assets/assets_dungeon_state.py new file mode 100644 index 000000000..f8f1477ea --- /dev/null +++ b/tasks/dungeon/assets/assets_dungeon_state.py @@ -0,0 +1,35 @@ +from module.base.button import Button, ButtonWrapper + +# This file was auto-generated, do not modify it manually. To generate: +# ``` python -m dev_tools.button_extract ``` + +OCR_SIMUNI_POINT = ButtonWrapper( + name='OCR_SIMUNI_POINT', + share=Button( + file='./assets/share/dungeon/state/OCR_SIMUNI_POINT.png', + area=(580, 237, 860, 277), + search=(560, 217, 880, 297), + color=(163, 170, 252), + button=(580, 237, 860, 277), + ), +) +OCR_SIMUNI_POINT_OFFSET = ButtonWrapper( + name='OCR_SIMUNI_POINT_OFFSET', + share=Button( + file='./assets/share/dungeon/state/OCR_SIMUNI_POINT_OFFSET.png', + area=(685, 250, 717, 273), + search=(583, 187, 883, 387), + color=(199, 200, 250), + button=(685, 250, 717, 273), + ), +) +OCR_STAMINA = ButtonWrapper( + name='OCR_STAMINA', + share=Button( + file='./assets/share/dungeon/state/OCR_STAMINA.png', + area=(675, 11, 1181, 64), + search=(655, 0, 1201, 84), + color=(75, 89, 125), + button=(675, 11, 1181, 64), + ), +) diff --git a/tasks/dungeon/assets/assets_dungeon_ui.py b/tasks/dungeon/assets/assets_dungeon_ui.py index b296a7243..8d04b5748 100644 --- a/tasks/dungeon/assets/assets_dungeon_ui.py +++ b/tasks/dungeon/assets/assets_dungeon_ui.py @@ -53,26 +53,6 @@ OCR_DUNGEON_NAV = ButtonWrapper( button=(117, 182, 423, 641), ), ) -OCR_SIMUNI_POINT = ButtonWrapper( - name='OCR_SIMUNI_POINT', - share=Button( - file='./assets/share/dungeon/ui/OCR_SIMUNI_POINT.png', - area=(580, 237, 820, 277), - search=(560, 217, 840, 297), - color=(166, 168, 252), - button=(580, 237, 820, 277), - ), -) -OCR_SIMUNI_POINT_OFFSET = ButtonWrapper( - name='OCR_SIMUNI_POINT_OFFSET', - share=Button( - file='./assets/share/dungeon/ui/OCR_SIMUNI_POINT_OFFSET.png', - area=(685, 250, 717, 273), - search=(583, 187, 883, 387), - color=(199, 200, 250), - button=(685, 250, 717, 273), - ), -) OCR_WEEKLY_LIMIT = ButtonWrapper( name='OCR_WEEKLY_LIMIT', share=Button( diff --git a/tasks/dungeon/state.py b/tasks/dungeon/state.py new file mode 100644 index 000000000..5249a2573 --- /dev/null +++ b/tasks/dungeon/state.py @@ -0,0 +1,122 @@ +import threading + +from module.base.timer import Timer +from module.base.utils import crop +from module.logger import logger +from module.ocr.ocr import DigitCounter +from tasks.base.ui import UI +from tasks.dungeon.assets.assets_dungeon_state import OCR_SIMUNI_POINT, OCR_SIMUNI_POINT_OFFSET, OCR_STAMINA + + +class OcrSimUniPoint(DigitCounter): + def after_process(self, result): + result = super().after_process(result) + result = result.replace('O', '0').replace('o', '0') + return result + + +class DungeonState(UI): + def dungeon_get_simuni_point(self, image=None) -> int: + """ + Page: + in: page_guide, Survival_Index, Simulated_Universe + """ + logger.info('Get simulated universe points') + if image is None: + image = self.device.image + + _ = OCR_SIMUNI_POINT_OFFSET.match_template(image) + OCR_SIMUNI_POINT.load_offset(OCR_SIMUNI_POINT_OFFSET) + area = ( + OCR_SIMUNI_POINT.area[0], + OCR_SIMUNI_POINT.button[1], + OCR_SIMUNI_POINT.area[2], + OCR_SIMUNI_POINT.button[3], + ) + + ocr = OcrSimUniPoint(OCR_SIMUNI_POINT) + value, _, total = ocr.ocr_single_line(crop(image, area), direct_ocr=True) + if total and value <= total: + logger.attr('SimulatedUniverse', f'{value}/{total}') + self.config.stored.SimulatedUniverse.set(value, total) + return value + else: + logger.warning(f'Invalid SimulatedUniverse points: {value}/{total}') + return 0 + + def dungeon_update_stamina(self, image=None, skip_first_screenshot=True): + """ + Returns: + bool: If success + + Pages: + in: page_guild, Survival_Index, Simulated_Universe + or page_rogue, LEVEL_CONFIRM + or rogue, REWARD_CLOSE + """ + ocr = DigitCounter(OCR_STAMINA) + timeout = Timer(1, count=2).start() + if image is None: + image = self.device.image + else: + skip_first_screenshot = True + + while 1: + if skip_first_screenshot: + skip_first_screenshot = False + else: + self.device.screenshot() + + stamina = (0, 0, 0) + immersifier = (0, 0, 0) + + if timeout.reached(): + logger.warning('dungeon_update_stamina() timeout') + return False + + for row in ocr.detect_and_ocr(image): + if row.ocr_text.isdigit(): + continue + if row.ocr_text == '+': + continue + if '/' not in row.ocr_text: + continue + data = ocr.format_result(row.ocr_text) + if data[2] == self.config.stored.TrailblazePower.FIXED_TOTAL: + stamina = data + if data[2] == self.config.stored.Immersifier.FIXED_TOTAL: + immersifier = data + + if stamina[2] > 0 and immersifier[2] > 0: + break + if image is not None: + logger.warning('dungeon_update_stamina() ended') + return + + stamina = stamina[0] + immersifier = immersifier[0] + logger.attr('TrailblazePower', stamina) + logger.attr('Imersifier', immersifier) + with self.config.multi_set(): + self.config.stored.TrailblazePower.value = stamina + self.config.stored.Immersifier.value = immersifier + return True + + def dungeon_update_simuni(self): + """ + Update rogue weekly points, stamina, immersifier + Run in a new thread to be faster as data is not used immediately + + Page: + in: page_guide, Survival_Index, Simulated_Universe + """ + logger.info('dungeon_update_simuni') + + def func(image): + logger.info('Update thread start') + with self.config.multi_set(): + self.dungeon_get_simuni_point(image) + # self.dungeon_update_stamina(image) + + thread = threading.Thread(target=func, args=(self.device.image,)) + thread.start() diff --git a/tasks/dungeon/ui.py b/tasks/dungeon/ui.py index 91da95fd1..9809d3449 100644 --- a/tasks/dungeon/ui.py +++ b/tasks/dungeon/ui.py @@ -7,12 +7,11 @@ from module.base.button import ClickButton from module.base.timer import Timer from module.base.utils import get_color from module.logger import logger -from module.ocr.ocr import DigitCounter, Ocr, OcrResultButton +from module.ocr.ocr import Ocr, OcrResultButton from module.ocr.utils import split_and_pair_button_attr from module.ui.draggable_list import DraggableList from module.ui.switch import Switch from tasks.base.page import page_guide -from tasks.base.ui import UI from tasks.combat.assets.assets_combat_prepare import COMBAT_PREPARE from tasks.dungeon.assets.assets_dungeon_ui import * from tasks.dungeon.keywords import ( @@ -24,6 +23,7 @@ from tasks.dungeon.keywords import ( KEYWORDS_DUNGEON_TAB ) from tasks.dungeon.keywords.classes import DungeonEntrance +from tasks.dungeon.state import DungeonState class DungeonTabSwitch(Switch): @@ -78,13 +78,6 @@ class OcrDungeonList(Ocr): return result -class OcrSimUniPoint(DigitCounter): - def after_process(self, result): - result = super().after_process(result) - result = result.replace('O', '0').replace('o', '0') - return result - - class OcrDungeonListLimitEntrance(OcrDungeonList): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -123,7 +116,7 @@ DUNGEON_LIST = DraggableDungeonList( ocr_class=OcrDungeonList, search_button=OCR_DUNGEON_LIST) -class DungeonUI(UI): +class DungeonUI(DungeonState): def dungeon_tab_goto(self, state: DungeonTab): """ Args: @@ -233,31 +226,6 @@ class DungeonUI(UI): logger.info('No Forgotten_Hall in list skip waiting') return False - def dungeon_get_simuni_point(self) -> int: - """ - Page: - in: page_guide, Survival_Index, Simulated_Universe - """ - logger.info('Get simulated universe points') - _ = self.appear(OCR_SIMUNI_POINT_OFFSET) - OCR_SIMUNI_POINT.load_offset(OCR_SIMUNI_POINT_OFFSET) - area = ( - OCR_SIMUNI_POINT.area[0], - OCR_SIMUNI_POINT.button[1], - OCR_SIMUNI_POINT.area[2], - OCR_SIMUNI_POINT.button[3], - ) - - ocr = OcrSimUniPoint(OCR_SIMUNI_POINT) - value, _, total = ocr.ocr_single_line(self.image_crop(area), direct_ocr=True) - if total and value <= total: - logger.attr('SimulatedUniverse', f'{value}/{total}') - self.config.stored.SimulatedUniverse.set(value, total) - return value - else: - logger.warning(f'Invalid SimulatedUniverse points: {value}/{total}') - return 0 - def _dungeon_nav_goto(self, dungeon: DungeonList, skip_first_screenshot=True): """ Equivalent to `DUNGEON_NAV_LIST.select_row(dungeon.dungeon_nav, main=self)` @@ -301,7 +269,7 @@ class DungeonUI(UI): logger.info('DUNGEON_NAV_LIST at top') # Update points if possible if DUNGEON_NAV_LIST.is_row_selected(button, main=self): - self.dungeon_get_simuni_point() + self.dungeon_update_simuni() else: # To start from any list states. logger.info('DUNGEON_NAV_LIST not at top')