Пример #1
0
        private static IEnumerable <SeedFrame> GetComplexLockFrame(FrameCache cache, int ctr, NPCLock l, NPCLock prior)
        {
            // Since the prior(next) lock is generated 7+2*n frames after, the worst case break is 7 frames after the PID.
            // Continue reversing until a sequential generation case is found.

            // Check

            int start = ctr;

            while (true)
            {
                int p7 = ctr - 7;

                if (p7 > start)
                {
                    uint cid = cache[p7 + 1] << 16 | cache[p7];
                    if (MatchesLock(prior, cid, PKX.GetGenderFromPID(prior.Species, cid)))
                    {
                        yield break;
                    }
                }
                uint pid = cache[ctr + 1] << 16 | cache[ctr];
                if (MatchesLock(l, pid, PKX.GetGenderFromPID(l.Species, pid)))
                {
                    yield return new SeedFrame {
                               FrameID = ctr + 6, PID = pid
                    }
                }
                ;

                ctr += 2;
            }
        }
Пример #2
0
 private static bool IsValidFixedGenderFromBiGender(PKM pkm, int original)
 {
     var current = pkm.Gender;
     if (current == 2) // shedinja, genderless
         return true;
     var gender = PKX.GetGenderFromPID(original, pkm.EncryptionConstant);
     return gender == current;
 }
Пример #3
0
        private static IEnumerable <SeedFrame> GetSingleLockFrame(FrameCache cache, int ctr, NPCLock l)
        {
            uint pid = cache[ctr + 1] << 16 | cache[ctr];

            if (MatchesLock(l, pid, PKX.GetGenderFromPID(l.Species, pid)))
            {
                yield return new SeedFrame {
                           FrameID = ctr + 6, PID = pid
                }
            }
            ;
        }
Пример #4
0
        private static void GetCuteCharmGenderSpecies(PKM pk, uint pid, out int genderValue, out int species)
        {
            // There are some edge cases when the gender ratio changes across evolutions.
            species = pk.Species;
            if (species == 292)
            {
                species     = 290; // Nincada evo chain travels from M/F -> Genderless Shedinja
                genderValue = PKX.GetGenderFromPID(290, pid);
                return;
            }

            switch (species)
            {
            // These evolved species cannot be encountered with cute charm.
            // 100% fixed gender does not modify PID; override this with the encounter species for correct calculation.
            // We can assume the re-mapped species's [gender ratio] is what was encountered.

            case 413: species = 412; break;     // Wormadam -> Burmy

            case 414: species = 412; break;     // Mothim -> Burmy

            case 416: species = 415; break;     // Vespiquen -> Combee

            case 475: species = 281; break;     // Gallade -> Kirlia/Ralts

            case 478: species = 361; break;     // Froslass -> Snorunt

            // Changed gender ratio (25% M -> 50% M) needs special treatment.
            // Double check the encounter species with IsCuteCharm4Valid afterwards.
            case 183:
            case 184:               // Azurill & Marill/Azumarill collision
                if (IsCuteCharmAzurillMale(pid))
                {
                    species     = 298;
                    genderValue = 0;
                    return;
                }
                break;
            }
            genderValue = pk.Gender;
        }
Пример #5
0
        private bool IsValidGenderPID(LegalityAnalysis data)
        {
            var  pkm         = data.pkm;
            bool genderValid = pkm.IsGenderValid();

            if (!genderValid)
            {
                if (pkm.Format == 4 && pkm.Species == 292) // Shedinja glitch
                {
                    // should match original gender
                    var gender = PKX.GetGenderFromPIDAndRatio(pkm.PID, 0x7F); // 50M-50F
                    if (gender == pkm.Gender)
                    {
                        return(true);
                    }
                }
                else if (pkm.Format > 5 && (pkm.Species == 183 || pkm.Species == 184)) // Azurill/Marill Gender Ratio Change
                {
                    var gv = pkm.PID & 0xFF;
                    if (gv > 63 && pkm.Gender == 1) // evolved from azurill after transferring to keep gender
                    {
                        return(true);
                    }
                }
                return(false);
            }

            // check for mixed->fixed gender incompatibility by checking the gender of the original species
            var EncounterMatch = data.EncounterMatch;

            if (Legal.FixedGenderFromBiGender.Contains(EncounterMatch.Species) && pkm.Gender != 2) // shedinja
            {
                var gender = PKX.GetGenderFromPID(EncounterMatch.Species, pkm.EncryptionConstant);
                if (gender != pkm.Gender)  // gender must not be different from original
                {
                    return(false);
                }
            }
            return(true);
        }