diff --git a/PKHeX.Core/Editing/Saves/Editors/EventOld/EventWorkspace.cs b/PKHeX.Core/Editing/Saves/Editors/EventOld/EventWorkspace.cs index 85e1f0bd8..df57f9979 100644 --- a/PKHeX.Core/Editing/Saves/Editors/EventOld/EventWorkspace.cs +++ b/PKHeX.Core/Editing/Saves/Editors/EventOld/EventWorkspace.cs @@ -10,13 +10,13 @@ public sealed class EventWorkspace where TSave : class, IEventFlag public readonly TWork[] Values; public readonly EventLabelCollection Labels; - public EventWorkspace(TSave sav) + public EventWorkspace(TSave obj, GameVersion version) { - SAV = sav; - Flags = sav.GetEventFlags(); - Values = sav.GetAllEventWork(); + SAV = obj; + Flags = obj.GetEventFlags(); + Values = obj.GetAllEventWork(); - var game = GetResourceSuffix(sav); + var game = GetResourceSuffix(version); Labels = new EventLabelCollection(game, Flags.Length, Values.Length); } @@ -24,11 +24,11 @@ public void Save() { SAV.SetEventFlags(Flags); SAV.SetAllEventWork(Values); - if (SAV is SAV7SM s7) // Ensure Magearna event flag has magic constant + if (SAV is EventWork7SM s7) // Ensure Magearna event flag has magic constant s7.UpdateMagearnaConstant(); } - private static string GetResourceSuffix(TSave version) => GetVersion(version) switch + private static string GetResourceSuffix(GameVersion version) => version switch { X or Y or XY => "xy", OR or AS or ORAS => "oras", @@ -46,11 +46,4 @@ public void Save() GD or SI or GS => "gs", _ => throw new ArgumentOutOfRangeException(nameof(version), version, null), }; - - private static GameVersion GetVersion(TSave version) - { - if (version is IVersion v) - return v.Version; - return Invalid; - } } diff --git a/PKHeX.Core/Game/Enums/GCVersion.cs b/PKHeX.Core/Game/Enums/GCVersion.cs index 52218c8c0..92f387375 100644 --- a/PKHeX.Core/Game/Enums/GCVersion.cs +++ b/PKHeX.Core/Game/Enums/GCVersion.cs @@ -59,6 +59,6 @@ public static class GCVersionExtensions GCVersion.FR => GameVersion.FR, GCVersion.LG => GameVersion.LG, GCVersion.CXD => GameVersion.CXD, - _ => GameVersion.Unknown, + _ => GameVersion.Invalid, }; } diff --git a/PKHeX.Core/Game/Enums/GameVersion.cs b/PKHeX.Core/Game/Enums/GameVersion.cs index 88283c13b..3dcbe4df9 100644 --- a/PKHeX.Core/Game/Enums/GameVersion.cs +++ b/PKHeX.Core/Game/Enums/GameVersion.cs @@ -7,7 +7,6 @@ public enum GameVersion : byte { #region Indicators for method empty arguments & result indication. Not stored values. Any = 0, - Unknown = byte.MaxValue - 1, Invalid = byte.MaxValue, #endregion diff --git a/PKHeX.Core/Legality/LearnSource/Verify/LearnVerifierEgg.cs b/PKHeX.Core/Legality/LearnSource/Verify/LearnVerifierEgg.cs index c27110df8..4567efe7a 100644 --- a/PKHeX.Core/Legality/LearnSource/Verify/LearnVerifierEgg.cs +++ b/PKHeX.Core/Legality/LearnSource/Verify/LearnVerifierEgg.cs @@ -29,7 +29,7 @@ private static void VerifyFromEncounter(Span result, ReadOnlySpan= GameVersion.Unknown)) + else if (enc.Version is not (GameVersion.Any or >= GameVersion.Invalid)) { var ls = GameData.GetLearnSource(enc.Version); var learn = ls.GetLearnset(enc.Species, enc.Form); diff --git a/PKHeX.Core/PKM/Interfaces/Metadata/IVersion.cs b/PKHeX.Core/PKM/Interfaces/Metadata/IVersion.cs index 268d0c410..a229e8c47 100644 --- a/PKHeX.Core/PKM/Interfaces/Metadata/IVersion.cs +++ b/PKHeX.Core/PKM/Interfaces/Metadata/IVersion.cs @@ -15,11 +15,18 @@ public static partial class Extensions { private static bool CanBeReceivedBy(this IVersion version, GameVersion game) => version.Version.Contains(game); + /// + /// Gets a compatible saved version value for the given . + /// + /// Object requesting a saved version. + /// Preferred version to use, if possible. public static GameVersion GetCompatibleVersion(this IVersion version, GameVersion prefer) { - if (version.CanBeReceivedBy(prefer) || version.Version == GameVersion.Any) - return prefer; - return version.GetSingleVersion(); + if (!version.CanBeReceivedBy(prefer)) + return version.GetSingleVersion(); + if (!prefer.IsValidSavedVersion()) + return prefer.GetSingleVersion(); + return prefer; } public static GameVersion GetSingleVersion(this IVersion version) diff --git a/PKHeX.Core/Saves/SAV7b.cs b/PKHeX.Core/Saves/SAV7b.cs index a51c2bcd9..42bce2c5c 100644 --- a/PKHeX.Core/Saves/SAV7b.cs +++ b/PKHeX.Core/Saves/SAV7b.cs @@ -18,6 +18,8 @@ public sealed class SAV7b : SAV_BEEF, ISaveBlock7b, IGameSync, IMysteryGiftStora protected override int SIZE_PARTY => PokeCrypto.SIZE_6PARTY; public override int SIZE_BOXSLOT => PokeCrypto.SIZE_6PARTY; public override byte[] GetDataForBox(PKM pk) => pk.EncryptedPartyData; + public override PB7 GetBoxSlot(int offset) => GetDecryptedPKM(Data.AsSpan(offset, SIZE_PARTY).ToArray()); // party format in boxes! + public override PB7 GetDecryptedPKM(byte[] data) => GetPKM(DecryptPKM(data)); public override PersonalTable7GG Personal => PersonalTable.GG; public override ReadOnlySpan HeldItems => Legal.HeldItems_GG; diff --git a/PKHeX.Core/Saves/SAV8BS.cs b/PKHeX.Core/Saves/SAV8BS.cs index f5ed326b7..b45667e07 100644 --- a/PKHeX.Core/Saves/SAV8BS.cs +++ b/PKHeX.Core/Saves/SAV8BS.cs @@ -100,7 +100,7 @@ private static Memory GetSafe(Memory src, int ofs, int len) private void Initialize() { Box = 0x14EF4; - Party = 1; + Party = 0; ReloadBattleTeams(); TeamSlots = BoxLayout.TeamSlots; @@ -270,6 +270,7 @@ public override int SetString(Span destBuffer, ReadOnlySpan value, i // Storage public override int GetPartyOffset(int slot) => Party + (SIZE_PARTY * slot); + protected override Span PartyBuffer => PartyInfo.Data; public override int GetBoxOffset(int box) => Box + (SIZE_PARTY * box * 30); public int GetBoxWallpaper(int box) => BoxLayout.GetBoxWallpaper(box); public void SetBoxWallpaper(int box, int value) => BoxLayout.SetBoxWallpaper(box, value); diff --git a/PKHeX.Core/Saves/Substructures/Gen7/EventWork7.cs b/PKHeX.Core/Saves/Substructures/Gen7/EventWork7.cs index e8365eb63..22247da20 100644 --- a/PKHeX.Core/Saves/Substructures/Gen7/EventWork7.cs +++ b/PKHeX.Core/Saves/Substructures/Gen7/EventWork7.cs @@ -58,6 +58,8 @@ public sealed class EventWork7SM(SAV7SM sav, Memory raw) : EventWork7(sav, protected override Memory FameSpan => Raw.Slice(OffsetPostData, HallOfFame7.SIZE); public const int MagearnaEventFlag = 3100; + + public void UpdateMagearnaConstant() => ((SAV7SM)SAV).UpdateMagearnaConstant(); } public sealed class EventWork7USUM(SAV7USUM sav, Memory raw) : EventWork7(sav, raw) diff --git a/PKHeX.Core/Saves/Util/Recognition/SaveHandlerGCI.cs b/PKHeX.Core/Saves/Util/Recognition/SaveHandlerGCI.cs index 7e4221053..bce53cdca 100644 --- a/PKHeX.Core/Saves/Util/Recognition/SaveHandlerGCI.cs +++ b/PKHeX.Core/Saves/Util/Recognition/SaveHandlerGCI.cs @@ -64,7 +64,7 @@ private static bool IsGameMatchHeader(ReadOnlySpan data, ReadOnlySpan /// 4 character game code string - /// Magic version ID enumeration; if no match. + /// Magic version ID enumeration; if no match. public static GameVersion GetGameCode(ReadOnlySpan gameCode) { if (IsGameMatchHeader(HEADER_COLO, gameCode)) @@ -74,6 +74,6 @@ public static GameVersion GetGameCode(ReadOnlySpan gameCode) if (IsGameMatchHeader(HEADER_RSBOX, gameCode)) return GameVersion.RSBOX; - return GameVersion.Unknown; + return GameVersion.Invalid; } } diff --git a/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.cs b/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.cs index 21085d9e2..75720bb77 100644 --- a/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.cs +++ b/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.cs @@ -268,7 +268,7 @@ private void ResetDaycare() } else { - L_SlotEXP[i].Visible = TB_SlotEXP[i].Visible = true; + L_SlotEXP[i].Visible = TB_SlotEXP[i].Visible = false; } bool occ = s.IsDaycareOccupied(i); @@ -276,6 +276,7 @@ private void ResetDaycare() if (occ) // If Occupied { L_SlotOccupied[i].Text = $"{i + 1}: ✓"; + UpdateSlot(i); } else { @@ -627,8 +628,8 @@ private void B_OpenEventFlags_Click(object sender, EventArgs e) SAV1 s => (Form)new SAV_EventReset1(s), SAV7b s => new SAV_EventWork(s), SAV8BS s => new SAV_FlagWork8b(s), - IEventFlag37 g37 => new SAV_EventFlags(g37), - IEventFlagProvider37 p => new SAV_EventFlags(p.EventWork), + IEventFlag37 g37 => new SAV_EventFlags(g37, SAV.Version), + IEventFlagProvider37 p => new SAV_EventFlags(p.EventWork, SAV.Version), SAV2 s => new SAV_EventFlags2(s), _ => throw new Exception(), }; diff --git a/PKHeX.WinForms/Subforms/Save Editors/SAV_EventFlags.cs b/PKHeX.WinForms/Subforms/Save Editors/SAV_EventFlags.cs index 5ea57d16f..6408dbca3 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/SAV_EventFlags.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/SAV_EventFlags.cs @@ -16,12 +16,12 @@ public sealed partial class SAV_EventFlags : Form private bool editing; - public SAV_EventFlags(IEventFlag37 sav) + public SAV_EventFlags(IEventFlag37 sav, GameVersion version) { InitializeComponent(); WinFormsUtil.TranslateInterface(this, Main.CurrentLanguage); - var editor = Editor = new EventWorkspace(sav); + var editor = Editor = new EventWorkspace(sav, version); DragEnter += Main_DragEnter; DragDrop += Main_DragDrop; @@ -40,7 +40,7 @@ public SAV_EventFlags(IEventFlag37 sav) dgv.ResumeLayout(); TLP_Const.ResumeLayout(); - Text = $"{Text} ({((IVersion)sav).Version})"; + Text = $"{Text} ({version})"; if (CB_Stats.Items.Count > 0) { diff --git a/PKHeX.WinForms/Subforms/Save Editors/SAV_EventFlags2.cs b/PKHeX.WinForms/Subforms/Save Editors/SAV_EventFlags2.cs index 3adf75360..357a48482 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/SAV_EventFlags2.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/SAV_EventFlags2.cs @@ -21,7 +21,7 @@ public SAV_EventFlags2(SAV2 sav) InitializeComponent(); WinFormsUtil.TranslateInterface(this, Main.CurrentLanguage); - var editor = Editor = new EventWorkspace(sav); + var editor = Editor = new EventWorkspace(sav, sav.Version); DragEnter += Main_DragEnter; DragDrop += Main_DragDrop;