From 10d73d1bf3eb499d27c6dbce9d01168fcb25bb4e Mon Sep 17 00:00:00 2001 From: Kurt Date: Wed, 26 Sep 2018 21:05:06 -0700 Subject: [PATCH] Redirect eventflag r/w for frlg can't just re-call base.SetEventFlag with an adjusted flag ID since the exception checks max. just override the geteventflag method with a silly adjustment -- we can't be sure if Block2 is immediately after Block2, so just adjust the flag r/w to a different offset&flag when appropriate. fixes r/s badgeflag get/set, oops, meant to modify FRLG's value in the last commit. --- PKHeX.Core/Saves/SAV3.cs | 34 +++++++++++++++++++++++++++++++--- PKHeX.Core/Saves/SaveFile.cs | 4 ++-- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/PKHeX.Core/Saves/SAV3.cs b/PKHeX.Core/Saves/SAV3.cs index 56b155375..d83db06bf 100644 --- a/PKHeX.Core/Saves/SAV3.cs +++ b/PKHeX.Core/Saves/SAV3.cs @@ -156,7 +156,7 @@ public SAV3(byte[] data = null, GameVersion versionOverride = GameVersion.Any) OFS_PouchBerry = BlockOfs[1] + 0x054C; SeenFlagOffsets = new[] { PokeDex + 0x44, BlockOfs[1] + 0x5F8, BlockOfs[4] + 0xB98 }; EventFlag = BlockOfs[1] + 0xEE0; - EventConst = EventFlag + (EventFlagMax / 8); + EventConst = BlockOfs[2] + 0x80; // EventFlag + (EventFlagMax / 8); Daycare = BlockOfs[4] + 0x100; break; } @@ -381,6 +381,34 @@ public int PlayedFrames set => Data[BlockOfs[0] + 0x12] = (byte)value; } + public override bool GetEventFlag(int flagNumber) + { + if (flagNumber > EventFlagMax) + throw new ArgumentException($"Event Flag to get ({flagNumber}) is greater than max ({EventFlagMax})."); + + var start = EventFlag; + if (Version == GameVersion.FRLG && flagNumber >= 0x500) + { + flagNumber -= 0x500; + start = BlockOfs[2]; + } + return GetFlag(start + (flagNumber >> 3), flagNumber & 7); + } + + public override void SetEventFlag(int flagNumber, bool value) + { + if (flagNumber > EventFlagMax) + throw new ArgumentException($"Event Flag to set ({flagNumber}) is greater than max ({EventFlagMax})."); + + var start = EventFlag; + if (Version == GameVersion.FRLG && flagNumber >= 0x500) + { + flagNumber -= 0x500; + start = BlockOfs[2]; + } + SetFlag(start + (flagNumber >> 3), flagNumber & 7, value); + } + public int Badges { get @@ -408,9 +436,9 @@ private int BadgeFlagStart get { if (Version == GameVersion.FRLG) - return 800; // dec + return 0x820; if (Version == GameVersion.RS) - return 0x820; // hex + return 0x807; return 0x867; // emerald } } diff --git a/PKHeX.Core/Saves/SaveFile.cs b/PKHeX.Core/Saves/SaveFile.cs index 955438938..570dbf5b5 100644 --- a/PKHeX.Core/Saves/SaveFile.cs +++ b/PKHeX.Core/Saves/SaveFile.cs @@ -309,7 +309,7 @@ public ushort[] EventConsts /// /// Event Flag to check /// Flag is Set (true) or not Set (false) - public bool GetEventFlag(int flagNumber) + public virtual bool GetEventFlag(int flagNumber) { if (flagNumber > EventFlagMax) throw new ArgumentException($"Event Flag to get ({flagNumber}) is greater than max ({EventFlagMax})."); @@ -322,7 +322,7 @@ public bool GetEventFlag(int flagNumber) /// Event Flag to check /// Event Flag status to set /// Flag is Set (true) or not Set (false) - public void SetEventFlag(int flagNumber, bool value) + public virtual void SetEventFlag(int flagNumber, bool value) { if (flagNumber > EventFlagMax) throw new ArgumentException($"Event Flag to set ({flagNumber}) is greater than max ({EventFlagMax}).");