diff --git a/changelog.md b/changelog.md index c5b6e540..09af6df2 100644 --- a/changelog.md +++ b/changelog.md @@ -17,6 +17,7 @@ Saves from 6.x are not compatible with 7.0. * **[Campaign]** Fixed a longstanding bug where oversized airlifts could corrupt a save with empty convoys. * **[Modding]** Fixed an issue where Falklands campaigns created or edited with new versions of DCS could not be loaded. +* **[Modding]** Fixed decoding of campaign yaml files to use UTF-8 rather than the system locale's default. It's now possible to use "Bf 109 K-4 Kurfürst" as a preferred aircraft type. # 6.1.1 diff --git a/game/campaignloader/campaign.py b/game/campaignloader/campaign.py index d3ca5ff7..c61ae2a4 100644 --- a/game/campaignloader/campaign.py +++ b/game/campaignloader/campaign.py @@ -57,7 +57,7 @@ class Campaign: @classmethod def from_file(cls, path: Path) -> Campaign: - with path.open() as campaign_file: + with path.open(encoding="utf-8") as campaign_file: data = yaml.safe_load(campaign_file) sanitized_theater = data["theater"].replace(" ", "") diff --git a/game/logging_config.py b/game/logging_config.py index 2272e5b0..19ff1c7f 100644 --- a/game/logging_config.py +++ b/game/logging_config.py @@ -16,7 +16,7 @@ def init_logging(version: str) -> None: log_config = resources / "default_logging.yaml" if (custom_log_config := resources / "logging.yaml").exists(): log_config = custom_log_config - with log_config.open() as log_file: + with log_config.open(encoding="utf-8") as log_file: logging.config.dictConfig(yaml.safe_load(log_file)) logging.info(f"DCS Liberation {version}") diff --git a/game/theater/theaterloader.py b/game/theater/theaterloader.py index 7ce1e626..f691bcd9 100644 --- a/game/theater/theaterloader.py +++ b/game/theater/theaterloader.py @@ -92,13 +92,13 @@ class TheaterLoader: @property def menu_thumbnail_dcs_relative_path(self) -> Path: - with self.descriptor_path.open() as descriptor_file: + with self.descriptor_path.open(encoding="utf-8") as descriptor_file: data = yaml.safe_load(descriptor_file) name = data.get("pydcs_name", data["name"]) return Path("Mods/terrains") / name / "Theme/icon.png" def load(self) -> ConflictTheater: - with self.descriptor_path.open() as descriptor_file: + with self.descriptor_path.open(encoding="utf-8") as descriptor_file: data = yaml.safe_load(descriptor_file) return ConflictTheater( TERRAINS_BY_NAME[data.get("pydcs_name", data["name"])],