Beispiel #1
0
        protected sealed override void SetPINGA(PKM pk, EncounterCriteria criteria)
        {
            int gender  = criteria.GetGender(PKX.GetGenderFromPID(Species, PID), pk.PersonalInfo);
            int nature  = (int)(PID % 25);
            int ability = Ability;

            pk.PID    = PID;
            pk.Gender = gender;
            SetIVs(pk);

            if (Generation >= 5)
            {
                pk.Nature = nature;
            }
            pk.RefreshAbility(ability >> 1);
        }
Beispiel #2
0
        public static void ApplyDetails(PKM pk, EncounterCriteria criteria, Shiny shiny = Shiny.FixedValue, int flawless = -1)
        {
            if (shiny == Shiny.FixedValue)
                shiny = criteria.Shiny == Shiny.Random ? Shiny.Never : Shiny.Always;
            if (flawless == -1)
                flawless = 0;

            int ctr = 0;
            const int maxAttempts = 50_000;
            var rnd = Util.Rand;
            do
            {
                var seed = Util.Rand32(rnd);
                if (TryApplyFromSeed(pk, criteria, shiny, flawless, seed))
                    return;
            } while (++ctr != maxAttempts);
            TryApplyFromSeed(pk, EncounterCriteria.Unrestricted, shiny, flawless, Util.Rand32(rnd));
        }
Beispiel #3
0
        protected override void ApplyDetails(ITrainerInfo sav, EncounterCriteria criteria, PKM pk)
        {
            var pk8 = (PK8)pk;

            pk8.HT_Name        = "PKHeX";
            pk8.HT_Language    = 2;
            pk8.CurrentHandler = 1;

            base.ApplyDetails(sav, criteria, pk);
            var ball = Type.GetValidBall();

            if (ball != Ball.None)
            {
                pk.Ball = (int)ball;
            }

            pk8.HeightScalar = PokeSizeUtil.GetRandomScalar();
            pk8.WeightScalar = PokeSizeUtil.GetRandomScalar();
        }
Beispiel #4
0
        protected override void ApplyDetails(ITrainerInfo sav, EncounterCriteria criteria, PKM pk)
        {
            base.ApplyDetails(sav, criteria, pk);

            var pk1 = (PK1)pk;

            if (Version == GameVersion.YW)
            {
                pk1.Catch_Rate = Species switch
                {
                    (int)Core.Species.Kadabra => 96,
                    (int)Core.Species.Dragonair => 27,
                    _ => PersonalTable.RB[Species].CatchRate
                };
            }
            else
            {
                pk1.Catch_Rate = PersonalTable.RB[Species].CatchRate; // RB
            }
        }
Beispiel #5
0
        protected override void ApplyDetails(ITrainerInfo sav, EncounterCriteria criteria, PKM pk)
        {
            base.ApplyDetails(sav, criteria, pk);

            var pk1 = (PK1)pk;

            if (Version == GameVersion.YW)
            {
                // Since we don't keep track of Yellow's Personal Data, just handle any differences here.
                pk1.Catch_Rate = Species switch
                {
                    (int)Core.Species.Kadabra => 96,
                    (int)Core.Species.Dragonair => 27,
                    _ => PersonalTable.RB[Species].CatchRate
                };
            }
            else
            {
                pk1.Catch_Rate = PersonalTable.RB[Species].CatchRate; // RB
            }
        }
Beispiel #6
0
    public static void ApplyDetails(PKM pk, EncounterCriteria criteria,
                                    Shiny shiny  = Shiny.FixedValue,
                                    int flawless = -1,
                                    AbilityPermission ability = AbilityPermission.Any12)
    {
        if (shiny == Shiny.FixedValue)
        {
            shiny = criteria.Shiny is Shiny.Random or Shiny.Never ? Shiny.Never : Shiny.Always;
        }
        if (flawless == -1)
        {
            flawless = 0;
        }

        int       ctr         = 0;
        const int maxAttempts = 50_000;
        var       rnd         = Util.Rand;

        do
        {
            ulong s0   = rnd.Rand64();
            ulong s1   = rnd.Rand64();
            var   xors = new XorShift128(s0, s1);
            if (TryApplyFromSeed(pk, criteria, shiny, flawless, xors, ability))
            {
                return;
            }
        } while (++ctr != maxAttempts);

        {
            ulong s0   = rnd.Rand64();
            ulong s1   = rnd.Rand64();
            var   xors = new XorShift128(s0, s1);
            TryApplyFromSeed(pk, EncounterCriteria.Unrestricted, shiny, flawless, xors, ability);
        }
    }
Beispiel #7
0
 public static (ulong GroupSeed, ulong SlotSeed) ApplyDetails(PKM pk, EncounterCriteria criteria, in OverworldParam8a para, bool giveAlphaMove)
Beispiel #8
0
 public abstract PKM ConvertToPKM(ITrainerInfo sav, EncounterCriteria criteria);
Beispiel #9
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 legal or not</param>
        public static PKM GetLegalFromTemplate(this ITrainerInfo dest, PKM template, IBattleTemplate set, out LegalizationResult satisfied)
        {
            RegenSet regen;

            if (set is RegenTemplate t)
            {
                t.FixGender(template.PersonalInfo);
                regen = t.Regen;
            }
            else
            {
                regen = RegenSet.Default;
            }

            template.ApplySetDetails(set);
            template.SetRecordFlags(); // Validate TR moves for the encounter
            var isHidden = template.AbilityNumber == 4;

            if (template.PersonalInfo.Abilities.Count > 2) // Hidden ability exists for the template
            {
                isHidden = isHidden || template.PersonalInfo.Abilities[2] == template.Ability;
            }
            var destType = template.GetType();
            var destVer  = (GameVersion)dest.Game;

            if (destVer <= 0 && dest is SaveFile s)
            {
                destVer = s.Version;
            }

            var timer    = Stopwatch.StartNew();
            var gamelist = FilteredGameList(template, destVer);

            var encounters = EncounterMovesetGenerator.GenerateEncounters(pk: template, moves: set.Moves, gamelist);
            var criteria   = EncounterCriteria.GetCriteria(set);

            foreach (var enc in encounters)
            {
                // Return out if set times out
                if (timer.Elapsed.TotalSeconds >= Timeout)
                {
                    timer.Stop();
                    satisfied = LegalizationResult.Timeout;
                    return(template);
                }

                // Look before we leap -- don't waste time generating invalid / incompatible junk.
                if (!IsEncounterValid(set, enc, isHidden, destVer))
                {
                    continue;
                }

                // Create the PKM from the template.
                var tr  = GetTrainer(regen, enc.Version, enc.Generation);
                var raw = enc.ConvertToPKM(tr, criteria);
                raw = raw.SanityCheckLocation(enc);
                if (raw.IsEgg) // PGF events are sometimes eggs. Force hatch them before proceeding
                {
                    raw.HandleEggEncounters(enc, tr);
                }

                raw.PreSetPIDIV(enc, set);

                // Transfer any VC1 via VC2, as there may be GSC exclusive moves requested.
                if (dest.Generation >= 7 && raw is PK1 basepk1)
                {
                    raw = basepk1.ConvertToPK2();
                }

                // Bring to the target generation, then apply final details.
                var pk = PKMConverter.ConvertToType(raw, destType, out _);
                if (pk == null)
                {
                    continue;
                }
                ApplySetDetails(pk, set, raw, dest, enc, regen);

                // Apply final tweaks to the data.
                if (pk is IGigantamax gmax && gmax.CanGigantamax != set.CanGigantamax)
                {
                    if (!gmax.CanToggleGigantamax(pk.Species, pk.Form, enc.Species, enc.Form))
                    {
                        continue;
                    }
                    gmax.CanGigantamax = set.CanGigantamax; // soup hax
                }

                // Try applying batch editor values.
                if (AllowBatchCommands && regen.HasBatchSettings)
                {
                    pk.RefreshChecksum();
                    var b = regen.Batch;
                    if (!BatchEditing.TryModify(pk, b.Filters, b.Instructions))
                    {
                        continue;
                    }
                }

                if (pk is PK1 pk1 && ParseSettings.AllowGen1Tradeback)
                {
                    pk1.Catch_Rate = pk1.Gen2Item; // Simulate a gen 2 trade/tradeback to allow tradeback moves
                }
                // Verify the Legality of what we generated, and exit if it is valid.
                var la = new LegalityAnalysis(pk);
                if (la.Valid)
                {
                    satisfied = LegalizationResult.Regenerated;
                    return(pk);
                }
                Debug.WriteLine($"{la.Report()}\n");
            }
            satisfied = LegalizationResult.Failed;
            return(template);
        }
Beispiel #10
0
        private static bool TryApplyFromSeed(PKM pk, EncounterCriteria criteria, Shiny shiny, int flawless, uint seed)
        {
            var xoro = new Xoroshiro128Plus(seed);

            // Encryption Constant
            pk.EncryptionConstant = (uint)xoro.NextInt(uint.MaxValue);

            // PID
            var pid = (uint)xoro.NextInt(uint.MaxValue);

            if (shiny == Shiny.Never)
            {
                if (GetIsShiny(pk.TID, pk.SID, pid))
                {
                    pid ^= 0x1000_0000;
                }
            }
            else if (shiny != Shiny.Random)
            {
                if (!GetIsShiny(pk.TID, pk.SID, pid))
                {
                    pid = GetShinyPID(pk.TID, pk.SID, pid, 0);
                }

                if (shiny == Shiny.AlwaysSquare && pk.ShinyXor != 0)
                {
                    return(false);
                }
                if (shiny == Shiny.AlwaysStar && pk.ShinyXor == 0)
                {
                    return(false);
                }
            }

            pk.PID = pid;

            // IVs
            var       ivs = new[] { UNSET, UNSET, UNSET, UNSET, UNSET, UNSET };
            const int MAX = 31;

            for (int i = 0; i < flawless; i++)
            {
                int index;
                do
                {
                    index = (int)xoro.NextInt(6);
                }while (ivs[index] != UNSET);

                ivs[index] = MAX;
            }

            for (int i = 0; i < ivs.Length; i++)
            {
                if (ivs[i] == UNSET)
                {
                    ivs[i] = (int)xoro.NextInt(32);
                }
            }

            if (!criteria.IsIVsCompatible(ivs, 8))
            {
                return(false);
            }

            pk.IV_HP  = ivs[0];
            pk.IV_ATK = ivs[1];
            pk.IV_DEF = ivs[2];
            pk.IV_SPA = ivs[3];
            pk.IV_SPD = ivs[4];
            pk.IV_SPE = ivs[5];

            // Remainder
            var scale = (IScaledSize)pk;

            scale.HeightScalar = (int)xoro.NextInt(0x81) + (int)xoro.NextInt(0x80);
            scale.WeightScalar = (int)xoro.NextInt(0x81) + (int)xoro.NextInt(0x80);

            return(true);
        }
Beispiel #11
0
 protected override void ApplyDetails(ITrainerInfo sav, EncounterCriteria criteria, PKM pk)
 {
     base.ApplyDetails(sav, criteria, pk);
     SetNPokemonData((PK5)pk, pk.Language);
 }
Beispiel #12
0
 public static void ApplyDetails(PKM pk, EncounterCriteria criteria, in OverworldParam8a para)
Beispiel #13
0
    public static bool TryApplyFromSeed(PKM pk, EncounterCriteria criteria, Shiny shiny, int flawless, XorShift128 xors, AbilityPermission ability)
    {
        // Encryption Constant
        pk.EncryptionConstant = xors.NextUInt();

        // PID
        var fakeTID = xors.NextUInt(); // fakeTID
        var pid     = xors.NextUInt();

        pid = GetRevisedPID(fakeTID, pid, pk);
        if (shiny == Shiny.Never)
        {
            if (GetIsShiny(pk.TID, pk.SID, pid))
            {
                return(false);
            }
        }
        else if (shiny != Shiny.Random)
        {
            if (!GetIsShiny(pk.TID, pk.SID, pid))
            {
                return(false);
            }

            if (shiny == Shiny.AlwaysSquare && pk.ShinyXor != 0)
            {
                return(false);
            }
            if (shiny == Shiny.AlwaysStar && pk.ShinyXor == 0)
            {
                return(false);
            }
        }
        pk.PID = pid;

        // Check IVs: Create flawless IVs at random indexes, then the random IVs for not flawless.
        Span <int> ivs        = stackalloc[] { UNSET, UNSET, UNSET, UNSET, UNSET, UNSET };
        const int  MAX        = 31;
        var        determined = 0;

        while (determined < flawless)
        {
            var idx = (int)xors.NextUInt(6);
            if (ivs[idx] != UNSET)
            {
                continue;
            }
            ivs[idx] = 31;
            determined++;
        }

        for (var i = 0; i < ivs.Length; i++)
        {
            if (ivs[i] == UNSET)
            {
                ivs[i] = xors.NextInt(0, MAX + 1);
            }
        }

        if (!criteria.IsIVsCompatible(ivs, 8))
        {
            return(false);
        }

        pk.IV_HP  = ivs[0];
        pk.IV_ATK = ivs[1];
        pk.IV_DEF = ivs[2];
        pk.IV_SPA = ivs[3];
        pk.IV_SPD = ivs[4];
        pk.IV_SPE = ivs[5];

        // Ability
        var n = ability switch
        {
            AbilityPermission.Any12 => (int)xors.NextUInt(2),
            AbilityPermission.Any12H => (int)xors.NextUInt(3),
            _ => (int)ability >> 1,
        };

        pk.SetAbilityIndex(n);

        // Gender (skip this if gender is fixed)
        var genderRatio = PersonalTable.BDSP.GetFormEntry(pk.Species, pk.Form).Gender;

        if (genderRatio == PersonalInfo.RatioMagicGenderless)
        {
            pk.Gender = 2;
        }
        else if (genderRatio == PersonalInfo.RatioMagicMale)
        {
            pk.Gender = 0;
        }
        else if (genderRatio == PersonalInfo.RatioMagicFemale)
        {
            pk.Gender = 1;
        }
        else
        {
            var next = (((int)xors.NextUInt(253) + 1 < genderRatio) ? 1 : 0);
            if (criteria.Gender is 0 or 1 && next != criteria.Gender)
            {
                return(false);
            }
            pk.Gender = next;
        }

        if (criteria.Nature is Nature.Random)
        {
            pk.Nature = (int)xors.NextUInt(25);
        }
        else // Skip nature, assuming Synchronize
        {
            pk.Nature = (int)criteria.Nature;
        }
        pk.StatNature = pk.Nature;

        // Remainder
        var scale = (IScaledSize)pk;

        scale.HeightScalar = (byte)((int)xors.NextUInt(0x81) + (int)xors.NextUInt(0x80));
        scale.WeightScalar = (byte)((int)xors.NextUInt(0x81) + (int)xors.NextUInt(0x80));

        // Item, don't care
        return(true);
    }
Beispiel #14
0
 protected override void ApplyDetails(ITrainerInfo sav, EncounterCriteria criteria, PKM pk)
 {
     base.ApplyDetails(sav, criteria, pk);
     pk.FatefulEncounter = true;
 }
Beispiel #15
0
    private static bool TryApplyFromSeed(PKM pk, EncounterCriteria criteria, Shiny shiny, int flawless, uint seed)
    {
        var xoro = new Xoroshiro128Plus8b(seed);

        // Encryption Constant
        pk.EncryptionConstant = seed;

        // PID
        var fakeTID = xoro.NextUInt(); // fakeTID
        var pid     = xoro.NextUInt();

        pid = GetRevisedPID(fakeTID, pid, pk);
        if (shiny == Shiny.Never)
        {
            if (GetIsShiny(pk.TID, pk.SID, pid))
            {
                return(false);
            }
        }
        else if (shiny != Shiny.Random)
        {
            if (!GetIsShiny(pk.TID, pk.SID, pid))
            {
                return(false);
            }

            if (shiny == Shiny.AlwaysSquare && pk.ShinyXor != 0)
            {
                return(false);
            }
            if (shiny == Shiny.AlwaysStar && pk.ShinyXor == 0)
            {
                return(false);
            }
        }
        pk.PID = pid;

        // Check IVs: Create flawless IVs at random indexes, then the random IVs for not flawless.
        Span <int> ivs        = stackalloc [] { UNSET, UNSET, UNSET, UNSET, UNSET, UNSET };
        const int  MAX        = 31;
        var        determined = 0;

        while (determined < flawless)
        {
            var idx = (int)xoro.NextUInt(6);
            if (ivs[idx] != UNSET)
            {
                continue;
            }
            ivs[idx] = 31;
            determined++;
        }

        for (var i = 0; i < ivs.Length; i++)
        {
            if (ivs[i] == UNSET)
            {
                ivs[i] = (int)xoro.NextUInt(MAX + 1);
            }
        }

        if (!criteria.IsIVsCompatible(ivs, 8))
        {
            return(false);
        }

        pk.IV_HP  = ivs[0];
        pk.IV_ATK = ivs[1];
        pk.IV_DEF = ivs[2];
        pk.IV_SPA = ivs[3];
        pk.IV_SPD = ivs[4];
        pk.IV_SPE = ivs[5];

        // Ability
        pk.SetAbilityIndex((int)xoro.NextUInt(2));

        // Remainder
        var scale = (IScaledSize)pk;

        scale.HeightScalar = (byte)((int)xoro.NextUInt(0x81) + (int)xoro.NextUInt(0x80));
        scale.WeightScalar = (byte)((int)xoro.NextUInt(0x81) + (int)xoro.NextUInt(0x80));

        return(true);
    }
Beispiel #16
0
 public PKM ConvertToPKM(ITrainerInfo tr, EncounterCriteria criteria) => ConvertToPB7(tr, criteria);