From 1158a0535a87e3d98f1a87bc79824a95b12610f9 Mon Sep 17 00:00:00 2001 From: guoh064 <50830808+guoh064@users.noreply.github.com> Date: Sun, 18 Jan 2026 00:36:32 +0800 Subject: [PATCH 1/5] Add: W16 preparations --- assets/cn/handler/AIR_STRIKE_CANCEL.png | Bin 0 -> 9602 bytes assets/cn/handler/AIR_STRIKE_CONFIRM.png | Bin 0 -> 11043 bytes assets/cn/handler/AIR_STRIKE_ENTER.png | Bin 0 -> 9085 bytes assets/cn/handler/MAP_AIR_STRIKE.png | Bin 0 -> 25734 bytes assets/cn/map/FLEET_SUPPORT_EMPTY.png | Bin 0 -> 7307 bytes .../cn/template/TEMPLATE_AIR_STRIKE_ICON.png | Bin 0 -> 4280 bytes assets/en/handler/MAP_AIR_STRIKE.png | Bin 0 -> 25734 bytes .../en/template/TEMPLATE_AIR_STRIKE_ICON.png | Bin 0 -> 4280 bytes assets/jp/handler/AIR_STRIKE_CANCEL.png | Bin 0 -> 9602 bytes assets/jp/handler/AIR_STRIKE_CONFIRM.png | Bin 0 -> 11043 bytes assets/jp/handler/MAP_AIR_STRIKE.png | Bin 0 -> 25734 bytes .../jp/template/TEMPLATE_AIR_STRIKE_ICON.png | Bin 0 -> 4280 bytes ...MAP_UI_W15.png => MASK_MAP_UI_SUPPORT.png} | Bin assets/tw/handler/MAP_AIR_STRIKE.png | Bin 0 -> 25734 bytes .../tw/template/TEMPLATE_AIR_STRIKE_ICON.png | Bin 0 -> 4280 bytes campaign/campaign_main/campaign_15_base.py | 14 +-- campaign/campaign_main/campaign_16_1.py | 81 +++++++++++++++ campaign/campaign_main/campaign_16_2.py | 78 ++++++++++++++ campaign/campaign_main/campaign_16_3.py | 90 ++++++++++++++++ campaign/campaign_main/campaign_16_4.py | 97 ++++++++++++++++++ .../campaign_16_base_aircraft.py | 93 +++++++++++++++++ .../campaign_16_base_submarine.py | 25 +++++ .../campaign_main/campaign_support_fleet.py | 28 +++++ module/handler/assets.py | 4 + module/handler/fast_forward.py | 7 ++ module/handler/strategy.py | 41 ++++++++ module/map/assets.py | 1 + module/map/camera.py | 3 +- module/map/map_operation.py | 4 + module/map_detection/grid_predictor.py | 7 ++ module/template/assets.py | 1 + 31 files changed, 560 insertions(+), 14 deletions(-) create mode 100644 assets/cn/handler/AIR_STRIKE_CANCEL.png create mode 100644 assets/cn/handler/AIR_STRIKE_CONFIRM.png create mode 100644 assets/cn/handler/AIR_STRIKE_ENTER.png create mode 100644 assets/cn/handler/MAP_AIR_STRIKE.png create mode 100644 assets/cn/map/FLEET_SUPPORT_EMPTY.png create mode 100644 assets/cn/template/TEMPLATE_AIR_STRIKE_ICON.png create mode 100644 assets/en/handler/MAP_AIR_STRIKE.png create mode 100644 assets/en/template/TEMPLATE_AIR_STRIKE_ICON.png create mode 100644 assets/jp/handler/AIR_STRIKE_CANCEL.png create mode 100644 assets/jp/handler/AIR_STRIKE_CONFIRM.png create mode 100644 assets/jp/handler/MAP_AIR_STRIKE.png create mode 100644 assets/jp/template/TEMPLATE_AIR_STRIKE_ICON.png rename assets/mask/{MASK_MAP_UI_W15.png => MASK_MAP_UI_SUPPORT.png} (100%) create mode 100644 assets/tw/handler/MAP_AIR_STRIKE.png create mode 100644 assets/tw/template/TEMPLATE_AIR_STRIKE_ICON.png create mode 100644 campaign/campaign_main/campaign_16_1.py create mode 100644 campaign/campaign_main/campaign_16_2.py create mode 100644 campaign/campaign_main/campaign_16_3.py create mode 100644 campaign/campaign_main/campaign_16_4.py create mode 100644 campaign/campaign_main/campaign_16_base_aircraft.py create mode 100644 campaign/campaign_main/campaign_16_base_submarine.py create mode 100644 campaign/campaign_main/campaign_support_fleet.py diff --git a/assets/cn/handler/AIR_STRIKE_CANCEL.png b/assets/cn/handler/AIR_STRIKE_CANCEL.png new file mode 100644 index 0000000000000000000000000000000000000000..b8282cb6610853d8f1bc8b1bf7685eba621cd34e GIT binary patch literal 9602 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 literal 0 HcmV?d00001 diff --git a/assets/cn/handler/AIR_STRIKE_ENTER.png b/assets/cn/handler/AIR_STRIKE_ENTER.png new file mode 100644 index 0000000000000000000000000000000000000000..ef8b8b97578f0f6ac74df76607f8c86d0d189599 GIT binary patch literal 9085 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 OhN+RcVd=Gd|Nak~aL$eZ literal 0 HcmV?d00001 diff --git a/assets/cn/handler/MAP_AIR_STRIKE.png b/assets/cn/handler/MAP_AIR_STRIKE.png new file mode 100644 index 0000000000000000000000000000000000000000..6c1d5fc219d723f35527199aad809aa02bb7136b GIT binary patch literal 25734 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 literal 0 HcmV?d00001 diff --git a/assets/cn/map/FLEET_SUPPORT_EMPTY.png b/assets/cn/map/FLEET_SUPPORT_EMPTY.png new file mode 100644 index 0000000000000000000000000000000000000000..cdb45ca5cb477ddf41b8b82707489d62c0e4e7a6 GIT binary patch literal 7307 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 WIx*n7`>)+onqR*5H`c`c-~Rz6*5U*J literal 0 HcmV?d00001 diff --git a/assets/cn/template/TEMPLATE_AIR_STRIKE_ICON.png b/assets/cn/template/TEMPLATE_AIR_STRIKE_ICON.png new file mode 100644 index 0000000000000000000000000000000000000000..fb7d0b64c4c5a190722cc18801a6d53cb3dba20b GIT binary patch literal 4280 zcmeHKdvFtV9#2uA^axYD97UzDO-^V>Hv7otwKPC&`iM3qlt2M%?Pm9vbS25IyW1w= zMmoGt@PQ6YWOIG|kluvf$(7O7BvojENwk zB>4FtK$MsW5D?}48cnn- z_3PQ*33WG#O&dR)Bekqws5R`%s+xL~nDRyAm-NY3TPJ4Dily(k*z!om#ZO-DoKtet zL@wnnv}^j_di2@JNB>&!uOspi^1W$>5AXT!x83u98go^*?Dq2~O2%n4DF!}2-{Z>9 zABYCV(6D36@q1gVbQ^Yg`2r>Vblx=bSS^LvZfrd9oTnpo$$rZ9!uC^Jp4auhKBs+i zH=g3Ks=g(2Aw*P#yvd`9RJ$yDcU6=Rq za?i_W*l69l53&x;YyG}v?Z40UzG7~({n$3|(;H(mdp&h~Qug-1qNwFz@|U_xXjTXr z8BXv4V>BeH)uG9q7Zn+H1yB$l2=HNtzW1N6=@FiD=*!J++%4vVYQA`-1Qx9<^|C8h zuy#&AZ*E#{l!gEypfE@@6b#FB)S-{#((ql~#`H*BL|Ng`FLis6d_e*TWu%NaS`g)H zN&Vb3Bv<16beXfT9|Eo%`f5cHX$*@*BF2cxC`bW}u-okzPGTg9LJ3rkg%u`>hGl~a zk-%^QnU#1^;e{}wVlqCVMseu%@EjTNFC@C%gYaRwp9RPV7G*??FydG!ge7apN38T?HDoXBA*>9@LXE_Nf?5z(49O52JE$+#NWpkG9E*V<2tiR9S|x^=EONO$gBmIY z0X`(gwIJEUBo*F2MAk6h)RTBP$&NtvLEK@|1F^@2p_JQAI|a5zb zAg%$Uq4OocD1zh_grGyOI)$j3gU4>zP#mK$PDTL`6ele-PSAwaOA<70q6yR8xQ)h> zfzoT@G(lsImMkG91U88i3h=CCak5RNvUNi+!IW5%YPO?#1uGJu|kisVaX{UAhWNolW;tt@$5Z!Uc-} literal 0 HcmV?d00001 diff --git a/assets/en/handler/MAP_AIR_STRIKE.png b/assets/en/handler/MAP_AIR_STRIKE.png new file mode 100644 index 0000000000000000000000000000000000000000..6c1d5fc219d723f35527199aad809aa02bb7136b GIT binary patch literal 25734 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 literal 0 HcmV?d00001 diff --git a/assets/en/template/TEMPLATE_AIR_STRIKE_ICON.png b/assets/en/template/TEMPLATE_AIR_STRIKE_ICON.png new file mode 100644 index 0000000000000000000000000000000000000000..fb7d0b64c4c5a190722cc18801a6d53cb3dba20b GIT binary patch literal 4280 zcmeHKdvFtV9#2uA^axYD97UzDO-^V>Hv7otwKPC&`iM3qlt2M%?Pm9vbS25IyW1w= zMmoGt@PQ6YWOIG|kluvf$(7O7BvojENwk zB>4FtK$MsW5D?}48cnn- z_3PQ*33WG#O&dR)Bekqws5R`%s+xL~nDRyAm-NY3TPJ4Dily(k*z!om#ZO-DoKtet zL@wnnv}^j_di2@JNB>&!uOspi^1W$>5AXT!x83u98go^*?Dq2~O2%n4DF!}2-{Z>9 zABYCV(6D36@q1gVbQ^Yg`2r>Vblx=bSS^LvZfrd9oTnpo$$rZ9!uC^Jp4auhKBs+i zH=g3Ks=g(2Aw*P#yvd`9RJ$yDcU6=Rq za?i_W*l69l53&x;YyG}v?Z40UzG7~({n$3|(;H(mdp&h~Qug-1qNwFz@|U_xXjTXr z8BXv4V>BeH)uG9q7Zn+H1yB$l2=HNtzW1N6=@FiD=*!J++%4vVYQA`-1Qx9<^|C8h zuy#&AZ*E#{l!gEypfE@@6b#FB)S-{#((ql~#`H*BL|Ng`FLis6d_e*TWu%NaS`g)H zN&Vb3Bv<16beXfT9|Eo%`f5cHX$*@*BF2cxC`bW}u-okzPGTg9LJ3rkg%u`>hGl~a zk-%^QnU#1^;e{}wVlqCVMseu%@EjTNFC@C%gYaRwp9RPV7G*??FydG!ge7apN38T?HDoXBA*>9@LXE_Nf?5z(49O52JE$+#NWpkG9E*V<2tiR9S|x^=EONO$gBmIY z0X`(gwIJEUBo*F2MAk6h)RTBP$&NtvLEK@|1F^@2p_JQAI|a5zb zAg%$Uq4OocD1zh_grGyOI)$j3gU4>zP#mK$PDTL`6ele-PSAwaOA<70q6yR8xQ)h> zfzoT@G(lsImMkG91U88i3h=CCak5RNvUNi+!IW5%YPO?#1uGJu|kisVaX{UAhWNolW;tt@$5Z!Uc-} literal 0 HcmV?d00001 diff --git a/assets/jp/handler/AIR_STRIKE_CANCEL.png b/assets/jp/handler/AIR_STRIKE_CANCEL.png new file mode 100644 index 0000000000000000000000000000000000000000..b8282cb6610853d8f1bc8b1bf7685eba621cd34e GIT binary patch literal 9602 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 literal 0 HcmV?d00001 diff --git a/assets/jp/handler/MAP_AIR_STRIKE.png b/assets/jp/handler/MAP_AIR_STRIKE.png new file mode 100644 index 0000000000000000000000000000000000000000..6c1d5fc219d723f35527199aad809aa02bb7136b GIT binary patch literal 25734 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 literal 0 HcmV?d00001 diff --git a/assets/jp/template/TEMPLATE_AIR_STRIKE_ICON.png b/assets/jp/template/TEMPLATE_AIR_STRIKE_ICON.png new file mode 100644 index 0000000000000000000000000000000000000000..fb7d0b64c4c5a190722cc18801a6d53cb3dba20b GIT binary patch literal 4280 zcmeHKdvFtV9#2uA^axYD97UzDO-^V>Hv7otwKPC&`iM3qlt2M%?Pm9vbS25IyW1w= zMmoGt@PQ6YWOIG|kluvf$(7O7BvojENwk zB>4FtK$MsW5D?}48cnn- z_3PQ*33WG#O&dR)Bekqws5R`%s+xL~nDRyAm-NY3TPJ4Dily(k*z!om#ZO-DoKtet zL@wnnv}^j_di2@JNB>&!uOspi^1W$>5AXT!x83u98go^*?Dq2~O2%n4DF!}2-{Z>9 zABYCV(6D36@q1gVbQ^Yg`2r>Vblx=bSS^LvZfrd9oTnpo$$rZ9!uC^Jp4auhKBs+i zH=g3Ks=g(2Aw*P#yvd`9RJ$yDcU6=Rq za?i_W*l69l53&x;YyG}v?Z40UzG7~({n$3|(;H(mdp&h~Qug-1qNwFz@|U_xXjTXr z8BXv4V>BeH)uG9q7Zn+H1yB$l2=HNtzW1N6=@FiD=*!J++%4vVYQA`-1Qx9<^|C8h zuy#&AZ*E#{l!gEypfE@@6b#FB)S-{#((ql~#`H*BL|Ng`FLis6d_e*TWu%NaS`g)H zN&Vb3Bv<16beXfT9|Eo%`f5cHX$*@*BF2cxC`bW}u-okzPGTg9LJ3rkg%u`>hGl~a zk-%^QnU#1^;e{}wVlqCVMseu%@EjTNFC@C%gYaRwp9RPV7G*??FydG!ge7apN38T?HDoXBA*>9@LXE_Nf?5z(49O52JE$+#NWpkG9E*V<2tiR9S|x^=EONO$gBmIY z0X`(gwIJEUBo*F2MAk6h)RTBP$&NtvLEK@|1F^@2p_JQAI|a5zb zAg%$Uq4OocD1zh_grGyOI)$j3gU4>zP#mK$PDTL`6ele-PSAwaOA<70q6yR8xQ)h> zfzoT@G(lsImMkG91U88i3h=CCak5RNvUNi+!IW5%YPO?#1uGJu|kisVaX{UAhWNolW;tt@$5Z!Uc-} literal 0 HcmV?d00001 diff --git a/assets/mask/MASK_MAP_UI_W15.png b/assets/mask/MASK_MAP_UI_SUPPORT.png similarity index 100% rename from assets/mask/MASK_MAP_UI_W15.png rename to assets/mask/MASK_MAP_UI_SUPPORT.png diff --git a/assets/tw/handler/MAP_AIR_STRIKE.png b/assets/tw/handler/MAP_AIR_STRIKE.png new file mode 100644 index 0000000000000000000000000000000000000000..6c1d5fc219d723f35527199aad809aa02bb7136b GIT binary patch literal 25734 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 literal 0 HcmV?d00001 diff --git a/assets/tw/template/TEMPLATE_AIR_STRIKE_ICON.png b/assets/tw/template/TEMPLATE_AIR_STRIKE_ICON.png new file mode 100644 index 0000000000000000000000000000000000000000..fb7d0b64c4c5a190722cc18801a6d53cb3dba20b GIT binary patch literal 4280 zcmeHKdvFtV9#2uA^axYD97UzDO-^V>Hv7otwKPC&`iM3qlt2M%?Pm9vbS25IyW1w= zMmoGt@PQ6YWOIG|kluvf$(7O7BvojENwk zB>4FtK$MsW5D?}48cnn- z_3PQ*33WG#O&dR)Bekqws5R`%s+xL~nDRyAm-NY3TPJ4Dily(k*z!om#ZO-DoKtet zL@wnnv}^j_di2@JNB>&!uOspi^1W$>5AXT!x83u98go^*?Dq2~O2%n4DF!}2-{Z>9 zABYCV(6D36@q1gVbQ^Yg`2r>Vblx=bSS^LvZfrd9oTnpo$$rZ9!uC^Jp4auhKBs+i zH=g3Ks=g(2Aw*P#yvd`9RJ$yDcU6=Rq za?i_W*l69l53&x;YyG}v?Z40UzG7~({n$3|(;H(mdp&h~Qug-1qNwFz@|U_xXjTXr z8BXv4V>BeH)uG9q7Zn+H1yB$l2=HNtzW1N6=@FiD=*!J++%4vVYQA`-1Qx9<^|C8h zuy#&AZ*E#{l!gEypfE@@6b#FB)S-{#((ql~#`H*BL|Ng`FLis6d_e*TWu%NaS`g)H zN&Vb3Bv<16beXfT9|Eo%`f5cHX$*@*BF2cxC`bW}u-okzPGTg9LJ3rkg%u`>hGl~a zk-%^QnU#1^;e{}wVlqCVMseu%@EjTNFC@C%gYaRwp9RPV7G*??FydG!ge7apN38T?HDoXBA*>9@LXE_Nf?5z(49O52JE$+#NWpkG9E*V<2tiR9S|x^=EONO$gBmIY z0X`(gwIJEUBo*F2MAk6h)RTBP$&NtvLEK@|1F^@2p_JQAI|a5zb zAg%$Uq4OocD1zh_grGyOI)$j3gU4>zP#mK$PDTL`6ele-PSAwaOA<70q6yR8xQ)h> zfzoT@G(lsImMkG91U88i3h=CCak5RNvUNi+!IW5%YPO?#1uGJu|kisVaX{UAhWNolW;tt@$5Z!Uc-} literal 0 HcmV?d00001 diff --git a/campaign/campaign_main/campaign_15_base.py b/campaign/campaign_main/campaign_15_base.py index af7a5b841..da6808fd8 100644 --- a/campaign/campaign_main/campaign_15_base.py +++ b/campaign/campaign_main/campaign_15_base.py @@ -1,15 +1,13 @@ from module.base.mask import Mask from module.base.timer import Timer -from module.campaign.campaign_base import CampaignBase as CampaignBase_ from module.handler.assets import STRATEGY_OPENED from module.handler.strategy import MOB_MOVE_OFFSET from module.logger import logger from module.map.map_grids import SelectedGrids from module.map.utils import location_ensure from module.map_detection.grid import GridInfo -from module.map_detection.utils_assets import ASSETS -MASK_MAP_UI_W15 = Mask(file='./assets/mask/MASK_MAP_UI_W15.png') +from .campaign_support_fleet import CampaignBase as CampaignBase_ class Config: @@ -45,12 +43,6 @@ class W15GridInfo(GridInfo): class CampaignBase(CampaignBase_): ENEMY_FILTER = '1L > 1M > 1E > 2L > 3L > 2M > 2E > 1C > 2C > 3M > 3E > 3C' - def map_data_init(self, map_): - super().map_data_init(map_) - # Patch ui_mask, get rid of supporting fleet - _ = ASSETS.ui_mask - ASSETS.ui_mask = MASK_MAP_UI_W15.image - map_has_mob_move = True def strategy_set_execute(self, formation=None, sub_view=None, sub_hunt=None): @@ -61,10 +53,6 @@ class CampaignBase(CampaignBase_): ) logger.attr("Map has mob move", self.strategy_has_mob_move()) - def _map_swipe(self, vector, box=(239, 159, 1175, 628)): - # Left border to 239, avoid swiping on support fleet - return super()._map_swipe(vector, box=box) - def mob_movable(self, location, target): """ Check if mob is movable from location to target. diff --git a/campaign/campaign_main/campaign_16_1.py b/campaign/campaign_main/campaign_16_1.py new file mode 100644 index 000000000..525e45eb7 --- /dev/null +++ b/campaign/campaign_main/campaign_16_1.py @@ -0,0 +1,81 @@ +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + +from .campaign_16_base_submarine import CampaignBase +from .campaign_16_base_submarine import Config as ConfigBase + +MAP = CampaignMap('16-1') +MAP.shape = 'I9' +MAP.camera_data = ['C2', 'C6', 'F2', 'F6'] +MAP.camera_data_spawn_point = ['F6'] +MAP.camera_sight = (-2, -1, 3, 2) +MAP.map_data = """ + ++ ME -- -- ME -- -- ME -- + ME -- -- ME ++ ME -- -- ME + -- -- ME -- ME -- -- ME ++ + -- ME ++ ME -- ME -- ME Me + -- -- ME -- Me ++ __ -- -- + -- ME -- __ ME -- -- -- MB + -- ++ Me -- -- -- Me ++ ++ + -- ME -- -- -- -- -- ++ ++ + -- -- -- -- SP SP ++ ++ -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2}, + {'battle': 1, 'enemy': 2}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1}, + {'battle': 5, 'boss': 1} +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, \ + = MAP.flatten() + + +class Config(ConfigBase): + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = False + MAP_HAS_AMBUSH = True + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1): + return True + + return self.battle_default() + + def battle_5(self): + boss = self.map.select(is_boss=True) + if boss: + return self.fleet_boss.clear_boss() + + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_6(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/campaign_main/campaign_16_2.py b/campaign/campaign_main/campaign_16_2.py new file mode 100644 index 000000000..5abe80be3 --- /dev/null +++ b/campaign/campaign_main/campaign_16_2.py @@ -0,0 +1,78 @@ +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + +from .campaign_16_base_submarine import CampaignBase +from .campaign_16_base_submarine import Config as ConfigBase + +MAP = CampaignMap('16-2') +MAP.shape = 'J8' +MAP.camera_data = ['C2', 'C6', 'G2', 'G6'] +MAP.camera_data_spawn_point = ['C6'] +MAP.camera_sight = (-2, -1, 3, 2) +MAP.map_data = """ + MB ++ -- ME -- -- -- -- -- -- + -- Me ME -- ME ++ ME -- -- -- + -- __ -- -- -- -- -- ME ++ ++ + ME -- ME ME ME -- ME -- ++ -- + Me -- -- Me ++ -- Me -- -- -- + ++ ME -- ME ME -- ME ++ ++ -- + -- -- -- -- -- Me -- -- ++ -- + -- SP SP -- ++ ++ ++ -- -- -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 3}, + {'battle': 1, 'enemy': 2}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1}, + {'battle': 5, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, \ + = MAP.flatten() + + +class Config(ConfigBase): + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = False + MAP_HAS_AMBUSH = True + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1): + return True + + return self.battle_default() + + def battle_5(self): + boss = self.map.select(is_boss=True) + if boss: + return self.fleet_boss.clear_boss() + + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_6(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/campaign_main/campaign_16_3.py b/campaign/campaign_main/campaign_16_3.py new file mode 100644 index 000000000..efa371a1c --- /dev/null +++ b/campaign/campaign_main/campaign_16_3.py @@ -0,0 +1,90 @@ +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + +from .campaign_16_base_aircraft import CampaignBase +from .campaign_16_base_aircraft import Config as ConfigBase + +MAP = CampaignMap('16-3') +MAP.shape = 'K6' +MAP.camera_data = ['C2', 'C5', 'F2', 'F5', 'H2', 'H5'] +MAP.camera_data_spawn_point = ['C5'] +MAP.camera_sight = (-2, -1, 3, 2) +MAP.map_data = """ + -- -- ++ ++ ++ -- -- ME ++ -- MB + -- ME -- ++ -- ME -- -- ++ -- -- + -- -- ME ME -- ME ++ ME ++ -- -- + -- -- -- ++ ++ __ ME ME -- -- -- + SP -- -- ++ -- ME ++ -- -- -- -- + SP -- -- ME ME -- ++ -- -- -- ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 40 40 40 40 50 50 50 50 50 + 50 50 50 50 50 40 40 40 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 3}, + {'battle': 1, 'enemy': 6}, + {'battle': 2, 'enemy': 3}, + {'battle': 3, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, \ + = MAP.flatten() + +road_main = RoadGrids([C3, D3, F3, G4, H4]) + + +class Config(ConfigBase): + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = False + MAP_HAS_AMBUSH = True + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + self.clear_chosen_enemy(C3) + return True + + def battle_1(self): + if self.use_support_fleet: + self.air_strike(E3) + self.clear_chosen_enemy(D3) + return True + + def battle_2(self): + if self.clear_roadblocks([road_main]): + return True + if self.clear_potential_roadblocks([road_main]): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + return self.battle_default() + + def battle_3(self): + boss = self.map.select(is_boss=True) + if boss: + if not self.check_accessibility(boss[0], fleet='boss'): + return self.clear_roadblocks([road_main]) + if self.use_support_fleet: + # at this stage the most right zone should be accessible + self.goto(K5) + self.air_strike(J6) + return self.fleet_boss.clear_boss() + if self.clear_roadblocks([road_main]): + return True + if self.clear_potential_roadblocks([road_main]): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + return self.battle_default() \ No newline at end of file diff --git a/campaign/campaign_main/campaign_16_4.py b/campaign/campaign_main/campaign_16_4.py new file mode 100644 index 000000000..b7e9bddec --- /dev/null +++ b/campaign/campaign_main/campaign_16_4.py @@ -0,0 +1,97 @@ +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + +from .campaign_16_base_aircraft import CampaignBase +from .campaign_16_base_aircraft import Config as ConfigBase + +MAP = CampaignMap('16-4') +MAP.shape = 'K8' +MAP.camera_data = ['C2', 'C6', 'F2', 'F6', 'H2', 'H6'] +MAP.camera_data_spawn_point = ['C6'] +MAP.camera_sight = (-2, -1, 3, 2) +MAP.map_data = """ + -- -- ++ -- -- -- ++ ME -- -- MB + ME ++ ++ ++ -- -- ME ++ -- -- -- + -- -- ME -- -- ++ ++ ME -- -- -- + -- -- -- ME ++ -- ME -- ++ ++ -- + -- -- ME -- -- ME ++ -- ME ++ -- + -- __ -- ++ ++ -- ++ ME ME -- -- + SP -- -- ME -- -- ME ++ -- ++ ++ + SP -- -- -- ++ -- ++ ++ -- -- ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 40 50 50 50 + 50 50 50 40 50 40 40 40 50 50 50 + 50 50 50 40 40 40 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 5}, + {'battle': 1, 'enemy': 4}, + {'battle': 2, 'enemy': 5}, + {'battle': 3}, + {'battle': 4, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, K7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, K8, \ + = MAP.flatten() + +road_main = RoadGrids([D4, F5, G4, H3]) + +class Config(ConfigBase): + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = False + MAP_HAS_AMBUSH = True + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + self.clear_chosen_enemy(D4) + return True + + def battle_1(self): + if self.use_support_fleet: + self.goto(D1) + self.air_strike(B1) + self.clear_chosen_enemy(F5) + return True + + def battle_2(self): + if self.clear_roadblocks([road_main]): + return True + if self.clear_potential_roadblocks([road_main]): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + return self.battle_default() + + def battle_4(self): + boss = self.map.select(is_boss=True) + if boss: + if not self.check_accessibility(boss[0], fleet='boss'): + return self.clear_roadblocks([road_main]) + if self.use_support_fleet: + # at this stage the most right zone should be accessible + self.goto(J6) + self.air_strike(I8) + return self.fleet_boss.clear_boss() + if self.clear_roadblocks([road_main]): + return True + if self.clear_potential_roadblocks([road_main]): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + return self.battle_default() \ No newline at end of file diff --git a/campaign/campaign_main/campaign_16_base_aircraft.py b/campaign/campaign_main/campaign_16_base_aircraft.py new file mode 100644 index 000000000..b780b4b31 --- /dev/null +++ b/campaign/campaign_main/campaign_16_base_aircraft.py @@ -0,0 +1,93 @@ +from module.base.decorator import del_cached_property +from module.base.timer import Timer +from module.base.utils import red_overlay_transparency, get_color +from module.handler.assets import MAP_AIR_STRIKE, STRATEGY_OPENED, AIR_STRIKE_CONFIRM +from module.handler.strategy import AIR_STRIKE_OFFSET +from module.logger import logger +from module.map.utils import location_ensure + +from .campaign_support_fleet import CampaignBase as CampaignBase_ + + +class Config: + MAP_WALK_TURNING_OPTIMIZE = False + MAP_HAS_MYSTERY = False + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 33), + 'prominence': 10, + 'distance': 35, + } + HOMO_CANNY_THRESHOLD = (50, 100) + + +class CampaignBase(CampaignBase_): + MAP_AIR_STRIKE_OVERLAY_TRANSPARENCY_THRESHOLD = 0.35 + ENEMY_FILTER = '1L > 1M > 1E > 2L > 3L > 2M > 2E > 1C > 2C > 3M > 3E > 3C' + + def _air_strike_appear(self): + return red_overlay_transparency(MAP_AIR_STRIKE.color, get_color(self.device.image, MAP_AIR_STRIKE.area)) > \ + self.MAP_AIR_STRIKE_OVERLAY_TRANSPARENCY_THRESHOLD + + def _air_strike(self, location): + self.in_sight(location) + attack_grid = self.convert_global_to_local(location) + attack_grid.__str__ = location + + logger.info('Select grid to air strike') + skip_first_screenshot = True + interval = Timer(5, count=10) + for _ in self.loop(skip_first=skip_first_screenshot): + # End + if self.is_in_strategy_air_strike(): + self.view.update(image=self.device.image) + del_cached_property(attack_grid, "image_trans") + if attack_grid.predict_air_strike_icon(): + break + # Click + if interval.reached() and self.is_in_strategy_air_strike(): + self.device.click(attack_grid) + interval.reset() + continue + + logger.info('Confirm air strike') + skip_first_screenshot = True + interval = Timer(3, count=6) + MAP_AIR_STRIKE.load_color(self.device.image) + for _ in self.loop(skip_first=skip_first_screenshot): + if self._air_strike_appear(): + interval.reset() + continue + # End + if self.appear(STRATEGY_OPENED, offset=AIR_STRIKE_OFFSET): + break + # Click + if interval.reached() and self.is_in_strategy_air_strike(): + self.device.click(AIR_STRIKE_CONFIRM) + interval.reset() + continue + + def air_strike(self, location): + """ + Open strategy, air strike on location, close strategy. + + Air strike at location X = (x, y) will hit range [x-2, y-1, x+2, y] as follows: + + OOOOO + OOXOO + + Args: + location (typle, str, GridInfo): Location of air strike + """ + location = location_ensure(location) + if self.map[location].is_land: + logger.warning(f'Air strike location {location} is on land, will abandon attacking') + return False + self.strategy_open() + if not self.strategy_has_air_strike(): + logger.warning(f'No remain air strike trials, will abandon attacking') + self.strategy_close() + return False + self.strategy_air_strike_enter() + self._air_strike(location) + self.strategy_close(skip_first_screenshot=False) + return True diff --git a/campaign/campaign_main/campaign_16_base_submarine.py b/campaign/campaign_main/campaign_16_base_submarine.py new file mode 100644 index 000000000..edd8e6878 --- /dev/null +++ b/campaign/campaign_main/campaign_16_base_submarine.py @@ -0,0 +1,25 @@ +from module.logger import logger + +from .campaign_support_fleet import CampaignBase as CampaignBase_ + + +class Config: + MAP_WALK_TURNING_OPTIMIZE = False + MAP_HAS_MYSTERY = False + HOMO_EDGE_COLOR_RANGE = (0, 12) + HOMO_EDGE_HOUGHLINES_THRESHOLD = 210 + + +class CampaignBase(CampaignBase_): + ENEMY_FILTER = '1T > 1L > 1E > 1M > 2T > 2L > 2E > 2M > 3T > 3L > 3E > 3M' + + def map_init(self, map_): + if self.use_support_fleet: + logger.hr(f'{self.FUNCTION_NAME_BASE}SUBMARINE', level=2) + self.combat(balance_hp=False, emotion_reduce=False, save_get_items=False) + super().map_init(map_) + + def handle_submarine_support_popup(self): + if self.use_support_fleet and self.handle_popup_confirm("SUBMARINE_SUPPORT"): + return True + return False diff --git a/campaign/campaign_main/campaign_support_fleet.py b/campaign/campaign_main/campaign_support_fleet.py new file mode 100644 index 000000000..fceed45ae --- /dev/null +++ b/campaign/campaign_main/campaign_support_fleet.py @@ -0,0 +1,28 @@ +from module.base.mask import Mask +from module.campaign.campaign_base import CampaignBase as CampaignBase_ +from module.logger import logger +from module.map.assets import FLEET_SUPPORT_EMPTY +from module.map_detection.utils_assets import ASSETS + +MASK_MAP_UI_SUPPORT = Mask(file='./assets/mask/MASK_MAP_UI_SUPPORT.png') + + +class CampaignBase(CampaignBase_): + use_support_fleet = True + + def fleet_preparation(self): + if self.appear(FLEET_SUPPORT_EMPTY, offset=(5, 5)): + self.use_support_fleet = False + logger.attr("use_support_fleet", self.use_support_fleet) + super().fleet_preparation() + + def _map_swipe(self, vector, box=(239, 159, 1175, 628)): + # Left border to 239, avoid swiping on support fleet + return super()._map_swipe(vector, box=box) + + def map_data_init(self, map_): + super().map_data_init(map_) + if self.use_support_fleet: + # Patch ui_mask, get rid of supporting fleet + _ = ASSETS.ui_mask + ASSETS.ui_mask = MASK_MAP_UI_SUPPORT.image diff --git a/module/handler/assets.py b/module/handler/assets.py index 63b8de7d1..28e46968d 100644 --- a/module/handler/assets.py +++ b/module/handler/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. +AIR_STRIKE_CANCEL = Button(area={'cn': (948, 644, 1009, 676), 'en': (948, 644, 1009, 676), 'jp': (948, 644, 1009, 676), 'tw': (948, 644, 1009, 676)}, color={'cn': (194, 124, 117), 'en': (194, 124, 117), 'jp': (194, 124, 117), 'tw': (194, 124, 117)}, button={'cn': (948, 644, 1009, 676), 'en': (948, 644, 1009, 676), 'jp': (948, 644, 1009, 676), 'tw': (948, 644, 1009, 676)}, file={'cn': './assets/cn/handler/AIR_STRIKE_CANCEL.png', 'en': './assets/cn/handler/AIR_STRIKE_CANCEL.png', 'jp': './assets/jp/handler/AIR_STRIKE_CANCEL.png', 'tw': './assets/cn/handler/AIR_STRIKE_CANCEL.png'}) +AIR_STRIKE_CONFIRM = Button(area={'cn': (1161, 644, 1222, 675), 'en': (1161, 644, 1222, 675), 'jp': (1161, 644, 1222, 675), 'tw': (1161, 644, 1222, 675)}, color={'cn': (137, 170, 211), 'en': (137, 170, 211), 'jp': (137, 170, 211), 'tw': (137, 170, 211)}, button={'cn': (1161, 644, 1222, 675), 'en': (1161, 644, 1222, 675), 'jp': (1161, 644, 1222, 675), 'tw': (1161, 644, 1222, 675)}, file={'cn': './assets/cn/handler/AIR_STRIKE_CONFIRM.png', 'en': './assets/cn/handler/AIR_STRIKE_CONFIRM.png', 'jp': './assets/jp/handler/AIR_STRIKE_CONFIRM.png', 'tw': './assets/cn/handler/AIR_STRIKE_CONFIRM.png'}) +AIR_STRIKE_ENTER = Button(area={'cn': (1194, 456, 1249, 530), 'en': (1194, 456, 1249, 530), 'jp': (1194, 456, 1249, 530), 'tw': (1194, 456, 1249, 530)}, color={'cn': (123, 124, 131), 'en': (123, 124, 131), 'jp': (123, 124, 131), 'tw': (123, 124, 131)}, button={'cn': (1194, 456, 1249, 530), 'en': (1194, 456, 1249, 530), 'jp': (1194, 456, 1249, 530), 'tw': (1194, 456, 1249, 530)}, file={'cn': './assets/cn/handler/AIR_STRIKE_ENTER.png', 'en': './assets/cn/handler/AIR_STRIKE_ENTER.png', 'jp': './assets/cn/handler/AIR_STRIKE_ENTER.png', 'tw': './assets/cn/handler/AIR_STRIKE_ENTER.png'}) ANDROID_NO_RESPOND = Button(area={'cn': (341, 433, 391, 472), 'en': (341, 433, 391, 472), 'jp': (341, 433, 391, 472), 'tw': (341, 433, 391, 472)}, color={'cn': (217, 237, 235), 'en': (217, 237, 235), 'jp': (217, 237, 235), 'tw': (217, 237, 235)}, button={'cn': (341, 433, 391, 472), 'en': (341, 433, 391, 472), 'jp': (341, 433, 391, 472), 'tw': (341, 433, 391, 472)}, file={'cn': './assets/cn/handler/ANDROID_NO_RESPOND.png', 'en': './assets/en/handler/ANDROID_NO_RESPOND.png', 'jp': './assets/jp/handler/ANDROID_NO_RESPOND.png', 'tw': './assets/tw/handler/ANDROID_NO_RESPOND.png'}) AUTO_SEARCH_MAP_OPTION_OFF = Button(area={'cn': (1205, 549, 1275, 566), 'en': (1203, 552, 1277, 564), 'jp': (1204, 547, 1276, 568), 'tw': (1205, 546, 1275, 567)}, color={'cn': (196, 169, 169), 'en': (151, 132, 138), 'jp': (179, 153, 156), 'tw': (153, 132, 137)}, button={'cn': (1205, 549, 1275, 566), 'en': (1203, 552, 1277, 564), 'jp': (1204, 547, 1276, 568), 'tw': (1205, 546, 1275, 567)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_MAP_OPTION_OFF.png', 'en': './assets/en/handler/AUTO_SEARCH_MAP_OPTION_OFF.png', 'jp': './assets/jp/handler/AUTO_SEARCH_MAP_OPTION_OFF.png', 'tw': './assets/tw/handler/AUTO_SEARCH_MAP_OPTION_OFF.png'}) AUTO_SEARCH_MAP_OPTION_ON = Button(area={'cn': (1205, 549, 1275, 566), 'en': (1203, 552, 1277, 564), 'jp': (1203, 547, 1276, 568), 'tw': (1204, 546, 1276, 567)}, color={'cn': (149, 176, 193), 'en': (113, 135, 157), 'jp': (132, 158, 177), 'tw': (110, 133, 156)}, button={'cn': (1205, 549, 1275, 566), 'en': (1203, 552, 1277, 564), 'jp': (1203, 547, 1276, 568), 'tw': (1204, 546, 1276, 567)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_MAP_OPTION_ON.png', 'en': './assets/en/handler/AUTO_SEARCH_MAP_OPTION_ON.png', 'jp': './assets/jp/handler/AUTO_SEARCH_MAP_OPTION_ON.png', 'tw': './assets/tw/handler/AUTO_SEARCH_MAP_OPTION_ON.png'}) @@ -62,6 +65,7 @@ LOGIN_RETURN_SIGN = Button(area={'cn': (1, 7, 104, 47), 'en': (1, 7, 118, 39), ' MAINTENANCE_ANNOUNCE = Button(area={'cn': (923, 141, 990, 186), 'en': (923, 141, 990, 186), 'jp': (923, 141, 990, 186), 'tw': (923, 141, 990, 186)}, color={'cn': (207, 95, 91), 'en': (207, 95, 91), 'jp': (207, 95, 91), 'tw': (207, 95, 91)}, button={'cn': (923, 141, 990, 186), 'en': (923, 141, 990, 186), 'jp': (923, 141, 990, 186), 'tw': (923, 141, 990, 186)}, file={'cn': './assets/cn/handler/MAINTENANCE_ANNOUNCE.png', 'en': './assets/en/handler/MAINTENANCE_ANNOUNCE.png', 'jp': './assets/jp/handler/MAINTENANCE_ANNOUNCE.png', 'tw': './assets/tw/handler/MAINTENANCE_ANNOUNCE.png'}) MANJUU_AREA = Button(area={'cn': (520, 240, 760, 400), 'en': (520, 240, 760, 400), 'jp': (520, 240, 760, 400), 'tw': (520, 240, 760, 400)}, color={'cn': (255, 255, 255), 'en': (255, 255, 255), 'jp': (255, 255, 255), 'tw': (255, 255, 255)}, button={'cn': (520, 240, 760, 400), 'en': (520, 240, 760, 400), 'jp': (520, 240, 760, 400), 'tw': (520, 240, 760, 400)}, file={'cn': './assets/cn/handler/MANJUU_AREA.png', 'en': './assets/cn/handler/MANJUU_AREA.png', 'jp': './assets/cn/handler/MANJUU_AREA.png', 'tw': './assets/cn/handler/MANJUU_AREA.png'}) MAP_AIR_RAID = Button(area={'cn': (350, 447, 1280, 472), 'en': (350, 447, 1280, 472), 'jp': (350, 447, 1280, 472), 'tw': (350, 447, 1280, 472)}, color={'cn': (154, 43, 46), 'en': (154, 43, 46), 'jp': (154, 43, 46), 'tw': (154, 43, 46)}, button={'cn': (350, 447, 1280, 472), 'en': (350, 447, 1280, 472), 'jp': (350, 447, 1280, 472), 'tw': (350, 447, 1280, 472)}, file={'cn': './assets/cn/handler/MAP_AIR_RAID.png', 'en': './assets/en/handler/MAP_AIR_RAID.png', 'jp': './assets/jp/handler/MAP_AIR_RAID.png', 'tw': './assets/tw/handler/MAP_AIR_RAID.png'}) +MAP_AIR_STRIKE = Button(area={'cn': (0, 0, 1280, 720), 'en': (0, 0, 1280, 720), 'jp': (0, 0, 1280, 720), 'tw': (0, 0, 1280, 720)}, color={'cn': (20, 17, 17), 'en': (20, 17, 17), 'jp': (20, 17, 17), 'tw': (20, 17, 17)}, button={'cn': (0, 0, 1280, 720), 'en': (0, 0, 1280, 720), 'jp': (0, 0, 1280, 720), 'tw': (0, 0, 1280, 720)}, file={'cn': './assets/cn/handler/MAP_AIR_STRIKE.png', 'en': './assets/en/handler/MAP_AIR_STRIKE.png', 'jp': './assets/jp/handler/MAP_AIR_STRIKE.png', 'tw': './assets/tw/handler/MAP_AIR_STRIKE.png'}) MAP_AMBUSH = Button(area={'cn': (261, 433, 1280, 449), 'en': (261, 433, 1280, 449), 'jp': (261, 433, 1280, 449), 'tw': (261, 433, 1280, 449)}, color={'cn': (161, 41, 43), 'en': (161, 41, 43), 'jp': (161, 41, 43), 'tw': (161, 41, 43)}, button={'cn': (261, 433, 1280, 449), 'en': (261, 433, 1280, 449), 'jp': (261, 433, 1280, 449), 'tw': (261, 433, 1280, 449)}, file={'cn': './assets/cn/handler/MAP_AMBUSH.png', 'en': './assets/en/handler/MAP_AMBUSH.png', 'jp': './assets/jp/handler/MAP_AMBUSH.png', 'tw': './assets/tw/handler/MAP_AMBUSH.png'}) MAP_AMBUSH_ATTACK = Button(area={'cn': (804, 457, 876, 488), 'en': (791, 463, 888, 485), 'jp': (804, 457, 876, 488), 'tw': (804, 455, 876, 486)}, color={'cn': (139, 168, 210), 'en': (164, 187, 221), 'jp': (150, 175, 212), 'tw': (149, 175, 213)}, button={'cn': (755, 446, 925, 501), 'en': (753, 443, 927, 503), 'jp': (757, 447, 925, 501), 'tw': (762, 443, 927, 499)}, file={'cn': './assets/cn/handler/MAP_AMBUSH_ATTACK.png', 'en': './assets/en/handler/MAP_AMBUSH_ATTACK.png', 'jp': './assets/jp/handler/MAP_AMBUSH_ATTACK.png', 'tw': './assets/tw/handler/MAP_AMBUSH_ATTACK.png'}) MAP_AMBUSH_EVADE = Button(area={'cn': (1029, 457, 1101, 487), 'en': (1021, 459, 1110, 483), 'jp': (1031, 458, 1101, 487), 'tw': (1071, 457, 1101, 487)}, color={'cn': (199, 195, 196), 'en': (200, 197, 198), 'jp': (239, 194, 138), 'tw': (247, 209, 164)}, button={'cn': (979, 444, 1152, 502), 'en': (978, 443, 1153, 503), 'jp': (979, 444, 1151, 502), 'tw': (979, 444, 1152, 502)}, file={'cn': './assets/cn/handler/MAP_AMBUSH_EVADE.png', 'en': './assets/en/handler/MAP_AMBUSH_EVADE.png', 'jp': './assets/jp/handler/MAP_AMBUSH_EVADE.png', 'tw': './assets/tw/handler/MAP_AMBUSH_EVADE.png'}) diff --git a/module/handler/fast_forward.py b/module/handler/fast_forward.py index dd9de15f3..a7b86ea8d 100644 --- a/module/handler/fast_forward.py +++ b/module/handler/fast_forward.py @@ -122,6 +122,7 @@ class FastForwardHandler(AutoSearchHandler): > 13-1 > 13-2 > 13-3 > 13-4 > 14-1 > 14-2 > 14-3 > 14-4 > 15-1 > 15-2 > 15-3 > 15-4 + > 16-1 > 16-2 > 16-3 > 16-4 """, 'A1 > A2 > A3', 'B1 > B2 > B3', @@ -543,6 +544,12 @@ class FastForwardHandler(AutoSearchHandler): return False + def handle_submarine_support_popup(self): + """ + Should be rewritten in W16 submarine base class + """ + return False + def handle_map_walk_speedup(self, skip_first_screenshot=True): """ Turn on walk speedup, no reason to turn it off diff --git a/module/handler/strategy.py b/module/handler/strategy.py index 4cf9a4956..e4f1c37ee 100644 --- a/module/handler/strategy.py +++ b/module/handler/strategy.py @@ -21,6 +21,7 @@ SUBMARINE_VIEW.add_state('on', check_button=SUBMARINE_VIEW_ON) SUBMARINE_VIEW.add_state('off', check_button=SUBMARINE_VIEW_OFF) MOB_MOVE_OFFSET = (120, 200) +AIR_STRIKE_OFFSET = (120, 200) class StrategyHandler(InfoHandler): @@ -259,3 +260,43 @@ class StrategyHandler(InfoHandler): if self.appear_then_click(MOB_MOVE_CANCEL, offset=(20, 20), interval=5): continue + + def is_in_strategy_air_strike(self): + return self.appear(AIR_STRIKE_CONFIRM, offset=(20, 20)) + + def strategy_has_air_strike(self): + """ + Pages: + in: STRATEGY_OPENED + out: STRATEGY_OPENED + """ + if self.match_template_color(AIR_STRIKE_ENTER, offset=(150, 200)): + return True + else: + return False + + def strategy_air_strike_enter(self, skip_first_screenshot=True): + """ + Pages: + in: STRATEGY_OPENED, AIR_STRIKE_ENTER + out: AIR_STRIKE_CONFIRM + """ + logger.info('Air strike enter') + for _ in self.loop(skip_first=skip_first_screenshot): + if self.appear(AIR_STRIKE_CONFIRM, offset=(20, 20)): + break + if self.appear_then_click(AIR_STRIKE_ENTER, offset=(150, 200), interval=5): + continue + + def strategy_air_strike_cancel(self, skip_first_screenshot=True): + """ + Pages: + in: AIR_STRIKE_CONFIRM + out: STRATEGY_OPENED, AIR_STRIKE_ENTER + """ + logger.info('Air strike cancel') + for _ in self.loop(skip_first=skip_first_screenshot): + if self.appear(AIR_STRIKE_ENTER, offset=(150, 200)): + break + if self.appear_then_click(AIR_STRIKE_CANCEL, offset=(20, 20), interval=5): + continue diff --git a/module/map/assets.py b/module/map/assets.py index 2b2713fdf..5263daa87 100644 --- a/module/map/assets.py +++ b/module/map/assets.py @@ -21,6 +21,7 @@ FLEET_NUM_1 = Button(area={'cn': (213, 76, 224, 101), 'en': (213, 76, 224, 101), FLEET_NUM_2 = Button(area={'cn': (212, 75, 226, 101), 'en': (212, 75, 226, 101), 'jp': (212, 75, 226, 101), 'tw': (212, 75, 226, 101)}, color={'cn': (52, 150, 194), 'en': (52, 150, 194), 'jp': (52, 150, 194), 'tw': (52, 150, 194)}, button={'cn': (212, 75, 226, 101), 'en': (212, 75, 226, 101), 'jp': (212, 75, 226, 101), 'tw': (212, 75, 226, 101)}, file={'cn': './assets/cn/map/FLEET_NUM_2.png', 'en': './assets/en/map/FLEET_NUM_2.png', 'jp': './assets/jp/map/FLEET_NUM_2.png', 'tw': './assets/tw/map/FLEET_NUM_2.png'}) FLEET_PREPARATION = Button(area={'cn': (1013, 558, 1141, 588), 'en': (1048, 569, 1086, 595), 'jp': (1046, 558, 1107, 587), 'tw': (1014, 557, 1142, 588)}, color={'cn': (242, 211, 160), 'en': (241, 201, 148), 'jp': (241, 205, 151), 'tw': (242, 208, 157)}, button={'cn': (980, 549, 1181, 612), 'en': (988, 556, 1145, 606), 'jp': (983, 549, 1185, 612), 'tw': (980, 548, 1180, 612)}, file={'cn': './assets/cn/map/FLEET_PREPARATION.png', 'en': './assets/en/map/FLEET_PREPARATION.png', 'jp': './assets/jp/map/FLEET_PREPARATION.png', 'tw': './assets/tw/map/FLEET_PREPARATION.png'}) FLEET_PREPARATION_CHECK = Button(area={'cn': (1146, 107, 1174, 136), 'en': (1129, 111, 1158, 140), 'jp': (1146, 107, 1174, 136), 'tw': (1145, 106, 1175, 136)}, color={'cn': (180, 98, 111), 'en': (189, 105, 109), 'jp': (180, 98, 111), 'tw': (180, 90, 92)}, button={'cn': (1146, 107, 1174, 136), 'en': (1129, 111, 1158, 140), 'jp': (1146, 107, 1174, 136), 'tw': (1145, 106, 1175, 136)}, file={'cn': './assets/cn/map/FLEET_PREPARATION_CHECK.png', 'en': './assets/en/map/FLEET_PREPARATION_CHECK.png', 'jp': './assets/jp/map/FLEET_PREPARATION_CHECK.png', 'tw': './assets/tw/map/FLEET_PREPARATION_CHECK.png'}) +FLEET_SUPPORT_EMPTY = Button(area={'cn': (454, 470, 538, 540), 'en': (454, 470, 538, 540), 'jp': (454, 470, 538, 540), 'tw': (454, 470, 538, 540)}, color={'cn': (47, 54, 77), 'en': (47, 54, 77), 'jp': (47, 54, 77), 'tw': (47, 54, 77)}, button={'cn': (454, 470, 538, 540), 'en': (454, 470, 538, 540), 'jp': (454, 470, 538, 540), 'tw': (454, 470, 538, 540)}, file={'cn': './assets/cn/map/FLEET_SUPPORT_EMPTY.png', 'en': './assets/cn/map/FLEET_SUPPORT_EMPTY.png', 'jp': './assets/cn/map/FLEET_SUPPORT_EMPTY.png', 'tw': './assets/cn/map/FLEET_SUPPORT_EMPTY.png'}) MAP_CAT_ATTACK = Button(area={'cn': (1237, 103, 1252, 153), 'en': (1237, 103, 1252, 153), 'jp': (1237, 103, 1252, 153), 'tw': (1237, 103, 1252, 153)}, color={'cn': (43, 45, 52), 'en': (43, 45, 52), 'jp': (43, 45, 52), 'tw': (43, 45, 52)}, button={'cn': (1148, 653, 1262, 705), 'en': (1147, 651, 1263, 701), 'jp': (1149, 653, 1261, 704), 'tw': (1148, 653, 1262, 705)}, file={'cn': './assets/cn/map/MAP_CAT_ATTACK.png', 'en': './assets/en/map/MAP_CAT_ATTACK.png', 'jp': './assets/jp/map/MAP_CAT_ATTACK.png', 'tw': './assets/tw/map/MAP_CAT_ATTACK.png'}) MAP_CAT_ATTACK_MIRROR = Button(area={'cn': (147, 145, 187, 157), 'en': (147, 145, 187, 157), 'jp': (147, 145, 187, 157), 'tw': (147, 145, 187, 157)}, color={'cn': (214, 191, 99), 'en': (214, 191, 99), 'jp': (214, 191, 99), 'tw': (214, 191, 99)}, button={'cn': (147, 145, 187, 157), 'en': (147, 145, 187, 157), 'jp': (147, 145, 187, 157), 'tw': (147, 145, 187, 157)}, file={'cn': './assets/cn/map/MAP_CAT_ATTACK_MIRROR.png', 'en': './assets/en/map/MAP_CAT_ATTACK_MIRROR.png', 'jp': './assets/jp/map/MAP_CAT_ATTACK_MIRROR.png', 'tw': './assets/tw/map/MAP_CAT_ATTACK_MIRROR.png'}) MAP_MODE_SWITCH_HARD = Button(area={'cn': (341, 580, 374, 617), 'en': (341, 580, 374, 617), 'jp': (341, 580, 374, 617), 'tw': (341, 580, 374, 617)}, color={'cn': (234, 179, 179), 'en': (234, 179, 179), 'jp': (234, 179, 179), 'tw': (234, 179, 179)}, button={'cn': (341, 580, 374, 617), 'en': (341, 580, 374, 617), 'jp': (341, 580, 374, 617), 'tw': (341, 580, 374, 617)}, file={'cn': './assets/cn/map/MAP_MODE_SWITCH_HARD.png', 'en': './assets/cn/map/MAP_MODE_SWITCH_HARD.png', 'jp': './assets/cn/map/MAP_MODE_SWITCH_HARD.png', 'tw': './assets/cn/map/MAP_MODE_SWITCH_HARD.png'}) diff --git a/module/map/camera.py b/module/map/camera.py index 280a71712..9fa9cba26 100644 --- a/module/map/camera.py +++ b/module/map/camera.py @@ -114,7 +114,8 @@ class Camera(MapOperation): try: if not self.is_in_map() \ and not self.is_in_strategy_submarine_move() \ - and not self.is_in_strategy_mob_move(): + and not self.is_in_strategy_mob_move() \ + and not self.is_in_strategy_air_strike(): logger.warning('Image to detect is not in_map') raise MapDetectionError('Image to detect is not in_map') self.view.load(self.device.image) diff --git a/module/map/map_operation.py b/module/map/map_operation.py index 4e2b79177..af5fa9695 100644 --- a/module/map/map_operation.py +++ b/module/map/map_operation.py @@ -199,6 +199,10 @@ class MapOperation(MysteryHandler, FleetPreparation, Retirement, FastForwardHand if self.handle_use_data_key(): continue + # 16-1/16-2 submarine support popup + if self.handle_submarine_support_popup(): + continue + # Emotion if self.handle_combat_low_emotion(): continue diff --git a/module/map_detection/grid_predictor.py b/module/map_detection/grid_predictor.py index b58034a02..64884b26d 100644 --- a/module/map_detection/grid_predictor.py +++ b/module/map_detection/grid_predictor.py @@ -314,6 +314,13 @@ class GridPredictor: image = rgb2gray(self.relative_crop(area=(-0.5, -0.5, 0.5, 0.5), shape=(60, 60))) return TEMPLATE_MOB_MOVE_ICON.match(image) + def predict_air_strike_icon(self): + # area = area_pad((0, 0, 140, 140), pad=5) + # image = color_similarity_2d(crop(self.image_trans, area=area, copy=False), color=(255, 255, 160)) + image = color_similarity_2d(self.image_trans, color=(255, 255, 160)) + cv2.threshold(image, 175, 255, cv2.THRESH_BINARY, dst=image) + return TEMPLATE_AIR_STRIKE_ICON.match(image, similarity=0.7) + @cached_property def _image_similar_piece(self): return rgb2gray(self.relative_crop(area=(-0.5, -0.5, 0.5, 0.5), shape=(60, 60))) diff --git a/module/template/assets.py b/module/template/assets.py index 3973aded9..6d10181b6 100644 --- a/module/template/assets.py +++ b/module/template/assets.py @@ -4,6 +4,7 @@ from module.base.template import Template # This file was automatically generated by dev_tools/button_extract.py. # Don't modify it manually. +TEMPLATE_AIR_STRIKE_ICON = Template(file={'cn': './assets/cn/template/TEMPLATE_AIR_STRIKE_ICON.png', 'en': './assets/en/template/TEMPLATE_AIR_STRIKE_ICON.png', 'jp': './assets/jp/template/TEMPLATE_AIR_STRIKE_ICON.png', 'tw': './assets/tw/template/TEMPLATE_AIR_STRIKE_ICON.png'}) TEMPLATE_AMBUSH_EVADE_FAILED = Template(file={'cn': './assets/cn/template/TEMPLATE_AMBUSH_EVADE_FAILED.png', 'en': './assets/en/template/TEMPLATE_AMBUSH_EVADE_FAILED.png', 'jp': './assets/jp/template/TEMPLATE_AMBUSH_EVADE_FAILED.png', 'tw': './assets/tw/template/TEMPLATE_AMBUSH_EVADE_FAILED.png'}) TEMPLATE_AMBUSH_EVADE_SUCCESS = Template(file={'cn': './assets/cn/template/TEMPLATE_AMBUSH_EVADE_SUCCESS.png', 'en': './assets/en/template/TEMPLATE_AMBUSH_EVADE_SUCCESS.png', 'jp': './assets/jp/template/TEMPLATE_AMBUSH_EVADE_SUCCESS.png', 'tw': './assets/tw/template/TEMPLATE_AMBUSH_EVADE_SUCCESS.png'}) TEMPLATE_CAUGHT_BY_SIREN = Template(file={'cn': './assets/cn/template/TEMPLATE_CAUGHT_BY_SIREN.png', 'en': './assets/en/template/TEMPLATE_CAUGHT_BY_SIREN.png', 'jp': './assets/jp/template/TEMPLATE_CAUGHT_BY_SIREN.png', 'tw': './assets/tw/template/TEMPLATE_CAUGHT_BY_SIREN.png'}) From d8bba0331f8ebd8040f3f3e2c7f31db82d170928 Mon Sep 17 00:00:00 2001 From: guoh064 <50830808+guoh064@users.noreply.github.com> Date: Fri, 23 Jan 2026 16:12:50 +0800 Subject: [PATCH 2/5] Upd: [CN] asset AIR_STRIKE_* --- assets/cn/handler/AIR_STRIKE_CANCEL.png | Bin 9602 -> 10756 bytes assets/cn/handler/AIR_STRIKE_CONFIRM.png | Bin 11043 -> 10626 bytes module/handler/assets.py | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/cn/handler/AIR_STRIKE_CANCEL.png b/assets/cn/handler/AIR_STRIKE_CANCEL.png index b8282cb6610853d8f1bc8b1bf7685eba621cd34e..19a18eb6029ce1d9719936acf168c36ba8df7561 100644 GIT binary patch delta 4900 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 delta 5188 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

847w^#I}kZDN$0yM~j5`$?tFH9Q zIIgXgdaaERpI^8BZM-;iuig&W%(CB}OE*dneAj(3$qoP(8pr2{?#|E<|$Q?s%|#8AgC66x)r? zH$uc{AsTd^J}$Zg)~|n)rk$gqdPIt|(#)4f)Aw>1&DM(U!b40h+~d_ob`HHBKKh9l z6t11)E=XDf&(rOwS6fRynHdvohpN6ZYk^8;(2Q%gt}(QERdNhsC&XvSd$$?G+m)v; zVRRcQMW7Ii4prg2zA2!W3Z~PcjroRN1y-jd)~tfzKP^I!LPOqEURJlfaJE^I4hnYwDv^iwD~EDM nb!SE;6T85 Date: Thu, 19 Mar 2026 15:11:02 +0800 Subject: [PATCH 3/5] Upd: campaign_16_main clear mode --- campaign/campaign_main/campaign_16_3.py | 12 +++++-- campaign/campaign_main/campaign_16_4.py | 42 ++++++++++++++--------- dev_tools/map_extractor.py | 44 ++++++++++++++++++++----- 3 files changed, 72 insertions(+), 26 deletions(-) diff --git a/campaign/campaign_main/campaign_16_3.py b/campaign/campaign_main/campaign_16_3.py index efa371a1c..88f9f383d 100644 --- a/campaign/campaign_main/campaign_16_3.py +++ b/campaign/campaign_main/campaign_16_3.py @@ -32,6 +32,14 @@ MAP.spawn_data = [ {'battle': 2, 'enemy': 3}, {'battle': 3, 'boss': 1}, ] +MAP.spawn_data_loop = [ + {'battle': 0, 'enemy': 3}, + {'battle': 1, 'enemy': 6}, + {'battle': 2, 'enemy': 3}, + {'battle': 3}, + {'battle': 4}, + {'battle': 5, 'boss': 1}, +] A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, \ A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, \ A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, \ @@ -57,7 +65,7 @@ class Campaign(CampaignBase): return True def battle_1(self): - if self.use_support_fleet: + if self.use_support_fleet and not self.map_is_clear_mode: self.air_strike(E3) self.clear_chosen_enemy(D3) return True @@ -76,7 +84,7 @@ class Campaign(CampaignBase): if boss: if not self.check_accessibility(boss[0], fleet='boss'): return self.clear_roadblocks([road_main]) - if self.use_support_fleet: + if self.use_support_fleet and not self.map_is_clear_mode: # at this stage the most right zone should be accessible self.goto(K5) self.air_strike(J6) diff --git a/campaign/campaign_main/campaign_16_4.py b/campaign/campaign_main/campaign_16_4.py index b7e9bddec..a4c026071 100644 --- a/campaign/campaign_main/campaign_16_4.py +++ b/campaign/campaign_main/campaign_16_4.py @@ -15,24 +15,24 @@ MAP.map_data = """ ME ++ ++ ++ -- -- ME ++ -- -- -- -- -- ME -- -- ++ ++ ME -- -- -- -- -- -- ME ++ -- ME -- ++ ++ -- - -- -- ME -- -- ME ++ -- ME ++ -- + -- -- -- ME -- ME ++ -- ME ++ -- -- __ -- ++ ++ -- ++ ME ME -- -- - SP -- -- ME -- -- ME ++ -- ++ ++ + SP -- -- ME -- -- -- ++ -- ++ ++ SP -- -- -- ++ -- ++ ++ -- -- ++ """ MAP.weight_data = """ 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 40 50 50 50 - 50 50 50 40 50 40 40 40 50 50 50 - 50 50 50 40 40 40 50 50 50 50 50 + 50 50 50 50 50 40 40 40 50 50 50 + 50 50 50 50 50 40 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 """ MAP.spawn_data = [ {'battle': 0, 'enemy': 5}, - {'battle': 1, 'enemy': 4}, + {'battle': 1, 'enemy': 3}, {'battle': 2, 'enemy': 5}, {'battle': 3}, {'battle': 4, 'boss': 1}, @@ -47,7 +47,7 @@ A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, K7, \ A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, K8, \ = MAP.flatten() -road_main = RoadGrids([D4, F5, G4, H3]) +road_main = RoadGrids([D5, F5, G4, H3]) class Config(ConfigBase): MAP_HAS_MAP_STORY = False @@ -59,17 +59,27 @@ class Campaign(CampaignBase): MAP = MAP def battle_0(self): - self.clear_chosen_enemy(D4) - return True - - def battle_1(self): - if self.use_support_fleet: - self.goto(D1) - self.air_strike(B1) - self.clear_chosen_enemy(F5) - return True + if self.clear_roadblocks([road_main]): + return True + if self.clear_potential_roadblocks([road_main]): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + return self.battle_default() def battle_2(self): + if self.use_support_fleet and not self.map_is_clear_mode: + self.goto(B3) + self.air_strike(B1) + if self.clear_roadblocks([road_main]): + return True + if self.clear_potential_roadblocks([road_main]): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + return self.battle_default() + + def battle_3(self): if self.clear_roadblocks([road_main]): return True if self.clear_potential_roadblocks([road_main]): @@ -83,7 +93,7 @@ class Campaign(CampaignBase): if boss: if not self.check_accessibility(boss[0], fleet='boss'): return self.clear_roadblocks([road_main]) - if self.use_support_fleet: + if self.use_support_fleet and not self.map_is_clear_mode: # at this stage the most right zone should be accessible self.goto(J6) self.air_strike(I8) diff --git a/dev_tools/map_extractor.py b/dev_tools/map_extractor.py index b61bbf6cd..3d7166b2f 100644 --- a/dev_tools/map_extractor.py +++ b/dev_tools/map_extractor.py @@ -343,9 +343,18 @@ class MapData: self.map_id = data['id'] try: - self.spawn_data = self.parse_spawn_data(data) + self.event_enemy_data = None + self.event_enemy_data_loop = None + if self.map_id in MAP_EVENT_LIST: + self.event_enemy_data = self.extract_event_enemy_data(MAP_EVENT_LIST[self.map_id]['event_list']) + if data_loop is not None: + self.event_enemy_data_loop = self.extract_event_enemy_data(MAP_EVENT_LIST[self.map_id]['event_list_loop']) + else: + self.event_enemy_data_loop = None + + self.spawn_data = self.parse_spawn_data(data, self.event_enemy_data) if data_loop is not None: - self.spawn_data_loop = self.parse_spawn_data(data_loop) + self.spawn_data_loop = self.parse_spawn_data(data_loop, self.event_enemy_data_loop) if len(self.spawn_data) == len(self.spawn_data_loop) \ and all([s1 == s2 for s1, s2 in zip(self.spawn_data, self.spawn_data_loop)]): self.spawn_data_loop = None @@ -354,10 +363,10 @@ class MapData: # map_data # {0: {0: 6, 1: 8, 2: False, 3: 0}, ...} - self.map_data = self.parse_map_data(data['grids']) + self.map_data = self.parse_map_data(data['grids'], self.event_enemy_data) self.shape = tuple(np.max(list(self.map_data.keys()), axis=0)) if self.data_loop is not None: - self.map_data_loop = self.parse_map_data(data_loop['grids']) + self.map_data_loop = self.parse_map_data(data_loop['grids'], self.event_enemy_data_loop) if all([d1 == d2 for d1, d2 in zip(self.map_data.values(), self.map_data_loop.values())]): self.map_data_loop = None else: @@ -422,7 +431,7 @@ class MapData: __repr__ = __str__ - def parse_map_data(self, grids): + def parse_map_data(self, grids, event_enemy_data=None): map_data = {} offset_y = min([grid[0] for grid in grids.values()]) offset_x = min([grid[1] for grid in grids.values()]) @@ -435,11 +444,16 @@ class MapData: if info == '??': print(f'Unknown grid info. grid={location2node(loca)}, info={grid[3]}') map_data[loca] = info + if isinstance(event_enemy_data, list): + for wave in event_enemy_data: + for enemy in wave.values(): + loca = (enemy[1][1] - offset_x, enemy[1][0] - offset_y) + map_data[loca] = 'ME' return map_data @staticmethod - def parse_spawn_data(data): + def parse_spawn_data(data, event_enemy_data=None): try: battle_count = max(data['boss_refresh'], max(data['enemy_refresh'].keys())) except ValueError: @@ -450,6 +464,11 @@ class MapData: if count: spawn = spawn_data[index] spawn['enemy'] = spawn.get('enemy', 0) + count + if isinstance(event_enemy_data, list): + for index, wave in enumerate(event_enemy_data): + if len(wave): + spawn = spawn_data[index] + spawn['enemy'] = spawn.get('enemy', 0) + len(wave) if ''.join([str(item) for item in data['elite_refresh'].values()]) != '100': # Some data is incorrect for index, count in data['elite_refresh'].items(): if count: @@ -470,6 +489,15 @@ class MapData: return spawn_data + def extract_event_enemy_data(self, data): + extracted_data = [] + for event_id in data.values(): + event = MAP_EVENT_TEMPLATE[event_id] + for effect in event['effect'].values(): + if effect[0] == 'enemy': + extracted_data.append(effect[1]) + return extracted_data + def map_file_name(self): name = self.chapter_name.replace('-', '_').lower() if name[0].isdigit(): @@ -751,8 +779,8 @@ ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' LOADER = LuaLoader(FILE, server='CN') DATA = LOADER.load('./sharecfgdata/chapter_template.lua') DATA_LOOP = LOADER.load('./sharecfgdata/chapter_template_loop.lua') -# MAP_EVENT_LIST = LOADER.load('./sharecfg/map_event_list.lua') -# MAP_EVENT_TEMPLATE = LOADER.load('./sharecfg/map_event_template.lua') +MAP_EVENT_LIST = LOADER.load('./sharecfg/map_event_list.lua') +MAP_EVENT_TEMPLATE = LOADER.load('./sharecfg/map_event_template.lua') EXPECTATION_DATA = LOADER.load('./sharecfgdata/expedition_data_template.lua') ct = ChapterTemplate() From d7d69e95ef71719b532aa16bafbb06c3e70f0940 Mon Sep 17 00:00:00 2001 From: guoh064 <50830808+guoh064@users.noreply.github.com> Date: Mon, 23 Mar 2026 11:21:23 +0800 Subject: [PATCH 4/5] Opt: campaign_16_main clear mode battle function using mob move --- campaign/campaign_main/campaign_15_base.py | 1 + campaign/campaign_main/campaign_16_3.py | 43 +++++---- campaign/campaign_main/campaign_16_4.py | 92 ++++++++++++++----- .../campaign_16_base_aircraft.py | 2 +- 4 files changed, 95 insertions(+), 43 deletions(-) diff --git a/campaign/campaign_main/campaign_15_base.py b/campaign/campaign_main/campaign_15_base.py index da6808fd8..24c9928e9 100644 --- a/campaign/campaign_main/campaign_15_base.py +++ b/campaign/campaign_main/campaign_15_base.py @@ -205,3 +205,4 @@ class CampaignBase(CampaignBase_): self._mob_move_info_change(location, target) self.find_path_initial() self.map.show() + return True diff --git a/campaign/campaign_main/campaign_16_3.py b/campaign/campaign_main/campaign_16_3.py index 88f9f383d..a63e9682a 100644 --- a/campaign/campaign_main/campaign_16_3.py +++ b/campaign/campaign_main/campaign_16_3.py @@ -21,8 +21,8 @@ MAP.map_data = """ MAP.weight_data = """ 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 - 50 50 40 40 40 40 50 50 50 50 50 - 50 50 50 50 50 40 40 40 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 """ @@ -48,7 +48,7 @@ A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, \ A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, \ = MAP.flatten() -road_main = RoadGrids([C3, D3, F3, G4, H4]) +road_main = RoadGrids([G4, H4]) class Config(ConfigBase): @@ -59,25 +59,36 @@ class Config(ConfigBase): class Campaign(CampaignBase): MAP = MAP + use_single_fleet = False + + def map_init(self, map_): + super().map_init(map_) + self.map_has_mob_move = self.use_support_fleet and self.map_is_clear_mode + self.use_single_fleet = 'standby' in self.config.Fleet_FleetOrder def battle_0(self): - self.clear_chosen_enemy(C3) - return True + if self.map_has_mob_move: + if self.mob_move(C3, C2): + return self.clear_chosen_enemy(D6) + self.map_has_mob_move = False + + return self.clear_chosen_enemy(C3) def battle_1(self): + if self.map_has_mob_move: + self.mob_move(E6, E5) + if not self.use_single_fleet: + self.fleet_boss.goto(F4) + self.fleet_ensure(index=3 - self.fleet_boss_index) + return self.clear_chosen_enemy(G4) + if self.use_support_fleet and not self.map_is_clear_mode: + self.goto(C3) self.air_strike(E3) - self.clear_chosen_enemy(D3) - return True + return self.clear_chosen_enemy(D3) def battle_2(self): - if self.clear_roadblocks([road_main]): - return True - if self.clear_potential_roadblocks([road_main]): - return True - if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): - return True - return self.battle_default() + return self.clear_chosen_enemy(F3) def battle_3(self): boss = self.map.select(is_boss=True) @@ -91,8 +102,6 @@ class Campaign(CampaignBase): return self.fleet_boss.clear_boss() if self.clear_roadblocks([road_main]): return True - if self.clear_potential_roadblocks([road_main]): - return True - if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + if self.clear_any_enemy(genre=("Light",), strongest=True): return True return self.battle_default() \ No newline at end of file diff --git a/campaign/campaign_main/campaign_16_4.py b/campaign/campaign_main/campaign_16_4.py index a4c026071..6ff0d52ad 100644 --- a/campaign/campaign_main/campaign_16_4.py +++ b/campaign/campaign_main/campaign_16_4.py @@ -23,9 +23,9 @@ MAP.map_data = """ MAP.weight_data = """ 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 - 50 50 50 50 50 50 50 40 50 50 50 - 50 50 50 50 50 40 40 40 50 50 50 - 50 50 50 50 50 40 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 @@ -57,51 +57,93 @@ class Config(ConfigBase): class Campaign(CampaignBase): MAP = MAP + F5_is_moved = False + use_single_fleet = False + + def map_init(self, map_): + super().map_init(map_) + self.F5_is_moved = False + self.map_has_mob_move = self.use_support_fleet and self.map_is_clear_mode + self.use_single_fleet = 'standby' in self.config.Fleet_FleetOrder def battle_0(self): - if self.clear_roadblocks([road_main]): - return True - if self.clear_potential_roadblocks([road_main]): - return True - if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): - return True - return self.battle_default() + if self.map_has_mob_move and not self.use_single_fleet: + if self.mob_move(D7, D8): + self.fleet_boss.goto(J1) + self.fleet_ensure(index=3 - self.fleet_boss_index) + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + return self.battle_default() + + self.map_has_mob_move = False + + return self.clear_chosen_enemy(D5) + + def battle_1(self): + if not self.map_has_mob_move: + return self.clear_chosen_enemy(F5) + + if not self.use_single_fleet: + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + return self.battle_default() + + grids = SelectedGrids([H6, I5]) + grid = grids.delete(grids.select(enemy_genre='Main')).first_or_none() + if grid is not None and self.mob_move(F5, F6): + self.F5_is_moved = True + return self.clear_chosen_enemy(grid) + + self.F5_is_moved = False + return self.clear_chosen_enemy(F5) def battle_2(self): - if self.use_support_fleet and not self.map_is_clear_mode: - self.goto(B3) - self.air_strike(B1) - if self.clear_roadblocks([road_main]): - return True - if self.clear_potential_roadblocks([road_main]): - return True + if not self.map_has_mob_move or self.use_single_fleet: + return self.clear_chosen_enemy(G4) + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): return True return self.battle_default() def battle_3(self): - if self.clear_roadblocks([road_main]): - return True - if self.clear_potential_roadblocks([road_main]): - return True - if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): - return True - return self.battle_default() + if not self.map_has_mob_move: + return self.clear_chosen_enemy(H3) + + if not self.use_single_fleet: + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + return self.battle_default() + + if self.F5_is_moved: + if I6.enemy_genre == "Main" and self.mob_move(I6, I7): + return self.clear_any_enemy(genre=("Light",), strongest=True) + return self.clear_chosen_enemy(I6) + + self.mob_move(H3, I3) + self.mob_move(I3, I2) + return self.clear_any_enemy(genre=("Light",), strongest=True) def battle_4(self): + if self.map_is_clear_mode: + return self.fleet_boss.clear_boss() + boss = self.map.select(is_boss=True) if boss: if not self.check_accessibility(boss[0], fleet='boss'): return self.clear_roadblocks([road_main]) - if self.use_support_fleet and not self.map_is_clear_mode: + + if self.use_support_fleet: # at this stage the most right zone should be accessible self.goto(J6) self.air_strike(I8) + return self.fleet_boss.clear_boss() + if self.clear_roadblocks([road_main]): return True if self.clear_potential_roadblocks([road_main]): return True if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): return True + return self.battle_default() \ No newline at end of file diff --git a/campaign/campaign_main/campaign_16_base_aircraft.py b/campaign/campaign_main/campaign_16_base_aircraft.py index b780b4b31..d910fd9c6 100644 --- a/campaign/campaign_main/campaign_16_base_aircraft.py +++ b/campaign/campaign_main/campaign_16_base_aircraft.py @@ -6,7 +6,7 @@ from module.handler.strategy import AIR_STRIKE_OFFSET from module.logger import logger from module.map.utils import location_ensure -from .campaign_support_fleet import CampaignBase as CampaignBase_ +from .campaign_15_base import CampaignBase as CampaignBase_ class Config: From e4a6a5728e5d121eaa2ddc6638c090210e4a49a0 Mon Sep 17 00:00:00 2001 From: guoh064 <50830808+guoh064@users.noreply.github.com> Date: Tue, 24 Mar 2026 01:58:48 +0800 Subject: [PATCH 5/5] Opt: campaign_16_main MAP_SWIPE_MULTIPLY --- campaign/campaign_main/campaign_16_1.py | 4 ++++ campaign/campaign_main/campaign_16_2.py | 4 ++++ campaign/campaign_main/campaign_16_3.py | 4 ++++ campaign/campaign_main/campaign_16_4.py | 4 ++++ 4 files changed, 16 insertions(+) diff --git a/campaign/campaign_main/campaign_16_1.py b/campaign/campaign_main/campaign_16_1.py index 525e45eb7..54c119eb4 100644 --- a/campaign/campaign_main/campaign_16_1.py +++ b/campaign/campaign_main/campaign_16_1.py @@ -57,6 +57,10 @@ class Config(ConfigBase): MAP_HAS_FLEET_STEP = False MAP_HAS_AMBUSH = True + MAP_SWIPE_MULTIPLY = (1.050, 1.069) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.015, 1.034) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.985, 1.003) + class Campaign(CampaignBase): MAP = MAP diff --git a/campaign/campaign_main/campaign_16_2.py b/campaign/campaign_main/campaign_16_2.py index 5abe80be3..6ad4fdc44 100644 --- a/campaign/campaign_main/campaign_16_2.py +++ b/campaign/campaign_main/campaign_16_2.py @@ -54,6 +54,10 @@ class Config(ConfigBase): MAP_HAS_FLEET_STEP = False MAP_HAS_AMBUSH = True + MAP_SWIPE_MULTIPLY = (1.093, 1.113) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.057, 1.077) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.026, 1.045) + class Campaign(CampaignBase): MAP = MAP diff --git a/campaign/campaign_main/campaign_16_3.py b/campaign/campaign_main/campaign_16_3.py index a63e9682a..cd4d70fbb 100644 --- a/campaign/campaign_main/campaign_16_3.py +++ b/campaign/campaign_main/campaign_16_3.py @@ -56,6 +56,10 @@ class Config(ConfigBase): MAP_HAS_FLEET_STEP = False MAP_HAS_AMBUSH = True + MAP_SWIPE_MULTIPLY = (1.180, 1.202) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.141, 1.162) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.108, 1.128) + class Campaign(CampaignBase): MAP = MAP diff --git a/campaign/campaign_main/campaign_16_4.py b/campaign/campaign_main/campaign_16_4.py index 6ff0d52ad..cb55d597f 100644 --- a/campaign/campaign_main/campaign_16_4.py +++ b/campaign/campaign_main/campaign_16_4.py @@ -54,6 +54,10 @@ class Config(ConfigBase): MAP_HAS_FLEET_STEP = False MAP_HAS_AMBUSH = True + MAP_SWIPE_MULTIPLY = (1.003, 1.022) + MAP_SWIPE_MULTIPLY_MINITOUCH = (0.970, 0.988) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.942, 0.959) + class Campaign(CampaignBase): MAP = MAP