コード例 #1
0
ファイル: APILegality.cs プロジェクト: jan2705/PKHeX-Plugins
        /// <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;
            }
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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;
                }
            }
        }
コード例 #4
0
        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);
            }
        }
コード例 #5
0
        /// <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));
        }
コード例 #6
0
ファイル: TradeModule.cs プロジェクト: Splice-X/SpliceBot.NET
        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);
        }
    }
コード例 #7
0
        /// <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;
        }
コード例 #8
0
        /// <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);
        }
コード例 #9
0
        /// <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
            }
        }
コード例 #10
0
        /// <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);
        }
コード例 #11
0
        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;
            }
        }
コード例 #12
0
        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;
                }
            }
        }
コード例 #13
0
        /// <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);
        }
コード例 #14
0
        /// <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);
        }
コード例 #15
0
        /// <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));
        }
コード例 #16
0
 /// <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();
     }
 }
コード例 #17
0
 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();
     }
 }
コード例 #18
0
ファイル: Legalizer.cs プロジェクト: architdate/PKHeX-Plugins
        /// <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);
        }
コード例 #19
0
        /// <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);
        }
コード例 #20
0
        /// <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);
        }
コード例 #21
0
        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;
            }
        }
コード例 #22
0
        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;
            }
        }
コード例 #23
0
        /// <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);
        }
コード例 #24
0
        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);
        }
コード例 #25
0
ファイル: Legalizer.cs プロジェクト: architdate/PKHeX-Plugins
        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);
        }
コード例 #26
0
        /// <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
            })
コード例 #27
0
        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;
            }
        }
コード例 #28
0
ファイル: TradeCordDB.cs プロジェクト: Koi-3088/ForkBot.NET
        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),
            };
コード例 #29
0
ファイル: Legalizer.cs プロジェクト: architdate/PKHeX-Plugins
        /// <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);
        }
コード例 #30
0
 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;
 }