From aad48c0b7863be8e27ace557b976f49a92d366df Mon Sep 17 00:00:00 2001 From: MetalStormGhost Date: Wed, 13 Sep 2023 21:55:21 +0300 Subject: [PATCH] Dynamically generate Pretense air groups (pretense/pretenseluagenerator.py) --- game/game.py | 5 + game/pretense/pretenseaircraftgenerator.py | 37 +++--- game/pretense/pretenseflightgroupspawner.py | 24 ++++ game/pretense/pretenseluagenerator.py | 122 ++++++++++++++++++-- game/pretense/pretensemissiongenerator.py | 6 +- 5 files changed, 165 insertions(+), 29 deletions(-) diff --git a/game/game.py b/game/game.py index 761403b9..31ce38e9 100644 --- a/game/game.py +++ b/game/game.py @@ -148,6 +148,11 @@ class Game: self.blue.configure_default_air_wing(air_wing_config) self.red.configure_default_air_wing(air_wing_config) + # Side, control point, mission type + self.pretense_ground_supply: dict[int, dict[str, List[str]]] = {1: {}, 2: {}} + self.pretense_ground_assault: dict[int, dict[str, List[str]]] = {1: {}, 2: {}} + self.pretense_air: dict[int, dict[str, dict[str, List[str]]]] = {1: {}, 2: {}} + self.on_load(game_still_initializing=True) def __setstate__(self, state: dict[str, Any]) -> None: diff --git a/game/pretense/pretenseaircraftgenerator.py b/game/pretense/pretenseaircraftgenerator.py index 2437bab3..248f95d8 100644 --- a/game/pretense/pretenseaircraftgenerator.py +++ b/game/pretense/pretenseaircraftgenerator.py @@ -121,6 +121,7 @@ class PretenseAircraftGenerator: num_of_cas = 0 num_of_strike = 0 num_of_cap = 0 + for squadron in cp.squadrons: # Intentionally don't spawn anything at OffMapSpawns in Pretense if isinstance(squadron.location, OffMapSpawn): @@ -134,7 +135,7 @@ class PretenseAircraftGenerator: FlightType.TRANSPORT in mission_types or FlightType.AIR_ASSAULT in mission_types ): - flight_type = FlightType.TRANSPORT + flight_type = FlightType.AIR_ASSAULT elif ( FlightType.SEAD in mission_types or FlightType.SEAD_SWEEP in mission_types @@ -210,21 +211,25 @@ class PretenseAircraftGenerator: self.ground_spawns, self.mission_data, ).create_flight_group() - # self.flights.append( - # FlightGroupConfigurator( - # flight, - # group, - # self.game, - # self.mission, - # self.time, - # self.radio_registry, - # self.tacan_registy, - # self.laser_code_registry, - # self.mission_data, - # dynamic_runways, - # self.use_client, - # ).configure() - # ) + if flight.flight_type in [ + FlightType.REFUELING, + FlightType.AEWC, + ]: + self.flights.append( + FlightGroupConfigurator( + flight, + group, + self.game, + self.mission, + self.time, + self.radio_registry, + self.tacan_registy, + self.laser_code_registry, + self.mission_data, + dynamic_runways, + self.use_client, + ).configure() + ) if self.ewrj: self._track_ewrj_flight(flight, group) diff --git a/game/pretense/pretenseflightgroupspawner.py b/game/pretense/pretenseflightgroupspawner.py index 880ad88d..4e671c2d 100644 --- a/game/pretense/pretenseflightgroupspawner.py +++ b/game/pretense/pretenseflightgroupspawner.py @@ -66,9 +66,24 @@ class PretenseFlightGroupSpawner(FlightGroupSpawner): def generate_flight_at_departure(self) -> FlyingGroup[Any]: cp = self.flight.departure name = namegen.next_pretense_aircraft_name(cp, self.flight) + cp_side = 2 if cp.captured else 1 + cp_name_trimmed = "".join([i for i in cp.name.lower() if i.isalnum()]) + flight_type = self.flight.flight_type.name + if cp_name_trimmed not in self.flight.coalition.game.pretense_air[cp_side]: + self.flight.coalition.game.pretense_air[cp_side][cp_name_trimmed] = {} + if ( + flight_type + not in self.flight.coalition.game.pretense_air[cp_side][cp_name_trimmed] + ): + self.flight.coalition.game.pretense_air[cp_side][cp_name_trimmed][ + flight_type + ] = list() try: if self.start_type is StartType.IN_FLIGHT: + self.flight.coalition.game.pretense_air[cp_side][cp_name_trimmed][ + self.flight.flight_type.name + ].append(name) group = self._generate_over_departure(name, cp) return group elif isinstance(cp, OffMapSpawn): @@ -82,6 +97,9 @@ class PretenseFlightGroupSpawner(FlightGroupSpawner): f"Carrier group {carrier_group} is a " f"{carrier_group.__class__.__name__}, expected a ShipGroup" ) + self.flight.coalition.game.pretense_air[cp_side][cp_name_trimmed][ + self.flight.flight_type.name + ].append(name) return self._generate_at_group(name, carrier_group) elif isinstance(cp, Fob): is_heli = self.flight.squadron.aircraft.helicopter @@ -109,6 +127,9 @@ class PretenseFlightGroupSpawner(FlightGroupSpawner): pad_group = self._generate_at_cp_ground_spawn(name, cp) if pad_group is not None: return pad_group + self.flight.coalition.game.pretense_air[cp_side][cp_name_trimmed][ + self.flight.flight_type.name + ].append(name) return self._generate_over_departure(name, cp) elif isinstance(cp, Airfield): is_heli = self.flight.squadron.aircraft.helicopter @@ -126,6 +147,9 @@ class PretenseFlightGroupSpawner(FlightGroupSpawner): pad_group = self._generate_at_cp_ground_spawn(name, cp) if pad_group is not None: return pad_group + self.flight.coalition.game.pretense_air[cp_side][cp_name_trimmed][ + self.flight.flight_type.name + ].append(name) return self._generate_at_airfield(name, cp) else: raise NotImplementedError( diff --git a/game/pretense/pretenseluagenerator.py b/game/pretense/pretenseluagenerator.py index d860abd3..9961c1af 100644 --- a/game/pretense/pretenseluagenerator.py +++ b/game/pretense/pretenseluagenerator.py @@ -225,6 +225,10 @@ class PretenseLuaGenerator(LuaGenerator): for cp in self.game.theater.controlpoints: cp_name_trimmed = "".join([i for i in cp.name.lower() if i.isalnum()]) cp_side = 2 if cp.captured else 1 + if cp_name_trimmed not in self.game.pretense_air[cp_side]: + self.game.pretense_air[cp_side][cp_name_trimmed] = {} + # if flight_type not in self.flight.coalition.game.pretense_air[cp_side][cp_name_trimmed]: + # self.flight.coalition.game.pretense_air[cp_side][cp_name_trimmed][flight_type] = list() lua_string += f"zones.{cp_name_trimmed} = ZoneCommand:new('{cp.name}')\n" lua_string += ( @@ -248,7 +252,7 @@ class PretenseLuaGenerator(LuaGenerator): lua_string += " }\n" lua_string += " }),\n" lua_string += " presets.upgrades.basic.comPost:extend({\n" - lua_string += " name = 'batumi-com-red',\n" + lua_string += f" name = '{cp_name_trimmed}-com-red',\n" lua_string += " products = {" lua_string += " presets.special.red.infantry:extend({ name='batumi-defense-red'}),\n" lua_string += " presets.defenses.red.infantry:extend({ name='batumi-garrison-red' })\n" @@ -258,13 +262,13 @@ class PretenseLuaGenerator(LuaGenerator): lua_string += " [2] = --blue side\n" lua_string += " {\n" lua_string += " presets.upgrades.basic.tent:extend({\n" - lua_string += " name='mike-tent-blue',\n" + lua_string += f" name='{cp_name_trimmed}-tent-blue',\n" lua_string += " products = {\n" lua_string += " presets.special.blue.infantry:extend({ name='mike-defense-blue'})\n" lua_string += " }\n" lua_string += " }),\n" lua_string += " presets.upgrades.basic.comPost:extend({\n" - lua_string += " name = 'batumi-com-blue',\n" + lua_string += f" name = '{cp_name_trimmed}-com-blue',\n" lua_string += " products = {" lua_string += " presets.special.blue.infantry:extend({ name='batumi-defense-blue'}),\n" lua_string += " presets.defenses.blue.infantry:extend({ name='batumi-garrison-blue' })\n" @@ -279,16 +283,110 @@ class PretenseLuaGenerator(LuaGenerator): lua_string += " }\n" lua_string += " }),\n" lua_string += " presets.upgrades.airdef.comCenter:extend({\n" - lua_string += " name = 'batumi-mission-command-blue',\n" + lua_string += ( + f" name = '{cp_name_trimmed}-mission-command-blue',\n" + ) lua_string += " products = {\n" - lua_string += " presets.defenses.blue.shorad:extend({ name='batumi-sam-blue' }),\n" - lua_string += " presets.missions.attack.sead:extend({name='batumi-sead-blue-1', altitude=25000, expend=AI.Task.WeaponExpend.ALL}),\n" - lua_string += " presets.missions.attack.cas:extend({name='batumi-cas-blue-1', altitude=15000, expend=AI.Task.WeaponExpend.ONE}),\n" - lua_string += " presets.missions.attack.bai:extend({name='batumi-cas-blue-1', altitude=10000, expend=AI.Task.WeaponExpend.ONE}),\n" - lua_string += " presets.missions.attack.strike:extend({name='batumi-strike-blue-1', altitude=20000, expend=AI.Task.WeaponExpend.ALL}),\n" - lua_string += " presets.missions.patrol.aircraft:extend({name='batumi-patrol-blue-1', altitude=25000, range=25}),\n" - lua_string += " presets.missions.support.awacs:extend({name='batumi-awacs-blue', altitude=30000, freq=257.5}),\n" - lua_string += " presets.missions.support.tanker:extend({name='batumi-tanker-blue', altitude=25000, freq=257, tacan='37', variant=\"Drogue\"})\n" + lua_string += ( + " presets.defenses.blue.shorad:extend({ name='" + + cp_name_trimmed + + "-sam-blue' }),\n" + ) + for mission_type in self.game.pretense_air[cp_side][cp_name_trimmed]: + if mission_type == FlightType.SEAD.name: + mission_name = "attack.sead" + for air_group in self.game.pretense_air[cp_side][cp_name_trimmed][ + mission_type + ]: + lua_string += ( + f" presets.missions.{mission_name}:extend" + + "({name='" + + air_group + + "', altitude=25000, expend=AI.Task.WeaponExpend.ALL}),\n" + ) + elif mission_type == FlightType.CAS.name: + mission_name = "attack.cas" + for air_group in self.game.pretense_air[cp_side][cp_name_trimmed][ + mission_type + ]: + lua_string += ( + f" presets.missions.{mission_name}:extend" + + "({name='" + + air_group + + "', altitude=15000, expend=AI.Task.WeaponExpend.ONE}),\n" + ) + elif mission_type == FlightType.BAI.name: + mission_name = "attack.bai" + for air_group in self.game.pretense_air[cp_side][cp_name_trimmed][ + mission_type + ]: + lua_string += ( + f" presets.missions.{mission_name}:extend" + + "({name='" + + air_group + + "', altitude=10000, expend=AI.Task.WeaponExpend.ONE}),\n" + ) + elif mission_type == FlightType.STRIKE.name: + mission_name = "attack.strike" + for air_group in self.game.pretense_air[cp_side][cp_name_trimmed][ + mission_type + ]: + lua_string += ( + f" presets.missions.{mission_name}:extend" + + "({name='" + + air_group + + "', altitude=20000, expend=AI.Task.WeaponExpend.ALL}),\n" + ) + elif mission_type == FlightType.BARCAP.name: + mission_name = "patrol.aircraft" + for air_group in self.game.pretense_air[cp_side][cp_name_trimmed][ + mission_type + ]: + lua_string += ( + f" presets.missions.{mission_name}:extend" + + "({name='" + + air_group + + "', altitude=25000, range=25}),\n" + ) + elif mission_type == FlightType.AIR_ASSAULT.name: + mission_name = "supply.helo" + for air_group in self.game.pretense_air[cp_side][cp_name_trimmed][ + mission_type + ]: + lua_string += ( + f" presets.missions.{mission_name}:extend" + + "({name='" + + air_group + + "'}),\n" + ) + elif mission_type == FlightType.REFUELING.name: + mission_name = "support.tanker" + for air_group in self.game.pretense_air[cp_side][cp_name_trimmed][ + mission_type + ]: + lua_string += ( + f" presets.missions.{mission_name}:extend" + + "({name='" + + air_group + + "', freq=257, tacan='37', variant=\"Drogue\"}),\n" + ) + for tanker in self.mission_data.tankers: + if tanker.group_name == air_group: + print(tanker) + elif mission_type == FlightType.AEWC.name: + mission_name = "support.awacs" + for air_group in self.game.pretense_air[cp_side][cp_name_trimmed][ + mission_type + ]: + lua_string += ( + f" presets.missions.{mission_name}:extend" + + "({name='" + + air_group + + "', freq=257.5}),\n" + ) + for awacs in self.mission_data.awacs: + if awacs.group_name == air_group: + print(awacs) lua_string += " }\n" lua_string += " })\n" lua_string += " }\n" diff --git a/game/pretense/pretensemissiongenerator.py b/game/pretense/pretensemissiongenerator.py index ed220130..9daaab9b 100644 --- a/game/pretense/pretensemissiongenerator.py +++ b/game/pretense/pretensemissiongenerator.py @@ -3,7 +3,7 @@ from __future__ import annotations import logging from datetime import datetime from pathlib import Path -from typing import TYPE_CHECKING, cast +from typing import TYPE_CHECKING, cast, List import dcs.lua from dataclasses import field @@ -81,6 +81,10 @@ class PretenseMissionGenerator: ) self.generation_started = True + self.game.pretense_ground_supply = {1: {}, 2: {}} + self.game.pretense_ground_assault = {1: {}, 2: {}} + self.game.pretense_air = {1: {}, 2: {}} + self.setup_mission_coalitions() self.add_airfields_to_unit_map() self.initialize_registries()