/// <summary> /// Gets a legal <see cref="PKM"/> from a random in-game encounter's data. /// </summary> /// <param name="blank">Template data that will have its properties modified</param> /// <param name="tr">Trainer Data to use in generating the encounter</param> /// <param name="species">Species ID to generate</param> /// <param name="form">Form to generate; if left null, picks first encounter</param> /// <returns>Result legal pkm, null if data should be ignored.</returns> private static PKM?GetRandomEncounter(PKM blank, ITrainerInfo tr, int species, int?form, bool shiny, ref int attempt) { blank.Species = species; blank.Gender = blank.GetSaneGender(); if (species is ((int)Species.Meowstic)or((int)Species.Indeedee)) { if (form == null) { blank.Form = blank.Gender; } else { blank.Gender = (int)form; } } var template = PKMConverter.GetBlank(tr.Generation, (GameVersion)tr.Game); if (form != null) { blank.Form = (int)form; var item = SetFormSpecificItem(tr.Generation, blank.Species, (int)form); if (item != null) { blank.HeldItem = (int)item; } if (blank.Species == (int)Species.Keldeo && blank.Form == 1) { blank.Move1 = (int)Move.SecretSword; } } if (blank.IgnoreForm(tr, blank.Form)) { return(null); } attempt += 1; var ssettext = new ShowdownSet(blank).Text.Split('\r')[0]; if (shiny && !SimpleEdits.ShinyLockedSpeciesForm.Contains(new Tuple <Species, int>((Species)blank.Species, blank.Form))) { ssettext += Environment.NewLine + "Shiny: Yes"; } var sset = new ShowdownSet(ssettext); var set = new RegenTemplate(sset); template.ApplySetDetails(set); var success = tr.TryAPIConvert(set, template, out PKM pk); if (success == LegalizationResult.Regenerated) { if (form == null) { return(pk); } else if (pk.Form == (int)form) { return(pk); } } // just get a legal pkm and return. Only validate form and not shininess. var legalencs = EncounterMovesetGenerator.GeneratePKMs(blank, tr).Where(z => new LegalityAnalysis(z).Valid); var firstenc = GetFirstEncounter(legalencs, form); if (firstenc == null) { attempt -= 1; return(null); } var originspecies = firstenc.Species; if (originspecies != blank.Species) { firstenc.Species = blank.Species; firstenc.CurrentLevel = 100; if (!firstenc.IsNicknamed) { firstenc.Nickname = SpeciesName.GetSpeciesNameGeneration(firstenc.Species, firstenc.Language, firstenc.Format); } firstenc.SetMoves(firstenc.GetMoveSet(), true); firstenc.RefreshAbility(firstenc.AbilityNumber >> 1); } var second = PKMConverter.ConvertToType(firstenc, blank.GetType(), out _); if (second == null) { return(null); } second.HeldItem = blank.HeldItem; if (form == null || second.Form == (int)form) { return(second); } // force form and check legality as a last ditch effort. second.Form = (int)form; second.SetSuggestedFormArgument(originspecies); if (new LegalityAnalysis(second).Valid) { return(second); } return(null); }
/// <summary> /// Tries to regenerate the <see cref="pk"/> into a valid pkm. /// </summary> /// <param name="tr">Source/Destination trainer</param> /// <param name="pk">Currently invalid pkm data</param> /// <returns>Legalized PKM (hopefully legal)</returns> public static PKM Legalize(this ITrainerInfo tr, PKM pk) { var set = new RegenTemplate(pk, tr.Generation); return(tr.GetLegalFromTemplate(pk, set, out _)); }