mirror of
https://github.com/dcs-liberation/dcs_liberation.git
synced 2025-11-10 14:22:26 +00:00
This reverts commit bd2ec12e0f039c9500ea0dd94e7b2e4f7d168fef. Country is both the data (name, ID, etc) and the container for groups added to the miz, so it can't be used across multiple mission generations. See https://github.com/pydcs/dcs/issues/314 for potential follow up work that would let us do this. Fixes https://github.com/dcs-liberation/dcs_liberation/issues/2864.
83 lines
2.6 KiB
Python
83 lines
2.6 KiB
Python
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass
|
|
from pathlib import Path
|
|
from typing import Optional, TYPE_CHECKING
|
|
|
|
import yaml
|
|
|
|
from game.dcs.aircrafttype import AircraftType
|
|
from game.squadrons.operatingbases import OperatingBases
|
|
from game.squadrons.pilot import Pilot
|
|
|
|
if TYPE_CHECKING:
|
|
from game.ato.flighttype import FlightType
|
|
from game.theater import ControlPoint
|
|
|
|
|
|
@dataclass
|
|
class SquadronDef:
|
|
name: str
|
|
nickname: Optional[str]
|
|
country: str
|
|
role: str
|
|
aircraft: AircraftType
|
|
livery: Optional[str]
|
|
auto_assignable_mission_types: set[FlightType]
|
|
operating_bases: OperatingBases
|
|
female_pilot_percentage: int
|
|
pilot_pool: list[Pilot]
|
|
claimed: bool = False
|
|
|
|
def __str__(self) -> str:
|
|
if self.nickname is None:
|
|
return self.name
|
|
return f'{self.name} "{self.nickname}"'
|
|
|
|
def capable_of(self, task: FlightType) -> bool:
|
|
"""Returns True if the squadron is capable of performing the given task.
|
|
|
|
A squadron may be capable of performing a task even if it will not be
|
|
automatically assigned to it.
|
|
"""
|
|
return self.aircraft.capable_of(task)
|
|
|
|
def operates_from(self, control_point: ControlPoint) -> bool:
|
|
if not control_point.can_operate(self.aircraft):
|
|
return False
|
|
if control_point.is_carrier:
|
|
return self.operating_bases.carrier
|
|
elif control_point.is_lha:
|
|
return self.operating_bases.lha
|
|
else:
|
|
return self.operating_bases.shore
|
|
|
|
@classmethod
|
|
def from_yaml(cls, path: Path) -> SquadronDef:
|
|
|
|
with path.open(encoding="utf8") as squadron_file:
|
|
data = yaml.safe_load(squadron_file)
|
|
|
|
name = data["aircraft"]
|
|
try:
|
|
unit_type = AircraftType.named(name)
|
|
except KeyError as ex:
|
|
raise KeyError(f"Could not find any aircraft named {name}") from ex
|
|
|
|
pilots = [Pilot(n, player=False) for n in data.get("pilots", [])]
|
|
pilots.extend([Pilot(n, player=True) for n in data.get("players", [])])
|
|
female_pilot_percentage = data.get("female_pilot_percentage", 6)
|
|
|
|
return SquadronDef(
|
|
name=data["name"],
|
|
nickname=data.get("nickname"),
|
|
country=data["country"],
|
|
role=data["role"],
|
|
aircraft=unit_type,
|
|
livery=data.get("livery"),
|
|
auto_assignable_mission_types=set(unit_type.iter_task_capabilities()),
|
|
operating_bases=OperatingBases.from_yaml(unit_type, data.get("bases", {})),
|
|
female_pilot_percentage=female_pilot_percentage,
|
|
pilot_pool=pilots,
|
|
)
|