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,