From 843bb30b996070d1705a5d7256af234a0e6d5b97 Mon Sep 17 00:00:00 2001 From: Raffson Date: Sun, 5 Mar 2023 17:45:24 +0100 Subject: [PATCH] Improve (SEAD) Escort tasking - Always use holding point when it's a formation attack FP - More accurate index for SPLIT wpt in triggered action cleanup --- game/ato/flightplans/escort.py | 10 +++------ game/ato/flightplans/flightplan.py | 9 ++++++++ .../aircraft/aircraftbehavior.py | 22 ++++++++++++++----- .../aircraft/aircraftgenerator.py | 6 +++-- 4 files changed, 32 insertions(+), 15 deletions(-) diff --git a/game/ato/flightplans/escort.py b/game/ato/flightplans/escort.py index 8a81ade9..9799d591 100644 --- a/game/ato/flightplans/escort.py +++ b/game/ato/flightplans/escort.py @@ -8,8 +8,6 @@ from .formationattack import ( FormationAttackLayout, ) from .waypointbuilder import WaypointBuilder -from .. import FlightType -from ...utils import Distance class EscortFlightPlan(FormationAttackFlightPlan): @@ -32,11 +30,9 @@ class Builder(FormationAttackBuilder[EscortFlightPlan, FormationAttackLayout]): join = builder.join(self.package.waypoints.join) split = builder.split(self.package.waypoints.split) refuel = builder.refuel(self.package.waypoints.refuel) - initial = None - if self.package.primary_task == FlightType.STRIKE: - initial = builder.escort_hold( - self.package.waypoints.initial, Distance.from_feet(20000) - ) + initial = builder.escort_hold( + self.package.waypoints.initial, self.doctrine.ingress_altitude + ) return FormationAttackLayout( departure=builder.takeoff(self.flight.departure), diff --git a/game/ato/flightplans/flightplan.py b/game/ato/flightplans/flightplan.py index fcb1e12a..99eb45ef 100644 --- a/game/ato/flightplans/flightplan.py +++ b/game/ato/flightplans/flightplan.py @@ -72,6 +72,15 @@ class FlightPlan(ABC, Generic[LayoutT]): """A list of all waypoints in the flight plan, in order.""" return list(self.iter_waypoints()) + def get_index_of_wpt_by_type(self, wpt_type: FlightWaypointType) -> int: + index = 0 + for wpt in self.waypoints: + if wpt and not wpt.only_for_player: + index += 1 + if wpt.waypoint_type == wpt_type: + return index + return -1 + def iter_waypoints(self) -> Iterator[FlightWaypoint]: """Iterates over all waypoints in the flight plan, in order.""" yield from self.layout.iter_waypoints() diff --git a/game/missiongenerator/aircraft/aircraftbehavior.py b/game/missiongenerator/aircraft/aircraftbehavior.py index 4ce5f25e..118f6b89 100644 --- a/game/missiongenerator/aircraft/aircraftbehavior.py +++ b/game/missiongenerator/aircraft/aircraftbehavior.py @@ -29,6 +29,7 @@ from dcs.unitgroup import FlyingGroup from game.ato import Flight, FlightType from game.ato.flightplans.aewc import AewcFlightPlan from game.ato.flightplans.theaterrefueling import TheaterRefuelingFlightPlan +from game.ato.flightwaypointtype import FlightWaypointType class AircraftBehavior: @@ -272,8 +273,14 @@ class AircraftBehavior: # Search Then Engage task, which we have to use instead of the Escort # task for the reasons explained in JoinPointBuilder. group.task = Escort.name - if flight.package.primary_task == FlightType.STRIKE: - group.add_trigger_action(SwitchWaypoint(None, 5)) + if flight.flight_plan.is_formation(flight.flight_plan): + index = flight.flight_plan.get_index_of_wpt_by_type( + FlightWaypointType.SPLIT + ) + if index > 0: + group.add_trigger_action(SwitchWaypoint(None, index)) + else: + logging.warning(f"Couldn't determine SPLIT for {group.name}") self.configure_behavior( flight, group, roe=OptROE.Values.OpenFire, restrict_jettison=True ) @@ -283,15 +290,18 @@ class AircraftBehavior: # available aircraft, and F-14s are not able to be SEAD despite having TALDs. # https://forums.eagle.ru/topic/272112-cannot-assign-f-14-to-sead/ group.task = SEAD.name - if flight.package.primary_task == FlightType.STRIKE: - group.add_trigger_action(SwitchWaypoint(None, 5)) + index = flight.flight_plan.get_index_of_wpt_by_type(FlightWaypointType.SPLIT) + if index > 0 and flight.flight_plan.is_formation(flight.flight_plan): + group.add_trigger_action(SwitchWaypoint(None, index)) + if index < 1: + logging.warning(f"Couldn't determine SPLIT for {group.name}") self.configure_behavior( flight, group, roe=OptROE.Values.OpenFire, - # ASM includes ARMs and TALDs (among other things, but those are the useful + # Guided includes ARMs and TALDs (among other things, but those are the useful # weapons for SEAD). - rtb_winchester=OptRTBOnOutOfAmmo.Values.ASM, + rtb_winchester=OptRTBOnOutOfAmmo.Values.Guided, restrict_jettison=True, mission_uses_gun=False, ) diff --git a/game/missiongenerator/aircraft/aircraftgenerator.py b/game/missiongenerator/aircraft/aircraftgenerator.py index f9f1ad4b..13fd568b 100644 --- a/game/missiongenerator/aircraft/aircraftgenerator.py +++ b/game/missiongenerator/aircraft/aircraftgenerator.py @@ -118,8 +118,10 @@ class AircraftGenerator: ) self.unit_map.add_aircraft(group, flight) if ( - package.primary_task == FlightType.STRIKE - and package.primary_flight is not None + package.primary_flight is not None + and package.primary_flight.flight_plan.is_formation( + package.primary_flight.flight_plan + ) ): splittrigger = TriggerOnce(Event.NoEvent, f"Split-{id(package)}") splittrigger.add_condition(FlagIsTrue(flag=f"split-{id(package)}"))