private CheckResult VerifyForm(LegalityAnalysis data) { var pkm = data.pkm; var PersonalInfo = data.PersonalInfo; int count = PersonalInfo.FormeCount; var form = pkm.AltForm; if (count <= 1 && form == 0) { return(VALID); // no forms to check } var species = pkm.Species; var EncounterMatch = data.EncounterMatch; var Info = data.Info; if (!PersonalInfo.IsFormeWithinRange(form) && !AltFormInfo.IsValidOutOfBoundsForme(species, form, Info.Generation)) { return(GetInvalid(string.Format(LFormInvalidRange, count - 1, form))); } if (EncounterMatch is EncounterSlot w && w.Area.Type == SlotType.FriendSafari) { VerifyFormFriendSafari(data); }
protected virtual bool IsMatchForm(PKM pkm, DexLevel evo) { if (SkipFormCheck) { return(true); } return(Form == evo.Form || AltFormInfo.IsFormChangeable(Species, Form, pkm.AltForm, pkm.Format)); }
private static IReadOnlyList <string> GetSaveFileErrata(this SaveFile sav, PKM pkm, IBasicStrings strings) { var errata = new List <string>(); ushort held = (ushort)pkm.HeldItem; if (sav.Generation > 1 && held != 0) { string?msg = null; if (held > sav.MaxItemID) { msg = MsgIndexItemGame; } else if (!pkm.CanHoldItem(sav.HeldItems)) { msg = MsgIndexItemHeld; } if (msg != null) { var itemstr = GameInfo.Strings.GetItemStrings(pkm.Format, (GameVersion)pkm.Version); errata.Add($"{msg} {(held >= itemstr.Count ? held.ToString() : itemstr[held])}"); } } if (pkm.Species > strings.Species.Count) { errata.Add($"{MsgIndexSpeciesRange} {pkm.Species}"); } else if (sav.MaxSpeciesID < pkm.Species) { errata.Add($"{MsgIndexSpeciesGame} {strings.Species[pkm.Species]}"); } if (!sav.Personal[pkm.Species].IsFormeWithinRange(pkm.AltForm) && !AltFormInfo.IsValidOutOfBoundsForme(pkm.Species, pkm.AltForm, pkm.GenNumber)) { errata.Add(string.Format(LegalityCheckStrings.LFormInvalidRange, Math.Max(0, sav.Personal[pkm.Species].FormeCount - 1), pkm.AltForm)); } if (pkm.Moves.Any(m => m > strings.Move.Count)) { errata.Add($"{MsgIndexMoveRange} {string.Join(", ", pkm.Moves.Where(m => m > strings.Move.Count).Select(m => m.ToString()))}"); } else if (pkm.Moves.Any(m => m > sav.MaxMoveID)) { errata.Add($"{MsgIndexMoveGame} {string.Join(", ", pkm.Moves.Where(m => m > sav.MaxMoveID).Select(m => strings.Move[m]))}"); } if (pkm.Ability > strings.Ability.Count) { errata.Add($"{MsgIndexAbilityRange} {pkm.Ability}"); } else if (pkm.Ability > sav.MaxAbilityID) { errata.Add($"{MsgIndexAbilityGame} {strings.Ability[pkm.Ability]}"); } return(errata); }
private static bool IsDisallowedDuplicateForm(int species, int f) { if (AltFormInfo.IsBattleOnlyForm(species, f, 8)) { return(true); } if (AltFormInfo.IsFusedForm(species, f, 8)) { return(true); } return(false); }
protected override bool IsMatchForm(PKM pkm, DexLevel evo) { if (SkipFormCheck) { return(true); } if (AltFormInfo.IsTotemForm(Species, Form, Generation)) { var expectForm = pkm.Format == 7 ? Form : AltFormInfo.GetTotemBaseForm(Species, Form); return(expectForm == evo.Form); } return(Form == evo.Form || AltFormInfo.IsFormChangeable(Species, Form, pkm.AltForm, pkm.Format)); }
private static bool NoHatchFromEggForm(int species, int form, int gen) { if (form == 0) { return(false); } if (AltFormInfo.IsTotemForm(species, form, gen)) { return(true); } if (species == (int)Species.Pichu) { return(true); // can't get Spiky Ear Pichu eggs } if (species == (int)Species.Sinistea || species == (int)Species.Polteageist) // Antique = impossible { return(true); // can't get Antique eggs } return(false); }
public override IEnumerable <EncounterSlot> GetMatchingSlots(PKM pkm, IReadOnlyList <EvoCriteria> chain) { if (pkm.TSV == 0) // HOME doesn't assign TSV=0 to accounts. { yield break; } var sf = chain.FirstOrDefault(z => z.Species == Species && (z.Form == Form || AltFormInfo.IsFormChangeable(Species, Form, z.Form, pkm.Format))); if (sf == null) { yield break; } var ball = (Ball)pkm.Ball; var stamp = EncounterSlotGO.GetTimeStamp(pkm.Met_Year + 2000, pkm.Met_Month, pkm.Met_Day); var met = Math.Max(sf.MinLevel, pkm.Met_Level); foreach (var s in Slots) { var slot = (EncounterSlot8GO)s; if (!slot.IsLevelWithinRange(met)) { continue; } if (!slot.IsBallValid(ball)) { continue; } if (!slot.Shiny.IsValid(pkm)) { continue; } if (!slot.IsWithinStartEnd(stamp)) { continue; } if (IsDeferredSlot(slot, pkm)) { continue; } yield return(slot); } }