mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
This improves the AI behavior by choosing the stances non-randomly: * Breakthrough will be used if the base is expected to be capturable and the coalition outnumbers the enemy by 20%. * Elimination will be used if the coalition has at least as many units as the enemy. * Defensive will be used if the coalition has at least half as many units as the enemy. * Retreat will be used if the coalition is significantly outnumbers. This also exposes the option to the player.
58 lines
1.9 KiB
Python
58 lines
1.9 KiB
Python
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass
|
|
from typing import TYPE_CHECKING
|
|
|
|
from game.commander.missionproposals import ProposedMission, ProposedFlight
|
|
from game.commander.tasks.theatercommandertask import TheaterCommanderTask
|
|
from game.commander.theaterstate import TheaterState
|
|
from game.profiling import MultiEventTracer
|
|
from game.theater import ControlPoint
|
|
from gen.flights.flight import FlightType
|
|
|
|
if TYPE_CHECKING:
|
|
from gen.flights.ai_flight_planner import CoalitionMissionPlanner
|
|
|
|
|
|
@dataclass
|
|
class PlanBarcap(TheaterCommanderTask):
|
|
target: ControlPoint
|
|
|
|
def preconditions_met(self, state: TheaterState) -> bool:
|
|
if state.player and not state.ato_automation_enabled:
|
|
return False
|
|
return self.target in state.vulnerable_control_points
|
|
|
|
def apply_effects(self, state: TheaterState) -> None:
|
|
state.vulnerable_control_points.remove(self.target)
|
|
|
|
def execute(
|
|
self, mission_planner: CoalitionMissionPlanner, tracer: MultiEventTracer
|
|
) -> None:
|
|
# Plan enough rounds of CAP that the target has coverage over the expected
|
|
# mission duration.
|
|
mission_duration = int(
|
|
mission_planner.game.settings.desired_player_mission_duration.total_seconds()
|
|
)
|
|
barcap_duration = int(
|
|
mission_planner.faction.doctrine.cap_duration.total_seconds()
|
|
)
|
|
for _ in range(
|
|
0,
|
|
mission_duration,
|
|
barcap_duration,
|
|
):
|
|
mission_planner.plan_mission(
|
|
ProposedMission(
|
|
self.target,
|
|
[
|
|
ProposedFlight(
|
|
FlightType.BARCAP,
|
|
2,
|
|
mission_planner.doctrine.mission_ranges.cap,
|
|
),
|
|
],
|
|
),
|
|
tracer,
|
|
)
|