Refactoring: Move Source (Legality) (#3560)
Rewrites a good amount of legality APIs pertaining to:
* Legal moves that can be learned
* Evolution chains & cross-generation paths
* Memory validation with forgotten moves
In generation 8, there are 3 separate contexts an entity can exist in: SW/SH, BD/SP, and LA. Not every entity can cross between them, and not every entity from generation 7 can exist in generation 8 (Gogoat, etc). By creating class models representing the restrictions to cross each boundary, we are able to better track and validate data.
The old implementation of validating moves was greedy: it would iterate for all generations and evolutions, and build a full list of every move that can be learned, storing it on the heap. Now, we check one game group at a time to see if the entity can learn a move that hasn't yet been validated. End result is an algorithm that requires 0 allocation, and a smaller/quicker search space.
The old implementation of storing move parses was inefficient; for each move that was parsed, a new object is created and adjusted depending on the parse. Now, move parse results are `struct` and store the move parse contiguously in memory. End result is faster parsing and 0 memory allocation.
* `PersonalTable` objects have been improved with new API methods to check if a species+form can exist in the game.
* `IEncounterTemplate` objects have been improved to indicate the `EntityContext` they originate in (similar to `Generation`).
* Some APIs have been extended to accept `Span<T>` instead of Array/IEnumerable
2022-08-03 23:15:27 +00:00
using static PKHeX . Core . EncounterUtil ;
2020-08-30 17:23:22 +00:00
using static PKHeX . Core . GameVersion ;
2022-06-18 18:04:24 +00:00
using static PKHeX . Core . GroundTileAllowed ;
2022-01-09 06:34:04 +00:00
using static PKHeX . Core . AbilityPermission ;
2017-07-25 07:28:43 +00:00
2022-06-18 18:04:24 +00:00
namespace PKHeX.Core ;
/// <summary>
/// Generation 4 Encounters
/// </summary>
internal static class Encounters4
2017-07-25 07:28:43 +00:00
{
2022-06-18 18:04:24 +00:00
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 ) ;
internal static readonly EncounterArea4 [ ] SlotsHG = EncounterArea4 . GetAreas ( Get ( "hg" , "hg" ) , HG ) ;
internal static readonly EncounterArea4 [ ] SlotsSS = EncounterArea4 . GetAreas ( Get ( "ss" , "ss" ) , SS ) ;
2017-07-25 07:28:43 +00:00
2022-06-18 18:04:24 +00:00
static Encounters4 ( )
{
MarkEncounterTradeStrings ( TradeGift_DPPt , TradeDPPt ) ;
MarkEncounterTradeStrings ( TradeGift_HGSS , TradeHGSS ) ;
}
2017-07-25 07:28:43 +00:00
2022-06-18 18:04:24 +00:00
#region Pokéwalker Encounter
// all pk are in Poke Ball and have a met location of "PokeWalker"
private static readonly EncounterStatic4Pokewalker [ ] Encounter_PokeWalker =
{
// Some pk has a pre-level move, an egg move or even a special move, it might be also available via HM/TM/Tutor
// Johto/Kanto Courses
new ( 084 , 1 , 08 ) , // Doduo
new ( 115 , 1 , 08 ) , // Kangaskhan
new ( 029 , 1 , 05 ) , // Nidoran♀
new ( 032 , 0 , 05 ) , // Nidoran♂
new ( 016 , 0 , 05 ) , // Pidgey
new ( 161 , 1 , 05 ) , // Sentret
new ( 202 , 1 , 15 ) , // Wobbuffet
new ( 069 , 1 , 08 ) , // Bellsprout
new ( 046 , 1 , 06 ) , // Paras
new ( 048 , 0 , 06 ) , // Venonat
new ( 021 , 0 , 05 ) , // Spearow
new ( 043 , 1 , 05 ) , // Oddish
new ( 095 , 0 , 09 ) , // Onix
new ( 240 , 0 , 09 ) { Moves = new [ ] { 241 } } , // Magby: Sunny Day
new ( 066 , 1 , 07 ) , // Machop
new ( 077 , 1 , 07 ) , // Ponyta
new ( 074 , 1 , 08 ) { Moves = new [ ] { 189 } } , // Geodude: Mud-Slap
new ( 163 , 1 , 06 ) , // Hoothoot
new ( 054 , 1 , 10 ) , // Psyduck
new ( 120 , 2 , 10 ) , // Staryu
new ( 060 , 0 , 08 ) , // Poliwag
new ( 079 , 0 , 08 ) , // Slowpoke
new ( 191 , 1 , 06 ) , // Sunkern
new ( 194 , 0 , 06 ) , // Wooper
new ( 081 , 2 , 11 ) , // Magnemite
new ( 239 , 0 , 11 ) { Moves = new [ ] { 009 } } , // Elekid: Thunder Punch
new ( 081 , 2 , 08 ) , // Magnemite
new ( 198 , 1 , 11 ) , // Murkrow
new ( 019 , 1 , 07 ) , // Rattata
new ( 163 , 1 , 07 ) , // Hoothoot
new ( 092 , 1 , 15 ) { Moves = new [ ] { 194 } } , // Gastly: Destiny Bond
new ( 238 , 1 , 12 ) { Moves = new [ ] { 419 } } , // Smoochum: Avalanche
new ( 092 , 1 , 10 ) , // Gastly
new ( 095 , 0 , 10 ) , // Onix
new ( 041 , 0 , 08 ) , // Zubat
new ( 066 , 0 , 08 ) , // Machop
new ( 060 , 1 , 15 ) { Moves = new [ ] { 187 } } , // Poliwag: Belly Drum
new ( 147 , 1 , 10 ) , // Dratini
new ( 090 , 1 , 12 ) , // Shellder
new ( 098 , 0 , 12 ) { Moves = new [ ] { 152 } } , // Krabby: Crabhammer
new ( 072 , 1 , 09 ) , // Tentacool
new ( 118 , 1 , 09 ) , // Goldeen
new ( 063 , 1 , 15 ) , // Abra
new ( 100 , 2 , 15 ) , // Voltorb
new ( 088 , 0 , 13 ) , // Grimer
new ( 109 , 1 , 13 ) { Moves = new [ ] { 120 } } , // Koffing: Self-Destruct
new ( 019 , 1 , 16 ) , // Rattata
new ( 162 , 0 , 15 ) , // Furret
// Hoenn Courses
new ( 264 , 1 , 30 ) , // Linoone
new ( 300 , 1 , 30 ) , // Skitty
new ( 313 , 0 , 25 ) , // Volbeat
new ( 314 , 1 , 25 ) , // Illumise
new ( 263 , 1 , 17 ) , // Zigzagoon
new ( 265 , 1 , 15 ) , // Wurmple
new ( 298 , 1 , 20 ) , // Azurill
new ( 320 , 1 , 31 ) , // Wailmer
new ( 116 , 1 , 20 ) , // Horsea
new ( 318 , 1 , 26 ) , // Carvanha
new ( 118 , 1 , 22 ) { Moves = new [ ] { 401 } } , // Goldeen: Aqua Tail
new ( 129 , 1 , 15 ) , // Magikarp
new ( 218 , 1 , 31 ) , // Slugma
new ( 307 , 0 , 32 ) , // Meditite
new ( 111 , 0 , 25 ) , // Rhyhorn
new ( 228 , 0 , 27 ) , // Houndour
new ( 074 , 0 , 29 ) , // Geodude
new ( 077 , 1 , 19 ) , // Ponyta
new ( 351 , 1 , 30 ) , // Castform
new ( 352 , 0 , 30 ) , // Kecleon
new ( 203 , 1 , 28 ) , // Girafarig
new ( 234 , 1 , 28 ) , // Stantler
new ( 044 , 1 , 14 ) , // Gloom
new ( 070 , 0 , 13 ) , // Weepinbell
new ( 105 , 1 , 30 ) { Moves = new [ ] { 037 } } , // Marowak: Thrash
new ( 128 , 0 , 30 ) , // Tauros
new ( 042 , 0 , 33 ) , // Golbat
new ( 177 , 1 , 24 ) , // Natu
new ( 066 , 0 , 13 ) { Moves = new [ ] { 418 } } , // Machop: Bullet Punch
new ( 092 , 1 , 15 ) , // Gastly
// Sinnoh Courses
new ( 415 , 0 , 30 ) , // Combee
new ( 439 , 0 , 29 ) , // Mime Jr.
new ( 403 , 1 , 33 ) , // Shinx
new ( 406 , 0 , 30 ) , // Budew
new ( 399 , 1 , 13 ) , // Bidoof
new ( 401 , 0 , 15 ) , // Kricketot
new ( 361 , 1 , 28 ) , // Snorunt
new ( 459 , 0 , 31 ) { Moves = new [ ] { 452 } } , // Snover: Wood Hammer
new ( 215 , 0 , 28 ) { Moves = new [ ] { 306 } } , // Sneasel: Crash Claw
new ( 436 , 2 , 20 ) , // Bronzor
new ( 179 , 1 , 15 ) , // Mareep
new ( 220 , 1 , 16 ) , // Swinub
new ( 357 , 1 , 35 ) , // Tropius
new ( 438 , 0 , 30 ) , // Bonsly
new ( 114 , 1 , 30 ) , // Tangela
new ( 400 , 1 , 30 ) , // Bibarel
new ( 102 , 1 , 17 ) , // Exeggcute
new ( 179 , 0 , 19 ) , // Mareep
new ( 200 , 1 , 32 ) { Moves = new [ ] { 194 } } , // Misdreavus: Destiny Bond
new ( 433 , 0 , 22 ) { Moves = new [ ] { 105 } } , // Chingling: Recover
new ( 093 , 0 , 25 ) , // Haunter
new ( 418 , 0 , 28 ) { Moves = new [ ] { 226 } } , // Buizel: Baton Pass
new ( 170 , 1 , 17 ) , // Chinchou
new ( 223 , 1 , 19 ) , // Remoraid
new ( 422 , 1 , 30 ) { Moves = new [ ] { 243 } } , // Shellos: Mirror Coat
new ( 456 , 1 , 26 ) , // Finneon
new ( 086 , 1 , 27 ) , // Seel
new ( 129 , 1 , 30 ) , // Magikarp
new ( 054 , 1 , 22 ) { Moves = new [ ] { 281 } } , // Psyduck: Yawn
new ( 090 , 0 , 20 ) , // Shellder
new ( 025 , 1 , 30 ) , // Pikachu
new ( 417 , 1 , 33 ) { Moves = new [ ] { 175 } } , // Pachirisu: Flail
new ( 035 , 1 , 31 ) , // Clefairy
new ( 039 , 1 , 30 ) , // Jigglypuff
new ( 183 , 1 , 25 ) , // Marill
new ( 187 , 1 , 25 ) , // Hoppip
new ( 442 , 0 , 31 ) , // Spiritomb
new ( 446 , 0 , 33 ) , // Munchlax
new ( 349 , 0 , 30 ) , // Feebas
new ( 433 , 1 , 26 ) , // Chingling
new ( 042 , 0 , 33 ) , // Golbat
new ( 164 , 1 , 30 ) , // Noctowl
// Special Courses
new ( 120 , 2 , 18 ) { Moves = new [ ] { 113 } } , // Staryu: Light Screen
new ( 224 , 1 , 19 ) { Moves = new [ ] { 324 } } , // Octillery: Signal Beam
new ( 116 , 0 , 15 ) , // Horsea
new ( 222 , 1 , 16 ) , // Corsola
new ( 170 , 1 , 12 ) , // Chinchou
new ( 223 , 0 , 14 ) , // Remoraid
new ( 035 , 0 , 08 ) { Moves = new [ ] { 236 } } , // Clefairy: Moonlight
new ( 039 , 0 , 10 ) , // Jigglypuff
new ( 041 , 0 , 09 ) , // Zubat
new ( 163 , 1 , 06 ) , // Hoothoot
new ( 074 , 0 , 05 ) , // Geodude
new ( 095 , 1 , 05 ) { Moves = new [ ] { 088 } } , // Onix: Rock Throw
new ( 025 , 0 , 15 ) { Moves = new [ ] { 019 } } , // Pikachu: Fly
new ( 025 , 1 , 14 ) { Moves = new [ ] { 057 } } , // Pikachu: Surf
new ( 025 , 1 , 12 ) { Moves = new [ ] { 344 , 252 } } , // Pikachu: Volt Tackle, Fake Out
new ( 025 , 0 , 13 ) { Moves = new [ ] { 175 } } , // Pikachu: Flail
new ( 025 , 0 , 10 ) , // Pikachu
new ( 025 , 1 , 10 ) , // Pikachu
new ( 302 , 1 , 15 ) , // Sableye
new ( 441 , 0 , 15 ) , // Chatot
new ( 025 , 1 , 10 ) , // Pikachu
new ( 453 , 0 , 10 ) , // Croagunk
new ( 417 , 0 , 05 ) , // Pachirisu
new ( 427 , 1 , 05 ) , // Buneary
new ( 133 , 0 , 10 ) , // Eevee
new ( 255 , 0 , 10 ) , // Torchic
new ( 061 , 1 , 15 ) { Moves = new [ ] { 003 } } , // Poliwhirl: Double Slap
new ( 279 , 0 , 15 ) , // Pelipper
new ( 025 , 1 , 08 ) , // Pikachu
new ( 052 , 0 , 10 ) , // Meowth
new ( 374 , 2 , 05 ) { Moves = new [ ] { 428 , 334 , 442 } } , // Beldum: Zen Headbutt, Iron Defense & Iron Head.
new ( 446 , 0 , 05 ) { Moves = new [ ] { 120 } } , // Munchlax: Self-Destruct
new ( 116 , 0 , 05 ) { Moves = new [ ] { 330 } } , // Horsea: Muddy Water
new ( 355 , 0 , 05 ) { Moves = new [ ] { 286 } } , // Duskull: Imprison
new ( 129 , 0 , 05 ) { Moves = new [ ] { 340 } } , // Magikarp: Bounce
new ( 436 , 2 , 05 ) { Moves = new [ ] { 433 } } , // Bronzor: Trick Room
new ( 239 , 0 , 05 ) { Moves = new [ ] { 9 } } , // Elekid: Thunder Punch (can be tutored)
new ( 240 , 0 , 05 ) { Moves = new [ ] { 7 } } , // Magby: Fire Punch (can be tutored)
new ( 238 , 1 , 05 ) { Moves = new [ ] { 8 } } , // Smoochum: Ice Punch (can be tutored)
new ( 440 , 1 , 05 ) { Moves = new [ ] { 215 } } , // Happiny: Heal Bell
new ( 173 , 1 , 05 ) { Moves = new [ ] { 118 } } , // Cleffa: Metronome
new ( 174 , 0 , 05 ) { Moves = new [ ] { 273 } } , // Igglybuff: Wish
} ;
#endregion
#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
2019-06-25 17:55:35 +00:00
2022-06-18 18:04:24 +00:00
// 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
2019-06-25 17:55:35 +00:00
2022-06-18 18:04:24 +00:00
// 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
2019-09-12 05:06:24 +00:00
2022-06-18 18:04:24 +00:00
// 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
2019-09-12 05:06:24 +00:00
2022-06-18 18:04:24 +00:00
// 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
2019-09-12 05:06:24 +00:00
2022-06-18 18:04:24 +00:00
// 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 , Fateful = 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)
2018-08-03 03:11:42 +00:00
2022-06-18 18:04:24 +00:00
// Roamers
new ( DPPt ) { Roaming = true , Species = 481 , Level = 50 , GroundTile = Grass | Water } , // Mesprit
new ( DPPt ) { Roaming = true , Species = 488 , Level = 50 , GroundTile = Grass | Water } , // Cresselia
new ( Pt ) { Roaming = true , Species = 144 , Level = 60 , GroundTile = Grass | Water } , // Articuno
new ( Pt ) { Roaming = true , Species = 145 , Level = 60 , GroundTile = Grass | Water } , // Zapdos
new ( Pt ) { Roaming = true , Species = 146 , Level = 60 , GroundTile = Grass | Water } , // Moltres
} ;
2018-08-03 03:11:42 +00:00
2022-06-18 18:04:24 +00:00
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
2019-09-12 05:06:24 +00:00
2022-06-18 18:04:24 +00:00
// 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
2019-09-12 05:06:24 +00:00
2022-06-18 18:04:24 +00:00
// 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
Refactoring: Move Source (Legality) (#3560)
Rewrites a good amount of legality APIs pertaining to:
* Legal moves that can be learned
* Evolution chains & cross-generation paths
* Memory validation with forgotten moves
In generation 8, there are 3 separate contexts an entity can exist in: SW/SH, BD/SP, and LA. Not every entity can cross between them, and not every entity from generation 7 can exist in generation 8 (Gogoat, etc). By creating class models representing the restrictions to cross each boundary, we are able to better track and validate data.
The old implementation of validating moves was greedy: it would iterate for all generations and evolutions, and build a full list of every move that can be learned, storing it on the heap. Now, we check one game group at a time to see if the entity can learn a move that hasn't yet been validated. End result is an algorithm that requires 0 allocation, and a smaller/quicker search space.
The old implementation of storing move parses was inefficient; for each move that was parsed, a new object is created and adjusted depending on the parse. Now, move parse results are `struct` and store the move parse contiguously in memory. End result is faster parsing and 0 memory allocation.
* `PersonalTable` objects have been improved with new API methods to check if a species+form can exist in the game.
* `IEncounterTemplate` objects have been improved to indicate the `EntityContext` they originate in (similar to `Generation`).
* Some APIs have been extended to accept `Span<T>` instead of Array/IEnumerable
2022-08-03 23:15:27 +00:00
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)
2022-06-18 18:04:24 +00:00
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
2019-09-12 05:06:24 +00:00
2022-06-18 18:04:24 +00:00
// 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
2019-09-12 05:06:24 +00:00
2022-06-18 18:04:24 +00:00
// 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
2019-09-12 05:06:24 +00:00
2022-06-18 18:04:24 +00:00
// 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
2017-07-25 07:28:43 +00:00
2022-06-18 18:04:24 +00:00
// 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
2020-12-29 08:37:59 +00:00
2022-06-18 18:04:24 +00:00
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 ,
} ,
2019-09-12 05:06:24 +00:00
2022-06-18 18:04:24 +00:00
// 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
2018-08-03 03:11:42 +00:00
2022-06-18 18:04:24 +00:00
// Johto Roamers
new ( HGSS ) { Roaming = true , Species = 243 , Level = 40 , GroundTile = Grass | Water } , // Raikou
new ( HGSS ) { Roaming = true , Species = 244 , Level = 40 , GroundTile = Grass | Water } , // Entei
2020-08-31 02:24:24 +00:00
2022-06-18 18:04:24 +00:00
// Kanto Roamers
new ( HG ) { Roaming = true , Species = 380 , Level = 35 , GroundTile = Grass | Water } , // Latias
new ( SS ) { Roaming = true , Species = 381 , Level = 35 , GroundTile = Grass | Water } , // Latios
} ;
#endregion
#region Trade Tables
2018-08-03 03:11:42 +00:00
2022-06-18 18:04:24 +00:00
private static readonly EncounterTrade4 [ ] RanchGifts =
{
new EncounterTrade4RanchGift ( 323975838 , 025 , 18 ) { Moves = new [ ] { 447 , 085 , 148 , 104 } , TID = 1000 , SID = 19840 , OTGender = 1 , MetLocation = 0068 , Gender = 0 , Ability = OnlyFirst , CurrentLevel = 20 } , // Pikachu
new EncounterTrade4RanchGift ( 323977664 , 037 , 16 ) { Moves = new [ ] { 412 , 109 , 053 , 219 } , TID = 1000 , SID = 21150 , OTGender = 1 , MetLocation = 3000 , Gender = 0 , Ability = OnlyFirst , CurrentLevel = 30 } , // Vulpix
new EncounterTrade4RanchGift ( 323975579 , 077 , 13 ) { Moves = new [ ] { 036 , 033 , 039 , 052 } , TID = 1000 , SID = 01123 , OTGender = 1 , MetLocation = 3000 , Gender = 0 , Ability = OnlySecond , CurrentLevel = 16 } , // Ponyta
new EncounterTrade4RanchGift ( 323975564 , 108 , 34 ) { Moves = new [ ] { 076 , 111 , 014 , 205 } , TID = 1000 , SID = 03050 , OTGender = 1 , MetLocation = 0077 , Gender = 0 , Ability = OnlyFirst , CurrentLevel = 40 } , // Lickitung
new EncounterTrade4RanchGift ( 323977579 , 114 , 01 ) { Moves = new [ ] { 437 , 438 , 079 , 246 } , TID = 1000 , SID = 49497 , OTGender = 1 , MetLocation = 3000 , Gender = 1 , Ability = OnlySecond } , // Tangela
new EncounterTrade4RanchGift ( 323977675 , 133 , 16 ) { Moves = new [ ] { 363 , 270 , 098 , 247 } , TID = 1000 , SID = 47710 , OTGender = 1 , MetLocation = 0068 , Gender = 0 , Ability = OnlySecond , CurrentLevel = 30 } , // Eevee
new EncounterTrade4RanchGift ( 323977588 , 142 , 20 ) { Moves = new [ ] { 363 , 089 , 444 , 332 } , TID = 1000 , SID = 43066 , OTGender = 1 , MetLocation = 0094 , Gender = 0 , Ability = OnlyFirst , CurrentLevel = 50 } , // Aerodactyl
new EncounterTrade4RanchGift ( 232975554 , 193 , 22 ) { Moves = new [ ] { 318 , 095 , 246 , 138 } , TID = 1000 , SID = 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 } , TID = 1000 , SID = 02707 , OTGender = 1 , MetLocation = 3000 , Gender = 1 , Ability = OnlyFirst , CurrentLevel = 48 } , // Miltank
new EncounterTrade4RanchGift ( 323975563 , 285 , 22 ) { Moves = new [ ] { 402 , 147 , 206 , 078 } , TID = 1000 , SID = 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 } , TID = 1000 , SID = 27046 , OTGender = 1 , MetLocation = 0038 , Gender = 0 , Ability = OnlySecond , CurrentLevel = 45 } , // Wailmer
new EncounterTrade4RanchGift ( 323977657 , 360 , 01 ) { Moves = new [ ] { 204 , 150 , 227 , 000 } , TID = 1000 , SID = 01788 , OTGender = 1 , MetLocation = 0004 , Gender = 0 , Ability = OnlySecond , EggLocation = 2000 } , // Wynaut
new EncounterTrade4RanchGift ( 323975563 , 397 , 02 ) { Moves = new [ ] { 355 , 017 , 283 , 018 } , TID = 1000 , SID = 59298 , OTGender = 1 , MetLocation = 0016 , Gender = 0 , Ability = OnlySecond , CurrentLevel = 23 } , // Staravia
new EncounterTrade4RanchGift ( 323970584 , 415 , 05 ) { Moves = new [ ] { 230 , 016 , 000 , 000 } , TID = 1000 , SID = 54140 , OTGender = 1 , MetLocation = 0020 , Gender = 1 , Ability = OnlyFirst , CurrentLevel = 20 } , // Combee
new EncounterTrade4RanchGift ( 323977539 , 417 , 09 ) { Moves = new [ ] { 447 , 045 , 351 , 098 } , TID = 1000 , SID = 18830 , OTGender = 1 , MetLocation = 0020 , Gender = 1 , Ability = OnlySecond , CurrentLevel = 10 } , // Pachirisu
new EncounterTrade4RanchGift ( 323974107 , 422 , 20 ) { Moves = new [ ] { 363 , 352 , 426 , 104 } , TID = 1000 , SID = 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 } , TID = 1000 , SID = 31045 , OTGender = 1 , MetLocation = 3000 , Gender = 1 , Ability = OnlyFirst , CurrentLevel = 16 } , // Buneary
new EncounterTrade4RanchGift ( 323975579 , 453 , 22 ) { Moves = new [ ] { 310 , 207 , 426 , 389 } , TID = 1000 , SID = 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 } , TID = 1000 , SID = 48348 , OTGender = 1 , MetLocation = 0020 , Gender = 1 , Ability = OnlyFirst , CurrentLevel = 35 } , // Finneon
new EncounterTrade4RanchGift ( 323975582 , 459 , 32 ) { Moves = new [ ] { 452 , 420 , 275 , 059 } , TID = 1000 , SID = 23360 , OTGender = 1 , MetLocation = 0031 , Gender = 0 , Ability = OnlyFirst , CurrentLevel = 41 } , // Snover
new EncounterTrade4RanchSpecial ( 151 , 50 ) { Moves = new [ ] { 235 , 216 , 095 , 100 } , TID = 1000 , SID = 59228 , OTGender = 1 , Ball = 0x10 , Gender = 2 } , // Mew
new EncounterTrade4RanchSpecial ( 489 , 01 ) { Moves = new [ ] { 447 , 240 , 156 , 057 } , TID = 1000 , SID = 09248 , OTGender = 1 , Ball = 0x10 , Gender = 2 , CurrentLevel = 50 , EggLocation = 3000 } , // Phione
} ;
2018-08-03 03:11:42 +00:00
2022-06-18 18:04:24 +00:00
private static readonly EncounterTrade4PID [ ] TradeGift_DPPtIngame =
{
new ( DPPt , 0x0000008E , 063 , 01 ) { Ability = OnlyFirst , TID = 25643 , SID = 00000 , OTGender = 1 , Gender = 0 , IVs = new [ ] { 15 , 15 , 15 , 20 , 25 , 25 } } , // Machop -> Abra
new ( DPPt , 0x00000867 , 441 , 01 ) { Ability = OnlySecond , TID = 44142 , SID = 00000 , OTGender = 0 , Gender = 1 , IVs = new [ ] { 15 , 20 , 15 , 25 , 25 , 15 } , Contest = 20 } , // Buizel -> Chatot
new ( DPPt , 0x00000088 , 093 , 35 ) { Ability = OnlyFirst , TID = 19248 , SID = 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 , TID = 53277 , SID = 00000 , OTGender = 0 , Gender = 1 , IVs = new [ ] { 15 , 25 , 15 , 20 , 25 , 15 } } , // Finneon -> Magikarp
} ;
2021-05-07 06:26:38 +00:00
2022-06-18 18:04:24 +00:00
internal static readonly EncounterTrade4 [ ] TradeGift_DPPt = ArrayUtil . ConcatAll ( TradeGift_DPPtIngame , RanchGifts ) ;
2018-08-03 03:11:42 +00:00
2022-06-18 18:04:24 +00:00
internal static readonly EncounterTrade4PID [ ] TradeGift_HGSS =
{
new ( HGSS , 0x000025EF , 095 , 01 ) { Ability = OnlySecond , TID = 48926 , SID = 00000 , OTGender = 0 , Gender = 0 , IVs = new [ ] { 25 , 20 , 25 , 15 , 15 , 15 } } , // Bellsprout -> Onix
new ( HGSS , 0x00002310 , 066 , 01 ) { Ability = OnlyFirst , TID = 37460 , SID = 00000 , OTGender = 0 , Gender = 1 , IVs = new [ ] { 15 , 25 , 20 , 20 , 15 , 15 } } , // Drowzee -> Machop
new ( HGSS , 0x000001DB , 100 , 01 ) { Ability = OnlySecond , TID = 29189 , SID = 00000 , OTGender = 0 , Gender = 2 , IVs = new [ ] { 15 , 20 , 15 , 25 , 25 , 15 } } , // Krabby -> Voltorb
new ( HGSS , 0x0001FC0A , 085 , 15 ) { Ability = OnlyFirst , TID = 00283 , SID = 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 , TID = 50082 , SID = 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 , TID = 15616 , SID = 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 , TID = 33038 , SID = 00000 , OTGender = 0 , Gender = 1 , IVs = new [ ] { 20 , 25 , 18 , 31 , 25 , 13 } } , // Pikachu
new ( HGSS , 0x0012B6D4 , 374 , 31 ) { Ability = OnlyFirst , TID = 23478 , SID = 00000 , OTGender = 0 , Gender = 2 , IVs = new [ ] { 28 , 29 , 24 , 23 , 24 , 25 } } , // Forretress -> Beldum
new ( HGSS , 0x0012971C , 111 , 01 ) { Ability = OnlyFirst , TID = 06845 , SID = 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 , TID = 26491 , SID = 00000 , OTGender = 1 , Gender = 0 , IVs = new [ ] { 08 , 30 , 28 , 06 , 18 , 20 } } , // Any -> Steelix
2019-09-12 05:06:24 +00:00
2022-06-18 18:04:24 +00:00
//Gift
new ( HGSS , 0x00006B5E , 021 , 20 ) { Ability = OnlyFirst , TID = 01001 , SID = 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 , TID = 04336 , SID = 00001 , OTGender = 0 , Gender = 0 , IVs = new [ ] { 15 , 20 , 15 , 20 , 20 , 20 } , MetLocation = 130 , Moves = new [ ] { 132 , 117 , 227 , 219 } } , // Kirk's Shuckle
} ;
2018-08-03 03:11:42 +00:00
2022-06-18 18:04:24 +00:00
private const string tradeDPPt = "tradedppt" ;
private const string tradeHGSS = "tradehgss" ;
private static readonly string [ ] [ ] TradeDPPt = Util . GetLanguageStrings8 ( tradeDPPt ) ;
private static readonly string [ ] [ ] TradeHGSS = Util . GetLanguageStrings8 ( tradeHGSS ) ;
#endregion
2017-07-25 07:28:43 +00:00
2022-06-18 18:04:24 +00:00
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 ) ;
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 ) ;
2017-07-25 07:28:43 +00:00
}