/// <summary> /// Main function that auto legalizes based on the legality /// </summary> /// <remarks>Leverages <see cref="Core"/>'s <see cref="EncounterMovesetGenerator"/> to create a <see cref="PKM"/> from a <see cref="ShowdownSet"/>.</remarks> /// <param name="dest">Destination for the generated pkm</param> /// <param name="template">rough pkm that has all the <see cref="set"/> values entered</param> /// <param name="set">Showdown set object</param> /// <param name="satisfied">If the final result is satisfactory, otherwise use current auto legality functionality</param> public static PKM GetLegalFromTemplate(this ITrainerInfo dest, PKM template, ShowdownSet set, out bool satisfied) { var Form = SanityCheckForm(template, ref set); template.ApplySetDetails(set); var destType = template.GetType(); var destVer = (GameVersion)dest.Game; if (destVer <= 0 && dest is SaveFile s) { destVer = s.Version; } var encounters = EncounterMovesetGenerator.GenerateEncounters(pk: template, moves: set.Moves); foreach (var enc in encounters) { var ver = enc is IVersion v ? v.Version : destVer; var gen = enc is IGeneration g ? g.Generation : dest.Generation; var tr = TrainerSettings.GetSavedTrainerData(ver, gen); var raw = enc.ConvertToPKM(tr); var pk = PKMConverter.ConvertToType(raw, destType, out _); ApplySetDetails(pk, set, Form, raw, dest); var la = new LegalityAnalysis(pk); if (la.Valid) { satisfied = true; return(pk); } Debug.WriteLine(la.Report()); } satisfied = false; return(template); }
/// <summary> /// Main function that auto legalizes based on the legality /// </summary> /// <remarks>Leverages <see cref="Core"/>'s <see cref="EncounterMovesetGenerator"/> to create a <see cref="PKM"/> from a <see cref="ShowdownSet"/>.</remarks> /// <param name="dest">Destination for the generated pkm</param> /// <param name="template">rough pkm that has all the <see cref="set"/> values entered</param> /// <param name="set">Showdown set object</param> /// <param name="satisfied">If the final result is satisfactory, otherwise use deprecated bruteforce auto legality functionality</param> public static PKM GetLegalFromTemplate(this ITrainerInfo dest, PKM template, ShowdownSet set, out bool satisfied) { set = set.PreProcessShowdownSet(); var Form = SanityCheckForm(template, ref set); template.ApplySetDetails(set); template.SetRecordFlags(); // Validate TR moves for the encounter var destType = template.GetType(); var destVer = (GameVersion)dest.Game; if (destVer <= 0 && dest is SaveFile s) { destVer = s.Version; } var gamelist = GameUtil.GetVersionsWithinRange(template, template.Format).OrderByDescending(c => c.GetGeneration()).ToArray(); EncounterMovesetGenerator.PriorityList = new[] { EncounterOrder.Egg, EncounterOrder.Static, EncounterOrder.Trade, EncounterOrder.Slot, EncounterOrder.Mystery }; var encounters = EncounterMovesetGenerator.GenerateEncounters(pk: template, moves: set.Moves, gamelist); if (template.Species <= 721) { encounters = encounters.Concat(GetFriendSafariEncounters(template)); } foreach (var enc in encounters) { var ver = enc is IVersion v ? v.Version : destVer; var gen = enc is IGeneration g ? g.Generation : dest.Generation; var tr = UseTrainerData ? TrainerSettings.GetSavedTrainerData(ver, gen) : TrainerSettings.DefaultFallback(gen); var raw = SanityCheckEncounters(enc).ConvertToPKM(tr); if (raw.IsEgg) // PGF events are sometimes eggs. Force hatch them before proceeding { raw.HandleEggEncounters(enc, tr); } var pk = PKMConverter.ConvertToType(raw, destType, out _); if (pk == null) { continue; } ApplySetDetails(pk, set, Form, raw, dest, enc); if (set.CanGigantamax && pk is IGigantamax gmax) { if (!gmax.CanGigantamax) { continue; } } var la = new LegalityAnalysis(pk); if (la.Valid) { satisfied = true; return(pk); } Debug.WriteLine(la.Report()); } satisfied = false; return(template); }
/// <summary> /// Gets a living dex (one per species, not every form) /// </summary> /// <param name="sav">Save File to receive the generated <see cref="PKM"/>.</param> /// <param name="speciesIDs">Species IDs to generate</param> /// <param name="includeforms">Include all forms in the resulting list of data</param> /// <returns>Consumable list of newly generated <see cref="PKM"/> data.</returns> public static IEnumerable <PKM> GenerateLivingDex(this SaveFile sav, IEnumerable <int> speciesIDs, bool includeforms, bool shiny, out int attempts) { attempts = 0; var tr = APILegality.UseTrainerData ? TrainerSettings.GetSavedTrainerData(sav.Version, sav.Generation, fallback: sav, lang: (LanguageID)sav.Language) : sav; var pt = sav.Personal; List <PKM> pklist = new(); foreach (var id in speciesIDs) { if (!includeforms) { AddPKM(sav, tr, pklist, id, null, shiny, ref attempts); continue; } var num_forms = pt[id].FormCount; for (int i = 0; i < num_forms; i++) { if (sav is SAV8 && !((PersonalInfoSWSH)pt.GetFormEntry(id, i)).IsPresentInGame) { continue; } AddPKM(sav, tr, pklist, id, i, shiny, ref attempts); } } return(pklist); }
private static PKM GetBruteForcedLegalMon(this ITrainerInfo tr, ShowdownSet set, PKM template) { var resetForm = ShowdownUtil.IsInvalidForm(set.Form); var trainer = TrainerSettings.GetSavedTrainerData(template, tr); var legal = BruteForce.ApplyDetails(template, set, resetForm, trainer); legal.SetAllTrainerData(trainer); return(legal); }
/// <summary> /// Main function that auto legalizes based on the legality /// </summary> /// <remarks>Leverages <see cref="Core"/>'s <see cref="EncounterMovesetGenerator"/> to create a <see cref="PKM"/> from a <see cref="IBattleTemplate"/>.</remarks> /// <param name="dest">Destination for the generated pkm</param> /// <param name="template">rough pkm that has all the <see cref="set"/> values entered</param> /// <param name="set">Showdown set object</param> /// <param name="satisfied">If the final result is satisfactory, otherwise use deprecated bruteforce auto legality functionality</param> public static PKM GetLegalFromTemplate(this ITrainerInfo dest, PKM template, IBattleTemplate set, out bool satisfied) { if (set is RegenTemplate t) { t.FixGender(template.PersonalInfo); } template.ApplySetDetails(set); template.SetRecordFlags(); // Validate TR moves for the encounter var isHidden = template.AbilityNumber == 4; var destType = template.GetType(); var destVer = (GameVersion)dest.Game; if (destVer <= 0 && dest is SaveFile s) { destVer = s.Version; } var gamelist = GameUtil.GetVersionsWithinRange(template, template.Format).OrderByDescending(c => c.GetGeneration()).ToArray(); var encounters = EncounterMovesetGenerator.GenerateEncounters(pk: template, moves: set.Moves, gamelist); encounters = encounters.Concat(GetFriendSafariEncounters(template)); foreach (var enc in encounters) { if (!IsEncounterValid(set, enc, isHidden, destVer, out var ver)) { continue; } var tr = UseTrainerData ? TrainerSettings.GetSavedTrainerData(ver, enc.Generation) : TrainerSettings.DefaultFallback(enc.Generation); var raw = SanityCheckEncounters(enc).ConvertToPKM(tr); if (raw.IsEgg) // PGF events are sometimes eggs. Force hatch them before proceeding { raw.HandleEggEncounters(enc, tr); } var pk = PKMConverter.ConvertToType(raw, destType, out _); if (pk == null) { continue; } ApplySetDetails(pk, set, raw, dest, enc); if (pk is IGigantamax gmax && gmax.CanGigantamax != set.CanGigantamax) { continue; } var la = new LegalityAnalysis(pk); if (la.Valid) { satisfied = true; return(pk); } Debug.WriteLine($"{la.Report()}\n"); } satisfied = false; return(template); }
/// <summary> /// Main function that auto legalizes based on the legality /// </summary> /// <remarks>Leverages <see cref="Core"/>'s <see cref="EncounterMovesetGenerator"/> to create a <see cref="PKM"/> from a <see cref="ShowdownSet"/>.</remarks> /// <param name="dest">Destination for the generated pkm</param> /// <param name="template">rough pkm that has all the <see cref="set"/> values entered</param> /// <param name="set">Showdown set object</param> /// <param name="satisfied">If the final result is satisfactory, otherwise use deprecated bruteforce auto legality functionality</param> public static PKM GetLegalFromTemplate(this ITrainerInfo dest, PKM template, ShowdownSet set, out bool satisfied) { var Form = SanityCheckForm(template, ref set); template.ApplySetDetails(set); template.SetRecordFlags(); // Validate TR moves for the encounter var destType = template.GetType(); var destVer = (GameVersion)dest.Game; if (destVer <= 0 && dest is SaveFile s) { destVer = s.Version; } var gamelist = GameUtil.GetVersionsWithinRange(template, template.Format).OrderByDescending(c => c.GetGeneration()).ToArray(); var encounters = EncounterMovesetGenerator.GenerateEncounters(pk: template, moves: set.Moves, gamelist); foreach (var enc in encounters) { var ver = enc is IVersion v ? v.Version : destVer; var gen = enc is IGeneration g ? g.Generation : dest.Generation; ITrainerInfo tr = new SimpleTrainerInfo(ver); if (UseTrainerData) { tr = TrainerSettings.GetSavedTrainerData(ver, gen, new SimpleTrainerInfo(ver)); } var raw = SanityCheckEncounters(enc).ConvertToPKM(tr); var pk = PKMConverter.ConvertToType(raw, destType, out _); if (pk == null) { continue; } ApplySetDetails(pk, set, Form, raw, dest, enc); if (set.CanGigantamax && pk is IGigantamax gmax) { if (!gmax.CanGigantamax) { continue; } } var la = new LegalityAnalysis(pk); if (la.Valid) { satisfied = true; return(pk); } Debug.WriteLine(la.Report()); } satisfied = false; return(template); }
private static ITrainerInfo GetTrainer(RegenSet regen, GameVersion ver, int gen) { if (AllowTrainerOverride && regen.HasTrainerSettings && regen.Trainer != null) { return(regen.Trainer.MutateLanguage(regen.Extra.Language)); } if (UseTrainerData) { return(TrainerSettings.GetSavedTrainerData(ver, gen).MutateLanguage(regen.Extra.Language)); } return(TrainerSettings.DefaultFallback(gen, regen.Extra.Language)); }
/// <summary> /// API Legality /// </summary> /// <param name="tr">trainer data</param> /// <param name="set">showdown set to legalize from</param> /// <param name="template">pkm file to legalize</param> /// <param name="pkm">legalized pkm file</param> /// <returns>bool if the pokemon was legalized</returns> public static LegalizationResult TryAPIConvert(this ITrainerInfo tr, IBattleTemplate set, PKM template, out PKM pkm) { pkm = tr.GetLegalFromTemplateTimeout(template, set, out LegalizationResult satisfied); if (satisfied != LegalizationResult.Regenerated) { return(satisfied); } var trainer = TrainerSettings.GetSavedTrainerData(pkm, tr); pkm.SetAllTrainerData(trainer); return(LegalizationResult.Regenerated); }
/// <summary> /// API Legality /// </summary> /// <param name="tr">trainer data</param> /// <param name="set">showdown set to legalize from</param> /// <param name="template">pkm file to legalize</param> /// <param name="pkm">legalized pkm file</param> /// <returns>bool if the pokemon was legalized</returns> public static bool TryAPIConvert(this ITrainerInfo tr, IBattleTemplate set, PKM template, out PKM pkm) { pkm = tr.GetLegalFromTemplate(template, set, out bool satisfied); if (!satisfied) { return(false); } var trainer = TrainerSettings.GetSavedTrainerData(pkm, tr); pkm.SetAllTrainerData(trainer); return(true); }
/// <summary> /// Gets a living dex (one per species, not every form) /// </summary> /// <param name="sav">Save File to receive the generated <see cref="PKM"/>.</param> /// <param name="speciesIDs">Species IDs to generate</param> /// <returns>Consumable list of newly generated <see cref="PKM"/> data.</returns> public static IEnumerable <PKM> GenerateLivingDex(this SaveFile sav, IEnumerable <int> speciesIDs) { var tr = APILegality.UseTrainerData ? TrainerSettings.GetSavedTrainerData(sav.Version, sav.Generation, fallback: sav, lang: (LanguageID)sav.Language) : sav; foreach (var id in speciesIDs) { if (tr.GetRandomEncounter(id, out var pk) && pk != null) { pk.Heal(); yield return(pk); } else if (sav is SAV2 && GetRandomEncounter(new SAV1(GameVersion.Y) { Language = tr.Language, OT = tr.OT, TID = tr.TID }, id, out var pkm) && pkm is PK1 pk1) { yield return(pk1.ConvertToPK2()); } } }
/// <summary> /// Tries to regenerate the <see cref="pk"/> into a valid pkm. /// </summary> /// <param name="pk">Currently invalid pkm data</param> /// <returns>Legalized PKM (hopefully legal)</returns> public static PKM Legalize(this PKM pk) { var tr = TrainerSettings.GetSavedTrainerData(pk.Format); return(tr.MutateLanguage((LanguageID)pk.Language, (GameVersion)pk.Version).Legalize(pk)); }
/// <summary> /// Tries to regenerate the <see cref="pk"/> into a valid pkm. /// </summary> /// <param name="pk">Currently invalid pkm data</param> /// <returns>Legalized PKM (hopefully legal)</returns> public static PKM Legalize(this PKM pk) { var tr = TrainerSettings.GetSavedTrainerData(pk.Format); return(tr.Legalize(pk)); }