mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
- Fix tgogenerator - Fix UI for ForceGroup and Layouts - Fix ammo depot handling - Split bigger files in smaller meaningful files (TGO, layouts, forces) - Renamed Template to Layout - Renamed GroundGroup to TheaterGroup and GroundUnit to TheaterUnit - Reorganize Layouts and UnitGroups to a ArmedForces class and ForceGroup similar to the AirWing and Squadron - Reworded the UnitClass, GroupRole, GroupTask (adopted to PEP8) and reworked the connection from Role and Task - added comments - added missing unit classes - added temp workaround for missing classes - add repariable property to TheaterUnit - Review and Cleanup Added serialization for loaded templates Loading the templates from the .miz files takes a lot of computation time and in the future there will be more templates added to the system. Therefore a local pickle serialization for the loaded templates was re-added: - The pickle will be created the first time the TemplateLoader will be accessed - Pickle is stored in Liberation SaveDir - Added UI option to (re-)import templates
55 lines
1.7 KiB
Python
55 lines
1.7 KiB
Python
from __future__ import annotations
|
|
import json
|
|
import logging
|
|
from pathlib import Path
|
|
from typing import Dict, Iterator, List, Optional, Type
|
|
|
|
from game import persistency
|
|
from game.factions.faction import Faction
|
|
|
|
FACTION_DIRECTORY = Path("./resources/factions/")
|
|
|
|
|
|
class FactionLoader:
|
|
def __init__(self) -> None:
|
|
self._factions: Optional[Dict[str, Faction]] = None
|
|
|
|
@property
|
|
def factions(self) -> Dict[str, Faction]:
|
|
self.initialize()
|
|
assert self._factions is not None
|
|
return self._factions
|
|
|
|
def initialize(self) -> None:
|
|
if self._factions is None:
|
|
self._factions = self.load_factions()
|
|
|
|
@staticmethod
|
|
def find_faction_files_in(path: Path) -> List[Path]:
|
|
return [f for f in path.glob("*.json") if f.is_file()]
|
|
|
|
@classmethod
|
|
def load_factions(cls: Type[FactionLoader]) -> Dict[str, Faction]:
|
|
user_faction_path = Path(persistency.base_path()) / "Liberation/Factions"
|
|
files = cls.find_faction_files_in(
|
|
FACTION_DIRECTORY
|
|
) + cls.find_faction_files_in(user_faction_path)
|
|
factions = {}
|
|
|
|
for f in files:
|
|
try:
|
|
with f.open("r", encoding="utf-8") as fdata:
|
|
data = json.load(fdata)
|
|
factions[data["name"]] = Faction.from_json(data)
|
|
logging.info("Loaded faction : " + str(f))
|
|
except Exception:
|
|
logging.exception(f"Unable to load faction : {f}")
|
|
|
|
return factions
|
|
|
|
def __getitem__(self, name: str) -> Faction:
|
|
return self.factions[name]
|
|
|
|
def __iter__(self) -> Iterator[str]:
|
|
return iter(self.factions.keys())
|