Allow radio-presets to be defined in squadron files

This commit is contained in:
Raffson 2023-08-13 13:16:30 +02:00
parent 95f169bb58
commit 7baba78bca
No known key found for this signature in database
GPG Key ID: B0402B2C9B764D99
7 changed files with 40 additions and 1 deletions

View File

@ -48,6 +48,7 @@ class SquadronDefGenerator:
aircraft=aircraft, aircraft=aircraft,
livery=None, livery=None,
auto_assignable_mission_types=set(aircraft.iter_task_capabilities()), auto_assignable_mission_types=set(aircraft.iter_task_capabilities()),
radio_presets={},
operating_bases=OperatingBases.default_for_aircraft(aircraft), operating_bases=OperatingBases.default_for_aircraft(aircraft),
female_pilot_percentage=6, female_pilot_percentage=6,
pilot_pool=[], pilot_pool=[],

View File

@ -7,6 +7,7 @@ from typing import Optional, TYPE_CHECKING
from dcs.flyingunit import FlyingUnit from dcs.flyingunit import FlyingUnit
from game.callsigns import create_group_callsign_from_unit from game.callsigns import create_group_callsign_from_unit
from game.squadrons import Squadron
if TYPE_CHECKING: if TYPE_CHECKING:
from game.ato import FlightType, FlightWaypoint, Package from game.ato import FlightType, FlightWaypoint, Package
@ -32,6 +33,8 @@ class FlightData:
aircraft_type: AircraftType aircraft_type: AircraftType
squadron: Squadron
#: All units in the flight. #: All units in the flight.
units: list[FlyingUnit] units: list[FlyingUnit]

View File

@ -121,6 +121,7 @@ class FlightGroupConfigurator:
return FlightData( return FlightData(
package=self.flight.package, package=self.flight.package,
aircraft_type=self.flight.unit_type, aircraft_type=self.flight.unit_type,
squadron=self.flight.squadron,
flight_type=self.flight.flight_type, flight_type=self.flight.flight_type,
units=self.group.units, units=self.group.units,
size=len(self.group.units), size=len(self.group.units),

View File

@ -46,6 +46,9 @@ class CommonRadioChannelAllocator(RadioChannelAllocator):
def assign_channels_for_flight( def assign_channels_for_flight(
self, flight: FlightData, mission_data: MissionData self, flight: FlightData, mission_data: MissionData
) -> None: ) -> 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: if self.intra_flight_radio_index is not None:
flight.assign_channel( flight.assign_channel(
self.intra_flight_radio_index, 1, flight.intra_flight_channel self.intra_flight_radio_index, 1, flight.intra_flight_channel
@ -105,6 +108,17 @@ class CommonRadioChannelAllocator(RadioChannelAllocator):
def name(cls) -> str: def name(cls) -> str:
return "common" 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) @dataclass(frozen=True)
class NoOpChannelAllocator(RadioChannelAllocator): class NoOpChannelAllocator(RadioChannelAllocator):

View File

@ -15,6 +15,7 @@ from game.settings import AutoAtoBehavior, Settings
from game.theater import ParkingType from game.theater import ParkingType
from .pilot import Pilot, PilotStatus from .pilot import Pilot, PilotStatus
from ..db.database import Database from ..db.database import Database
from ..radio.radios import RadioFrequency
from ..utils import meters from ..utils import meters
if TYPE_CHECKING: if TYPE_CHECKING:
@ -39,6 +40,7 @@ class Squadron:
livery: Optional[str] livery: Optional[str]
primary_task: FlightType primary_task: FlightType
auto_assignable_mission_types: set[FlightType] auto_assignable_mission_types: set[FlightType]
radio_presets: dict[str, list[RadioFrequency]]
operating_bases: OperatingBases operating_bases: OperatingBases
female_pilot_percentage: int female_pilot_percentage: int
@ -473,6 +475,7 @@ class Squadron:
squadron_def.livery, squadron_def.livery,
primary_task, primary_task,
squadron_def.auto_assignable_mission_types, squadron_def.auto_assignable_mission_types,
squadron_def.radio_presets,
squadron_def.operating_bases, squadron_def.operating_bases,
squadron_def.female_pilot_percentage, squadron_def.female_pilot_percentage,
squadron_def.pilot_pool, squadron_def.pilot_pool,

View File

@ -9,6 +9,7 @@ from dcs.country import Country
from game.dcs.aircrafttype import AircraftType from game.dcs.aircrafttype import AircraftType
from game.dcs.countries import country_with_name from game.dcs.countries import country_with_name
from game.radio.radios import RadioFrequency
from game.squadrons.operatingbases import OperatingBases from game.squadrons.operatingbases import OperatingBases
from game.squadrons.pilot import Pilot from game.squadrons.pilot import Pilot
@ -26,6 +27,7 @@ class SquadronDef:
aircraft: AircraftType aircraft: AircraftType
livery: Optional[str] livery: Optional[str]
auto_assignable_mission_types: set[FlightType] auto_assignable_mission_types: set[FlightType]
radio_presets: dict[str, list[RadioFrequency]]
operating_bases: OperatingBases operating_bases: OperatingBases
female_pilot_percentage: int female_pilot_percentage: int
pilot_pool: list[Pilot] pilot_pool: list[Pilot]
@ -75,6 +77,20 @@ class SquadronDef:
pilots.extend([Pilot(n, player=True) for n in data.get("players", [])]) pilots.extend([Pilot(n, player=True) for n in data.get("players", [])])
female_pilot_percentage = data.get("female_pilot_percentage", 6) 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( return SquadronDef(
name=data["name"], name=data["name"],
nickname=data.get("nickname"), nickname=data.get("nickname"),
@ -83,6 +99,7 @@ class SquadronDef:
aircraft=unit_type, aircraft=unit_type,
livery=data.get("livery"), livery=data.get("livery"),
auto_assignable_mission_types=set(unit_type.iter_task_capabilities()), auto_assignable_mission_types=set(unit_type.iter_task_capabilities()),
radio_presets=radio_presets,
operating_bases=OperatingBases.from_yaml(unit_type, data.get("bases", {})), operating_bases=OperatingBases.from_yaml(unit_type, data.get("bases", {})),
female_pilot_percentage=female_pilot_percentage, female_pilot_percentage=female_pilot_percentage,
pilot_pool=pilots, pilot_pool=pilots,

View File

@ -22,7 +22,7 @@ class SquadronDefLoader:
def squadron_directories() -> Iterator[Path]: def squadron_directories() -> Iterator[Path]:
from game import persistency from game import persistency
yield persistency.base_path() / "Retribution/Squadrons" yield persistency.base_path() / "Retribution" / "Squadrons"
yield Path("resources/squadrons") yield Path("resources/squadrons")
def load(self) -> dict[AircraftType, list[SquadronDef]]: def load(self) -> dict[AircraftType, list[SquadronDef]]: