From 054da57f5b36a0aea45619ccbca16157df713916 Mon Sep 17 00:00:00 2001 From: sui-feng-cb <2518179942@qq.com> Date: Sun, 8 Feb 2026 20:53:04 +0800 Subject: [PATCH] Fix: GameTooManyClickError in product_select --- module/config/i18n/zh-CN.json | 8 ++-- module/island/project.py | 81 +++++++++++------------------------ module/island/project_data.py | 2 +- module/island/transport.py | 34 ++++----------- 4 files changed, 37 insertions(+), 88 deletions(-) diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 35f3d4fbf..a3ea39d16 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -2989,8 +2989,8 @@ "2": "记事本", "3": "桌椅", "4": "精选木桶", - "5": "装饰画", - "6": "文件柜" + "5": "文件柜", + "6": "装饰画" }, "Character1": { "name": "第 1 格使用角色", @@ -3021,8 +3021,8 @@ "2": "记事本", "3": "桌椅", "4": "精选木桶", - "5": "装饰画", - "6": "文件柜" + "5": "文件柜", + "6": "装饰画" }, "Character2": { "name": "第 2 格使用角色", diff --git a/module/island/project.py b/module/island/project.py index b6071c572..d6b16ced3 100644 --- a/module/island/project.py +++ b/module/island/project.py @@ -345,7 +345,7 @@ class IslandProjectRun(IslandUI): for button in TEMPLATE_PROJECT.match_multi(image_gray)]) return projects.select(valid=True) - def project_receive(self, button, skip_first_screenshot=True): + def project_receive(self, button): """ Receive a project and enter role select page. @@ -361,12 +361,7 @@ class IslandProjectRun(IslandUI): success = False enter = True click_timer = Timer(5, count=10).start() - while 1: - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() - + for _ in self.loop(): if self.island_in_management(interval=5): self.device.click(button) click_timer.reset() @@ -429,12 +424,7 @@ class IslandProjectRun(IslandUI): click_button (Button): character button to click check_button (Button): """ - 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(check_button, offset=(20, 20)): break if self.appear(ROLE_SELECT_CONFIRM, offset=(20, 20), interval=2): @@ -442,12 +432,8 @@ class IslandProjectRun(IslandUI): continue self.interval_clear(ROLE_SELECT_CONFIRM) - skip_first_screenshot=True - while 1: - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() + + for _ in self.loop(): # End if self.appear(ISLAND_AMOUNT_MAX, offset=(20, 20)): return True @@ -459,13 +445,12 @@ class IslandProjectRun(IslandUI): self.interval_clear(ISLAND_MANAGEMENT_CHECK) continue - def project_character_select(self, character='manjuu', skip_first_screenshot=True): + def project_character_select(self, character='manjuu'): """ Select a role to produce. Args: character (str): character name to select - skip_first_screenshot (bool): Returns: bool: if selected @@ -474,12 +459,7 @@ class IslandProjectRun(IslandUI): ROLE_SORTING.set('Descending', main=self) timeout = Timer(5, count=3).start() count = 0 - while 1: - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() - + for _ in self.loop(): if timeout.reached(): self.ui_ensure_management_page() return False @@ -531,28 +511,23 @@ class IslandProjectRun(IslandUI): peaks = np.array(peaks) + y_top return ProductItem(self.device.image, peaks, project_id) - def product_select(self, option, project_id, trial=2, skip_first_screenshot=True): + def product_select(self, option, project_id, trial=2): """ Select a product in items list. Args: option (str): option to select trail (int): retry times - skip_first_screenshot (bool): Returns: bool: if selected """ logger.hr('Island Select Product') - last = None + last_item = None + bottom_item = None retry = trial click_interval = Timer(1) - while 1: - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() - + for _ in self.loop(): current = self.get_current_product(project_id) if trial > 0 and not len(current.items): trial -= 1 @@ -574,7 +549,7 @@ class IslandProjectRun(IslandUI): click_interval.reset() drag = False - if last == current.items[-1]: + if bottom_item == current.items[-1]: if retry > 0: retry -= 1 continue @@ -582,18 +557,21 @@ class IslandProjectRun(IslandUI): self.ui_ensure_management_page() return False + # clear record if current product is different during 2 drags + if last_item is not None and last_item != current: + self.device.click_record.pop() + self.device.click_record.pop() + if drag: - last = current.items[-1] - self.device.click(last.button) + last_item = current + bottom_item = current.items[-1] + self.device.click(bottom_item.button) self.island_drag_next_page((0, -300), ISLAND_PRODUCT_ITEMS.area, 0.5) - def product_select_confirm(self, skip_first_screenshot=True): + def product_select_confirm(self): """ Start the product after product selected. - Args: - skip_first_screenshot (bool): - Returns: bool: if success """ @@ -601,12 +579,7 @@ class IslandProjectRun(IslandUI): last = None success = False 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(): if timeout.reached(): break @@ -743,14 +716,13 @@ class IslandProjectRun(IslandUI): 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): + def island_project_run(self, names, trial=2): """ Execute island run to receive and start project. Args: names (list[str]): a list of name for island receive trial (int): retry times - skip_first_screenshot (bool): Returns: list[timedelta]: future finish timedelta @@ -758,12 +730,7 @@ class IslandProjectRun(IslandUI): logger.hr('Island Project Run', level=1) end = False timeout = Timer(3, count=3).start() - while 1: - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() - + for _ in self.loop(): if timeout.reached(): break diff --git a/module/island/project_data.py b/module/island/project_data.py index a27e37b62..e67bcd877 100644 --- a/module/island/project_data.py +++ b/module/island/project_data.py @@ -79,7 +79,7 @@ __items_data_cn = { 5: '汉堡肉饭', 6: '柠檬虾', 7: '爆炒小龙虾', 8: '烤肉狂欢', 9: '能量双拼套餐', }, 12: { - 1: '纸张', 2: '记事本', 3: '桌椅', 4: '精选木桶', 5: '装饰画', 6: '文件柜', + 1: '纸张', 2: '记事本', 3: '桌椅', 4: '精选木桶', 5: '文件柜', 6: '装饰画', }, 13: { 1: '炭笔', 2: '电缆', 3: '铁钉', 4: '硫酸', 5: '火药', 6: '刀叉餐具', diff --git a/module/island/transport.py b/module/island/transport.py index 59d7eb35c..8af66c569 100644 --- a/module/island/transport.py +++ b/module/island/transport.py @@ -155,6 +155,7 @@ class IslandTransport: info = ', '.join([f'{k}: {v}' for k, v in info.items()]) return info + class TransportItem: # If the item is enough to submit and not in blacklist load: bool @@ -212,6 +213,7 @@ class TransportItem: info = ', '.join([f'{k}: {v}' for k, v in info.items()]) return info + class IslandTransportRun(IslandUI): @cached_property def blacklist(self): @@ -272,13 +274,10 @@ class IslandTransportRun(IslandUI): logger.info('trials of transport commission detect exhausted, stop') return commissions.select(valid=True) - def transport_receive(self, skip_first_screenshot=True): + def transport_receive(self): """ Receive all transport missions from transport page. - Args: - skip_first_screenshot (bool): - Returns: bool: if received """ @@ -288,12 +287,7 @@ class IslandTransportRun(IslandUI): success = True click_timer = Timer(5, count=10).start() confirm_timer = Timer(1, count=2).start() - while 1: - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() - + for _ in self.loop(): if self.handle_info_bar(): click_timer.reset() confirm_timer.reset() @@ -334,13 +328,12 @@ class IslandTransportRun(IslandUI): return success - def transport_refresh(self, comm, skip_first_screenshot=True): + def transport_refresh(self, comm): """ Refresh the specific transport mission from transport page. Args: comm (IslandTransport): the commission to refresh - skip_first_screenshot (bool): Returns: bool: if success @@ -349,12 +342,7 @@ class IslandTransportRun(IslandUI): self.interval_clear([TRANSPORT_REFRESH, POPUP_CONFIRM_WHITE]) success = True confirm_timer = Timer(1, count=2).start() - while 1: - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() - + for _ in self.loop(): if self.appear_then_click(TRANSPORT_REFRESH, offset=comm.offset, interval=2): continue @@ -370,13 +358,12 @@ class IslandTransportRun(IslandUI): confirm_timer.reset() return success - def transport_start(self, comm, skip_first_screenshot=True): + def transport_start(self, comm): """ Start the specific transport mission from transport page. Args: comm (IslandTransport): the commission to start - skip_first_screenshot (bool): Returns: bool: if success @@ -385,12 +372,7 @@ class IslandTransportRun(IslandUI): self.interval_clear([GET_ITEMS_ISLAND, TRANSPORT_START, POPUP_CANCEL_WHITE]) success = True confirm_timer = Timer(1, count=2).start() - while 1: - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() - + for _ in self.loop(): if self.appear_then_click(TRANSPORT_START, offset=comm.offset, interval=2): success = False confirm_timer.reset()