private static int?SetFormSpecificItem(int generation, int species, int form) { return(species switch { (int)Species.Arceus => generation != 4 || form < 9 ? SimpleEdits.GetArceusHeldItemFromForm(form) : SimpleEdits.GetArceusHeldItemFromForm(form - 1), (int)Species.Silvally => SimpleEdits.GetSilvallyHeldItemFromForm(form), (int)Species.Genesect => SimpleEdits.GetGenesectHeldItemFromForm(form), (int)Species.Giratina => form == 1 ? 112 : null, // Griseous Orb (int)Species.Zacian => form == 1 ? 1103 : null, // Rusted Sword (int)Species.Zamazenta => form == 1 ? 1104 : null, // Rusted Shield _ => null });
/// <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> /// <param name="shiny"></param> /// <param name="alpha"></param> /// <param name="attempt"></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, bool alpha, 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 = GetFormSpecificItem(tr.Game, 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 (form == null) { var f = GetAvailableForm(blank); if (f == -1) { return(null); } blank.Form = f; } if (blank.GetIsFormInvalid(tr, blank.Form)) { return(null); } attempt++; var ssettext = new ShowdownSet(blank).Text.Split('\r')[0]; if (shiny && !SimpleEdits.IsShinyLockedSpeciesForm(blank.Species, blank.Form)) { ssettext += Environment.NewLine + "Shiny: Yes"; } if (template is IAlpha && alpha) { ssettext += Environment.NewLine + "Alpha: Yes"; } var sset = new ShowdownSet(ssettext); var set = new RegenTemplate(sset) { Nickname = string.Empty }; template.ApplySetDetails(set); var success = tr.TryAPIConvert(set, template, out PKM pk); if (success == LegalizationResult.Regenerated) { if (form == null) { return(pk); } if (pk.Form == (int)form) { return(pk); } } // just get a legal pkm and return. Only validate form and not shininess or alpha. var legalencs = EncounterMovesetGenerator.GeneratePKMs(blank, tr).Where(z => new LegalityAnalysis(z).Valid); var firstenc = GetFirstEncounter(legalencs, form); if (firstenc == null) { attempt--; 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()); firstenc.RefreshAbility(firstenc.AbilityNumber >> 1); } var second = PKMConverter.ConvertToType(firstenc, blank.GetType(), out _); if (second == null) { return(null); } second.HeldItem = blank.HeldItem; if (second is IScaledSizeValue sv) { sv.HeightAbsolute = sv.CalcHeightAbsolute; sv.WeightAbsolute = sv.CalcWeightAbsolute; } 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 (second is IScaledSizeValue sc) { sc.HeightAbsolute = sc.CalcHeightAbsolute; sc.WeightAbsolute = sc.CalcWeightAbsolute; } if (new LegalityAnalysis(second).Valid) { return(second); } return(null); }