diff --git a/PKHeX.Core/Saves/SAV3.cs b/PKHeX.Core/Saves/SAV3.cs index 46800d4f7..284777b58 100644 --- a/PKHeX.Core/Saves/SAV3.cs +++ b/PKHeX.Core/Saves/SAV3.cs @@ -99,6 +99,11 @@ public SAV3(byte[] data = null, GameVersion versionOverride = GameVersion.Any) Array.Copy(Data, blockIndex * SIZE_BLOCK + ABO, Data, Box + (i - 5)*0xF80, chunkLength[i]); } + // Japanese games are limited to 5 character OT names; any unused characters are 0xFF. + // 5 for JP, 7 for INT. There's always 1 terminator, thus we can check 0x6-0x7 being 0xFFFF = INT + // OT name is stored at the top of the first block. + Japanese = BitConverter.ToInt16(data, BlockOfs[0] + 0x6) == 0; + switch (Version) { case GameVersion.RS: @@ -173,7 +178,6 @@ public override byte[] Write(bool DSV) // Configuration public override SaveFile Clone() { return new SAV3(Write(DSV:false), Version) {Japanese = Japanese}; } public override bool IndeterminateGame => Version == GameVersion.Unknown; - public override bool IndeterminateLanguage => true; // Unknown JP/International public override bool IndeterminateSubVersion => Version == GameVersion.FRLG; public override int SIZE_STORED => PKX.SIZE_3STORED; diff --git a/PKHeX.Core/Saves/SaveFile.cs b/PKHeX.Core/Saves/SaveFile.cs index f627fc60b..c7262e209 100644 --- a/PKHeX.Core/Saves/SaveFile.cs +++ b/PKHeX.Core/Saves/SaveFile.cs @@ -23,7 +23,6 @@ public abstract class SaveFile public bool Japanese { get; set; } public string PlayTimeString => $"{PlayedHours}ː{PlayedMinutes:00}ː{PlayedSeconds:00}"; // not : public virtual bool IndeterminateGame => false; - public virtual bool IndeterminateLanguage => false; public virtual bool IndeterminateSubVersion => false; public abstract string Extension { get; } public virtual string[] PKMExtensions => PKM.Extensions.Where(f => diff --git a/PKHeX.Core/Saves/SaveUtil.cs b/PKHeX.Core/Saves/SaveUtil.cs index 5820ff695..3be7d331b 100644 --- a/PKHeX.Core/Saves/SaveUtil.cs +++ b/PKHeX.Core/Saves/SaveUtil.cs @@ -209,14 +209,14 @@ public static GameVersion getIsG3SAV(byte[] data) if (BlockOrder.Count(v => v == 0) == BlockOrder.Length) continue; uint GameCode = BitConverter.ToUInt32(data, Block0 * 0x1000 + 0xAC + ofs); - if (GameCode == uint.MaxValue) - return GameVersion.Unknown; // what a hack - switch (GameCode) { case 0: return GameVersion.RS; case 1: return GameVersion.FRLG; - default: return GameVersion.E; + case uint.MaxValue: return GameVersion.Unknown; // what a hack + default: return BitConverter.ToUInt32(data, Block0 * 0x1000 + 0x1F4 + ofs) == 0 + ? GameVersion.RS + : GameVersion.E; } } return GameVersion.Invalid; diff --git a/PKHeX.WinForms/MainWindow/Main.cs b/PKHeX.WinForms/MainWindow/Main.cs index e96c5a7d5..f9380e834 100644 --- a/PKHeX.WinForms/MainWindow/Main.cs +++ b/PKHeX.WinForms/MainWindow/Main.cs @@ -887,17 +887,6 @@ private static bool sanityCheckSAV(ref SaveFile sav, string path) sav.Personal = dialog.Result == GameVersion.FR ? PersonalTable.FR : PersonalTable.LG; } - if (sav.IndeterminateLanguage) - { - // Japanese Save files are different. Get isJapanese - var drJP = WinFormsUtil.Prompt(MessageBoxButtons.YesNoCancel, - $"{sav.Version} Save File detected. Select language...", - "Yes: International" + Environment.NewLine + "No: Japanese"); - if (drJP == DialogResult.Cancel) - return false; - - sav.Japanese = drJP == DialogResult.No; - } return true; }