diff --git a/assets/cn/commission/OIL_MAXED.png b/assets/cn/commission/OIL_MAXED.png new file mode 100644 index 000000000..9baa15826 Binary files /dev/null and b/assets/cn/commission/OIL_MAXED.png differ 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 000000000..f01963a7d Binary files /dev/null and b/assets/cn/dorm/DORM_BUY_FOOD_CHECK.png differ diff --git a/assets/cn/dorm/DORM_BUY_FOOD_CONFIRM.png b/assets/cn/dorm/DORM_BUY_FOOD_CONFIRM.png new file mode 100644 index 000000000..140efbeb2 Binary files /dev/null and b/assets/cn/dorm/DORM_BUY_FOOD_CONFIRM.png differ 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 000000000..686498803 Binary files /dev/null and b/assets/cn/dorm/DORM_BUY_FOOD_ENTER.png differ diff --git a/assets/cn/dorm/FOOD_MINUS.png b/assets/cn/dorm/FOOD_MINUS.png new file mode 100644 index 000000000..a0b727069 Binary files /dev/null and b/assets/cn/dorm/FOOD_MINUS.png differ diff --git a/assets/cn/dorm/FOOD_PLUS.png b/assets/cn/dorm/FOOD_PLUS.png new file mode 100644 index 000000000..df703a514 Binary files /dev/null and b/assets/cn/dorm/FOOD_PLUS.png differ diff --git a/assets/cn/dorm/OCR_DORM_BUY_FOOD_AMOUNT.png b/assets/cn/dorm/OCR_DORM_BUY_FOOD_AMOUNT.png new file mode 100644 index 000000000..3b83c00b8 Binary files /dev/null and b/assets/cn/dorm/OCR_DORM_BUY_FOOD_AMOUNT.png differ 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()