def _load_all(cls) -> None: for file in Path("resources/groups").glob("*.yaml"): if not file.is_file(): raise RuntimeError(f"{file.name} is not a valid ForceGroup") with file.open(encoding="utf-8") as data_file: data = yaml.safe_load(data_file) name = data["name"] group_tasks = [ GroupTask.by_description(n) for n in data.get("tasks") ] if not group_tasks: logging.error(f"ForceGroup {name} has no valid tasking") continue units: list[UnitType[Any]] = [] for unit in data.get("units"): if GroundUnitType.exists(unit): units.append(GroundUnitType.named(unit)) elif ShipUnitType.exists(unit): units.append(ShipUnitType.named(unit)) else: logging.error( f"Unit {unit} of ForceGroup {name} is invalid") if len(units) == 0: logging.error(f"ForceGroup {name} has no valid units") continue statics = [] for static in data.get("statics", []): static_type = static_type_from_name(static) if static_type is None: logging.error(f"Static {static} for {file} is not valid") else: statics.append(static_type) layouts = [LAYOUTS.by_name(n) for n in data.get("layouts")] if not layouts: logging.error(f"ForceGroup {name} has no valid layouts") continue force_group = ForceGroup( name=name, units=units, statics=statics, tasks=group_tasks, layouts=layouts, ) cls._by_name[force_group.name] = force_group cls._loaded = True
def from_json(cls: Type[Faction], json: Dict[str, Any]) -> Faction: faction = Faction(locales=json.get("locales")) faction.country = json.get("country", "/") if faction.country not in [c.name for c in country_dict.values()]: raise AssertionError( 'Faction\'s country ("{}") is not a valid DCS country ID'. format(faction.country)) faction.name = json.get("name", "") if not faction.name: raise AssertionError("Faction has no valid name") faction.authors = json.get("authors", "") faction.description = json.get("description", "") faction.aircrafts = [ 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.aircrafts = list( set(faction.aircrafts + faction.awacs + faction.tankers)) faction.frontline_units = [ GroundUnitType.named(n) for n in json.get("frontline_units", []) ] faction.artillery_units = [ GroundUnitType.named(n) for n in json.get("artillery_units", []) ] faction.infantry_units = [ GroundUnitType.named(n) for n in json.get("infantry_units", []) ] faction.logistics_units = [ GroundUnitType.named(n) for n in json.get("logistics_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.naval_units = [ ShipUnitType.named(n) for n in json.get("naval_units", []) ] faction.preset_groups = [ ForceGroup.named(n) for n in json.get("preset_groups", []) ] faction.requirements = json.get("requirements", {}) faction.carrier_names = json.get("carrier_names", []) faction.helicopter_carrier_names = json.get("helicopter_carrier_names", []) faction.has_jtac = json.get("has_jtac", False) jtac_name = json.get("jtac_unit", None) if jtac_name is not None: faction.jtac_unit = AircraftType.named(jtac_name) else: faction.jtac_unit = None # Load doctrine doctrine = json.get("doctrine", "modern") if doctrine == "modern": faction.doctrine = MODERN_DOCTRINE elif doctrine == "coldwar": faction.doctrine = COLDWAR_DOCTRINE elif doctrine == "ww2": faction.doctrine = WWII_DOCTRINE else: faction.doctrine = MODERN_DOCTRINE # Load the building set building_set = json.get("building_set", "default") if building_set == "default": faction.building_set = DEFAULT_AVAILABLE_BUILDINGS elif building_set == "ww2free": faction.building_set = WW2_FREE elif building_set == "ww2ally": faction.building_set = WW2_ALLIES_BUILDINGS elif building_set == "ww2germany": faction.building_set = WW2_GERMANY_BUILDINGS else: faction.building_set = DEFAULT_AVAILABLE_BUILDINGS # Add required buildings for the game logic (e.g. ammo, factory..) faction.building_set.extend(REQUIRED_BUILDINGS) # Load liveries override faction.liveries_overrides = {} liveries_overrides = json.get("liveries_overrides", {}) for name, livery in liveries_overrides.items(): aircraft = AircraftType.named(name) faction.liveries_overrides[aircraft] = [s.lower() for s in livery] faction.unrestricted_satnav = json.get("unrestricted_satnav", False) return faction
def from_json(cls: Type[Faction], json: Dict[str, Any]) -> Faction: faction = Faction(locales=json.get("locales")) faction.country = json.get("country", "/") if faction.country not in [c.name for c in country_dict.values()]: raise AssertionError( 'Faction\'s country ("{}") is not a valid DCS country ID'.format( faction.country ) ) faction.name = json.get("name", "") if not faction.name: raise AssertionError("Faction has no valid name") faction.authors = json.get("authors", "") faction.description = json.get("description", "") faction.aircrafts = [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.aircrafts = list( set(faction.aircrafts + faction.awacs + faction.tankers) ) faction.frontline_units = [ GroundUnitType.named(n) for n in json.get("frontline_units", []) ] faction.artillery_units = [ GroundUnitType.named(n) for n in json.get("artillery_units", []) ] faction.infantry_units = [ GroundUnitType.named(n) for n in json.get("infantry_units", []) ] faction.logistics_units = [ GroundUnitType.named(n) for n in json.get("logistics_units", []) ] faction.ewrs = json.get("ewrs", []) faction.air_defenses = json.get("air_defenses", []) # Compatibility for older factions. All air defenses now belong to a # single group and the generator decides what belongs where. faction.air_defenses.extend(json.get("sams", [])) faction.air_defenses.extend(json.get("shorads", [])) faction.missiles = json.get("missiles", []) faction.coastal_defenses = json.get("coastal_defenses", []) faction.requirements = json.get("requirements", {}) faction.carrier_names = json.get("carrier_names", []) faction.helicopter_carrier_names = json.get("helicopter_carrier_names", []) faction.navy_generators = json.get("navy_generators", []) faction.aircraft_carrier = load_all_ships(json.get("aircraft_carrier", [])) faction.helicopter_carrier = load_all_ships(json.get("helicopter_carrier", [])) faction.destroyers = load_all_ships(json.get("destroyers", [])) faction.cruisers = load_all_ships(json.get("cruisers", [])) faction.has_jtac = json.get("has_jtac", False) jtac_name = json.get("jtac_unit", None) if jtac_name is not None: faction.jtac_unit = AircraftType.named(jtac_name) else: faction.jtac_unit = None faction.navy_group_count = int(json.get("navy_group_count", 1)) faction.missiles_group_count = int(json.get("missiles_group_count", 0)) faction.coastal_group_count = int(json.get("coastal_group_count", 0)) # Load doctrine doctrine = json.get("doctrine", "modern") if doctrine == "modern": faction.doctrine = MODERN_DOCTRINE elif doctrine == "coldwar": faction.doctrine = COLDWAR_DOCTRINE elif doctrine == "ww2": faction.doctrine = WWII_DOCTRINE else: faction.doctrine = MODERN_DOCTRINE # Load the building set building_set = json.get("building_set", "default") if building_set == "default": faction.building_set = DEFAULT_AVAILABLE_BUILDINGS elif building_set == "ww2free": faction.building_set = WW2_FREE elif building_set == "ww2ally": faction.building_set = WW2_ALLIES_BUILDINGS elif building_set == "ww2germany": faction.building_set = WW2_GERMANY_BUILDINGS else: faction.building_set = DEFAULT_AVAILABLE_BUILDINGS # Load liveries override faction.liveries_overrides = {} liveries_overrides = json.get("liveries_overrides", {}) for name, livery in liveries_overrides.items(): aircraft = AircraftType.named(name) faction.liveries_overrides[aircraft] = [s.lower() for s in livery] faction.unrestricted_satnav = json.get("unrestricted_satnav", False) return faction