diff --git a/PKHeX.Core/PKM/PKX.cs b/PKHeX.Core/PKM/PKX.cs index 29f0c03c9..274f6ca12 100644 --- a/PKHeX.Core/PKM/PKX.cs +++ b/PKHeX.Core/PKM/PKX.cs @@ -823,6 +823,31 @@ public static string[] GetPKMExtensions(int MaxGeneration = Generation) return result.ToArray(); } + /// + /// Roughly detects the PKM format from the file's extension. + /// + /// File extension. + /// Preference if not a valid extension, usually the highest acceptable format. + /// Format hint that the file is. + public static int GetPKMFormatFromExtension(string ext, int prefer) + { + return ext?.Length > 1 + ? GetPKMFormatFromExtension(ext[ext.Length - 1], prefer) + : prefer; + } + /// + /// Roughly detects the PKM format from the file's extension. + /// + /// Last character of the file's extensio.n + /// Preference if not a valid extension, usually the highest acceptable format. + /// Format hint that the file is. + public static int GetPKMFormatFromExtension(char last, int prefer) + { + if ('1' <= last && last <= '9') + return last - '0'; + return last == 'x' ? 6 : prefer; + } + // Extensions /// /// Gets the Location Name for the diff --git a/PKHeX.WinForms/Controls/SAV Editor/SlotChangeManager.cs b/PKHeX.WinForms/Controls/SAV Editor/SlotChangeManager.cs index 8e36c98ce..b6465fbaa 100644 --- a/PKHeX.WinForms/Controls/SAV Editor/SlotChangeManager.cs +++ b/PKHeX.WinForms/Controls/SAV Editor/SlotChangeManager.cs @@ -3,7 +3,6 @@ using System.Diagnostics; using System.Drawing; using System.IO; -using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; using PKHeX.Core; @@ -235,8 +234,9 @@ private bool TryLoadFiles(string[] files, DragEventArgs e, bool noEgg) byte[] data = File.ReadAllBytes(file); MysteryGift mg = MysteryGift.GetMysteryGift(data, fi.Extension); - PKM temp = mg?.ConvertToPKM(SAV) ?? PKMConverter.GetPKMfromBytes(data, - prefer: fi.Extension.Length > 0 ? (fi.Extension.Last() - '0') & 0xF : SAV.Generation); + if (fi.Extension.Length > 0 || !int.TryParse(fi.Extension[fi.Extension.Length - 1].ToString(), out var prefer)) + prefer = SAV.Generation; + PKM temp = mg?.ConvertToPKM(SAV) ?? PKMConverter.GetPKMfromBytes(data, prefer: prefer); PKM pk = PKMConverter.ConvertToType(temp, SAV.PKMType, out string c); if (pk == null) diff --git a/PKHeX.WinForms/MainWindow/Main.cs b/PKHeX.WinForms/MainWindow/Main.cs index 0f67dceca..9cf47e792 100644 --- a/PKHeX.WinForms/MainWindow/Main.cs +++ b/PKHeX.WinForms/MainWindow/Main.cs @@ -576,7 +576,7 @@ private bool TryLoadMemoryCard(byte[] input, string path) } private bool TryLoadPKM(byte[] input, string ext) { - var pk = PKMConverter.GetPKMfromBytes(input, prefer: ext.Length > 0 ? (ext.Last() - '0') & 0xF : C_SAV.SAV.Generation); + var pk = PKMConverter.GetPKMfromBytes(input, prefer: PKX.GetPKMFormatFromExtension(ext, C_SAV.SAV.Generation)); if (pk == null) return false; diff --git a/PKHeX.WinForms/Subforms/PKM Editors/BatchEditor.cs b/PKHeX.WinForms/Subforms/PKM Editors/BatchEditor.cs index c0e76d1fc..2625710c1 100644 --- a/PKHeX.WinForms/Subforms/PKM Editors/BatchEditor.cs +++ b/PKHeX.WinForms/Subforms/PKM Editors/BatchEditor.cs @@ -276,7 +276,7 @@ private void ProcessFolder(IReadOnlyList files, IList continue; } - int format = fi.Extension.Length > 0 ? (fi.Extension.Last() - '0') & 0xF : SAV.Generation; + int format = PKX.GetPKMFormatFromExtension(fi.Extension, SAV.Generation); byte[] data = File.ReadAllBytes(file); var pkm = PKMConverter.GetPKMfromBytes(data, prefer: format); if (ProcessPKM(pkm, Filters, Instructions)) diff --git a/PKHeX.WinForms/Subforms/SAV_Database.cs b/PKHeX.WinForms/Subforms/SAV_Database.cs index cfdc5e1be..514dbbcef 100644 --- a/PKHeX.WinForms/Subforms/SAV_Database.cs +++ b/PKHeX.WinForms/Subforms/SAV_Database.cs @@ -338,7 +338,9 @@ private void LoadDatabase() { FileInfo fi = new FileInfo(file); if (!fi.Extension.Contains(".pk") || !PKX.IsPKM(fi.Length)) return; - var pk = PKMConverter.GetPKMfromBytes(File.ReadAllBytes(file), file, prefer: (fi.Extension.Last() - '0') & 0xF); + var data = File.ReadAllBytes(file); + var prefer = PKX.GetPKMFormatFromExtension(fi.Extension, SAV.Generation); + var pk = PKMConverter.GetPKMfromBytes(data, file, prefer); if (pk != null) dbTemp.Add(pk); }); diff --git a/Tests/PKHeX.Tests/Legality/LegalityTests.cs b/Tests/PKHeX.Tests/Legality/LegalityTests.cs index 607ed8618..910e6b5ad 100644 --- a/Tests/PKHeX.Tests/Legality/LegalityTests.cs +++ b/Tests/PKHeX.Tests/Legality/LegalityTests.cs @@ -49,7 +49,7 @@ private static void VerifyAll(string folder, string name, bool IsValid) Assert.IsTrue(PKX.IsPKM(fi.Length), $"Invalid file in {fi.Directory.Name} folder."); var data = File.ReadAllBytes(file); - var format = file[file.Length - 1] - '0'; + var format = PKX.GetPKMFormatFromExtension(file[file.Length - 1], -1); if (format > 10) format = 6; var pkm = PKMConverter.GetPKMfromBytes(data, prefer: format);