From 7baba78bcad00864761821889cf3f0d94e234202 Mon Sep 17 00:00:00 2001 From: Raffson Date: Sun, 13 Aug 2023 13:16:30 +0200 Subject: [PATCH] Allow radio-presets to be defined in squadron files --- game/campaignloader/squadrondefgenerator.py | 1 + game/missiongenerator/aircraft/flightdata.py | 3 +++ .../aircraft/flightgroupconfigurator.py | 1 + game/radio/channels.py | 14 ++++++++++++++ game/squadrons/squadron.py | 3 +++ game/squadrons/squadrondef.py | 17 +++++++++++++++++ game/squadrons/squadrondefloader.py | 2 +- 7 files changed, 40 insertions(+), 1 deletion(-) diff --git a/game/campaignloader/squadrondefgenerator.py b/game/campaignloader/squadrondefgenerator.py index 52eb6726..74e19ed5 100644 --- a/game/campaignloader/squadrondefgenerator.py +++ b/game/campaignloader/squadrondefgenerator.py @@ -48,6 +48,7 @@ class SquadronDefGenerator: aircraft=aircraft, livery=None, auto_assignable_mission_types=set(aircraft.iter_task_capabilities()), + radio_presets={}, operating_bases=OperatingBases.default_for_aircraft(aircraft), female_pilot_percentage=6, pilot_pool=[], diff --git a/game/missiongenerator/aircraft/flightdata.py b/game/missiongenerator/aircraft/flightdata.py index 6d55813e..27d1e408 100644 --- a/game/missiongenerator/aircraft/flightdata.py +++ b/game/missiongenerator/aircraft/flightdata.py @@ -7,6 +7,7 @@ from typing import Optional, TYPE_CHECKING from dcs.flyingunit import FlyingUnit from game.callsigns import create_group_callsign_from_unit +from game.squadrons import Squadron if TYPE_CHECKING: from game.ato import FlightType, FlightWaypoint, Package @@ -32,6 +33,8 @@ class FlightData: aircraft_type: AircraftType + squadron: Squadron + #: All units in the flight. units: list[FlyingUnit] diff --git a/game/missiongenerator/aircraft/flightgroupconfigurator.py b/game/missiongenerator/aircraft/flightgroupconfigurator.py index 4b30c2d3..ec20f532 100644 --- a/game/missiongenerator/aircraft/flightgroupconfigurator.py +++ b/game/missiongenerator/aircraft/flightgroupconfigurator.py @@ -121,6 +121,7 @@ class FlightGroupConfigurator: return FlightData( package=self.flight.package, aircraft_type=self.flight.unit_type, + squadron=self.flight.squadron, flight_type=self.flight.flight_type, units=self.group.units, size=len(self.group.units), diff --git a/game/radio/channels.py b/game/radio/channels.py index 7d85fef9..d7039e02 100644 --- a/game/radio/channels.py +++ b/game/radio/channels.py @@ -46,6 +46,9 @@ class CommonRadioChannelAllocator(RadioChannelAllocator): def assign_channels_for_flight( self, flight: FlightData, mission_data: MissionData ) -> None: + if flight.client_units and flight.squadron.radio_presets: + return self.assign_from_squadron_presets(flight) + if self.intra_flight_radio_index is not None: flight.assign_channel( self.intra_flight_radio_index, 1, flight.intra_flight_channel @@ -105,6 +108,17 @@ class CommonRadioChannelAllocator(RadioChannelAllocator): def name(cls) -> str: return "common" + def assign_from_squadron_presets(self, flight: FlightData) -> None: + presets = flight.squadron.radio_presets + for radio in presets: + radio_id = 1 + if self.intra_flight_radio_index and radio == "intra_flight": + radio_id = self.intra_flight_radio_index + elif self.inter_flight_radio_index and radio == "inter_flight": + radio_id = self.inter_flight_radio_index + for channel, freq in enumerate(presets[radio], start=1): + flight.assign_channel(radio_id, channel, freq) + @dataclass(frozen=True) class NoOpChannelAllocator(RadioChannelAllocator): diff --git a/game/squadrons/squadron.py b/game/squadrons/squadron.py index 9fadd588..08a66861 100644 --- a/game/squadrons/squadron.py +++ b/game/squadrons/squadron.py @@ -15,6 +15,7 @@ from game.settings import AutoAtoBehavior, Settings from game.theater import ParkingType from .pilot import Pilot, PilotStatus from ..db.database import Database +from ..radio.radios import RadioFrequency from ..utils import meters if TYPE_CHECKING: @@ -39,6 +40,7 @@ class Squadron: livery: Optional[str] primary_task: FlightType auto_assignable_mission_types: set[FlightType] + radio_presets: dict[str, list[RadioFrequency]] operating_bases: OperatingBases female_pilot_percentage: int @@ -473,6 +475,7 @@ class Squadron: squadron_def.livery, primary_task, squadron_def.auto_assignable_mission_types, + squadron_def.radio_presets, squadron_def.operating_bases, squadron_def.female_pilot_percentage, squadron_def.pilot_pool, diff --git a/game/squadrons/squadrondef.py b/game/squadrons/squadrondef.py index 86abab77..7deff1b7 100644 --- a/game/squadrons/squadrondef.py +++ b/game/squadrons/squadrondef.py @@ -9,6 +9,7 @@ from dcs.country import Country from game.dcs.aircrafttype import AircraftType from game.dcs.countries import country_with_name +from game.radio.radios import RadioFrequency from game.squadrons.operatingbases import OperatingBases from game.squadrons.pilot import Pilot @@ -26,6 +27,7 @@ class SquadronDef: aircraft: AircraftType livery: Optional[str] auto_assignable_mission_types: set[FlightType] + radio_presets: dict[str, list[RadioFrequency]] operating_bases: OperatingBases female_pilot_percentage: int pilot_pool: list[Pilot] @@ -75,6 +77,20 @@ class SquadronDef: pilots.extend([Pilot(n, player=True) for n in data.get("players", [])]) female_pilot_percentage = data.get("female_pilot_percentage", 6) + radio_presets = data.get("radio_presets", {}) + for radio in radio_presets: + freq_list: list[RadioFrequency] = [] + for freq in radio_presets[radio]: + # TODO: set up modulation for UI manipulations (issue#89) + freq_list.append(RadioFrequency(int(freq * 1000000))) + radio_presets[radio] = freq_list + + for radio in radio_presets: + print(radio, ":") + for freq in radio_presets[radio]: + print(freq) + print() + return SquadronDef( name=data["name"], nickname=data.get("nickname"), @@ -83,6 +99,7 @@ class SquadronDef: aircraft=unit_type, livery=data.get("livery"), auto_assignable_mission_types=set(unit_type.iter_task_capabilities()), + radio_presets=radio_presets, operating_bases=OperatingBases.from_yaml(unit_type, data.get("bases", {})), female_pilot_percentage=female_pilot_percentage, pilot_pool=pilots, diff --git a/game/squadrons/squadrondefloader.py b/game/squadrons/squadrondefloader.py index dc8f86f0..ca9b1165 100644 --- a/game/squadrons/squadrondefloader.py +++ b/game/squadrons/squadrondefloader.py @@ -22,7 +22,7 @@ class SquadronDefLoader: def squadron_directories() -> Iterator[Path]: from game import persistency - yield persistency.base_path() / "Retribution/Squadrons" + yield persistency.base_path() / "Retribution" / "Squadrons" yield Path("resources/squadrons") def load(self) -> dict[AircraftType, list[SquadronDef]]: