From c1c9da106a306d10df8bf8ed301341c14699f3d6 Mon Sep 17 00:00:00 2001 From: angry turbot Date: Sat, 17 Jan 2026 21:39:23 -0700 Subject: [PATCH] Add: Assets and changes for EN island project --- assets/en/island/GET_ITEMS_ISLAND.png | Bin 0 -> 9056 bytes assets/en/island/ISLAND_AMOUNT_MAX.png | Bin 0 -> 6427 bytes assets/en/island/ISLAND_MANAGEMENT_CHECK.png | Bin 0 -> 10124 bytes assets/en/island/ISLAND_TRANSPORT.png | Bin 0 -> 6164 bytes assets/en/island/ISLAND_TRANSPORT_CHECK.png | Bin 0 -> 2552 bytes assets/en/island/OCR_PRODUCTION_TIME.png | Bin 0 -> 8812 bytes assets/en/island/PROJECT_START.png | Bin 0 -> 6627 bytes assets/en/island/ROLE_SELECT_CONFIRM.png | Bin 0 -> 6791 bytes assets/en/island/ROLE_SELECT_ENTER.png | Bin 0 -> 8886 bytes assets/en/ui/ISLAND_CHECK.png | Bin 0 -> 7057 bytes assets/en/ui/ISLAND_GOTO_ISLAND_PHONE.png | Bin 0 -> 2237 bytes module/island/assets.py | 18 ++-- module/island/island.py | 4 +- module/island/project.py | 78 ++++++++++++------ module/island/project_data.py | 82 ++++++++++++++++++- module/ui/assets.py | 4 +- 16 files changed, 147 insertions(+), 39 deletions(-) create mode 100644 assets/en/island/GET_ITEMS_ISLAND.png create mode 100644 assets/en/island/ISLAND_AMOUNT_MAX.png create mode 100644 assets/en/island/ISLAND_MANAGEMENT_CHECK.png create mode 100644 assets/en/island/ISLAND_TRANSPORT.png create mode 100644 assets/en/island/ISLAND_TRANSPORT_CHECK.png create mode 100644 assets/en/island/OCR_PRODUCTION_TIME.png create mode 100644 assets/en/island/PROJECT_START.png create mode 100644 assets/en/island/ROLE_SELECT_CONFIRM.png create mode 100644 assets/en/island/ROLE_SELECT_ENTER.png create mode 100644 assets/en/ui/ISLAND_CHECK.png create mode 100644 assets/en/ui/ISLAND_GOTO_ISLAND_PHONE.png diff --git a/assets/en/island/GET_ITEMS_ISLAND.png b/assets/en/island/GET_ITEMS_ISLAND.png new file mode 100644 index 0000000000000000000000000000000000000000..80dd51d2c66e5673fcd602a06495d828a405aca8 GIT binary patch literal 9056 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 literal 0 HcmV?d00001 diff --git a/assets/en/island/ISLAND_AMOUNT_MAX.png b/assets/en/island/ISLAND_AMOUNT_MAX.png new file mode 100644 index 0000000000000000000000000000000000000000..dccb97ca7fb7ef37edaaf52e8b12eba452c92dad GIT binary patch literal 6427 zcmeHLdrVVT7(Yd7QNhRN01F72@exrTf)6MPIta2s#V18XdA4ihC52K1TXZTJld{YV zRKOY&L06?Bj8}Onfd*RIAq+%>E4e~J3RnlUwb1U~f=gzm@z4EnZ*uZ|=R4my_q)Gy zekb2|e+(r1nk^+R1pt`&?e{(e03K0|{xDgL2-&&*V~D^p4*Bi_B~t5Aq+?9m8?YCE z(wt?p;i&79g#Ez`0G2nQ4JV4f8-*CxB>7O14#!iIQo<9XL0~vNF3ExHbHr}DgR_IP zbC!v@6mhDGrub3){5As_CKubH;p5SRO_ zJVYC3Y`dDYsdX=#GzBs@XmU=~E>D+9EMbWPjR0K8mDr+zXV~FZqWvevUZ^nn(g1;- zzajPvCu|U4ARy-g0|5g8yAuGwE=Gh07zh{$Se}3-OI`>K{tp@B!|T0gh83%kU~0Mr zkcX%CtfKd?ceAE1^P>rNXp9$^WT0Z@1|$;)!0Vc!U;yDpcBu9J;LL+wWq#RV#4=Jd za(gmB^s9ZtZlq>8H)kG>NLCntE_!!Ht=rr|7mwkx^N zeLHvU9P4;rmGZYU(|?YMN+b1!EiKtrRGEP2%biUt@JLOpp-Bn0);D;#^fCpSVuu|J z7BbseZypm`npSwaI@GIg(__WC0iDm!spcZwd5no_XibjC+c9P1q6VTcMW4=2p2?j0 zWqoIz>II{RQV}!Cn(D}GiLLD4!L=dn;1C+0e2sqP!@ClE?NR=*0Jtc>gx4KcJ#@J= zaVU#EZlAw1p2!ap5YuK9HhmSbg%MD}PH0yCtTG;|(hOUP#w+zvClXuN!`Ep#S2AzU z?oa~ddqZ_#e&+|mifkKFoDDySM=GhNb}BTFHTJYvs6N_yPkL1C)KmM&_8UjxHhYf8 z1CFxU0=`$Q+l6n^PU?qP@B zDq>=um(#P-ChJndwgf*)is`F}*1fjWs%$Mck_)aeP3xz->y;WgPj(7NVJ*a^f;?SG z%ekRKW_I2wT_5G_%o3>evRM#0M=u>WO@G@81)S~)txR^8R>NE#cSs!MfBsF2mB7m4 zM8f0QuQD$A&ToeMxp!Tx!Ap5XzNtKp&au;>K@bD6$CGqwxWV>-hcZ+7nlIokbF57` z!Pcx0Y2*SMVag;izE+ttdhlg+APb4Qo%2Q5;3~9?qLklEn~=e!A~tD&od(UeS-QBm zM2>YofZq&$1NYK+wvP4cHidd@wXvX%DX!8^2#ZEkQ=PIaJtwu=@?{BfX^7}fo-Ryh z1h+2!7RiwNvahJTRpl%=9e|Wz(pft(>Wjj!_qe zN)oD9l);fyYAdBQqFMdws@~txIJj(B7&-d%4m{G4Bg#9)cI)?~$!_+@X#ms5Jseb@?(q+AEQH5w$k&;HpSA0rxFT!@%s6Yy-W6mUHBW~rvonl literal 0 HcmV?d00001 diff --git a/assets/en/island/ISLAND_MANAGEMENT_CHECK.png b/assets/en/island/ISLAND_MANAGEMENT_CHECK.png new file mode 100644 index 0000000000000000000000000000000000000000..a2126321dcdd21cbfa2283740a79040a025e015b GIT binary patch literal 10124 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 literal 0 HcmV?d00001 diff --git a/assets/en/island/ISLAND_TRANSPORT_CHECK.png b/assets/en/island/ISLAND_TRANSPORT_CHECK.png new file mode 100644 index 0000000000000000000000000000000000000000..53946047f1b39c4e122dc5eba58bc0630ca5e5f8 GIT binary patch literal 2552 zcmeHH{aaFZ6#s&+Wx9BJaha`^t(v9i($<@0rI}^U3=jcDMG;I9(E4 zaQH}qQmHT)419r*NF?OsGe=aX^Bduiip5fRl$ep*|#r8r_&OMgu+6JK){zurQ&?COeTw?#79L%KOY;TCnZHi zk?QKsm`tWL7OPq&i;TpdIdi77Q;mdyGbdv`Cu8 z=U=?o$gwq#!|!qub8}=m08T24Bh;xUEmJTnBM_glBbA!Lj%6i)uvj`H!!tAx^R=(1 zx2Lyvp8d>jxTq-sA50Anb_e$G!Unh?YybjATVS943Bw}>79*@aksNif@r1Y#io<y2wFy!6H+l1P_E1<7(%9^m^E<0#wh;BaCUGS`VcjAoJwkJ#dYxPS`Ynh^jRirQj%;)2@gq;4CW6xr8&?XY7KJpu<<717sMh0$%0icj zBt8Yj3FdYW^fzePzKDedEoDEx{imu$4`!+<^!9*dHq15egGfBr6Pb@Lq|m4OA6*mx zp!7MTH(K^FccdKI2h{^My?q(n=hZm5Yj@EEJ%MnIEgTJ4z;_wGS%iZ3QDY`UJ<1#J zUPB|>o2#l!#JBxz>!^7hm4fyw22^W(pm+L$zIorjNBMuoU-th;|IaJ%KoH+~K!CVC WxZCG!v3%6>yupE?0ks=q_WlK%sQ^#_ literal 0 HcmV?d00001 diff --git a/assets/en/island/OCR_PRODUCTION_TIME.png b/assets/en/island/OCR_PRODUCTION_TIME.png new file mode 100644 index 0000000000000000000000000000000000000000..d07bbb64bfafa3ea8bc40a49fa0378b5576ad6d9 GIT binary patch literal 8812 zcmeHN`&&}k-rs7bQr93>4@M=H)jK3R;;`S&|{3A)rx_Ad(>$CG>1N=lt^i2k-N`o@YJZ?^=7UwZD5kYkhB@ z{oBD{q~rXR^8o;G+`n)4VF0iNS?kyKb3wwVNW(y4m2nuk6R7HT8wMM5a6bn92msYI zhp)$GhR#dd7m)z~PVF<*ikEut1lYMEb5D5Yk<_@%>|>`-0tb)9r(}8t?+ID8-P6a@ z$LGBLvTkrt&*QB(*ONd0I&go-|c`o;27^MTfMFR`uDmsb8P?m_gcjuKU1v1 zm8`#wJp8>M$o*%QkGJ>C)4AJwGak}T!vJ9Q^8LGi3?X1O(nR)A9FaE!D}9{4DAtXK zU!?f1YN^xO4Oh0^`DK^G&3Ah)oSL)Lwr76NPa2m`cJ|RXQ^`9I#qa5TGk-nr@Sz`u zLY&rKnY-_H%*9wYaUWIT*BxVQ!fEzr-SB%{%z{`bQEx8c;`os@aoEk4uL0_&d#qrZ z=-B|VKx9tTU&-r1d*Z%L|*8so|-c}1{nrG+b z&yWQ_&rY4)rr9Ggdvj*B#H>b~H5{`>a@HZ3^_ymW#93E*Hf)#;k!B;w*{J#dWro0| zNHadZ0LTw%$PulTlP2Gknjg9XF%)|+Y2uQ<)n>3`V<>D#SX4&5uwcw|lPIK7(eSi) zBQAx?8vfSnMadFBS)GF5wH!6M+>TdmaASyvh|~J($tzQdJ)OkLitB>Y<0phPRDiiP zF**FY_^K<*^USYXmhKryEYW5Sn>gj2WG{M=``{)hL^(a^w|9DP5SX$N zT?VrjX;y?aK)2duM~LO4AwpVPmtZCg_-IX>c8n116e`81VQDuaU3y5r) z+&DM&Qq0{yvxZewg{Uwoxq^n)SGFIyNcJy{(~+e05nLh}z5&Q3k7V#Haft>HtuCsI_~s`d@#Qj{i0rJED+1D3bC3;rM!%g*fbv7}^FcreK=kfux{?~JY3^3^t zj=~*Hu>yWi2-8j8c~wJFCp=RV8kFHev~#eBC{FPr&3HHRBCDlU`Gl@S@RP7!1KvfA z>in!6H!ZBNeANFSe%dbu*-)hL_D#OujCZSH&Searub$p4iPK*iYq~H*;+7Rod2;pf z*_j;WDWMCGIIy)_`JN#2aDatPb=D8d?@Xa1X*7S18NQY zt|~Fgu;`@l`xtgb^GP*f=oSm^jJ8W#MH>7gK2o#P1$C_2 z=B*K0B0fi>t}CZU>qx>68}-ygmS^77wov2i=d2(_dQ0AoXqxp=e+jV`+1ZMOmWrRJ zdrlJ@Rg0ZNC?E354OHEyg=f&wTV&h1({o8H=a~X|%UXn0V`cJM%8f2n_NexAk2{)z zA88qAoe;3d?yND_AoB=UVG-B>`S{OIg-ZaSXA+tX|5C*UU{!jq0g)GjmBanZr~N|k z(__OFNE<0LN{-X!7>1{h<@SFhT6#t!xT$EN`$&l}v3_&mOZPs0)Fb<11C&eT_`Zn$pp zvuwl8sTenHTj#|1si${ZV@6{)>lLkb$JKj~li4QI)VfqgV7UJBm@km8vJu$?nDN?o-7bWaMQ`cu7(h9E=K6uDRM~K zWXVKep0=J_$BeC`Pqk#d9l6f;!dw@#FDkgrNDn9OKHfFwpw-&puK~)jPkvKVi)%X8 zKM~o?Gn);yAMZF7ao?n?VH5giZ66|x`#P{4riM=3_`OH2JNPaOmjHuJCtiJU27vpX ztcl~hqwKgMhsexF82=u=IJ2BCB2N_P`f)2EV)G`nGAh8GZRG0c&qay6hJWjE5M86h@nlX zfkw{x(N9EmD7^WB%9&^2wczwsiD)gVk;R7qF>v@dnc^pJv2FUc6zHEde_+*DGK@Qy zAAmp9JnV1MW<2jx-W-dxtD)j5kz&2ID}~Rk8UEETrEg1+M+*Gy1Ez~{eVgc}M%+*p zjD#}Ca+5^q^wQG#BSXzO?#K+mxoH`ByI7 z{&_OJP2{2P{t!T7P%lEpi~Yy-x4wgzCfy|bP9Jjb&^lf^N&k+fDQ}K-o4%}&+fV|Z zR-^I?(W&L6SAB1fKV1bp@<08(HK_GJb)0fB3e?GjobM#8t0jTMM0p-tA!!<|aa(N~ ze9q#JuqR*BC)N~eq9DI!-=&v)y-*sbhr!CRZ*H3l=y3yr6xf40rwsPM77)F_SG1&a zjHoQMMb@Wf3IE8dWG*nODeN|bj*gUfrLCABnD>`zkPwa9o(rNAuudH3bXUk+bM}ZZ zKd_OhV)M*_glW#`0F2${$`6DaFki9l_0_4!t~!tPR)FY2*TNYiFkG^E?^FGie$g=& zQ|ehZ!O?27-@k9t3d-Mk!gtgceymv+1u;a1A{oS`Mrrp9oO_{jR5F$;_6EcnH zGB@QL52sW&9!YBAIMFL<#@h-35s`L0jMrIhyr_h1x@O!r@=4qlHDN@u`eAZ7vH5DQvg^zx)Eo9@q^&hjagEus%m!HX`sU>t9=b;J zS!k@6aO3M6+oA$apsm!A8O_qB2B`CuO1|D}v~<+nl%yOx+n?hT zYLbeBkDND~>!3|yk9lI5bJ`ZnFKyz~(y&SHv12#^ zdqO_(fny*J5#*&+70sGGp`bCTERcANw5FfJ(#o(A16^8(I7I3%6BzpwnLJlguWYTt z>-uu>N$8ZL5d#@obFBICE|fI*qON7^SHW?JX4E4z4<9W&M-y$OBa3u|j^e8% zeibX)m64%287ih#qSxd~mxi)eNJ3p`zBFxCPR?F0|1Wjtbj`>$+YMcC!Pc)+u0{A4VPFi3CzP!(SA(Qu=*aZZgSwvh7i1) z`cI*O)~5fdiLnynRZ^Wo27D?i8HC2qw=#a8EZF7C!N zHu_Te1O8m&BhdSVuqKDbobv1bw9XNfkjLPcscG_nqxgS1Pj8!)k=bs_UJqTQT_d!p zF|%HGin5w>atGTbmA<(uh)YE-kh1=3-<2`-d(jb=Ip-!>Q6n> literal 0 HcmV?d00001 diff --git a/assets/en/island/PROJECT_START.png b/assets/en/island/PROJECT_START.png new file mode 100644 index 0000000000000000000000000000000000000000..8b2359fe3767a83c06a62be50bae629c841e62ba GIT binary patch literal 6627 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 literal 0 HcmV?d00001 diff --git a/assets/en/island/ROLE_SELECT_ENTER.png b/assets/en/island/ROLE_SELECT_ENTER.png new file mode 100644 index 0000000000000000000000000000000000000000..0f32e98cdf96845f761681c28c2fa79be5a0d745 GIT binary patch literal 8886 zcmeHMYgAL$w%!4JR7J|Eh=Pcg9_hsjzIZ4CJ}PJx5kWv80ktJcNCFa)KnTG@kBSJC zTCHt_w4yv36F?yWLU@RR)+<4QBqru?HpnADNOE@Q8RL#||D0d<#~p(;#u{s` zz1Lokx#s-lx7W%(c_P4ah207O04$Fl`T7(9EI~xG&gDyyLPQ6{kOGx_D&Qc%?btAk zR4lLu0uKN{RsPEPv!Bpx}F3;?TJOc_;MfP;{S>q&47G^M&VT zh`a-323R9yB$6*)wODwbfXJrwmW%?1%>SqS-=hKm^74mefCbWa`_5h4QNR7wuW8IB zzx~zMZA3ODGo)v;g_fuGcp=iizuK{VyXozj|H`NojZnJ*VDq`7UmpmiVj$3XwUDA{ z9}jZMws!KrvE$s+Yr(d8+}y3?6*hht?^EC1quMK}JHfCMr8n;Diqut6Op^dE z^DHw=Isq^Bw5w;&S*fc@K1pPH)w_$1R*e0qFg8JV$Wn@m-U&lYsH>CS@EftJNj z7uB?A5{sU*h!Ts4xEMGVgXI4oLLl8G>~A+50x~&+Mg!c@_qr`(-TYVfdiHQ}gJS)@ zDtzL{APk(^nZlDb^%^>L@BQWz`LqTOo^j8J@+Ob0+h+zy(-8g>`?5Y+)q)zcb-xy+ zv6rZidGu1U z0-4TVAlxhAlwDuEzPuS}uos8aqr@V-*~d+`uF>oE#pB6j^4QQgXX7|UI|}kh$>rPJ z-1vpwd_KCk7%$-#w6HnoCSN~lwYbQqAOG#Q_qQn{37%_hWivBWSicpHf-)p`?%YX` z^NEi0Vi_mu7$kmki4x=_q)COeYP_5$1RLt4w{PEGiq&_IVTzv0+yRZ>R_#>TLzHPP z2m!48&gaFJO}1`ai)K|3tpV`rwWQWu$6!yeE=stsQr_WJ&!;^+JjAOv?v=*H#nmS( z7_fd+mDV1#ffy1J0;z9pg&yB5m1XmTs$aZ#(Za@ouw9d}Ux3$+R*jBN&CZgiUnZkR z1auw2-oXJvGafnkUaBoLPN(bUdOg8Z`_%rKDjqQ{ZA{*8jWE%o)d*RYKFWZATFjD` z99!4wT`_m@yF?u%rING)(k6qKnt@7 zZX5RQrj`)X&o$_7*v)GBRz?L6?p0u@?@r1eV;`a$(;vK=;_BnzdO05t`vc$k3k2=aD2kPj4TK}u_ zLS;!e^Ot1Dk<^3uhR+?AZyBH#R3U_5X1s9>%?-OHBU6ucCbxZy|kNF6Ct`DtkS;ZtLKM&Eb zhlzDFPvYy7W^T1YGui!k5~&(pPyO!IZl&zY`v>2RmAyK+v1j1vz^}N_Prs`9D3PEDP^raL(~;Xl0ng)G$8*}5VADbHuHSbOym_Idm23@4r< zTT_osYtPqT1%RlRh2E5<`C+{cbzaoT*oldWtN>16pieKM&ixkOe+m?te6cI&1kZlu zO1yHC#JsZ(_Q511CnpP)r7}%>9vNmBg<63-fMvyaLwxZVJCQQ==dJ0tFG8TYw{I0# z?$^lPwT}kcaB;_vALkA0aj;MkBPn;dtih~pjJcr0#?{kUO&-d%wzhH@!{7vJM~Oop z9~^@wRahC*IgkHBcry#jiiWO4qpB0wz>I~FBs|}q*W!fWV*sKD-osq8zGpdGofJhp zSy{1ILi^zX^BDAT@EG*w!7;>a&e`@C`E2isv+Cd#w9vLH@b|flN$G1EDp5$+mB{Rg z8{v&g*lx=3?#k!xZz}u&43kM*i7XgaydXUO;d;9JVd{|WCz)2uORWx>2Hd&e*&gSC zujIU`QaLvpBUJHZvTY`d@7lZok8!Irl?)?Vke14&H&u29?(j{FErIMDAWVf9RXtEn zj-756zD|2k0%au49j6#ZCLU*Dbt=~E`{PlKHNBYBsYFj3YE2}i5@Y{I%~IToOMw$$ zT{51^PC+&4=a?S8z6wnGZ0D7;T!D6LG8p>7&f05Y@qZmJK(>WF(a^=j-${-J5zzXe?-?O0399%1Sl`&fu#Ym*UGMgTC!>Uv6*N!Ad(LOzPaoVwccBjUgl1QK zYr)wybVFZ)w^ZkA^MxC_VfXS|t>~+KO7LS$Man0BhW2(LEh3fpOccexEr7$6Npy=f z04kG{z<%`w0yy3AlfB_FMflHd-h`y~?XvOD+65`IZO(0yhXU=Fjk-~R>uPaXqunpz zAvg)!nhrPU$TXFf$oEw4RpeH)lW|X#osgU&@9n80I2Bx{Xej2~WKnt&4=PkEY3Nc9 z*K+IZ6gWgzQm;~%!J#fvOBRhlhDx?ffw)&s`co!1RxpGL9T_gtluc~e(k}OmVRR9; zac;y}0Q*f|zB@iNI`;>*H8lX^^X71~jLv^@W=Un*yjT2gP$3KfC#BcPHs+4^eN|%x zKiBKZFA5HM5?xcYV%DDxLgpWW$UsZ(>kJ!xyqZXXkw7=32@tf~pfp$qf&ZM7R=u}X zB@W8xs^ZmSL!(ueF)^GDW?`Yw^U|}%PrfiDBnumsu!iq4fMzlUl>ZiqDppXCm?)_a{vL^hf|WhjnwOP7r_7!* z-u*Sqd$&Y)Bl0nkq`g4NM;~u^o1ZdP#&2trj&LlO1I;TC zFO9ufHe54!Rx&4`zB{O!ym?cbCtF|Z(Hg-K8`+xNkqyJ|!2!iM8BZ`Mu$Dd5ZzKIG z^4xs=x*F#`M%!BARuId*&Rj;|)WB_}O;1w(#?AG)62H4|4xPn%`XVT3Ixhqi$v~>! zN1|P)n7|4r;>~|VP~PnC0I+poo#$$k@qQ%E_tkS*_+md9CT;e?bg6N^OW3bvr1PN- z4>_KpuL&k{vU8n{r;t&?jBlu{?9}^)qQ-i|RrST>%|%7O5GtB7s-wCpx>H=ndiK&D zhzE7QgOI<!033#2IB!50_^f|tcYBJ zX2s~%*N~Mgqe=wk32ZuD4vMEVNe->UHO3ivJH$}xexuL)+(d2?^;~!&7bepjqeF-| z%hu9CXC)pjW#^tUXqt@aZgU)#VHL2SWeU?rL-(^m0?q}O`z8ufkw?MjJzMpGdlg<8 z4~4p`6hS|Sq8L5cPmzR^wP-xt{jKLK3KFQ{ySI)+Y_1Y(X(}rsB>>I#-z27E94%gg z=g&iPe`r^6Shwe^d#aUHKIg%oE&xErHzvrgmPOq27jR-?MkObUr3kzp(N5%al?pD_ z^9kEhf}w6~X?>vA#xQ!tifjQnznb3F1$GEiZsg~uc(0PUhr@l|p)C5)vn-G#XXx3E z-7db0+N#cy=|F|xgoBB0csJG5Z4Iy2_P|qhH5<=*eoVYro^!1xFXq|vfYVC4zN%nu zDQRo%n(AN|y_Y zi0FiVnt1fjsH%tlGa#l>&SCNkuG4ny(g$an{7|q|GKEaUs$+E{+t0jncf`Y@ZjbbrbwH-?g0GYpklGbq z;^`atDH`qRHR(F=GyElZpzj7NoSD=;*_-{M236TT+Bo>e+e@?t~?om{DA{^`aE+ANfX7mOuyU5Yry2o*9cn%%M*k+?p^VF&_EobOrUPo`$`Sw0*pjmw0 zViR)M`=3sG1%NryX#aMn#WP`qkC-%p>@boRkIomb2^Mct7H^IgZ^;%Baq;4G@sfCv l5d0@5`G3Tlp2kB))Y*fCk=hCu2NN?pdiccG+=H?I_!s&>f`tG8 literal 0 HcmV?d00001 diff --git a/assets/en/ui/ISLAND_CHECK.png b/assets/en/ui/ISLAND_CHECK.png new file mode 100644 index 0000000000000000000000000000000000000000..e1bac0ec30ee501929aef47e9fb6987470817786 GIT binary patch literal 7057 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 literal 0 HcmV?d00001 diff --git a/module/island/assets.py b/module/island/assets.py index c5a1aab71..374658d7b 100644 --- a/module/island/assets.py +++ b/module/island/assets.py @@ -4,17 +4,17 @@ from module.base.template import Template # This file was automatically generated by dev_tools/button_extract.py. # Don't modify it manually. -GET_ITEMS_ISLAND = Button(area={'cn': (588, 260, 692, 289), 'en': (588, 260, 692, 289), 'jp': (588, 260, 692, 289), 'tw': (588, 260, 692, 289)}, color={'cn': (178, 180, 180), 'en': (178, 180, 180), 'jp': (178, 180, 180), 'tw': (178, 180, 180)}, button={'cn': (0, 263, 129, 555), 'en': (0, 263, 129, 555), 'jp': (0, 263, 129, 555), 'tw': (0, 263, 129, 555)}, file={'cn': './assets/cn/island/GET_ITEMS_ISLAND.png', 'en': './assets/cn/island/GET_ITEMS_ISLAND.png', 'jp': './assets/cn/island/GET_ITEMS_ISLAND.png', 'tw': './assets/cn/island/GET_ITEMS_ISLAND.png'}) -ISLAND_AMOUNT_MAX = Button(area={'cn': (960, 382, 988, 405), 'en': (960, 382, 988, 405), 'jp': (960, 382, 988, 405), 'tw': (960, 382, 988, 405)}, color={'cn': (72, 72, 78), 'en': (72, 72, 78), 'jp': (72, 72, 78), 'tw': (72, 72, 78)}, button={'cn': (960, 382, 988, 405), 'en': (960, 382, 988, 405), 'jp': (960, 382, 988, 405), 'tw': (960, 382, 988, 405)}, file={'cn': './assets/cn/island/ISLAND_AMOUNT_MAX.png', 'en': './assets/cn/island/ISLAND_AMOUNT_MAX.png', 'jp': './assets/cn/island/ISLAND_AMOUNT_MAX.png', 'tw': './assets/cn/island/ISLAND_AMOUNT_MAX.png'}) +GET_ITEMS_ISLAND = Button(area={'cn': (588, 260, 692, 289), 'en': (588, 260, 692, 289), 'jp': (588, 260, 692, 289), 'tw': (588, 260, 692, 289)}, color={'cn': (149, 151, 152), 'en': (149, 151, 152), 'jp': (149, 151, 152), 'tw': (149, 151, 152)}, button={'cn': (0, 263, 129, 555), 'en': (588, 260, 692, 289), 'jp': (0, 263, 129, 555), 'tw': (0, 263, 129, 555)}, file={'cn': './assets/cn/island/GET_ITEMS_ISLAND.png', 'en': './assets/en/island/GET_ITEMS_ISLAND.png', 'jp': './assets/cn/island/GET_ITEMS_ISLAND.png', 'tw': './assets/cn/island/GET_ITEMS_ISLAND.png'}) +ISLAND_AMOUNT_MAX = Button(area={'cn': (960, 382, 988, 405), 'en': (960, 382, 988, 405), 'jp': (960, 382, 988, 405), 'tw': (960, 382, 988, 405)}, color={'cn': (78, 78, 84), 'en': (78, 78, 84), 'jp': (78, 78, 84), 'tw': (78, 78, 84)}, button={'cn': (960, 382, 988, 405), 'en': (960, 382, 988, 405), 'jp': (960, 382, 988, 405), 'tw': (960, 382, 988, 405)}, file={'cn': './assets/cn/island/ISLAND_AMOUNT_MAX.png', 'en': './assets/en/island/ISLAND_AMOUNT_MAX.png', 'jp': './assets/cn/island/ISLAND_AMOUNT_MAX.png', 'tw': './assets/cn/island/ISLAND_AMOUNT_MAX.png'}) ISLAND_CLICK_SAFE_AREA = Button(area={'cn': (0, 263, 129, 555), 'en': (0, 263, 129, 555), 'jp': (0, 263, 129, 555), 'tw': (0, 263, 129, 555)}, color={'cn': (50, 52, 56), 'en': (50, 52, 56), 'jp': (50, 52, 56), 'tw': (50, 52, 56)}, button={'cn': (0, 263, 129, 555), 'en': (0, 263, 129, 555), 'jp': (0, 263, 129, 555), 'tw': (0, 263, 129, 555)}, file={'cn': './assets/cn/island/ISLAND_CLICK_SAFE_AREA.png', 'en': './assets/cn/island/ISLAND_CLICK_SAFE_AREA.png', 'jp': './assets/cn/island/ISLAND_CLICK_SAFE_AREA.png', 'tw': './assets/cn/island/ISLAND_CLICK_SAFE_AREA.png'}) ISLAND_MANAGEMENT = Button(area={'cn': (1077, 493, 1119, 533), 'en': (1077, 493, 1119, 533), 'jp': (1077, 493, 1119, 533), 'tw': (1077, 493, 1119, 533)}, color={'cn': (187, 224, 135), 'en': (187, 224, 135), 'jp': (187, 224, 135), 'tw': (187, 224, 135)}, button={'cn': (1077, 493, 1119, 533), 'en': (1077, 493, 1119, 533), 'jp': (1077, 493, 1119, 533), 'tw': (1077, 493, 1119, 533)}, file={'cn': './assets/cn/island/ISLAND_MANAGEMENT.png', 'en': './assets/cn/island/ISLAND_MANAGEMENT.png', 'jp': './assets/cn/island/ISLAND_MANAGEMENT.png', 'tw': './assets/cn/island/ISLAND_MANAGEMENT.png'}) -ISLAND_MANAGEMENT_CHECK = Button(area={'cn': (123, 21, 304, 47), 'en': (123, 21, 304, 47), 'jp': (123, 21, 304, 47), 'tw': (123, 21, 304, 47)}, color={'cn': (77, 83, 96), 'en': (77, 83, 96), 'jp': (77, 83, 96), 'tw': (77, 83, 96)}, button={'cn': (123, 21, 304, 47), 'en': (123, 21, 304, 47), 'jp': (123, 21, 304, 47), 'tw': (123, 21, 304, 47)}, file={'cn': './assets/cn/island/ISLAND_MANAGEMENT_CHECK.png', 'en': './assets/cn/island/ISLAND_MANAGEMENT_CHECK.png', 'jp': './assets/cn/island/ISLAND_MANAGEMENT_CHECK.png', 'tw': './assets/cn/island/ISLAND_MANAGEMENT_CHECK.png'}) +ISLAND_MANAGEMENT_CHECK = Button(area={'cn': (123, 21, 304, 47), 'en': (123, 21, 304, 47), 'jp': (123, 21, 304, 47), 'tw': (123, 21, 304, 47)}, color={'cn': (90, 96, 108), 'en': (90, 96, 108), 'jp': (90, 96, 108), 'tw': (90, 96, 108)}, button={'cn': (123, 21, 304, 47), 'en': (123, 21, 304, 47), 'jp': (123, 21, 304, 47), 'tw': (123, 21, 304, 47)}, file={'cn': './assets/cn/island/ISLAND_MANAGEMENT_CHECK.png', 'en': './assets/en/island/ISLAND_MANAGEMENT_CHECK.png', 'jp': './assets/cn/island/ISLAND_MANAGEMENT_CHECK.png', 'tw': './assets/cn/island/ISLAND_MANAGEMENT_CHECK.png'}) ISLAND_MANAGEMENT_LOCKED = Button(area={'cn': (1092, 504, 1105, 520), 'en': (1092, 504, 1105, 520), 'jp': (1092, 504, 1105, 520), 'tw': (1092, 504, 1105, 520)}, color={'cn': (197, 206, 195), 'en': (197, 206, 195), 'jp': (197, 206, 195), 'tw': (197, 206, 195)}, button={'cn': (1092, 504, 1105, 520), 'en': (1092, 504, 1105, 520), 'jp': (1092, 504, 1105, 520), 'tw': (1092, 504, 1105, 520)}, file={'cn': './assets/cn/island/ISLAND_MANAGEMENT_LOCKED.png', 'en': './assets/cn/island/ISLAND_MANAGEMENT_LOCKED.png', 'jp': './assets/cn/island/ISLAND_MANAGEMENT_LOCKED.png', 'tw': './assets/cn/island/ISLAND_MANAGEMENT_LOCKED.png'}) ISLAND_PRODUCT_ITEMS = Button(area={'cn': (166, 68, 477, 652), 'en': (166, 68, 477, 652), 'jp': (166, 68, 477, 652), 'tw': (166, 68, 477, 652)}, color={'cn': (189, 200, 198), 'en': (189, 200, 198), 'jp': (189, 200, 198), 'tw': (189, 200, 198)}, button={'cn': (166, 68, 477, 652), 'en': (166, 68, 477, 652), 'jp': (166, 68, 477, 652), 'tw': (166, 68, 477, 652)}, file={'cn': './assets/cn/island/ISLAND_PRODUCT_ITEMS.png', 'en': './assets/cn/island/ISLAND_PRODUCT_ITEMS.png', 'jp': './assets/cn/island/ISLAND_PRODUCT_ITEMS.png', 'tw': './assets/cn/island/ISLAND_PRODUCT_ITEMS.png'}) ISLAND_PROJECT_SWIPE = Button(area={'cn': (690, 80, 721, 641), 'en': (690, 80, 721, 641), 'jp': (690, 80, 721, 641), 'tw': (690, 80, 721, 641)}, color={'cn': (215, 218, 213), 'en': (215, 218, 213), 'jp': (215, 218, 213), 'tw': (215, 218, 213)}, button={'cn': (690, 80, 721, 641), 'en': (690, 80, 721, 641), 'jp': (690, 80, 721, 641), 'tw': (690, 80, 721, 641)}, file={'cn': './assets/cn/island/ISLAND_PROJECT_SWIPE.png', 'en': './assets/cn/island/ISLAND_PROJECT_SWIPE.png', 'jp': './assets/cn/island/ISLAND_PROJECT_SWIPE.png', 'tw': './assets/cn/island/ISLAND_PROJECT_SWIPE.png'}) -ISLAND_TRANSPORT = Button(area={'cn': (905, 335, 986, 358), 'en': (905, 335, 986, 358), 'jp': (905, 335, 986, 358), 'tw': (905, 335, 986, 358)}, color={'cn': (228, 192, 122), 'en': (228, 192, 122), 'jp': (228, 192, 122), 'tw': (228, 192, 122)}, button={'cn': (898, 328, 1031, 459), 'en': (898, 328, 1031, 459), 'jp': (898, 328, 1031, 459), 'tw': (898, 328, 1031, 459)}, file={'cn': './assets/cn/island/ISLAND_TRANSPORT.png', 'en': './assets/cn/island/ISLAND_TRANSPORT.png', 'jp': './assets/cn/island/ISLAND_TRANSPORT.png', 'tw': './assets/cn/island/ISLAND_TRANSPORT.png'}) -ISLAND_TRANSPORT_CHECK = Button(area={'cn': (264, 154, 317, 180), 'en': (264, 154, 317, 180), 'jp': (264, 154, 317, 180), 'tw': (264, 154, 317, 180)}, color={'cn': (142, 143, 143), 'en': (142, 143, 143), 'jp': (142, 143, 143), 'tw': (142, 143, 143)}, button={'cn': (264, 154, 317, 180), 'en': (264, 154, 317, 180), 'jp': (264, 154, 317, 180), 'tw': (264, 154, 317, 180)}, file={'cn': './assets/cn/island/ISLAND_TRANSPORT_CHECK.png', 'en': './assets/cn/island/ISLAND_TRANSPORT_CHECK.png', 'jp': './assets/cn/island/ISLAND_TRANSPORT_CHECK.png', 'tw': './assets/cn/island/ISLAND_TRANSPORT_CHECK.png'}) -OCR_PRODUCTION_TIME = Button(area={'cn': (714, 611, 808, 631), 'en': (714, 611, 808, 631), 'jp': (714, 611, 808, 631), 'tw': (714, 611, 808, 631)}, color={'cn': (120, 210, 255), 'en': (120, 210, 255), 'jp': (120, 210, 255), 'tw': (120, 210, 255)}, button={'cn': (714, 611, 808, 631), 'en': (714, 611, 808, 631), 'jp': (714, 611, 808, 631), 'tw': (714, 611, 808, 631)}, file={'cn': './assets/cn/island/OCR_PRODUCTION_TIME.png', 'en': './assets/cn/island/OCR_PRODUCTION_TIME.png', 'jp': './assets/cn/island/OCR_PRODUCTION_TIME.png', 'tw': './assets/cn/island/OCR_PRODUCTION_TIME.png'}) +ISLAND_TRANSPORT = Button(area={'cn': (905, 335, 986, 358), 'en': (905, 335, 986, 358), 'jp': (905, 335, 986, 358), 'tw': (905, 335, 986, 358)}, color={'cn': (234, 192, 102), 'en': (234, 192, 102), 'jp': (234, 192, 102), 'tw': (234, 192, 102)}, button={'cn': (898, 328, 1031, 459), 'en': (905, 335, 986, 358), 'jp': (898, 328, 1031, 459), 'tw': (898, 328, 1031, 459)}, file={'cn': './assets/cn/island/ISLAND_TRANSPORT.png', 'en': './assets/en/island/ISLAND_TRANSPORT.png', 'jp': './assets/cn/island/ISLAND_TRANSPORT.png', 'tw': './assets/cn/island/ISLAND_TRANSPORT.png'}) +ISLAND_TRANSPORT_CHECK = Button(area={'cn': (264, 154, 317, 180), 'en': (264, 154, 317, 180), 'jp': (264, 154, 317, 180), 'tw': (264, 154, 317, 180)}, color={'cn': (22, 0, 0), 'en': (22, 0, 0), 'jp': (22, 0, 0), 'tw': (22, 0, 0)}, button={'cn': (264, 154, 317, 180), 'en': (264, 154, 317, 180), 'jp': (264, 154, 317, 180), 'tw': (264, 154, 317, 180)}, file={'cn': './assets/cn/island/ISLAND_TRANSPORT_CHECK.png', 'en': './assets/en/island/ISLAND_TRANSPORT_CHECK.png', 'jp': './assets/cn/island/ISLAND_TRANSPORT_CHECK.png', 'tw': './assets/cn/island/ISLAND_TRANSPORT_CHECK.png'}) +OCR_PRODUCTION_TIME = Button(area={'cn': (714, 611, 808, 631), 'en': (637, 603, 733, 623), 'jp': (714, 611, 808, 631), 'tw': (714, 611, 808, 631)}, color={'cn': (120, 210, 255), 'en': (132, 214, 255), 'jp': (120, 210, 255), 'tw': (120, 210, 255)}, button={'cn': (714, 611, 808, 631), 'en': (637, 603, 733, 623), 'jp': (714, 611, 808, 631), 'tw': (714, 611, 808, 631)}, file={'cn': './assets/cn/island/OCR_PRODUCTION_TIME.png', 'en': './assets/en/island/OCR_PRODUCTION_TIME.png', 'jp': './assets/cn/island/OCR_PRODUCTION_TIME.png', 'tw': './assets/cn/island/OCR_PRODUCTION_TIME.png'}) OCR_PRODUCTION_TIME_REMAIN = Button(area={'cn': (621, 427, 666, 439), 'en': (621, 427, 666, 439), 'jp': (621, 427, 666, 439), 'tw': (621, 427, 666, 439)}, color={'cn': (196, 203, 205), 'en': (196, 203, 205), 'jp': (196, 203, 205), 'tw': (196, 203, 205)}, button={'cn': (621, 427, 666, 439), 'en': (621, 427, 666, 439), 'jp': (621, 427, 666, 439), 'tw': (621, 427, 666, 439)}, file={'cn': './assets/cn/island/OCR_PRODUCTION_TIME_REMAIN.png', 'en': './assets/cn/island/OCR_PRODUCTION_TIME_REMAIN.png', 'jp': './assets/cn/island/OCR_PRODUCTION_TIME_REMAIN.png', 'tw': './assets/cn/island/OCR_PRODUCTION_TIME_REMAIN.png'}) OCR_TRANSPORT_REFRESH = Button(area={'cn': (716, 211, 805, 231), 'en': (716, 211, 805, 231), 'jp': (716, 211, 805, 231), 'tw': (716, 211, 805, 231)}, color={'cn': (176, 177, 175), 'en': (176, 177, 175), 'jp': (176, 177, 175), 'tw': (176, 177, 175)}, button={'cn': (716, 211, 805, 231), 'en': (716, 211, 805, 231), 'jp': (716, 211, 805, 231), 'tw': (716, 211, 805, 231)}, file={'cn': './assets/cn/island/OCR_TRANSPORT_REFRESH.png', 'en': './assets/cn/island/OCR_TRANSPORT_REFRESH.png', 'jp': './assets/cn/island/OCR_TRANSPORT_REFRESH.png', 'tw': './assets/cn/island/OCR_TRANSPORT_REFRESH.png'}) OCR_TRANSPORT_TIME = Button(area={'cn': (611, 139, 687, 154), 'en': (611, 139, 687, 154), 'jp': (611, 139, 687, 154), 'tw': (611, 139, 687, 154)}, color={'cn': (119, 119, 120), 'en': (119, 119, 120), 'jp': (119, 119, 120), 'tw': (119, 119, 120)}, button={'cn': (611, 139, 687, 154), 'en': (611, 139, 687, 154), 'jp': (611, 139, 687, 154), 'tw': (611, 139, 687, 154)}, file={'cn': './assets/cn/island/OCR_TRANSPORT_TIME.png', 'en': './assets/cn/island/OCR_TRANSPORT_TIME.png', 'jp': './assets/cn/island/OCR_TRANSPORT_TIME.png', 'tw': './assets/cn/island/OCR_TRANSPORT_TIME.png'}) @@ -30,12 +30,12 @@ PROJECT_MANJUU_CHECK = Button(area={'cn': (1162, 182, 1214, 205), 'en': (1162, 1 PROJECT_NEW_JERSEY_CHECK = Button(area={'cn': (1158, 170, 1223, 214), 'en': (1158, 170, 1223, 214), 'jp': (1158, 170, 1223, 214), 'tw': (1158, 170, 1223, 214)}, color={'cn': (138, 136, 159), 'en': (138, 136, 159), 'jp': (138, 136, 159), 'tw': (138, 136, 159)}, button={'cn': (1158, 170, 1223, 214), 'en': (1158, 170, 1223, 214), 'jp': (1158, 170, 1223, 214), 'tw': (1158, 170, 1223, 214)}, file={'cn': './assets/cn/island/PROJECT_NEW_JERSEY_CHECK.png', 'en': './assets/cn/island/PROJECT_NEW_JERSEY_CHECK.png', 'jp': './assets/cn/island/PROJECT_NEW_JERSEY_CHECK.png', 'tw': './assets/cn/island/PROJECT_NEW_JERSEY_CHECK.png'}) PROJECT_SARATOGA_CHECK = Button(area={'cn': (1162, 166, 1223, 219), 'en': (1162, 166, 1223, 219), 'jp': (1162, 166, 1223, 219), 'tw': (1162, 166, 1223, 219)}, color={'cn': (212, 177, 178), 'en': (212, 177, 178), 'jp': (212, 177, 178), 'tw': (212, 177, 178)}, button={'cn': (1162, 166, 1223, 219), 'en': (1162, 166, 1223, 219), 'jp': (1162, 166, 1223, 219), 'tw': (1162, 166, 1223, 219)}, file={'cn': './assets/cn/island/PROJECT_SARATOGA_CHECK.png', 'en': './assets/cn/island/PROJECT_SARATOGA_CHECK.png', 'jp': './assets/cn/island/PROJECT_SARATOGA_CHECK.png', 'tw': './assets/cn/island/PROJECT_SARATOGA_CHECK.png'}) PROJECT_SHIMAKAZE_CHECK = Button(area={'cn': (1163, 168, 1212, 218), 'en': (1163, 168, 1212, 218), 'jp': (1163, 168, 1212, 218), 'tw': (1163, 168, 1212, 218)}, color={'cn': (218, 199, 196), 'en': (218, 199, 196), 'jp': (218, 199, 196), 'tw': (218, 199, 196)}, button={'cn': (1163, 168, 1212, 218), 'en': (1163, 168, 1212, 218), 'jp': (1163, 168, 1212, 218), 'tw': (1163, 168, 1212, 218)}, file={'cn': './assets/cn/island/PROJECT_SHIMAKAZE_CHECK.png', 'en': './assets/cn/island/PROJECT_SHIMAKAZE_CHECK.png', 'jp': './assets/cn/island/PROJECT_SHIMAKAZE_CHECK.png', 'tw': './assets/cn/island/PROJECT_SHIMAKAZE_CHECK.png'}) -PROJECT_START = Button(area={'cn': (686, 610, 706, 630), 'en': (686, 610, 706, 630), 'jp': (686, 610, 706, 630), 'tw': (686, 610, 706, 630)}, color={'cn': (129, 213, 255), 'en': (129, 213, 255), 'jp': (129, 213, 255), 'tw': (129, 213, 255)}, button={'cn': (494, 599, 1087, 642), 'en': (494, 599, 1087, 642), 'jp': (494, 599, 1087, 642), 'tw': (494, 599, 1087, 642)}, file={'cn': './assets/cn/island/PROJECT_START.png', 'en': './assets/cn/island/PROJECT_START.png', 'jp': './assets/cn/island/PROJECT_START.png', 'tw': './assets/cn/island/PROJECT_START.png'}) +PROJECT_START = Button(area={'cn': (609, 610, 629, 630), 'en': (609, 610, 629, 630), 'jp': (609, 610, 629, 630), 'tw': (609, 610, 629, 630)}, color={'cn': (128, 212, 254), 'en': (128, 212, 254), 'jp': (128, 212, 254), 'tw': (128, 212, 254)}, button={'cn': (494, 599, 1087, 642), 'en': (609, 610, 629, 630), 'jp': (494, 599, 1087, 642), 'tw': (494, 599, 1087, 642)}, file={'cn': './assets/cn/island/PROJECT_START.png', 'en': './assets/en/island/PROJECT_START.png', 'jp': './assets/cn/island/PROJECT_START.png', 'tw': './assets/cn/island/PROJECT_START.png'}) PROJECT_TASHKENT_CHECK = Button(area={'cn': (1164, 176, 1219, 213), 'en': (1164, 176, 1219, 213), 'jp': (1164, 176, 1219, 213), 'tw': (1164, 176, 1219, 213)}, color={'cn': (176, 146, 173), 'en': (176, 146, 173), 'jp': (176, 146, 173), 'tw': (176, 146, 173)}, button={'cn': (1164, 176, 1219, 213), 'en': (1164, 176, 1219, 213), 'jp': (1164, 176, 1219, 213), 'tw': (1164, 176, 1219, 213)}, file={'cn': './assets/cn/island/PROJECT_TASHKENT_CHECK.png', 'en': './assets/cn/island/PROJECT_TASHKENT_CHECK.png', 'jp': './assets/cn/island/PROJECT_TASHKENT_CHECK.png', 'tw': './assets/cn/island/PROJECT_TASHKENT_CHECK.png'}) PROJECT_UNICORN_CHECK = Button(area={'cn': (1156, 167, 1224, 209), 'en': (1156, 167, 1224, 209), 'jp': (1156, 167, 1224, 209), 'tw': (1156, 167, 1224, 209)}, color={'cn': (199, 184, 218), 'en': (199, 184, 218), 'jp': (199, 184, 218), 'tw': (199, 184, 218)}, button={'cn': (1156, 167, 1224, 209), 'en': (1156, 167, 1224, 209), 'jp': (1156, 167, 1224, 209), 'tw': (1156, 167, 1224, 209)}, file={'cn': './assets/cn/island/PROJECT_UNICORN_CHECK.png', 'en': './assets/cn/island/PROJECT_UNICORN_CHECK.png', 'jp': './assets/cn/island/PROJECT_UNICORN_CHECK.png', 'tw': './assets/cn/island/PROJECT_UNICORN_CHECK.png'}) PROJECT_YING_SWEI_CHECK = Button(area={'cn': (1161, 177, 1217, 210), 'en': (1161, 177, 1217, 210), 'jp': (1161, 177, 1217, 210), 'tw': (1161, 177, 1217, 210)}, color={'cn': (171, 157, 165), 'en': (171, 157, 165), 'jp': (171, 157, 165), 'tw': (171, 157, 165)}, button={'cn': (1161, 177, 1217, 210), 'en': (1161, 177, 1217, 210), 'jp': (1161, 177, 1217, 210), 'tw': (1161, 177, 1217, 210)}, file={'cn': './assets/cn/island/PROJECT_YING_SWEI_CHECK.png', 'en': './assets/cn/island/PROJECT_YING_SWEI_CHECK.png', 'jp': './assets/cn/island/PROJECT_YING_SWEI_CHECK.png', 'tw': './assets/cn/island/PROJECT_YING_SWEI_CHECK.png'}) -ROLE_SELECT_CONFIRM = Button(area={'cn': (1068, 597, 1118, 621), 'en': (1068, 597, 1118, 621), 'jp': (1068, 597, 1118, 621), 'tw': (1068, 597, 1118, 621)}, color={'cn': (109, 206, 255), 'en': (109, 206, 255), 'jp': (109, 206, 255), 'tw': (109, 206, 255)}, button={'cn': (948, 585, 1239, 632), 'en': (948, 585, 1239, 632), 'jp': (948, 585, 1239, 632), 'tw': (948, 585, 1239, 632)}, file={'cn': './assets/cn/island/ROLE_SELECT_CONFIRM.png', 'en': './assets/cn/island/ROLE_SELECT_CONFIRM.png', 'jp': './assets/cn/island/ROLE_SELECT_CONFIRM.png', 'tw': './assets/cn/island/ROLE_SELECT_CONFIRM.png'}) -ROLE_SELECT_ENTER = Button(area={'cn': (579, 314, 700, 350), 'en': (579, 314, 700, 350), 'jp': (579, 314, 700, 350), 'tw': (579, 314, 700, 350)}, color={'cn': (239, 238, 237), 'en': (239, 238, 237), 'jp': (239, 238, 237), 'tw': (239, 238, 237)}, button={'cn': (534, 206, 747, 483), 'en': (534, 206, 747, 483), 'jp': (534, 206, 747, 483), 'tw': (534, 206, 747, 483)}, file={'cn': './assets/cn/island/ROLE_SELECT_ENTER.png', 'en': './assets/cn/island/ROLE_SELECT_ENTER.png', 'jp': './assets/cn/island/ROLE_SELECT_ENTER.png', 'tw': './assets/cn/island/ROLE_SELECT_ENTER.png'}) +ROLE_SELECT_CONFIRM = Button(area={'cn': (1068, 597, 1118, 621), 'en': (1068, 597, 1118, 621), 'jp': (1068, 597, 1118, 621), 'tw': (1068, 597, 1118, 621)}, color={'cn': (125, 211, 255), 'en': (125, 211, 255), 'jp': (125, 211, 255), 'tw': (125, 211, 255)}, button={'cn': (948, 585, 1239, 632), 'en': (1068, 597, 1118, 621), 'jp': (948, 585, 1239, 632), 'tw': (948, 585, 1239, 632)}, file={'cn': './assets/cn/island/ROLE_SELECT_CONFIRM.png', 'en': './assets/en/island/ROLE_SELECT_CONFIRM.png', 'jp': './assets/cn/island/ROLE_SELECT_CONFIRM.png', 'tw': './assets/cn/island/ROLE_SELECT_CONFIRM.png'}) +ROLE_SELECT_ENTER = Button(area={'cn': (578, 313, 701, 351), 'en': (578, 313, 701, 351), 'jp': (578, 313, 701, 351), 'tw': (578, 313, 701, 351)}, color={'cn': (237, 237, 236), 'en': (237, 237, 236), 'jp': (237, 237, 236), 'tw': (237, 237, 236)}, button={'cn': (534, 206, 747, 483), 'en': (578, 313, 701, 351), 'jp': (534, 206, 747, 483), 'tw': (534, 206, 747, 483)}, file={'cn': './assets/cn/island/ROLE_SELECT_ENTER.png', 'en': './assets/en/island/ROLE_SELECT_ENTER.png', 'jp': './assets/cn/island/ROLE_SELECT_ENTER.png', 'tw': './assets/cn/island/ROLE_SELECT_ENTER.png'}) TEMPLATE_AKASHI = Template(file={'cn': './assets/cn/island/TEMPLATE_AKASHI.png', 'en': './assets/cn/island/TEMPLATE_AKASHI.png', 'jp': './assets/cn/island/TEMPLATE_AKASHI.png', 'tw': './assets/cn/island/TEMPLATE_AKASHI.png'}) TEMPLATE_AMAGI_CHAN = Template(file={'cn': './assets/cn/island/TEMPLATE_AMAGI_CHAN.png', 'en': './assets/cn/island/TEMPLATE_AMAGI_CHAN.png', 'jp': './assets/cn/island/TEMPLATE_AMAGI_CHAN.png', 'tw': './assets/cn/island/TEMPLATE_AMAGI_CHAN.png'}) TEMPLATE_CARROT = Template(file={'cn': './assets/cn/island/TEMPLATE_CARROT.png', 'en': './assets/cn/island/TEMPLATE_CARROT.png', 'jp': './assets/cn/island/TEMPLATE_CARROT.png', 'tw': './assets/cn/island/TEMPLATE_CARROT.png'}) diff --git a/module/island/island.py b/module/island/island.py index 2ecfd467f..32f80a27f 100644 --- a/module/island/island.py +++ b/module/island/island.py @@ -19,7 +19,7 @@ class Island(IslandProjectRun, IslandTransportRun): list[str]: a list of name for island receive """ if any(config): - return [name for add, name in zip(config, list(name_to_slot_cn.keys())) if add] + return [name for add, name in zip(config, list(name_to_slot.keys())) if add] else: return [] @@ -56,7 +56,7 @@ class Island(IslandProjectRun, IslandTransportRun): self.config.task_delay(success=False) def run(self): - if server.server in ['cn']: + if server.server in ['cn', 'en']: transport = False project_config = [self.config.__getattribute__(f'Island{i}_Receive') for i in range(1, 16)] project = any(project_config) diff --git a/module/island/project.py b/module/island/project.py index 13c6087da..ad6d42ed5 100644 --- a/module/island/project.py +++ b/module/island/project.py @@ -4,6 +4,7 @@ import re import numpy as np from scipy import signal +import module.config.server as server from module.base.button import Button, ButtonGrid from module.base.timer import Timer from module.base.utils import color_similarity_2d, crop, random_rectangle_vector, rgb2gray @@ -15,12 +16,14 @@ from module.logger import logger from module.map.map_grids import SelectedGrids from module.ocr.ocr import Duration, Ocr - class ProjectNameOcr(Ocr): def after_process(self, result): result = super().after_process(result) - result = result.replace('主', '丰') - result = re.sub(r'[^\u4e00-\u9fff]', '', result) + if server.server == 'cn': + result = result.replace('主', '丰') + result = re.sub(r'[^\u4e00-\u9fff]', '', result) + elif server.server == 'en': + result = re.sub(r"[\s'-]+", "", result).lower() return result @@ -66,7 +69,9 @@ class IslandProject: return # name - area = (self.x1 - 446, self.y1, self.x1 - 326, self.y2) + dx = {'cn':326, 'en':137}[server.server] + dy = {'cn':0, 'en':2}[server.server] + area = (self.x1 - 446, self.y1, self.x1 - dx, self.y2+dy) button = Button(area=area, color=(), button=area, name='PROJECT_NAME') ocr = ProjectNameOcr(button, lang='cnocr') self.name = ocr.ocr(self.image) @@ -75,7 +80,7 @@ class IslandProject: return # id - keys = list(name_to_slot_cn.keys()) + keys = list(name_to_slot.keys()) if self.name in keys: self.id = keys.index(self.name) + 1 else: @@ -83,7 +88,7 @@ class IslandProject: return # max slot - self.max_slot = name_to_slot_cn.get(self.name, 2) + self.max_slot = name_to_slot.get(self.name, 2) # available slot area = (self.x1 - 383, self.y1 + 60, self.x1 - 39, self.y1 + 118) @@ -173,12 +178,16 @@ class IslandProduct: class ItemNameOcr(Ocr): def after_process(self, result): result = super().after_process(result) - result = result.replace('蛮', '蜜').replace('茉', '末').replace('汗', '汁').replace('纠', '组') - result = re.sub(r'[^\u4e00-\u9fff]', '', result) - if '冰咖' in result: - result = '冰咖啡' - if '莓果香橙' in result: - result = '莓果香橙甜点组' + if server.server == 'cn': + result = result.replace('蛮', '蜜').replace('茉', '末').replace('汗', '汁').replace('纠', '组') + result = re.sub(r'[^\u4e00-\u9fff]', '', result) + if '冰咖' in result: + result = '冰咖啡' + if '莓果香橙' in result: + result = '莓果香橙甜点组' + elif server.server == 'en': + result = re.sub(r"[\s'-]+", "", result) + result = result.lower() return result @@ -192,7 +201,7 @@ class ProductItem: # All buttons on this page to click item_buttons: ButtonGrid - def __init__(self, image, y, get_button=True): + def __init__(self, image, y, parent_project_id, get_button=True): """ Args: image: @@ -205,6 +214,7 @@ class ProductItem: self.name = None self.button = None self.items = [] + self.parent_project_id = parent_project_id self.parse_item(get_button=get_button) def parse_item(self, get_button): @@ -230,7 +240,7 @@ class ProductItem: self.item_buttons = ButtonGrid(origin=(x1, origin_y), delta=(0, delta), button_shape=(x2 - x1, y2 - y1), grid_shape=(1, shape_y), name='ITEMS') - self.items = [ProductItem(self.image, (item.area[1], item.area[3]), get_button=False) + self.items = [ProductItem(self.image, (item.area[1], item.area[3]), self.parent_project_id, get_button=False) for item in self.item_buttons.buttons] else: self.ocr_name(y1, y2) @@ -267,8 +277,27 @@ class ProductItem: button = Button(area=area, color=(), button=area, name='ITEM_NAME') ocr = ItemNameOcr(button, lang='cnocr', letter=(70, 70, 70)) self.name = ocr.ocr(self.image) - if not self.name or self.name not in deep_values(items_data_cn, depth=2): + if server.server == 'cn' and (not self.name or self.name not in deep_values(items_data, depth=2)): self.valid = False + elif server.server == 'en': + self.valid = False + if not self.name: + return + for value in list(items_data[self.parent_project_id].values()): + can_scroll = len(value) > 13 + vmatcher = re.sub(r"[\s'-]+", "", value).lower() + if self.name == vmatcher: + logger.info(f'Product with valid name: {self.name} (exact matched {value})') + self.name = value + self.valid = True + break + elif self.name[1:-1] in vmatcher and (len(self.name) > 12 and can_scroll): + logger.info(f'Product with valid name: {self.name} (scroll matched {value})') + self.name = value + self.valid = True + break + if not self.valid: + logger.info(f'Product with invalid name: {self.name}') def __eq__(self, other): """ @@ -467,7 +496,7 @@ class IslandProjectRun(IslandUI): def get_character_check_button(character): return globals().get(f'PROJECT_{character.upper()}_CHECK', PRODUCT_MANJUU_CHECK) - def get_current_product(self): + def get_current_product(self, project_id): """ Get currently selected product on self.device.image. @@ -485,9 +514,9 @@ class IslandProjectRun(IslandUI): } peaks, _ = signal.find_peaks(line, **parameters) peaks = np.array(peaks) + y_top - return ProductItem(self.device.image, peaks) + return ProductItem(self.device.image, peaks, project_id) - def product_select(self, option, trial=2, skip_first_screenshot=True): + def product_select(self, option, project_id, trial=2, skip_first_screenshot=True): """ Select a product in items list. @@ -509,7 +538,7 @@ class IslandProjectRun(IslandUI): else: self.device.screenshot() - current = self.get_current_product() + current = self.get_current_product(project_id) if trial > 0 and not len(current.items): trial -= 1 continue @@ -581,7 +610,8 @@ class IslandProjectRun(IslandUI): continue button = PROJECT_START - self.appear(button, offset=(100, 0)) + timer_offset = {'cn':100, 'en':60}[server.server] + self.appear(button, offset=(timer_offset, 0)) offset = tuple(np.subtract(button.button, button._button)[:2]) product = IslandProduct(self.device.image, new=True, offset=offset) if product == last: @@ -641,7 +671,7 @@ class IslandProjectRun(IslandUI): self.island_drag_next_page((0, -500), ISLAND_PROJECT_SWIPE.area, 0.6) - def project_receive_and_start(self, proj, button, character, option, ensure=True): + def project_receive_and_start(self, proj, button, character, option, project_id, ensure=True): """ Receive and start a project is in the current page. @@ -657,7 +687,7 @@ class IslandProjectRun(IslandUI): if not self.project_character_select(character): logger.warning('Island select role failed due to game bug, retrying') return False - if not self.product_select(option): + if not self.product_select(option, project_id): return True if not self.product_select_confirm(): self.character = 'manjuu' @@ -695,7 +725,7 @@ class IslandProjectRun(IslandUI): if option == 0: slot_option.append(None) continue - slot_option.append(deep_get(items_data_cn, [proj_id, option])) + slot_option.append(deep_get(items_data, [proj_id, option])) return slot_option def island_project_run(self, names, trial=2, skip_first_screenshot=True): @@ -747,7 +777,7 @@ class IslandProjectRun(IslandUI): # retry 3 times because of a game bug for _ in range(3): ensure = not end or index != option_num - 1 - if self.project_receive_and_start(proj, button, self.character, option, ensure): + if self.project_receive_and_start(proj, button, self.character, option, proj.id, ensure): break timeout.reset() diff --git a/module/island/project_data.py b/module/island/project_data.py index 4c19afd23..423e42929 100644 --- a/module/island/project_data.py +++ b/module/island/project_data.py @@ -1,10 +1,12 @@ -name_to_slot_cn = { +import module.config.server as server + +__name_to_slot_cn = { '丰壤农田': 4, '悠然牧场': 4, '沉石矿山': 4, '翠土林场': 4, '坠香果园': 4, '青芽苗圃': 2, '有鱼餐馆': 2, '白熊饮品': 2, '啾啾简餐': 2, '乌鱼烤肉': 2, '木料加工设备': 2, '工业生产设备': 2, '电子加工设备': 2, '手工制作设备': 2, '啾咖啡': 2 } -items_data_cn = { +__items_data_cn = { 1: { 1: '小麦', 2: '玉米', 3: '牧草', 4: '咖啡豆', 5: '大米', 6: '白菜', 7: '土豆', 8: '大豆', @@ -61,3 +63,79 @@ items_data_cn = { 6: '草莓奶绿', 7: '晨光活力组合', 8: '醒神套餐', 9: '果香双杯乐', }, } + + +__name_to_slot_en = { + 'faircropfields': 4, 'laidbackranch': 4, 'rockheapmine': 4, 'verdantwoods': 4, 'sweetscentorchard': 4, 'newsproutnursery': 2, + 'goldenkoirestaurant': 2, 'polarbearteahouse': 2, 'manjuueatery': 2, "finnfeathergrill": 2, 'lumberprocessing': 2, 'machineryproduction': 2, + 'electronicproduction': 2, 'arts&craftsproduction': 2, 'cafemanjuu': 2 +} + +__items_data_en = { + 1: { + 1: 'Wheat', 2: 'Corn', 3: 'Grass', 4: 'CoffeeBeans', 5: 'Rice', 6: 'Napa Cabbage', + 7: 'Potato', 8: 'Soy Beans', + }, + 2: { + 1: 'Eggs', 2: 'Fresh Meat', 3: 'Milk', 4: 'Wool', + }, + 3: { + 1: 'Coal', 2: 'Copper Ore', 3: 'Bauxite Ore', 4: 'Iron Ore', 5: 'Sulfur', 6: 'Silver Ore', + }, + 4: { + 1: 'Raw Timber', 2: 'Workable Wood', 3: 'remium Wood', 4: 'Elegant Wood', # remium Wood because it overruns on the left + }, + 5: { + 1: 'Yoizuki Pear', 2: 'Kaki Persimmon', 3: 'Apple', 4: 'Citrus Fruit', 5: 'Banana', 6: 'Mango', + 7: 'Lemon', 8: 'Avocado', 9: 'Rubber', + }, + 6: { + 1: 'Flax', 2: 'Strawberries', 3: 'Cotton', 4: 'Tea Leaves', 5: 'Lavender', 6: 'Carrot', + 7: 'Onion', + }, + 7: { + 1: 'Dried Persimmon', 2: 'Matsutake and Chicken Soup', 3: 'Tofu', 4: 'Tofu with Minced Meat', 5: 'Omurice', + 6: 'Cabbage and Tofu Soup', 7: 'Vegetable Salad', 8: 'Classic Tofu Combo', 9: 'Hearty Meal', + }, + 8: { + 1: 'Carrot and Pear Juice', 2: 'Chrysanthemum Tea', 3: 'Apple Juice', 4: 'Banana and Mango Juice', + 5: 'Honey and Lemon Water', 6: 'Strawberry Lemon Drink', 7: 'Lavender Tea', 8: 'Strawberry Honey Frappe', + 9: 'Floral and Fruity', 10: 'Colorful Fruit Paradise', 11: 'Sunny Honey', + }, + 9: { + 1: 'Corn Cup', 2: 'Apple Pie', 3: 'Orange Pie', 4: 'Sticky Rice with Mango', 5: 'Banana Crepe', + 6: 'Strawberry Charlotte', 7: 'Succulently Sweet', 8: 'Orchard Duo', 9: 'Berry and Orange Dessert', + }, + 10: { + 1: 'Coal-Roasted Skewer', 2: "Chicken and Potato Hors d'Oeuvre", 3: 'Stir-Fried Chicken', 4: 'Rolled Carrot Omelette', + 5: 'Steak Bowl', 6: 'The Carne-val', 7: 'Double Energy Combo', + }, + 11: { + 1: 'Paper', 2: 'Notebook', 3: 'Chair and Desk', 4: 'Choice Wooden Barrel', 5: 'Filing Cabinet', + }, + 12: { + 1: 'Charcoal Brush', 2: 'Cable', 3: 'Nails', 4: 'Chemicals', 5: 'Gunpowder', 6: 'Utensils', + }, + 13: { + 1: 'Ink Cartridge', 2: 'Clock', 3: 'Battery', 4: 'Water Filter', + }, + 14: { + 1: 'Autumn Bouquet', 2: 'Peanut Oil', 3: 'Cloth', 4: 'Leather', 5: 'Rope', 6: 'Gloves', + 7: 'Aroma Sachet', 8: 'Shoes', 9: 'Wound Dressings', + }, + 15: { + 1: 'Omelette', 2: 'Iced Coffee', 3: 'Cheese', 4: 'Latte', 5: 'Citrus Coffee', + 6: 'Strawberry Milkshake', 7: 'Morning Light Energy Combo', 8: 'The Wake-Up Call', 9: 'Fruity & Fruitier', + }, +} + + +if server.server == 'cn': + name_to_slot = __name_to_slot_cn + items_data = __items_data_cn +elif server.server == 'en': + name_to_slot = __name_to_slot_en + items_data = __items_data_en +else: + name_to_slot = __name_to_slot_cn + items_data = __items_data_cn diff --git a/module/ui/assets.py b/module/ui/assets.py index f58168116..006d17072 100644 --- a/module/ui/assets.py +++ b/module/ui/assets.py @@ -49,8 +49,8 @@ GUILD_CHECK = Button(area={'cn': (121, 15, 199, 39), 'en': (121, 15, 196, 39), ' IDLE = Button(area={'cn': (864, 672, 873, 688), 'en': (864, 672, 873, 688), 'jp': (864, 672, 873, 688), 'tw': (864, 672, 873, 688)}, color={'cn': (158, 159, 167), 'en': (158, 159, 167), 'jp': (158, 159, 167), 'tw': (158, 159, 167)}, button={'cn': (864, 672, 873, 688), 'en': (864, 672, 873, 688), 'jp': (864, 672, 873, 688), 'tw': (864, 672, 873, 688)}, file={'cn': './assets/cn/ui/IDLE.png', 'en': './assets/en/ui/IDLE.png', 'jp': './assets/jp/ui/IDLE.png', 'tw': './assets/tw/ui/IDLE.png'}) IDLE_2 = Button(area={'cn': (864, 672, 873, 688), 'en': (864, 672, 873, 688), 'jp': (864, 672, 873, 688), 'tw': (864, 672, 873, 688)}, color={'cn': (173, 178, 186), 'en': (173, 178, 186), 'jp': (173, 178, 186), 'tw': (173, 178, 186)}, button={'cn': (864, 672, 873, 688), 'en': (864, 672, 873, 688), 'jp': (864, 672, 873, 688), 'tw': (864, 672, 873, 688)}, file={'cn': './assets/cn/ui/IDLE_2.png', 'en': './assets/cn/ui/IDLE_2.png', 'jp': './assets/cn/ui/IDLE_2.png', 'tw': './assets/cn/ui/IDLE_2.png'}) IDLE_3 = Button(area={'cn': (864, 672, 873, 688), 'en': (864, 672, 873, 688), 'jp': (864, 672, 873, 688), 'tw': (864, 672, 873, 688)}, color={'cn': (185, 183, 182), 'en': (185, 183, 182), 'jp': (185, 183, 182), 'tw': (185, 183, 182)}, button={'cn': (864, 672, 873, 688), 'en': (864, 672, 873, 688), 'jp': (864, 672, 873, 688), 'tw': (864, 672, 873, 688)}, file={'cn': './assets/cn/ui/IDLE_3.png', 'en': './assets/cn/ui/IDLE_3.png', 'jp': './assets/cn/ui/IDLE_3.png', 'tw': './assets/cn/ui/IDLE_3.png'}) -ISLAND_CHECK = Button(area={'cn': (1215, 26, 1245, 60), 'en': (1215, 26, 1245, 60), 'jp': (1215, 26, 1245, 60), 'tw': (1215, 26, 1245, 60)}, color={'cn': (191, 192, 190), 'en': (191, 192, 190), 'jp': (191, 192, 190), 'tw': (191, 192, 190)}, button={'cn': (1215, 26, 1245, 60), 'en': (1215, 26, 1245, 60), 'jp': (1215, 26, 1245, 60), 'tw': (1215, 26, 1245, 60)}, file={'cn': './assets/cn/ui/ISLAND_CHECK.png', 'en': './assets/cn/ui/ISLAND_CHECK.png', 'jp': './assets/cn/ui/ISLAND_CHECK.png', 'tw': './assets/cn/ui/ISLAND_CHECK.png'}) -ISLAND_GOTO_ISLAND_PHONE = Button(area={'cn': (1215, 26, 1245, 60), 'en': (1215, 26, 1245, 60), 'jp': (1215, 26, 1245, 60), 'tw': (1215, 26, 1245, 60)}, color={'cn': (191, 192, 190), 'en': (191, 192, 190), 'jp': (191, 192, 190), 'tw': (191, 192, 190)}, button={'cn': (1215, 26, 1245, 60), 'en': (1215, 26, 1245, 60), 'jp': (1215, 26, 1245, 60), 'tw': (1215, 26, 1245, 60)}, file={'cn': './assets/cn/ui/ISLAND_GOTO_ISLAND_PHONE.png', 'en': './assets/cn/ui/ISLAND_GOTO_ISLAND_PHONE.png', 'jp': './assets/cn/ui/ISLAND_GOTO_ISLAND_PHONE.png', 'tw': './assets/cn/ui/ISLAND_GOTO_ISLAND_PHONE.png'}) +ISLAND_CHECK = Button(area={'cn': (1215, 26, 1245, 60), 'en': (1215, 26, 1245, 60), 'jp': (1215, 26, 1245, 60), 'tw': (1215, 26, 1245, 60)}, color={'cn': (191, 192, 190), 'en': (187, 188, 188), 'jp': (191, 192, 190), 'tw': (191, 192, 190)}, button={'cn': (1215, 26, 1245, 60), 'en': (1215, 26, 1245, 60), 'jp': (1215, 26, 1245, 60), 'tw': (1215, 26, 1245, 60)}, file={'cn': './assets/cn/ui/ISLAND_CHECK.png', 'en': './assets/en/ui/ISLAND_CHECK.png', 'jp': './assets/cn/ui/ISLAND_CHECK.png', 'tw': './assets/cn/ui/ISLAND_CHECK.png'}) +ISLAND_GOTO_ISLAND_PHONE = Button(area={'cn': (1215, 26, 1245, 60), 'en': (1215, 26, 1245, 60), 'jp': (1215, 26, 1245, 60), 'tw': (1215, 26, 1245, 60)}, color={'cn': (191, 192, 190), 'en': (24, 0, 0), 'jp': (191, 192, 190), 'tw': (191, 192, 190)}, button={'cn': (1215, 26, 1245, 60), 'en': (1215, 26, 1245, 60), 'jp': (1215, 26, 1245, 60), 'tw': (1215, 26, 1245, 60)}, file={'cn': './assets/cn/ui/ISLAND_GOTO_ISLAND_PHONE.png', 'en': './assets/en/ui/ISLAND_GOTO_ISLAND_PHONE.png', 'jp': './assets/cn/ui/ISLAND_GOTO_ISLAND_PHONE.png', 'tw': './assets/cn/ui/ISLAND_GOTO_ISLAND_PHONE.png'}) ISLAND_PHONE_CHECK = Button(area={'cn': (1037, 644, 1077, 680), 'en': (1037, 644, 1077, 680), 'jp': (1037, 644, 1077, 680), 'tw': (1037, 644, 1077, 680)}, color={'cn': (138, 150, 163), 'en': (138, 150, 163), 'jp': (138, 150, 163), 'tw': (138, 150, 163)}, button={'cn': (1037, 644, 1077, 680), 'en': (1037, 644, 1077, 680), 'jp': (1037, 644, 1077, 680), 'tw': (1037, 644, 1077, 680)}, file={'cn': './assets/cn/ui/ISLAND_PHONE_CHECK.png', 'en': './assets/cn/ui/ISLAND_PHONE_CHECK.png', 'jp': './assets/cn/ui/ISLAND_PHONE_CHECK.png', 'tw': './assets/cn/ui/ISLAND_PHONE_CHECK.png'}) ISLAND_PHONE_GOTO_ISLAND = Button(area={'cn': (1037, 644, 1077, 680), 'en': (1037, 644, 1077, 680), 'jp': (1037, 644, 1077, 680), 'tw': (1037, 644, 1077, 680)}, color={'cn': (138, 150, 163), 'en': (138, 150, 163), 'jp': (138, 150, 163), 'tw': (138, 150, 163)}, button={'cn': (16, 8, 80, 72), 'en': (16, 8, 80, 72), 'jp': (16, 8, 80, 72), 'tw': (16, 8, 80, 72)}, file={'cn': './assets/cn/ui/ISLAND_PHONE_GOTO_ISLAND.png', 'en': './assets/cn/ui/ISLAND_PHONE_GOTO_ISLAND.png', 'jp': './assets/cn/ui/ISLAND_PHONE_GOTO_ISLAND.png', 'tw': './assets/cn/ui/ISLAND_PHONE_GOTO_ISLAND.png'}) ISLAND_PHONE_GOTO_MAIN = Button(area={'cn': (1037, 644, 1077, 680), 'en': (1037, 644, 1077, 680), 'jp': (1037, 644, 1077, 680), 'tw': (1037, 644, 1077, 680)}, color={'cn': (138, 150, 163), 'en': (138, 150, 163), 'jp': (138, 150, 163), 'tw': (138, 150, 163)}, button={'cn': (1037, 644, 1077, 680), 'en': (1037, 644, 1077, 680), 'jp': (1037, 644, 1077, 680), 'tw': (1037, 644, 1077, 680)}, file={'cn': './assets/cn/ui/ISLAND_PHONE_GOTO_MAIN.png', 'en': './assets/cn/ui/ISLAND_PHONE_GOTO_MAIN.png', 'jp': './assets/cn/ui/ISLAND_PHONE_GOTO_MAIN.png', 'tw': './assets/cn/ui/ISLAND_PHONE_GOTO_MAIN.png'})