PKHeX/PKHeX.Core/Legality/Verifiers/MarkingVerifier.cs

75 lines
2.3 KiB
C#
Raw Normal View History

using static PKHeX.Core.LegalityCheckStrings;
2022-06-04 13:21:18 -07:00
using static PKHeX.Core.CheckIdentifier;
namespace PKHeX.Core;
/// <summary>
/// Verifies the <see cref="IAppliedMarkings"/>.
2022-06-04 13:21:18 -07:00
/// </summary>
public sealed class MarkingVerifier : Verifier
{
protected override CheckIdentifier Identifier => Marking;
public override void Verify(LegalityAnalysis data)
{
var pk = data.Entity;
VerifyFavoriteMark(data, pk);
VerifyMarkValue(data, pk);
2022-06-04 13:21:18 -07:00
}
private void VerifyFavoriteMark(LegalityAnalysis data, PKM pk)
2022-06-04 13:21:18 -07:00
{
// Can only be toggled on in LGP/E, and is retained via transfer to HOME and into other games.
if (pk is IFavorite { IsFavorite: true } && !data.Info.EvoChainsAllGens.HasVisitedLGPE)
2022-06-04 13:21:18 -07:00
data.AddLine(GetInvalid(LFavoriteMarkingUnavailable));
}
private void VerifyMarkValue(LegalityAnalysis data, PKM pk)
2022-06-04 13:21:18 -07:00
{
// Eggs can have markings applied.
switch (pk)
2022-06-04 13:21:18 -07:00
{
case IAppliedMarkings3 m4:
VerifyMarkValueSingle(data, m4, m4.MarkingValue);
2022-06-04 13:21:18 -07:00
return;
case IAppliedMarkings7 m7:
VerifyMarkValueDual(data, m7, m7.MarkingValue);
2022-06-04 13:21:18 -07:00
return;
}
}
private const int Single4 = 0b_1111;
private const int Single6 = 0b_111111;
private const int Dual6 = 0b_1111_1111_1111;
private void VerifyMarkValueDual(LegalityAnalysis data, IAppliedMarkings7 pk, ushort mv)
2022-06-04 13:21:18 -07:00
{
if (mv == 0)
return;
2022-06-04 13:21:18 -07:00
if (mv > Dual6)
data.AddLine(GetInvalid(LMarkValueUnusedBitsPresent));
var count = pk.MarkingCount;
2022-06-04 13:21:18 -07:00
for (int i = 0; i < count; i++)
{
var value = pk.GetMarking(i);
if (value is not (0 or MarkingColor.Blue or MarkingColor.Pink))
2022-06-04 13:21:18 -07:00
data.AddLine(GetInvalid(string.Format(LMarkValueOutOfRange_0, i)));
}
}
private void VerifyMarkValueSingle(LegalityAnalysis data, IAppliedMarkings3 pk, byte mv)
2022-06-04 13:21:18 -07:00
{
if (mv == 0)
return;
if (!IsMarkValueValid3456(pk, mv))
2022-06-04 13:21:18 -07:00
data.AddLine(GetInvalid(LMarkValueUnusedBitsPresent));
}
private static bool IsMarkValueValid3456(IAppliedMarkings3 pk, int value)
2022-06-04 13:21:18 -07:00
{
var max = pk is IAppliedMarkings4 ? Single6 : Single4;
2022-06-04 13:21:18 -07:00
return value <= max;
}
}