From 3b55553a269528844e5ffe29e5dde20d318b9a90 Mon Sep 17 00:00:00 2001 From: longer-sausage Date: Mon, 27 Jul 2026 21:00:43 +0800 Subject: [PATCH 1/4] =?UTF-8?q?fix(os):=20=E4=BF=AE=E5=A4=8D=E5=A4=A7?= =?UTF-8?q?=E4=B8=96=E7=95=8C=E8=BF=9B=E5=85=A5=E5=82=A8=E7=89=A9=E4=BB=93?= =?UTF-8?q?=E7=95=8C=E9=9D=A2=E6=97=B6=E8=AF=AF=E8=BF=9B=E5=85=A5=E6=83=85?= =?UTF-8?q?=E6=8A=A5=E7=95=8C=E9=9D=A2=E4=BC=9A=E5=AF=BC=E8=87=B4=E5=8D=A1?= =?UTF-8?q?=E6=AD=BB=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module/os_handler/storage.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/module/os_handler/storage.py b/module/os_handler/storage.py index 4cd09f658..ca5f0b85e 100644 --- a/module/os_handler/storage.py +++ b/module/os_handler/storage.py @@ -5,6 +5,7 @@ 提供维修结果枚举(成功/数量不足/超时)用于状态判断。 """ from enum import Enum +import time from module.base.timer import Timer from module.base.utils import area_offset, crop, rgb2gray @@ -45,11 +46,24 @@ def storage_enter(self): out: STORAGE_CHECK """ logger.info('[大世界-仓库] 进入仓库') + wait_seconds = 0 for _ in self.loop(): # End if self.is_in_storage(): break + if self.appear(MISSION_CHECK, offset=(20, 20)): + logger.warning('[大世界-仓库] 误进入情报界面,尝试退出') + self.ui_click( + MISSION_QUIT, + check_button=self.is_in_map, + offset=(20, 20), + skip_first_screenshot=True + ) + wait_seconds += 1 + time.sleep(wait_seconds) + continue + if self.appear_then_click(STORAGE_ENTER, offset=(200, 5), interval=3): continue # A game bug that AUTO_SEARCH_REWARD from the last cleared zone popups From 06592c46b37a08193844f67c2ec39992d0415f40 Mon Sep 17 00:00:00 2001 From: Beatrice-betty Date: Mon, 27 Jul 2026 22:33:51 +0800 Subject: [PATCH 2/4] =?UTF-8?q?fix(coalition,=20combat):=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8DD=E8=AF=84=E4=BB=B7=E8=AF=AF=E5=88=A4=E5=92=8C?= =?UTF-8?q?=E5=BF=83=E6=83=85=E5=90=8C=E6=AD=A5=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 调整结算界面判断逻辑,仅在检测到OPTS_INFO_D弹窗时才标记沉船,避免S/A/B评价过渡帧误匹配 2. 修复emotion模块中舰队心情属性未同步更新的问题,确保心情恢复计算正确 --- module/coalition/coalition_scuttle.py | 7 ++++--- module/combat/auto_search_combat.py | 10 +++++----- module/combat/emotion.py | 7 +++++++ 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/module/coalition/coalition_scuttle.py b/module/coalition/coalition_scuttle.py index f25495c1e..041c6d33a 100644 --- a/module/coalition/coalition_scuttle.py +++ b/module/coalition/coalition_scuttle.py @@ -89,10 +89,11 @@ def auto_search_combat_execute(self, emotion_reduce=True, fleet_index=1, expecte self._withdraw = True self._is_shipwreck = True break + # D评价结算界面:等待OPTS_INFO_D弹窗确认,不立即设置沉船标记 + # S/A/B评价的动画过渡帧可能误匹配BATTLE_STATUS_D模板 + # 只有真正的D评价(沉船)才会出现OPTS_INFO_D弹窗 if self.appear(BATTLE_STATUS_D) or self.appear(EXP_INFO_D): - self._withdraw = True - self._is_shipwreck = True - break + continue if confirm_timer.reached(): self._withdraw = True self._is_shipwreck = True diff --git a/module/combat/auto_search_combat.py b/module/combat/auto_search_combat.py index 9f8a07480..7bb7ed84f 100644 --- a/module/combat/auto_search_combat.py +++ b/module/combat/auto_search_combat.py @@ -318,12 +318,12 @@ def auto_search_combat_execute(self, emotion_reduce, fleet_index, battle=None, e self.emotion.reduce(fleet_index, shipwreck=True) self._withdraw = True break - # 沉船D评价结算界面,作为OPTS_INFO_D未检测到的兜底 + # D评价结算界面:等待OPTS_INFO_D弹窗确认,不立即扣减 + # S/A/B评价的动画过渡帧可能误匹配BATTLE_STATUS_D模板 + # 只有真正的D评价(沉船)才会出现OPTS_INFO_D弹窗 + # 此处仅作标记,继续循环等待OPTS_INFO_D或S/A/B评价确认 if self.appear(BATTLE_STATUS_D) or self.appear(EXP_INFO_D): - self._withdraw = True - if emotion_reduce: - self.emotion.reduce(fleet_index, shipwreck=True) - break + continue if confirm_timer.reached(): self._withdraw = True self.device.click(OPTS_INFO_D) diff --git a/module/combat/emotion.py b/module/combat/emotion.py index 0685804cb..600300532 100644 --- a/module/combat/emotion.py +++ b/module/combat/emotion.py @@ -277,6 +277,7 @@ def record(self): 仅在心情整数值发生变化时更新 Record 时间戳, 并将 Record 回扣 fractional_seconds 对应的等效秒数, 使未满1点的恢复余数可在下次 update() 时继续累积。 + 同时同步 fleet.value 属性,确保下次 update() 基于正确值计算恢复。 """ if self.using_public: fleet = self.public_fleet @@ -292,6 +293,9 @@ def record(self): with self.config.multi_set(): setattr(self.config, fleet.value_name, new_value) setattr(self.config, fleet.value_name.replace('Value', 'Record'), record_time) + # 同步属性,确保下次 update() 基于新值计算恢复 + fleet.value = new_value + fleet.record = record_time return with self.config.multi_set(): @@ -305,6 +309,9 @@ def record(self): record_time = record_time - timedelta(seconds=fractional * 360 / fleet.speed) setattr(self.config, fleet.value_name, new_value) setattr(self.config, fleet.value_name.replace('Value', 'Record'), record_time) + # 同步属性,确保下次 update() 基于新值计算恢复 + fleet.value = new_value + fleet.record = record_time def show(self): """显示当前计算的心情值(含时间恢复),而非上次保存值。""" From d5d6a45d4f16c1f3ed6323e6f40d46d853e88f15 Mon Sep 17 00:00:00 2001 From: Beatrice-betty Date: Mon, 27 Jul 2026 22:43:50 +0800 Subject: [PATCH 3/4] fix --- module/combat/emotion.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/module/combat/emotion.py b/module/combat/emotion.py index 600300532..f8b8215f0 100644 --- a/module/combat/emotion.py +++ b/module/combat/emotion.py @@ -277,7 +277,9 @@ def record(self): 仅在心情整数值发生变化时更新 Record 时间戳, 并将 Record 回扣 fractional_seconds 对应的等效秒数, 使未满1点的恢复余数可在下次 update() 时继续累积。 - 同时同步 fleet.value 属性,确保下次 update() 基于正确值计算恢复。 + + 注意:FleetEmotion.value 和 FleetEmotion.record 是 @property, + 从 self.config 实时读取。setattr 到 config 后属性自动更新,无需手动赋值。 """ if self.using_public: fleet = self.public_fleet @@ -293,9 +295,6 @@ def record(self): with self.config.multi_set(): setattr(self.config, fleet.value_name, new_value) setattr(self.config, fleet.value_name.replace('Value', 'Record'), record_time) - # 同步属性,确保下次 update() 基于新值计算恢复 - fleet.value = new_value - fleet.record = record_time return with self.config.multi_set(): @@ -309,9 +308,6 @@ def record(self): record_time = record_time - timedelta(seconds=fractional * 360 / fleet.speed) setattr(self.config, fleet.value_name, new_value) setattr(self.config, fleet.value_name.replace('Value', 'Record'), record_time) - # 同步属性,确保下次 update() 基于新值计算恢复 - fleet.value = new_value - fleet.record = record_time def show(self): """显示当前计算的心情值(含时间恢复),而非上次保存值。""" From c4d501f53e122becad818054567e04caf33e9c4f Mon Sep 17 00:00:00 2001 From: Beatrice-betty Date: Mon, 27 Jul 2026 23:10:00 +0800 Subject: [PATCH 4/4] =?UTF-8?q?fix(coalition,combat):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E7=BB=93=E7=AE=97=E7=95=8C=E9=9D=A2=E8=AF=AF=E5=88=A4D?= =?UTF-8?q?=E8=AF=84=E4=BB=B7=E5=AF=BC=E8=87=B4=E7=9A=84=E5=BF=83=E6=83=85?= =?UTF-8?q?=E6=9C=AA=E6=AD=A3=E7=A1=AE=E6=89=A3=E5=87=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 调整了战斗结算界面的判断逻辑,不再在误匹配D评价模板时继续循环等待,而是直接退出当前战斗循环,由后续流程统一处理结算弹窗,确保沉船时的心情扣减逻辑正确触发。 --- module/coalition/coalition_scuttle.py | 10 ++++++---- module/combat/auto_search_combat.py | 13 ++++++++----- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/module/coalition/coalition_scuttle.py b/module/coalition/coalition_scuttle.py index 041c6d33a..340dc0c69 100644 --- a/module/coalition/coalition_scuttle.py +++ b/module/coalition/coalition_scuttle.py @@ -89,11 +89,13 @@ def auto_search_combat_execute(self, emotion_reduce=True, fleet_index=1, expecte self._withdraw = True self._is_shipwreck = True break - # D评价结算界面:等待OPTS_INFO_D弹窗确认,不立即设置沉船标记 - # S/A/B评价的动画过渡帧可能误匹配BATTLE_STATUS_D模板 - # 只有真正的D评价(沉船)才会出现OPTS_INFO_D弹窗 + # D评价结算界面:S/A/B评价的动画过渡帧可能短暂误匹配D评价模板, + # 但只有真正的沉船才会出现OPTS_INFO_D弹窗。 + # 此处仅break退出循环,不设置沉船标记(未经过OPTS_INFO_D确认)。 + # 真正的沉船由上方OPTS_INFO_D路径触发并设置_is_shipwreck。 if self.appear(BATTLE_STATUS_D) or self.appear(EXP_INFO_D): - continue + self._withdraw = True + break if confirm_timer.reached(): self._withdraw = True self._is_shipwreck = True diff --git a/module/combat/auto_search_combat.py b/module/combat/auto_search_combat.py index 7bb7ed84f..19957ee5f 100644 --- a/module/combat/auto_search_combat.py +++ b/module/combat/auto_search_combat.py @@ -318,12 +318,15 @@ def auto_search_combat_execute(self, emotion_reduce, fleet_index, battle=None, e self.emotion.reduce(fleet_index, shipwreck=True) self._withdraw = True break - # D评价结算界面:等待OPTS_INFO_D弹窗确认,不立即扣减 - # S/A/B评价的动画过渡帧可能误匹配BATTLE_STATUS_D模板 - # 只有真正的D评价(沉船)才会出现OPTS_INFO_D弹窗 - # 此处仅作标记,继续循环等待OPTS_INFO_D或S/A/B评价确认 + # D评价结算界面(BATTLE_STATUS_D / EXP_INFO_D) + # S/A/B评价的动画过渡帧可能短暂误匹配D评价模板, + # 但只有真正的沉船才会出现OPTS_INFO_D弹窗。 + # 此处仅break退出循环,不扣减shipwreck心情。 + # 真正的沉船扣减由上方OPTS_INFO_D路径触发。 + # 退出后由auto_search_combat_status()中的handle_battle_status()处理结算画面。 if self.appear(BATTLE_STATUS_D) or self.appear(EXP_INFO_D): - continue + self._withdraw = True + break if confirm_timer.reached(): self._withdraw = True self.device.click(OPTS_INFO_D)