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", {})),