Serialize warehouses & support for dynamic slots/cargo

This commit is contained in:
Raffson 2024-07-20 00:54:45 +02:00
parent 75dd67a145
commit 0d56c271df
No known key found for this signature in database
GPG Key ID: B0402B2C9B764D99
3 changed files with 69 additions and 1 deletions

View File

@ -10,6 +10,8 @@ from dcs import Mission, Point
from dcs.coalition import Coalition from dcs.coalition import Coalition
from dcs.countries import country_dict from dcs.countries import country_dict
from dcs.task import OptReactOnThreat from dcs.task import OptReactOnThreat
from dcs.terrain import Airport
from dcs.unit import Static
from game.atcdata import AtcData from game.atcdata import AtcData
from game.dcs.beacons import Beacons from game.dcs.beacons import Beacons
@ -112,8 +114,8 @@ class MissionGenerator:
self.notify_info_generators() self.notify_info_generators()
# TODO: Shouldn't this be first?
namegen.reset_numbers() namegen.reset_numbers()
self.generate_warehouses()
self.mission.save(output) self.mission.save(output)
return self.unit_map return self.unit_map
@ -347,3 +349,32 @@ class MissionGenerator:
self.mission.groundControl.blue_tactical_commander = commanders self.mission.groundControl.blue_tactical_commander = commanders
self.mission.groundControl.blue_jtac = settings.jtac_count self.mission.groundControl.blue_jtac = settings.jtac_count
self.mission.groundControl.blue_observer = settings.observer_count self.mission.groundControl.blue_observer = settings.observer_count
def generate_warehouses(self) -> None:
settings = self.game.settings
for tmu in self.unit_map.theater_objects.values():
if (
tmu.theater_unit.is_ship
or
isinstance(tmu.dcs_unit, Static)
and tmu.dcs_unit.category in ["Warehouses", "Heliports"]
):
# We'll serialize more than is actually necessary
# DCS will filter out warehouses as dynamic spawns so no need to worry there
# thus, if we serialize a ship as a warehouse that's not supported, DCS will filter it out
warehouse = Airport(
tmu.theater_unit.position,
self.mission.terrain,
).dict()
warehouse["coalition"] = "blue" if tmu.theater_unit.ground_object.coalition.player else "red"
warehouse["dynamicCargo"] = settings.dynamic_cargo
if tmu.theater_unit.is_ship or tmu.dcs_unit.category == "Heliports": # type: ignore
warehouse["dynamicSpawn"] = settings.dynamic_slots
warehouse["allowHotStart"] = settings.dynamic_slots_hot
self.mission.warehouses.warehouses[tmu.dcs_unit.id] = warehouse
# configure dynamic spawn, hot start of DS & dynamic cargo for airfields
for ap in self.mission.terrain.airports.values():
ap.dynamic_spawn = settings.dynamic_slots
ap.allow_hot_start = settings.dynamic_slots_hot
ap.dynamic_cargo = settings.dynamic_cargo

View File

@ -38,6 +38,7 @@ from dcs.task import (
FireAtPoint, FireAtPoint,
OptAlarmState, OptAlarmState,
) )
from dcs.terrain import Airport
from dcs.translation import String from dcs.translation import String
from dcs.triggers import ( from dcs.triggers import (
Event, Event,
@ -843,6 +844,14 @@ class HelipadGenerator:
else: else:
self.helipads.append(sg) self.helipads.append(sg)
warehouse = Airport(
pad.position,
self.m.terrain,
).dict()
warehouse["coalition"] = "blue" if self.cp.coalition.player else "red"
# configure dynamic spawn + hot start of DS, plus dynamic cargo?
self.m.warehouses.warehouses[pad.id] = warehouse
# Generate a FARP Ammo and Fuel stack for each pad # Generate a FARP Ammo and Fuel stack for each pad
self.m.static_group( self.m.static_group(
country=country, country=country,

View File

@ -893,6 +893,34 @@ class Settings:
" and reapplied at split/racetrack end for applicable flights. " " and reapplied at split/racetrack end for applicable flights. "
), ),
) )
dynamic_slots: bool = boolean_option(
"Dynamic slots",
MISSION_GENERATOR_PAGE,
GAMEPLAY_SECTION,
default=False,
detail=(
"Enables dynamic slots. Please note that losses from dynamic slots won't be registered."
),
)
dynamic_slots_hot: bool = boolean_option(
"Allow dynamic slot hot start",
MISSION_GENERATOR_PAGE,
GAMEPLAY_SECTION,
default=True,
detail=(
"Enables hot start for dynamic slots."
),
)
dynamic_cargo: bool = boolean_option(
"Dynamic cargo",
MISSION_GENERATOR_PAGE,
GAMEPLAY_SECTION,
default=True,
detail=(
"Enables dynamic cargo for airfields, ships, FARPs & warehouses."
),
)
# Performance # Performance
perf_smoke_gen: bool = boolean_option( perf_smoke_gen: bool = boolean_option(