diff --git a/pkNX.Game/File/GameFileMapping.cs b/pkNX.Game/File/GameFileMapping.cs index bba8e19f..0a38a4ec 100644 --- a/pkNX.Game/File/GameFileMapping.cs +++ b/pkNX.Game/File/GameFileMapping.cs @@ -62,8 +62,7 @@ public static IReadOnlyCollection GetMapping(GameVersion game GameVersion.UM => UM, GameVersion.XY => XY, GameVersion.GG => GG, - GameVersion.SW => SW, - GameVersion.SH => SH, + GameVersion.SWSH => SWSH, GameVersion.ORASDEMO => AO, GameVersion.ORAS => AO, GameVersion.SMDEMO => SMDEMO, @@ -344,12 +343,14 @@ public static IReadOnlyCollection GetMapping(GameVersion game // Cutscenes bin\demo // Models bin\archive\pokemon // pretty much everything is obviously named :) + #endregion }; + #region Gen 8 /// /// Sword /// - private static readonly GameFileReference[] SW = + private static readonly GameFileReference[] SWSH = { new(GameFile.TrainerData, "bin", "trainer", "trainer_data"), new(GameFile.TrainerPoke, "bin", "trainer", "trainer_poke"), @@ -403,11 +404,6 @@ public static IReadOnlyCollection GetMapping(GameVersion game // Models bin\archive\pokemon // pretty much everything is obviously named :) }; - - /// - /// Shield - /// - private static readonly GameFileReference[] SH = SW; #endregion #region Split Versions diff --git a/pkNX.Game/GameLocation.cs b/pkNX.Game/GameLocation.cs index 8eee0f48..cbc2924f 100644 --- a/pkNX.Game/GameLocation.cs +++ b/pkNX.Game/GameLocation.cs @@ -89,22 +89,16 @@ private static GameVersion GetGameFromCount(int fileCount, string romfs, string return GameVersion.US; return GameVersion.UM; } + case FILECOUNT_GG: return GameVersion.GG; case FILECOUNT_SWSH: case FILECOUNT_SWSH_1: case FILECOUNT_SWSH_2: - return GameVersion.SW; // todo: differentiate between SW/SH case FILECOUNT_SWSH_3: - { - // Unlike SM and USUM, the file structure between these two games are identical, - // so we identify the game by the size of the main binary. - var main = Path.Combine(exefs, "main"); - if (new FileInfo(main).Length is 21163058 or 21163221) // 1.3.0 vs 1.3.1 - return GameVersion.SW; - return GameVersion.SH; - } + return GameVersion.SWSH; + default: return GameVersion.Invalid; } diff --git a/pkNX.Game/GameManager.cs b/pkNX.Game/GameManager.cs index 7bba8d55..ff596376 100644 --- a/pkNX.Game/GameManager.cs +++ b/pkNX.Game/GameManager.cs @@ -114,8 +114,7 @@ public static GameManager GetManager(GameLocation loc, int language) return loc.Game switch { GameVersion.GG => new GameManagerGG(loc, language), - GameVersion.SW => new GameManagerSWSH(loc, language), - GameVersion.SH => new GameManagerSWSH(loc, language), + GameVersion.SWSH => new GameManagerSWSH(loc, language), _ => throw new ArgumentException(nameof(loc.Game)) }; } diff --git a/pkNX.Game/GameManagerGG.cs b/pkNX.Game/GameManagerGG.cs index 1176a7bc..686ff32d 100644 --- a/pkNX.Game/GameManagerGG.cs +++ b/pkNX.Game/GameManagerGG.cs @@ -1,4 +1,5 @@ -using System.IO; +using System; +using System.IO; using System.Linq; using pkNX.Containers; using pkNX.Structures; @@ -8,19 +9,14 @@ namespace pkNX.Game public class GameManagerGG : GameManager { public GameManagerGG(GameLocation rom, int language) : base(rom, language) { } - private GameVersion ActualGame; - public string TitleID => ActualGame == GameVersion.GP ? Pikachu : Eevee; - private const string Pikachu = "010003F003A34000"; - private const string Eevee = "0100187003A36000"; + private string Main => Path.Combine(PathExeFS, "main.npdm"); + private GameVersion ActualGame => TitleID == "010003F003A34000" ? GameVersion.GP : GameVersion.GE; + private string TitleID => BitConverter.ToString(File.ReadAllBytes(Main).Skip(0x290).Take(0x08).Reverse().ToArray()).Replace("-", ""); protected override void SetMitm() { var basePath = Path.GetDirectoryName(ROM.RomFS); - var eeveevidpath = Path.Combine(ROM.RomFS, Path.Combine("bin", "movies", "EEVEE_GO")); - bool eevee = Directory.Exists(eeveevidpath); - ActualGame = eevee ? GameVersion.GE : GameVersion.GP; var redirect = Path.Combine(basePath, TitleID); - // get pikachu vs eevee FileMitm.SetRedirect(basePath, redirect); } diff --git a/pkNX.Game/GameManagerSWSH.cs b/pkNX.Game/GameManagerSWSH.cs index 3336e9cd..842a7a87 100644 --- a/pkNX.Game/GameManagerSWSH.cs +++ b/pkNX.Game/GameManagerSWSH.cs @@ -9,9 +9,9 @@ namespace pkNX.Game public class GameManagerSWSH : GameManager { public GameManagerSWSH(GameLocation rom, int language) : base(rom, language) { } - public string TitleID => Game == GameVersion.SW ? Sword : Shield; - private const string Sword = "0100ABF008968000"; - private const string Shield = "01008DB008C2C000"; + private string Main => Path.Combine(PathExeFS, "main.npdm"); + private GameVersion ActualGame => TitleID == "0100ABF008968000" ? GameVersion.SW : GameVersion.SH; + private string TitleID => BitConverter.ToString(File.ReadAllBytes(Main).Skip(0x290).Take(0x08).Reverse().ToArray()).Replace("-", ""); protected override void SetMitm() { diff --git a/pkNX.Structures/GameUtil.cs b/pkNX.Structures/GameUtil.cs index d79080cc..2724d83b 100644 --- a/pkNX.Structures/GameUtil.cs +++ b/pkNX.Structures/GameUtil.cs @@ -126,7 +126,7 @@ public static int GetMaxSpeciesID(this GameVersion game) if (Gen4.Contains(game)) return 493; if (Gen5.Contains(game)) return 649; if (Gen6.Contains(game)) return Legal.MaxSpeciesID_6; - if (Gen7.Contains(game)) + if (Gen7.Contains(game) || Gen7b.Contains(game)) { if (SM.Contains(game)) return 802; diff --git a/pkNX.WinForms/MainEditor/EditorGG.cs b/pkNX.WinForms/MainEditor/EditorGG.cs index 19fd0edc..de3f6735 100644 --- a/pkNX.WinForms/MainEditor/EditorGG.cs +++ b/pkNX.WinForms/MainEditor/EditorGG.cs @@ -218,7 +218,8 @@ void Randomize() file[0] = objs.SelectMany(z => z.Write()).ToArray(); } - public void EditWild() => PopWildEdit(Game == GameVersion.GP ? GameFile.WildData1 : GameFile.WildData2); + public void EditWild_GP() => PopWildEdit(GameFile.WildData1); + public void EditWild_GE() => PopWildEdit(GameFile.WildData2); private void PopWildEdit(GameFile type) { diff --git a/pkNX.WinForms/MainEditor/EditorSWSH.cs b/pkNX.WinForms/MainEditor/EditorSWSH.cs index 2dbf24b7..686456e0 100644 --- a/pkNX.WinForms/MainEditor/EditorSWSH.cs +++ b/pkNX.WinForms/MainEditor/EditorSWSH.cs @@ -186,7 +186,8 @@ public void NotWorking_EditTypeChart() FileMitm.WriteAllBytes(path, data); } - public void EditWild() => PopWildEdit(Game == GameVersion.SW ? "k" : "t"); + public void EditWild_SW() => PopWildEdit("k"); + public void EditWild_SH() => PopWildEdit("t"); private void PopWildEdit(string file) {