/// <summary> /// Proper method to hypertrain based on Showdown Sets. Also handles edge cases like ultrabeasts /// </summary> /// <param name="pk">passed pkm object</param> /// <param name="set">showdown set to base hypertraining on</param> private static void SetHyperTrainingFlags(this PKM pk, IBattleTemplate set) { if (!(pk is IHyperTrain t)) { return; } pk.SetSuggestedHyperTrainingData(); // Set IV data based on showdownset // Fix HT flags as necessary t.HT_ATK = (set.IVs[1] >= 3 || !t.HT_ATK) && ((set.IVs[1] >= 3 && pk.IVs[1] < 3 && pk.CurrentLevel == 100) || t.HT_ATK); t.HT_SPE = (set.IVs[3] >= 3 || !t.HT_SPE) && ((set.IVs[3] >= 3 && pk.IVs[3] < 3 && pk.CurrentLevel == 100) || t.HT_SPE); // Handle special cases here for ultrabeasts switch (pk.Species) { case (int)Species.Kartana when pk.Nature == (int)Nature.Timid && ((set.IVs[1] <= 19 && pk.CurrentLevel == 100) || (set.IVs[1] <= 21 && pk.CurrentLevel == 50)): // Speed boosting Timid Kartana ATK IVs <= 19 t.HT_ATK = false; break; case (int)Species.Stakataka when pk.Nature == (int)Nature.Lonely && ((set.IVs[2] <= 15 && pk.CurrentLevel == 100) || (set.IVs[2] <= 17 && pk.CurrentLevel == 50)): // Atk boosting Lonely Stakataka DEF IVs <= 15 t.HT_DEF = false; break; case (int)Species.Pyukumuku when set.IVs[2] == 0 && set.IVs[5] == 0 && pk.Ability == (int)Ability.InnardsOut: // 0 Def / 0 Spd Pyukumuku with innards out t.HT_DEF = false; t.HT_SPD = false; break; } }
public static PKM GetLegal(this ITrainerInfo sav, IBattleTemplate set, out string res) { var result = sav.GetLegalFromSet(set, out var type); res = type.ToString(); return(result); }
private static void SetAbility(PKM pk, IBattleTemplate set, AbilityPermission preference) { if (pk.Ability != set.Ability && set.Ability != -1) { pk.SetAbility(set.Ability); } if (preference > 0) { var abilities = pk.PersonalInfo.Abilities; // Set unspecified abilities if (set.Ability == -1) { pk.RefreshAbility(preference.GetSingleValue()); if (pk is PK5 pk5 && preference == AbilityPermission.OnlyHidden) { pk5.HiddenAbility = true; } } // Set preferred ability number if applicable if (abilities[preference.GetSingleValue()] == set.Ability) { pk.AbilityNumber = (int)preference; } // 3/4/5 transferred to 6+ will have ability 1 if both abilitynum 1 and 2 are the same. Capsule cant convert 1 -> 2 if the abilities arnt unique if (pk.Format >= 6 && pk.Generation is 3 or 4 or 5 && pk.AbilityNumber != 4 && abilities[0] == abilities[1]) { pk.AbilityNumber = 1; } if (pk is G3PKM && abilities[0] == abilities[1]) { pk.AbilityNumber = 1; } } }
private static void ApplyEncounterAttributes(PKM pk, IBattleTemplate set, EncounterStatic el) { pk.Met_Location = el.Location; pk.Met_Level = el.Level; pk.CurrentLevel = 100; pk.FatefulEncounter = el.Fateful; if (el.RibbonWishing && pk is IRibbonSetEvent4 e4) { e4.RibbonWishing = true; } pk.SetRelearnMoves(el.Relearn); if (set.Shiny && (el.Shiny == Shiny.Always || el.Shiny == Shiny.Random)) { pk.SetShiny(); } else if (el.Shiny == Shiny.Never && pk.IsShiny) { pk.PID ^= 0x10000000; } else { pk.SetPIDGender(pk.Gender); } }
/// <summary> /// Imports a <see cref="set"/> to create a new <see cref="PKM"/> with a context of <see cref="tr"/>. /// </summary> /// <param name="tr">Source/Destination trainer</param> /// <param name="set">Set data to import</param> /// <param name="msg">Result code indicating success or failure</param> /// <returns>Legalized PKM (hopefully legal)</returns> public static PKM GetLegalFromSet(this ITrainerInfo tr, IBattleTemplate set, out LegalizationResult msg) { var template = PKMConverter.GetBlank(tr.Generation, (GameVersion)tr.Game); template.ApplySetDetails(set); return(tr.GetLegalFromSet(set, template, out msg)); }
private async Task <bool> TrollAsync(bool invalid, IBattleTemplate set) { var rng = new System.Random(); var path = Info.Hub.Config.Trade.MemeFileNames.Split(','); var msg = $"Oops! I wasn't able to create that {GameInfo.Strings.Species[set.Species]}. Here's a meme instead!\n"; if (path.Length == 0) { path = new string[] { "https://i.imgur.com/qaCwr09.png" } } ; //If memes enabled but none provided, use a default one. if (invalid || !ItemRestrictions.IsHeldItemAllowed(set.HeldItem, 8) || (Info.Hub.Config.Trade.ItemMuleSpecies != Species.None && set.Shiny) || Info.Hub.Config.Trade.EggTrade && set.Nickname == "Egg" && set.Species >= 888 || (Info.Hub.Config.Trade.ItemMuleSpecies != Species.None && GameInfo.Strings.Species[set.Species] != Info.Hub.Config.Trade.ItemMuleSpecies.ToString() && !(Info.Hub.Config.Trade.DittoTrade && set.Species == 132 || Info.Hub.Config.Trade.EggTrade && set.Nickname == "Egg" && set.Species < 888))) { if (Info.Hub.Config.Trade.MemeFileNames.Contains(".com") || path.Length == 0) { _ = invalid == true ? await Context.Channel.SendMessageAsync($"{msg}{path[rng.Next(path.Length)]}").ConfigureAwait(false) : await Context.Channel.SendMessageAsync($"{path[rng.Next(path.Length)]}").ConfigureAwait(false); } else { _ = invalid == true ? await Context.Channel.SendMessageAsync($"{msg}{path[rng.Next(path.Length)]}").ConfigureAwait(false) : await Context.Channel.SendMessageAsync($"{path[rng.Next(path.Length)]}").ConfigureAwait(false); } return(true); } return(false); } }
/// <summary> /// Set Species and Level with nickname (Helps with PreEvos) /// </summary> /// <param name="pk">PKM to modify</param> /// <param name="set">Set to use as reference</param> /// <param name="Form">Form to apply</param> /// <param name="enc">Encounter detail</param> /// <param name="lang">Language to apply</param> public static void SetSpeciesLevel(this PKM pk, IBattleTemplate set, int Form, IEncounterable enc, LanguageID?lang = null) { var updatevalues = pk.Species != set.Species; if (updatevalues) { pk.Species = set.Species; } pk.ApplySetGender(set); if (Form != pk.Form) { pk.SetForm(Form); } pk.SetFormArgument(enc); if (updatevalues) { pk.RefreshAbility(pk.AbilityNumber >> 1); } var usedlang = lang ?? (LanguageID)pk.Language; var gen = new LegalityAnalysis(pk).Info.Generation; var nickname = Legal.GetMaxLengthNickname(gen, usedlang) < set.Nickname.Length ? set.Nickname.Substring(0, Legal.GetMaxLengthNickname(gen, usedlang)) : set.Nickname; if (!WordFilter.IsFiltered(nickname, out _)) { pk.SetNickname(nickname); } else { pk.ClearNickname(); } pk.CurrentLevel = set.Level; }
/// <summary> /// Regenerates the set by searching for an encounter that can generate the template. /// </summary> /// <param name="tr">Trainer Data that was passed in</param> /// <param name="set">Showdown set being used</param> /// <param name="template">template PKM to legalize</param> /// <param name="msg">Legalization result</param> /// <returns>Legalized pkm</returns> private static PKM GetLegalFromSet(this ITrainerInfo tr, IBattleTemplate set, PKM template, out LegalizationResult msg) { if (set is ShowdownSet s) { set = new RegenTemplate(s); } bool success = tr.TryAPIConvert(set, template, out PKM pk); if (success) { msg = LegalizationResult.Regenerated; return(pk); } msg = LegalizationResult.Failed; if (EnableEasterEggs) { var gen = EasterEggs.GetGeneration(template.Species); var species = (int)EasterEggs.GetMemeSpecies(gen); template.Species = species; var legalencs = tr.GetRandomEncounter(species, out var legal); if (legalencs && legal != null) { template = legal; } template.SetNickname(EasterEggs.GetMemeNickname(gen)); } return(template); }
/// <summary> /// Set Species and Level with nickname (Helps with PreEvos) /// </summary> /// <param name="pk">PKM to modify</param> /// <param name="set">Set to use as reference</param> /// <param name="Form">Form to apply</param> /// <param name="enc">Encounter detail</param> public static void SetSpeciesLevel(this PKM pk, IBattleTemplate set, int Form, IEncounterable enc) { pk.Species = set.Species; pk.ApplySetGender(set); pk.SetAltForm(Form); pk.SetFormArgument(enc); pk.RefreshAbility(pk.AbilityNumber >> 1); var gen = new LegalityAnalysis(pk).Info.Generation; var nickname = Legal.GetMaxLengthNickname(gen, LanguageID.English) < set.Nickname.Length ? set.Nickname.Substring(0, Legal.GetMaxLengthNickname(gen, LanguageID.English)) : set.Nickname; if (!WordFilter.IsFiltered(nickname, out _)) { pk.SetNickname(nickname); } else { pk.ClearNickname(); } pk.CurrentLevel = set.Level; if (pk.CurrentLevel == 50) { pk.CurrentLevel = 100; // VGC Override } }
/// <summary> /// Modifies the provided <see cref="pk"/> to the specifications required by <see cref="set"/>. /// </summary> /// <param name="pk">Converted final pkm to apply details to</param> /// <param name="set">Set details required</param> /// <param name="unconverted">Original pkm data</param> /// <param name="handler">Trainer to handle the Pokémon</param> /// <param name="enc">Encounter details matched to the Pokémon</param> private static void ApplySetDetails(PKM pk, IBattleTemplate set, PKM unconverted, ITrainerInfo handler, IEncounterable enc) { int Form = set.FormIndex; var pidiv = MethodFinder.Analyze(pk); var abilitypref = GetAbilityPreference(pk, enc); pk.SetVersion(unconverted); // Preemptive Version setting pk.SetSpeciesLevel(set, Form, enc); pk.SetRecordFlags(set.Moves); pk.SetMovesEVs(set); pk.SetHandlerandMemory(handler); pk.SetNatureAbility(set, abilitypref); pk.GetSuggestedTracker(); pk.SetIVsPID(set, pidiv.Type, set.HiddenPowerType, unconverted); pk.SetHeldItem(set); pk.SetHyperTrainingFlags(set); // Hypertrain pk.SetEncryptionConstant(enc); pk.FixFatefulFlag(enc); pk.SetShinyBoolean(set.Shiny, enc, set is RegenTemplate s ? s.ShinyType : Shiny.Random); pk.FixGender(set); pk.SetSuggestedRibbons(SetAllLegalRibbons); pk.SetSuggestedMemories(); pk.SetHTLanguage(); pk.SetDynamaxLevel(); pk.SetFriendship(enc); pk.SetBelugaValues(); pk.FixEdgeCases(); pk.SetSuggestedBall(SetMatchingBalls, ForceSpecifiedBall, set is RegenTemplate b ? b.Ball : Ball.None); pk.ApplyMarkings(UseMarkings, UseCompetitiveMarkings); }
private static void SetNature(PKM pk, IBattleTemplate set) { var val = Math.Min((int)Nature.Quirky, Math.Max((int)Nature.Hardy, set.Nature)); pk.SetNature(val); if (pk.Species == (int)Species.Toxtricity) { if (pk.AltForm == EvolutionMethod.GetAmpLowKeyResult(val)) { pk.Nature = val; // StatNature already set } return; } // Try setting the actual nature (in the event the StatNature was set instead) var orig = pk.Nature; if (orig == val) { return; } var la = new LegalityAnalysis(pk); pk.Nature = val; var la2 = new LegalityAnalysis(pk); var enc1 = la.EncounterOriginal; var enc2 = la2.EncounterOriginal; if ((!ReferenceEquals(enc1, enc2) && !(enc1 is EncounterEgg)) || la2.Info.Parse.Any(z => z.Identifier == CheckIdentifier.Nature && !z.Valid)) { pk.Nature = orig; } }
private static void SetAbility(PKM pk, IBattleTemplate set, int preference) { if (pk.Ability != set.Ability) { pk.SetAbility(set.Ability); } if (preference > 0) { var abilities = pk.PersonalInfo.Abilities; // Set unspecified abilities if (set.Ability == -1) { pk.SetAbility(abilities[preference >> 1]); } // Set preferred ability number if applicable if (abilities[preference >> 1] == set.Ability) { pk.AbilityNumber = preference; } // 3/4/5 transferred to 6+ will have ability 1 if both abilitynum 1 and 2 are the same. Capsule cant convert 1 -> 2 if the abilities arnt unique if (pk.Format >= 6 && pk.Generation is 3 or 4 or 5 && pk.AbilityNumber != 4 && abilities[0] == abilities[1]) { pk.AbilityNumber = 1; } } }
/// <summary> /// Method to bruteforce the pkm (won't be documented, because f**k bruteforce) /// </summary> /// <param name="tr">trainerdata</param> /// <param name="set">showdown set</param> /// <param name="template">template pkm to bruteforce</param> /// <returns>(Hopefully) Legalized pkm file</returns> private static PKM GetBruteForcedLegalMon(this ITrainerInfo tr, IBattleTemplate 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> /// Imports a <see cref="set"/> to create a new <see cref="PKM"/> with a context of <see cref="tr"/>. /// </summary> /// <param name="tr">Source/Destination trainer</param> /// <param name="set">Set data to import</param> /// <param name="msg">Result code indicating success or failure</param> /// <returns>Legalized PKM (hopefully legal)</returns> public static PKM GetLegalFromSet(this ITrainerInfo tr, IBattleTemplate set, out LegalizationResult msg) { var template = EntityBlank.GetBlank(tr); if (template.Version == 0) { template.Version = tr.Game; } template.ApplySetDetails(set); return(tr.GetLegalFromSet(set, template, out msg)); }
/// <summary> /// Applies specified gender (if it exists. Else choose specied gender) /// </summary> /// <param name="pk">PKM to modify</param> /// <param name="set">IBattleset template to grab the set gender</param> private static void ApplySetGender(this PKM pk, IBattleTemplate set) { if (set.Gender != -1) { pk.Gender = set.Gender; } else { pk.Gender = pk.GetSaneGender(); } }
private static void ApplySetGender(this PKM pk, IBattleTemplate set) { if (!string.IsNullOrWhiteSpace(set.Gender)) { pk.Gender = set.Gender == "M" ? 0 : 1; } else { pk.Gender = pk.GetSaneGender(); } }
/// <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> /// Checks if the encounter is even valid before processing it /// </summary> /// <param name="set">showdown set</param> /// <param name="enc">encounter object</param> /// <param name="isHidden">is HA requested</param> /// <param name="destVer">version to generate in</param> /// <param name="ver">version of enc/destVer</param> /// <returns>if the encounter is valid or not</returns> private static bool IsEncounterValid(IBattleTemplate set, IEncounterable enc, bool isHidden, GameVersion destVer, out GameVersion ver) { // Pokemon who are in games of generation >= 8 can change non HA to HA via a capsule and vice versa isHidden = isHidden && destVer.GetGeneration() < 8; // initialize out vars (not calculating here to save time) ver = GameVersion.Any; // Don't process if encounter min level is higher than requested level if (enc.LevelMin > set.Level) { var isRaid = enc is EncounterStatic8N || enc is EncounterStatic8NC || enc is EncounterStatic8ND || enc is EncounterStatic8U; if (!isRaid) { return(false); } } // Don't process if Hidden Ability is requested and the PKM is from Gen 3 or Gen 4 var gen = enc.Generation; if (isHidden && (uint)(gen - 3) < 2) // Gen 3 and Gen 4 { return(false); } // Don't process if requested PKM is Gigantamax but the Game is not SW/SH ver = enc is IVersion v ? v.Version : destVer; if (set.CanGigantamax && !GameVersion.SWSH.Contains(ver)) { return(false); } // Don't process if Game is LGPE and requested PKM is not Kanto / Meltan / Melmetal // Don't process if Game is SWSH and requested PKM is not from the Galar Dex (Zukan8.DexLookup) if (GameVersion.GG.Contains(destVer)) { return(set.Species <= 151 || set.Species == 808 || set.Species == 809); } if (GameVersion.SWSH.Contains(destVer)) { return(((PersonalInfoSWSH)PersonalTable.SWSH.GetFormeEntry(set.Species, set.FormIndex)).IsPresentInGame || SimpleEdits.Zukan8Additions.Contains(set.Species)); } if (set.Species > destVer.GetMaxSpeciesID()) { return(false); } // Encounter should hopefully be possible return(true); }
private static void SanitizeMoves(IBattleTemplate set, int[] moves) { // Specified moveset, no need to sanitize if (moves[0] != 0) { return; } // Sanitize keldeo moves to avoid form mismatches if (set.Species == (int)Core.Species.Keldeo) { moves[0] = set.Form == 0 ? (int)Move.AquaJet : (int)Move.SecretSword; } }
private static void SetAbility(PKM pk, IBattleTemplate set, int preference) { if (pk.Ability != set.Ability) { pk.SetAbility(set.Ability); } if (preference > 0) { // Set preferred ability number if applicable var abilities = pk.PersonalInfo.Abilities; pk.AbilityNumber = abilities[preference >> 1] == set.Ability ? preference : pk.AbilityNumber; } }
/// <summary> /// Checks if the encounter is even valid before processing it /// </summary> /// <param name="set">showdown set</param> /// <param name="enc">encounter object</param> /// <param name="isHidden">is HA requested</param> /// <param name="destVer">version to generate in</param> /// <param name="ver">version of enc/destVer</param> /// <returns>if the encounter is valid or not</returns> private static bool IsEncounterValid(IBattleTemplate set, IEncounterable enc, bool isHidden, GameVersion destVer, out GameVersion ver) { // initialize out vars (not calculating here to save time) ver = GameVersion.Any; // Don't process if encounter min level is higher than requested level if (enc.LevelMin > set.Level) { if (!(enc is EncounterStatic8N)) { return(false); } } // Don't process if Hidden Ability is requested and the PKM is from Gen 3 or Gen 4 var gen = enc.Generation; if (isHidden && (uint)(gen - 3) < 2) // Gen 3 and Gen 4 { return(false); } // Don't process if requested PKM is Gigantamax but the Game is not SW/SH ver = enc is IVersion v ? v.Version : destVer; if (set.CanGigantamax && !GameVersion.SWSH.Contains(ver)) { return(false); } // Don't process if Game is LGPE and requested PKM is not Kanto / Meltan / Melmetal // Don't process if Game is SWSH and requested PKM is not from the Galar Dex (Zukan8.DexLookup) var species = Enumerable.Range(1, destVer.GetMaxSpeciesID()); if (GameVersion.GG.Contains(destVer)) { species = species.Where(z => z <= 151 || (z == 808 || z == 809)); } if (GameVersion.SWSH.Contains(destVer)) { species = species.Where(z => Zukan8.DexLookup.TryGetValue(z, out _) || SimpleEdits.Zukan8Additions.Contains(z)); } if (!species.Contains(set.Species)) { return(false); } // Encounter should hopefully be possible return(true); }
private static bool BruteForceNonBreed(PKM pk, IBattleTemplate set, ITrainerInfo trainer, bool shiny, int abilitynum) { foreach (GameVersion game in BruteTables.GameVersionList) { if (pk.DebutGeneration > game.GetGeneration()) { continue; } if (pk.Met_Level == 100) { pk.Met_Level = 0; } pk.SetBelugaValues(); pk.EggMetDate = null; pk.Egg_Location = 0; pk.Version = (int)game; pk.RestoreIVs(set.IVs); // Restore IVs to template, and HT to false pk.Language = 2; pk.ConsoleRegion = 2; pk.OT_Name = trainer.OT; pk.TID = trainer.TID; pk.SID = trainer.SID; pk.OT_Gender = trainer.Gender; if (BruteTables.UltraBeastBall.Contains(pk.Species)) { pk.Ball = (int)Ball.Beast; } if (game.GetGeneration() <= 2) { pk.SID = 0; if (pk.OT_Name.Length > 6) { pk.OT_Name = "ARCH"; } } pk.MetDate = DateTime.Today; pk.SetMarkings(); var result = InnerBruteForce(pk, game, shiny, abilitynum, set); if (result) { return(true); } } return(false); }
private static PKM GetEasterEggFromSet(this ITrainerInfo tr, IBattleTemplate set, PKM template) { var gen = EasterEggs.GetGeneration(template.Species); var species = (int)EasterEggs.GetMemeSpecies(gen, template); template.Species = species; var attempt = 0; var legalencs = tr.GetRandomEncounter(species, null, set.Shiny, false, ref attempt, out var legal); if (legalencs && legal != null) { template = legal; } template.SetNickname(EasterEggs.GetMemeNickname(gen, template)); return(template); }
/// <summary> /// Checks if the encounter is even valid before processing it /// </summary> /// <param name="set">showdown set</param> /// <param name="enc">encounter object</param> /// <param name="isHidden">is HA requested</param> /// <param name="destVer">version to generate in</param> /// <param name="ver">version of enc/destVer</param> /// <returns>if the encounter is valid or not</returns> private static bool IsEncounterValid(IBattleTemplate set, IEncounterable enc, bool isHidden, GameVersion destVer, out GameVersion ver) { // initialize out vars (not calculating here to save time) ver = GameVersion.Any; // Don't process if encounter min level is higher than requested level if (enc.LevelMin > set.Level) { var isRaid = enc is EncounterStatic8N or EncounterStatic8NC or EncounterStatic8ND or EncounterStatic8U; if (!isRaid) return(false); } // Don't process if encounter is HA but requested pkm is not HA if (!isHidden && enc is EncounterStatic { Ability : 4 })
private static void SetNature(PKM pk, IBattleTemplate set) { if (pk.Nature == set.Nature) { return; } var val = Math.Min((int)Nature.Quirky, Math.Max((int)Nature.Hardy, set.Nature)); if (pk.Species == (int)Species.Toxtricity) { if (pk.Form == EvolutionMethod.GetAmpLowKeyResult(val)) { pk.Nature = val; // StatNature already set } if (pk.Format >= 8 && pk.StatNature != pk.Nature && pk.StatNature != 12 && (pk.StatNature > 24 || pk.StatNature % 6 == 0)) // Only Serious Mint for Neutral Natures { pk.StatNature = 12; } return; } pk.SetNature(val); // Try setting the actual nature (in the event the StatNature was set instead) var orig = pk.Nature; if (orig == val) { return; } var la = new LegalityAnalysis(pk); pk.Nature = val; var la2 = new LegalityAnalysis(pk); var enc1 = la.EncounterMatch; var enc2 = la2.EncounterMatch; if ((!ReferenceEquals(enc1, enc2) && enc1 is not EncounterEgg) || la2.Results.Any(z => z.Identifier == CheckIdentifier.Nature && !z.Valid)) { pk.Nature = orig; } if (pk.Format >= 8 && pk.StatNature != pk.Nature && pk.StatNature is 0 or 6 or 18 or >= 24) // Only Serious Mint for Neutral Natures { pk.StatNature = (int)Nature.Serious; } }
protected T RngRoutineSWSH(T pkm, IBattleTemplate template, Shiny shiny) { if (pkm.Species is (int)Species.Alcremie) { var data = pkm.Data; var deco = (uint)Random.Next(7); pkm.ChangeFormArgument(deco); } var laInit = new LegalityAnalysis(pkm); var nature = pkm.Nature; pkm.Nature = pkm.Species switch { (int)Species.Toxtricity => pkm.Form > 0 ? TradeExtensions <PK8> .LowKey[Random.Next(TradeExtensions <PK8> .LowKey.Length)] : TradeExtensions <PK8> .Amped[Random.Next(TradeExtensions <PK8> .Amped.Length)], _ => Random.Next(25), };
/// <summary> /// Regenerates the set by searching for an encounter that can generate the template. /// </summary> /// <param name="tr">Trainer Data that was passed in</param> /// <param name="set">Showdown set being used</param> /// <param name="template">template PKM to legalize</param> /// <param name="msg">Legalization result</param> /// <returns>Legalized pkm</returns> private static PKM GetLegalFromSet(this ITrainerInfo tr, IBattleTemplate set, PKM template, out LegalizationResult msg) { if (set is ShowdownSet s) { set = new RegenTemplate(s, tr.Generation); } msg = tr.TryAPIConvert(set, template, out PKM pk); if (msg == LegalizationResult.Regenerated) { return(pk); } if (EnableEasterEggs) { return(tr.GetEasterEggFromSet(set, template)); } return(template); }
public RegenTemplate(IBattleTemplate set) { Species = set.Species; Format = set.Format; Nickname = set.Nickname; Gender = set.Gender; HeldItem = set.HeldItem; Ability = set.Ability; Level = set.Level; Shiny = set.Shiny; Friendship = set.Friendship; Nature = set.Nature; Form = set.Form; FormIndex = set.FormIndex; EVs = SanitizeEVs(set.EVs); IVs = set.IVs; HiddenPowerType = set.HiddenPowerType; Moves = set.Moves; CanGigantamax = set.CanGigantamax; }