mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
Dynamically generate Pretense air groups (pretense/pretenseluagenerator.py)
This commit is contained in:
parent
ecf659097a
commit
aad48c0b78
@ -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:
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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(
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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()
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user