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); }
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)); }
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(); }
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 } }
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 } }
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); } }
public static (ulong GroupSeed, ulong SlotSeed) ApplyDetails(PKM pk, EncounterCriteria criteria, in OverworldParam8a para, bool giveAlphaMove)
public abstract PKM ConvertToPKM(ITrainerInfo sav, EncounterCriteria criteria);
/// <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); }
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); }
protected override void ApplyDetails(ITrainerInfo sav, EncounterCriteria criteria, PKM pk) { base.ApplyDetails(sav, criteria, pk); SetNPokemonData((PK5)pk, pk.Language); }
public static void ApplyDetails(PKM pk, EncounterCriteria criteria, in OverworldParam8a para)
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); }
protected override void ApplyDetails(ITrainerInfo sav, EncounterCriteria criteria, PKM pk) { base.ApplyDetails(sav, criteria, pk); pk.FatefulEncounter = true; }
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); }
public PKM ConvertToPKM(ITrainerInfo tr, EncounterCriteria criteria) => ConvertToPB7(tr, criteria);