Dynamically generate Pretense air groups (pretense/pretenseluagenerator.py)

This commit is contained in:
MetalStormGhost 2023-09-13 21:55:21 +03:00
parent ecf659097a
commit aad48c0b78
5 changed files with 165 additions and 29 deletions

View File

@ -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:

View File

@ -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)

View File

@ -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(

View File

@ -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"

View File

@ -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()