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; } }
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; }
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 } } ; }
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; }
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); }