From 0ca7a52bcd67716e941dd412ee4baf5f94c79830 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] 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: