private void VerifyPIDShare(LegalityAnalysis pa, LegalityAnalysis ca) { const CheckIdentifier ident = PID; int gen = pa.Info.Generation; if (ca.Info.Generation != gen) { AddLine(pa.pkm, ca.pkm, "PID sharing across generations detected.", ident); return; } bool gbaNDS = 3 <= gen && gen <= 5; if (!gbaNDS) { AddLine(pa.pkm, ca.pkm, "PID sharing for 3DS-onward origin detected.", ident); return; } // eggs/mystery gifts shouldn't share with wild encounters var cenc = ca.Info.EncounterMatch; bool eggMysteryCurrent = cenc is EncounterEgg || cenc is MysteryGift; var penc = pa.Info.EncounterMatch; bool eggMysteryPrevious = penc is EncounterEgg || penc is MysteryGift; if (eggMysteryCurrent != eggMysteryPrevious) { AddLine(pa.pkm, ca.pkm, "PID sharing across RNG encounters detected.", ident); return; } }
private bool VerifyIDReuse(PKM pp, LegalityAnalysis pa, PKM cp, LegalityAnalysis ca) { if (pa.EncounterMatch is MysteryGift g1 && !g1.EggEncounter) { return(false); } if (ca.EncounterMatch is MysteryGift g2 && !g2.EggEncounter) { return(false); } const CheckIdentifier ident = CheckIdentifier.Trainer; // 32bit ID-SID should only occur for one generation // Trainer-ID-SID should only occur for one version if (IsSharedVersion(pp, pa, cp, ca)) { AddLine(pa.pkm, ca.pkm, "TID sharing across versions detected.", ident); return(true); } // ID-SID should only occur for one Trainer name if (pp.OT_Name != cp.OT_Name) { var severity = ca.Info.Generation == 4 ? Severity.Fishy : Severity.Invalid; AddLine(pa.pkm, ca.pkm, "TID sharing across different trainer names detected.", ident, severity); } return(false); }
private void AddLine(PKM first, PKM second, string msg, CheckIdentifier i, Severity s = Severity.Invalid) { string GetSummary(PKM pk) => $"[{pk.Box:00}, {pk.Slot:00}] {pk.FileName}"; var c = $"{msg}{Environment.NewLine}{GetSummary(first)}{Environment.NewLine}{GetSummary(second)}"; var chk = new CheckResult(s, c, i); Parse.Add(chk); }
public void TestDetermineIdentifier() { CheckIdentifier checkIdentifier = new CheckIdentifier(); Assert.IsFalse(checkIdentifier.IsIdentifier("")); Assert.IsTrue(checkIdentifier.IsEmpty()); Assert.IsFalse(checkIdentifier.IsIdentifier("1")); Assert.IsFalse(checkIdentifier.IsEmpty()); Assert.AreEqual(0, checkIdentifier.GetBadIndex()); Assert.IsFalse(checkIdentifier.IsIdentifier("1a")); Assert.AreEqual(0, checkIdentifier.GetBadIndex()); Assert.IsFalse(checkIdentifier.IsIdentifier("Ъ")); Assert.AreEqual(0, checkIdentifier.GetBadIndex()); Assert.IsFalse(checkIdentifier.IsIdentifier("aЪ")); Assert.AreEqual(1, checkIdentifier.GetBadIndex()); Assert.IsTrue(checkIdentifier.IsIdentifier("a")); Assert.IsTrue(checkIdentifier.IsIdentifier("a1")); Assert.IsTrue(checkIdentifier.IsIdentifier("A")); }
public void TestDetermineIdentifier() { CheckIdentifier checkIdentifier = new CheckIdentifier(); Assert.IsFalse(checkIdentifier.IsIdentifier("")); Assert.IsTrue(checkIdentifier.IsEmpty()); Assert.IsFalse(checkIdentifier.IsIdentifier("Ъ")); Assert.AreEqual(0, checkIdentifier.GetIncorrectIndex()); Assert.IsFalse(checkIdentifier.IsIdentifier("7")); Assert.IsFalse(checkIdentifier.IsEmpty()); Assert.AreEqual(0, checkIdentifier.GetIncorrectIndex()); Assert.IsFalse(checkIdentifier.IsIdentifier("4дверь")); Assert.AreEqual(0, checkIdentifier.GetIncorrectIndex()); Assert.IsFalse(checkIdentifier.IsIdentifier("7436дверь")); Assert.AreEqual(0, checkIdentifier.GetIncorrectIndex()); Assert.IsTrue(checkIdentifier.IsIdentifier("a")); Assert.IsTrue(checkIdentifier.IsIdentifier("aP")); Assert.IsTrue(checkIdentifier.IsIdentifier("A")); }
/// <summary> /// Adds a new Check parse value. /// </summary> /// <param name="s">Check severity</param> /// <param name="c">Check comment</param> /// <param name="i">Check type</param> internal void AddLine(Severity s, string c, CheckIdentifier i) => AddLine(new CheckResult(s, c, i));
internal CheckResult(CheckIdentifier i) { Identifier = i; }
internal CheckResult(Severity s, string c, CheckIdentifier i) { Judgement = s; Comment = c; Identifier = i; }
internal CheckResult(CheckIdentifier i) { Judgement = Severity.Valid; Comment = LegalityCheckStrings.L_AValid; Identifier = i; }
private void AddLine(Severity s, string c, CheckIdentifier i) { AddLine(new CheckResult(s, c, i)); }
internal CheckMoveResult(MoveSource m, int g, Severity s, string c, CheckIdentifier i) : base(s, c, i) { Source = m; Generation = g; }
internal CheckMoveResult(CheckMoveResult Org, Severity s, string c, CheckIdentifier i) : this(Org.Source, Org.Generation, s, c, i) { }
protected static CheckResult Get(string msg, Severity s, CheckIdentifier c) => new CheckResult(s, msg, c);
internal CheckMoveResult(MoveSource m, int g, CheckIdentifier i) : base(i) { Source = m; Generation = g; }
private void AddLine(PKM first, PKM second, string msg, CheckIdentifier i, Severity s = Severity.Invalid) {
internal CheckResult(CheckIdentifier i) { }
internal CheckMoveResult(CheckMoveResult Org, Severity s, string c, CheckIdentifier i) : base(s, c, i) { Source = Org?.Source ?? MoveSource.Unknown; Generation = Org?.Generation ?? 0; }
public CheckResult(Severity s, string c, CheckIdentifier i) { Judgement = s; Comment = c; Identifier = i; }
public CheckResult(CheckIdentifier i) { }
private void AddLine(Severity s, string c, CheckIdentifier i) { AddLine(new CheckResult(s, c, i)); }
protected static CheckResult GetValid(string msg, CheckIdentifier c) => Get(msg, Severity.Valid, c);