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
{
2019-09-12 05:06:24 +00:00
internal static readonly EncounterArea7b [ ] SlotsGP = GetEncounterTables < EncounterArea7b > ( "gg" , "gp" ) ;
internal static readonly EncounterArea7b [ ] SlotsGE = GetEncounterTables < EncounterArea7b > ( "gg" , "ge" ) ;
2018-11-11 21:12:24 +00:00
internal static readonly EncounterStatic [ ] StaticGP , StaticGE ;
2019-09-12 05:06:24 +00:00
internal static readonly EncounterArea7g [ ] SlotsGO_GG = GetGoParkArea ( ) ;
2018-11-11 21:12:24 +00:00
static Encounters7b ( )
{
StaticGP = GetStaticEncounters ( Encounter_GG , GameVersion . GP ) ;
StaticGE = GetStaticEncounters ( Encounter_GG , GameVersion . GE ) ;
2018-11-17 23:12:32 +00:00
ManuallyAddRareSpawns ( SlotsGP ) ;
ManuallyAddRareSpawns ( SlotsGE ) ;
2018-11-30 00:06:25 +00:00
SlotsGP . SetVersion ( GameVersion . GP ) ;
SlotsGE . SetVersion ( GameVersion . GE ) ;
2018-11-11 21:12:24 +00:00
Encounter_GG . SetVersion ( GameVersion . GG ) ;
TradeGift_GG . SetVersion ( GameVersion . GG ) ;
MarkEncountersGeneration ( 7 , SlotsGP , SlotsGE ) ;
MarkEncountersGeneration ( 7 , StaticGP , StaticGE , TradeGift_GG ) ;
}
private static readonly EncounterStatic [ ] Encounter_GG =
{
// encounters
2018-12-30 18:33:00 +00:00
new EncounterStatic { Species = 144 , Level = 50 , Location = 44 , FlawlessIVCount = 3 , } , // Articuno @ Seafoam Islands
new EncounterStatic { Species = 145 , Level = 50 , Location = 42 , FlawlessIVCount = 3 , } , // Zapdos @ Power Plant
new EncounterStatic { Species = 146 , Level = 50 , Location = 45 , FlawlessIVCount = 3 , } , // Moltres @ Victory Road
new EncounterStatic { Species = 150 , Level = 70 , Location = 46 , FlawlessIVCount = 3 , } , // Mewtwo @ Cerulean Cave
new EncounterStatic { Species = 143 , Level = 34 , Location = 14 , FlawlessIVCount = 3 , } , // Snorlax @ Route 12
new EncounterStatic { Species = 143 , Level = 34 , Location = 18 , FlawlessIVCount = 3 , } , // Snorlax @ Route 16
2019-10-11 15:19:35 +00:00
// unused new EncounterStatic { Species = 100, Level = 42, Location = 42, FlawlessIVCount = 3, }, // Voltorb @ Power Plant
2020-01-15 02:39:25 +00:00
// collision new EncounterStatic { Species = 101, Level = 42, Location = 42, FlawlessIVCount = 3, }, // Electrode @ Power Plant
2018-11-11 21:12:24 +00:00
// gifts
new EncounterStatic { 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 EncounterStatic { 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-17 00:44:25 +00:00
new EncounterStatic { 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
2018-11-19 04:39:15 +00:00
// unused new EncounterStatic { Species = 133, Level = 30, Location = 34, Gift = true }, // Eevee @ Celadon City
new EncounterStatic { Species = 131 , Level = 34 , Location = 52 , Gift = true , IVs = new [ ] { 31 , 25 , 25 , 25 , 30 , 30 } } , // Lapras @ Saffron City (Silph Co. Employee, inside)
2018-11-11 21:12:24 +00:00
new EncounterStatic { Species = 106 , Level = 30 , Location = 38 , Gift = true , IVs = new [ ] { 25 , 30 , 25 , 31 , 25 , 30 } } , // Hitmonlee @ Saffron City (Karate Master)
new EncounterStatic { Species = 107 , Level = 30 , Location = 38 , Gift = true , IVs = new [ ] { 25 , 31 , 30 , 25 , 25 , 30 } } , // Hitmonchan @ Saffron City (Karate Master)
2018-12-30 18:33:00 +00:00
new EncounterStatic { Species = 140 , Level = 44 , Location = 36 , Gift = true , FlawlessIVCount = 3 } , // Kabuto @ Cinnabar Island (Cinnabar Pokémon Lab)
new EncounterStatic { Species = 138 , Level = 44 , Location = 36 , Gift = true , FlawlessIVCount = 3 } , // Omanyte @ Cinnabar Island (Cinnabar Pokémon Lab)
new EncounterStatic { Species = 142 , Level = 44 , Location = 36 , Gift = true , FlawlessIVCount = 3 } , // Aerodactyl @ Cinnabar Island (Cinnabar Pokémon Lab)
2018-11-11 21:12:24 +00:00
new EncounterStatic { Species = 001 , Level = 12 , Location = 31 , Gift = true , IVs = new [ ] { 31 , 25 , 30 , 25 , 25 , 30 } } , // Bulbasaur @ Cerulean City
new EncounterStatic { Species = 004 , Level = 14 , Location = 26 , Gift = true , IVs = new [ ] { 25 , 30 , 25 , 31 , 30 , 25 } } , // Charmander @ Route 24
new EncounterStatic { Species = 007 , Level = 16 , Location = 33 , Gift = true , IVs = new [ ] { 25 , 25 , 30 , 25 , 31 , 30 } } , // Squirtle @ Vermillion City
2018-11-19 04:39:15 +00:00
new EncounterStatic { Species = 137 , Level = 34 , Location = 38 , Gift = true , IVs = new [ ] { 25 , 25 , 30 , 25 , 31 , 30 } } , // Porygon @ Saffron City (Silph Co. Employee, outside)
2018-11-17 00:44:25 +00:00
new EncounterStatic { 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 EncounterStatic { 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.
2018-11-16 22:20:06 +00:00
new EncounterTrade { Species = 019 , Level = 12 , Form = 1 , TrainerNames = T1 , TID7 = 121106 , OTGender = 1 , Shiny = Shiny . Random , IVs = new [ ] { 31 , 31 , - 1 , - 1 , - 1 , - 1 } , IsNicknamed = false } , // Rattata @ Cerulean City, AV rand [0-5)
new EncounterTrade { Species = 027 , Level = 27 , Form = 1 , TrainerNames = T2 , TID7 = 703019 , OTGender = 0 , Shiny = Shiny . Random , IVs = new [ ] { - 1 , 31 , 31 , - 1 , - 1 , - 1 } , IsNicknamed = false , Version = GameVersion . GP } , // Sandshrew @ Celadon City, AV rand [0-5)
new EncounterTrade { Species = 037 , Level = 27 , Form = 1 , TrainerNames = T2 , TID7 = 703019 , OTGender = 0 , Shiny = Shiny . Random , IVs = new [ ] { - 1 , - 1 , - 1 , 31 , 31 , - 1 } , IsNicknamed = false , Version = GameVersion . GE } , // Vulpix @ Celadon City, AV rand [0-5)
new EncounterTrade { Species = 050 , Level = 25 , Form = 1 , TrainerNames = T3 , TID7 = 520159 , OTGender = 1 , Shiny = Shiny . Random , IVs = new [ ] { - 1 , 31 , - 1 , 31 , - 1 , - 1 } , IsNicknamed = false } , // Diglett @ Lavender Town, AV rand [0-5)
new EncounterTrade { Species = 052 , Level = 44 , Form = 1 , TrainerNames = T4 , TID7 = 000219 , OTGender = 0 , Shiny = Shiny . Random , IVs = new [ ] { 31 , - 1 , - 1 , 31 , - 1 , - 1 } , IsNicknamed = false , Version = GameVersion . GE } , // Meowth @ Cinnabar Island, AV rand [0-10)
new EncounterTrade { Species = 088 , Level = 44 , Form = 1 , TrainerNames = T4 , TID7 = 000219 , OTGender = 0 , Shiny = Shiny . Random , IVs = new [ ] { 31 , 31 , - 1 , - 1 , - 1 , - 1 } , IsNicknamed = false , Version = GameVersion . GP } , // Grimer @ Cinnabar Island, AV rand [0-10)
new EncounterTrade { Species = 026 , Level = 30 , Form = 1 , TrainerNames = T5 , TID7 = 940711 , OTGender = 1 , Shiny = Shiny . Random , IVs = new [ ] { - 1 , - 1 , - 1 , 31 , 31 , - 1 } , IsNicknamed = false } , // Raichu @ Saffron City, AV rand [0-10)
new EncounterTrade { Species = 105 , Level = 38 , Form = 1 , TrainerNames = T6 , TID7 = 102595 , OTGender = 0 , Shiny = Shiny . Random , IVs = new [ ] { - 1 , 31 , 31 , - 1 , - 1 , - 1 } , IsNicknamed = false } , // Marowak @ Fuchsia City, AV rand [0-10)
new EncounterTrade { Species = 103 , Level = 46 , Form = 1 , TrainerNames = T7 , TID7 = 060310 , OTGender = 0 , Shiny = Shiny . Random , IVs = new [ ] { - 1 , 31 , - 1 , - 1 , 31 , - 1 } , IsNicknamed = false } , // Exeggutor @ Indigo Plateau, AV rand [0-15)
new EncounterTrade { Species = 074 , Level = 16 , Form = 1 , TrainerNames = T8 , TID7 = 551873 , OTGender = 0 , Shiny = Shiny . Random , 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
2019-09-12 05:06:24 +00:00
private static EncounterArea7g [ ] GetGoParkArea ( )
2018-11-15 01:40:41 +00:00
{
2019-09-12 05:06:24 +00:00
var area = new EncounterArea7g { Location = 50 } ;
2018-11-15 01:40:41 +00:00
EncounterSlot GetSlot ( int species , int form )
{
return new EncounterSlot
{
Area = area ,
Generation = 7 ,
Species = species ,
2018-11-23 18:15:49 +00:00
LevelMin = 1 ,
LevelMax = 40 ,
2018-11-15 01:40:41 +00:00
Form = form ,
Type = SlotType . GoPark ,
Version = GameVersion . GO ,
} ;
}
2019-09-03 01:38:12 +00:00
var obtainable = Enumerable . Range ( 1 , 150 ) . Concat ( Enumerable . Range ( 808 , 2 ) ) ; // count : 152
var AlolanKanto = new byte [ ]
{
// Level 1+
019 , // Rattata
020 , // Raticate
027 , // Sandshrew
028 , // Sandslash
037 , // Vulpix
2019-09-03 02:28:48 +00:00
038 , // Ninetales
2019-09-03 01:38:12 +00:00
050 , // Diglett
051 , // Dugtrio
052 , // Meowth
053 , // Persian
074 , // Geodude
075 , // Graveler
076 , // Golem
088 , // Grimer
089 , // Muk
103 , // Exeggutor
// Level 20+
026 , // Raichu
105 , // Marowak
} ;
var regular = obtainable . Select ( z = > GetSlot ( z , 0 ) ) ;
var alolan = AlolanKanto . Select ( z = > GetSlot ( z , 1 ) ) ;
var slots = regular . Concat ( alolan ) . ToArray ( ) ;
2019-09-03 02:07:20 +00:00
slots [ slots . Length - 2 ] . LevelMin = 20 ; // Raichu
slots [ slots . Length - 1 ] . LevelMin = 20 ; // Marowak
2019-09-03 02:28:48 +00:00
slots [ ( int ) Species . Mewtwo - 1 ] . LevelMin = 20 ;
slots [ ( int ) Species . Articuno - 1 ] . LevelMin = 15 ;
slots [ ( int ) Species . Zapdos - 1 ] . LevelMin = 15 ;
slots [ ( int ) Species . Moltres - 1 ] . LevelMin = 15 ;
2019-09-03 01:38:12 +00:00
area . Slots = slots ;
2018-11-15 01:40:41 +00:00
return new [ ] { area } ;
}
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
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
new RareSpawn ( 001 , 039 ) ,
new RareSpawn ( 004 , 005 , 006 , 041 ) ,
new RareSpawn ( 007 , 026 , 027 , 044 ) ,
new RareSpawn ( 106 , 045 ) ,
new RareSpawn ( 107 , 045 ) ,
new RareSpawn ( 113 , 007 , 008 , 010 , 011 , 012 , 013 , 014 , 015 , 016 , 017 , 018 , 019 , 020 , 023 , 025 , 040 , 042 , 043 , 045 , 047 , 051 ) ,
new RareSpawn ( 137 , 009 ) ,
new RareSpawn ( 143 , 046 ) ,
2018-11-17 23:12:32 +00:00
// Water
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
new RareSpawn ( 131 , 021 , 022 ) ,
2018-11-17 23:12:32 +00:00
// Fly
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
new RareSpawn ( 006 , Sky ) ,
new RareSpawn ( 144 , Sky ) ,
new RareSpawn ( 145 , Sky ) ,
new RareSpawn ( 146 , Sky ) ,
new RareSpawn ( 149 , Sky ) ,
2018-11-17 23:12:32 +00:00
} ;
private static void ManuallyAddRareSpawns ( IEnumerable < EncounterArea > areas )
{
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
. Select ( z = > new EncounterSlot
{
Area = table ,
Species = z ,
2018-11-20 21:38:49 +00:00
LevelMin = ( z = = 006 | | z > = 144 ) ? 03 : first . LevelMin ,
LevelMax = ( z = = 006 | | z > = 144 ) ? 56 : first . LevelMax ,
2018-11-17 23:12:32 +00:00
} ) . ToArray ( ) ;
int count = slots . Length ;
Array . Resize ( ref slots , count + extra . Length ) ;
extra . CopyTo ( slots , count ) ;
table . Slots = slots ;
}
}
2018-11-11 21:12:24 +00:00
}
}