2018-11-17 23:12:32 +00:00
using System ;
using System.Collections.Generic ;
2018-11-15 01:40:41 +00:00
using System.Linq ;
using static PKHeX . Core . EncounterUtil ;
2018-11-11 21:12:24 +00:00
namespace PKHeX.Core
{
internal static class Encounters7b
{
2020-08-30 17:23:22 +00:00
internal static readonly EncounterArea7b [ ] SlotsGP = EncounterArea7b . GetAreas ( Get ( "gp" , "gg" ) , GameVersion . GP ) ;
internal static readonly EncounterArea7b [ ] SlotsGE = EncounterArea7b . GetAreas ( Get ( "ge" , "gg" ) , GameVersion . GE ) ;
private static byte [ ] [ ] Get ( string resource , string ident ) = > BinLinker . Unpack ( Util . GetBinaryResource ( $"encounter_{resource}.pkl" ) , ident ) ;
2018-11-11 21:12:24 +00:00
static Encounters7b ( )
{
2018-11-17 23:12:32 +00:00
ManuallyAddRareSpawns ( SlotsGP ) ;
ManuallyAddRareSpawns ( SlotsGE ) ;
2018-11-11 21:12:24 +00:00
Encounter_GG . SetVersion ( GameVersion . GG ) ;
}
2020-08-30 23:10:24 +00:00
private static readonly EncounterStatic7b [ ] Encounter_GG =
2018-11-11 21:12:24 +00:00
{
// encounters
2020-12-22 01:17:56 +00:00
new ( ) { Species = 144 , Level = 50 , Location = 44 , FlawlessIVCount = 3 , } , // Articuno @ Seafoam Islands
new ( ) { Species = 145 , Level = 50 , Location = 42 , FlawlessIVCount = 3 , } , // Zapdos @ Power Plant
new ( ) { Species = 146 , Level = 50 , Location = 45 , FlawlessIVCount = 3 , } , // Moltres @ Victory Road
new ( ) { Species = 150 , Level = 70 , Location = 46 , FlawlessIVCount = 3 , } , // Mewtwo @ Cerulean Cave
new ( ) { Species = 143 , Level = 34 , Location = 14 , FlawlessIVCount = 3 , } , // Snorlax @ Route 12
new ( ) { Species = 143 , Level = 34 , Location = 18 , FlawlessIVCount = 3 , } , // Snorlax @ Route 16
2020-08-30 23:10:24 +00:00
// unused new EncounterStatic7b { Species = 100, Level = 42, Location = 42, FlawlessIVCount = 3, }, // Voltorb @ Power Plant
// collision new EncounterStatic7b { Species = 101, Level = 42, Location = 42, FlawlessIVCount = 3, }, // Electrode @ Power Plant
2018-11-11 21:12:24 +00:00
// gifts
2020-12-22 01:17:56 +00:00
new ( ) { Species = 025 , Level = 05 , Location = 28 , Gift = true , IVs = new [ ] { 31 , 31 , 31 , 31 , 31 , 31 } , Shiny = Shiny . Never , Form = 8 , Version = GameVersion . GP } , // Pikachu @ Pallet Town
new ( ) { Species = 133 , Level = 05 , Location = 28 , Gift = true , IVs = new [ ] { 31 , 31 , 31 , 31 , 31 , 31 } , Shiny = Shiny . Never , Form = 1 , Version = GameVersion . GE } , // Eevee @ Pallet Town
2018-11-11 21:12:24 +00:00
2020-12-22 01:17:56 +00:00
new ( ) { Species = 129 , Level = 05 , Location = 06 , Gift = true , IVs = new [ ] { 30 , 31 , 25 , 30 , 25 , 25 } } , // Magikarp @ Route 4
2018-11-11 21:12:24 +00:00
2020-08-30 23:10:24 +00:00
// unused new EncounterStatic7b { Species = 133, Level = 30, Location = 34, Gift = true }, // Eevee @ Celadon City
2020-12-22 01:17:56 +00:00
new ( ) { Species = 131 , Level = 34 , Location = 52 , Gift = true , IVs = new [ ] { 31 , 25 , 25 , 25 , 30 , 30 } } , // Lapras @ Saffron City (Silph Co. Employee, inside)
new ( ) { Species = 106 , Level = 30 , Location = 38 , Gift = true , IVs = new [ ] { 25 , 30 , 25 , 31 , 25 , 30 } } , // Hitmonlee @ Saffron City (Karate Master)
new ( ) { Species = 107 , Level = 30 , Location = 38 , Gift = true , IVs = new [ ] { 25 , 31 , 30 , 25 , 25 , 30 } } , // Hitmonchan @ Saffron City (Karate Master)
new ( ) { Species = 140 , Level = 44 , Location = 36 , Gift = true , FlawlessIVCount = 3 } , // Kabuto @ Cinnabar Island (Cinnabar Pokémon Lab)
new ( ) { Species = 138 , Level = 44 , Location = 36 , Gift = true , FlawlessIVCount = 3 } , // Omanyte @ Cinnabar Island (Cinnabar Pokémon Lab)
new ( ) { Species = 142 , Level = 44 , Location = 36 , Gift = true , FlawlessIVCount = 3 } , // Aerodactyl @ Cinnabar Island (Cinnabar Pokémon Lab)
new ( ) { Species = 001 , Level = 12 , Location = 31 , Gift = true , IVs = new [ ] { 31 , 25 , 30 , 25 , 25 , 30 } } , // Bulbasaur @ Cerulean City
new ( ) { Species = 004 , Level = 14 , Location = 26 , Gift = true , IVs = new [ ] { 25 , 30 , 25 , 31 , 30 , 25 } } , // Charmander @ Route 24
new ( ) { Species = 007 , Level = 16 , Location = 33 , Gift = true , IVs = new [ ] { 25 , 25 , 30 , 25 , 31 , 30 } } , // Squirtle @ Vermillion City
new ( ) { Species = 137 , Level = 34 , Location = 38 , Gift = true , IVs = new [ ] { 25 , 25 , 30 , 25 , 31 , 30 } } , // Porygon @ Saffron City (Silph Co. Employee, outside)
new ( ) { Species = 053 , Level = 16 , Location = 33 , Gift = true , IVs = new [ ] { 30 , 30 , 25 , 31 , 25 , 25 } , Version = GameVersion . GP } , // Persian @ Vermillion City (Outside Fan Club)
new ( ) { Species = 059 , Level = 16 , Location = 33 , Gift = true , IVs = new [ ] { 25 , 30 , 25 , 31 , 30 , 25 } , Version = GameVersion . GE } , // Arcanine @ Vermillion City (Outside Fan Club)
2018-11-11 21:12:24 +00:00
} ;
PKHeX.Core Nullable cleanup (#2401)
* Handle some nullable cases
Refactor MysteryGift into a second abstract class (backed by a byte array, or fake data)
Make some classes have explicit constructors instead of { } initialization
* Handle bits more obviously without null
* Make SaveFile.BAK explicitly readonly again
* merge constructor methods to have readonly fields
* Inline some properties
* More nullable handling
* Rearrange box actions
define straightforward classes to not have any null properties
* Make extrabyte reference array immutable
* Move tooltip creation to designer
* Rearrange some logic to reduce nesting
* Cache generated fonts
* Split mystery gift album purpose
* Handle more tooltips
* Disallow null setters
* Don't capture RNG object, only type enum
* Unify learnset objects
Now have readonly properties which are never null
don't new() empty learnsets (>800 Learnset objects no longer created,
total of 2400 objects since we also new() a move & level array)
optimize g1/2 reader for early abort case
* Access rewrite
Initialize blocks in a separate object, and get via that object
removes a couple hundred "might be null" warnings since blocks are now readonly getters
some block references have been relocated, but interfaces should expose all that's needed
put HoF6 controls in a groupbox, and disable
* Readonly personal data
* IVs non nullable for mystery gift
* Explicitly initialize forced encounter moves
* Make shadow objects readonly & non-null
Put murkrow fix in binary data resource, instead of on startup
* Assign dex form fetch on constructor
Fixes legality parsing edge cases
also handle cxd parse for valid; exit before exception is thrown in FrameGenerator
* Remove unnecessary null checks
* Keep empty value until init
SetPouch sets the value to an actual one during load, but whatever
* Readonly team lock data
* Readonly locks
Put locked encounters at bottom (favor unlocked)
* Mail readonly data / offset
Rearrange some call flow and pass defaults
Add fake classes for SaveDataEditor mocking
Always party size, no need to check twice in stat editor
use a fake save file as initial data for savedata editor, and for
gamedata (wow i found a usage)
constrain eventwork editor to struct variable types (uint, int, etc),
thus preventing null assignment errors
2019-10-17 01:47:31 +00:00
private static readonly string [ ] T1 = { string . Empty , "ミニコ" , "Tatianna" , "BarbaRatatta" , "Addoloratta" , "Barbaratt" , string . Empty , "Tatiana" , "미니꼬" , "小幂妮" , "小幂妮" , } ;
private static readonly string [ ] T2 = { string . Empty , "ボーアイス" , "Nicholice" , "Iceman-4L0L4" , "Goffreddo" , "Eisper" , string . Empty , "Gelasio" , "보아이스" , "露冰冰" , "露冰冰" , } ;
private static readonly string [ ] T3 = { string . Empty , "レディダグ" , "Diggette" , "Taupilady" , "Lady Glett" , "Digga" , string . Empty , "Glenda" , "레이디그다" , "蒂淑" , "蒂淑" , } ;
private static readonly string [ ] T4 = { string . Empty , "ワルモン" , "Darko" , "AlolaZeDark" , "Mattetro" , "Bösbert" , string . Empty , "Sinesio" , "나뻐기" , "达怀丹" , "达怀丹" , } ;
private static readonly string [ ] T5 = { string . Empty , "エリッチ" , "Psytrice" , "TopDeTonCœur" , "Chulia" , "Assana" , string . Empty , "Menchu" , "엘리츄" , "晶莹丘" , "晶莹丘" , } ;
private static readonly string [ ] T6 = { string . Empty , "ジェンガラ" , "Genmar" , "OSS-Dandy7" , "Mr. Owak" , "Knoggelius" , string . Empty , "Mario" , "젠구리" , "申史加拉" , "申史加拉" , } ;
private static readonly string [ ] T7 = { string . Empty , "マニシ" , "Exemann" , "Koko-fan" , "Exechiele" , "Einrich" , string . Empty , "Gunter" , "마니시" , "艾浩舒" , "艾浩舒" , } ;
private static readonly string [ ] T8 = { string . Empty , "コツブ" , "Higeo" , "Montagnou" , "George" , "Karstein" , string . Empty , "Georgie" , "산돌" , "科布" , "科布" , } ;
2018-11-11 21:12:24 +00:00
internal static readonly EncounterTrade [ ] TradeGift_GG =
{
2018-11-16 01:35:34 +00:00
// Random candy values! They can be zero so no impact on legality even though statistically rare.
2020-12-24 23:23:26 +00:00
new EncounterTrade7b { Species = 019 , Level = 12 , Form = 1 , TrainerNames = T1 , TID7 = 121106 , OTGender = 1 , Shiny = Shiny . Random , Version = GameVersion . GG , IVs = new [ ] { 31 , 31 , - 1 , - 1 , - 1 , - 1 } , IsNicknamed = false } , // Rattata @ Cerulean City, AV rand [0-5)
new EncounterTrade7b { Species = 027 , Level = 27 , Form = 1 , TrainerNames = T2 , TID7 = 703019 , OTGender = 0 , Shiny = Shiny . Random , Version = GameVersion . GE , IVs = new [ ] { - 1 , 31 , 31 , - 1 , - 1 , - 1 } , IsNicknamed = false } , // Sandshrew @ Celadon City, AV rand [0-5)
new EncounterTrade7b { Species = 037 , Level = 27 , Form = 1 , TrainerNames = T2 , TID7 = 703019 , OTGender = 0 , Shiny = Shiny . Random , Version = GameVersion . GP , IVs = new [ ] { - 1 , - 1 , - 1 , 31 , 31 , - 1 } , IsNicknamed = false } , // Vulpix @ Celadon City, AV rand [0-5)
new EncounterTrade7b { Species = 050 , Level = 25 , Form = 1 , TrainerNames = T3 , TID7 = 520159 , OTGender = 1 , Shiny = Shiny . Random , Version = GameVersion . GG , IVs = new [ ] { - 1 , 31 , - 1 , 31 , - 1 , - 1 } , IsNicknamed = false } , // Diglett @ Lavender Town, AV rand [0-5)
new EncounterTrade7b { Species = 052 , Level = 44 , Form = 1 , TrainerNames = T4 , TID7 = 000219 , OTGender = 0 , Shiny = Shiny . Random , Version = GameVersion . GE , IVs = new [ ] { 31 , - 1 , - 1 , 31 , - 1 , - 1 } , IsNicknamed = false } , // Meowth @ Cinnabar Island, AV rand [0-10)
new EncounterTrade7b { Species = 088 , Level = 44 , Form = 1 , TrainerNames = T4 , TID7 = 000219 , OTGender = 0 , Shiny = Shiny . Random , Version = GameVersion . GP , IVs = new [ ] { 31 , 31 , - 1 , - 1 , - 1 , - 1 } , IsNicknamed = false } , // Grimer @ Cinnabar Island, AV rand [0-10)
new EncounterTrade7b { Species = 026 , Level = 30 , Form = 1 , TrainerNames = T5 , TID7 = 940711 , OTGender = 1 , Shiny = Shiny . Random , Version = GameVersion . GG , IVs = new [ ] { - 1 , - 1 , - 1 , 31 , 31 , - 1 } , IsNicknamed = false } , // Raichu @ Saffron City, AV rand [0-10)
new EncounterTrade7b { Species = 105 , Level = 38 , Form = 1 , TrainerNames = T6 , TID7 = 102595 , OTGender = 0 , Shiny = Shiny . Random , Version = GameVersion . GG , IVs = new [ ] { - 1 , 31 , 31 , - 1 , - 1 , - 1 } , IsNicknamed = false } , // Marowak @ Fuchsia City, AV rand [0-10)
new EncounterTrade7b { Species = 103 , Level = 46 , Form = 1 , TrainerNames = T7 , TID7 = 060310 , OTGender = 0 , Shiny = Shiny . Random , Version = GameVersion . GG , IVs = new [ ] { - 1 , 31 , - 1 , - 1 , 31 , - 1 } , IsNicknamed = false } , // Exeggutor @ Indigo Plateau, AV rand [0-15)
new EncounterTrade7b { Species = 074 , Level = 16 , Form = 1 , TrainerNames = T8 , TID7 = 551873 , OTGender = 0 , Shiny = Shiny . Random , Version = GameVersion . GG , IVs = new [ ] { 31 , 31 , - 1 , - 1 , - 1 , - 1 } , IsNicknamed = false } , // Geodude @ Vermilion City, AV rand [0-5)
2018-11-11 21:12:24 +00:00
} ;
2018-11-15 01:40:41 +00:00
2018-11-17 23:12:32 +00:00
private class RareSpawn
{
PKHeX.Core Nullable cleanup (#2401)
* Handle some nullable cases
Refactor MysteryGift into a second abstract class (backed by a byte array, or fake data)
Make some classes have explicit constructors instead of { } initialization
* Handle bits more obviously without null
* Make SaveFile.BAK explicitly readonly again
* merge constructor methods to have readonly fields
* Inline some properties
* More nullable handling
* Rearrange box actions
define straightforward classes to not have any null properties
* Make extrabyte reference array immutable
* Move tooltip creation to designer
* Rearrange some logic to reduce nesting
* Cache generated fonts
* Split mystery gift album purpose
* Handle more tooltips
* Disallow null setters
* Don't capture RNG object, only type enum
* Unify learnset objects
Now have readonly properties which are never null
don't new() empty learnsets (>800 Learnset objects no longer created,
total of 2400 objects since we also new() a move & level array)
optimize g1/2 reader for early abort case
* Access rewrite
Initialize blocks in a separate object, and get via that object
removes a couple hundred "might be null" warnings since blocks are now readonly getters
some block references have been relocated, but interfaces should expose all that's needed
put HoF6 controls in a groupbox, and disable
* Readonly personal data
* IVs non nullable for mystery gift
* Explicitly initialize forced encounter moves
* Make shadow objects readonly & non-null
Put murkrow fix in binary data resource, instead of on startup
* Assign dex form fetch on constructor
Fixes legality parsing edge cases
also handle cxd parse for valid; exit before exception is thrown in FrameGenerator
* Remove unnecessary null checks
* Keep empty value until init
SetPouch sets the value to an actual one during load, but whatever
* Readonly team lock data
* Readonly locks
Put locked encounters at bottom (favor unlocked)
* Mail readonly data / offset
Rearrange some call flow and pass defaults
Add fake classes for SaveDataEditor mocking
Always party size, no need to check twice in stat editor
use a fake save file as initial data for savedata editor, and for
gamedata (wow i found a usage)
constrain eventwork editor to struct variable types (uint, int, etc),
thus preventing null assignment errors
2019-10-17 01:47:31 +00:00
public readonly int Species ;
public readonly byte [ ] Locations ;
protected internal RareSpawn ( int species , params byte [ ] locations )
{
Species = species ;
Locations = locations ;
}
2018-11-17 23:12:32 +00:00
}
PKHeX.Core Nullable cleanup (#2401)
* Handle some nullable cases
Refactor MysteryGift into a second abstract class (backed by a byte array, or fake data)
Make some classes have explicit constructors instead of { } initialization
* Handle bits more obviously without null
* Make SaveFile.BAK explicitly readonly again
* merge constructor methods to have readonly fields
* Inline some properties
* More nullable handling
* Rearrange box actions
define straightforward classes to not have any null properties
* Make extrabyte reference array immutable
* Move tooltip creation to designer
* Rearrange some logic to reduce nesting
* Cache generated fonts
* Split mystery gift album purpose
* Handle more tooltips
* Disallow null setters
* Don't capture RNG object, only type enum
* Unify learnset objects
Now have readonly properties which are never null
don't new() empty learnsets (>800 Learnset objects no longer created,
total of 2400 objects since we also new() a move & level array)
optimize g1/2 reader for early abort case
* Access rewrite
Initialize blocks in a separate object, and get via that object
removes a couple hundred "might be null" warnings since blocks are now readonly getters
some block references have been relocated, but interfaces should expose all that's needed
put HoF6 controls in a groupbox, and disable
* Readonly personal data
* IVs non nullable for mystery gift
* Explicitly initialize forced encounter moves
* Make shadow objects readonly & non-null
Put murkrow fix in binary data resource, instead of on startup
* Assign dex form fetch on constructor
Fixes legality parsing edge cases
also handle cxd parse for valid; exit before exception is thrown in FrameGenerator
* Remove unnecessary null checks
* Keep empty value until init
SetPouch sets the value to an actual one during load, but whatever
* Readonly team lock data
* Readonly locks
Put locked encounters at bottom (favor unlocked)
* Mail readonly data / offset
Rearrange some call flow and pass defaults
Add fake classes for SaveDataEditor mocking
Always party size, no need to check twice in stat editor
use a fake save file as initial data for savedata editor, and for
gamedata (wow i found a usage)
constrain eventwork editor to struct variable types (uint, int, etc),
thus preventing null assignment errors
2019-10-17 01:47:31 +00:00
private static readonly byte [ ] Sky = { 003 , 004 , 005 , 006 , 009 , 010 , 011 , 012 , 013 , 014 , 015 , 016 , 017 , 018 , 019 , 020 , 021 , 022 , 023 , 024 , 025 , 026 , 027 } ;
2018-11-21 07:00:16 +00:00
2018-11-17 23:12:32 +00:00
private static readonly RareSpawn [ ] Rare =
{
// Normal
2020-12-22 01:17:56 +00:00
new ( 001 , 039 ) ,
new ( 004 , 005 , 006 , 041 ) ,
new ( 007 , 026 , 027 , 044 ) ,
new ( 106 , 045 ) ,
new ( 107 , 045 ) ,
new ( 113 , 007 , 008 , 010 , 011 , 012 , 013 , 014 , 015 , 016 , 017 , 018 , 019 , 020 , 023 , 025 , 040 , 042 , 043 , 045 , 047 , 051 ) ,
new ( 137 , 009 ) ,
new ( 143 , 046 ) ,
2018-11-17 23:12:32 +00:00
// Water
2020-12-22 01:17:56 +00:00
new ( 131 , 021 , 022 ) ,
2018-11-17 23:12:32 +00:00
// Fly
2020-12-22 01:17:56 +00:00
new ( 006 , Sky ) ,
new ( 144 , Sky ) ,
new ( 145 , Sky ) ,
new ( 146 , Sky ) ,
new ( 149 , Sky ) ,
2018-11-17 23:12:32 +00:00
} ;
2020-08-30 17:23:22 +00:00
private static void ManuallyAddRareSpawns ( IEnumerable < EncounterArea7b > areas )
2018-11-17 23:12:32 +00:00
{
foreach ( var table in areas )
{
var loc = table . Location ;
PKHeX.Core Nullable cleanup (#2401)
* Handle some nullable cases
Refactor MysteryGift into a second abstract class (backed by a byte array, or fake data)
Make some classes have explicit constructors instead of { } initialization
* Handle bits more obviously without null
* Make SaveFile.BAK explicitly readonly again
* merge constructor methods to have readonly fields
* Inline some properties
* More nullable handling
* Rearrange box actions
define straightforward classes to not have any null properties
* Make extrabyte reference array immutable
* Move tooltip creation to designer
* Rearrange some logic to reduce nesting
* Cache generated fonts
* Split mystery gift album purpose
* Handle more tooltips
* Disallow null setters
* Don't capture RNG object, only type enum
* Unify learnset objects
Now have readonly properties which are never null
don't new() empty learnsets (>800 Learnset objects no longer created,
total of 2400 objects since we also new() a move & level array)
optimize g1/2 reader for early abort case
* Access rewrite
Initialize blocks in a separate object, and get via that object
removes a couple hundred "might be null" warnings since blocks are now readonly getters
some block references have been relocated, but interfaces should expose all that's needed
put HoF6 controls in a groupbox, and disable
* Readonly personal data
* IVs non nullable for mystery gift
* Explicitly initialize forced encounter moves
* Make shadow objects readonly & non-null
Put murkrow fix in binary data resource, instead of on startup
* Assign dex form fetch on constructor
Fixes legality parsing edge cases
also handle cxd parse for valid; exit before exception is thrown in FrameGenerator
* Remove unnecessary null checks
* Keep empty value until init
SetPouch sets the value to an actual one during load, but whatever
* Readonly team lock data
* Readonly locks
Put locked encounters at bottom (favor unlocked)
* Mail readonly data / offset
Rearrange some call flow and pass defaults
Add fake classes for SaveDataEditor mocking
Always party size, no need to check twice in stat editor
use a fake save file as initial data for savedata editor, and for
gamedata (wow i found a usage)
constrain eventwork editor to struct variable types (uint, int, etc),
thus preventing null assignment errors
2019-10-17 01:47:31 +00:00
var species = Rare . Where ( z = > z . Locations . Contains ( ( byte ) loc ) ) . Select ( z = > z . Species ) . ToArray ( ) ;
2018-11-17 23:12:32 +00:00
if ( species . Length = = 0 )
continue ;
var slots = table . Slots ;
var first = slots [ 0 ] ;
var extra = species
2020-12-25 20:30:26 +00:00
. Select ( z = > new EncounterSlot7b ( table , z , ( z is 006 or > = 144 ) ? 03 : first . LevelMin , ( z is 006 or > = 144 ) ? 56 : first . LevelMax ) ) . ToArray ( ) ;
2018-11-17 23:12:32 +00:00
int count = slots . Length ;
Array . Resize ( ref slots , count + extra . Length ) ;
extra . CopyTo ( slots , count ) ;
table . Slots = slots ;
}
}
2020-08-30 17:23:22 +00:00
internal static readonly EncounterStatic [ ] StaticGP = GetEncounters ( Encounter_GG , GameVersion . GP ) ;
internal static readonly EncounterStatic [ ] StaticGE = GetEncounters ( Encounter_GG , GameVersion . GE ) ;
2018-11-11 21:12:24 +00:00
}
}