From de8aa91ed0e5fc7dfaf51c62a614ea713d6f286a Mon Sep 17 00:00:00 2001 From: sui-feng-cb <2518179942@qq.com> Date: Sun, 10 May 2026 04:32:59 +0800 Subject: [PATCH] Add: buy dorm food when oil overflow during commission receive --- assets/cn/commission/OIL_MAXED.png | Bin 0 -> 7000 bytes assets/cn/dorm/DORM_BUY_FOOD_CHECK.png | Bin 0 -> 6421 bytes assets/cn/dorm/DORM_BUY_FOOD_CONFIRM.png | Bin 0 -> 4238 bytes assets/cn/dorm/DORM_BUY_FOOD_ENTER.png | Bin 0 -> 3540 bytes assets/cn/dorm/FOOD_MINUS.png | Bin 0 -> 3686 bytes assets/cn/dorm/FOOD_PLUS.png | Bin 0 -> 3575 bytes assets/cn/dorm/OCR_DORM_BUY_FOOD_AMOUNT.png | Bin 0 -> 4194 bytes module/commission/assets.py | 1 + module/commission/commission.py | 12 ++ module/dorm/assets.py | 6 + module/dorm/dorm.py | 127 +++++++++++--------- 11 files changed, 90 insertions(+), 56 deletions(-) create mode 100644 assets/cn/commission/OIL_MAXED.png create mode 100644 assets/cn/dorm/DORM_BUY_FOOD_CHECK.png create mode 100644 assets/cn/dorm/DORM_BUY_FOOD_CONFIRM.png create mode 100644 assets/cn/dorm/DORM_BUY_FOOD_ENTER.png create mode 100644 assets/cn/dorm/FOOD_MINUS.png create mode 100644 assets/cn/dorm/FOOD_PLUS.png create mode 100644 assets/cn/dorm/OCR_DORM_BUY_FOOD_AMOUNT.png diff --git a/assets/cn/commission/OIL_MAXED.png b/assets/cn/commission/OIL_MAXED.png new file mode 100644 index 0000000000000000000000000000000000000000..9baa15826acd4d88fef6911d04deffe962d826c1 GIT binary patch literal 7000 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 literal 0 HcmV?d00001 diff --git a/assets/cn/dorm/DORM_BUY_FOOD_CHECK.png b/assets/cn/dorm/DORM_BUY_FOOD_CHECK.png new file mode 100644 index 0000000000000000000000000000000000000000..f01963a7d9b599cf4ae2b65f698b1f994de260f1 GIT binary patch literal 6421 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�lhhwq0*u;u*?UN_Fx*hx9*WPECnR?*%uT*@Q6fu3im`Zi`QiH zIaNwN@~n}$`u+Ug4%GFU+npb`AH9V3;mn)KYx?bO&81pDjUaG?cXG*V>wE^MR*>@JRRCK|jG(jh_%ieGo=}zk?m4IT-IRa9Tnn zQE2nLO{UfLcTu;F|D+Hq&l?l06p2^cT9b*KkzaA1o2hd1HdgT1_>;_PsBhE%7MRv7z!1eSRbsLyG zEJ@TGkE(8o|2k}~3t?uoxp^uSnPHy?#DK!M?a>qm+)VB9mFX-qYH<5^TEa@B3syZi zG*Y3HVL?Wovr><|$VLR4=U!Hk?JS6FP2kdr#ldj?xP_(V_NOz{lvOT|7ZDtc5s#4b z?ksywccn6C9fV=~Q7&qooZ9BOv;SREG*lwhsiO_}2y@dzRc`ha@3$o-%1z#h8;|HgR2J7uNoR!5zYwXaO|t z6Svm}>*W1TeXj&T2K0*@dtS7n({Iw|)BKH;7g<-*Y;C2ar4=+xS62sIuIc2)%@2;% z+_DK}u#N_u*2`>Yur0P3bpJ z=rfh4gd^wYz47_^&3j*he`!Ci9|V37_({JI$9DS~0l-%wKFIH|DPqO=Ojcp&F4I4x;To5; zC$sws?hbZ|gQ5#?VR^otXb_`e?N(!4U^RB_I_RbK%YO@^R4Ey-n7Jz@UYC)3PlICY zg{WSf-*-I~BXXU92cIY;5P0kpsGfq%%wqF@I?o^F5newc3znX1+3Q!L8-_u^AYc$M z2p9wm0)J6}uD5ax27s}CFrny?MDh0fjp;{AA@DY)xWg__O=3dhD!Vv!297+=F$>pVTL~Ts0R>Z7&so(S#`NGpikZWyTI| zIMSmwKWYJcFy<`y7+?ZCtg-t!N{)Kxt3Z!_z)a;%OUvy@b=FrBcy_nbCobK(A|)mnF54D33`$kDPpC z%OrWIH}WOF-9O$3;yzgO)BNIa-ww*by>IwNE~5R4>^W|nzR&B>zR2tp$w%Y$?Et`b zraHHpn2UE?>9v7o_&tzfPIm_lE z)kt;ZFt|iu0irRxR4q$^(Kck|c%-Ar7nZ4ig}XMJmq*3HJBKQRX2;coQ%$@JjR|;i z#HoF3C6kS3kR2@XxgdlD{3F$|GX0iUcf>biL!~pPlcd|Uj=W8K0AnC2{FS8PbyKv$ z6H6$2^bJ`_7Ac4sF6a&|<)dVmFyq|4u0=oGt_Xb2cz}2G64~fmPGu2_W-(dqe>(** z+5z0*kr6j7&ii(lzJ0#C@+Me~?CHc2Y9^Xtu zvsI@;(&Z7pEzjiPVCJpsENsrH3<5#jVSUMRQkOAe5KCW#M( zv#-s+5Q<0tcLVu3(AyL!5rAkZmUQmg(HOgTviqWm$;>0ti-hiM^qh!tbJn#vIL*G8#o2J z!h*R^3{U+7Qz*0IM4Q!Bk8QjvK55W0Y8iHl?HY_{PPUC&Z2S^$414+K;L%!}?Lro_ z9XylBvOiwJ%{yxq3$=JJF1~bI+tiSHAgIKm%=-)pZp?krIl0{?l0JG&vK0Utb0uk| zpWUH4nF=GxtJ`0gL!%yX)HMw9J}BN#$djYgQX(zHn)xPx5L<4A3G)jzfiUXJMw~i; zF%K-=h(3ye&&uvQ{3nr%Bnotq9>NJufV-0l`O(@>`O2~D-Q2J`ZvfOBOPc|$a3$E( zZZG45>-)5>py3+KkQ3Z&Rm^$zcpg!TsyUi zVsnw|sv7Zsy%^)Rtwzrpo=f5HuY+uXRc@ibf{AA1kn!i>Uu(MlAh@JgD!gOSo2AbG zZ7L@sTljMN$FjV}eo_CqgVZeJaj}uLIg0IPtO`MZSuPaork`c4iUD zc&L21nW_;Ev#LYSyiwoOQa>odtur&cgR|~UPblz`l#_N9vhT-}k)byVgR##c#bEoD rmq(KFWV`?3A8*)h5cvNTAobFWg4p?pnrhtPFBSM4_ea)wp1$-aSokZp literal 0 HcmV?d00001 diff --git a/assets/cn/dorm/DORM_BUY_FOOD_ENTER.png b/assets/cn/dorm/DORM_BUY_FOOD_ENTER.png new file mode 100644 index 0000000000000000000000000000000000000000..6864988038039a501ee9de32c380f3cd03e420c3 GIT binary patch literal 3540 zcmeAS@N?(olHy`uVBq!ia0y~yUu%Ihd{{@Ik^ zKg^v&SE^B@W}$&ktXS4vww9N1HQe(!{0z2=ysH#aArV1NACpMPD9Z}_^UFMn^^5xw7T#=89* zKF>5_@=jgA!oYCm_2u_>QmXIX;dsBV?#({qt1CF)*W3L1a(daB``5xRCNWM62?5q0 z&z2T$ezA4_tiS4V=lJuE3eW!d<>ZGqlQ+(Kv;5DR@^ae#qgO%hXI?F-)67rFX7yAlJ^*h)S3td!dN{q>aO6~S|+ zbZXuB!vj_~&m#Blx9fM@ALK3K-xYh@e90>QeUS$nM1SmNV_^8aZ0C0V{gFplSrQl+ z`YL$#eNFZFucXVYV;;SLks(53YkTz5tl$5t^7Vap^+Z1}+4RCjh32iU<4clX}$so5ef(7?!G@yhPM zRc&eJl>cSFLOHtQx9_fwh0|X@85klSyxIBOdsFYidscJRC!4WPH`o)m zz4FJKjsKVT=^1;q@43f?>s~oVZV5a7`ntPixV5$T6u}5BzJp8*2@?fw z1us}#^YwX&L3nuTocg_y@@INx{W+|k8L}*xE7r!&PGaejngd3gSfv;mj;6&k)MQ*w z`0?Dg<&yq}EhRulMkpN7JMm1btoMQ4mt*T{jWizH^zPi)dpI$`H)vi-d9xU|0w^}4 zisn~4^ZniZ?ULL5vf?i~>g6Xbwv^|sZ}T%xQyM}Oz@fH8X7#)7J}1Awl^5Qo%$l-e_wL!nQr~_r$p3S%=lE~K zD@6ui+h*N5BfWY~a_7OyTYq!~cbtj)x9{h(TR*OxEYp7|K7CfmrcLc$4h(Dz38C`B z?XP_|-|zc%{_nlAPgni-KMlYC@9{n1T!w$&j-Naf-+$5lEq$`ws4b%*Fd71*AwY2m c{FwijRr?M9RJX^6^gxDry85}Sb4q9e09e?_LjV8( literal 0 HcmV?d00001 diff --git a/assets/cn/dorm/FOOD_MINUS.png b/assets/cn/dorm/FOOD_MINUS.png new file mode 100644 index 0000000000000000000000000000000000000000..a0b72706947e9cd96c071fad20e4cb824c65c390 GIT binary patch literal 3686 zcmeAS@N?(olHy`uVBq!ia0y~yUXJXx@*9j~_?z0!0*kCTi>pVK^$Nv5F(4@xwJX8N8iylc61_uV_fUUpIexC7s^38LTCG?VNK7V`5@4ug4QIo%i zfBH%3WsGxrUT@#=V}~IN1B(HJsDTXM^ZAVLzE-KXuSUhk+gn-v%B}x@X?4F_zVog+ z`5#3r;_tX2M$A}K8!GlLY58O`Df_o?e3m);@A|G(c>MRns4rr!CT(DYyclEN@v}EC zUApw{-MfnyFIGAxEmiTY%vu?>7@9J$&eYEb*{{35a z{5XBiZ~y)IapjiH>DuwE-3j32mBrzC^MK(orPEIH%(J()hP{s49qWDhe0W%0-N#2? zSBGD|x*;#?!Hnl^0^r2HxZyM#pJJz?2P8TzdR0XZS-mSCx=#6(JX7aXL(mSrdj$P9hDw6k~2^2Z6zPztt zo?l+Tv6!dtX}{azGY^*V+?6mlGpoCM*Ve*fMr=h<(WN4G2^y3RqehN~z-S1Jh5)TX c;6eOP=~|{Ed;P_`y+C$&y85}Sb4q9e0K2^gYXATM literal 0 HcmV?d00001 diff --git a/assets/cn/dorm/FOOD_PLUS.png b/assets/cn/dorm/FOOD_PLUS.png new file mode 100644 index 0000000000000000000000000000000000000000..df703a5143822ee50b9b62f178caac44f89eddc0 GIT binary patch literal 3575 zcmeAS@N?(olHy`uVBq!ia0y~yUGn7h!g^eQWm~$He8N)B3%%J{zieh5oy%yJ z-uP~HvHc+9qFmtO{giy2#X?u@MW zpQPe@x%%IRn>nlG8W?yOHW+=fncsi@{CR&rzpA})GRHla&Y5;}BLmNe^;}*I3>%)P z+<95DZTt5AzCI_8(sz5c|1xcG_;;0wK}Yj@ow-Jj+v3xwPuJ~_?@^!ZDcD>e!?%{1 zXM={-0R{&CW!GPe{`_`%x&P4}9*4ri!|mHr7{pxJB^VMUH{G^6@OkBp_4{Rc>guK~ z%goNzZQ0~%7%%eo@+>|Bu)CTVcbq#=%EMPU!~M~H`#PW5Ys+@u%`kbz6Z5*%dKJ3@ z12e-KKZbLke*RhAv;S(gY)SX@s+zJgGn;?O$;rwg&z-^}Ev3H9Um{{W$6C%eKiXMgSSCE)8DsWwD%`ReS7{g zQ?T*%zYh;G{l7AZIe{F$@>Bl2{k7}2F#e0eE60S;l&9P7|DG2q zSk~@RFp7U^yi7W zAOGs3%lT~$qmJ7ukPD3Z4}8?U|M*kEi(l>^&$=G05@ldAU^t+)>)lH?^M~7b_NBhs ztNZ*~W`&KMwlp}XvOa07zmzAMx41s%17Cl?J%9TtwhbEFrZ6z*c;Ec8H(9;lW9>he zz-g(~)xS6ERR8<4a}%RZ7a!12=AFts{l_2k%iDeV{rA(4)i=x%7#JlO9$cJxHtq1k z52q{cyenCDIdk(>p$0~l1cnCp7k6)O|9f!3?YGM^XQ_BDzRA^jQwr>cqJ7byV#>=` zw_bSsv7(}6%hs);q1*p$yZ!c6$%_X{DqvGTR{a0>_xk3|2RElH`bMt}6YOy2h@93c zu$xOFp>YlqFT)0&!V>QpbI+z#|Nbq#_ulF7^^XLkdfk>^_Po61hum@3KWB3p*&-BV zfi7t;EGjChsMxW2^JEpzdCy(VMglyp!LraQ)HQ5{<* z+9vK9;xcI`^y`vn$1-uPBH0v?ic+F+i9rxH{U`Q$_IdLD<(%Kn`MjRb=lpQ;QNjK? zTEJTnP~{JpB7W8REd-wMK{tdVI$n0Ha9mH zRmIh#%YXhk{X;%G#vXsazY^m`p_G^F<{~VOE8%#%1EARrx;^sy9E3vQRl-`CL+r4& z_MYvD`4lAWo3td}GYEoQ@kVCMG(q=w8X*OJM-vkhJJMFP-WO-Kgh46mbM;InlTKf2 zZ+}}?CAlT9=$=0}teKm~xJkhAuzkx^=P1qQlHJWkdMj!S^Xuji{47!nMB! z9%o60TT-DZ2A0duTxruI8{KIRgQ}ed6w;!Un@>j+US{i97`+-wk{EITWIz5Fm8yc8$LaKo1CF8h>JRW2B2#$ z)sJ(z-kzSO{fqec5%M&a(|-N0 zMASOp6JH^aQi4~Hz_-$lnw>x(?7d}(DwzyMEu9XlnSJ^4B~Ldrlyp-fk>z-%Zi$OC z)O~z42ap0m2z6-&jCt>+2G%Nwz`HUv;{Q>upnJd}Q=lK`zqMne1}9UnK% zbZq^JUfMlK8X4@dCvC{qgEj(cAR2RYh)%SdpVB1-^;)T{o}nvi%e&cXf=;LZQ$x>> z?es7JpT>GUKJIen%(2L;llW9rQ#+ohHZr*f3%X_4A<4p)QKHj(DX?gk1hia8khhpCsiMXpA9`AE4_cXDl zsqg!_xw$;^{kY_0JG}gjieNFZYqNfOSy-;R3aYXZsQCD4!G3FPZH6G}%eol*heI6s z#X3*1Ivr|wM{R-&3kyq~1N+7nH|~Aredi;C;{S~%ZgR6Eik?2(!i(3vc0{sVu zUnS6Jw9N6XA0QUeGV*Vq17$m4M^Roq_)$J5iYNpW0t$iuJAqZ4)P2c1a<{%f`soV+ Noc9YxH2Yq=`(Fx3CiMUS literal 0 HcmV?d00001 diff --git a/module/commission/assets.py b/module/commission/assets.py index d775a0927..32f9d3ba4 100644 --- a/module/commission/assets.py +++ b/module/commission/assets.py @@ -11,5 +11,6 @@ COMMISSION_SCROLL_AREA = Button(area={'cn': (1254, 77, 1261, 676), 'en': (1254, COMMISSION_START = Button(area={'cn': (1028, 322, 1156, 383), 'en': (1053, 333, 1134, 361), 'jp': (1033, 340, 1153, 376), 'tw': (1027, 326, 1157, 389)}, color={'cn': (229, 175, 113), 'en': (237, 199, 149), 'jp': (231, 184, 121), 'tw': (231, 180, 120)}, button={'cn': (1028, 322, 1156, 383), 'en': (1053, 333, 1134, 361), 'jp': (1033, 340, 1153, 376), 'tw': (1027, 326, 1157, 389)}, file={'cn': './assets/cn/commission/COMMISSION_START.png', 'en': './assets/en/commission/COMMISSION_START.png', 'jp': './assets/jp/commission/COMMISSION_START.png', 'tw': './assets/tw/commission/COMMISSION_START.png'}) COMMISSION_URGENT = Button(area={'cn': (35, 231, 68, 281), 'en': (28, 221, 76, 283), 'jp': (34, 266, 68, 279), 'tw': (35, 229, 69, 280)}, color={'cn': (215, 188, 124), 'en': (169, 138, 95), 'jp': (216, 190, 111), 'tw': (213, 186, 123)}, button={'cn': (35, 231, 68, 281), 'en': (28, 221, 76, 283), 'jp': (34, 266, 68, 279), 'tw': (35, 229, 69, 280)}, file={'cn': './assets/cn/commission/COMMISSION_URGENT.png', 'en': './assets/en/commission/COMMISSION_URGENT.png', 'jp': './assets/jp/commission/COMMISSION_URGENT.png', 'tw': './assets/tw/commission/COMMISSION_URGENT.png'}) EXP_INFO_S_REWARD = Button(area={'cn': (498, 140, 557, 154), 'en': (1138, 40, 1266, 145), 'jp': (498, 140, 557, 154), 'tw': (498, 140, 557, 154)}, color={'cn': (233, 241, 127), 'en': (89, 115, 159), 'jp': (233, 241, 127), 'tw': (233, 241, 127)}, button={'cn': (498, 140, 557, 154), 'en': (1138, 40, 1266, 145), 'jp': (498, 140, 557, 154), 'tw': (498, 140, 557, 154)}, file={'cn': './assets/cn/commission/EXP_INFO_S_REWARD.png', 'en': './assets/en/commission/EXP_INFO_S_REWARD.png', 'jp': './assets/jp/commission/EXP_INFO_S_REWARD.png', 'tw': './assets/tw/commission/EXP_INFO_S_REWARD.png'}) +OIL_MAXED = Button(area={'cn': (428, 310, 534, 335), 'en': (428, 310, 534, 335), 'jp': (428, 310, 534, 335), 'tw': (428, 310, 534, 335)}, color={'cn': (106, 103, 110), 'en': (106, 103, 110), 'jp': (106, 103, 110), 'tw': (106, 103, 110)}, button={'cn': (428, 310, 534, 335), 'en': (428, 310, 534, 335), 'jp': (428, 310, 534, 335), 'tw': (428, 310, 534, 335)}, file={'cn': './assets/cn/commission/OIL_MAXED.png', 'en': './assets/cn/commission/OIL_MAXED.png', 'jp': './assets/cn/commission/OIL_MAXED.png', 'tw': './assets/cn/commission/OIL_MAXED.png'}) REWARD_1 = Button(area={'cn': (383, 285, 503, 297), 'en': (403, 274, 504, 290), 'jp': (432, 273, 476, 294), 'tw': (383, 285, 503, 297)}, color={'cn': (238, 168, 81), 'en': (241, 198, 145), 'jp': (241, 188, 122), 'tw': (238, 168, 81)}, button={'cn': (383, 285, 503, 297), 'en': (392, 262, 515, 303), 'jp': (403, 271, 514, 303), 'tw': (383, 285, 503, 297)}, file={'cn': './assets/cn/commission/REWARD_1.png', 'en': './assets/en/commission/REWARD_1.png', 'jp': './assets/jp/commission/REWARD_1.png', 'tw': './assets/tw/commission/REWARD_1.png'}) REWARD_SAVE_CLICK = Button(area={'cn': (415, 184, 496, 214), 'en': (415, 184, 496, 214), 'jp': (415, 184, 496, 214), 'tw': (415, 184, 496, 214)}, color={'cn': (152, 150, 168), 'en': (152, 150, 168), 'jp': (152, 150, 168), 'tw': (152, 150, 168)}, button={'cn': (415, 184, 496, 214), 'en': (415, 184, 496, 214), 'jp': (415, 184, 496, 214), 'tw': (415, 184, 496, 214)}, file={'cn': './assets/cn/commission/REWARD_SAVE_CLICK.png', 'en': './assets/en/commission/REWARD_SAVE_CLICK.png', 'jp': './assets/jp/commission/REWARD_SAVE_CLICK.png', 'tw': './assets/tw/commission/REWARD_SAVE_CLICK.png'}) diff --git a/module/commission/commission.py b/module/commission/commission.py index 08a70a4d8..d301337e8 100644 --- a/module/commission/commission.py +++ b/module/commission/commission.py @@ -11,6 +11,7 @@ from module.commission.preset import DICT_FILTER_PRESET, SHORTEST_FILTER from module.commission.project import COMMISSION_FILTER, Commission from module.config.config_generated import GeneratedConfig from module.config.utils import get_server_last_update, get_server_next_update +from module.dorm.dorm import RewardDorm from module.exception import GameStuckError from module.handler.info_handler import InfoHandler from module.logger import logger @@ -507,6 +508,7 @@ class RewardCommission(UI, InfoHandler): logger.hr('Reward receive') reward = False + food = False click_timer = Timer(1) with self.stat.new( 'commission', method=self.config.DropRecord_CommissionRecord @@ -557,6 +559,16 @@ class RewardCommission(UI, InfoHandler): # no need to reset click_timer, just instant click REWARD_1 # click_timer.reset() continue + # handle oil maxed + # run once to prevent accidental oil consumption + if self.config.SERVER in ['cn']: + if not food and self.appear(OIL_MAXED, offset=(20, 20), interval=3): + logger.info("Oil maxed, buy food to consume oil") + RewardDorm(self.config, self.device).dorm_run( + feed=False, collect=False, buy_furniture=False, buy_food=10) + self.ui_ensure(page_reward) + food = True + continue # Check GET_SHIP at last to handle random white background at page_main for button in [GET_SHIP]: if click_timer.reached() and self.appear(button, interval=1): diff --git a/module/dorm/assets.py b/module/dorm/assets.py index 7a23d4d42..8e758f506 100644 --- a/module/dorm/assets.py +++ b/module/dorm/assets.py @@ -4,6 +4,9 @@ from module.base.template import Template # This file was automatically generated by dev_tools/button_extract.py. # Don't modify it manually. +DORM_BUY_FOOD_CHECK = Button(area={'cn': (607, 427, 675, 459), 'en': (607, 427, 675, 459), 'jp': (607, 427, 675, 459), 'tw': (607, 427, 675, 459)}, color={'cn': (184, 182, 182), 'en': (184, 182, 182), 'jp': (184, 182, 182), 'tw': (184, 182, 182)}, button={'cn': (607, 427, 675, 459), 'en': (607, 427, 675, 459), 'jp': (607, 427, 675, 459), 'tw': (607, 427, 675, 459)}, file={'cn': './assets/cn/dorm/DORM_BUY_FOOD_CHECK.png', 'en': './assets/cn/dorm/DORM_BUY_FOOD_CHECK.png', 'jp': './assets/cn/dorm/DORM_BUY_FOOD_CHECK.png', 'tw': './assets/cn/dorm/DORM_BUY_FOOD_CHECK.png'}) +DORM_BUY_FOOD_CONFIRM = Button(area={'cn': (751, 499, 792, 520), 'en': (751, 499, 792, 520), 'jp': (751, 499, 792, 520), 'tw': (751, 499, 792, 520)}, color={'cn': (255, 238, 186), 'en': (255, 238, 186), 'jp': (255, 238, 186), 'tw': (255, 238, 186)}, button={'cn': (751, 499, 792, 520), 'en': (751, 499, 792, 520), 'jp': (751, 499, 792, 520), 'tw': (751, 499, 792, 520)}, file={'cn': './assets/cn/dorm/DORM_BUY_FOOD_CONFIRM.png', 'en': './assets/cn/dorm/DORM_BUY_FOOD_CONFIRM.png', 'jp': './assets/cn/dorm/DORM_BUY_FOOD_CONFIRM.png', 'tw': './assets/cn/dorm/DORM_BUY_FOOD_CONFIRM.png'}) +DORM_BUY_FOOD_ENTER = Button(area={'cn': (866, 375, 888, 398), 'en': (866, 375, 888, 398), 'jp': (866, 375, 888, 398), 'tw': (866, 375, 888, 398)}, color={'cn': (119, 110, 71), 'en': (119, 110, 71), 'jp': (119, 110, 71), 'tw': (119, 110, 71)}, button={'cn': (866, 375, 888, 398), 'en': (866, 375, 888, 398), 'jp': (866, 375, 888, 398), 'tw': (866, 375, 888, 398)}, file={'cn': './assets/cn/dorm/DORM_BUY_FOOD_ENTER.png', 'en': './assets/cn/dorm/DORM_BUY_FOOD_ENTER.png', 'jp': './assets/cn/dorm/DORM_BUY_FOOD_ENTER.png', 'tw': './assets/cn/dorm/DORM_BUY_FOOD_ENTER.png'}) DORM_FEED_CHECK = Button(area={'cn': (162, 342, 274, 370), 'en': (162, 342, 274, 370), 'jp': (162, 342, 274, 370), 'tw': (162, 342, 274, 370)}, color={'cn': (182, 179, 171), 'en': (182, 179, 171), 'jp': (182, 179, 171), 'tw': (182, 179, 171)}, button={'cn': (162, 342, 274, 370), 'en': (162, 342, 274, 370), 'jp': (162, 342, 274, 370), 'tw': (162, 342, 274, 370)}, file={'cn': './assets/cn/dorm/DORM_FEED_CHECK.png', 'en': './assets/en/dorm/DORM_FEED_CHECK.png', 'jp': './assets/jp/dorm/DORM_FEED_CHECK.png', 'tw': './assets/tw/dorm/DORM_FEED_CHECK.png'}) DORM_FEED_ENTER = Button(area={'cn': (254, 581, 300, 605), 'en': (298, 581, 344, 605), 'jp': (254, 581, 300, 605), 'tw': (254, 581, 300, 605)}, color={'cn': (204, 192, 177), 'en': (204, 192, 176), 'jp': (204, 192, 177), 'tw': (204, 192, 177)}, button={'cn': (254, 581, 300, 605), 'en': (298, 581, 344, 605), 'jp': (254, 581, 300, 605), 'tw': (254, 581, 300, 605)}, file={'cn': './assets/cn/dorm/DORM_FEED_ENTER.png', 'en': './assets/en/dorm/DORM_FEED_ENTER.png', 'jp': './assets/jp/dorm/DORM_FEED_ENTER.png', 'tw': './assets/tw/dorm/DORM_FEED_ENTER.png'}) DORM_FURNITURE_BUY_ALL = Button(area={'cn': (818, 621, 1072, 677), 'en': (819, 621, 1072, 677), 'jp': (899, 636, 991, 661), 'tw': (818, 621, 1072, 677)}, color={'cn': (249, 202, 66), 'en': (248, 201, 66), 'jp': (215, 171, 65), 'tw': (248, 201, 66)}, button={'cn': (818, 621, 1072, 677), 'en': (819, 621, 1072, 677), 'jp': (899, 636, 991, 661), 'tw': (818, 621, 1072, 677)}, file={'cn': './assets/cn/dorm/DORM_FURNITURE_BUY_ALL.png', 'en': './assets/en/dorm/DORM_FURNITURE_BUY_ALL.png', 'jp': './assets/jp/dorm/DORM_FURNITURE_BUY_ALL.png', 'tw': './assets/tw/dorm/DORM_FURNITURE_BUY_ALL.png'}) @@ -21,6 +24,9 @@ DORM_MANAGE = Button(area={'cn': (949, 600, 1005, 659), 'en': (949, 600, 1005, 6 DORM_MANAGE_CHECK = Button(area={'cn': (1128, 116, 1150, 135), 'en': (1128, 116, 1150, 135), 'jp': (1128, 116, 1150, 135), 'tw': (1128, 116, 1150, 135)}, color={'cn': (173, 147, 77), 'en': (173, 147, 77), 'jp': (173, 147, 77), 'tw': (173, 147, 77)}, button={'cn': (1128, 116, 1150, 135), 'en': (1128, 116, 1150, 135), 'jp': (1128, 116, 1150, 135), 'tw': (1128, 116, 1150, 135)}, file={'cn': './assets/cn/dorm/DORM_MANAGE_CHECK.png', 'en': './assets/en/dorm/DORM_MANAGE_CHECK.png', 'jp': './assets/jp/dorm/DORM_MANAGE_CHECK.png', 'tw': './assets/tw/dorm/DORM_MANAGE_CHECK.png'}) DORM_QUICK_COLLECT = Button(area={'cn': (1191, 497, 1251, 519), 'en': (1191, 497, 1251, 519), 'jp': (1191, 497, 1251, 519), 'tw': (1191, 497, 1251, 519)}, color={'cn': (243, 194, 138), 'en': (243, 194, 138), 'jp': (243, 194, 138), 'tw': (243, 194, 138)}, button={'cn': (1191, 497, 1251, 519), 'en': (1191, 497, 1251, 519), 'jp': (1191, 497, 1251, 519), 'tw': (1191, 497, 1251, 519)}, file={'cn': './assets/cn/dorm/DORM_QUICK_COLLECT.png', 'en': './assets/en/dorm/DORM_QUICK_COLLECT.png', 'jp': './assets/jp/dorm/DORM_QUICK_COLLECT.png', 'tw': './assets/tw/dorm/DORM_QUICK_COLLECT.png'}) DORM_RED_DOT = Button(area={'cn': (528, 339, 543, 356), 'en': (528, 339, 543, 356), 'jp': (528, 339, 543, 356), 'tw': (528, 339, 543, 356)}, color={'cn': (214, 126, 114), 'en': (214, 126, 114), 'jp': (214, 126, 114), 'tw': (214, 126, 114)}, button={'cn': (528, 339, 543, 356), 'en': (528, 339, 543, 356), 'jp': (528, 339, 543, 356), 'tw': (528, 339, 543, 356)}, file={'cn': './assets/cn/dorm/DORM_RED_DOT.png', 'en': './assets/en/dorm/DORM_RED_DOT.png', 'jp': './assets/jp/dorm/DORM_RED_DOT.png', 'tw': './assets/tw/dorm/DORM_RED_DOT.png'}) +FOOD_MINUS = Button(area={'cn': (532, 370, 554, 397), 'en': (532, 370, 554, 397), 'jp': (532, 370, 554, 397), 'tw': (532, 370, 554, 397)}, color={'cn': (246, 246, 247), 'en': (246, 246, 247), 'jp': (246, 246, 247), 'tw': (246, 246, 247)}, button={'cn': (532, 370, 554, 397), 'en': (532, 370, 554, 397), 'jp': (532, 370, 554, 397), 'tw': (532, 370, 554, 397)}, file={'cn': './assets/cn/dorm/FOOD_MINUS.png', 'en': './assets/cn/dorm/FOOD_MINUS.png', 'jp': './assets/cn/dorm/FOOD_MINUS.png', 'tw': './assets/cn/dorm/FOOD_MINUS.png'}) +FOOD_PLUS = Button(area={'cn': (807, 370, 826, 397), 'en': (807, 370, 826, 397), 'jp': (807, 370, 826, 397), 'tw': (807, 370, 826, 397)}, color={'cn': (248, 248, 248), 'en': (248, 248, 248), 'jp': (248, 248, 248), 'tw': (248, 248, 248)}, button={'cn': (807, 370, 826, 397), 'en': (807, 370, 826, 397), 'jp': (807, 370, 826, 397), 'tw': (807, 370, 826, 397)}, file={'cn': './assets/cn/dorm/FOOD_PLUS.png', 'en': './assets/cn/dorm/FOOD_PLUS.png', 'jp': './assets/cn/dorm/FOOD_PLUS.png', 'tw': './assets/cn/dorm/FOOD_PLUS.png'}) +OCR_DORM_BUY_FOOD_AMOUNT = Button(area={'cn': (653, 374, 706, 395), 'en': (653, 374, 706, 395), 'jp': (653, 374, 706, 395), 'tw': (653, 374, 706, 395)}, color={'cn': (203, 203, 204), 'en': (203, 203, 204), 'jp': (203, 203, 204), 'tw': (203, 203, 204)}, button={'cn': (653, 374, 706, 395), 'en': (653, 374, 706, 395), 'jp': (653, 374, 706, 395), 'tw': (653, 374, 706, 395)}, file={'cn': './assets/cn/dorm/OCR_DORM_BUY_FOOD_AMOUNT.png', 'en': './assets/cn/dorm/OCR_DORM_BUY_FOOD_AMOUNT.png', 'jp': './assets/cn/dorm/OCR_DORM_BUY_FOOD_AMOUNT.png', 'tw': './assets/cn/dorm/OCR_DORM_BUY_FOOD_AMOUNT.png'}) OCR_DORM_FILL = Button(area={'cn': (813, 271, 987, 296), 'en': (813, 271, 987, 296), 'jp': (813, 271, 987, 296), 'tw': (813, 271, 987, 296)}, color={'cn': (222, 213, 193), 'en': (222, 213, 193), 'jp': (222, 213, 193), 'tw': (222, 213, 193)}, button={'cn': (813, 271, 987, 296), 'en': (813, 271, 987, 296), 'jp': (813, 271, 987, 296), 'tw': (813, 271, 987, 296)}, file={'cn': './assets/cn/dorm/OCR_DORM_FILL.png', 'en': './assets/en/dorm/OCR_DORM_FILL.png', 'jp': './assets/jp/dorm/OCR_DORM_FILL.png', 'tw': './assets/tw/dorm/OCR_DORM_FILL.png'}) OCR_DORM_FURNITURE_COIN = Button(area={'cn': (897, 20, 988, 49), 'en': (897, 20, 988, 49), 'jp': (897, 20, 988, 49), 'tw': (897, 20, 988, 49)}, color={'cn': (203, 197, 194), 'en': (203, 197, 194), 'jp': (203, 197, 194), 'tw': (203, 197, 194)}, button={'cn': (897, 20, 988, 49), 'en': (897, 20, 988, 49), 'jp': (897, 20, 988, 49), 'tw': (897, 20, 988, 49)}, file={'cn': './assets/cn/dorm/OCR_DORM_FURNITURE_COIN.png', 'en': './assets/en/dorm/OCR_DORM_FURNITURE_COIN.png', 'jp': './assets/jp/dorm/OCR_DORM_FURNITURE_COIN.png', 'tw': './assets/tw/dorm/OCR_DORM_FURNITURE_COIN.png'}) OCR_DORM_FURNITURE_PRICE = Button(area={'cn': (819, 417, 896, 442), 'en': (819, 417, 896, 442), 'jp': (819, 417, 896, 442), 'tw': (819, 417, 896, 442)}, color={'cn': (227, 223, 220), 'en': (227, 223, 220), 'jp': (227, 223, 220), 'tw': (227, 223, 220)}, button={'cn': (819, 417, 896, 442), 'en': (819, 417, 896, 442), 'jp': (819, 417, 896, 442), 'tw': (819, 417, 896, 442)}, file={'cn': './assets/cn/dorm/OCR_DORM_FURNITURE_PRICE.png', 'en': './assets/en/dorm/OCR_DORM_FURNITURE_PRICE.png', 'jp': './assets/jp/dorm/OCR_DORM_FURNITURE_PRICE.png', 'tw': './assets/tw/dorm/OCR_DORM_FURNITURE_PRICE.png'}) diff --git a/module/dorm/dorm.py b/module/dorm/dorm.py index 0496c5c8a..b854a441a 100644 --- a/module/dorm/dorm.py +++ b/module/dorm/dorm.py @@ -21,6 +21,7 @@ MASK_DORM = Mask(file='./assets/mask/MASK_DORM.png') DORM_CAMERA_SWIPE = (300, 250) DORM_CAMERA_RANDOM = (-20, -20, 20, 20) OCR_SLOT = DigitCounter(OCR_DORM_SLOT, letter=(107, 89, 82), threshold=128, name='OCR_DORM_SLOT') +OCR_BUY_FOOD_AMOUNT = Digit(OCR_DORM_BUY_FOOD_AMOUNT, letter=(96, 96, 100), threshold=128, name='OCR_DORM_BUY_FOOD_AMOUNT') class OcrDormFood(DigitCounter): @@ -199,7 +200,7 @@ class RewardDorm(UI): f'does not support DOWN/UP events, use multi-click instead') self.device.multi_click(button, count) - def dorm_view_reset(self, skip_first_screenshot=True): + def dorm_view_reset(self): """ Use Dorm manage and Back to reset dorm view. @@ -208,12 +209,7 @@ class RewardDorm(UI): out: page_dorm """ logger.info('Dorm view reset') - while 1: - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() - + for _ in self.loop(): # End if self.appear(DORM_MANAGE_CHECK, offset=(20, 20)): break @@ -226,13 +222,7 @@ class RewardDorm(UI): if self.appear_then_click(DORM_FURNITURE_CONFIRM, offset=(30, 30), interval=3): continue - skip_first_screenshot = True - while 1: - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() - + for _ in self.loop(): if self.appear(DORM_MANAGE, offset=(20, 20)): break @@ -251,17 +241,11 @@ class RewardDorm(UI): logger.hr('Dorm collect') self.ensure_no_info_bar() - skip_first_screenshot = True # Set a timer to avoid Alas failing to detect the info_bar by accident. timeout = Timer(1.5, count=3).start() - while 1: - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() - + for _ in self.loop(): # Handle all popups if self.ui_additional(get_ship=False): continue @@ -312,11 +296,7 @@ class RewardDorm(UI): skip_first_screenshot = True self.popup_interval_clear() - while 1: - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() + for _ in self.loop(skip_first=skip_first_screenshot): # End if self.appear(DORM_FEED_CHECK, offset=(20, 20)): break @@ -354,13 +334,7 @@ class RewardDorm(UI): timeout = Timer(1.5, count=3).start() food: t.List[Food] = [] fill: int = 0 - skip_first_screenshot = True - while 1: - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() - + for _ in self.loop(): # End if timeout.reached(): logger.warning('Get dorm food timeout, probably because food is empty') @@ -406,19 +380,14 @@ class RewardDorm(UI): logger.warning('Dorm feed run count reached') return 10 - def dorm_feed_enter(self, skip_first_screenshot=False): + def dorm_feed_enter(self): """ Pages: in: DORM_CHECK out: DORM_FEED_CHECK """ self.interval_clear(DORM_CHECK) - while 1: - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() - + for _ in self.loop(skip_first=False): # End if self.appear(DORM_FEED_CHECK, offset=(20, 20)): break @@ -442,19 +411,14 @@ class RewardDorm(UI): logger.info(f'{DORM_FURNITURE_SHOP_FIRST_SELECTED} -> {DORM_FURNITURE_SHOP_QUIT}') continue - def dorm_feed_quit(self, skip_first_screenshot=True): + def dorm_feed_quit(self): """ Pages: in: DORM_FEED_CHECK out: DORM_CHECK """ self.interval_clear(DORM_FEED_CHECK) - while 1: - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() - + for _ in self.loop(): # End if self.appear(DORM_CHECK): break @@ -469,13 +433,61 @@ class RewardDorm(UI): self.interval_clear(DORM_CHECK) continue - def dorm_run(self, feed=True, collect=True, buy_furniture=False): + def dorm_buy_food_enter(self): + """ + Pages: + in: DORM_FEED_CHECK + out: DORM_BUY_FOOD_CHECK + """ + self.interval_clear(DORM_FEED_CHECK) + for _ in self.loop(): + # End + if self.appear(DORM_BUY_FOOD_CHECK, offset=(20, 20)): + break + + if self.match_template_color(DORM_FEED_CHECK, offset=(20, 20), interval=5): + self.device.click(DORM_BUY_FOOD_ENTER) + continue + + def dorm_buy_food(self, amount): + """ + Pages: + in: DORM_BUY_FOOD_CHECK + out: DORM_BUY_FOOD_CHECK + """ + logger.hr('Dorm buy food') + index_offset = (20, 20) + # In case either -/+ shift position, use + # shipyard ocr trick to accurately parse + self.appear(FOOD_PLUS, offset=index_offset) + self.appear(FOOD_MINUS, offset=index_offset) + + self.ui_ensure_index(amount, letter=OCR_BUY_FOOD_AMOUNT, prev_button=FOOD_MINUS, next_button=FOOD_PLUS, + skip_first_screenshot=True) + return True + + def dorm_buy_food_confirm(self): + """ + Pages: + in: DORM_BUY_FOOD_CHECK + out: DORM_FEED_CHECK + """ + self.interval_clear(DORM_BUY_FOOD_CONFIRM) + for _ in self.loop(): + # End + if self.match_template_color(DORM_FEED_CHECK, offset=(20, 20)): + break + + if self.appear_then_click(DORM_BUY_FOOD_CONFIRM, offset=(20, 20), interval=5): + continue + + def dorm_run(self, feed=True, collect=True, buy_furniture=False, buy_food=0): """ Pages: in: Any page out: page_dorm """ - if not feed and not collect and not buy_furniture: + if not feed and not collect and not buy_furniture and buy_food <= 0: return self.ui_ensure(page_dormmenu) @@ -504,7 +516,15 @@ class RewardDorm(UI): logger.hr('Dorm buy furniture', level=1) BuyFurniture(self.config, self.device).run() - def get_dorm_ship_amount(self, skip_first_screenshot=True): + if buy_food > 0: + logger.hr('Dorm buy food', level=1) + self.dorm_feed_enter() + self.dorm_buy_food_enter() + self.dorm_buy_food(amount=buy_food) + self.dorm_buy_food_confirm() + self.dorm_feed_quit() + + def get_dorm_ship_amount(self): """ Args: skip_first_screenshot: @@ -517,12 +537,7 @@ class RewardDorm(UI): """ timeout = Timer(2, count=4).start() current = 0 - while 1: - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() - + for _ in self.loop(): # Handle popups if self.appear_then_click(DORM_FURNITURE_CONFIRM, offset=(30, 30), interval=3): timeout.reset()