mirror of
https://github.com/dcs-liberation/dcs_liberation.git
synced 2025-11-10 14:22:26 +00:00
This is the first step toward bundling all assets related to a save game into a single item. That makes it easier to avoid clobbering "temporary" assets from other games like the state.json, but also makes it easier for players to file bug reports, since there's only a single asset to upload. This is only the first step because so far it only includes the various save files: start of turn, end of last turn before results processing, and "latest" (the game saved explicitly by the player).
56 lines
1.7 KiB
Python
56 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 persistence
|
|
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(persistence.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())
|