Encounter Templates: Searching and Creating (#3955)

We implement simple state machine iterators to iterate through every split type encounter array, and more finely control the path we iterate through. And, by using generics, we can have the compiler generate optimized code to avoid virtual calls.

In addition to this, we shift away from the big-5 encounter types and not inherit from an abstract class. This allows for creating a PK* of a specific type and directly writing properties (no virtual calls). Plus we can now fine-tune each encounter type to call specific code, and not have to worry about future game encounter types bothering the generation routines.
This commit is contained in:
Kurt 2023-08-12 16:01:16 -07:00 committed by GitHub
parent 18812550e8
commit f632aedd15
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
405 changed files with 22165 additions and 13346 deletions

View file

@ -31,9 +31,7 @@ public static class CatchRateApplicator
var enc = la.EncounterMatch;
switch (enc)
{
case EncounterTrade1 c:
return c.GetInitialCatchRate();
case EncounterStatic1E { Version: GameVersion.Stadium, Species: (int)Species.Psyduck}:
case EncounterGift1 { Version: GameVersion.Stadium, Species: (int)Species.Psyduck }:
return pk.Japanese ? (byte)167 : (byte)168; // Amnesia Psyduck has different catch rates depending on language
default:
var pt = GetPersonalTable(sav, enc);

View file

@ -64,8 +64,6 @@ public static class MoveApplicator
pk.SetMoves(moves);
if (maxPP && Legal.IsPPUpAvailable(pk))
pk.SetMaximumPPUps(moves);
else
pk.SetMaximumPPCurrent(moves);
pk.FixMoves();
}

View file

@ -48,7 +48,6 @@ public static class MoveSetApplicator
var clone = pk.Clone();
clone.SetMoves(moves);
clone.SetMaximumPPCurrent(moves);
var newLa = new LegalityAnalysis(clone);
if (newLa.Valid)

View file

@ -538,7 +538,9 @@ public static class BatchEditing
{
if (cmd.PropertyName == nameof(PKM.IVs))
{
pk.SetRandomIVs();
var la = new LegalityAnalysis(pk);
var flawless = la.EncounterMatch is IFlawlessIVCount fc ? fc.FlawlessIVCount : 0;
pk.SetRandomIVs(flawless);
return;
}

View file

@ -120,7 +120,6 @@ internal static class BatchModifications
public static ModifyResult SetMoves(PKM pk, ReadOnlySpan<ushort> moves)
{
pk.SetMoves(moves);
pk.HealPP();
return ModifyResult.Modified;
}

View file

@ -403,7 +403,7 @@ public static class CommonEdits
/// <param name="la">Precomputed optional</param>
public static void SetDefaultNickname(this PKM pk, LegalityAnalysis la)
{
if (la is { Parsed: true, EncounterOriginal: EncounterTrade {HasNickname: true} t })
if (la is { Parsed: true, EncounterOriginal: IFixedNickname {IsFixedNickname: true} t })
pk.SetNickname(t.GetNickname(pk.Language));
else
pk.ClearNickname();

View file

@ -1,4 +1,4 @@
using System.Collections.Generic;
using System.Collections.Generic;
using System.Linq;
namespace PKHeX.Core;
@ -139,7 +139,7 @@ public sealed class TrainerDatabase
if (pk is IRegionOrigin r)
r.CopyRegionOrigin(result);
else
result.SetDefaultRegionOrigins();
result.SetDefaultRegionOrigins(result.Language);
return result;
}

View file

@ -1,4 +1,4 @@
using System.Collections.Generic;
using System.Collections.Generic;
using System.Linq;
using static PKHeX.Core.MessageStrings;
@ -9,7 +9,7 @@ namespace PKHeX.Core;
/// </summary>
public static class EntitySuggestionUtil
{
public static List<string> GetMetLocationSuggestionMessage(PKM pk, int level, int location, int minimumLevel)
public static List<string> GetMetLocationSuggestionMessage(PKM pk, int level, int location, int minimumLevel, IEncounterable? enc)
{
var suggestion = new List<string> { MsgPKMSuggestionStart };
if (pk.Format >= 3)
@ -19,6 +19,22 @@ public static class EntitySuggestionUtil
suggestion.Add($"{MsgPKMSuggestionMetLocation} {locationName}");
suggestion.Add($"{MsgPKMSuggestionMetLevel} {level}");
}
else if (pk is ICaughtData2)
{
var metList = GameInfo.GetLocationList(GameVersion.C, pk.Context);
string locationName;
if (enc?.Version.Contains(GameVersion.C) == true)
{
locationName = metList.First(loc => loc.Value == location).Text;
}
else
{
locationName = metList[0].Text;
level = 0;
}
suggestion.Add($"{MsgPKMSuggestionMetLocation} {locationName}");
suggestion.Add($"{MsgPKMSuggestionMetLevel} {level}");
}
if (pk.CurrentLevel < minimumLevel)
suggestion.Add($"{MsgPKMSuggestionLevel} {minimumLevel}");
return suggestion;

View file

@ -105,5 +105,4 @@ public sealed class EventUnlocker8b : EventUnlocker<SAV8BS>
for (int i = FASHION_START; i <= FASHION_END; i++)
SAV.FlagWork.SetFlag(i, true);
}
}

View file

@ -12,23 +12,23 @@ public sealed class ItemStorage2 : IItemStorage
private static ReadOnlySpan<ushort> Pouch_Items_GSC => new ushort[]
{
003, 008, 009,
003, 008, 009,
010, 011, 012, 013, 014, 015, 016, 017, 018, 019,
020, 021, 022, 023, 024, 026, 027, 028, 029,
030, 031, 032, 033, 034, 035, 036, 037, 038, 039,
040, 041, 042, 043, 044, 046, 047, 048, 049,
051, 052, 053, 057,
051, 052, 053, 057,
060, 062, 063, 064, 065,
072, 073, 074, 075, 076, 077, 078, 079,
072, 073, 074, 075, 076, 077, 078, 079,
080, 081, 082, 083, 084, 085, 086, 087, 088, 089,
091, 092, 093, 094, 095, 096, 097, 098, 099,
101, 102, 103, 104, 105, 106, 107, 108, 109,
091, 092, 093, 094, 095, 096, 097, 098, 099,
101, 102, 103, 104, 105, 106, 107, 108, 109,
110, 111, 112, 113, 114, 117, 118, 119,
121, 122, 123, 124, 125, 126,
131, 132, 138, 139,
121, 122, 123, 124, 125, 126,
131, 132, 138, 139,
140, 143, 144, 146,
150, 151, 152, 156, 158,
163, 167, 168, 169,
163, 167, 168, 169,
170, 172, 173, 174,
180, 181, 182, 183, 184, 185, 186, 187, 188, 189,
};
@ -40,7 +40,7 @@ public sealed class ItemStorage2 : IItemStorage
private static ReadOnlySpan<ushort> Pouch_Key_GS => new ushort[]
{
7, 54, 55, 58, 59, 61, 66, 67, 68, 69, 71, 127, 128, 130, 133, 134, 175, 178,
007, 054, 055, 058, 059, 061, 066, 067, 068, 069, 071, 127, 128, 130, 133, 134, 175, 178,
};
private const int ExtraKeyCrystal = 4;
@ -53,10 +53,10 @@ public sealed class ItemStorage2 : IItemStorage
private static ReadOnlySpan<ushort> Pouch_TMHM_GSC => new ushort[]
{
191, 192, 193, 194, 196, 197, 198, 199,
191, 192, 193, 194, 196, 197, 198, 199,
200, 201, 202, 203, 204, 205, 206, 207, 208, 209,
210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
221, 222, 223, 224, 225, 226, 227, 228, 229,
221, 222, 223, 224, 225, 226, 227, 228, 229,
230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
240, 241, 242, 243, 244, 245, 246, 247, 248, 249,
};

View file

@ -1,22 +0,0 @@
namespace PKHeX.Core;
/// <summary>
/// Represents an Area where <see cref="PKM"/> can be encountered, which contains a Location ID and <see cref="EncounterSlot"/> data.
/// </summary>
public abstract record EncounterArea(GameVersion Version) : IVersion
{
public int Location { get; protected init; }
public SlotType Type { get; protected init; }
/// <summary>
/// Checks if the provided met location ID matches the parameters for the area.
/// </summary>
/// <param name="location">Met Location ID</param>
/// <returns>True if possibly originated from this area, false otherwise.</returns>
public virtual bool IsMatchLocation(int location) => Location == location;
}
internal interface IMemorySpeciesArea
{
bool HasSpecies(ushort species);
}

View file

@ -1,72 +0,0 @@
using System;
using System.Collections.Generic;
namespace PKHeX.Core;
/// <inheritdoc cref="EncounterArea" />
/// <summary>
/// <see cref="GameVersion.RBY"/> encounter area
/// </summary>
public sealed record EncounterArea1 : EncounterArea
{
public readonly int Rate;
public readonly EncounterSlot1[] Slots;
public static EncounterArea1[] GetAreas(BinLinkerAccessor input, GameVersion game)
{
var result = new EncounterArea1[input.Length];
for (int i = 0; i < result.Length; i++)
result[i] = new EncounterArea1(input[i], game);
return result;
}
private EncounterArea1(ReadOnlySpan<byte> data, GameVersion game) : base(game)
{
Location = data[0];
// 1 byte unused
Type = (SlotType)data[2];
Rate = data[3];
var next = data[4..];
int count = next.Length / 4;
var slots = new EncounterSlot1[count];
for (int i = 0; i < slots.Length; i++)
{
const int size = 4;
var entry = next.Slice(i * size, size);
byte max = entry[3];
byte min = entry[2];
byte slotNum = entry[1];
byte species = entry[0];
slots[i] = new EncounterSlot1(this, species, min, max, slotNum);
}
Slots = slots;
}
public IEnumerable<EncounterSlot1> GetMatchingSlots(PKM pk, EvoCriteria[] chain)
{
(bool useCatchRate, byte rate) = pk is PK1 pk1 ? (true, pk1.Catch_Rate) : (false, (byte)0);
foreach (var slot in Slots)
{
foreach (var evo in chain)
{
if (slot.Species != evo.Species)
continue;
if (slot.LevelMin > evo.LevelMax)
break;
if (slot.Form != evo.Form)
break;
if (useCatchRate)
{
var expect = (slot.Version == GameVersion.YW ? PersonalTable.Y : PersonalTable.RB)[slot.Species].CatchRate;
if (expect != rate && !(ParseSettings.AllowGen1Tradeback && GBRestrictions.IsTradebackCatchRate(rate)))
break;
}
yield return slot;
break;
}
}
}
}

View file

@ -1,128 +0,0 @@
using System;
using System.Collections.Generic;
namespace PKHeX.Core;
/// <inheritdoc cref="EncounterArea" />
/// <summary>
/// <see cref="GameVersion.GSC"/> encounter area
/// </summary>
public sealed record EncounterArea2 : EncounterArea
{
private static ReadOnlySpan<byte> BCC_SlotRates => new byte[] { 20, 20, 10, 10, 05, 05, 10, 10, 05, 05 };
private static ReadOnlySpan<byte> RatesGrass => new byte[] { 30, 30, 20, 10, 5, 4, 1 };
private static ReadOnlySpan<byte> RatesSurf => new byte[] { 60, 30, 10 };
internal readonly EncounterTime Time;
public readonly byte Rate;
public readonly byte[]? Rates;
public readonly EncounterSlot2[] Slots;
public static EncounterArea2[] GetAreas(BinLinkerAccessor input, GameVersion game)
{
var result = new EncounterArea2[input.Length];
for (int i = 0; i < result.Length; i++)
result[i] = new EncounterArea2(input[i], game);
return result;
}
private EncounterArea2(ReadOnlySpan<byte> data, GameVersion game) : base(game)
{
Location = data[0];
Time = (EncounterTime)data[1];
var type = (Type = (SlotType)data[2]) & (SlotType)0xF;
Rate = data[3];
var next = data[4..];
if (type is > SlotType.Surf and not SlotType.BugContest) // Not Grass/Surf
{
const int size = 5;
int count = next.Length / size;
Rates = next[..count].ToArray();
Slots = ReadSlots(next[count..], count);
}
else
{
const int size = 4;
int count = next.Length / size;
Rates = null; // fetch as needed.
Slots = ReadSlots(next, count);
}
}
private EncounterSlot2[] ReadSlots(ReadOnlySpan<byte> data, int count)
{
const int size = 4;
var slots = new EncounterSlot2[count];
for (int i = 0; i < slots.Length; i++)
{
var entry = data.Slice(i * size, size);
byte max = entry[3];
byte min = entry[2];
byte slotNum = entry[1];
byte species = entry[0];
slots[i] = new EncounterSlot2(this, species, min, max, slotNum);
}
return slots;
}
public IEnumerable<EncounterSlot2> GetMatchingSlots(PKM pk, EvoCriteria[] chain)
{
if (pk is not ICaughtData2 {CaughtData: not 0} pk2)
return GetSlotsFuzzy(chain);
if (pk2.Met_Location != Location)
return Array.Empty<EncounterSlot2>();
return GetSlotsSpecificLevelTime(chain, pk2.Met_TimeOfDay, pk2.Met_Level);
}
private IEnumerable<EncounterSlot2> GetSlotsSpecificLevelTime(EvoCriteria[] chain, int time, int lvl)
{
foreach (var slot in Slots)
{
foreach (var evo in chain)
{
if (slot.Species != evo.Species)
continue;
if (slot.Form != evo.Form)
{
if (slot.Species != (int)Species.Unown || evo.Form >= 26) // Don't yield !? forms
break;
}
if (!slot.IsLevelWithinRange(lvl))
break;
if (!Time.Contains(time))
break;
yield return slot;
break;
}
}
}
private IEnumerable<EncounterSlot2> GetSlotsFuzzy(EvoCriteria[] chain)
{
foreach (var slot in Slots)
{
foreach (var evo in chain)
{
if (slot.Species != evo.Species)
continue;
if (slot.Form != evo.Form)
{
if (slot.Species != (int) Species.Unown || evo.Form >= 26) // Don't yield !? forms
break;
}
if (slot.LevelMin > evo.LevelMax)
break;
yield return slot;
break;
}
}
}
}

View file

@ -1,74 +0,0 @@
using System;
using System.Collections.Generic;
namespace PKHeX.Core;
/// <inheritdoc cref="EncounterArea" />
/// <summary>
/// <see cref="GameVersion.XD"/> encounter area
/// </summary>
public sealed record EncounterArea3XD : EncounterArea
{
public readonly EncounterSlot3PokeSpot[] Slots;
public EncounterArea3XD(int loc, ushort s0, byte l0, ushort s1, byte l1, ushort s2, byte l2) : base(GameVersion.XD)
{
Location = loc;
Type = SlotType.Grass;
Slots = new[]
{
new EncounterSlot3PokeSpot(this, s0, 10, l0, 0),
new EncounterSlot3PokeSpot(this, s1, 10, l1, 1),
new EncounterSlot3PokeSpot(this, s2, 10, l2, 2),
};
}
public IEnumerable<EncounterSlot3PokeSpot> GetMatchingSlots(PKM pk, EvoCriteria[] chain)
{
if (pk.Format != 3) // Met Location and Met Level are changed on PK3->PK4
return GetSlotsFuzzy(chain);
if (pk.Met_Location != Location)
return Array.Empty<EncounterSlot3PokeSpot>();
return GetSlotsMatching(chain, pk.Met_Level);
}
private IEnumerable<EncounterSlot3PokeSpot> GetSlotsMatching(EvoCriteria[] chain, int lvl)
{
foreach (var slot in Slots)
{
foreach (var evo in chain)
{
if (slot.Species != evo.Species)
continue;
if (slot.Form != evo.Form)
break;
if (!slot.IsLevelWithinRange(lvl))
break;
yield return slot;
break;
}
}
}
private IEnumerable<EncounterSlot3PokeSpot> GetSlotsFuzzy(EvoCriteria[] chain)
{
foreach (var slot in Slots)
{
foreach (var evo in chain)
{
if (slot.Species != evo.Species)
continue;
if (slot.Form != evo.Form)
break;
if (slot.LevelMin > evo.LevelMax)
break;
yield return slot;
break;
}
}
}
}

View file

@ -1,167 +0,0 @@
using System;
using System.Collections.Generic;
using static System.Buffers.Binary.BinaryPrimitives;
namespace PKHeX.Core;
/// <inheritdoc cref="EncounterArea" />
/// <summary>
/// <see cref="GameVersion.Gen4"/> encounter area
/// </summary>
public sealed record EncounterArea4 : EncounterArea
{
public readonly int Rate;
public readonly GroundTileAllowed GroundTile;
public readonly EncounterSlot4[] Slots;
public static EncounterArea4[] GetAreas(BinLinkerAccessor input, GameVersion game)
{
var result = new EncounterArea4[input.Length];
for (int i = 0; i < result.Length; i++)
result[i] = new EncounterArea4(input[i], game);
return result;
}
private EncounterArea4(ReadOnlySpan<byte> data, GameVersion game) : base(game)
{
Location = ReadUInt16LittleEndian(data);
Type = (SlotType)data[2];
Rate = data[3];
// although GroundTilePermission flags are 32bit, none have values > 16bit.
GroundTile = (GroundTileAllowed)ReadUInt16LittleEndian(data[4..]);
Slots = ReadRegularSlots(data);
}
private EncounterSlot4[] ReadRegularSlots(ReadOnlySpan<byte> data)
{
const int size = 10;
int count = (data.Length - 6) / size;
var slots = new EncounterSlot4[count];
for (int i = 0; i < slots.Length; i++)
{
int offset = 6 + (size * i);
var entry = data.Slice(offset, size);
slots[i] = ReadRegularSlot(entry);
}
return slots;
}
private EncounterSlot4 ReadRegularSlot(ReadOnlySpan<byte> entry)
{
ushort species = ReadUInt16LittleEndian(entry);
byte form = entry[2];
byte slotNum = entry[3];
byte min = entry[4];
byte max = entry[5];
byte mpi = entry[6];
byte mpc = entry[7];
byte sti = entry[8];
byte stc = entry[9];
return new EncounterSlot4(this, species, form, min, max, slotNum, mpi, mpc, sti, stc);
}
public IEnumerable<EncounterSlot4> GetMatchingSlots(PKM pk, EvoCriteria[] chain)
{
if (pk.Format != 4) // Met Location and Met Level are changed on PK4->PK5
return GetSlotsFuzzy(chain);
if (pk.Met_Location != Location)
return Array.Empty<EncounterSlot4>();
return GetSlotsMatching(chain, pk.Met_Level, pk);
}
private IEnumerable<EncounterSlot4> GetSlotsMatching(EvoCriteria[] chain, int lvl, PKM pk)
{
foreach (var slot in Slots)
{
foreach (var evo in chain)
{
if (slot.Species != evo.Species)
continue;
if (slot.Form != evo.Form && slot.Species is not (int)Species.Burmy)
{
// Unown forms are random, not specific form IDs
if (!slot.IsRandomUnspecificForm)
break;
}
if (!slot.IsLevelWithinRange(lvl))
break;
if (Type is SlotType.HoneyTree && IsInaccessibleHoneySlotLocation(slot, pk))
break;
yield return slot;
break;
}
}
}
private static bool IsInaccessibleHoneySlotLocation(EncounterSlot4 slot, PKM pk)
{
// A/B/C tables, only Munchlax is a 'C' encounter, and A/B are accessible from any tree.
// C table encounters are only available from 4 trees, which are determined by TID16/SID16 of the save file.
if (slot.Species is not (int)Species.Munchlax)
return false;
// We didn't encode the honey tree index to the encounter slot resource.
// Check if any of the slot's location doesn't match any of the groupC trees' area location ID.
var location = pk.Met_Location;
var trees = SAV4Sinnoh.CalculateMunchlaxTrees(pk.TID16, pk.SID16);
return LocationID_HoneyTree[trees.Tree1] != location
&& LocationID_HoneyTree[trees.Tree2] != location
&& LocationID_HoneyTree[trees.Tree3] != location
&& LocationID_HoneyTree[trees.Tree4] != location;
}
private static ReadOnlySpan<byte> LocationID_HoneyTree => new byte[]
{
20, // 00 Route 205 Floaroma
20, // 01 Route 205 Eterna
21, // 02 Route 206
22, // 03 Route 207
23, // 04 Route 208
24, // 05 Route 209
25, // 06 Route 210 Solaceon
25, // 07 Route 210 Celestic
26, // 08 Route 211
27, // 09 Route 212 Hearthome
27, // 10 Route 212 Pastoria
28, // 11 Route 213
29, // 12 Route 214
30, // 13 Route 215
33, // 14 Route 218
36, // 15 Route 221
37, // 16 Route 222
47, // 17 Valley Windworks
48, // 18 Eterna Forest
49, // 19 Fuego Ironworks
58, // 20 Floaroma Meadow
};
// original met level cannot be inferred
private IEnumerable<EncounterSlot4> GetSlotsFuzzy(EvoCriteria[] chain)
{
foreach (var slot in Slots)
{
foreach (var evo in chain)
{
if (slot.Species != evo.Species)
continue;
if (slot.Form != evo.Form && slot.Species is not (int)Species.Burmy)
{
// Unown forms are random, not specific form IDs
if (!slot.IsRandomUnspecificForm)
break;
}
if (slot.LevelMin > evo.LevelMax)
break;
yield return slot;
break;
}
}
}
}

View file

@ -1,99 +0,0 @@
using System;
using System.Collections.Generic;
using static System.Buffers.Binary.BinaryPrimitives;
namespace PKHeX.Core;
/// <inheritdoc cref="EncounterArea" />
/// <summary>
/// <see cref="GameVersion.ORAS"/> encounter area
/// </summary>
public sealed record EncounterArea6AO : EncounterArea, IMemorySpeciesArea
{
public readonly EncounterSlot6AO[] Slots;
public static EncounterArea6AO[] GetAreas(BinLinkerAccessor input, GameVersion game)
{
var result = new EncounterArea6AO[input.Length];
for (int i = 0; i < result.Length; i++)
result[i] = new EncounterArea6AO(input[i], game);
return result;
}
private EncounterArea6AO(ReadOnlySpan<byte> data, GameVersion game) : base(game)
{
Location = ReadInt16LittleEndian(data);
Type = (SlotType)data[2];
Slots = ReadSlots(data);
}
private EncounterSlot6AO[] ReadSlots(ReadOnlySpan<byte> data)
{
const int size = 4;
int count = (data.Length - 4) / size;
var slots = new EncounterSlot6AO[count];
for (int i = 0; i < slots.Length; i++)
{
int offset = 4 + (size * i);
var entry = data.Slice(offset, size);
slots[i] = ReadSlot(entry);
}
return slots;
}
private EncounterSlot6AO ReadSlot(ReadOnlySpan<byte> entry)
{
ushort species = ReadUInt16LittleEndian(entry);
byte form = (byte)(species >> 11);
species &= 0x3FF;
byte min = entry[2];
byte max = entry[3];
return new EncounterSlot6AO(this, species, form, min, max);
}
private const int FluteBoostMin = 4; // White Flute decreases levels.
private const int FluteBoostMax = 4; // Black Flute increases levels.
private const int DexNavBoost = 30; // Maximum DexNav chain
public IEnumerable<EncounterSlot6AO> GetMatchingSlots(PKM pk, EvoCriteria[] chain)
{
foreach (var slot in Slots)
{
foreach (var evo in chain)
{
if (slot.Species != evo.Species)
continue;
var boostMax = Type != SlotType.Rock_Smash ? DexNavBoost : FluteBoostMax;
const int boostMin = FluteBoostMin;
if (!slot.IsLevelWithinRange(pk.Met_Level, boostMin, boostMax))
break;
if (slot.Form != evo.Form && !slot.IsRandomUnspecificForm)
break;
// Track some metadata about how this slot was matched.
var clone = slot with
{
WhiteFlute = evo.LevelMin < slot.LevelMin,
BlackFlute = evo.LevelMin > slot.LevelMax && evo.LevelMin <= slot.LevelMax + FluteBoostMax,
DexNav = slot.CanDexNav && (evo.LevelMin != slot.LevelMax || pk.RelearnMove1 != 0 || pk.AbilityNumber == 4),
};
yield return clone;
break;
}
}
}
public bool HasSpecies(ushort species)
{
foreach (var slot in Slots)
{
if (slot.Species == species)
return true;
}
return false;
}
}

View file

@ -1,112 +0,0 @@
using System;
using System.Collections.Generic;
using static System.Buffers.Binary.BinaryPrimitives;
namespace PKHeX.Core;
/// <inheritdoc cref="EncounterArea" />
/// <summary>
/// <see cref="GameVersion.GO"/> encounter area for <see cref="GameVersion.GG"/>
/// </summary>
public sealed record EncounterArea7g : EncounterArea, ISpeciesForm
{
/// <summary> Species for the area </summary>
/// <remarks> Due to how the encounter data is packaged by PKHeX, each species-form is grouped together. </remarks>
public ushort Species { get; }
/// <summary> Form of the Species </summary>
public byte Form { get; }
public readonly EncounterSlot7GO[] Slots;
private EncounterArea7g(ushort species, byte form, EncounterSlot7GO[] slots) : base(GameVersion.GO)
{
Species = species;
Form = form;
Location = Locations.GO7;
Slots = slots;
}
internal static EncounterArea7g[] GetArea(BinLinkerAccessor data)
{
var areas = new EncounterArea7g[data.Length];
for (int i = 0; i < areas.Length; i++)
areas[i] = GetArea(data[i]);
return areas;
}
private const int meta = 4;
private const int entrySize = (2 * sizeof(int)) + 2;
private static EncounterArea7g GetArea(ReadOnlySpan<byte> data)
{
var species = ReadUInt16LittleEndian(data);
var form = data[2];
//var import = (EntityFormatDetected)data[3];
data = data[meta..];
var result = new EncounterSlot7GO[data.Length / entrySize];
var area = new EncounterArea7g(species, form, result);
for (int i = 0; i < result.Length; i++)
{
var offset = i * entrySize;
var entry = data.Slice(offset, entrySize);
result[i] = ReadSlot(entry, area, species, form);
}
return area;
}
private static EncounterSlot7GO ReadSlot(ReadOnlySpan<byte> entry, EncounterArea7g area, ushort species, byte form)
{
int start = ReadInt32LittleEndian(entry);
int end = ReadInt32LittleEndian(entry[4..]);
var sg = entry[8];
var shiny = (Shiny)(sg & 0x3F);
var gender = (Gender)(sg >> 6);
var type = (PogoType)entry[9];
return new EncounterSlot7GO(area, species, form, start, end, shiny, gender, type);
}
public IEnumerable<EncounterSlot7GO> GetMatchingSlots(PKM pk, EvoCriteria[] chain)
{
var sf = Array.Find(chain, z => z.Species == Species && z.Form == Form);
if (sf == default)
return Array.Empty<EncounterSlot7GO>();
return GetMatchingSlots(pk, sf);
}
public IEnumerable<EncounterSlot7GO> GetMatchingSlots(PKM pk, EvoCriteria evo)
{
// Find the first chain that has slots defined.
// Since it is possible to evolve before transferring, we only need the highest evolution species possible.
// PoGoEncTool has already extrapolated the evolutions to separate encounters!
var stamp = EncounterSlotGO.GetTimeStamp(pk.Met_Year + 2000, pk.Met_Month, pk.Met_Day);
var met = Math.Max(evo.LevelMin, pk.Met_Level);
EncounterSlot7GO? deferredIV = null;
foreach (var slot in Slots)
{
if (!slot.IsLevelWithinRange(met))
continue;
//if (!slot.IsBallValid(ball)) -- can have any of the in-game balls due to re-capture
// continue;
if (!slot.Shiny.IsValid(pk))
continue;
//if (slot.Gender != Gender.Random && (int) slot.Gender != pk.Gender)
// continue;
if (!slot.IsWithinStartEnd(stamp))
continue;
if (!slot.GetIVsValid(pk))
{
deferredIV ??= slot;
continue;
}
yield return slot;
}
if (deferredIV != null)
yield return deferredIV;
}
}

View file

@ -1,131 +0,0 @@
using System;
using System.Collections.Generic;
using static System.Buffers.Binary.BinaryPrimitives;
namespace PKHeX.Core;
/// <inheritdoc cref="EncounterArea" />
/// <summary>
/// <see cref="GameVersion.GO"/> encounter area for direct-to-HOME transfers.
/// </summary>
public sealed record EncounterArea8g : EncounterArea, ISpeciesForm
{
/// <summary> Species for the area </summary>
/// <remarks> Due to how the encounter data is packaged by PKHeX, each species-form is grouped together. </remarks>
public ushort Species { get; }
/// <summary> Form of the Species </summary>
public byte Form { get; }
public readonly EncounterSlot8GO[] Slots;
private EncounterArea8g(ushort species, byte form, EncounterSlot8GO[] slots) : base(GameVersion.GO)
{
Species = species;
Form = form;
Location = Locations.GO8;
Slots = slots;
}
internal static EncounterArea8g[] GetArea(BinLinkerAccessor data)
{
var areas = new EncounterArea8g[data.Length];
for (int i = 0; i < areas.Length; i++)
areas[i] = GetArea(data[i]);
return areas;
}
private const int meta = 4;
private const int entrySize = (2 * sizeof(int)) + 2;
private static EncounterArea8g GetArea(ReadOnlySpan<byte> data)
{
var species = ReadUInt16LittleEndian(data);
var form = data[2];
var import = (PogoImportFormat)data[3];
data = data[meta..];
var result = new EncounterSlot8GO[data.Length / entrySize];
var area = new EncounterArea8g(species, form, result);
for (int i = 0; i < result.Length; i++)
{
var offset = i * entrySize;
var entry = data.Slice(offset, entrySize);
result[i] = ReadSlot(entry, area, species, form, import);
}
return area;
}
private static EncounterSlot8GO ReadSlot(ReadOnlySpan<byte> entry, EncounterArea8g area, ushort species, byte form, PogoImportFormat format)
{
int start = ReadInt32LittleEndian(entry);
int end = ReadInt32LittleEndian(entry[4..]);
var sg = entry[8];
var shiny = (Shiny)(sg & 0x3F);
var gender = (Gender)(sg >> 6);
var type = (PogoType)entry[9];
return new EncounterSlot8GO(area, species, form, start, end, shiny, gender, type, format);
}
public IEnumerable<EncounterSlot8GO> GetMatchingSlots(PKM pk, EvoCriteria[] chain)
{
// Find the first chain that has slots defined.
// Since it is possible to evolve before transferring, we only need the highest evolution species possible.
// PoGoEncTool has already extrapolated the evolutions to separate encounters!
var sf = FindCriteriaToIterate(pk, chain);
if (sf == default)
return Array.Empty<EncounterSlot8GO>();
return GetMatchingSlots(pk, sf);
}
public IEnumerable<EncounterSlot8GO> GetMatchingSlots(PKM pk, EvoCriteria evo)
{
var species = pk.Species;
var ball = (Ball)pk.Ball;
var met = Math.Max(evo.LevelMin, pk.Met_Level);
EncounterSlot8GO? deferredIV = null;
foreach (var slot in Slots)
{
if (!slot.IsLevelWithinRange(met))
continue;
if (!slot.IsBallValid(ball, species, pk))
continue;
if (!slot.Shiny.IsValid(pk))
continue;
if (slot.Gender != Gender.Random && (int)slot.Gender != pk.Gender)
continue;
if (!slot.GetIVsValid(pk))
{
deferredIV ??= slot;
continue;
}
yield return slot;
}
if (deferredIV != null)
yield return deferredIV;
}
private EvoCriteria FindCriteriaToIterate(PKM pk, EvoCriteria[] chain)
{
foreach (var evo in chain)
{
if (evo.Species != Species)
continue;
if (evo.Form == Form)
return evo;
// Check for form mismatches
if (FormInfo.IsFormChangeable(Species, Form, evo.Form, EntityContext.Gen8, pk.Context))
return evo;
if (Species == (int)Core.Species.Burmy)
return evo;
break;
}
return default;
}
}

View file

@ -1,89 +0,0 @@
using System;
using System.Collections.Generic;
using static System.Buffers.Binary.BinaryPrimitives;
namespace PKHeX.Core;
/// <inheritdoc cref="EncounterArea" />
/// <summary>
/// <see cref="GameVersion.SV"/> encounter area
/// </summary>
public sealed record EncounterArea9 : EncounterArea
{
public readonly EncounterSlot9[] Slots;
public ushort CrossFrom { get; }
public static EncounterArea9[] GetAreas(BinLinkerAccessor input, GameVersion game)
{
var result = new EncounterArea9[input.Length];
for (int i = 0; i < result.Length; i++)
result[i] = new EncounterArea9(input[i], game);
return result;
}
private EncounterArea9(ReadOnlySpan<byte> areaData, GameVersion game) : base(game)
{
Location = areaData[0];
CrossFrom = areaData[2];
Slots = ReadSlots(areaData[4..]);
}
private EncounterSlot9[] ReadSlots(ReadOnlySpan<byte> areaData)
{
const int size = 8;
var result = new EncounterSlot9[areaData.Length / size];
for (int i = 0; i < result.Length; i++)
{
var slot = areaData[(i * size)..];
var species = ReadUInt16LittleEndian(slot);
var form = slot[2];
var gender = (sbyte)slot[3];
var min = slot[4];
var max = slot[5];
var time = slot[6];
result[i] = new EncounterSlot9(this, species, form, min, max, gender, time);
}
return result;
}
public IEnumerable<EncounterSlot9> GetMatchingSlots(PKM pk, EvoCriteria[] chain)
{
var lvl = pk.Met_Level;
foreach (var slot in Slots)
{
foreach (var evo in chain)
{
if (slot.Species != evo.Species)
continue;
if (slot.Form != evo.Form && !slot.IsRandomUnspecificForm && !IsFormOkayWild(slot.Species, evo.Form))
break;
if (slot.Gender != -1 && pk.Gender != slot.Gender)
break;
if (!slot.IsLevelWithinRange(lvl))
break;
if (pk is ITeraType t)
{
var orig = (byte)t.TeraTypeOriginal;
var pi = PersonalTable.SV[slot.Species, slot.Form];
if (pi.Type1 != orig && pi.Type2 != orig)
break;
}
yield return slot;
break;
}
}
}
private static bool IsFormOkayWild(ushort species, byte form) => species switch
{
(int)Species.Rotom => form <= 5,
(int)Species.Deerling or (int)Species.Sawsbuck => form < 4,
(int)Species.Oricorio => form < 4,
_ => false,
};
}

View file

@ -1,3 +1,6 @@
namespace PKHeX.Core.Bulk;
/// <summary>
/// Tuple wrapper to store a legality analysis result and the slot it was generated from.
/// </summary>
public sealed record CombinedReference(SlotCache Slot, LegalityAnalysis Analysis);

View file

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using static PKHeX.Core.EncountersWC3;
@ -11,38 +12,69 @@ namespace PKHeX.Core;
/// </summary>
public static class EncounterEvent
{
#region Pickle Data
/// <summary>Event Database for Generation 3</summary>
public static IReadOnlyList<WC3> MGDB_G3 { get; private set; } = Array.Empty<WC3>();
public static WC3[] MGDB_G3 => Encounter_WC3;
/// <summary>Event Database for Generation 4</summary>
public static IReadOnlyList<PCD> MGDB_G4 { get; private set; } = Array.Empty<PCD>();
public static readonly PCD[] MGDB_G4 = GetPCDDB(Util.GetBinaryResource("wc4.pkl"));
/// <summary>Event Database for Generation 5</summary>
public static IReadOnlyList<PGF> MGDB_G5 { get; private set; } = Array.Empty<PGF>();
public static readonly PGF[] MGDB_G5 = GetPGFDB(Util.GetBinaryResource("pgf.pkl"));
/// <summary>Event Database for Generation 6</summary>
public static IReadOnlyList<WC6> MGDB_G6 { get; private set; } = Array.Empty<WC6>();
public static readonly WC6[] MGDB_G6 = GetWC6DB(Util.GetBinaryResource("wc6.pkl"), Util.GetBinaryResource("wc6full.pkl"));
/// <summary>Event Database for Generation 7</summary>
public static IReadOnlyList<WC7> MGDB_G7 { get; private set; } = Array.Empty<WC7>();
public static readonly WC7[] MGDB_G7 = GetWC7DB(Util.GetBinaryResource("wc7.pkl"), Util.GetBinaryResource("wc7full.pkl"));
/// <summary>Event Database for Generation 7 <see cref="GameVersion.GG"/></summary>
public static IReadOnlyList<WB7> MGDB_G7GG { get; private set; } = Array.Empty<WB7>();
public static readonly WB7[] MGDB_G7GG = GetWB7DB(Util.GetBinaryResource("wb7full.pkl"));
/// <summary>Event Database for Generation 8</summary>
public static IReadOnlyList<WC8> MGDB_G8 { get; private set; } = Array.Empty<WC8>();
public static readonly WC8[] MGDB_G8 = GetWC8DB(Util.GetBinaryResource("wc8.pkl"));
/// <summary>Event Database for Generation 8 <see cref="GameVersion.PLA"/></summary>
public static IReadOnlyList<WA8> MGDB_G8A { get; private set; } = Array.Empty<WA8>();
public static readonly WA8[] MGDB_G8A = GetWA8DB(Util.GetBinaryResource("wa8.pkl"));
/// <summary>Event Database for Generation 8 <see cref="GameVersion.BDSP"/></summary>
public static IReadOnlyList<WB8> MGDB_G8B { get; private set; } = Array.Empty<WB8>();
public static readonly WB8[] MGDB_G8B = GetWB8DB(Util.GetBinaryResource("wb8.pkl"));
/// <summary>Event Database for Generation 9 <see cref="GameVersion.SV"/></summary>
public static IReadOnlyList<WC9> MGDB_G9 { get; private set; } = Array.Empty<WC9>();
public static readonly WC9[] MGDB_G9 = GetWC9DB(Util.GetBinaryResource("wc9.pkl"));
#endregion
#region Locally Loaded Data
/// <summary>Event Database for Generation 4</summary>
public static PCD[] EGDB_G4 { get; private set; } = Array.Empty<PCD>();
/// <summary>Event Database for Generation 5</summary>
public static PGF[] EGDB_G5 { get; private set; } = Array.Empty<PGF>();
/// <summary>Event Database for Generation 6</summary>
public static WC6[] EGDB_G6 { get; private set; } = Array.Empty<WC6>();
/// <summary>Event Database for Generation 7</summary>
public static WC7[] EGDB_G7 { get; private set; } = Array.Empty<WC7>();
/// <summary>Event Database for Generation 7 <see cref="GameVersion.GG"/></summary>
public static WB7[] EGDB_G7GG { get; private set; } = Array.Empty<WB7>();
/// <summary>Event Database for Generation 8</summary>
public static WC8[] EGDB_G8 { get; private set; } = Array.Empty<WC8>();
/// <summary>Event Database for Generation 8 <see cref="GameVersion.PLA"/></summary>
public static WA8[] EGDB_G8A { get; private set; } = Array.Empty<WA8>();
/// <summary>Event Database for Generation 8 <see cref="GameVersion.BDSP"/></summary>
public static WB8[] EGDB_G8B { get; private set; } = Array.Empty<WB8>();
/// <summary>Event Database for Generation 9 <see cref="GameVersion.SV"/></summary>
public static WC9[] EGDB_G9 { get; private set; } = Array.Empty<WC9>();
#endregion
/// <summary>Indicates if the databases are initialized.</summary>
public static bool Initialized => MGDB_G3.Count != 0;
public static bool Initialized => MGDB_G3.Length != 0;
private static PCD[] GetPCDDB(ReadOnlySpan<byte> bin) => Get(bin, PCD.Size, static d => new PCD(d));
private static PGF[] GetPGFDB(ReadOnlySpan<byte> bin) => Get(bin, PGF.Size, static d => new PGF(d));
@ -61,7 +93,7 @@ public static class EncounterEvent
// bin is a multiple of size
// bin.Length % size == 0
var result = new T[bin.Length / size];
System.Diagnostics.Debug.Assert(result.Length * size == bin.Length);
Debug.Assert(result.Length * size == bin.Length);
for (int i = 0; i < result.Length; i++)
{
var offset = i * size;
@ -72,79 +104,69 @@ public static class EncounterEvent
}
/// <summary>
/// Reloads the stored event templates.
/// Reloads the locally stored event templates.
/// </summary>
/// <param name="paths">External folder(s) to source individual mystery gift template files from.</param>
public static void RefreshMGDB(params string[] paths)
{
ICollection<PCD> g4 = GetPCDDB(Util.GetBinaryResource("wc4.pkl"));
ICollection<PGF> g5 = GetPGFDB(Util.GetBinaryResource("pgf.pkl"));
ICollection<WC6> g6 = GetWC6DB(Util.GetBinaryResource("wc6.pkl"), Util.GetBinaryResource("wc6full.pkl"));
ICollection<WC7> g7 = GetWC7DB(Util.GetBinaryResource("wc7.pkl"), Util.GetBinaryResource("wc7full.pkl"));
ICollection<WB7> b7 = GetWB7DB(Util.GetBinaryResource("wb7full.pkl"));
ICollection<WC8> g8 = GetWC8DB(Util.GetBinaryResource("wc8.pkl"));
ICollection<WB8> b8 = GetWB8DB(Util.GetBinaryResource("wb8.pkl"));
ICollection<WA8> a8 = GetWA8DB(Util.GetBinaryResource("wa8.pkl"));
ICollection<WC9> g9 = GetWC9DB(Util.GetBinaryResource("wc9.pkl"));
HashSet<PCD>? g4 = null; List<PCD>? lg4 = null;
HashSet<PGF>? g5 = null; List<PGF>? lg5 = null;
HashSet<WC6>? g6 = null; List<WC6>? lg6 = null;
HashSet<WC7>? g7 = null; List<WC7>? lg7 = null;
HashSet<WB7>? b7 = null; List<WB7>? lb7 = null;
HashSet<WC8>? g8 = null; List<WC8>? lg8 = null;
HashSet<WB8>? b8 = null; List<WB8>? lb8 = null;
HashSet<WA8>? a8 = null; List<WA8>? la8 = null;
HashSet<WC9>? g9 = null; List<WC9>? lg9 = null;
// Load external files
// For each file, load the gift object into the appropriate list.
var gifts = GetGifts(paths);
foreach (var gift in gifts)
{
static void AddOrExpand<T>(ref ICollection<T> arr, T obj)
{
if (arr is HashSet<T> h)
h.Add(obj);
else
arr = new HashSet<T>(arr) {obj};
}
switch (gift)
{
case PCD pcd: AddOrExpand(ref g4, pcd); continue;
case PGF pgf: AddOrExpand(ref g5, pgf); continue;
case WC6 wc6: AddOrExpand(ref g6, wc6); continue;
case WC7 wc7: AddOrExpand(ref g7, wc7); continue;
case WB7 wb7: AddOrExpand(ref b7, wb7); continue;
case WC8 wc8: AddOrExpand(ref g8, wc8); continue;
case WB8 wb8: AddOrExpand(ref b8, wb8); continue;
case WA8 wa8: AddOrExpand(ref a8, wa8); continue;
case WC9 wc9: AddOrExpand(ref g9, wc9); continue;
}
}
static T[] SetArray<T>(ICollection<T> arr)
{
if (arr is T[] x)
return x;
// rather than use Linq to build an array, just do it the quick way directly.
var result = new T[arr.Count];
arr.CopyTo(result, 0);
return result;
}
MGDB_G3 = Encounter_WC3; // hardcoded
MGDB_G4 = SetArray(g4);
MGDB_G5 = SetArray(g5);
MGDB_G6 = SetArray(g6);
MGDB_G7 = SetArray(g7);
MGDB_G7GG = SetArray(b7);
MGDB_G8 = SetArray(g8);
MGDB_G8A = SetArray(a8);
MGDB_G8B = SetArray(b8);
MGDB_G9 = SetArray(g9);
}
private static IEnumerable<MysteryGift> GetGifts(IEnumerable<string> paths)
{
foreach (var path in paths)
{
if (!Directory.Exists(path))
continue;
var gifts = MysteryUtil.GetGiftsFromFolder(path);
foreach (var gift in gifts)
yield return gift;
{
var added = gift switch
{
PCD pcd => AddOrExpand(ref g4, ref lg4, pcd, MGDB_G4),
PGF pgf => AddOrExpand(ref g5, ref lg5, pgf, MGDB_G5),
WC6 wc6 => AddOrExpand(ref g6, ref lg6, wc6, MGDB_G6),
WC7 wc7 => AddOrExpand(ref g7, ref lg7, wc7, MGDB_G7),
WB7 wb7 => AddOrExpand(ref b7, ref lb7, wb7, MGDB_G7GG),
WC8 wc8 => AddOrExpand(ref g8, ref lg8, wc8, MGDB_G8),
WB8 wb8 => AddOrExpand(ref b8, ref lb8, wb8, MGDB_G8B),
WA8 wa8 => AddOrExpand(ref a8, ref la8, wa8, MGDB_G8A),
WC9 wc9 => AddOrExpand(ref g9, ref lg9, wc9, MGDB_G9),
_ => false,
};
if (!added)
Trace.WriteLine($"Failed to add gift in {Path.GetDirectoryName(path)}: {gift.FileName}");
static bool AddOrExpand<T>(ref HashSet<T>? arr, ref List<T>? extra, T obj, T[] master)
{
arr ??= new(master);
if (arr.Add(obj))
(extra ??= new()).Add(obj);
return true;
}
}
EGDB_G4 = SetArray(lg4);
EGDB_G5 = SetArray(lg5);
EGDB_G6 = SetArray(lg6);
EGDB_G7 = SetArray(lg7);
EGDB_G7GG = SetArray(lb7);
EGDB_G8 = SetArray(lg8);
EGDB_G8A = SetArray(la8);
EGDB_G8B = SetArray(lb8);
EGDB_G9 = SetArray(lg9);
static T[] SetArray<T>(List<T>? arr)
{
if (arr is null)
return Array.Empty<T>();
return arr.ToArray();
}
}
}
@ -156,15 +178,15 @@ public static class EncounterEvent
{
var regular = new IReadOnlyList<MysteryGift>[]
{
MGDB_G4,
MGDB_G5,
MGDB_G6,
MGDB_G7,
MGDB_G7GG,
MGDB_G8,
MGDB_G8A,
MGDB_G8B,
MGDB_G9,
MGDB_G4, EGDB_G4,
MGDB_G5, EGDB_G5,
MGDB_G6, EGDB_G6,
MGDB_G7, EGDB_G7,
MGDB_G7GG, EGDB_G7GG,
MGDB_G8, EGDB_G8,
MGDB_G8A, EGDB_G8A,
MGDB_G8B, EGDB_G8B,
MGDB_G9, EGDB_G9,
}.SelectMany(z => z);
regular = regular.Where(mg => mg is { IsItem: false, IsEntity: true, Species: > 0 });
var result = MGDB_G3.Concat(regular);

View file

@ -11,43 +11,6 @@ internal static class EncounterUtil
internal static ReadOnlySpan<byte> Get(string resource) => Util.GetBinaryResource($"encounter_{resource}.pkl");
internal static BinLinkerAccessor Get(string resource, string ident) => BinLinkerAccessor.Get(Get(resource), ident);
/// <summary>
/// Gets the relevant <see cref="EncounterStatic"/> objects that appear in the relevant game.
/// </summary>
/// <param name="source">Table of valid encounters that appear for the game pairing</param>
/// <param name="game">Game to filter for</param>
/// <returns>Array of encounter objects that can be encountered in the input game</returns>
internal static T[] GetEncounters<T>(T[] source, GameVersion game) where T : IVersion
{
return Array.FindAll(source, s => s.Version.Contains(game));
}
/// <summary>
/// Gets the relevant <see cref="EncounterStatic"/> objects that appear in the relevant game.
/// </summary>
/// <param name="source">Table of valid encounters that appear for the game pairing</param>
/// <param name="exclude">Game to filter out</param>
/// <returns>Array of encounter objects that can be encountered in the input game</returns>
internal static T[] GetEncounters<T>(T[][] source, GameVersion exclude) where T : EncounterStatic
{
var count = 0;
foreach (T[] arr in source)
count += arr.Length;
var temp = new T[count];
count = 0;
foreach (var arr in source)
{
foreach (var enc in arr)
{
if (enc.Version != exclude)
temp[count++] = enc;
}
}
Array.Resize(ref temp, count);
return temp;
}
internal static T? GetMinByLevel<T>(ReadOnlySpan<EvoCriteria> chain, IEnumerable<T> possible) where T : class, IEncounterTemplate
{
// MinBy grading: prefer species-form match, select lowest min level encounter.
@ -75,49 +38,13 @@ internal static class EncounterUtil
return result;
}
/// <summary>
/// Loads the language string lists into the <see cref="T"/> objects.
/// </summary>
/// <typeparam name="T">Encounter template type</typeparam>
/// <param name="table">Trade templates</param>
/// <param name="strings">Localization strings, grouped by language.</param>
/// <remarks>
/// The first half of strings in the language resource array are <see cref="EncounterTrade.Nicknames"/>
/// The second half of strings in the language resource strings are <see cref="EncounterTrade.TrainerNames"/>
/// </remarks>
internal static void MarkEncounterTradeStrings<T>(T[] table, ReadOnlySpan<string[]> strings) where T : EncounterTrade
{
uint languageCount = (uint)strings[1].Length / 2;
for (uint i = 0; i < languageCount; i++)
{
var t = table[i];
t.Nicknames = GetNamesForLanguage(strings, i);
t.TrainerNames = GetNamesForLanguage(strings, languageCount + i);
}
}
/// <summary>
/// Loads the language string lists into the <see cref="T"/> objects.
/// </summary>
/// <typeparam name="T">Encounter template type</typeparam>
/// <param name="table">Trade templates</param>
/// <param name="strings">Localization strings, grouped by language.</param>
internal static void MarkEncounterTradeNicknames<T>(T[] table, ReadOnlySpan<string[]> strings) where T : EncounterTrade
{
for (uint i = 0; i < table.Length; i++)
{
var t = table[i];
t.Nicknames = GetNamesForLanguage(strings, i);
}
}
/// <summary>
/// Grabs the localized names for individual templates for all languages from the specified <see cref="index"/> of the <see cref="names"/> list.
/// </summary>
/// <param name="names">Arrays of strings grouped by language</param>
/// <param name="index">Index to grab from the language arrays</param>
/// <returns>Row of localized strings for the template.</returns>
private static string[] GetNamesForLanguage(ReadOnlySpan<string[]> names, uint index)
public static string[] GetNamesForLanguage(ReadOnlySpan<string[]> names, uint index)
{
var result = new string[names.Length];
for (int i = 0; i < result.Length; i++)

View file

@ -0,0 +1,132 @@
using static PKHeX.Core.GameVersion;
using static PKHeX.Core.EncounterUtil;
namespace PKHeX.Core;
/// <summary>
/// Generation 1 Encounters
/// </summary>
internal static class Encounters1
{
internal static readonly EncounterArea1[] SlotsRD = EncounterArea1.GetAreas(Get("red", "g1"), RD);
internal static readonly EncounterArea1[] SlotsGN = EncounterArea1.GetAreas(Get("blue", "g1"), GN);
internal static readonly EncounterArea1[] SlotsYW = EncounterArea1.GetAreas(Get("yellow", "g1"), YW);
internal static readonly EncounterArea1[] SlotsBU = EncounterArea1.GetAreas(Get("blue_jp", "g1"), BU);
private const string tradeRBY = "traderby";
private static readonly string[][] TradeNames = Util.GetLanguageStrings7(tradeRBY);
internal static readonly EncounterStatic1[] StaticRBY =
{
// GameVersion is RBY for Pokemon with the same catch rate and initial moves in all games
// If there are any differences in moves or catch rate, they will be defined as different encounters (GameVersion)
new(001, 05, RBY), // Bulbasaur
new(004, 05, RBY), // Charmander
new(007, 05, RBY), // Squirtle
// Game Corner
new(035, 08, RBY), // Clefairy (Red Game Corner)
new(037, 18, RBY), // Vulpix (Yellow Game Corner)
new(040, 22, RBY), // Wigglytuff (Yellow Game Corner)
new(123, 25, RBY), // Scyther (Red Game Corner)
new(147, 18, RBY), // Dratini (Red Game Corner)
// Lower level less ideal matches; best match is from above.
// new(035, 12), // Clefairy (Blue[EN] / Green[JP] Game Corner)
// new(063, 09), // Abra (Red Game Corner)
// new(063, 08), // Abra (Blue[JP] Game Corner)
// new(063, 15), // Abra (Yellow Game Corner)
// new(123, 30), // Scyther (Yellow Game Corner)
// new(137, 22), // Porygon (Blue[JP] Game Corner)
// new(137, 26), // Porygon (Red Game Corner)
// new(137, 26), // Porygon (Yellow Game Corner)
// new(147, 24), // Dratini (Blue[EN] / Green[JP] Game Corner)
new(129, 05, RBY), // Magikarp
new(143, 30, RBY), // Snorlax
new(106, 30, RBY), // Hitmonlee
new(107, 30, RBY), // Hitmonchan
new(131, 15, RBY), // Lapras
new(138, 30, RBY), // Omanyte
new(140, 30, RBY), // Kabuto
new(142, 30, RBY), // Aerodactyl
new(144, 50, RBY), // Articuno
new(145, 50, RBY), // Zapdos
new(146, 50, RBY), // Moltres
new(150, 70, RBY), // Mewtwo
new(100, 40, RBY), // Voltorb (Power Plant)
new(101, 43, RBY), // Electrode (Power Plant)
// Yellow Only -- duplicate encounters with a higher level
// new(001, 10, YW), // Bulbasaur (Cerulean City)
// new(004, 10, YW), // Charmander (Route 24)
// new(007, 10, YW), // Squirtle (Vermillion City)
};
internal static readonly EncounterStatic1[] StaticRB =
{
new(030, 17, RB), // Nidorina (Red Game Corner)
new(033, 17, RB), // Nidorino (Blue[EN] / Green[JP] Game Corner)
new(063, 06, RB), // Abra (Blue[EN] / Green[JP] Game Corner)
new(133, 25, RB), // Eevee
new(127, 20, RB), // Pinsir (Blue[EN] / Green[JP] Game Corner)
new(137, 18, RB), // Porygon (Blue[EN] / Green[JP] Game Corner)
};
internal static readonly EncounterStatic1[] StaticYW =
{
new(025, 05, YW), // Pikachu
new(127, 30, YW), // Pinsir (Yellow Game Corner) (Different initial moves)
new(133, 25, YW), // Eevee (Different initial moves)
};
internal static readonly EncounterStatic1[] StaticBU =
{
new(116, 18, BU), // Horsea (Blue[JP] Game Corner)
new(036, 24, BU), // Clefable (Blue[JP] Game Corner)
new(148, 30, BU), // Dragonair (Blue[JP] Game Corner)
new(025, 12, BU), // Pikachu (Blue[JP] Game Corner) (Different catch rate)
};
internal static readonly EncounterTrade1[] TradeGift_RB =
{
new(TradeNames, 00, 122, RB, 06, 05), // Mr. Mime - Abra
new(TradeNames, 01, 032, RB, 02 ), // Nidoran♂ - Nidoran♀
new(TradeNames, 02, 030, RB, 16 ), // Nidorina - Nidorino
new(TradeNames, 03, 108, RB, 15 ), // Lickitung - Slowbro
new(TradeNames, 04, 124, RB, 15, 10), // Jynx - Poliwhirl
new(TradeNames, 05, 083, RB, 02 ), // Farfetchd - Spearow
new(TradeNames, 06, 101, RB, 03 ), // Electrode - Raichu
new(TradeNames, 07, 114, RB, 13, 05), // Tangela - Venonat
new(TradeNames, 08, 086, RB, 28, 05), // Seel - Ponyta
};
public static readonly EncounterTrade1[] TradeGift_YW =
{
new(TradeNames, 09, 122, YW, 08, 06), // Mr. Mime - Clefairy
new(TradeNames, 10, 067, YW, 16, 05) { EvolveOnTrade = true }, // Machoke - Cubone
new(TradeNames, 11, 051, YW, 15, 05), // Dugtrio - Lickitung
new(TradeNames, 12, 047, YW, 13, 05), // Parasect - Tangel
new(TradeNames, 13, 112, YW, 15, 10), // Rhydon - Golduck
new(TradeNames, 14, 087, YW, 15, 05), // Dewgong - Growlithe
new(TradeNames, 15, 089, YW, 25, 05), // Muk - Kangaskhan
};
public static readonly EncounterTrade1[] TradeGift_BU =
{
new(TradeNames, 16, 122, BU, 03 ), // Mr. Mime - Jigglypuff
new(TradeNames, 17, 029, BU, 02 ), // Nidoran♀ - Nidoran♂
new(TradeNames, 18, 060, BU, 02 ), // Poliwag - Rattata
new(TradeNames, 19, 115, BU, 15, 10), // Kangaskhan - Rhydon
new(TradeNames, 20, 128, BU, 28, 18), // Tauros - Persian
new(TradeNames, 21, 093, BU, 28, 14) { EvolveOnTrade = true }, // Haunter - Machop->Machoke
new(TradeNames, 22, 083, BU, 02 ), // Farfetchd - Wild Pidgey
new(TradeNames, 23, 075, BU, 16, 15) { EvolveOnTrade = true }, // Graveler - Abra->Kadabra
new(TradeNames, 24, 079, BU, 22, 05), // Slowpoke - Seel
new(TradeNames, 25, 098, BU, 15, 05), // Krabby - Growlithe
};
}

View file

@ -0,0 +1,38 @@
namespace PKHeX.Core;
internal static class Encounters1GBEra
{
private static readonly IndividualValueSet Yoshira = new(5, 10, 1, 12, 5, 5);
private static readonly string[] YoshiOT = { "YOSHIRA", "YOSHIRB", "YOSHIBA", "YOSHIBB" };
private static readonly string[] TourOT = { "LINKE", "LINKW", "LUIGE", "LUIGW", "LUIGIC", "YOSHIC" };
private static readonly string[] StadiumOT_Int = { "STADIUM", "STADE", "STADIO", "ESTADIO" };
private const string StadiumOT_JPN = "スタジアム";
internal static readonly EncounterGift1[] Gifts =
{
// Stadium 1 (International)
new(001, 05, GameVersion.Stadium) {Moves = new(033, 045), TID16 = 2000, OT_Names = StadiumOT_Int, Language = EncounterGBLanguage.International}, // Bulbasaur
new(004, 05, GameVersion.Stadium) {Moves = new(010, 043), TID16 = 2000, OT_Names = StadiumOT_Int, Language = EncounterGBLanguage.International}, // Charmander
new(007, 05, GameVersion.Stadium) {Moves = new(033, 045), TID16 = 2000, OT_Names = StadiumOT_Int, Language = EncounterGBLanguage.International}, // Squirtle
new(106, 20, GameVersion.Stadium) {Moves = new(024, 096), TID16 = 2000, OT_Names = StadiumOT_Int, Language = EncounterGBLanguage.International}, // Hitmonlee
new(107, 20, GameVersion.Stadium) {Moves = new(004, 097), TID16 = 2000, OT_Names = StadiumOT_Int, Language = EncounterGBLanguage.International}, // Hitmonchan
new(133, 25, GameVersion.Stadium) {Moves = new(033, 039), TID16 = 2000, OT_Names = StadiumOT_Int, Language = EncounterGBLanguage.International}, // Eevee
new(138, 20, GameVersion.Stadium) {Moves = new(055, 110), TID16 = 2000, OT_Names = StadiumOT_Int, Language = EncounterGBLanguage.International}, // Omanyte
new(140, 20, GameVersion.Stadium) {Moves = new(010, 106), TID16 = 2000, OT_Names = StadiumOT_Int, Language = EncounterGBLanguage.International}, // Kabuto
new(054, 15, GameVersion.Stadium) {Moves = new(133, 010), TID16 = 2000, OT_Names = StadiumOT_Int, Language = EncounterGBLanguage.International}, // Psyduck (Amnesia)
// Stadium 2 (Japan)
new(001, 05, GameVersion.Stadium) {Moves = new(033, 045), TID16 = 1999, OT_Name = StadiumOT_JPN}, // Bulbasaur
new(004, 05, GameVersion.Stadium) {Moves = new(010, 043), TID16 = 1999, OT_Name = StadiumOT_JPN}, // Charmander
new(007, 05, GameVersion.Stadium) {Moves = new(033, 045), TID16 = 1999, OT_Name = StadiumOT_JPN}, // Squirtle
new(106, 20, GameVersion.Stadium) {Moves = new(024, 096), TID16 = 1999, OT_Name = StadiumOT_JPN}, // Hitmonlee
new(107, 20, GameVersion.Stadium) {Moves = new(004, 097), TID16 = 1999, OT_Name = StadiumOT_JPN}, // Hitmonchan
new(133, 25, GameVersion.Stadium) {Moves = new(033, 039), TID16 = 1999, OT_Name = StadiumOT_JPN}, // Eevee
new(138, 20, GameVersion.Stadium) {Moves = new(055, 110), TID16 = 1999, OT_Name = StadiumOT_JPN}, // Omanyte
new(140, 20, GameVersion.Stadium) {Moves = new(010, 106), TID16 = 1999, OT_Name = StadiumOT_JPN}, // Kabuto
new(054, 15, GameVersion.Stadium) {Moves = new(133, 010), TID16 = 1999, OT_Name = StadiumOT_JPN}, // Psyduck (Amnesia)
new(151, 5, GameVersion.RB) {IVs = Yoshira, OT_Names = YoshiOT, Language = EncounterGBLanguage.International }, // Yoshira Mew Events
new(151, 5, GameVersion.RB) {IVs = Yoshira, OT_Names = TourOT, Language = EncounterGBLanguage.International }, // Pokémon 2000 Stadium Tour Mew
};
}

View file

@ -0,0 +1,13 @@
namespace PKHeX.Core;
internal static class Encounters1VC
{
private static readonly IndividualValueSet Flawless15 = new(15, 15, 15, 15, 15, 15);
internal static readonly EncounterGift1[] Gifts =
{
// Event Mew
new(151, 5, GameVersion.RBY) { IVs = Flawless15, TID16 = 22796, OT_Name = "GF", Language = EncounterGBLanguage.International },
new(151, 5, GameVersion.RBY) { IVs = Flawless15, TID16 = 22796, OT_Name = "ゲーフリ" },
};
}

View file

@ -1,162 +0,0 @@
using static PKHeX.Core.GameVersion;
using static PKHeX.Core.EncounterGBLanguage;
using static PKHeX.Core.EncounterUtil;
namespace PKHeX.Core;
/// <summary>
/// Generation 1 Encounters
/// </summary>
internal static class Encounters1
{
internal static readonly EncounterArea1[] SlotsRD = EncounterArea1.GetAreas(Get("red", "g1"), RD);
internal static readonly EncounterArea1[] SlotsGN = EncounterArea1.GetAreas(Get("blue", "g1"), GN);
internal static readonly EncounterArea1[] SlotsYW = EncounterArea1.GetAreas(Get("yellow", "g1"), YW);
internal static readonly EncounterArea1[] SlotsBU = EncounterArea1.GetAreas(Get("blue_jp", "g1"), BU);
internal static readonly EncounterArea1[] SlotsRBY = ArrayUtil.ConcatAll(SlotsRD, SlotsGN, SlotsYW);
internal static readonly EncounterArea1[] SlotsRGBY = ArrayUtil.ConcatAll(SlotsRBY, SlotsBU);
static Encounters1() => MarkEncounterTradeNicknames(TradeGift_RBY, TradeGift_RBY_OTs);
internal static readonly EncounterStatic1[] StaticRBY =
{
// GameVersion is RBY for Pokemon with the same catch rate and initial moves in all games
// If there are any differences in moves or catch rate, they will be defined as different encounters (GameVersion)
new(001, 05, RBY), // Bulbasaur
new(004, 05, RBY), // Charmander
new(007, 05, RBY), // Squirtle
new(025, 05, YW), // Pikachu
// Game Corner
new(030, 17, RB), // Nidorina (Red Game Corner)
new(033, 17, RB), // Nidorino (Blue[EN] / Green[JP] Game Corner)
new(035, 08, RBY), // Clefairy (Red Game Corner)
new(036, 24, BU), // Clefable (Blue[JP] Game Corner)
new(037, 18, RBY), // Vulpix (Yellow Game Corner)
new(040, 22, RBY), // Wigglytuff (Yellow Game Corner)
new(063, 06, RB), // Abra (Blue[EN] / Green[JP] Game Corner)
new(116, 18, BU), // Horsea (Blue[JP] Game Corner)
new(123, 25, RBY), // Scyther (Red Game Corner)
new(127, 20, RB), // Pinsir (Blue[EN] / Green[JP] Game Corner)
new(127, 30, YW), // Pinsir (Yellow Game Corner) (Different initial moves)
new(137, 18, RB), // Porygon (Blue[EN] / Green[JP] Game Corner)
new(147, 18, RBY), // Dratini (Red Game Corner)
new(148, 30, BU), // Dragonair (Blue[JP] Game Corner)
new(025, 12, BU), // Pikachu (Blue[JP] Game Corner) (Different catch rate)
// Lower level less ideal matches; best match is from above.
// new(035, 12), // Clefairy (Blue[EN] / Green[JP] Game Corner)
// new(063, 09), // Abra (Red Game Corner)
// new(063, 08), // Abra (Blue[JP] Game Corner)
// new(063, 15), // Abra (Yellow Game Corner)
// new(123, 30), // Scyther (Yellow Game Corner)
// new(137, 22), // Porygon (Blue[JP] Game Corner)
// new(137, 26), // Porygon (Red Game Corner)
// new(137, 26), // Porygon (Yellow Game Corner)
// new(147, 24), // Dratini (Blue[EN] / Green[JP] Game Corner)
new(129, 05, RBY), // Magikarp
new(143, 30, RBY), // Snorlax
new(106, 30, RBY), // Hitmonlee
new(107, 30, RBY), // Hitmonchan
new(131, 15, RBY), // Lapras
new(138, 30, RBY), // Omanyte
new(140, 30, RBY), // Kabuto
new(142, 30, RBY), // Aerodactyl
new(144, 50, RBY), // Articuno
new(145, 50, RBY), // Zapdos
new(146, 50, RBY), // Moltres
new(150, 70, RBY), // Mewtwo
new(133, 25, RB) {Moves = new((int)Move.Tackle, (int)Move.SandAttack)}, // Eevee
new(133, 25, YW) {Moves = new((int)Move.TailWhip, (int)Move.SandAttack, (int)Move.Growl, (int)Move.QuickAttack)}, // Eevee (Different initial moves)
new(100, 40, RBY), // Voltorb (Power Plant)
new(101, 43, RBY), // Electrode (Power Plant)
// Yellow Only -- duplicate encounters with a higher level
// new(001, 10, YW), // Bulbasaur (Cerulean City)
// new(004, 10, YW), // Charmander (Route 24)
// new(007, 10, YW), // Squirtle (Vermillion City)
};
internal static readonly EncounterTrade1[] TradeGift_RBY =
{
new(122, RB, 06, 05), // Mr. Mime - Abra
new(032, RB, 02 ), // Nidoran♂ - Nidoran♀
new(030, RB, 16 ), // Nidorina - Nidorino
new(108, RB, 15 ), // Lickitung - Slowbro
new(124, RB, 15, 10), // Jynx - Poliwhirl
new(083, RB, 02 ), // Farfetchd - Spearow
new(101, RB, 03 ), // Electrode - Raichu
new(114, RB, 13, 05), // Tangela - Venonat
new(086, RB, 28, 05), // Seel - Ponyta
new(122, YW, 08, 06), // Mr. Mime - Clefairy
new(067, YW, 16, 05) { EvolveOnTrade = true }, // Machoke - Cubone
new(051, YW, 15, 05), // Dugtrio - Lickitung
new(047, YW, 13, 05), // Parasect - Tangel
new(112, YW, 15, 10), // Rhydon - Golduck
new(087, YW, 15, 05), // Dewgong - Growlithe
new(089, YW, 25, 05), // Muk - Kangaskhan
new(122, BU, 03 ), // Mr. Mime - Jigglypuff
new(029, BU, 02 ), // Nidoran♀ - Nidoran♂
new(060, BU, 02 ), // Poliwag - Rattata
new(115, BU, 15, 10), // Kangaskhan - Rhydon
new(128, BU, 28, 18), // Tauros - Persian
new(093, BU, 28, 14) { EvolveOnTrade = true }, // Haunter - Machop->Machoke
new(083, BU, 02 ), // Farfetchd - Wild Pidgey
new(075, BU, 16, 15) { EvolveOnTrade = true }, // Graveler - Abra->Kadabra
new(079, BU, 22, 05), // Slowpoke - Seel
new(098, BU, 15, 05), // Krabby - Growlithe
};
private const string tradeRBY = "traderby";
private static readonly string[][] TradeGift_RBY_OTs = Util.GetLanguageStrings7(tradeRBY);
private static readonly IndividualValueSet Flawless15 = new(15, 15, 15, 15, 15, 15);
private static readonly IndividualValueSet Yoshira = new(5, 10, 1, 12, 5, 5);
private static readonly string[] YoshiOT = { "YOSHIRA", "YOSHIRB", "YOSHIBA", "YOSHIBB" };
private static readonly string[] TourOT = { "LINKE", "LINKW", "LUIGE", "LUIGW", "LUIGIC", "YOSHIC" };
private static readonly string[] StadiumOT_Int = { "STADIUM", "STADE", "STADIO", "ESTADIO" };
private const string StadiumOT_JPN = "スタジアム";
internal static readonly EncounterStatic1E[] StaticEventsVC =
{
// Event Mew
new(151, 5, RBY) { IVs = Flawless15, TID16 = 22796, OT_Name = "GF", Language = International },
new(151, 5, RBY) { IVs = Flawless15, TID16 = 22796, OT_Name = "ゲーフリ" },
};
internal static readonly EncounterStatic1E[] StaticEventsGB =
{
// Stadium 1 (International)
new(001, 05, Stadium) {Moves = new(033, 045), TID16 = 2000, OT_Names = StadiumOT_Int, Language = International}, // Bulbasaur
new(004, 05, Stadium) {Moves = new(010, 043), TID16 = 2000, OT_Names = StadiumOT_Int, Language = International}, // Charmander
new(007, 05, Stadium) {Moves = new(033, 045), TID16 = 2000, OT_Names = StadiumOT_Int, Language = International}, // Squirtle
new(106, 20, Stadium) {Moves = new(024, 096), TID16 = 2000, OT_Names = StadiumOT_Int, Language = International}, // Hitmonlee
new(107, 20, Stadium) {Moves = new(004, 097), TID16 = 2000, OT_Names = StadiumOT_Int, Language = International}, // Hitmonchan
new(133, 25, Stadium) {Moves = new(033, 039), TID16 = 2000, OT_Names = StadiumOT_Int, Language = International}, // Eevee
new(138, 20, Stadium) {Moves = new(055, 110), TID16 = 2000, OT_Names = StadiumOT_Int, Language = International}, // Omanyte
new(140, 20, Stadium) {Moves = new(010, 106), TID16 = 2000, OT_Names = StadiumOT_Int, Language = International}, // Kabuto
new(054, 15, Stadium) {Moves = new(133, 010), TID16 = 2000, OT_Names = StadiumOT_Int, Language = International}, // Psyduck (Amnesia)
// Stadium 2 (Japan)
new(001, 05, Stadium) {Moves = new(033, 045), TID16 = 1999, OT_Name = StadiumOT_JPN}, // Bulbasaur
new(004, 05, Stadium) {Moves = new(010, 043), TID16 = 1999, OT_Name = StadiumOT_JPN}, // Charmander
new(007, 05, Stadium) {Moves = new(033, 045), TID16 = 1999, OT_Name = StadiumOT_JPN}, // Squirtle
new(106, 20, Stadium) {Moves = new(024, 096), TID16 = 1999, OT_Name = StadiumOT_JPN}, // Hitmonlee
new(107, 20, Stadium) {Moves = new(004, 097), TID16 = 1999, OT_Name = StadiumOT_JPN}, // Hitmonchan
new(133, 25, Stadium) {Moves = new(033, 039), TID16 = 1999, OT_Name = StadiumOT_JPN}, // Eevee
new(138, 20, Stadium) {Moves = new(055, 110), TID16 = 1999, OT_Name = StadiumOT_JPN}, // Omanyte
new(140, 20, Stadium) {Moves = new(010, 106), TID16 = 1999, OT_Name = StadiumOT_JPN}, // Kabuto
new(054, 15, Stadium) {Moves = new(133, 010), TID16 = 1999, OT_Name = StadiumOT_JPN}, // Psyduck (Amnesia)
new(151, 5, RB) {IVs = Yoshira, OT_Names = YoshiOT, Language = International }, // Yoshira Mew Events
new(151, 5, RB) {IVs = Yoshira, OT_Names = TourOT, Language = International }, // Pokémon 2000 Stadium Tour Mew
};
}

View file

@ -1,382 +0,0 @@
using System;
using static PKHeX.Core.EncounterUtil;
using static PKHeX.Core.GameVersion;
using static PKHeX.Core.EncounterGBLanguage;
namespace PKHeX.Core;
/// <summary>
/// Generation 2 Encounters
/// </summary>
internal static class Encounters2
{
internal static readonly EncounterArea2[] SlotsGD = EncounterArea2.GetAreas(Get("gold", "g2"), GD);
internal static readonly EncounterArea2[] SlotsSV = EncounterArea2.GetAreas(Get("silver", "g2"), SI);
internal static readonly EncounterArea2[] SlotsC = EncounterArea2.GetAreas(Get("crystal", "g2"), C);
internal static readonly EncounterArea2[] SlotsGS = ArrayUtil.ConcatAll(SlotsGD, SlotsSV);
internal static readonly EncounterArea2[] SlotsGSC = ArrayUtil.ConcatAll(SlotsGS, SlotsC);
static Encounters2() => MarkEncounterTradeStrings(TradeGift_GSC, TradeGift_GSC_OTs);
private static readonly EncounterStatic2[] Encounter_GSC_Common =
{
new(152, 05, GSC) { Location = 001 }, // Chikorita @ New Bark Town
new(155, 05, GSC) { Location = 001 }, // Cyndaquil @ New Bark Town
new(158, 05, GSC) { Location = 001 }, // Totodile @ New Bark Town
new(175, 05, GSC) { EggLocation = 256 }, // Togepi
new(131, 20, GSC) { Location = 010 }, // Lapras @ Union Cave
new(133, 20, GSC) { Location = 016 }, // Eevee @ Goldenrod City
new(185, 20, GSC) { Location = 020 }, // Sudowoodo @ Route 36
new(236, 10, GSC) { Location = 035 }, // Tyrogue @ Mt. Mortar
new(130, 30, GSC) { Location = 038, Shiny = Shiny.Always, Gender = 0, IVs = new(0, 14, 10, 10, 10, 10) }, // Gyarados @ Lake of Rage (forcing shiny IVs result in always Male)
new(074, 21, GSC) { Location = 036 }, // Geodude @ Rocket Hideout (Mahogany Town)
new(109, 21, GSC) { Location = 036 }, // Koffing @ Rocket Hideout (Mahogany Town)
new(100, 23, GSC) { Location = 036 }, // Voltorb @ Rocket Hideout (Mahogany Town)
new(101, 23, GSC) { Location = 036 }, // Electrode @ Rocket Hideout (Mahogany Town)
new(143, 50, GSC) { Location = 061 }, // Snorlax @ Vermillion City
new(211, 05, GSC) { Location = 008 }, // Qwilfish Swarm @ Route 32 (Old Rod)
new(211, 20, GSC) { Location = 008 }, // Qwilfish Swarm @ Route 32 (Good Rod)
new(211, 40, GSC) { Location = 008 }, // Qwilfish Swarm @ Route 32 (Super Rod)
};
private static readonly EncounterStatic2[] Encounter_GS_Exclusive =
{
new(245, 40, GS), // Suicune
new(249, 70, GD), // Lugia @ Whirl Islands
new(249, 40, SI), // Lugia @ Whirl Islands
new(250, 40, GD), // Ho-Oh @ Tin Tower
new(250, 70, SI), // Ho-Oh @ Tin Tower
new(137, 15, GS), // Porygon @ Celadon Game Corner
new(133, 15, GS), // Eevee @ Celadon Game Corner
new(122, 15, GS), // Mr. Mime @ Celadon Game Corner
new(063, 10, GS), // Abra @ Goldenrod City (Game Corner)
new(147, 10, GS), // Dratini @ Goldenrod City (Game Corner)
new(023, 10, GS), // Ekans @ Goldenrod City (Game Corner) (Gold)
new(027, 10, GS), // Sandshrew @ Goldenrod City (Game Corner) (Silver)
new(223, 05, GS), // Remoraid Swarm @ Route 44 (Old Rod)
new(223, 20, GS), // Remoraid Swarm @ Route 44 (Good Rod)
new(223, 40, GS), // Remoraid Swarm @ Route 44 (Super Rod)
};
private static readonly EncounterStatic2[] Encounter_C_Exclusive =
{
new(245, 40, C) { Location = 023 }, // Suicune @ Tin Tower
new EncounterStatic2Odd(172) {Moves = new((int)Move.ThunderShock,(int)Move.Charm, (int)Move.DizzyPunch)}, // Pichu
new EncounterStatic2Odd(173) {Moves = new((int)Move.Pound, (int)Move.Charm, (int)Move.DizzyPunch)}, // Cleffa
new EncounterStatic2Odd(174) {Moves = new((int)Move.Sing, (int)Move.Charm, (int)Move.DizzyPunch)}, // Igglybuff
new EncounterStatic2Odd(236) {Moves = new((int)Move.Tackle, (int)Move.DizzyPunch)}, // Tyrogue
new EncounterStatic2Odd(238) {Moves = new((int)Move.Pound, (int)Move.Lick, (int)Move.DizzyPunch)}, // Smoochum
new EncounterStatic2Odd(239) {Moves = new((int)Move.QuickAttack, (int)Move.Leer, (int)Move.DizzyPunch)}, // Elekid
new EncounterStatic2Odd(240) {Moves = new((int)Move.Ember, (int)Move.DizzyPunch)}, // Magby
new(147, 15, C) { Location = 042, Moves = new((int)Move.ExtremeSpeed, (int)Move.Wrap, (int)Move.ThunderWave, (int)Move.Twister) }, // Dratini ExtremeSpeed
new(249, 60, C) { Location = 031 }, // Lugia @ Whirl Islands
new(250, 60, C) { Location = 023 }, // Ho-Oh @ Tin Tower
new(137, 15, C) { Location = 071 }, // Porygon @ Celadon Game Corner
new(025, 25, C) { Location = 071 }, // Pikachu @ Celadon Game Corner
new(246, 40, C) { Location = 071 }, // Larvitar @ Celadon Game Corner
new(063, 05, C) { Location = 016 }, // Abra @ Goldenrod City (Game Corner)
new(104, 15, C) { Location = 016 }, // Cubone @ Goldenrod City (Game Corner)
new(202, 15, C) { Location = 016 }, // Wobbuffet @ Goldenrod City (Game Corner)
};
private static readonly EncounterStatic2[] Encounter_GSC_Roam =
{
new EncounterStatic2Roam(243, 40, GSC), // Raikou
new EncounterStatic2Roam(244, 40, GSC), // Entei
new EncounterStatic2Roam(245, 40, GS), // Suicune
};
private static readonly EncounterStatic2[] Encounter_GS = ArrayUtil.ConcatAll(Encounter_GSC_Common, Encounter_GS_Exclusive, Encounter_GSC_Roam);
private static readonly EncounterStatic2[] Encounter_C = ArrayUtil.ConcatAll<EncounterStatic2>(Encounter_GSC_Common, Encounter_C_Exclusive, Encounter_GSC_Roam.AsSpan(0, 2));
private static readonly EncounterStatic2[] Encounter_GSC = ArrayUtil.ConcatAll(Encounter_GSC_Common, Encounter_GS_Exclusive, Encounter_C_Exclusive, Encounter_GSC_Roam);
internal static readonly EncounterTrade2[] TradeGift_GSC =
{
new(095, 03, 48926) { Gender = 0, IVs = new(08, 09, 06, 06, 06, 06) }, // Onix @ Violet City for Bellsprout [wild]
new(066, 05, 37460) { Gender = 1, IVs = new(12, 03, 07, 06, 06, 06) }, // Machop @ Goldenrod City for Drowzee [wild 9, hatched egg 5]
new(100, 05, 29189) { Gender = 2, IVs = new(08, 09, 08, 08, 08, 08) }, // Voltorb @ Olivine City for Krabby [egg]
new(112, 10, 00283) { Gender = 1, IVs = new(12, 07, 07, 06, 06, 06) }, // Rhydon @ Blackthorn City for Dragonair [wild]
new(142, 05, 26491) { Gender = 0, IVs = new(08, 09, 06, 06, 06, 06), OTGender = 1}, // Aerodactyl @ Route 14 for Chansey [egg]
new(078, 14, 15616) { Gender = 0, IVs = new(08, 09, 06, 06, 06, 06) }, // Rapidash @ Pewter City for Gloom [wild]
new(085, 10, 00283) { Gender = 1, IVs = new(12, 07, 07, 06, 06, 06), OTGender = 1}, // Dodrio @ Blackthorn City for Dragonair [wild]
new(178, 15, 15616) { Gender = 0, IVs = new(08, 09, 06, 08, 06, 06) }, // Xatu @ Pewter City for Haunter [wild]
new(082, 05, 50082) { Gender = 2, IVs = new(08, 09, 06, 06, 06, 06) }, // Magneton @ Power Plant for Dugtrio [traded for Lickitung]
new(021, 10, 01001) { Moves = new(64,45,43) }, // Spearow @ Goldenrod City for free
new(213, 15, 00518), // Shuckle @ Cianwood City for free
};
private const string tradeGSC = "tradegsc";
private static readonly string[][] TradeGift_GSC_OTs = Util.GetLanguageStrings8(tradeGSC);
internal static readonly EncounterStatic2[] StaticGSC = Encounter_GSC;
internal static readonly EncounterStatic2[] StaticGS = Encounter_GS;
internal static readonly EncounterStatic2[] StaticC = Encounter_C;
internal static readonly EncounterStatic2E[] StaticEventsVC =
{
new(251, 30, C) { Location = 014, Language = EncounterGBLanguage.Any }, // Celebi @ Ilex Forest (VC)
};
private static readonly string[] PCNYx = {"PCNYa", "PCNYb", "PCNYc", "PCNYd"};
internal static readonly EncounterStatic2E[] StaticEventsGB =
{
// Stadium 2 Baton Pass Farfetch'd
new(083, 05, C) {Moves = new(226, 14, 97, 163), Location = 127, TID16 = 2000, OT_Name = "スタジアム"},
new(083, 05, C) {Moves = new(226, 14, 97, 163), Location = 127, TID16 = 2000, OT_Name = "Stadium", Language = International},
new(083, 05, C) {Moves = new(226, 14, 97, 163), Location = 127, TID16 = 2001, OT_Names = new[]{"Stade", "Stadion", "Stadio", "Estadio"}, Language = International},
// Stadium 2 Earthquake Gligar
new(207, 05, C) {Moves = new(89, 68, 17), Location = 127, TID16 = 2000, OT_Name = "スタジアム"},
new(207, 05, C) {Moves = new(89, 68, 17), Location = 127, TID16 = 2000, OT_Name = "Stadium", Language = International},
new(207, 05, C) {Moves = new(89, 68, 17), Location = 127, TID16 = 2001, OT_Names = new[]{"Stade", "Stadion", "Stadio", "Estadio"}, Language = International},
//New York Pokémon Center Events
// Legendary Beasts (November 22 to 29, 2001)
new(243, 05, C) {OT_Names = PCNYx, CurrentLevel = 40, Shiny = Shiny.Always, Location = 127, Language = International}, // Shiny Raikou
new(244, 05, C) {OT_Names = PCNYx, CurrentLevel = 40, Shiny = Shiny.Always, Location = 127, Language = International}, // Shiny Entei
new(245, 05, C) {OT_Names = PCNYx, CurrentLevel = 40, Shiny = Shiny.Always, Location = 127, Language = International}, // Shiny Suicune
// Legendary Birds (November 30 to December 6, 2001)
new(144, 05, C) {OT_Names = PCNYx, CurrentLevel = 50, Shiny = Shiny.Always, Location = 127, Language = International}, // Shiny Articuno
new(145, 05, C) {OT_Names = PCNYx, CurrentLevel = 50, Shiny = Shiny.Always, Location = 127, Language = International}, // Shiny Zapdos
new(146, 05, C) {OT_Names = PCNYx, CurrentLevel = 50, Shiny = Shiny.Always, Location = 127, Language = International}, // Shiny Moltres
// Christmas Week (December 21 to 27, 2001)
new(225, 05, GS) {OT_Names = PCNYx, Moves = new(006), EggLocation = 256, EggCycles = 10, Language = International}, // Pay Day Delibird
new(251, 05, C) {OT_Names = PCNYx, Location = 127, Language = International}, // Celebi
// The Initial Three Set (December 28, 2001 to January 31, 2002)
new(001, 05, GS) {OT_Names = PCNYx, Moves = new(246), EggLocation = 256, EggCycles = 10, Language = International}, // Bulbasaur Ancientpower
new(004, 05, GS) {OT_Names = PCNYx, Moves = new(242), EggLocation = 256, EggCycles = 10, Language = International}, // Charmander Crunch
new(007, 05, GS) {OT_Names = PCNYx, Moves = new(192), EggLocation = 256, EggCycles = 10, Language = International}, // Squirtle Zap Cannon
new(152, 05, GS) {OT_Names = PCNYx, Moves = new(080), EggLocation = 256, EggCycles = 10, Language = International}, // Chikorita Petal Dance
new(155, 05, GS) {OT_Names = PCNYx, Moves = new(038), EggLocation = 256, EggCycles = 10, Language = International}, // Cyndaquil Double-Edge
new(158, 05, GS) {OT_Names = PCNYx, Moves = new(066), EggLocation = 256, EggCycles = 10, Language = International}, // Totodile Submission
// Valentine Week (February 1 to 14, 2002)
new(029, 05, GS) {OT_Names = PCNYx, Moves = new(142), EggLocation = 256, EggCycles = 10, Language = International}, // Nidoran (F) Lovely Kiss
new(029, 05, GS) {OT_Names = PCNYx, Moves = new(186), EggLocation = 256, EggCycles = 10, Language = International}, // Nidoran (F) Sweet Kiss
new(032, 05, GS) {OT_Names = PCNYx, Moves = new(142), EggLocation = 256, EggCycles = 10, Language = International}, // Nidoran (M) Lovely Kiss
new(032, 05, GS) {OT_Names = PCNYx, Moves = new(186), EggLocation = 256, EggCycles = 10, Language = International}, // Nidoran (M) Sweet Kiss
new(069, 05, GS) {OT_Names = PCNYx, Moves = new(142), EggLocation = 256, EggCycles = 10, Language = International}, // Bellsprout Lovely Kiss
new(069, 05, GS) {OT_Names = PCNYx, Moves = new(186), EggLocation = 256, EggCycles = 10, Language = International}, // Bellsprout Sweet Kiss
// Swarm Week (February 22 to March 14, 2002)
new(183, 05, GS) {OT_Names = PCNYx, Moves = new(056), EggLocation = 256, EggCycles = 10, Language = International}, // Marill Hydro Pump
new(193, 05, GS) {OT_Names = PCNYx, Moves = new(211), EggLocation = 256, EggCycles = 10, Language = International}, // Yanma Steel Wing
new(206, 05, GS) {OT_Names = PCNYx, Moves = new(032), EggLocation = 256, EggCycles = 10, Language = International}, // Dunsparce Horn Drill
new(209, 05, GS) {OT_Names = PCNYx, Moves = new(142), EggLocation = 256, EggCycles = 10, Language = International}, // Snubbull Lovely Kiss
new(211, 05, GS) {OT_Names = PCNYx, Moves = new(038), EggLocation = 256, EggCycles = 10, Language = International}, // Qwilfish Double-Edge
new(223, 05, GS) {OT_Names = PCNYx, Moves = new(133), EggLocation = 256, EggCycles = 10, Language = International}, // Remoraid Amnesia
// Shiny RBY Starters (March 15 to 21, 2002)
new(003, 05, C) {OT_Names = PCNYx, CurrentLevel = 40, Shiny = Shiny.Always, Location = 127, Language = International}, // Shiny Venusaur
new(006, 05, C) {OT_Names = PCNYx, CurrentLevel = 40, Shiny = Shiny.Always, Location = 127, Language = International}, // Shiny Charizard
new(009, 05, C) {OT_Names = PCNYx, CurrentLevel = 40, Shiny = Shiny.Always, Location = 127, Language = International}, // Shiny Blastoise
// Babies Week (March 22 to April 11, 2002)
new(172, 05, GS) {OT_Names = PCNYx, Moves = new(047), EggLocation = 256, EggCycles = 10, Language = International}, // Pichu Sing
new(173, 05, GS) {OT_Names = PCNYx, Moves = new(129), EggLocation = 256, EggCycles = 10, Language = International}, // Cleffa Swift
new(174, 05, GS) {OT_Names = PCNYx, Moves = new(102), EggLocation = 256, EggCycles = 10, Language = International}, // Igglybuff Mimic
new(238, 05, GS) {OT_Names = PCNYx, Moves = new(118), EggLocation = 256, EggCycles = 10, Language = International}, // Smoochum Metronome
new(239, 05, GS) {OT_Names = PCNYx, Moves = new(228), EggLocation = 256, EggCycles = 10, Language = International}, // Elekid Pursuit
new(240, 05, GS) {OT_Names = PCNYx, Moves = new(185), EggLocation = 256, EggCycles = 10, Language = International}, // Magby Faint Attack
// Spring Into Spring (April 12 to May 4, 2002)
new(054, 05, GS) {OT_Names = PCNYx, Moves = new(080), EggLocation = 256, EggCycles = 10, Language = International}, // Psyduck Petal Dance
new(152, 05, GS) {OT_Names = PCNYx, Moves = new(080), EggLocation = 256, EggCycles = 10, Language = International}, // Chikorita Petal Dance
new(172, 05, GS) {OT_Names = PCNYx, Moves = new(080), EggLocation = 256, EggCycles = 10, Language = International}, // Pichu Petal Dance
new(173, 05, GS) {OT_Names = PCNYx, Moves = new(080), EggLocation = 256, EggCycles = 10, Language = International}, // Cleffa Petal Dance
new(174, 05, GS) {OT_Names = PCNYx, Moves = new(080), EggLocation = 256, EggCycles = 10, Language = International}, // Igglybuff Petal Dance
new(238, 05, GS) {OT_Names = PCNYx, Moves = new(080), EggLocation = 256, EggCycles = 10, Language = International}, // Smoochum Petal Dance
// Baby Weeks (May 5 to June 7, 2002)
new(194, 05, GS) {Moves = new(187), EggLocation = 256, EggCycles = 10, Language = International}, // Wooper Belly Drum
// Tropical Promotion to Summer Festival 1 (June 8 to 21, 2002)
new(060, 05, GS) {OT_Names = PCNYx, Moves = new(074), EggLocation = 256, EggCycles = 10, Language = International}, // Poliwag Growth
new(116, 05, GS) {OT_Names = PCNYx, Moves = new(114), EggLocation = 256, EggCycles = 10, Language = International}, // Horsea Haze
new(118, 05, GS) {OT_Names = PCNYx, Moves = new(014), EggLocation = 256, EggCycles = 10, Language = International}, // Goldeen Swords Dance
new(129, 05, GS) {OT_Names = PCNYx, Moves = new(179), EggLocation = 256, EggCycles = 10, Language = International}, // Magikarp Reversal
new(183, 05, GS) {OT_Names = PCNYx, Moves = new(146), EggLocation = 256, EggCycles = 10, Language = International}, // Marill Dizzy Punch
// Tropical Promotion to Summer Festival 2 (July 12 to August 8, 2002)
new(054, 05, GS) {OT_Names = PCNYx, Moves = new(161), EggLocation = 256, EggCycles = 10, Language = International}, // Psyduck Tri Attack
new(072, 05, GS) {OT_Names = PCNYx, Moves = new(109), EggLocation = 256, EggCycles = 10, Language = International}, // Tentacool Confuse Ray
new(131, 05, GS) {OT_Names = PCNYx, Moves = new(044), EggLocation = 256, EggCycles = 10, Language = International}, // Lapras Bite
new(170, 05, GS) {OT_Names = PCNYx, Moves = new(113), EggLocation = 256, EggCycles = 10, Language = International}, // Chinchou Light Screen
new(223, 05, GS) {OT_Names = PCNYx, Moves = new(054), EggLocation = 256, EggCycles = 10, Language = International}, // Remoraid Mist
new(226, 05, GS) {OT_Names = PCNYx, Moves = new(016), EggLocation = 256, EggCycles = 10, Language = International}, // Mantine Gust
// Safari Week (August 9 to 29, 2002)
new(029, 05, GS) {OT_Names = PCNYx, Moves = new(236), EggLocation = 256, EggCycles = 10, Language = International}, // Nidoran (F) Moonlight
new(032, 05, GS) {OT_Names = PCNYx, Moves = new(234), EggLocation = 256, EggCycles = 10, Language = International}, // Nidoran (M) Morning Sun
new(113, 05, GS) {OT_Names = PCNYx, Moves = new(230), EggLocation = 256, EggCycles = 10, Language = International}, // Chansey Sweet Scent
new(115, 05, GS) {OT_Names = PCNYx, Moves = new(185), EggLocation = 256, EggCycles = 10, Language = International}, // Kangaskhan Faint Attack
new(128, 05, GS) {OT_Names = PCNYx, Moves = new(098), EggLocation = 256, EggCycles = 10, Language = International}, // Tauros Quick Attack
new(147, 05, GS) {OT_Names = PCNYx, Moves = new(056), EggLocation = 256, EggCycles = 10, Language = International}, // Dratini Hydro Pump
// Sky Week (August 30 to September 26, 2002)
new(021, 05, GS) {OT_Names = PCNYx, Moves = new(049), EggLocation = 256, EggCycles = 10, Language = International}, // Spearow SonicBoom
new(083, 05, GS) {OT_Names = PCNYx, Moves = new(210), EggLocation = 256, EggCycles = 10, Language = International}, // Farfetch'd Fury Cutter
new(084, 05, GS) {OT_Names = PCNYx, Moves = new(067), EggLocation = 256, EggCycles = 10, Language = International}, // Doduo Low Kick
new(177, 05, GS) {OT_Names = PCNYx, Moves = new(219), EggLocation = 256, EggCycles = 10, Language = International}, // Natu Safeguard
new(198, 05, GS) {OT_Names = PCNYx, Moves = new(251), EggLocation = 256, EggCycles = 10, Language = International}, // Murkrow Beat Up
new(227, 05, GS) {OT_Names = PCNYx, Moves = new(210), EggLocation = 256, EggCycles = 10, Language = International}, // Skarmory Fury Cutter
// The Kanto Initial Three Pokémon (September 27 to October 3, 2002)
new(150, 05, C) {OT_Names = PCNYx, CurrentLevel = 70, Shiny = Shiny.Always, Location = 127, Language = International}, // Shiny Mewtwo
// Power Plant Pokémon (October 4 to October 10, 2002)
new(172, 05, GS) {OT_Names = PCNYx, Moves = new(146), EggLocation = 256, EggCycles = 10, Language = International}, // Pichu Dizzy Punch
new(081, 05, GS) {OT_Names = PCNYx, Moves = new(097), EggLocation = 256, EggCycles = 10, Language = International}, // Magnemite Agility
new(239, 05, GS) {OT_Names = PCNYx, Moves = new(146), EggLocation = 256, EggCycles = 10, Language = International}, // Elekid Dizzy Punch
new(100, 05, GS) {OT_Names = PCNYx, Moves = new(097), EggLocation = 256, EggCycles = 10, Language = International}, // Voltorb Agility
// Scary Face Pokémon (October 25 to October 31, 2002)
new(173, 05, GS) {OT_Names = PCNYx, Moves = new(184), EggLocation = 256, EggCycles = 10, Language = International}, // Cleffa Scary Face
new(174, 05, GS) {OT_Names = PCNYx, Moves = new(184), EggLocation = 256, EggCycles = 10, Language = International}, // Igglybuff Scary Face
new(183, 05, GS) {OT_Names = PCNYx, Moves = new(184), EggLocation = 256, EggCycles = 10, Language = International}, // Marill Scary Face
new(172, 05, GS) {OT_Names = PCNYx, Moves = new(184), EggLocation = 256, EggCycles = 10, Language = International}, // Pichu Scary Face
new(194, 05, GS) {OT_Names = PCNYx, Moves = new(184), EggLocation = 256, EggCycles = 10, Language = International}, // Wooper Scary Face
// Silver Cave (November 1 to November 7, 2002)
new(114, 05, GS) {OT_Names = PCNYx, Moves = new(235), EggLocation = 256, EggCycles = 10, Language = International}, // Tangela Synthesis
new(077, 05, GS) {OT_Names = PCNYx, Moves = new(067), EggLocation = 256, EggCycles = 10, Language = International}, // Ponyta Low Kick
new(200, 05, GS) {OT_Names = PCNYx, Moves = new(095), EggLocation = 256, EggCycles = 10, Language = International}, // Misdreavus Hypnosis
new(246, 05, GS) {OT_Names = PCNYx, Moves = new(099), EggLocation = 256, EggCycles = 10, Language = International}, // Larvitar Rage
// Union Cave Pokémon (November 8 to 14, 2002)
new(120, 05, GS) {OT_Names = PCNYx, Moves = new(239), EggLocation = 256, EggCycles = 10, Language = International}, // Staryu Twister
new(098, 05, GS) {OT_Names = PCNYx, Moves = new(232), EggLocation = 256, EggCycles = 10, Language = International}, // Krabby Metal Claw
new(095, 05, GS) {OT_Names = PCNYx, Moves = new(159), EggLocation = 256, EggCycles = 10, Language = International}, // Onix Sharpen
new(131, 05, GS) {OT_Names = PCNYx, Moves = new(248), EggLocation = 256, EggCycles = 10, Language = International}, // Lapras Future Sight
// Johto Legendary (November 15 to 21, 2002)
new(250, 05, C) {OT_Names = PCNYx, CurrentLevel = 40, Shiny = Shiny.Always, Location = 127, Language = International}, // Shiny Ho-Oh
new(249, 05, C) {OT_Names = PCNYx, CurrentLevel = 40, Shiny = Shiny.Always, Location = 127, Language = International}, // Shiny Lugia
// Celebi Present SP (November 22 to 28, 2002)
new(151, 05, C) {OT_Names = PCNYx, Shiny = Shiny.Always, Location = 127, Language = International}, // Shiny Mew
// Psychic Type Pokémon (November 29 to December 5, 2002)
new(063, 05, GS) {OT_Names = PCNYx, Moves = new(193), EggLocation = 256, EggCycles = 10, Language = International}, // Abra Foresight
new(096, 05, GS) {OT_Names = PCNYx, Moves = new(133), EggLocation = 256, EggCycles = 10, Language = International}, // Drowzee Amnesia
new(102, 05, GS) {OT_Names = PCNYx, Moves = new(230), EggLocation = 256, EggCycles = 10, Language = International}, // Exeggcute Sweet Scent
new(122, 05, GS) {OT_Names = PCNYx, Moves = new(170), EggLocation = 256, EggCycles = 10, Language = International}, // Mr. Mime Mind Reader
// The Johto Initial Three Pokémon (December 6 to 12, 2002)
new(154, 05, C) {OT_Names = PCNYx, CurrentLevel = 40, Shiny = Shiny.Always, Location = 127, Language = International}, // Shiny Meganium
new(157, 05, C) {OT_Names = PCNYx, CurrentLevel = 40, Shiny = Shiny.Always, Location = 127, Language = International}, // Shiny Typhlosion
new(160, 05, C) {OT_Names = PCNYx, CurrentLevel = 40, Shiny = Shiny.Always, Location = 127, Language = International}, // Shiny Feraligatr
// Rock Tunnel Pokémon (December 13 to December 19, 2002)
new(074, 05, GS) {OT_Names = PCNYx, Moves = new(229), EggLocation = 256, EggCycles = 10, Language = International}, // Geodude Rapid Spin
new(041, 05, GS) {OT_Names = PCNYx, Moves = new(175), EggLocation = 256, EggCycles = 10, Language = International}, // Zubat Flail
new(066, 05, GS) {OT_Names = PCNYx, Moves = new(037), EggLocation = 256, EggCycles = 10, Language = International}, // Machop Thrash
new(104, 05, GS) {OT_Names = PCNYx, Moves = new(031), EggLocation = 256, EggCycles = 10, Language = International}, // Cubone Fury Attack
// Ice Type Pokémon (December 20 to 26, 2002)
new(225, 05, GS) {OT_Names = PCNYx, Moves = new(191), EggLocation = 256, EggCycles = 10, Language = International}, // Delibird Spikes
new(086, 05, GS) {OT_Names = PCNYx, Moves = new(175), EggLocation = 256, EggCycles = 10, Language = International}, // Seel Flail
new(220, 05, GS) {OT_Names = PCNYx, Moves = new(018), EggLocation = 256, EggCycles = 10, Language = International}, // Swinub Whirlwind
// Pokémon that Appear at Night only (December 27, 2002 to January 2, 2003)
new(163, 05, GS) {OT_Names = PCNYx, Moves = new(101), EggLocation = 256, EggCycles = 10, Language = International}, // Hoothoot Night Shade
new(215, 05, GS) {OT_Names = PCNYx, Moves = new(236), EggLocation = 256, EggCycles = 10, Language = International}, // Sneasel Moonlight
// Grass Type ( January 3 to 9, 2003)
new(191, 05, GS) {OT_Names = PCNYx, Moves = new(150), EggLocation = 256, EggCycles = 10, Language = International}, // Sunkern Splash
new(046, 05, GS) {OT_Names = PCNYx, Moves = new(235), EggLocation = 256, EggCycles = 10, Language = International}, // Paras Synthesis
new(187, 05, GS) {OT_Names = PCNYx, Moves = new(097), EggLocation = 256, EggCycles = 10, Language = International}, // Hoppip Agility
new(043, 05, GS) {OT_Names = PCNYx, Moves = new(073), EggLocation = 256, EggCycles = 10, Language = International}, // Oddish Leech Seed
// Normal Pokémon (January 10 to 16, 2003)
new(161, 05, GS) {OT_Names = PCNYx, Moves = new(146), EggLocation = 256, EggCycles = 10, Language = International}, // Sentret Dizzy Punch
new(234, 05, GS) {OT_Names = PCNYx, Moves = new(219), EggLocation = 256, EggCycles = 10, Language = International}, // Stantler Safeguard
new(241, 05, GS) {OT_Names = PCNYx, Moves = new(025), EggLocation = 256, EggCycles = 10, Language = International}, // Miltank Mega Kick
new(190, 05, GS) {OT_Names = PCNYx, Moves = new(102), EggLocation = 256, EggCycles = 10, Language = International}, // Aipom Mimic
new(108, 05, GS) {OT_Names = PCNYx, Moves = new(003), EggLocation = 256, EggCycles = 10, Language = International}, // Lickitung DoubleSlap
new(143, 05, GS) {OT_Names = PCNYx, Moves = new(150), EggLocation = 256, EggCycles = 10, Language = International}, // Snorlax Splash
// Mt. Mortar (January 24 to 30, 2003)
new(066, 05, GS) {OT_Names = PCNYx, Moves = new(206), EggLocation = 256, EggCycles = 10, Language = International}, // Machop False Swipe
new(129, 05, GS) {OT_Names = PCNYx, Moves = new(145), EggLocation = 256, EggCycles = 10, Language = International}, // Magikarp Bubble
new(236, 05, GS) {OT_Names = PCNYx, Moves = new(099), EggLocation = 256, EggCycles = 10, Language = International}, // Tyrogue Rage
// Dark Cave Pokémon (January 31 to February 6, 2003)
new(206, 05, GS) {OT_Names = PCNYx, Moves = new(031), EggLocation = 256, EggCycles = 10, Language = International}, // Dunsparce Fury Attack
new(202, 05, GS) {OT_Names = PCNYx, Moves = new(102), EggLocation = 256, EggCycles = 10, Language = International}, // Wobbuffet Mimic
new(231, 05, GS) {OT_Names = PCNYx, Moves = new(071), EggLocation = 256, EggCycles = 10, Language = International}, // Phanpy Absorb
new(216, 05, GS) {OT_Names = PCNYx, Moves = new(230), EggLocation = 256, EggCycles = 10, Language = International}, // Teddiursa Sweet Scent
// Valentine's Day Special (February 7 to 13, 2003)
new(060, 05, GS) {OT_Names = PCNYx, Moves = new(186), EggLocation = 256, EggCycles = 10, Language = International}, // Poliwag Sweet Kiss
new(060, 05, GS) {OT_Names = PCNYx, Moves = new(142), EggLocation = 256, EggCycles = 10, Language = International}, // Poliwag Lovely Kiss
new(143, 05, GS) {OT_Names = PCNYx, Moves = new(186), EggLocation = 256, EggCycles = 10, Language = International}, // Snorlax Sweet Kiss
new(143, 05, GS) {OT_Names = PCNYx, Moves = new(142), EggLocation = 256, EggCycles = 10, Language = International}, // Snorlax Lovely Kiss
// Rare Pokémon (February 21 to 27, 2003)
new(140, 05, GS) {OT_Names = PCNYx, Moves = new(088), EggLocation = 256, EggCycles = 10, Language = International}, // Kabuto Rock Throw
new(138, 05, GS) {OT_Names = PCNYx, Moves = new(088), EggLocation = 256, EggCycles = 10, Language = International}, // Omanyte Rock Throw
new(142, 05, GS) {OT_Names = PCNYx, Moves = new(088), EggLocation = 256, EggCycles = 10, Language = International}, // Aerodactyl Rock Throw
new(137, 05, GS) {OT_Names = PCNYx, Moves = new(112), EggLocation = 256, EggCycles = 10, Language = International}, // Porygon Barrier
new(133, 05, GS) {OT_Names = PCNYx, Moves = new(074), EggLocation = 256, EggCycles = 10, Language = International}, // Eevee Growth
new(185, 05, GS) {OT_Names = PCNYx, Moves = new(164), EggLocation = 256, EggCycles = 10, Language = International}, // Sudowoodo Substitute
// Bug Type Pokémon (February 28 to March 6, 2003)
new(123, 05, GS) {OT_Names = PCNYx, Moves = new(049), EggLocation = 256, EggCycles = 10, Language = International}, // Scyther SonicBoom
new(214, 05, GS) {OT_Names = PCNYx, Moves = new(069), EggLocation = 256, EggCycles = 10, Language = International}, // Heracross Seismic Toss
new(127, 05, GS) {OT_Names = PCNYx, Moves = new(088), EggLocation = 256, EggCycles = 10, Language = International}, // Pinsir Rock Throw
new(165, 05, GS) {OT_Names = PCNYx, Moves = new(112), EggLocation = 256, EggCycles = 10, Language = International}, // Ledyba Barrier
new(167, 05, GS) {OT_Names = PCNYx, Moves = new(074), EggLocation = 256, EggCycles = 10, Language = International}, // Spinarak Growth
new(193, 05, GS) {OT_Names = PCNYx, Moves = new(186), EggLocation = 256, EggCycles = 10, Language = International}, // Yanma Sweet Kiss
new(204, 05, GS) {OT_Names = PCNYx, Moves = new(164), EggLocation = 256, EggCycles = 10, Language = International}, // Pineco Substitute
// Japanese Only (all below)
new(251, 30, GSC) {Location = 014}, // Celebi @ Ilex Forest (GBC)
// Gen2 Events
// Egg Cycles Subject to Change. OTs for Eggs are unknown.
// Pokémon Center Mystery Egg #1 (December 15, 2001 to January 14, 2002)
new(152, 05, GSC) {Moves = new(080), EggLocation = 256, EggCycles = 10}, // Chikorita Petal Dance
new(172, 05, GSC) {Moves = new(047), EggLocation = 256, EggCycles = 10}, // Pichu Sing
new(173, 05, GSC) {Moves = new(129), EggLocation = 256, EggCycles = 10}, // Cleffa Swift
new(194, 05, GSC) {Moves = new(187), EggLocation = 256, EggCycles = 10}, // Wooper Belly Drum
new(231, 05, GSC) {Moves = new(227), EggLocation = 256, EggCycles = 10}, // Phanpy Encore
new(238, 05, GSC) {Moves = new(118), EggLocation = 256, EggCycles = 10}, // Smoochum Metronome
// Pokémon Center Mystery Egg #2 (March 16 to April 7, 2002)
new(054, 05, GSC) {Moves = new(080), EggLocation = 256, EggCycles = 10}, // Psyduck Petal Dance
new(152, 05, GSC) {Moves = new(080), EggLocation = 256, EggCycles = 10}, // Chikorita Petal Dance
new(172, 05, GSC) {Moves = new(080), EggLocation = 256, EggCycles = 10}, // Pichu Petal Dance
new(173, 05, GSC) {Moves = new(080), EggLocation = 256, EggCycles = 10}, // Cleffa Petal Dance
new(174, 05, GSC) {Moves = new(080), EggLocation = 256, EggCycles = 10}, // Igglybuff Petal Dance
new(238, 05, GSC) {Moves = new(080), EggLocation = 256, EggCycles = 10}, // Smoochum Petal Dance
// Pokémon Center Mystery Egg #3 (April 27 to May 12, 2002)
new(001, 05, GSC) {Moves = new(246), EggLocation = 256, EggCycles = 10}, // Bulbasaur Ancientpower
new(004, 05, GSC) {Moves = new(242), EggLocation = 256, EggCycles = 10}, // Charmander Crunch
new(158, 05, GSC) {Moves = new(066), EggLocation = 256, EggCycles = 10}, // Totodile Submission
new(163, 05, GSC) {Moves = new(101), EggLocation = 256, EggCycles = 10}, // Hoot-Hoot Night Shade
};
}

View file

@ -0,0 +1,125 @@
using static PKHeX.Core.EncounterUtil;
using static PKHeX.Core.GameVersion;
namespace PKHeX.Core;
/// <summary>
/// Generation 2 Encounters
/// </summary>
internal static class Encounters2
{
internal static readonly EncounterArea2[] SlotsGD = EncounterArea2.GetAreas(Get("gold", "g2"), GD);
internal static readonly EncounterArea2[] SlotsSI = EncounterArea2.GetAreas(Get("silver", "g2"), SI);
internal static readonly EncounterArea2[] SlotsC = EncounterArea2.GetAreas(Get("crystal", "g2"), C);
private const string tradeGSC = "tradegsc";
private static readonly string[][] TradeNames = Util.GetLanguageStrings8(tradeGSC);
public static readonly EncounterStatic2[] StaticGSC =
{
new(152, 05, GSC) { Location = 001 }, // Chikorita @ New Bark Town
new(155, 05, GSC) { Location = 001 }, // Cyndaquil @ New Bark Town
new(158, 05, GSC) { Location = 001 }, // Totodile @ New Bark Town
new(175, 05, GSC) { Location = 000, EggEncounter = true }, // Togepi
new(131, 20, GSC) { Location = 010 }, // Lapras @ Union Cave
new(133, 20, GSC) { Location = 016 }, // Eevee @ Goldenrod City
new(185, 20, GSC) { Location = 020 }, // Sudowoodo @ Route 36
new(236, 10, GSC) { Location = 035 }, // Tyrogue @ Mt. Mortar
new(130, 30, GSC) { Location = 038, Shiny = Shiny.Always, Gender = 0, IVs = new(0, 14, 10, 10, 10, 10) }, // Gyarados @ Lake of Rage (forcing shiny IVs result in always Male)
new(074, 21, GSC) { Location = 036 }, // Geodude @ Rocket Hideout (Mahogany Town)
new(109, 21, GSC) { Location = 036 }, // Koffing @ Rocket Hideout (Mahogany Town)
new(100, 23, GSC) { Location = 036 }, // Voltorb @ Rocket Hideout (Mahogany Town)
new(101, 23, GSC) { Location = 036 }, // Electrode @ Rocket Hideout (Mahogany Town)
new(143, 50, GSC) { Location = 061 }, // Snorlax @ Vermillion City
new(211, 05, GSC) { Location = 008 }, // Qwilfish Swarm @ Route 32 (Old Rod)
new(211, 20, GSC) { Location = 008 }, // Qwilfish Swarm @ Route 32 (Good Rod)
new(211, 40, GSC) { Location = 008 }, // Qwilfish Swarm @ Route 32 (Super Rod)
new(137, 15, GSC) { Location = 071 }, // Porygon @ Celadon Game Corner
// Roamer
new(243, 40, GSC) { Location = 002 }, // Raikou
new(244, 40, GSC) { Location = 002 }, // Entei
};
public static readonly EncounterStatic2[] StaticGS =
{
new(133, 15, GS) { Location = 071 }, // Eevee @ Celadon Game Corner
new(122, 15, GS) { Location = 071 }, // Mr. Mime @ Celadon Game Corner
new(063, 10, GS) { Location = 016 }, // Abra @ Goldenrod City (Game Corner)
new(147, 10, GS) { Location = 016 }, // Dratini @ Goldenrod City (Game Corner)
new(023, 10, GS) { Location = 016 }, // Ekans @ Goldenrod City (Game Corner) (Gold)
new(027, 10, GS) { Location = 016 }, // Sandshrew @ Goldenrod City (Game Corner) (Silver)
new(223, 05, GS) { Location = 039 }, // Remoraid Swarm @ Route 44 (Old Rod)
new(223, 20, GS) { Location = 039 }, // Remoraid Swarm @ Route 44 (Good Rod)
new(223, 40, GS) { Location = 039 }, // Remoraid Swarm @ Route 44 (Super Rod)
// Roamer
new(245, 40, GS) { Location = 002 }, // Suicune
};
public static readonly EncounterStatic2[] StaticGD =
{
new(249, 70, GD) { Location = 031 }, // Lugia @ Whirl Islands
new(250, 40, GD) { Location = 023 }, // Ho-Oh @ Tin Tower
};
public static readonly EncounterStatic2[] StaticSI =
{
new(249, 40, SI) { Location = 031 }, // Lugia @ Whirl Islands
new(250, 70, SI) { Location = 023 }, // Ho-Oh @ Tin Tower
};
public static readonly EncounterStatic2[] StaticC =
{
new(245, 40, C) { Location = 023 }, // Suicune @ Tin Tower
new(147, 15, C) { Location = 042, Moves = new((int)Move.ExtremeSpeed, (int)Move.Wrap, (int)Move.ThunderWave, (int)Move.Twister) }, // Dratini ExtremeSpeed
new(249, 60, C) { Location = 031 }, // Lugia @ Whirl Islands
new(250, 60, C) { Location = 023 }, // Ho-Oh @ Tin Tower
new(025, 25, C) { Location = 071 }, // Pikachu @ Celadon Game Corner
new(246, 40, C) { Location = 071 }, // Larvitar @ Celadon Game Corner
new(063, 05, C) { Location = 016 }, // Abra @ Goldenrod City (Game Corner)
new(104, 15, C) { Location = 016 }, // Cubone @ Goldenrod City (Game Corner)
new(202, 15, C) { Location = 016 }, // Wobbuffet @ Goldenrod City (Game Corner)
};
public static readonly EncounterStatic2[] StaticOddEggC =
{
new(172, 05, C) { EggEncounter = true, Moves = new((int)Move.ThunderShock,(int)Move.Charm, (int)Move.DizzyPunch)}, // Pichu
new(173, 05, C) { EggEncounter = true, Moves = new((int)Move.Pound, (int)Move.Charm, (int)Move.DizzyPunch)}, // Cleffa
new(174, 05, C) { EggEncounter = true, Moves = new((int)Move.Sing, (int)Move.Charm, (int)Move.DizzyPunch)}, // Igglybuff
new(236, 05, C) { EggEncounter = true, Moves = new((int)Move.Tackle, (int)Move.DizzyPunch)}, // Tyrogue
new(238, 05, C) { EggEncounter = true, Moves = new((int)Move.Pound, (int)Move.Lick, (int)Move.DizzyPunch)}, // Smoochum
new(239, 05, C) { EggEncounter = true, Moves = new((int)Move.QuickAttack, (int)Move.Leer, (int)Move.DizzyPunch)}, // Elekid
new(240, 05, C) { EggEncounter = true, Moves = new((int)Move.Ember, (int)Move.DizzyPunch)}, // Magby
};
internal static readonly EncounterStatic2 CelebiVC = new(251, 30, C) { Location = 014 }; // Celebi @ Ilex Forest (VC)
internal static readonly EncounterTrade2[] TradeGift_GSC =
{
new(TradeNames, 0, 095, 03, 48926) { Gender = 0, IVs = new(08, 09, 06, 06, 06, 06) }, // Onix @ Violet City for Bellsprout [wild]
new(TradeNames, 1, 066, 05, 37460) { Gender = 1, IVs = new(12, 03, 07, 06, 06, 06) }, // Machop @ Goldenrod City for Drowzee [wild 9, hatched egg 5]
new(TradeNames, 2, 100, 05, 29189) { Gender = 2, IVs = new(08, 09, 08, 08, 08, 08) }, // Voltorb @ Olivine City for Krabby [egg]
new(TradeNames, 3, 112, 10, 00283) { Gender = 1, IVs = new(12, 07, 07, 06, 06, 06) }, // Rhydon @ Blackthorn City for Dragonair [wild]
new(TradeNames, 4, 142, 05, 26491) { Gender = 0, IVs = new(08, 09, 06, 06, 06, 06), OTGender = 1}, // Aerodactyl @ Route 14 for Chansey [egg]
new(TradeNames, 5, 078, 14, 15616) { Gender = 0, IVs = new(08, 09, 06, 06, 06, 06) }, // Rapidash @ Pewter City for Gloom [wild]
new(TradeNames, 6, 085, 10, 00283) { Gender = 1, IVs = new(12, 07, 07, 06, 06, 06), OTGender = 1}, // Dodrio @ Blackthorn City for Dragonair [wild]
new(TradeNames, 7, 178, 15, 15616) { Gender = 0, IVs = new(08, 09, 06, 08, 06, 06) }, // Xatu @ Pewter City for Haunter [wild]
new(TradeNames, 8, 082, 05, 50082) { Gender = 2, IVs = new(08, 09, 06, 06, 06, 06) }, // Magneton @ Power Plant for Dugtrio [traded for Lickitung]
new(TradeNames, 9, 021, 10, 01001), // Spearow @ Goldenrod City for free
new(TradeNames, 10, 213, 15, 00518), // Shuckle @ Cianwood City for free
};
}

View file

@ -0,0 +1,253 @@
using static PKHeX.Core.GameVersion;
using static PKHeX.Core.EncounterGBLanguage;
namespace PKHeX.Core;
internal static class Encounters2GBEra
{
private static readonly string[] PCNYx = { "PCNYa", "PCNYb", "PCNYc", "PCNYd" };
internal static readonly EncounterGift2[] StaticEventsGB =
{
// Stadium 2 Baton Pass Farfetch'd
new(083, 05, C) {Moves = new(226, 14, 97, 163), Location = 127, TID16 = 2000, OT_Name = "スタジアム"},
new(083, 05, C) {Moves = new(226, 14, 97, 163), Location = 127, TID16 = 2000, OT_Name = "Stadium", Language = International},
new(083, 05, C) {Moves = new(226, 14, 97, 163), Location = 127, TID16 = 2001, OT_Names = new[]{"Stade", "Stadion", "Stadio", "Estadio"}, Language = International},
// Stadium 2 Earthquake Gligar
new(207, 05, C) {Moves = new(89, 68, 17), Location = 127, TID16 = 2000, OT_Name = "スタジアム"},
new(207, 05, C) {Moves = new(89, 68, 17), Location = 127, TID16 = 2000, OT_Name = "Stadium", Language = International},
new(207, 05, C) {Moves = new(89, 68, 17), Location = 127, TID16 = 2001, OT_Names = new[]{"Stade", "Stadion", "Stadio", "Estadio"}, Language = International},
//New York Pokémon Center Events
// Legendary Beasts (November 22 to 29, 2001)
new(243, 05, C) {OT_Names = PCNYx, CurrentLevel = 40, Shiny = Shiny.Always, Location = 127, Language = International}, // Shiny Raikou
new(244, 05, C) {OT_Names = PCNYx, CurrentLevel = 40, Shiny = Shiny.Always, Location = 127, Language = International}, // Shiny Entei
new(245, 05, C) {OT_Names = PCNYx, CurrentLevel = 40, Shiny = Shiny.Always, Location = 127, Language = International}, // Shiny Suicune
// Legendary Birds (November 30 to December 6, 2001)
new(144, 05, C) {OT_Names = PCNYx, CurrentLevel = 50, Shiny = Shiny.Always, Location = 127, Language = International}, // Shiny Articuno
new(145, 05, C) {OT_Names = PCNYx, CurrentLevel = 50, Shiny = Shiny.Always, Location = 127, Language = International}, // Shiny Zapdos
new(146, 05, C) {OT_Names = PCNYx, CurrentLevel = 50, Shiny = Shiny.Always, Location = 127, Language = International}, // Shiny Moltres
// Christmas Week (December 21 to 27, 2001)
new(225, 05, GS) {OT_Names = PCNYx, Moves = new(006), EggCycles = 10, Language = International}, // Pay Day Delibird
new(251, 05, C) {OT_Names = PCNYx, Location = 127, Language = International}, // Celebi
// The Initial Three Set (December 28, 2001 to January 31, 2002)
new(001, 05, GS) {OT_Names = PCNYx, Moves = new(246), EggCycles = 10, Language = International}, // Bulbasaur Ancientpower
new(004, 05, GS) {OT_Names = PCNYx, Moves = new(242), EggCycles = 10, Language = International}, // Charmander Crunch
new(007, 05, GS) {OT_Names = PCNYx, Moves = new(192), EggCycles = 10, Language = International}, // Squirtle Zap Cannon
new(152, 05, GS) {OT_Names = PCNYx, Moves = new(080), EggCycles = 10, Language = International}, // Chikorita Petal Dance
new(155, 05, GS) {OT_Names = PCNYx, Moves = new(038), EggCycles = 10, Language = International}, // Cyndaquil Double-Edge
new(158, 05, GS) {OT_Names = PCNYx, Moves = new(066), EggCycles = 10, Language = International}, // Totodile Submission
// Valentine Week (February 1 to 14, 2002)
new(029, 05, GS) {OT_Names = PCNYx, Moves = new(142), EggCycles = 10, Language = International}, // Nidoran (F) Lovely Kiss
new(029, 05, GS) {OT_Names = PCNYx, Moves = new(186), EggCycles = 10, Language = International}, // Nidoran (F) Sweet Kiss
new(032, 05, GS) {OT_Names = PCNYx, Moves = new(142), EggCycles = 10, Language = International}, // Nidoran (M) Lovely Kiss
new(032, 05, GS) {OT_Names = PCNYx, Moves = new(186), EggCycles = 10, Language = International}, // Nidoran (M) Sweet Kiss
new(069, 05, GS) {OT_Names = PCNYx, Moves = new(142), EggCycles = 10, Language = International}, // Bellsprout Lovely Kiss
new(069, 05, GS) {OT_Names = PCNYx, Moves = new(186), EggCycles = 10, Language = International}, // Bellsprout Sweet Kiss
// Swarm Week (February 22 to March 14, 2002)
new(183, 05, GS) {OT_Names = PCNYx, Moves = new(056), EggCycles = 10, Language = International}, // Marill Hydro Pump
new(193, 05, GS) {OT_Names = PCNYx, Moves = new(211), EggCycles = 10, Language = International}, // Yanma Steel Wing
new(206, 05, GS) {OT_Names = PCNYx, Moves = new(032), EggCycles = 10, Language = International}, // Dunsparce Horn Drill
new(209, 05, GS) {OT_Names = PCNYx, Moves = new(142), EggCycles = 10, Language = International}, // Snubbull Lovely Kiss
new(211, 05, GS) {OT_Names = PCNYx, Moves = new(038), EggCycles = 10, Language = International}, // Qwilfish Double-Edge
new(223, 05, GS) {OT_Names = PCNYx, Moves = new(133), EggCycles = 10, Language = International}, // Remoraid Amnesia
// Shiny RBY Starters (March 15 to 21, 2002)
new(003, 05, C) {OT_Names = PCNYx, CurrentLevel = 40, Shiny = Shiny.Always, Location = 127, Language = International}, // Shiny Venusaur
new(006, 05, C) {OT_Names = PCNYx, CurrentLevel = 40, Shiny = Shiny.Always, Location = 127, Language = International}, // Shiny Charizard
new(009, 05, C) {OT_Names = PCNYx, CurrentLevel = 40, Shiny = Shiny.Always, Location = 127, Language = International}, // Shiny Blastoise
// Babies Week (March 22 to April 11, 2002)
new(172, 05, GS) {OT_Names = PCNYx, Moves = new(047), EggCycles = 10, Language = International}, // Pichu Sing
new(173, 05, GS) {OT_Names = PCNYx, Moves = new(129), EggCycles = 10, Language = International}, // Cleffa Swift
new(174, 05, GS) {OT_Names = PCNYx, Moves = new(102), EggCycles = 10, Language = International}, // Igglybuff Mimic
new(238, 05, GS) {OT_Names = PCNYx, Moves = new(118), EggCycles = 10, Language = International}, // Smoochum Metronome
new(239, 05, GS) {OT_Names = PCNYx, Moves = new(228), EggCycles = 10, Language = International}, // Elekid Pursuit
new(240, 05, GS) {OT_Names = PCNYx, Moves = new(185), EggCycles = 10, Language = International}, // Magby Faint Attack
// Spring Into Spring (April 12 to May 4, 2002)
new(054, 05, GS) {OT_Names = PCNYx, Moves = new(080), EggCycles = 10, Language = International}, // Psyduck Petal Dance
new(152, 05, GS) {OT_Names = PCNYx, Moves = new(080), EggCycles = 10, Language = International}, // Chikorita Petal Dance
new(172, 05, GS) {OT_Names = PCNYx, Moves = new(080), EggCycles = 10, Language = International}, // Pichu Petal Dance
new(173, 05, GS) {OT_Names = PCNYx, Moves = new(080), EggCycles = 10, Language = International}, // Cleffa Petal Dance
new(174, 05, GS) {OT_Names = PCNYx, Moves = new(080), EggCycles = 10, Language = International}, // Igglybuff Petal Dance
new(238, 05, GS) {OT_Names = PCNYx, Moves = new(080), EggCycles = 10, Language = International}, // Smoochum Petal Dance
// Baby Weeks (May 5 to June 7, 2002)
new(194, 05, GS) {Moves = new(187), EggCycles = 10, Language = International}, // Wooper Belly Drum
// Tropical Promotion to Summer Festival 1 (June 8 to 21, 2002)
new(060, 05, GS) {OT_Names = PCNYx, Moves = new(074), EggCycles = 10, Language = International}, // Poliwag Growth
new(116, 05, GS) {OT_Names = PCNYx, Moves = new(114), EggCycles = 10, Language = International}, // Horsea Haze
new(118, 05, GS) {OT_Names = PCNYx, Moves = new(014), EggCycles = 10, Language = International}, // Goldeen Swords Dance
new(129, 05, GS) {OT_Names = PCNYx, Moves = new(179), EggCycles = 10, Language = International}, // Magikarp Reversal
new(183, 05, GS) {OT_Names = PCNYx, Moves = new(146), EggCycles = 10, Language = International}, // Marill Dizzy Punch
// Tropical Promotion to Summer Festival 2 (July 12 to August 8, 2002)
new(054, 05, GS) {OT_Names = PCNYx, Moves = new(161), EggCycles = 10, Language = International}, // Psyduck Tri Attack
new(072, 05, GS) {OT_Names = PCNYx, Moves = new(109), EggCycles = 10, Language = International}, // Tentacool Confuse Ray
new(131, 05, GS) {OT_Names = PCNYx, Moves = new(044), EggCycles = 10, Language = International}, // Lapras Bite
new(170, 05, GS) {OT_Names = PCNYx, Moves = new(113), EggCycles = 10, Language = International}, // Chinchou Light Screen
new(223, 05, GS) {OT_Names = PCNYx, Moves = new(054), EggCycles = 10, Language = International}, // Remoraid Mist
new(226, 05, GS) {OT_Names = PCNYx, Moves = new(016), EggCycles = 10, Language = International}, // Mantine Gust
// Safari Week (August 9 to 29, 2002)
new(029, 05, GS) {OT_Names = PCNYx, Moves = new(236), EggCycles = 10, Language = International}, // Nidoran (F) Moonlight
new(032, 05, GS) {OT_Names = PCNYx, Moves = new(234), EggCycles = 10, Language = International}, // Nidoran (M) Morning Sun
new(113, 05, GS) {OT_Names = PCNYx, Moves = new(230), EggCycles = 10, Language = International}, // Chansey Sweet Scent
new(115, 05, GS) {OT_Names = PCNYx, Moves = new(185), EggCycles = 10, Language = International}, // Kangaskhan Faint Attack
new(128, 05, GS) {OT_Names = PCNYx, Moves = new(098), EggCycles = 10, Language = International}, // Tauros Quick Attack
new(147, 05, GS) {OT_Names = PCNYx, Moves = new(056), EggCycles = 10, Language = International}, // Dratini Hydro Pump
// Sky Week (August 30 to September 26, 2002)
new(021, 05, GS) {OT_Names = PCNYx, Moves = new(049), EggCycles = 10, Language = International}, // Spearow SonicBoom
new(083, 05, GS) {OT_Names = PCNYx, Moves = new(210), EggCycles = 10, Language = International}, // Farfetch'd Fury Cutter
new(084, 05, GS) {OT_Names = PCNYx, Moves = new(067), EggCycles = 10, Language = International}, // Doduo Low Kick
new(177, 05, GS) {OT_Names = PCNYx, Moves = new(219), EggCycles = 10, Language = International}, // Natu Safeguard
new(198, 05, GS) {OT_Names = PCNYx, Moves = new(251), EggCycles = 10, Language = International}, // Murkrow Beat Up
new(227, 05, GS) {OT_Names = PCNYx, Moves = new(210), EggCycles = 10, Language = International}, // Skarmory Fury Cutter
// The Kanto Initial Three Pokémon (September 27 to October 3, 2002)
new(150, 05, C) {OT_Names = PCNYx, CurrentLevel = 70, Shiny = Shiny.Always, Location = 127, Language = International}, // Shiny Mewtwo
// Power Plant Pokémon (October 4 to October 10, 2002)
new(172, 05, GS) {OT_Names = PCNYx, Moves = new(146), EggCycles = 10, Language = International}, // Pichu Dizzy Punch
new(081, 05, GS) {OT_Names = PCNYx, Moves = new(097), EggCycles = 10, Language = International}, // Magnemite Agility
new(239, 05, GS) {OT_Names = PCNYx, Moves = new(146), EggCycles = 10, Language = International}, // Elekid Dizzy Punch
new(100, 05, GS) {OT_Names = PCNYx, Moves = new(097), EggCycles = 10, Language = International}, // Voltorb Agility
// Scary Face Pokémon (October 25 to October 31, 2002)
new(173, 05, GS) {OT_Names = PCNYx, Moves = new(184), EggCycles = 10, Language = International}, // Cleffa Scary Face
new(174, 05, GS) {OT_Names = PCNYx, Moves = new(184), EggCycles = 10, Language = International}, // Igglybuff Scary Face
new(183, 05, GS) {OT_Names = PCNYx, Moves = new(184), EggCycles = 10, Language = International}, // Marill Scary Face
new(172, 05, GS) {OT_Names = PCNYx, Moves = new(184), EggCycles = 10, Language = International}, // Pichu Scary Face
new(194, 05, GS) {OT_Names = PCNYx, Moves = new(184), EggCycles = 10, Language = International}, // Wooper Scary Face
// Silver Cave (November 1 to November 7, 2002)
new(114, 05, GS) {OT_Names = PCNYx, Moves = new(235), EggCycles = 10, Language = International}, // Tangela Synthesis
new(077, 05, GS) {OT_Names = PCNYx, Moves = new(067), EggCycles = 10, Language = International}, // Ponyta Low Kick
new(200, 05, GS) {OT_Names = PCNYx, Moves = new(095), EggCycles = 10, Language = International}, // Misdreavus Hypnosis
new(246, 05, GS) {OT_Names = PCNYx, Moves = new(099), EggCycles = 10, Language = International}, // Larvitar Rage
// Union Cave Pokémon (November 8 to 14, 2002)
new(120, 05, GS) {OT_Names = PCNYx, Moves = new(239), EggCycles = 10, Language = International}, // Staryu Twister
new(098, 05, GS) {OT_Names = PCNYx, Moves = new(232), EggCycles = 10, Language = International}, // Krabby Metal Claw
new(095, 05, GS) {OT_Names = PCNYx, Moves = new(159), EggCycles = 10, Language = International}, // Onix Sharpen
new(131, 05, GS) {OT_Names = PCNYx, Moves = new(248), EggCycles = 10, Language = International}, // Lapras Future Sight
// Johto Legendary (November 15 to 21, 2002)
new(250, 05, C) {OT_Names = PCNYx, CurrentLevel = 40, Shiny = Shiny.Always, Location = 127, Language = International}, // Shiny Ho-Oh
new(249, 05, C) {OT_Names = PCNYx, CurrentLevel = 40, Shiny = Shiny.Always, Location = 127, Language = International}, // Shiny Lugia
// Celebi Present SP (November 22 to 28, 2002)
new(151, 05, C) {OT_Names = PCNYx, Shiny = Shiny.Always, Location = 127, Language = International}, // Shiny Mew
// Psychic Type Pokémon (November 29 to December 5, 2002)
new(063, 05, GS) {OT_Names = PCNYx, Moves = new(193), EggCycles = 10, Language = International}, // Abra Foresight
new(096, 05, GS) {OT_Names = PCNYx, Moves = new(133), EggCycles = 10, Language = International}, // Drowzee Amnesia
new(102, 05, GS) {OT_Names = PCNYx, Moves = new(230), EggCycles = 10, Language = International}, // Exeggcute Sweet Scent
new(122, 05, GS) {OT_Names = PCNYx, Moves = new(170), EggCycles = 10, Language = International}, // Mr. Mime Mind Reader
// The Johto Initial Three Pokémon (December 6 to 12, 2002)
new(154, 05, C) {OT_Names = PCNYx, CurrentLevel = 40, Shiny = Shiny.Always, Location = 127, Language = International}, // Shiny Meganium
new(157, 05, C) {OT_Names = PCNYx, CurrentLevel = 40, Shiny = Shiny.Always, Location = 127, Language = International}, // Shiny Typhlosion
new(160, 05, C) {OT_Names = PCNYx, CurrentLevel = 40, Shiny = Shiny.Always, Location = 127, Language = International}, // Shiny Feraligatr
// Rock Tunnel Pokémon (December 13 to December 19, 2002)
new(074, 05, GS) {OT_Names = PCNYx, Moves = new(229), EggCycles = 10, Language = International}, // Geodude Rapid Spin
new(041, 05, GS) {OT_Names = PCNYx, Moves = new(175), EggCycles = 10, Language = International}, // Zubat Flail
new(066, 05, GS) {OT_Names = PCNYx, Moves = new(037), EggCycles = 10, Language = International}, // Machop Thrash
new(104, 05, GS) {OT_Names = PCNYx, Moves = new(031), EggCycles = 10, Language = International}, // Cubone Fury Attack
// Ice Type Pokémon (December 20 to 26, 2002)
new(225, 05, GS) {OT_Names = PCNYx, Moves = new(191), EggCycles = 10, Language = International}, // Delibird Spikes
new(086, 05, GS) {OT_Names = PCNYx, Moves = new(175), EggCycles = 10, Language = International}, // Seel Flail
new(220, 05, GS) {OT_Names = PCNYx, Moves = new(018), EggCycles = 10, Language = International}, // Swinub Whirlwind
// Pokémon that Appear at Night only (December 27, 2002 to January 2, 2003)
new(163, 05, GS) {OT_Names = PCNYx, Moves = new(101), EggCycles = 10, Language = International}, // Hoothoot Night Shade
new(215, 05, GS) {OT_Names = PCNYx, Moves = new(236), EggCycles = 10, Language = International}, // Sneasel Moonlight
// Grass Type ( January 3 to 9, 2003)
new(191, 05, GS) {OT_Names = PCNYx, Moves = new(150), EggCycles = 10, Language = International}, // Sunkern Splash
new(046, 05, GS) {OT_Names = PCNYx, Moves = new(235), EggCycles = 10, Language = International}, // Paras Synthesis
new(187, 05, GS) {OT_Names = PCNYx, Moves = new(097), EggCycles = 10, Language = International}, // Hoppip Agility
new(043, 05, GS) {OT_Names = PCNYx, Moves = new(073), EggCycles = 10, Language = International}, // Oddish Leech Seed
// Normal Pokémon (January 10 to 16, 2003)
new(161, 05, GS) {OT_Names = PCNYx, Moves = new(146), EggCycles = 10, Language = International}, // Sentret Dizzy Punch
new(234, 05, GS) {OT_Names = PCNYx, Moves = new(219), EggCycles = 10, Language = International}, // Stantler Safeguard
new(241, 05, GS) {OT_Names = PCNYx, Moves = new(025), EggCycles = 10, Language = International}, // Miltank Mega Kick
new(190, 05, GS) {OT_Names = PCNYx, Moves = new(102), EggCycles = 10, Language = International}, // Aipom Mimic
new(108, 05, GS) {OT_Names = PCNYx, Moves = new(003), EggCycles = 10, Language = International}, // Lickitung DoubleSlap
new(143, 05, GS) {OT_Names = PCNYx, Moves = new(150), EggCycles = 10, Language = International}, // Snorlax Splash
// Mt. Mortar (January 24 to 30, 2003)
new(066, 05, GS) {OT_Names = PCNYx, Moves = new(206), EggCycles = 10, Language = International}, // Machop False Swipe
new(129, 05, GS) {OT_Names = PCNYx, Moves = new(145), EggCycles = 10, Language = International}, // Magikarp Bubble
new(236, 05, GS) {OT_Names = PCNYx, Moves = new(099), EggCycles = 10, Language = International}, // Tyrogue Rage
// Dark Cave Pokémon (January 31 to February 6, 2003)
new(206, 05, GS) {OT_Names = PCNYx, Moves = new(031), EggCycles = 10, Language = International}, // Dunsparce Fury Attack
new(202, 05, GS) {OT_Names = PCNYx, Moves = new(102), EggCycles = 10, Language = International}, // Wobbuffet Mimic
new(231, 05, GS) {OT_Names = PCNYx, Moves = new(071), EggCycles = 10, Language = International}, // Phanpy Absorb
new(216, 05, GS) {OT_Names = PCNYx, Moves = new(230), EggCycles = 10, Language = International}, // Teddiursa Sweet Scent
// Valentine's Day Special (February 7 to 13, 2003)
new(060, 05, GS) {OT_Names = PCNYx, Moves = new(186), EggCycles = 10, Language = International}, // Poliwag Sweet Kiss
new(060, 05, GS) {OT_Names = PCNYx, Moves = new(142), EggCycles = 10, Language = International}, // Poliwag Lovely Kiss
new(143, 05, GS) {OT_Names = PCNYx, Moves = new(186), EggCycles = 10, Language = International}, // Snorlax Sweet Kiss
new(143, 05, GS) {OT_Names = PCNYx, Moves = new(142), EggCycles = 10, Language = International}, // Snorlax Lovely Kiss
// Rare Pokémon (February 21 to 27, 2003)
new(140, 05, GS) {OT_Names = PCNYx, Moves = new(088), EggCycles = 10, Language = International}, // Kabuto Rock Throw
new(138, 05, GS) {OT_Names = PCNYx, Moves = new(088), EggCycles = 10, Language = International}, // Omanyte Rock Throw
new(142, 05, GS) {OT_Names = PCNYx, Moves = new(088), EggCycles = 10, Language = International}, // Aerodactyl Rock Throw
new(137, 05, GS) {OT_Names = PCNYx, Moves = new(112), EggCycles = 10, Language = International}, // Porygon Barrier
new(133, 05, GS) {OT_Names = PCNYx, Moves = new(074), EggCycles = 10, Language = International}, // Eevee Growth
new(185, 05, GS) {OT_Names = PCNYx, Moves = new(164), EggCycles = 10, Language = International}, // Sudowoodo Substitute
// Bug Type Pokémon (February 28 to March 6, 2003)
new(123, 05, GS) {OT_Names = PCNYx, Moves = new(049), EggCycles = 10, Language = International}, // Scyther SonicBoom
new(214, 05, GS) {OT_Names = PCNYx, Moves = new(069), EggCycles = 10, Language = International}, // Heracross Seismic Toss
new(127, 05, GS) {OT_Names = PCNYx, Moves = new(088), EggCycles = 10, Language = International}, // Pinsir Rock Throw
new(165, 05, GS) {OT_Names = PCNYx, Moves = new(112), EggCycles = 10, Language = International}, // Ledyba Barrier
new(167, 05, GS) {OT_Names = PCNYx, Moves = new(074), EggCycles = 10, Language = International}, // Spinarak Growth
new(193, 05, GS) {OT_Names = PCNYx, Moves = new(186), EggCycles = 10, Language = International}, // Yanma Sweet Kiss
new(204, 05, GS) {OT_Names = PCNYx, Moves = new(164), EggCycles = 10, Language = International}, // Pineco Substitute
// Japanese Only (all below)
new(251, 30, GSC) {Location = 014}, // Celebi @ Ilex Forest (GBC)
// Gen2 Events
// Egg Cycles Subject to Change. OTs for Eggs are unknown.
// Pokémon Center Mystery Egg #1 (December 15, 2001 to January 14, 2002)
new(152, 05, GSC) {Moves = new(080), EggCycles = 10}, // Chikorita Petal Dance
new(172, 05, GSC) {Moves = new(047), EggCycles = 10}, // Pichu Sing
new(173, 05, GSC) {Moves = new(129), EggCycles = 10}, // Cleffa Swift
new(194, 05, GSC) {Moves = new(187), EggCycles = 10}, // Wooper Belly Drum
new(231, 05, GSC) {Moves = new(227), EggCycles = 10}, // Phanpy Encore
new(238, 05, GSC) {Moves = new(118), EggCycles = 10}, // Smoochum Metronome
// Pokémon Center Mystery Egg #2 (March 16 to April 7, 2002)
new(054, 05, GSC) {Moves = new(080), EggCycles = 10}, // Psyduck Petal Dance
new(152, 05, GSC) {Moves = new(080), EggCycles = 10}, // Chikorita Petal Dance
new(172, 05, GSC) {Moves = new(080), EggCycles = 10}, // Pichu Petal Dance
new(173, 05, GSC) {Moves = new(080), EggCycles = 10}, // Cleffa Petal Dance
new(174, 05, GSC) {Moves = new(080), EggCycles = 10}, // Igglybuff Petal Dance
new(238, 05, GSC) {Moves = new(080), EggCycles = 10}, // Smoochum Petal Dance
// Pokémon Center Mystery Egg #3 (April 27 to May 12, 2002)
new(001, 05, GSC) {Moves = new(246), EggCycles = 10}, // Bulbasaur Ancientpower
new(004, 05, GSC) {Moves = new(242), EggCycles = 10}, // Charmander Crunch
new(158, 05, GSC) {Moves = new(066), EggCycles = 10}, // Totodile Submission
new(163, 05, GSC) {Moves = new(101), EggCycles = 10}, // Hoot-Hoot Night Shade
};
}

View file

@ -4,103 +4,115 @@ namespace PKHeX.Core;
internal static class Encounters3Colo
{
internal static readonly EncounterStatic3[] Encounter_ColoGift =
internal static readonly EncounterStatic3Colo[] Starters =
{
// Colosseum Starters: Gender locked to male
new(196, 25, GameVersion.COLO) { Gift = true, Location = 254, Gender = 0 }, // Espeon
new(197, 26, GameVersion.COLO) { Gift = true, Location = 254, Gender = 0, Moves = new(044) }, // Umbreon (Bite)
new(196, 25) { Moves = new(093, 216, 115, 270) }, // Espeon
new(197, 26) { Moves = new(044, 269, 290, 289) }, // Umbreon (Bite)
};
internal static readonly EncounterStaticShadow[] Encounter_Colo =
internal static readonly string[] TrainerNameDuking = { string.Empty, "ギンザル", "DUKING", "DOKING", "RODRIGO", "GRAND", string.Empty, "GERMÁN", };
internal static readonly EncounterGift3Colo[] Gifts =
{
new(GameVersion.COLO, 01, 03000, ColoMakuhita) { Species = 296, Level = 30, Moves = new(193,116,233,238), Location = 005 }, // Makuhita: Miror B.Peon Trudly @ Phenac City
// In-Game without Bonus Disk
new(311, 13, TrainerNameDuking, GameVersion.CXD) { Location = 254, TID16 = 37149, OT_Gender = 0, Moves = new(045, 086, 098, 270) }, // Plusle @ Ingame Trade
};
new(GameVersion.COLO, 02, 03000, First) { Species = 153, Level = 30, Moves = new(241,235,075,034), Location = 003 }, // Bayleef: Cipher Peon Verde @ Phenac City
new(GameVersion.COLO, 02, 03000, First) { Species = 153, Level = 30, Moves = new(241,235,075,034), Location = 069 }, // Bayleef: Cipher Peon Verde @ Shadow PKMN Lab
new(GameVersion.COLO, 02, 03000, First) { Species = 153, Level = 30, Moves = new(241,235,075,034), Location = 115 }, // Bayleef: Cipher Peon Verde @ Realgam Tower
new(GameVersion.COLO, 02, 03000, First) { Species = 153, Level = 30, Moves = new(241,235,075,034), Location = 132 }, // Bayleef: Cipher Peon Verde @ Snagem Hideout
new(GameVersion.COLO, 03, 03000, First) { Species = 156, Level = 30, Moves = new(241,108,091,172), Location = 003 }, // Quilava: Cipher Peon Rosso @ Phenac City
new(GameVersion.COLO, 03, 03000, First) { Species = 156, Level = 30, Moves = new(241,108,091,172), Location = 069 }, // Quilava: Cipher Peon Rosso @ Shadow PKMN Lab
new(GameVersion.COLO, 03, 03000, First) { Species = 156, Level = 30, Moves = new(241,108,091,172), Location = 115 }, // Quilava: Cipher Peon Rosso @ Realgam Tower
new(GameVersion.COLO, 03, 03000, First) { Species = 156, Level = 30, Moves = new(241,108,091,172), Location = 132 }, // Quilava: Cipher Peon Rosso @ Snagem Hideout
new(GameVersion.COLO, 04, 03000, First) { Species = 159, Level = 30, Moves = new(240,184,044,057), Location = 003 }, // Croconaw: Cipher Peon Bluno @ Phenac City
new(GameVersion.COLO, 04, 03000, First) { Species = 159, Level = 30, Moves = new(240,184,044,057), Location = 069 }, // Croconaw: Cipher Peon Bluno @ Shadow PKMN Lab
new(GameVersion.COLO, 04, 03000, First) { Species = 159, Level = 30, Moves = new(240,184,044,057), Location = 115 }, // Croconaw: Cipher Peon Bluno @ Realgam Tower
new(GameVersion.COLO, 04, 03000, First) { Species = 159, Level = 30, Moves = new(240,184,044,057), Location = 132 }, // Croconaw: Cipher Peon Bluno @ Snagem Hideout
new(GameVersion.COLO, 05, 03000, First) { Species = 164, Level = 30, Moves = new(211,095,115,019), Location = 015 }, // Noctowl: Rider Nover @ Pyrite Town
new(GameVersion.COLO, 06, 03000, First) { Species = 180, Level = 30, Moves = new(085,086,178,084), Location = 015 }, // Flaaffy: St.Performer Diogo @ Pyrite Town
new(GameVersion.COLO, 07, 03000, First) { Species = 188, Level = 30, Moves = new(235,079,178,072), Location = 015 }, // Skiploom: Rider Leba @ Pyrite Town
new(GameVersion.COLO, 08, 04000, First) { Species = 195, Level = 30, Moves = new(341,133,021,057), Location = 015 }, // Quagsire: Bandana Guy Divel @ Pyrite Town
new(GameVersion.COLO, 09, 04000, First) { Species = 200, Level = 30, Moves = new(060,109,212,247), Location = 015 }, // Misdreavus: Rider Vant @ Pyrite Town
new(GameVersion.COLO, 10, 05000, First) { Species = 193, Level = 33, Moves = new(197,048,049,253), Location = 025 }, // Yanma: Cipher Peon Nore @ Pyrite Bldg
new(GameVersion.COLO, 10, 05000, First) { Species = 193, Level = 33, Moves = new(197,048,049,253), Location = 132 }, // Yanma: Cipher Peon Nore @ Snagem Hideout
new(GameVersion.COLO, 11, 05000, First) { Species = 162, Level = 33, Moves = new(231,270,098,070), Location = 015 }, // Furret: Rogue Cail @ Pyrite Town
new(GameVersion.COLO, 12, 04000, First) { Species = 218, Level = 30, Moves = new(241,281,088,053), Location = 015 }, // Slugma: Roller Boy Lon @ Pyrite Town
new(GameVersion.COLO, 13, 04000, First) { Species = 223, Level = 20, Moves = new(061,199,060,062), Location = 028 }, // Remoraid: Miror B.Peon Reath @ Pyrite Bldg
new(GameVersion.COLO, 13, 04000, First) { Species = 223, Level = 20, Moves = new(061,199,060,062), Location = 030 }, // Remoraid: Miror B.Peon Reath @ Pyrite Cave
new(GameVersion.COLO, 14, 05000, First) { Species = 226, Level = 33, Moves = new(017,048,061,036), Location = 028 }, // Mantine: Miror B.Peon Ferma @ Pyrite Bldg
new(GameVersion.COLO, 14, 05000, First) { Species = 226, Level = 33, Moves = new(017,048,061,036), Location = 030 }, // Mantine: Miror B.Peon Ferma @ Pyrite Cave
new(GameVersion.COLO, 15, 05000, First) { Species = 211, Level = 33, Moves = new(042,107,040,057), Location = 015 }, // Qwilfish: Hunter Doken @ Pyrite Bldg
new(GameVersion.COLO, 16, 05000, First) { Species = 307, Level = 33, Moves = new(197,347,093,136), Location = 031 }, // Meditite: Rider Twan @ Pyrite Cave
new(GameVersion.COLO, 17, 05000, First) { Species = 206, Level = 33, Moves = new(180,137,281,036), Location = 029 }, // Dunsparce: Rider Sosh @ Pyrite Cave
new(GameVersion.COLO, 18, 05000, First) { Species = 333, Level = 33, Moves = new(119,047,219,019), Location = 032 }, // Swablu: Hunter Zalo @ Pyrite Cave
new(GameVersion.COLO, 19, 10000, First) { Species = 185, Level = 35, Moves = new(175,335,067,157), Location = 104 }, // Sudowoodo: Cipher Admin Miror B. @ Realgam Tower
new(GameVersion.COLO, 19, 10000, First) { Species = 185, Level = 35, Moves = new(175,335,067,157), Location = 125 }, // Sudowoodo: Cipher Admin Miror B. @ Deep Colosseum
new(GameVersion.COLO, 19, 10000, First) { Species = 185, Level = 35, Moves = new(175,335,067,157), Location = 030 }, // Sudowoodo: Cipher Admin Miror B. @ Pyrite Cave
new(GameVersion.COLO, 20, 06000, First) { Species = 237, Level = 38, Moves = new(097,116,167,229), Location = 039 }, // Hitmontop: Cipher Peon Skrub @ Agate Village
new(GameVersion.COLO, 20, 06000, First) { Species = 237, Level = 38, Moves = new(097,116,167,229), Location = 132 }, // Hitmontop: Cipher Peon Skrub @ Snagem Hideout
new(GameVersion.COLO, 20, 06000, First) { Species = 237, Level = 38, Moves = new(097,116,167,229), Location = 068 }, // Hitmontop: Cipher Peon Skrub @ Shadow PKMN Lab
new(GameVersion.COLO, 21, 13000, First) { Species = 244, Level = 40, Moves = new(241,043,044,126), Location = 106 }, // Entei: Cipher Admin Dakim @ Realgam Tower
new(GameVersion.COLO, 21, 13000, First) { Species = 244, Level = 40, Moves = new(241,043,044,126), Location = 125 }, // Entei: Cipher Admin Dakim @ Deep Colosseum
new(GameVersion.COLO, 21, 13000, First) { Species = 244, Level = 40, Moves = new(241,043,044,126), Location = 076 }, // Entei: Cipher Admin Dakim @ Mt. Battle
new(GameVersion.COLO, 22, 06000, First) { Species = 166, Level = 40, Moves = new(226,219,048,004), Location = 047 }, // Ledian: Cipher Peon Kloak @ The Under
new(GameVersion.COLO, 22, 06000, First) { Species = 166, Level = 40, Moves = new(226,219,048,004), Location = 132 }, // Ledian: Cipher Peon Kloak @ Snagem Hideout
new(GameVersion.COLO, 23, 13000, First) { Species = 245, Level = 40, Moves = new(240,043,016,057), Location = 110 }, // Suicune (Surf): Cipher Admin Venus @ Realgam Tower
new(GameVersion.COLO, 23, 13000, First) { Species = 245, Level = 40, Moves = new(240,043,016,056), Location = 125 }, // Suicune (Hydro Pump): Cipher Admin Venus @ Deep Colosseum
new(GameVersion.COLO, 23, 13000, First) { Species = 245, Level = 40, Moves = new(240,043,016,057), Location = 055 }, // Suicune (Surf): Cipher Admin Venus @ The Under
new(GameVersion.COLO, 24, 06000, Gligar) { Species = 207, Level = 43, Moves = new(185,028,040,163), Location = 058 }, // Gligar: Hunter Frena @ The Under Subway
new(GameVersion.COLO, 24, 06000, Gligar) { Species = 207, Level = 43, Moves = new(185,028,040,163), Location = 133 }, // Gligar: Hunter Frena @ Snagem Hideout
new(GameVersion.COLO, 25, 06000, First) { Species = 234, Level = 43, Moves = new(310,095,043,036), Location = 058 }, // Stantler: Chaser Liaks @ The Under Subway
new(GameVersion.COLO, 25, 06000, First) { Species = 234, Level = 43, Moves = new(310,095,043,036), Location = 133 }, // Stantler: Chaser Liaks @ Snagem Hideout
new(GameVersion.COLO, 25, 06000, First) { Species = 221, Level = 43, Moves = new(203,316,091,059), Location = 058 }, // Piloswine: Bodybuilder Lonia @ The Under Subway
new(GameVersion.COLO, 26, 06000, First) { Species = 221, Level = 43, Moves = new(203,316,091,059), Location = 134 }, // Piloswine: Bodybuilder Lonia @ Snagem Hideout
new(GameVersion.COLO, 27, 06000, First) { Species = 215, Level = 43, Moves = new(185,103,154,196), Location = 058 }, // Sneasel: Rider Nelis @ The Under Subway
new(GameVersion.COLO, 27, 06000, First) { Species = 215, Level = 43, Moves = new(185,103,154,196), Location = 134 }, // Sneasel: Rider Nelis @ Snagem Hideout
new(GameVersion.COLO, 28, 06000, First) { Species = 190, Level = 43, Moves = new(226,321,154,129), Location = 067 }, // Aipom: Cipher Peon Cole @ Shadow PKMN Lab
new(GameVersion.COLO, 29, 06000, Murkrow) { Species = 198, Level = 43, Moves = new(185,212,101,019), Location = 067 }, // Murkrow: Cipher Peon Lare @ Shadow PKMN Lab
new(GameVersion.COLO, 30, 06000, First) { Species = 205, Level = 43, Moves = new(153,182,117,229), Location = 067 }, // Forretress: Cipher Peon Vana @ Shadow PKMN Lab
new(GameVersion.COLO, 31, 06000, First) { Species = 210, Level = 43, Moves = new(044,184,046,070), Location = 069 }, // Granbull: Cipher Peon Tanie @ Shadow PKMN Lab
new(GameVersion.COLO, 32, 06000, First) { Species = 329, Level = 43, Moves = new(242,103,328,225), Location = 068 }, // Vibrava: Cipher Peon Remil @ Shadow PKMN Lab
new(GameVersion.COLO, 33, 06000, First) { Species = 168, Level = 43, Moves = new(169,184,141,188), Location = 069 }, // Ariados: Cipher Peon Lesar @ Shadow PKMN Lab
internal static readonly EncounterShadow3Colo[] Shadow =
{
new(01, 03000, ColoMakuhita) { Species = 296, Level = 30, Moves = new(193,116,233,238), Location = 005 }, // Makuhita: Miror B.Peon Trudly @ Phenac City
new(GameVersion.COLO, 34, 13000, First) { Species = 243, Level = 40, Moves = new(240,043,098,087), Location = 113 }, // Raikou: Cipher Admin Ein @ Realgam Tower
new(GameVersion.COLO, 34, 13000, First) { Species = 243, Level = 40, Moves = new(240,043,098,087), Location = 125 }, // Raikou: Cipher Admin Ein @ Deep Colosseum
new(GameVersion.COLO, 34, 13000, First) { Species = 243, Level = 40, Moves = new(240,043,098,087), Location = 069 }, // Raikou: Cipher Admin Ein @ Shadow PKMN Lab
new(02, 03000, First) { Species = 153, Level = 30, Moves = new(241,235,075,034), Location = 003 }, // Bayleef: Cipher Peon Verde @ Phenac City
new(02, 03000, First) { Species = 153, Level = 30, Moves = new(241,235,075,034), Location = 069 }, // Bayleef: Cipher Peon Verde @ Shadow PKMN Lab
new(02, 03000, First) { Species = 153, Level = 30, Moves = new(241,235,075,034), Location = 115 }, // Bayleef: Cipher Peon Verde @ Realgam Tower
new(02, 03000, First) { Species = 153, Level = 30, Moves = new(241,235,075,034), Location = 132 }, // Bayleef: Cipher Peon Verde @ Snagem Hideout
new(03, 03000, First) { Species = 156, Level = 30, Moves = new(241,108,091,172), Location = 003 }, // Quilava: Cipher Peon Rosso @ Phenac City
new(03, 03000, First) { Species = 156, Level = 30, Moves = new(241,108,091,172), Location = 069 }, // Quilava: Cipher Peon Rosso @ Shadow PKMN Lab
new(03, 03000, First) { Species = 156, Level = 30, Moves = new(241,108,091,172), Location = 115 }, // Quilava: Cipher Peon Rosso @ Realgam Tower
new(03, 03000, First) { Species = 156, Level = 30, Moves = new(241,108,091,172), Location = 132 }, // Quilava: Cipher Peon Rosso @ Snagem Hideout
new(04, 03000, First) { Species = 159, Level = 30, Moves = new(240,184,044,057), Location = 003 }, // Croconaw: Cipher Peon Bluno @ Phenac City
new(04, 03000, First) { Species = 159, Level = 30, Moves = new(240,184,044,057), Location = 069 }, // Croconaw: Cipher Peon Bluno @ Shadow PKMN Lab
new(04, 03000, First) { Species = 159, Level = 30, Moves = new(240,184,044,057), Location = 115 }, // Croconaw: Cipher Peon Bluno @ Realgam Tower
new(04, 03000, First) { Species = 159, Level = 30, Moves = new(240,184,044,057), Location = 132 }, // Croconaw: Cipher Peon Bluno @ Snagem Hideout
new(05, 03000, First) { Species = 164, Level = 30, Moves = new(211,095,115,019), Location = 015 }, // Noctowl: Rider Nover @ Pyrite Town
new(06, 03000, First) { Species = 180, Level = 30, Moves = new(085,086,178,084), Location = 015 }, // Flaaffy: St.Performer Diogo @ Pyrite Town
new(07, 03000, First) { Species = 188, Level = 30, Moves = new(235,079,178,072), Location = 015 }, // Skiploom: Rider Leba @ Pyrite Town
new(08, 04000, First) { Species = 195, Level = 30, Moves = new(341,133,021,057), Location = 015 }, // Quagsire: Bandana Guy Divel @ Pyrite Town
new(09, 04000, First) { Species = 200, Level = 30, Moves = new(060,109,212,247), Location = 015 }, // Misdreavus: Rider Vant @ Pyrite Town
new(10, 05000, First) { Species = 193, Level = 33, Moves = new(197,048,049,253), Location = 025 }, // Yanma: Cipher Peon Nore @ Pyrite Bldg
new(10, 05000, First) { Species = 193, Level = 33, Moves = new(197,048,049,253), Location = 132 }, // Yanma: Cipher Peon Nore @ Snagem Hideout
new(11, 05000, First) { Species = 162, Level = 33, Moves = new(231,270,098,070), Location = 015 }, // Furret: Rogue Cail @ Pyrite Town
new(12, 04000, First) { Species = 218, Level = 30, Moves = new(241,281,088,053), Location = 015 }, // Slugma: Roller Boy Lon @ Pyrite Town
new(13, 04000, First) { Species = 223, Level = 20, Moves = new(061,199,060,062), Location = 028 }, // Remoraid: Miror B.Peon Reath @ Pyrite Bldg
new(13, 04000, First) { Species = 223, Level = 20, Moves = new(061,199,060,062), Location = 030 }, // Remoraid: Miror B.Peon Reath @ Pyrite Cave
new(14, 05000, First) { Species = 226, Level = 33, Moves = new(017,048,061,036), Location = 028 }, // Mantine: Miror B.Peon Ferma @ Pyrite Bldg
new(14, 05000, First) { Species = 226, Level = 33, Moves = new(017,048,061,036), Location = 030 }, // Mantine: Miror B.Peon Ferma @ Pyrite Cave
new(15, 05000, First) { Species = 211, Level = 33, Moves = new(042,107,040,057), Location = 015 }, // Qwilfish: Hunter Doken @ Pyrite Bldg
new(16, 05000, First) { Species = 307, Level = 33, Moves = new(197,347,093,136), Location = 031 }, // Meditite: Rider Twan @ Pyrite Cave
new(17, 05000, First) { Species = 206, Level = 33, Moves = new(180,137,281,036), Location = 029 }, // Dunsparce: Rider Sosh @ Pyrite Cave
new(18, 05000, First) { Species = 333, Level = 33, Moves = new(119,047,219,019), Location = 032 }, // Swablu: Hunter Zalo @ Pyrite Cave
new(19, 10000, First) { Species = 185, Level = 35, Moves = new(175,335,067,157), Location = 104 }, // Sudowoodo: Cipher Admin Miror B. @ Realgam Tower
new(19, 10000, First) { Species = 185, Level = 35, Moves = new(175,335,067,157), Location = 125 }, // Sudowoodo: Cipher Admin Miror B. @ Deep Colosseum
new(19, 10000, First) { Species = 185, Level = 35, Moves = new(175,335,067,157), Location = 030 }, // Sudowoodo: Cipher Admin Miror B. @ Pyrite Cave
new(20, 06000, First) { Species = 237, Level = 38, Moves = new(097,116,167,229), Location = 039 }, // Hitmontop: Cipher Peon Skrub @ Agate Village
new(20, 06000, First) { Species = 237, Level = 38, Moves = new(097,116,167,229), Location = 132 }, // Hitmontop: Cipher Peon Skrub @ Snagem Hideout
new(20, 06000, First) { Species = 237, Level = 38, Moves = new(097,116,167,229), Location = 068 }, // Hitmontop: Cipher Peon Skrub @ Shadow PKMN Lab
new(21, 13000, First) { Species = 244, Level = 40, Moves = new(241,043,044,126), Location = 106 }, // Entei: Cipher Admin Dakim @ Realgam Tower
new(21, 13000, First) { Species = 244, Level = 40, Moves = new(241,043,044,126), Location = 125 }, // Entei: Cipher Admin Dakim @ Deep Colosseum
new(21, 13000, First) { Species = 244, Level = 40, Moves = new(241,043,044,126), Location = 076 }, // Entei: Cipher Admin Dakim @ Mt. Battle
new(22, 06000, First) { Species = 166, Level = 40, Moves = new(226,219,048,004), Location = 047 }, // Ledian: Cipher Peon Kloak @ The Under
new(22, 06000, First) { Species = 166, Level = 40, Moves = new(226,219,048,004), Location = 132 }, // Ledian: Cipher Peon Kloak @ Snagem Hideout
new(23, 13000, First) { Species = 245, Level = 40, Moves = new(240,043,016,057), Location = 110 }, // Suicune (Surf): Cipher Admin Venus @ Realgam Tower
new(23, 13000, First) { Species = 245, Level = 40, Moves = new(240,043,016,056), Location = 125 }, // Suicune (Hydro Pump): Cipher Admin Venus @ Deep Colosseum
new(23, 13000, First) { Species = 245, Level = 40, Moves = new(240,043,016,057), Location = 055 }, // Suicune (Surf): Cipher Admin Venus @ The Under
new(24, 06000, Gligar) { Species = 207, Level = 43, Moves = new(185,028,040,163), Location = 058 }, // Gligar: Hunter Frena @ The Under Subway
new(24, 06000, Gligar) { Species = 207, Level = 43, Moves = new(185,028,040,163), Location = 133 }, // Gligar: Hunter Frena @ Snagem Hideout
new(25, 06000, First) { Species = 234, Level = 43, Moves = new(310,095,043,036), Location = 058 }, // Stantler: Chaser Liaks @ The Under Subway
new(25, 06000, First) { Species = 234, Level = 43, Moves = new(310,095,043,036), Location = 133 }, // Stantler: Chaser Liaks @ Snagem Hideout
new(25, 06000, First) { Species = 221, Level = 43, Moves = new(203,316,091,059), Location = 058 }, // Piloswine: Bodybuilder Lonia @ The Under Subway
new(26, 06000, First) { Species = 221, Level = 43, Moves = new(203,316,091,059), Location = 134 }, // Piloswine: Bodybuilder Lonia @ Snagem Hideout
new(27, 06000, First) { Species = 215, Level = 43, Moves = new(185,103,154,196), Location = 058 }, // Sneasel: Rider Nelis @ The Under Subway
new(27, 06000, First) { Species = 215, Level = 43, Moves = new(185,103,154,196), Location = 134 }, // Sneasel: Rider Nelis @ Snagem Hideout
new(28, 06000, First) { Species = 190, Level = 43, Moves = new(226,321,154,129), Location = 067 }, // Aipom: Cipher Peon Cole @ Shadow PKMN Lab
new(29, 06000, Murkrow) { Species = 198, Level = 43, Moves = new(185,212,101,019), Location = 067 }, // Murkrow: Cipher Peon Lare @ Shadow PKMN Lab
new(30, 06000, First) { Species = 205, Level = 43, Moves = new(153,182,117,229), Location = 067 }, // Forretress: Cipher Peon Vana @ Shadow PKMN Lab
new(31, 06000, First) { Species = 210, Level = 43, Moves = new(044,184,046,070), Location = 069 }, // Granbull: Cipher Peon Tanie @ Shadow PKMN Lab
new(32, 06000, First) { Species = 329, Level = 43, Moves = new(242,103,328,225), Location = 068 }, // Vibrava: Cipher Peon Remil @ Shadow PKMN Lab
new(33, 06000, First) { Species = 168, Level = 43, Moves = new(169,184,141,188), Location = 069 }, // Ariados: Cipher Peon Lesar @ Shadow PKMN Lab
new(GameVersion.COLO, 35, 07000, First) { Species = 192, Level = 45, Moves = new(241,074,275,076), Location = 109 }, // Sunflora: Cipher Peon Baila @ Realgam Tower
new(GameVersion.COLO, 35, 07000, First) { Species = 192, Level = 45, Moves = new(241,074,275,076), Location = 132 }, // Sunflora: Cipher Peon Baila @ Snagem Hideout
new(GameVersion.COLO, 36, 07000, First) { Species = 225, Level = 45, Moves = new(059,213,217,019), Location = 109 }, // Delibird: Cipher Peon Arton @ Realgam Tower
new(GameVersion.COLO, 36, 07000, First) { Species = 225, Level = 45, Moves = new(059,213,217,019), Location = 132 }, // Delibird: Cipher Peon Arton @ Snagem Hideout
new(GameVersion.COLO, 37, 07000, Heracross) { Species = 214, Level = 45, Moves = new(179,203,068,280), Location = 111 }, // Heracross: Cipher Peon Dioge @ Realgam Tower
new(GameVersion.COLO, 37, 07000, Heracross) { Species = 214, Level = 45, Moves = new(179,203,068,280), Location = 132 }, // Heracross: Cipher Peon Dioge @ Snagem Hideout
new(GameVersion.COLO, 38, 13000, First) { Species = 227, Level = 47, Moves = new(065,319,314,211), Location = 117 }, // Skarmory: Snagem Head Gonzap @ Realgam Tower
new(GameVersion.COLO, 38, 13000, First) { Species = 227, Level = 47, Moves = new(065,319,314,211), Location = 133 }, // Skarmory: Snagem Head Gonzap @ Snagem Hideout
new(34, 13000, First) { Species = 243, Level = 40, Moves = new(240,043,098,087), Location = 113 }, // Raikou: Cipher Admin Ein @ Realgam Tower
new(34, 13000, First) { Species = 243, Level = 40, Moves = new(240,043,098,087), Location = 125 }, // Raikou: Cipher Admin Ein @ Deep Colosseum
new(34, 13000, First) { Species = 243, Level = 40, Moves = new(240,043,098,087), Location = 069 }, // Raikou: Cipher Admin Ein @ Shadow PKMN Lab
new(GameVersion.COLO, 39, 07000, First) { Species = 241, Level = 48, Moves = new(208,111,205,034), Location = 118 }, // Miltank: Bodybuilder Jomas @ Tower Colosseum
new(GameVersion.COLO, 40, 07000, First) { Species = 359, Level = 48, Moves = new(195,014,163,185), Location = 118 }, // Absol: Rider Delan @ Tower Colosseum
new(GameVersion.COLO, 41, 07000, First) { Species = 229, Level = 48, Moves = new(185,336,123,053), Location = 118 }, // Houndoom: Cipher Peon Nella @ Tower Colosseum
new(GameVersion.COLO, 42, 07000, First) { Species = 357, Level = 49, Moves = new(076,235,345,019), Location = 118 }, // Tropius: Cipher Peon Ston @ Tower Colosseum
new(GameVersion.COLO, 43, 15000, First) { Species = 376, Level = 50, Moves = new(063,334,232,094), Location = 118 }, // Metagross: Cipher Nascour @ Tower Colosseum
new(GameVersion.COLO, 44, 20000, First) { Species = 248, Level = 55, Moves = new(242,087,157,059), Location = 118 }, // Tyranitar: Cipher Head Evice @ Tower Colosseum
new(35, 07000, First) { Species = 192, Level = 45, Moves = new(241,074,275,076), Location = 109 }, // Sunflora: Cipher Peon Baila @ Realgam Tower
new(35, 07000, First) { Species = 192, Level = 45, Moves = new(241,074,275,076), Location = 132 }, // Sunflora: Cipher Peon Baila @ Snagem Hideout
new(36, 07000, First) { Species = 225, Level = 45, Moves = new(059,213,217,019), Location = 109 }, // Delibird: Cipher Peon Arton @ Realgam Tower
new(36, 07000, First) { Species = 225, Level = 45, Moves = new(059,213,217,019), Location = 132 }, // Delibird: Cipher Peon Arton @ Snagem Hideout
new(37, 07000, Heracross) { Species = 214, Level = 45, Moves = new(179,203,068,280), Location = 111 }, // Heracross: Cipher Peon Dioge @ Realgam Tower
new(37, 07000, Heracross) { Species = 214, Level = 45, Moves = new(179,203,068,280), Location = 132 }, // Heracross: Cipher Peon Dioge @ Snagem Hideout
new(38, 13000, First) { Species = 227, Level = 47, Moves = new(065,319,314,211), Location = 117 }, // Skarmory: Snagem Head Gonzap @ Realgam Tower
new(38, 13000, First) { Species = 227, Level = 47, Moves = new(065,319,314,211), Location = 133 }, // Skarmory: Snagem Head Gonzap @ Snagem Hideout
new(GameVersion.COLO, 55, 07000, First) { Species = 235, Level = 45, Moves = new(166,039,003,231), Location = 132 }, // Smeargle: Team Snagem Biden @ Snagem Hideout
new(GameVersion.COLO, 56, 07000, Ursaring) { Species = 217, Level = 45, Moves = new(185,313,122,163), Location = 132 }, // Ursaring: Team Snagem Agrev @ Snagem Hideout
new(GameVersion.COLO, 57, 07000, First) { Species = 213, Level = 45, Moves = new(219,227,156,117), Location = 125 }, // Shuckle: Deep King Agnol @ Deep Colosseum
new(39, 07000, First) { Species = 241, Level = 48, Moves = new(208,111,205,034), Location = 118 }, // Miltank: Bodybuilder Jomas @ Tower Colosseum
new(40, 07000, First) { Species = 359, Level = 48, Moves = new(195,014,163,185), Location = 118 }, // Absol: Rider Delan @ Tower Colosseum
new(41, 07000, First) { Species = 229, Level = 48, Moves = new(185,336,123,053), Location = 118 }, // Houndoom: Cipher Peon Nella @ Tower Colosseum
new(42, 07000, First) { Species = 357, Level = 49, Moves = new(076,235,345,019), Location = 118 }, // Tropius: Cipher Peon Ston @ Tower Colosseum
new(43, 15000, First) { Species = 376, Level = 50, Moves = new(063,334,232,094), Location = 118 }, // Metagross: Cipher Nascour @ Tower Colosseum
new(44, 20000, First) { Species = 248, Level = 55, Moves = new(242,087,157,059), Location = 118 }, // Tyranitar: Cipher Head Evice @ Tower Colosseum
new(GameVersion.COLO, 67, 05000, First) { Species = 176, Level = 20, Moves = new(118,204,186,281), Location = 001 }, // Togetic: Cipher Peon Fein @ Outskirt Stand
new(55, 07000, First) { Species = 235, Level = 45, Moves = new(166,039,003,231), Location = 132 }, // Smeargle: Team Snagem Biden @ Snagem Hideout
new(56, 07000, Ursaring) { Species = 217, Level = 45, Moves = new(185,313,122,163), Location = 132 }, // Ursaring: Team Snagem Agrev @ Snagem Hideout
new(57, 07000, First) { Species = 213, Level = 45, Moves = new(219,227,156,117), Location = 125 }, // Shuckle: Deep King Agnol @ Deep Colosseum
new(GameVersion.COLO, 00, 00000, CTogepi) { Species = 175, Level = 20, Moves = new(118,204,186,281), Location = 128, IVs = new(0, 0, 0, 0, 0, 0) }, // Togepi: Chaser ボデス @ Card e Room (Japanese games only)
new(GameVersion.COLO, 00, 00000, CMareep) { Species = 179, Level = 37, Moves = new(087,084,086,178), Location = 128, IVs = new(0, 0, 0, 0, 0, 0) }, // Mareep: Hunter ホル @ Card e Room (Japanese games only)
new(GameVersion.COLO, 00, 00000, CScizor) { Species = 212, Level = 50, Moves = new(210,232,014,163), Location = 128, IVs = new(0, 0, 0, 0, 0, 0) }, // Scizor: Bodybuilder ワーバン @ Card e Room (Japanese games only)
new(67, 05000, First) { Species = 176, Level = 20, Moves = new(118,204,186,281), Location = 001 }, // Togetic: Cipher Peon Fein @ Outskirt Stand
};
public static readonly EncounterShadow3Colo[] EReader =
{
// Japanese E-Reader: 0 IVs
new(00, 00000, CTogepi) { Species = 175, Level = 20, Moves = new(118,204,186,281), Location = 128 }, // Togepi: Chaser ボデス @ Card e Room (Japanese games only)
new(00, 00000, CMareep) { Species = 179, Level = 37, Moves = new(087,084,086,178), Location = 128 }, // Mareep: Hunter ホル @ Card e Room (Japanese games only)
new(00, 00000, CScizor) { Species = 212, Level = 50, Moves = new(210,232,014,163), Location = 128 }, // Scizor: Bodybuilder ワーバン @ Card e Room (Japanese games only)
};
}

View file

@ -15,47 +15,32 @@ internal static class Encounters3FRLG
private static EncounterArea3[] GetRegular(string resource, string ident, GameVersion game) => EncounterArea3.GetAreas(Get(resource, ident), game);
static Encounters3FRLG() => MarkEncounterTradeStrings(TradeGift_FRLG, TradeFRLG);
private const string tradeFRLG = "tradefrlg";
private static readonly string[][] TradeNames = Util.GetLanguageStrings7(tradeFRLG);
private static readonly EncounterStatic3[] Encounter_FRLG_Roam =
public static readonly EncounterStatic3[] StaticFRLG =
{
new(243, 50, FRLG) { Roaming = true, Location = 16 }, // Raikou
new(244, 50, FRLG) { Roaming = true, Location = 16 }, // Entei
new(245, 50, FRLG) { Roaming = true, Location = 16 }, // Suicune
};
private static readonly EncounterStatic3[] Encounter_FRLG_Stationary =
{
// Starters @ Pallet Town
new(001, 05, FRLG) { Gift = true, Location = 088 }, // Bulbasaur
new(004, 05, FRLG) { Gift = true, Location = 088 }, // Charmander
new(007, 05, FRLG) { Gift = true, Location = 088 }, // Squirtle
new(001, 05, FRLG) { FixedBall = Ball.Poke, Location = 088 }, // Bulbasaur
new(004, 05, FRLG) { FixedBall = Ball.Poke, Location = 088 }, // Charmander
new(007, 05, FRLG) { FixedBall = Ball.Poke, Location = 088 }, // Squirtle
// Fossil @ Cinnabar Island
new(138, 05, FRLG) { Gift = true, Location = 096 }, // Omanyte
new(140, 05, FRLG) { Gift = true, Location = 096 }, // Kabuto
new(142, 05, FRLG) { Gift = true, Location = 096 }, // Aerodactyl
new(138, 05, FRLG) { FixedBall = Ball.Poke, Location = 096 }, // Omanyte
new(140, 05, FRLG) { FixedBall = Ball.Poke, Location = 096 }, // Kabuto
new(142, 05, FRLG) { FixedBall = Ball.Poke, Location = 096 }, // Aerodactyl
// Gift
new(106, 25, FRLG) { Gift = true, Location = 098 }, // Hitmonlee @ Saffron City
new(107, 25, FRLG) { Gift = true, Location = 098 }, // Hitmonchan @ Saffron City
new(129, 05, FRLG) { Gift = true, Location = 099 }, // Magikarp @ Route 4
new(131, 25, FRLG) { Gift = true, Location = 134 }, // Lapras @ Silph Co.
new(133, 25, FRLG) { Gift = true, Location = 094 }, // Eevee @ Celadon City
new(175, 05, FRLG) { Gift = true, EggLocation = 253, Moves = new(045,204,118) }, // Togepi Egg
// Celadon City Game Corner
new(063, 09, FR) { Gift = true, Location = 94 }, // Abra
new(035, 08, FR) { Gift = true, Location = 94 }, // Clefairy
new(123, 25, FR) { Gift = true, Location = 94 }, // Scyther
new(147, 18, FR) { Gift = true, Location = 94 }, // Dratini
new(137, 26, FR) { Gift = true, Location = 94 }, // Porygon
new(063, 07, LG) { Gift = true, Location = 94 }, // Abra
new(035, 12, LG) { Gift = true, Location = 94 }, // Clefairy
new(127, 18, LG) { Gift = true, Location = 94 }, // Pinsir
new(147, 24, LG) { Gift = true, Location = 94 }, // Dratini
new(137, 18, LG) { Gift = true, Location = 94 }, // Porygon
new(106, 25, FRLG) { FixedBall = Ball.Poke, Location = 098 }, // Hitmonlee @ Saffron City
new(107, 25, FRLG) { FixedBall = Ball.Poke, Location = 098 }, // Hitmonchan @ Saffron City
new(129, 05, FRLG) { FixedBall = Ball.Poke, Location = 099 }, // Magikarp @ Route 4
new(131, 25, FRLG) { FixedBall = Ball.Poke, Location = 134 }, // Lapras @ Silph Co.
new(133, 25, FRLG) { FixedBall = Ball.Poke, Location = 094 }, // Eevee @ Celadon City
new(175, 05, FRLG) { FixedBall = Ball.Poke, Location = 253, EggEncounter = true, Moves = new(045,204,118) }, // Togepi Egg
// Stationary
new(143, 30, FRLG) { Location = 112 }, // Snorlax @ Route 12
@ -72,11 +57,36 @@ internal static class Encounters3FRLG
// Event
new(249, 70, FRLG) { Location = 174, FatefulEncounter = true }, // Lugia @ Navel Rock
new(250, 70, FRLG) { Location = 174, FatefulEncounter = true }, // Ho-Oh @ Navel Rock
new(386, 30, FR ) { Location = 187, FatefulEncounter = true, Form = 1 }, // Deoxys @ Birth Island
new(386, 30, LG) { Location = 187, FatefulEncounter = true, Form = 2 }, // Deoxys @ Birth Island
};
private static readonly EncounterStatic3[] Encounter_FRLG = ArrayUtil.ConcatAll(Encounter_FRLG_Roam, Encounter_FRLG_Stationary);
public static readonly EncounterStatic3[] StaticFR =
{
// Celadon City Game Corner
new(063, 09, FR) { FixedBall = Ball.Poke, Location = 94 }, // Abra
new(035, 08, FR) { FixedBall = Ball.Poke, Location = 94 }, // Clefairy
new(123, 25, FR) { FixedBall = Ball.Poke, Location = 94 }, // Scyther
new(147, 18, FR) { FixedBall = Ball.Poke, Location = 94 }, // Dratini
new(137, 26, FR) { FixedBall = Ball.Poke, Location = 94 }, // Porygon
new(386, 30, FR ) { Location = 187, FatefulEncounter = true, Form = 1 }, // Deoxys @ Birth Island
};
public static readonly EncounterStatic3[] StaticLG =
{
// Celadon City Game Corner
new(063, 09, FR) { FixedBall = Ball.Poke, Location = 94 }, // Abra
new(035, 08, FR) { FixedBall = Ball.Poke, Location = 94 }, // Clefairy
new(123, 25, FR) { FixedBall = Ball.Poke, Location = 94 }, // Scyther
new(147, 18, FR) { FixedBall = Ball.Poke, Location = 94 }, // Dratini
new(137, 26, FR) { FixedBall = Ball.Poke, Location = 94 }, // Porygon
new(063, 07, LG) { FixedBall = Ball.Poke, Location = 94 }, // Abra
new(035, 12, LG) { FixedBall = Ball.Poke, Location = 94 }, // Clefairy
new(127, 18, LG) { FixedBall = Ball.Poke, Location = 94 }, // Pinsir
new(147, 24, LG) { FixedBall = Ball.Poke, Location = 94 }, // Dratini
new(137, 18, LG) { FixedBall = Ball.Poke, Location = 94 }, // Porygon
new(386, 30, LG) { Location = 187, FatefulEncounter = true, Form = 2 }, // Deoxys @ Birth Island
};
private static ReadOnlySpan<byte> TradeContest_Cool => new byte[] { 30, 05, 05, 05, 05, 10 };
private static ReadOnlySpan<byte> TradeContest_Beauty => new byte[] { 05, 30, 05, 05, 05, 10 };
@ -86,24 +96,28 @@ internal static class Encounters3FRLG
internal static readonly EncounterTrade3[] TradeGift_FRLG =
{
new(FRLG, 0x00009CAE, 122, 05) { Ability = OnlyFirst, TID16 = 01985, SID16 = 00000, OTGender = 0, Gender = 0, IVs = new(20,15,17,24,23,22), Contest = TradeContest_Clever }, // Abra (Level 5 Breeding) -> Mr. Mime
new(FR , 0x4C970B89, 029, 05) { Ability = OnlyFirst, TID16 = 63184, SID16 = 00000, OTGender = 1, Gender = 1, IVs = new(22,18,25,19,15,22), Contest = TradeContest_Tough }, // Nidoran♀
new( LG, 0x4C970B9E, 032, 05) { Ability = OnlyFirst, TID16 = 63184, SID16 = 00000, OTGender = 1, Gender = 0, IVs = new(19,25,18,22,22,15), Contest = TradeContest_Cool }, // Nidoran♂ *
new(FR , 0x00EECA15, 030, 16) { Ability = OnlyFirst, TID16 = 13637, SID16 = 00000, OTGender = 0, Gender = 1, IVs = new(22,25,18,19,22,15), Contest = TradeContest_Cute }, // Nidorina *
new( LG, 0x00EECA19, 033, 16) { Ability = OnlyFirst, TID16 = 13637, SID16 = 00000, OTGender = 0, Gender = 0, IVs = new(19,18,25,22,15,22), Contest = TradeContest_Tough }, // Nidorino *
new(FR , 0x451308AB, 108, 25) { Ability = OnlyFirst, TID16 = 01239, SID16 = 00000, OTGender = 0, Gender = 0, IVs = new(24,19,21,15,23,21), Contest = TradeContest_Tough }, // Golduck (Level 25) -> Lickitung *
new( LG, 0x451308AB, 108, 25) { Ability = OnlyFirst, TID16 = 01239, SID16 = 00000, OTGender = 0, Gender = 0, IVs = new(24,19,21,15,23,21), Contest = TradeContest_Tough }, // Slowbro (Level 25) -> Lickitung *
new(FRLG, 0x498A2E1D, 124, 20) { Ability = OnlyFirst, TID16 = 36728, SID16 = 00000, OTGender = 0, Gender = 1, IVs = new(18,17,18,22,25,21), Contest = TradeContest_Beauty }, // Poliwhirl (Level 20) -> Jynx
new(FRLG, 0x151943D7, 083, 03) { Ability = OnlyFirst, TID16 = 08810, SID16 = 00000, OTGender = 0, Gender = 0, IVs = new(20,25,21,24,15,20), Contest = TradeContest_Cool }, // Spearow (Level 3 Capture) -> Farfetch'd
new(FRLG, 0x06341016, 101, 03) { Ability = OnlySecond, TID16 = 50298, SID16 = 00000, OTGender = 0, Gender = 2, IVs = new(19,16,18,25,25,19), Contest = TradeContest_Cool }, // Raichu (Level 3) -> Electrode
new(FRLG, 0x5C77ECFA, 114, 05) { Ability = OnlyFirst, TID16 = 60042, SID16 = 00000, OTGender = 1, Gender = 0, IVs = new(22,17,25,16,23,20), Contest = TradeContest_Cute }, // Venonat (Level 5 Breeding) -> Tangela
new(FRLG, 0x482CAC89, 086, 05) { Ability = OnlyFirst, TID16 = 09853, SID16 = 00000, OTGender = 0, Gender = 0, IVs = new(24,15,22,16,23,22), Contest = TradeContest_Tough }, // Ponyta (Level 5 Breeding) -> Seel *
new(TradeNames, 00, FRLG, 0x00009CAE, 122, 05) { Ability = OnlyFirst, TID16 = 01985, OTGender = 0, Gender = 0, IVs = new(20,15,17,24,23,22), Contest = TradeContest_Clever }, // Abra (Level 5 Breeding) -> Mr. Mime
new(TradeNames, 07, FRLG, 0x498A2E1D, 124, 20) { Ability = OnlyFirst, TID16 = 36728, OTGender = 0, Gender = 1, IVs = new(18,17,18,22,25,21), Contest = TradeContest_Beauty }, // Poliwhirl (Level 20) -> Jynx
new(TradeNames, 08, FRLG, 0x151943D7, 083, 03) { Ability = OnlyFirst, TID16 = 08810, OTGender = 0, Gender = 0, IVs = new(20,25,21,24,15,20), Contest = TradeContest_Cool }, // Spearow (Level 3 Capture) -> Farfetch'd
new(TradeNames, 09, FRLG, 0x06341016, 101, 03) { Ability = OnlySecond, TID16 = 50298, OTGender = 0, Gender = 2, IVs = new(19,16,18,25,25,19), Contest = TradeContest_Cool }, // Raichu (Level 3) -> Electrode
new(TradeNames, 10, FRLG, 0x5C77ECFA, 114, 05) { Ability = OnlyFirst, TID16 = 60042, OTGender = 1, Gender = 0, IVs = new(22,17,25,16,23,20), Contest = TradeContest_Cute }, // Venonat (Level 5 Breeding) -> Tangela
new(TradeNames, 11, FRLG, 0x482CAC89, 086, 05) { Ability = OnlyFirst, TID16 = 09853, OTGender = 0, Gender = 0, IVs = new(24,15,22,16,23,22), Contest = TradeContest_Tough }, // Ponyta (Level 5 Breeding) -> Seel *
// If Pokémon with * is evolved in a Generation IV or V game, its Ability will become its second Ability.
};
private const string tradeFRLG = "tradefrlg";
private static readonly string[][] TradeFRLG = Util.GetLanguageStrings7(tradeFRLG);
internal static readonly EncounterTrade3[] TradeGift_FR =
{
new(TradeNames, 01, FR , 0x4C970B89, 029, 05) { Ability = OnlyFirst, TID16 = 63184, OTGender = 1, Gender = 1, IVs = new(22,18,25,19,15,22), Contest = TradeContest_Tough }, // Nidoran♀
new(TradeNames, 03, FR , 0x00EECA15, 030, 16) { Ability = OnlyFirst, TID16 = 13637, OTGender = 0, Gender = 1, IVs = new(22,25,18,19,22,15), Contest = TradeContest_Cute }, // Nidorina *
new(TradeNames, 05, FR , 0x451308AB, 108, 25) { Ability = OnlyFirst, TID16 = 01239, OTGender = 0, Gender = 0, IVs = new(24,19,21,15,23,21), Contest = TradeContest_Tough }, // Golduck (Level 25) -> Lickitung *
// If Pokémon with * is evolved in a Generation IV or V game, its Ability will become its second Ability.
};
internal static readonly EncounterStatic3[] StaticFR = GetEncounters(Encounter_FRLG, FR);
internal static readonly EncounterStatic3[] StaticLG = GetEncounters(Encounter_FRLG, LG);
internal static readonly EncounterTrade3[] TradeGift_LG =
{
new(TradeNames, 02, LG, 0x4C970B9E, 032, 05) { Ability = OnlyFirst, TID16 = 63184, OTGender = 1, Gender = 0, IVs = new(19,25,18,22,22,15), Contest = TradeContest_Cool }, // Nidoran♂ *
new(TradeNames, 04, LG, 0x00EECA19, 033, 16) { Ability = OnlyFirst, TID16 = 13637, OTGender = 0, Gender = 0, IVs = new(19,18,25,22,15,22), Contest = TradeContest_Tough }, // Nidorino *
new(TradeNames, 06, LG, 0x451308AB, 108, 25) { Ability = OnlyFirst, TID16 = 01239, OTGender = 0, Gender = 0, IVs = new(24,19,21,15,23,21), Contest = TradeContest_Tough }, // Slowbro (Level 25) -> Lickitung *
// If Pokémon with * is evolved in a Generation IV or V game, its Ability will become its second Ability.
};
}

View file

@ -18,55 +18,87 @@ internal static class Encounters3RSE
private static EncounterArea3[] GetRegular(string resource, string ident, GameVersion game) => EncounterArea3.GetAreas(Get(resource, ident), game);
private static EncounterArea3[] GetSwarm(string resource, string ident, GameVersion game) => EncounterArea3.GetAreasSwarm(Get(resource, ident), game);
static Encounters3RSE() => MarkEncounterTradeStrings(TradeGift_RSE, TradeRSE);
private static readonly string[] TrainersPikachu = { string.Empty, "コロシアム", "COLOS", "COLOSSEUM", "ARENA", "COLOSSEUM", string.Empty, "CLAUDIO" };
private static readonly string[] TrainersCelebi = { string.Empty, "アゲト", "AGATE", "SAMARAGD", "SOFO", "EMERITAE", string.Empty, "ÁGATA" };
private static readonly string[] TrainersMattle = { string.Empty, "バトルやま", "MATTLE", "MT BATAILL", "MONTE LOTT", "DUELLBERG", string.Empty, "ERNESTO" }; // truncated on ck3->pk3 transfer
private static readonly EncounterStatic3[] Encounter_RSE_Roam =
internal static readonly EncounterGift3Colo[] ColoGiftsR =
{
new(380, 40, S) { Roaming = true, Location = 016 }, // Latias
new(380, 40, E) { Roaming = true, Location = 016 }, // Latias
new(381, 40, R) { Roaming = true, Location = 016 }, // Latios
new(381, 40, E) { Roaming = true, Location = 016 }, // Latios
// In-Game Bonus Disk (Japan only)
new(025, 10, TrainersPikachu, R) { Location = 255, TID16 = 31121, OT_Gender = 0 }, // Colosseum Pikachu bonus gift
new(251, 10, TrainersCelebi, R) { Location = 255, TID16 = 31121, OT_Gender = 1 }, // Ageto Celebi bonus gift
};
private static readonly EncounterStatic3[] Encounter_RSE_Regular =
internal static readonly EncounterGift3Colo[] ColoGiftsS =
{
// In-Game without Bonus Disk
new(250, 70, TrainersMattle, S) { Location = 255, TID16 = 10048, OT_Gender = 0, Moves = new(105, 126, 241, 129) }, // Ho-oh @ Mt. Battle
};
private const string tradeRSE = "traderse";
private static readonly string[][] TradeNames = Util.GetLanguageStrings7(tradeRSE);
public static readonly EncounterStatic3[] StaticRSE =
{
// Starters
new(152, 05, E ) { Gift = true, Location = 000 }, // Chikorita @ Littleroot Town
new(155, 05, E ) { Gift = true, Location = 000 }, // Cyndaquil
new(158, 05, E ) { Gift = true, Location = 000 }, // Totodile
new(252, 05, RSE) { Gift = true, Location = 016 }, // Treecko @ Route 101
new(255, 05, RSE) { Gift = true, Location = 016 }, // Torchic
new(258, 05, RSE) { Gift = true, Location = 016 }, // Mudkip
new(252, 05, RSE) { FixedBall = Ball.Poke, Location = 016 }, // Treecko @ Route 101
new(255, 05, RSE) { FixedBall = Ball.Poke, Location = 016 }, // Torchic
new(258, 05, RSE) { FixedBall = Ball.Poke, Location = 016 }, // Mudkip
// Fossil @ Rustboro City
new(345, 20, RSE) { Gift = true, Location = 010 }, // Lileep
new(347, 20, RSE) { Gift = true, Location = 010 }, // Anorith
new(345, 20, RSE) { FixedBall = Ball.Poke, Location = 010 }, // Lileep
new(347, 20, RSE) { FixedBall = Ball.Poke, Location = 010 }, // Anorith
// Gift
new(351, 25, RSE) { Gift = true, Location = 034 }, // Castform @ Weather Institute
new(374, 05, RSE) { Gift = true, Location = 013 }, // Beldum @ Mossdeep City
new(360, 05, RSE) { Gift = true, EggLocation = 253 }, // Wynaut Egg
new(351, 25, RSE) { FixedBall = Ball.Poke, Location = 034 }, // Castform @ Weather Institute
new(374, 05, RSE) { FixedBall = Ball.Poke, Location = 013 }, // Beldum @ Mossdeep City
new(360, 05, RSE) { FixedBall = Ball.Poke, Location = 253, EggEncounter = true }, // Wynaut Egg
// Stationary
new(352, 30, RSE) { Location = 034 }, // Kecleon @ Route 119
new(352, 30, RSE) { Location = 035 }, // Kecleon @ Route 120
new(101, 30, RS ) { Location = 066 }, // Electrode @ Hideout (R:Magma Hideout/S:Aqua Hideout)
new(101, 30, E ) { Location = 197 }, // Electrode @ Aqua Hideout
new(185, 40, E ) { Location = 058 }, // Sudowoodo @ Battle Frontier
// Stationary Lengendary
new(377, 40, RSE) { Location = 082 }, // Regirock @ Desert Ruins
new(378, 40, RSE) { Location = 081 }, // Regice @ Island Cave
new(379, 40, RSE) { Location = 083 }, // Registeel @ Ancient Tomb
new(380, 50, R ) { Location = 073 }, // Latias @ Southern Island
new(380, 50, E) { Location = 073, FatefulEncounter = true }, // Latias @ Southern Island
new(381, 50, S ) { Location = 073 }, // Latios @ Southern Island
new(381, 50, E) { Location = 073, FatefulEncounter = true }, // Latios @ Southern Island
new(382, 45, S ) { Location = 072 }, // Kyogre @ Cave of Origin
new(382, 70, E) { Location = 203 }, // Kyogre @ Marine Cave
new(383, 45, R ) { Location = 072 }, // Groudon @ Cave of Origin
new(383, 70, E) { Location = 205 }, // Groudon @ Terra Cave
new(384, 70, RSE) { Location = 085 }, // Rayquaza @ Sky Pillar
};
public static readonly EncounterStatic3[] StaticR =
{
new(381, 40, R) { Roaming = true, Location = 016 }, // Latios
new(380, 50, R) { Location = 073 }, // Latias @ Southern Island
new(383, 45, R) { Location = 072 }, // Groudon @ Cave of Origin
new(101, 30, R) { Location = 066 }, // Electrode @ Hideout (R:Magma Hideout/S:Aqua Hideout)
};
public static readonly EncounterStatic3[] StaticS =
{
new(380, 40, S) { Roaming = true, Location = 016 }, // Latias
new(381, 50, S) { Location = 073 }, // Latios @ Southern Island
new(382, 45, S) { Location = 072 }, // Kyogre @ Cave of Origin
new(101, 30, S) { Location = 066 }, // Electrode @ Hideout (R:Magma Hideout/S:Aqua Hideout)
};
public static readonly EncounterStatic3[] StaticE =
{
new(380, 40, E) { Roaming = true, Location = 016 }, // Latias
new(381, 40, E) { Roaming = true, Location = 016 }, // Latios
new(382, 70, E) { Location = 203 }, // Kyogre @ Marine Cave
new(383, 70, E) { Location = 205 }, // Groudon @ Terra Cave
new(101, 30, E) { Location = 197 }, // Electrode @ Aqua Hideout
// Starters
new(152, 05, E) { FixedBall = Ball.Poke, Location = 000 }, // Chikorita @ Littleroot Town
new(155, 05, E) { FixedBall = Ball.Poke, Location = 000 }, // Cyndaquil
new(158, 05, E) { FixedBall = Ball.Poke, Location = 000 }, // Totodile
new(185, 40, E) { Location = 058 }, // Sudowoodo @ Battle Frontier
new(380, 50, E) { Location = 073, FatefulEncounter = true }, // Latias @ Southern Island
new(381, 50, E) { Location = 073, FatefulEncounter = true }, // Latios @ Southern Island
// Event
new(151, 30, E) { Location = 201, FatefulEncounter = true }, // Mew @ Faraway Island (Unreleased outside of Japan)
@ -75,30 +107,25 @@ internal static class Encounters3RSE
new(386, 30, E) { Location = 200, FatefulEncounter = true, Form = 3 }, // Deoxys @ Birth Island
};
private static readonly EncounterStatic3[] Encounter_RSE = ArrayUtil.ConcatAll(Encounter_RSE_Roam, Encounter_RSE_Regular);
private static ReadOnlySpan<byte> TradeContest_Cool => new byte[] { 30, 05, 05, 05, 05, 10 };
private static ReadOnlySpan<byte> TradeContest_Beauty => new byte[] { 05, 30, 05, 05, 05, 10 };
private static ReadOnlySpan<byte> TradeContest_Cute => new byte[] { 05, 05, 30, 05, 05, 10 };
private static ReadOnlySpan<byte> TradeContest_Clever => new byte[] { 05, 05, 05, 30, 05, 10 };
private static ReadOnlySpan<byte> TradeContest_Tough => new byte[] { 05, 05, 05, 05, 30, 10 };
internal static readonly EncounterTrade3[] TradeGift_RSE =
internal static readonly EncounterTrade3[] TradeGift_RS =
{
new(RS, 0x00009C40, 296, 05) { Ability = OnlySecond, TID16 = 49562, SID16 = 00000, OTGender = 0, Gender = 0, IVs = new(5,5,4,4,4,4), Contest = TradeContest_Tough }, // Slakoth (Level 5 Breeding) -> Makuhita
new(RS, 0x498A2E17, 300, 03) { Ability = OnlyFirst, TID16 = 02259, SID16 = 00000, OTGender = 1, Gender = 1, IVs = new(5,4,4,5,4,4), Contest = TradeContest_Cute }, // Pikachu (Level 3 Viridian Forest) -> Skitty
new(RS, 0x4C970B7F, 222, 21) { Ability = OnlySecond, TID16 = 50183, SID16 = 00000, OTGender = 1, Gender = 1, IVs = new(4,4,5,4,4,5), Contest = TradeContest_Beauty }, // Bellossom (Level 21 Oddish -> Gloom -> Bellossom) -> Corsola
new(E , 0x00000084, 273, 04) { Ability = OnlySecond, TID16 = 38726, SID16 = 00000, OTGender = 0, Gender = 0, IVs = new(5,4,5,4,4,4), Contest = TradeContest_Cool }, // Ralts (Level 4 Route 102) -> Seedot
new(E , 0x0000006F, 311, 05) { Ability = OnlyFirst, TID16 = 08460, SID16 = 00001, OTGender = 0, Gender = 1, IVs = new(4,4,4,5,5,4), Contest = TradeContest_Cute }, // Volbeat (Level 5 Breeding) -> Plusle
new(E , 0x0000007F, 116, 05) { Ability = OnlyFirst, TID16 = 46285, SID16 = 00000, OTGender = 0, Gender = 0, IVs = new(5,4,4,4,5,4), Contest = TradeContest_Tough }, // Bagon (Level 5 Breeding) -> Horsea*
new(E , 0x0000008B, 052, 03) { Ability = OnlyFirst, TID16 = 25945, SID16 = 00001, OTGender = 1, Gender = 0, IVs = new(4,5,4,5,4,4), Contest = TradeContest_Clever }, // Skitty (Level 3 Trade)-> Meowth*
// If Pokémon with * is evolved in a Generation IV or V game, its Ability will become its second Ability.
new(TradeNames, 00, RS, 0x00009C40, 296, 05) { Ability = OnlySecond, TID16 = 49562, SID16 = 00000, OTGender = 0, Gender = 0, IVs = new(5,5,4,4,4,4), Contest = TradeContest_Tough }, // Slakoth (Level 5 Breeding) -> Makuhita
new(TradeNames, 01, RS, 0x498A2E17, 300, 03) { Ability = OnlyFirst, TID16 = 02259, SID16 = 00000, OTGender = 1, Gender = 1, IVs = new(5,4,4,5,4,4), Contest = TradeContest_Cute }, // Pikachu (Level 3 Viridian Forest) -> Skitty
new(TradeNames, 02, RS, 0x4C970B7F, 222, 21) { Ability = OnlySecond, TID16 = 50183, SID16 = 00000, OTGender = 1, Gender = 1, IVs = new(4,4,5,4,4,5), Contest = TradeContest_Beauty }, // Bellossom (Level 21 Oddish -> Gloom -> Bellossom) -> Corsola
};
private const string tradeRSE = "traderse";
private static readonly string[][] TradeRSE = Util.GetLanguageStrings7(tradeRSE);
internal static readonly EncounterStatic3[] StaticR = GetEncounters(Encounter_RSE, R);
internal static readonly EncounterStatic3[] StaticS = GetEncounters(Encounter_RSE, S);
internal static readonly EncounterStatic3[] StaticE = GetEncounters(Encounter_RSE, E);
internal static readonly EncounterTrade3[] TradeGift_E =
{
new(TradeNames, 03, E , 0x00000084, 273, 04) { Ability = OnlySecond, TID16 = 38726, SID16 = 00000, OTGender = 0, Gender = 0, IVs = new(5,4,5,4,4,4), Contest = TradeContest_Cool }, // Ralts (Level 4 Route 102) -> Seedot
new(TradeNames, 04, E , 0x0000006F, 311, 05) { Ability = OnlyFirst, TID16 = 08460, SID16 = 00001, OTGender = 0, Gender = 1, IVs = new(4,4,4,5,5,4), Contest = TradeContest_Cute }, // Volbeat (Level 5 Breeding) -> Plusle
new(TradeNames, 05, E , 0x0000007F, 116, 05) { Ability = OnlyFirst, TID16 = 46285, SID16 = 00000, OTGender = 0, Gender = 0, IVs = new(5,4,4,4,5,4), Contest = TradeContest_Tough }, // Bagon (Level 5 Breeding) -> Horsea*
new(TradeNames, 06, E , 0x0000008B, 052, 03) { Ability = OnlyFirst, TID16 = 25945, SID16 = 00001, OTGender = 1, Gender = 0, IVs = new(4,5,4,5,4,4), Contest = TradeContest_Clever }, // Skitty (Level 3 Trade)-> Meowth*
// If Pokémon with * is evolved in a Generation IV or V game, its Ability will become its second Ability.
};
}

View file

@ -4,115 +4,124 @@ namespace PKHeX.Core;
internal static class Encounters3XD
{
private static readonly EncounterStatic3[] Encounter_XDGift =
internal static readonly EncounterStatic3XD[] Gifts =
{
new(133, 10, GameVersion.XD) { FatefulEncounter = true, Gift = true, Location = 000, Moves = new(044) }, // Eevee (Bite)
new(152, 05, GameVersion.XD) { FatefulEncounter = true, Gift = true, Location = 016, Moves = new(246,033,045,338) }, // Chikorita
new(155, 05, GameVersion.XD) { FatefulEncounter = true, Gift = true, Location = 016, Moves = new(179,033,043,307) }, // Cyndaquil
new(158, 05, GameVersion.XD) { FatefulEncounter = true, Gift = true, Location = 016, Moves = new(242,010,043,308) }, // Totodile
new(133, 10) { FixedBall = Ball.Poke, FatefulEncounter = true, Location = 000, Moves = new(033,039,044,028) }, // Eevee (Bite)
new(152, 05) { FixedBall = Ball.Poke, FatefulEncounter = true, Location = 016, Moves = new(246,033,045,338) }, // Chikorita
new(155, 05) { FixedBall = Ball.Poke, FatefulEncounter = true, Location = 016, Moves = new(179,033,043,307) }, // Cyndaquil
new(158, 05) { FixedBall = Ball.Poke, FatefulEncounter = true, Location = 016, Moves = new(242,010,043,308) }, // Totodile
};
private static readonly EncounterStaticShadow[] Encounter_XD =
private static readonly string[] Hordel = { string.Empty, "ダニー", "HORDEL", "VOLKER", "ODINO", "HORAZ", string.Empty, "HORDEL" };
private static readonly string[] Zaprong = { string.Empty, "コンセント", "ZAPRONG", "ZAPRONG", "ZAPRONG", "ZAPRONG", string.Empty, "ZAPRONG" };
private static string[] Duking => Encounters3Colo.TrainerNameDuking;
internal static readonly EncounterTrade3XD[] Trades =
{
new(GameVersion.XD, 01, 03000, First) { FatefulEncounter = true, Species = 216, Level = 11, Moves = new(216,287,122,232), Location = 143, Gift = true }, // Teddiursa: Cipher Peon Naps @ Pokémon HQ Lab -- treat as Gift as it can only be captured in a Poké Ball
new(GameVersion.XD, 02, 02000, Vulpix) { FatefulEncounter = true, Species = 037, Level = 18, Moves = new(257,204,052,091), Location = 109 }, // Vulpix: Cipher Peon Mesin @ ONBS Building
new(GameVersion.XD, 03, 01500, Spheal) { FatefulEncounter = true, Species = 363, Level = 17, Moves = new(062,204,055,189), Location = 011 }, // Spheal: Cipher Peon Blusix @ Cipher Lab
new(GameVersion.XD, 03, 01500, Spheal) { FatefulEncounter = true, Species = 363, Level = 17, Moves = new(062,204,055,189), Location = 100 }, // Spheal: Cipher Peon Blusix @ Phenac City
new(GameVersion.XD, 04, 01500, First) { FatefulEncounter = true, Species = 343, Level = 17, Moves = new(317,287,189,060), Location = 011 }, // Baltoy: Cipher Peon Browsix @ Cipher Lab
new(GameVersion.XD, 04, 01500, First) { FatefulEncounter = true, Species = 343, Level = 17, Moves = new(317,287,189,060), Location = 096 }, // Baltoy: Cipher Peon Browsix @ Phenac City
new(GameVersion.XD, 05, 01500, First) { FatefulEncounter = true, Species = 179, Level = 17, Moves = new(034,215,084,086), Location = 011 }, // Mareep: Cipher Peon Yellosix @ Cipher Lab
new(GameVersion.XD, 05, 01500, First) { FatefulEncounter = true, Species = 179, Level = 17, Moves = new(034,215,084,086), Location = 096 }, // Mareep: Cipher Peon Yellosix @ Phenac City
new(GameVersion.XD, 06, 01500, Gulpin) { FatefulEncounter = true, Species = 316, Level = 17, Moves = new(351,047,124,092), Location = 011 }, // Gulpin: Cipher Peon Purpsix @ Cipher Lab
new(GameVersion.XD, 06, 01500, Gulpin) { FatefulEncounter = true, Species = 316, Level = 17, Moves = new(351,047,124,092), Location = 100 }, // Gulpin: Cipher Peon Purpsix @ Phenac City
new(GameVersion.XD, 07, 01500, Seedot) { FatefulEncounter = true, Species = 273, Level = 17, Moves = new(202,287,331,290), Location = 011 }, // Seedot: Cipher Peon Greesix @ Cipher Lab
new(GameVersion.XD, 07, 01500, Seedot) { FatefulEncounter = true, Species = 273, Level = 17, Moves = new(202,287,331,290), Location = 100 }, // Seedot: Cipher Peon Greesix @ Phenac City
new(GameVersion.XD, 08, 01500, Spinarak) { FatefulEncounter = true, Species = 167, Level = 14, Moves = new(091,287,324,101), Location = 010 }, // Spinarak: Cipher Peon Nexir @ Cipher Lab
new(GameVersion.XD, 09, 01500, Numel) { FatefulEncounter = true, Species = 322, Level = 14, Moves = new(036,204,091,052), Location = 009 }, // Numel: Cipher Peon Solox @ Cipher Lab
new(GameVersion.XD, 10, 01700, First) { FatefulEncounter = true, Species = 318, Level = 15, Moves = new(352,287,184,044), Location = 008 }, // Carvanha: Cipher Peon Cabol @ Cipher Lab
new(GameVersion.XD, 11, 03000, Roselia) { FatefulEncounter = true, Species = 315, Level = 22, Moves = new(345,186,320,073), Location = 094 }, // Roselia: Cipher Peon Fasin @ Phenac City
new(GameVersion.XD, 12, 02500, Delcatty) { FatefulEncounter = true, Species = 301, Level = 18, Moves = new(290,186,213,351), Location = 008 }, // Delcatty: Cipher Admin Lovrina @ Cipher Lab
new(GameVersion.XD, 13, 04000, Nosepass) { FatefulEncounter = true, Species = 299, Level = 26, Moves = new(085,270,086,157), Location = 090 }, // Nosepass: Wanderer Miror B. @ Poké Spots
new(GameVersion.XD, 14, 01500, First) { FatefulEncounter = true, Species = 228, Level = 17, Moves = new(185,204,052,046), Location = 100 }, // Houndour: Cipher Peon Resix @ Phenac City
new(GameVersion.XD, 14, 01500, First) { FatefulEncounter = true, Species = 228, Level = 17, Moves = new(185,204,052,046), Location = 011 }, // Houndour: Cipher Peon Resix @ Cipher Lab
new(GameVersion.XD, 15, 02000, Makuhita) { FatefulEncounter = true, Species = 296, Level = 18, Moves = new(280,287,292,317), Location = 109 }, // Makuhita: Cipher Peon Torkin @ ONBS Building
new(GameVersion.XD, 16, 02200, Duskull) { FatefulEncounter = true, Species = 355, Level = 19, Moves = new(247,270,310,109), Location = 110 }, // Duskull: Cipher Peon Lobar @ ONBS Building
new(GameVersion.XD, 17, 02200, Ralts) { FatefulEncounter = true, Species = 280, Level = 20, Moves = new(351,047,115,093), Location = 119 }, // Ralts: Cipher Peon Feldas @ ONBS Building
new(GameVersion.XD, 18, 02500, Mawile) { FatefulEncounter = true, Species = 303, Level = 22, Moves = new(206,047,011,334), Location = 111 }, // Mawile: Cipher Cmdr Exol @ ONBS Building
new(GameVersion.XD, 19, 02500, Snorunt) { FatefulEncounter = true, Species = 361, Level = 20, Moves = new(352,047,044,196), Location = 097 }, // Snorunt: Cipher Peon Exinn @ Phenac City
new(GameVersion.XD, 20, 02500, Pineco) { FatefulEncounter = true, Species = 204, Level = 20, Moves = new(042,287,191,068), Location = 096 }, // Pineco: Cipher Peon Gonrap @ Phenac City
new(GameVersion.XD, 21, 02500, Swinub) { FatefulEncounter = true, Species = 220, Level = 22, Moves = new(246,204,054,341), Location = 100 }, // Swinub: Cipher Peon Greck @ Phenac City
new(GameVersion.XD, 22, 02500, Natu) { FatefulEncounter = true, Species = 177, Level = 22, Moves = new(248,226,101,332), Location = 094 }, // Natu: Cipher Peon Eloin @ Phenac City
new(GameVersion.XD, 23, 01800, Shroomish) { FatefulEncounter = true, Species = 285, Level = 15, Moves = new(206,287,072,078), Location = 008 }, // Shroomish: Cipher R&D Klots @ Cipher Lab
new(GameVersion.XD, 24, 03500, Meowth) { FatefulEncounter = true, Species = 052, Level = 22, Moves = new(163,047,006,044), Location = 094 }, // Meowth: Cipher Peon Fostin @ Phenac City
new(GameVersion.XD, 25, 04500, Spearow) { FatefulEncounter = true, Species = 021, Level = 22, Moves = new(206,226,043,332), Location = 107 }, // Spearow: Cipher Peon Ezin @ Phenac Stadium
new(GameVersion.XD, 26, 03000, Grimer) { FatefulEncounter = true, Species = 088, Level = 23, Moves = new(188,270,325,107), Location = 107 }, // Grimer: Cipher Peon Faltly @ Phenac Stadium
new(GameVersion.XD, 27, 03500, Seel) { FatefulEncounter = true, Species = 086, Level = 23, Moves = new(057,270,219,058), Location = 107 }, // Seel: Cipher Peon Egrog @ Phenac Stadium
new(GameVersion.XD, 28, 05000, Lunatone) { FatefulEncounter = true, Species = 337, Level = 25, Moves = new(094,226,240,317), Location = 107 }, // Lunatone: Cipher Admin Snattle @ Phenac Stadium
new(GameVersion.XD, 29, 02500, Voltorb) { FatefulEncounter = true, Species = 100, Level = 19, Moves = new(243,287,209,129), Location = 092 }, // Voltorb: Wanderer Miror B. @ Cave Poké Spot
new(GameVersion.XD, 30, 05000, First) { FatefulEncounter = true, Species = 335, Level = 28, Moves = new(280,287,068,306), Location = 071 }, // Zangoose: Thug Zook @ Cipher Key Lair
new(GameVersion.XD, 31, 04000, Growlithe) { FatefulEncounter = true, Species = 058, Level = 28, Moves = new(053,204,044,036), Location = 064 }, // Growlithe: Cipher Peon Humah @ Cipher Key Lair
new(GameVersion.XD, 32, 04000, Paras) { FatefulEncounter = true, Species = 046, Level = 28, Moves = new(147,287,163,206), Location = 064 }, // Paras: Cipher Peon Humah @ Cipher Key Lair
new(GameVersion.XD, 33, 04000, First) { FatefulEncounter = true, Species = 090, Level = 29, Moves = new(036,287,057,062), Location = 065 }, // Shellder: Cipher Peon Gorog @ Cipher Key Lair
new(GameVersion.XD, 34, 04500, First) { FatefulEncounter = true, Species = 015, Level = 30, Moves = new(188,226,041,014), Location = 066 }, // Beedrill: Cipher Peon Lok @ Cipher Key Lair
new(GameVersion.XD, 35, 04000, Pidgeotto) { FatefulEncounter = true, Species = 017, Level = 30, Moves = new(017,287,211,297), Location = 066 }, // Pidgeotto: Cipher Peon Lok @ Cipher Key Lair
new(GameVersion.XD, 36, 04000, Butterfree){ FatefulEncounter = true, Species = 012, Level = 30, Moves = new(094,234,079,332), Location = 067 }, // Butterfree: Cipher Peon Targ @ Cipher Key Lair
new(GameVersion.XD, 37, 04000, Tangela) { FatefulEncounter = true, Species = 114, Level = 30, Moves = new(076,234,241,275), Location = 067 }, // Tangela: Cipher Peon Targ @ Cipher Key Lair
new(GameVersion.XD, 38, 06000, Raticate) { FatefulEncounter = true, Species = 020, Level = 34, Moves = new(162,287,184,158), Location = 076 }, // Raticate: Chaser Furgy @ Citadark Isle
new(GameVersion.XD, 39, 04000, Venomoth) { FatefulEncounter = true, Species = 049, Level = 32, Moves = new(318,287,164,094), Location = 070 }, // Venomoth: Cipher Peon Angic @ Cipher Key Lair
new(GameVersion.XD, 40, 04000, Weepinbell){ FatefulEncounter = true, Species = 070, Level = 32, Moves = new(345,234,188,230), Location = 070 }, // Weepinbell: Cipher Peon Angic @ Cipher Key Lair
new(GameVersion.XD, 41, 05000, Arbok) { FatefulEncounter = true, Species = 024, Level = 33, Moves = new(188,287,137,044), Location = 070 }, // Arbok: Cipher Peon Smarton @ Cipher Key Lair
new(GameVersion.XD, 42, 06000, Primeape) { FatefulEncounter = true, Species = 057, Level = 34, Moves = new(238,270,116,179), Location = 069 }, // Primeape: Cipher Admin Gorigan @ Cipher Key Lair
new(GameVersion.XD, 43, 05500, Hypno) { FatefulEncounter = true, Species = 097, Level = 34, Moves = new(094,226,096,247), Location = 069 }, // Hypno: Cipher Admin Gorigan @ Cipher Key Lair
new(GameVersion.XD, 44, 06500, Golduck) { FatefulEncounter = true, Species = 055, Level = 33, Moves = new(127,204,244,280), Location = 088 }, // Golduck: Navigator Abson @ Citadark Isle
new(GameVersion.XD, 45, 07000, Sableye) { FatefulEncounter = true, Species = 302, Level = 33, Moves = new(247,270,185,105), Location = 088 }, // Sableye: Navigator Abson @ Citadark Isle
new(GameVersion.XD, 46, 04500, Magneton) { FatefulEncounter = true, Species = 082, Level = 30, Moves = new(038,287,240,087), Location = 067 }, // Magneton: Cipher Peon Snidle @ Cipher Key Lair
new(GameVersion.XD, 47, 08000, Dodrio) { FatefulEncounter = true, Species = 085, Level = 34, Moves = new(065,226,097,161), Location = 076 }, // Dodrio: Chaser Furgy @ Citadark Isle
new(GameVersion.XD, 48, 05500, Farfetchd) { FatefulEncounter = true, Species = 083, Level = 36, Moves = new(163,226,014,332), Location = 076 }, // Farfetch'd: Cipher Admin Lovrina @ Citadark Isle
new(GameVersion.XD, 49, 06500, Altaria) { FatefulEncounter = true, Species = 334, Level = 36, Moves = new(225,215,076,332), Location = 076 }, // Altaria: Cipher Admin Lovrina @ Citadark Isle
new(GameVersion.XD, 50, 06000, Kangaskhan){ FatefulEncounter = true, Species = 115, Level = 35, Moves = new(089,047,039,146), Location = 085 }, // Kangaskhan: Cipher Peon Litnar @ Citadark Isle
new(GameVersion.XD, 51, 07000, Banette) { FatefulEncounter = true, Species = 354, Level = 37, Moves = new(185,270,247,174), Location = 085 }, // Banette: Cipher Peon Litnar @ Citadark Isle
new(GameVersion.XD, 52, 07000, Magmar) { FatefulEncounter = true, Species = 126, Level = 36, Moves = new(126,266,238,009), Location = 077 }, // Magmar: Cipher Peon Grupel @ Citadark Isle
new(GameVersion.XD, 53, 07000, Pinsir) { FatefulEncounter = true, Species = 127, Level = 35, Moves = new(012,270,206,066), Location = 077 }, // Pinsir: Cipher Peon Grupel @ Citadark Isle
new(GameVersion.XD, 54, 05500, Magcargo) { FatefulEncounter = true, Species = 219, Level = 38, Moves = new(257,287,089,053), Location = 080 }, // Magcargo: Cipher Peon Kolest @ Citadark Isle
new(GameVersion.XD, 55, 06000, Rapidash) { FatefulEncounter = true, Species = 078, Level = 40, Moves = new(076,226,241,053), Location = 080 }, // Rapidash: Cipher Peon Kolest @ Citadark Isle
new(GameVersion.XD, 56, 06000, Hitmonchan){ FatefulEncounter = true, Species = 107, Level = 38, Moves = new(005,270,170,327), Location = 081 }, // Hitmonchan: Cipher Peon Karbon @ Citadark Isle
new(GameVersion.XD, 57, 07000, Hitmonlee) { FatefulEncounter = true, Species = 106, Level = 38, Moves = new(136,287,170,025), Location = 081 }, // Hitmonlee: Cipher Peon Petro @ Citadark Isle
new(GameVersion.XD, 58, 05000, Lickitung) { FatefulEncounter = true, Species = 108, Level = 38, Moves = new(038,270,111,205), Location = 084 }, // Lickitung: Cipher Peon Geftal @ Citadark Isle
new(GameVersion.XD, 59, 08000, Scyther) { FatefulEncounter = true, Species = 123, Level = 40, Moves = new(013,234,318,163), Location = 084 }, // Scyther: Cipher Peon Leden @ Citadark Isle
new(GameVersion.XD, 60, 04000, Chansey) { FatefulEncounter = true, Species = 113, Level = 39, Moves = new(085,186,135,285), Location = 084 }, // Chansey: Cipher Peon Leden @ Citadark Isle
new(GameVersion.XD, 60, 04000, Chansey) { FatefulEncounter = true, Species = 113, Level = 39, Moves = new(085,186,135,285), Location = 087 }, // Chansey: Cipher Peon Leden @ Citadark Isle
new(GameVersion.XD, 61, 07500, Solrock) { FatefulEncounter = true, Species = 338, Level = 41, Moves = new(094,226,241,322), Location = 087 }, // Solrock: Cipher Admin Snattle @ Citadark Isle
new(GameVersion.XD, 62, 07500, Starmie) { FatefulEncounter = true, Species = 121, Level = 41, Moves = new(127,287,058,105), Location = 087 }, // Starmie: Cipher Admin Snattle @ Citadark Isle
new(GameVersion.XD, 63, 07000, Electabuzz){ FatefulEncounter = true, Species = 125, Level = 43, Moves = new(238,266,086,085), Location = 087 }, // Electabuzz: Cipher Admin Ardos @ Citadark Isle
new(GameVersion.XD, 64, 07000, First) { FatefulEncounter = true, Species = 277, Level = 43, Moves = new(143,226,097,263), Location = 087 }, // Swellow: Cipher Admin Ardos @ Citadark Isle
new(GameVersion.XD, 65, 09000, Snorlax) { FatefulEncounter = true, Species = 143, Level = 43, Moves = new(090,287,174,034), Location = 087 }, // Snorlax: Cipher Admin Ardos @ Citadark Isle
new(GameVersion.XD, 66, 07500, Poliwrath) { FatefulEncounter = true, Species = 062, Level = 42, Moves = new(056,270,240,280), Location = 087 }, // Poliwrath: Cipher Admin Gorigan @ Citadark Isle
new(GameVersion.XD, 67, 06500, MrMime) { FatefulEncounter = true, Species = 122, Level = 42, Moves = new(094,266,227,009), Location = 087 }, // Mr. Mime: Cipher Admin Gorigan @ Citadark Isle
new(GameVersion.XD, 68, 05000, Dugtrio) { FatefulEncounter = true, Species = 051, Level = 40, Moves = new(089,204,201,161), Location = 075 }, // Dugtrio: Cipher Peon Kolax @ Citadark Isle
new(GameVersion.XD, 69, 07000, Manectric) { FatefulEncounter = true, Species = 310, Level = 44, Moves = new(087,287,240,044), Location = 073 }, // Manectric: Cipher Admin Eldes @ Citadark Isle
new(GameVersion.XD, 70, 09000, Salamence) { FatefulEncounter = true, Species = 373, Level = 50, Moves = new(337,287,349,332), Location = 073 }, // Salamence: Cipher Admin Eldes @ Citadark Isle
new(GameVersion.XD, 71, 06500, Marowak) { FatefulEncounter = true, Species = 105, Level = 44, Moves = new(089,047,014,157), Location = 073 }, // Marowak: Cipher Admin Eldes @ Citadark Isle
new(GameVersion.XD, 72, 06000, Lapras) { FatefulEncounter = true, Species = 131, Level = 44, Moves = new(056,215,240,059), Location = 073 }, // Lapras: Cipher Admin Eldes @ Citadark Isle
new(GameVersion.XD, 73, 12000, First) { FatefulEncounter = true, Species = 249, Level = 50, Moves = new(354,297,089,056), Location = 074 }, // Lugia: Grand Master Greevil @ Citadark Isle
new(GameVersion.XD, 74, 10000, Zapdos) { FatefulEncounter = true, Species = 145, Level = 50, Moves = new(326,226,319,085), Location = 074 }, // Zapdos: Grand Master Greevil @ Citadark Isle
new(GameVersion.XD, 75, 10000, Moltres) { FatefulEncounter = true, Species = 146, Level = 50, Moves = new(326,234,261,053), Location = 074 }, // Moltres: Grand Master Greevil @ Citadark Isle
new(GameVersion.XD, 76, 10000, Articuno) { FatefulEncounter = true, Species = 144, Level = 50, Moves = new(326,215,114,058), Location = 074 }, // Articuno: Grand Master Greevil @ Citadark Isle
new(GameVersion.XD, 77, 09000, Tauros) { FatefulEncounter = true, Species = 128, Level = 46, Moves = new(089,287,039,034), Location = 074 }, // Tauros: Grand Master Greevil @ Citadark Isle
new(GameVersion.XD, 78, 07000, First) { FatefulEncounter = true, Species = 112, Level = 46, Moves = new(224,270,184,089), Location = 074 }, // Rhydon: Grand Master Greevil @ Citadark Isle
new(GameVersion.XD, 79, 09000, Exeggutor) { FatefulEncounter = true, Species = 103, Level = 46, Moves = new(094,287,095,246), Location = 074 }, // Exeggutor: Grand Master Greevil @ Citadark Isle
new(GameVersion.XD, 80, 09000, Dragonite) { FatefulEncounter = true, Species = 149, Level = 55, Moves = new(063,215,349,089), Location = 162 }, // Dragonite: Wanderer Miror B. @ Gateon Port
new(GameVersion.XD, 81, 04500, First) { FatefulEncounter = true, Species = 175, Level = 25, Moves = new(266,161,246,270), Location = 164, Gift = true }, // Togepi: Pokémon Trainer Hordel @ Outskirt Stand
new(GameVersion.XD, 82, 02500, Poochyena) { FatefulEncounter = true, Species = 261, Level = 10, Moves = new(091,215,305,336), Location = 162 }, // Poochyena: Bodybuilder Kilen @ Gateon Port
new(GameVersion.XD, 83, 02500, Ledyba) { FatefulEncounter = true, Species = 165, Level = 10, Moves = new(060,287,332,048), Location = 153 }, // Ledyba: Casual Guy Cyle @ Gateon Port
new(239, 20, Hordel, Zaprong) { Location = 164, TID16 = 41400, Moves = new(008, 007, 009, 238) }, // Elekid @ Snagem Hideout
new(307, 20, Duking) { Location = 116, TID16 = 37149, Moves = new(223, 093, 247, 197) }, // Meditite @ Pyrite Town
new(213, 20, Duking) { Location = 116, TID16 = 37149, Moves = new(092, 164, 188, 227) }, // Shuckle @ Pyrite Town
new(246, 20, Duking) { Location = 116, TID16 = 37149, Moves = new(201, 349, 044, 200) }, // Larvitar @ Pyrite Town
};
internal static readonly EncounterArea3XD[] SlotsXD =
internal static readonly EncounterShadow3XD[] Shadow =
{
new(01, 03000, First) { Species = 216, Level = 11, Moves = new(216,287,122,232), Location = 143, FixedBall = Ball.Poke }, // Teddiursa: Cipher Peon Naps @ Pokémon HQ Lab -- treat as Gift as it can only be captured in a Poké Ball
new(02, 02000, Vulpix) { Species = 037, Level = 18, Moves = new(257,204,052,091), Location = 109 }, // Vulpix: Cipher Peon Mesin @ ONBS Building
new(03, 01500, Spheal) { Species = 363, Level = 17, Moves = new(062,204,055,189), Location = 011 }, // Spheal: Cipher Peon Blusix @ Cipher Lab
new(03, 01500, Spheal) { Species = 363, Level = 17, Moves = new(062,204,055,189), Location = 100 }, // Spheal: Cipher Peon Blusix @ Phenac City
new(04, 01500, First) { Species = 343, Level = 17, Moves = new(317,287,189,060), Location = 011 }, // Baltoy: Cipher Peon Browsix @ Cipher Lab
new(04, 01500, First) { Species = 343, Level = 17, Moves = new(317,287,189,060), Location = 096 }, // Baltoy: Cipher Peon Browsix @ Phenac City
new(05, 01500, First) { Species = 179, Level = 17, Moves = new(034,215,084,086), Location = 011 }, // Mareep: Cipher Peon Yellosix @ Cipher Lab
new(05, 01500, First) { Species = 179, Level = 17, Moves = new(034,215,084,086), Location = 096 }, // Mareep: Cipher Peon Yellosix @ Phenac City
new(06, 01500, Gulpin) { Species = 316, Level = 17, Moves = new(351,047,124,092), Location = 011 }, // Gulpin: Cipher Peon Purpsix @ Cipher Lab
new(06, 01500, Gulpin) { Species = 316, Level = 17, Moves = new(351,047,124,092), Location = 100 }, // Gulpin: Cipher Peon Purpsix @ Phenac City
new(07, 01500, Seedot) { Species = 273, Level = 17, Moves = new(202,287,331,290), Location = 011 }, // Seedot: Cipher Peon Greesix @ Cipher Lab
new(07, 01500, Seedot) { Species = 273, Level = 17, Moves = new(202,287,331,290), Location = 100 }, // Seedot: Cipher Peon Greesix @ Phenac City
new(08, 01500, Spinarak) { Species = 167, Level = 14, Moves = new(091,287,324,101), Location = 010 }, // Spinarak: Cipher Peon Nexir @ Cipher Lab
new(09, 01500, Numel) { Species = 322, Level = 14, Moves = new(036,204,091,052), Location = 009 }, // Numel: Cipher Peon Solox @ Cipher Lab
new(10, 01700, First) { Species = 318, Level = 15, Moves = new(352,287,184,044), Location = 008 }, // Carvanha: Cipher Peon Cabol @ Cipher Lab
new(11, 03000, Roselia) { Species = 315, Level = 22, Moves = new(345,186,320,073), Location = 094 }, // Roselia: Cipher Peon Fasin @ Phenac City
new(12, 02500, Delcatty) { Species = 301, Level = 18, Moves = new(290,186,213,351), Location = 008 }, // Delcatty: Cipher Admin Lovrina @ Cipher Lab
new(13, 04000, Nosepass) { Species = 299, Level = 26, Moves = new(085,270,086,157), Location = 090 }, // Nosepass: Wanderer Miror B. @ Poké Spots
new(14, 01500, First) { Species = 228, Level = 17, Moves = new(185,204,052,046), Location = 100 }, // Houndour: Cipher Peon Resix @ Phenac City
new(14, 01500, First) { Species = 228, Level = 17, Moves = new(185,204,052,046), Location = 011 }, // Houndour: Cipher Peon Resix @ Cipher Lab
new(15, 02000, Makuhita) { Species = 296, Level = 18, Moves = new(280,287,292,317), Location = 109 }, // Makuhita: Cipher Peon Torkin @ ONBS Building
new(16, 02200, Duskull) { Species = 355, Level = 19, Moves = new(247,270,310,109), Location = 110 }, // Duskull: Cipher Peon Lobar @ ONBS Building
new(17, 02200, Ralts) { Species = 280, Level = 20, Moves = new(351,047,115,093), Location = 119 }, // Ralts: Cipher Peon Feldas @ ONBS Building
new(18, 02500, Mawile) { Species = 303, Level = 22, Moves = new(206,047,011,334), Location = 111 }, // Mawile: Cipher Cmdr Exol @ ONBS Building
new(19, 02500, Snorunt) { Species = 361, Level = 20, Moves = new(352,047,044,196), Location = 097 }, // Snorunt: Cipher Peon Exinn @ Phenac City
new(20, 02500, Pineco) { Species = 204, Level = 20, Moves = new(042,287,191,068), Location = 096 }, // Pineco: Cipher Peon Gonrap @ Phenac City
new(21, 02500, Swinub) { Species = 220, Level = 22, Moves = new(246,204,054,341), Location = 100 }, // Swinub: Cipher Peon Greck @ Phenac City
new(22, 02500, Natu) { Species = 177, Level = 22, Moves = new(248,226,101,332), Location = 094 }, // Natu: Cipher Peon Eloin @ Phenac City
new(23, 01800, Shroomish) { Species = 285, Level = 15, Moves = new(206,287,072,078), Location = 008 }, // Shroomish: Cipher R&D Klots @ Cipher Lab
new(24, 03500, Meowth) { Species = 052, Level = 22, Moves = new(163,047,006,044), Location = 094 }, // Meowth: Cipher Peon Fostin @ Phenac City
new(25, 04500, Spearow) { Species = 021, Level = 22, Moves = new(206,226,043,332), Location = 107 }, // Spearow: Cipher Peon Ezin @ Phenac Stadium
new(26, 03000, Grimer) { Species = 088, Level = 23, Moves = new(188,270,325,107), Location = 107 }, // Grimer: Cipher Peon Faltly @ Phenac Stadium
new(27, 03500, Seel) { Species = 086, Level = 23, Moves = new(057,270,219,058), Location = 107 }, // Seel: Cipher Peon Egrog @ Phenac Stadium
new(28, 05000, Lunatone) { Species = 337, Level = 25, Moves = new(094,226,240,317), Location = 107 }, // Lunatone: Cipher Admin Snattle @ Phenac Stadium
new(29, 02500, Voltorb) { Species = 100, Level = 19, Moves = new(243,287,209,129), Location = 092 }, // Voltorb: Wanderer Miror B. @ Cave Poké Spot
new(30, 05000, First) { Species = 335, Level = 28, Moves = new(280,287,068,306), Location = 071 }, // Zangoose: Thug Zook @ Cipher Key Lair
new(31, 04000, Growlithe) { Species = 058, Level = 28, Moves = new(053,204,044,036), Location = 064 }, // Growlithe: Cipher Peon Humah @ Cipher Key Lair
new(32, 04000, Paras) { Species = 046, Level = 28, Moves = new(147,287,163,206), Location = 064 }, // Paras: Cipher Peon Humah @ Cipher Key Lair
new(33, 04000, First) { Species = 090, Level = 29, Moves = new(036,287,057,062), Location = 065 }, // Shellder: Cipher Peon Gorog @ Cipher Key Lair
new(34, 04500, First) { Species = 015, Level = 30, Moves = new(188,226,041,014), Location = 066 }, // Beedrill: Cipher Peon Lok @ Cipher Key Lair
new(35, 04000, Pidgeotto) { Species = 017, Level = 30, Moves = new(017,287,211,297), Location = 066 }, // Pidgeotto: Cipher Peon Lok @ Cipher Key Lair
new(36, 04000, Butterfree){ Species = 012, Level = 30, Moves = new(094,234,079,332), Location = 067 }, // Butterfree: Cipher Peon Targ @ Cipher Key Lair
new(37, 04000, Tangela) { Species = 114, Level = 30, Moves = new(076,234,241,275), Location = 067 }, // Tangela: Cipher Peon Targ @ Cipher Key Lair
new(38, 06000, Raticate) { Species = 020, Level = 34, Moves = new(162,287,184,158), Location = 076 }, // Raticate: Chaser Furgy @ Citadark Isle
new(39, 04000, Venomoth) { Species = 049, Level = 32, Moves = new(318,287,164,094), Location = 070 }, // Venomoth: Cipher Peon Angic @ Cipher Key Lair
new(40, 04000, Weepinbell){ Species = 070, Level = 32, Moves = new(345,234,188,230), Location = 070 }, // Weepinbell: Cipher Peon Angic @ Cipher Key Lair
new(41, 05000, Arbok) { Species = 024, Level = 33, Moves = new(188,287,137,044), Location = 070 }, // Arbok: Cipher Peon Smarton @ Cipher Key Lair
new(42, 06000, Primeape) { Species = 057, Level = 34, Moves = new(238,270,116,179), Location = 069 }, // Primeape: Cipher Admin Gorigan @ Cipher Key Lair
new(43, 05500, Hypno) { Species = 097, Level = 34, Moves = new(094,226,096,247), Location = 069 }, // Hypno: Cipher Admin Gorigan @ Cipher Key Lair
new(44, 06500, Golduck) { Species = 055, Level = 33, Moves = new(127,204,244,280), Location = 088 }, // Golduck: Navigator Abson @ Citadark Isle
new(45, 07000, Sableye) { Species = 302, Level = 33, Moves = new(247,270,185,105), Location = 088 }, // Sableye: Navigator Abson @ Citadark Isle
new(46, 04500, Magneton) { Species = 082, Level = 30, Moves = new(038,287,240,087), Location = 067 }, // Magneton: Cipher Peon Snidle @ Cipher Key Lair
new(47, 08000, Dodrio) { Species = 085, Level = 34, Moves = new(065,226,097,161), Location = 076 }, // Dodrio: Chaser Furgy @ Citadark Isle
new(48, 05500, Farfetchd) { Species = 083, Level = 36, Moves = new(163,226,014,332), Location = 076 }, // Farfetch'd: Cipher Admin Lovrina @ Citadark Isle
new(49, 06500, Altaria) { Species = 334, Level = 36, Moves = new(225,215,076,332), Location = 076 }, // Altaria: Cipher Admin Lovrina @ Citadark Isle
new(50, 06000, Kangaskhan){ Species = 115, Level = 35, Moves = new(089,047,039,146), Location = 085 }, // Kangaskhan: Cipher Peon Litnar @ Citadark Isle
new(51, 07000, Banette) { Species = 354, Level = 37, Moves = new(185,270,247,174), Location = 085 }, // Banette: Cipher Peon Litnar @ Citadark Isle
new(52, 07000, Magmar) { Species = 126, Level = 36, Moves = new(126,266,238,009), Location = 077 }, // Magmar: Cipher Peon Grupel @ Citadark Isle
new(53, 07000, Pinsir) { Species = 127, Level = 35, Moves = new(012,270,206,066), Location = 077 }, // Pinsir: Cipher Peon Grupel @ Citadark Isle
new(54, 05500, Magcargo) { Species = 219, Level = 38, Moves = new(257,287,089,053), Location = 080 }, // Magcargo: Cipher Peon Kolest @ Citadark Isle
new(55, 06000, Rapidash) { Species = 078, Level = 40, Moves = new(076,226,241,053), Location = 080 }, // Rapidash: Cipher Peon Kolest @ Citadark Isle
new(56, 06000, Hitmonchan){ Species = 107, Level = 38, Moves = new(005,270,170,327), Location = 081 }, // Hitmonchan: Cipher Peon Karbon @ Citadark Isle
new(57, 07000, Hitmonlee) { Species = 106, Level = 38, Moves = new(136,287,170,025), Location = 081 }, // Hitmonlee: Cipher Peon Petro @ Citadark Isle
new(58, 05000, Lickitung) { Species = 108, Level = 38, Moves = new(038,270,111,205), Location = 084 }, // Lickitung: Cipher Peon Geftal @ Citadark Isle
new(59, 08000, Scyther) { Species = 123, Level = 40, Moves = new(013,234,318,163), Location = 084 }, // Scyther: Cipher Peon Leden @ Citadark Isle
new(60, 04000, Chansey) { Species = 113, Level = 39, Moves = new(085,186,135,285), Location = 084 }, // Chansey: Cipher Peon Leden @ Citadark Isle
new(60, 04000, Chansey) { Species = 113, Level = 39, Moves = new(085,186,135,285), Location = 087 }, // Chansey: Cipher Peon Leden @ Citadark Isle
new(61, 07500, Solrock) { Species = 338, Level = 41, Moves = new(094,226,241,322), Location = 087 }, // Solrock: Cipher Admin Snattle @ Citadark Isle
new(62, 07500, Starmie) { Species = 121, Level = 41, Moves = new(127,287,058,105), Location = 087 }, // Starmie: Cipher Admin Snattle @ Citadark Isle
new(63, 07000, Electabuzz){ Species = 125, Level = 43, Moves = new(238,266,086,085), Location = 087 }, // Electabuzz: Cipher Admin Ardos @ Citadark Isle
new(64, 07000, First) { Species = 277, Level = 43, Moves = new(143,226,097,263), Location = 087 }, // Swellow: Cipher Admin Ardos @ Citadark Isle
new(65, 09000, Snorlax) { Species = 143, Level = 43, Moves = new(090,287,174,034), Location = 087 }, // Snorlax: Cipher Admin Ardos @ Citadark Isle
new(66, 07500, Poliwrath) { Species = 062, Level = 42, Moves = new(056,270,240,280), Location = 087 }, // Poliwrath: Cipher Admin Gorigan @ Citadark Isle
new(67, 06500, MrMime) { Species = 122, Level = 42, Moves = new(094,266,227,009), Location = 087 }, // Mr. Mime: Cipher Admin Gorigan @ Citadark Isle
new(68, 05000, Dugtrio) { Species = 051, Level = 40, Moves = new(089,204,201,161), Location = 075 }, // Dugtrio: Cipher Peon Kolax @ Citadark Isle
new(69, 07000, Manectric) { Species = 310, Level = 44, Moves = new(087,287,240,044), Location = 073 }, // Manectric: Cipher Admin Eldes @ Citadark Isle
new(70, 09000, Salamence) { Species = 373, Level = 50, Moves = new(337,287,349,332), Location = 073 }, // Salamence: Cipher Admin Eldes @ Citadark Isle
new(71, 06500, Marowak) { Species = 105, Level = 44, Moves = new(089,047,014,157), Location = 073 }, // Marowak: Cipher Admin Eldes @ Citadark Isle
new(72, 06000, Lapras) { Species = 131, Level = 44, Moves = new(056,215,240,059), Location = 073 }, // Lapras: Cipher Admin Eldes @ Citadark Isle
new(73, 12000, First) { Species = 249, Level = 50, Moves = new(354,297,089,056), Location = 074 }, // Lugia: Grand Master Greevil @ Citadark Isle
new(74, 10000, Zapdos) { Species = 145, Level = 50, Moves = new(326,226,319,085), Location = 074 }, // Zapdos: Grand Master Greevil @ Citadark Isle
new(75, 10000, Moltres) { Species = 146, Level = 50, Moves = new(326,234,261,053), Location = 074 }, // Moltres: Grand Master Greevil @ Citadark Isle
new(76, 10000, Articuno) { Species = 144, Level = 50, Moves = new(326,215,114,058), Location = 074 }, // Articuno: Grand Master Greevil @ Citadark Isle
new(77, 09000, Tauros) { Species = 128, Level = 46, Moves = new(089,287,039,034), Location = 074 }, // Tauros: Grand Master Greevil @ Citadark Isle
new(78, 07000, First) { Species = 112, Level = 46, Moves = new(224,270,184,089), Location = 074 }, // Rhydon: Grand Master Greevil @ Citadark Isle
new(79, 09000, Exeggutor) { Species = 103, Level = 46, Moves = new(094,287,095,246), Location = 074 }, // Exeggutor: Grand Master Greevil @ Citadark Isle
new(80, 09000, Dragonite) { Species = 149, Level = 55, Moves = new(063,215,349,089), Location = 162 }, // Dragonite: Wanderer Miror B. @ Gateon Port
new(81, 04500, First) { Species = 175, Level = 25, Moves = new(266,161,246,270), Location = 164, FixedBall = Ball.Poke }, // Togepi: Pokémon Trainer Hordel @ Outskirt Stand
new(82, 02500, Poochyena) { Species = 261, Level = 10, Moves = new(091,215,305,336), Location = 162 }, // Poochyena: Bodybuilder Kilen @ Gateon Port
new(83, 02500, Ledyba) { Species = 165, Level = 10, Moves = new(060,287,332,048), Location = 153 }, // Ledyba: Casual Guy Cyle @ Gateon Port
};
internal static readonly EncounterArea3XD[] Slots =
{
new(90, 027, 23, 207, 20, 328, 20), // Rock (Sandshrew, Gligar, Trapinch)
new(91, 187, 20, 231, 20, 283, 20), // Oasis (Hoppip, Phanpy, Surskit)
new(92, 041, 21, 304, 21, 194, 21), // Cave (Zubat, Aron, Wooper)
};
internal static readonly EncounterStatic3[] Encounter_CXDGift = ArrayUtil.ConcatAll(Encounters3Colo.Encounter_ColoGift, Encounter_XDGift);
internal static readonly EncounterStaticShadow[] Encounter_CXDShadow = ArrayUtil.ConcatAll(Encounters3Colo.Encounter_Colo, Encounter_XD);
}

View file

@ -1,5 +1,3 @@
using System;
namespace PKHeX.Core;
/// <summary>
@ -16,60 +14,7 @@ internal static class EncountersWC3
new() { Species = 385, Level = 05, ID32 = 20043, OT_Gender = 0, Version = GameVersion.R, Method = PIDType.BACD_R, OT_Name = "WISHMKR", CardTitle = "Wishmaker Jirachi", Language = (int)LanguageID.English },
};
private static WC3[] GetIngameCXDData()
{
var langs = LanguageCXD;
string[] h = {string.Empty, "ダニー", "HORDEL", "VOLKER", "ODINO", "HORAZ", string.Empty, "HORDEL"};
string[] d = {string.Empty, "ギンザル", "DUKING", "DOKING", "RODRIGO", "GRAND", string.Empty, "GERMÁN"};
string[] z = {string.Empty, "コンセント", "ZAPRONG", "ZAPRONG", "ZAPRONG", "ZAPRONG", string.Empty, "ZAPRONG"};
const int count = 5;
var result = new WC3[count * langs.Length];
for (int i = 0, ofs = 0; i < langs.Length; i++)
{
var id = langs[i];
var l = (int)id;
// Colosseum
result[ofs++] = new() { Species = 311, Level = 13, Language = l, Location = 254, ID32 = 37149, OT_Gender = 0, OT_Name = d[l], Version = GameVersion.COLO, CardTitle = $"Special Gift ({id})", Method = PIDType.CXD, Shiny = Shiny.Never, Moves = new(045, 086, 098, 270) }; // Plusle @ Ingame Trade
// XD
result[ofs++] = new(true) { Species = 239, Level = 20, Language = l, Location = 164, TID16 = 41400, OT_Gender = 0, OT_Name = h[l], Version = GameVersion.XD, CardTitle = $"Trade Togepi ({id})", Method = PIDType.CXD, Moves = new(008, 007, 009, 238), Nickname = z[l] }; // Elekid @ Snagem Hideout
result[ofs++] = new(true) { Species = 307, Level = 20, Language = l, Location = 116, TID16 = 37149, OT_Gender = 0, OT_Name = d[l], Version = GameVersion.XD, CardTitle = $"Trade Trapinch ({id})", Method = PIDType.CXD, Moves = new(223, 093, 247, 197) }; // Meditite @ Pyrite Town
result[ofs++] = new(true) { Species = 213, Level = 20, Language = l, Location = 116, TID16 = 37149, OT_Gender = 0, OT_Name = d[l], Version = GameVersion.XD, CardTitle = $"Trade Surskit ({id})", Method = PIDType.CXD, Moves = new(092, 164, 188, 227) }; // Shuckle @ Pyrite Town
result[ofs++] = new(true) { Species = 246, Level = 20, Language = l, Location = 116, TID16 = 37149, OT_Gender = 0, OT_Name = d[l], Version = GameVersion.XD, CardTitle = $"Trade Wooper ({id})", Method = PIDType.CXD, Moves = new(201, 349, 044, 200) }; // Larvitar @ Pyrite Town
}
return result;
}
private static ReadOnlySpan<LanguageID> LanguageCXD => new[] { LanguageID.Japanese, LanguageID.English, LanguageID.French, LanguageID.Italian, LanguageID.German, LanguageID.Spanish };
private static WC3[] GetIngameCXDDataMainline()
{
var langs = LanguageCXD;
string[] p = { string.Empty, "コロシアム", "COLOS", "COLOSSEUM", "ARENA", "COLOSSEUM", string.Empty, "CLAUDIO" };
string[] c = { string.Empty, "アゲト", "AGATE", "SAMARAGD", "SOFO", "EMERITAE", string.Empty, "ÁGATA" };
string[] m = { string.Empty, "バトルやま", "MATTLE", "MT BATAILL", "MONTE LOTT", "DUELLBERG", string.Empty, "ERNESTO" }; // truncated on ck3->pk3 transfer
const int count = 3;
var result = new WC3[count * langs.Length];
for (int i = 0, ofs = 0; i < langs.Length; i++)
{
var id = langs[i];
var l = (int)id;
var nd = id != LanguageID.Japanese;
// Colosseum
result[ofs++] = new() { Species = 025, Level = 10, Language = l, Location = 255, ID32 = 31121, OT_Gender = 0, OT_Name = p[l], Version = GameVersion.R, CardTitle = $"Colosseum Pikachu ({id})",Method = PIDType.CXD, Shiny = Shiny.Never, NotDistributed = nd }; // Colosseum Pikachu bonus gift
result[ofs++] = new() { Species = 251, Level = 10, Language = l, Location = 255, ID32 = 31121, OT_Gender = 1, OT_Name = c[l], Version = GameVersion.R, CardTitle = $"Agate Celebi ({id})", Method = PIDType.CXD, Shiny = Shiny.Never, NotDistributed = nd }; // Ageto Celebi bonus gift
result[ofs++] = new() { Species = 250, Level = 70, Language = l, Location = 255, ID32 = 10048, OT_Gender = 0, OT_Name = m[l], Version = GameVersion.S, CardTitle = $"Mt. Battle Ho-Oh ({id})", Method = PIDType.CXD, Shiny = Shiny.Never, Moves = new(105, 126, 241, 129) }; // Ho-oh @ Mt. Battle
}
return result;
}
internal static readonly WC3[] Encounter_WC3CXD = GetIngameCXDData();
internal static readonly WC3[] Encounter_WC3CXDMain = GetIngameCXDDataMainline();
internal static readonly WC3[] Encounter_Event3 = ArrayUtil.ConcatAll(Encounter_Event3_Special, Encounter_WC3CXD, Encounter_WC3CXDMain);
internal static readonly WC3[] Encounter_Event3 = Encounter_Event3_Special;
internal static readonly WC3[] Encounter_Event3_FRLG =
{

View file

@ -0,0 +1,148 @@
using static PKHeX.Core.EncounterUtil;
using static PKHeX.Core.GameVersion;
using static PKHeX.Core.GroundTileAllowed;
using static PKHeX.Core.AbilityPermission;
namespace PKHeX.Core;
/// <summary>
/// Generation 4 Encounters
/// </summary>
internal static class Encounters4DPPt
{
internal static readonly EncounterArea4[] SlotsD = EncounterArea4.GetAreas(Get("d", "da"), D);
internal static readonly EncounterArea4[] SlotsP = EncounterArea4.GetAreas(Get("p", "pe"), P);
internal static readonly EncounterArea4[] SlotsPt = EncounterArea4.GetAreas(Get("pt", "pt"), Pt);
private const string tradeDPPt = "tradedppt";
private static readonly string[][] TradeNames = Util.GetLanguageStrings8(tradeDPPt);
#region Static Encounter/Gift Tables
public static readonly EncounterStatic4[] StaticDPPt =
{
// Gift
new(DPPt) { FixedBall = Ball.Poke, Species = 447, Level = 01, Location = 000, EggLocation = 2010 }, // Riolu Egg from Riley
new(DPPt) { Species = 442, Level = 25, Location = 24 }, // Spiritomb @ Route 209
new(DPPt) { Species = 480, Level = 50, Location = 089, GroundTile = Cave }, // Uxie @ Acuity Cavern
new(DPPt) { Species = 482, Level = 50, Location = 088, GroundTile = Cave }, // Azelf @ Valor Cavern
// Roamers
new(DPPt) { Roaming = true, Location = 16, Species = 481, Level = 50, GroundTile = Grass | Water }, // Mesprit
new(DPPt) { Roaming = true, Location = 16, Species = 488, Level = 50, GroundTile = Grass | Water }, // Cresselia
};
public static readonly EncounterStatic4[] StaticDP =
{
new(DP) { FixedBall = Ball.Poke, Species = 133, Level = 05, Location = 010, GroundTile = Max_DP }, // Eevee @ Hearthome City
new(DP) { FixedBall = Ball.Poke, Species = 440, Level = 01, Location = 000, EggLocation = 2009 }, // Happiny Egg from Traveling Man
new(DP) { FixedBall = Ball.Poke, Species = 387, Level = 5, Location = 076, GroundTile = Max_DP }, // Turtwig @ Lake Verity
new(DP) { FixedBall = Ball.Poke, Species = 390, Level = 5, Location = 076, GroundTile = Max_DP }, // Chimchar
new(DP) { FixedBall = Ball.Poke, Species = 393, Level = 5, Location = 076, GroundTile = Max_DP }, // Piplup
new(DP) { FixedBall = Ball.Poke, Species = 138, Level = 20, Location = 094, GroundTile = Max_DP }, // Omanyte
new(DP) { FixedBall = Ball.Poke, Species = 140, Level = 20, Location = 094, GroundTile = Max_DP }, // Kabuto
new(DP) { FixedBall = Ball.Poke, Species = 142, Level = 20, Location = 094, GroundTile = Max_DP }, // Aerodactyl
new(DP) { FixedBall = Ball.Poke, Species = 345, Level = 20, Location = 094, GroundTile = Max_DP }, // Lileep
new(DP) { FixedBall = Ball.Poke, Species = 347, Level = 20, Location = 094, GroundTile = Max_DP }, // Anorith
new(DP) { FixedBall = Ball.Poke, Species = 408, Level = 20, Location = 094, GroundTile = Max_DP }, // Cranidos
new(DP) { FixedBall = Ball.Poke, Species = 410, Level = 20, Location = 094, GroundTile = Max_DP }, // Shieldon
new(DP) { Species = 425, Level = 22, Location = 47 }, // Drifloon @ Valley Windworks
new(DP) { Species = 479, Level = 15, Location = 70, GroundTile = Building }, // Rotom @ Old Chateau
new(DP) { Species = 485, Level = 70, Location = 084, GroundTile = Cave }, // Heatran @ Stark Mountain
new(DP) { Species = 486, Level = 70, Location = 064, GroundTile = Cave }, // Regigigas @ Snowpoint Temple
new(DP) { Species = 487, Level = 70, Location = 062, GroundTile = Cave, Form = 0 }, // Giratina @ Turnback Cave
//new(DP) { Species = 492, Form = 0, Level = 30, Location = 063, Fateful = false }, // Shaymin @ Flower Paradise (Unreleased in Diamond and Pearl)
};
public static readonly EncounterStatic4[] StaticPt =
{
new(Pt) { FixedBall = Ball.Poke, Species = 387, Level = 5, Location = 016, GroundTile = Max_Pt }, // Turtwig @ Route 201
new(Pt) { FixedBall = Ball.Poke, Species = 390, Level = 5, Location = 016, GroundTile = Max_Pt }, // Chimchar
new(Pt) { FixedBall = Ball.Poke, Species = 393, Level = 5, Location = 016, GroundTile = Max_Pt }, // Piplup
new(Pt) { FixedBall = Ball.Poke, Species = 138, Level = 20, Location = 094, GroundTile = Max_Pt }, // Omanyte
new(Pt) { FixedBall = Ball.Poke, Species = 140, Level = 20, Location = 094, GroundTile = Max_Pt }, // Kabuto
new(Pt) { FixedBall = Ball.Poke, Species = 142, Level = 20, Location = 094, GroundTile = Max_Pt }, // Aerodactyl
new(Pt) { FixedBall = Ball.Poke, Species = 345, Level = 20, Location = 094, GroundTile = Max_Pt }, // Lileep
new(Pt) { FixedBall = Ball.Poke, Species = 347, Level = 20, Location = 094, GroundTile = Max_Pt }, // Anorith
new(Pt) { FixedBall = Ball.Poke, Species = 408, Level = 20, Location = 094, GroundTile = Max_Pt }, // Cranidos
new(Pt) { FixedBall = Ball.Poke, Species = 410, Level = 20, Location = 094, GroundTile = Max_Pt }, // Shieldon
new(Pt) { FixedBall = Ball.Poke, Species = 133, Level = 20, Location = 010, GroundTile = Max_Pt }, // Eevee @ Hearthome City
new(Pt) { FixedBall = Ball.Poke, Species = 137, Level = 25, Location = 012, GroundTile = Max_Pt }, // Porygon @ Veilstone City
new(Pt) { FixedBall = Ball.Poke, Species = 175, Level = 01, Location = 000, EggLocation = 2011 }, // Togepi Egg from Cynthia
new(Pt) { Species = 425, Level = 15, Location = 47 }, // Drifloon @ Valley Windworks
new(Pt) { Species = 479, Level = 20, Location = 70, GroundTile = Building }, // Rotom @ Old Chateau
// Stationary Legendary
new(Pt) { Species = 377, Level = 30, Location = 125, GroundTile = Cave }, // Regirock @ Rock Peak Ruins
new(Pt) { Species = 378, Level = 30, Location = 124, GroundTile = Cave }, // Regice @ Iceberg Ruins
new(Pt) { Species = 379, Level = 30, Location = 123, GroundTile = Cave }, // Registeel @ Iron Ruins
new(Pt) { Species = 483, Level = 70, Location = 051, GroundTile = Rock }, // Dialga @ Spear Pillar
new(Pt) { Species = 484, Level = 70, Location = 051, GroundTile = Rock }, // Palkia @ Spear Pillar
new(Pt) { Species = 485, Level = 50, Location = 084, GroundTile = Cave }, // Heatran @ Stark Mountain
new(Pt) { Species = 486, Level = 01, Location = 064, GroundTile = Cave }, // Regigigas @ Snowpoint Temple
new(Pt) { Species = 487, Level = 47, Location = 062, GroundTile = Cave, Form = 0 }, // Giratina @ Turnback Cave
new(Pt) { Species = 487, Level = 47, Location = 117, GroundTile = Distortion, Form = 1, HeldItem = 112 }, // Giratina @ Distortion World
new(Pt) { Species = 491, Level = 50, Location = 079, GroundTile = Grass }, // Darkrai @ Newmoon Island
new(Pt) { Species = 492, Form = 0, Level = 30, Location = 063, FatefulEncounter = true }, // Shaymin @ Flower Paradise
new(Pt) { Roaming = true, Location = 16, Species = 144, Level = 60, GroundTile = Grass | Water }, // Articuno
new(Pt) { Roaming = true, Location = 16, Species = 145, Level = 60, GroundTile = Grass | Water }, // Zapdos
new(Pt) { Roaming = true, Location = 16, Species = 146, Level = 60, GroundTile = Grass | Water }, // Moltres
};
public static readonly EncounterStatic4[] StaticD =
{
new(D ) { Species = 483, Level = 47, Location = 051, GroundTile = Rock }, // Dialga @ Spear Pillar
};
public static readonly EncounterStatic4[] StaticP =
{
new( P) { Species = 484, Level = 47, Location = 051, GroundTile = Rock }, // Palkia @ Spear Pillar
};
#endregion
#region Trade Tables
internal static readonly EncounterTrade4RanchGift[] RanchGifts =
{
new(323975838, 025, 18) { Moves = new(447,085,148,104), TID16 = 1000, SID16 = 19840, OTGender = 1, MetLocation = 0068, Gender = 0, Ability = OnlyFirst, CurrentLevel = 20 }, // Pikachu
new(323977664, 037, 16) { Moves = new(412,109,053,219), TID16 = 1000, SID16 = 21150, OTGender = 1, MetLocation = 3000, Gender = 0, Ability = OnlyFirst, CurrentLevel = 30 }, // Vulpix
new(323975579, 077, 13) { Moves = new(036,033,039,052), TID16 = 1000, SID16 = 01123, OTGender = 1, MetLocation = 3000, Gender = 0, Ability = OnlySecond, CurrentLevel = 16 }, // Ponyta
new(323975564, 108, 34) { Moves = new(076,111,014,205), TID16 = 1000, SID16 = 03050, OTGender = 1, MetLocation = 0077, Gender = 0, Ability = OnlyFirst, CurrentLevel = 40 }, // Lickitung
new(323977579, 114, 01) { Moves = new(437,438,079,246), TID16 = 1000, SID16 = 49497, OTGender = 1, MetLocation = 3000, Gender = 1, Ability = OnlySecond }, // Tangela
new(323977675, 133, 16) { Moves = new(363,270,098,247), TID16 = 1000, SID16 = 47710, OTGender = 1, MetLocation = 0068, Gender = 0, Ability = OnlySecond, CurrentLevel = 30 }, // Eevee
new(323977588, 142, 20) { Moves = new(363,089,444,332), TID16 = 1000, SID16 = 43066, OTGender = 1, MetLocation = 0094, Gender = 0, Ability = OnlyFirst, CurrentLevel = 50 }, // Aerodactyl
new(232975554, 193, 22) { Moves = new(318,095,246,138), TID16 = 1000, SID16 = 42301, OTGender = 1, MetLocation = 0052, Gender = 0, Ability = OnlyFirst, CurrentLevel = 45, FixedBall = Ball.Safari }, // Yanma
new(323975570, 241, 16) { Moves = new(208,215,360,359), TID16 = 1000, SID16 = 02707, OTGender = 1, MetLocation = 3000, Gender = 1, Ability = OnlyFirst, CurrentLevel = 48 }, // Miltank
new(323975563, 285, 22) { Moves = new(402,147,206,078), TID16 = 1000, SID16 = 02788, OTGender = 1, MetLocation = 3000, Gender = 0, Ability = OnlySecond, CurrentLevel = 45, FixedBall = Ball.Safari }, // Shroomish
new(323975559, 320, 30) { Moves = new(156,323,133,058), TID16 = 1000, SID16 = 27046, OTGender = 1, MetLocation = 0038, Gender = 0, Ability = OnlySecond, CurrentLevel = 45 }, // Wailmer
new(323977657, 360, 01) { Moves = new(204,150,227,000), TID16 = 1000, SID16 = 01788, OTGender = 1, MetLocation = 0004, Gender = 0, Ability = OnlySecond, EggLocation = 2000 }, // Wynaut
new(323975563, 397, 02) { Moves = new(355,017,283,018), TID16 = 1000, SID16 = 59298, OTGender = 1, MetLocation = 0016, Gender = 0, Ability = OnlySecond, CurrentLevel = 23 }, // Staravia
new(323970584, 415, 05) { Moves = new(230,016,000,000), TID16 = 1000, SID16 = 54140, OTGender = 1, MetLocation = 0020, Gender = 1, Ability = OnlyFirst, CurrentLevel = 20 }, // Combee
new(323977539, 417, 09) { Moves = new(447,045,351,098), TID16 = 1000, SID16 = 18830, OTGender = 1, MetLocation = 0020, Gender = 1, Ability = OnlySecond, CurrentLevel = 10 }, // Pachirisu
new(323974107, 422, 20) { Moves = new(363,352,426,104), TID16 = 1000, SID16 = 39272, OTGender = 1, MetLocation = 0028, Gender = 0, Ability = OnlySecond, CurrentLevel = 25, Form = 1 }, // Shellos
new(323977566, 427, 10) { Moves = new(204,193,409,098), TID16 = 1000, SID16 = 31045, OTGender = 1, MetLocation = 3000, Gender = 1, Ability = OnlyFirst, CurrentLevel = 16 }, // Buneary
new(323975579, 453, 22) { Moves = new(310,207,426,389), TID16 = 1000, SID16 = 41342, OTGender = 1, MetLocation = 0052, Gender = 0, Ability = OnlySecond, CurrentLevel = 31, FixedBall = Ball.Safari }, // Croagunk
new(323977566, 456, 15) { Moves = new(213,352,219,392), TID16 = 1000, SID16 = 48348, OTGender = 1, MetLocation = 0020, Gender = 1, Ability = OnlyFirst, CurrentLevel = 35 }, // Finneon
new(323975582, 459, 32) { Moves = new(452,420,275,059), TID16 = 1000, SID16 = 23360, OTGender = 1, MetLocation = 0031, Gender = 0, Ability = OnlyFirst, CurrentLevel = 41 }, // Snover
new(151, 50) { Moves = new(235,216,095,100), TID16 = 1000, SID16 = 59228, OTGender = 1, FixedBall = Ball.Cherish, Gender = 2, Ability = Any12 }, // Mew
new(489, 01) { Moves = new(447,240,156,057), TID16 = 1000, SID16 = 09248, OTGender = 1, FixedBall = Ball.Cherish, Gender = 2, Ability = Any12, CurrentLevel = 50, EggLocation = 3000 }, // Phione
};
internal static readonly EncounterTrade4PID[] TradeGift_DPPtIngame =
{
new(TradeNames, 00, DPPt, 0x0000008E, 063, 01) { Ability = OnlyFirst, TID16 = 25643, SID16 = 00000, OTGender = 1, Gender = 0, IVs = new(15,15,15,20,25,25) }, // Machop -> Abra
new(TradeNames, 01, DPPt, 0x00000867, 441, 01) { Ability = OnlySecond, TID16 = 44142, SID16 = 00000, OTGender = 0, Gender = 1, IVs = new(15,20,15,25,25,15), Contest = 20 }, // Buizel -> Chatot
new(TradeNames, 02, DPPt, 0x00000088, 093, 35) { Ability = OnlyFirst, TID16 = 19248, SID16 = 00000, OTGender = 1, Gender = 0, IVs = new(20,25,15,25,15,15) }, // Medicham (35 from Route 217) -> Haunter
new(TradeNames, 03, DPPt, 0x0000045C, 129, 01) { Ability = OnlyFirst, TID16 = 53277, SID16 = 00000, OTGender = 0, Gender = 1, IVs = new(15,25,15,20,25,15) }, // Finneon -> Magikarp
};
#endregion
}

View file

@ -0,0 +1,147 @@
using static PKHeX.Core.EncounterUtil;
using static PKHeX.Core.GameVersion;
using static PKHeX.Core.GroundTileAllowed;
using static PKHeX.Core.AbilityPermission;
namespace PKHeX.Core;
/// <summary>
/// Generation 4 Encounters
/// </summary>
internal static class Encounters4HGSS
{
internal static readonly EncounterArea4[] SlotsHG = EncounterArea4.GetAreas(Get("hg", "hg"), HG);
internal static readonly EncounterArea4[] SlotsSS = EncounterArea4.GetAreas(Get("ss", "ss"), SS);
internal static readonly EncounterStatic4Pokewalker[] Encounter_PokeWalker = EncounterStatic4Pokewalker.GetAll(Util.GetBinaryResource("encounter_walker4.pkl"));
private const string tradeHGSS = "tradehgss";
private static readonly string[][] TradeNames = Util.GetLanguageStrings8(tradeHGSS);
#region Static Encounter/Gift Tables
internal static readonly EncounterStatic4[] Encounter_HGSS =
{
// Starters
new(HGSS) { FixedBall = Ball.Poke, Species = 001, Level = 05, Location = 138, GroundTile = Max_Pt }, // Bulbasaur @ Pallet Town
new(HGSS) { FixedBall = Ball.Poke, Species = 004, Level = 05, Location = 138, GroundTile = Max_Pt }, // Charmander
new(HGSS) { FixedBall = Ball.Poke, Species = 007, Level = 05, Location = 138, GroundTile = Max_Pt }, // Squirtle
new(HGSS) { FixedBall = Ball.Poke, Species = 152, Level = 05, Location = 126, GroundTile = Max_DP }, // Chikorita @ New Bark Town
new(HGSS) { FixedBall = Ball.Poke, Species = 155, Level = 05, Location = 126, GroundTile = Max_DP }, // Cyndaquil
new(HGSS) { FixedBall = Ball.Poke, Species = 158, Level = 05, Location = 126, GroundTile = Max_DP }, // Totodile
new(HGSS) { FixedBall = Ball.Poke, Species = 252, Level = 05, Location = 148, GroundTile = Max_Pt }, // Treecko @ Saffron City
new(HGSS) { FixedBall = Ball.Poke, Species = 255, Level = 05, Location = 148, GroundTile = Max_Pt }, // Torchic
new(HGSS) { FixedBall = Ball.Poke, Species = 258, Level = 05, Location = 148, GroundTile = Max_Pt }, // Mudkip
// Fossils @ Pewter City
new(HGSS) { FixedBall = Ball.Poke, Species = 138, Level = 20, Location = 140, GroundTile = Max_Pt }, // Omanyte
new(HGSS) { FixedBall = Ball.Poke, Species = 140, Level = 20, Location = 140, GroundTile = Max_Pt }, // Kabuto
new(HGSS) { FixedBall = Ball.Poke, Species = 142, Level = 20, Location = 140, GroundTile = Max_Pt }, // Aerodactyl
new(HGSS) { FixedBall = Ball.Poke, Species = 345, Level = 20, Location = 140, GroundTile = Max_Pt }, // Lileep
new(HGSS) { FixedBall = Ball.Poke, Species = 347, Level = 20, Location = 140, GroundTile = Max_Pt }, // Anorith
new(HGSS) { FixedBall = Ball.Poke, Species = 408, Level = 20, Location = 140, GroundTile = Max_Pt }, // Cranidos
new(HGSS) { FixedBall = Ball.Poke, Species = 410, Level = 20, Location = 140, GroundTile = Max_Pt }, // Shieldon
// Gift
new(HGSS) { FixedBall = Ball.Poke, Species = 072, Level = 15, Location = 130, GroundTile = Max_Pt }, // Tentacool @ Cianwood City
new(HGSS) { FixedBall = Ball.Poke, Species = 133, Level = 05, Location = 131, GroundTile = Max_Pt }, // Eevee @ Goldenrod City
new(HGSS) { FixedBall = Ball.Poke, Species = 147, Level = 15, Location = 222, GroundTile = Max_Pt, Moves = new(245) }, // Dratini @ Dragon's Den (ExtremeSpeed)
new(HGSS) { FixedBall = Ball.Poke, Species = 236, Level = 10, Location = 216, GroundTile = Max_Pt }, // Tyrogue @ Mt. Mortar
new(HGSS) { FixedBall = Ball.Poke, Species = 175, Level = 01, Location = 000, EggLocation = 2013, Moves = new((int)Move.Growl, (int)Move.Charm, (int)Move.Extrasensory) }, // Togepi Egg from Mr. Pokemon (Extrasensory as Egg move)
new(HGSS) { FixedBall = Ball.Poke, Species = 179, Level = 01, Location = 000, EggLocation = 2014 }, // Mareep Egg from Primo
new(HGSS) { FixedBall = Ball.Poke, Species = 194, Level = 01, Location = 000, EggLocation = 2014 }, // Wooper Egg from Primo
new(HGSS) { FixedBall = Ball.Poke, Species = 218, Level = 01, Location = 000, EggLocation = 2014 }, // Slugma Egg from Primo
// Celadon City Game Corner
new(HGSS) { FixedBall = Ball.Poke, Species = 122, Level = 15, Location = 144, GroundTile = Max_Pt }, // Mr. Mime
new(HGSS) { FixedBall = Ball.Poke, Species = 133, Level = 15, Location = 144, GroundTile = Max_Pt }, // Eevee
new(HGSS) { FixedBall = Ball.Poke, Species = 137, Level = 15, Location = 144, GroundTile = Max_Pt }, // Porygon
// Goldenrod City Game Corner
new(HGSS) { FixedBall = Ball.Poke, Species = 063, Level = 15, Location = 131, GroundTile = Max_Pt }, // Abra
new(HGSS) { FixedBall = Ball.Poke, Species = 147, Level = 15, Location = 131, GroundTile = Max_Pt }, // Dratini
// Team Rocket HQ Trap Floor
new(HGSS) { Species = 100, Level = 23, Location = 213, GroundTile = Building }, // Voltorb
new(HGSS) { Species = 074, Level = 21, Location = 213, GroundTile = Building }, // Geodude
new(HGSS) { Species = 109, Level = 21, Location = 213, GroundTile = Building }, // Koffing
// Stationary
new(HGSS) { Species = 130, Level = 30, Location = 135, GroundTile = Water, Shiny = Shiny.Always }, // Gyarados @ Lake of Rage
new(HGSS) { Species = 131, Level = 20, Location = 210, GroundTile = Water }, // Lapras @ Union Cave Friday Only
new(HGSS) { Species = 101, Level = 23, Location = 213, GroundTile = Building }, // Electrode @ Team Rocket HQ
new(HGSS) { Species = 143, Level = 50, Location = 159 }, // Snorlax @ Route 11
new(HGSS) { Species = 143, Level = 50, Location = 160 }, // Snorlax @ Route 12
new(HGSS) { Species = 185, Level = 20, Location = 184 }, // Sudowoodo @ Route 36, Encounter does not have type
new(HGSS) // Spiky-Eared Pichu @ Ilex Forest
{
Species = 172,
Level = 30,
Gender = 1,
Form = 1,
Nature = Nature.Naughty,
Location = 214,
Moves = new(344, 270, 207, 220),
GroundTile = Max_Pt,
Shiny = Shiny.Never,
},
// Stationary Legendary
new(HGSS) { Species = 144, Level = 50, Location = 203, GroundTile = Cave }, // Articuno @ Seafoam Islands
new(HGSS) { Species = 145, Level = 50, Location = 158 }, // Zapdos @ Route 10
new(HGSS) { Species = 146, Level = 50, Location = 219, GroundTile = Cave }, // Moltres @ Mt. Silver Cave
new(HGSS) { Species = 150, Level = 70, Location = 199, GroundTile = Cave }, // Mewtwo @ Cerulean Cave
new(HGSS) { Species = 245, Level = 40, Location = 173 }, // Suicune @ Route 25
new(HGSS) { Species = 245, Level = 40, Location = 206, GroundTile = Cave }, // Suicune @ Burned Tower
new(HGSS) { Species = 384, Level = 50, Location = 232, GroundTile = Cave }, // Rayquaza @ Embedded Tower
new(HGSS) { Species = 483, Level = 01, Location = 231, FixedBall = Ball.Poke, GroundTile = Max_Pt }, // Dialga @ Sinjoh Ruins
new(HGSS) { Species = 484, Level = 01, Location = 231, FixedBall = Ball.Poke, GroundTile = Max_Pt }, // Palkia @ Sinjoh Ruins
new(HGSS) { Species = 487, Level = 01, Location = 231, FixedBall = Ball.Poke, GroundTile = Max_Pt, Form = 1, HeldItem = 112 }, // Giratina @ Sinjoh Ruins
// Johto Roamers
new(HGSS) { Roaming = true, Species = 243, Location = 177, Level = 40, GroundTile = Grass | Water }, // Raikou
new(HGSS) { Roaming = true, Species = 244, Location = 177, Level = 40, GroundTile = Grass | Water }, // Entei
};
internal static readonly EncounterStatic4[] StaticHG =
{
new(HG ) { FixedBall = Ball.Poke, Species = 023, Level = 15, Location = 131, GroundTile = Max_Pt }, // Ekans
new(HG ) { Species = 249, Level = 70, Location = 218, GroundTile = Water }, // Lugia @ Whirl Islands
new(HG ) { Species = 250, Level = 45, Location = 205, GroundTile = Building }, // Ho-Oh @ Bell Tower
new(HG ) { Species = 381, Level = 40, Location = 140, GroundTile = Building }, // Latios @ Pewter City
new(HG ) { Species = 382, Level = 50, Location = 232, GroundTile = Cave }, // Kyogre @ Embedded Tower
new(HG ) { Roaming = true, Species = 380, Location = 149, Level = 35, GroundTile = Grass | Water }, // Latias
};
internal static readonly EncounterStatic4[] StaticSS =
{
new( SS) { FixedBall = Ball.Poke, Species = 027, Level = 15, Location = 131, GroundTile = Max_Pt }, // Sandshrew
new( SS) { Species = 249, Level = 45, Location = 218, GroundTile = Water }, // Lugia @ Whirl Islands
new( SS) { Species = 250, Level = 70, Location = 205, GroundTile = Building }, // Ho-Oh @ Bell Tower
new( SS) { Species = 380, Level = 40, Location = 140, GroundTile = Building }, // Latias @ Pewter City
new( SS) { Species = 383, Level = 50, Location = 232, GroundTile = Cave }, // Groudon @ Embedded Tower
new( SS) { Roaming = true, Species = 381, Location = 149, Level = 35, GroundTile = Grass | Water }, // Latios
};
#endregion
#region Trade Tables
internal static readonly EncounterTrade4PID[] TradeGift_HGSS =
{
new(TradeNames, 00, HGSS, 0x000025EF, 095, 01) { Ability = OnlySecond, TID16 = 48926, SID16 = 00000, OTGender = 0, Gender = 0, IVs = new(25,20,25,15,15,15) }, // Bellsprout -> Onix
new(TradeNames, 01, HGSS, 0x00002310, 066, 01) { Ability = OnlyFirst, TID16 = 37460, SID16 = 00000, OTGender = 0, Gender = 1, IVs = new(15,25,20,20,15,15) }, // Drowzee -> Machop
new(TradeNames, 02, HGSS, 0x000001DB, 100, 01) { Ability = OnlySecond, TID16 = 29189, SID16 = 00000, OTGender = 0, Gender = 2, IVs = new(15,20,15,25,25,15) }, // Krabby -> Voltorb
new(TradeNames, 03, HGSS, 0x0001FC0A, 085, 15) { Ability = OnlyFirst, TID16 = 00283, SID16 = 00000, OTGender = 1, Gender = 1, IVs = new(20,20,20,15,15,15) }, // Dragonair (15 from DPPt) -> Dodrio
new(TradeNames, 04, HGSS, 0x0000D136, 082, 19) { Ability = OnlyFirst, TID16 = 50082, SID16 = 00000, OTGender = 0, Gender = 2, IVs = new(15,20,15,20,20,20) }, // Dugtrio (19 from Diglett's Cave) -> Magneton
new(TradeNames, 05, HGSS, 0x000034E4, 178, 16) { Ability = OnlyFirst, TID16 = 15616, SID16 = 00000, OTGender = 0, Gender = 0, IVs = new(15,20,15,20,20,20) }, // Haunter (16 from Old Chateau) -> Xatu
new(TradeNames, 06, HGSS, 0x00485876, 025, 02) { Ability = OnlyFirst, TID16 = 33038, SID16 = 00000, OTGender = 0, Gender = 1, IVs = new(20,25,18,31,25,13) }, // Pikachu
new(TradeNames, 07, HGSS, 0x0012B6D4, 374, 31) { Ability = OnlyFirst, TID16 = 23478, SID16 = 00000, OTGender = 0, Gender = 2, IVs = new(28,29,24,23,24,25) }, // Forretress -> Beldum
new(TradeNames, 08, HGSS, 0x0012971C, 111, 01) { Ability = OnlyFirst, TID16 = 06845, SID16 = 00000, OTGender = 0, Gender = 1, IVs = new(22,31,13,00,22,09), Moves = new(422) }, // Bonsly -> Rhyhorn w/ Thunder Fang
new(TradeNames, 09, HGSS, 0x00101596, 208, 01) { Ability = OnlyFirst, TID16 = 26491, SID16 = 00000, OTGender = 1, Gender = 0, IVs = new(08,30,28,06,18,20) }, // Any -> Steelix
//Gift
new(TradeNames, 10, HGSS, 0x00006B5E, 021, 20) { Ability = OnlyFirst, TID16 = 01001, SID16 = 00000, OTGender = 0, Gender = 1, IVs = new(15,20,15,20,20,20), MetLocation = 183, Moves = new(043,031,228,332) },// Webster's Spearow
new(TradeNames, 11, HGSS, 0x000214D7, 213, 20) { Ability = OnlySecond, TID16 = 04336, SID16 = 00001, OTGender = 0, Gender = 0, IVs = new(15,20,15,20,20,20), MetLocation = 130, Moves = new(132,117,227,219) },// Kirk's Shuckle
};
#endregion
}

View file

@ -1,139 +0,0 @@
using static PKHeX.Core.EncounterUtil;
using static PKHeX.Core.GameVersion;
using static PKHeX.Core.GroundTileAllowed;
using static PKHeX.Core.AbilityPermission;
namespace PKHeX.Core;
/// <summary>
/// Generation 4 Encounters
/// </summary>
internal static class Encounters4DPPt
{
internal static readonly EncounterArea4[] SlotsD = EncounterArea4.GetAreas(Get("d", "da"), D);
internal static readonly EncounterArea4[] SlotsP = EncounterArea4.GetAreas(Get("p", "pe"), P);
internal static readonly EncounterArea4[] SlotsPt = EncounterArea4.GetAreas(Get("pt", "pt"), Pt);
static Encounters4DPPt() => MarkEncounterTradeStrings(TradeGift_DPPt, TradeDPPt);
#region Static Encounter/Gift Tables
private static readonly EncounterStatic4[] Encounter_DPPt =
{
// Starters
new(DP) { Gift = true, Species = 387, Level = 5, Location = 076, GroundTile = Max_DP }, // Turtwig @ Lake Verity
new(DP) { Gift = true, Species = 390, Level = 5, Location = 076, GroundTile = Max_DP }, // Chimchar
new(DP) { Gift = true, Species = 393, Level = 5, Location = 076, GroundTile = Max_DP }, // Piplup
new(Pt) { Gift = true, Species = 387, Level = 5, Location = 016, GroundTile = Max_Pt }, // Turtwig @ Route 201
new(Pt) { Gift = true, Species = 390, Level = 5, Location = 016, GroundTile = Max_Pt }, // Chimchar
new(Pt) { Gift = true, Species = 393, Level = 5, Location = 016, GroundTile = Max_Pt }, // Piplup
// Fossil @ Mining Museum
new(DP) { Gift = true, Species = 138, Level = 20, Location = 094, GroundTile = Max_DP }, // Omanyte
new(DP) { Gift = true, Species = 140, Level = 20, Location = 094, GroundTile = Max_DP }, // Kabuto
new(DP) { Gift = true, Species = 142, Level = 20, Location = 094, GroundTile = Max_DP }, // Aerodactyl
new(DP) { Gift = true, Species = 345, Level = 20, Location = 094, GroundTile = Max_DP }, // Lileep
new(DP) { Gift = true, Species = 347, Level = 20, Location = 094, GroundTile = Max_DP }, // Anorith
new(DP) { Gift = true, Species = 408, Level = 20, Location = 094, GroundTile = Max_DP }, // Cranidos
new(DP) { Gift = true, Species = 410, Level = 20, Location = 094, GroundTile = Max_DP }, // Shieldon
new(Pt) { Gift = true, Species = 138, Level = 20, Location = 094, GroundTile = Max_Pt }, // Omanyte
new(Pt) { Gift = true, Species = 140, Level = 20, Location = 094, GroundTile = Max_Pt }, // Kabuto
new(Pt) { Gift = true, Species = 142, Level = 20, Location = 094, GroundTile = Max_Pt }, // Aerodactyl
new(Pt) { Gift = true, Species = 345, Level = 20, Location = 094, GroundTile = Max_Pt }, // Lileep
new(Pt) { Gift = true, Species = 347, Level = 20, Location = 094, GroundTile = Max_Pt }, // Anorith
new(Pt) { Gift = true, Species = 408, Level = 20, Location = 094, GroundTile = Max_Pt }, // Cranidos
new(Pt) { Gift = true, Species = 410, Level = 20, Location = 094, GroundTile = Max_Pt }, // Shieldon
// Gift
new(DP) { Gift = true, Species = 133, Level = 05, Location = 010, GroundTile = Max_DP }, // Eevee @ Hearthome City
new(Pt) { Gift = true, Species = 133, Level = 20, Location = 010, GroundTile = Max_Pt }, // Eevee @ Hearthome City
new(Pt) { Gift = true, Species = 137, Level = 25, Location = 012, GroundTile = Max_Pt }, // Porygon @ Veilstone City
new(Pt) { Gift = true, Species = 175, Level = 01, EggLocation = 2011 }, // Togepi Egg from Cynthia
new(DP) { Gift = true, Species = 440, Level = 01, EggLocation = 2009 }, // Happiny Egg from Traveling Man
new(DPPt) { Gift = true, Species = 447, Level = 01, EggLocation = 2010 }, // Riolu Egg from Riley
// Stationary
new(DP) { Species = 425, Level = 22, Location = 47 }, // Drifloon @ Valley Windworks
new(Pt) { Species = 425, Level = 15, Location = 47 }, // Drifloon @ Valley Windworks
new(DP) { Species = 479, Level = 15, Location = 70, GroundTile = Building }, // Rotom @ Old Chateau
new(Pt) { Species = 479, Level = 20, Location = 70, GroundTile = Building }, // Rotom @ Old Chateau
new(DPPt) { Species = 442, Level = 25, Location = 24 }, // Spiritomb @ Route 209
// Stationary Legendary
new(Pt) { Species = 377, Level = 30, Location = 125, GroundTile = Cave }, // Regirock @ Rock Peak Ruins
new(Pt) { Species = 378, Level = 30, Location = 124, GroundTile = Cave }, // Regice @ Iceberg Ruins
new(Pt) { Species = 379, Level = 30, Location = 123, GroundTile = Cave }, // Registeel @ Iron Ruins
new(DPPt) { Species = 480, Level = 50, Location = 089, GroundTile = Cave }, // Uxie @ Acuity Cavern
new(DPPt) { Species = 482, Level = 50, Location = 088, GroundTile = Cave }, // Azelf @ Valor Cavern
new(D ) { Species = 483, Level = 47, Location = 051, GroundTile = Rock }, // Dialga @ Spear Pillar
new( P) { Species = 484, Level = 47, Location = 051, GroundTile = Rock }, // Palkia @ Spear Pillar
new(Pt) { Species = 483, Level = 70, Location = 051, GroundTile = Rock }, // Dialga @ Spear Pillar
new(Pt) { Species = 484, Level = 70, Location = 051, GroundTile = Rock }, // Palkia @ Spear Pillar
new(DP) { Species = 485, Level = 70, Location = 084, GroundTile = Cave }, // Heatran @ Stark Mountain
new(Pt) { Species = 485, Level = 50, Location = 084, GroundTile = Cave }, // Heatran @ Stark Mountain
new(DP) { Species = 486, Level = 70, Location = 064, GroundTile = Cave }, // Regigigas @ Snowpoint Temple
new(Pt) { Species = 486, Level = 01, Location = 064, GroundTile = Cave }, // Regigigas @ Snowpoint Temple
new(DP) { Species = 487, Level = 70, Location = 062, GroundTile = Cave, Form = 0 }, // Giratina @ Turnback Cave
new(Pt) { Species = 487, Level = 47, Location = 062, GroundTile = Cave, Form = 0 }, // Giratina @ Turnback Cave
new(Pt) { Species = 487, Level = 47, Location = 117, GroundTile = Distortion, Form = 1, HeldItem = 112 }, // Giratina @ Distortion World
// Event
//new(DP) { Species = 491, Level = 40, Location = 079, GroundTile = Grass }, // Darkrai @ Newmoon Island (Unreleased in Diamond and Pearl)
new(Pt) { Species = 491, Level = 50, Location = 079, GroundTile = Grass }, // Darkrai @ Newmoon Island
new(Pt) { Species = 492, Form = 0, Level = 30, Location = 063, FatefulEncounter = true }, // Shaymin @ Flower Paradise
//new(DP) { Species = 492, Form = 0, Level = 30, Location = 063, Fateful = false }, // Shaymin @ Flower Paradise (Unreleased in Diamond and Pearl)
//new(DPPt) { Species = 493, Form = 0, Level = 80, Location = 086, GroundTile = Cave }, // Arceus @ Hall of Origin (Unreleased)
// Roamers
new(DPPt) { Roaming = true, Location = 16, Species = 481, Level = 50, GroundTile = Grass | Water }, // Mesprit
new(DPPt) { Roaming = true, Location = 16, Species = 488, Level = 50, GroundTile = Grass | Water }, // Cresselia
new(Pt) { Roaming = true, Location = 16, Species = 144, Level = 60, GroundTile = Grass | Water }, // Articuno
new(Pt) { Roaming = true, Location = 16, Species = 145, Level = 60, GroundTile = Grass | Water }, // Zapdos
new(Pt) { Roaming = true, Location = 16, Species = 146, Level = 60, GroundTile = Grass | Water }, // Moltres
};
#endregion
#region Trade Tables
private static readonly EncounterTrade4[] RanchGifts =
{
new EncounterTrade4RanchGift(323975838, 025, 18) { Moves = new(447,085,148,104), TID16 = 1000, SID16 = 19840, OTGender = 1, MetLocation = 0068, Gender = 0, Ability = OnlyFirst, CurrentLevel = 20 }, // Pikachu
new EncounterTrade4RanchGift(323977664, 037, 16) { Moves = new(412,109,053,219), TID16 = 1000, SID16 = 21150, OTGender = 1, MetLocation = 3000, Gender = 0, Ability = OnlyFirst, CurrentLevel = 30 }, // Vulpix
new EncounterTrade4RanchGift(323975579, 077, 13) { Moves = new(036,033,039,052), TID16 = 1000, SID16 = 01123, OTGender = 1, MetLocation = 3000, Gender = 0, Ability = OnlySecond, CurrentLevel = 16 }, // Ponyta
new EncounterTrade4RanchGift(323975564, 108, 34) { Moves = new(076,111,014,205), TID16 = 1000, SID16 = 03050, OTGender = 1, MetLocation = 0077, Gender = 0, Ability = OnlyFirst, CurrentLevel = 40 }, // Lickitung
new EncounterTrade4RanchGift(323977579, 114, 01) { Moves = new(437,438,079,246), TID16 = 1000, SID16 = 49497, OTGender = 1, MetLocation = 3000, Gender = 1, Ability = OnlySecond }, // Tangela
new EncounterTrade4RanchGift(323977675, 133, 16) { Moves = new(363,270,098,247), TID16 = 1000, SID16 = 47710, OTGender = 1, MetLocation = 0068, Gender = 0, Ability = OnlySecond, CurrentLevel = 30 }, // Eevee
new EncounterTrade4RanchGift(323977588, 142, 20) { Moves = new(363,089,444,332), TID16 = 1000, SID16 = 43066, OTGender = 1, MetLocation = 0094, Gender = 0, Ability = OnlyFirst, CurrentLevel = 50 }, // Aerodactyl
new EncounterTrade4RanchGift(232975554, 193, 22) { Moves = new(318,095,246,138), TID16 = 1000, SID16 = 42301, OTGender = 1, MetLocation = 0052, Gender = 0, Ability = OnlyFirst, CurrentLevel = 45, Ball = 5 }, // Yanma
new EncounterTrade4RanchGift(323975570, 241, 16) { Moves = new(208,215,360,359), TID16 = 1000, SID16 = 02707, OTGender = 1, MetLocation = 3000, Gender = 1, Ability = OnlyFirst, CurrentLevel = 48 }, // Miltank
new EncounterTrade4RanchGift(323975563, 285, 22) { Moves = new(402,147,206,078), TID16 = 1000, SID16 = 02788, OTGender = 1, MetLocation = 3000, Gender = 0, Ability = OnlySecond, CurrentLevel = 45, Ball = 5 }, // Shroomish
new EncounterTrade4RanchGift(323975559, 320, 30) { Moves = new(156,323,133,058), TID16 = 1000, SID16 = 27046, OTGender = 1, MetLocation = 0038, Gender = 0, Ability = OnlySecond, CurrentLevel = 45 }, // Wailmer
new EncounterTrade4RanchGift(323977657, 360, 01) { Moves = new(204,150,227,000), TID16 = 1000, SID16 = 01788, OTGender = 1, MetLocation = 0004, Gender = 0, Ability = OnlySecond, EggLocation = 2000 }, // Wynaut
new EncounterTrade4RanchGift(323975563, 397, 02) { Moves = new(355,017,283,018), TID16 = 1000, SID16 = 59298, OTGender = 1, MetLocation = 0016, Gender = 0, Ability = OnlySecond, CurrentLevel = 23 }, // Staravia
new EncounterTrade4RanchGift(323970584, 415, 05) { Moves = new(230,016,000,000), TID16 = 1000, SID16 = 54140, OTGender = 1, MetLocation = 0020, Gender = 1, Ability = OnlyFirst, CurrentLevel = 20 }, // Combee
new EncounterTrade4RanchGift(323977539, 417, 09) { Moves = new(447,045,351,098), TID16 = 1000, SID16 = 18830, OTGender = 1, MetLocation = 0020, Gender = 1, Ability = OnlySecond, CurrentLevel = 10 }, // Pachirisu
new EncounterTrade4RanchGift(323974107, 422, 20) { Moves = new(363,352,426,104), TID16 = 1000, SID16 = 39272, OTGender = 1, MetLocation = 0028, Gender = 0, Ability = OnlySecond, CurrentLevel = 25, Form = 1 }, // Shellos
new EncounterTrade4RanchGift(323977566, 427, 10) { Moves = new(204,193,409,098), TID16 = 1000, SID16 = 31045, OTGender = 1, MetLocation = 3000, Gender = 1, Ability = OnlyFirst, CurrentLevel = 16 }, // Buneary
new EncounterTrade4RanchGift(323975579, 453, 22) { Moves = new(310,207,426,389), TID16 = 1000, SID16 = 41342, OTGender = 1, MetLocation = 0052, Gender = 0, Ability = OnlySecond, CurrentLevel = 31, Ball = 5 }, // Croagunk
new EncounterTrade4RanchGift(323977566, 456, 15) { Moves = new(213,352,219,392), TID16 = 1000, SID16 = 48348, OTGender = 1, MetLocation = 0020, Gender = 1, Ability = OnlyFirst, CurrentLevel = 35 }, // Finneon
new EncounterTrade4RanchGift(323975582, 459, 32) { Moves = new(452,420,275,059), TID16 = 1000, SID16 = 23360, OTGender = 1, MetLocation = 0031, Gender = 0, Ability = OnlyFirst, CurrentLevel = 41 }, // Snover
new EncounterTrade4RanchSpecial(151, 50) { Moves = new(235,216,095,100), TID16 = 1000, SID16 = 59228, OTGender = 1, Ball = 0x10, Gender = 2 }, // Mew
new EncounterTrade4RanchSpecial(489, 01) { Moves = new(447,240,156,057), TID16 = 1000, SID16 = 09248, OTGender = 1, Ball = 0x10, Gender = 2, CurrentLevel = 50, EggLocation = 3000 }, // Phione
};
private static readonly EncounterTrade4PID[] TradeGift_DPPtIngame =
{
new(DPPt, 0x0000008E, 063, 01) { Ability = OnlyFirst, TID16 = 25643, SID16 = 00000, OTGender = 1, Gender = 0, IVs = new(15,15,15,20,25,25) }, // Machop -> Abra
new(DPPt, 0x00000867, 441, 01) { Ability = OnlySecond, TID16 = 44142, SID16 = 00000, OTGender = 0, Gender = 1, IVs = new(15,20,15,25,25,15), Contest = 20 }, // Buizel -> Chatot
new(DPPt, 0x00000088, 093, 35) { Ability = OnlyFirst, TID16 = 19248, SID16 = 00000, OTGender = 1, Gender = 0, IVs = new(20,25,15,25,15,15) }, // Medicham (35 from Route 217) -> Haunter
new(DPPt, 0x0000045C, 129, 01) { Ability = OnlyFirst, TID16 = 53277, SID16 = 00000, OTGender = 0, Gender = 1, IVs = new(15,25,15,20,25,15) }, // Finneon -> Magikarp
};
internal static readonly EncounterTrade4[] TradeGift_DPPt = ArrayUtil.ConcatAll(TradeGift_DPPtIngame, RanchGifts);
private const string tradeDPPt = "tradedppt";
private static readonly string[][] TradeDPPt = Util.GetLanguageStrings8(tradeDPPt);
#endregion
internal static readonly EncounterStatic4[] StaticD = GetEncounters(Encounter_DPPt, D);
internal static readonly EncounterStatic4[] StaticP = GetEncounters(Encounter_DPPt, P);
internal static readonly EncounterStatic4[] StaticPt = GetEncounters(Encounter_DPPt, Pt);
}

View file

@ -1,144 +0,0 @@
using static PKHeX.Core.EncounterUtil;
using static PKHeX.Core.GameVersion;
using static PKHeX.Core.GroundTileAllowed;
using static PKHeX.Core.AbilityPermission;
namespace PKHeX.Core;
/// <summary>
/// Generation 4 Encounters
/// </summary>
internal static class Encounters4HGSS
{
internal static readonly EncounterArea4[] SlotsHG = EncounterArea4.GetAreas(Get("hg", "hg"), HG);
internal static readonly EncounterArea4[] SlotsSS = EncounterArea4.GetAreas(Get("ss", "ss"), SS);
private static readonly EncounterStatic4Pokewalker[] Encounter_PokeWalker = EncounterStatic4Pokewalker.GetAll(Util.GetBinaryResource("encounter_walker4.pkl"));
static Encounters4HGSS() => MarkEncounterTradeStrings(TradeGift_HGSS, TradeHGSS);
#region Static Encounter/Gift Tables
private static readonly EncounterStatic4[] Encounter_HGSS =
{
// Starters
new(HGSS) { Gift = true, Species = 001, Level = 05, Location = 138, GroundTile = Max_Pt }, // Bulbasaur @ Pallet Town
new(HGSS) { Gift = true, Species = 004, Level = 05, Location = 138, GroundTile = Max_Pt }, // Charmander
new(HGSS) { Gift = true, Species = 007, Level = 05, Location = 138, GroundTile = Max_Pt }, // Squirtle
new(HGSS) { Gift = true, Species = 152, Level = 05, Location = 126, GroundTile = Max_DP }, // Chikorita @ New Bark Town
new(HGSS) { Gift = true, Species = 155, Level = 05, Location = 126, GroundTile = Max_DP }, // Cyndaquil
new(HGSS) { Gift = true, Species = 158, Level = 05, Location = 126, GroundTile = Max_DP }, // Totodile
new(HGSS) { Gift = true, Species = 252, Level = 05, Location = 148, GroundTile = Max_Pt }, // Treecko @ Saffron City
new(HGSS) { Gift = true, Species = 255, Level = 05, Location = 148, GroundTile = Max_Pt }, // Torchic
new(HGSS) { Gift = true, Species = 258, Level = 05, Location = 148, GroundTile = Max_Pt }, // Mudkip
// Fossils @ Pewter City
new(HGSS) { Gift = true, Species = 138, Level = 20, Location = 140, GroundTile = Max_Pt }, // Omanyte
new(HGSS) { Gift = true, Species = 140, Level = 20, Location = 140, GroundTile = Max_Pt }, // Kabuto
new(HGSS) { Gift = true, Species = 142, Level = 20, Location = 140, GroundTile = Max_Pt }, // Aerodactyl
new(HGSS) { Gift = true, Species = 345, Level = 20, Location = 140, GroundTile = Max_Pt }, // Lileep
new(HGSS) { Gift = true, Species = 347, Level = 20, Location = 140, GroundTile = Max_Pt }, // Anorith
new(HGSS) { Gift = true, Species = 408, Level = 20, Location = 140, GroundTile = Max_Pt }, // Cranidos
new(HGSS) { Gift = true, Species = 410, Level = 20, Location = 140, GroundTile = Max_Pt }, // Shieldon
// Gift
new(HGSS) { Gift = true, Species = 072, Level = 15, Location = 130, GroundTile = Max_Pt }, // Tentacool @ Cianwood City
new(HGSS) { Gift = true, Species = 133, Level = 05, Location = 131, GroundTile = Max_Pt }, // Eevee @ Goldenrod City
new(HGSS) { Gift = true, Species = 147, Level = 15, Location = 222, GroundTile = Max_Pt, Moves = new(245) }, // Dratini @ Dragon's Den (ExtremeSpeed)
new(HGSS) { Gift = true, Species = 236, Level = 10, Location = 216, GroundTile = Max_Pt }, // Tyrogue @ Mt. Mortar
new(HGSS) { Gift = true, Species = 175, Level = 01, EggLocation = 2013, Moves = new((int)Move.Growl, (int)Move.Charm, (int)Move.Extrasensory) }, // Togepi Egg from Mr. Pokemon (Extrasensory as Egg move)
new(HGSS) { Gift = true, Species = 179, Level = 01, EggLocation = 2014 }, // Mareep Egg from Primo
new(HGSS) { Gift = true, Species = 194, Level = 01, EggLocation = 2014 }, // Wooper Egg from Primo
new(HGSS) { Gift = true, Species = 218, Level = 01, EggLocation = 2014 }, // Slugma Egg from Primo
// Celadon City Game Corner
new(HGSS) { Gift = true, Species = 122, Level = 15, Location = 144, GroundTile = Max_Pt }, // Mr. Mime
new(HGSS) { Gift = true, Species = 133, Level = 15, Location = 144, GroundTile = Max_Pt }, // Eevee
new(HGSS) { Gift = true, Species = 137, Level = 15, Location = 144, GroundTile = Max_Pt }, // Porygon
// Goldenrod City Game Corner
new(HGSS) { Gift = true, Species = 063, Level = 15, Location = 131, GroundTile = Max_Pt }, // Abra
new(HG ) { Gift = true, Species = 023, Level = 15, Location = 131, GroundTile = Max_Pt }, // Ekans
new( SS) { Gift = true, Species = 027, Level = 15, Location = 131, GroundTile = Max_Pt }, // Sandshrew
new(HGSS) { Gift = true, Species = 147, Level = 15, Location = 131, GroundTile = Max_Pt }, // Dratini
// Team Rocket HQ Trap Floor
new(HGSS) { Species = 100, Level = 23, Location = 213, GroundTile = Building }, // Voltorb
new(HGSS) { Species = 074, Level = 21, Location = 213, GroundTile = Building }, // Geodude
new(HGSS) { Species = 109, Level = 21, Location = 213, GroundTile = Building }, // Koffing
// Stationary
new(HGSS) { Species = 130, Level = 30, Location = 135, GroundTile = Water, Shiny = Shiny.Always }, // Gyarados @ Lake of Rage
new(HGSS) { Species = 131, Level = 20, Location = 210, GroundTile = Water }, // Lapras @ Union Cave Friday Only
new(HGSS) { Species = 101, Level = 23, Location = 213, GroundTile = Building }, // Electrode @ Team Rocket HQ
new(HGSS) { Species = 143, Level = 50, Location = 159 }, // Snorlax @ Route 11
new(HGSS) { Species = 143, Level = 50, Location = 160 }, // Snorlax @ Route 12
new(HGSS) { Species = 185, Level = 20, Location = 184 }, // Sudowoodo @ Route 36, Encounter does not have type
new(HGSS) // Spiky-Eared Pichu @ Ilex Forest
{
Species = 172,
Level = 30,
Gender = 1,
Form = 1,
Nature = Nature.Naughty,
Location = 214,
Moves = new(344, 270, 207, 220),
GroundTile = Max_Pt,
Shiny = Shiny.Never,
},
// Stationary Legendary
new(HGSS) { Species = 144, Level = 50, Location = 203, GroundTile = Cave }, // Articuno @ Seafoam Islands
new(HGSS) { Species = 145, Level = 50, Location = 158 }, // Zapdos @ Route 10
new(HGSS) { Species = 146, Level = 50, Location = 219, GroundTile = Cave }, // Moltres @ Mt. Silver Cave
new(HGSS) { Species = 150, Level = 70, Location = 199, GroundTile = Cave }, // Mewtwo @ Cerulean Cave
new(HGSS) { Species = 245, Level = 40, Location = 173 }, // Suicune @ Route 25
new(HGSS) { Species = 245, Level = 40, Location = 206, GroundTile = Cave }, // Suicune @ Burned Tower
new( SS) { Species = 249, Level = 45, Location = 218, GroundTile = Water }, // Lugia @ Whirl Islands
new(HG ) { Species = 249, Level = 70, Location = 218, GroundTile = Water }, // Lugia @ Whirl Islands
new(HG ) { Species = 250, Level = 45, Location = 205, GroundTile = Building }, // Ho-Oh @ Bell Tower
new( SS) { Species = 250, Level = 70, Location = 205, GroundTile = Building }, // Ho-Oh @ Bell Tower
new( SS) { Species = 380, Level = 40, Location = 140, GroundTile = Building }, // Latias @ Pewter City
new(HG ) { Species = 381, Level = 40, Location = 140, GroundTile = Building }, // Latios @ Pewter City
new(HG ) { Species = 382, Level = 50, Location = 232, GroundTile = Cave }, // Kyogre @ Embedded Tower
new( SS) { Species = 383, Level = 50, Location = 232, GroundTile = Cave }, // Groudon @ Embedded Tower
new(HGSS) { Species = 384, Level = 50, Location = 232, GroundTile = Cave }, // Rayquaza @ Embedded Tower
new(HGSS) { Species = 483, Level = 01, Location = 231, Gift = true, GroundTile = Max_Pt }, // Dialga @ Sinjoh Ruins
new(HGSS) { Species = 484, Level = 01, Location = 231, Gift = true, GroundTile = Max_Pt }, // Palkia @ Sinjoh Ruins
new(HGSS) { Species = 487, Level = 01, Location = 231, Gift = true, GroundTile = Max_Pt, Form = 1, HeldItem = 112 }, // Giratina @ Sinjoh Ruins
// Johto Roamers
new(HGSS) { Roaming = true, Species = 243, Location = 177, Level = 40, GroundTile = Grass | Water }, // Raikou
new(HGSS) { Roaming = true, Species = 244, Location = 177, Level = 40, GroundTile = Grass | Water }, // Entei
// Kanto Roamers
new(HG ) { Roaming = true, Species = 380, Location = 149, Level = 35, GroundTile = Grass | Water }, // Latias
new( SS) { Roaming = true, Species = 381, Location = 149, Level = 35, GroundTile = Grass | Water }, // Latios
};
#endregion
#region Trade Tables
internal static readonly EncounterTrade4PID[] TradeGift_HGSS =
{
new(HGSS, 0x000025EF, 095, 01) { Ability = OnlySecond, TID16 = 48926, SID16 = 00000, OTGender = 0, Gender = 0, IVs = new(25,20,25,15,15,15) }, // Bellsprout -> Onix
new(HGSS, 0x00002310, 066, 01) { Ability = OnlyFirst, TID16 = 37460, SID16 = 00000, OTGender = 0, Gender = 1, IVs = new(15,25,20,20,15,15) }, // Drowzee -> Machop
new(HGSS, 0x000001DB, 100, 01) { Ability = OnlySecond, TID16 = 29189, SID16 = 00000, OTGender = 0, Gender = 2, IVs = new(15,20,15,25,25,15) }, // Krabby -> Voltorb
new(HGSS, 0x0001FC0A, 085, 15) { Ability = OnlyFirst, TID16 = 00283, SID16 = 00000, OTGender = 1, Gender = 1, IVs = new(20,20,20,15,15,15) }, // Dragonair (15 from DPPt) -> Dodrio
new(HGSS, 0x0000D136, 082, 19) { Ability = OnlyFirst, TID16 = 50082, SID16 = 00000, OTGender = 0, Gender = 2, IVs = new(15,20,15,20,20,20) }, // Dugtrio (19 from Diglett's Cave) -> Magneton
new(HGSS, 0x000034E4, 178, 16) { Ability = OnlyFirst, TID16 = 15616, SID16 = 00000, OTGender = 0, Gender = 0, IVs = new(15,20,15,20,20,20) }, // Haunter (16 from Old Chateau) -> Xatu
new(HGSS, 0x00485876, 025, 02) { Ability = OnlyFirst, TID16 = 33038, SID16 = 00000, OTGender = 0, Gender = 1, IVs = new(20,25,18,31,25,13) }, // Pikachu
new(HGSS, 0x0012B6D4, 374, 31) { Ability = OnlyFirst, TID16 = 23478, SID16 = 00000, OTGender = 0, Gender = 2, IVs = new(28,29,24,23,24,25) }, // Forretress -> Beldum
new(HGSS, 0x0012971C, 111, 01) { Ability = OnlyFirst, TID16 = 06845, SID16 = 00000, OTGender = 0, Gender = 1, IVs = new(22,31,13,00,22,09), Moves = new(422) }, // Bonsly -> Rhyhorn
new(HGSS, 0x00101596, 208, 01) { Ability = OnlyFirst, TID16 = 26491, SID16 = 00000, OTGender = 1, Gender = 0, IVs = new(08,30,28,06,18,20) }, // Any -> Steelix
//Gift
new(HGSS, 0x00006B5E, 021, 20) { Ability = OnlyFirst, TID16 = 01001, SID16 = 00000, OTGender = 0, Gender = 1, IVs = new(15,20,15,20,20,20), MetLocation = 183, Moves = new(043,031,228,332) },// Webster's Spearow
new(HGSS, 0x000214D7, 213, 20) { Ability = OnlySecond, TID16 = 04336, SID16 = 00001, OTGender = 0, Gender = 0, IVs = new(15,20,15,20,20,20), MetLocation = 130, Moves = new(132,117,227,219) },// Kirk's Shuckle
};
private const string tradeHGSS = "tradehgss";
private static readonly string[][] TradeHGSS = Util.GetLanguageStrings8(tradeHGSS);
#endregion
internal static readonly EncounterStatic[] StaticHG = GetEncounters(ArrayUtil.ConcatAll<EncounterStatic>(Encounter_HGSS, Encounter_PokeWalker), HG);
internal static readonly EncounterStatic[] StaticSS = GetEncounters(ArrayUtil.ConcatAll<EncounterStatic>(Encounter_HGSS, Encounter_PokeWalker), SS);
}

View file

@ -1,7 +1,6 @@
using static PKHeX.Core.EncounterUtil;
using static PKHeX.Core.GameVersion;
using static PKHeX.Core.AbilityPermission;
using static PKHeX.Core.Encounters5DR;
namespace PKHeX.Core;
@ -13,10 +12,11 @@ public static class Encounters5B2W2
internal static readonly EncounterArea5[] SlotsB2 = EncounterArea5.GetAreas(Get("b2", "52"), B2);
internal static readonly EncounterArea5[] SlotsW2 = EncounterArea5.GetAreas(Get("w2", "52"), W2);
static Encounters5B2W2() => MarkEncounterTradeStrings(TradeGift_B2W2_Regular, TradeB2W2);
private const string tradeB2W2 = "tradeb2w2";
private static readonly string[][] TradeNames = Util.GetLanguageStrings8(tradeB2W2);
#region DreamWorld Encounter
public static readonly EncounterStatic5[] DreamWorld_B2W2 = DreamWorldEntry.GetArray(B2W2, stackalloc DreamWorldEntry[]
public static readonly EncounterStatic5Entree[] DreamWorld_B2W2 = DreamWorldEntry.GetArray(B2W2, stackalloc DreamWorldEntry[]
{
// Pleasant Forest
new(535, 10, 496, 414, 352), // Tympole
@ -81,45 +81,40 @@ public static class Encounters5B2W2
});
#endregion
#region Static Encounter/Gift Tables
private static readonly EncounterStatic5[] Encounter_B2W2_Regular =
public static readonly EncounterStatic5[] Encounter_B2W2_Regular =
{
// Starters @ Aspertia City
new(B2W2) { Gift = true, Species = 495, Level = 05, Location = 117 }, // Snivy
new(B2W2) { Gift = true, Species = 498, Level = 05, Location = 117 }, // Tepig
new(B2W2) { Gift = true, Species = 501, Level = 05, Location = 117 }, // Oshawott
new(B2W2) { FixedBall = Ball.Poke, Species = 495, Level = 05, Location = 117 }, // Snivy
new(B2W2) { FixedBall = Ball.Poke, Species = 498, Level = 05, Location = 117 }, // Tepig
new(B2W2) { FixedBall = Ball.Poke, Species = 501, Level = 05, Location = 117 }, // Oshawott
// Fossils @ Nacrene City
new(B2W2) { Gift = true, Species = 138, Level = 25, Location = 007 }, // Omanyte
new(B2W2) { Gift = true, Species = 140, Level = 25, Location = 007 }, // Kabuto
new(B2W2) { Gift = true, Species = 142, Level = 25, Location = 007 }, // Aerodactyl
new(B2W2) { Gift = true, Species = 345, Level = 25, Location = 007 }, // Lileep
new(B2W2) { Gift = true, Species = 347, Level = 25, Location = 007 }, // Anorith
new(B2W2) { Gift = true, Species = 408, Level = 25, Location = 007 }, // Cranidos
new(B2W2) { Gift = true, Species = 410, Level = 25, Location = 007 }, // Shieldon
new(B2W2) { Gift = true, Species = 564, Level = 25, Location = 007 }, // Tirtouga
new(B2W2) { Gift = true, Species = 566, Level = 25, Location = 007 }, // Archen
new(B2W2) { FixedBall = Ball.Poke, Species = 138, Level = 25, Location = 007 }, // Omanyte
new(B2W2) { FixedBall = Ball.Poke, Species = 140, Level = 25, Location = 007 }, // Kabuto
new(B2W2) { FixedBall = Ball.Poke, Species = 142, Level = 25, Location = 007 }, // Aerodactyl
new(B2W2) { FixedBall = Ball.Poke, Species = 345, Level = 25, Location = 007 }, // Lileep
new(B2W2) { FixedBall = Ball.Poke, Species = 347, Level = 25, Location = 007 }, // Anorith
new(B2W2) { FixedBall = Ball.Poke, Species = 408, Level = 25, Location = 007 }, // Cranidos
new(B2W2) { FixedBall = Ball.Poke, Species = 410, Level = 25, Location = 007 }, // Shieldon
new(B2W2) { FixedBall = Ball.Poke, Species = 564, Level = 25, Location = 007 }, // Tirtouga
new(B2W2) { FixedBall = Ball.Poke, Species = 566, Level = 25, Location = 007 }, // Archen
// Gift
new(B2W2) { Gift = true, Species = 133, Level = 10, Location = 008, Ability = OnlyHidden }, // HA Eevee @ Castelia City
new(B2W2) { Gift = true, Species = 585, Level = 30, Location = 019, Ability = OnlyHidden, Form = 0 }, // HA Deerling @ Route 6
new(B2W2) { Gift = true, Species = 585, Level = 30, Location = 019, Ability = OnlyHidden, Form = 1 }, // HA Deerling @ Route 6
new(B2W2) { Gift = true, Species = 585, Level = 30, Location = 019, Ability = OnlyHidden, Form = 2 }, // HA Deerling @ Route 6
new(B2W2) { Gift = true, Species = 585, Level = 30, Location = 019, Ability = OnlyHidden, Form = 3 }, // HA Deerling @ Route 6
new(B2 ) { Gift = true, Species = 443, Level = 01, Location = 122, Shiny = Shiny.Always, Gender = 0 }, // Shiny Gible @ Floccesy Town
new( W2) { Gift = true, Species = 147, Level = 01, Location = 122, Shiny = Shiny.Always, Gender = 0 }, // Shiny Dratini @ Floccesy Town
new(B2W2) { Gift = true, Species = 129, Level = 05, Location = 068 } , // Magikarp @ Marvelous Bridge
new(B2W2) { Gift = true, Species = 440, Level = 01, EggLocation = 60003 }, // Happiny Egg from PKMN Breeder
new(B2W2) { FixedBall = Ball.Poke, Species = 133, Level = 10, Location = 008, Ability = OnlyHidden }, // HA Eevee @ Castelia City
new(B2W2) { FixedBall = Ball.Poke, Species = 585, Level = 30, Location = 019, Ability = OnlyHidden, Form = 0 }, // HA Deerling @ Route 6
new(B2W2) { FixedBall = Ball.Poke, Species = 585, Level = 30, Location = 019, Ability = OnlyHidden, Form = 1 }, // HA Deerling @ Route 6
new(B2W2) { FixedBall = Ball.Poke, Species = 585, Level = 30, Location = 019, Ability = OnlyHidden, Form = 2 }, // HA Deerling @ Route 6
new(B2W2) { FixedBall = Ball.Poke, Species = 585, Level = 30, Location = 019, Ability = OnlyHidden, Form = 3 }, // HA Deerling @ Route 6
new(B2W2) { FixedBall = Ball.Poke, Species = 129, Level = 05, Location = 068 } , // Magikarp @ Marvelous Bridge
new(B2W2) { FixedBall = Ball.Poke, Species = 440, Level = 01, EggLocation = 60003, Location = 0 }, // Happiny Egg from PKMN Breeder
// Stationary
new(B2W2) { Species = 590, Level = 29, Location = 019 }, // Foongus @ Route 6
new(B2W2) { Species = 591, Level = 43, Location = 024 }, // Amoonguss @ Route 11
new(B2W2) { Species = 591, Level = 47, Location = 127 }, // Amoonguss @ Route 22
new(B2W2) { Species = 591, Level = 56, Location = 128 }, // Amoonguss @ Route 23
new(B2 ) { Species = 593, Level = 40, Location = 071, Ability = OnlyHidden, Gender = 0 }, // HA Jellicent @ Undella Bay Mon Only
new( W2) { Species = 593, Level = 40, Location = 071, Ability = OnlyHidden, Gender = 1 }, // HA Jellicent @ Undella Bay Thurs Only
new(B2W2) { Species = 593, Level = 40, Location = 071 }, // HA Jellicent @ Undella Bay EncounterSlot collision
new( W2) { Species = 628, Level = 25, Location = 017, Ability = OnlyHidden, Gender = 0 }, // HA Braviary @ Route 4 Mon Only
new(B2 ) { Species = 630, Level = 25, Location = 017, Ability = OnlyHidden, Gender = 1 }, // HA Mandibuzz @ Route 4 Thurs Only
new(B2W2) { Species = 637, Level = 35, Location = 035 }, // Volcarona @ Relic Castle
new(B2W2) { Species = 637, Level = 65, Location = 035 }, // Volcarona @ Relic Castle
new(B2W2) { Species = 558, Level = 42, Location = 141 }, // Crustle @ Seaside Cave
@ -129,8 +124,6 @@ public static class Encounters5B2W2
new(B2W2) { Species = 377, Level = 65, Location = 150 }, // Regirock @ Rock Peak Chamber
new(B2W2) { Species = 378, Level = 65, Location = 151 }, // Regice @ Iceberg Chamber
new(B2W2) { Species = 379, Level = 65, Location = 152 }, // Registeel @ Iron Chamber
new( W2) { Species = 380, Level = 68, Location = 032 }, // Latias @ Dreamyard
new(B2 ) { Species = 381, Level = 68, Location = 032 }, // Latios @ Dreamyard
new(B2W2) { Species = 480, Level = 65, Location = 007 }, // Uxie @ Nacrene City
new(B2W2) { Species = 481, Level = 65, Location = 056 }, // Mesprit @ Celestial Tower
new(B2W2) { Species = 482, Level = 65, Location = 128 }, // Azelf @ Route 23
@ -143,12 +136,28 @@ public static class Encounters5B2W2
new(B2W2) { Species = 639, Level = 65, Location = 127 }, // Terrakion @ Route 22
new(B2W2) { Species = 640, Level = 45, Location = 024 }, // Virizion @ Route 11
new(B2W2) { Species = 640, Level = 65, Location = 024 }, // Virizion @ Route 11
new( W2) { Species = 643, Level = 70, Location = 039, Shiny = Shiny.Never }, // Reshiram @ Dragonspiral Tower
new(B2 ) { Species = 644, Level = 70, Location = 039, Shiny = Shiny.Never }, // Zekrom @ Dragonspiral Tower
new(B2W2) { Species = 646, Level = 70, Location = 061, Form = 0 }, // Kyurem @ Giant Chasm
};
private static readonly EncounterStatic5N[] Encounter_B2W2_N =
public static readonly EncounterStatic5[] StaticB2 =
{
new(B2 ) { Species = 443, Level = 01, Location = 122, Shiny = Shiny.Always, Gender = 0, FixedBall = Ball.Poke }, // Shiny Gible @ Floccesy Town
new(B2 ) { Species = 381, Level = 68, Location = 032 }, // Latios @ Dreamyard
new(B2 ) { Species = 593, Level = 40, Location = 071, Ability = OnlyHidden, Gender = 0 }, // HA Jellicent @ Undella Bay Mon Only
new(B2 ) { Species = 630, Level = 25, Location = 017, Ability = OnlyHidden, Gender = 1 }, // HA Mandibuzz @ Route 4 Thurs Only
new(B2 ) { Species = 644, Level = 70, Location = 039, Shiny = Shiny.Never }, // Zekrom @ Dragonspiral Tower
};
public static readonly EncounterStatic5[] StaticW2 =
{
new( W2) { Species = 147, Level = 01, Location = 122, Shiny = Shiny.Always, Gender = 0, FixedBall = Ball.Poke }, // Shiny Dratini @ Floccesy Town
new( W2) { Species = 380, Level = 68, Location = 032 }, // Latias @ Dreamyard
new( W2) { Species = 593, Level = 40, Location = 071, Ability = OnlyHidden, Gender = 1 }, // HA Jellicent @ Undella Bay Thurs Only
new( W2) { Species = 628, Level = 25, Location = 017, Ability = OnlyHidden, Gender = 0 }, // HA Braviary @ Route 4 Mon Only
new( W2) { Species = 643, Level = 70, Location = 039, Shiny = Shiny.Never }, // Reshiram @ Dragonspiral Tower
};
public static readonly EncounterStatic5N[] Encounter_B2W2_N =
{
// N's Pokemon
new(0xFF01007F) { Species = 509, Level = 07, Location = 015, Ability = OnlySecond, Nature = Nature.Timid }, // Purloin @ Route 2
@ -165,66 +174,64 @@ public static class Encounters5B2W2
new(0xFF01007F) { Species = 595, Level = 28, Location = 037, Ability = OnlySecond, Nature = Nature.Docile }, // Joltik @ Chargestone Cave
new(0xFF00007F) { Species = 597, Level = 28, Location = 037, Ability = OnlyFirst, Nature = Nature.Bashful }, // Ferroseed @ Chargestone Cave
new(0xFF000000) { Species = 599, Level = 28, Location = 037, Ability = OnlyFirst, Nature = Nature.Rash }, // Klink @ Chargestone Cave
new(0xFF00001F) { Species = 570, Level = 25, Location = 010, Ability = OnlyFirst, Nature = Nature.Hasty, Gift = true }, // N's Zorua @ Driftveil City
new(0xFF00001F) { Species = 570, Level = 25, Location = 010, Ability = OnlyFirst, Nature = Nature.Hasty }, // N's Zorua @ Driftveil City
};
private static readonly EncounterStatic5[] Encounter_B2W2 = ArrayUtil.ConcatAll(Encounter_B2W2_Regular, Encounter_B2W2_N, Encounter_DreamRadar);
#endregion
#region Trade Tables
private static readonly EncounterTrade5[] TradeGift_B2W2_Regular =
{
new(B2 ) { Species = 548, Level = 20, Ability = OnlySecond, TID16 = 65217, SID16 = 00000, OTGender = 1, Gender = 1, IVs = new(20,20,20,20,31,20), Nature = Nature.Timid }, // Petilil
new( W2) { Species = 546, Level = 20, Ability = OnlyFirst, TID16 = 05720, SID16 = 00001, OTGender = 0, Gender = 0, IVs = new(20,20,20,20,31,20), Nature = Nature.Modest }, // Cottonee
new(B2W2) { Species = 526, Level = 35, Ability = OnlyFirst, TID16 = 11195, SID16 = 00000, OTGender = 0, Gender = 0, IVs = new(20,31,20,20,20,20), Nature = Nature.Adamant, IsNicknamed = false }, // Gigalith
new(B2W2) { Species = 465, Level = 45, Ability = OnlyFirst, TID16 = 27658, SID16 = 00001, OTGender = 0, Gender = 0, IVs = new(31,20,20,20,20,20), Nature = Nature.Hardy }, // Tangrowth
new(B2W2) { Species = 479, Level = 60, Ability = OnlyFirst, TID16 = 54673, SID16 = 00000, OTGender = 1, Gender = 2, IVs = new(20,20,20,20,20,31), Nature = Nature.Calm }, // Rotom
new(B2W2) { Species = 424, Level = 40, Ability = OnlySecond, TID16 = 17074, SID16 = 00001, OTGender = 1, Gender = 0, IVs = new(20,20,20,31,20,20), Nature = Nature.Jolly }, // Ambipom
new(B2W2) { Species = 065, Level = 40, Ability = OnlyFirst, TID16 = 17074, SID16 = 00001, OTGender = 1, Gender = 0, IVs = new(20,20,20,31,20,20), Nature = Nature.Timid }, // Alakazam
};
internal const int YancyTID = 10303;
internal const int CurtisTID = 54118;
private const ushort YancyTID = 10303;
private const ushort CurtisTID = 54118;
private static readonly string[] TradeOT_B2W2_F = { string.Empty, "ルリ", "Yancy", "Brenda", "Lilì", "Sabine", string.Empty, "Belinda", "루리" };
private static readonly string[] TradeOT_B2W2_M = { string.Empty, "テツ", "Curtis", "Julien", "Dadi", "Markus", string.Empty, "Julián", "철권" };
private static readonly EncounterTrade5[] TradeGift_B2W2_YancyCurtis =
public static readonly EncounterTrade5B2W2[] TradeGift_B2W2 =
{
new(TradeNames, 00, B2 ) { Species = 548, Level = 20, Ability = OnlySecond, ID32 = 65217, OTGender = 1, Gender = 1, IVs = new(20,20,20,20,31,20), Nature = Nature.Timid }, // Petilil
new(TradeNames, 01, W2) { Species = 546, Level = 20, Ability = OnlyFirst, ID32 = 71256, OTGender = 0, Gender = 0, IVs = new(20,20,20,20,31,20), Nature = Nature.Modest }, // Cottonee
new(TradeNames, 02, B2W2) { Species = 526, Level = 35, Ability = OnlyFirst, ID32 = 11195, OTGender = 0, Gender = 0, IVs = new(20,31,20,20,20,20), Nature = Nature.Adamant, IsFixedNickname = false }, // Gigalith
new(TradeNames, 03, B2W2) { Species = 465, Level = 45, Ability = OnlyFirst, ID32 = 93194, OTGender = 0, Gender = 0, IVs = new(31,20,20,20,20,20), Nature = Nature.Hardy }, // Tangrowth
new(TradeNames, 04, B2W2) { Species = 479, Level = 60, Ability = OnlyFirst, ID32 = 54673, OTGender = 1, Gender = 2, IVs = new(20,20,20,20,20,31), Nature = Nature.Calm }, // Rotom
new(TradeNames, 05, B2W2) { Species = 424, Level = 40, Ability = OnlySecond, ID32 = 82610, OTGender = 1, Gender = 0, IVs = new(20,20,20,31,20,20), Nature = Nature.Jolly }, // Ambipom
new(TradeNames, 06, B2W2) { Species = 065, Level = 40, Ability = OnlyFirst, ID32 = 82610, OTGender = 1, Gender = 0, IVs = new(20,20,20,31,20,20), Nature = Nature.Timid }, // Alakazam
// Player is Male
new(B2W2) { Species = 052, Level = 50, Ability = OnlyHidden, TID16 = 10303, SID16 = 00000, OTGender = 1, TrainerNames = TradeOT_B2W2_F }, // Meowth
new(B2W2) { Species = 202, Level = 50, Ability = OnlyHidden, TID16 = 10303, SID16 = 00000, OTGender = 1, TrainerNames = TradeOT_B2W2_F }, // Wobbuffet
new(B2W2) { Species = 280, Level = 50, Ability = OnlyHidden, TID16 = 10303, SID16 = 00000, OTGender = 1, TrainerNames = TradeOT_B2W2_F }, // Ralts
new(B2W2) { Species = 410, Level = 50, Ability = OnlyHidden, TID16 = 10303, SID16 = 00000, OTGender = 1, TrainerNames = TradeOT_B2W2_F }, // Shieldon
new(B2W2) { Species = 111, Level = 50, Ability = OnlyHidden, TID16 = 10303, SID16 = 00000, OTGender = 1, TrainerNames = TradeOT_B2W2_F }, // Rhyhorn
new(B2W2) { Species = 422, Level = 50, Ability = OnlyHidden, TID16 = 10303, SID16 = 00000, OTGender = 1, TrainerNames = TradeOT_B2W2_F, Form = 0 }, // Shellos-West
new(B2W2) { Species = 303, Level = 50, Ability = OnlyHidden, TID16 = 10303, SID16 = 00000, OTGender = 1, TrainerNames = TradeOT_B2W2_F }, // Mawile
new(B2W2) { Species = 442, Level = 50, Ability = OnlyHidden, TID16 = 10303, SID16 = 00000, OTGender = 1, TrainerNames = TradeOT_B2W2_F }, // Spiritomb
new(B2W2) { Species = 143, Level = 50, Ability = OnlyHidden, TID16 = 10303, SID16 = 00000, OTGender = 1, TrainerNames = TradeOT_B2W2_F }, // Snorlax
new(B2W2) { Species = 216, Level = 50, Ability = OnlyHidden, TID16 = 10303, SID16 = 00000, OTGender = 1, TrainerNames = TradeOT_B2W2_F }, // Teddiursa
new(B2W2) { Species = 327, Level = 50, Ability = OnlyHidden, TID16 = 10303, SID16 = 00000, OTGender = 1, TrainerNames = TradeOT_B2W2_F }, // Spinda
new(B2W2) { Species = 175, Level = 50, Ability = OnlyHidden, TID16 = 10303, SID16 = 00000, OTGender = 1, TrainerNames = TradeOT_B2W2_F }, // Togepi
new(TradeOT_B2W2_F, B2W2) { Species = 052, Level = 50, Ability = OnlyHidden, ID32 = YancyTID, OTGender = 1 }, // Meowth
new(TradeOT_B2W2_F, B2W2) { Species = 202, Level = 50, Ability = OnlyHidden, ID32 = YancyTID, OTGender = 1 }, // Wobbuffet
new(TradeOT_B2W2_F, B2W2) { Species = 280, Level = 50, Ability = OnlyHidden, ID32 = YancyTID, OTGender = 1 }, // Ralts
new(TradeOT_B2W2_F, B2W2) { Species = 410, Level = 50, Ability = OnlyHidden, ID32 = YancyTID, OTGender = 1 }, // Shieldon
new(TradeOT_B2W2_F, B2W2) { Species = 111, Level = 50, Ability = OnlyHidden, ID32 = YancyTID, OTGender = 1 }, // Rhyhorn
new(TradeOT_B2W2_F, B2W2) { Species = 422, Level = 50, Ability = OnlyHidden, ID32 = YancyTID, OTGender = 1, Form = 0 }, // Shellos-West
new(TradeOT_B2W2_F, B2W2) { Species = 303, Level = 50, Ability = OnlyHidden, ID32 = YancyTID, OTGender = 1 }, // Mawile
new(TradeOT_B2W2_F, B2W2) { Species = 442, Level = 50, Ability = OnlyHidden, ID32 = YancyTID, OTGender = 1 }, // Spiritomb
new(TradeOT_B2W2_F, B2W2) { Species = 143, Level = 50, Ability = OnlyHidden, ID32 = YancyTID, OTGender = 1 }, // Snorlax
new(TradeOT_B2W2_F, B2W2) { Species = 216, Level = 50, Ability = OnlyHidden, ID32 = YancyTID, OTGender = 1 }, // Teddiursa
new(TradeOT_B2W2_F, B2W2) { Species = 327, Level = 50, Ability = OnlyHidden, ID32 = YancyTID, OTGender = 1 }, // Spinda
new(TradeOT_B2W2_F, B2W2) { Species = 175, Level = 50, Ability = OnlyHidden, ID32 = YancyTID, OTGender = 1 }, // Togepi
// Player is Female
new(B2W2) { Species = 056, Level = 50, Ability = OnlyHidden, TID16 = 54118, SID16 = 00000, OTGender = 0, TrainerNames = TradeOT_B2W2_M }, // Mankey
new(B2W2) { Species = 202, Level = 50, Ability = OnlyHidden, TID16 = 54118, SID16 = 00000, OTGender = 0, TrainerNames = TradeOT_B2W2_M }, // Wobbuffet
new(B2W2) { Species = 280, Level = 50, Ability = OnlyHidden, TID16 = 54118, SID16 = 00000, OTGender = 0, TrainerNames = TradeOT_B2W2_M }, // Ralts
new(B2W2) { Species = 408, Level = 50, Ability = OnlyHidden, TID16 = 54118, SID16 = 00000, OTGender = 0, TrainerNames = TradeOT_B2W2_M }, // Cranidos
new(B2W2) { Species = 111, Level = 50, Ability = OnlyHidden, TID16 = 54118, SID16 = 00000, OTGender = 0, TrainerNames = TradeOT_B2W2_M }, // Rhyhorn
new(B2W2) { Species = 422, Level = 50, Ability = OnlyHidden, TID16 = 54118, SID16 = 00000, OTGender = 0, TrainerNames = TradeOT_B2W2_M, Form = 1 }, // Shellos-East
new(B2W2) { Species = 302, Level = 50, Ability = OnlyHidden, TID16 = 54118, SID16 = 00000, OTGender = 0, TrainerNames = TradeOT_B2W2_M }, // Sableye
new(B2W2) { Species = 442, Level = 50, Ability = OnlyHidden, TID16 = 54118, SID16 = 00000, OTGender = 0, TrainerNames = TradeOT_B2W2_M }, // Spiritomb
new(B2W2) { Species = 143, Level = 50, Ability = OnlyHidden, TID16 = 54118, SID16 = 00000, OTGender = 0, TrainerNames = TradeOT_B2W2_M }, // Snorlax
new(B2W2) { Species = 231, Level = 50, Ability = OnlyHidden, TID16 = 54118, SID16 = 00000, OTGender = 0, TrainerNames = TradeOT_B2W2_M }, // Phanpy
new(B2W2) { Species = 327, Level = 50, Ability = OnlyHidden, TID16 = 54118, SID16 = 00000, OTGender = 0, TrainerNames = TradeOT_B2W2_M }, // Spinda
new(B2W2) { Species = 175, Level = 50, Ability = OnlyHidden, TID16 = 54118, SID16 = 00000, OTGender = 0, TrainerNames = TradeOT_B2W2_M }, // Togepi
new(TradeOT_B2W2_M, B2W2) { Species = 056, Level = 50, Ability = OnlyHidden, ID32 = CurtisTID, OTGender = 0 }, // Mankey
new(TradeOT_B2W2_M, B2W2) { Species = 202, Level = 50, Ability = OnlyHidden, ID32 = CurtisTID, OTGender = 0 }, // Wobbuffet
new(TradeOT_B2W2_M, B2W2) { Species = 280, Level = 50, Ability = OnlyHidden, ID32 = CurtisTID, OTGender = 0 }, // Ralts
new(TradeOT_B2W2_M, B2W2) { Species = 408, Level = 50, Ability = OnlyHidden, ID32 = CurtisTID, OTGender = 0 }, // Cranidos
new(TradeOT_B2W2_M, B2W2) { Species = 111, Level = 50, Ability = OnlyHidden, ID32 = CurtisTID, OTGender = 0 }, // Rhyhorn
new(TradeOT_B2W2_M, B2W2) { Species = 422, Level = 50, Ability = OnlyHidden, ID32 = CurtisTID, OTGender = 0, Form = 1 }, // Shellos-East
new(TradeOT_B2W2_M, B2W2) { Species = 302, Level = 50, Ability = OnlyHidden, ID32 = CurtisTID, OTGender = 0 }, // Sableye
new(TradeOT_B2W2_M, B2W2) { Species = 442, Level = 50, Ability = OnlyHidden, ID32 = CurtisTID, OTGender = 0 }, // Spiritomb
new(TradeOT_B2W2_M, B2W2) { Species = 143, Level = 50, Ability = OnlyHidden, ID32 = CurtisTID, OTGender = 0 }, // Snorlax
new(TradeOT_B2W2_M, B2W2) { Species = 231, Level = 50, Ability = OnlyHidden, ID32 = CurtisTID, OTGender = 0 }, // Phanpy
new(TradeOT_B2W2_M, B2W2) { Species = 327, Level = 50, Ability = OnlyHidden, ID32 = CurtisTID, OTGender = 0 }, // Spinda
new(TradeOT_B2W2_M, B2W2) { Species = 175, Level = 50, Ability = OnlyHidden, ID32 = CurtisTID, OTGender = 0 }, // Togepi
};
private const string tradeB2W2 = "tradeb2w2";
private static readonly string[][] TradeB2W2 = Util.GetLanguageStrings8(tradeB2W2);
public static readonly EncounterTrade5B2W2[] TradeGift_W2 =
{
new(TradeNames, 01, W2) { Species = 546, Level = 20, Ability = OnlyFirst, ID32 = 71256, OTGender = 0, Gender = 0, IVs = new(20,20,20,20,31,20), Nature = Nature.Modest }, // Cottonee
};
internal static readonly EncounterTrade5[] TradeGift_B2W2 = ArrayUtil.ConcatAll(TradeGift_B2W2_Regular, TradeGift_B2W2_YancyCurtis);
public static readonly EncounterTrade5B2W2[] TradeGift_B2 =
{
new(TradeNames, 00, B2 ) { Species = 548, Level = 20, Ability = OnlySecond, ID32 = 65217, OTGender = 1, Gender = 1, IVs = new(20,20,20,20,31,20), Nature = Nature.Timid }, // Petilil
};
#endregion
internal static readonly EncounterStatic5[] StaticB2 = ArrayUtil.ConcatAll(GetEncounters(Encounter_B2W2, B2), DreamWorld_Common, DreamWorld_B2W2);
internal static readonly EncounterStatic5[] StaticW2 = ArrayUtil.ConcatAll(GetEncounters(Encounter_B2W2, W2), DreamWorld_Common, DreamWorld_B2W2);
}

View file

@ -1,7 +1,6 @@
using static PKHeX.Core.EncounterUtil;
using static PKHeX.Core.GameVersion;
using static PKHeX.Core.AbilityPermission;
using static PKHeX.Core.Encounters5DR;
namespace PKHeX.Core;
@ -13,11 +12,12 @@ public static class Encounters5BW
internal static readonly EncounterArea5[] SlotsB = EncounterArea5.GetAreas(Get("b", "51"), B);
internal static readonly EncounterArea5[] SlotsW = EncounterArea5.GetAreas(Get("w", "51"), W);
static Encounters5BW() => MarkEncounterTradeStrings(TradeGift_BW, TradeBW);
private const string tradeBW = "tradebw";
private static readonly string[][] TradeNames = Util.GetLanguageStrings8(tradeBW);
#region DreamWorld Encounter
public static readonly EncounterStatic5[] DreamWorld_BW = DreamWorldEntry.GetArray(BW, stackalloc DreamWorldEntry[]
public static readonly EncounterStatic5Entree[] DreamWorld_BW = DreamWorldEntry.GetArray(BW, stackalloc DreamWorldEntry[]
{
// Pleasant Forest
new(029, 10, 010, 389, 162), // Nidoran♀
@ -120,30 +120,30 @@ public static class Encounters5BW
#endregion
#region Static Encounter/Gift Tables
private static readonly EncounterStatic5[] Encounter_BW =
public static readonly EncounterStatic5[] Encounter_BW =
{
// Starters @ Nuvema Town
new(BW) { Gift = true, Species = 495, Level = 05, Location = 004 }, // Snivy
new(BW) { Gift = true, Species = 498, Level = 05, Location = 004 }, // Tepig
new(BW) { Gift = true, Species = 501, Level = 05, Location = 004 }, // Oshawott
new(BW) { FixedBall = Ball.Poke, Species = 495, Level = 05, Location = 004 }, // Snivy
new(BW) { FixedBall = Ball.Poke, Species = 498, Level = 05, Location = 004 }, // Tepig
new(BW) { FixedBall = Ball.Poke, Species = 501, Level = 05, Location = 004 }, // Oshawott
// Fossils @ Nacrene City
new(BW) { Gift = true, Species = 138, Level = 25, Location = 007 }, // Omanyte
new(BW) { Gift = true, Species = 140, Level = 25, Location = 007 }, // Kabuto
new(BW) { Gift = true, Species = 142, Level = 25, Location = 007 }, // Aerodactyl
new(BW) { Gift = true, Species = 345, Level = 25, Location = 007 }, // Lileep
new(BW) { Gift = true, Species = 347, Level = 25, Location = 007 }, // Anorith
new(BW) { Gift = true, Species = 408, Level = 25, Location = 007 }, // Cranidos
new(BW) { Gift = true, Species = 410, Level = 25, Location = 007 }, // Shieldon
new(BW) { Gift = true, Species = 564, Level = 25, Location = 007 }, // Tirtouga
new(BW) { Gift = true, Species = 566, Level = 25, Location = 007 }, // Archen
new(BW) { FixedBall = Ball.Poke, Species = 138, Level = 25, Location = 007 }, // Omanyte
new(BW) { FixedBall = Ball.Poke, Species = 140, Level = 25, Location = 007 }, // Kabuto
new(BW) { FixedBall = Ball.Poke, Species = 142, Level = 25, Location = 007 }, // Aerodactyl
new(BW) { FixedBall = Ball.Poke, Species = 345, Level = 25, Location = 007 }, // Lileep
new(BW) { FixedBall = Ball.Poke, Species = 347, Level = 25, Location = 007 }, // Anorith
new(BW) { FixedBall = Ball.Poke, Species = 408, Level = 25, Location = 007 }, // Cranidos
new(BW) { FixedBall = Ball.Poke, Species = 410, Level = 25, Location = 007 }, // Shieldon
new(BW) { FixedBall = Ball.Poke, Species = 564, Level = 25, Location = 007 }, // Tirtouga
new(BW) { FixedBall = Ball.Poke, Species = 566, Level = 25, Location = 007 }, // Archen
// Gift
new(BW) { Gift = true, Species = 511, Level = 10, Location = 032 }, // Pansage @ Dreamyard
new(BW) { Gift = true, Species = 513, Level = 10, Location = 032 }, // Pansear
new(BW) { Gift = true, Species = 515, Level = 10, Location = 032 }, // Panpour
new(BW) { Gift = true, Species = 129, Level = 05, Location = 068 }, // Magikarp @ Marvelous Bridge
new(BW) { Gift = true, Species = 636, Level = 01, EggLocation = 60003 }, // Larvesta Egg from Treasure Hunter
new(BW) { FixedBall = Ball.Poke, Species = 511, Level = 10, Location = 032 }, // Pansage @ Dreamyard
new(BW) { FixedBall = Ball.Poke, Species = 513, Level = 10, Location = 032 }, // Pansear
new(BW) { FixedBall = Ball.Poke, Species = 515, Level = 10, Location = 032 }, // Panpour
new(BW) { FixedBall = Ball.Poke, Species = 129, Level = 05, Location = 068 }, // Magikarp @ Marvelous Bridge
new(BW) { FixedBall = Ball.Poke, Species = 636, Level = 01, EggLocation = 60003, Location = 0 }, // Larvesta Egg from Treasure Hunter
// Stationary
new(BW) { Species = 518, Level = 50, Location = 032, Ability = OnlyHidden }, // Musharna @ Dreamyard Friday Only
@ -157,10 +157,6 @@ public static class Encounters5BW
new(BW) { Species = 638, Level = 42, Location = 074 }, // Cobalion @ Guidance Chamber
new(BW) { Species = 639, Level = 42, Location = 073 }, // Terrakion @ Trial Chamber
new(BW) { Species = 640, Level = 42, Location = 055 }, // Virizion @ Rumination Field
new(B ) { Species = 643, Level = 50, Location = 045, Shiny = Shiny.Never }, // Reshiram @ N's Castle
new(B ) { Species = 643, Level = 50, Location = 039, Shiny = Shiny.Never }, // Reshiram @ Dragonspiral Tower
new( W) { Species = 644, Level = 50, Location = 045, Shiny = Shiny.Never }, // Zekrom @ N's Castle
new( W) { Species = 644, Level = 50, Location = 039, Shiny = Shiny.Never }, // Zekrom @ Dragonspiral Tower
new(BW) { Species = 645, Level = 70, Location = 070 }, // Landorus @ Abundant Shrine
new(BW) { Species = 646, Level = 75, Location = 061 }, // Kyurem @ Giant Chasm
@ -168,29 +164,40 @@ public static class Encounters5BW
new(BW) { Species = 494, Level = 15, Location = 062, Shiny = Shiny.Never}, // Victini @ Liberty Garden
new(BW) { Species = 570, Level = 10, Location = 008, Shiny = Shiny.Never, Gender = 0 }, // Zorua @ Castelia City
new(BW) { Species = 571, Level = 25, Location = 072, Shiny = Shiny.Never, Gender = 1 }, // Zoroark @ Lostlorn Forest
};
// Roamer
new(B ) { Roaming = true, Species = 641, Level = 40, Location = 25 }, // Tornadus
public static readonly EncounterStatic5[] StaticB =
{
new(B) { Species = 643, Level = 50, Location = 045, Shiny = Shiny.Never }, // Reshiram @ N's Castle
new(B) { Species = 643, Level = 50, Location = 039, Shiny = Shiny.Never }, // Reshiram @ Dragonspiral Tower
new(B) { Roaming = true, Species = 641, Level = 40, Location = 25 }, // Tornadus
};
public static readonly EncounterStatic5[] StaticW =
{
new( W) { Species = 644, Level = 50, Location = 045, Shiny = Shiny.Never }, // Zekrom @ N's Castle
new( W) { Species = 644, Level = 50, Location = 039, Shiny = Shiny.Never }, // Zekrom @ Dragonspiral Tower
new( W) { Roaming = true, Species = 642, Level = 40, Location = 25 }, // Thundurus
};
#endregion
#region Trade Tables
internal static readonly EncounterTrade5PID[] TradeGift_BW =
internal static readonly EncounterTrade5BW[] TradeGift_BW =
{
new(B , 0x64000000) { Species = 548, Level = 15, Ability = OnlyFirst, TID16 = 39922, SID16 = 00000, OTGender = 1, Gender = 1, IVs = new(20,20,20,20,31,20), Nature = Nature.Modest }, // Petilil
new( W, 0x6400007E) { Species = 546, Level = 15, Ability = OnlyFirst, TID16 = 39922, SID16 = 00000, OTGender = 1, Gender = 1, IVs = new(20,20,20,20,31,20), Nature = Nature.Modest }, // Cottonee
new(B , 0x9400007F) { Species = 550, Level = 25, Ability = OnlyFirst, TID16 = 27646, SID16 = 00000, OTGender = 0, Gender = 0, IVs = new(20,31,20,20,20,20), Nature = Nature.Adamant, Form = 0 }, // Basculin-Red
new( W, 0x9400007F) { Species = 550, Level = 25, Ability = OnlyFirst, TID16 = 27646, SID16 = 00000, OTGender = 0, Gender = 0, IVs = new(20,31,20,20,20,20), Nature = Nature.Adamant, Form = 1 }, // Basculin-Blue
new(BW, 0xD400007F) { Species = 587, Level = 30, Ability = OnlyFirst, TID16 = 11195, SID16 = 00000, OTGender = 0, Gender = 0, IVs = new(20,20,31,20,20,20), Nature = Nature.Lax }, // Emolga
new(BW, 0x2A000000) { Species = 479, Level = 60, Ability = OnlyFirst, TID16 = 54673, SID16 = 00000, OTGender = 1, Gender = 2, IVs = new(20,20,20,20,20,31), Nature = Nature.Gentle }, // Rotom
new(BW, 0x6200001F) { Species = 446, Level = 60, Ability = OnlySecond, TID16 = 40217, SID16 = 00000, OTGender = 0, Gender = 0, IVs = new(31,20,20,20,20,20), Nature = Nature.Serious }, // Munchlax
new(TradeNames, 04, BW, 0xD400007F) { Species = 587, Level = 30, Ability = OnlyFirst, ID32 = 11195, OTGender = 0, Gender = 0, IVs = new(20,20,31,20,20,20), Nature = Nature.Lax }, // Emolga
new(TradeNames, 05, BW, 0x2A000000) { Species = 479, Level = 60, Ability = OnlyFirst, ID32 = 54673, OTGender = 1, Gender = 2, IVs = new(20,20,20,20,20,31), Nature = Nature.Gentle }, // Rotom
new(TradeNames, 06, BW, 0x6200001F) { Species = 446, Level = 60, Ability = OnlySecond, ID32 = 40217, OTGender = 0, Gender = 0, IVs = new(31,20,20,20,20,20), Nature = Nature.Serious }, // Munchlax
};
private const string tradeBW = "tradebw";
private static readonly string[][] TradeBW = Util.GetLanguageStrings8(tradeBW);
#endregion
internal static readonly EncounterTrade5BW[] TradeGift_B =
{
new(TradeNames, 00, B , 0x64000000) { Species = 548, Level = 15, Ability = OnlyFirst, ID32 = 39922, OTGender = 1, Gender = 1, IVs = new(20,20,20,20,31,20), Nature = Nature.Modest }, // Petilil
new(TradeNames, 02, B , 0x9400007F) { Species = 550, Level = 25, Ability = OnlyFirst, ID32 = 27646, OTGender = 0, Gender = 0, IVs = new(20,31,20,20,20,20), Nature = Nature.Adamant, Form = 0 }, // Basculin-Red
};
internal static readonly EncounterStatic5[] StaticB = ArrayUtil.ConcatAll(GetEncounters(Encounter_BW, B), DreamWorld_Common, DreamWorld_BW);
internal static readonly EncounterStatic5[] StaticW = ArrayUtil.ConcatAll(GetEncounters(Encounter_BW, W), DreamWorld_Common, DreamWorld_BW);
internal static readonly EncounterTrade5BW[] TradeGift_W =
{
new(TradeNames, 01, W, 0x6400007E) { Species = 546, Level = 15, Ability = OnlyFirst, ID32 = 39922, OTGender = 1, Gender = 1, IVs = new(20,20,20,20,31,20), Nature = Nature.Modest }, // Cottonee
new(TradeNames, 03, W, 0x9400007F) { Species = 550, Level = 25, Ability = OnlyFirst, ID32 = 27646, OTGender = 0, Gender = 0, IVs = new(20,31,20,20,20,20), Nature = Nature.Adamant, Form = 1 }, // Basculin-Blue
};
#endregion
}

View file

@ -10,7 +10,7 @@ public static class Encounters5DR
{
#region Dream Radar Tables
internal static readonly EncounterStatic5DR[] Encounter_DreamRadar =
internal static readonly EncounterStatic5Radar[] Encounter_DreamRadar =
{
new(079, 0), // Slowpoke
new(120, 0), // Staryu
@ -43,7 +43,7 @@ public static class Encounters5DR
#endregion
#region DreamWorld Encounter
public static readonly EncounterStatic5[] DreamWorld_Common = DreamWorldEntry.GetArray(Gen5, stackalloc DreamWorldEntry[]
public static readonly EncounterStatic5Entree[] DreamWorld_Common = DreamWorldEntry.GetArray(Gen5, stackalloc DreamWorldEntry[]
{
// Pleasant Forest
new(019, 10, 098, 382, 231), // Rattata

View file

@ -12,13 +12,8 @@ internal static class Encounters6AO
internal static readonly EncounterArea6AO[] SlotsA = EncounterArea6AO.GetAreas(Get("as", "ao"), AS);
internal static readonly EncounterArea6AO[] SlotsO = EncounterArea6AO.GetAreas(Get("or", "ao"), OR);
static Encounters6AO()
{
MarkEncounterTradeStrings(TradeGift_AO, TradeAO);
}
private const string tradeAO = "tradeao";
private static readonly string[][] TradeAO = Util.GetLanguageStrings8(tradeAO);
private static readonly string[][] TradeNames = Util.GetLanguageStrings8(tradeAO);
#region Static Encounter/Gift Tables
private static readonly EncounterStatic6 BaseCosplay = new(ORAS)
@ -35,73 +30,61 @@ internal static class Encounters6AO
CNT_Cute = 70,
CNT_Tough = 70,
CNT_Smart = 70,
Gift = true,
FixedBall = Ball.Poke,
Shiny = Shiny.Never,
};
private static readonly EncounterStatic6[] Encounter_AO_Regular =
{
// Starters @ Route 101
new(ORAS) { Gift = true, Species = 252, Level = 5, Location = 204 }, // Treeko
new(ORAS) { Gift = true, Species = 255, Level = 5, Location = 204 }, // Torchic
new(ORAS) { Gift = true, Species = 258, Level = 5, Location = 204 }, // Mudkip
new(ORAS) { FixedBall = Ball.Poke, Species = 252, Level = 5, Location = 204 }, // Treeko
new(ORAS) { FixedBall = Ball.Poke, Species = 255, Level = 5, Location = 204 }, // Torchic
new(ORAS) { FixedBall = Ball.Poke, Species = 258, Level = 5, Location = 204 }, // Mudkip
new(ORAS) { Gift = true, Species = 152, Level = 5, Location = 204 }, // Chikorita
new(ORAS) { Gift = true, Species = 155, Level = 5, Location = 204 }, // Cyndaquil
new(ORAS) { Gift = true, Species = 158, Level = 5, Location = 204 }, // Totodile
new(ORAS) { FixedBall = Ball.Poke, Species = 152, Level = 5, Location = 204 }, // Chikorita
new(ORAS) { FixedBall = Ball.Poke, Species = 155, Level = 5, Location = 204 }, // Cyndaquil
new(ORAS) { FixedBall = Ball.Poke, Species = 158, Level = 5, Location = 204 }, // Totodile
new(ORAS) { Gift = true, Species = 387, Level = 5, Location = 204 }, // Turtwig
new(ORAS) { Gift = true, Species = 390, Level = 5, Location = 204 }, // Chimchar
new(ORAS) { Gift = true, Species = 393, Level = 5, Location = 204 }, // Piplup
new(ORAS) { FixedBall = Ball.Poke, Species = 387, Level = 5, Location = 204 }, // Turtwig
new(ORAS) { FixedBall = Ball.Poke, Species = 390, Level = 5, Location = 204 }, // Chimchar
new(ORAS) { FixedBall = Ball.Poke, Species = 393, Level = 5, Location = 204 }, // Piplup
new(ORAS) { Gift = true, Species = 495, Level = 5, Location = 204 }, // Snivy
new(ORAS) { Gift = true, Species = 498, Level = 5, Location = 204 }, // Tepig
new(ORAS) { Gift = true, Species = 501, Level = 5, Location = 204 }, // Oshawott
new(ORAS) { FixedBall = Ball.Poke, Species = 495, Level = 5, Location = 204 }, // Snivy
new(ORAS) { FixedBall = Ball.Poke, Species = 498, Level = 5, Location = 204 }, // Tepig
new(ORAS) { FixedBall = Ball.Poke, Species = 501, Level = 5, Location = 204 }, // Oshawott
// Fossils @ Rustboro City
new(ORAS) { Gift = true, Species = 138, Level = 20, Location = 190 }, // Omanyte
new(ORAS) { Gift = true, Species = 140, Level = 20, Location = 190 }, // Kabuto
new(ORAS) { Gift = true, Species = 142, Level = 20, Location = 190 }, // Aerodactyl
new(ORAS) { Gift = true, Species = 345, Level = 20, Location = 190 }, // Lileep
new(ORAS) { Gift = true, Species = 347, Level = 20, Location = 190 }, // Anorith
new(ORAS) { Gift = true, Species = 408, Level = 20, Location = 190 }, // Cranidos
new(ORAS) { Gift = true, Species = 410, Level = 20, Location = 190 }, // Shieldon
new(ORAS) { Gift = true, Species = 564, Level = 20, Location = 190 }, // Tirtouga
new(ORAS) { Gift = true, Species = 566, Level = 20, Location = 190 }, // Archen
new(ORAS) { Gift = true, Species = 696, Level = 20, Location = 190 }, // Tyrunt
new(ORAS) { Gift = true, Species = 698, Level = 20, Location = 190 }, // Amaura
new(ORAS) { FixedBall = Ball.Poke, Species = 138, Level = 20, Location = 190 }, // Omanyte
new(ORAS) { FixedBall = Ball.Poke, Species = 140, Level = 20, Location = 190 }, // Kabuto
new(ORAS) { FixedBall = Ball.Poke, Species = 142, Level = 20, Location = 190 }, // Aerodactyl
new(ORAS) { FixedBall = Ball.Poke, Species = 345, Level = 20, Location = 190 }, // Lileep
new(ORAS) { FixedBall = Ball.Poke, Species = 347, Level = 20, Location = 190 }, // Anorith
new(ORAS) { FixedBall = Ball.Poke, Species = 408, Level = 20, Location = 190 }, // Cranidos
new(ORAS) { FixedBall = Ball.Poke, Species = 410, Level = 20, Location = 190 }, // Shieldon
new(ORAS) { FixedBall = Ball.Poke, Species = 564, Level = 20, Location = 190 }, // Tirtouga
new(ORAS) { FixedBall = Ball.Poke, Species = 566, Level = 20, Location = 190 }, // Archen
new(ORAS) { FixedBall = Ball.Poke, Species = 696, Level = 20, Location = 190 }, // Tyrunt
new(ORAS) { FixedBall = Ball.Poke, Species = 698, Level = 20, Location = 190 }, // Amaura
// Hot Springs Eggs
new(ORAS) { Gift = true, Species = 360, Level = 1, EggLocation = 60004, Ability = OnlyFirst, EggCycles = 70 }, // Wynaut
new(ORAS) { Gift = true, Species = 175, Level = 1, EggLocation = 60004, Ability = OnlyFirst, EggCycles = 70 }, // Togepi
new(ORAS) { FixedBall = Ball.Poke, Species = 360, Level = 1, Location = 0, EggLocation = 60004, Ability = OnlyFirst, EggCycles = 70 }, // Wynaut
new(ORAS) { FixedBall = Ball.Poke, Species = 175, Level = 1, Location = 0, EggLocation = 60004, Ability = OnlyFirst, EggCycles = 70 }, // Togepi
// Gift
new(ORAS) { Species = 374, Level = 01, Location = 196, Ability = OnlyFirst, Gift = true, IVs = new(-1,-1,31,-1,-1,31) }, // Beldum
new(ORAS) { Species = 351, Level = 30, Location = 240, Ability = OnlyFirst, Gift = true, IVs = new(-1,-1,-1,-1,31,-1), CNT_Beauty = 100, Gender = 1, Nature = Nature.Lax }, // Castform
new(ORAS) { Species = 319, Level = 40, Location = 318, Ability = OnlyFirst, Gift = true, Gender = 1, Nature = Nature.Adamant }, // Sharpedo
new(ORAS) { Species = 323, Level = 40, Location = 318, Ability = OnlyFirst, Gift = true, Gender = 1, Nature = Nature.Quiet }, // Camerupt
new( AS) { Species = 380, Level = 30, Location = 320, Ability = OnlyFirst, Gift = true, FlawlessIVCount = 3 }, // Latias
new(OR ) { Species = 381, Level = 30, Location = 320, Ability = OnlyFirst, Gift = true, FlawlessIVCount = 3 }, // Latios
new(ORAS) { Species = 374, Level = 01, Location = 196, Ability = OnlyFirst, FixedBall = Ball.Poke, IVs = new(-1,-1,31,-1,-1,31) }, // Beldum
new(ORAS) { Species = 351, Level = 30, Location = 240, Ability = OnlyFirst, FixedBall = Ball.Poke, IVs = new(-1,-1,-1,-1,31,-1), CNT_Beauty = 100, Gender = 1, Nature = Nature.Lax }, // Castform
new(ORAS) { Species = 319, Level = 40, Location = 318, Ability = OnlyFirst, FixedBall = Ball.Poke, Gender = 1, Nature = Nature.Adamant }, // Sharpedo
new(ORAS) { Species = 323, Level = 40, Location = 318, Ability = OnlyFirst, FixedBall = Ball.Poke, Gender = 1, Nature = Nature.Quiet }, // Camerupt
// Stationary Legendary
new(ORAS) { Species = 377, Level = 40, Location = 278, FlawlessIVCount = 3 }, // Regirock
new(ORAS) { Species = 378, Level = 40, Location = 306, FlawlessIVCount = 3 }, // Regice
new(ORAS) { Species = 379, Level = 40, Location = 308, FlawlessIVCount = 3 }, // Registeel
new(ORAS) { Species = 486, Level = 50, Location = 306, FlawlessIVCount = 3 }, // Regigigas
new( AS) { Species = 382, Level = 45, Location = 296, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Kyogre
new(OR ) { Species = 383, Level = 45, Location = 296, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Groudon
new(ORAS) { Species = 384, Level = 70, Location = 316, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Rayquaza
new(ORAS) { Species = 386, Level = 80, Location = 316, Shiny = Shiny.Never, FlawlessIVCount = 3, FatefulEncounter = true }, // Deoxys
// Hoopa Rings
new( AS) { Species = 249, Level = 50, Location = 304, FlawlessIVCount = 3 }, // Lugia
new(OR ) { Species = 250, Level = 50, Location = 304, FlawlessIVCount = 3 }, // Ho-Oh
new( AS) { Species = 483, Level = 50, Location = 348, FlawlessIVCount = 3 }, // Dialga
new(OR ) { Species = 484, Level = 50, Location = 348, FlawlessIVCount = 3 }, // Palkia
new( AS) { Species = 644, Level = 50, Location = 340, FlawlessIVCount = 3 }, // Zekrom
new(OR ) { Species = 643, Level = 50, Location = 340, FlawlessIVCount = 3 }, // Reshiram
new( AS) { Species = 642, Level = 50, Location = 348, FlawlessIVCount = 3 }, // Thundurus
new(OR ) { Species = 641, Level = 50, Location = 348, FlawlessIVCount = 3 }, // Tornadus
new(ORAS) { Species = 243, Level = 50, Location = 334, FlawlessIVCount = 3 }, // Raikou
new(ORAS) { Species = 244, Level = 50, Location = 334, FlawlessIVCount = 3 }, // Entei
new(ORAS) { Species = 245, Level = 50, Location = 334, FlawlessIVCount = 3 }, // Suicune
@ -123,13 +106,6 @@ internal static class Encounters6AO
new(ORAS) { Species = 352, Level = 40, Location = 176, Gender = 1 }, // Kecleon @ Lavaridge
new(ORAS) { Species = 352, Level = 45, Location = 196, Ability = OnlyHidden }, // Kecleon @ Mossdeep City
// Eon Ticket Lati@s
new( AS) { Species = 381, Level = 30, Location = 320, FlawlessIVCount = 3 }, // Latios
new(OR ) { Species = 380, Level = 30, Location = 320, FlawlessIVCount = 3 }, // Latias
// Stationary
new( AS) { Species = 101, Level = 40, Location = 292 }, // Electrode
new(OR ) { Species = 101, Level = 40, Location = 314 }, // Electrode
new(ORAS) { Species = 100, Level = 20, Location = 302 }, // Voltorb @ Route 119
new(ORAS) { Species = 442, Level = 50, Location = 304 }, // Spiritomb @ Route 120
@ -150,18 +126,39 @@ internal static class Encounters6AO
BaseCosplay, // Cosplay, same 3 level up moves.
};
private static readonly EncounterStatic6[] Encounter_AO = Encounter_AO_Regular;
internal static readonly EncounterStatic6[] StaticA =
{
new( AS) { Species = 380, Level = 30, Location = 320, Ability = OnlyFirst, FixedBall = Ball.Poke, FlawlessIVCount = 3 }, // Latias
new( AS) { Species = 382, Level = 45, Location = 296, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Kyogre
new( AS) { Species = 249, Level = 50, Location = 304, FlawlessIVCount = 3 }, // Lugia
new( AS) { Species = 483, Level = 50, Location = 348, FlawlessIVCount = 3 }, // Dialga
new( AS) { Species = 644, Level = 50, Location = 340, FlawlessIVCount = 3 }, // Zekrom
new( AS) { Species = 642, Level = 50, Location = 348, FlawlessIVCount = 3 }, // Thundurus
new( AS) { Species = 381, Level = 30, Location = 320, FlawlessIVCount = 3 }, // Latios
new( AS) { Species = 101, Level = 40, Location = 292 }, // Electrode
};
internal static readonly EncounterStatic6[] StaticO =
{
new(OR ) { Species = 381, Level = 30, Location = 320, Ability = OnlyFirst, FixedBall = Ball.Poke, FlawlessIVCount = 3 }, // Latios
new(OR ) { Species = 383, Level = 45, Location = 296, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Groudon
new(OR ) { Species = 250, Level = 50, Location = 304, FlawlessIVCount = 3 }, // Ho-Oh
new(OR ) { Species = 484, Level = 50, Location = 348, FlawlessIVCount = 3 }, // Palkia
new(OR ) { Species = 643, Level = 50, Location = 340, FlawlessIVCount = 3 }, // Reshiram
new(OR ) { Species = 641, Level = 50, Location = 348, FlawlessIVCount = 3 }, // Tornadus
new(OR ) { Species = 380, Level = 30, Location = 320, FlawlessIVCount = 3 }, // Latias
new(OR ) { Species = 101, Level = 40, Location = 314 }, // Electrode
};
internal static readonly EncounterStatic6[] Encounter_AO = Encounter_AO_Regular;
#endregion
#region Trade Tables
internal static readonly EncounterTrade6[] TradeGift_AO =
{
new(ORAS, 01,3,05,040) { Species = 296, Level = 09, Ability = OnlySecond, TID16 = 30724, IVs = new(-1,31,-1,-1,-1,-1), Gender = 0, Nature = Nature.Brave }, // Makuhita
new(ORAS, 34,3,13,176) { Species = 300, Level = 30, Ability = OnlyFirst, TID16 = 03239, IVs = new(-1,-1,-1,31,-1,-1), Gender = 1, Nature = Nature.Naughty }, // Skitty
new(ORAS, 07,4,10,319) { Species = 222, Level = 50, Ability = OnlyHidden, TID16 = 00325, IVs = new(31,-1,-1,-1,-1,31), Gender = 1, Nature = Nature.Calm }, // Corsola
new(TradeNames, 00, ORAS, 01,3,05,040) { Species = 296, Level = 09, Ability = OnlySecond, ID32 = 30724, Gender = 0, OTGender = 0, IVs = new(-1,31,-1,-1,-1,-1), Nature = Nature.Brave }, // Makuhita
new(TradeNames, 01, ORAS, 34,3,13,176) { Species = 300, Level = 30, Ability = OnlyFirst, ID32 = 03239, Gender = 1, OTGender = 1, IVs = new(-1,-1,-1,31,-1,-1), Nature = Nature.Naughty }, // Skitty
new(TradeNames, 02, ORAS, 07,4,10,319) { Species = 222, Level = 50, Ability = OnlyHidden, ID32 = 00325, Gender = 1, OTGender = 1, IVs = new(31,-1,-1,-1,-1,31), Nature = Nature.Calm }, // Corsola
};
#endregion
internal static readonly EncounterStatic6[] StaticA = GetEncounters(Encounter_AO, AS);
internal static readonly EncounterStatic6[] StaticO = GetEncounters(Encounter_AO, OR);
}

View file

@ -0,0 +1,106 @@
using static PKHeX.Core.EncounterUtil;
using static PKHeX.Core.GameVersion;
using static PKHeX.Core.AbilityPermission;
namespace PKHeX.Core;
/// <summary>
/// Generation 6 Encounters
/// </summary>
internal static class Encounters6XY
{
private static readonly EncounterArea6XY FriendSafari = new();
internal static readonly EncounterArea6XY[] SlotsX = EncounterArea6XY.GetAreas(Get("x", "xy"), X, FriendSafari);
internal static readonly EncounterArea6XY[] SlotsY = EncounterArea6XY.GetAreas(Get("y", "xy"), Y, FriendSafari);
private const string tradeXY = "tradexy";
private static readonly string[][] TradeNames = Util.GetLanguageStrings8(tradeXY);
#region Static Encounter/Gift Tables
internal static readonly EncounterStatic6[] Encounter_XY =
{
// Kalos Starters @ Aquacorde Town
new(XY) { FixedBall = Ball.Poke, Species = 650, Level = 5, Location = 10 }, // Chespin
new(XY) { FixedBall = Ball.Poke, Species = 653, Level = 5, Location = 10 }, // Fennekin
new(XY) { FixedBall = Ball.Poke, Species = 656, Level = 5, Location = 10 }, // Froakie
// Kanto Starters @ Lumiose City
new(XY) { FixedBall = Ball.Poke, Species = 001, Level = 10, Location = 22 }, // Bulbasaur
new(XY) { FixedBall = Ball.Poke, Species = 004, Level = 10, Location = 22 }, // Charmander
new(XY) { FixedBall = Ball.Poke, Species = 007, Level = 10, Location = 22 }, // Squirtle
// Fossils @ Ambrette Town
new(XY) { FixedBall = Ball.Poke, Species = 138, Level = 20, Location = 44 }, // Omanyte
new(XY) { FixedBall = Ball.Poke, Species = 140, Level = 20, Location = 44 }, // Kabuto
new(XY) { FixedBall = Ball.Poke, Species = 142, Level = 20, Location = 44 }, // Aerodactyl
new(XY) { FixedBall = Ball.Poke, Species = 345, Level = 20, Location = 44 }, // Lileep
new(XY) { FixedBall = Ball.Poke, Species = 347, Level = 20, Location = 44 }, // Anorith
new(XY) { FixedBall = Ball.Poke, Species = 408, Level = 20, Location = 44 }, // Cranidos
new(XY) { FixedBall = Ball.Poke, Species = 410, Level = 20, Location = 44 }, // Shieldon
new(XY) { FixedBall = Ball.Poke, Species = 564, Level = 20, Location = 44 }, // Tirtouga
new(XY) { FixedBall = Ball.Poke, Species = 566, Level = 20, Location = 44 }, // Archen
new(XY) { FixedBall = Ball.Poke, Species = 696, Level = 20, Location = 44 }, // Tyrunt
new(XY) { FixedBall = Ball.Poke, Species = 698, Level = 20, Location = 44 }, // Amaura
// Gift
new(XY) { FixedBall = Ball.Poke, Species = 448, Level = 32, Location = 60, Ability = OnlyFirst, IVs = new(06,25,16,31,25,19), Nature = Nature.Hasty, Gender = 0, Shiny = Shiny.Never }, // Lucario
new(XY) { FixedBall = Ball.Poke, Species = 131, Level = 30, Location = 62, Ability = OnlyFirst, IVs = new(31,20,20,20,20,20), Nature = Nature.Docile }, // Lapras
// Stationary
new(XY) { Species = 143, Level = 15, Location = 038, Shiny = Shiny.Never }, // Snorlax
// Shaking Trash Cans @ Lost Hotel
new(XY) { Species = 568, Level = 35, Location = 142 }, // Trubbish
new(XY) { Species = 569, Level = 36, Location = 142 }, // Garbodor
new(XY) { Species = 569, Level = 37, Location = 142 }, // Garbodor
new(XY) { Species = 569, Level = 38, Location = 142 }, // Garbodor
new(XY) { Species = 479, Level = 38, Location = 142 }, // Rotom
// Shaking Trash Cans @ Pokemon Village
new(XY) { Species = 569, Level = 46, Location = 98 }, // Garbodor
new(XY) { Species = 569, Level = 47, Location = 98 }, // Garbodor
new(XY) { Species = 569, Level = 48, Location = 98 }, // Garbodor
new(XY) { Species = 569, Level = 49, Location = 98 }, // Garbodor
new(XY) { Species = 569, Level = 50, Location = 98 }, // Garbodor
new(XY) { Species = 354, Level = 46, Location = 98 }, // Banette
new(XY) { Species = 354, Level = 47, Location = 98 }, // Banette
new(XY) { Species = 354, Level = 48, Location = 98 }, // Banette
new(XY) { Species = 354, Level = 49, Location = 98 }, // Banette
new(XY) { Species = 354, Level = 50, Location = 98 }, // Banette
// Stationary Legendary
new(XY) { Species = 718, Level = 70, Location = 140, Ability = OnlyFirst, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Zygarde
new(XY) { Species = 150, Level = 70, Location = 168, Ability = OnlyFirst, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Mewtwo
new(XY) { Species = 144, Level = 70, Location = 146, Ability = OnlyFirst, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Articuno
new(XY) { Species = 145, Level = 70, Location = 146, Ability = OnlyFirst, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Zapdos
new(XY) { Species = 146, Level = 70, Location = 146, Ability = OnlyFirst, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Moltres
};
internal static readonly EncounterStatic6[] StaticX =
{
new(X ) { Species = 716, Level = 50, Location = 138, Ability = OnlyFirst, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Xerneas
};
internal static readonly EncounterStatic6[] StaticY =
{
new( Y) { Species = 717, Level = 50, Location = 138, Ability = OnlyFirst, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Yveltal
};
#endregion
#region Trade Tables
internal static readonly EncounterTrade6[] TradeGift_XY =
{
new(TradeNames, 00, XY, 01,3,23,049) { Species = 129, Level = 05, Ability = OnlyFirst, ID32 = 44285, Gender = 0, OTGender = 0, IVs = new(-1,31,-1,-1,31,-1), Nature = Nature.Adamant }, // Magikarp
new(TradeNames, 01, XY, 10,3,00,000) { Species = 133, Level = 05, Ability = OnlyFirst, ID32 = 29294, Gender = 1, OTGender = 1, IVs = default, Nature = Nature.Docile }, // Eevee
new(TradeNames, 02, XY, 15,4,13,017) { Species = 083, Level = 10, Ability = OnlyFirst, ID32 = 00185, Gender = 0, OTGender = 0, IVs = new(-1,-1,-1,31,-1,-1), Nature = Nature.Jolly }, // Farfetch'd
new(TradeNames, 03, XY, 17,5,08,025) { Species = 208, Level = 20, Ability = OnlyFirst, ID32 = 19250, Gender = 1, OTGender = 0, IVs = new(-1,-1,31,-1,-1,-1), Nature = Nature.Impish }, // Steelix
new(TradeNames, 04, XY, 18,7,20,709) { Species = 625, Level = 50, Ability = OnlyFirst, ID32 = 03447, Gender = 0, OTGender = 1, IVs = new(-1,31,-1,-1,-1,-1), Nature = Nature.Adamant }, // Bisharp
new(TradeNames, 05, XY, 02,3,11,005) { Species = 656, Level = 05, Ability = OnlyFirst, ID32 = 00037, Gender = 0, OTGender = 1, IVs = new(20,20,20,31,20,20), Nature = Nature.Jolly }, // Froakie
new(TradeNames, 06, XY, 02,3,09,005) { Species = 650, Level = 05, Ability = OnlyFirst, ID32 = 00037, Gender = 0, OTGender = 1, IVs = new(20,31,20,20,20,20), Nature = Nature.Adamant }, // Chespin
new(TradeNames, 07, XY, 02,3,18,005) { Species = 653, Level = 05, Ability = OnlyFirst, ID32 = 00037, Gender = 0, OTGender = 1, IVs = new(20,20,20,20,31,20), Nature = Nature.Modest }, // Fennekin
new(TradeNames, 08, XY, 51,4,04,033) { Species = 280, Level = 05, Ability = OnlyFirst, ID32 = 37110, Gender = 1, OTGender = 1, IVs = new(20,20,20,31,31,20), Nature = Nature.Modest, IsFixedNickname = false }, // Ralts
};
#endregion
}

View file

@ -1,102 +0,0 @@
using static PKHeX.Core.EncounterUtil;
using static PKHeX.Core.GameVersion;
using static PKHeX.Core.AbilityPermission;
namespace PKHeX.Core;
/// <summary>
/// Generation 6 Encounters
/// </summary>
internal static class Encounters6XY
{
private static readonly EncounterArea6XY FriendSafari = new();
internal static readonly EncounterArea6XY[] SlotsX = EncounterArea6XY.GetAreas(Get("x", "xy"), X, FriendSafari);
internal static readonly EncounterArea6XY[] SlotsY = EncounterArea6XY.GetAreas(Get("y", "xy"), Y, FriendSafari);
static Encounters6XY() => MarkEncounterTradeStrings(TradeGift_XY, TradeXY);
private const string tradeXY = "tradexy";
private static readonly string[][] TradeXY = Util.GetLanguageStrings8(tradeXY);
#region Static Encounter/Gift Tables
private static readonly EncounterStatic6[] Encounter_XY =
{
// Kalos Starters @ Aquacorde Town
new(XY) { Gift = true, Species = 650, Level = 5, Location = 10 }, // Chespin
new(XY) { Gift = true, Species = 653, Level = 5, Location = 10 }, // Fennekin
new(XY) { Gift = true, Species = 656, Level = 5, Location = 10 }, // Froakie
// Kanto Starters @ Lumiose City
new(XY) { Gift = true, Species = 1, Level = 10, Location = 22 }, // Bulbasaur
new(XY) { Gift = true, Species = 4, Level = 10, Location = 22 }, // Charmander
new(XY) { Gift = true, Species = 7, Level = 10, Location = 22 }, // Squirtle
// Fossils @ Ambrette Town
new(XY) { Gift = true, Species = 138, Level = 20, Location = 44 }, // Omanyte
new(XY) { Gift = true, Species = 140, Level = 20, Location = 44 }, // Kabuto
new(XY) { Gift = true, Species = 142, Level = 20, Location = 44 }, // Aerodactyl
new(XY) { Gift = true, Species = 345, Level = 20, Location = 44 }, // Lileep
new(XY) { Gift = true, Species = 347, Level = 20, Location = 44 }, // Anorith
new(XY) { Gift = true, Species = 408, Level = 20, Location = 44 }, // Cranidos
new(XY) { Gift = true, Species = 410, Level = 20, Location = 44 }, // Shieldon
new(XY) { Gift = true, Species = 564, Level = 20, Location = 44 }, // Tirtouga
new(XY) { Gift = true, Species = 566, Level = 20, Location = 44 }, // Archen
new(XY) { Gift = true, Species = 696, Level = 20, Location = 44 }, // Tyrunt
new(XY) { Gift = true, Species = 698, Level = 20, Location = 44 }, // Amaura
// Gift
new(XY) { Gift = true, Species = 448, Level = 32, Location = 60, Ability = OnlyFirst, IVs = new(06,25,16,31,25,19), Nature = Nature.Hasty, Gender = 0, Shiny = Shiny.Never }, // Lucario
new(XY) { Gift = true, Species = 131, Level = 30, Location = 62, Ability = OnlyFirst, IVs = new(31,20,20,20,20,20), Nature = Nature.Docile }, // Lapras
// Stationary
new(XY) { Species = 143, Level = 15, Location = 038, Shiny = Shiny.Never }, // Snorlax
// Shaking Trash Cans @ Lost Hotel
new(XY) { Species = 568, Level = 35, Location = 142 }, // Trubbish
new(XY) { Species = 569, Level = 36, Location = 142 }, // Garbodor
new(XY) { Species = 569, Level = 37, Location = 142 }, // Garbodor
new(XY) { Species = 569, Level = 38, Location = 142 }, // Garbodor
new(XY) { Species = 479, Level = 38, Location = 142 }, // Rotom
// Shaking Trash Cans @ Pokemon Village
new(XY) { Species = 569, Level = 46, Location = 98 }, // Garbodor
new(XY) { Species = 569, Level = 47, Location = 98 }, // Garbodor
new(XY) { Species = 569, Level = 48, Location = 98 }, // Garbodor
new(XY) { Species = 569, Level = 49, Location = 98 }, // Garbodor
new(XY) { Species = 569, Level = 50, Location = 98 }, // Garbodor
new(XY) { Species = 354, Level = 46, Location = 98 }, // Banette
new(XY) { Species = 354, Level = 47, Location = 98 }, // Banette
new(XY) { Species = 354, Level = 48, Location = 98 }, // Banette
new(XY) { Species = 354, Level = 49, Location = 98 }, // Banette
new(XY) { Species = 354, Level = 50, Location = 98 }, // Banette
// Stationary Legendary
new(X ) { Species = 716, Level = 50, Location = 138, Ability = OnlyFirst, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Xerneas
new( Y) { Species = 717, Level = 50, Location = 138, Ability = OnlyFirst, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Yveltal
new(XY) { Species = 718, Level = 70, Location = 140, Ability = OnlyFirst, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Zygarde
new(XY) { Species = 150, Level = 70, Location = 168, Ability = OnlyFirst, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Mewtwo
new(XY) { Species = 144, Level = 70, Location = 146, Ability = OnlyFirst, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Articuno
new(XY) { Species = 145, Level = 70, Location = 146, Ability = OnlyFirst, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Zapdos
new(XY) { Species = 146, Level = 70, Location = 146, Ability = OnlyFirst, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Moltres
};
#endregion
#region Trade Tables
internal static readonly EncounterTrade6[] TradeGift_XY =
{
new(XY, 01,3,23,049) { Species = 129, Level = 05, Ability = OnlyFirst, TID16 = 44285, IVs = new(-1,31,-1,-1,31,-1), Gender = 0, Nature = Nature.Adamant }, // Magikarp
new(XY, 10,3,00,000) { Species = 133, Level = 05, Ability = OnlyFirst, TID16 = 29294, Gender = 1, Nature = Nature.Docile }, // Eevee
new(XY, 15,4,13,017) { Species = 083, Level = 10, Ability = OnlyFirst, TID16 = 00185, IVs = new(-1,-1,-1,31,-1,-1), Gender = 0, Nature = Nature.Jolly }, // Farfetch'd
new(XY, 17,5,08,025) { Species = 208, Level = 20, Ability = OnlyFirst, TID16 = 19250, IVs = new(-1,-1,31,-1,-1,-1), Gender = 1, Nature = Nature.Impish }, // Steelix
new(XY, 18,7,20,709) { Species = 625, Level = 50, Ability = OnlyFirst, TID16 = 03447, IVs = new(-1,31,-1,-1,-1,-1), Gender = 0, Nature = Nature.Adamant }, // Bisharp
new(XY, 02,3,11,005) { Species = 656, Level = 05, Ability = OnlyFirst, TID16 = 00037, IVs = new(20,20,20,31,20,20), Gender = 0, Nature = Nature.Jolly }, // Froakie
new(XY, 02,3,09,005) { Species = 650, Level = 05, Ability = OnlyFirst, TID16 = 00037, IVs = new(20,31,20,20,20,20), Gender = 0, Nature = Nature.Adamant }, // Chespin
new(XY, 02,3,18,005) { Species = 653, Level = 05, Ability = OnlyFirst, TID16 = 00037, IVs = new(20,20,20,20,31,20), Gender = 0, Nature = Nature.Modest }, // Fennekin
new(XY, 51,4,04,033) { Species = 280, Level = 05, Ability = OnlyFirst, TID16 = 37110, IVs = new(20,20,20,31,31,20), Gender = 1, Nature = Nature.Modest, IsNicknamed = false }, // Ralts
};
#endregion
internal static readonly EncounterStatic6[] StaticX = GetEncounters(Encounter_XY, X);
internal static readonly EncounterStatic6[] StaticY = GetEncounters(Encounter_XY, Y);
}

View file

@ -8,7 +8,7 @@ internal static class Encounters7GG
internal static readonly EncounterArea7b[] SlotsGP = EncounterArea7b.GetAreas(Get("gp", "gg"), GP);
internal static readonly EncounterArea7b[] SlotsGE = EncounterArea7b.GetAreas(Get("ge", "gg"), GE);
private static readonly EncounterStatic7b[] Encounter_GG =
internal static readonly EncounterStatic7b[] Encounter_GG =
{
// encounters
new(GG) { Species = 144, Level = 50, Location = 44, FlawlessIVCount = 3 }, // Articuno @ Seafoam Islands
@ -21,24 +21,31 @@ internal static class Encounters7GG
// collision new EncounterStatic7b { Species = 101, Level = 42, Location = 42, FlawlessIVCount = 3 }, // Electrode @ Power Plant
// gifts
new(GP) { Species = 025, Level = 05, Location = 28, Gift = true, IVs = new(31,31,31,31,31,31), Shiny = Shiny.Never, Form = 8 }, // Pikachu @ Pallet Town
new(GE) { Species = 133, Level = 05, Location = 28, Gift = true, IVs = new(31,31,31,31,31,31), Shiny = Shiny.Never, Form = 1 }, // Eevee @ Pallet Town
new(GG) { Species = 129, Level = 05, Location = 06, Gift = true, IVs = new(30,31,25,30,25,25) }, // Magikarp @ Route 4
new(GG) { Species = 129, Level = 05, Location = 06, FixedBall = Ball.Poke, IVs = new(30,31,25,30,25,25) }, // Magikarp @ Route 4
// unused new EncounterStatic7b { Species = 133, Level = 30, Location = 34, Gift = true }, // Eevee @ Celadon City
new(GG) { Species = 131, Level = 34, Location = 52, Gift = true, IVs = new(31,25,25,25,30,30) }, // Lapras @ Saffron City (Silph Co. Employee, inside)
new(GG) { Species = 106, Level = 30, Location = 38, Gift = true, IVs = new(25,30,25,31,25,30) }, // Hitmonlee @ Saffron City (Karate Master)
new(GG) { Species = 107, Level = 30, Location = 38, Gift = true, IVs = new(25,31,30,25,25,30) }, // Hitmonchan @ Saffron City (Karate Master)
new(GG) { Species = 140, Level = 44, Location = 36, Gift = true, FlawlessIVCount = 3 }, // Kabuto @ Cinnabar Island (Cinnabar Pokémon Lab)
new(GG) { Species = 138, Level = 44, Location = 36, Gift = true, FlawlessIVCount = 3 }, // Omanyte @ Cinnabar Island (Cinnabar Pokémon Lab)
new(GG) { Species = 142, Level = 44, Location = 36, Gift = true, FlawlessIVCount = 3 }, // Aerodactyl @ Cinnabar Island (Cinnabar Pokémon Lab)
new(GG) { Species = 001, Level = 12, Location = 31, Gift = true, IVs = new(31,25,30,25,25,30) }, // Bulbasaur @ Cerulean City
new(GG) { Species = 004, Level = 14, Location = 26, Gift = true, IVs = new(25,30,25,31,30,25) }, // Charmander @ Route 24
new(GG) { Species = 007, Level = 16, Location = 33, Gift = true, IVs = new(25,25,30,25,31,30) }, // Squirtle @ Vermillion City
new(GG) { Species = 137, Level = 34, Location = 38, Gift = true, IVs = new(25,25,30,25,31,30) }, // Porygon @ Saffron City (Silph Co. Employee, outside)
new(GP) { Species = 053, Level = 16, Location = 33, Gift = true, IVs = new(30,30,25,31,25,25) }, // Persian @ Vermillion City (Outside Fan Club)
new(GE) { Species = 059, Level = 16, Location = 33, Gift = true, IVs = new(25,30,25,31,30,25) }, // Arcanine @ Vermillion City (Outside Fan Club)
new(GG) { Species = 131, Level = 34, Location = 52, FixedBall = Ball.Poke, IVs = new(31,25,25,25,30,30) }, // Lapras @ Saffron City (Silph Co. Employee, inside)
new(GG) { Species = 106, Level = 30, Location = 38, FixedBall = Ball.Poke, IVs = new(25,30,25,31,25,30) }, // Hitmonlee @ Saffron City (Karate Master)
new(GG) { Species = 107, Level = 30, Location = 38, FixedBall = Ball.Poke, IVs = new(25,31,30,25,25,30) }, // Hitmonchan @ Saffron City (Karate Master)
new(GG) { Species = 140, Level = 44, Location = 36, FixedBall = Ball.Poke, FlawlessIVCount = 3 }, // Kabuto @ Cinnabar Island (Cinnabar Pokémon Lab)
new(GG) { Species = 138, Level = 44, Location = 36, FixedBall = Ball.Poke, FlawlessIVCount = 3 }, // Omanyte @ Cinnabar Island (Cinnabar Pokémon Lab)
new(GG) { Species = 142, Level = 44, Location = 36, FixedBall = Ball.Poke, FlawlessIVCount = 3 }, // Aerodactyl @ Cinnabar Island (Cinnabar Pokémon Lab)
new(GG) { Species = 001, Level = 12, Location = 31, FixedBall = Ball.Poke, IVs = new(31,25,30,25,25,30) }, // Bulbasaur @ Cerulean City
new(GG) { Species = 004, Level = 14, Location = 26, FixedBall = Ball.Poke, IVs = new(25,30,25,31,30,25) }, // Charmander @ Route 24
new(GG) { Species = 007, Level = 16, Location = 33, FixedBall = Ball.Poke, IVs = new(25,25,30,25,31,30) }, // Squirtle @ Vermillion City
new(GG) { Species = 137, Level = 34, Location = 38, FixedBall = Ball.Poke, IVs = new(25,25,30,25,31,30) }, // Porygon @ Saffron City (Silph Co. Employee, outside)
};
internal static readonly EncounterStatic7b[] StaticGP =
{
new(GP) { Species = 025, Level = 05, Location = 28, FixedBall = Ball.Poke, IVs = new(31,31,31,31,31,31), Shiny = Shiny.Never, Form = 8 }, // Pikachu @ Pallet Town
new(GP) { Species = 053, Level = 16, Location = 33, FixedBall = Ball.Poke, IVs = new(30,30,25,31,25,25) }, // Persian @ Vermillion City (Outside Fan Club)
};
internal static readonly EncounterStatic7b[] StaticGE =
{
new(GE) { Species = 133, Level = 05, Location = 28, FixedBall = Ball.Poke, IVs = new(31,31,31,31,31,31), Shiny = Shiny.Never, Form = 1 }, // Eevee @ Pallet Town
new(GE) { Species = 059, Level = 16, Location = 33, FixedBall = Ball.Poke, IVs = new(25,30,25,31,30,25) }, // Arcanine @ Vermillion City (Outside Fan Club)
};
private static readonly string[] T1 = { string.Empty, "ミニコ", "Tatianna", "BarbaRatatta", "Addoloratta", "Barbaratt", string.Empty, "Tatiana", "미니꼬", "小幂妮", "小幂妮" };
@ -53,18 +60,23 @@ internal static class Encounters7GG
internal static readonly EncounterTrade7b[] TradeGift_GG =
{
// Random candy values! They can be zero so no impact on legality even though statistically rare.
new(GG) { Species = 019, Form = 1, Level = 12, TrainerNames = T1, TID7 = 121106, OTGender = 1, IVs = new(31,31,-1,-1,-1,-1) }, // Rattata @ Cerulean City, AV rand [0-5)
new(GP) { Species = 027, Form = 1, Level = 27, TrainerNames = T2, TID7 = 703019, OTGender = 0, IVs = new(-1,31,31,-1,-1,-1) }, // Sandshrew @ Celadon City, AV rand [0-5)
new(GE) { Species = 037, Form = 1, Level = 27, TrainerNames = T2, TID7 = 703019, OTGender = 0, IVs = new(-1,-1,-1,31,31,-1) }, // Vulpix @ Celadon City, AV rand [0-5)
new(GG) { Species = 050, Form = 1, Level = 25, TrainerNames = T3, TID7 = 520159, OTGender = 1, IVs = new(-1,31,-1,31,-1,-1) }, // Diglett @ Lavender Town, AV rand [0-5)
new(GE) { Species = 052, Form = 1, Level = 44, TrainerNames = T4, TID7 = 000219, OTGender = 0, IVs = new(31,-1,-1,31,-1,-1) }, // Meowth @ Cinnabar Island, AV rand [0-10)
new(GP) { Species = 088, Form = 1, Level = 44, TrainerNames = T4, TID7 = 000219, OTGender = 0, IVs = new(31,31,-1,-1,-1,-1) }, // Grimer @ Cinnabar Island, AV rand [0-10)
new(GG) { Species = 026, Form = 1, Level = 30, TrainerNames = T5, TID7 = 940711, OTGender = 1, IVs = new(-1,-1,-1,31,31,-1) }, // Raichu @ Saffron City, AV rand [0-10)
new(GG) { Species = 105, Form = 1, Level = 38, TrainerNames = T6, TID7 = 102595, OTGender = 0, IVs = new(-1,31,31,-1,-1,-1) }, // Marowak @ Fuchsia City, AV rand [0-10)
new(GG) { Species = 103, Form = 1, Level = 46, TrainerNames = T7, TID7 = 060310, OTGender = 0, IVs = new(-1,31,-1,-1,31,-1) }, // Exeggutor @ Indigo Plateau, AV rand [0-15)
new(GG) { Species = 074, Form = 1, Level = 16, TrainerNames = T8, TID7 = 551873, OTGender = 0, IVs = new(31,31,-1,-1,-1,-1) }, // Geodude @ Vermilion City, AV rand [0-5)
new(GG) { Species = 019, Form = 1, Level = 12, TrainerNames = T1, ID32 = 121106, OTGender = 1, IVs = new(31,31,-1,-1,-1,-1) }, // Rattata @ Cerulean City, AV rand [0-5)
new(GG) { Species = 050, Form = 1, Level = 25, TrainerNames = T3, ID32 = 520159, OTGender = 1, IVs = new(-1,31,-1,31,-1,-1) }, // Diglett @ Lavender Town, AV rand [0-5)
new(GG) { Species = 026, Form = 1, Level = 30, TrainerNames = T5, ID32 = 940711, OTGender = 1, IVs = new(-1,-1,-1,31,31,-1) }, // Raichu @ Saffron City, AV rand [0-10)
new(GG) { Species = 105, Form = 1, Level = 38, TrainerNames = T6, ID32 = 102595, OTGender = 0, IVs = new(-1,31,31,-1,-1,-1) }, // Marowak @ Fuchsia City, AV rand [0-10)
new(GG) { Species = 103, Form = 1, Level = 46, TrainerNames = T7, ID32 = 060310, OTGender = 0, IVs = new(-1,31,-1,-1,31,-1) }, // Exeggutor @ Indigo Plateau, AV rand [0-15)
new(GG) { Species = 074, Form = 1, Level = 16, TrainerNames = T8, ID32 = 551873, OTGender = 0, IVs = new(31,31,-1,-1,-1,-1) }, // Geodude @ Vermilion City, AV rand [0-5)
};
internal static readonly EncounterStatic7b[] StaticGP = GetEncounters(Encounter_GG, GP);
internal static readonly EncounterStatic7b[] StaticGE = GetEncounters(Encounter_GG, GE);
internal static readonly EncounterTrade7b[] TradeGift_GP =
{
new(GP) { Species = 027, Form = 1, Level = 27, TrainerNames = T2, ID32 = 703019, OTGender = 0, IVs = new(-1,31,31,-1,-1,-1) }, // Sandshrew @ Celadon City, AV rand [0-5)
new(GP) { Species = 088, Form = 1, Level = 44, TrainerNames = T4, ID32 = 000219, OTGender = 0, IVs = new(31,31,-1,-1,-1,-1) }, // Grimer @ Cinnabar Island, AV rand [0-10)
};
internal static readonly EncounterTrade7b[] TradeGift_GE =
{
new(GE) { Species = 037, Form = 1, Level = 27, TrainerNames = T2, ID32 = 703019, OTGender = 0, IVs = new(-1,-1,-1,31,31,-1) }, // Vulpix @ Celadon City, AV rand [0-5)
new(GE) { Species = 052, Form = 1, Level = 44, TrainerNames = T4, ID32 = 000219, OTGender = 0, IVs = new(31,-1,-1,31,-1,-1) }, // Meowth @ Cinnabar Island, AV rand [0-10)
};
}

View file

@ -12,55 +12,53 @@ internal static class Encounters7SM
internal static readonly EncounterArea7[] SlotsSN = EncounterArea7.GetAreas(Get("sn", "sm"), SN);
internal static readonly EncounterArea7[] SlotsMN = EncounterArea7.GetAreas(Get("mn", "sm"), MN);
static Encounters7SM() => MarkEncounterTradeStrings(TradeGift_SM, TradeSM);
private const string tradeSM = "tradesm";
private static readonly string[][] TradeNames = Util.GetLanguageStrings10(tradeSM);
private static readonly EncounterStatic7[] Encounter_SM = // @ a\1\5\5
public static readonly EncounterStatic7[] StaticSM = // @ a\1\5\5
{
// Gifts - 0.bin
new(SM) { Gift = true, Species = 722, Level = 5, Location = 024 }, // Rowlet
new(SM) { Gift = true, Species = 725, Level = 5, Location = 024 }, // Litten
new(SM) { Gift = true, Species = 728, Level = 5, Location = 024 }, // Popplio
new(SM) { Gift = true, Species = 138, Level = 15, Location = 058 }, // Omanyte
new(SM) { Gift = true, Species = 140, Level = 15, Location = 058 }, // Kabuto
// new(SM) { Gift = true, Species = 142, Level = 15, Location = 058 }, // Aerodactyl
new(SM) { Gift = true, Species = 345, Level = 15, Location = 058 }, // Lileep
new(SM) { Gift = true, Species = 347, Level = 15, Location = 058 }, // Anorith
new(SM) { Gift = true, Species = 408, Level = 15, Location = 058 }, // Cranidos
new(SM) { Gift = true, Species = 410, Level = 15, Location = 058 }, // Shieldon
new(SM) { Gift = true, Species = 564, Level = 15, Location = 058 }, // Tirtouga
new(SM) { Gift = true, Species = 566, Level = 15, Location = 058 }, // Archen
new(SM) { Gift = true, Species = 696, Level = 15, Location = 058 }, // Tyrunt
new(SM) { Gift = true, Species = 698, Level = 15, Location = 058 }, // Amaura
new(SM) { Gift = true, Species = 137, Level = 30, Location = 116 }, // Porygon @ Route 15
new(SM) { Gift = true, Species = 133, Level = 1, EggLocation = 60002 }, // Eevee @ Nursery helpers
new(SM) { Gift = true, Species = 772, Level = 40, Location = 188, FlawlessIVCount = 3 }, // Type: Null
new(SN) { Gift = true, Species = 789, Level = 5, Location = 142, Shiny = Shiny.Never, Ability = OnlySecond, FlawlessIVCount = 3 }, // Cosmog
new(MN) { Gift = true, Species = 789, Level = 5, Location = 144, Shiny = Shiny.Never, Ability = OnlySecond, FlawlessIVCount = 3 }, // Cosmog
new(SM) { Gift = true, Species = 142, Level = 40, Location = 172 }, // Aerodactyl @ Seafolk Village
new(SM) { FixedBall = Ball.Poke, Species = 722, Level = 5, Location = 024 }, // Rowlet
new(SM) { FixedBall = Ball.Poke, Species = 725, Level = 5, Location = 024 }, // Litten
new(SM) { FixedBall = Ball.Poke, Species = 728, Level = 5, Location = 024 }, // Popplio
new(SM) { FixedBall = Ball.Poke, Species = 138, Level = 15, Location = 058 }, // Omanyte
new(SM) { FixedBall = Ball.Poke, Species = 140, Level = 15, Location = 058 }, // Kabuto
// new(SM) { FixedBall = Ball.Poke, Species = 142, Level = 15, Location = 058 }, // Aerodactyl
new(SM) { FixedBall = Ball.Poke, Species = 345, Level = 15, Location = 058 }, // Lileep
new(SM) { FixedBall = Ball.Poke, Species = 347, Level = 15, Location = 058 }, // Anorith
new(SM) { FixedBall = Ball.Poke, Species = 408, Level = 15, Location = 058 }, // Cranidos
new(SM) { FixedBall = Ball.Poke, Species = 410, Level = 15, Location = 058 }, // Shieldon
new(SM) { FixedBall = Ball.Poke, Species = 564, Level = 15, Location = 058 }, // Tirtouga
new(SM) { FixedBall = Ball.Poke, Species = 566, Level = 15, Location = 058 }, // Archen
new(SM) { FixedBall = Ball.Poke, Species = 696, Level = 15, Location = 058 }, // Tyrunt
new(SM) { FixedBall = Ball.Poke, Species = 698, Level = 15, Location = 058 }, // Amaura
new(SM) { FixedBall = Ball.Poke, Species = 137, Level = 30, Location = 116 }, // Porygon @ Route 15
new(SM) { FixedBall = Ball.Poke, Species = 133, Level = 1, EggLocation = 60002 }, // Eevee @ Nursery helpers
new(SM) { FixedBall = Ball.Poke, Species = 772, Level = 40, Location = 188, FlawlessIVCount = 3 }, // Type: Null
new(SN) { FixedBall = Ball.Poke, Species = 789, Level = 5, Location = 142, Shiny = Shiny.Never, Ability = OnlySecond, FlawlessIVCount = 3 }, // Cosmog
new(MN) { FixedBall = Ball.Poke, Species = 789, Level = 5, Location = 144, Shiny = Shiny.Never, Ability = OnlySecond, FlawlessIVCount = 3 }, // Cosmog
new(SM) { FixedBall = Ball.Poke, Species = 142, Level = 40, Location = 172 }, // Aerodactyl @ Seafolk Village
new(SM) { Gift = true, Species = 718, Form = 0, Level = 30, Location = 118, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Zygarde
new(SM) { Gift = true, Species = 718, Form = 1, Level = 30, Location = 118, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Zygarde
new(SM) { Gift = true, Species = 718, Form = 2, Level = 30, Location = 118, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Zygarde
new(SM) { Gift = true, Species = 718, Form = 3, Level = 30, Location = 118, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Zygarde
new(SM) { FixedBall = Ball.Poke, Species = 718, Form = 0, Level = 30, Location = 118, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Zygarde
new(SM) { FixedBall = Ball.Poke, Species = 718, Form = 1, Level = 30, Location = 118, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Zygarde
new(SM) { FixedBall = Ball.Poke, Species = 718, Form = 2, Level = 30, Location = 118, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Zygarde
new(SM) { FixedBall = Ball.Poke, Species = 718, Form = 3, Level = 30, Location = 118, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Zygarde
new(SM) { Gift = true, Species = 718, Form = 0, Level = 50, Location = 118, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Zygarde
new(SM) { Gift = true, Species = 718, Form = 1, Level = 50, Location = 118, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Zygarde
new(SM) { Gift = true, Species = 718, Form = 2, Level = 50, Location = 118, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Zygarde
new(SM) { Gift = true, Species = 718, Form = 3, Level = 50, Location = 118, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Zygarde
new(SM) { FixedBall = Ball.Poke, Species = 718, Form = 0, Level = 50, Location = 118, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Zygarde
new(SM) { FixedBall = Ball.Poke, Species = 718, Form = 1, Level = 50, Location = 118, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Zygarde
new(SM) { FixedBall = Ball.Poke, Species = 718, Form = 2, Level = 50, Location = 118, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Zygarde
new(SM) { FixedBall = Ball.Poke, Species = 718, Form = 3, Level = 50, Location = 118, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Zygarde
new(SM) // Magearna (Bottle Cap) 00 FF
{
Gift = true, Species = 801, Level = 50, Location = 40001, Shiny = Shiny.Never, FlawlessIVCount = 3, HeldItem = 795, Ability = OnlySecond,
FatefulEncounter = true, Relearn = new(705, 430, 381, 270), Ball = 0x10, // Cherish
FixedBall = Ball.Cherish, Species = 801, Level = 50, Location = 40001, Shiny = Shiny.Never, FlawlessIVCount = 3, Ability = OnlySecond,
FatefulEncounter = true, Relearn = new(705, 430, 381, 270), // Cherish
},
// Static Encounters - 1.bin
new(SM) { Species = 746, Level = 17, Location = 086, Shiny = Shiny.Never, Ability = OnlyFirst }, // Wishiwashi
new(SM) { Species = 746, Level = 18, Location = 086, Shiny = Shiny.Never, Ability = OnlyFirst }, // Wishiwashi
new(SN) { Species = 791, Level = 55, Location = 176, Shiny = Shiny.Never, Ability = OnlyFirst, FlawlessIVCount = 3, Relearn = new(713, 322, 242, 428) }, // Solgaleo
new(MN) { Species = 792, Level = 55, Location = 178, Shiny = Shiny.Never, Ability = OnlyFirst, FlawlessIVCount = 3, Relearn = new(714, 322, 539, 247) }, // Lunala
new(SM) { Species = 785, Level = 60, Location = 030, Shiny = Shiny.Never, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Tapu Koko
new(SM) { Species = 786, Level = 60, Location = 092, Shiny = Shiny.Never, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Tapu Lele
new(SM) { Species = 787, Level = 60, Location = 140, Shiny = Shiny.Never, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Tapu Bulu
@ -68,14 +66,8 @@ internal static class Encounters7SM
new(SM) { Species = 793, Level = 55, Location = 082, Shiny = Shiny.Never, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Nihilego @ Wela Volcano Park
new(SM) { Species = 793, Level = 55, Location = 100, Shiny = Shiny.Never, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Nihilego @ Digletts Tunnel
new(SN) { Species = 794, Level = 65, Location = 040, Shiny = Shiny.Never, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Buzzwole @ Melemele Meadow
new(MN) { Species = 795, Level = 60, Location = 046, Shiny = Shiny.Never, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Pheromosa @ Verdant Cavern (Trial Site)
new(SM) { Species = 796, Level = 65, Location = 090, Shiny = Shiny.Never, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Xurkitree @ Lush Jungle
new(SM) { Species = 796, Level = 65, Location = 076, Shiny = Shiny.Never, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Xurkitree @ Memorial Hill
new(SN) { Species = 798, Level = 60, Location = 134, Shiny = Shiny.Never, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Kartana @ Malie Garden
new(SN) { Species = 798, Level = 60, Location = 120, Shiny = Shiny.Never, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Kartana @ Route 17
new(MN) { Species = 797, Level = 65, Location = 124, Shiny = Shiny.Never, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Celesteela @ Haina Desert
new(MN) { Species = 797, Level = 65, Location = 134, Shiny = Shiny.Never, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Celesteela @ Malie Garden
new(SM) { Species = 799, Level = 70, Location = 182, Shiny = Shiny.Never, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Guzzlord @ Resolution Cave
new(SM) { Species = 800, Level = 75, Location = 036, Shiny = Shiny.Never, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Necrozma @ Ten Carat Hill (Farthest Hollow)
@ -117,21 +109,31 @@ internal static class Encounters7SM
new(SM) { Species = 500, Level = 43, Location = 160, Relearn = new(276, 053, 372, 535) }, // Emboar @ Ancient Poni Path
};
public static readonly EncounterStatic7[] StaticSN =
{
new(SN) { Species = 791, Level = 55, Location = 176, Shiny = Shiny.Never, Ability = OnlyFirst, FlawlessIVCount = 3, Relearn = new(713, 322, 242, 428) }, // Solgaleo
new(SN) { Species = 794, Level = 65, Location = 040, Shiny = Shiny.Never, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Buzzwole @ Melemele Meadow
new(SN) { Species = 798, Level = 60, Location = 134, Shiny = Shiny.Never, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Kartana @ Malie Garden
new(SN) { Species = 798, Level = 60, Location = 120, Shiny = Shiny.Never, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Kartana @ Route 17
};
public static readonly EncounterStatic7[] StaticMN =
{
new(MN) { Species = 792, Level = 55, Location = 178, Shiny = Shiny.Never, Ability = OnlyFirst, FlawlessIVCount = 3, Relearn = new(714, 322, 539, 247) }, // Lunala
new(MN) { Species = 795, Level = 60, Location = 046, Shiny = Shiny.Never, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Pheromosa @ Verdant Cavern (Trial Site)
new(MN) { Species = 797, Level = 65, Location = 124, Shiny = Shiny.Never, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Celesteela @ Haina Desert
new(MN) { Species = 797, Level = 65, Location = 134, Shiny = Shiny.Never, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Celesteela @ Malie Garden
};
internal static readonly EncounterTrade7[] TradeGift_SM = // @ a\1\5\5
{
// Trades - 4.bin
new(SM) { Species = 066, Form = 0, Level = 09, Ability = OnlySecond, TID16 = 00410, SID16 = 00000, IVs = new(-1,31,-1,-1,-1,-1), OTGender = 1, Gender = 0, Nature = Nature.Brave }, // Machop
new(SM) { Species = 761, Form = 0, Level = 16, Ability = OnlyFirst, TID16 = 20683, SID16 = 00009, IVs = new(-1,31,-1,-1,-1,-1), OTGender = 0, Gender = 1, Nature = Nature.Adamant }, // Bounsweet
new(SM) { Species = 061, Form = 0, Level = 22, Ability = OnlySecond, TID16 = 01092, SID16 = 00009, IVs = new(31,-1,-1,-1,-1,-1), OTGender = 1, Gender = 1, Nature = Nature.Naughty }, // Poliwhirl
new(SM) { Species = 440, Form = 0, Level = 27, Ability = OnlySecond, TID16 = 10913, SID16 = 00000, IVs = new(-1,-1,-1,-1,31,-1), OTGender = 1, Gender = 1, Nature = Nature.Calm }, // Happiny
new(SM) { Species = 075, Form = 1, Level = 32, Ability = OnlyFirst, TID16 = 20778, SID16 = 00009, IVs = new(-1,-1,31,-1,-1,-1), OTGender = 0, Gender = 0, Nature = Nature.Impish, EvolveOnTrade = true }, // Graveler-1
new(SM) { Species = 762, Form = 0, Level = 43, Ability = OnlyFirst, TID16 = 20679, SID16 = 00009, IVs = new(-1,-1,-1,-1,-1,31), OTGender = 1, Gender = 1, Nature = Nature.Careful }, // Steenee
new(SM) { Species = 663, Form = 0, Level = 59, Ability = OnlyHidden, TID16 = 56734, SID16 = 00008, IVs = new(-1,-1,-1,31,-1,-1), OTGender = 0, Gender = 0, Nature = Nature.Jolly }, // Talonflame
new(TradeNames, 00, SM) { Species = 066, Form = 0, Level = 09, Ability = OnlySecond, ID32 = 000410, IVs = new(-1,31,-1,-1,-1,-1), OTGender = 1, Gender = 0, Nature = Nature.Brave }, // Machop
new(TradeNames, 01, SM) { Species = 761, Form = 0, Level = 16, Ability = OnlyFirst, ID32 = 610507, IVs = new(-1,31,-1,-1,-1,-1), OTGender = 0, Gender = 1, Nature = Nature.Adamant }, // Bounsweet
new(TradeNames, 02, SM) { Species = 061, Form = 0, Level = 22, Ability = OnlySecond, ID32 = 590916, IVs = new(31,-1,-1,-1,-1,-1), OTGender = 1, Gender = 1, Nature = Nature.Naughty }, // Poliwhirl
new(TradeNames, 03, SM) { Species = 440, Form = 0, Level = 27, Ability = OnlySecond, ID32 = 010913, IVs = new(-1,-1,-1,-1,31,-1), OTGender = 1, Gender = 1, Nature = Nature.Calm }, // Happiny
new(TradeNames, 04, SM) { Species = 075, Form = 1, Level = 32, Ability = OnlyFirst, ID32 = 610602, IVs = new(-1,-1,31,-1,-1,-1), OTGender = 0, Gender = 0, Nature = Nature.Impish, EvolveOnTrade = true }, // Graveler-1
new(TradeNames, 05, SM) { Species = 762, Form = 0, Level = 43, Ability = OnlyFirst, ID32 = 610503, IVs = new(-1,-1,-1,-1,-1,31), OTGender = 1, Gender = 1, Nature = Nature.Careful }, // Steenee
new(TradeNames, 06, SM) { Species = 663, Form = 0, Level = 59, Ability = OnlyHidden, ID32 = 581022, IVs = new(-1,-1,-1,31,-1,-1), OTGender = 0, Gender = 0, Nature = Nature.Jolly }, // Talonflame
};
private const string tradeSM = "tradesm";
private static readonly string[][] TradeSM = Util.GetLanguageStrings10(tradeSM);
internal static readonly EncounterStatic7[] StaticSN = GetEncounters(Encounter_SM, SN);
internal static readonly EncounterStatic7[] StaticMN = GetEncounters(Encounter_SM, MN);
}

View file

@ -12,63 +12,47 @@ internal static class Encounters7USUM
internal static readonly EncounterArea7[] SlotsUS = EncounterArea7.GetAreas(Get("us", "uu"), US);
internal static readonly EncounterArea7[] SlotsUM = EncounterArea7.GetAreas(Get("um", "uu"), UM);
static Encounters7USUM() => MarkEncounterTradeStrings(TradeGift_USUM, TradeUSUM);
private const string tradeUSUM = "tradeusum";
private static readonly string[][] TradeNames = Util.GetLanguageStrings10(tradeUSUM);
private static readonly EncounterStatic7[] Encounter_USUM =
public static readonly EncounterStatic7[] StaticUSUM =
{
new(USUM) { Gift = true, Species = 722, Level = 05, Location = 008 }, // Rowlet
new(USUM) { Gift = true, Species = 725, Level = 05, Location = 008 }, // Litten
new(USUM) { Gift = true, Species = 728, Level = 05, Location = 008 }, // Popplio
new(USUM) { Gift = true, Species = 138, Level = 15, Location = 058 }, // Omanyte
new(USUM) { Gift = true, Species = 140, Level = 15, Location = 058 }, // Kabuto
// new(USUM) { Gift = true, Species = 142, Level = 15, Location = 058 }, // Aerodactyl
new(USUM) { Gift = true, Species = 345, Level = 15, Location = 058 }, // Lileep
new(USUM) { Gift = true, Species = 347, Level = 15, Location = 058 }, // Anorith
new(USUM) { Gift = true, Species = 408, Level = 15, Location = 058 }, // Cranidos
new(USUM) { Gift = true, Species = 410, Level = 15, Location = 058 }, // Shieldon
new(USUM) { Gift = true, Species = 564, Level = 15, Location = 058 }, // Tirtouga
new(USUM) { Gift = true, Species = 566, Level = 15, Location = 058 }, // Archen
new(USUM) { Gift = true, Species = 696, Level = 15, Location = 058 }, // Tyrunt
new(USUM) { Gift = true, Species = 698, Level = 15, Location = 058 }, // Amaura
new(USUM) { Gift = true, Species = 133, Level = 01, EggLocation = 60002 }, // Eevee @ Nursery helpers
new(USUM) { Gift = true, Species = 137, Level = 30, Location = 116 }, // Porygon @ Route 15
new(USUM) { Gift = true, Species = 772, Level = 60, Location = 188, FlawlessIVCount = 3 }, // Type: Null @ Aether Paradise
new(USUM) { Gift = true, Species = 772, Level = 60, Location = 160, FlawlessIVCount = 3 }, // Type: Null @ Ancient Poni Path
new(US ) { Gift = true, Species = 789, Level = 05, Location = 142, FlawlessIVCount = 3, Shiny = Shiny.Never, Ability = OnlySecond }, // Cosmog @ Lake of the Sunne
new( UM) { Gift = true, Species = 789, Level = 05, Location = 144, FlawlessIVCount = 3, Shiny = Shiny.Never, Ability = OnlySecond }, // Cosmog @ Lake of the Moone
new(USUM) { Gift = true, Species = 142, Level = 40, Location = 172 }, // Aerodactyl @ Seafolk Village
new(USUM) { Gift = true, Species = 025, Level = 40, Location = 070, FlawlessIVCount = 3, HeldItem = 796, Relearn = new(57) }, // Pikachu @ Heahea City
new(USUM) { Gift = true, Species = 803, Level = 40, Location = 208, FlawlessIVCount = 3 }, // Poipole @ Megalo Tower
new(USUM) { Gift = true, Species = 803, Level = 40, Location = 206, FlawlessIVCount = 3 }, // Poipole @ Ultra Megalopolis
new(USUM) { FixedBall = Ball.Poke, Species = 722, Level = 05, Location = 008 }, // Rowlet
new(USUM) { FixedBall = Ball.Poke, Species = 725, Level = 05, Location = 008 }, // Litten
new(USUM) { FixedBall = Ball.Poke, Species = 728, Level = 05, Location = 008 }, // Popplio
new(USUM) { FixedBall = Ball.Poke, Species = 138, Level = 15, Location = 058 }, // Omanyte
new(USUM) { FixedBall = Ball.Poke, Species = 140, Level = 15, Location = 058 }, // Kabuto
// new(USUM) { FixedBall = Ball.Poke, Species = 142, Level = 15, Location = 058 }, // Aerodactyl
new(USUM) { FixedBall = Ball.Poke, Species = 345, Level = 15, Location = 058 }, // Lileep
new(USUM) { FixedBall = Ball.Poke, Species = 347, Level = 15, Location = 058 }, // Anorith
new(USUM) { FixedBall = Ball.Poke, Species = 408, Level = 15, Location = 058 }, // Cranidos
new(USUM) { FixedBall = Ball.Poke, Species = 410, Level = 15, Location = 058 }, // Shieldon
new(USUM) { FixedBall = Ball.Poke, Species = 564, Level = 15, Location = 058 }, // Tirtouga
new(USUM) { FixedBall = Ball.Poke, Species = 566, Level = 15, Location = 058 }, // Archen
new(USUM) { FixedBall = Ball.Poke, Species = 696, Level = 15, Location = 058 }, // Tyrunt
new(USUM) { FixedBall = Ball.Poke, Species = 698, Level = 15, Location = 058 }, // Amaura
new(USUM) { FixedBall = Ball.Poke, Species = 133, Level = 01, EggLocation = 60002 }, // Eevee @ Nursery helpers
new(USUM) { FixedBall = Ball.Poke, Species = 137, Level = 30, Location = 116 }, // Porygon @ Route 15
new(USUM) { FixedBall = Ball.Poke, Species = 772, Level = 60, Location = 188, FlawlessIVCount = 3 }, // Type: Null @ Aether Paradise
new(USUM) { FixedBall = Ball.Poke, Species = 772, Level = 60, Location = 160, FlawlessIVCount = 3 }, // Type: Null @ Ancient Poni Path
new(USUM) { FixedBall = Ball.Poke, Species = 142, Level = 40, Location = 172 }, // Aerodactyl @ Seafolk Village
new(USUM) { FixedBall = Ball.Poke, Species = 025, Level = 40, Location = 070, FlawlessIVCount = 3, Relearn = new(57) }, // Pikachu @ Heahea City
new(USUM) { FixedBall = Ball.Poke, Species = 803, Level = 40, Location = 208, FlawlessIVCount = 3 }, // Poipole @ Megalo Tower
new(USUM) { FixedBall = Ball.Poke, Species = 803, Level = 40, Location = 206, FlawlessIVCount = 3 }, // Poipole @ Ultra Megalopolis
// Totem-Sized Gifts @ Heahea Beach
new(US ) { Gift = true, Species = 735, Level = 20, Ability = OnlyHidden, Location = 202, Form = 1, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Gumshoos
new( UM) { Gift = true, Species = 020, Level = 20, Ability = OnlyHidden, Location = 202, Form = 2, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Raticate
new(US ) { Gift = true, Species = 105, Level = 25, Ability = OnlyHidden, Location = 202, Form = 2, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Marowak
new( UM) { Gift = true, Species = 752, Level = 25, Ability = OnlyFirst, Location = 202, Form = 1, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Araquanid
new(US ) { Gift = true, Species = 754, Level = 30, Ability = OnlySecond, Location = 202, Form = 1, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Lurantis
new( UM) { Gift = true, Species = 758, Level = 30, Ability = OnlyFirst, Location = 202, Form = 1, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Salazzle
new(US ) { Gift = true, Species = 738, Level = 35, Ability = OnlyFirst, Location = 202, Form = 1, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Vikavolt
new( UM) { Gift = true, Species = 777, Level = 35, Ability = OnlyHidden, Location = 202, Form = 1, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Togedemaru
new(USUM) { Gift = true, Species = 778, Level = 40, Ability = OnlyFirst, Location = 202, Form = 2, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Mimikyu
new(US ) { Gift = true, Species = 743, Level = 50, Ability = OnlyHidden, Location = 202, Form = 1, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Ribombee
new( UM) { Gift = true, Species = 784, Level = 50, Ability = OnlyHidden, Location = 202, Form = 1, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Kommo-o
new(USUM) { Gift = true, Species = 718, Level = 63, Ability = OnlyFirst, Location = 118, Form = 1, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Zygarde (10%) @ Route 16
new(USUM) { FixedBall = Ball.Poke, Species = 778, Level = 40, Ability = OnlyFirst, Location = 202, Form = 2, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Mimikyu
new(USUM) { FixedBall = Ball.Poke, Species = 718, Level = 63, Ability = OnlyFirst, Location = 118, Form = 1, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Zygarde (10%) @ Route 16
new(USUM) // Magearna (Bottle Cap)
{
Gift = true, Species = 801, Level = 50, Location = 40001, Shiny = Shiny.Never, FlawlessIVCount = 3, HeldItem = 795, Ability = OnlySecond,
FatefulEncounter = true, Relearn = new(705, 430, 381, 270), Ball = 0x10, // Cherish
FixedBall = Ball.Cherish, Species = 801, Level = 50, Location = 40001, Shiny = Shiny.Never, FlawlessIVCount = 3, Ability = OnlySecond,
FatefulEncounter = true, Relearn = new(705, 430, 381, 270), // Cherish
},
new(USUM) { Gift = true, Species = 718, Form = 0, Level = 50, Shiny = Shiny.Never, Location = 118, FlawlessIVCount = 3 }, // Zygarde (50%)
new(USUM) { Gift = true, Species = 718, Form = 1, Level = 50, Shiny = Shiny.Never, Location = 118, FlawlessIVCount = 3 }, // Zygarde (10%)
new(USUM) { Gift = true, Species = 718, Form = 2, Level = 50, Shiny = Shiny.Never, Location = 118, FlawlessIVCount = 3 }, // Zygarde (10%-C)
new(USUM) { Gift = true, Species = 718, Form = 3, Level = 50, Shiny = Shiny.Never, Location = 118, FlawlessIVCount = 3 }, // Zygarde (50%-C)
new(US ) { Species = 791, Level = 60, Location = 028, Ability = OnlyFirst, Shiny = Shiny.Never, FlawlessIVCount = 3, Relearn = new(713,322,242,428) }, // Solgaleo @ Mahalo Trail (Plank Bridge)
new( UM) { Species = 792, Level = 60, Location = 028, Ability = OnlyFirst, Shiny = Shiny.Never, FlawlessIVCount = 3, Relearn = new(714,322,539,585) }, // Lunala @ Mahalo Trail (Plank Bridge)
new(USUM) { FixedBall = Ball.Poke, Species = 718, Form = 0, Level = 50, Shiny = Shiny.Never, Location = 118, FlawlessIVCount = 3 }, // Zygarde (50%)
new(USUM) { FixedBall = Ball.Poke, Species = 718, Form = 1, Level = 50, Shiny = Shiny.Never, Location = 118, FlawlessIVCount = 3 }, // Zygarde (10%)
new(USUM) { FixedBall = Ball.Poke, Species = 718, Form = 2, Level = 50, Shiny = Shiny.Never, Location = 118, FlawlessIVCount = 3 }, // Zygarde (10%-C)
new(USUM) { FixedBall = Ball.Poke, Species = 718, Form = 3, Level = 50, Shiny = Shiny.Never, Location = 118, FlawlessIVCount = 3 }, // Zygarde (50%-C)
// QR Scan: Su/M/Tu/W/Th/F/Sa
// Melemele Island
@ -116,46 +100,28 @@ internal static class Encounters7USUM
new(USUM) { Species = 127, Level = 42, Location = 184, Shiny = Shiny.Never }, // Pinsir @ Exeggutor Island
new(USUM) { Species = 127, Level = 43, Location = 184, Shiny = Shiny.Never }, // Pinsir @ Exeggutor Island
new(USUM) { Species = 800, Level = 65, Location = 146, Ability = OnlyFirst, Shiny = Shiny.Never, FlawlessIVCount = 3, Relearn = new(722,334,408,400), HeldItem = 923 }, // Necrozma @ Mount Lanakila
new(USUM) { Species = 800, Level = 65, Location = 146, Ability = OnlyFirst, Shiny = Shiny.Never, FlawlessIVCount = 3, Relearn = new(722,334,408,400) }, // Necrozma @ Mount Lanakila
// Legendaries
new(USUM) { Species = 144, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3, Relearn = new(246,573,115,258) }, // Articuno
new(USUM) { Species = 145, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3, Relearn = new(246,435,365,240) }, // Zapdos
new(USUM) { Species = 146, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3, Relearn = new(246,053,403,241) }, // Moltres
new(USUM) { Species = 150, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3, Relearn = new(094,105,129,427) }, // Mewtwo
new(US ) { Species = 243, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Raikou
new( UM) { Species = 244, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3, Relearn = new(023,044,207,436) }, // Entei
new(USUM) { Species = 245, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3, Relearn = new(061,062,054,240) }, // Suicune
new( UM) { Species = 249, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3, Relearn = new(285,177,326,246) }, // Lugia
new(US ) { Species = 250, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3, Relearn = new(682,221,326,246), HeldItem = 044 }, // Ho-Oh
new(USUM) { Species = 377, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Regirock
new(USUM) { Species = 378, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Regice
new(USUM) { Species = 379, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Registeel
new( UM) { Species = 380, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3, Relearn = new(296,406,375,273), Gender = 1 }, // Latias
new(US ) { Species = 381, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3, Relearn = new(295,406,375,225), Gender = 0 }, // Latios
new( UM) { Species = 382, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3, Relearn = new(058,618,347,330) }, // Kyogre
new(US ) { Species = 383, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3, Relearn = new(089,619,339,076) }, // Groudon
new(USUM) { Species = 384, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Rayquaza
new(USUM) { Species = 480, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3, Relearn = new(326,281,133,129) }, // Uxie
new(USUM) { Species = 481, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3, Relearn = new(326,204,248,129) }, // Mesprit
new(USUM) { Species = 482, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3, Relearn = new(326,417,253,129) }, // Azelf
new(US ) { Species = 483, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Dialga
new( UM) { Species = 484, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Palkia
new(US ) { Species = 485, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Heatran
new( UM) { Species = 486, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3, Relearn = new(428,279,146,109) }, // Regigigas
new(USUM) { Species = 487, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3, Relearn = new(467,396,414,337) }, // Giratina
new(USUM) { Species = 488, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3, Gender = 1 }, // Cresselia
new(USUM) { Species = 638, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3, Relearn = new(533,014,098,442) }, // Cobalion
new(USUM) { Species = 639, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3, Relearn = new(533,014,157,444) }, // Terrakion
new(USUM) { Species = 640, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3, Relearn = new(533,014,202,348) }, // Virizion
new(US ) { Species = 641, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3, Gender = 0 }, // Tornadus
new( UM) { Species = 642, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3, Gender = 0 }, // Thundurus
new(US ) { Species = 643, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Reshiram
new( UM) { Species = 644, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Zekrom
new(USUM) { Species = 645, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3, Gender = 0 }, // Landorus
new(USUM) { Species = 646, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Kyurem
new(US ) { Species = 716, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3, Relearn = new(601,532,400,585) }, // Xerneas
new( UM) { Species = 717, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3, Relearn = new(613,399,566,094) }, // Yveltal
new(USUM) { Species = 718, Level = 60, Location = 182, Ability = OnlyFirst, Shiny = Shiny.Never, FlawlessIVCount = 3, Relearn = new(616,137,219,225) }, // Zygarde @ Resolution Cave
// Ultra Space Wilds
@ -182,14 +148,8 @@ internal static class Encounters7USUM
// Ultra Beasts
new(USUM) { Species = 793, Level = 60, Location = 190, Ability = OnlyFirst, FlawlessIVCount = 3, Relearn = new(408,491,446,243) }, // Nihilego @ Ultra Deep Sea
new(US ) { Species = 794, Level = 60, Location = 218, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Buzzwole @ Ultra Jungle
new( UM) { Species = 795, Level = 60, Location = 214, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Pheromosa @ Ultra Desert
new(USUM) { Species = 796, Level = 60, Location = 210, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Xurkitree @ Ultra Plant
new( UM) { Species = 797, Level = 60, Location = 212, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Celesteela @ Ultra Crater
new(US ) { Species = 798, Level = 60, Location = 216, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Kartana @ Ultra Forest
new(USUM) { Species = 799, Level = 60, Location = 220, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Guzzlord @ Ultra Ruin
new( UM) { Species = 805, Level = 60, Location = 164, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Stakataka @ Poni Grove
new(US ) { Species = 806, Level = 60, Location = 164, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Blacephalon @ Poni Grove
// Ditto Five
new(USUM) { Species = 132, Level = 29, Location = 060, IVs = new(-1,-1,31,00,30,-1), Nature = Nature.Bold }, // Ditto @ Route 9
@ -205,7 +165,6 @@ internal static class Encounters7USUM
new(USUM) { Species = 097, Level = 29, Location = 020, Shiny = Shiny.Never, Relearn = new(093,050,001,096) }, // Hypno @ Hau'oli City Police Station
new(USUM) { Species = 092, Level = 19, Location = 230, Shiny = Shiny.Never, Relearn = new(174,109,122,101) }, // Gastly @ Route 1 (Trainers School)
new(USUM) { Species = 425, Level = 19, Location = 230, Shiny = Shiny.Never, Relearn = new(310,132,016,371) }, // Drifloon @ Route 1 (Trainers School)
new( UM) { Species = 769, Level = 30, Location = 116, Shiny = Shiny.Never, Relearn = new(310,523,072,328) }, // Sandygast @ Route 15
new(USUM) { Species = 592, Level = 34, Location = 126, Shiny = Shiny.Never, Gender = 1 }, // Frillish @ Route 14
new(USUM) { Species = 101, Level = 60, Location = 224, Ability = OnlyFirst, Shiny = Shiny.Never }, // Electrode @ Team Rocket's Castle
@ -216,21 +175,71 @@ internal static class Encounters7USUM
new(USUM) { Species = 739, Level = 32, Location = 120 }, // Route 17
};
public static readonly EncounterStatic7[] StaticUS =
{
new(US ) { FixedBall = Ball.Poke, Species = 789, Level = 05, Location = 142, FlawlessIVCount = 3, Shiny = Shiny.Never, Ability = OnlySecond }, // Cosmog @ Lake of the Sunne
// Totem-Sized Gifts @ Heahea Beach
new(US ) { FixedBall = Ball.Poke, Species = 735, Level = 20, Ability = OnlyHidden, Location = 202, Form = 1, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Gumshoos
new(US ) { FixedBall = Ball.Poke, Species = 105, Level = 25, Ability = OnlyHidden, Location = 202, Form = 2, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Marowak
new(US ) { FixedBall = Ball.Poke, Species = 754, Level = 30, Ability = OnlySecond, Location = 202, Form = 1, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Lurantis
new(US ) { FixedBall = Ball.Poke, Species = 738, Level = 35, Ability = OnlyFirst, Location = 202, Form = 1, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Vikavolt
new(US ) { FixedBall = Ball.Poke, Species = 743, Level = 50, Ability = OnlyHidden, Location = 202, Form = 1, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Ribombee
new(US ) { Species = 791, Level = 60, Location = 028, Ability = OnlyFirst, Shiny = Shiny.Never, FlawlessIVCount = 3, Relearn = new(713,322,242,428) }, // Solgaleo @ Mahalo Trail (Plank Bridge)
new(US ) { Species = 243, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Raikou
new(US ) { Species = 250, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3, Relearn = new(682,221,326,246) }, // Ho-Oh
new(US ) { Species = 381, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3, Relearn = new(295,406,375,225), Gender = 0 }, // Latios
new(US ) { Species = 383, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3, Relearn = new(089,619,339,076) }, // Groudon
new(US ) { Species = 483, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Dialga
new(US ) { Species = 485, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Heatran
new(US ) { Species = 641, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3, Gender = 0 }, // Tornadus
new(US ) { Species = 643, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Reshiram
new(US ) { Species = 716, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3, Relearn = new(601,532,400,585) }, // Xerneas
new(US ) { Species = 794, Level = 60, Location = 218, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Buzzwole @ Ultra Jungle
new(US ) { Species = 798, Level = 60, Location = 216, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Kartana @ Ultra Forest
new(US ) { Species = 806, Level = 60, Location = 164, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Blacephalon @ Poni Grove
};
public static readonly EncounterStatic7[] StaticUM =
{
new( UM) { FixedBall = Ball.Poke, Species = 789, Level = 05, Location = 144, FlawlessIVCount = 3, Shiny = Shiny.Never, Ability = OnlySecond }, // Cosmog @ Lake of the Moone
// Totem-Sized Gifts @ Heahea Beach
new( UM) { FixedBall = Ball.Poke, Species = 020, Level = 20, Ability = OnlyHidden, Location = 202, Form = 2, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Raticate
new( UM) { FixedBall = Ball.Poke, Species = 752, Level = 25, Ability = OnlyFirst, Location = 202, Form = 1, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Araquanid
new( UM) { FixedBall = Ball.Poke, Species = 758, Level = 30, Ability = OnlyFirst, Location = 202, Form = 1, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Salazzle
new( UM) { FixedBall = Ball.Poke, Species = 777, Level = 35, Ability = OnlyHidden, Location = 202, Form = 1, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Togedemaru
new( UM) { FixedBall = Ball.Poke, Species = 784, Level = 50, Ability = OnlyHidden, Location = 202, Form = 1, Shiny = Shiny.Never, FlawlessIVCount = 3 }, // Kommo-o
new( UM) { Species = 792, Level = 60, Location = 028, Ability = OnlyFirst, Shiny = Shiny.Never, FlawlessIVCount = 3, Relearn = new(714,322,539,585) }, // Lunala @ Mahalo Trail (Plank Bridge)
new( UM) { Species = 244, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3, Relearn = new(023,044,207,436) }, // Entei
new( UM) { Species = 249, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3, Relearn = new(285,177,326,246) }, // Lugia
new( UM) { Species = 380, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3, Relearn = new(296,406,375,273), Gender = 1 }, // Latias
new( UM) { Species = 382, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3, Relearn = new(058,618,347,330) }, // Kyogre
new( UM) { Species = 484, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Palkia
new( UM) { Species = 486, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3, Relearn = new(428,279,146,109) }, // Regigigas
new( UM) { Species = 642, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3, Gender = 0 }, // Thundurus
new( UM) { Species = 644, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Zekrom
new( UM) { Species = 717, Level = 60, Location = 222, Ability = OnlyFirst, FlawlessIVCount = 3, Relearn = new(613,399,566,094) }, // Yveltal
new( UM) { Species = 795, Level = 60, Location = 214, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Pheromosa @ Ultra Desert
new( UM) { Species = 797, Level = 60, Location = 212, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Celesteela @ Ultra Crater
new( UM) { Species = 805, Level = 60, Location = 164, Ability = OnlyFirst, FlawlessIVCount = 3 }, // Stakataka @ Poni Grove
new( UM) { Species = 769, Level = 30, Location = 116, Shiny = Shiny.Never, Relearn = new(310,523,072,328) }, // Sandygast @ Route 15
};
internal static readonly EncounterTrade7[] TradeGift_USUM =
{
// Trades - 4.bin
new(USUM) { Species = 701, Form = 0, Level = 08, Ability = OnlySecond, TID16 = 00410, SID16 = 00000, IVs = new(-1,31,-1,-1,-1,-1), OTGender = 1, Gender = 0, Nature = Nature.Brave }, // Hawlucha
new(USUM) { Species = 714, Form = 0, Level = 19, Ability = OnlyFirst, TID16 = 20683, SID16 = 00009, IVs = new(-1,-1,-1,-1,31,-1), OTGender = 0, Gender = 0, Nature = Nature.Modest }, // Noibat
new(USUM) { Species = 339, Form = 0, Level = 21, Ability = OnlySecond, TID16 = 01092, SID16 = 00009, IVs = new(31,-1,-1,-1,-1,-1), OTGender = 0, Gender = 1, Nature = Nature.Naughty }, // Barboach
new(USUM) { Species = 024, Form = 0, Level = 22, Ability = OnlyFirst, TID16 = 10913, SID16 = 00000, IVs = new(-1,-1,31,-1,-1,-1), OTGender = 1, Gender = 1, Nature = Nature.Impish }, // Arbok
new(USUM) { Species = 708, Form = 0, Level = 33, Ability = OnlyFirst, TID16 = 20778, SID16 = 00009, IVs = new(-1,-1,-1,-1,-1,31), OTGender = 0, Gender = 0, Nature = Nature.Calm, EvolveOnTrade = true }, // Phantump
new(USUM) { Species = 422, Form = 0, Level = 44, Ability = OnlySecond, TID16 = 20679, SID16 = 00009, IVs = new(-1,-1,31,-1,-1,-1), OTGender = 1, Gender = 1, Nature = Nature.Quiet }, // Shellos
new(USUM) { Species = 128, Form = 0, Level = 59, Ability = OnlyFirst, TID16 = 56734, SID16 = 00008, IVs = new(-1,-1,-1,31,-1,-1), OTGender = 0, Gender = 0, Nature = Nature.Jolly }, // Tauros
new(TradeNames, 00, USUM) { Species = 701, Form = 0, Level = 08, Ability = OnlySecond, ID32 = 000410, IVs = new(-1,31,-1,-1,-1,-1), OTGender = 1, Gender = 0, Nature = Nature.Brave }, // Hawlucha
new(TradeNames, 01, USUM) { Species = 714, Form = 0, Level = 19, Ability = OnlyFirst, ID32 = 610507, IVs = new(-1,-1,-1,-1,31,-1), OTGender = 0, Gender = 0, Nature = Nature.Modest }, // Noibat
new(TradeNames, 02, USUM) { Species = 339, Form = 0, Level = 21, Ability = OnlySecond, ID32 = 590916, IVs = new(31,-1,-1,-1,-1,-1), OTGender = 0, Gender = 1, Nature = Nature.Naughty }, // Barboach
new(TradeNames, 03, USUM) { Species = 024, Form = 0, Level = 22, Ability = OnlyFirst, ID32 = 010913, IVs = new(-1,-1,31,-1,-1,-1), OTGender = 1, Gender = 1, Nature = Nature.Impish }, // Arbok
new(TradeNames, 04, USUM) { Species = 708, Form = 0, Level = 33, Ability = OnlyFirst, ID32 = 610602, IVs = new(-1,-1,-1,-1,-1,31), OTGender = 0, Gender = 0, Nature = Nature.Calm, EvolveOnTrade = true }, // Phantump
new(TradeNames, 05, USUM) { Species = 422, Form = 0, Level = 44, Ability = OnlySecond, ID32 = 610503, IVs = new(-1,-1,31,-1,-1,-1), OTGender = 1, Gender = 1, Nature = Nature.Quiet }, // Shellos
new(TradeNames, 06, USUM) { Species = 128, Form = 0, Level = 59, Ability = OnlyFirst, ID32 = 581022, IVs = new(-1,-1,-1,31,-1,-1), OTGender = 0, Gender = 0, Nature = Nature.Jolly }, // Tauros
};
private const string tradeUSUM = "tradeusum";
private static readonly string[][] TradeUSUM = Util.GetLanguageStrings10(tradeUSUM);
internal static readonly EncounterStatic7[] StaticUS = GetEncounters(Encounter_USUM, US);
internal static readonly EncounterStatic7[] StaticUM = GetEncounters(Encounter_USUM, UM);
}

View file

@ -4,8 +4,6 @@ using static PKHeX.Core.GameVersion;
using static PKHeX.Core.AreaWeather8;
using static PKHeX.Core.AbilityPermission;
using static PKHeX.Core.Encounters8Nest;
namespace PKHeX.Core;
/// <summary>
@ -13,61 +11,50 @@ namespace PKHeX.Core;
/// </summary>
internal static class Encounters8
{
private static readonly EncounterArea8[] SlotsSW_Symbol = EncounterArea8.GetAreas(Get("sw_symbol", "sw"), SW, true);
private static readonly EncounterArea8[] SlotsSH_Symbol = EncounterArea8.GetAreas(Get("sh_symbol", "sh"), SH, true);
private static readonly EncounterArea8[] SlotsSW_Hidden = EncounterArea8.GetAreas(Get("sw_hidden", "sw"), SW);
private static readonly EncounterArea8[] SlotsSH_Hidden = EncounterArea8.GetAreas(Get("sh_hidden", "sh"), SH);
public static readonly EncounterArea8[] SlotsSW_Symbol = EncounterArea8.GetAreas(Get("sw_symbol", "sw"), SW, true);
public static readonly EncounterArea8[] SlotsSH_Symbol = EncounterArea8.GetAreas(Get("sh_symbol", "sh"), SH, true);
public static readonly EncounterArea8[] SlotsSW_Hidden = EncounterArea8.GetAreas(Get("sw_hidden", "sw"), SW);
public static readonly EncounterArea8[] SlotsSH_Hidden = EncounterArea8.GetAreas(Get("sh_hidden", "sh"), SH);
internal static readonly EncounterArea8[] SlotsSW = ArrayUtil.ConcatAll(SlotsSW_Symbol, SlotsSW_Hidden);
internal static readonly EncounterArea8[] SlotsSH = ArrayUtil.ConcatAll(SlotsSH_Symbol, SlotsSH_Hidden);
static Encounters8()
{
foreach (var t in TradeGift_R1)
t.TrainerNames = TradeOT_R1;
MarkEncounterTradeStrings(TradeGift_SWSH, TradeSWSH);
}
private static readonly EncounterStatic8[] Encounter_SWSH_0 =
public static readonly EncounterStatic8[] StaticSWSH =
{
// gifts
new() { Gift = true, Species = 810, Shiny = Never, Level = 05, Location = 006 }, // Grookey
new() { Gift = true, Species = 813, Shiny = Never, Level = 05, Location = 006 }, // Scorbunny
new() { Gift = true, Species = 816, Shiny = Never, Level = 05, Location = 006 }, // Sobble
new() { FixedBall = Ball.Poke, Species = 810, Shiny = Never, Level = 05, Location = 006 }, // Grookey
new() { FixedBall = Ball.Poke, Species = 813, Shiny = Never, Level = 05, Location = 006 }, // Scorbunny
new() { FixedBall = Ball.Poke, Species = 816, Shiny = Never, Level = 05, Location = 006 }, // Sobble
new() { Gift = true, Species = 772, Shiny = Never, Level = 50, Location = 158, FlawlessIVCount = 3 }, // Type: Null
new() { Gift = true, Species = 848, Shiny = Never, Level = 01, Location = 040, IVs = new(-1,31,-1,-1,31,-1), Ball = 11 }, // Toxel, Attack flawless
new() { FixedBall = Ball.Poke, Species = 772, Shiny = Never, Level = 50, Location = 158, FlawlessIVCount = 3 }, // Type: Null
new() { FixedBall = Ball.Luxury, Species = 848, Shiny = Never, Level = 01, Location = 040, IVs = new(-1,31,-1,-1,31,-1) }, // Toxel, Attack flawless
new() { Gift = true, Species = 880, FlawlessIVCount = 3, Level = 10, Location = 068 }, // Dracozolt @ Route 6
new() { Gift = true, Species = 881, FlawlessIVCount = 3, Level = 10, Location = 068 }, // Arctozolt @ Route 6
new() { Gift = true, Species = 882, FlawlessIVCount = 3, Level = 10, Location = 068 }, // Dracovish @ Route 6
new() { Gift = true, Species = 883, FlawlessIVCount = 3, Level = 10, Location = 068 }, // Arctovish @ Route 6
new() { FixedBall = Ball.Poke, Species = 880, FlawlessIVCount = 3, Level = 10, Location = 068 }, // Dracozolt @ Route 6
new() { FixedBall = Ball.Poke, Species = 881, FlawlessIVCount = 3, Level = 10, Location = 068 }, // Arctozolt @ Route 6
new() { FixedBall = Ball.Poke, Species = 882, FlawlessIVCount = 3, Level = 10, Location = 068 }, // Dracovish @ Route 6
new() { FixedBall = Ball.Poke, Species = 883, FlawlessIVCount = 3, Level = 10, Location = 068 }, // Arctovish @ Route 6
new() { Gift = true, Species = 004, Shiny = Never, Level = 05, Location = 006, FlawlessIVCount = 3, CanGigantamax = true, Ability = OnlyFirst }, // Charmander
new() { Gift = true, Species = 025, Shiny = Never, Level = 10, Location = 156, FlawlessIVCount = 6, CanGigantamax = true }, // Pikachu
new() { Gift = true, Species = 133, Shiny = Never, Level = 10, Location = 156, FlawlessIVCount = 6, CanGigantamax = true }, // Eevee
new() { FixedBall = Ball.Poke, Species = 004, Shiny = Never, Level = 05, Location = 006, FlawlessIVCount = 3, CanGigantamax = true, Ability = OnlyFirst }, // Charmander
new() { FixedBall = Ball.Poke, Species = 025, Shiny = Never, Level = 10, Location = 156, FlawlessIVCount = 6, CanGigantamax = true }, // Pikachu
new() { FixedBall = Ball.Poke, Species = 133, Shiny = Never, Level = 10, Location = 156, FlawlessIVCount = 6, CanGigantamax = true }, // Eevee
// DLC gifts
new() { Gift = true, Species = 001, Level = 05, Location = 196, Shiny = Never, Ability = OnlyFirst, FlawlessIVCount = 3, CanGigantamax = true }, // Bulbasaur
new() { Gift = true, Species = 007, Level = 05, Location = 196, Shiny = Never, Ability = OnlyFirst, FlawlessIVCount = 3, CanGigantamax = true }, // Squirtle
new() { Gift = true, Species = 137, Level = 25, Location = 196, Shiny = Never, Ability = OnlyHidden, FlawlessIVCount = 3 }, // Porygon
new() { Gift = true, Species = 891, Level = 10, Location = 196, Shiny = Never, FlawlessIVCount = 3 }, // Kubfu
new() { FixedBall = Ball.Poke, Species = 001, Level = 05, Location = 196, Shiny = Never, Ability = OnlyFirst, FlawlessIVCount = 3, CanGigantamax = true }, // Bulbasaur
new() { FixedBall = Ball.Poke, Species = 007, Level = 05, Location = 196, Shiny = Never, Ability = OnlyFirst, FlawlessIVCount = 3, CanGigantamax = true }, // Squirtle
new() { FixedBall = Ball.Poke, Species = 137, Level = 25, Location = 196, Shiny = Never, Ability = OnlyHidden, FlawlessIVCount = 3 }, // Porygon
new() { FixedBall = Ball.Poke, Species = 891, Level = 10, Location = 196, Shiny = Never, FlawlessIVCount = 3 }, // Kubfu
new() { Gift = true, Species = 079, Level = 10, Location = 164, Shiny = Never, Ability = OnlyHidden, FlawlessIVCount = 3 }, // Slowpoke
new() { Gift = true, Species = 722, Level = 05, Location = 164, Shiny = Never, Ability = OnlyHidden, FlawlessIVCount = 3 }, // Rowlet
new() { Gift = true, Species = 725, Level = 05, Location = 164, Shiny = Never, Ability = OnlyHidden, FlawlessIVCount = 3 }, // Litten
new() { Gift = true, Species = 728, Level = 05, Location = 164, Shiny = Never, Ability = OnlyHidden, FlawlessIVCount = 3 }, // Popplio
new() { Gift = true, Species = 026, Level = 30, Location = 164, Shiny = Never, Ability = OnlyFirst, FlawlessIVCount = 3, Form = 01 }, // Raichu-1
new() { Gift = true, Species = 027, Level = 05, Location = 164, Shiny = Never, Ability = OnlyHidden, FlawlessIVCount = 3, Form = 01 }, // Sandshrew-1
new() { Gift = true, Species = 037, Level = 05, Location = 164, Shiny = Never, Ability = OnlyHidden, FlawlessIVCount = 3, Form = 01 }, // Vulpix-1
new() { Gift = true, Species = 052, Level = 05, Location = 164, Shiny = Never, Ability = OnlyHidden, FlawlessIVCount = 3, Form = 01 }, // Meowth-1
new() { Gift = true, Species = 103, Level = 30, Location = 164, Shiny = Never, Ability = OnlyHidden, FlawlessIVCount = 3, Form = 01 }, // Exeggutor-1
new() { Gift = true, Species = 105, Level = 30, Location = 164, Shiny = Never, Ability = OnlyHidden, FlawlessIVCount = 3, Form = 01 }, // Marowak-1
new() { Gift = true, Species = 050, Level = 20, Location = 164, Shiny = Never, Ability = OnlyHidden, Gender = 0, Nature = Nature.Jolly, FlawlessIVCount = 6, Form = 01 }, // Diglett-1
new() { FixedBall = Ball.Poke, Species = 079, Level = 10, Location = 164, Shiny = Never, Ability = OnlyHidden, FlawlessIVCount = 3 }, // Slowpoke
new() { FixedBall = Ball.Poke, Species = 722, Level = 05, Location = 164, Shiny = Never, Ability = OnlyHidden, FlawlessIVCount = 3 }, // Rowlet
new() { FixedBall = Ball.Poke, Species = 725, Level = 05, Location = 164, Shiny = Never, Ability = OnlyHidden, FlawlessIVCount = 3 }, // Litten
new() { FixedBall = Ball.Poke, Species = 728, Level = 05, Location = 164, Shiny = Never, Ability = OnlyHidden, FlawlessIVCount = 3 }, // Popplio
new() { FixedBall = Ball.Poke, Species = 026, Level = 30, Location = 164, Shiny = Never, Ability = OnlyFirst, FlawlessIVCount = 3, Form = 01 }, // Raichu-1
new() { FixedBall = Ball.Poke, Species = 027, Level = 05, Location = 164, Shiny = Never, Ability = OnlyHidden, FlawlessIVCount = 3, Form = 01 }, // Sandshrew-1
new() { FixedBall = Ball.Poke, Species = 037, Level = 05, Location = 164, Shiny = Never, Ability = OnlyHidden, FlawlessIVCount = 3, Form = 01 }, // Vulpix-1
new() { FixedBall = Ball.Poke, Species = 052, Level = 05, Location = 164, Shiny = Never, Ability = OnlyHidden, FlawlessIVCount = 3, Form = 01 }, // Meowth-1
new() { FixedBall = Ball.Poke, Species = 103, Level = 30, Location = 164, Shiny = Never, Ability = OnlyHidden, FlawlessIVCount = 3, Form = 01 }, // Exeggutor-1
new() { FixedBall = Ball.Poke, Species = 105, Level = 30, Location = 164, Shiny = Never, Ability = OnlyHidden, FlawlessIVCount = 3, Form = 01 }, // Marowak-1
new() { FixedBall = Ball.Poke, Species = 050, Level = 20, Location = 164, Shiny = Never, Ability = OnlyHidden, Gender = 0, Nature = Nature.Jolly, FlawlessIVCount = 6, Form = 01 }, // Diglett-1
new() { Gift = true, Species = 789, Level = 05, Location = 206, FlawlessIVCount = 3, Shiny = Never, Ability = OnlyFirst }, // Cosmog
new() { Gift = true, Species = 803, Level = 20, Location = 244, FlawlessIVCount = 3, Shiny = Never, Ability = OnlyFirst, Ball = 26 }, // Poipole
new() { FixedBall = Ball.Poke, Species = 789, Level = 05, Location = 206, FlawlessIVCount = 3, Shiny = Never, Ability = OnlyFirst }, // Cosmog
new() { FixedBall = Ball.Beast,Species = 803, Level = 20, Location = 244, FlawlessIVCount = 3, Shiny = Never, Ability = OnlyFirst }, // Poipole
// Technically a gift, but copies ball from Calyrex.
new() { Species = 896, Level = 75, Location = 220, ScriptedNoMarks = true, FlawlessIVCount = 3, Shiny = Never, Ability = OnlyFirst, Relearn = new(556) }, // Glastrier
@ -110,10 +97,9 @@ internal static class Encounters8
new() { Species = 460, Level = 55, Location = 106, Moves = new(008,059,452,275), Weather = Snowstorm }, // Abomasnow on Route 10
new() { Species = 342, Level = 50, Location = 034, Moves = new(242,014,534,400), FlawlessIVCount = 3 }, // Crawdaunt in the town of Turffield
#endregion
};
private static readonly EncounterStatic8[] Encounter_SWSH_Strong0 =
{
// Strong-0
// Some of these may be crossover cases. For now, just log the locations they can show up in and re-categorize later.
new() { Species = 095, Level = 26, Location = 122, Weather = All }, // Onix in the Rolling Fields
new() { Species = 291, Level = 15, Location = 122, Weather = All }, // Ninjask in the Rolling Fields
@ -137,8 +123,6 @@ internal static class Encounters8
new() { Species = 760, Level = 34, Location = 124, Weather = All }, // Bewear in the Dappled Grove
new() { Species = 826, Level = 65, Location = 124, Weather = All }, // Orbeetle in the Dappled Grove
new() { Species = 045, Level = 36, Location = 124, Weather = Normal | Overcast | Heavy_Fog }, // Vileplume in the Dappled Grove
new(SW ) { Species = 275, Level = 34, Location = 124, Weather = Normal | Overcast | Stormy | Heavy_Fog }, // Shiftry in the Dappled Grove
new( SH) { Species = 272, Level = 34, Location = 124, Weather = Normal | Overcast | Stormy | Heavy_Fog }, // Ludicolo in the Dappled Grove
new() { Species = 675, Level = 32, Location = 124, Weather = Intense_Sun | Icy | Sandstorm }, // Pangoro in the Dappled Grove
new() { Species = 537, Level = 36, Location = 124, Weather = Stormy }, // Seismitoad in the Dappled Grove
new() { Species = 583, Level = 36, Location = 124, Weather = Icy }, // Vanillish in the Dappled Grove
@ -272,8 +256,6 @@ internal static class Encounters8
new() { Species = 750, Level = 41, Location = 146, Weather = Normal | Intense_Sun | Sandstorm }, // Mudsdale in Dusty Bowl
new() { Species = 185, Level = 41, Location = 146, Weather = Normal | Overcast | Intense_Sun | Icy | Sandstorm | Heavy_Fog }, // Sudowoodo in Dusty Bowl
new() { Species = 437, Level = 41, Location = 146, Weather = Normal | Stormy | Icy | Heavy_Fog }, // Bronzong in Dusty Bowl
new(SW ) { Species = 784, Level = 60, Location = 146, Ability = OnlyFirst, Weather = Normal | Intense_Sun | Icy | Sandstorm | Heavy_Fog }, // Kommo-o in Dusty Bowl
new( SH) { Species = 248, Level = 60, Location = 146, Weather = Normal | Intense_Sun | Icy | Sandstorm | Heavy_Fog }, // Tyranitar in Dusty Bowl
new() { Species = 213, Level = 34, Location = 146, Weather = All }, // Shuckle in Dusty Bowl
new() { Species = 330, Level = 51, Location = 146, Weather = Normal | Sandstorm }, // Flygon in Dusty Bowl
new() { Species = 526, Level = 51, Location = 146, Weather = Normal | Intense_Sun }, // Gigalith in Dusty Bowl
@ -335,10 +317,9 @@ internal static class Encounters8
new() { Species = 136, Level = 56, Location = 154, Weather = Intense_Sun }, // Flareon at the Lake of Outrage
new() { Species = 197, Level = 56, Location = 154, Weather = Sandstorm }, // Umbreon at the Lake of Outrage
new() { Species = 700, Level = 56, Location = 154, Weather = Heavy_Fog }, // Sylveon at the Lake of Outrage
};
private static readonly EncounterStatic8[] Encounter_SWSH_Strong1 =
{
// Strong 1
new() { Species = 079, Level = 12, Location = 016, ScriptedNoMarks = true, Form = 01, Shiny = Never }, // Slowpoke-1 at Wedgehurst Station
new() { Species = 321, Level = 80, Location = 186, Weather = All_IoA }, // Wailord in the Workout Sea
@ -370,8 +351,6 @@ internal static class Encounters8
new() { Species = 186, Level = 32, Location = 166, Weather = Stormy }, // Politoed in the Soothing Wetlands
new() { Species = 061, Level = 20, Location = 166, Weather = Stormy | Heavy_Fog }, // Poliwhirl in the Soothing Wetlands
new() { Species = 549, Level = 22, Location = 166, Weather = Intense_Sun }, // Lilligant in the Soothing Wetlands
new(SW ) { Species = 559, Level = 20, Location = 166, Weather = Overcast }, // Scraggy in the Soothing Wetlands
new( SH) { Species = 453, Level = 20, Location = 166, Weather = Overcast }, // Croagunk in the Soothing Wetlands
new() { Species = 663, Level = 32, Location = 166, Weather = Intense_Sun }, // Talonflame in the Soothing Wetlands
new() { Species = 026, Level = 26, Location = 166, Crossover = new(168), Weather = Thunderstorm }, // Raichu in the Soothing Wetlands, in the Forest of Focus
new() { Species = 184, Level = 21, Location = 166, Crossover = new(168), Weather = Heavy_Fog }, // Azumarill in the Soothing Wetlands, in the Forest of Focus
@ -380,20 +359,14 @@ internal static class Encounters8
//new() { Species = 834, Level = 21, Location = -1 }, // Drednaw
//new() { Species = 768, Level = 26, Location = -1 }, // Golisopod
new() { Species = 025, Level = 22, Location = 168, Weather = Normal | Overcast | Stormy }, // Pikachu in the Forest of Focus
new(SW ) { Species = 766, Level = 26, Location = 168 }, // Passimian in the Forest of Focus
new( SH) { Species = 765, Level = 26, Location = 168 }, // Oranguru in the Forest of Focus
new() { Species = 342, Level = 26, Location = 168, Weather = Overcast | Stormy }, // Crawdaunt in the Forest of Focus
new() { Species = 040, Level = 26, Location = 168, Weather = Heavy_Fog }, // Wigglytuff in the Forest of Focus
new() { Species = 028, Level = 26, Location = 168, Weather = Sandstorm }, // Sandslash in the Forest of Focus
new() { Species = 589, Level = 32, Location = 168, Weather = Sandstorm }, // Escavalier in the Forest of Focus
new() { Species = 104, Level = 20, Location = 168, Weather = Sandstorm }, // Cubone in the Forest of Focus
new() { Species = 545, Level = 32, Location = 168, Weather = Overcast }, // Scolipede in the Forest of Focus
new(SW ) { Species = 127, Level = 26, Location = 168, Weather = Intense_Sun }, // Pinsir in the Forest of Focus
new( SH) { Species = 214, Level = 26, Location = 168, Weather = Intense_Sun }, // Heracross in the Forest of Focus
new() { Species = 636, Level = 15, Location = 168, Weather = Intense_Sun }, // Larvesta in the Forest of Focus
new() { Species = 465, Level = 36, Location = 168, Weather = Intense_Sun }, // Tangrowth in the Forest of Focus
new(SW ) { Species = 616, Level = 20, Location = 168, Weather = Stormy }, // Shelmet in the Forest of Focus
new( SH) { Species = 704, Level = 20, Location = 168, Weather = Stormy }, // Goomy in the Forest of Focus
new() { Species = 172, Level = 20, Location = 168, Weather = Thunderstorm }, // Pichu in the Forest of Focus
new() { Species = 845, Level = 20, Location = 168, Weather = Normal | Raining | Intense_Sun | Heavy_Fog }, // Cramorant in the Forest of Focus
new() { Species = 617, Level = 32, Location = 168, Weather = Raining }, // Accelgor in the Forest of Focus
@ -452,10 +425,6 @@ internal static class Encounters8
new() { Species = 621, Level = 36, Location = 172 }, // Druddigon in Brawlers Cave
new() { Species = 055, Level = 26, Location = 172 }, // Golduck in Brawlers Cave
new() { Species = 526, Level = 42, Location = 172 }, // Gigalith in Brawlers Cave
new(SW ) { Species = 744, Level = 22, Location = 172, Crossover = new(174), Weather = Normal | Overcast }, // Rockruff on Challenge Road, Brawlers' Cave (c)
new( SH) { Species = 744, Level = 22, Location = 172, Crossover = new(174), Weather = Normal | Overcast | Intense_Sun | Heavy_Fog }, // Rockruff on Challenge Road, Brawlers' Cave (c)
new(SW ) { Species = 560, Level = 26, Location = 172, Crossover = new(174, 180), Weather = Stormy }, // Scrafty on Challenge Road, Brawlers Cave (c), Training Lowlands
new( SH) { Species = 454, Level = 26, Location = 172, Crossover = new(174, 180), Weather = Stormy }, // Toxicroak on Challenge Road, Brawlers Cave (c), Training Lowlands
new() { Species = 558, Level = 26, Location = 172, Crossover = new(174, 180), Weather = Sandstorm }, // Crustle on Challenge Road, Brawlers Cave (c), Training Lowlands
new() { Species = 340, Level = 42, Location = 172, Crossover = new(176) }, // Whiscash in Courageous Cavern, Brawlers' Cave
new() { Species = 620, Level = 28, Location = 174 }, // Mienshao on Challenge Road
@ -465,13 +434,7 @@ internal static class Encounters8
new() { Species = 745, Level = 32, Location = 174 }, // Lycanroc on Challenge Road
new() { Species = 745, Level = 32, Location = 174, Form = 01, Weather = Overcast }, // Lycanroc-1 on Challenge Road
new() { Species = 212, Level = 40, Location = 174, Weather = Sandstorm }, // Scizor on Challenge Road
new(SW ) { Species = 127, Level = 26, Location = 174, Weather = Intense_Sun }, // Pinsir on Challenge Road
new( SH) { Species = 214, Level = 26, Location = 174, Weather = Intense_Sun }, // Heracross on Challenge Road
new(SW ) { Species = 782, Level = 22, Location = 174, Weather = Intense_Sun | Sandstorm | Heavy_Fog }, // Jangmo-o on Challenge Road
new() { Species = 227, Level = 26, Location = 174, Weather = Normal | Raining | Intense_Sun | Sandstorm }, // Skarmory on Challenge Road
new() { Species = 426, Level = 26, Location = 174, Weather = Heavy_Fog }, // Drifblim on Challenge Road
new(SW ) { Species = 628, Level = 26, Location = 174, Weather = Overcast }, // Braviary on Challenge Road
new( SH) { Species = 630, Level = 26, Location = 174, Weather = Overcast }, // Mandibuzz on Challenge Road
new() { Species = 082, Level = 26, Location = 174, Weather = Thunderstorm }, // Magneton on Challenge Road
new() { Species = 507, Level = 28, Location = 174, Crossover = new(180), Weather = Normal | Heavy_Fog }, // Herdier on Challenge Road, Training Lowlands
new() { Species = 558, Level = 28, Location = 176 }, // Crustle in Courageous Cavern
@ -514,14 +477,12 @@ internal static class Encounters8
new() { Species = 764, Level = 28, Location = 180, Weather = Heavy_Fog }, // Comfey in the Training Lowlands
new() { Species = 452, Level = 28, Location = 180, Weather = Overcast | Intense_Sun }, // Drapion in the Training Lowlands
new() { Species = 279, Level = 28, Location = 180, Weather = Raining }, // Pelipper in the Training Lowlands
new(SW ) { Species = 127, Level = 28, Location = 180, Weather = Normal | Intense_Sun }, // Pinsir in the Training Lowlands
new( SH) { Species = 214, Level = 28, Location = 180, Weather = Normal | Intense_Sun }, // Heracross in the Training Lowlands
new() { Species = 227, Level = 26, Location = 174, Weather = Normal | Raining | Intense_Sun | Sandstorm }, // Skarmory on Challenge Road
new() { Species = 528, Level = 28, Location = 180, Weather = Overcast }, // Swoobat in the Training Lowlands
new() { Species = 241, Level = 28, Location = 180, Weather = Normal | Overcast | Intense_Sun }, // Miltank in the Training Lowlands
new() { Species = 082, Level = 28, Location = 180, Weather = Thunderstorm }, // Magneton in the Training Lowlands
new() { Species = 662, Level = 28, Location = 180, Weather = Intense_Sun }, // Fletchinder in the Training Lowlands
new() { Species = 227, Level = 26, Location = 180, Weather = Sandstorm }, // Skarmory in the Training Lowlands
new(SW ) { Species = 782, Level = 22, Location = 180, Weather = Sandstorm }, // Jangmo-o in Training Lowlands
new() { Species = 128, Level = 28, Location = 180, Weather = All_IoA }, // Tauros in the Training Lowlands
new() { Species = 687, Level = 28, Location = 180, Weather = Overcast | Raining }, // Malamar in the Training Lowlands
new() { Species = 549, Level = 28, Location = 180, Weather = Intense_Sun }, // Lilligant in the Training Lowlands
@ -543,8 +504,6 @@ internal static class Encounters8
new() { Species = 844, Level = 42, Location = 184, Weather = Normal | Intense_Sun | Heavy_Fog }, // Sandaconda in the Potbottom Desert
new() { Species = 637, Level = 50, Location = 184, Weather = Intense_Sun }, // Volcarona in the Potbottom Desert
new() { Species = 028, Level = 42, Location = 184, Weather = Sandstorm }, // Sandslash in the Potbottom Desert
new(SW ) { Species = 628, Level = 42, Location = 184, Weather = Normal | Overcast | Raining | Sandstorm | Intense_Sun | Heavy_Fog }, // Braviary in the Potbottom Desert
new( SH) { Species = 630, Level = 42, Location = 184, Weather = Normal | Overcast | Raining | Sandstorm | Intense_Sun | Heavy_Fog }, // Mandibuzz in the Potbottom Desert
new() { Species = 479, Level = 50, Location = 186, FlawlessIVCount = 3, Weather = Normal | Stormy | Intense_Sun | Heavy_Fog }, // Rotom in the Workout Sea
new() { Species = 479, Level = 50, Location = 186, Form = 01, Weather = Normal | Stormy | Intense_Sun | Heavy_Fog }, // Rotom-1 in the Workout Sea
new() { Species = 479, Level = 50, Location = 186, Form = 02, Weather = Normal | Stormy | Intense_Sun | Heavy_Fog }, // Rotom-2 in the Workout Sea
@ -564,10 +523,9 @@ internal static class Encounters8
new() { Species = 117, Level = 45, Location = 192, Weather = Normal | Overcast | Stormy | Intense_Sun | Heavy_Fog }, // Seadra in the Honeycalm Sea
new() { Species = 549, Level = 45, Location = 194, Weather = Normal | Intense_Sun }, // Lilligant on Honeycalm Island
new() { Species = 415, Level = 40, Location = 194, Weather = Overcast | Stormy }, // Combee on Honeycalm Island
};
private static readonly EncounterStatic8[] Encounter_SWSH_Strong2 =
{
// Strong 2
new() { Species = 144, Level = 70, Location = 208, Crossover = new(210, 212, 214), Moves = new(821,542,427, 375), FlawlessIVCount = 3, Shiny = Never, Ability = OnlyFirst, Form = 01, Weather = All_CT }, // Articuno-1 in the Crown Tundra
new() { Species = 145, Level = 70, Location = 122, Crossover = new(124, 126, 128, 130), Moves = new(823,065,179,116), FlawlessIVCount = 3, Shiny = Never, Ability = OnlyFirst, Form = 01, Weather = All }, // Zapdos-1 in a Wild Area
new() { Species = 146, Level = 70, Location = 164, Crossover = new(166, 170, 178, 186, 188, 190, 192), Moves = new(822,542,389,417), FlawlessIVCount = 3, Shiny = Never, Ability = OnlyFirst, Form = 01, Weather = All_IoA }, // Moltres-1 on the Isle of Armor
@ -603,8 +561,6 @@ internal static class Encounters8
new() { Species = 143, Level = 65, Location = 204, Weather = Normal | Intense_Sun }, // Snorlax on Slippery Slope
new() { Species = 872, Level = 60, Location = 204, Weather = Normal | Heavy_Fog }, // Snom on Slippery Slope
new() { Species = 832, Level = 63, Location = 204, Crossover = new(208), Weather = Normal | Intense_Sun }, // Dubwool on Slippery Slope, Frostpoint Field
new(SW ) { Species = 576, Level = 65, Location = 204, Crossover = new(208), Weather = Heavy_Fog }, // Gothitelle on Slippery Slope, Frostpoint Field
new( SH) { Species = 579, Level = 65, Location = 204, Crossover = new(208), Weather = Heavy_Fog }, // Reuniclus on Slippery Slope, Frostpoint Field
new() { Species = 461, Level = 63, Location = 204, Crossover = new(208), Weather = Overcast }, // Weavile on Slippery Slope, Frostpoint Field
new() { Species = 531, Level = 62, Location = 204, Crossover = new(208), Weather = Normal | Overcast | Intense_Sun | Icy | Heavy_Fog }, // Audino on Slippery Slope, Frostpoint Field
new() { Species = 615, Level = 62, Location = 204, Crossover = new(208, 210), Weather = Icy }, // Cryogonal on Slippery Slope, Frostpoint Field, Giants Bed
@ -628,8 +584,6 @@ internal static class Encounters8
new() { Species = 437, Level = 65, Location = 208, Crossover = new(222), Weather = Normal | Overcast }, // Bronzong in Frostpoint Field (c), Giants Foot
new() { Species = 029, Level = 60, Location = 210, Weather = Normal | Stormy | Intense_Sun }, // Nidoran♀ in the Giants Bed
new() { Species = 832, Level = 63, Location = 210 }, // Dubwool in the Giants Bed
new(SW ) { Species = 874, Level = 63, Location = 210, Weather = All_CT }, // Stonjourner in the Giants Bed
new( SH) { Species = 143, Level = 65, Location = 210, Weather = All_CT }, // Snorlax in the Giants Bed
new() { Species = 142, Level = 65, Location = 210, Weather = All_CT }, // Aerodactyl in the Giants Bed
new() { Species = 133, Level = 60, Location = 210 }, // Eevee in the Giants Bed
new() { Species = 470, Level = 63, Location = 210 }, // Leafeon in the Giants Bed
@ -666,7 +620,6 @@ internal static class Encounters8
new() { Species = 531, Level = 62, Location = 210, Crossover = new(222, 230), Weather = All_CT }, // Audino in the Giants Bed, Giants Foot
new() { Species = 130, Level = 67, Location = 210, Crossover = new(230), Weather = Normal | Overcast | Stormy | Intense_Sun | Icy }, // Gyarados in the Giants Bed, Ballimere Lake
new() { Species = 350, Level = 67, Location = 210, Crossover = new(230), Weather = Heavy_Fog }, // Milotic in the Giants Bed, Ballimere Lake
new( SH) { Species = 078, Level = 67, Location = 212, Form = 01, Weather = Heavy_Fog }, // Rapidash-1 in the Old Cemetery
new() { Species = 872, Level = 62, Location = 214, Weather = Normal | Overcast }, // Snom on Snowslide Slope
new() { Species = 698, Level = 62, Location = 214, Weather = Normal | Overcast | Stormy | Heavy_Fog }, // Amaura on Snowslide Slope
new() { Species = 621, Level = 65, Location = 214, Weather = Normal | Intense_Sun }, // Druddigon on Snowslide Slope
@ -690,33 +643,21 @@ internal static class Encounters8
new() { Species = 036, Level = 65, Location = 216, Weather = Overcast }, // Clefable in the Tunnel to the Top
new() { Species = 621, Level = 65, Location = 216, Weather = Overcast }, // Druddigon in the Tunnel to the Top
new() { Species = 478, Level = 65, Location = 216, Weather = Overcast }, // Froslass in the Tunnel to the Top
new(SW ) { Species = 371, Level = 65, Location = 216, Weather = Overcast }, // Bagon in the Tunnel to the Top
new( SH) { Species = 443, Level = 65, Location = 216, Weather = Overcast }, // Gible in the Tunnel to the Top
new(SW ) { Species = 373, Level = 68, Location = 216, Weather = Overcast }, // Salamence in the Tunnel to the Top
new( SH) { Species = 445, Level = 68, Location = 216, Weather = Overcast }, // Garchomp in the Tunnel to the Top
new() { Species = 703, Level = 65, Location = 216, Weather = Overcast }, // Carbink in the Tunnel to the Top
new() { Species = 041, Level = 63, Location = 216, Crossover = new(224), Weather = Overcast }, // Zubat in the Tunnel to the Top, Roaring-Sea Caves
new() { Species = 042, Level = 65, Location = 216, Weather = Normal | Overcast | Intense_Sun | Icy | Heavy_Fog }, // Golbat in the Tunnel to the Top
new() { Species = 873, Level = 65, Location = 218, Weather = Normal | Overcast | Intense_Sun | Icy | Heavy_Fog }, // Frosmoth on the Path to the Peak
new(SW ) { Species = 373, Level = 68, Location = 218, Weather = Intense_Sun }, // Salamence on the Path to the Peak
new( SH) { Species = 445, Level = 68, Location = 218, Weather = Intense_Sun }, // Garchomp on the Path to the Peak
new() { Species = 621, Level = 65, Location = 218 }, // Druddigon on the Path to the Peak
new() { Species = 851, Level = 67, Location = 222, Weather = Normal | Intense_Sun }, // Centiskorch at the Giants Foot
new() { Species = 879, Level = 67, Location = 222, Weather = Overcast | Stormy | Icy | Heavy_Fog }, // Copperajah at the Giants Foot
new() { Species = 534, Level = 67, Location = 222 }, // Conkeldurr at the Giants Foot
new(SW ) { Species = 138, Level = 63, Location = 222, Weather = All_CT }, // Omanyte at the Giants Foot
new( SH) { Species = 140, Level = 63, Location = 222, Weather = All_CT }, // Kabuto at the Giants Foot
new() { Species = 566, Level = 63, Location = 222, Weather = All_CT }, // Archen at the Giants Foot
new() { Species = 126, Level = 65, Location = 222, Weather = Intense_Sun }, // Magmar at the Giants Foot
new() { Species = 752, Level = 67, Location = 222, Crossover = new(230), Weather = Raining }, // Araquanid at Ballimere Lake, Giants Foot
new() { Species = 125, Level = 65, Location = 222, Crossover = new(230), Weather = Thunderstorm }, // Electabuzz at the Giants Foot, Ballimere Lake
//new() { Species = 567, Level = 67, Location = -1 }, // Archeops
new(SW ) { Species = 635, Level = 68, Location = 224, Weather = No_Sun_Sand }, // Hydreigon in Roaring-Sea Caves, weather from Frigid Sea
new( SH) { Species = 248, Level = 68, Location = 224, Weather = No_Sun_Sand }, // Tyranitar in Roaring-Sea Caves, weather from Frigid Sea
new() { Species = 448, Level = 67, Location = 224, Weather = Overcast }, // Lucario in Roaring-Sea Caves
new() { Species = 042, Level = 65, Location = 224, Weather = Overcast }, // Golbat in the Roaring-Sea Caves
new( SH) { Species = 141, Level = 68, Location = 224, Weather = Overcast }, // Kabutops in Roaring-Sea Caves
new(SW ) { Species = 139, Level = 68, Location = 224, Weather = Overcast }, // Omastar in Roaring-Sea Caves
new() { Species = 363, Level = 63, Location = 226, Weather = No_Sun_Sand }, // Spheal at the Frigid Sea
new() { Species = 364, Level = 65, Location = 226, Weather = No_Sun_Sand }, // Sealeo at the Frigid Sea
new() { Species = 564, Level = 63, Location = 226, Weather = Normal | Overcast | Stormy | Heavy_Fog }, // Tirtouga at the Frigid Sea
@ -724,7 +665,6 @@ internal static class Encounters8
new() { Species = 365, Level = 68, Location = 226, Weather = Normal | Overcast | Icy | Heavy_Fog }, // Walrein at the Frigid Sea
new() { Species = 565, Level = 67, Location = 226, Weather = Normal | Stormy | Intense_Sun }, // Carracosta at the Frigid Sea
new() { Species = 871, Level = 65, Location = 226, Weather = Thunderstorm }, // Pincurchin at the Frigid Sea
new( SH) { Species = 875, Level = 65, Location = 226, Weather = No_Sun_Sand }, // Eiscue at the Frigid Sea
new() { Species = 623, Level = 65, Location = 226, Crossover = new(228), Weather = All_CT }, // Golurk at the Frigid Sea (c), Three-Point Pass
new() { Species = 467, Level = 68, Location = 226, Crossover = new(230), Weather = Intense_Sun }, // Magmortar at Frigid Sea (c), Ballimere Lake
new() { Species = 466, Level = 68, Location = 226, Crossover = new(228, 230), Weather = Thunderstorm }, // Electivire at the Frigid Sea, Three-Point Pass, Ballimere Lake
@ -738,8 +678,6 @@ internal static class Encounters8
new() { Species = 547, Level = 65, Location = 230, Weather = Normal | Raining }, // Whimsicott at Ballimere Lake
new() { Species = 836, Level = 67, Location = 230, Weather = Normal | Stormy | Snowing | Heavy_Fog }, // Boltund at Ballimere Lake
new() { Species = 830, Level = 65, Location = 230, Weather = Raining | Intense_Sun }, // Eldegoss at Ballimere Lake
new(SW ) { Species = 876, Level = 65, Location = 230, Weather = Normal | Heavy_Fog }, // Indeedee at Ballimere Lake
new( SH) { Species = 876, Level = 65, Location = 230, Form = 01, Weather = Normal | Heavy_Fog }, // Indeedee-1 at Ballimere Lake
new() { Species = 696, Level = 63, Location = 230, Weather = All_CT }, // Tyrunt at Ballimere Lake
new() { Species = 213, Level = 65, Location = 230, Weather = Normal | Intense_Sun }, // Shuckle at Ballimere Lake
new() { Species = 820, Level = 68, Location = 230, Weather = All_Ballimere }, // Greedent at Ballimere Lake
@ -764,46 +702,97 @@ internal static class Encounters8
new() { Species = 820, Level = 68, Location = 234, Weather = All_Ballimere }, // Greedent at Dyna Tree Hill
};
public static readonly EncounterStatic8[] StaticSW =
{
new(SW ) { Species = 275, Level = 34, Location = 124, Weather = Normal | Overcast | Stormy | Heavy_Fog }, // Shiftry in the Dappled Grove
new(SW ) { Species = 784, Level = 60, Location = 146, Ability = OnlyFirst, Weather = Normal | Intense_Sun | Icy | Sandstorm | Heavy_Fog }, // Kommo-o in Dusty Bowl
new(SW ) { Species = 559, Level = 20, Location = 166, Weather = Overcast }, // Scraggy in the Soothing Wetlands
new(SW ) { Species = 766, Level = 26, Location = 168 }, // Passimian in the Forest of Focus
new(SW ) { Species = 127, Level = 26, Location = 168, Weather = Intense_Sun }, // Pinsir in the Forest of Focus
new(SW ) { Species = 616, Level = 20, Location = 168, Weather = Stormy }, // Shelmet in the Forest of Focus
new(SW ) { Species = 744, Level = 22, Location = 172, Crossover = new(174), Weather = Normal | Overcast }, // Rockruff on Challenge Road, Brawlers' Cave (c)
new(SW ) { Species = 560, Level = 26, Location = 172, Crossover = new(174, 180), Weather = Stormy }, // Scrafty on Challenge Road, Brawlers Cave (c), Training Lowlands
new(SW ) { Species = 127, Level = 26, Location = 174, Weather = Intense_Sun }, // Pinsir on Challenge Road
new(SW ) { Species = 782, Level = 22, Location = 174, Weather = Intense_Sun | Sandstorm | Heavy_Fog }, // Jangmo-o on Challenge Road
new(SW ) { Species = 628, Level = 26, Location = 174, Weather = Overcast }, // Braviary on Challenge Road
new(SW ) { Species = 127, Level = 28, Location = 180, Weather = Normal | Intense_Sun }, // Pinsir in the Training Lowlands
new(SW ) { Species = 782, Level = 22, Location = 180, Weather = Sandstorm }, // Jangmo-o in Training Lowlands
new(SW ) { Species = 628, Level = 42, Location = 184, Weather = Normal | Overcast | Raining | Sandstorm | Intense_Sun | Heavy_Fog }, // Braviary in the Potbottom Desert
new(SW ) { Species = 576, Level = 65, Location = 204, Crossover = new(208), Weather = Heavy_Fog }, // Gothitelle on Slippery Slope, Frostpoint Field
new(SW ) { Species = 874, Level = 63, Location = 210, Weather = All_CT }, // Stonjourner in the Giants Bed
new(SW ) { Species = 371, Level = 65, Location = 216, Weather = Overcast }, // Bagon in the Tunnel to the Top
new(SW ) { Species = 373, Level = 68, Location = 216, Weather = Overcast }, // Salamence in the Tunnel to the Top
new(SW ) { Species = 373, Level = 68, Location = 218, Weather = Intense_Sun }, // Salamence on the Path to the Peak
new(SW ) { Species = 138, Level = 63, Location = 222, Weather = All_CT }, // Omanyte at the Giants Foot
new(SW ) { Species = 635, Level = 68, Location = 224, Weather = No_Sun_Sand }, // Hydreigon in Roaring-Sea Caves, weather from Frigid Sea
new(SW ) { Species = 139, Level = 68, Location = 224, Weather = Overcast }, // Omastar in Roaring-Sea Caves
new(SW ) { Species = 876, Level = 65, Location = 230, Weather = Normal | Heavy_Fog }, // Indeedee at Ballimere Lake
};
public static readonly EncounterStatic8[] StaticSH =
{
new( SH) { Species = 272, Level = 34, Location = 124, Weather = Normal | Overcast | Stormy | Heavy_Fog }, // Ludicolo in the Dappled Grove
new( SH) { Species = 248, Level = 60, Location = 146, Weather = Normal | Intense_Sun | Icy | Sandstorm | Heavy_Fog }, // Tyranitar in Dusty Bowl
new( SH) { Species = 453, Level = 20, Location = 166, Weather = Overcast }, // Croagunk in the Soothing Wetlands
new( SH) { Species = 765, Level = 26, Location = 168 }, // Oranguru in the Forest of Focus
new( SH) { Species = 214, Level = 26, Location = 168, Weather = Intense_Sun }, // Heracross in the Forest of Focus
new( SH) { Species = 704, Level = 20, Location = 168, Weather = Stormy }, // Goomy in the Forest of Focus
new( SH) { Species = 744, Level = 22, Location = 172, Crossover = new(174), Weather = Normal | Overcast | Intense_Sun | Heavy_Fog }, // Rockruff on Challenge Road, Brawlers' Cave (c)
new( SH) { Species = 454, Level = 26, Location = 172, Crossover = new(174, 180), Weather = Stormy }, // Toxicroak on Challenge Road, Brawlers Cave (c), Training Lowlands
new( SH) { Species = 214, Level = 26, Location = 174, Weather = Intense_Sun }, // Heracross on Challenge Road
new( SH) { Species = 630, Level = 26, Location = 174, Weather = Overcast }, // Mandibuzz on Challenge Road
new( SH) { Species = 214, Level = 28, Location = 180, Weather = Normal | Intense_Sun }, // Heracross in the Training Lowlands
new( SH) { Species = 630, Level = 42, Location = 184, Weather = Normal | Overcast | Raining | Sandstorm | Intense_Sun | Heavy_Fog }, // Mandibuzz in the Potbottom Desert
new( SH) { Species = 579, Level = 65, Location = 204, Crossover = new(208), Weather = Heavy_Fog }, // Reuniclus on Slippery Slope, Frostpoint Field
new( SH) { Species = 143, Level = 65, Location = 210, Weather = All_CT }, // Snorlax in the Giants Bed
new( SH) { Species = 078, Level = 67, Location = 212, Form = 01, Weather = Heavy_Fog }, // Rapidash-1 in the Old Cemetery
new( SH) { Species = 443, Level = 65, Location = 216, Weather = Overcast }, // Gible in the Tunnel to the Top
new( SH) { Species = 445, Level = 68, Location = 216, Weather = Overcast }, // Garchomp in the Tunnel to the Top
new( SH) { Species = 445, Level = 68, Location = 218, Weather = Intense_Sun }, // Garchomp on the Path to the Peak
new( SH) { Species = 140, Level = 63, Location = 222, Weather = All_CT }, // Kabuto at the Giants Foot
new( SH) { Species = 248, Level = 68, Location = 224, Weather = No_Sun_Sand }, // Tyranitar in Roaring-Sea Caves, weather from Frigid Sea
new( SH) { Species = 141, Level = 68, Location = 224, Weather = Overcast }, // Kabutops in Roaring-Sea Caves
new( SH) { Species = 875, Level = 65, Location = 226, Weather = No_Sun_Sand }, // Eiscue at the Frigid Sea
new( SH) { Species = 876, Level = 65, Location = 230, Form = 01, Weather = Normal | Heavy_Fog }, // Indeedee-1 at Ballimere Lake
};
private const string tradeSWSH = "tradeswsh";
private static readonly string[][] TradeSWSH = Util.GetLanguageStrings10(tradeSWSH, "zh2");
private static readonly string[][] TradeNames = Util.GetLanguageStrings10(tradeSWSH, "zh2");
private static readonly string[] TradeOT_R1 = { string.Empty, "チホコ", "Regina", "Régiona", "Regionalia", "Regine", string.Empty, "Tatiana", "지민", "易蒂", "易蒂" };
private static readonly IndividualValueSet TradeIVs = new(15, 15, 15, 15, 15, 15);
private static readonly EncounterTrade8[] TradeGift_Regular =
public static readonly EncounterTrade8[] TradeSWSH =
{
new(SWSH, 052,18,08,000,04,5) { Ability = OnlySecond, TID7 = 263455, IVs = TradeIVs, DynamaxLevel = 1, OTGender = 0, Gender = 0, Nature = Nature.Timid, Relearn = new(387) }, // Meowth
new(SWSH, 819,10,01,044,01,2) { Ability = OnlyFirst, TID7 = 648753, IVs = TradeIVs, DynamaxLevel = 1, OTGender = 1, Gender = 0, Nature = Nature.Mild }, // Skwovet
new(SWSH, 546,23,11,000,09,5) { Ability = OnlyFirst, TID7 = 101154, IVs = TradeIVs, DynamaxLevel = 1, OTGender = 1, Gender = 1, Nature = Nature.Modest }, // Cottonee
new(SWSH, 175,25,02,010,10,6) { Ability = OnlySecond, TID7 = 109591, IVs = TradeIVs, DynamaxLevel = 1, OTGender = 1, Gender = 0, Nature = Nature.Timid, Relearn = new(791) }, // Togepi
new(SW , 856,30,09,859,08,3) { Ability = OnlySecond, TID7 = 101101, IVs = TradeIVs, DynamaxLevel = 1, OTGender = 0, Gender = 1, Nature = Nature.Quiet }, // Hatenna
new( SH, 859,30,43,000,07,6) { Ability = OnlyFirst, TID7 = 256081, IVs = TradeIVs, DynamaxLevel = 1, OTGender = 0, Gender = 0, Nature = Nature.Brave, Relearn = new(252) }, // Impidimp
new(SWSH, 562,35,16,310,15,5) { Ability = OnlyFirst, TID7 = 102534, IVs = TradeIVs, DynamaxLevel = 2, OTGender = 1, Gender = 0, Nature = Nature.Bold, Relearn = new(261) }, // Yamask
new(SW , 538,37,17,129,20,7) { Ability = OnlySecond, TID7 = 768945, IVs = TradeIVs, DynamaxLevel = 2, OTGender = 0, Gender = 0, Nature = Nature.Adamant }, // Throh
new( SH, 539,37,17,129,14,6) { Ability = OnlyFirst, TID7 = 881426, IVs = TradeIVs, DynamaxLevel = 2, OTGender = 0, Gender = 0, Nature = Nature.Adamant }, // Sawk
new(SWSH, 122,40,56,000,12,4) { Ability = OnlyFirst, TID7 = 891846, IVs = TradeIVs, DynamaxLevel = 1, OTGender = 0, Gender = 0, Nature = Nature.Calm }, // Mr. Mime
new(SWSH, 884,50,15,038,06,2) { Ability = OnlySecond, TID7 = 101141, IVs = TradeIVs, DynamaxLevel = 3, OTGender = 0, Gender = 0, Nature = Nature.Adamant, Relearn = new(400) }, // Duraludon
new(TradeNames, 00, SWSH, 052,18,08,000,04,5) { Ability = OnlySecond, ID32 = 263455, IVs = TradeIVs, DynamaxLevel = 1, OTGender = 0, Gender = 0, Nature = Nature.Timid, Relearn = new(387) }, // Meowth
new(TradeNames, 01, SWSH, 819,10,01,044,01,2) { Ability = OnlyFirst, ID32 = 648753, IVs = TradeIVs, DynamaxLevel = 1, OTGender = 1, Gender = 0, Nature = Nature.Mild }, // Skwovet
new(TradeNames, 02, SWSH, 546,23,11,000,09,5) { Ability = OnlyFirst, ID32 = 101154, IVs = TradeIVs, DynamaxLevel = 1, OTGender = 1, Gender = 1, Nature = Nature.Modest }, // Cottonee
new(TradeNames, 03, SWSH, 175,25,02,010,10,6) { Ability = OnlySecond, ID32 = 109591, IVs = TradeIVs, DynamaxLevel = 1, OTGender = 1, Gender = 0, Nature = Nature.Timid, Relearn = new(791) }, // Togepi
new(TradeNames, 06, SWSH, 562,35,16,310,15,5) { Ability = OnlyFirst, ID32 = 102534, IVs = TradeIVs, DynamaxLevel = 2, OTGender = 1, Gender = 0, Nature = Nature.Bold, Relearn = new(261) }, // Yamask
new(TradeNames, 09, SWSH, 122,40,56,000,12,4) { Ability = OnlyFirst, ID32 = 891846, IVs = TradeIVs, DynamaxLevel = 1, OTGender = 0, Gender = 0, Nature = Nature.Calm }, // Mr. Mime
new(TradeNames, 10, SWSH, 884,50,15,038,06,2) { Ability = OnlySecond, ID32 = 101141, IVs = TradeIVs, DynamaxLevel = 3, OTGender = 0, Gender = 0, Nature = Nature.Adamant, Relearn = new(400) }, // Duraludon
new(TradeOT_R1, SWSH, 052,15,01,033,04,2) { Ability = OnlyHidden, ID32 = 101141, FlawlessIVCount = 3, IVs = default, DynamaxLevel = 5, OTGender = 1, Relearn = new(387) }, // Meowth
new(TradeOT_R1, SWSH, 122,15,01,005,04,2) { Ability = OnlyHidden, ID32 = 101141, FlawlessIVCount = 3, IVs = default, DynamaxLevel = 5, OTGender = 1, Relearn = new(252) }, // Mr. Mime
new(TradeOT_R1, SWSH, 263,15,01,045,04,2) { Ability = OnlyHidden, ID32 = 101141, FlawlessIVCount = 3, IVs = default, DynamaxLevel = 5, OTGender = 1, Relearn = new(245) }, // Zigzagoon
new(TradeOT_R1, SWSH, 618,15,01,050,05,2) { Ability = OnlyHidden, ID32 = 101141, FlawlessIVCount = 3, IVs = default, DynamaxLevel = 5, OTGender = 1, Relearn = new(281) }, // Stunfisk
new(TradeOT_R1, SWSH, 110,15,01,040,12,2) { Ability = Any12H, ID32 = 101141, FlawlessIVCount = 3, IVs = default, DynamaxLevel = 5, OTGender = 1, Relearn = new(220) }, // Weezing
new(TradeOT_R1, SWSH, 103,15,01,038,06,2) { Ability = Any12, ID32 = 101141, FlawlessIVCount = 3, IVs = default, DynamaxLevel = 5, OTGender = 1, Relearn = new(246), Form = 1 }, // Exeggutor-1
new(TradeOT_R1, SWSH, 105,15,01,038,06,2) { Ability = Any12, ID32 = 101141, FlawlessIVCount = 3, IVs = default, DynamaxLevel = 5, OTGender = 1, Relearn = new(174), Form = 1 }, // Marowak-1
};
private static readonly EncounterTrade8[] TradeGift_R1 =
internal static readonly EncounterTrade8[] TradeSW =
{
new(SWSH, 052,15,01,033,04,2, Random) { Ability = OnlyHidden, TID7 = 101141, FlawlessIVCount = 3, DynamaxLevel = 5, OTGender = 1, IsNicknamed = false, Relearn = new(387) }, // Meowth
new(SW , 083,15,01,013,10,2, Random) { Ability = OnlyHidden, TID7 = 101141, FlawlessIVCount = 3, DynamaxLevel = 5, OTGender = 1, IsNicknamed = false, Relearn = new(098) }, // Farfetchd
new( SH, 222,15,01,069,12,2, Random) { Ability = OnlyHidden, TID7 = 101141, FlawlessIVCount = 3, DynamaxLevel = 5, OTGender = 1, IsNicknamed = false, Relearn = new(457) }, // Corsola
new( SH, 077,15,01,047,06,2, Random) { Ability = OnlyHidden, TID7 = 101141, FlawlessIVCount = 3, DynamaxLevel = 5, OTGender = 1, IsNicknamed = false, Relearn = new(234) }, // Ponyta
new(SWSH, 122,15,01,005,04,2, Random) { Ability = OnlyHidden, TID7 = 101141, FlawlessIVCount = 3, DynamaxLevel = 5, OTGender = 1, IsNicknamed = false, Relearn = new(252) }, // Mr. Mime
new(SW , 554,15,01,040,12,2, Random) { Ability = OnlyHidden, TID7 = 101141, FlawlessIVCount = 3, DynamaxLevel = 5, OTGender = 1, IsNicknamed = false, Relearn = new(326) }, // Darumaka
new(SWSH, 263,15,01,045,04,2, Random) { Ability = OnlyHidden, TID7 = 101141, FlawlessIVCount = 3, DynamaxLevel = 5, OTGender = 1, IsNicknamed = false, Relearn = new(245) }, // Zigzagoon
new(SWSH, 618,15,01,050,05,2, Random) { Ability = OnlyHidden, TID7 = 101141, FlawlessIVCount = 3, DynamaxLevel = 5, OTGender = 1, IsNicknamed = false, Relearn = new(281) }, // Stunfisk
new(SWSH, 110,15,01,040,12,2, Random) { Ability = Any12H, TID7 = 101141, FlawlessIVCount = 3, DynamaxLevel = 5, OTGender = 1, IsNicknamed = false, Relearn = new(220) }, // Weezing
new(SWSH, 103,15,01,038,06,2, Random) { TID7 = 101141, FlawlessIVCount = 3, DynamaxLevel = 5, OTGender = 1, IsNicknamed = false, Relearn = new(246), Form = 1 }, // Exeggutor-1
new(SWSH, 105,15,01,038,06,2, Random) { TID7 = 101141, FlawlessIVCount = 3, DynamaxLevel = 5, OTGender = 1, IsNicknamed = false, Relearn = new(174), Form = 1 }, // Marowak-1
new(TradeNames, 04, SW , 856,30,09,859,08,3) { Ability = OnlySecond, ID32 = 101101, IVs = TradeIVs, DynamaxLevel = 1, OTGender = 0, Gender = 1, Nature = Nature.Quiet }, // Hatenna
new(TradeNames, 07, SW , 538,37,17,129,20,7) { Ability = OnlySecond, ID32 = 768945, IVs = TradeIVs, DynamaxLevel = 2, OTGender = 0, Gender = 0, Nature = Nature.Adamant }, // Throh
new(TradeOT_R1, SW , 083,15,01,013,10,2) { Ability = OnlyHidden, ID32 = 101141, FlawlessIVCount = 3, IVs = default, DynamaxLevel = 5, OTGender = 1, Relearn = new(098) }, // Farfetchd
new(TradeOT_R1, SW , 554,15,01,040,12,2) { Ability = OnlyHidden, ID32 = 101141, FlawlessIVCount = 3, IVs = default, DynamaxLevel = 5, OTGender = 1, Relearn = new(326) }, // Darumaka
};
internal static readonly EncounterTrade8[] TradeGift_SWSH = ArrayUtil.ConcatAll(TradeGift_Regular, TradeGift_R1);
internal static readonly EncounterStatic[] StaticSW = ArrayUtil.ConcatAll(Nest_SW, Nest_SH, Dist_SW, Dist_SH, DynAdv_SWSH, Crystal_SWSH,
GetEncounters(new EncounterStatic[][] { Encounter_SWSH_0, Encounter_SWSH_Strong0, Encounter_SWSH_Strong1, Encounter_SWSH_Strong2 }, SH));
internal static readonly EncounterStatic[] StaticSH = ArrayUtil.ConcatAll(Nest_SW, Nest_SH, Dist_SW, Dist_SH, DynAdv_SWSH, Crystal_SWSH,
GetEncounters(new EncounterStatic[][] { Encounter_SWSH_0, Encounter_SWSH_Strong0, Encounter_SWSH_Strong1, Encounter_SWSH_Strong2 }, SW));
internal static readonly EncounterTrade8[] TradeSH =
{
new(TradeNames, 05, SH, 859,30,43,000,07,6) { Ability = OnlyFirst, ID32 = 256081, IVs = TradeIVs, DynamaxLevel = 1, OTGender = 0, Gender = 0, Nature = Nature.Brave, Relearn = new(252) }, // Impidimp
new(TradeNames, 08, SH, 539,37,17,129,14,6) { Ability = OnlyFirst, ID32 = 881426, IVs = TradeIVs, DynamaxLevel = 2, OTGender = 0, Gender = 0, Nature = Nature.Adamant }, // Sawk
new(TradeOT_R1, SH, 222,15,01,069,12,2) { Ability = OnlyHidden, ID32 = 101141, FlawlessIVCount = 3, IVs = default, DynamaxLevel = 5, OTGender = 1, Relearn = new(457) }, // Corsola
new(TradeOT_R1, SH, 077,15,01,047,06,2) { Ability = OnlyHidden, ID32 = 101141, FlawlessIVCount = 3, IVs = default, DynamaxLevel = 5, OTGender = 1, Relearn = new(234) }, // Ponyta
};
}

View file

@ -269,19 +269,19 @@ internal static class Encounters8Nest
internal static readonly EncounterStatic8NC[] Crystal_SWSH =
{
new(SWSH) { Species = 782, Level = 16, Ability = A3, Location = 126, IVs = new(31,31,31,-1,-1,-1), DynamaxLevel = 2, Moves = new(033,029,525,043) }, // ★And458 Jangmo-o
new(SWSH) { Species = 246, Level = 16, Ability = A3, Location = 126, IVs = new(31,31,31,-1,-1,-1), DynamaxLevel = 2, Moves = new(033,157,371,044) }, // ★And15 Larvitar
new(SWSH) { Species = 823, Level = 50, Ability = A2, Location = 126, IVs = new(31,31,31,-1,-1,31), DynamaxLevel = 5, Moves = new(065,442,034,796), CanGigantamax = true }, // ★And337 Gigantamax Corviknight
new(SWSH) { Species = 875, Level = 15, Ability = A3, Location = 126, IVs = new(31,31,-1,31,-1,-1), DynamaxLevel = 2, Moves = new(181,311,054,556) }, // ★And603 Eiscue
new(SWSH) { Species = 874, Level = 15, Ability = A3, Location = 126, IVs = new(31,31,31,-1,-1,-1), DynamaxLevel = 2, Moves = new(397,317,335,157) }, // ★And390 Stonjourner
new(SWSH) { Species = 879, Level = 35, Ability = A3, Location = 126, IVs = new(31,31,-1, 0,31,-1), DynamaxLevel = 4, Moves = new(484,174,776,583), CanGigantamax = true }, // ★Sgr6879 Gigantamax Copperajah
new(SWSH) { Species = 851, Level = 35, Ability = A2, Location = 126, IVs = new(31,31,31,-1,-1,-1), DynamaxLevel = 5, Moves = new(680,679,489,438), CanGigantamax = true }, // ★Sgr6859 Gigantamax Centiskorch
new(SW ) { Species = 842, Level = 40, Ability = A0, Location = 126, IVs = new(31,-1,31,-1,31,-1), DynamaxLevel = 5, Moves = new(787,412,406,076), CanGigantamax = true }, // ★Sgr6913 Gigantamax Appletun
new( SH) { Species = 841, Level = 40, Ability = A0, Location = 126, IVs = new(31,31,-1,31,-1,-1), DynamaxLevel = 5, Moves = new(788,491,412,406), CanGigantamax = true }, // ★Sgr6913 Gigantamax Flapple
new(SWSH) { Species = 844, Level = 40, Ability = A0, Location = 126, IVs = new(31,31,31,-1,-1,-1), DynamaxLevel = 5, Moves = new(523,776,489,157), CanGigantamax = true }, // ★Sgr7348 Gigantamax Sandaconda
new(SWSH) { Species = 884, Level = 40, Ability = A2, Location = 126, IVs = new(31,-1,-1,31,31,-1), DynamaxLevel = 5, Moves = new(796,063,784,319), CanGigantamax = true }, // ★Sgr7121 Gigantamax Duraludon
new(SWSH) { Species = 025, Level = 25, Ability = A2, Location = 126, IVs = new(31,31,31,-1,-1,-1), DynamaxLevel = 5, Moves = new(606,273,104,085), CanGigantamax = true }, // ★Sgr6746 Gigantamax Pikachu
new(SWSH) { Species = 133, Level = 25, Ability = A2, Location = 126, IVs = new(31,31,31,-1,-1,-1), DynamaxLevel = 5, Moves = new(606,273,038,129), CanGigantamax = true }, // ★Sgr7194 Gigantamax Eevee
new(SWSH) { Species = 782, Level = 16, Ability = A3, IVs = new(31,31,31,-1,-1,-1), DynamaxLevel = 2, Moves = new(033,029,525,043) }, // ★And458 Jangmo-o
new(SWSH) { Species = 246, Level = 16, Ability = A3, IVs = new(31,31,31,-1,-1,-1), DynamaxLevel = 2, Moves = new(033,157,371,044) }, // ★And15 Larvitar
new(SWSH) { Species = 823, Level = 50, Ability = A2, IVs = new(31,31,31,-1,-1,31), DynamaxLevel = 5, Moves = new(065,442,034,796), CanGigantamax = true }, // ★And337 Gigantamax Corviknight
new(SWSH) { Species = 875, Level = 15, Ability = A3, IVs = new(31,31,-1,31,-1,-1), DynamaxLevel = 2, Moves = new(181,311,054,556) }, // ★And603 Eiscue
new(SWSH) { Species = 874, Level = 15, Ability = A3, IVs = new(31,31,31,-1,-1,-1), DynamaxLevel = 2, Moves = new(397,317,335,157) }, // ★And390 Stonjourner
new(SWSH) { Species = 879, Level = 35, Ability = A3, IVs = new(31,31,-1, 0,31,-1), DynamaxLevel = 4, Moves = new(484,174,776,583), CanGigantamax = true }, // ★Sgr6879 Gigantamax Copperajah
new(SWSH) { Species = 851, Level = 35, Ability = A2, IVs = new(31,31,31,-1,-1,-1), DynamaxLevel = 5, Moves = new(680,679,489,438), CanGigantamax = true }, // ★Sgr6859 Gigantamax Centiskorch
new(SW ) { Species = 842, Level = 40, Ability = A0, IVs = new(31,-1,31,-1,31,-1), DynamaxLevel = 5, Moves = new(787,412,406,076), CanGigantamax = true }, // ★Sgr6913 Gigantamax Appletun
new( SH) { Species = 841, Level = 40, Ability = A0, IVs = new(31,31,-1,31,-1,-1), DynamaxLevel = 5, Moves = new(788,491,412,406), CanGigantamax = true }, // ★Sgr6913 Gigantamax Flapple
new(SWSH) { Species = 844, Level = 40, Ability = A0, IVs = new(31,31,31,-1,-1,-1), DynamaxLevel = 5, Moves = new(523,776,489,157), CanGigantamax = true }, // ★Sgr7348 Gigantamax Sandaconda
new(SWSH) { Species = 884, Level = 40, Ability = A2, IVs = new(31,-1,-1,31,31,-1), DynamaxLevel = 5, Moves = new(796,063,784,319), CanGigantamax = true }, // ★Sgr7121 Gigantamax Duraludon
new(SWSH) { Species = 025, Level = 25, Ability = A2, IVs = new(31,31,31,-1,-1,-1), DynamaxLevel = 5, Moves = new(606,273,104,085), CanGigantamax = true }, // ★Sgr6746 Gigantamax Pikachu
new(SWSH) { Species = 133, Level = 25, Ability = A2, IVs = new(31,31,31,-1,-1,-1), DynamaxLevel = 5, Moves = new(606,273,038,129), CanGigantamax = true }, // ★Sgr7194 Gigantamax Eevee
};
private static EncounterStatic8N[] GetBase(string name, GameVersion game)

View file

@ -1,13 +1,12 @@
using static PKHeX.Core.EncounterUtil;
using static PKHeX.Core.Shiny;
using static PKHeX.Core.GameVersion;
using static PKHeX.Core.EncounterStatic8aCorrelation;
namespace PKHeX.Core;
internal static class Encounters8a
{
internal static readonly EncounterArea8a[] SlotsLA = EncounterArea8a.GetAreas(Get("la", "la"), PLA);
internal static readonly EncounterArea8a[] SlotsLA = EncounterArea8a.GetAreas(Get("la", "la"));
private const byte M = 127; // Middle Height/Weight
private const byte A = 255; // Max Height/Weight for Alphas
@ -16,13 +15,13 @@ internal static class Encounters8a
internal static readonly EncounterStatic8a[] StaticLA =
{
// Gifts
new(722,000,05,M,M) { Location = 006, Gift = true, Method = Fixed, Ball = (int)Ball.LAPoke }, // Rowlet
new(155,000,05,M,M) { Location = 006, Gift = true, Method = Fixed, Ball = (int)Ball.LAPoke }, // Cyndaquil
new(501,000,05,M,M) { Location = 006, Gift = true, Method = Fixed, Ball = (int)Ball.LAPoke }, // Oshawott
new(037,001,40,M,M) { Location = 088, Gift = true, Method = Fixed, Ball = (int)Ball.LAPoke }, // Vulpix-1
new(483,000,65,M,M) { Location = 109, FlawlessIVCount = 3, Gift = true, Method = Fixed, Ball = (int)Ball.LAOrigin }, // Dialga
new(484,000,65,M,M) { Location = 109, FlawlessIVCount = 3, Gift = true, Method = Fixed, Ball = (int)Ball.LAOrigin }, // Palkia
new(493,000,75,M,M) { Location = 109, FlawlessIVCount = 3, Gift = true, Method = Fixed, Ball = (int)Ball.LAPoke, FatefulEncounter = true }, // Arceus
new(722,000,05,M,M) { Location = 006, FixedBall = Ball.LAPoke, Method = Fixed, }, // Rowlet
new(155,000,05,M,M) { Location = 006, FixedBall = Ball.LAPoke, Method = Fixed, }, // Cyndaquil
new(501,000,05,M,M) { Location = 006, FixedBall = Ball.LAPoke, Method = Fixed, }, // Oshawott
new(037,001,40,M,M) { Location = 088, FixedBall = Ball.LAPoke, Method = Fixed, }, // Vulpix-1
new(483,000,65,M,M) { Location = 109, FlawlessIVCount = 3, FixedBall = Ball.LAOrigin, Method = Fixed, }, // Dialga
new(484,000,65,M,M) { Location = 109, FlawlessIVCount = 3, FixedBall = Ball.LAOrigin, Method = Fixed, }, // Palkia
new(493,000,75,M,M) { Location = 109, FlawlessIVCount = 3, FixedBall = Ball.LAPoke, Method = Fixed, FatefulEncounter = true }, // Arceus
// Static Encounters - Scripted Table Slots
new(480,000,70,M,M) { Location = 111, FlawlessIVCount = 3, Moves = new(129,326,832,095) }, // Uxie
@ -38,14 +37,9 @@ internal static class Encounters8a
new(077,000,15 ) { Location = 014, Shiny = Always}, // Ponyta*
new(442,000,60,M,M) { Location = 043, FlawlessIVCount = 3 }, // Spiritomb
new(570,001,27 ) { Location = 027 }, // Zorua
new(570,001,28 ) { Location = 027 }, // Zorua
new(570,001,29 ) { Location = 027 }, // Zorua
new(570,001,27 ) { Location = 027, LevelMax = 29 }, // Zorua
new(489,000,33 ) { Location = 064, FatefulEncounter = true, Moves = new(145,352,151,428) }, // Phione
new(489,000,34 ) { Location = 064, FatefulEncounter = true, Moves = new(145,352,151,428) }, // Phione
new(489,000,35 ) { Location = 064, FatefulEncounter = true, Moves = new(145,352,151,428) }, // Phione
new(489,000,36 ) { Location = 064, FatefulEncounter = true, Moves = new(145,352,151,428) }, // Phione
new(489,000,33 ) { Location = 064, FatefulEncounter = true, LevelMax = 36, Moves = new(145,352,151,428) }, // Phione
new(490,000,50,M,M) { Location = 064, FlawlessIVCount = 3, FatefulEncounter = true, Moves = new(352,428,585,145) }, // Manaphy
new(491,000,70,M,M) { Location = 010, FlawlessIVCount = 3, FatefulEncounter = true, Moves = new(506,399,094,464) }, // Darkrai
new(492,000,70,M,M) { Location = 026, FlawlessIVCount = 3, FatefulEncounter = true, Moves = new(403,412,414,465) }, // Shaymin

View file

@ -15,30 +15,28 @@ internal static class Encounters8b
internal static readonly EncounterArea8b[] SlotsBD = ArrayUtil.ConcatAll(SlotsBD_OW, SlotsBD_UG);
internal static readonly EncounterArea8b[] SlotsSP = ArrayUtil.ConcatAll(SlotsSP_OW, SlotsSP_UG);
static Encounters8b() => MarkEncounterTradeStrings(TradeGift_BDSP, TradeBDSP);
private static readonly EncounterStatic8b[] Encounter_BDSP =
internal static readonly EncounterStatic8b[] Encounter_BDSP =
{
// Gifts
new(BDSP) { Gift = true, Species = 387, Level = 05, Location = 323 }, // Turtwig
new(BDSP) { Gift = true, Species = 390, Level = 05, Location = 323 }, // Chimchar
new(BDSP) { Gift = true, Species = 393, Level = 05, Location = 323 }, // Piplup
new(BDSP) { Gift = true, Species = 133, Level = 05, Location = 104 }, // Eevee
new(BDSP) { Gift = true, Species = 440, Level = 01, EggLocation = 60007, EggCycles = 40 }, // Happiny Egg from Traveling Man
new(BDSP) { Gift = true, Species = 447, Level = 01, EggLocation = 60005, EggCycles = 25 }, // Riolu Egg from Riley
new(BDSP) { FixedBall = Ball.Poke, Species = 387, Level = 05, Location = 323 }, // Turtwig
new(BDSP) { FixedBall = Ball.Poke, Species = 390, Level = 05, Location = 323 }, // Chimchar
new(BDSP) { FixedBall = Ball.Poke, Species = 393, Level = 05, Location = 323 }, // Piplup
new(BDSP) { FixedBall = Ball.Poke, Species = 133, Level = 05, Location = 104 }, // Eevee
new(BDSP) { FixedBall = Ball.Poke, Species = 440, Level = 01, EggLocation = 60007, Location = Locations.Default8bNone }, // Happiny Egg from Traveling Man
new(BDSP) { FixedBall = Ball.Poke, Species = 447, Level = 01, EggLocation = 60005, Location = Locations.Default8bNone }, // Riolu Egg from Riley
// Fossils
new(BDSP) { Gift = true, Species = 138, Level = 01, Location = 049, FlawlessIVCount = 3 }, // Omanyte
new(BDSP) { Gift = true, Species = 140, Level = 01, Location = 049, FlawlessIVCount = 3 }, // Kabuto
new(BDSP) { Gift = true, Species = 142, Level = 01, Location = 049, FlawlessIVCount = 3 }, // Aerodactyl
new(BDSP) { Gift = true, Species = 345, Level = 01, Location = 049, FlawlessIVCount = 3 }, // Lileep
new(BDSP) { Gift = true, Species = 347, Level = 01, Location = 049, FlawlessIVCount = 3 }, // Anorith
new(BDSP) { Gift = true, Species = 408, Level = 01, Location = 049, FlawlessIVCount = 3 }, // Cranidos
new(BDSP) { Gift = true, Species = 410, Level = 01, Location = 049, FlawlessIVCount = 3 }, // Shieldon
new(BDSP) { FixedBall = Ball.Poke, Species = 138, Level = 01, Location = 049, FlawlessIVCount = 3 }, // Omanyte
new(BDSP) { FixedBall = Ball.Poke, Species = 140, Level = 01, Location = 049, FlawlessIVCount = 3 }, // Kabuto
new(BDSP) { FixedBall = Ball.Poke, Species = 142, Level = 01, Location = 049, FlawlessIVCount = 3 }, // Aerodactyl
new(BDSP) { FixedBall = Ball.Poke, Species = 345, Level = 01, Location = 049, FlawlessIVCount = 3 }, // Lileep
new(BDSP) { FixedBall = Ball.Poke, Species = 347, Level = 01, Location = 049, FlawlessIVCount = 3 }, // Anorith
new(BDSP) { FixedBall = Ball.Poke, Species = 408, Level = 01, Location = 049, FlawlessIVCount = 3 }, // Cranidos
new(BDSP) { FixedBall = Ball.Poke, Species = 410, Level = 01, Location = 049, FlawlessIVCount = 3 }, // Shieldon
// Game-specific gifts
new(BDSP) { Gift = true, Species = 151, Level = 01, Ability = OnlySecond, Location = 438, Shiny = Never, FlawlessIVCount = 3, FatefulEncounter = true }, // Mew
new(BDSP) { Gift = true, Species = 385, Level = 05, Ability = OnlySecond, Location = 438, Shiny = Never, FlawlessIVCount = 3, FatefulEncounter = true }, // Jirachi
new(BDSP) { FixedBall = Ball.Poke, Species = 151, Level = 01, Ability = OnlySecond, Location = 438, Shiny = Never, FlawlessIVCount = 3, FatefulEncounter = true }, // Mew
new(BDSP) { FixedBall = Ball.Poke, Species = 385, Level = 05, Ability = OnlySecond, Location = 438, Shiny = Never, FlawlessIVCount = 3, FatefulEncounter = true }, // Jirachi
// Stationary
new(BDSP) { Species = 425, Level = 22, Location = 197, FlawlessIVCount = 3 }, // Drifloon
@ -46,14 +44,12 @@ internal static class Encounters8b
new(BDSP) { Species = 479, Level = 15, Location = 311 }, // Rotom
// Roamers
new(BDSP) { Species = 481, Level = 50, FlawlessIVCount = 3, Roaming = true }, // Mesprit
new(BDSP) { Species = 488, Level = 50, FlawlessIVCount = 3, Roaming = true }, // Cresselia
new(BDSP) { Species = 481, Level = 50, Location = 197, FlawlessIVCount = 3, Roaming = true }, // Mesprit
new(BDSP) { Species = 488, Level = 50, Location = 197, FlawlessIVCount = 3, Roaming = true }, // Cresselia
// Legendary
new(BDSP) { Species = 480, Level = 50, Location = 331, FlawlessIVCount = 3 }, // Uxie
new(BDSP) { Species = 482, Level = 50, Location = 328, FlawlessIVCount = 3 }, // Azelf
new(BD ) { Species = 483, Level = 47, Location = 216, FlawlessIVCount = 3 }, // Dialga
new( SP) { Species = 484, Level = 47, Location = 217, FlawlessIVCount = 3 }, // Palkia
new(BDSP) { Species = 485, Level = 70, Location = 262, FlawlessIVCount = 3 }, // Heatran
new(BDSP) { Species = 486, Level = 70, Location = 291, FlawlessIVCount = 3 }, // Regigigas
new(BDSP) { Species = 487, Level = 70, Location = 266, FlawlessIVCount = 3 }, // Giratina
@ -61,16 +57,8 @@ internal static class Encounters8b
// Mythical
new(BDSP) { Species = 491, Level = 50, Location = 333, FlawlessIVCount = 3, FatefulEncounter = true }, // Darkrai
new(BDSP) { Species = 492, Level = 30, Location = 285, FlawlessIVCount = 3, FatefulEncounter = true }, // Shaymin
new(BD ) { Species = 493, Level = 80, Location = 218, FlawlessIVCount = 3, FatefulEncounter = true }, // Arceus (Brilliant Diamond)
new( SP) { Species = 493, Level = 80, Location = 618, FlawlessIVCount = 3, FatefulEncounter = true }, // Arceus (Shining Pearl)
// Ramanas Park (Pure Space)
new( SP) { Species = 144, Level = 70, Location = 506, FlawlessIVCount = 3, Ability = OnlyHidden }, // Articuno
new( SP) { Species = 145, Level = 70, Location = 506, FlawlessIVCount = 3, Ability = OnlyHidden }, // Zapdos
new( SP) { Species = 146, Level = 70, Location = 506, FlawlessIVCount = 3, Ability = OnlyHidden }, // Moltres
new(BD ) { Species = 243, Level = 70, Location = 506, FlawlessIVCount = 3, Ability = OnlyHidden }, // Raikou
new(BD ) { Species = 244, Level = 70, Location = 506, FlawlessIVCount = 3, Ability = OnlyHidden }, // Entei
new(BD ) { Species = 245, Level = 70, Location = 506, FlawlessIVCount = 3, Ability = OnlyHidden }, // Suicune
new(BDSP) { Species = 377, Level = 70, Location = 506, FlawlessIVCount = 3, Ability = OnlyHidden }, // Regirock
new(BDSP) { Species = 378, Level = 70, Location = 506, FlawlessIVCount = 3, Ability = OnlyHidden }, // Regice
new(BDSP) { Species = 379, Level = 70, Location = 506, FlawlessIVCount = 3, Ability = OnlyHidden }, // Registeel
@ -79,24 +67,39 @@ internal static class Encounters8b
// Ramanas Park (Strange Space)
new(BDSP) { Species = 150, Level = 70, Location = 507, FlawlessIVCount = 3, Ability = OnlyHidden }, // Mewtwo
new( SP) { Species = 249, Level = 70, Location = 507, FlawlessIVCount = 3, Ability = OnlyHidden }, // Lugia
new(BD ) { Species = 250, Level = 70, Location = 507, FlawlessIVCount = 3, Ability = OnlyHidden }, // Ho-Oh
new(BDSP) { Species = 382, Level = 70, Location = 507, FlawlessIVCount = 3 }, // Kyogre
new(BDSP) { Species = 383, Level = 70, Location = 507, FlawlessIVCount = 3 }, // Groudon
new(BDSP) { Species = 384, Level = 70, Location = 507, FlawlessIVCount = 3 }, // Rayquaza
};
internal static readonly EncounterStatic8b[] StaticBD = GetEncounters(Encounter_BDSP, BD);
internal static readonly EncounterStatic8b[] StaticSP = GetEncounters(Encounter_BDSP, SP);
internal static readonly EncounterStatic8b[] StaticBD =
{
new(BD ) { Species = 483, Level = 47, Location = 216, FlawlessIVCount = 3 }, // Dialga
new(BD ) { Species = 493, Level = 80, Location = 218, FlawlessIVCount = 3, FatefulEncounter = true }, // Arceus (Brilliant Diamond)
new(BD ) { Species = 243, Level = 70, Location = 506, FlawlessIVCount = 3, Ability = OnlyHidden }, // Raikou
new(BD ) { Species = 244, Level = 70, Location = 506, FlawlessIVCount = 3, Ability = OnlyHidden }, // Entei
new(BD ) { Species = 245, Level = 70, Location = 506, FlawlessIVCount = 3, Ability = OnlyHidden }, // Suicune
new(BD ) { Species = 250, Level = 70, Location = 507, FlawlessIVCount = 3, Ability = OnlyHidden }, // Ho-Oh
};
internal static readonly EncounterStatic8b[] StaticSP =
{
new( SP) { Species = 484, Level = 47, Location = 217, FlawlessIVCount = 3 }, // Palkia
new( SP) { Species = 493, Level = 80, Location = 618, FlawlessIVCount = 3, FatefulEncounter = true }, // Arceus (Shining Pearl)
new( SP) { Species = 144, Level = 70, Location = 506, FlawlessIVCount = 3, Ability = OnlyHidden }, // Articuno
new( SP) { Species = 145, Level = 70, Location = 506, FlawlessIVCount = 3, Ability = OnlyHidden }, // Zapdos
new( SP) { Species = 146, Level = 70, Location = 506, FlawlessIVCount = 3, Ability = OnlyHidden }, // Moltres
new( SP) { Species = 249, Level = 70, Location = 507, FlawlessIVCount = 3, Ability = OnlyHidden }, // Lugia
};
private const string tradeBDSP = "tradebdsp";
private static readonly string[][] TradeBDSP = Util.GetLanguageStrings10(tradeBDSP, "zh2");
private static readonly string[][] TradeNames = Util.GetLanguageStrings10(tradeBDSP, "zh2");
internal static readonly EncounterTrade8b[] TradeGift_BDSP =
{
new(BDSP) { Species = 063, EncryptionConstant = 0x0000008E, PID = 0xFF50A8F5, Level = 09, Ability = OnlyFirst, Gender = 0, OTGender = 0, TID16 = 25643, IVs = new(28,10,09,31,11,03), Moves = new(100,000,000,000), HeightScalar = 029, WeightScalar = 202, Nature = Nature.Quiet }, // Abra
new(BDSP) { Species = 441, EncryptionConstant = 0x00000867, PID = 0x17DAAB19, Level = 15, Ability = OnlySecond, Gender = 1, OTGender = 0, TID16 = 44142, IVs = new(17,08,29,25,17,23), Moves = new(448,047,064,045), HeightScalar = 088, WeightScalar = 091, Nature = Nature.Lonely }, // Chatot
new(BDSP) { Species = 093, EncryptionConstant = 0x00000088, PID = 0xF60AB5BB, Level = 33, Ability = OnlyFirst, Gender = 0, OTGender = 0, TID16 = 19248, IVs = new(18,24,28,02,22,30), Moves = new(247,371,389,109), HeightScalar = 096, WeightScalar = 208, Nature = Nature.Hasty }, // Haunter
new(BDSP) { Species = 129, EncryptionConstant = 0x0000045C, PID = 0xFCE82F88, Level = 45, Ability = OnlyFirst, Gender = 1, OTGender = 0, TID16 = 53277, IVs = new(03,03,31,02,11,03), Moves = new(150,000,000,000), HeightScalar = 169, WeightScalar = 068, Nature = Nature.Mild }, // Magikarp
new(TradeNames, 00, BDSP) { Species = 063, EncryptionConstant = 0x0000008E, PID = 0xFF50A8F5, Level = 09, Ability = OnlyFirst, Gender = 0, OTGender = 0, ID32 = 25643, IVs = new(28,10,09,31,11,03), Moves = new(100,000,000,000), HeightScalar = 029, WeightScalar = 202, Nature = Nature.Quiet }, // Abra
new(TradeNames, 01, BDSP) { Species = 441, EncryptionConstant = 0x00000867, PID = 0x17DAAB19, Level = 15, Ability = OnlySecond, Gender = 1, OTGender = 0, ID32 = 44142, IVs = new(17,08,29,25,17,23), Moves = new(448,047,064,045), HeightScalar = 088, WeightScalar = 091, Nature = Nature.Lonely }, // Chatot
new(TradeNames, 02, BDSP) { Species = 093, EncryptionConstant = 0x00000088, PID = 0xF60AB5BB, Level = 33, Ability = OnlyFirst, Gender = 0, OTGender = 0, ID32 = 19248, IVs = new(18,24,28,02,22,30), Moves = new(247,371,389,109), HeightScalar = 096, WeightScalar = 208, Nature = Nature.Hasty }, // Haunter
new(TradeNames, 03, BDSP) { Species = 129, EncryptionConstant = 0x0000045C, PID = 0xFCE82F88, Level = 45, Ability = OnlyFirst, Gender = 1, OTGender = 0, ID32 = 53277, IVs = new(03,03,31,02,11,03), Moves = new(150,000,000,000), HeightScalar = 169, WeightScalar = 068, Nature = Nature.Mild }, // Magikarp
};
}

View file

@ -12,32 +12,15 @@ internal static class Encounters9
{
internal static readonly EncounterArea9[] Slots = EncounterArea9.GetAreas(Get("wild_paldea", "sv"), SV);
static Encounters9()
{
MarkEncounterTradeStrings(TradeGift_SV, TradeSV);
}
private static readonly EncounterStatic9[] Encounter_SV =
internal static readonly EncounterStatic9[] Encounter_SV =
{
// Starters
new(SV) { Gift = true, Species = 906, Shiny = Never, Level = 05, Location = 080, Ability = OnlyFirst, Size = 128 }, // Sprigatito
new(SV) { Gift = true, Species = 909, Shiny = Never, Level = 05, Location = 080, Ability = OnlyFirst, Size = 128 }, // Fuecoco
new(SV) { Gift = true, Species = 912, Shiny = Never, Level = 05, Location = 080, Ability = OnlyFirst, Size = 128 }, // Quaxly
// Galarian Meowth from Salvatore (Specific Met Location depending on game, inside Academy's Staff Quarters)
new(SL) { Gift = true, Species = 052, Shiny = Never, Level = 05, Location = 130, Form = 2, FlawlessIVCount = 3 }, // Meowth-2
new(VL) { Gift = true, Species = 052, Shiny = Never, Level = 05, Location = 131, Form = 2, FlawlessIVCount = 3 }, // Meowth-2
new(SV) { FixedBall = Ball.Poke, Species = 906, Shiny = Never, Level = 05, Location = 080, Ability = OnlyFirst, Size = 128 }, // Sprigatito
new(SV) { FixedBall = Ball.Poke, Species = 909, Shiny = Never, Level = 05, Location = 080, Ability = OnlyFirst, Size = 128 }, // Fuecoco
new(SV) { FixedBall = Ball.Poke, Species = 912, Shiny = Never, Level = 05, Location = 080, Ability = OnlyFirst, Size = 128 }, // Quaxly
// Scripted
new (SV) { Gift = true, Species = 734, Level = 02, Location = 064 }, // Yungoos level 2, no Marks in Inlet Grotto. Only Poké Ball available in early game.
// Box Legendary (Battle Form)
new(SL) { Species = 1007, Shiny = Never, Level = 72, Location = 124, Size = 128, Ability = OnlyFirst, Nature = Nature.Adamant, TeraType = GemType.Fighting, IVs = new(25,31,25,31,31,25), Moves = new(416,339,878,053) }, // Koraidon
new(VL) { Species = 1008, Shiny = Never, Level = 72, Location = 124, Size = 128, Ability = OnlyFirst, Nature = Nature.Modest, TeraType = GemType.Electric, IVs = new(25,31,25,31,31,25), Moves = new(063,268,879,408) }, // Miraidon
// Box Legendary (Ride Form)
new(SL) { Gift = true, Species = 1007, Shiny = Never, Level = 68, Location = 070, Ability = OnlyFirst, Size = 128, Nature = Nature.Quirky, TeraType = GemType.Dragon, IVs = new(31,31,28,31,31,28), Moves = new(053,878,203,851) }, // Koraidon
new(VL) { Gift = true, Species = 1008, Shiny = Never, Level = 68, Location = 070, Ability = OnlyFirst, Size = 128, Nature = Nature.Quirky, TeraType = GemType.Dragon, IVs = new(31,31,28,31,31,28), Moves = new(408,879,203,851) }, // Miraidon
new (SV) { FixedBall = Ball.Poke, Species = 734, Level = 02, Location = 064 }, // Yungoos level 2, no Marks in Inlet Grotto. Only Poké Ball available in early game.
// Treasures of Ruin
new(SV) { Species = 1001, Shiny = Never, Level = 60, Location = 006, Size = 128, FlawlessIVCount = 3 }, // Wo-Chien
@ -80,20 +63,56 @@ internal static class Encounters9
#endregion
};
internal static readonly EncounterStatic9[] StaticSL =
{
// Galarian Meowth from Salvatore (Specific Met Location depending on game, inside Academy's Staff Quarters)
new(SL) { FixedBall = Ball.Poke, Species = 052, Shiny = Never, Level = 05, Location = 130, Form = 2, FlawlessIVCount = 3 }, // Meowth-2
new(VL) { FixedBall = Ball.Poke, Species = 052, Shiny = Never, Level = 05, Location = 131, Form = 2, FlawlessIVCount = 3 }, // Meowth-2
// Box Legendary (Battle Form)
new(SL) { Species = 1007, Shiny = Never, Level = 72, Location = 124, Size = 128, Ability = OnlyFirst, Nature = Nature.Adamant, TeraType = GemType.Fighting, IVs = new(25,31,25,31,31,25), Moves = new(416,339,878,053) }, // Koraidon
new(VL) { Species = 1008, Shiny = Never, Level = 72, Location = 124, Size = 128, Ability = OnlyFirst, Nature = Nature.Modest, TeraType = GemType.Electric, IVs = new(25,31,25,31,31,25), Moves = new(063,268,879,408) }, // Miraidon
// Box Legendary (Ride Form)
new(SL) { FixedBall = Ball.Poke, Species = 1007, Shiny = Never, Level = 68, Location = 070, Ability = OnlyFirst, Size = 128, Nature = Nature.Quirky, TeraType = GemType.Dragon, IVs = new(31,31,28,31,31,28), Moves = new(053,878,203,851) }, // Koraidon
new(VL) { FixedBall = Ball.Poke, Species = 1008, Shiny = Never, Level = 68, Location = 070, Ability = OnlyFirst, Size = 128, Nature = Nature.Quirky, TeraType = GemType.Dragon, IVs = new(31,31,28,31,31,28), Moves = new(408,879,203,851) }, // Miraidon
// Former Titans
new(SV) { Species = 950, Shiny = Never, Level = 16, Location = 020, Size = 255, Ability = OnlyFirst, Gender = 1, Nature = Nature.Gentle, IVs = new(30,30,30,30,30,30), Moves = new(011,249,335,317), IsTitan = true }, // Klawf
new(SV) { Species = 962, Shiny = Never, Level = 20, Location = 022, Size = 255, Ability = OnlyHidden, Gender = 1, Nature = Nature.Jolly, IVs = new(30,30,30,30,30,30), Moves = new(088,017,365,259), IsTitan = true }, // Bombirdier
new(SV) { Species = 968, Shiny = Never, Level = 29, Location = 032, Size = 255, Ability = OnlyFirst, Gender = 0, Nature = Nature.Quirky, IVs = new(30,30,30,30,30,30), Moves = new(231,029,035,201), IsTitan = true }, // Orthworm
new(SL) { Species = 984, Shiny = Never, Level = 45, Location = 024, Size = 255, Ability = OnlyFirst, Nature = Nature.Naughty, IVs = new(30,30,30,30,30,30), Moves = new(229,280,282,707), IsTitan = true }, // Great Tusk
new(VL) { Species = 990, Shiny = Never, Level = 45, Location = 024, Size = 255, Ability = OnlyFirst, Nature = Nature.Naughty, IVs = new(30,30,30,30,30,30), Moves = new(229,442,282,707), IsTitan = true }, // Iron Treads
new(SV) { Species = 978, Shiny = Never, Level = 57, Location = 040, Size = 255, Ability = OnlyFirst, Gender = 0, Nature = Nature.Quiet, IVs = new(30,30,30,30,30,30), Moves = new(330,196,269,406), IsTitan = true }, // Tatsugiri
};
internal static readonly EncounterStatic9[] StaticVL =
{
// Galarian Meowth from Salvatore (Specific Met Location depending on game, inside Academy's Staff Quarters)
new(VL) { FixedBall = Ball.Poke, Species = 052, Shiny = Never, Level = 05, Location = 131, Form = 2, FlawlessIVCount = 3 }, // Meowth-2
// Box Legendary (Battle Form)
new(VL) { Species = 1008, Shiny = Never, Level = 72, Location = 124, Size = 128, Ability = OnlyFirst, Nature = Nature.Modest, TeraType = GemType.Electric, IVs = new(25,31,25,31,31,25), Moves = new(063,268,879,408) }, // Miraidon
// Box Legendary (Ride Form)
new(VL) { FixedBall = Ball.Poke, Species = 1008, Shiny = Never, Level = 68, Location = 070, Ability = OnlyFirst, Size = 128, Nature = Nature.Quirky, TeraType = GemType.Dragon, IVs = new(31,31,28,31,31,28), Moves = new(408,879,203,851) }, // Miraidon
// Former Titans
new(VL) { Species = 990, Shiny = Never, Level = 45, Location = 024, Size = 255, Ability = OnlyFirst, Nature = Nature.Naughty, IVs = new(30,30,30,30,30,30), Moves = new(229,442,282,707), IsTitan = true }, // Iron Treads
};
private const string tradeSV = "tradesv";
private static readonly string[][] TradeSV = Util.GetLanguageStrings10(tradeSV, "zh2");
private static readonly string[][] TradeNames = Util.GetLanguageStrings10(tradeSV, "zh2");
internal static readonly EncounterTrade9[] TradeGift_SV =
{
new(SV, 872,10) { TID7 = 050724, IVs = new(31,18,13,20,28,26), OTGender = 0, Gender = 1, Nature = Nature.Bashful }, // Snom
new(SV, 194,18) { Ability = OnlySecond, TID7 = 033081, IVs = new(27,18,25,13,16,31), OTGender = 1, Gender = 0, Nature = Nature.Relaxed }, // Wooper
new(SV, 093,25) { Ability = OnlyFirst, TID7 = 016519, IVs = new(14,20,25,31,28,16), OTGender = 1, Gender = 1, Nature = Nature.Lonely, EvolveOnTrade = true }, // Haunter
new(TradeNames, 00, SV, 872,10) { Ability = Any12, ID32 = 050724, IVs = new(31,18,13,20,28,26), OTGender = 0, Gender = 1, Nature = Nature.Bashful }, // Snom
new(TradeNames, 01, SV, 194,18) { Ability = OnlySecond, ID32 = 033081, IVs = new(27,18,25,13,16,31), OTGender = 1, Gender = 0, Nature = Nature.Relaxed }, // Wooper
new(TradeNames, 02, SV, 093,25) { Ability = OnlyFirst, ID32 = 016519, IVs = new(14,20,25,31,28,16), OTGender = 1, Gender = 1, Nature = Nature.Lonely, EvolveOnTrade = true }, // Haunter
};
private static readonly EncounterTera9[] Tera = EncounterTera9.GetArray(Get("gem_paldea"));
private static readonly EncounterDist9[] Dist = EncounterDist9.GetArray(Get("dist_paldea"));
private static readonly EncounterMight9[] Might = EncounterMight9.GetArray(Get("might_paldea"));
private static readonly EncounterFixed9[] Fixed = EncounterFixed9.GetArray(Get("fixed_paldea"));
internal static readonly EncounterStatic[] StaticSL = ArrayUtil.ConcatAll<EncounterStatic>(GetEncounters(Encounter_SV, SL), Tera, Dist, Might, Fixed);
internal static readonly EncounterStatic[] StaticVL = ArrayUtil.ConcatAll<EncounterStatic>(GetEncounters(Encounter_SV, VL), Tera, Dist, Might, Fixed);
internal static readonly EncounterTera9[] Tera = EncounterTera9.GetArray(Get("gem_paldea"));
internal static readonly EncounterDist9[] Dist = EncounterDist9.GetArray(Get("dist_paldea"));
internal static readonly EncounterMight9[] Might = EncounterMight9.GetArray(Get("might_paldea"));
internal static readonly EncounterFixed9[] Fixed = EncounterFixed9.GetArray(Get("fixed_paldea"));
}

View file

@ -1,22 +0,0 @@
namespace PKHeX.Core;
/// <summary>
/// Enumerates encounter match quality.
/// </summary>
public enum EncounterMatchRating
{
/// <summary> Matches all data, no other matches will be better. </summary>
Match,
/// <summary> Matches most data, might have a better match later. </summary>
Deferred,
/// <summary> Matches most data, might have a better match later. Less preferred than <see cref="Deferred"/> due to small errors in secondary data. </summary>
DeferredErrors,
/// <summary> Matches some data, but will likely have a better match later. </summary>
PartialMatch,
/// <summary> Unused -- only used as an initial "max" value that anything else will be more suitable of a match. </summary>
MaxNotMatch,
}

View file

@ -1,247 +0,0 @@
using System;
using static PKHeX.Core.Species;
namespace PKHeX.Core;
/// <summary>
/// Wild Encounter Slot data
/// </summary>
/// <remarks>Wild encounter slots are found as random encounters in-game.</remarks>
public abstract record EncounterSlot(EncounterArea Area, ushort Species, byte Form, byte LevelMin, byte LevelMax) : IEncounterable, IEncounterMatch, IEncounterFormRandom
{
public abstract int Generation { get; }
public abstract EntityContext Context { get; }
public bool EggEncounter => false;
public virtual bool IsShiny => false;
protected readonly EncounterArea Area = Area;
public GameVersion Version => Area.Version;
public int Location => Area.Location;
public int EggLocation => 0;
public virtual Ball FixedBall => Ball.None;
public virtual Shiny Shiny => Shiny.Random;
public bool IsFixedLevel => LevelMin == LevelMax;
public bool IsRandomLevel => LevelMin != LevelMax;
private protected const string wild = "Wild Encounter";
public string Name => wild;
/// <summary>
/// Gets if the specified level inputs are within range of the <see cref="LevelMin"/> and <see cref="LevelMax"/>
/// </summary>
/// <param name="lvl">Single level</param>
/// <returns>True if within slot's range, false if impossible.</returns>
public bool IsLevelWithinRange(int lvl) => LevelMin <= lvl && lvl <= LevelMax;
/// <summary>
/// Gets if the specified level inputs are within range of the <see cref="LevelMin"/> and <see cref="LevelMax"/>
/// </summary>
/// <param name="min">Highest value the low end of levels can be</param>
/// <param name="max">Lowest value the high end of levels can be</param>
/// <returns>True if within slot's range, false if impossible.</returns>
public bool IsLevelWithinRange(byte min, byte max) => LevelMin <= max && min <= LevelMax;
/// <summary>
/// Gets if the specified level inputs are within range of the <see cref="LevelMin"/> and <see cref="LevelMax"/>
/// </summary>
/// <param name="lvl">Single level</param>
/// <param name="minDecrease">Highest value the low end of levels can be</param>
/// <param name="maxIncrease">Lowest value the high end of levels can be</param>
/// <returns>True if within slot's range, false if impossible.</returns>
public bool IsLevelWithinRange(int lvl, int minDecrease, int maxIncrease) => LevelMin - minDecrease <= lvl && lvl <= LevelMax + maxIncrease;
/// <summary>
/// Gets if the specified level inputs are within range of the <see cref="LevelMin"/> and <see cref="LevelMax"/>
/// </summary>
/// <param name="min">Lowest level allowed</param>
/// <param name="max">Highest level allowed</param>
/// <param name="minDecrease">Highest value the low end of levels can be</param>
/// <param name="maxIncrease">Lowest value the high end of levels can be</param>
/// <returns>True if within slot's range, false if impossible.</returns>
public bool IsLevelWithinRange(byte min, byte max, int minDecrease, int maxIncrease) => LevelMin - minDecrease <= max && min <= LevelMax + maxIncrease;
public virtual string LongName
{
get
{
if (Area.Type == SlotType.Any)
return wild;
return $"{wild} {Area.Type.ToString().Replace('_', ' ')}";
}
}
public PKM ConvertToPKM(ITrainerInfo tr) => ConvertToPKM(tr, EncounterCriteria.Unrestricted);
public PKM ConvertToPKM(ITrainerInfo tr, EncounterCriteria criteria)
{
var pk = GetBlank();
tr.ApplyTo(pk);
ApplyDetails(tr, criteria, pk);
return pk;
}
protected virtual PKM GetBlank() => EntityBlank.GetBlank(Generation, Version);
protected virtual void ApplyDetails(ITrainerInfo sav, EncounterCriteria criteria, PKM pk)
{
var version = this.GetCompatibleVersion((GameVersion) sav.Game);
int lang = (int)Language.GetSafeLanguage(Generation, (LanguageID) sav.Language, version);
int level = LevelMin;
pk.Species = Species;
pk.Form = GetWildForm(pk, Form, sav);
pk.Language = lang;
pk.CurrentLevel = level;
pk.Version = (int)version;
pk.Nickname = SpeciesName.GetSpeciesNameGeneration(Species, lang, Generation);
ApplyDetailsBall(pk);
pk.Language = lang;
pk.OT_Friendship = pk.PersonalInfo.BaseFriendship;
SetMetData(pk, level, Location);
SetPINGA(pk, criteria);
SetEncounterMoves(pk, version, pk.CurrentLevel);
SetFormatSpecificData(pk);
if (pk.Format < 6)
return;
sav.ApplyHandlingTrainerInfo(pk);
if (pk is IScaledSize { HeightScalar: 0, WeightScalar: 0 } s)
{
s.HeightScalar = PokeSizeUtil.GetRandomScalar();
s.WeightScalar = PokeSizeUtil.GetRandomScalar();
}
}
protected virtual void ApplyDetailsBall(PKM pk)
{
var ball = FixedBall;
pk.Ball = (int)(ball == Ball.None ? Ball.Poke : ball);
}
protected virtual void SetEncounterMoves(PKM pk, GameVersion version, int level)
{
Span<ushort> moves = stackalloc ushort[4];
var source = GameData.GetLearnSource(version);
source.SetEncounterMoves(Species, Form, level, moves);
pk.SetMoves(moves);
pk.SetMaximumPPCurrent(moves);
}
protected virtual void SetFormatSpecificData(PKM pk) { }
protected virtual void SetPINGA(PKM pk, EncounterCriteria criteria)
{
var pi = pk.PersonalInfo;
int gender = criteria.GetGender(-1, pi);
int nature = (int)criteria.GetNature(Nature.Random);
var ability = criteria.GetAbilityFromNumber(Ability);
if (Generation == 3 && Species == (int)Unown)
{
do
{
PIDGenerator.SetRandomWildPID(pk, pk.Format, nature, ability, gender);
ability ^= 1; // some nature-forms cannot have a certain PID-ability set, so just flip it as Unown doesn't have dual abilities.
} while (pk.Form != Form);
}
else
{
PIDGenerator.SetRandomWildPID(pk, pk.Format, nature, ability, gender);
}
pk.Gender = gender;
pk.StatNature = nature;
}
private void SetMetData(PKM pk, int level, int location)
{
if (pk.Format <= 2 && Version != GameVersion.C)
return;
pk.Met_Location = location;
pk.Met_Level = level;
if (pk.Format >= 4)
pk.MetDate = DateOnly.FromDateTime(DateTime.Today);
}
public bool IsRandomUnspecificForm => Form >= FormDynamic;
private const int FormDynamic = FormVivillon;
protected internal const byte FormVivillon = 30;
protected internal const byte FormRandom = 31;
private static byte GetWildForm(PKM pk, byte form, ITrainerInfo sav)
{
if (form < FormDynamic) // specified form
return form;
if (form == FormRandom) // flagged as totally random
{
if (pk.Species == (int)Minior)
return (byte)Util.Rand.Next(7, 14);
return (byte)Util.Rand.Next(pk.PersonalInfo.FormCount);
}
ushort species = pk.Species;
if (species is >= (int)Scatterbug and <= (int)Vivillon)
{
if (sav is IRegionOrigin o)
return Vivillon3DS.GetPattern(o.Country, o.Region);
}
return 0;
}
public virtual string GetConditionString(out bool valid)
{
valid = true;
return LegalityCheckStrings.LEncCondition;
}
public bool IsMatchExact(PKM pk, EvoCriteria evo) => true; // Matched by Area
public virtual EncounterMatchRating GetMatchRating(PKM pk)
{
if (IsDeferredWurmple(pk))
return EncounterMatchRating.PartialMatch;
if (pk.Format >= 5)
{
bool isHidden = pk.AbilityNumber == 4;
if (isHidden && this.IsPartialMatchHidden(pk.Species, Species))
return EncounterMatchRating.PartialMatch;
if (IsDeferredHiddenAbility(isHidden))
return EncounterMatchRating.Deferred;
}
return EncounterMatchRating.Match;
}
protected virtual HiddenAbilityPermission IsHiddenAbilitySlot() => HiddenAbilityPermission.Never;
public AbilityPermission Ability => IsHiddenAbilitySlot() switch
{
HiddenAbilityPermission.Never => AbilityPermission.Any12,
HiddenAbilityPermission.Always => AbilityPermission.OnlyHidden,
_ => AbilityPermission.Any12H,
};
private bool IsDeferredWurmple(PKM pk) => Species == (int)Wurmple && pk.Species != (int)Wurmple && !WurmpleUtil.IsWurmpleEvoValid(pk);
private bool IsDeferredHiddenAbility(bool IsHidden) => IsHiddenAbilitySlot() switch
{
HiddenAbilityPermission.Never => IsHidden,
HiddenAbilityPermission.Always => !IsHidden,
_ => false,
};
protected enum HiddenAbilityPermission
{
Always,
Never,
Possible,
}
}

View file

@ -1,39 +0,0 @@
namespace PKHeX.Core;
/// <summary>
/// Encounter Slot found in <see cref="GameVersion.Gen1"/>.
/// </summary>
/// <inheritdoc cref="EncounterSlot"/>
public sealed record EncounterSlot1 : EncounterSlot, INumberedSlot
{
public override int Generation => 1;
public override EntityContext Context => EntityContext.Gen1;
public byte SlotNumber { get; }
public override Ball FixedBall => Ball.Poke;
public EncounterSlot1(EncounterArea1 area, byte species, byte min, byte max, byte slot) : base(area, species, 0, min, max)
{
SlotNumber = slot;
}
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,
_ => (byte)PersonalTable.RB[Species].CatchRate,
};
}
else
{
pk1.Catch_Rate = (byte)PersonalTable.RB[Species].CatchRate; // RB
}
}
}

View file

@ -1,93 +0,0 @@
using System;
namespace PKHeX.Core;
/// <summary>
/// Encounter Slot found in <see cref="GameVersion.Gen2"/>.
/// </summary>
/// <remarks>
/// Referenced Area object contains Time data which is used for <see cref="GameVersion.C"/> origin data.
/// </remarks>
/// <inheritdoc cref="EncounterSlot"/>
public sealed record EncounterSlot2 : EncounterSlot, INumberedSlot
{
public override int Generation => 2;
public override EntityContext Context => EntityContext.Gen2;
public byte SlotNumber { get; }
public override Ball FixedBall => Ball.Poke;
public bool IsHeadbutt => SlotType == SlotType.Headbutt;
public EncounterSlot2(EncounterArea2 area, byte species, byte min, byte max, byte slot) : base(area, species, species == 201 ? FormRandom : (byte)0, min, max)
{
SlotNumber = slot;
}
protected override void ApplyDetails(ITrainerInfo sav, EncounterCriteria criteria, PKM pk)
{
base.ApplyDetails(sav, criteria, pk);
var pk2 = (PK2)pk;
if (IsHeadbutt)
{
var id = pk2.TID16;
if (!IsTreeAvailable(id))
{
// Get a random TID that satisfies this slot.
do { id = (ushort)Util.Rand.Next(); }
while (!IsTreeAvailable(id));
pk2.TID16 = id;
}
}
if (Version == GameVersion.C)
pk2.Met_TimeOfDay = ((EncounterArea2)Area).Time.RandomValidTime();
}
private static ReadOnlySpan<byte> TreeIndexes => new byte[]
{
02, 04, 05, 08, 11, 12, 14, 15, 18, 20, 21, 25, 26, 34, 37, 38, 39, 91, 92,
};
private static ReadOnlySpan<int> Trees => new[]
{
0x3FF_3FF, // Route 29
0x0FF_3FF, // Route 30
0x3FE_3FF, // Route 31
0x3EE_3FF, // Route 32
0x240_3FF, // Route 33
0x37F_3FF, // Azalea Town
0x3FF_3FF, // Ilex Forest
0x001_3FE, // Route 34
0x261_3FF, // Route 35
0x3FF_3FF, // Route 36
0x2B9_3FF, // Route 37
0x3FF_3FF, // Route 38
0x184_3FF, // Route 39
0x3FF_3FF, // Route 42
0x3FF_3FF, // Route 43
0x3FF_3FF, // Lake of Rage
0x2FF_3FF, // Route 44
0x200_1FF, // Route 26
0x2BB_3FF, // Route 27
};
public bool IsTreeAvailable(ushort trainerID)
{
var treeIndex = TreeIndexes.BinarySearch((byte)Location);
if (treeIndex < 0)
return false;
var permissions = Trees[treeIndex];
var pivot = trainerID % 10;
var type = Area.Type;
return type switch
{
SlotType.Headbutt => (permissions & (1 << pivot)) != 0,
/*special*/ _ => (permissions & (1 << (pivot + 12))) != 0,
};
}
// we have "Special" bitflag. Strip it out.
public SlotType SlotType => Area.Type & (SlotType)0xF;
}

View file

@ -1,40 +0,0 @@
namespace PKHeX.Core;
/// <summary>
/// Encounter Slot found in <see cref="GameVersion.Gen3"/>.
/// </summary>
/// <inheritdoc cref="EncounterSlot"/>
public record EncounterSlot3 : EncounterSlot, IMagnetStatic, INumberedSlot, ISlotRNGType
{
public sealed override int Generation => 3;
public override EntityContext Context => EntityContext.Gen3;
public byte StaticIndex { get; }
public byte MagnetPullIndex { get; }
public byte StaticCount { get; }
public byte MagnetPullCount { get; }
public SlotType Type => Area.Type;
public byte SlotNumber { get; }
public override Ball FixedBall => Locations.IsSafariZoneLocation3(Location) ? Ball.Safari : Ball.None;
public EncounterSlot3(EncounterArea3 area, ushort species, byte form, byte min, byte max, byte slot, byte mpi, byte mpc, byte sti, byte stc) : base(area, species, form, min, max)
{
SlotNumber = slot;
MagnetPullIndex = mpi;
MagnetPullCount = mpc;
StaticIndex = sti;
StaticCount = stc;
}
public override EncounterMatchRating GetMatchRating(PKM pk)
{
if (IsDeferredSafari3(pk.Ball == (int)Ball.Safari))
return EncounterMatchRating.PartialMatch;
return base.GetMatchRating(pk);
}
private bool IsDeferredSafari3(bool IsSafariBall) => IsSafariBall != Locations.IsSafariZoneLocation3(Location);
}

View file

@ -1,33 +0,0 @@
namespace PKHeX.Core;
/// <summary>
/// Encounter Slot found in <see cref="GameVersion.XD"/>.
/// </summary>
/// <inheritdoc cref="EncounterSlot"/>
public sealed record EncounterSlot3PokeSpot : EncounterSlot, INumberedSlot, IFatefulEncounterReadOnly
{
public override int Generation => 3;
public override EntityContext Context => EntityContext.Gen3;
public bool FatefulEncounter => true;
public byte SlotNumber { get; }
public EncounterSlot3PokeSpot(EncounterArea3XD area, ushort species, byte min, byte max, byte slot) : base(area, species, 0, min, max)
{
SlotNumber = slot;
}
// PokeSpot encounters always have Fateful Encounter set.
protected override void SetFormatSpecificData(PKM pk) => pk.FatefulEncounter = true;
protected override void SetPINGA(PKM pk, EncounterCriteria criteria)
{
var pi = pk.PersonalInfo;
int gender = criteria.GetGender(-1, pi);
int nature = (int)criteria.GetNature(Nature.Random);
int ability = criteria.GetAbilityFromNumber(0);
PIDGenerator.SetRandomPokeSpotPID(pk, nature, gender, ability, SlotNumber);
pk.Gender = gender;
pk.StatNature = nature;
}
}

View file

@ -1,22 +0,0 @@
namespace PKHeX.Core;
/// <summary>
/// Encounter Slot found in <see cref="GameVersion.RSE"/>.
/// </summary>
/// <remarks>
/// Handled differently as these slots have fixed moves that are different from their normal level-up moves.
/// </remarks>
/// <inheritdoc cref="EncounterSlot"/>
internal sealed record EncounterSlot3Swarm : EncounterSlot3, IMoveset
{
public Moveset Moves { get; }
public EncounterSlot3Swarm(EncounterArea3 area, ushort species, byte min, byte max, byte slot,
Moveset moves) : base(area, species, 0, min, max, slot, 0, 0, 0, 0) => Moves = moves;
protected override void SetEncounterMoves(PKM pk, GameVersion version, int level)
{
pk.SetMoves(Moves);
pk.SetMaximumPPCurrent(Moves);
}
}

View file

@ -1,71 +0,0 @@
namespace PKHeX.Core;
/// <summary>
/// Encounter Slot found in <see cref="GameVersion.Gen4"/>.
/// </summary>
/// <inheritdoc cref="EncounterSlot"/>
public sealed record EncounterSlot4 : EncounterSlot, IMagnetStatic, INumberedSlot, IGroundTypeTile, ISlotRNGType
{
public override int Generation => 4;
public override EntityContext Context => EntityContext.Gen4;
public GroundTileAllowed GroundTile => ((EncounterArea4)Area).GroundTile;
public byte StaticIndex { get; }
public byte MagnetPullIndex { get; }
public byte StaticCount { get; }
public byte MagnetPullCount { get; }
public SlotType Type => Area.Type;
public byte SlotNumber { get; }
public override Ball FixedBall => GetRequiredBallValue();
public bool CanUseRadar => !GameVersion.HGSS.Contains(Version) && GroundTile.HasFlag(GroundTileAllowed.Grass);
public EncounterSlot4(EncounterArea4 area, ushort species, byte form, byte min, byte max, byte slot, byte mpi, byte mpc, byte sti, byte stc) : base(area, species, form, min, max)
{
SlotNumber = slot;
MagnetPullIndex = mpi;
MagnetPullCount = mpc;
StaticIndex = sti;
StaticCount = stc;
}
protected override void SetFormatSpecificData(PKM pk) => ((PK4)pk).GroundTile = GroundTile.GetIndex();
public override EncounterMatchRating GetMatchRating(PKM pk)
{
if ((pk.Ball == (int)Ball.Safari) != Locations.IsSafariZoneLocation4(Location))
return EncounterMatchRating.PartialMatch;
if ((pk.Ball == (int)Ball.Sport) != (Type == SlotType.BugContest))
{
// Nincada => Shedinja can wipe the ball back to Poke
if (pk.Species != (int)Core.Species.Shedinja || pk.Ball != (int)Ball.Poke)
return EncounterMatchRating.PartialMatch;
}
return base.GetMatchRating(pk);
}
protected override void SetPINGA(PKM pk, EncounterCriteria criteria)
{
int ctr = 0;
do
{
base.SetPINGA(pk, criteria);
var pidiv = MethodFinder.Analyze(pk);
var frames = FrameFinder.GetFrames(pidiv, pk);
foreach (var frame in frames)
{
if (frame.IsSlotCompatibile(this, pk))
return;
}
} while (ctr++ < 10_000);
}
private Ball GetRequiredBallValue()
{
if (Type is SlotType.BugContest)
return Ball.Sport;
return Locations.IsSafariZoneLocation4(Location) ? Ball.Safari : Ball.None;
}
}

View file

@ -1,19 +0,0 @@
namespace PKHeX.Core;
/// <summary>
/// Encounter Slot found in <see cref="GameVersion.Gen5"/>.
/// </summary>
/// <inheritdoc cref="EncounterSlot"/>
public sealed record EncounterSlot5 : EncounterSlot
{
public override int Generation => 5;
public override EntityContext Context => EntityContext.Gen5;
public EncounterSlot5(EncounterArea5 area, ushort species, byte form, byte min, byte max) : base(area, species, form, min, max)
{
}
public bool IsHiddenGrotto => Area.Type == SlotType.HiddenGrotto;
protected override HiddenAbilityPermission IsHiddenAbilitySlot() => Area.Type == SlotType.HiddenGrotto ? HiddenAbilityPermission.Always : HiddenAbilityPermission.Never;
}

View file

@ -1,65 +0,0 @@
using System;
namespace PKHeX.Core;
/// <summary>
/// Encounter Slot found in <see cref="GameVersion.ORAS"/>.
/// </summary>
/// <inheritdoc cref="EncounterSlot"/>
public sealed record EncounterSlot6AO : EncounterSlot
{
public override int Generation => 6;
public override EntityContext Context => EntityContext.Gen6;
public bool CanDexNav => Area.Type != SlotType.Rock_Smash;
public bool IsHorde => Area.Type == SlotType.Horde;
public bool Pressure { get; init; }
public bool DexNav { get; init; }
public bool WhiteFlute { get; init; }
public bool BlackFlute { get; init; }
public EncounterSlot6AO(EncounterArea6AO area, ushort species, byte form, byte min, byte max) : base(area, species, form, min, max)
{
}
protected override void SetFormatSpecificData(PKM pk)
{
var pk6 = (PK6)pk;
if (CanDexNav)
{
var eggMoves = GetDexNavMoves();
if (eggMoves.Length > 0)
pk6.RelearnMove1 = eggMoves[Util.Rand.Next(eggMoves.Length)];
}
pk6.SetRandomMemory6();
pk6.SetRandomEC();
}
public override string GetConditionString(out bool valid)
{
valid = true;
if (WhiteFlute) // Decreased Level Encounters
return Pressure ? LegalityCheckStrings.LEncConditionWhiteLead : LegalityCheckStrings.LEncConditionWhite;
if (BlackFlute) // Increased Level Encounters
return Pressure ? LegalityCheckStrings.LEncConditionBlackLead : LegalityCheckStrings.LEncConditionBlack;
if (DexNav)
return LegalityCheckStrings.LEncConditionDexNav;
return Pressure ? LegalityCheckStrings.LEncConditionLead : LegalityCheckStrings.LEncCondition;
}
protected override HiddenAbilityPermission IsHiddenAbilitySlot() => CanDexNav || IsHorde ? HiddenAbilityPermission.Possible : HiddenAbilityPermission.Never;
private ReadOnlySpan<ushort> GetDexNavMoves()
{
var et = EvolutionTree.Evolves6;
var baby = et.GetBaseSpeciesForm(Species, Form);
return LearnSource6AO.Instance.GetEggMoves(baby.Species, baby.Form);
}
public bool CanBeDexNavMove(ushort move)
{
var baseEgg = GetDexNavMoves();
return baseEgg.Contains(move);
}
}

View file

@ -1,35 +0,0 @@
namespace PKHeX.Core;
/// <summary>
/// Encounter Slot found in <see cref="GameVersion.XY"/>.
/// </summary>
/// <inheritdoc cref="EncounterSlot"/>
public sealed record EncounterSlot6XY : EncounterSlot
{
public override int Generation => 6;
public override EntityContext Context => EntityContext.Gen6;
public bool Pressure { get; init; }
public bool IsFriendSafari => Area.Type == SlotType.FriendSafari;
public bool IsHorde => Area.Type == SlotType.Horde;
public EncounterSlot6XY(EncounterArea6XY area, ushort species, byte form, byte min, byte max) : base(area, species, form, min, max)
{
}
protected override void SetFormatSpecificData(PKM pk)
{
var pk6 = (PK6)pk;
pk6.SetRandomMemory6();
pk6.SetRandomEC();
}
public override string GetConditionString(out bool valid)
{
valid = true;
return Pressure ? LegalityCheckStrings.LEncConditionLead : LegalityCheckStrings.LEncCondition;
}
public EncounterSlot6XY CreatePressureFormCopy(byte form) => this with {Form = form, Pressure = true};
protected override HiddenAbilityPermission IsHiddenAbilitySlot() => IsHorde || IsFriendSafari ? HiddenAbilityPermission.Possible : HiddenAbilityPermission.Never;
}

View file

@ -1,36 +0,0 @@
namespace PKHeX.Core;
/// <summary>
/// Encounter Slot found in <see cref="GameVersion.Gen7"/>.
/// </summary>
/// <inheritdoc cref="EncounterSlot"/>
public sealed record EncounterSlot7 : EncounterSlot
{
public override int Generation => 7;
public override EntityContext Context => EntityContext.Gen7;
public bool IsSOS => Area.Type == SlotType.SOS;
public EncounterSlot7(EncounterArea7 area, ushort species, byte form, byte min, byte max) : base(area, species, form, min, max)
{
}
protected override void SetPINGA(PKM pk, EncounterCriteria criteria)
{
var pi = pk.PersonalInfo;
pk.PID = Util.Rand32();
pk.Nature = (int)criteria.GetNature(Nature.Random);
pk.Gender = criteria.GetGender(-1, pi);
criteria.SetRandomIVs(pk);
var num = Ability;
if (IsSOS && pk.FlawlessIVCount < 2)
num = 0; // let's fake it as an insufficient chain, no HA possible.
var ability = criteria.GetAbilityFromNumber(num);
pk.RefreshAbility(ability);
pk.SetRandomEC();
}
protected override HiddenAbilityPermission IsHiddenAbilitySlot() => IsSOS ? HiddenAbilityPermission.Possible : HiddenAbilityPermission.Never;
public override Ball FixedBall => Location == Locations.Pelago7 ? Ball.Poke : Ball.None;
}

View file

@ -1,25 +0,0 @@
namespace PKHeX.Core;
/// <summary>
/// Encounter Slot found in <see cref="GameVersion.GG"/>.
/// </summary>
/// <inheritdoc cref="EncounterSlot"/>
public sealed record EncounterSlot7b : EncounterSlot
{
public override int Generation => 7;
public override EntityContext Context => EntityContext.Gen7b;
public EncounterSlot7b(EncounterArea7b area, ushort species, byte min, byte max) : base(area, species, 0, min, max)
{
}
protected override void ApplyDetails(ITrainerInfo sav, EncounterCriteria criteria, PKM pk)
{
base.ApplyDetails(sav, criteria, pk);
pk.SetRandomEC();
var pb = (PB7)pk;
pb.ResetHeight();
pb.ResetWeight();
pb.ResetCP();
}
}

View file

@ -1,138 +0,0 @@
using static PKHeX.Core.OverworldCorrelation8Requirement;
namespace PKHeX.Core;
/// <summary>
/// Encounter Slot found in <see cref="GameVersion.SWSH"/>.
/// </summary>
/// <inheritdoc cref="EncounterSlot"/>
public sealed record EncounterSlot8 : EncounterSlot, IOverworldCorrelation8
{
public readonly AreaWeather8 Weather;
public readonly AreaSlotType8 SlotType;
public override string LongName => $"{wild} [{SlotType}] - {Weather.ToString().Replace("_", string.Empty)}";
public override int Generation => 8;
public override EntityContext Context => EntityContext.Gen8;
// Fishing are only from the hidden table (not symbol).
public bool CanEncounterViaFishing => SlotType.CanEncounterViaFishing(Weather);
public bool CanEncounterViaCurry
{
get
{
if (!SlotType.CanEncounterViaCurry())
return false;
if ((Weather & AreaWeather8.All) == 0)
return false;
if (EncounterArea8.IsWildArea(Location))
return false;
return true;
}
}
public EncounterSlot8(EncounterArea8 area, ushort species, byte form, byte min, byte max, AreaWeather8 weather, AreaSlotType8 slotType) : base(area, species, form, min, max)
{
Weather = weather;
SlotType = slotType;
}
protected override void ApplyDetails(ITrainerInfo sav, EncounterCriteria criteria, PKM pk)
{
bool symbol = ((EncounterArea8)Area).PermitCrossover;
var c = symbol ? EncounterCriteria.Unrestricted : criteria;
if (!symbol && Location is 30 or 54 && (Weather & AreaWeather8.Fishing) == 0)
((PK8)pk).RibbonMarkCurry = true;
base.ApplyDetails(sav, c, pk);
if (Weather is AreaWeather8.Heavy_Fog && EncounterArea8.IsBoostedArea60Fog(Location))
pk.CurrentLevel = pk.Met_Level = EncounterArea8.BoostLevel;
var req = GetRequirement(pk);
if (req != MustHave)
{
pk.SetRandomEC();
return;
}
// Don't bother honoring shiny state.
Overworld8RNG.ApplyDetails(pk, c, Shiny.Random);
}
public OverworldCorrelation8Requirement GetRequirement(PKM pk)
{
if (((EncounterArea8)Area).PermitCrossover)
return MustHave; // symbol walking overworld
bool curry = pk is IRibbonSetMark8 {RibbonMarkCurry: true} || (pk.Species == (int)Core.Species.Shedinja && pk is IRibbonSetAffixed { AffixedRibbon:(int)RibbonIndex.MarkCurry});
if (curry)
return MustNotHave;
// Tree encounters are generated via the global seed, not the u32
if ((Weather & AreaWeather8.Shaking_Trees) != 0)
{
// Some tree encounters are present in the regular encounters.
return Weather == AreaWeather8.Shaking_Trees
? MustNotHave
: CanBeEither;
}
return MustHave;
}
public bool IsOverworldCorrelationCorrect(PKM pk)
{
var flawless = GetFlawlessIVCount(pk.Met_Level);
return Overworld8RNG.ValidateOverworldEncounter(pk, flawless: flawless);
}
private int GetFlawlessIVCount(int met)
{
const int none = 0;
const int any023 = -1;
// Brilliant encounters are boosted to max level for the slot.
if (met < LevelMax)
return none;
var area = (EncounterArea8) Area;
if (area.PermitCrossover)
return any023; // Symbol
if ((Weather & AreaWeather8.Fishing) != 0)
return any023; // Fishing
return none; // Hidden
}
public override EncounterMatchRating GetMatchRating(PKM pk)
{
bool isHidden = pk.AbilityNumber == 4;
if (isHidden && this.IsPartialMatchHidden(pk.Species, Species))
return EncounterMatchRating.PartialMatch;
if (pk is IRibbonSetMark8 m)
{
if (m.RibbonMarkCurry && (Weather & AreaWeather8.All) == 0)
return EncounterMatchRating.DeferredErrors;
if (m.RibbonMarkFishing && (Weather & AreaWeather8.Fishing) == 0)
return EncounterMatchRating.DeferredErrors;
// Check if it has a mark and the weather does not permit the mark.
// Tree/Fishing slots should be deferred here and are checked later.
if (!Weather.IsMarkCompatible(m))
return EncounterMatchRating.DeferredErrors;
// Galar Mine hidden encounters can only be found via Curry or Fishing.
if (Location is (30 or 54) && SlotType is AreaSlotType8.HiddenMain && !m.RibbonMarkCurry && !SlotType.CanEncounterViaFishing(Weather))
return EncounterMatchRating.DeferredErrors;
}
var req = GetRequirement(pk);
return req switch
{
MustHave when !IsOverworldCorrelationCorrect(pk) => EncounterMatchRating.DeferredErrors,
MustNotHave when IsOverworldCorrelationCorrect(pk) => EncounterMatchRating.DeferredErrors,
_ => EncounterMatchRating.Match,
};
}
}

View file

@ -1,94 +0,0 @@
using System;
namespace PKHeX.Core;
/// <summary>
/// Encounter Slot found in <see cref="GameVersion.BDSP"/>.
/// </summary>
/// <inheritdoc cref="EncounterSlot"/>
public sealed record EncounterSlot8b : EncounterSlot
{
public override int Generation => 8;
public override EntityContext Context => EntityContext.Gen8b;
public bool IsUnderground => Area.Location is (>= 508 and <= 617);
public bool IsMarsh => Area.Location is (>= 219 and <= 224);
public override Ball FixedBall => IsMarsh ? Ball.Safari : Ball.None;
public EncounterSlot8b(EncounterArea8b area, ushort species, byte form, byte min, byte max) : base(area, species, form, min, max)
{
}
public override EncounterMatchRating GetMatchRating(PKM pk)
{
bool isHidden = pk.AbilityNumber == 4;
if (isHidden && this.IsPartialMatchHidden(pk.Species, Species))
return EncounterMatchRating.PartialMatch;
return base.GetMatchRating(pk);
}
protected override void SetFormatSpecificData(PKM pk)
{
if (IsUnderground)
{
if (GetBaseEggMove(out var move1))
pk.RelearnMove1 = move1;
}
pk.SetRandomEC();
}
public bool CanBeUndergroundMove(ushort move)
{
var et = PersonalTable.BDSP;
var sf = et.GetFormEntry(Species, Form);
var species = sf.HatchSpecies;
var baseEgg = LearnSource8BDSP.Instance.GetEggMoves(species, 0);
if (baseEgg.Length == 0)
return move == 0;
return baseEgg.Contains(move);
}
public bool GetBaseEggMove(out ushort move)
{
var et = PersonalTable.BDSP;
var sf = et.GetFormEntry(Species, Form);
var species = sf.HatchSpecies;
var baseEgg = LearnSource8BDSP.Instance.GetEggMoves(species, 0);
if (baseEgg.Length == 0)
{
move = 0;
return false;
}
// Official method creates a new List<ushort>() with all the egg moves, removes all ignored, then picks a random index.
// However, the "excluded egg moves" list was unreferenced in v1.0, so all egg moves are allowed.
// We can't know which patch the encounter originated from, because they never added any new content.
var rnd = Util.Rand;
{
var index = rnd.Next(baseEgg.Length);
move = baseEgg[index];
return true;
}
}
public bool CanUseRadar => Area.Type is SlotType.Grass && !IsUnderground && !IsMarsh && Location switch
{
195 or 196 => false, // Oreburgh Mine
203 or 204 or 205 or 208 or 209 or 210 or 211 or 212 or 213 or 214 or 215 => false, // Mount Coronet, 206/207 exterior
>= 225 and <= 243 => false, // Solaceon Ruins
244 or 245 or 246 or 247 or 248 or 249 => false, // Victory Road
252 => false, // Ravaged Path
255 or 256 => false, // Oreburgh Gate
260 or 261 or 262 => false, // Stark Mountain, 259 exterior
>= 264 and <= 284 => false, // Turnback Cave
286 or 287 or 288 or 289 or 290 or 291 => false, // Snowpoint Temple
292 or 293 => false, // Wayward Cave
294 or 295 => false, // Ruin Maniac Cave
296 => false, // Maniac Tunnel
299 or 300 or 301 or 302 or 303 or 304 or 305 => false, // Iron Island, 298 exterior
306 or 307 or 308 or 309 or 310 or 311 or 312 or 313 or 314 => false, // Old Chateau
368 or 369 or 370 or 371 or 372 => false, // Route 209 (Lost Tower)
_ => true,
};
protected override HiddenAbilityPermission IsHiddenAbilitySlot() => CanUseRadar ? HiddenAbilityPermission.Possible : HiddenAbilityPermission.Never;
}

View file

@ -1,98 +0,0 @@
using System.Collections.Generic;
using static PKHeX.Core.AreaWeather9;
namespace PKHeX.Core;
/// <summary>
/// Encounter Slot found in <see cref="GameVersion.SV"/>.
/// </summary>
/// <inheritdoc cref="EncounterSlot"/>
public sealed record EncounterSlot9 : EncounterSlot
{
public override int Generation => 9;
public override EntityContext Context => EntityContext.Gen9;
public sbyte Gender { get; }
public byte Time { get; } // disallow at time bit flag
public EncounterSlot9(EncounterArea9 area, ushort species, byte form, byte min, byte max, sbyte gender, byte time) : base(area, species, form, min, max)
{
Gender = gender;
Time = time;
}
protected override void ApplyDetails(ITrainerInfo sav, EncounterCriteria criteria, PKM pk)
{
base.ApplyDetails(sav, criteria, pk);
var pk9 = (PK9)pk;
pk9.Obedience_Level = (byte)pk.Met_Level;
var rand = new Xoroshiro128Plus(Util.Rand.Rand64());
var type = Tera9RNG.GetTeraTypeFromPersonal(Species, Form, rand.Next());
pk9.TeraTypeOriginal = (MoveType)type;
if (criteria.TeraType != -1 && type != criteria.TeraType)
pk9.SetTeraType(type); // sets the override type
if (Gender != -1)
pk.Gender = (byte)Gender;
pk9.Scale = PokeSizeUtil.GetRandomScalar();
if (Species == (int)Core.Species.Toxtricity)
pk.Nature = ToxtricityUtil.GetRandomNature(ref rand, Form);
pk9.EncryptionConstant = Util.Rand32();
}
private static int GetTime(RibbonIndex mark) => mark switch
{
RibbonIndex.MarkLunchtime => 0,
RibbonIndex.MarkSleepyTime => 1,
RibbonIndex.MarkDusk => 2,
RibbonIndex.MarkDawn => 3,
_ => 4,
};
public bool CanSpawnAtTime(RibbonIndex mark) => (Time & (1 << GetTime(mark))) == 0;
public bool CanSpawnInWeather(RibbonIndex mark)
{
if (AreaWeather.TryGetValue((byte)Area.Location, out var areaWeather))
return areaWeather.IsMarkCompatible(mark);
return false;
}
/// <summary>
/// Location IDs matched with possible weather types.
/// </summary>
internal static readonly Dictionary<byte, AreaWeather9> AreaWeather = new()
{
{ 6, Standard }, // South Province (Area One)
{ 10, Standard }, // Pokémon League
{ 12, Standard }, // South Province (Area Two)
{ 14, Standard }, // South Province (Area Four)
{ 16, Standard }, // South Province (Area Six)
{ 18, Standard }, // South Province (Area Five)
{ 20, Standard }, // South Province (Area Three)
{ 22, Standard }, // West Province (Area One)
{ 24, Sand }, // Asado Desert
{ 26, Standard }, // West Province (Area Two)
{ 28, Standard }, // West Province (Area Three)
{ 30, Standard }, // Tagtree Thicket
{ 32, Standard }, // East Province (Area Three)
{ 34, Standard }, // East Province (Area One)
{ 36, Standard }, // East Province (Area Two)
{ 38, Snow }, // Glaseado Mountain (1)
{ 40, Standard }, // Casseroya Lake
{ 44, Standard }, // North Province (Area Three)
{ 46, Standard }, // North Province (Area One)
{ 48, Standard }, // North Province (Area Two)
{ 50, Standard }, // Great Crater of Paldea
{ 56, Standard }, // South Paldean Sea
{ 58, Standard }, // West Paldean Sea
{ 60, Standard }, // East Paldean Sea
{ 62, Standard }, // North Paldean Sea
{ 64, Inside }, // Inlet Grotto
{ 67, Inside }, // Alfornada Cavern
{ 69, Standard | Inside | Snow | Snow },// Dalizapa Passage (Near Medali, Tunnels, Near Pokémon Center, Near Zapico)
{ 70, Standard }, // Poco Path
{ 80, Standard }, // Cabo Poco
{ 109, Standard }, // Socarrat Trail
{ 124, Inside }, // Area Zero (5)
};
}

View file

@ -1,58 +0,0 @@
using System;
namespace PKHeX.Core;
/// <summary>
/// Encounter Slot found in <see cref="GameVersion.Gen7"/> (GO Park, <seealso cref="GameVersion.GG"/>).
/// <inheritdoc cref="EncounterSlotGO" />
/// </summary>
public sealed record EncounterSlot7GO : EncounterSlotGO
{
public override int Generation => 7;
public override EntityContext Context => EntityContext.Gen7b;
public override Ball FixedBall => Ball.None; // GO Park can override the ball; obey capture rules for LGP/E
public EncounterSlot7GO(EncounterArea7g area, ushort species, byte form, int start, int end, Shiny shiny, Gender gender, PogoType type)
: base(area, species, form, start, end, shiny, gender, type)
{
}
protected override PB7 GetBlank() => new();
protected override void ApplyDetails(ITrainerInfo sav, EncounterCriteria criteria, PKM pk)
{
base.ApplyDetails(sav, criteria, pk);
var pb = (PB7) pk;
pb.AwakeningSetAllTo(2);
pk.SetRandomEC();
pb.HeightScalar = PokeSizeUtil.GetRandomScalar();
pb.WeightScalar = PokeSizeUtil.GetRandomScalar();
pb.ResetHeight();
pb.ResetWeight();
pb.ResetCP();
}
protected override void SetPINGA(PKM pk, EncounterCriteria criteria)
{
var pi = pk.PersonalInfo;
int gender = criteria.GetGender(-1, pi);
int nature = (int)criteria.GetNature(Nature.Random);
var ability = criteria.GetAbilityFromNumber(Ability);
pk.PID = Util.Rand32();
pk.Nature = pk.StatNature = nature;
pk.Gender = gender;
pk.RefreshAbility(ability);
pk.SetRandomIVsGO();
base.SetPINGA(pk, criteria);
}
protected override void SetEncounterMoves(PKM pk, GameVersion version, int level)
{
Span<ushort> moves = stackalloc ushort[4];
ILearnSource source = LearnSource7GG.Instance;
source.SetEncounterMoves(Species, Form, level, moves);
pk.SetMoves(moves);
pk.SetMaximumPPCurrent(moves);
}
}

View file

@ -1,151 +0,0 @@
using System;
namespace PKHeX.Core;
/// <summary>
/// Contains details about an encounter that can be found in <see cref="GameVersion.GO"/>.
/// </summary>
public abstract record EncounterSlotGO : EncounterSlot, IPogoSlot
{
/// <inheritdoc/>
public int StartDate { get; }
/// <inheritdoc/>
public int EndDate { get; }
public override Shiny Shiny { get; }
/// <inheritdoc/>
public PogoType Type { get; }
/// <inheritdoc/>
public Gender Gender { get; }
public override bool IsShiny => Shiny.IsShiny();
public override Ball FixedBall => Type.GetValidBall();
protected EncounterSlotGO(EncounterArea area, ushort species, byte form, int start, int end, Shiny shiny, Gender gender, PogoType type) : base(area, species, form, type.GetMinLevel(), EncountersGO.MAX_LEVEL)
{
StartDate = start;
EndDate = end;
Shiny = shiny;
Gender = gender;
Type = type;
}
public sealed override string LongName
{
get
{
var init = $"{Name} ({Type})";
if (StartDate == 0 && EndDate == 0)
return init;
return $"{init}: {GetDateString(StartDate)}-{GetDateString(EndDate)}";
}
}
private static string GetDateString(int time) => time == 0 ? "X" : $"{GetDate(time):yyyy.MM.dd}";
private static DateOnly GetDate(int time)
{
var d = time & 0xFF;
var m = (time >> 8) & 0xFF;
var y = time >> 16;
return new DateOnly(y, m, d);
}
public bool IsWithinStartEnd(int stamp)
{
if (EndDate == 0)
return StartDate <= stamp && GetDate(stamp) <= GetMaxDate();
if (StartDate == 0)
return stamp <= EndDate;
return StartDate <= stamp && stamp <= EndDate;
}
/// <summary>
/// Converts a split timestamp into a single integer.
/// </summary>
public static int GetTimeStamp(int year, int month, int day) => (year << 16) | (month << 8) | day;
private static DateOnly GetMaxDate() => DateOnly.FromDateTime(DateTime.UtcNow.AddHours(12)); // UTC+12 for Kiribati, no daylight savings
/// <summary>
/// Gets a random date within the availability range.
/// </summary>
public DateOnly GetRandomValidDate()
{
if (StartDate == 0)
return EndDate == 0 ? GetMaxDate() : GetDate(EndDate);
var start = GetDate(StartDate);
if (EndDate == 0)
return start;
var end = GetDate(EndDate);
return DateUtil.GetRandomDateWithin(start, end);
}
protected override void ApplyDetails(ITrainerInfo sav, EncounterCriteria criteria, PKM pk)
{
base.ApplyDetails(sav, criteria, pk);
if (StartDate != 0 || EndDate != 0)
pk.MetDate = GetRandomValidDate();
if (Gender != Gender.Random)
pk.Gender = (int)Gender;
pk.SetRandomIVsGO(Type.GetMinIV());
}
public bool GetIVsAboveMinimum(PKM pk)
{
int min = Type.GetMinIV();
if (min == 0)
return true;
return GetIVsAboveMinimum(pk, min);
}
private static bool GetIVsAboveMinimum(PKM pk, int min)
{
if (pk.IV_ATK >> 1 < min) // ATK
return false;
if (pk.IV_DEF >> 1 < min) // DEF
return false;
return pk.IV_HP >> 1 >= min; // HP
}
public bool GetIVsValid(PKM pk)
{
if (!GetIVsAboveMinimum(pk))
return false;
// HP * 2 | 1 -> HP
// ATK * 2 | 1 -> ATK&SPA
// DEF * 2 | 1 -> DEF&SPD
// Speed is random.
// All IVs must be odd (except speed) and equal to their counterpart.
if ((pk.GetIV(1) & 1) != 1 || pk.GetIV(1) != pk.GetIV(4)) // ATK=SPA
return false;
if ((pk.GetIV(2) & 1) != 1 || pk.GetIV(2) != pk.GetIV(5)) // DEF=SPD
return false;
return (pk.GetIV(0) & 1) == 1; // HP
}
protected override void SetPINGA(PKM pk, EncounterCriteria criteria)
{
switch (Shiny)
{
case Shiny.Random when !pk.IsShiny && criteria.Shiny.IsShiny():
case Shiny.Always when !pk.IsShiny: // Force Square
var low = pk.PID & 0xFFFF;
pk.PID = ((low ^ pk.TID16 ^ pk.SID16 ^ 0) << 16) | low;
break;
case Shiny.Random when pk.IsShiny && !criteria.Shiny.IsShiny():
case Shiny.Never when pk.IsShiny: // Force Not Shiny
pk.PID ^= 0x1000_0000;
break;
}
}
}

View file

@ -1,23 +0,0 @@
namespace PKHeX.Core;
/// <summary>
/// Stores details about <see cref="GameVersion.GO"/> encounters relevant for legality.
/// </summary>
public interface IPogoSlot
{
/// <summary> Start date the encounter became available. If zero, no date specified (unbounded start). </summary>
int StartDate { get; }
/// <summary> Last day the encounter was available. If zero, no date specified (unbounded finish). </summary>
/// <remarks> If there is no end date (yet), we'll try to clamp to a date in the near-future to prevent it from being open-ended. </remarks>
int EndDate { get; }
/// <summary> Possibility of shiny for the encounter. </summary>
Shiny Shiny { get; }
/// <summary> Method the Pokémon may be encountered with. </summary>
PogoType Type { get; }
/// <summary> Gender the Pokémon may be encountered with. </summary>
Gender Gender { get; }
}

View file

@ -1,15 +0,0 @@
namespace PKHeX.Core;
/// <summary>
/// <seealso cref="EncounterSlot"/> that contains information about what Index it is within the <seealso cref="EncounterArea"/>'s type-group of slots.
/// </summary>
/// <remarks>
/// Useful for checking legality (if the RNG can yield this slot).
/// </remarks>
public interface INumberedSlot
{
/// <summary>
/// Number Index of the <seealso cref="EncounterSlot"/>.
/// </summary>
byte SlotNumber { get; }
}

View file

@ -1,64 +0,0 @@
using System;
namespace PKHeX.Core;
/// <summary>
/// Intermediary Representation of Dream World Data
/// </summary>
public readonly record struct DreamWorldEntry(ushort Species, byte Level, ushort Move1 = 0, ushort Move2 = 0, ushort Move3 = 0, byte Form = 0, sbyte Gender = -1)
{
private int EntryCount => Move1 == 0 ? 1 : Move2 == 0 ? 1 : Move3 == 0 ? 2 : 3;
private void AddTo(GameVersion game, EncounterStatic5[] result, ref int ctr)
{
var p = PersonalTable.B2W2[Species];
var a = p.HasHiddenAbility ? AbilityPermission.OnlyHidden : AbilityPermission.OnlyFirst;
if (Move1 == 0)
{
result[ctr++] = new EncounterStatic5(game)
{
Species = Species,
Form = Form,
Gender = Gender,
Level = Level,
Ability = a,
Location = 075,
Shiny = Shiny.Never,
};
return;
}
result[ctr++] = Create(game, a, Move1);
if (Move2 == 0)
return;
result[ctr++] = Create(game, a, Move2);
if (Move3 == 0)
return;
result[ctr++] = Create(game, a, Move3);
}
private EncounterStatic5 Create(GameVersion game, AbilityPermission ability, ushort move) => new(game)
{
Species = Species,
Form = Form,
Gender = Gender,
Level = Level,
Ability = ability,
Location = 075,
Shiny = Shiny.Never,
Moves = new(move),
};
public static EncounterStatic5[] GetArray(GameVersion game, ReadOnlySpan<DreamWorldEntry> t)
{
// Split encounters with multiple permitted special moves -- a pk can only be obtained with 1 of the special moves!
int count = 0;
foreach (var e in t)
count += e.EntryCount;
var result = new EncounterStatic5[count];
int ctr = 0;
foreach (var s in t)
s.AddTo(game, result, ref ctr);
return result;
}
}

View file

@ -1,123 +0,0 @@
using System;
using static System.Buffers.Binary.BinaryPrimitives;
namespace PKHeX.Core;
/// <summary>
/// Generation 9 Fixed Spawn Encounter
/// </summary>
public sealed record EncounterFixed9 : EncounterStatic, IGemType
{
public override int Generation => 9;
public override int Location => Location0;
public override EntityContext Context => EntityContext.Gen9;
public GemType TeraType { get; private init; }
private byte Location0 { get; init; }
private byte Location1 { get; init; }
private byte Location2 { get; init; }
private byte Location3 { get; init; }
private const int MinScaleStrongTera = 200; // [200,255]
public static EncounterFixed9[] GetArray(ReadOnlySpan<byte> data)
{
const int size = 0x14;
var count = data.Length / size;
var result = new EncounterFixed9[count];
for (int i = 0; i < result.Length; i++)
result[i] = ReadEncounter(data.Slice(i * size, size));
return result;
}
private EncounterFixed9() : base(GameVersion.SV) { }
private static EncounterFixed9 ReadEncounter(ReadOnlySpan<byte> data) => new()
{
Species = ReadUInt16LittleEndian(data),
Form = data[0x02],
Level = data[0x03],
FlawlessIVCount = data[0x04],
TeraType = (GemType)data[0x05],
Gender = (sbyte)data[0x06],
// 1 byte reserved
Moves = new Moveset(
ReadUInt16LittleEndian(data[0x08..]),
ReadUInt16LittleEndian(data[0x0A..]),
ReadUInt16LittleEndian(data[0x0C..]),
ReadUInt16LittleEndian(data[0x0E..])),
Location0 = data[0x10],
Location1 = data[0x11],
Location2 = data[0x12],
Location3 = data[0x13],
};
protected override bool IsMatchLocation(PKM pk)
{
var metState = LocationsHOME.GetRemapState(Context, pk.Context);
if (metState == LocationRemapState.Original)
return IsMatchLocationExact(pk);
if (metState == LocationRemapState.Remapped)
return IsMatchLocationRemapped(pk);
return IsMatchLocationExact(pk) || IsMatchLocationRemapped(pk);
}
private bool IsMatchLocationRemapped(PKM pk)
{
var met = (ushort)pk.Met_Location;
var version = pk.Version;
if (pk.Context == EntityContext.Gen8)
return LocationsHOME.IsValidMetSV(met, version);
return LocationsHOME.GetMetSWSH((ushort)Location, version) == met;
}
private bool IsMatchLocationExact(PKM pk)
{
var loc = pk.Met_Location;
return loc == Location0 || loc == Location1 || loc == Location2 || loc == Location3;
}
protected override bool IsMatchForm(PKM pk, EvoCriteria evo)
{
if (Species is (int)Core.Species.Deerling or (int)Core.Species.Sawsbuck)
return pk.Form <= 3;
return base.IsMatchForm(pk, evo);
}
public override bool IsMatchExact(PKM pk, EvoCriteria evo)
{
if (TeraType != GemType.Random && pk is ITeraType t && !Tera9RNG.IsMatchTeraType(TeraType, Species, Form, (byte)t.TeraTypeOriginal))
return false;
if (TeraType != 0)
{
if (pk is IScaledSize3 size3)
{
if (size3.Scale < MinScaleStrongTera)
return false;
}
else if (pk is IScaledSize s2)
{
if (s2.HeightScalar < MinScaleStrongTera)
return false;
}
}
if (FlawlessIVCount != 0 && pk.FlawlessIVCount < FlawlessIVCount)
return false;
return base.IsMatchExact(pk, evo);
}
protected override void ApplyDetails(ITrainerInfo tr, EncounterCriteria criteria, PKM pk)
{
base.ApplyDetails(tr, criteria, pk);
var pk9 = (PK9)pk;
pk9.Obedience_Level = (byte)pk9.Met_Level;
var type = Tera9RNG.GetTeraType(Util.Rand.Rand64(), TeraType, Species, Form);
pk9.TeraTypeOriginal = (MoveType)type;
if (criteria.TeraType != -1 && type != criteria.TeraType)
pk9.SetTeraType(type); // sets the override type
pk9.HeightScalar = PokeSizeUtil.GetRandomScalar();
pk9.WeightScalar = PokeSizeUtil.GetRandomScalar();
pk9.Scale = TeraType != 0 ? (byte)(MinScaleStrongTera + Util.Rand.Next(byte.MaxValue - MinScaleStrongTera + 1)) : PokeSizeUtil.GetRandomScalar();
}
}

View file

@ -1,328 +0,0 @@
using System;
namespace PKHeX.Core;
/// <summary>
/// Static Encounter Data
/// </summary>
/// <remarks>
/// Static Encounters are fixed position encounters with properties that are not subject to Wild Encounter conditions.
/// </remarks>
public abstract record EncounterStatic(GameVersion Version) : IEncounterable, IMoveset, IEncounterMatch, IFatefulEncounterReadOnly
{
public ushort Species { get; init; }
public byte Form { get; init; }
public virtual byte Level { get; init; }
public virtual byte LevelMin => Level;
public virtual byte LevelMax => Level;
public abstract int Generation { get; }
public abstract EntityContext Context { get; }
public virtual int Location { get; init; }
public AbilityPermission Ability { get; init; }
public Shiny Shiny { get; init; }
public Nature Nature { get; init; } = Nature.Random;
public sbyte Gender { get; init; } = -1;
public ushort HeldItem { get; init; }
public bool Gift { get; init; }
public bool FatefulEncounter { get; init; }
public byte EggCycles { get; init; }
public byte FlawlessIVCount { get; init; }
public byte Ball { get; init; } = 4; // Only checked when is Gift
public int EggLocation { get; init; }
public Ball FixedBall => Gift ? (Ball)Ball : Core.Ball.None;
public Moveset Moves { get; init; }
public IndividualValueSet IVs { get; init; }
public virtual bool EggEncounter => EggLocation != 0;
private const string _name = "Static Encounter";
public string Name => _name;
public string LongName => $"{_name} ({Version})";
public bool IsShiny => Shiny.IsShiny();
protected virtual PKM GetBlank(ITrainerInfo tr) => EntityBlank.GetBlank(Generation, Version);
public PKM ConvertToPKM(ITrainerInfo tr) => ConvertToPKM(tr, EncounterCriteria.Unrestricted);
public PKM ConvertToPKM(ITrainerInfo tr, EncounterCriteria criteria)
{
var pk = GetBlank(tr);
tr.ApplyTo(pk);
ApplyDetails(tr, criteria, pk);
return pk;
}
protected virtual void ApplyDetails(ITrainerInfo tr, EncounterCriteria criteria, PKM pk)
{
pk.EncryptionConstant = Util.Rand32();
pk.Species = Species;
pk.Form = Form;
var version = this.GetCompatibleVersion((GameVersion)tr.Game);
int lang = (int)Language.GetSafeLanguage(Generation, (LanguageID)tr.Language, version);
int level = GetMinimalLevel();
pk.Version = (int)version;
pk.Language = lang = GetEdgeCaseLanguage(pk, lang);
pk.Nickname = SpeciesName.GetSpeciesNameGeneration(Species, lang, Generation);
pk.CurrentLevel = level;
ApplyDetailsBall(pk);
pk.HeldItem = HeldItem;
pk.OT_Friendship = pk.PersonalInfo.BaseFriendship;
var today = DateTime.Today;
SetMetData(pk, level, today);
if (EggEncounter)
SetEggMetData(pk, tr, today);
SetPINGA(pk, criteria);
SetEncounterMoves(pk, version, level);
if (FatefulEncounter)
pk.FatefulEncounter = true;
if (pk.Format < 6)
return;
if (this is IRelearn relearn)
pk.SetRelearnMoves(relearn.Relearn);
tr.ApplyHandlingTrainerInfo(pk);
if (pk is IScaledSize { HeightScalar: 0, WeightScalar: 0 } s)
{
s.HeightScalar = PokeSizeUtil.GetRandomScalar();
s.WeightScalar = PokeSizeUtil.GetRandomScalar();
}
if (this is IGigantamaxReadOnly g && pk is PK8 pg)
pg.CanGigantamax = g.CanGigantamax;
if (this is IDynamaxLevelReadOnly d && pk is PK8 pd)
pd.DynamaxLevel = d.DynamaxLevel;
}
protected virtual void ApplyDetailsBall(PKM pk) => pk.Ball = Ball;
protected virtual int GetMinimalLevel() => LevelMin;
protected virtual void SetPINGA(PKM pk, EncounterCriteria criteria)
{
var pi = pk.PersonalInfo;
int gender = criteria.GetGender(Gender, pi);
int nature = (int)criteria.GetNature(Nature);
int ability = criteria.GetAbilityFromNumber(Ability);
var pidtype = GetPIDType();
PIDGenerator.SetRandomWildPID(pk, pk.Format, nature, ability, gender, pidtype);
SetIVs(pk);
pk.StatNature = pk.Nature;
}
private void SetEggMetData(PKM pk, ITrainerInfo tr, DateTime today)
{
pk.Met_Location = Math.Max(0, EncounterSuggestion.GetSuggestedEggMetLocation(pk));
pk.Met_Level = EncounterSuggestion.GetSuggestedEncounterEggMetLevel(pk);
if (Generation >= 4)
{
bool traded = (int)Version == tr.Game;
pk.Egg_Location = EncounterSuggestion.GetSuggestedEncounterEggLocationEgg(Generation, Version, traded);
pk.EggMetDate = DateOnly.FromDateTime(today);
}
pk.Egg_Location = EggLocation;
pk.EggMetDate = DateOnly.FromDateTime(today);
}
protected virtual void SetMetData(PKM pk, int level, DateTime today)
{
if (pk.Format <= 2)
return;
pk.Met_Location = Location;
pk.Met_Level = level;
if (pk.Format >= 4)
pk.MetDate = DateOnly.FromDateTime(today);
}
protected virtual void SetEncounterMoves(PKM pk, GameVersion version, int level)
{
if (Moves.HasMoves)
{
pk.SetMoves(Moves);
pk.SetMaximumPPCurrent(Moves);
}
else
{
Span<ushort> moves = stackalloc ushort[4];
var source = GameData.GetLearnSource(version);
source.SetEncounterMoves(Species, Form, level, moves);
pk.SetMoves(moves);
pk.SetMaximumPPCurrent(moves);
}
}
protected void SetIVs(PKM pk)
{
if (IVs.IsSpecified)
pk.SetRandomIVsTemplate(IVs, FlawlessIVCount);
else if (FlawlessIVCount > 0)
pk.SetRandomIVs(minFlawless: FlawlessIVCount);
}
private int GetEdgeCaseLanguage(PKM pk, int lang)
{
switch (this)
{
// Cannot trade between languages
case IFixedGBLanguage { Language: EncounterGBLanguage.Japanese } when lang != 1:
pk.OT_Name = "ゲーフリ";
return (int)LanguageID.Japanese;
case IFixedGBLanguage { Language: not EncounterGBLanguage.Japanese } when lang == 1:
pk.OT_Name = "GF";
return (int)LanguageID.English;
// E-Reader was only available to Japanese games.
case EncounterStaticShadow { EReader: true } when lang != 1:
// Old Sea Map was only distributed to Japanese games.
case EncounterStatic3 { Species: (int)Core.Species.Mew } when lang != 1:
pk.OT_Name = "ゲーフリ";
return (int)LanguageID.Japanese;
// Deoxys for Emerald was not available for Japanese games.
case EncounterStatic3 { Species: (ushort)Core.Species.Deoxys, Version: GameVersion.E } when lang == 1:
pk.OT_Name = "GF";
return (int)LanguageID.English;
default:
return lang;
}
}
private PIDType GetPIDType()
{
switch (Generation)
{
case 3 when this is EncounterStatic3 {Roaming: true, Version: not GameVersion.E}: // Roamer IV glitch was fixed in Emerald
return PIDType.Method_1_Roamer;
case 4 when Shiny == Shiny.Always: // Lake of Rage Gyarados
return PIDType.ChainShiny;
case 4 when Species == (int)Core.Species.Pichu: // Spiky Eared Pichu
case 4 when Location == Locations.PokeWalker4: // Pokéwalker
return PIDType.Pokewalker;
case 5 when Shiny == Shiny.Always:
return PIDType.G5MGShiny;
default: return PIDType.None;
}
}
public virtual bool IsMatchExact(PKM pk, EvoCriteria evo)
{
if (Nature != Nature.Random && pk.Nature != (int) Nature)
return false;
if (!IsMatchEggLocation(pk))
return false;
if (!IsMatchLocation(pk))
return false;
if (!IsMatchLevel(pk, evo))
return false;
if (!IsMatchGender(pk))
return false;
if (!IsMatchForm(pk, evo))
return false;
if (!IsMatchIVs(pk))
return false;
if (this is IContestStatsReadOnly es && pk is IContestStatsReadOnly s && s.IsContestBelow(es))
return false;
// Defer to EC/PID check
// if (e.Shiny != null && e.Shiny != pk.IsShiny)
// continue;
// Defer ball check to later
// if (e.Gift && pk.Ball != 4) // PokéBall
// continue;
return true;
}
private bool IsMatchIVs(PKM pk)
{
if (!IVs.IsSpecified)
return true; // nothing to check, IVs are random
if (Generation <= 2 && pk.Format > 2)
return true; // IVs are regenerated on VC transfer upward
return Legal.GetIsFixedIVSequenceValidSkipRand(IVs, pk);
}
protected virtual bool IsMatchForm(PKM pk, EvoCriteria evo)
{
return Form == evo.Form || FormInfo.IsFormChangeable(Species, Form, pk.Form, Context, pk.Context);
}
// override me if the encounter type has any eggs
protected virtual bool IsMatchEggLocation(PKM pk)
{
var expect = pk is PB8 ? Locations.Default8bNone : 0;
return pk.Egg_Location == expect;
}
private bool IsMatchGender(PKM pk)
{
if (Gender == -1 || Gender == pk.Gender)
return true;
if (Species == (int) Core.Species.Azurill && Generation == 4 && Location == 233 && pk.Gender == 0)
return EntityGender.GetFromPIDAndRatio(pk.PID, 0xBF) == 1;
return false;
}
protected virtual bool IsMatchLocation(PKM pk)
{
if (EggEncounter)
return true;
if (Location == 0)
return true;
if (!pk.HasOriginalMetLocation)
return true;
return Location == pk.Met_Location;
}
protected virtual bool IsMatchLevel(PKM pk, EvoCriteria evo)
{
return pk.Met_Level == Level;
}
public virtual EncounterMatchRating GetMatchRating(PKM pk)
{
if (IsMatchPartial(pk))
return EncounterMatchRating.PartialMatch;
return IsMatchDeferred(pk);
}
/// <summary>
/// Checks if the provided <see cref="pk"/> might not be the best match, or even a bad match due to minor reasons.
/// </summary>
protected virtual EncounterMatchRating IsMatchDeferred(PKM pk) => EncounterMatchRating.Match;
/// <summary>
/// Checks if the provided <see cref="pk"/> is not an exact match due to minor reasons.
/// </summary>
protected virtual bool IsMatchPartial(PKM pk)
{
if (pk is { Format: >= 5, AbilityNumber: 4 } && this.IsPartialMatchHidden(pk.Species, Species))
return true;
return pk.FatefulEncounter != FatefulEncounter;
}
}

View file

@ -1,93 +0,0 @@
namespace PKHeX.Core;
/// <summary>
/// Generation 1 Static Encounter
/// </summary>
/// <inheritdoc cref="EncounterStatic"/>
public record EncounterStatic1 : EncounterStatic
{
public override int Generation => 1;
public override EntityContext Context => EntityContext.Gen1;
public sealed override byte Level { get; init; }
private const int LightBallPikachuCatchRate = 0xA3; // 163
public EncounterStatic1(byte species, byte level, GameVersion game) : base(game)
{
Species = species;
Level = level;
}
protected override void ApplyDetails(ITrainerInfo tr, EncounterCriteria criteria, PKM pk)
{
base.ApplyDetails(tr, criteria, pk);
var pk1 = (PK1) pk;
if (Species == (int) Core.Species.Pikachu && Version == GameVersion.YW && Level == 5 && !Moves.HasMoves)
{
pk1.Catch_Rate = LightBallPikachuCatchRate; // Light Ball
return;
}
// Encounters can have different Catch Rates (RBG vs Y)
var table = Version == GameVersion.YW ? PersonalTable.Y : PersonalTable.RB;
pk1.Catch_Rate = (byte)table[Species].CatchRate;
}
protected override bool IsMatchLevel(PKM pk, EvoCriteria evo)
{
// Met Level is not stored in the PK1 format.
// Check if it is at or above the encounter level.
return Level <= evo.LevelMax;
}
protected override bool IsMatchLocation(PKM pk)
{
// Met Location is not stored in the PK1 format.
return true;
}
public override bool IsMatchExact(PKM pk, EvoCriteria evo)
{
if (!base.IsMatchExact(pk, evo))
return false;
// Encounters with this version have to originate from the Japanese Blue game.
if (!pk.Japanese && Version == GameVersion.BU)
return false;
return true;
}
protected override bool IsMatchPartial(PKM pk)
{
if (pk is not PK1 pk1)
return false;
if (ParseSettings.AllowGen1Tradeback && PK1.IsCatchRateHeldItem(pk1.Catch_Rate))
return false;
if (IsCatchRateValid(pk1))
return false;
return true;
}
private bool IsCatchRateValid(PK1 pk1)
{
var catch_rate = pk1.Catch_Rate;
// Light Ball (Yellow) starter
if (Version == GameVersion.YW && Species == (int)Core.Species.Pikachu && Level == 5)
{
return catch_rate == LightBallPikachuCatchRate;
}
if (Version == GameVersion.Stadium)
{
// Amnesia Psyduck has different catch rates depending on language
if (Species == (int)Core.Species.Psyduck)
return catch_rate == (pk1.Japanese ? 167 : 168);
return catch_rate is 167 or 168;
}
// Encounters can have different Catch Rates (RBG vs Y)
return GBRestrictions.RateMatchesEncounter(Species, Version, catch_rate);
}
}

View file

@ -1,120 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
namespace PKHeX.Core;
/// <summary>
/// Event data for Generation 1
/// </summary>
/// <inheritdoc cref="EncounterStatic1"/>
public sealed record EncounterStatic1E : EncounterStatic1, IFixedGBLanguage
{
public EncounterGBLanguage Language { get; init; } = EncounterGBLanguage.Japanese;
/// <summary> Trainer name for the event. </summary>
public string OT_Name { get; init; } = string.Empty;
public IReadOnlyList<string> OT_Names { get; init; } = Array.Empty<string>();
/// <summary> Trainer ID for the event. </summary>
public ushort TID16 { get; init; } = UnspecifiedID;
public const ushort UnspecifiedID = 0;
public EncounterStatic1E(byte species, byte level, GameVersion game) : base(species, level, game)
{
}
public override bool IsMatchExact(PKM pk, EvoCriteria evo)
{
if (!base.IsMatchExact(pk, evo))
return false;
if (Language != EncounterGBLanguage.Any && pk.Japanese != (Language == EncounterGBLanguage.Japanese))
return false;
// EC/PID check doesn't exist for these, so check Shiny state here.
if (!IsShinyValid(pk))
return false;
if (TID16 != UnspecifiedID && pk.TID16 != TID16)
return false;
if (OT_Name.Length != 0)
{
if (pk.OT_Name != OT_Name)
return false;
}
else if (OT_Names.Count != 0)
{
if (!OT_Names.Contains(pk.OT_Name))
return false;
}
return true;
}
private bool IsShinyValid(PKM pk) => Shiny switch
{
Shiny.Never => !pk.IsShiny,
Shiny.Always => pk.IsShiny,
_ => true,
};
protected override PK1 GetBlank(ITrainerInfo tr) => Language switch
{
EncounterGBLanguage.Japanese => new(true),
EncounterGBLanguage.International => new(),
_ => new(tr.Language == 1),
};
protected override void ApplyDetails(ITrainerInfo tr, EncounterCriteria criteria, PKM pk)
{
base.ApplyDetails(tr, criteria, pk);
if (Version == GameVersion.Stadium)
{
var pk1 = (PK1)pk;
// Amnesia Psyduck has different catch rates depending on language
if (Species == (int)Core.Species.Psyduck)
pk1.Catch_Rate = pk1.Japanese ? (byte)167 : (byte)168;
else
pk1.Catch_Rate = Util.Rand.Next(2) == 0 ? (byte)167 : (byte)168;
}
if (TID16 != UnspecifiedID)
pk.TID16 = TID16;
if (OT_Name.Length != 0)
pk.OT_Name = OT_Name;
else if (OT_Names.Count != 0)
pk.OT_Name = OT_Names[Util.Rand.Next(OT_Names.Count)];
}
}
/// <summary>
/// Exposes info on language restriction for Gen1/2.
/// </summary>
public interface IFixedGBLanguage
{
/// <summary>
/// Language restriction for the encounter template.
/// </summary>
EncounterGBLanguage Language { get; }
}
/// <summary>
/// Generations 1 &amp; 2 cannot communicate between Japanese &amp; International versions.
/// </summary>
public enum EncounterGBLanguage
{
/// <summary> Can only be obtained in Japanese games. </summary>
Japanese,
/// <summary> Can only be obtained in International (not Japanese) games. </summary>
International,
/// <summary> Can be obtained in any localization. </summary>
Any,
}

View file

@ -1,144 +0,0 @@
using System;
namespace PKHeX.Core;
/// <summary>
/// Generation 2 Static Encounter
/// </summary>
/// <inheritdoc cref="EncounterStatic"/>
public record EncounterStatic2 : EncounterStatic
{
public sealed override int Generation => 2;
public override EntityContext Context => EntityContext.Gen2;
public sealed override byte Level { get; init; }
public EncounterStatic2(byte species, byte level, GameVersion game) : base(game)
{
Species = species;
Level = level;
}
public override bool IsMatchExact(PKM pk, EvoCriteria evo)
{
if (Shiny == Shiny.Always && !pk.IsShiny)
return false;
return base.IsMatchExact(pk, evo);
}
protected override bool IsMatchEggLocation(PKM pk)
{
if (pk.Format > 2)
return true;
if (pk.IsEgg)
{
if (!EggEncounter)
return false;
if (pk.Met_Location != 0 && pk.Met_Level != 0)
return false;
if (pk.OT_Friendship > EggCycles) // Dizzy Punch eggs start with below-normal hatch counters.
return false;
}
else
{
switch (pk.Met_Level)
{
case 0 when pk.Met_Location != 0:
return false;
case 1: // 0 = second floor of every Pokémon Center, valid
return true;
default:
if (pk.Met_Location == 0 && pk.Met_Level != 0)
return false;
break;
}
}
return true;
}
protected override bool IsMatchLevel(PKM pk, EvoCriteria evo)
{
if (pk is ICaughtData2 {CaughtData: not 0})
return pk.Met_Level == (EggEncounter ? 1 : Level);
return Level <= evo.LevelMax;
}
protected override bool IsMatchLocation(PKM pk)
{
if (EggEncounter)
return true;
if (Location == 0)
return true;
if (pk is ICaughtData2 c2)
{
if (c2.CaughtData is not 0)
return Location == pk.Met_Location;
if (pk.Species == (int)Core.Species.Celebi)
return false; // Cannot reset the Met data
}
return true;
}
protected override bool IsMatchPartial(PKM pk) => false;
protected override void ApplyDetails(ITrainerInfo tr, EncounterCriteria criteria, PKM pk)
{
base.ApplyDetails(tr, criteria, pk);
var pk2 = (PK2)pk;
if (Shiny == Shiny.Always)
pk2.SetShiny();
}
protected override void SetMetData(PKM pk, int level, DateTime today)
{
if (Version != GameVersion.C && pk.OT_Gender != 1)
return;
var pk2 = (PK2)pk;
pk2.Met_Location = Location;
pk2.Met_Level = level;
pk2.Met_TimeOfDay = EncounterTime.Any.RandomValidTime();
}
}
public sealed record EncounterStatic2Odd : EncounterStatic2
{
public EncounterStatic2Odd(byte species) : base(species, 5, GameVersion.C)
{
EggLocation = 256;
EggCycles = 20;
}
public override bool IsMatchExact(PKM pk, EvoCriteria evo)
{
// Let it get picked up as regular EncounterEgg under other conditions.
if (pk.Format > 2)
return false;
if (!pk.HasMove((int)Move.DizzyPunch))
return false;
if (pk.IsEgg && pk.EXP != 125)
return false;
return base.IsMatchExact(pk, evo);
}
}
public sealed record EncounterStatic2Roam : EncounterStatic2
{
// Routes 29-46, except 40 & 41; total 16.
// 02, 04, 05, 08, 11, 15, 18, 20,
// 21, 25, 26, 34, 37, 39, 43, 45,
private const ulong RoamLocations = 0b10_1000_1010_0100_0000_0110_0011_0100_1000_1001_0011_0100;
public override int Location => 2;
public EncounterStatic2Roam(byte species, byte level, GameVersion ver) : base(species, level, ver) { }
protected override bool IsMatchLocation(PKM pk)
{
if (!pk.HasOriginalMetLocation)
return true;
// Gen2 met location is always u8
var loc = pk.Met_Location;
return loc <= 45 && ((RoamLocations & (1UL << loc)) != 0);
}
}

View file

@ -1,101 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
namespace PKHeX.Core;
/// <summary>
/// Event data for Generation 2
/// </summary>
/// <inheritdoc cref="EncounterStatic2"/>
public sealed record EncounterStatic2E : EncounterStatic2, IFixedGBLanguage
{
public EncounterGBLanguage Language { get; init; } = EncounterGBLanguage.Japanese;
/// <summary> Trainer name for the event. </summary>
public string OT_Name { get; init; } = string.Empty;
public IReadOnlyList<string> OT_Names { get; init; } = Array.Empty<string>();
private const ushort UnspecifiedID = 0;
/// <summary> Trainer ID for the event. </summary>
public ushort TID16 { get; init; } = UnspecifiedID;
public bool IsGift => TID16 != UnspecifiedID;
public int CurrentLevel { get; init; } = -1;
public EncounterStatic2E(byte species, byte level, GameVersion ver) : base(species, level, ver)
{
}
public override bool IsMatchExact(PKM pk, EvoCriteria evo)
{
if (!base.IsMatchExact(pk, evo))
return false;
if (Language != EncounterGBLanguage.Any && pk.Japanese != (Language == EncounterGBLanguage.Japanese))
return false;
if (CurrentLevel != -1 && CurrentLevel > pk.CurrentLevel)
return false;
// EC/PID check doesn't exist for these, so check Shiny state here.
if (!IsShinyValid(pk))
return false;
if (EggEncounter && !pk.IsEgg)
return true;
// Check OT Details
if (TID16 != UnspecifiedID && pk.TID16 != TID16)
return false;
if (OT_Name.Length != 0)
{
if (pk.OT_Name != OT_Name)
return false;
}
else if (OT_Names.Count != 0)
{
if (!OT_Names.Contains(pk.OT_Name))
return false;
}
return true;
}
private bool IsShinyValid(PKM pk) => Shiny switch
{
Shiny.Never => !pk.IsShiny,
Shiny.Always => pk.IsShiny,
_ => true,
};
protected override int GetMinimalLevel() => CurrentLevel == -1 ? base.GetMinimalLevel() : CurrentLevel;
protected override PK2 GetBlank(ITrainerInfo tr) => Language switch
{
EncounterGBLanguage.Japanese => new(true),
EncounterGBLanguage.International => new(),
_ => new(tr.Language == 1),
};
protected override void ApplyDetails(ITrainerInfo tr, EncounterCriteria criteria, PKM pk)
{
base.ApplyDetails(tr, criteria, pk);
if (CurrentLevel != -1) // Restore met level
pk.Met_Level = LevelMin;
if (TID16 != UnspecifiedID)
pk.TID16 = TID16;
if (IsGift)
pk.OT_Gender = 0;
if (OT_Name.Length != 0)
pk.OT_Name = OT_Name;
else if (OT_Names.Count != 0)
pk.OT_Name = OT_Names[Util.Rand.Next(OT_Names.Count)];
}
}

View file

@ -1,69 +0,0 @@
using System;
namespace PKHeX.Core;
/// <summary>
/// Generation 3 Static Encounter
/// </summary>
/// <inheritdoc cref="EncounterStatic"/>
public sealed record EncounterStatic3 : EncounterStatic
{
public override int Generation => 3;
public override EntityContext Context => EntityContext.Gen3;
public bool Roaming { get; init; }
public EncounterStatic3(ushort species, byte level, GameVersion game) : base(game)
{
Species = species;
Level = level;
}
protected override bool IsMatchEggLocation(PKM pk)
{
if (pk.Format == 3)
return !pk.IsEgg || EggLocation == 0 || EggLocation == pk.Met_Location;
return base.IsMatchEggLocation(pk);
}
protected override bool IsMatchLevel(PKM pk, EvoCriteria evo)
{
if (pk.Format != 3) // Met Level lost on PK3=>PK4
return Level <= evo.LevelMax;
if (EggEncounter)
return pk is { Met_Level: 0, CurrentLevel: >= 5 }; // met level 0, origin level 5
return pk.Met_Level == Level;
}
protected override bool IsMatchLocation(PKM pk)
{
if (EggEncounter)
return true;
if (pk.Format != 3)
return true; // transfer location verified later
var met = pk.Met_Location;
if (!Roaming)
return Location == met;
// Route 101-138
if (Version <= GameVersion.E)
return met is >= 16 and <= 49;
// Route 1-25 encounter is possible either in grass or on water
return met is >= 101 and <= 125;
}
protected override bool IsMatchPartial(PKM pk)
{
if (Gift && pk.Ball != Ball)
return true;
return base.IsMatchPartial(pk);
}
protected override void SetMetData(PKM pk, int level, DateTime today)
{
pk.Met_Level = level;
pk.Met_Location = !Roaming ? Location : (Version <= GameVersion.E ? 16 : 101);
}
}

View file

@ -1,150 +0,0 @@
using System;
using static PKHeX.Core.GroundTileAllowed;
namespace PKHeX.Core;
/// <summary>
/// Generation 4 Static Encounter
/// </summary>
/// <inheritdoc cref="EncounterStatic"/>
public sealed record EncounterStatic4(GameVersion Version) : EncounterStatic(Version), IGroundTypeTile
{
public override int Generation => 4;
public override EntityContext Context => EntityContext.Gen4;
/// <summary> Indicates if the encounter is a Roamer (variable met location) </summary>
public bool Roaming { get; init; }
/// <summary> <see cref="PK4.GroundTile"/> values permitted for the encounter. </summary>
public GroundTileAllowed GroundTile { get; init; } = None;
protected override bool IsMatchLocation(PKM pk)
{
if (!Roaming)
return base.IsMatchLocation(pk);
// Met location is lost on transfer
if (pk is not G4PKM pk4)
return true;
return pk4.GroundTile switch
{
GroundTileType.Grass => IsMatchLocationGrass(Location, pk4.Met_Location),
GroundTileType.Water => IsMatchLocationWater(Location, pk4.Met_Location),
_ => false,
};
}
private static bool IsMatchLocationGrass(int location, int met) => location switch
{
FirstS => IsMatchRoamerLocation(PermitGrassS, met, FirstS),
FirstJ => IsMatchRoamerLocation(PermitGrassJ, met, FirstJ),
FirstH => IsMatchRoamerLocation(PermitGrassH, met, FirstH),
_ => false,
};
private static bool IsMatchLocationWater(int location, int met) => location switch
{
FirstS => IsMatchRoamerLocation(PermitWaterS, met, FirstS),
FirstJ => IsMatchRoamerLocation(PermitWaterJ, met, FirstJ),
FirstH => IsMatchRoamerLocation(PermitWaterH, met, FirstH),
_ => false,
};
protected override bool IsMatchEggLocation(PKM pk)
{
if (!EggEncounter)
return base.IsMatchEggLocation(pk);
var eggloc = pk.Egg_Location;
// Transferring 4->5 clears Pt/HG/SS location value and keeps Faraway Place
if (pk is not G4PKM pk4)
{
if (eggloc == Locations.LinkTrade4)
return true;
var cmp = Locations.IsPtHGSSLocationEgg(EggLocation) ? Locations.Faraway4 : EggLocation;
return eggloc == cmp;
}
if (!pk4.IsEgg) // hatched
return eggloc == EggLocation || eggloc == Locations.LinkTrade4;
// Unhatched:
if (eggloc != EggLocation)
return false;
if (pk4.Met_Location is not (0 or Locations.LinkTrade4))
return false;
return true;
}
protected override void ApplyDetails(ITrainerInfo tr, EncounterCriteria criteria, PKM pk)
{
base.ApplyDetails(tr, criteria, pk);
SanityCheckVersion(pk);
}
private void SanityCheckVersion(PKM pk)
{
// Unavailable encounters in DP, morph them to Pt so they're legal.
switch (Species)
{
case (int)Core.Species.Darkrai when Location == 079: // DP Darkrai
case (int)Core.Species.Shaymin when Location == 063: // DP Shaymin
pk.Version = (int)GameVersion.Pt;
return;
}
}
protected override bool IsMatchLevel(PKM pk, EvoCriteria evo)
{
if (pk.Format != 4) // Met Level lost on PK4=>PK5
return Level <= evo.LevelMax;
return pk.Met_Level == (EggEncounter ? 0 : Level);
}
protected override bool IsMatchPartial(PKM pk)
{
if (Gift && pk.Ball != Ball)
return true;
return base.IsMatchPartial(pk);
}
protected override void SetMetData(PKM pk, int level, DateTime today)
{
var pk4 = (PK4)pk;
pk4.GroundTile = Roaming ? GroundTileType.Grass : GroundTile.GetIndex();
pk.Met_Location = Location;
pk.Met_Level = level;
pk.MetDate = DateOnly.FromDateTime(today);
}
public static bool IsMatchRoamerLocation(ulong permit, int location, int first)
{
var value = location - first;
if ((uint)value >= 64)
return false;
return (permit & (1ul << value)) != 0;
}
public static bool IsMatchRoamerLocation(uint permit, int location, int first)
{
var value = location - first;
if ((uint)value >= 32)
return false;
return (permit & (1u << value)) != 0;
}
// Merged all locations into a bitmask for quick computation.
private const int FirstS = 16;
private const ulong PermitGrassS = 0x2_8033FFFF; // 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 47, 49,
private const ulong PermitWaterS = 0x2_803E3B9E; // 18, 19, 20, 23, 24, 25, 27, 28, 29, 33, 34, 35, 36, 37, 47, 49,
private const int FirstJ = 177;
private const uint PermitGrassJ = 0x0003E7FF; // 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 190, 191, 192, 193, 194,
private const uint PermitWaterJ = 0x0001E06E; // 178, 179, 180, 182, 183, 190, 191, 192, 193,
private const int FirstH = 149;
private const uint PermitGrassH = 0x0AB3FFFF; // 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 169, 170, 172, 174, 176,
private const uint PermitWaterH = 0x0ABC1B28; // 152, 154, 157, 158, 160, 161, 167, 168, 169, 170, 172, 174, 176,
}

View file

@ -1,115 +0,0 @@
using System;
using static System.Buffers.Binary.BinaryPrimitives;
namespace PKHeX.Core;
/// <summary>
/// Generation 4 Pokéwalker Encounter
/// </summary>
/// <inheritdoc cref="EncounterStatic"/>
public sealed record EncounterStatic4Pokewalker : EncounterStatic
{
public override int Generation => 4;
public override EntityContext Context => EntityContext.Gen4;
public PokewalkerCourse4 Course { get; }
public EncounterStatic4Pokewalker(ReadOnlySpan<byte> data, PokewalkerCourse4 course) : base(GameVersion.HGSS)
{
Species = ReadUInt16LittleEndian(data);
Level = data[2];
Gender = (sbyte)data[3];
Course = course;
var move1 = ReadUInt16LittleEndian(data[0x4..]);
var move2 = ReadUInt16LittleEndian(data[0x6..]);
var move3 = ReadUInt16LittleEndian(data[0x8..]);
var move4 = ReadUInt16LittleEndian(data[0xA..]);
Moves = new(move1, move2, move3, move4);
// All obtained entities are in Poke Ball and have a met location of "PokeWalker"
Gift = true;
Location = Locations.PokeWalker4;
}
protected override bool IsMatchLocation(PKM pk)
{
if (pk.Format == 4)
return Location == pk.Met_Location;
return true; // transfer location verified later
}
protected override bool IsMatchLevel(PKM pk, EvoCriteria evo)
{
if (pk.Format != 4) // Met Level lost on PK4=>PK5
return Level <= evo.LevelMax;
return pk.Met_Level == Level;
}
protected override bool IsMatchPartial(PKM pk)
{
if (pk.Ball != 4)
return true;
return base.IsMatchPartial(pk);
}
protected override void SetPINGA(PKM pk, EncounterCriteria criteria)
{
var pi = pk.PersonalInfo;
int gender = criteria.GetGender(Gender, pi);
int nature = (int)criteria.GetNature(Nature.Random);
// Cannot force an ability; nature-gender-trainerID only yield fixed PIDs.
// int ability = criteria.GetAbilityFromNumber(Ability, pi);
PIDGenerator.SetRandomPIDPokewalker(pk, nature, gender);
criteria.SetRandomIVs(pk);
}
public static EncounterStatic4Pokewalker[] GetAll(ReadOnlySpan<byte> data)
{
const int size = 0xC;
var count = data.Length / size;
System.Diagnostics.Debug.Assert(count == 6 * (int)PokewalkerCourse4.MAX_COUNT);
var result = new EncounterStatic4Pokewalker[count];
for (int i = 0; i < result.Length; i++)
{
var offset = i * size;
var slice = data[offset..];
var course = (PokewalkerCourse4)(i / 6);
result[i] = new(slice, course);
}
return result;
}
}
public enum PokewalkerCourse4 : byte
{
RefreshingField = 0,
NoisyForest = 1,
RuggedRoad = 2,
BeautifulBeach = 3,
SuburbanArea = 4,
DimCave = 5,
BlueLake = 6,
TownOutskirts = 7,
HoennField = 8,
WarmBeach = 9,
VolcanoPath = 10,
Treehouse = 11,
ScaryCave = 12,
SinnohField = 13,
IcyMountainRoad = 14,
BigForest = 15,
WhiteLake = 16,
StormyBeach = 17,
Resort = 18,
QuietCave = 19,
BeyondTheSea = 20,
NightSkysEdge = 21,
YellowForest = 22,
Rally = 23, // JPN Exclusive
Sightseeing = 24, // JPN/KOR Exclusive
WinnersPath = 25,
AmityMeadow = 26, // JPN Exclusive
MAX_COUNT = 27,
}

View file

@ -1,59 +0,0 @@
namespace PKHeX.Core;
/// <summary>
/// Generation 5 Static Encounter
/// </summary>
/// <inheritdoc cref="EncounterStatic"/>
public record EncounterStatic5(GameVersion Version) : EncounterStatic(Version)
{
public sealed override int Generation => 5;
public override EntityContext Context => EntityContext.Gen5;
public bool Roaming { get; init; }
public bool IsWildCorrelationPID => !Roaming && Shiny == Shiny.Random && Species != (int)Core.Species.Crustle;
public bool EntreeForestDreamWorld => Location == 75;
protected sealed override bool IsMatchPartial(PKM pk)
{
// BW/2 Jellicent collision with wild surf slot, resolved by duplicating the encounter with any abil
if (Ability == AbilityPermission.OnlyHidden && pk.AbilityNumber != 4 && pk.Format <= 7)
return true;
return base.IsMatchPartial(pk);
}
protected sealed override bool IsMatchLocation(PKM pk)
{
if (!Roaming)
return base.IsMatchLocation(pk);
return IsRoamerMet(pk.Met_Location);
}
protected override bool IsMatchEggLocation(PKM pk)
{
if (!EggEncounter)
return base.IsMatchEggLocation(pk);
var eggloc = pk.Egg_Location;
if (!pk.IsEgg) // hatched
return eggloc == EggLocation || eggloc == Locations.LinkTrade5;
// Unhatched:
if (eggloc != EggLocation)
return false;
if (pk.Met_Location is not (0 or Locations.LinkTrade5))
return false;
return true;
}
// 25,26,27,28, // Route 12, 13, 14, 15 Night latter half
// 15,16,31, // Route 2, 3, 18 Morning
// 17,18,29, // Route 4, 5, 16 Daytime
// 19,20,21, // Route 6, 7, 8 Evening
// 22,23,24, // Route 9, 10, 11 Night former half
private static bool IsRoamerMet(int location)
{
if ((uint)location >= 32)
return false;
return (0b10111111111111111000000000000000 & (1 << location)) != 0;
}
}

View file

@ -1,29 +0,0 @@
namespace PKHeX.Core;
/// <summary>
/// Generation 5 Dream Radar gift encounters
/// </summary>
/// <inheritdoc cref="EncounterStatic"/>
public sealed record EncounterStatic5DR : EncounterStatic5
{
public EncounterStatic5DR(ushort species, byte form, AbilityPermission ability = AbilityPermission.OnlyHidden) : base(GameVersion.B2W2)
{
Species = species;
Form = form;
Ability = ability;
Location = 30015;
Gift = true;
Ball = 25;
Level = 5; // to 40
Shiny = Shiny.Never;
}
protected override bool IsMatchLevel(PKM pk, EvoCriteria evo)
{
// Level from 5->40 depends on the number of badges
var met = pk.Met_Level;
if (met % 5 != 0)
return false;
return (uint) (met - 5) <= 35; // 5 <= x <= 40
}
}

View file

@ -1,54 +0,0 @@
namespace PKHeX.Core;
/// <summary>
/// Generation 5 Static Encounter from N
/// </summary>
/// <inheritdoc cref="EncounterStatic"/>
internal sealed record EncounterStatic5N : EncounterStatic5
{
public readonly uint PID;
public const bool NSparkle = true;
internal EncounterStatic5N(uint pid) : base(GameVersion.B2W2)
{
Shiny = Shiny.FixedValue;
PID = pid;
}
protected override void SetPINGA(PKM pk, EncounterCriteria criteria)
{
int gender = criteria.GetGender(EntityGender.GetFromPID(Species, PID), pk.PersonalInfo);
int nature = (int)Nature;
int ability = Ability.IsSingleValue(out var index) ? index : 0;
pk.PID = PID;
pk.Gender = gender;
SetIVs(pk);
pk.Nature = nature;
pk.RefreshAbility(ability);
}
public override bool IsMatchExact(PKM pk, EvoCriteria evo)
{
if (PID != pk.PID)
return false;
return base.IsMatchExact(pk, evo);
}
protected override void ApplyDetails(ITrainerInfo tr, EncounterCriteria criteria, PKM pk)
{
base.ApplyDetails(tr, criteria, pk);
SetNPokemonData((PK5)pk, pk.Language);
}
private static void SetNPokemonData(PK5 pk5, int lang)
{
pk5.IV_HP = pk5.IV_ATK = pk5.IV_DEF = pk5.IV_SPA = pk5.IV_SPD = pk5.IV_SPE = 30;
pk5.NSparkle = NSparkle;
pk5.OT_Name = GetOT(lang);
pk5.ID32 = 00002;
}
public static string GetOT(int lang) => lang == (int)LanguageID.Japanese ? "" : "N";
}

View file

@ -1,57 +0,0 @@
namespace PKHeX.Core;
/// <summary>
/// Generation 6 Static Encounter
/// </summary>
/// <inheritdoc cref="EncounterStatic"/>
public sealed record EncounterStatic6(GameVersion Version) : EncounterStatic(Version), IContestStatsReadOnly
{
public override int Generation => 6;
public override EntityContext Context => EntityContext.Gen6;
public byte CNT_Cool { get; init; }
public byte CNT_Beauty { get; init; }
public byte CNT_Cute { get; init; }
public byte CNT_Smart { get; init; }
public byte CNT_Tough { get; init; }
public byte CNT_Sheen { get; init; }
protected override bool IsMatchLocation(PKM pk)
{
if (base.IsMatchLocation(pk))
return true;
if (Species != (int) Core.Species.Pikachu)
return false;
// Cosplay Pikachu is given from multiple locations
var loc = pk.Met_Location;
return loc is 180 or 186 or 194;
}
protected override bool IsMatchEggLocation(PKM pk)
{
if (!EggEncounter)
return base.IsMatchEggLocation(pk);
var eggloc = pk.Egg_Location;
if (!pk.IsEgg) // hatched
return eggloc == EggLocation || eggloc == Locations.LinkTrade6;
// Unhatched:
if (eggloc != EggLocation)
return false;
if (pk.Met_Location is not (0 or Locations.LinkTrade6))
return false;
return true;
}
protected override void ApplyDetails(ITrainerInfo tr, EncounterCriteria criteria, PKM pk)
{
base.ApplyDetails(tr, criteria, pk);
var pk6 = (PK6)pk;
this.CopyContestStatsTo(pk6);
pk6.SetRandomMemory6();
pk6.SetRandomEC();
}
}

View file

@ -1,101 +0,0 @@
namespace PKHeX.Core;
/// <summary>
/// Generation 7 Static Encounter
/// </summary>
/// <inheritdoc cref="EncounterStatic"/>
public sealed record EncounterStatic7(GameVersion Version) : EncounterStatic(Version), IRelearn, IEncounterFormRandom
{
public override int Generation => 7;
public override EntityContext Context => EntityContext.Gen7;
public Moveset Relearn { get; init; }
public bool IsTotem => FormInfo.IsTotemForm(Species, Form);
public bool IsTotemNoTransfer => Species is (int)Core.Species.Marowak or (int)Core.Species.Araquanid or (int)Core.Species.Togedemaru or (int)Core.Species.Ribombee;
public int GetTotemBaseForm() => FormInfo.GetTotemBaseForm(Species, Form);
public bool IsRandomUnspecificForm => Form >= FormDynamic;
private const int FormDynamic = FormVivillon;
internal const int FormVivillon = 30;
//protected const int FormRandom = 31;
protected override bool IsMatchLocation(PKM pk)
{
if (EggLocation == Locations.Daycare5 && !Relearn.HasMoves && pk.RelearnMove1 != 0) // Gift Eevee edge case
return false;
return base.IsMatchLocation(pk);
}
protected override bool IsMatchEggLocation(PKM pk)
{
if (!EggEncounter)
return base.IsMatchEggLocation(pk);
var eggloc = pk.Egg_Location;
if (!pk.IsEgg) // hatched
return eggloc == EggLocation || eggloc == Locations.LinkTrade6;
// Unhatched:
if (eggloc != EggLocation)
return false;
if (pk.Met_Location is not (0 or Locations.LinkTrade6))
return false;
return true;
}
protected override bool IsMatchForm(PKM pk, EvoCriteria evo)
{
if (IsRandomUnspecificForm)
return true;
if (IsTotem)
{
var expectForm = pk.Format == 7 ? Form : FormInfo.GetTotemBaseForm(Species, Form);
return expectForm == evo.Form;
}
return base.IsMatchForm(pk, evo);
}
protected override void ApplyDetails(ITrainerInfo tr, EncounterCriteria criteria, PKM pk)
{
base.ApplyDetails(tr, criteria, pk);
if (Species == (int)Core.Species.Magearna && pk is IRibbonSetEvent4 e4)
e4.RibbonWishing = true;
if (Form == FormVivillon && pk is PK7 pk7)
pk.Form = Vivillon3DS.GetPattern(pk7.Country, pk7.Region);
pk.SetRandomEC();
}
internal static EncounterStatic7 GetVC1(ushort species, byte metLevel)
{
bool mew = species == (int)Core.Species.Mew;
return new EncounterStatic7(GameVersion.RBY)
{
Species = species,
Gift = true, // Forces Poké Ball
Ability = TransporterLogic.IsHiddenDisallowedVC1(species) ? AbilityPermission.OnlyFirst : AbilityPermission.OnlyHidden, // Hidden by default, else first
Shiny = mew ? Shiny.Never : Shiny.Random,
FatefulEncounter = mew,
Location = Locations.Transfer1,
Level = metLevel,
FlawlessIVCount = mew ? (byte)5 : (byte)3,
};
}
internal static EncounterStatic7 GetVC2(ushort species, byte metLevel)
{
bool mew = species == (int)Core.Species.Mew;
bool fateful = mew || species == (int)Core.Species.Celebi;
return new EncounterStatic7(GameVersion.GSC)
{
Species = species,
Gift = true, // Forces Poké Ball
Ability = TransporterLogic.IsHiddenDisallowedVC2(species) ? AbilityPermission.OnlyFirst : AbilityPermission.OnlyHidden, // Hidden by default, else first
Shiny = mew ? Shiny.Never : Shiny.Random,
FatefulEncounter = fateful,
Location = Locations.Transfer2,
Level = metLevel,
FlawlessIVCount = fateful ? (byte)5 : (byte)3,
};
}
}

View file

@ -1,21 +0,0 @@
namespace PKHeX.Core;
/// <summary>
/// Generation 7 Static Encounter (<see cref="GameVersion.GG"/>
/// </summary>
/// <inheritdoc cref="EncounterStatic"/>
public sealed record EncounterStatic7b(GameVersion Version) : EncounterStatic(Version)
{
public override int Generation => 7;
public override EntityContext Context => EntityContext.Gen7b;
protected override void ApplyDetails(ITrainerInfo tr, EncounterCriteria criteria, PKM pk)
{
base.ApplyDetails(tr, criteria, pk);
pk.SetRandomEC();
var pb = (PB7)pk;
pb.ResetHeight();
pb.ResetWeight();
pb.ResetCP();
}
}

View file

@ -1,136 +0,0 @@
using static PKHeX.Core.OverworldCorrelation8Requirement;
namespace PKHeX.Core;
/// <summary>
/// Generation 8 Static Encounter
/// </summary>
/// <inheritdoc cref="EncounterStatic"/>
public sealed record EncounterStatic8(GameVersion Version = GameVersion.SWSH) : EncounterStatic(Version), IDynamaxLevelReadOnly, IGigantamaxReadOnly, IRelearn, IOverworldCorrelation8
{
public override int Generation => 8;
public override EntityContext Context => EntityContext.Gen8;
public bool ScriptedNoMarks { get; init; }
public bool CanGigantamax { get; init; }
public byte DynamaxLevel { get; init; }
public Moveset Relearn { get; init; }
public Crossover8 Crossover { get; init; }
public AreaWeather8 Weather { get; init; } = AreaWeather8.Normal;
protected override bool IsMatchLocation(PKM pk)
{
var met = pk.Met_Location;
if (met == Location)
return true;
if ((uint)met > byte.MaxValue)
return false;
return Crossover.IsMatchLocation((byte)met);
}
protected override bool IsMatchLevel(PKM pk, EvoCriteria evo)
{
var met = pk.Met_Level;
var lvl = Level;
if (met == lvl)
return true;
if (lvl < EncounterArea8.BoostLevel && EncounterArea8.IsBoostedArea60(Location))
return met == EncounterArea8.BoostLevel;
return false;
}
public override bool IsMatchExact(PKM pk, EvoCriteria evo)
{
if (pk is PK8 d && d.DynamaxLevel < DynamaxLevel)
return false;
if (pk.Met_Level < EncounterArea8.BoostLevel && Weather is AreaWeather8.Heavy_Fog && EncounterArea8.IsBoostedArea60Fog(Location))
return false;
return base.IsMatchExact(pk, evo);
}
protected override void ApplyDetails(ITrainerInfo tr, EncounterCriteria criteria, PKM pk)
{
base.ApplyDetails(tr, criteria, pk);
if (Weather is AreaWeather8.Heavy_Fog && EncounterArea8.IsBoostedArea60Fog(Location))
pk.CurrentLevel = pk.Met_Level = EncounterArea8.BoostLevel;
var req = GetRequirement(pk);
if (req != MustHave)
{
pk.SetRandomEC();
return;
}
var shiny = Shiny == Shiny.Random ? Shiny.FixedValue : Shiny;
Overworld8RNG.ApplyDetails(pk, criteria, shiny, FlawlessIVCount);
}
public bool IsOverworldCorrelation
{
get
{
if (Gift)
return false; // gifts can have any 128bit seed from overworld
if (ScriptedNoMarks)
return false; // scripted encounters don't act as saved spawned overworld encounters
return true;
}
}
public OverworldCorrelation8Requirement GetRequirement(PKM pk) => IsOverworldCorrelation
? MustHave
: MustNotHave;
public bool IsOverworldCorrelationCorrect(PKM pk)
{
return Overworld8RNG.ValidateOverworldEncounter(pk, Shiny == Shiny.Random ? Shiny.FixedValue : Shiny, FlawlessIVCount);
}
public override EncounterMatchRating GetMatchRating(PKM pk)
{
var rating = base.GetMatchRating(pk);
if (rating != EncounterMatchRating.Match)
return rating;
var req = GetRequirement(pk);
bool correlation = IsOverworldCorrelationCorrect(pk);
if ((req == MustHave) != correlation)
return EncounterMatchRating.DeferredErrors;
// Only encounter slots can have these marks; defer for collisions.
if (pk.Species == (int) Core.Species.Shedinja)
{
// Loses Mark on evolution to Shedinja, but not affixed ribbon value.
return pk switch
{
IRibbonSetMark8 {RibbonMarkCurry: true} => EncounterMatchRating.DeferredErrors,
PK8 {AffixedRibbon: (int) RibbonIndex.MarkCurry} => EncounterMatchRating.Deferred,
_ => EncounterMatchRating.Match,
};
}
if (pk is IRibbonSetMark8 m && (m.RibbonMarkCurry || m.RibbonMarkFishing || m.HasWeatherMark()))
return EncounterMatchRating.DeferredErrors;
return EncounterMatchRating.Match;
}
}
public interface IOverworldCorrelation8
{
OverworldCorrelation8Requirement GetRequirement(PKM pk);
bool IsOverworldCorrelationCorrect(PKM pk);
}
public enum OverworldCorrelation8Requirement
{
CanBeEither,
MustHave,
MustNotHave,
}
public readonly record struct Crossover8(byte L1 = 0, byte L2 = 0, byte L3 = 0, byte L4 = 0, byte L5 = 0, byte L6 = 0, byte L7 = 0)
{
public bool IsMatchLocation(byte location) => location != 0 && L1 != 0 && (
location == L1 || location == L2 || location == L3 ||
location == L4 || location == L5 || location == L6 || location == L7);
}

View file

@ -1,120 +0,0 @@
using System;
using static PKHeX.Core.Encounters8Nest;
using static PKHeX.Core.AbilityPermission;
namespace PKHeX.Core;
/// <summary>
/// Generation 8 Nest Encounter (Raid)
/// </summary>
/// <inheritdoc cref="EncounterStatic"/>
public abstract record EncounterStatic8Nest<T>(GameVersion Version) : EncounterStatic(Version), IGigantamaxReadOnly, IDynamaxLevelReadOnly where T : EncounterStatic8Nest<T>
{
public sealed override int Generation => 8;
public override EntityContext Context => EntityContext.Gen8;
public static Func<PKM, T, bool>? VerifyCorrelation { private get; set; }
public static Action<PKM, T, EncounterCriteria>? GenerateData { private get; set; }
public bool CanGigantamax { get; init; }
public byte DynamaxLevel { get; init; }
public override int Location { get => SharedNest; init { } }
public override bool IsMatchExact(PKM pk, EvoCriteria evo)
{
if (pk is PK8 d && d.DynamaxLevel < DynamaxLevel)
return false;
// Required Ability
if (Ability == OnlyHidden && pk.AbilityNumber != 4)
return false; // H
if (Version != GameVersion.SWSH && pk.Version != (int)Version && pk.Met_Location != SharedNest)
return false;
if (VerifyCorrelation != null && !VerifyCorrelation(pk, (T)this))
return false;
if (pk is IRibbonSetMark8 { HasMarkEncounter8: true })
return false;
if (pk.Species == (int)Core.Species.Shedinja && pk is IRibbonSetAffixed { AffixedRibbon: >= (int)RibbonIndex.MarkLunchtime })
return false;
return base.IsMatchExact(pk, evo);
}
protected sealed override EncounterMatchRating IsMatchDeferred(PKM pk)
{
if (Ability != Any12H)
{
// HA-Only is a strict match. Ability Capsule and Patch can potentially change these.
var num = pk.AbilityNumber;
if (num == 4)
{
if (Ability is not OnlyHidden && !AbilityVerifier.CanAbilityPatch(8, PersonalTable.SWSH.GetFormEntry(Species, Form), pk.Species))
return EncounterMatchRating.DeferredErrors;
}
else if (Ability.IsSingleValue(out int index) && 1 << index != num) // Fixed regular ability
{
if (Ability is OnlyFirst or OnlySecond && !AbilityVerifier.CanAbilityCapsule(8, PersonalTable.SWSH.GetFormEntry(Species, Form)))
return EncounterMatchRating.DeferredErrors;
}
}
return base.IsMatchDeferred(pk);
}
protected override bool IsMatchPartial(PKM pk)
{
if (pk is PK8 and IGigantamax g && g.CanGigantamax != CanGigantamax && !g.CanToggleGigantamax(pk.Species, pk.Form, Species, Form))
return true;
if (Species == (int)Core.Species.Alcremie && pk is IFormArgument { FormArgument: not 0 })
return true;
if (Species == (int)Core.Species.Runerigus && pk is IFormArgument { FormArgument: not 0 })
return true;
switch (Shiny)
{
case Shiny.Never when pk.IsShiny:
case Shiny.Always when !pk.IsShiny:
return true;
}
return base.IsMatchPartial(pk);
}
protected override void ApplyDetails(ITrainerInfo tr, EncounterCriteria criteria, PKM pk)
{
base.ApplyDetails(tr, criteria, pk);
if (GenerateData == null)
pk.SetRandomEC();
}
protected sealed override void SetPINGA(PKM pk, EncounterCriteria criteria)
{
if (GenerateData != null)
{
GenerateData(pk, (T)this, criteria);
return;
}
base.SetPINGA(pk, criteria);
if (Species == (int) Core.Species.Toxtricity)
{
while (true)
{
var result = EvolutionMethod.GetAmpLowKeyResult(pk.Nature);
if (result == pk.Form)
break;
pk.Nature = Util.Rand.Next(25);
}
// Might be originally generated with a Neutral nature, then above logic changes to another.
// Realign the stat nature to Serious mint.
if (pk.Nature != pk.StatNature && ((Nature)pk.StatNature).IsNeutral())
pk.StatNature = (int)Nature.Serious;
}
var pid = pk.PID;
RaidRNG.ForceShinyState(pk, Shiny == Shiny.Always, ref pid);
pk.PID = pid;
}
}

View file

@ -1,244 +0,0 @@
using System;
namespace PKHeX.Core;
/// <summary>
/// Generation 8 Static Encounter
/// </summary>
/// <inheritdoc cref="EncounterStatic"/>
public sealed record EncounterStatic8a(GameVersion Version) : EncounterStatic(Version), IAlphaReadOnly, IMasteryInitialMoveShop8, IScaledSizeReadOnly
{
public override int Generation => 8;
public override EntityContext Context => EntityContext.Gen8a;
public byte HeightScalar { get; }
public byte WeightScalar { get; }
public bool IsAlpha { get; init; }
public EncounterStatic8aCorrelation Method { get; init; }
public bool HasFixedHeight => HeightScalar != NoScalar;
public bool HasFixedWeight => WeightScalar != NoScalar;
private const byte NoScalar = 0;
public EncounterStatic8a(ushort species, byte form, byte level, byte h = NoScalar, byte w = NoScalar) : this(GameVersion.PLA)
{
Species = species;
Form = form;
Level = level;
HeightScalar = h;
WeightScalar = w;
Shiny = Shiny.Never;
}
protected override void ApplyDetails(ITrainerInfo tr, EncounterCriteria criteria, PKM pk)
{
base.ApplyDetails(tr, criteria, pk);
var pa = (PA8)pk;
if (IsAlpha)
pa.IsAlpha = true;
if (HasFixedHeight)
pa.HeightScalar = HeightScalar;
if (HasFixedWeight)
pa.WeightScalar = WeightScalar;
pa.Scale = pa.HeightScalar;
pa.ResetHeight();
pa.ResetWeight();
}
protected override void SetPINGA(PKM pk, EncounterCriteria criteria)
{
var para = GetParams();
var (_, slotSeed) = Overworld8aRNG.ApplyDetails(pk, criteria, para, IsAlpha);
// We don't override LevelMin, so just handle the two species cases.
if (Species == (int)Core.Species.Zorua)
pk.CurrentLevel = pk.Met_Level = Overworld8aRNG.GetRandomLevel(slotSeed, 27, 29);
else if (Species == (int)Core.Species.Phione)
pk.CurrentLevel = pk.Met_Level = Overworld8aRNG.GetRandomLevel(slotSeed, 33, 36);
if (Method == EncounterStatic8aCorrelation.Fixed)
pk.EncryptionConstant = Util.Rand32();
}
protected override void ApplyDetailsBall(PKM pk) => pk.Ball = Gift ? Ball : (int)Core.Ball.LAPoke;
public override bool IsMatchExact(PKM pk, EvoCriteria evo)
{
if (!base.IsMatchExact(pk, evo))
return false;
if (pk is IScaledSize s)
{
// 3 of the Alpha statics were mistakenly set as 127 scale. If they enter HOME on 3.0.1, they'll get bumped to 255.
if (IsAlpha && this is { HeightScalar: 127, WeightScalar: 127 }) // Average Size Alphas
{
// HOME >=3.0.1 ensures 255 scales for the 127's
// PLA and S/V could have safe-harbored them via <=3.0.0
if (pk.Context is EntityContext.Gen8a or EntityContext.Gen9)
{
if (s is not { HeightScalar: 127, WeightScalar: 127 }) // Original?
{
// Must match the HOME updated values AND must have the Alpha ribbon (visited HOME).
if (s is not { HeightScalar: 255, WeightScalar: 255 })
return false;
if (pk is IRibbonSetMark9 { RibbonMarkAlpha: false })
return false;
if (pk.IsUntraded)
return false;
}
}
else
{
// Must match the HOME updated values
if (s is not { HeightScalar: 255, WeightScalar: 255 })
return false;
}
}
else
{
if (HasFixedHeight && s.HeightScalar != HeightScalar)
return false;
if (HasFixedWeight && s.WeightScalar != WeightScalar)
return false;
}
}
if (pk is IAlpha a && a.IsAlpha != IsAlpha)
return false;
return true;
}
protected override bool IsMatchLocation(PKM pk)
{
var metState = LocationsHOME.GetRemapState(Context, pk.Context);
if (metState == LocationRemapState.Original)
return base.IsMatchLocation(pk);
if (metState == LocationRemapState.Remapped)
return IsMetRemappedSWSH(pk);
return base.IsMatchLocation(pk) || IsMetRemappedSWSH(pk);
}
private static bool IsMetRemappedSWSH(PKM pk) => pk.Met_Location == LocationsHOME.SWLA;
public override EncounterMatchRating GetMatchRating(PKM pk)
{
var result = GetMatchRatingInternal(pk);
var orig = base.GetMatchRating(pk);
return result > orig ? result : orig;
}
private EncounterMatchRating GetMatchRatingInternal(PKM pk)
{
if (Shiny != Shiny.Random && !Shiny.IsValid(pk))
return EncounterMatchRating.DeferredErrors;
if (Gift && pk.Ball != Ball)
return EncounterMatchRating.DeferredErrors;
var orig = base.GetMatchRating(pk);
if (orig is not EncounterMatchRating.Match)
return orig;
if (!IsForcedMasteryCorrect(pk))
return EncounterMatchRating.DeferredErrors;
if (!MarkRules.IsMarkValidAlpha(pk, IsAlpha))
return EncounterMatchRating.DeferredErrors;
if (IsAlpha && pk is PA8 { AlphaMove: 0 })
return EncounterMatchRating.Deferred;
return EncounterMatchRating.Match;
}
public bool IsForcedMasteryCorrect(PKM pk)
{
ushort alpha = 0;
if (IsAlpha && Moves.HasMoves)
{
if (pk is PA8 pa && (alpha = pa.AlphaMove) != Moves.Move1)
return false;
}
if (pk is not IMoveShop8Mastery p)
return true;
const bool allowAlphaPurchaseBug = true; // Everything else Alpha is pre-1.1
var level = pk.Met_Level;
var (learn, mastery) = GetLevelUpInfo();
if (!p.IsValidPurchasedEncounter(learn, level, alpha, allowAlphaPurchaseBug))
return false;
Span<ushort> moves = stackalloc ushort[4];
if (Moves.HasMoves)
Moves.CopyTo(moves);
else
learn.SetEncounterMoves(level, moves);
return p.IsValidMasteredEncounter(moves, learn, mastery, level, alpha, allowAlphaPurchaseBug);
}
protected override void SetEncounterMoves(PKM pk, GameVersion version, int level)
{
var pa8 = (PA8)pk;
Span<ushort> moves = stackalloc ushort[4];
var (learn, mastery) = GetLevelUpInfo();
LoadInitialMoveset(pa8, moves, learn, level);
pk.SetMoves(moves);
pk.SetMaximumPPCurrent(moves);
pa8.SetEncounterMasteryFlags(moves, mastery, level);
if (pa8.AlphaMove != 0)
pa8.SetMasteryFlagMove(pa8.AlphaMove);
}
public (Learnset Learn, Learnset Mastery) GetLevelUpInfo()
{
return LearnSource8LA.GetLearnsetAndMastery(Species, Form);
}
public void LoadInitialMoveset(PA8 pa8, Span<ushort> moves, Learnset learn, int level)
{
if (Moves.HasMoves)
Moves.CopyTo(moves);
else
learn.SetEncounterMoves(level, moves);
if (IsAlpha)
pa8.AlphaMove = moves[0];
}
private OverworldParam8a GetParams()
{
var gender = GetGenderRatio();
return new OverworldParam8a
{
IsAlpha = IsAlpha,
FlawlessIVs = FlawlessIVCount,
Shiny = Shiny,
RollCount = 1, // Everything is shiny locked anyways
GenderRatio = gender,
};
}
private byte GetGenderRatio() => Gender switch
{
0 => PersonalInfo.RatioMagicMale,
1 => PersonalInfo.RatioMagicFemale,
_ => GetGenderRatioPersonal(),
};
private byte GetGenderRatioPersonal()
{
var pt = PersonalTable.LA;
var entry = pt.GetFormEntry(Species, Form);
return entry.Gender;
}
}
public enum EncounterStatic8aCorrelation : byte
{
WildGroup,
Fixed,
}

View file

@ -1,145 +0,0 @@
using System;
using static PKHeX.Core.StaticCorrelation8bRequirement;
namespace PKHeX.Core;
/// <summary>
/// Generation 8 Static Encounter
/// </summary>
/// <inheritdoc cref="EncounterStatic"/>
public sealed record EncounterStatic8b : EncounterStatic, IStaticCorrelation8b
{
public override int Generation => 8;
public override EntityContext Context => EntityContext.Gen8b;
public bool Roaming { get; init; }
public override bool EggEncounter => EggLocation != Locations.Default8bNone;
public EncounterStatic8b(GameVersion game) : base(game) => EggLocation = Locations.Default8bNone;
protected override bool IsMatchLocation(PKM pk)
{
var metState = LocationsHOME.GetRemapState(Context, pk.Context);
if (metState == LocationRemapState.Original)
return IsMatchLocationExact(pk);
if (metState == LocationRemapState.Remapped)
return IsMatchLocationRemapped(pk);
return IsMatchLocationExact(pk) || IsMatchLocationRemapped(pk);
}
private bool IsMatchLocationRemapped(PKM pk)
{
var met = (ushort)pk.Met_Location;
var version = pk.Version;
if (pk.Context == EntityContext.Gen8)
return LocationsHOME.IsValidMetBDSP(met, version);
return LocationsHOME.GetMetSWSH((ushort)Location, version) == met;
}
private bool IsMatchLocationExact(PKM pk)
{
if (!Roaming)
return base.IsMatchLocation(pk);
return IsRoamingLocation(pk);
}
private static bool IsRoamingLocation(PKM pk)
{
var location = pk.Met_Location;
foreach (var value in Roaming_MetLocation_BDSP)
{
if (value == location)
return true;
}
return false;
}
public StaticCorrelation8bRequirement GetRequirement(PKM pk) => Roaming
? MustHave
: MustNotHave;
public bool IsStaticCorrelationCorrect(PKM pk)
{
return Roaming8bRNG.ValidateRoamingEncounter(pk, Shiny == Shiny.Random ? Shiny.FixedValue : Shiny, FlawlessIVCount);
}
protected override bool IsMatchEggLocation(PKM pk)
{
var metState = LocationsHOME.GetRemapState(Context, pk.Context);
if (metState == LocationRemapState.Original)
return IsMatchEggLocationExact(pk);
if (metState == LocationRemapState.Remapped)
return IsMatchEggLocationRemapped(pk);
// Either
return IsMatchEggLocationExact(pk) || IsMatchEggLocationRemapped(pk);
}
private bool IsMatchEggLocationRemapped(PKM pk)
{
if (!EggEncounter)
return pk.Egg_Location == 0;
return LocationsHOME.IsLocationSWSHEgg(pk.Version, pk.Met_Location, pk.Egg_Location, (ushort)EggLocation);
}
private bool IsMatchEggLocationExact(PKM pk)
{
var eggloc = pk.Egg_Location;
if (!EggEncounter)
return eggloc == EggLocation;
if (!pk.IsEgg) // hatched
return eggloc == EggLocation || eggloc == Locations.LinkTrade6NPC;
// Unhatched:
if (eggloc != EggLocation)
return false;
if (pk.Met_Location is not (Locations.Default8bNone or Locations.LinkTrade6NPC))
return false;
return true;
}
protected override void ApplyDetails(ITrainerInfo tr, EncounterCriteria criteria, PKM pk)
{
pk.Met_Location = pk.Egg_Location = Locations.Default8bNone;
base.ApplyDetails(tr, criteria, pk);
var req = GetRequirement(pk);
if (req == MustHave) // Roamers
{
var shiny = Shiny == Shiny.Random ? Shiny.FixedValue : Shiny;
Roaming8bRNG.ApplyDetails(pk, criteria, shiny, FlawlessIVCount);
}
else
{
var shiny = Shiny == Shiny.Never ? Shiny.Never : Shiny.Random;
Wild8bRNG.ApplyDetails(pk, criteria, shiny, FlawlessIVCount, Ability);
}
}
protected override void SetMetData(PKM pk, int level, DateTime today)
{
pk.Met_Level = level;
pk.Met_Location = !Roaming ? Location : Roaming_MetLocation_BDSP[0];
pk.MetDate = DateOnly.FromDateTime(today);
}
// defined by mvpoke in encounter data
private static ReadOnlySpan<ushort> Roaming_MetLocation_BDSP => new ushort[]
{
197, 201, 354, 355, 356, 357, 358, 359, 361, 362, 364, 365, 367, 373, 375, 377,
378, 379, 383, 385, 392, 394, 395, 397, 400, 403, 404, 407,
485,
};
}
public interface IStaticCorrelation8b
{
StaticCorrelation8bRequirement GetRequirement(PKM pk);
bool IsStaticCorrelationCorrect(PKM pk);
}
public enum StaticCorrelation8bRequirement
{
CanBeEither,
MustHave,
MustNotHave,
}

View file

@ -1,115 +0,0 @@
namespace PKHeX.Core;
/// <summary>
/// Generation 9 Static Encounter
/// </summary>
/// <inheritdoc cref="EncounterStatic"/>
public sealed record EncounterStatic9(GameVersion Version) : EncounterStatic(Version), IGemType
{
public override int Generation => 9;
public override EntityContext Context => EntityContext.Gen9;
public byte Size { get; init; }
public GemType TeraType { get; init; }
public bool IsTitan { get; init; }
private bool NoScalarsDefined => Size == 0;
public bool GiftWithLanguage => Gift && !ScriptedYungoos; // Nice error by GameFreak -- all gifts (including eggs) set the HT_Language memory value in addition to OT_Language.
public bool StarterBoxLegend => Gift && Species is (int)Core.Species.Koraidon or (int)Core.Species.Miraidon;
public bool ScriptedYungoos => Species == (int)Core.Species.Yungoos && Level == 2;
public SizeType9 ScaleType => NoScalarsDefined ? SizeType9.RANDOM : SizeType9.VALUE;
protected override bool IsMatchLocation(PKM pk)
{
var metState = LocationsHOME.GetRemapState(Context, pk.Context);
if (metState == LocationRemapState.Original)
return IsMatchLocationExact(pk);
if (metState == LocationRemapState.Remapped)
return IsMatchLocationRemapped(pk);
return IsMatchLocationExact(pk) || IsMatchLocationRemapped(pk);
}
private bool IsMatchLocationExact(PKM pk) => pk.Met_Location == Location;
private bool IsMatchLocationRemapped(PKM pk)
{
var met = (ushort)pk.Met_Location;
var version = pk.Version;
if (pk.Context == EntityContext.Gen8)
return LocationsHOME.IsValidMetSV(met, version);
return LocationsHOME.GetMetSWSH((ushort)Location, version) == met;
}
protected override bool IsMatchPartial(PKM pk)
{
if (pk is IScaledSize v && !NoScalarsDefined)
{
if (Gift)
{
if (v.HeightScalar != Size)
return true;
if (v.WeightScalar != Size)
return true;
}
var current = pk is IScaledSize3 size3 ? size3.Scale : v.HeightScalar;
if (current != Size)
return false;
}
return base.IsMatchPartial(pk);
}
public override bool IsMatchExact(PKM pk, EvoCriteria evo)
{
if (TeraType != GemType.Random && pk is ITeraType t && !Tera9RNG.IsMatchTeraType(TeraType, Species, Form, (byte)t.TeraTypeOriginal))
return false;
return base.IsMatchExact(pk, evo);
}
protected override void ApplyDetails(ITrainerInfo tr, EncounterCriteria criteria, PKM pk)
{
base.ApplyDetails(tr, criteria, pk);
var pk9 = (PK9)pk;
if (Gift && !ScriptedYungoos)
pk9.HT_Language = (byte)pk.Language;
if (StarterBoxLegend)
pk9.FormArgument = 1; // Not Ride Form.
if (IsTitan)
pk9.RibbonMarkTitan = true;
pk9.Obedience_Level = (byte)pk9.Met_Level;
const byte undefinedSize = 0;
byte height, weight, scale;
if (NoScalarsDefined)
{
height = weight = scale = undefinedSize;
}
else
{
// Gifts have a defined H/W/S, while capture-able only have scale.
height = weight = Gift ? Size : undefinedSize;
scale = Size;
}
const byte rollCount = 1;
var pi = PersonalTable.SV.GetFormEntry(Species, Form);
var param = new GenerateParam9(Species, pi.Gender, FlawlessIVCount, rollCount, height, weight, ScaleType, scale, Ability, Shiny);
ulong init = Util.Rand.Rand64();
var success = this.TryApply64(pk9, init, param, criteria, IVs.IsSpecified);
if (!success)
this.TryApply64(pk9, init, param, EncounterCriteria.Unrestricted, IVs.IsSpecified);
if (IVs.IsSpecified)
{
pk.IV_HP = IVs.HP;
pk.IV_ATK = IVs.ATK;
pk.IV_DEF = IVs.DEF;
pk.IV_SPA = IVs.SPA;
pk.IV_SPD = IVs.SPD;
pk.IV_SPE = IVs.SPE;
}
if (Nature != Nature.Random)
pk.Nature = pk.StatNature = (int)Nature;
if (Gender != -1)
pk.Gender = (byte)Gender;
}
}

View file

@ -1,117 +0,0 @@
namespace PKHeX.Core;
/// <summary>
/// Shadow Pokémon Encounter found in <see cref="GameVersion.CXD"/>
/// </summary>
/// <inheritdoc cref="EncounterStatic"/>
/// <param name="ID">Initial Shadow Gauge value.</param>
/// <param name="Gauge">Initial Shadow Gauge value.</param>
/// <param name="Locks">Team Specification with required <see cref="Species"/>, <see cref="Nature"/> and Gender.</param>
// ReSharper disable NotAccessedPositionalProperty.Global
public sealed record EncounterStaticShadow(GameVersion Version, byte ID, short Gauge, TeamLock[] Locks) : EncounterStatic(Version)
{
// ReSharper restore NotAccessedPositionalProperty.Global
public override int Generation => 3;
public override EntityContext Context => EntityContext.Gen3;
/// <summary>
/// Originates from the EReader scans (Japanese Only)
/// </summary>
public bool EReader => Location == 128; // @ Card e Room (Japanese games only)
protected override bool IsMatchLocation(PKM pk)
{
if (pk.Format != 3)
return true; // transfer location verified later
var met = pk.Met_Location;
if (met == Location)
return true;
// XD can re-battle with Miror B
// Realgam Tower, Rock, Oasis, Cave, Pyrite Town
return Version == GameVersion.XD && met is (59 or 90 or 91 or 92 or 113);
}
protected override bool IsMatchLevel(PKM pk, EvoCriteria evo)
{
if (pk.Format != 3) // Met Level lost on PK3=>PK4
return Level <= evo.LevelMax;
return pk.Met_Level == Level;
}
protected override void ApplyDetails(ITrainerInfo tr, EncounterCriteria criteria, PKM pk)
{
base.ApplyDetails(tr, criteria, pk);
((IRibbonSetEvent3)pk).RibbonNational = true;
}
protected override void SetPINGA(PKM pk, EncounterCriteria criteria)
{
if (!EReader)
SetPINGA_Regular(pk, criteria);
else
SetPINGA_EReader(pk);
}
private void SetPINGA_Regular(PKM pk, EncounterCriteria criteria)
{
var pi = pk.PersonalInfo;
int gender = criteria.GetGender(-1, pi);
int nature = (int)criteria.GetNature(Nature.Random);
int ability = criteria.GetAbilityFromNumber(0);
// Ensure that any generated specimen has valid Shadow Locks
// This can be kinda slow, depending on how many locks / how strict they are.
// Cancel this operation if too many attempts are made to prevent infinite loops.
int ctr = 0;
const int max = 100_000;
do
{
PIDGenerator.SetRandomWildPID(pk, 3, nature, ability, gender, PIDType.CXD);
var pidiv = MethodFinder.Analyze(pk);
var result = LockFinder.IsAllShadowLockValid(this, pidiv, pk);
if (result)
break;
}
while (++ctr <= max);
#if DEBUG
System.Diagnostics.Debug.Assert(ctr < 100_000);
#endif
}
private void SetPINGA_EReader(PKM pk)
{
// E-Reader have all IVs == 0
for (int i = 0; i < 6; i++)
pk.SetIV(i, 0);
// All E-Reader shadows are actually nature/gender locked.
var locked = Locks[0].Locks[^1];
var (nature, gender) = locked.GetLock;
// Ensure that any generated specimen has valid Shadow Locks
// This can be kinda slow, depending on how many locks / how strict they are.
// Cancel this operation if too many attempts are made to prevent infinite loops.
int ctr = 0;
const int max = 100_000;
do
{
var seed = Util.Rand32();
PIDGenerator.SetValuesFromSeedXDRNG_EReader(pk, seed);
if (pk.Nature != nature || pk.Gender != gender)
continue;
var pidiv = new PIDIV(PIDType.CXD, seed);
var result = LockFinder.IsAllShadowLockValid(this, pidiv, pk);
if (result)
break;
}
while (++ctr <= max);
#if DEBUG
System.Diagnostics.Debug.Assert(ctr < 100_000);
#endif
}
}

View file

@ -1,277 +0,0 @@
using System;
using System.Collections.Generic;
namespace PKHeX.Core;
/// <summary>
/// Trade Encounter data
/// </summary>
/// <remarks>
/// Trade data is fixed level in all cases except for the first few generations of games.
/// </remarks>
public abstract record EncounterTrade(GameVersion Version) : IEncounterable, IMoveset, IEncounterMatch
{
public ushort Species { get; init; }
public byte Form { get; init; }
public byte Level { get; init; }
public virtual byte LevelMin => Level;
public byte LevelMax => 100;
public abstract int Generation { get; }
public abstract EntityContext Context { get; }
public int CurrentLevel { get; init; } = -1;
public abstract int Location { get; }
public AbilityPermission Ability { get; init; }
public Nature Nature { get; init; } = Nature.Random;
public virtual Shiny Shiny => Shiny.Never;
public sbyte Gender { get; init; } = -1;
public sbyte OTGender { get; init; } = -1;
public bool IsNicknamed { get; init; } = true;
public bool EvolveOnTrade { get; init; }
public byte Ball { get; init; } = 4;
public int EggLocation { get; init; }
public ushort TID16 { get; init; }
public ushort SID16 { get; init; }
public Moveset Moves { get; init; }
public IndividualValueSet IVs { get; init; }
public Ball FixedBall => (Ball)Ball;
public bool EggEncounter => false;
public int TID7
{
init
{
TID16 = (ushort) value;
SID16 = (ushort)(value >> 16);
}
}
private const string _name = "In-game Trade";
public string Name => _name;
public string LongName => _name;
public bool IsShiny => Shiny.IsShiny();
public IReadOnlyList<string> Nicknames { get; internal set; } = Array.Empty<string>();
public IReadOnlyList<string> TrainerNames { get; internal set; } = Array.Empty<string>();
public string GetNickname(int language) => (uint)language < Nicknames.Count ? Nicknames[language] : string.Empty;
public string GetOT(int language) => (uint)language < TrainerNames.Count ? TrainerNames[language] : string.Empty;
public bool HasNickname => Nicknames.Count != 0 && IsNicknamed;
public bool HasTrainerName => TrainerNames.Count != 0;
public PKM ConvertToPKM(ITrainerInfo tr) => ConvertToPKM(tr, EncounterCriteria.Unrestricted);
public PKM ConvertToPKM(ITrainerInfo tr, EncounterCriteria criteria)
{
var pk = EntityBlank.GetBlank(Generation, Version);
tr.ApplyTo(pk);
ApplyDetails(tr, criteria, pk);
return pk;
}
protected virtual void ApplyDetails(ITrainerInfo sav, EncounterCriteria criteria, PKM pk)
{
var version = this.GetCompatibleVersion((GameVersion)sav.Game);
int lang = (int)Language.GetSafeLanguage(Generation, (LanguageID)sav.Language, version);
int level = CurrentLevel > 0 ? CurrentLevel : LevelMin;
if (level == 0)
level = Math.Max((byte)1, LevelMin);
ushort species = Species;
if (EvolveOnTrade)
species++;
pk.EncryptionConstant = Util.Rand32();
pk.Species = species;
pk.Form = Form;
pk.Language = lang;
pk.OT_Name = pk.Format == 1 ? StringConverter12.G1TradeOTStr : HasTrainerName ? GetOT(lang) : sav.OT;
pk.OT_Gender = HasTrainerName ? Math.Max(0, (int)OTGender) : sav.Gender;
pk.SetNickname(HasNickname ? GetNickname(lang) : string.Empty);
pk.CurrentLevel = level;
pk.Version = (int) version;
pk.TID16 = TID16;
pk.SID16 = SID16;
pk.Ball = Ball;
pk.OT_Friendship = pk.PersonalInfo.BaseFriendship;
SetPINGA(pk, criteria);
SetMoves(pk, version, level);
var time = DateTime.Now;
if (pk.Format != 2 || version == GameVersion.C)
{
SetMetData(pk, level, Location, time);
}
else
{
pk.OT_Gender = 0;
}
if (EggLocation != 0)
SetEggMetData(pk, time);
if (pk.Format < 6)
return;
sav.ApplyHandlingTrainerInfo(pk, force: true);
pk.SetRandomEC();
if (pk is IScaledSize s)
{
s.HeightScalar = PokeSizeUtil.GetRandomScalar();
s.WeightScalar = PokeSizeUtil.GetRandomScalar();
}
if (pk is PK6 pk6)
pk6.SetRandomMemory6();
}
protected virtual void SetPINGA(PKM pk, EncounterCriteria criteria)
{
var pi = pk.PersonalInfo;
int gender = criteria.GetGender(Gender, pi);
int nature = (int)criteria.GetNature(Nature);
int ability = criteria.GetAbilityFromNumber(Ability);
PIDGenerator.SetRandomWildPID(pk, Generation, nature, ability, gender);
pk.Nature = pk.StatNature = nature;
pk.Gender = gender;
pk.RefreshAbility(ability);
SetIVs(pk);
}
protected void SetIVs(PKM pk)
{
if (IVs.IsSpecified)
pk.SetRandomIVsTemplate(IVs, 0);
else
pk.SetRandomIVs(minFlawless: 3);
}
private void SetMoves(PKM pk, GameVersion version, int level)
{
if (Moves.HasMoves)
{
pk.SetMoves(Moves);
pk.SetMaximumPPCurrent(Moves);
}
else
{
Span<ushort> moves = stackalloc ushort[4];
var source = GameData.GetLearnSource(version);
source.SetEncounterMoves(Species, Form, level, moves);
pk.SetMoves(moves);
pk.SetMaximumPPCurrent(moves);
}
}
private void SetEggMetData(PKM pk, DateTime time)
{
pk.Egg_Location = EggLocation;
pk.EggMetDate = DateOnly.FromDateTime(time);
}
private static void SetMetData(PKM pk, int level, int location, DateTime time)
{
pk.Met_Level = level;
pk.Met_Location = location;
pk.MetDate = DateOnly.FromDateTime(time);
}
public virtual bool IsMatchExact(PKM pk, EvoCriteria evo)
{
if (IVs.IsSpecified)
{
if (!Legal.GetIsFixedIVSequenceValidSkipRand(IVs, pk))
return false;
}
if (!IsMatchNatureGenderShiny(pk))
return false;
if (TID16 != pk.TID16)
return false;
if (SID16 != pk.SID16)
return false;
if (!IsMatchLevel(pk, evo))
return false;
if (CurrentLevel != -1 && CurrentLevel > pk.CurrentLevel)
return false;
if (Form != evo.Form && !FormInfo.IsFormChangeable(Species, Form, pk.Form, Context, pk.Context))
return false;
if (OTGender != -1 && OTGender != pk.OT_Gender)
return false;
if (!IsMatchEggLocation(pk))
return false;
// if (z.Ability == 4 ^ pk.AbilityNumber == 4) // defer to Ability
// continue;
int version = pk.Version;
if (Generation >= 8 && Context != EntityContext.Gen8 && pk is PK8)
version = LocationsHOME.GetVersionSWSHOriginal((ushort)pk.Met_Location);
if (!Version.Contains((GameVersion)version))
return false;
return true;
}
protected virtual bool IsMatchEggLocation(PKM pk)
{
var expect = EggLocation;
if (pk is PB8 && expect is 0)
expect = Locations.Default8bNone;
return pk.Egg_Location == expect;
}
private bool IsMatchLevel(PKM pk, EvoCriteria evo)
{
if (!pk.HasOriginalMetLocation)
return evo.LevelMax >= Level;
if (Location != pk.Met_Location)
{
if (!LocationsHOME.IsMatchLocation(Context, pk.Context, pk.Met_Location, Location, LocationsHOME.GetVersionSWSHOriginal((ushort)pk.Met_Location)))
return false;
}
if (pk.Format < 5)
return evo.LevelMax >= Level;
return pk.Met_Level == Level;
}
protected virtual bool IsMatchNatureGenderShiny(PKM pk)
{
if (!Shiny.IsValid(pk))
return false;
if (Gender != -1 && Gender != pk.Gender)
return false;
if (Nature != Nature.Random && pk.Nature != (int)Nature)
return false;
return true;
}
public EncounterMatchRating GetMatchRating(PKM pk)
{
if (IsMatchPartial(pk))
return EncounterMatchRating.PartialMatch;
if (IsMatchDeferred(pk))
return EncounterMatchRating.Deferred;
return EncounterMatchRating.Match;
}
protected virtual bool IsMatchDeferred(PKM pk) => false;
protected virtual bool IsMatchPartial(PKM pk) => false;
}

View file

@ -1,138 +0,0 @@
using System.Linq;
namespace PKHeX.Core;
/// <summary>
/// Trade Encounter data with a fixed Catch Rate
/// </summary>
/// <remarks>
/// Generation 1 specific value used in detecting unmodified/un-traded Generation 1 Trade Encounter data.
/// Species &amp; Minimum level (legal) possible to acquire at.
/// </remarks>
public sealed record EncounterTrade1 : EncounterTradeGB
{
public override int Generation => 1;
public override EntityContext Context => EntityContext.Gen1;
public override byte LevelMin => CanObtainMinGSC() ? LevelMinGSC : LevelMinRBY;
private readonly byte LevelMinRBY;
private readonly byte LevelMinGSC;
public override int Location => 0;
public override Shiny Shiny => Shiny.Random;
public EncounterTrade1(ushort species, GameVersion game, byte rby, byte gsc) : base(species, gsc, game)
{
TrainerNames = StringConverter12.G1TradeOTName;
LevelMinRBY = rby;
LevelMinGSC = gsc;
}
public EncounterTrade1(ushort species, GameVersion game, byte rby) : this(species, game, rby, rby) { }
public byte GetInitialCatchRate()
{
var pt = Version == GameVersion.YW ? PersonalTable.Y : PersonalTable.RB;
return (byte)pt[Species].CatchRate;
}
protected override void ApplyDetails(ITrainerInfo sav, EncounterCriteria criteria, PKM pk)
{
base.ApplyDetails(sav, criteria, pk);
var pk1 = (PK1)pk;
pk1.Catch_Rate = GetInitialCatchRate();
}
internal bool IsNicknameValid(PKM pk)
{
var nick = pk.Nickname;
if (pk.Format <= 2)
return Nicknames.Contains(nick);
// Converted string 1/2->7 to language specific value
// Nicknames can be from any of the languages it can trade between.
int lang = pk.Language;
if (lang == 1)
{
// Special consideration for Hiragana strings that are transferred
if (Version == GameVersion.YW && Species == (int)Core.Species.Dugtrio)
return nick == "ぐりお";
return nick == Nicknames[1];
}
return GetNicknameIndex(nick) >= 2;
}
internal bool IsTrainerNameValid(PKM pk)
{
string ot = pk.OT_Name;
if (pk.Format <= 2)
return ot == StringConverter12.G1TradeOTStr;
// Converted string 1/2->7 to language specific value
int lang = pk.Language;
var tr = GetOT(lang);
return ot == tr;
}
private int GetNicknameIndex(string nickname)
{
var nn = Nicknames;
for (int i = 0; i < nn.Count; i++)
{
if (nn[i] == nickname)
return i;
}
return -1;
}
private bool CanObtainMinGSC()
{
if (!ParseSettings.AllowGen1Tradeback)
return false;
if (Version == GameVersion.BU && EvolveOnTrade)
return ParseSettings.AllowGBCartEra;
return true;
}
private bool IsMatchLevel(PKM pk, int lvl)
{
if (pk is not PK1)
return lvl >= LevelMinGSC;
return lvl >= LevelMin;
}
public override bool IsMatchExact(PKM pk, EvoCriteria evo)
{
if (!IsMatchLevel(pk, pk.CurrentLevel)) // minimum required level
return false;
if (Version == GameVersion.BU)
{
// Encounters with this version have to originate from the Japanese Blue game.
if (!pk.Japanese)
return false;
// Stadium 2 can transfer from GSC->RBY without a "Trade", thus allowing un-evolved outsiders
if (EvolveOnTrade && !ParseSettings.AllowGBCartEra && pk.CurrentLevel < LevelMinRBY)
return false;
}
return true;
}
protected override bool IsMatchPartial(PKM pk)
{
if (!IsTrainerNameValid(pk))
return true;
if (!IsNicknameValid(pk))
return true;
if (ParseSettings.AllowGen1Tradeback)
return false;
if (pk is not PK1 pk1)
return false;
var req = GetInitialCatchRate();
return req != pk1.Catch_Rate;
}
}

View file

@ -1,99 +0,0 @@
using static PKHeX.Core.Species;
namespace PKHeX.Core;
/// <summary>
/// Generation 2 Trade Encounter
/// </summary>
/// <inheritdoc cref="EncounterTradeGB"/>
public sealed record EncounterTrade2 : EncounterTradeGB
{
public override int Generation => 2;
public override EntityContext Context => EntityContext.Gen2;
public override int Location => Locations.LinkTrade2NPC;
public EncounterTrade2(ushort species, byte level, ushort tid) : base(species, level, GameVersion.GSC)
{
TID16 = tid;
}
public override bool IsMatchExact(PKM pk, EvoCriteria evo)
{
if (Level > pk.CurrentLevel) // minimum required level
return false;
if (TID16 != pk.TID16)
return false;
if (pk.Format <= 2)
{
if (Gender >= 0 && Gender != pk.Gender)
return false;
if (IVs.IsSpecified && !Legal.GetIsFixedIVSequenceValidNoRand(IVs, pk))
return false;
if (pk is { Format: 2, Met_Location: not (0 or 126) })
return false;
}
if (!IsValidTradeOTGender(pk))
return false;
return IsValidTradeOTName(pk);
}
private bool IsValidTradeOTGender(PKM pk)
{
if (OTGender == 1)
{
// Female, can be cleared if traded to RBY (clears met location)
if (pk.Format <= 2)
return pk.OT_Gender == (pk.Met_Location != 0 ? 1 : 0);
return pk.OT_Gender == 0 || !pk.VC1; // require male except if transferred from GSC
}
return pk.OT_Gender == 0;
}
private bool IsValidTradeOTName(PKM pk)
{
var OT = pk.OT_Name;
if (pk.Japanese)
return GetOT((int)LanguageID.Japanese) == OT;
if (pk.Korean)
return GetOT((int)LanguageID.Korean) == OT;
var lang = GetInternationalLanguageID(OT);
if (pk.Format < 7)
return lang != -1;
switch (Species)
{
case (int)Voltorb when pk.Language == (int)LanguageID.French:
if (lang == (int)LanguageID.Spanish)
return false;
if (lang != -1)
return true;
return OT == "FALCçN"; // FALCÁN
case (int)Shuckle when pk.Language == (int)LanguageID.French:
if (lang == (int)LanguageID.Spanish)
return false;
if (lang != -1)
return true;
return OT == "MANôA"; // MANÍA
default: return lang != -1;
}
}
private int GetInternationalLanguageID(string OT)
{
const int start = (int)LanguageID.English;
const int end = (int)LanguageID.Spanish;
var tr = TrainerNames;
for (int i = start; i <= end; i++)
{
if (tr[i] == OT)
return i;
}
return -1;
}
}

View file

@ -1,94 +0,0 @@
using System;
namespace PKHeX.Core;
/// <summary>
/// Generation 3 Trade Encounter
/// </summary>
/// <inheritdoc cref="EncounterTrade"/>
public sealed record EncounterTrade3 : EncounterTrade, IContestStatsReadOnly
{
public override int Generation => 3;
public override EntityContext Context => EntityContext.Gen3;
public override int Location => Locations.LinkTrade3NPC;
/// <summary>
/// Fixed <see cref="PKM.PID"/> value the encounter must have.
/// </summary>
public readonly uint PID;
public override Shiny Shiny => Shiny.FixedValue;
public byte CNT_Cool { get; private init; }
public byte CNT_Beauty { get; private init; }
public byte CNT_Cute { get; private init; }
public byte CNT_Smart { get; private init; }
public byte CNT_Tough { get; private init; }
public byte CNT_Sheen { get; private init; }
public ReadOnlySpan<byte> Contest
{
init
{
CNT_Cool = value[0];
CNT_Beauty = value[1];
CNT_Cute = value[2];
CNT_Smart = value[3];
CNT_Tough = value[4];
CNT_Sheen = value[5];
}
}
public EncounterTrade3(GameVersion game, uint pid, ushort species, byte level) : base(game)
{
PID = pid;
Species = species;
Level = level;
}
public override bool IsMatchExact(PKM pk, EvoCriteria evo)
{
if (!base.IsMatchExact(pk, evo))
return false;
if (pk is IContestStatsReadOnly s && s.IsContestBelow(this))
return false;
return true;
}
protected override void ApplyDetails(ITrainerInfo sav, EncounterCriteria criteria, PKM pk)
{
base.ApplyDetails(sav, criteria, pk);
var pk3 = (PK3) pk;
// Italian LG Jynx untranslated from English name
if (Species == (int)Core.Species.Jynx && pk3 is { Version: (int)GameVersion.LG, Language: (int)LanguageID.Italian })
{
pk3.OT_Name = GetOT((int)LanguageID.English);
pk3.SetNickname(GetNickname((int)LanguageID.English));
}
this.CopyContestStatsTo((PK3)pk);
}
protected override void SetPINGA(PKM pk, EncounterCriteria criteria)
{
var pi = pk.PersonalInfo;
int gender = criteria.GetGender(EntityGender.GetFromPID(Species, PID), pi);
int nature = (int)criteria.GetNature(Nature);
int ability = criteria.GetAbilityFromNumber(Ability);
pk.PID = PID;
pk.Nature = nature;
pk.Gender = gender;
pk.RefreshAbility(ability);
SetIVs(pk);
}
protected override bool IsMatchNatureGenderShiny(PKM pk)
{
return PID == pk.EncryptionConstant;
}
}

View file

@ -1,169 +0,0 @@
namespace PKHeX.Core;
/// <summary>
/// Generation 4 Trade Encounter
/// </summary>
/// <inheritdoc cref="EncounterTradeGB"/>
public abstract record EncounterTrade4(GameVersion Version) : EncounterTrade(Version)
{
public sealed override int Generation => 4;
public override EntityContext Context => EntityContext.Gen4;
protected static readonly string[] RanchOTNames = { string.Empty, "ユカリ", "Hayley", "EULALIE", "GIULIA", "EUKALIA", string.Empty, "Eulalia" };
}
/// <summary>
/// Generation 4 Trade Encounter with a fixed PID value.
/// </summary>
/// <inheritdoc cref="EncounterTrade4"/>
public sealed record EncounterTrade4PID : EncounterTrade4, IContestStatsReadOnly
{
/// <summary>
/// Fixed <see cref="PKM.PID"/> value the encounter must have.
/// </summary>
public readonly uint PID;
public override Shiny Shiny => Shiny.FixedValue;
public EncounterTrade4PID(GameVersion game, uint pid, ushort species, byte level) : base(game)
{
PID = pid;
Species = species;
Level = level;
}
public byte CNT_Cool { get; init; }
public byte CNT_Beauty { get; init; }
public byte CNT_Cute { get; init; }
public byte CNT_Smart { get; init; }
public byte CNT_Tough { get; init; }
public byte CNT_Sheen { get; init; }
public byte Contest
{
init
{
CNT_Cool = value;
CNT_Beauty = value;
CNT_Cute = value;
CNT_Smart = value;
CNT_Tough = value;
//CNT_Sheen = value;
}
}
public int MetLocation { get; init; }
public override int Location => MetLocation == default ? Locations.LinkTrade4NPC : MetLocation;
public override bool IsMatchExact(PKM pk, EvoCriteria evo)
{
if (!base.IsMatchExact(pk, evo))
return false;
if (pk is IContestStatsReadOnly s && s.IsContestBelow(this))
return false;
return true;
}
protected override void ApplyDetails(ITrainerInfo sav, EncounterCriteria criteria, PKM pk)
{
base.ApplyDetails(sav, criteria, pk);
var pk4 = (PK4) pk;
if (Version == GameVersion.DPPt)
{
// Has German Language ID for all except German origin, which is English
if (Species == (int)Core.Species.Magikarp)
pk4.Language = (int)(pk4.Language == (int)LanguageID.German ? LanguageID.English : LanguageID.German);
// All other trades received (DP only): English games have a Japanese language ID instead of English.
else if (pk4.Version is not (int)GameVersion.Pt && pk4.Language == (int)LanguageID.English)
pk4.Language = (int)LanguageID.Japanese;
}
else // HGSS
{
// Has English Language ID for all except English origin, which is French
if (Species == (int)Core.Species.Pikachu)
pk4.Language = (int)(pk4.Language == (int)LanguageID.English ? LanguageID.French : LanguageID.English);
}
this.CopyContestStatsTo(pk4);
}
protected override void SetPINGA(PKM pk, EncounterCriteria criteria)
{
pk.PID = PID;
pk.Nature = (int)(PID % 25);
pk.Gender = Gender;
pk.RefreshAbility(Ability.GetSingleValue());
SetIVs(pk);
}
protected override bool IsMatchNatureGenderShiny(PKM pk)
{
return PID == pk.EncryptionConstant;
}
}
/// <summary>
/// Generation 4 Trade Encounter with a fixed PID value, met location, and version.
/// </summary>
/// <inheritdoc cref="EncounterTradeGB"/>
public sealed record EncounterTrade4RanchGift : EncounterTrade4
{
/// <summary>
/// Fixed <see cref="PKM.PID"/> value the encounter must have.
/// </summary>
public readonly uint PID;
public int MetLocation { private get; init; }
public override int Location => MetLocation;
public override Shiny Shiny => Shiny.FixedValue;
public EncounterTrade4RanchGift(uint pid, ushort species, byte level) : base(GameVersion.D)
{
PID = pid;
Species = species;
Level = level;
TrainerNames = RanchOTNames;
}
protected override bool IsMatchNatureGenderShiny(PKM pk)
{
return PID == pk.EncryptionConstant;
}
protected override void SetPINGA(PKM pk, EncounterCriteria criteria)
{
pk.PID = PID;
pk.Nature = (int)(PID % 25);
pk.Gender = Gender;
pk.RefreshAbility(Ability.GetSingleValue());
SetIVs(pk);
}
}
/// <summary>
/// Generation 4 Trade Encounter with a fixed location and version, as well as special details.
/// </summary>
/// <inheritdoc cref="EncounterTrade4"/>
public sealed record EncounterTrade4RanchSpecial : EncounterTrade4, IFatefulEncounterReadOnly
{
public override int Location => 3000;
public bool FatefulEncounter => true;
public EncounterTrade4RanchSpecial(ushort species, byte level) : base(GameVersion.D)
{
Species = species;
Level = level;
Ball = 0x10;
OTGender = 1;
TrainerNames = RanchOTNames;
}
protected override void ApplyDetails(ITrainerInfo sav, EncounterCriteria criteria, PKM pk)
{
base.ApplyDetails(sav, criteria, pk);
pk.FatefulEncounter = true;
}
}

View file

@ -1,64 +0,0 @@
namespace PKHeX.Core;
/// <summary>
/// Generation 5 Trade Encounter
/// </summary>
/// <inheritdoc cref="EncounterTrade"/>
public sealed record EncounterTrade5(GameVersion Version) : EncounterTrade(Version)
{
public override int Generation => 5;
public override EntityContext Context => EntityContext.Gen5;
public override int Location => Locations.LinkTrade5NPC;
}
/// <summary>Generation 5 Trade with Fixed PID</summary>
/// <param name="PID"> Fixed <see cref="PKM.PID"/> value the encounter must have.</param>
public sealed record EncounterTrade5PID(GameVersion Version, uint PID) : EncounterTrade(Version)
{
public override int Generation => 5;
public override EntityContext Context => EntityContext.Gen5;
public override int Location => Locations.LinkTrade5NPC;
public override Shiny Shiny => Shiny.FixedValue;
protected override void ApplyDetails(ITrainerInfo sav, EncounterCriteria criteria, PKM pk)
{
base.ApplyDetails(sav, criteria, pk);
// Trades for JPN games have language ID of 0, not 1.
if (pk.Language == (int) LanguageID.Japanese)
pk.Language = 0;
}
protected override void SetPINGA(PKM pk, EncounterCriteria criteria)
{
var pi = pk.PersonalInfo;
int gender = criteria.GetGender(EntityGender.GetFromPID(Species, PID), pi);
int nature = (int)criteria.GetNature(Nature);
int ability = criteria.GetAbilityFromNumber(Ability);
pk.PID = PID;
pk.Nature = nature;
pk.Gender = gender;
pk.RefreshAbility(ability);
SetIVs(pk);
}
protected override bool IsMatchNatureGenderShiny(PKM pk)
{
if (PID != pk.EncryptionConstant)
return false;
if (Nature != Nature.Random && (int)Nature != pk.Nature) // gen5 BW only
return false;
return true;
}
public static bool IsValidMissingLanguage(PKM pk)
{
// Generation 5 trades from B/W forgot to set the Language ID, so it remains as 0.
// This value is fixed when it is transferred from PK5->PK6
// B2/W2 is unaffected by this game data bug.
return pk is { Context: EntityContext.Gen5, BW: true };
}
}

Some files were not shown because too many files have changed in this diff Show more