Introduce livery-sets on squadron level

Randomly chooses one of the liveries defined if present in the squadron's yaml, overrides entry for "livery" or whatever is chosen in the UI except liveries on flight-member level
This commit is contained in:
Raffson 2024-03-23 21:27:43 +01:00
parent 6ee74cf079
commit 52b25821af
No known key found for this signature in database
GPG Key ID: B0402B2C9B764D99
5 changed files with 16 additions and 1 deletions

View File

@ -5,6 +5,7 @@
* **[Payload Editor]** Ability to configure liveries on flight/flight-member level * **[Payload Editor]** Ability to configure liveries on flight/flight-member level
* **[Factions]** Support for definitions in yml/yaml format * **[Factions]** Support for definitions in yml/yaml format
* **[Campaigns/Factions]** Support for inline recommended faction in campaign's yaml file * **[Campaigns/Factions]** Support for inline recommended faction in campaign's yaml file
* **[Squadrons]** Ability to define a livery-set for each squadron from which Retribution will randomly choose during mission generation
## Fixes ## Fixes
* **[UI/UX]** A-10A flights can be edited again. * **[UI/UX]** A-10A flights can be edited again.

View File

@ -47,6 +47,7 @@ class SquadronDefGenerator:
role="Flying Squadron", role="Flying Squadron",
aircraft=aircraft, aircraft=aircraft,
livery=None, livery=None,
livery_set=[],
auto_assignable_mission_types=set(aircraft.iter_task_capabilities()), auto_assignable_mission_types=set(aircraft.iter_task_capabilities()),
radio_presets={}, radio_presets={},
operating_bases=OperatingBases.default_for_aircraft(aircraft), operating_bases=OperatingBases.default_for_aircraft(aircraft),

View File

@ -27,7 +27,14 @@ class AircraftPainter:
def livery_from_squadron(self) -> Optional[str]: def livery_from_squadron(self) -> Optional[str]:
return self.flight.squadron.livery return self.flight.squadron.livery
def livery_from_squadron_set(self) -> Optional[str]:
if not self.flight.squadron.livery_set:
return None
return random.choice(self.flight.squadron.livery_set)
def determine_livery(self) -> Optional[str]: def determine_livery(self) -> Optional[str]:
if (livery := self.livery_from_squadron_set()) is not None:
return livery
if (livery := self.livery_from_squadron()) is not None: if (livery := self.livery_from_squadron()) is not None:
return livery return livery
if (livery := self.livery_from_faction()) is not None: if (livery := self.livery_from_faction()) is not None:
@ -37,8 +44,10 @@ class AircraftPainter:
return None return None
def apply_livery(self) -> None: def apply_livery(self) -> None:
livery = self.determine_livery()
for unit, member in zip(self.group.units, self.flight.iter_members()): for unit, member in zip(self.group.units, self.flight.iter_members()):
livery = self.determine_livery()
if not (livery or member.livery): if not (livery or member.livery):
continue continue
unit.livery_id = member.livery if member.livery else livery unit.livery_id = member.livery if member.livery else livery
assert isinstance(unit.livery_id, str)
unit.livery_id = unit.livery_id.lower()

View File

@ -40,6 +40,7 @@ class Squadron:
aircraft: AircraftType aircraft: AircraftType
max_size: int max_size: int
livery: Optional[str] livery: Optional[str]
livery_set: list[str] # will override livery if not empty
primary_task: FlightType primary_task: FlightType
auto_assignable_mission_types: set[FlightType] auto_assignable_mission_types: set[FlightType]
radio_presets: dict[Union[str, int], list[RadioFrequency]] radio_presets: dict[Union[str, int], list[RadioFrequency]]
@ -503,6 +504,7 @@ class Squadron:
squadron_def.aircraft, squadron_def.aircraft,
max_size, max_size,
squadron_def.livery, squadron_def.livery,
squadron_def.livery_set,
primary_task, primary_task,
squadron_def.auto_assignable_mission_types, squadron_def.auto_assignable_mission_types,
squadron_def.radio_presets, squadron_def.radio_presets,

View File

@ -27,6 +27,7 @@ class SquadronDef:
role: str role: str
aircraft: AircraftType aircraft: AircraftType
livery: Optional[str] livery: Optional[str]
livery_set: list[str]
auto_assignable_mission_types: set[FlightType] auto_assignable_mission_types: set[FlightType]
radio_presets: dict[Union[str, int], list[RadioFrequency]] radio_presets: dict[Union[str, int], list[RadioFrequency]]
operating_bases: OperatingBases operating_bases: OperatingBases
@ -103,6 +104,7 @@ class SquadronDef:
role=data["role"], role=data["role"],
aircraft=unit_type, aircraft=unit_type,
livery=data.get("livery"), livery=data.get("livery"),
livery_set=data.get("livery_set", []),
auto_assignable_mission_types=set(unit_type.iter_task_capabilities()), auto_assignable_mission_types=set(unit_type.iter_task_capabilities()),
radio_presets=radio_presets, radio_presets=radio_presets,
operating_bases=OperatingBases.from_yaml(unit_type, data.get("bases", {})), operating_bases=OperatingBases.from_yaml(unit_type, data.get("bases", {})),