From b242aed429daba000b400381e0bc4990b566ccb3 Mon Sep 17 00:00:00 2001 From: Kurt Date: Sat, 3 Oct 2020 11:22:06 -0700 Subject: [PATCH] Add ability to load blank japanese/korean save files Detects the language of the currently loaded save file, and passes that info to the blank sav creator Use a trainer name of "1337" instead of PKHeX for any Japanese save file, because Gen1/2(/3?) character tables don't have regular ascii chars. --- PKHeX.Core/Saves/Util/SaveUtil.cs | 39 ++++++++++++++++++++----------- PKHeX.WinForms/MainWindow/Main.cs | 6 +++-- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/PKHeX.Core/Saves/Util/SaveUtil.cs b/PKHeX.Core/Saves/Util/SaveUtil.cs index 05db8292c..028a0c968 100644 --- a/PKHeX.Core/Saves/Util/SaveUtil.cs +++ b/PKHeX.Core/Saves/Util/SaveUtil.cs @@ -564,15 +564,26 @@ private static GameVersion GetIsG8SAV(byte[] data) return sav; } + /// + /// Returns a that feels best for the save file's language. + /// + public static LanguageID GetSafeLanguage(SaveFile? sav) => sav switch + { + null => LanguageID.English, + ILangDeviantSave s => s.Japanese ? LanguageID.Japanese : s.Korean ? LanguageID.Korean : LanguageID.English, + _ => sav.Language <= Legal.GetMaxLanguageID(sav.Generation) ? (LanguageID)sav.Language : LanguageID.English, + }; + /// /// Creates an instance of a SaveFile with a blank base. /// /// Version to create the save file for. /// Trainer Name + /// Language to initialize with /// Blank save file from the requested game, null if no game exists for that . - public static SaveFile GetBlankSAV(GameVersion game, string trainerName) + public static SaveFile GetBlankSAV(GameVersion game, string trainerName, LanguageID language = LanguageID.English) { - var SAV = GetBlankSAV(game); + var SAV = GetBlankSAV(game, language); SAV.Game = (int)game; SAV.OT = trainerName; @@ -587,7 +598,7 @@ public static SaveFile GetBlankSAV(GameVersion game, string trainerName) SAV.TID = 12345; SAV.SID = 54321; } - SAV.Language = (int)LanguageID.English; // English + SAV.Language = (int)language; // Only set geolocation data for 3DS titles if (SAV is IRegionOrigin o) @@ -600,8 +611,9 @@ public static SaveFile GetBlankSAV(GameVersion game, string trainerName) /// Creates an instance of a SaveFile with a blank base. /// /// Version to create the save file for. + /// Save file language to initialize for /// Blank save file from the requested game, null if no game exists for that . - private static SaveFile GetBlankSAV(GameVersion game) + private static SaveFile GetBlankSAV(GameVersion game, LanguageID language) { switch (game) { @@ -611,23 +623,23 @@ private static SaveFile GetBlankSAV(GameVersion game) case StadiumJ: return new SAV1StadiumJ(); case Stadium: - return new SAV1Stadium(); + return new SAV1Stadium(language == LanguageID.Japanese); case GS: case GD: case SV: - return new SAV2(version: GS); + return new SAV2(version: GS, lang: language); case GSC: case C: - return new SAV2(version: C); + return new SAV2(version: C, lang: language); case Stadium2: return new SAV2Stadium(); case R: case S: case E: case FR: case LG: - return new SAV3(version: game); + return new SAV3(version: game, language == LanguageID.Japanese); case FRLG: - return new SAV3(version: FR); + return new SAV3(version: FR, language == LanguageID.Japanese); case RS: - return new SAV3(version: R); + return new SAV3(version: R, language == LanguageID.Japanese); case RSE: - return new SAV3(version: E); + return new SAV3(version: E, language == LanguageID.Japanese); case CXD: case COLO: @@ -678,11 +690,12 @@ private static SaveFile GetBlankSAV(GameVersion game) /// /// Generation of the Save File. /// Trainer Name + /// Save file language to initialize for /// Save File for that generation. - public static SaveFile GetBlankSAV(int generation, string trainerName) + public static SaveFile GetBlankSAV(int generation, string trainerName, LanguageID language = LanguageID.English) { var ver = GameUtil.GetVersion(generation); - return GetBlankSAV(ver, trainerName); + return GetBlankSAV(ver, trainerName, language); } /// diff --git a/PKHeX.WinForms/MainWindow/Main.cs b/PKHeX.WinForms/MainWindow/Main.cs index 434a723be..adf3f44db 100644 --- a/PKHeX.WinForms/MainWindow/Main.cs +++ b/PKHeX.WinForms/MainWindow/Main.cs @@ -219,9 +219,11 @@ private void FormLoadInitialFiles(string[] args) private void LoadBlankSaveFile(GameVersion ver) { - var sav = SaveUtil.GetBlankSAV(ver, "PKHeX"); + var lang = SaveUtil.GetSafeLanguage(C_SAV?.SAV); + var tr = lang != LanguageID.Japanese ? "PKHeX" : "1337"; + var sav = SaveUtil.GetBlankSAV(ver, tr, lang); if (sav.Version == GameVersion.Invalid) // will fail to load - sav = SaveUtil.GetBlankSAV((GameVersion)GameInfo.VersionDataSource.Max(z => z.Value), "PKHeX"); + sav = SaveUtil.GetBlankSAV((GameVersion)GameInfo.VersionDataSource.Max(z => z.Value), tr, lang); OpenSAV(sav, null); C_SAV.SAV.Edited = false; // Prevents form close warning from showing until changes are made }