From e61cfdeb63f9bdec12de170424ffdb87b5a0d6fd Mon Sep 17 00:00:00 2001 From: sui-feng-cb <2518179942@qq.com> Date: Wed, 21 Jan 2026 15:31:47 +0800 Subject: [PATCH] Opt: Use auto search after sinking --- config/template.json | 48 ++++++++++++------ module/combat/auto_search_combat.py | 55 ++++++++++++++++----- module/combat/emotion.py | 21 ++++++++ module/config/argument/args.json | 74 ++++++++++++++++++++++++++++ module/config/argument/argument.yaml | 1 + module/config/argument/override.yaml | 10 ++++ module/config/config_generated.py | 1 + module/config/i18n/en-US.json | 4 ++ module/config/i18n/ja-JP.json | 4 ++ module/config/i18n/zh-CN.json | 4 ++ module/config/i18n/zh-TW.json | 4 ++ module/handler/fast_forward.py | 5 ++ 12 files changed, 203 insertions(+), 28 deletions(-) diff --git a/config/template.json b/config/template.json index 21720d3a0..bb39b4262 100644 --- a/config/template.json +++ b/config/template.json @@ -164,7 +164,8 @@ "UseFleetLock": true, "UseAutoSearch": true, "Use2xBook": false, - "AmbushEvade": true + "AmbushEvade": true, + "ClearAfterSinking": false }, "StopCondition": { "OilLimit": 1000, @@ -240,7 +241,8 @@ "UseFleetLock": true, "UseAutoSearch": true, "Use2xBook": false, - "AmbushEvade": true + "AmbushEvade": true, + "ClearAfterSinking": false }, "StopCondition": { "OilLimit": 1000, @@ -316,7 +318,8 @@ "UseFleetLock": true, "UseAutoSearch": true, "Use2xBook": false, - "AmbushEvade": true + "AmbushEvade": true, + "ClearAfterSinking": false }, "StopCondition": { "OilLimit": 1000, @@ -405,7 +408,8 @@ "UseFleetLock": true, "UseAutoSearch": true, "Use2xBook": false, - "AmbushEvade": true + "AmbushEvade": true, + "ClearAfterSinking": false }, "StopCondition": { "OilLimit": 1000, @@ -482,7 +486,8 @@ "UseFleetLock": true, "UseAutoSearch": true, "Use2xBook": false, - "AmbushEvade": true + "AmbushEvade": true, + "ClearAfterSinking": false }, "StopCondition": { "OilLimit": 1000, @@ -558,7 +563,8 @@ "UseFleetLock": true, "UseAutoSearch": true, "Use2xBook": false, - "AmbushEvade": true + "AmbushEvade": true, + "ClearAfterSinking": false }, "StopCondition": { "OilLimit": 1000, @@ -638,7 +644,8 @@ "UseFleetLock": true, "UseAutoSearch": false, "Use2xBook": false, - "AmbushEvade": true + "AmbushEvade": true, + "ClearAfterSinking": false }, "StopCondition": { "OilLimit": 1000, @@ -723,7 +730,8 @@ "UseFleetLock": true, "UseAutoSearch": false, "Use2xBook": false, - "AmbushEvade": true + "AmbushEvade": true, + "ClearAfterSinking": false }, "Coalition": { "Mode": "area1-normal", @@ -789,7 +797,8 @@ "UseFleetLock": true, "UseAutoSearch": true, "Use2xBook": false, - "AmbushEvade": true + "AmbushEvade": true, + "ClearAfterSinking": false }, "InterceptiveCheck": { "OilThreshold": 0 @@ -872,7 +881,8 @@ "UseFleetLock": true, "UseAutoSearch": true, "Use2xBook": false, - "AmbushEvade": true + "AmbushEvade": true, + "ClearAfterSinking": false }, "StopCondition": { "OilLimit": 1000, @@ -952,7 +962,8 @@ "UseFleetLock": true, "UseAutoSearch": true, "Use2xBook": false, - "AmbushEvade": true + "AmbushEvade": true, + "ClearAfterSinking": false }, "StopCondition": { "OilLimit": 1000, @@ -1032,7 +1043,8 @@ "UseFleetLock": true, "UseAutoSearch": true, "Use2xBook": false, - "AmbushEvade": true + "AmbushEvade": true, + "ClearAfterSinking": false }, "StopCondition": { "OilLimit": 1000, @@ -1112,7 +1124,8 @@ "UseFleetLock": true, "UseAutoSearch": true, "Use2xBook": false, - "AmbushEvade": true + "AmbushEvade": true, + "ClearAfterSinking": false }, "StopCondition": { "OilLimit": 1000, @@ -1188,7 +1201,8 @@ "UseFleetLock": true, "UseAutoSearch": true, "Use2xBook": false, - "AmbushEvade": true + "AmbushEvade": true, + "ClearAfterSinking": false }, "StopCondition": { "OilLimit": 1000, @@ -1267,7 +1281,8 @@ "UseFleetLock": true, "UseAutoSearch": false, "Use2xBook": false, - "AmbushEvade": true + "AmbushEvade": true, + "ClearAfterSinking": false }, "StopCondition": { "OilLimit": 1000, @@ -1313,7 +1328,8 @@ "UseFleetLock": true, "UseAutoSearch": false, "Use2xBook": false, - "AmbushEvade": true + "AmbushEvade": true, + "ClearAfterSinking": false }, "Coalition": { "Mode": "area1-normal", diff --git a/module/combat/auto_search_combat.py b/module/combat/auto_search_combat.py index 59d5519bc..2c2b30944 100644 --- a/module/combat/auto_search_combat.py +++ b/module/combat/auto_search_combat.py @@ -15,7 +15,7 @@ class AutoSearchCombat(MapOperation, Combat, CampaignStatus): _auto_search_in_stage_timer = Timer(3, count=6) _auto_search_status_confirm = False _interrupt = False - _withdraw = False + _sinking = False auto_search_oil_limit_triggered = False auto_search_coin_limit_triggered = False @@ -37,6 +37,35 @@ class AutoSearchCombat(MapOperation, Combat, CampaignStatus): return False + def handle_clear_after_sinking(self, emotion_reduce, fleet_index): + """ + Args: + emotion_reduce(bool): + fleet_index (int): + + Pages: + in: in_map + out: is_combat_loading + + Raise: + CampaignEnd: withdraw + + Returns: + bool: If handled + """ + if not self._sinking: + return False + + if self.appear(WITHDRAW, offset=(30, 30)): + if self.map_clear_after_sinking: + if emotion_reduce: + self.emotion.reduce_sink(fleet_index) + return True + else: + self.withdraw() + + return False + def map_offensive_auto_search(self, skip_first_screenshot=True): """ Pages: @@ -341,7 +370,7 @@ class AutoSearchCombat(MapOperation, Combat, CampaignStatus): # bunch of popup handlers if self.handle_popup_confirm('AUTO_SEARCH_COMBAT_EXECUTE'): continue - if not self._withdraw and self.handle_urgent_commission(): + if not self._sinking and self.handle_urgent_commission(): continue if self.handle_story_skip(): continue @@ -362,10 +391,10 @@ class AutoSearchCombat(MapOperation, Combat, CampaignStatus): if self.handle_get_ship(): continue if self.appear_then_click(OPTS_INFO_D, offset=(30, 30), interval=2): - self._withdraw = True + self._sinking = True continue if confirm_timer.reached(): - self._withdraw = True + self._sinking = True self.device.click(OPTS_INFO_D) confirm_timer.reset() continue @@ -379,8 +408,12 @@ class AutoSearchCombat(MapOperation, Combat, CampaignStatus): self.device.screenshot_interval_set() break - def auto_search_combat_status(self): + def auto_search_combat_status(self, emotion_reduce, fleet_index): """ + Args: + emotion_reduce (bool): + fleet_index (int): + Pages: in: any out: is_auto_search_running() @@ -399,16 +432,14 @@ class AutoSearchCombat(MapOperation, Combat, CampaignStatus): if self.is_in_auto_search_menu() or self._handle_auto_search_menu_missing(): raise CampaignEnd - # Withdraw - if self._withdraw and get_urgent_commission and self.appear(WITHDRAW, offset=(30, 30)): - self._withdraw = False - self.withdraw() - break + if get_urgent_commission and self.handle_clear_after_sinking(emotion_reduce, fleet_index): + self._sinking = False + continue # Combat status if self.handle_get_ship(): continue - if not self._withdraw and self.handle_auto_search_map_option(): + if not self._sinking and self.handle_auto_search_map_option(): self._auto_search_status_confirm = False continue # bunch of popup handlers @@ -451,6 +482,6 @@ class AutoSearchCombat(MapOperation, Combat, CampaignStatus): emotion_reduce = emotion_reduce if emotion_reduce is not None else self.emotion.is_calculate self.auto_search_combat_execute(emotion_reduce=emotion_reduce, fleet_index=fleet_index, battle=battle) - self.auto_search_combat_status() + self.auto_search_combat_status(emotion_reduce=emotion_reduce, fleet_index=fleet_index) logger.info('Combat end.') diff --git a/module/combat/emotion.py b/module/combat/emotion.py index 38b8d76be..b90986810 100644 --- a/module/combat/emotion.py +++ b/module/combat/emotion.py @@ -215,6 +215,10 @@ class Emotion: else: return 2 + @property + def reduce_per_sinking(self): + return 10 + def _check_reduce(self, battle): """ Returns: @@ -305,6 +309,23 @@ class Emotion: self.record() self.show() + def reduce_sink(self, fleet_index): + """ + Reduce emotion of specific fleet. + Should be called after failing a battle + + Args: + fleet_index (int): 1 or 2. + """ + logger.hr('Emotion reduce after sinking') + self.update() + + fleet = self.fleets[fleet_index - 1] + fleet.current -= self.reduce_per_sinking + self.total_reduced += self.reduce_per_sinking + self.record() + self.show() + @cached_property def bug_threshold(self): """ diff --git a/module/config/argument/args.json b/module/config/argument/args.json index 01426f9cc..47091a50e 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -724,6 +724,10 @@ "AmbushEvade": { "type": "checkbox", "value": true + }, + "ClearAfterSinking": { + "type": "checkbox", + "value": false } }, "StopCondition": { @@ -1110,6 +1114,10 @@ "AmbushEvade": { "type": "checkbox", "value": true + }, + "ClearAfterSinking": { + "type": "checkbox", + "value": false } }, "StopCondition": { @@ -1496,6 +1504,10 @@ "AmbushEvade": { "type": "checkbox", "value": true + }, + "ClearAfterSinking": { + "type": "checkbox", + "value": false } }, "StopCondition": { @@ -1978,6 +1990,11 @@ "type": "checkbox", "value": true, "display": "hide" + }, + "ClearAfterSinking": { + "type": "checkbox", + "value": false, + "display": "hide" } }, "StopCondition": { @@ -2384,6 +2401,10 @@ "type": "checkbox", "value": true, "display": "hide" + }, + "ClearAfterSinking": { + "type": "checkbox", + "value": false } }, "StopCondition": { @@ -2788,6 +2809,10 @@ "type": "checkbox", "value": true, "display": "hide" + }, + "ClearAfterSinking": { + "type": "checkbox", + "value": false } }, "StopCondition": { @@ -3211,6 +3236,11 @@ "type": "checkbox", "value": true, "display": "hide" + }, + "ClearAfterSinking": { + "type": "checkbox", + "value": false, + "display": "hide" } }, "StopCondition": { @@ -3631,6 +3661,11 @@ "type": "checkbox", "value": true, "display": "hide" + }, + "ClearAfterSinking": { + "type": "checkbox", + "value": false, + "display": "hide" } }, "Coalition": { @@ -4148,6 +4183,10 @@ "type": "checkbox", "value": true, "display": "hide" + }, + "ClearAfterSinking": { + "type": "checkbox", + "value": false } }, "InterceptiveCheck": { @@ -4570,6 +4609,11 @@ "type": "checkbox", "value": true, "display": "hide" + }, + "ClearAfterSinking": { + "type": "checkbox", + "value": false, + "display": "hide" } }, "StopCondition": { @@ -4991,6 +5035,11 @@ "type": "checkbox", "value": true, "display": "hide" + }, + "ClearAfterSinking": { + "type": "checkbox", + "value": false, + "display": "hide" } }, "StopCondition": { @@ -5412,6 +5461,11 @@ "type": "checkbox", "value": true, "display": "hide" + }, + "ClearAfterSinking": { + "type": "checkbox", + "value": false, + "display": "hide" } }, "StopCondition": { @@ -5833,6 +5887,11 @@ "type": "checkbox", "value": true, "display": "hide" + }, + "ClearAfterSinking": { + "type": "checkbox", + "value": false, + "display": "hide" } }, "StopCondition": { @@ -6244,6 +6303,11 @@ "type": "checkbox", "value": true, "display": "hide" + }, + "ClearAfterSinking": { + "type": "checkbox", + "value": false, + "display": "hide" } }, "StopCondition": { @@ -6663,6 +6727,11 @@ "type": "checkbox", "value": true, "display": "hide" + }, + "ClearAfterSinking": { + "type": "checkbox", + "value": false, + "display": "hide" } }, "StopCondition": { @@ -6900,6 +6969,11 @@ "type": "checkbox", "value": true, "display": "hide" + }, + "ClearAfterSinking": { + "type": "checkbox", + "value": false, + "display": "hide" } }, "Coalition": { diff --git a/module/config/argument/argument.yaml b/module/config/argument/argument.yaml index 6c0bdc26b..ee592a0a6 100644 --- a/module/config/argument/argument.yaml +++ b/module/config/argument/argument.yaml @@ -161,6 +161,7 @@ Campaign: UseAutoSearch: true Use2xBook: false AmbushEvade: true + ClearAfterSinking: false InterceptiveCheck: OilThreshold: 0 StopCondition: diff --git a/module/config/argument/override.yaml b/module/config/argument/override.yaml index f06384908..589efe946 100644 --- a/module/config/argument/override.yaml +++ b/module/config/argument/override.yaml @@ -35,6 +35,7 @@ GemsFarming: UseFleetLock: true Use2xBook: false AmbushEvade: true + ClearAfterSinking: false StopCondition: RunCount: 0 MapAchievement: non_stop @@ -77,6 +78,7 @@ EventA: Mode: normal Use2xBook: false AmbushEvade: true + ClearAfterSinking: false StopCondition: RunCount: 0 MapAchievement: non_stop @@ -95,6 +97,7 @@ EventB: Mode: normal Use2xBook: false AmbushEvade: true + ClearAfterSinking: false StopCondition: RunCount: 0 MapAchievement: non_stop @@ -113,6 +116,7 @@ EventC: Mode: normal Use2xBook: false AmbushEvade: true + ClearAfterSinking: false StopCondition: RunCount: 0 MapAchievement: non_stop @@ -131,6 +135,7 @@ EventD: Mode: normal Use2xBook: false AmbushEvade: true + ClearAfterSinking: false StopCondition: RunCount: 0 MapAchievement: non_stop @@ -149,6 +154,7 @@ EventSp: Mode: normal Use2xBook: false AmbushEvade: true + ClearAfterSinking: false StopCondition: RunCount: 0 MapAchievement: non_stop @@ -168,6 +174,7 @@ Raid: UseAutoSearch: false Use2xBook: false AmbushEvade: true + ClearAfterSinking: false StopCondition: MapAchievement: non_stop StageIncrease: false @@ -213,6 +220,7 @@ RaidDaily: UseAutoSearch: false Use2xBook: false AmbushEvade: true + ClearAfterSinking: false StopCondition: RunCount: 0 MapAchievement: non_stop @@ -248,6 +256,7 @@ Coalition: UseAutoSearch: false Use2xBook: false AmbushEvade: true + ClearAfterSinking: false # Coalition: # Mode: # option: [ easy, normal, hard, ex ] @@ -278,6 +287,7 @@ CoalitionSp: UseAutoSearch: false Use2xBook: false AmbushEvade: true + ClearAfterSinking: false Coalition: # CoalitionSp hard-codes Mode='sp' Mode: sp diff --git a/module/config/config_generated.py b/module/config/config_generated.py index e57500a4a..cf6537518 100644 --- a/module/config/config_generated.py +++ b/module/config/config_generated.py @@ -83,6 +83,7 @@ class GeneratedConfig: Campaign_UseAutoSearch = True Campaign_Use2xBook = False Campaign_AmbushEvade = True + Campaign_ClearAfterSinking = False # Group `InterceptiveCheck` InterceptiveCheck_OilThreshold = 0 diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index f4ff9909f..5c3878337 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -861,6 +861,10 @@ "AmbushEvade": { "name": "Evade Ambush(es)", "help": "" + }, + "ClearAfterSinking": { + "name": "Use Auto Search after fleet sinking", + "help": "In clear mode, when a fleet sinked, try to use another fleet to run auto search instead of withdrawing" } }, "InterceptiveCheck": { diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index dccfaa020..41a588db4 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -861,6 +861,10 @@ "AmbushEvade": { "name": "Campaign.AmbushEvade.name", "help": "Campaign.AmbushEvade.help" + }, + "ClearAfterSinking": { + "name": "Campaign.ClearAfterSinking.name", + "help": "Campaign.ClearAfterSinking.help" } }, "InterceptiveCheck": { diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index b6338ff8a..68c0aaa78 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -861,6 +861,10 @@ "AmbushEvade": { "name": "规避伏击", "help": "" + }, + "ClearAfterSinking": { + "name": "沉船后继续自律", + "help": "在周回模式自律作战沉船后不撤退,而是使用另一队继续作战" } }, "InterceptiveCheck": { diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index 00aee2c3b..214b99067 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -861,6 +861,10 @@ "AmbushEvade": { "name": "規避伏擊", "help": "" + }, + "ClearAfterSinking": { + "name": "沉船後繼續自律", + "help": "在周回模式自律作戰沉船後不撤退,而是使用另一隊繼續作戰" } }, "InterceptiveCheck": { diff --git a/module/handler/fast_forward.py b/module/handler/fast_forward.py index bc33e60e7..92ee7901d 100644 --- a/module/handler/fast_forward.py +++ b/module/handler/fast_forward.py @@ -104,6 +104,7 @@ class FastForwardHandler(AutoSearchHandler): map_is_clear_mode = False # Clear mode == fast forward map_is_auto_search = False map_is_2x_book = False + map_clear_after_sinking = False STAGE_INCREASE = [ """ @@ -176,6 +177,7 @@ class FastForwardHandler(AutoSearchHandler): text = ', '.join([l for l, n in zip(log_names, names) if self.__getattribute__(n)]) text = f'{int(self.map_clear_percentage * 100)}%, ' + text logger.attr('Map_info', text) + logger.attr('Campaign_ClearAfterSinking', self.config.Campaign_ClearAfterSinking) logger.attr('StopCondition_MapAchievement', self.config.StopCondition_MapAchievement) def handle_fast_forward(self): @@ -183,6 +185,7 @@ class FastForwardHandler(AutoSearchHandler): self.map_is_clear_mode = False self.map_is_auto_search = False self.map_is_2x_book = False + self.map_clear_after_sinking = False return False if self.config.Campaign_UseClearMode: @@ -203,12 +206,14 @@ class FastForwardHandler(AutoSearchHandler): else: self.map_is_auto_search = self.config.Campaign_UseAutoSearch self.map_is_2x_book = self.config.Campaign_Use2xBook + self.map_clear_after_sinking = self.config.Campaign_ClearAfterSinking else: # When disable fast forward, MAP_HAS_AMBUSH depends on map settings. # self.config.MAP_HAS_AMBUSH = True self.map_is_clear_mode = False self.map_is_auto_search = False self.map_is_2x_book = False + self.map_clear_after_sinking = False pass state = 'on' if self.config.Campaign_UseClearMode else 'off'