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"));
        }
Beispiel #5
0
        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"));
        }
Beispiel #6
0
 /// <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;
 }
Beispiel #9
0
 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));
 }
Beispiel #11
0
 internal CheckMoveResult(MoveSource m, int g, Severity s, string c, CheckIdentifier i)
     : base(s, c, i)
 {
     Source     = m;
     Generation = g;
 }
Beispiel #12
0
 internal CheckMoveResult(CheckMoveResult Org, Severity s, string c, CheckIdentifier i)
     : this(Org.Source, Org.Generation, s, c, i)
 {
 }
Beispiel #13
0
 protected static CheckResult Get(string msg, Severity s, CheckIdentifier c) => new CheckResult(s, msg, c);
Beispiel #14
0
 internal CheckMoveResult(MoveSource m, int g, CheckIdentifier i)
     : base(i)
 {
     Source     = m;
     Generation = g;
 }
Beispiel #15
0
 private void AddLine(PKM first, PKM second, string msg, CheckIdentifier i, Severity s = Severity.Invalid)
 {
Beispiel #16
0
 internal CheckResult(CheckIdentifier i) { }
Beispiel #17
0
 internal CheckMoveResult(CheckMoveResult Org, Severity s, string c, CheckIdentifier i)
     : base(s, c, i)
 {
     Source     = Org?.Source ?? MoveSource.Unknown;
     Generation = Org?.Generation ?? 0;
 }
Beispiel #18
0
 public CheckResult(Severity s, string c, CheckIdentifier i)
 {
     Judgement = s;
     Comment = c;
     Identifier = i;
 }
Beispiel #19
0
 public CheckResult(CheckIdentifier i)
 {
 }
Beispiel #20
0
 private void AddLine(Severity s, string c, CheckIdentifier i)
 {
     AddLine(new CheckResult(s, c, i));
 }
Beispiel #21
0
 protected static CheckResult GetValid(string msg, CheckIdentifier c) => Get(msg, Severity.Valid, c);