diff --git a/game/commander/tasks/frontlinestancetask.py b/game/commander/tasks/frontlinestancetask.py index f8c3b8d1..185d8bf3 100644 --- a/game/commander/tasks/frontlinestancetask.py +++ b/game/commander/tasks/frontlinestancetask.py @@ -66,6 +66,8 @@ class FrontLineStanceTask(TheaterCommanderTask, ABC): return False if self.better_stance_already_set(state): return False + if self.friendly_cp.deployable_front_line_units == 0: + return False return self.have_sufficient_front_line_advantage def apply_effects(self, state: TheaterState) -> None: diff --git a/game/commander/tasks/primitive/cas.py b/game/commander/tasks/primitive/cas.py index c2785405..dd4ef312 100644 --- a/game/commander/tasks/primitive/cas.py +++ b/game/commander/tasks/primitive/cas.py @@ -13,6 +13,16 @@ class PlanCas(PackagePlanningTask[FrontLine]): def preconditions_met(self, state: TheaterState) -> bool: if self.target not in state.vulnerable_front_lines: return False + + # Do not bother planning CAS when there are no enemy ground units at the front. + # An exception is made for turn zero since that's not being truly planned, but + # just to determine what missions should be planned on turn 1 (when there *will* + # be ground units) and what aircraft should be ordered. + enemy_cp = self.target.control_point_friendly_to( + player=not state.context.coalition.player + ) + if enemy_cp.deployable_front_line_units == 0 and state.context.turn > 0: + return False return super().preconditions_met(state) def apply_effects(self, state: TheaterState) -> None: diff --git a/game/commander/theaterstate.py b/game/commander/theaterstate.py index 8732206b..7368b40e 100644 --- a/game/commander/theaterstate.py +++ b/game/commander/theaterstate.py @@ -34,6 +34,7 @@ if TYPE_CHECKING: class PersistentContext: coalition: Coalition theater: ConflictTheater + turn: int settings: Settings tracer: MultiEventTracer @@ -139,7 +140,9 @@ class TheaterState(WorldState["TheaterState"]): finder = ObjectiveFinder(game, player) ordered_capturable_points = finder.prioritized_unisolated_points() - context = PersistentContext(coalition, game.theater, game.settings, tracer) + context = PersistentContext( + coalition, game.theater, game.turn, game.settings, tracer + ) # Plan enough rounds of CAP that the target has coverage over the expected # mission duration.