From acfbef6cfaf352b57f7694a75898e8e9e54ac2a2 Mon Sep 17 00:00:00 2001 From: Kurt Date: Fri, 22 Jan 2021 20:28:54 -0800 Subject: [PATCH] Disallow raids matching if has mark Closes #3133 not an ideal solution, but the encounter matching API is kinda limited in deferred-invalid vs deferred-notIdeal. probably need to unify the match logic and generators so they can cache one secondary-check invalid --- .../EncounterStatic/EncounterStatic8Nest.cs | 3 +++ PKHeX.Core/Legality/Verifiers/MarkVerifier.cs | 7 ++----- PKHeX.Core/MysteryGifts/WC8.cs | 13 +++++++++++++ PKHeX.Core/PKM/PK8.cs | 10 ++++++++++ PKHeX.Core/Ribbons/IRibbonSetMark8.cs | 2 ++ PKHeX.Core/Ribbons/RibbonIndex.cs | 12 ++++++++++++ 6 files changed, 42 insertions(+), 5 deletions(-) diff --git a/PKHeX.Core/Legality/Encounters/EncounterStatic/EncounterStatic8Nest.cs b/PKHeX.Core/Legality/Encounters/EncounterStatic/EncounterStatic8Nest.cs index cf9a5b175..2b9514e5a 100644 --- a/PKHeX.Core/Legality/Encounters/EncounterStatic/EncounterStatic8Nest.cs +++ b/PKHeX.Core/Legality/Encounters/EncounterStatic/EncounterStatic8Nest.cs @@ -34,6 +34,9 @@ public override bool IsMatch(PKM pkm, DexLevel evo) if (VerifyCorrelation != null && !VerifyCorrelation(pkm, (T)this)) return false; + if (pkm is IRibbonSetMark8 m8 && m8.HasMark()) + return false; + return base.IsMatch(pkm, evo); } diff --git a/PKHeX.Core/Legality/Verifiers/MarkVerifier.cs b/PKHeX.Core/Legality/Verifiers/MarkVerifier.cs index 0376a9442..a84cad667 100644 --- a/PKHeX.Core/Legality/Verifiers/MarkVerifier.cs +++ b/PKHeX.Core/Legality/Verifiers/MarkVerifier.cs @@ -25,11 +25,8 @@ public override void Verify(LegalityAnalysis data) private void VerifyNoMarksPresent(LegalityAnalysis data, IRibbonIndex m) { - for (var x = RibbonIndex.MarkLunchtime; x <= RibbonIndex.MarkSlump; x++) - { - if (m.GetRibbon((int)x)) - data.AddLine(GetInvalid(string.Format(LRibbonMarkingFInvalid_0, x))); - } + if (m.HasMark(out var x)) + data.AddLine(GetInvalid(string.Format(LRibbonMarkingFInvalid_0, x))); } private void VerifyMarksPresent(LegalityAnalysis data, IRibbonIndex m) diff --git a/PKHeX.Core/MysteryGifts/WC8.cs b/PKHeX.Core/MysteryGifts/WC8.cs index 589e5fdf0..d9aaab4ea 100644 --- a/PKHeX.Core/MysteryGifts/WC8.cs +++ b/PKHeX.Core/MysteryGifts/WC8.cs @@ -186,6 +186,19 @@ public override int HeldItem private const int RibbonBytesCount = 0x20; private const int RibbonByteNone = 0xFF; // signed -1 + public bool HasMark() + { + for (int i = 0; i < RibbonBytesCount; i++) + { + var val = Data[RibbonBytesOffset + i]; + if (val == RibbonByteNone) + return false; + if ((RibbonIndex)val is > MarkLunchtime and < MarkSlump) + return true; + } + return false; + } + public byte GetRibbonAtIndex(int byteIndex) { if ((uint)byteIndex >= RibbonBytesCount) diff --git a/PKHeX.Core/PKM/PK8.cs b/PKHeX.Core/PKM/PK8.cs index 89bca8ba1..8dacf581a 100644 --- a/PKHeX.Core/PKM/PK8.cs +++ b/PKHeX.Core/PKM/PK8.cs @@ -347,6 +347,16 @@ public void Trade(ITrainerInfo tr, int Day = 1, int Month = 1, int Year = 2015) public bool RIB47_6 { get => FlagUtil.GetFlag(Data, 0x47, 6); set => FlagUtil.SetFlag(Data, 0x47, 6, value); } public bool RIB47_7 { get => FlagUtil.GetFlag(Data, 0x47, 7); set => FlagUtil.SetFlag(Data, 0x47, 7, value); } + public bool HasMark() + { + var d = Data; + if ((BitConverter.ToUInt16(d, 0x3A) & 0xFFE0) != 0) + return true; + if (BitConverter.ToUInt32(d, 0x40) != 0) + return true; + return (d[0x44] & 3) != 0; + } + public uint U48 { get => BitConverter.ToUInt32(Data, 0x48); set => BitConverter.GetBytes(value).CopyTo(Data, 0x48); } // 0x4C-0x4F unused diff --git a/PKHeX.Core/Ribbons/IRibbonSetMark8.cs b/PKHeX.Core/Ribbons/IRibbonSetMark8.cs index 09db05839..58fc1a443 100644 --- a/PKHeX.Core/Ribbons/IRibbonSetMark8.cs +++ b/PKHeX.Core/Ribbons/IRibbonSetMark8.cs @@ -48,6 +48,8 @@ public interface IRibbonSetMark8 bool RibbonMarkThorny { get; set; } bool RibbonMarkVigor { get; set; } bool RibbonMarkSlump { get; set; } + + bool HasMark(); } internal static partial class RibbonExtensions diff --git a/PKHeX.Core/Ribbons/RibbonIndex.cs b/PKHeX.Core/Ribbons/RibbonIndex.cs index f185edeaf..9190fe077 100644 --- a/PKHeX.Core/Ribbons/RibbonIndex.cs +++ b/PKHeX.Core/Ribbons/RibbonIndex.cs @@ -110,5 +110,17 @@ public static class RibbonIndexExtensions { public static bool GetRibbonIndex(this IRibbonIndex x, RibbonIndex r) => x.GetRibbon((int)r); public static void SetRibbonIndex(this IRibbonIndex x, RibbonIndex r, bool value = true) => x.SetRibbon((int)r, value); + + public static bool HasMark(this IRibbonIndex m, out RibbonIndex x) + { + for (x = RibbonIndex.MarkLunchtime; x <= RibbonIndex.MarkSlump; x++) + { + if (m.GetRibbon((int) x)) + return true; + } + + x = (RibbonIndex)0xFF; + return false; + } } }