diff --git a/game/factions/faction.py b/game/factions/faction.py index fc5969ff..50a95c39 100644 --- a/game/factions/faction.py +++ b/game/factions/faction.py @@ -4,7 +4,7 @@ import itertools import logging from dataclasses import dataclass, field from functools import cached_property -from typing import Optional, Dict, Type, List, Any, Iterator, TYPE_CHECKING +from typing import Optional, Dict, Type, List, Any, Iterator, TYPE_CHECKING, Set import dcs from dcs.country import Country @@ -57,46 +57,46 @@ class Faction: description: str = field(default="") # Available aircraft - aircraft: List[AircraftType] = field(default_factory=list) + aircraft: Set[AircraftType] = field(default_factory=set) # Available awacs aircraft - awacs: List[AircraftType] = field(default_factory=list) + awacs: Set[AircraftType] = field(default_factory=set) # Available tanker aircraft - tankers: List[AircraftType] = field(default_factory=list) + tankers: Set[AircraftType] = field(default_factory=set) # Available frontline units - frontline_units: List[GroundUnitType] = field(default_factory=list) + frontline_units: Set[GroundUnitType] = field(default_factory=set) # Available artillery units - artillery_units: List[GroundUnitType] = field(default_factory=list) + artillery_units: Set[GroundUnitType] = field(default_factory=set) # Infantry units used - infantry_units: List[GroundUnitType] = field(default_factory=list) + infantry_units: Set[GroundUnitType] = field(default_factory=set) # Logistics units used - logistics_units: List[GroundUnitType] = field(default_factory=list) + logistics_units: Set[GroundUnitType] = field(default_factory=set) # Possible Air Defence units, Like EWRs - air_defense_units: List[GroundUnitType] = field(default_factory=list) + air_defense_units: Set[GroundUnitType] = field(default_factory=set) # A list of all supported sets of units preset_groups: list[ForceGroup] = field(default_factory=list) # Possible Missile site generators for this faction - missiles: List[GroundUnitType] = field(default_factory=list) + missiles: Set[GroundUnitType] = field(default_factory=set) # Required mods or asset packs requirements: Dict[str, str] = field(default_factory=dict) # Possible carrier names - carrier_names: List[str] = field(default_factory=list) + carrier_names: Set[str] = field(default_factory=set) # Possible helicopter carrier names - helicopter_carrier_names: List[str] = field(default_factory=list) + helicopter_carrier_names: Set[str] = field(default_factory=set) # Available Naval Units - naval_units: List[ShipUnitType] = field(default_factory=list) + naval_units: Set[ShipUnitType] = field(default_factory=set) # Whether this faction has JTAC access has_jtac: bool = field(default=False) @@ -108,7 +108,7 @@ class Faction: doctrine: Doctrine = field(default=MODERN_DOCTRINE) # List of available building layouts for this faction - building_set: List[str] = field(default_factory=list) + building_set: Set[str] = field(default_factory=set) # List of default livery overrides liveries_overrides: Dict[AircraftType, List[str]] = field(default_factory=dict) @@ -175,9 +175,9 @@ class Faction: ) return sorted(air_defenses) - @cached_property + @property def aircrafts(self) -> list[UnitType[Any]]: - return list(self.aircraft + self.awacs + self.tankers) + return list(self.aircraft.union(self.awacs.union(self.tankers))) @classmethod def from_dict(cls: Type[Faction], json: Dict[str, Any]) -> Faction: @@ -198,30 +198,30 @@ class Faction: faction.authors = json.get("authors", "") faction.description = json.get("description", "") - faction.aircraft = [AircraftType.named(n) for n in json.get("aircrafts", [])] - faction.awacs = [AircraftType.named(n) for n in json.get("awacs", [])] - faction.tankers = [AircraftType.named(n) for n in json.get("tankers", [])] + faction.aircraft = {AircraftType.named(n) for n in json.get("aircrafts", [])} + faction.awacs = {AircraftType.named(n) for n in json.get("awacs", [])} + faction.tankers = {AircraftType.named(n) for n in json.get("tankers", [])} - faction.frontline_units = [ + faction.frontline_units = { GroundUnitType.named(n) for n in json.get("frontline_units", []) - ] - faction.artillery_units = [ + } + faction.artillery_units = { GroundUnitType.named(n) for n in json.get("artillery_units", []) - ] - faction.infantry_units = [ + } + faction.infantry_units = { GroundUnitType.named(n) for n in json.get("infantry_units", []) - ] - faction.logistics_units = [ + } + faction.logistics_units = { GroundUnitType.named(n) for n in json.get("logistics_units", []) - ] - faction.air_defense_units = [ + } + faction.air_defense_units = { GroundUnitType.named(n) for n in json.get("air_defense_units", []) - ] - faction.missiles = [GroundUnitType.named(n) for n in json.get("missiles", [])] + } + faction.missiles = {GroundUnitType.named(n) for n in json.get("missiles", [])} - faction.naval_units = [ + faction.naval_units = { ShipUnitType.named(n) for n in json.get("naval_units", []) - ] + } faction.preset_groups = [ ForceGroup.from_preset_group(g) for g in json.get("preset_groups", []) @@ -251,22 +251,22 @@ class Faction: faction.doctrine = MODERN_DOCTRINE # Load the building set - faction.building_set = [] + faction.building_set = set() building_set = json.get("building_set", "default") if building_set == "default": - faction.building_set.extend(DEFAULT_AVAILABLE_BUILDINGS) + faction.building_set.update(DEFAULT_AVAILABLE_BUILDINGS) elif building_set == "ww2free": - faction.building_set.extend(WW2_FREE) + faction.building_set.update(WW2_FREE) elif building_set == "ww2ally": - faction.building_set.extend(WW2_ALLIES_BUILDINGS) + faction.building_set.update(WW2_ALLIES_BUILDINGS) elif building_set == "ww2germany": - faction.building_set.extend(WW2_GERMANY_BUILDINGS) + faction.building_set.update(WW2_GERMANY_BUILDINGS) else: - faction.building_set.extend(DEFAULT_AVAILABLE_BUILDINGS) + faction.building_set.update(DEFAULT_AVAILABLE_BUILDINGS) # Add required buildings for the game logic (e.g. ammo, factory..) - faction.building_set.extend(REQUIRED_BUILDINGS) - faction.building_set.extend(IADS_BUILDINGS) + faction.building_set.update(REQUIRED_BUILDINGS) + faction.building_set.update(IADS_BUILDINGS) # Load liveries override faction.liveries_overrides = {} diff --git a/game/theater/start_generator.py b/game/theater/start_generator.py index e4dc9c84..512e6f8f 100644 --- a/game/theater/start_generator.py +++ b/game/theater/start_generator.py @@ -241,7 +241,7 @@ class CarrierGroundObjectGenerator(GenericCarrierGroundObjectGenerator): self.control_point.heading, ), ) - self.update_carrier_name(random.choice(carrier_names)) + self.update_carrier_name(random.choice(list(carrier_names))) return True @@ -272,7 +272,7 @@ class LhaGroundObjectGenerator(GenericCarrierGroundObjectGenerator): self.control_point.heading, ), ) - self.update_carrier_name(random.choice(lha_names)) + self.update_carrier_name(random.choice(list(lha_names))) return True diff --git a/qt_ui/windows/AirWingConfigurationDialog.py b/qt_ui/windows/AirWingConfigurationDialog.py index 05e94402..6411c259 100644 --- a/qt_ui/windows/AirWingConfigurationDialog.py +++ b/qt_ui/windows/AirWingConfigurationDialog.py @@ -689,12 +689,12 @@ class AirWingConfigurationTab(QWidget): bases = list(self.game.theater.control_points_for(self.coalition.player)) # List of all Aircrafts possible to operate with the given bases - possible_aircrafts = [ + possible_aircrafts = { aircraft for aircraft in self.coalition.faction.aircrafts if isinstance(aircraft, AircraftType) and any(base.can_operate(aircraft) for base in bases) - ] + } popup = SquadronConfigPopup( selected_aircraft, @@ -809,7 +809,7 @@ class AirWingConfigurationDialog(QDialog): class SquadronAircraftTypeSelector(QComboBox): def __init__( - self, types: list[AircraftType], selected_aircraft: Optional[str] + self, types: set[AircraftType], selected_aircraft: Optional[str] ) -> None: super().__init__() self.setSizeAdjustPolicy(self.AdjustToContents) @@ -854,7 +854,7 @@ class SquadronConfigPopup(QDialog): def __init__( self, selected_aircraft: Optional[str], - types: list[AircraftType], + types: set[AircraftType], bases: list[ControlPoint], squadron_defs: dict[AircraftType, list[SquadronDef]], ) -> None: