diff --git a/config/template.json b/config/template.json index 6c141dbcc..d43113436 100644 --- a/config/template.json +++ b/config/template.json @@ -194,6 +194,7 @@ "AutoSearchMode": "sub_standby", "HuntMode": "do_not_use", "CallMode": "do_not_use", + "Timing": "default", "DistanceToBoss": "2_grid_to_boss" }, "Emotion": { @@ -273,6 +274,7 @@ "AutoSearchMode": "sub_standby", "HuntMode": "do_not_use", "CallMode": "do_not_use", + "Timing": "default", "DistanceToBoss": "2_grid_to_boss" }, "Emotion": { @@ -352,6 +354,7 @@ "AutoSearchMode": "sub_standby", "HuntMode": "do_not_use", "CallMode": "do_not_use", + "Timing": "default", "DistanceToBoss": "2_grid_to_boss" }, "Emotion": { @@ -444,6 +447,7 @@ "AutoSearchMode": "sub_standby", "HuntMode": "do_not_use", "CallMode": "do_not_use", + "Timing": "default", "DistanceToBoss": "2_grid_to_boss" }, "Emotion": { @@ -524,6 +528,7 @@ "AutoSearchMode": "sub_standby", "HuntMode": "do_not_use", "CallMode": "do_not_use", + "Timing": "default", "DistanceToBoss": "2_grid_to_boss" }, "Emotion": { @@ -603,6 +608,7 @@ "AutoSearchMode": "sub_standby", "HuntMode": "do_not_use", "CallMode": "do_not_use", + "Timing": "default", "DistanceToBoss": "2_grid_to_boss" }, "Emotion": { @@ -842,6 +848,7 @@ "AutoSearchMode": "sub_standby", "HuntMode": "do_not_use", "CallMode": "do_not_use", + "Timing": "default", "DistanceToBoss": "2_grid_to_boss" }, "Emotion": { @@ -925,6 +932,7 @@ "AutoSearchMode": "sub_standby", "HuntMode": "do_not_use", "CallMode": "do_not_use", + "Timing": "default", "DistanceToBoss": "2_grid_to_boss" }, "Emotion": { @@ -1008,6 +1016,7 @@ "AutoSearchMode": "sub_standby", "HuntMode": "do_not_use", "CallMode": "do_not_use", + "Timing": "default", "DistanceToBoss": "2_grid_to_boss" }, "Emotion": { @@ -1091,6 +1100,7 @@ "AutoSearchMode": "sub_standby", "HuntMode": "do_not_use", "CallMode": "do_not_use", + "Timing": "default", "DistanceToBoss": "2_grid_to_boss" }, "Emotion": { @@ -1174,6 +1184,7 @@ "AutoSearchMode": "sub_standby", "HuntMode": "do_not_use", "CallMode": "do_not_use", + "Timing": "default", "DistanceToBoss": "2_grid_to_boss" }, "Emotion": { @@ -1253,6 +1264,7 @@ "AutoSearchMode": "sub_standby", "HuntMode": "do_not_use", "CallMode": "do_not_use", + "Timing": "default", "DistanceToBoss": "2_grid_to_boss" }, "Emotion": { diff --git a/module/combat/submarine.py b/module/combat/submarine.py index 5be0a155b..4977cb641 100644 --- a/module/combat/submarine.py +++ b/module/combat/submarine.py @@ -1,8 +1,18 @@ from module.base.base import ModuleBase from module.base.timer import Timer +from module.base.utils import color_similar, crop, get_color, image_color_count from module.combat.assets import * from module.logger import logger +# BOSS detection areas +# Classic UI: BOSS avatar frame right border +BOSS_AVATAR_FRAME_RIGHT = (301, 13, 303, 89) +BOSS_AVATAR_FRAME_COLOR = (24, 28, 24) +# New UI: BOSS HP bar bottom border, middle-left portion +# Color targets deep blue themes; need adjustment for other color schemes +BOSS_HP_BAR_BORDER = (420, 48, 620, 50) +BOSS_HP_BAR_COLOR = (31, 39, 61) + class SubmarineCall(ModuleBase): submarine_call_flag = False @@ -16,6 +26,20 @@ class SubmarineCall(ModuleBase): self.submarine_call_timer.reset() self.submarine_call_flag = False + def boss_appeared(self): + """ + Detect whether BOSS has appeared by checking stable BOSS UI elements. + """ + # New UI: BOSS HP bar bottom border + avg = get_color(self.device.image, BOSS_HP_BAR_BORDER) + if color_similar(avg, BOSS_HP_BAR_COLOR, threshold=40): + return True + # Classic UI: BOSS avatar frame right border + frame = crop(self.device.image, BOSS_AVATAR_FRAME_RIGHT, copy=False) + if image_color_count(frame, color=BOSS_AVATAR_FRAME_COLOR, count=55): + return True + return False + def handle_submarine_call(self, call_mode='do_not_use', is_boss=False): """ Args: @@ -31,6 +55,10 @@ class SubmarineCall(ModuleBase): self.submarine_call_flag = True return False + if self.config.Submarine_Timing == 'wait_for_boss' and is_boss: + if not self.boss_appeared(): + self.submarine_call_timer.reset() + return False if self.submarine_call_timer.reached(): logger.info('Submarine call timer reached') self.submarine_call_flag = True diff --git a/module/config/argument/args.json b/module/config/argument/args.json index 642cded13..a89d8c02b 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -921,6 +921,14 @@ "every_combat" ] }, + "Timing": { + "type": "select", + "value": "default", + "option": [ + "default", + "wait_for_boss" + ] + }, "DistanceToBoss": { "type": "select", "value": "2_grid_to_boss", @@ -1323,6 +1331,14 @@ "every_combat" ] }, + "Timing": { + "type": "select", + "value": "default", + "option": [ + "default", + "wait_for_boss" + ] + }, "DistanceToBoss": { "type": "select", "value": "2_grid_to_boss", @@ -1725,6 +1741,14 @@ "every_combat" ] }, + "Timing": { + "type": "select", + "value": "default", + "option": [ + "default", + "wait_for_boss" + ] + }, "DistanceToBoss": { "type": "select", "value": "2_grid_to_boss", @@ -2227,6 +2251,14 @@ "every_combat" ] }, + "Timing": { + "type": "select", + "value": "default", + "option": [ + "default", + "wait_for_boss" + ] + }, "DistanceToBoss": { "type": "select", "value": "2_grid_to_boss", @@ -2645,6 +2677,14 @@ "every_combat" ] }, + "Timing": { + "type": "select", + "value": "default", + "option": [ + "default", + "wait_for_boss" + ] + }, "DistanceToBoss": { "type": "select", "value": "2_grid_to_boss", @@ -3065,6 +3105,14 @@ "every_combat" ] }, + "Timing": { + "type": "select", + "value": "default", + "option": [ + "default", + "wait_for_boss" + ] + }, "DistanceToBoss": { "type": "select", "value": "2_grid_to_boss", @@ -4473,6 +4521,14 @@ "every_combat" ] }, + "Timing": { + "type": "select", + "value": "default", + "option": [ + "default", + "wait_for_boss" + ] + }, "DistanceToBoss": { "type": "select", "value": "2_grid_to_boss", @@ -4911,6 +4967,14 @@ "every_combat" ] }, + "Timing": { + "type": "select", + "value": "default", + "option": [ + "default", + "wait_for_boss" + ] + }, "DistanceToBoss": { "type": "select", "value": "2_grid_to_boss", @@ -5349,6 +5413,14 @@ "every_combat" ] }, + "Timing": { + "type": "select", + "value": "default", + "option": [ + "default", + "wait_for_boss" + ] + }, "DistanceToBoss": { "type": "select", "value": "2_grid_to_boss", @@ -5787,6 +5859,14 @@ "every_combat" ] }, + "Timing": { + "type": "select", + "value": "default", + "option": [ + "default", + "wait_for_boss" + ] + }, "DistanceToBoss": { "type": "select", "value": "2_grid_to_boss", @@ -6225,6 +6305,14 @@ "every_combat" ] }, + "Timing": { + "type": "select", + "value": "default", + "option": [ + "default", + "wait_for_boss" + ] + }, "DistanceToBoss": { "type": "select", "value": "2_grid_to_boss", @@ -6654,6 +6742,14 @@ "every_combat" ] }, + "Timing": { + "type": "select", + "value": "default", + "option": [ + "default", + "wait_for_boss" + ] + }, "DistanceToBoss": { "type": "select", "value": "2_grid_to_boss", diff --git a/module/config/argument/argument.yaml b/module/config/argument/argument.yaml index 0e1522a09..a7062872d 100644 --- a/module/config/argument/argument.yaml +++ b/module/config/argument/argument.yaml @@ -222,6 +222,9 @@ Submarine: CallMode: value: do_not_use option: [ do_not_use, boss_only, every_combat ] + Timing: + value: default + option: [ default, wait_for_boss ] DistanceToBoss: value: '2_grid_to_boss' option: [ to_boss_position, 1_grid_to_boss, 2_grid_to_boss, use_open_ocean_support ] diff --git a/module/config/config_generated.py b/module/config/config_generated.py index c8a0fb388..72d2c6d95 100644 --- a/module/config/config_generated.py +++ b/module/config/config_generated.py @@ -115,6 +115,7 @@ class GeneratedConfig: Submarine_AutoSearchMode = 'sub_standby' # sub_standby, sub_auto_call Submarine_HuntMode = 'do_not_use' # do_not_use, hunt Submarine_CallMode = 'do_not_use' # do_not_use, boss_only, every_combat + Submarine_Timing = 'default' # default, wait_for_boss Submarine_DistanceToBoss = '2_grid_to_boss' # to_boss_position, 1_grid_to_boss, 2_grid_to_boss, use_open_ocean_support # Group `Emotion` diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index c25456545..27397da29 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -1064,6 +1064,12 @@ "boss_only": "BOSS Only", "every_combat": "Every Combat" }, + "Timing": { + "name": "BOSS Battle Call Timing (Experimental)", + "help": "Note: 'Wait For BOSS' currently only supports: Classic UI, and new UI with solid deep blue HP bar borders! Using unsupported UIs will prevent submarines from being called!", + "default": "Default (call immediately after entering combat)", + "wait_for_boss": "Wait For BOSS" + }, "DistanceToBoss": { "name": "Before BOSS battle move the submarine near BOSS", "help": "Effective only if \"Call Submarine\" is \"BOSS Only\"\nSelecting \"X Grids To BOSS\" needs to ensure that the submarine hunting range can cover the BOSS. Distance is calculated using the Manhattan Distance. Selecting \"Use Open Ocean Support\" requires submarine with aforementioned skill", diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index 0433f2b3a..168864f31 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -1064,6 +1064,12 @@ "boss_only": "BOSS戦のみ", "every_combat": "毎戦" }, + "Timing": { + "name": "BOSS戦召喚タイミング(テスト中)", + "help": "注意:'BOSS出現待機'現在のみ:クラシックUI、HPバー枠が深青一色の新型UIのみサポート!認識できないUIを使用すると潜水艦が出撃しません!", + "default": "デフォルト(戦闘開始直後に召喚を試みる)", + "wait_for_boss": "BOSS出現待機" + }, "DistanceToBoss": { "name": "BOSS戦前に潜水艦をBOSS付近に移動", "help": "\"潜水艦出撃設定\"が\"BOSS戦のみ\"の場合のみ有効\n\"BOSSまでXマス\"を選択する場合、潜水艦の狩猟範囲がBOSSまで届くことを確認してください。距離はマンハッタン距離で計算されます。\"遠洋支援を使用\"を選択する場合はU522/ダ・ヴィンチなどの遠洋支援スキルを持つ艦娘が必要です", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index da38e0db6..d82097d55 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -1064,6 +1064,12 @@ "boss_only": "仅BOSS战", "every_combat": "每场战斗" }, + "Timing": { + "name": "BOSS战召唤时机(测试中)", + "help": "注意:'等待BOSS出现'当前仅支持:经典UI、血条边框为深蓝纯色的新型UI!若使用无法识别的UI将导致潜艇不出击!", + "default": "默认(进战立即尝试召唤)", + "wait_for_boss": "等待boss出现" + }, "DistanceToBoss": { "name": "BOSS战前将潜艇移动到BOSS附近", "help": "仅在\"潜艇出击方案\"为\"仅BOSS战\"时生效\n选择\"距离BOSS X格\"需要保证潜艇狩猎范围能覆盖到BOSS,距离使用曼哈顿距离计算;选择\"使用远洋支援\"需要潜艇队伍里有具备远洋支援技能的舰娘,如U522、达芬奇等", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index 990f71260..cd46cfe61 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -1064,6 +1064,12 @@ "boss_only": "僅BOSS戰", "every_combat": "每場戰鬥" }, + "Timing": { + "name": "BOSS戰召喚時機(測試中)", + "help": "注意:'等待BOSS出現'目前僅支援:經典UI、血條邊框為深藍純色的新型UI!若使用無法識別的UI將導致潛艇不出擊!", + "default": "預設(進戰立即嘗試召喚)", + "wait_for_boss": "等待BOSS出現" + }, "DistanceToBoss": { "name": "BOSS戰前將潛艇移動到BOSS附近", "help": "僅在\"潛艇出擊方案\"為\"僅BOSS戰\"時生效\n選擇\"距離BOSS X格\"需要保證潛艇狩獵範圍能覆蓋到BOSS,距離使用曼哈頓距離計算,選擇\"使用遠洋支援\"需要潛艇隊伍裡有U522或是達芬奇",