From 115bd8b22ad5ad434fff1a346f95c713fa81979a Mon Sep 17 00:00:00 2001 From: MetalStormGhost Date: Sat, 5 Aug 2023 15:50:01 +0300 Subject: [PATCH] Convert OPFOR untasked flights into Client slots Added a new option in settings: Convert untasked OPFOR aircraft into client slots. This option will essentially convert the campaign into a sort of team vs. team engagement. There is still no way to plan the OPFOR missions, and there are no guarantees that there even will be any untasked aircraft available for players. Split the Disable idle aircraft at airfields setting into Disable untasked BLUFOR aircraft at airfields and Disable untasked OPFOR aircraft at airfields. --- changelog.md | 2 ++ .../aircraft/aircraftgenerator.py | 28 ++++++++++++++++++- .../aircraft/flightgroupspawner.py | 5 ++++ game/missiongenerator/missiongenerator.py | 9 +++--- game/settings/settings.py | 20 +++++++++++-- 5 files changed, 56 insertions(+), 8 deletions(-) diff --git a/changelog.md b/changelog.md index 5dd919d6..bfafa141 100644 --- a/changelog.md +++ b/changelog.md @@ -5,6 +5,8 @@ * **[Modding]** Custom weapons injection system (definition in aircraft's yaml file) * **[Payload Editor]** Ability to save/back-up payloads * **[Options]** New option in Settings: CAS engagement range (nmi) +* **[Options]** New option in Settings: Convert untasked OPFOR aircraft into client slots +* **[Options]** Split the **Disable idle aircraft at airfields** setting into **Disable untasked BLUFOR aircraft at airfields** and **Disable untasked OPFOR aircraft at airfields**. ## Fixes * **[Mission Generation]** Anti-ship strikes should use "group attack" in their attack-task diff --git a/game/missiongenerator/aircraft/aircraftgenerator.py b/game/missiongenerator/aircraft/aircraftgenerator.py index d4c9042c..7caa91c3 100644 --- a/game/missiongenerator/aircraft/aircraftgenerator.py +++ b/game/missiongenerator/aircraft/aircraftgenerator.py @@ -12,11 +12,12 @@ from dcs.country import Country from dcs.mission import Mission from dcs.terrain.terrain import NoParkingSlotError from dcs.triggers import TriggerOnce, Event +from dcs.unit import Skill from dcs.unitgroup import FlyingGroup, StaticGroup from game.ato.airtaaskingorder import AirTaskingOrder from game.ato.flight import Flight -from game.ato.flightstate import Completed +from game.ato.flightstate import Completed, WaitingForStart from game.ato.flighttype import FlightType from game.ato.package import Package from game.ato.starttype import StartType @@ -178,6 +179,17 @@ class AircraftGenerator: assert isinstance(squadron.location, Airfield) or isinstance( squadron.location, Fob ) + if ( + squadron.coalition.player + and self.game.settings.perf_disable_untasked_blufor_aircraft + ): + return + elif ( + not squadron.coalition.player + and self.game.settings.perf_disable_untasked_opfor_aircraft + ): + return + for _ in range(squadron.untasked_aircraft): # Creating a flight even those this isn't a fragged mission lets us # reuse the existing debriefing code. @@ -203,6 +215,20 @@ class AircraftGenerator: self.mission_data, ).create_idle_aircraft() if group: + if ( + not squadron.coalition.player + and squadron.aircraft.flyable + and ( + self.game.settings.enable_squadron_pilot_limits + or squadron.number_of_available_pilots > 0 + ) + and self.game.settings.untasked_opfor_client_slots + ): + flight.state = WaitingForStart( + flight, self.game.settings, self.game.conditions.start_time + ) + group.uncontrolled = False + group.units[0].skill = Skill.Client AircraftPainter(flight, group).apply_livery() self.unit_map.add_aircraft(group, flight) diff --git a/game/missiongenerator/aircraft/flightgroupspawner.py b/game/missiongenerator/aircraft/flightgroupspawner.py index a647d3c2..f3b19e87 100644 --- a/game/missiongenerator/aircraft/flightgroupspawner.py +++ b/game/missiongenerator/aircraft/flightgroupspawner.py @@ -108,6 +108,11 @@ class FlightGroupSpawner: name=namegen.next_aircraft_name(self.country, self.flight), cp=self.flight.squadron.location, ) + elif isinstance(self.flight.squadron.location, Fob): + group = self._generate_at_cp_ground_spawn( + name=namegen.next_aircraft_name(self.country, self.flight), + cp=self.flight.squadron.location, + ) elif isinstance(self.flight.squadron.location, Airfield): group = self._generate_at_airfield( name=namegen.next_aircraft_name(self.country, self.flight), diff --git a/game/missiongenerator/missiongenerator.py b/game/missiongenerator/missiongenerator.py index 45375a94..85c5e5c9 100644 --- a/game/missiongenerator/missiongenerator.py +++ b/game/missiongenerator/missiongenerator.py @@ -259,11 +259,10 @@ class MissionGenerator: self.game.red.ato, tgo_generator.runways, ) - if not self.game.settings.perf_disable_idle_aircraft: - aircraft_generator.spawn_unused_aircraft( - self.p_country, - self.e_country, - ) + aircraft_generator.spawn_unused_aircraft( + self.p_country, + self.e_country, + ) self.mission_data.flights = aircraft_generator.flights diff --git a/game/settings/settings.py b/game/settings/settings.py index c6c10515..b7cf8295 100644 --- a/game/settings/settings.py +++ b/game/settings/settings.py @@ -589,6 +589,16 @@ class Settings: "option only allows the player to wait on the ground." ), ) + untasked_opfor_client_slots: bool = boolean_option( + "Convert untasked OPFOR aircraft into client slots", + page=MISSION_GENERATOR_PAGE, + section=GAMEPLAY_SECTION, + default=False, + detail=( + "Warning: Enabling this will significantly reduce the number of " + "targets available for OCA/Aircraft missions." + ), + ) atflir_autoswap: bool = boolean_option( "Auto-swap ATFLIR to LITENING", MISSION_GENERATOR_PAGE, @@ -802,8 +812,14 @@ class Settings: section=PERFORMANCE_SECTION, default=True, ) - perf_disable_idle_aircraft: bool = boolean_option( - "Disable idle aircraft at airfields", + perf_disable_untasked_blufor_aircraft: bool = boolean_option( + "Disable untasked BLUFOR aircraft at airfields", + page=MISSION_GENERATOR_PAGE, + section=PERFORMANCE_SECTION, + default=False, + ) + perf_disable_untasked_opfor_aircraft: bool = boolean_option( + "Disable untasked OPFOR aircraft at airfields", page=MISSION_GENERATOR_PAGE, section=PERFORMANCE_SECTION, default=False,