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,
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=[],

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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