From 9a59db1ed8c030b854c6a81a392b9aa9b0078c08 Mon Sep 17 00:00:00 2001 From: Dan Albert Date: Tue, 11 Jul 2023 20:16:59 -0700 Subject: [PATCH] Generate anti-ship missions with group attack. Fixes https://github.com/dcs-liberation/dcs_liberation/issues/3068. --- changelog.md | 1 + game/ato/flightplans/antiship.py | 2 +- game/ato/flightwaypointtype.py | 1 + .../aircraft/waypoints/antishipingress.py | 45 +++++++++++++++++++ .../aircraft/waypoints/waypointgenerator.py | 2 + 5 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 game/missiongenerator/aircraft/waypoints/antishipingress.py diff --git a/changelog.md b/changelog.md index f89e9bfe..5ca013f0 100644 --- a/changelog.md +++ b/changelog.md @@ -10,6 +10,7 @@ Saves from 8.x are not compatible with 9.0.0. ## Fixes * **[Data]** Fixed the class of the Samuel Chase so it can't be picked for a AAA or SHORAD site. +* **[Mission Generation]** Restored previous AI behavior for anti-ship missions. A DCS update caused only a single aircraft in a flight to attack. The full flight will now attack like they used to. # 8.1.0 diff --git a/game/ato/flightplans/antiship.py b/game/ato/flightplans/antiship.py index 89ec1f85..59d4f89f 100644 --- a/game/ato/flightplans/antiship.py +++ b/game/ato/flightplans/antiship.py @@ -35,7 +35,7 @@ class Builder(FormationAttackBuilder[AntiShipFlightPlan, FormationAttackLayout]) else: raise InvalidObjectiveLocation(self.flight.flight_type, location) - return self._build(FlightWaypointType.INGRESS_BAI, targets) + return self._build(FlightWaypointType.INGRESS_ANTI_SHIP, targets) @staticmethod def anti_ship_targets_for_tgo(tgo: NavalGroundObject) -> list[StrikeTarget]: diff --git a/game/ato/flightwaypointtype.py b/game/ato/flightwaypointtype.py index 2cdaa409..5c489746 100644 --- a/game/ato/flightwaypointtype.py +++ b/game/ato/flightwaypointtype.py @@ -50,3 +50,4 @@ class FlightWaypointType(IntEnum): CARGO_STOP = 30 # Stopover landing point using the LandingReFuAr waypoint type INGRESS_AIR_ASSAULT = 31 RECOVERY_TANKER = 32 + INGRESS_ANTI_SHIP = 33 diff --git a/game/missiongenerator/aircraft/waypoints/antishipingress.py b/game/missiongenerator/aircraft/waypoints/antishipingress.py new file mode 100644 index 00000000..1cead40e --- /dev/null +++ b/game/missiongenerator/aircraft/waypoints/antishipingress.py @@ -0,0 +1,45 @@ +import logging + +from dcs.point import MovingPoint +from dcs.task import AttackGroup, OptFormation, WeaponType + +from game.theater import NavalControlPoint, TheaterGroundObject +from game.transfers import MultiGroupTransport +from .pydcswaypointbuilder import PydcsWaypointBuilder + + +class AntiShipIngressBuilder(PydcsWaypointBuilder): + def add_tasks(self, waypoint: MovingPoint) -> None: + # TODO: Add common "UnitGroupTarget" base type. + group_names = [] + target = self.package.target + if isinstance(target, TheaterGroundObject): + for group in target.groups: + group_names.append(group.group_name) + elif isinstance(target, MultiGroupTransport): + group_names.append(target.name) + elif isinstance(target, NavalControlPoint): + carrier_name = target.get_carrier_group_name() + if carrier_name: + group_names.append(carrier_name) + else: + logging.error( + "Unexpected target type for anti-ship mission: %s", + target.__class__.__name__, + ) + return + + for group_name in group_names: + miz_group = self.mission.find_group(group_name) + if miz_group is None: + logging.error( + "Could not find group for anti-ship mission %s", group_name + ) + continue + + task = AttackGroup( + miz_group.id, weapon_type=WeaponType.Auto, group_attack=True + ) + waypoint.tasks.append(task) + + waypoint.tasks.append(OptFormation.trail_open()) diff --git a/game/missiongenerator/aircraft/waypoints/waypointgenerator.py b/game/missiongenerator/aircraft/waypoints/waypointgenerator.py index 85d5ebef..04f6041d 100644 --- a/game/missiongenerator/aircraft/waypoints/waypointgenerator.py +++ b/game/missiongenerator/aircraft/waypoints/waypointgenerator.py @@ -24,6 +24,7 @@ from game.missiongenerator.missiondata import MissionData from game.settings import Settings from game.unitmap import UnitMap from game.utils import pairwise +from .antishipingress import AntiShipIngressBuilder from .baiingress import BaiIngressBuilder from .casingress import CasIngressBuilder from .deadingress import DeadIngressBuilder @@ -127,6 +128,7 @@ class WaypointGenerator: self, waypoint: FlightWaypoint, generated_waypoint_index: int ) -> PydcsWaypointBuilder: builders = { + FlightWaypointType.INGRESS_ANTI_SHIP: AntiShipIngressBuilder, FlightWaypointType.INGRESS_BAI: BaiIngressBuilder, FlightWaypointType.INGRESS_CAS: CasIngressBuilder, FlightWaypointType.INGRESS_DEAD: DeadIngressBuilder,