mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
This alters the DEAD task planning to be the *least* preferred task, but prevents other tasks from being planned unless they are excepted to be clear of air defenses first. Even so, missions are a guaranteed success so those other missions will still get SEAD escorts if there's potential for a SAM in the area. This means that air defenses that are not protecting a more useful target (like a convoy, armor column, building, etc) will no longer be considered by the mission planner. This isn't *quite* right since we currently only check the target area for air defenses rather than the entire flight plan, so there's a chance that we ignore IADS that have threatened ingress points (though that's mostly solved by the flight plan layout). This also is still slightly limited because it's not checking for aircraft availability at this stage yet, so we may aggressively plan missions that we should be skipping unless we can guarantee that the DEAD mission was planned. However, that's not new behavior.
54 lines
2.1 KiB
Python
54 lines
2.1 KiB
Python
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass
|
|
|
|
from game.commander.missionproposals import EscortType
|
|
from game.commander.tasks.packageplanningtask import PackagePlanningTask
|
|
from game.commander.theaterstate import TheaterState
|
|
from game.data.doctrine import Doctrine
|
|
from game.theater.theatergroundobject import IadsGroundObject
|
|
from gen.flights.flight import FlightType
|
|
|
|
|
|
@dataclass
|
|
class PlanDead(PackagePlanningTask[IadsGroundObject]):
|
|
def preconditions_met(self, state: TheaterState) -> bool:
|
|
if self.target not in state.threatening_air_defenses:
|
|
return False
|
|
return self.target_area_preconditions_met(state, ignore_iads=True)
|
|
|
|
def apply_effects(self, state: TheaterState) -> None:
|
|
state.eliminate_air_defense(self.target)
|
|
|
|
def propose_flights(self, doctrine: Doctrine) -> None:
|
|
self.propose_flight(FlightType.DEAD, 2, doctrine.mission_ranges.offensive)
|
|
|
|
# Only include SEAD against SAMs that still have emitters. No need to
|
|
# suppress an EWR, and SEAD isn't useful against a SAM that no longer has a
|
|
# working track radar.
|
|
#
|
|
# For SAMs without track radars and EWRs, we still want a SEAD escort if
|
|
# needed.
|
|
#
|
|
# Note that there is a quirk here: we should potentially be included a SEAD
|
|
# escort *and* SEAD when the target is a radar SAM but the flight path is
|
|
# also threatened by SAMs. We don't want to include a SEAD escort if the
|
|
# package is *only* threatened by the target though. Could be improved, but
|
|
# needs a decent refactor to the escort planning to do so.
|
|
if self.target.has_live_radar_sam:
|
|
self.propose_flight(FlightType.SEAD, 2, doctrine.mission_ranges.offensive)
|
|
else:
|
|
self.propose_flight(
|
|
FlightType.SEAD_ESCORT,
|
|
2,
|
|
doctrine.mission_ranges.offensive,
|
|
EscortType.Sead,
|
|
)
|
|
|
|
self.propose_flight(
|
|
FlightType.ESCORT,
|
|
2,
|
|
doctrine.mission_ranges.offensive,
|
|
EscortType.AirToAir,
|
|
)
|