From 52b25821af849fc9830df9ce293f7a07ce5994ae Mon Sep 17 00:00:00 2001 From: Raffson Date: Sat, 23 Mar 2024 21:27:43 +0100 Subject: [PATCH] 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 --- changelog.md | 1 + game/campaignloader/squadrondefgenerator.py | 1 + game/missiongenerator/aircraft/aircraftpainter.py | 11 ++++++++++- game/squadrons/squadron.py | 2 ++ game/squadrons/squadrondef.py | 2 ++ 5 files changed, 16 insertions(+), 1 deletion(-) diff --git a/changelog.md b/changelog.md index b53dc8e3..dfa708a9 100644 --- a/changelog.md +++ b/changelog.md @@ -5,6 +5,7 @@ * **[Payload Editor]** Ability to configure liveries on flight/flight-member level * **[Factions]** Support for definitions in yml/yaml format * **[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 * **[UI/UX]** A-10A flights can be edited again. diff --git a/game/campaignloader/squadrondefgenerator.py b/game/campaignloader/squadrondefgenerator.py index 6871b03d..2742519a 100644 --- a/game/campaignloader/squadrondefgenerator.py +++ b/game/campaignloader/squadrondefgenerator.py @@ -47,6 +47,7 @@ class SquadronDefGenerator: role="Flying Squadron", aircraft=aircraft, livery=None, + livery_set=[], auto_assignable_mission_types=set(aircraft.iter_task_capabilities()), radio_presets={}, operating_bases=OperatingBases.default_for_aircraft(aircraft), diff --git a/game/missiongenerator/aircraft/aircraftpainter.py b/game/missiongenerator/aircraft/aircraftpainter.py index 1547600b..0adf06f0 100644 --- a/game/missiongenerator/aircraft/aircraftpainter.py +++ b/game/missiongenerator/aircraft/aircraftpainter.py @@ -27,7 +27,14 @@ class AircraftPainter: def livery_from_squadron(self) -> Optional[str]: 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]: + if (livery := self.livery_from_squadron_set()) is not None: + return livery if (livery := self.livery_from_squadron()) is not None: return livery if (livery := self.livery_from_faction()) is not None: @@ -37,8 +44,10 @@ class AircraftPainter: return None def apply_livery(self) -> None: - livery = self.determine_livery() for unit, member in zip(self.group.units, self.flight.iter_members()): + livery = self.determine_livery() if not (livery or member.livery): continue unit.livery_id = member.livery if member.livery else livery + assert isinstance(unit.livery_id, str) + unit.livery_id = unit.livery_id.lower() diff --git a/game/squadrons/squadron.py b/game/squadrons/squadron.py index 055a0b72..c62d511f 100644 --- a/game/squadrons/squadron.py +++ b/game/squadrons/squadron.py @@ -40,6 +40,7 @@ class Squadron: aircraft: AircraftType max_size: int livery: Optional[str] + livery_set: list[str] # will override livery if not empty primary_task: FlightType auto_assignable_mission_types: set[FlightType] radio_presets: dict[Union[str, int], list[RadioFrequency]] @@ -503,6 +504,7 @@ class Squadron: squadron_def.aircraft, max_size, squadron_def.livery, + squadron_def.livery_set, primary_task, squadron_def.auto_assignable_mission_types, squadron_def.radio_presets, diff --git a/game/squadrons/squadrondef.py b/game/squadrons/squadrondef.py index 9f213c6a..06a778da 100644 --- a/game/squadrons/squadrondef.py +++ b/game/squadrons/squadrondef.py @@ -27,6 +27,7 @@ class SquadronDef: role: str aircraft: AircraftType livery: Optional[str] + livery_set: list[str] auto_assignable_mission_types: set[FlightType] radio_presets: dict[Union[str, int], list[RadioFrequency]] operating_bases: OperatingBases @@ -103,6 +104,7 @@ class SquadronDef: role=data["role"], aircraft=unit_type, livery=data.get("livery"), + livery_set=data.get("livery_set", []), auto_assignable_mission_types=set(unit_type.iter_task_capabilities()), radio_presets=radio_presets, operating_bases=OperatingBases.from_yaml(unit_type, data.get("bases", {})),