mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
Allow radio-presets to be defined in squadron files
This commit is contained in:
parent
95f169bb58
commit
7baba78bca
@ -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=[],
|
||||||
|
|||||||
@ -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]
|
||||||
|
|
||||||
|
|||||||
@ -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),
|
||||||
|
|||||||
@ -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):
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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]]:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user