diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..7484125 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "pokeemerald"] + path = pokeemerald + url = https://github.com/pret/pokeemerald diff --git a/Build.PL b/Build.PL index f5cea5b..c9026cd 100755 --- a/Build.PL +++ b/Build.PL @@ -16,7 +16,9 @@ my $build = Module::Build->new( 'DBI' => 0, 'Moo' => 0, 'namespace::clean' => 0, + 'Cairo::GObject' => 0, 'UUID::URandom' => 0, + 'Glib' => 0, }, ); $build->create_build_script; diff --git a/create_shiny_folder.pl b/create_shiny_folder.pl new file mode 100644 index 0000000..c9e33b4 --- /dev/null +++ b/create_shiny_folder.pl @@ -0,0 +1,31 @@ +#!/usr/bin/env perl + +use v5.16.3; + +use strict; +use warnings; + +use Path::Tiny; + +my $pokemons_dir = path 'pokeemerald/graphics/pokemon/'; +my $tempdir = Path::Tiny->tempdir; +my $shiny_dir = path 'resources/shiny'; +$shiny_dir->mkpath; +for my $pokemon_dir ( $pokemons_dir->children ) { + my $bpp = $tempdir->child( $pokemon_dir->basename . '.4bpp' ); + say $pokemon_dir->basename; + my $front = $pokemon_dir->child('front.png'); + my $shiny = $pokemon_dir->child('shiny.pal'); + if ($pokemon_dir->basename eq 'unown') { + $front = $pokemon_dir->child('z/front.png'); + } + if ($pokemon_dir->basename eq 'castform') { + $front = $pokemon_dir->child('normal/front.png'); + $shiny = $pokemon_dir->child('normal/shiny.pal'); + } + system './pokeemerald/tools/gbagfx/gbagfx', + $front, $bpp; + system './pokeemerald/tools/gbagfx/gbagfx', + $bpp, $shiny_dir->child( $pokemon_dir->basename . '.png' ), + '-palette', $shiny, '-mwidth', 8, '-object'; +} diff --git a/create_species_data.pl b/create_species_data.pl new file mode 100644 index 0000000..d6bf0e1 --- /dev/null +++ b/create_species_data.pl @@ -0,0 +1,82 @@ +#!/usr/bin/env perl + +use v5.16.1; + +use strict; +use warnings; + +use Path::Tiny; +use Data::Dumper; + +my $output_file = path('lib/Rsaves/Constants/Emerald/SpeciesData.pm'); +my $input_file = path('pokeemerald/src/data/pokemon/species_info.h'); +my $fh_output = $output_file->openw; +open my $fh_input, '-|', 'cpp', $input_file; + +print $fh_output <<'EOF'; +package Rsaves::Constants::Emerald::SpeciesData; + +use v5.16.3; + +use strict; +use warnings; + +EOF + +$Data::Dumper::Terse = 1; + +my %all_species_data; +{ + my $species; + my %species_data; + while (defined (my $line = <$fh_input>)) { + if ($line =~ /^\s*\[SPECIES_(\w+)\]\s*=/) { + if (defined $species) { + $all_species_data{$species} = {%species_data}; + } + %species_data = (); + $species = $1; + if ($species eq 'NONE') { + $species = undef; + } + } + if (defined $species) { + if ($line =~ /\.growthRate\s*=\s*(\w+)/) { + my $growth_rate = $1; + $species_data{growth_rate} = $1; + } + if ($line =~ /\.genderRatio\s*=\s*(\w+)/) { + my $gender_ratio = $1; + if ($gender_ratio eq 'min' && $line =~ /(\w+) \* 255/) { + $gender_ratio = $1; + $gender_ratio *= 255 / 100; + $gender_ratio = int($gender_ratio); + if ($gender_ratio > 254) { + $gender_ratio = 254; + } + } + if ($gender_ratio eq 'MON_FEMALE') { + $gender_ratio = 254; + } + if ($gender_ratio eq 'MON_MALE') { + $gender_ratio = 0; + } + if ($gender_ratio eq 'MON_GENDERLESS') { + $gender_ratio = 255; + } + $species_data{gender_ratio} = $gender_ratio + } + } + + } +} + +print $fh_output 'our %SPECIES_DATA = %{'; +my $dumper = Data::Dumper::Dumper \%all_species_data; +chomp($dumper); +print $fh_output $dumper; +say $fh_output '};'; + +say $fh_output '1;'; +system 'perltidy', '-b', $output_file; +1; diff --git a/lib/GEmeTool/Constants.pm b/lib/GEmeTool/Constants.pm new file mode 100644 index 0000000..a008d83 --- /dev/null +++ b/lib/GEmeTool/Constants.pm @@ -0,0 +1,23 @@ +package GEmeTool::Constants; + +our @wallpapers = ( + 'FOREST', + 'CITY', + 'DESERT', + 'SAVANNA', + 'CRAG', + 'VOLCANO', + 'SNOW', + 'CAVE', + 'BEACH', + 'SEAFLOOR', + 'RIVER', + 'SKY', + 'POLKADOT', + 'POKECENTER', + 'MACHINE', + 'PLAIN', + 'FRIENDS' +); + +1; diff --git a/lib/GEmeTool/Save.pm b/lib/GEmeTool/Save.pm index a4fd4a7..bce7869 100644 --- a/lib/GEmeTool/Save.pm +++ b/lib/GEmeTool/Save.pm @@ -15,6 +15,7 @@ use Moo; use GEmeTool::Log qw/logger/; use namespace::clean; +use GEmeTool::Save::PokemonPC; has __saves => ( is => 'rw' ); @@ -26,6 +27,8 @@ has _initial_rematches => ( is => 'rw' ); has _initial_flags => ( is => 'rw' ); +has _pc => ( is => 'rw' ); + sub instance { my $class = shift; my $input_file = shift; @@ -217,4 +220,18 @@ sub _get_flags_hash_by_id { ); return @final_hash; } + +sub get_pc_system { + my $self = shift; + if (defined $self->_pc) { + return $self->_pc; + } + my $pc = Rsaves::read_pc_storage($self->_get_current_save); + my $return = GEmeTool::Save::PokemonPC->new(_pc => $pc, _save => sub { + my $pc = shift; + Rsaves::save_pc_changes($self->_get_current_save, $pc) + }); + $self->_pc($return); + return $return; +} 1; diff --git a/lib/GEmeTool/Save/Pokemon.pm b/lib/GEmeTool/Save/Pokemon.pm new file mode 100644 index 0000000..aa25c8b --- /dev/null +++ b/lib/GEmeTool/Save/Pokemon.pm @@ -0,0 +1,359 @@ +package GEmeTool::Save::Pokemon; + +use v5.16.3; + +use strict; +use warnings; + +use Moo; +use Rsaves; +use Rsaves::Constants::Emerald::Species; +use Rsaves::Constants::Emerald::SpeciesData; + +has _pokemon => ( is => 'rw', ); + +sub species { + my $self = shift; + my $arg = shift; + my $pokemon = $self->_pokemon; + my $substruct_0 = $pokemon->{substructures}[0]; + if ( defined $arg ) { + $substruct_0->{species} = $arg; + } + return $substruct_0->{species}; +} + +sub ivs { + my $self = shift; + my $arg = shift; + my $current_value = + $self->_pokemon->{substructures}[3]{ivs_egg_status_and_ability}; + my @stats = ( + 'HP', 'Attack', + 'Defense', 'Speed', + 'Special Attack', 'Special Defense' + ); + if ( defined $arg ) { + if ( defined $arg->{HP} ) { + $current_value &= ~0x1f; + $current_value |= ( $arg->{HP} & 0x1f ); + } + if ( defined $arg->{Attack} ) { + $current_value &= ~( 0x1f << 5 ); + $current_value |= ( ( $arg->{Attack} & 0x1f ) << 5 ); + } + if ( defined $arg->{Defense} ) { + $current_value &= ~( 0x1f << 10 ); + $current_value |= ( ( $arg->{Defense} & 0x1f ) << 10 ); + } + if ( defined $arg->{Speed} ) { + $current_value &= ~( 0x1f << 15 ); + $current_value |= ( ( $arg->{Speed} & 0x1f ) << 15 ); + } + if ( defined $arg->{SpecialAttack} ) { + $current_value &= ~( 0x1f << 20 ); + $current_value |= ( ( $arg->{SpecialAttack} & 0x1f ) << 20 ); + } + if ( defined $arg->{SpecialDefense} ) { + $current_value &= ~( 0x1f << 25 ); + $current_value |= ( ( $arg->{SpecialDefense} & 0x1f ) << 25 ); + } + $self->_pokemon->{substructures}[3]{ivs_egg_status_and_ability} = + $current_value; + } + my $ivs_egg_status_and_ability = $current_value; + return { + HP => $ivs_egg_status_and_ability & 0x1F, + Attack => ( $ivs_egg_status_and_ability >> 5 ) & 0x1F, + Defense => ( $ivs_egg_status_and_ability >> 10 ) & 0x1F, + Speed => ( $ivs_egg_status_and_ability >> 15 ) & 0x1F, + SpecialDefense => ( $ivs_egg_status_and_ability >> 25 ) & 0x1F, + SpecialAttack => ( $ivs_egg_status_and_ability >> 20 ) & 0x1F, + }; +} + +sub evs { + my $self = shift; + my $arg = shift; + my $pokemon = $self->_pokemon; + my $substructure = $pokemon->{substructures}[2]; + if (defined $arg) { + if (defined $arg->{HP}) { + $substructure->{hp_ev} = $arg->{HP}; + } + if (defined $arg->{Attack}) { + $substructure->{attack_ev} = $arg->{Attack}; + } + if (defined $arg->{Defense}) { + $substructure->{defense_ev} = $arg->{Defense}; + } + if (defined $arg->{Speed}) { + $substructure->{speed_ev} = $arg->{Speed}; + } + if (defined $arg->{SpecialAttack}) { + $substructure->{special_attack_ev} = $arg->{SpecialAttack}; + } + if (defined $arg->{SpecialDefense}) { + $substructure->{special_defense_ev} = $arg->{SpecialDefense}; + } + } + return { + HP => $pokemon->{substructures}[2]{hp_ev}, + Attack => $pokemon->{substructures}[2]{attack_ev}, + Defense => $pokemon->{substructures}[2]{defense_ev}, + Speed => $pokemon->{substructures}[2]{speed_ev}, + SpecialAttack => $pokemon->{substructures}[2]{special_attack_ev}, + SpecialDefense => $pokemon->{substructures}[2]{special_defense_ev}, + }; +} + +sub level { + my $self = shift; + my $arg = shift; + my $pokemon = $self->_pokemon; + my $growth_func = sub { + my $n = shift; + if ( $n == 1 ) { + return 1; + } + return $self->growth_function->($n); + }; + if ( defined $arg ) { + $pokemon->{substructures}[0]{experience} = $growth_func->($arg); + } + my $experience = $pokemon->{substructures}[0]{experience}; + my $level = 1; + while ( $level <= 100 && int( $growth_func->($level) ) <= $experience ) { + $level++; + } + $level -= 1; + + return $level; +} + +sub growth_function { + my $self = shift; + my $growth = $self->growth; + if ( $growth eq 'GROWTH_FAST' ) { + return \&_exp_fast; + } + if ( $growth eq 'GROWTH_MEDIUM_FAST' ) { + return \&_exp_medium_fast; + } + if ( $growth eq 'GROWTH_MEDIUM_SLOW' ) { + return \&_exp_medium_slow; + } + if ( $growth eq 'GROWTH_SLOW' ) { + return \&_exp_slow; + } + if ( $growth eq 'GROWTH_ERRATIC' ) { + return \&_exp_erratic; + } + if ( $growth eq 'GROWTH_FLUCTUATING' ) { + return \&_exp_fluctuating; + } +} + +sub gender_ratio { + my $self = shift; + my $pokemon_name = $self->pokemon_name; + my %pokemon_data = %Rsaves::Constants::Emerald::SpeciesData::SPECIES_DATA; + my $data = $pokemon_data{$pokemon_name}; + my $gender_ratio = $data->{gender_ratio}; + return $gender_ratio; +} + +sub gender { + + # 0 male + # 1 female + # 2 genderless + my $self = shift; + my $pokemon = $self->_pokemon; + my $personality = shift // $pokemon->{personality}; + my $gender_ratio = $self->gender_ratio; + if ( $gender_ratio == 0 ) { + return 0; + } + if ( $gender_ratio == 254 ) { + return 1; + } + if ( $gender_ratio == 255 ) { + return 2; + } + if ( $gender_ratio <= ( $personality & 0xff ) ) { + return 0; + } + return 1; +} + +sub personality { + my $self = shift; + my $arg = shift; + my $pokemon = $self->_pokemon; + if ( defined $arg ) { + $self->_pokemon->{personality} = $arg; + } + return $pokemon->{personality}; +} + +sub growth { + my $self = shift; + my $pokemon_name = $self->pokemon_name; + my %pokemon_data = %Rsaves::Constants::Emerald::SpeciesData::SPECIES_DATA; + my $data = $pokemon_data{$pokemon_name}; + return $data->{growth_rate}; +} + +sub _square { + return $_[0]**2; +} + +sub _cube { + return $_[0]**3; +} + +sub _exp_slow { + my $n = shift; + return ( 5 * _cube($n) ) / 4; +} + +sub _exp_fast { + my $n = shift; + return ( 4 * _cube($n) ) / 5; +} + +sub _exp_medium_fast { + return _cube( $_[0] ); +} + +sub _exp_medium_slow { + my $n = shift; + +#define EXP_MEDIUM_SLOW(n)((6 * CUBE(n)) / 5 - (15 * SQUARE(n)) + (100 * n) - 140) // (6 * (n)^3) / 5 - (15 * (n)^2) + (100 * n) - 140 + my $return = + ( ( 6 * _cube($n) ) / 5 - ( 15 * _square($n) ) + ( 100 * $n ) - 140 ); + return $return; +} + +sub _exp_erratic { + my $n = shift; + if ( $n <= 50 ) { + return ( ( 100 - $n ) * _cube($n) / 50 ); + } + if ( $n <= 68 ) { + return ( ( 150 - $n ) * _cube($n) / 100 ); + } + if ( $n <= 98 ) { + return ( ( 1911 - 10 * $n ) / 3 * _cube($n) / 500 ); + } + return ( ( 160 - $n ) * _cube($n) / 100 ); +} + +sub _exp_fluctuating { + my $n = shift; + if ( $n <= 15 ) { + return ( ( ( $n + 1 ) / 3 + 24 ) * _cube($n) / 50 ); + } + if ( $n <= 36 ) { + return ( ( $n + 14 ) * _cube($n) / 50 ); + } + return ( ( ( $n / 2 ) + 32 ) * _cube($n) / 50 ); +} + +sub pokemon_name { + my $self = shift; + return $Rsaves::Constants::Emerald::Species::SPECIES[ $self->species ]; +} + +sub nickname { + my $self = shift; + my $arg = shift; + if ( defined $arg ) { + die "Invalid nickname" if length $arg != 10; + $self->_pokemon->{nickname} = $arg; + } + return $self->_pokemon->{nickname}; +} + +sub get_icon { + my $self = shift; + my $pokemon_name = + $Rsaves::Constants::Emerald::Species::SPECIES[ $self->species ]; + if ( lc($pokemon_name) eq 'unown' ) { + return "pokeemerald/graphics/pokemon/@{[lc($pokemon_name)]}/z/icon.png"; + } + return "pokeemerald/graphics/pokemon/@{[lc($pokemon_name)]}/icon.png"; +} + +sub generate_personality { + my $self = shift; + my $target_shiny = shift; + my $target_gender = shift; + my $target_nature = shift; + my $otid = $self->otid; + my $should_search_gender = 0; + my $personality; + if ( defined $target_gender + && !( grep { $self->gender_ratio eq $_ } ( 0, 254, 255 ) ) ) + { + $should_search_gender = 1; + } + if ( defined $target_gender && $target_gender != 0 && $target_gender != 1 ) + { + die "Incorrect gender $target_gender."; + } + if ( defined $target_nature + && ( $target_nature < 0 || $target_nature > 24 ) ) + { + die "Incorrect nature $target_nature."; + } + for ( my $i = 0 ; $i < 0xffffffff ; $i++ ) { + if ( defined $target_nature && $i % 25 != $target_nature ) { + next; + } + if ( defined $target_shiny + && !( !!$target_shiny == !!Rsaves::is_shiny( $otid, $i ) ) ) + { + next; + } + if ( $should_search_gender && $self->gender($i) != $target_gender ) { + next; + } + $personality = $i; + last; + } + if ( !defined $personality ) { + warn "Could not find personality combination, this is a bug."; + } + return $personality; +} + +sub otid { + my $self = shift; + my $arg = shift; + my $pokemon = $self->_pokemon; + if ( defined $arg ) { + $pokemon->{otid} = $arg; + } + return $pokemon->{otid}; +} + +sub get_front { + my $self = shift; + my $pokemon_name = + $Rsaves::Constants::Emerald::Species::SPECIES[ $self->species ]; + if ( Rsaves::pokemon_is_shiny( $self->_pokemon ) ) { + return "resources/shiny/@{[lc($pokemon_name)]}.png"; + } + if ( lc($pokemon_name) eq 'castform' ) { + return +"pokeemerald/graphics/pokemon/@{[lc($pokemon_name)]}/normal/front.png"; + } + if ( lc($pokemon_name) eq 'unown' ) { + return + "pokeemerald/graphics/pokemon/@{[lc($pokemon_name)]}/z/front.png"; + } + return "pokeemerald/graphics/pokemon/@{[lc($pokemon_name)]}/front.png"; +} +1; diff --git a/lib/GEmeTool/Save/PokemonBox.pm b/lib/GEmeTool/Save/PokemonBox.pm new file mode 100644 index 0000000..5318b5c --- /dev/null +++ b/lib/GEmeTool/Save/PokemonBox.pm @@ -0,0 +1,69 @@ +package GEmeTool::Save::PokemonBox; + +use v5.16.3; + +use strict; +use warnings; + +use Moo; + +use GEmeTool::Save::Pokemon; + +has _wallpaper => ( + is => 'rw', + required => 1, +); + +has _name => ( + is => 'rw', + required => 1, +); + +has _box => ( + is => 'rw', + required => 1, +); + +has number => ( is => 'ro', ); + +has _pokemons => ( is => 'rw', ); + +sub wallpaper { + my $self = shift; + my $arg = shift; + if ( defined $arg ) { + ${ $self->_wallpaper } = $arg; + } + return ${ $self->_wallpaper }; +} + +sub name { + my $self = shift; + my $arg = shift; + if ( defined $arg ) { + ${ $self->_name } = $arg; + } + return ${ $self->_name }; +} + +sub get_pokemon { + my $self = shift; + my $number = shift; + my $pokemons = $self->_pokemons; + if ( !defined $pokemons ) { + $pokemons = []; + $self->_pokemons($pokemons); + } + if ( $number < 0 || $number > 29 ) { + die +"Pokemon boxes can only hold pokemon from 0 to 29, index $number invalid."; + } + if ( defined $pokemons->[$number] ) { + return $pokemons->[$number]; + } + my $return = + GEmeTool::Save::Pokemon->new( _pokemon => $self->_box->[$number] ); + $pokemons->[$number] = $return; + return $return; +} +1; diff --git a/lib/GEmeTool/Save/PokemonPC.pm b/lib/GEmeTool/Save/PokemonPC.pm new file mode 100644 index 0000000..ae0dbd0 --- /dev/null +++ b/lib/GEmeTool/Save/PokemonPC.pm @@ -0,0 +1,67 @@ +package GEmeTool::Save::PokemonPC; + +use v5.16.3; + +use strict; +use warnings; + +use Moo; +use Rsaves; + +use GEmeTool::Save::PokemonBox; + +has _pc => ( + is => 'rw', + required => 1, +); + +has _save => ( + is => 'rw', + required => 1, +); + +has _boxes => ( is => 'rw', ); + +sub boxes { + my $self = shift; + my $pc = $self->_pc; + my @boxes; + for ( my $i = 0 ; $i < 14 ; $i++ ) { + $boxes[$i] = $self->get_box($i); + } + return \@boxes; +} + +sub get_box { + my $self = shift; + my $number = shift; + my $boxes = $self->_boxes; + if ( !defined $boxes ) { + $self->_boxes( [] ); + $boxes = $self->_boxes; + } + if ( $number < 0 || $number > 13 ) { + die "Bad box number $number."; + } + if ( defined $boxes->[$number] ) { + return $boxes->[$number]; + } + my $pc = $self->_pc; + my $wallpaper = \$pc->{wallpapers}[$number]; + my $name = \$pc->{boxes_names}[$number]; + my $box = $pc->{boxes}[$number]; + my $return = GEmeTool::Save::PokemonBox->new( + _wallpaper => $wallpaper, + _name => $name, + _box => $box, + number => $number, + ); + $boxes->[$number] = $return; + return $return; +} + +sub save { + my $self = shift; + $self->_save->( $self->_pc ); +} +1; diff --git a/lib/GEmeTool/View/MainWindow.pm b/lib/GEmeTool/View/MainWindow.pm index b1e23b1..8a3a2b8 100644 --- a/lib/GEmeTool/View/MainWindow.pm +++ b/lib/GEmeTool/View/MainWindow.pm @@ -11,9 +11,11 @@ use Glib::IO; use Glib::Object::Introspection; use Data::Dumper; use Path::Tiny; + use GEmeTool::Options; use GEmeTool::Save; use GEmeTool::View::LogWindow; +use GEmeTool::View::PokemonPCWindow; use Moo; @@ -31,63 +33,54 @@ Glib::Object::Introspection->setup( use namespace::clean; -has _win => ( - is => 'rw', -); +has _win => ( is => 'rw', ); -has _options => ( - is => 'rw', -); +has _options => ( is => 'rw', ); -has _app => ( - is => 'rw', -); +has _app => ( is => 'rw', ); -has _save => ( - is => 'rw', -); +has _save => ( is => 'rw', ); -has _save_as => ( - is => 'rw', -); +has _save_as_action => ( is => 'rw', ); +has _pc_action => ( is => 'rw', ); -has _file => ( - is => 'rw', -); +has _file => ( is => 'rw', ); sub start { - my $self = shift; + my $self = shift; my $options = GEmeTool::Options->new; $self->_options($options); - my $app = Gtk4::Application->new( 'tech.owlcode.GEmeTool', 'default-flags' ); + my $app = + Gtk4::Application->new( 'tech.owlcode.GEmeTool', 'default-flags' ); $self->_app($app); - $app->signal_connect( activate => sub { - $self->activate; - } ); + $app->signal_connect( + activate => sub { + $self->activate; + } + ); $app->run; } sub activate { - my $self = shift; + my $self = shift; my $display = Gdk::Display::get_default(); - my $icon_theme = Gtk4::IconTheme::get_for_display($display); - $icon_theme->set_search_path( - path(__FILE__)->parent->parent->child('resources/icons')->absolute ); - Gtk4::Window::set_default_icon_name('gemetool'); - - my $menu = Glib::IO::Menu->new; - my $about = Glib::IO::SimpleAction->new( 'about', undef ); - my $open = Glib::IO::SimpleAction->new( 'open', undef ); - my $logs = Glib::IO::SimpleAction->new( 'view_logs', undef ); - my $save_as = Glib::IO::SimpleAction->new( 'save_as', undef ); - $save_as->set_enabled(0); + my $menu = Glib::IO::Menu->new; + my $about = Glib::IO::SimpleAction->new( 'about', undef ); + my $open = Glib::IO::SimpleAction->new( 'open', undef ); + my $logs = Glib::IO::SimpleAction->new( 'view_logs', undef ); + my $pc_action = Glib::IO::SimpleAction->new( 'view_pc', undef ); + my $save_as_action = Glib::IO::SimpleAction->new( 'save_as', undef ); + $save_as_action->set_enabled(0); + $pc_action->set_enabled(0); my $app = $self->_app; $app->add_action($about); $app->add_action($open); $app->add_action($logs); - $app->add_action($save_as); - $self->_save_as($save_as); + $app->add_action($pc_action); + $app->add_action($save_as_action); + $self->_save_as_action($save_as_action); + $self->_pc_action($pc_action); my $save; my $extra; my $save_menu_item = Glib::IO::MenuItem->new( 'Save as', 'app.save_as' ); @@ -96,15 +89,23 @@ sub activate { $self->activate_open; } ); - $save_as->signal_connect( + $save_as_action->signal_connect( activate => sub { $self->activate_save; } ); + $pc_action->signal_connect( + activate => sub { + $self->activate_view_pc; + } + ); $logs->signal_connect( activate => sub { my $win = $self->_win; - GEmeTool::View::LogWindow->new(app => $self->_app, main_window => $self)->start; + GEmeTool::View::LogWindow->new( + app => $self->_app, + main_window => $self + )->start; } ); @@ -112,11 +113,14 @@ sub activate { my $about_menu_item = Glib::IO::MenuItem->new( 'About', 'app.about' ); my $open_menu_item = Glib::IO::MenuItem->new( 'Open', 'app.open' ); - my $logs_menu_item = Glib::IO::MenuItem->new( 'View logs', 'app.view_logs' ); - my $submenu_file = Glib::IO::Menu->new; - my $submenu_view = Glib::IO::Menu->new; - my $submenu_help = Glib::IO::Menu->new; + my $logs_menu_item = + Glib::IO::MenuItem->new( 'View logs', 'app.view_logs' ); + my $pc_menu_item = Glib::IO::MenuItem->new( 'View pc', 'app.view_pc' ); + my $submenu_file = Glib::IO::Menu->new; + my $submenu_view = Glib::IO::Menu->new; + my $submenu_help = Glib::IO::Menu->new; $submenu_help->append_item($about_menu_item); + $submenu_view->append_item($pc_menu_item); $submenu_view->append_item($logs_menu_item); $submenu_file->append_item($open_menu_item); $submenu_file->append_item($save_menu_item); @@ -139,56 +143,57 @@ sub activate { } sub activate_open { - my $self = shift; + my $self = shift; my $cancellable = Glib::IO::Cancellable->new; - my $dialog = Gtk4::FileDialog->new; - my $options = $self->_options; - my $win = $self->_win; - my $last_dir = $options->get_last_dir_open; - if (defined $last_dir && -d $last_dir) { + my $dialog = Gtk4::FileDialog->new; + my $options = $self->_options; + my $win = $self->_win; + my $last_dir = $options->get_last_dir_open; + if ( defined $last_dir && -d $last_dir ) { my $curdir = Glib::IO::File::new_for_path($last_dir); $dialog->set_initial_folder($curdir); } $dialog->open( - $win, $cancellable, + $win, + $cancellable, sub { my ( $self_dialog, $res ) = @_; - if ($res->had_error) { + if ( $res->had_error ) { return; } my $file = $dialog->open_finish($res); return if !defined $file; $file = path( $file->get_path ); $self->_file($file); - $options->set_last_dir_open($file->parent.''); + $options->set_last_dir_open( $file->parent . '' ); $self->start_editing_file; } ); } sub activate_save { - my $self = shift; - my $win = $self->_win; - my $dialog = Gtk4::FileDialog->new; - my $options = $self->_options; + my $self = shift; + my $win = $self->_win; + my $dialog = Gtk4::FileDialog->new; + my $options = $self->_options; my $last_dir = $options->get_last_dir_open; - if (defined $last_dir && -d $last_dir) { + if ( defined $last_dir && -d $last_dir ) { my $curdir = Glib::IO::File::new_for_path($last_dir); $dialog->set_initial_folder($curdir); - $dialog->set_initial_name( path($self->_file)->basename ); + $dialog->set_initial_name( path( $self->_file )->basename ); } $dialog->save( $win, undef, sub { my ( $self_dialog, $res ) = @_; - if ($res->had_error) { + if ( $res->had_error ) { return; } my $file = $dialog->save_finish($res); return if !defined $file; $file = path( $file->get_path ); - $options->set_last_dir_save($file->parent.''); - $self->_save->save( $file); + $options->set_last_dir_save( $file->parent . '' ); + $self->_save->save($file); } ); } @@ -202,20 +207,21 @@ sub save { sub open_file { my $self = shift; my $file = shift; - if (!-e $file) { + if ( !-e $file ) { return; } - $file = path( $file ); + $file = path($file); $self->_file($file); $self->start_editing_file; } sub start_editing_file { - my $self = shift; - my $file = $self->_file; - my $save_as = $self->_save_as; - my $box_app = Gtk4::Box->new( 'vertical', 0 ); - $self->_save(GEmeTool::Save->instance($file)); + my $self = shift; + my $file = $self->_file; + my $save_as_action = $self->_save_as_action; + my $pc_action = $self->_pc_action; + my $box_app = Gtk4::Box->new( 'vertical', 0 ); + $self->_save( GEmeTool::Save->instance($file) ); my $save_obj = $self->_save; my $search = Gtk4::SearchBar->new; @@ -229,11 +235,10 @@ sub start_editing_file { my $populate_func = sub { my $box_flags = Gtk4::Box->new( 'vertical', 0 ); - for my $rematch (@{$self->_save->get_rematches_save}) - { - my $name = $rematch->{name}; - my $value = $rematch->{value}; - my $id = $rematch->{id}; + for my $rematch ( @{ $self->_save->get_rematches_save } ) { + my $name = $rematch->{name}; + my $value = $rematch->{value}; + my $id = $rematch->{id}; my $buffer = $entry->get_buffer; my $search_text = uc( $buffer->get_text ); next unless index( $name, $search_text ) >= 0; @@ -242,24 +247,24 @@ sub start_editing_file { $toggle->signal_connect( toggled => sub { my $active = $toggle->get_active; - $self->_save->set_rematch($id, $active); + $self->_save->set_rematch( $id, $active ); } ); $box_flags->append($toggle); } - for my $flag (@{$self->_save->get_flags_save}) { - my $name = $flag->{name}; - my $value = $flag->{value}; - my $id = $flag->{id}; + for my $flag ( @{ $self->_save->get_flags_save } ) { + my $name = $flag->{name}; + my $value = $flag->{value}; + my $id = $flag->{id}; my $buffer = $entry->get_buffer; my $search_text = uc( $buffer->get_text ); next unless index( $name, $search_text ) >= 0; my $toggle = Gtk4::ToggleButton->new_with_label($name); - $toggle->set_active( $value ); + $toggle->set_active($value); $toggle->signal_connect( toggled => sub { my $active = $toggle->get_active; - $self->_save->set_flag($id, $active); + $self->_save->set_flag( $id, $active ); } ); @@ -276,7 +281,8 @@ sub start_editing_file { $box_app->append($scroll); my $win = $self->_win; $win->set_child($box_app); - $save_as->set_enabled(1); + $save_as_action->set_enabled(1); + $pc_action->set_enabled(1); } @@ -311,4 +317,9 @@ sub activate_about { # $about->set_titlebar($header_bar); $about->present; } + +sub activate_view_pc { + my $self = shift; + GEmeTool::View::PokemonPCWindow->new( _save => $self->_save )->start; +} 1; diff --git a/lib/GEmeTool/View/PokemonEditorWindow.pm b/lib/GEmeTool/View/PokemonEditorWindow.pm new file mode 100644 index 0000000..e4f23ef --- /dev/null +++ b/lib/GEmeTool/View/PokemonEditorWindow.pm @@ -0,0 +1,482 @@ +package GEmeTool::View::PokemonEditorWindow; + +use v5.16.3; + +use strict; +use warnings; +use utf8; + +use Moo; + +use Glib::Object::Introspection; +use Glib::IO; +use Path::Tiny; + +use Rsaves; +use Rsaves::Constants::Emerald::Species; +use Rsaves::Constants::Emerald::Natures; + +Glib::Object::Introspection->setup( + basename => 'Gtk', + version => '4.0', + package => 'Gtk4', +); + +Glib::Object::Introspection->setup( + basename => 'Gdk', + version => '4.0', + package => 'Gdk', +); + +has pokemon => ( + is => 'ro', + required => 1, +); + +has _win => ( is => 'rw', ); + +has _selected_species => ( is => 'rw', ); + +has _save_callbacks => ( is => 'rw', default => sub { [] } ); + +has _current_personality => ( is => 'rw' ); + +has _iv_buffers => ( is => 'rw', default => sub { {} } ); +has _ev_buffers => ( is => 'rw', default => sub { {} } ); + +my $root = path(__FILE__)->parent->parent->parent->parent; +my $width = 600; +my $height = 400; + +my @stats = + ( 'HP', 'Attack', 'Defense', 'Speed', 'SpecialAttack', 'SpecialDefense' ); + +sub start { + my $self = shift; + my $window = Gtk4::Window->new; + $self->_win($window); + $self->draw; + $window->present; +} + +sub onSave { + my $self = shift; + my $func = shift; + my $save_callbacks = $self->_save_callbacks; + push @$save_callbacks, $func; +} + +sub draw { + my $self = shift; + my $window = $self->_win; + $window->set_resizable(0); + my $pokemon = $self->pokemon; + $window->set_title( 'Editing Pokémon ' + . Rsaves::translate_3rd_encoding( $pokemon->nickname ) ); + $self->_current_personality( $pokemon->personality ); + my $grid = Gtk4::Grid->new; + $grid->set_column_homogeneous(1); + my $canvas = Gtk4::DrawingArea->new; + $canvas->set_content_width(267); + $canvas->set_content_height(267); + $canvas->set_valign('start'); + $canvas->set_halign('start'); + $canvas->set_draw_func( + sub { + my $canvas = shift; + my $cairo = shift; + my $width = shift; + my $height = shift; + $cairo->scale( $width / 64, $height / 64 ); + my $surface = Cairo::ImageSurface->create_from_png( + $root->child( $pokemon->get_front ) ); + $cairo->set_source_surface( $surface, 0, 0 ); + $cairo->get_source()->set_filter('nearest'); + $cairo->paint; + } + ); + $grid->attach( $canvas, 0, 0, 2, 2 ); + my @species = (@Rsaves::Constants::Emerald::Species::SPECIES); + my $string_list = Gtk4::StringList->new( [@species] ); + my $save_button = Gtk4::Button->new_with_label('Save changes'); + $self->_selected_species( $pokemon->species ); + my $box_right_image = Gtk4::Box->new( 'vertical', 1 ); + $box_right_image->set_margin_top(30); + $box_right_image->set_valign('start'); + $box_right_image->set_halign('start'); + my $box_ev = Gtk4::Box->new('vertical', 1); + $grid->attach( $box_right_image, 2, 0, 2, 2 ); + $grid->attach( $box_ev, 4, 0, 2, 2 ); + $box_ev->append(Gtk4::Label->new('Select EV')); + $self->create_select_level($box_ev); + $self->create_select_evs($box_ev); + $self->create_change_nickname_entry($box_right_image); + $save_button->signal_connect( + clicked => sub { + $pokemon->species( $self->_selected_species ); + $pokemon->personality( $self->_current_personality ); + $self->recalculate_ivs; + $self->recalculate_evs; + for my $func ( @{ $self->_save_callbacks } ) { + $func->(); + } + $self->draw; + } + ); + $self->draw_dropdown_pokemon_list($box_right_image); + $box_right_image->append(Gtk4::Label->new('Select IV')); + $self->create_select_ivs($box_right_image); + $self->create_modify_personality($grid); + $grid->attach( $save_button, 4, 7, 1, 1 ); + $window->set_child($grid); +} + +sub create_select_level { + my $self = shift; + my $box = shift; + my $pokemon = $self->pokemon; + my $box_level = Gtk4::Box->new('horizontal', 10); + $box_level->append(Gtk4::Label->new('Lvl:')); + my $entry = Gtk4::Entry->new; + $entry->set_input_purpose('digits'); + $entry->get_buffer->set_text($pokemon->level, length $pokemon->level); + $box_level->append($entry); + $self->onSave( sub { + my $text = $entry->get_buffer->get_text; + if ($text !~ /^[0-9]+$/) { + return; + } + if ($text > 100) { + $text = 100; + } + if ($text < 2) { + $text = 2; + } + $pokemon->level($text); + }); + $box->append($box_level); +} + +sub recalculate_evs { + my $self = shift; + my $pokemon = $self->pokemon; + for my $key ( @stats ) { + my $text = $self->_ev_buffers->{$key}->get_text; + next if $text !~ /^[0-9]+$/; + if ($text > 255) { + $text = 255; + } + if ($text < 0) { + $text = 0; + } + $pokemon->evs( + { + $key => $text, + } + ); + } +} + +sub recalculate_ivs { + my $self = shift; + my $pokemon = $self->pokemon; + for my $key ( @stats ) { + my $text = $self->_iv_buffers->{$key}->get_text; + next if $text !~ /^[0-9]+$/; + if ($text > 31) { + $text = 31; + } + if ($text < 0) { + $text = 0; + } + $pokemon->ivs( + { + $key => $text, + } + ); + } +} + +sub create_select_evs { + my $self = shift; + my $box = shift; + my $ev_buffers = $self->_ev_buffers; + my $evs = $self->pokemon->evs; + + for my $stat (@stats) { + my $box_stat = Gtk4::Box->new( 'horizontal', 10 ); + my $entry = Gtk4::Entry->new; + $entry->set_input_purpose('digits'); + $entry->get_buffer->set_text( $evs->{$stat}, length $evs->{$stat} ); + $box_stat->append( Gtk4::Label->new($stat) ); + $box_stat->append($entry); + $ev_buffers->{$stat} = $entry->get_buffer; + $box->append($box_stat); + } +} + +sub create_select_ivs { + my $self = shift; + my $box = shift; + my $iv_buffers = $self->_iv_buffers; + my $ivs = $self->pokemon->ivs; + + for my $stat (@stats) { + my $box_stat = Gtk4::Box->new( 'horizontal', 10 ); + my $entry = Gtk4::Entry->new; + $entry->set_input_purpose('digits'); + $entry->get_buffer->set_text( $ivs->{$stat}, length $ivs->{$stat} ); + $box_stat->append( Gtk4::Label->new($stat) ); + $box_stat->append($entry); + $iv_buffers->{$stat} = $entry->get_buffer; + $box->append($box_stat); + } +} + +sub create_modify_personality { + my $self = shift; + my $grid = shift; + my $button = Gtk4::Button->new_with_label('Edit personality'); + $button->signal_connect( + clicked => sub { + $self->open_window_personality; + } + ); + $button->set_valign('start'); + $button->set_halign('start'); + $grid->attach( $button, 2, 2, 1, 1 ); +} + +sub open_window_personality { + my $self = shift; + my $window = Gtk4::Window->new; + $window->set_default_size( 600, 600 ); + my $scroll = Gtk4::ScrolledWindow->new; + my $box_window = Gtk4::Box->new( 'vertical', 1 ); + $box_window->append( Gtk4::Label->new('Select shiny') ); + + my $box_shiny = Gtk4::Box->new( 'horizontal', 1 ); + my $shiny_dont_mind = Gtk4::ToggleButton->new_with_label('Do not matter'); + my $shiny_yes = Gtk4::ToggleButton->new_with_label('Yes'); + my $shiny_no = Gtk4::ToggleButton->new_with_label('No'); + + $shiny_dont_mind->set_active(1); + + $shiny_yes->set_group($shiny_dont_mind); + $shiny_no->set_group($shiny_dont_mind); + + $box_shiny->append($shiny_dont_mind); + $box_shiny->append($shiny_yes); + $box_shiny->append($shiny_no); + + $box_window->append($box_shiny); + $box_window->append( Gtk4::Label->new('Select gender') ); + + my $box_gender = Gtk4::Box->new( 'horizontal', 1 ); + my $gender_dont_mind = Gtk4::ToggleButton->new_with_label('Do not matter'); + my $gender_male = Gtk4::ToggleButton->new_with_label('Male'); + my $gender_female = Gtk4::ToggleButton->new_with_label('Female'); + + $gender_female->set_group($gender_male); + $gender_dont_mind->set_group($gender_male); + + $gender_dont_mind->set_active(1); + + $box_gender->append($gender_dont_mind); + $box_gender->append($gender_male); + $box_gender->append($gender_female); + + $box_window->append($box_gender); + + $box_window->append( Gtk4::Label->new('Select nature') ); + + my $box_natures = Gtk4::Box->new( 'vertical', 1 ); + my @natures = @Rsaves::Constants::Emerald::Natures::NATURES; + my %toggle_nature = + map { $_ => Gtk4::ToggleButton->new_with_label($_) } @natures; + + my $nature_dont_mind = Gtk4::ToggleButton->new_with_label('Do not matter'); + $nature_dont_mind->set_active(1); + + $box_natures->append($nature_dont_mind); + + for my $nature (@natures) { + my $toggle = $toggle_nature{$nature}; + $toggle->set_group($nature_dont_mind); + $box_natures->append($toggle); + } + + $box_window->append($box_natures); + + my $button_generate = Gtk4::Button->new_with_label('Generate personality'); + $button_generate->signal_connect( + clicked => sub { + my @gender_buttons = ( $gender_male, $gender_female ); + my $target_shiny = undef; + my $target_gender = undef; + my $target_nature = undef; + if ( $shiny_yes->get_active ) { + $target_shiny = 1; + } + if ( $shiny_no->get_active ) { + $target_shiny = 0; + } + for my $i ( 0 .. 1 ) { + if ( $gender_buttons[$i]->get_active ) { + $target_gender = $i; + last; + } + } + for my $i ( 0 .. 24 ) { + if ( $toggle_nature{ $natures[$i] }->get_active ) { + $target_nature = $i; + last; + } + } + my $personality = + $self->pokemon->generate_personality( $target_shiny, + $target_gender, $target_nature ); + if ( defined $personality ) { + $self->_current_personality($personality); + } + $window->close; + } + ); + $box_window->append($button_generate); + $scroll->set_child($box_window); + $window->set_child($scroll); + $window->present; +} + +sub create_change_nickname_entry { + my $self = shift; + my $box = shift; + my $pokemon = $self->pokemon; + my $label = Gtk4::Label->new('Change the nickname:'); + my $entry = Gtk4::Entry->new; + my $nickname = Rsaves::translate_3rd_encoding( $pokemon->nickname ); + my $box_nickname = Gtk4::Box->new( 'horizontal', 10 ); + $entry->get_buffer->set_text( $nickname, length $nickname ); + $entry->set_halign('start'); + $entry->set_valign('start'); + $label->set_halign('start'); + $label->set_valign('start'); + $box_nickname->append($label); + $box_nickname->append($entry); + $box->append($box_nickname); + $self->onSave( + sub { + my $translated_nickname = + Rsaves::to_3rd_encoding( $entry->get_buffer->get_text ); + if ( length $translated_nickname < 10 ) { + $translated_nickname .= chr(0xff); + my $length = length $translated_nickname; + $translated_nickname .= ( chr(0x00) ) x ( 10 - $length ); + } + if ( length $translated_nickname > 10 ) { + $translated_nickname = substr $translated_nickname, 0, 10; + } + $pokemon->nickname($translated_nickname); + } + ); + +} + +sub draw_dropdown_pokemon_list { + my $self = shift; + my $box = shift; + my $pokemon = $self->pokemon; + my $button_box = Gtk4::Box->new( 'horizontal', 1 ); + my $box_popover = Gtk4::Box->new( 'vertical', 1 ); + my $search_bar = Gtk4::SearchBar->new; + my $entry_search = Gtk4::SearchEntry->new; + my $button = Gtk4::ToggleButton->new; + my $popover_dropdown = Gtk4::Popover->new; + my $label_pokemon = + $self->label_pokemon( $pokemon->pokemon_name, $button_box ); + my $scroll = Gtk4::ScrolledWindow->new; + my $box_pokemons = Gtk4::Box->new( 'vertical', 1 ); + my @species = (@Rsaves::Constants::Emerald::Species::SPECIES); + + my $func_on_select_dropdown = sub { + my $number = shift; + $label_pokemon->set_text( $species[$number] ); + $self->_selected_species($number); + $popover_dropdown->popdown; + }; + $entry_search->signal_connect( + 'search-changed' => sub { + my $box_pokemons = Gtk4::Box->new( 'vertical', 1 ); + $box_pokemons->set_vexpand(1); + $self->fill_dropdown( $box_pokemons, $func_on_select_dropdown, + $entry_search->get_text ); + $scroll->set_child($box_pokemons); + } + ); + + $button_box->append($label_pokemon); + $button_box->append( Gtk4::Image->new_from_icon_name('pan-down-symbolic') ); + $button->set_child($button_box); + $search_bar->set_child($entry_search); + $search_bar->set_search_mode(1); + $box_popover->append($search_bar); + $box_pokemons->set_vexpand(1); + $self->fill_dropdown( $box_pokemons, $func_on_select_dropdown ); + $scroll->set_child($box_pokemons); + $box_popover->append($scroll); + $box_popover->set_vexpand(1); + $popover_dropdown->set_child($box_popover); + $button->signal_connect( + clicked => sub { + $popover_dropdown->popup; + } + ); + $popover_dropdown->set_size_request( 100, 400 ); + $button_box->append($popover_dropdown); + my $label_button = Gtk4::Label->new('Change species:'); + my $box_dropdown = Gtk4::Box->new( 'horizontal', 10 ); + $box_dropdown->append($label_button); + $box_dropdown->append($button); + $box->append($box_dropdown); + $label_button->set_valign('start'); + $label_button->set_halign('start'); + $button->set_valign('start'); + $button->set_halign('start'); +} + +sub fill_dropdown { + my $self = shift; + my $box = shift; + my $func = shift; + my $filter = shift; + my @species = (@Rsaves::Constants::Emerald::Species::SPECIES); + for ( my $i = 0 ; $i < scalar @species ; $i++ ) { + my $number = $i; + if ( defined $filter + && !( index( lc( $species[$i] ), lc($filter) ) >= 0 ) ) + { + next; + } + my $label = Gtk4::Button->new_with_label( $species[$i] ); + my $controller_gesture = Gtk4::GestureClick->new; + $controller_gesture->set_button(1); + $controller_gesture->signal_connect( + pressed => sub { + $func->($number); + } + ); + $label->add_controller($controller_gesture); + $box->append($label); + } +} + +sub label_pokemon { + my $self = shift; + my $name = shift; + my $button_box = shift; + my $label = Gtk4::Label->new($name); + $label->set_hexpand(1); + $label->set_halign('start'); + return $label; +} +1; diff --git a/lib/GEmeTool/View/PokemonPCWindow.pm b/lib/GEmeTool/View/PokemonPCWindow.pm new file mode 100644 index 0000000..16bea79 --- /dev/null +++ b/lib/GEmeTool/View/PokemonPCWindow.pm @@ -0,0 +1,436 @@ +package GEmeTool::View::PokemonPCWindow; + +use v5.16.3; + +use strict; +use warnings; +use utf8; + +use Cairo::GObject; +use Glib; +use Glib::Object::Introspection; +use Glib::IO; +use Path::Tiny; +use Math::Trig; +use Rsaves; + +use Moo; + +use GEmeTool::View::PokemonEditorWindow; + +Glib::Object::Introspection->setup( + basename => 'Gtk', + version => '4.0', + package => 'Gtk4', +); + +Glib::Object::Introspection->setup( + basename => 'Gdk', + version => '4.0', + package => 'Gdk', +); + +has _save => ( + is => 'ro', + required => 1, +); + +has _win => ( + is => 'rw', +); + +has _current_box => ( is => 'rw', ); + +my $BOX_X = 275; +my $BOX_Y = 50; +my $BOX_WIDTH = 312; +my $BOX_HEIGHT = 340; + +my $ARROW_X = 28; +my $ARROW_Y = 6; +my $ARROW_WIDTH = 16; +my $ARROW_HEIGHT = 32; +my ($CLOSE_BOX_X, $CLOSE_BOX_Y, $CLOSE_BOX_WIDTH, $CLOSE_BOX_HEIGHT) = (420, 0, 180, 40); + +has _cursor_position => ( is => 'rw' ); + +my $root = path(__FILE__)->parent->parent->parent->parent; + +sub start { + my $self = shift; + my $gtk_window = Gtk4::Window->new; + $self->_win($gtk_window); + my $controller_motion = Gtk4::EventControllerMotion->new; + my $controller_gesture = Gtk4::GestureClick->new; + my $save = $self->_save; + my $pc = $save->get_pc_system; + my $box = $pc->get_box(0); + my $headerbar = Gtk4::HeaderBar->new; + $headerbar->set_decoration_layout(''); + my $title_grid = Gtk4::Grid->new; + $title_grid->attach(Gtk4::Label->new('Pokémon Storage System'), 0, 0, 12, 1); + my $save_button = Gtk4::Button->new_with_label('Save'); + $save_button->signal_connect(clicked => sub { + $self->_save->get_pc_system->save; + }); + $title_grid->attach($save_button, 0, 1, 2, 1); + $headerbar->set_title_widget($title_grid); + $gtk_window->set_titlebar($headerbar); + $controller_gesture->set_button(1); + $self->_current_box($box); + $controller_gesture->signal_connect( + pressed => sub { + $self->_on_primary_click(@_); + } + ); + $controller_motion->signal_connect( + motion => sub { + my ( $x, $y ) = @_[ 1, 2 ]; + $self->_cursor_position( [ $x, $y ] ); + } + ); + my $canvas = Gtk4::DrawingArea->new; + $canvas->add_controller($controller_motion); + $canvas->add_controller($controller_gesture); + my $scale_factor_pc = 2.5; + my ( $width, $height ) = map { $_ * $scale_factor_pc } ( 256, 158 ); + $gtk_window->set_default_size( $width, $height ); + $gtk_window->set_resizable(0); + $canvas->set_draw_func( + sub { + my $canvas = shift; + my $cairo = shift; + my $width = shift; + my $height = shift; + + my $selected_pokemon = $self->get_selected_pokemon; + $self->draw_pc( $cairo, $scale_factor_pc ); + { + my $output_box = + Cairo::ImageSurface->create( 'argb32', $BOX_WIDTH, + $BOX_HEIGHT ); + my $box_context = Cairo::Context->create($output_box); + $self->draw_box($box_context); + $self->draw_pokemon( $box_context, $selected_pokemon ); + $self->draw_box_name($box_context); + $cairo->set_source_surface( $output_box, $BOX_X, $BOX_Y ); + $cairo->paint; + } + $self->draw_pokemon_details( $cairo, $selected_pokemon ); + $self->draw_not_implemented($cairo); + $self->draw_cursor($cairo); + } + ); + $gtk_window->set_child($canvas); + $gtk_window->present; + Glib::Timeout->add( + 1000 / 15, + sub { + $canvas->queue_draw; + return 1; + } + ); +} + +sub draw_not_implemented { + my $self = shift; + my $cairo = shift; + $cairo->rectangle(200, 0, 180, 40); + $cairo->set_source_rgb(0, 0, 0); + $cairo->fill; + $cairo->set_source_rgb(1, 1, 1); + $cairo->set_font_size(20); + $cairo->move_to( 200, 30); + $cairo->text_path("Not implemented"); + $cairo->fill; +} + + +sub _on_primary_click { + my $self = shift; + my ( $gesture, $n_press, $x, $y ) = @_; + return if $self->_check_click_next_prev_box( $gesture, $n_press, $x, $y ); + return if $self->_check_click_close_box($gesture, $n_press, $x, $y); + return if $self->_check_selected_pokemon; +} + +sub _check_selected_pokemon { + my $self = shift; + if (defined $self->get_selected_pokemon) { + my $editor = GEmeTool::View::PokemonEditorWindow->new(pokemon => $self->get_selected_pokemon); + $editor->start; + } + return 1; +} + +sub _check_click_close_box { + my $self = shift; + my ( $gesture, $n_press, $x, $y ) = @_; + my $match_x = $x >= $CLOSE_BOX_X && $x <= $CLOSE_BOX_WIDTH + $CLOSE_BOX_X; + my $match_y = $y >= $CLOSE_BOX_Y && $y <= $CLOSE_BOX_HEIGHT + $CLOSE_BOX_Y; + if ($match_x && $match_y) { + $self->_win->close; + return 1; + } + return; +} + +sub _check_click_next_prev_box { + my $self = shift; + my ( $gesture, $n_press, $x, $y ) = @_; + + return if $x < $BOX_X; + return if $y < $BOX_Y; + + $x -= $BOX_X; + $y -= $BOX_Y; + + return if $x >= $BOX_WIDTH; + return if $y >= $BOX_HEIGHT; + + my $x_matches = + $x >= $BOX_WIDTH - $ARROW_X && $x <= $BOX_WIDTH - $ARROW_X + $ARROW_WIDTH; + my $y_matches = $y >= $ARROW_Y && $y <= $ARROW_Y + $ARROW_HEIGHT; + if ( $x_matches && $y_matches ) { + my $box = $self->_current_box; + my $save = $self->_save; + my $pc = $save->get_pc_system; + if ( $box->number == 13 ) { + $self->_current_box( $pc->get_box(0) ); + return 1; + } + $self->_current_box( $pc->get_box( $box->number + 1 ) ); + return 1; + } + $x_matches = $x >= $ARROW_X - $ARROW_WIDTH && $x <= $ARROW_X; + $y_matches = $y >= $ARROW_Y && $y <= $ARROW_Y + $ARROW_HEIGHT; + if ( $x_matches && $y_matches ) { + my $box = $self->_current_box; + my $save = $self->_save; + my $pc = $save->get_pc_system; + if ( $box->number == 0 ) { + $self->_current_box( $pc->get_box(13) ); + return 1; + } + $self->_current_box( $pc->get_box( $box->number - 1 ) ); + return 1; + } +} + +sub draw_pokemon_details { + my $self = shift; + my $cairo = shift; + my $selected_pokemon = shift; + return if !defined $selected_pokemon; + return if $selected_pokemon->species == 0; + my $output_image = Cairo::ImageSurface->create( 'argb32', 64, 64 ); + my $image_context = Cairo::Context->create($output_image); + my $surface = Cairo::ImageSurface->create_from_png( + $root->child( $selected_pokemon->get_front ) ); + my $scale_factor = 2; + $cairo->scale( ($scale_factor) x 2 ); + $image_context->set_source_surface( $surface, 0, 0 ); + $image_context->get_source()->set_filter('nearest'); + $image_context->paint; + $cairo->set_source_surface( $output_image, 20, 30 ); + $cairo->get_source()->set_filter('nearest'); + $cairo->paint; + + my $pokemon_species = $Rsaves::Constants::Emerald::Species::SPECIES[$selected_pokemon->species]; + $cairo->select_font_face( 'Sans', 'normal', 'normal' ); + $cairo->set_source_rgb( 1, 1, 1 ); + $cairo->set_font_size(8); + $cairo->move_to( 5, 120 ); + $cairo->text_path(Rsaves::translate_3rd_encoding($selected_pokemon->nickname)); + $cairo->fill; + + $cairo->move_to( 5, 128 ); + $cairo->text_path('/'.$pokemon_species); + $cairo->set_source_rgb( 1, 1, 1 ); + $cairo->fill; +# $cairo->set_source_rgb( 0, 0, 0 ); +# $cairo->set_line_width(0.8); +# $cairo->stroke; + $cairo->move_to( 6, 140 ); + my $gender = $selected_pokemon->gender; + $cairo->set_font_size(15); + if ($gender == 0) { + $cairo->text_path("♂"); + $cairo->set_source_rgb( 0, 0, 1 ); + $cairo->fill; + } + if ($gender == 1) { + $cairo->text_path("♀"); + $cairo->set_source_rgb( 1, 0, 0 ); + $cairo->fill; + } + $cairo->set_source_rgb( 1, 1, 1 ); + $cairo->set_font_size(8); + $cairo->move_to( 18, 138 ); + $cairo->text_path("Lv@{[$selected_pokemon->level]}"); + $cairo->set_source_rgb( 1, 1, 1 ); + $cairo->fill; + + $cairo->scale( ( 1 / $scale_factor ) x 2 ); + +} + +sub draw_pc { + my $self = shift; + my $cairo = shift; + my $scale_factor = shift; + $cairo->scale( ($scale_factor) x 2 ); + my $surface = Cairo::ImageSurface->create_from_png( + $root->child('resources/pc_background.png') ); + $cairo->set_source_surface( $surface, 0, 0 ); + $cairo->get_source()->set_filter('nearest'); + $cairo->paint; + $cairo->scale( ( 1 / $scale_factor ) x 2 ); +} + +sub draw_cursor { + my $self = shift; + my $cairo = shift; + my $cursor_png = $root->child('resources/hand_cursor.png'); + my $surface = Cairo::ImageSurface->create_from_png($cursor_png); + my $output_image = Cairo::ImageSurface->create( 'argb32', 32, 32 ); + my $image_context = Cairo::Context->create($output_image); + my $cursor_position = $self->_cursor_position; + return if !defined $cursor_position; + my $scale_factor = 0.95 * 2; + $cairo->scale( ($scale_factor) x 2 ); + my ( $x, $y ) = map { $_ / $scale_factor } @$cursor_position; + $x -= 10; + $y -= 20; + $image_context->set_source_surface( $surface, 0, 0 ); + $image_context->get_source()->set_filter('nearest'); + $image_context->paint; + my $p = 25; + $cairo->set_source_surface( $output_image, $x, $y, ); + $cairo->get_source()->set_filter('nearest'); + $cairo->paint; + $cairo->scale( ( 1 / $scale_factor ) x 2 ); +} + +sub draw_box_name { + my $self = shift; + my $cairo = shift; + my $save = $self->_save; + my $pc = $save->get_pc_system; + my $box = $self->_current_box; + my $name = Rsaves::translate_3rd_encoding( $box->name ); + my $scale_factor = 0.95 * 2; + $cairo->scale( $scale_factor, $scale_factor ); + $cairo->set_source_rgb( 0, 0, 0 ); + $cairo->select_font_face( 'monospace', 'normal', 'normal' ); + $cairo->set_font_size(20); + $cairo->move_to( 75 - ( length($name) * 5 ), 19 ); + $cairo->show_text($name); + $cairo->scale( ( 1 / $scale_factor ) x 2 ); +} + +sub draw_pokemon { + my $self = shift; + my $cairo = shift; + my $selected_pokemon = shift; + my $save = $self->_save; + my $pc = $save->get_pc_system; + my $box = $self->_current_box; + my $scale_factor = 0.95 * 2; + $cairo->scale( $scale_factor, $scale_factor ); + + for ( my $i = 0 ; $i < 5 ; $i++ ) { + + # ROW + for ( my $j = 0 ; $j < 6 ; $j++ ) { + + # COLUMN + my $pokemon = $box->get_pokemon( $i * 6 + $j ); + my $is_selected = + defined $selected_pokemon && $pokemon eq $selected_pokemon; + my $pokemon_image = $root->child( $pokemon->get_icon ); + my $p = 25; + my $x = $j * ( $p + 1 ); + my $y = 20 + ( ( $p - 3 ) * $i ); + + if ($is_selected) { + $cairo->set_source_rgb( 1, 1, 0 ); + $cairo->arc( $x + 5 + 11, $y + 10 + 11, 22 / 2, 0, pi * 2 ); + $cairo->fill; + } + + my $surface = Cairo::ImageSurface->create_from_png($pokemon_image); + my $output_image = Cairo::ImageSurface->create( 'argb32', 32, 32 ); + my $image_context = Cairo::Context->create($output_image); + $image_context->set_source_surface( $surface, 0, 0 ); + $image_context->get_source()->set_filter('nearest'); + $image_context->paint; + $cairo->set_source_surface( $output_image, $x, $y ); + $cairo->get_source()->set_filter('nearest'); + $cairo->paint; + } + } + $cairo->scale( ( 1 / $scale_factor ) x 2 ); +} + +sub get_selected_pokemon { + my $self = shift; + my $cursor_position = $self->_cursor_position; + return if !defined $cursor_position; + my ( $x, $y ) = @$cursor_position; + + return if $x < $BOX_X; + return if $y < $BOX_Y; + + $x -= $BOX_X; + $y -= $BOX_Y; + + return if $x >= $BOX_WIDTH - 13; + return if $y >= $BOX_HEIGHT; + + my $scale_factor = 0.95 * 2; + ( $x, $y ) = map { $_ / $scale_factor } ( $x, $y ); + return if $y <= 20; + $y -= 20; + + my $p = 25; + my $i = int( $y / ( $p - 3 ) ); + my $j = int( $x / ( $p + 1 ) ); + my $save = $self->_save; + my $pc = $save->get_pc_system; + my $box = $self->_current_box; + my $number = $i * 6 + $j; + return if $number > 29; + my $pokemon = $box->get_pokemon($number); + return $pokemon; +} + +sub draw_box { + my $self = shift; + my $cairo = shift; + my $surface = Cairo::ImageSurface->create_from_png( + $root->child('resources/forest.png') ); + + $cairo->scale( 2, 2 ); + $cairo->set_source_surface( $surface, 0, 0 ); + $cairo->get_source()->set_filter('nearest'); + + $cairo->paint; + $surface = Cairo::ImageSurface->create_from_png( + $root->child('resources/right_arrow_pc.png') ); + $cairo->set_source_surface( + $surface, + $BOX_WIDTH / 2 - $ARROW_X / 2, + $ARROW_Y / 2 + ); + $cairo->get_source()->set_filter('nearest'); + $cairo->paint; + $cairo->scale( -1, 1 ); + $cairo->set_source_surface( $surface, -$ARROW_X / 2, $ARROW_Y / 2 ); + $cairo->get_source()->set_filter('nearest'); + $cairo->paint; + $cairo->scale( -1, 1 ); + $cairo->scale( 1 / 2, 1 / 2 ); + +} +1; diff --git a/lib/Rsaves.pm b/lib/Rsaves.pm index a698bc9..12c4cae 100644 --- a/lib/Rsaves.pm +++ b/lib/Rsaves.pm @@ -8,15 +8,18 @@ use warnings; use feature 'signatures'; use Data::Dumper; +use utf8; use Rsaves::Constants::Ruby::Flags qw/$FLAG_SYS_HAS_EON_TICKET $FLAG_LEGENDARY_BATTLE_COMPLETED $FLAG_HIDE_LEGEND_MON_CAVE_OF_ORIGIN/; -use Rsaves::Constants::Ruby::Vars qw/ $VAR_MIRAGE_RND_H $VAR_CAVE_OF_ORIGIN_B4F_STATE $VARS_START/; +use Rsaves::Constants::Ruby::Vars + qw/ $VAR_MIRAGE_RND_H $VAR_CAVE_OF_ORIGIN_B4F_STATE $VARS_START/; use Rsaves::Constants::Global qw/$SAPPHIRE_VERSION $RUBY_VERSION $EMERALD_VERSION $FIRERED_VERSION $LEAFGREEN_VERSION $COLOSSEUM_VERSION/; -use Rsaves::Constants::Firered::Flags qw/$FLAG_RECEIVED_AURORA_TICKET $FLAG_ENABLE_SHIP_BIRTH_ISLAND $FLAG_FOUGHT_DEOXYS $FLAG_DEOXYS_FLEW_AWAY/; -use Rsaves::Constants::Firered::Vars qw/$VAR_MAP_SCENE_CERULEAN_CITY_RIVAL/; +use Rsaves::Constants::Firered::Flags + qw/$FLAG_RECEIVED_AURORA_TICKET $FLAG_ENABLE_SHIP_BIRTH_ISLAND $FLAG_FOUGHT_DEOXYS $FLAG_DEOXYS_FLEW_AWAY/; +use Rsaves::Constants::Firered::Vars qw/$VAR_MAP_SCENE_CERULEAN_CITY_RIVAL/; use Rsaves::Constants::MoveAttributes qw/get_move_attributes/; use Exporter; @@ -57,22 +60,22 @@ my $PC_BUFFER_G = 11; my $PC_BUFFER_H = 12; my $PC_BUFFER_I = 13; my ( $FEMALE, $MALE ) = ( 1, 0 ); -my $FLAGS_OFFSET_RUBY = hex '1220'; -my $FLAGS_OFFSET_FIRERED = 0x0ee0; -my $FLAGS_OFFSET_EMERALD = 0x1270; -my $TRAINER_FLAG_START = hex '500'; -my $NUMBER_OF_TRAINERS = 693; -my $KEY_ITEMS_OFFSET_RUBY = 0x5b0; -my $KEY_ITEMS_OFFSET_FIRERED = 0x03b8; -my $MAX_KEY_ITEMS_RUBY = 20; -my $MAX_KEY_ITEMS_FIRERED = 30; -my $ITEM_EON_TICKET = 275; -my $ITEM_AURORA_TICKET = 371; -my $POKEMON_NAME_LENGTH = 10; -my $OT_NAME_LENGTH = 7; -my $BOX_NAME_LENGTH = 9; -my $RUBY_VARS_START = 0x1340; -my $FIRERED_VARS_START = 0x1000; +my $FLAGS_OFFSET_RUBY = hex '1220'; +my $FLAGS_OFFSET_FIRERED = 0x0ee0; +my $FLAGS_OFFSET_EMERALD = 0x1270; +my $TRAINER_FLAG_START = hex '500'; +my $NUMBER_OF_TRAINERS = 693; +my $KEY_ITEMS_OFFSET_RUBY = 0x5b0; +my $KEY_ITEMS_OFFSET_FIRERED = 0x03b8; +my $MAX_KEY_ITEMS_RUBY = 20; +my $MAX_KEY_ITEMS_FIRERED = 30; +my $ITEM_EON_TICKET = 275; +my $ITEM_AURORA_TICKET = 371; +my $POKEMON_NAME_LENGTH = 10; +my $OT_NAME_LENGTH = 7; +my $BOX_NAME_LENGTH = 9; +my $RUBY_VARS_START = 0x1340; +my $FIRERED_VARS_START = 0x1000; my %CHECKSUM_BYTES = ( $TRAINER_INFO => hex 'F80', @@ -114,9 +117,11 @@ sub parse_version_name { } sub pokemon_fill_pp($pokemon) { + # Not taking pp bonuses in account, work for other day. - for my $number_movement (0..3) { - my $movement_id = $pokemon->{substructures}[1]{movements}[$number_movement]; + for my $number_movement ( 0 .. 3 ) { + my $movement_id = + $pokemon->{substructures}[1]{movements}[$number_movement]; my $pp = get_move_attributes($movement_id)->{'pp'}; $pokemon->{substructures}[1]{pp}[$number_movement] = $pp; } @@ -137,6 +142,18 @@ sub calculate_shiny_personality { return ( $wanted_high_personality << 16 ) | _lowhalf_u32($personality); } +sub pokemon_is_shiny { + my $pokemon = shift; + return is_shiny(@{$pokemon}{ 'otid', 'personality' }); +} + +sub is_shiny { + my $otid = shift; + my $personality = shift; + return ( _lowhalf_u32($personality) ^ _hihalf_u32($personality) + ^ _lowhalf_u32($otid) ^ _hihalf_u32($otid) ) < 8; +} + sub get_first_super_data { my $save = shift; my @sections = _find_sections_save( $save, 1 .. 4 ); @@ -273,11 +290,11 @@ sub _write_pokemon_fh { print $fh pack 'V', $pokemon->{personality}; print $fh pack 'V', $pokemon->{otid}; my $nickname = $pokemon->{nickname}; - if (length $nickname < 10) { + if ( length $nickname < 10 ) { $nickname .= chr(0xff); my $to_add = 10 - length $nickname; - for (my $i = 0; $i < $to_add; $i++) { - $nickname .= chr(int(rand(256))); + for ( my $i = 0 ; $i < $to_add ; $i++ ) { + $nickname .= chr( int( rand(256) ) ); } } print $fh $nickname; @@ -430,7 +447,7 @@ sub _pokemon_checksum_substructures_fh { for ( 0 .. 3 ) { for ( 0 .. 5 ) { read $fh, my $read, 2 or die "Unable to read"; - $checksum = 0xffff & (( unpack 'v', $read ) + $checksum ); + $checksum = 0xffff & ( ( unpack 'v', $read ) + $checksum ); } } return $checksum; @@ -464,10 +481,20 @@ sub _write_pokemon_substruct_fh { $translate_real_table{$char} = chr($counter); $counter++; } + $counter = 0xa1; + for my $char ( '0' .. '9' ) { + $translate_encoding_table{ chr($counter) } = $char; + $translate_real_table{$char} = chr($counter); + $counter++; + } $translate_real_table{'♂'} = chr(0xB5); $translate_real_table{'♀'} = chr(0xB6); + $translate_real_table{'-'} = chr(0xae); + $translate_real_table{'.'} = chr(0xad); $translate_encoding_table{ chr(0xB5) } = '♂'; $translate_encoding_table{ chr(0xB6) } = '♀'; + $translate_encoding_table{ chr(0xae) } = '-'; + $translate_encoding_table{ chr(0xad) } = '.'; } sub to_3rd_encoding { @@ -791,12 +818,12 @@ sub enable_eon_ticket { sub match_again_rival_firered_cerulean { my $save = shift; my $section0 = _find_section_save( $save, 0 ); - my $version = $section0->{version}; + my $version = $section0->{version}; die "This is not Pokemon Leafgreen or Firered" - if !_is_leafgreen_or_firered($version); + if !_is_leafgreen_or_firered($version); my $superdata = get_first_super_data($save); - set_var( $save, $superdata, $VAR_MAP_SCENE_CERULEAN_CITY_RIVAL, 0 ); - set_first_super_data($save, $superdata); + set_var( $save, $superdata, $VAR_MAP_SCENE_CERULEAN_CITY_RIVAL, 0 ); + set_first_super_data( $save, $superdata ); } sub enable_deoxys_firered { @@ -805,10 +832,10 @@ sub enable_deoxys_firered { die "This is not Pokemon Leafgreen or Firered" if !_is_leafgreen_or_firered( $section0->{version} ); my $superdata = get_first_super_data($save); - set_flag_id( $save, $superdata, $FLAG_RECEIVED_AURORA_TICKET, 1 ); + set_flag_id( $save, $superdata, $FLAG_RECEIVED_AURORA_TICKET, 1 ); set_flag_id( $save, $superdata, $FLAG_ENABLE_SHIP_BIRTH_ISLAND, 1 ); - set_flag_id( $save, $superdata, $FLAG_FOUGHT_DEOXYS, 0 ); - set_flag_id( $save, $superdata, $FLAG_DEOXYS_FLEW_AWAY, 0 ); + set_flag_id( $save, $superdata, $FLAG_FOUGHT_DEOXYS, 0 ); + set_flag_id( $save, $superdata, $FLAG_DEOXYS_FLEW_AWAY, 0 ); add_key_item( $save, $superdata, $ITEM_AURORA_TICKET ); set_first_super_data( $save, $superdata ); } @@ -857,14 +884,15 @@ sub enable_rematch_main_legendary { sub get_security_key { my $save = shift; my $section0 = _find_section_save( $save, 0 ); - my $version = $section0->{version}; - my $data = $section0->{data}; + my $version = $section0->{version}; + my $data = $section0->{data}; open my $fh, '<', \$data; - if (_is_leafgreen_or_firered($version)) { + if ( _is_leafgreen_or_firered($version) ) { read $fh, my $read, 0xf20; - read $fh, $read, 4; + read $fh, $read, 4; return unpack 'V', $read; - } elsif (_is_ruby_or_sapphire($version)) { + } + elsif ( _is_ruby_or_sapphire($version) ) { return 0; } close $fh; @@ -876,13 +904,14 @@ sub add_key_item { my $superdata = shift; my $item_id = shift; my $result = ''; - my $section0 = _find_section_save( $save, 0 ); + my $section0 = _find_section_save( $save, 0 ); my $version = $section0->{version}; open my $fh, '<', $superdata; - my $offset = $KEY_ITEMS_OFFSET_RUBY; + my $offset = $KEY_ITEMS_OFFSET_RUBY; my $max_key_items = $MAX_KEY_ITEMS_RUBY; - if (_is_leafgreen_or_firered($version)) { - $offset = $KEY_ITEMS_OFFSET_FIRERED; + + if ( _is_leafgreen_or_firered($version) ) { + $offset = $KEY_ITEMS_OFFSET_FIRERED; $max_key_items = $MAX_KEY_ITEMS_FIRERED; } read $fh, my ($read), $offset; @@ -899,7 +928,7 @@ sub add_key_item { } $result .= $read; read $fh, $read, 2; - my $quantity = get_security_key($save) ^ (unpack 'v', $read); + my $quantity = get_security_key($save) ^ ( unpack 'v', $read ); $result .= $read; if ( $found_item == $item_id ) { warn "$item_id already present with $quantity."; @@ -914,16 +943,20 @@ sub add_key_item { } sub get_var { - my $save = shift; - my $superdata = shift; - my $var = shift; - my $section0 = _find_section_save( $save, 0 ); + my $save = shift; + my $superdata = shift; + my $var = shift; + my $section0 = _find_section_save( $save, 0 ); my $version = $section0->{version}; - my $read_until = ( ( $var - $Rsaves::Constants::Ruby::Vars::VARS_START ) * 2 ) + $RUBY_VARS_START; - if (_is_leafgreen_or_firered($version)) { - $read_until = ( ( $var - $Rsaves::Constants::Firered::Vars::VARS_START ) * 2 ) + $FIRERED_VARS_START; + my $read_until = + ( ( $var - $Rsaves::Constants::Ruby::Vars::VARS_START ) * 2 ) + + $RUBY_VARS_START; + if ( _is_leafgreen_or_firered($version) ) { + $read_until = + ( ( $var - $Rsaves::Constants::Firered::Vars::VARS_START ) * 2 ) + + $FIRERED_VARS_START; } - if (_is_emerald($version)) { + if ( _is_emerald($version) ) { die "Not implemented."; } open my $fh, '<', $superdata; @@ -939,17 +972,22 @@ sub set_var { my $superdata = shift; my $var = shift; my $value = shift; - my $section0 = _find_section_save( $save, 0 ); + my $section0 = _find_section_save( $save, 0 ); my $version = $section0->{version}; die "$value bigger than 0xffff" if $value > 0xffff; - my $read_until = ( ( $var - $Rsaves::Constants::Ruby::Vars::VARS_START ) * 2 ) + $RUBY_VARS_START; - if (_is_leafgreen_or_firered($version)) { - $read_until = ( ( $var - $Rsaves::Constants::Firered::Vars::VARS_START ) * 2 ) + $FIRERED_VARS_START; + my $read_until = + ( ( $var - $Rsaves::Constants::Ruby::Vars::VARS_START ) * 2 ) + + $RUBY_VARS_START; + + if ( _is_leafgreen_or_firered($version) ) { + $read_until = + ( ( $var - $Rsaves::Constants::Firered::Vars::VARS_START ) * 2 ) + + $FIRERED_VARS_START; } - if (_is_emerald($version)) { + if ( _is_emerald($version) ) { die "Not implemented."; } - my $result = shift; + my $result = shift; open my $fh, '<', $superdata; read $fh, ( my $read ), $read_until or die "Unable to read"; $result .= $read; @@ -969,7 +1007,7 @@ sub set_rematch { my $version = $section0->{version}; my $offset = 0x9ca; - if (!_is_emerald($version)) { + if ( !_is_emerald($version) ) { die 'Must be version emerald to do this.'; } my $result = ''; @@ -999,10 +1037,10 @@ sub set_flag_id { my $version = $section0->{version}; my $offset = int( $id / 8 ) + $FLAGS_OFFSET_RUBY; if ( _is_leafgreen_or_firered($version) ) { - $offset = (int $id / 8 ) + $FLAGS_OFFSET_FIRERED; + $offset = ( int $id / 8 ) + $FLAGS_OFFSET_FIRERED; } if ( _is_emerald($version) ) { - $offset = (int $id / 8 ) + $FLAGS_OFFSET_EMERALD; + $offset = ( int $id / 8 ) + $FLAGS_OFFSET_EMERALD; } my $result = ''; open my $fh, '<', $superdata; @@ -1029,12 +1067,12 @@ sub check_flag_id { my $section0 = _find_section_save( $save, 0 ); my $version = $section0->{version}; - my $offset = int( $id / 8 ) + $FLAGS_OFFSET_RUBY; + my $offset = int( $id / 8 ) + $FLAGS_OFFSET_RUBY; if ( _is_leafgreen_or_firered($version) ) { - $offset = int ($id / 8 ) + $FLAGS_OFFSET_FIRERED; + $offset = int( $id / 8 ) + $FLAGS_OFFSET_FIRERED; } - if (_is_emerald($version)) { - $offset = (int $id / 8 ) + $FLAGS_OFFSET_EMERALD; + if ( _is_emerald($version) ) { + $offset = ( int $id / 8 ) + $FLAGS_OFFSET_EMERALD; } my $flags_offset = unpack "x@{[$offset]} C", ${$superdata}; @@ -1048,11 +1086,11 @@ sub check_rematch { my $section0 = _find_section_save( $save, 0 ); my $version = $section0->{version}; - if (!_is_emerald($version)) { + if ( !_is_emerald($version) ) { die 'Must be version emerald to do this.'; } - my $offset = $id + 0x9ca - 1; + my $offset = $id + 0x9ca - 1; my $rematch_offset = unpack "x@{[$offset]} C", ${$superdata}; return $rematch_offset; @@ -1084,9 +1122,10 @@ sub _recalculate_checksum { my $readed = ''; read $fh, $readed, 4; my $to_add = unpack 'V', $readed; - $checksum = 0xffffffff & ($checksum + $to_add); + $checksum = 0xffffffff & ( $checksum + $to_add ); } - my $final_checksum = (_hihalf_u32($checksum) + _lowhalf_u32($checksum)) & 0xffffffff; + my $final_checksum = + ( _hihalf_u32($checksum) + _lowhalf_u32($checksum) ) & 0xffffffff; $section->{checksum} = $final_checksum; } diff --git a/lib/Rsaves/Constants/Emerald/Natures.pm b/lib/Rsaves/Constants/Emerald/Natures.pm new file mode 100644 index 0000000..f567122 --- /dev/null +++ b/lib/Rsaves/Constants/Emerald/Natures.pm @@ -0,0 +1,21 @@ +package Rsaves::Constants::Emerald::Natures; + +use v5.16.3; + +use strict; +use warnings; + +our @NATURES = ( + 'HARDY', 'LONELY', 'BRAVE', 'ADAMANT', 'NAUGHTY', 'BOLD', + 'DOCILE', 'RELAXED', 'IMPISH', 'LAX', 'TIMID', 'HASTY', + 'SERIOUS', 'JOLLY', 'NAIVE', 'MODEST', 'MILD', 'QUIET', + 'BASHFUL', 'RASH', 'CALM', 'GENTLE', 'SASSY', 'CAREFUL', + 'QUIRKY', +); + +our %NATURE_TO_ID; +for (my $i = 0; $i < scalar @NATURES; $i++) { + my $nature = $NATURES[$i]; + $NATURE_TO_ID{$nature} = $i; +} +1; diff --git a/lib/Rsaves/Constants/Emerald/Species.pm b/lib/Rsaves/Constants/Emerald/Species.pm new file mode 100644 index 0000000..2c8ef47 --- /dev/null +++ b/lib/Rsaves/Constants/Emerald/Species.pm @@ -0,0 +1,532 @@ +package Rsaves::Constants::Emerald::Species; + +use v5.16.3; + +use strict; +use warnings; + +our $SPECIES_NONE = 0; +our $SPECIES_BULBASAUR = 1; +our $SPECIES_IVYSAUR = 2; +our $SPECIES_VENUSAUR = 3; +our $SPECIES_CHARMANDER = 4; +our $SPECIES_CHARMELEON = 5; +our $SPECIES_CHARIZARD = 6; +our $SPECIES_SQUIRTLE = 7; +our $SPECIES_WARTORTLE = 8; +our $SPECIES_BLASTOISE = 9; +our $SPECIES_CATERPIE = 10; +our $SPECIES_METAPOD = 11; +our $SPECIES_BUTTERFREE = 12; +our $SPECIES_WEEDLE = 13; +our $SPECIES_KAKUNA = 14; +our $SPECIES_BEEDRILL = 15; +our $SPECIES_PIDGEY = 16; +our $SPECIES_PIDGEOTTO = 17; +our $SPECIES_PIDGEOT = 18; +our $SPECIES_RATTATA = 19; +our $SPECIES_RATICATE = 20; +our $SPECIES_SPEAROW = 21; +our $SPECIES_FEAROW = 22; +our $SPECIES_EKANS = 23; +our $SPECIES_ARBOK = 24; +our $SPECIES_PIKACHU = 25; +our $SPECIES_RAICHU = 26; +our $SPECIES_SANDSHREW = 27; +our $SPECIES_SANDSLASH = 28; +our $SPECIES_NIDORAN_F = 29; +our $SPECIES_NIDORINA = 30; +our $SPECIES_NIDOQUEEN = 31; +our $SPECIES_NIDORAN_M = 32; +our $SPECIES_NIDORINO = 33; +our $SPECIES_NIDOKING = 34; +our $SPECIES_CLEFAIRY = 35; +our $SPECIES_CLEFABLE = 36; +our $SPECIES_VULPIX = 37; +our $SPECIES_NINETALES = 38; +our $SPECIES_JIGGLYPUFF = 39; +our $SPECIES_WIGGLYTUFF = 40; +our $SPECIES_ZUBAT = 41; +our $SPECIES_GOLBAT = 42; +our $SPECIES_ODDISH = 43; +our $SPECIES_GLOOM = 44; +our $SPECIES_VILEPLUME = 45; +our $SPECIES_PARAS = 46; +our $SPECIES_PARASECT = 47; +our $SPECIES_VENONAT = 48; +our $SPECIES_VENOMOTH = 49; +our $SPECIES_DIGLETT = 50; +our $SPECIES_DUGTRIO = 51; +our $SPECIES_MEOWTH = 52; +our $SPECIES_PERSIAN = 53; +our $SPECIES_PSYDUCK = 54; +our $SPECIES_GOLDUCK = 55; +our $SPECIES_MANKEY = 56; +our $SPECIES_PRIMEAPE = 57; +our $SPECIES_GROWLITHE = 58; +our $SPECIES_ARCANINE = 59; +our $SPECIES_POLIWAG = 60; +our $SPECIES_POLIWHIRL = 61; +our $SPECIES_POLIWRATH = 62; +our $SPECIES_ABRA = 63; +our $SPECIES_KADABRA = 64; +our $SPECIES_ALAKAZAM = 65; +our $SPECIES_MACHOP = 66; +our $SPECIES_MACHOKE = 67; +our $SPECIES_MACHAMP = 68; +our $SPECIES_BELLSPROUT = 69; +our $SPECIES_WEEPINBELL = 70; +our $SPECIES_VICTREEBEL = 71; +our $SPECIES_TENTACOOL = 72; +our $SPECIES_TENTACRUEL = 73; +our $SPECIES_GEODUDE = 74; +our $SPECIES_GRAVELER = 75; +our $SPECIES_GOLEM = 76; +our $SPECIES_PONYTA = 77; +our $SPECIES_RAPIDASH = 78; +our $SPECIES_SLOWPOKE = 79; +our $SPECIES_SLOWBRO = 80; +our $SPECIES_MAGNEMITE = 81; +our $SPECIES_MAGNETON = 82; +our $SPECIES_FARFETCHD = 83; +our $SPECIES_DODUO = 84; +our $SPECIES_DODRIO = 85; +our $SPECIES_SEEL = 86; +our $SPECIES_DEWGONG = 87; +our $SPECIES_GRIMER = 88; +our $SPECIES_MUK = 89; +our $SPECIES_SHELLDER = 90; +our $SPECIES_CLOYSTER = 91; +our $SPECIES_GASTLY = 92; +our $SPECIES_HAUNTER = 93; +our $SPECIES_GENGAR = 94; +our $SPECIES_ONIX = 95; +our $SPECIES_DROWZEE = 96; +our $SPECIES_HYPNO = 97; +our $SPECIES_KRABBY = 98; +our $SPECIES_KINGLER = 99; +our $SPECIES_VOLTORB = 100; +our $SPECIES_ELECTRODE = 101; +our $SPECIES_EXEGGCUTE = 102; +our $SPECIES_EXEGGUTOR = 103; +our $SPECIES_CUBONE = 104; +our $SPECIES_MAROWAK = 105; +our $SPECIES_HITMONLEE = 106; +our $SPECIES_HITMONCHAN = 107; +our $SPECIES_LICKITUNG = 108; +our $SPECIES_KOFFING = 109; +our $SPECIES_WEEZING = 110; +our $SPECIES_RHYHORN = 111; +our $SPECIES_RHYDON = 112; +our $SPECIES_CHANSEY = 113; +our $SPECIES_TANGELA = 114; +our $SPECIES_KANGASKHAN = 115; +our $SPECIES_HORSEA = 116; +our $SPECIES_SEADRA = 117; +our $SPECIES_GOLDEEN = 118; +our $SPECIES_SEAKING = 119; +our $SPECIES_STARYU = 120; +our $SPECIES_STARMIE = 121; +our $SPECIES_MR_MIME = 122; +our $SPECIES_SCYTHER = 123; +our $SPECIES_JYNX = 124; +our $SPECIES_ELECTABUZZ = 125; +our $SPECIES_MAGMAR = 126; +our $SPECIES_PINSIR = 127; +our $SPECIES_TAUROS = 128; +our $SPECIES_MAGIKARP = 129; +our $SPECIES_GYARADOS = 130; +our $SPECIES_LAPRAS = 131; +our $SPECIES_DITTO = 132; +our $SPECIES_EEVEE = 133; +our $SPECIES_VAPOREON = 134; +our $SPECIES_JOLTEON = 135; +our $SPECIES_FLAREON = 136; +our $SPECIES_PORYGON = 137; +our $SPECIES_OMANYTE = 138; +our $SPECIES_OMASTAR = 139; +our $SPECIES_KABUTO = 140; +our $SPECIES_KABUTOPS = 141; +our $SPECIES_AERODACTYL = 142; +our $SPECIES_SNORLAX = 143; +our $SPECIES_ARTICUNO = 144; +our $SPECIES_ZAPDOS = 145; +our $SPECIES_MOLTRES = 146; +our $SPECIES_DRATINI = 147; +our $SPECIES_DRAGONAIR = 148; +our $SPECIES_DRAGONITE = 149; +our $SPECIES_MEWTWO = 150; +our $SPECIES_MEW = 151; +our $SPECIES_CHIKORITA = 152; +our $SPECIES_BAYLEEF = 153; +our $SPECIES_MEGANIUM = 154; +our $SPECIES_CYNDAQUIL = 155; +our $SPECIES_QUILAVA = 156; +our $SPECIES_TYPHLOSION = 157; +our $SPECIES_TOTODILE = 158; +our $SPECIES_CROCONAW = 159; +our $SPECIES_FERALIGATR = 160; +our $SPECIES_SENTRET = 161; +our $SPECIES_FURRET = 162; +our $SPECIES_HOOTHOOT = 163; +our $SPECIES_NOCTOWL = 164; +our $SPECIES_LEDYBA = 165; +our $SPECIES_LEDIAN = 166; +our $SPECIES_SPINARAK = 167; +our $SPECIES_ARIADOS = 168; +our $SPECIES_CROBAT = 169; +our $SPECIES_CHINCHOU = 170; +our $SPECIES_LANTURN = 171; +our $SPECIES_PICHU = 172; +our $SPECIES_CLEFFA = 173; +our $SPECIES_IGGLYBUFF = 174; +our $SPECIES_TOGEPI = 175; +our $SPECIES_TOGETIC = 176; +our $SPECIES_NATU = 177; +our $SPECIES_XATU = 178; +our $SPECIES_MAREEP = 179; +our $SPECIES_FLAAFFY = 180; +our $SPECIES_AMPHAROS = 181; +our $SPECIES_BELLOSSOM = 182; +our $SPECIES_MARILL = 183; +our $SPECIES_AZUMARILL = 184; +our $SPECIES_SUDOWOODO = 185; +our $SPECIES_POLITOED = 186; +our $SPECIES_HOPPIP = 187; +our $SPECIES_SKIPLOOM = 188; +our $SPECIES_JUMPLUFF = 189; +our $SPECIES_AIPOM = 190; +our $SPECIES_SUNKERN = 191; +our $SPECIES_SUNFLORA = 192; +our $SPECIES_YANMA = 193; +our $SPECIES_WOOPER = 194; +our $SPECIES_QUAGSIRE = 195; +our $SPECIES_ESPEON = 196; +our $SPECIES_UMBREON = 197; +our $SPECIES_MURKROW = 198; +our $SPECIES_SLOWKING = 199; +our $SPECIES_MISDREAVUS = 200; +our $SPECIES_UNOWN = 201; +our $SPECIES_WOBBUFFET = 202; +our $SPECIES_GIRAFARIG = 203; +our $SPECIES_PINECO = 204; +our $SPECIES_FORRETRESS = 205; +our $SPECIES_DUNSPARCE = 206; +our $SPECIES_GLIGAR = 207; +our $SPECIES_STEELIX = 208; +our $SPECIES_SNUBBULL = 209; +our $SPECIES_GRANBULL = 210; +our $SPECIES_QWILFISH = 211; +our $SPECIES_SCIZOR = 212; +our $SPECIES_SHUCKLE = 213; +our $SPECIES_HERACROSS = 214; +our $SPECIES_SNEASEL = 215; +our $SPECIES_TEDDIURSA = 216; +our $SPECIES_URSARING = 217; +our $SPECIES_SLUGMA = 218; +our $SPECIES_MAGCARGO = 219; +our $SPECIES_SWINUB = 220; +our $SPECIES_PILOSWINE = 221; +our $SPECIES_CORSOLA = 222; +our $SPECIES_REMORAID = 223; +our $SPECIES_OCTILLERY = 224; +our $SPECIES_DELIBIRD = 225; +our $SPECIES_MANTINE = 226; +our $SPECIES_SKARMORY = 227; +our $SPECIES_HOUNDOUR = 228; +our $SPECIES_HOUNDOOM = 229; +our $SPECIES_KINGDRA = 230; +our $SPECIES_PHANPY = 231; +our $SPECIES_DONPHAN = 232; +our $SPECIES_PORYGON2 = 233; +our $SPECIES_STANTLER = 234; +our $SPECIES_SMEARGLE = 235; +our $SPECIES_TYROGUE = 236; +our $SPECIES_HITMONTOP = 237; +our $SPECIES_SMOOCHUM = 238; +our $SPECIES_ELEKID = 239; +our $SPECIES_MAGBY = 240; +our $SPECIES_MILTANK = 241; +our $SPECIES_BLISSEY = 242; +our $SPECIES_RAIKOU = 243; +our $SPECIES_ENTEI = 244; +our $SPECIES_SUICUNE = 245; +our $SPECIES_LARVITAR = 246; +our $SPECIES_PUPITAR = 247; +our $SPECIES_TYRANITAR = 248; +our $SPECIES_LUGIA = 249; +our $SPECIES_HO_OH = 250; +our $SPECIES_CELEBI = 251; +our $SPECIES_OLD_UNOWN_B = 252; +our $SPECIES_OLD_UNOWN_C = 253; +our $SPECIES_OLD_UNOWN_D = 254; +our $SPECIES_OLD_UNOWN_E = 255; +our $SPECIES_OLD_UNOWN_F = 256; +our $SPECIES_OLD_UNOWN_G = 257; +our $SPECIES_OLD_UNOWN_H = 258; +our $SPECIES_OLD_UNOWN_I = 259; +our $SPECIES_OLD_UNOWN_J = 260; +our $SPECIES_OLD_UNOWN_K = 261; +our $SPECIES_OLD_UNOWN_L = 262; +our $SPECIES_OLD_UNOWN_M = 263; +our $SPECIES_OLD_UNOWN_N = 264; +our $SPECIES_OLD_UNOWN_O = 265; +our $SPECIES_OLD_UNOWN_P = 266; +our $SPECIES_OLD_UNOWN_Q = 267; +our $SPECIES_OLD_UNOWN_R = 268; +our $SPECIES_OLD_UNOWN_S = 269; +our $SPECIES_OLD_UNOWN_T = 270; +our $SPECIES_OLD_UNOWN_U = 271; +our $SPECIES_OLD_UNOWN_V = 272; +our $SPECIES_OLD_UNOWN_W = 273; +our $SPECIES_OLD_UNOWN_X = 274; +our $SPECIES_OLD_UNOWN_Y = 275; +our $SPECIES_OLD_UNOWN_Z = 276; +our $SPECIES_TREECKO = 277; +our $SPECIES_GROVYLE = 278; +our $SPECIES_SCEPTILE = 279; +our $SPECIES_TORCHIC = 280; +our $SPECIES_COMBUSKEN = 281; +our $SPECIES_BLAZIKEN = 282; +our $SPECIES_MUDKIP = 283; +our $SPECIES_MARSHTOMP = 284; +our $SPECIES_SWAMPERT = 285; +our $SPECIES_POOCHYENA = 286; +our $SPECIES_MIGHTYENA = 287; +our $SPECIES_ZIGZAGOON = 288; +our $SPECIES_LINOONE = 289; +our $SPECIES_WURMPLE = 290; +our $SPECIES_SILCOON = 291; +our $SPECIES_BEAUTIFLY = 292; +our $SPECIES_CASCOON = 293; +our $SPECIES_DUSTOX = 294; +our $SPECIES_LOTAD = 295; +our $SPECIES_LOMBRE = 296; +our $SPECIES_LUDICOLO = 297; +our $SPECIES_SEEDOT = 298; +our $SPECIES_NUZLEAF = 299; +our $SPECIES_SHIFTRY = 300; +our $SPECIES_NINCADA = 301; +our $SPECIES_NINJASK = 302; +our $SPECIES_SHEDINJA = 303; +our $SPECIES_TAILLOW = 304; +our $SPECIES_SWELLOW = 305; +our $SPECIES_SHROOMISH = 306; +our $SPECIES_BRELOOM = 307; +our $SPECIES_SPINDA = 308; +our $SPECIES_WINGULL = 309; +our $SPECIES_PELIPPER = 310; +our $SPECIES_SURSKIT = 311; +our $SPECIES_MASQUERAIN = 312; +our $SPECIES_WAILMER = 313; +our $SPECIES_WAILORD = 314; +our $SPECIES_SKITTY = 315; +our $SPECIES_DELCATTY = 316; +our $SPECIES_KECLEON = 317; +our $SPECIES_BALTOY = 318; +our $SPECIES_CLAYDOL = 319; +our $SPECIES_NOSEPASS = 320; +our $SPECIES_TORKOAL = 321; +our $SPECIES_SABLEYE = 322; +our $SPECIES_BARBOACH = 323; +our $SPECIES_WHISCASH = 324; +our $SPECIES_LUVDISC = 325; +our $SPECIES_CORPHISH = 326; +our $SPECIES_CRAWDAUNT = 327; +our $SPECIES_FEEBAS = 328; +our $SPECIES_MILOTIC = 329; +our $SPECIES_CARVANHA = 330; +our $SPECIES_SHARPEDO = 331; +our $SPECIES_TRAPINCH = 332; +our $SPECIES_VIBRAVA = 333; +our $SPECIES_FLYGON = 334; +our $SPECIES_MAKUHITA = 335; +our $SPECIES_HARIYAMA = 336; +our $SPECIES_ELECTRIKE = 337; +our $SPECIES_MANECTRIC = 338; +our $SPECIES_NUMEL = 339; +our $SPECIES_CAMERUPT = 340; +our $SPECIES_SPHEAL = 341; +our $SPECIES_SEALEO = 342; +our $SPECIES_WALREIN = 343; +our $SPECIES_CACNEA = 344; +our $SPECIES_CACTURNE = 345; +our $SPECIES_SNORUNT = 346; +our $SPECIES_GLALIE = 347; +our $SPECIES_LUNATONE = 348; +our $SPECIES_SOLROCK = 349; +our $SPECIES_AZURILL = 350; +our $SPECIES_SPOINK = 351; +our $SPECIES_GRUMPIG = 352; +our $SPECIES_PLUSLE = 353; +our $SPECIES_MINUN = 354; +our $SPECIES_MAWILE = 355; +our $SPECIES_MEDITITE = 356; +our $SPECIES_MEDICHAM = 357; +our $SPECIES_SWABLU = 358; +our $SPECIES_ALTARIA = 359; +our $SPECIES_WYNAUT = 360; +our $SPECIES_DUSKULL = 361; +our $SPECIES_DUSCLOPS = 362; +our $SPECIES_ROSELIA = 363; +our $SPECIES_SLAKOTH = 364; +our $SPECIES_VIGOROTH = 365; +our $SPECIES_SLAKING = 366; +our $SPECIES_GULPIN = 367; +our $SPECIES_SWALOT = 368; +our $SPECIES_TROPIUS = 369; +our $SPECIES_WHISMUR = 370; +our $SPECIES_LOUDRED = 371; +our $SPECIES_EXPLOUD = 372; +our $SPECIES_CLAMPERL = 373; +our $SPECIES_HUNTAIL = 374; +our $SPECIES_GOREBYSS = 375; +our $SPECIES_ABSOL = 376; +our $SPECIES_SHUPPET = 377; +our $SPECIES_BANETTE = 378; +our $SPECIES_SEVIPER = 379; +our $SPECIES_ZANGOOSE = 380; +our $SPECIES_RELICANTH = 381; +our $SPECIES_ARON = 382; +our $SPECIES_LAIRON = 383; +our $SPECIES_AGGRON = 384; +our $SPECIES_CASTFORM = 385; +our $SPECIES_VOLBEAT = 386; +our $SPECIES_ILLUMISE = 387; +our $SPECIES_LILEEP = 388; +our $SPECIES_CRADILY = 389; +our $SPECIES_ANORITH = 390; +our $SPECIES_ARMALDO = 391; +our $SPECIES_RALTS = 392; +our $SPECIES_KIRLIA = 393; +our $SPECIES_GARDEVOIR = 394; +our $SPECIES_BAGON = 395; +our $SPECIES_SHELGON = 396; +our $SPECIES_SALAMENCE = 397; +our $SPECIES_BELDUM = 398; +our $SPECIES_METANG = 399; +our $SPECIES_METAGROSS = 400; +our $SPECIES_REGIROCK = 401; +our $SPECIES_REGICE = 402; +our $SPECIES_REGISTEEL = 403; +our $SPECIES_KYOGRE = 404; +our $SPECIES_GROUDON = 405; +our $SPECIES_RAYQUAZA = 406; +our $SPECIES_LATIAS = 407; +our $SPECIES_LATIOS = 408; +our $SPECIES_JIRACHI = 409; +our $SPECIES_DEOXYS = 410; +our $SPECIES_CHIMECHO = 411; + +our @SPECIES = ( + 'NONE', 'BULBASAUR', 'IVYSAUR', 'VENUSAUR', + 'CHARMANDER', 'CHARMELEON', 'CHARIZARD', 'SQUIRTLE', + 'WARTORTLE', 'BLASTOISE', 'CATERPIE', 'METAPOD', + 'BUTTERFREE', 'WEEDLE', 'KAKUNA', 'BEEDRILL', + 'PIDGEY', 'PIDGEOTTO', 'PIDGEOT', 'RATTATA', + 'RATICATE', 'SPEAROW', 'FEAROW', 'EKANS', + 'ARBOK', 'PIKACHU', 'RAICHU', 'SANDSHREW', + 'SANDSLASH', 'NIDORAN_F', 'NIDORINA', 'NIDOQUEEN', + 'NIDORAN_M', 'NIDORINO', 'NIDOKING', 'CLEFAIRY', + 'CLEFABLE', 'VULPIX', 'NINETALES', 'JIGGLYPUFF', + 'WIGGLYTUFF', 'ZUBAT', 'GOLBAT', 'ODDISH', + 'GLOOM', 'VILEPLUME', 'PARAS', 'PARASECT', + 'VENONAT', 'VENOMOTH', 'DIGLETT', 'DUGTRIO', + 'MEOWTH', 'PERSIAN', 'PSYDUCK', 'GOLDUCK', + 'MANKEY', 'PRIMEAPE', 'GROWLITHE', 'ARCANINE', + 'POLIWAG', 'POLIWHIRL', 'POLIWRATH', 'ABRA', + 'KADABRA', 'ALAKAZAM', 'MACHOP', 'MACHOKE', + 'MACHAMP', 'BELLSPROUT', 'WEEPINBELL', 'VICTREEBEL', + 'TENTACOOL', 'TENTACRUEL', 'GEODUDE', 'GRAVELER', + 'GOLEM', 'PONYTA', 'RAPIDASH', 'SLOWPOKE', + 'SLOWBRO', 'MAGNEMITE', 'MAGNETON', 'FARFETCHD', + 'DODUO', 'DODRIO', 'SEEL', 'DEWGONG', + 'GRIMER', 'MUK', 'SHELLDER', 'CLOYSTER', + 'GASTLY', 'HAUNTER', 'GENGAR', 'ONIX', + 'DROWZEE', 'HYPNO', 'KRABBY', 'KINGLER', + 'VOLTORB', 'ELECTRODE', 'EXEGGCUTE', 'EXEGGUTOR', + 'CUBONE', 'MAROWAK', 'HITMONLEE', 'HITMONCHAN', + 'LICKITUNG', 'KOFFING', 'WEEZING', 'RHYHORN', + 'RHYDON', 'CHANSEY', 'TANGELA', 'KANGASKHAN', + 'HORSEA', 'SEADRA', 'GOLDEEN', 'SEAKING', + 'STARYU', 'STARMIE', 'MR_MIME', 'SCYTHER', + 'JYNX', 'ELECTABUZZ', 'MAGMAR', 'PINSIR', + 'TAUROS', 'MAGIKARP', 'GYARADOS', 'LAPRAS', + 'DITTO', 'EEVEE', 'VAPOREON', 'JOLTEON', + 'FLAREON', 'PORYGON', 'OMANYTE', 'OMASTAR', + 'KABUTO', 'KABUTOPS', 'AERODACTYL', 'SNORLAX', + 'ARTICUNO', 'ZAPDOS', 'MOLTRES', 'DRATINI', + 'DRAGONAIR', 'DRAGONITE', 'MEWTWO', 'MEW', + 'CHIKORITA', 'BAYLEEF', 'MEGANIUM', 'CYNDAQUIL', + 'QUILAVA', 'TYPHLOSION', 'TOTODILE', 'CROCONAW', + 'FERALIGATR', 'SENTRET', 'FURRET', 'HOOTHOOT', + 'NOCTOWL', 'LEDYBA', 'LEDIAN', 'SPINARAK', + 'ARIADOS', 'CROBAT', 'CHINCHOU', 'LANTURN', + 'PICHU', 'CLEFFA', 'IGGLYBUFF', 'TOGEPI', + 'TOGETIC', 'NATU', 'XATU', 'MAREEP', + 'FLAAFFY', 'AMPHAROS', 'BELLOSSOM', 'MARILL', + 'AZUMARILL', 'SUDOWOODO', 'POLITOED', 'HOPPIP', + 'SKIPLOOM', 'JUMPLUFF', 'AIPOM', 'SUNKERN', + 'SUNFLORA', 'YANMA', 'WOOPER', 'QUAGSIRE', + 'ESPEON', 'UMBREON', 'MURKROW', 'SLOWKING', + 'MISDREAVUS', 'UNOWN', 'WOBBUFFET', 'GIRAFARIG', + 'PINECO', 'FORRETRESS', 'DUNSPARCE', 'GLIGAR', + 'STEELIX', 'SNUBBULL', 'GRANBULL', 'QWILFISH', + 'SCIZOR', 'SHUCKLE', 'HERACROSS', 'SNEASEL', + 'TEDDIURSA', 'URSARING', 'SLUGMA', 'MAGCARGO', + 'SWINUB', 'PILOSWINE', 'CORSOLA', 'REMORAID', + 'OCTILLERY', 'DELIBIRD', 'MANTINE', 'SKARMORY', + 'HOUNDOUR', 'HOUNDOOM', 'KINGDRA', 'PHANPY', + 'DONPHAN', 'PORYGON2', 'STANTLER', 'SMEARGLE', + 'TYROGUE', 'HITMONTOP', 'SMOOCHUM', 'ELEKID', + 'MAGBY', 'MILTANK', 'BLISSEY', 'RAIKOU', + 'ENTEI', 'SUICUNE', 'LARVITAR', 'PUPITAR', + 'TYRANITAR', 'LUGIA', 'HO_OH', 'CELEBI', + 'OLD_UNOWN_B', 'OLD_UNOWN_C', 'OLD_UNOWN_D', 'OLD_UNOWN_E', + 'OLD_UNOWN_F', 'OLD_UNOWN_G', 'OLD_UNOWN_H', 'OLD_UNOWN_I', + 'OLD_UNOWN_J', 'OLD_UNOWN_K', 'OLD_UNOWN_L', 'OLD_UNOWN_M', + 'OLD_UNOWN_N', 'OLD_UNOWN_O', 'OLD_UNOWN_P', 'OLD_UNOWN_Q', + 'OLD_UNOWN_R', 'OLD_UNOWN_S', 'OLD_UNOWN_T', 'OLD_UNOWN_U', + 'OLD_UNOWN_V', 'OLD_UNOWN_W', 'OLD_UNOWN_X', 'OLD_UNOWN_Y', + 'OLD_UNOWN_Z', 'TREECKO', 'GROVYLE', 'SCEPTILE', + 'TORCHIC', 'COMBUSKEN', 'BLAZIKEN', 'MUDKIP', + 'MARSHTOMP', 'SWAMPERT', 'POOCHYENA', 'MIGHTYENA', + 'ZIGZAGOON', 'LINOONE', 'WURMPLE', 'SILCOON', + 'BEAUTIFLY', 'CASCOON', 'DUSTOX', 'LOTAD', + 'LOMBRE', 'LUDICOLO', 'SEEDOT', 'NUZLEAF', + 'SHIFTRY', 'NINCADA', 'NINJASK', 'SHEDINJA', + 'TAILLOW', 'SWELLOW', 'SHROOMISH', 'BRELOOM', + 'SPINDA', 'WINGULL', 'PELIPPER', 'SURSKIT', + 'MASQUERAIN', 'WAILMER', 'WAILORD', 'SKITTY', + 'DELCATTY', 'KECLEON', 'BALTOY', 'CLAYDOL', + 'NOSEPASS', 'TORKOAL', 'SABLEYE', 'BARBOACH', + 'WHISCASH', 'LUVDISC', 'CORPHISH', 'CRAWDAUNT', + 'FEEBAS', 'MILOTIC', 'CARVANHA', 'SHARPEDO', + 'TRAPINCH', 'VIBRAVA', 'FLYGON', 'MAKUHITA', + 'HARIYAMA', 'ELECTRIKE', 'MANECTRIC', 'NUMEL', + 'CAMERUPT', 'SPHEAL', 'SEALEO', 'WALREIN', + 'CACNEA', 'CACTURNE', 'SNORUNT', 'GLALIE', + 'LUNATONE', 'SOLROCK', 'AZURILL', 'SPOINK', + 'GRUMPIG', 'PLUSLE', 'MINUN', 'MAWILE', + 'MEDITITE', 'MEDICHAM', 'SWABLU', 'ALTARIA', + 'WYNAUT', 'DUSKULL', 'DUSCLOPS', 'ROSELIA', + 'SLAKOTH', 'VIGOROTH', 'SLAKING', 'GULPIN', + 'SWALOT', 'TROPIUS', 'WHISMUR', 'LOUDRED', + 'EXPLOUD', 'CLAMPERL', 'HUNTAIL', 'GOREBYSS', + 'ABSOL', 'SHUPPET', 'BANETTE', 'SEVIPER', + 'ZANGOOSE', 'RELICANTH', 'ARON', 'LAIRON', + 'AGGRON', 'CASTFORM', 'VOLBEAT', 'ILLUMISE', + 'LILEEP', 'CRADILY', 'ANORITH', 'ARMALDO', + 'RALTS', 'KIRLIA', 'GARDEVOIR', 'BAGON', + 'SHELGON', 'SALAMENCE', 'BELDUM', 'METANG', + 'METAGROSS', 'REGIROCK', 'REGICE', 'REGISTEEL', + 'KYOGRE', 'GROUDON', 'RAYQUAZA', 'LATIAS', + 'LATIOS', 'JIRACHI', 'DEOXYS', 'CHIMECHO', +); + +our %SPECIES_NAME_TO_ID; + +for (my $i = 0; $i < scalar @SPECIES; $i++) { + $SPECIES_NAME_TO_ID{$SPECIES[$i]} = $i; +} +1; diff --git a/lib/Rsaves/Constants/Emerald/SpeciesData.pm b/lib/Rsaves/Constants/Emerald/SpeciesData.pm new file mode 100644 index 0000000..78c4f89 --- /dev/null +++ b/lib/Rsaves/Constants/Emerald/SpeciesData.pm @@ -0,0 +1,1652 @@ +package Rsaves::Constants::Emerald::SpeciesData; + +use v5.16.3; + +use strict; +use warnings; + +our %SPECIES_DATA = %{ + { + 'WAILORD' => { + 'growth_rate' => 'GROWTH_FLUCTUATING', + 'gender_ratio' => 127 + }, + 'HITMONCHAN' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 0 + }, + 'GARDEVOIR' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_SLOW' + }, + 'SKIPLOOM' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'REGICE' => { + 'gender_ratio' => 255, + 'growth_rate' => 'GROWTH_SLOW' + }, + 'CLEFABLE' => { + 'growth_rate' => 'GROWTH_FAST', + 'gender_ratio' => 191 + }, + 'STEELIX' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'WINGULL' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'SANDSHREW' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'HOUNDOUR' => { + 'growth_rate' => 'GROWTH_SLOW', + 'gender_ratio' => 127 + }, + 'VOLBEAT' => { + 'gender_ratio' => 0, + 'growth_rate' => 'GROWTH_ERRATIC' + }, + 'SLUGMA' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'SWALOT' => { + 'growth_rate' => 'GROWTH_FLUCTUATING', + 'gender_ratio' => 127 + }, + 'AZUMARILL' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_FAST' + }, + 'SNEASEL' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'RAICHU' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'NUMEL' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'MUK' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'ARBOK' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'ZUBAT' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'REMORAID' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'FEAROW' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'ALTARIA' => { + 'growth_rate' => 'GROWTH_ERRATIC', + 'gender_ratio' => 127 + }, + 'CACTURNE' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 127 + }, + 'MOLTRES' => { + 'gender_ratio' => 255, + 'growth_rate' => 'GROWTH_SLOW' + }, + 'LUGIA' => { + 'growth_rate' => 'GROWTH_SLOW', + 'gender_ratio' => 255 + }, + 'PILOSWINE' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_SLOW' + }, + 'PIDGEOTTO' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 127 + }, + 'KRABBY' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'CAMERUPT' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'DEOXYS' => { + 'growth_rate' => 'GROWTH_SLOW', + 'gender_ratio' => 255 + }, + 'CLOYSTER' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_SLOW' + }, + 'SLOWKING' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'ZIGZAGOON' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'VENUSAUR' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 12 + }, + 'QUILAVA' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 12 + }, + 'IVYSAUR' => { + 'gender_ratio' => 12, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'PINSIR' => { + 'growth_rate' => 'GROWTH_SLOW', + 'gender_ratio' => 127 + }, + 'HARIYAMA' => { + 'gender_ratio' => 63, + 'growth_rate' => 'GROWTH_FLUCTUATING' + }, + 'HO_OH' => { + 'growth_rate' => 'GROWTH_SLOW', + 'gender_ratio' => 255 + }, + 'TYPHLOSION' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 12 + }, + 'DODRIO' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'RAPIDASH' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'GIRAFARIG' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'LUDICOLO' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 127 + }, + 'SHUPPET' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_FAST' + }, + 'FEEBAS' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_ERRATIC' + }, + 'SNORUNT' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'GEODUDE' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 127 + }, + 'TENTACOOL' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_SLOW' + }, + 'CYNDAQUIL' => { + 'gender_ratio' => 12, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'CARVANHA' => { + 'growth_rate' => 'GROWTH_SLOW', + 'gender_ratio' => 127 + }, + 'POLIWHIRL' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'GOLDUCK' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'SCYTHER' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'VILEPLUME' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'BEAUTIFLY' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'QUAGSIRE' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'SMEARGLE' => { + 'growth_rate' => 'GROWTH_FAST', + 'gender_ratio' => 127 + }, + 'PSYDUCK' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'BANETTE' => { + 'growth_rate' => 'GROWTH_FAST', + 'gender_ratio' => 127 + }, + 'NINETALES' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 191 + }, + 'CROCONAW' => { + 'gender_ratio' => 12, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'OLD_UNOWN_Q' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 255 + }, + 'SWAMPERT' => { + 'gender_ratio' => 12, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'MEW' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 255 + }, + 'TOTODILE' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 12 + }, + 'SEEL' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'CACNEA' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 127 + }, + 'MAGNETON' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 255 + }, + 'KABUTO' => { + 'gender_ratio' => 12, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'POLIWAG' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 127 + }, + 'WYNAUT' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'URSARING' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'VIGOROTH' => { + 'growth_rate' => 'GROWTH_SLOW', + 'gender_ratio' => 127 + }, + 'EEVEE' => { + 'gender_ratio' => 12, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'CHIKORITA' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 12 + }, + 'MUDKIP' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 12 + }, + 'TORKOAL' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'DUNSPARCE' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'DEWGONG' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'SUNKERN' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'BALTOY' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 255 + }, + 'OLD_UNOWN_C' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 255 + }, + 'WOOPER' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'WEEZING' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'OLD_UNOWN_X' => { + 'gender_ratio' => 255, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'TOGEPI' => { + 'growth_rate' => 'GROWTH_FAST', + 'gender_ratio' => 12 + }, + 'POOCHYENA' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'ABSOL' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'WAILMER' => { + 'growth_rate' => 'GROWTH_FLUCTUATING', + 'gender_ratio' => 127 + }, + 'OLD_UNOWN_Y' => { + 'gender_ratio' => 255, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'FLYGON' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 127 + }, + 'PORYGON2' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 255 + }, + 'KABUTOPS' => { + 'gender_ratio' => 12, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'PINECO' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'ESPEON' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 12 + }, + 'PORYGON' => { + 'gender_ratio' => 255, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'MASQUERAIN' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'REGISTEEL' => { + 'gender_ratio' => 255, + 'growth_rate' => 'GROWTH_SLOW' + }, + 'TROPIUS' => { + 'growth_rate' => 'GROWTH_SLOW', + 'gender_ratio' => 127 + }, + 'LATIAS' => { + 'growth_rate' => 'GROWTH_SLOW', + 'gender_ratio' => 254 + }, + 'CORPHISH' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_FLUCTUATING' + }, + 'SNORLAX' => { + 'gender_ratio' => 12, + 'growth_rate' => 'GROWTH_SLOW' + }, + 'VOLTORB' => { + 'gender_ratio' => 255, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'GOLDEEN' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'CELEBI' => { + 'gender_ratio' => 255, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'LAPRAS' => { + 'growth_rate' => 'GROWTH_SLOW', + 'gender_ratio' => 127 + }, + 'SEEDOT' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'WHISMUR' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 127 + }, + 'OLD_UNOWN_J' => { + 'gender_ratio' => 255, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'ARTICUNO' => { + 'growth_rate' => 'GROWTH_SLOW', + 'gender_ratio' => 255 + }, + 'JIRACHI' => { + 'gender_ratio' => 255, + 'growth_rate' => 'GROWTH_SLOW' + }, + 'NOSEPASS' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'BELDUM' => { + 'growth_rate' => 'GROWTH_SLOW', + 'gender_ratio' => 255 + }, + 'KINGLER' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'MACHOP' => { + 'gender_ratio' => 63, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'HYPNO' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'LEDYBA' => { + 'growth_rate' => 'GROWTH_FAST', + 'gender_ratio' => 127 + }, + 'SURSKIT' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'FERALIGATR' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 12 + }, + 'SLAKOTH' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_SLOW' + }, + 'PELIPPER' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'SEVIPER' => { + 'growth_rate' => 'GROWTH_FLUCTUATING', + 'gender_ratio' => 127 + }, + 'SMOOCHUM' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 254 + }, + 'VICTREEBEL' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'NINJASK' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_ERRATIC' + }, + 'SUDOWOODO' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'LEDIAN' => { + 'growth_rate' => 'GROWTH_FAST', + 'gender_ratio' => 127 + }, + 'SHELLDER' => { + 'growth_rate' => 'GROWTH_SLOW', + 'gender_ratio' => 127 + }, + 'MAGIKARP' => { + 'growth_rate' => 'GROWTH_SLOW', + 'gender_ratio' => 127 + }, + 'MARSHTOMP' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 12 + }, + 'OLD_UNOWN_P' => { + 'gender_ratio' => 255, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'KECLEON' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'SKARMORY' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_SLOW' + }, + 'GULPIN' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_FLUCTUATING' + }, + 'LARVITAR' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_SLOW' + }, + 'DUSTOX' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'ILLUMISE' => { + 'growth_rate' => 'GROWTH_FLUCTUATING', + 'gender_ratio' => 254 + }, + 'MAGCARGO' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'VAPOREON' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 12 + }, + 'WURMPLE' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'KOFFING' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'CLAMPERL' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_ERRATIC' + }, + 'FLAREON' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 12 + }, + 'OLD_UNOWN_D' => { + 'gender_ratio' => 255, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'DUSKULL' => { + 'growth_rate' => 'GROWTH_FAST', + 'gender_ratio' => 127 + }, + 'ARIADOS' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_FAST' + }, + 'STARMIE' => { + 'growth_rate' => 'GROWTH_SLOW', + 'gender_ratio' => 255 + }, + 'PARASECT' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'OMANYTE' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 12 + }, + 'ZAPDOS' => { + 'growth_rate' => 'GROWTH_SLOW', + 'gender_ratio' => 255 + }, + 'RHYDON' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_SLOW' + }, + 'NIDORINA' => { + 'gender_ratio' => 254, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'MAROWAK' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'YANMA' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'OLD_UNOWN_H' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 255 + }, + 'FORRETRESS' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'CHANSEY' => { + 'growth_rate' => 'GROWTH_FAST', + 'gender_ratio' => 254 + }, + 'SWELLOW' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 127 + }, + 'SUNFLORA' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'ELECTRIKE' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_SLOW' + }, + 'MACHOKE' => { + 'gender_ratio' => 63, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'OLD_UNOWN_G' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 255 + }, + 'EXEGGCUTE' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_SLOW' + }, + 'GOLEM' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'CHARMELEON' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 12 + }, + 'SPINDA' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_FAST' + }, + 'OCTILLERY' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'WHISCASH' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'JUMPLUFF' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 127 + }, + 'GOLBAT' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'GLOOM' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'NIDORAN_F' => { + 'gender_ratio' => 254, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'LANTURN' => { + 'growth_rate' => 'GROWTH_SLOW', + 'gender_ratio' => 127 + }, + 'MAWILE' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_FAST' + }, + 'OLD_UNOWN_B' => { + 'gender_ratio' => 255, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'SCIZOR' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'BELLOSSOM' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'NIDOKING' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 0 + }, + 'PHANPY' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'BELLSPROUT' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'ELECTRODE' => { + 'gender_ratio' => 255, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'WIGGLYTUFF' => { + 'gender_ratio' => 191, + 'growth_rate' => 'GROWTH_FAST' + }, + 'OLD_UNOWN_E' => { + 'gender_ratio' => 255, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'KANGASKHAN' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 254 + }, + 'PERSIAN' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'AGGRON' => { + 'growth_rate' => 'GROWTH_SLOW', + 'gender_ratio' => 127 + }, + 'SWABLU' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_ERRATIC' + }, + 'LICKITUNG' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'NINCADA' => { + 'growth_rate' => 'GROWTH_ERRATIC', + 'gender_ratio' => 127 + }, + 'VENONAT' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'TAILLOW' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'CHARMANDER' => { + 'gender_ratio' => 12, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'MIGHTYENA' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'SPHEAL' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'REGIROCK' => { + 'growth_rate' => 'GROWTH_SLOW', + 'gender_ratio' => 255 + }, + 'OLD_UNOWN_M' => { + 'gender_ratio' => 255, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'BRELOOM' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_FLUCTUATING' + }, + 'BARBOACH' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'SEADRA' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'TYROGUE' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 0 + }, + 'GYARADOS' => { + 'growth_rate' => 'GROWTH_SLOW', + 'gender_ratio' => 127 + }, + 'SPOINK' => { + 'growth_rate' => 'GROWTH_FAST', + 'gender_ratio' => 127 + }, + 'SLAKING' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_SLOW' + }, + 'HITMONTOP' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 0 + }, + 'MEWTWO' => { + 'growth_rate' => 'GROWTH_SLOW', + 'gender_ratio' => 255 + }, + 'MAREEP' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 127 + }, + 'SOLROCK' => { + 'growth_rate' => 'GROWTH_FAST', + 'gender_ratio' => 255 + }, + 'TEDDIURSA' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'ALAKAZAM' => { + 'gender_ratio' => 63, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'ABRA' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 63 + }, + 'CRAWDAUNT' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_FLUCTUATING' + }, + 'STANTLER' => { + 'growth_rate' => 'GROWTH_SLOW', + 'gender_ratio' => 127 + }, + 'PIDGEY' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'GRIMER' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'RATTATA' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'NATU' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'LOUDRED' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 127 + }, + 'SKITTY' => { + 'growth_rate' => 'GROWTH_FAST', + 'gender_ratio' => 191 + }, + 'ENTEI' => { + 'gender_ratio' => 255, + 'growth_rate' => 'GROWTH_SLOW' + }, + 'VENOMOTH' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'CHARIZARD' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 12 + }, + 'OLD_UNOWN_F' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 255 + }, + 'ONIX' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'MAGBY' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 63 + }, + 'ROSELIA' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 127 + }, + 'SHIFTRY' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 127 + }, + 'CROBAT' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'MANECTRIC' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_SLOW' + }, + 'RELICANTH' => { + 'gender_ratio' => 12, + 'growth_rate' => 'GROWTH_SLOW' + }, + 'CORSOLA' => { + 'growth_rate' => 'GROWTH_FAST', + 'gender_ratio' => 191 + }, + 'BLAZIKEN' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 12 + }, + 'ELEKID' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 63 + }, + 'NIDORINO' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 0 + }, + 'BLASTOISE' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 12 + }, + 'WEEPINBELL' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'SUICUNE' => { + 'growth_rate' => 'GROWTH_SLOW', + 'gender_ratio' => 255 + }, + 'OLD_UNOWN_Z' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 255 + }, + 'LOMBRE' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'MANTINE' => { + 'growth_rate' => 'GROWTH_SLOW', + 'gender_ratio' => 127 + }, + 'LAIRON' => { + 'growth_rate' => 'GROWTH_SLOW', + 'gender_ratio' => 127 + }, + 'PIKACHU' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'ODDISH' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 127 + }, + 'DELIBIRD' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_FAST' + }, + 'KINGDRA' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'SALAMENCE' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_SLOW' + }, + 'TORCHIC' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 12 + }, + 'SEAKING' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'RAYQUAZA' => { + 'growth_rate' => 'GROWTH_SLOW', + 'gender_ratio' => 255 + }, + 'CHINCHOU' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_SLOW' + }, + 'OLD_UNOWN_I' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 255 + }, + 'MILOTIC' => { + 'growth_rate' => 'GROWTH_ERRATIC', + 'gender_ratio' => 127 + }, + 'SQUIRTLE' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 12 + }, + 'ANORITH' => { + 'growth_rate' => 'GROWTH_ERRATIC', + 'gender_ratio' => 12 + }, + 'TOGETIC' => { + 'gender_ratio' => 12, + 'growth_rate' => 'GROWTH_FAST' + }, + 'MR_MIME' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'CASTFORM' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'ARON' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_SLOW' + }, + 'FARFETCHD' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'UNOWN' => { + 'gender_ratio' => 255, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'GENGAR' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'SHROOMISH' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_FLUCTUATING' + }, + 'BULBASAUR' => { + 'gender_ratio' => 12, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'RALTS' => { + 'growth_rate' => 'GROWTH_SLOW', + 'gender_ratio' => 127 + }, + 'RAIKOU' => { + 'growth_rate' => 'GROWTH_SLOW', + 'gender_ratio' => 255 + }, + 'JIGGLYPUFF' => { + 'growth_rate' => 'GROWTH_FAST', + 'gender_ratio' => 191 + }, + 'OLD_UNOWN_W' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 255 + }, + 'VIBRAVA' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 127 + }, + 'POLIWRATH' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 127 + }, + 'NUZLEAF' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 127 + }, + 'MAKUHITA' => { + 'gender_ratio' => 63, + 'growth_rate' => 'GROWTH_FLUCTUATING' + }, + 'SPINARAK' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_FAST' + }, + 'GRUMPIG' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_FAST' + }, + 'MAGMAR' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 63 + }, + 'XATU' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'PUPITAR' => { + 'growth_rate' => 'GROWTH_SLOW', + 'gender_ratio' => 127 + }, + 'SHUCKLE' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'RATICATE' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'AZURILL' => { + 'gender_ratio' => 191, + 'growth_rate' => 'GROWTH_FAST' + }, + 'KYOGRE' => { + 'growth_rate' => 'GROWTH_SLOW', + 'gender_ratio' => 255 + }, + 'GLALIE' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'PONYTA' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'WALREIN' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 127 + }, + 'MANKEY' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'SCEPTILE' => { + 'gender_ratio' => 12, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'DRAGONITE' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_SLOW' + }, + 'MEDITITE' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'MEOWTH' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'BLISSEY' => { + 'gender_ratio' => 254, + 'growth_rate' => 'GROWTH_FAST' + }, + 'MACHAMP' => { + 'gender_ratio' => 63, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'METAPOD' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'NOCTOWL' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'TAUROS' => { + 'gender_ratio' => 0, + 'growth_rate' => 'GROWTH_SLOW' + }, + 'SANDSLASH' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'HUNTAIL' => { + 'growth_rate' => 'GROWTH_ERRATIC', + 'gender_ratio' => 127 + }, + 'VULPIX' => { + 'gender_ratio' => 191, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'CRADILY' => { + 'growth_rate' => 'GROWTH_ERRATIC', + 'gender_ratio' => 12 + }, + 'SABLEYE' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'DRATINI' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_SLOW' + }, + 'JYNX' => { + 'gender_ratio' => 254, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'MARILL' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_FAST' + }, + 'OLD_UNOWN_O' => { + 'gender_ratio' => 255, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'MINUN' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'DIGLETT' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'SHELGON' => { + 'growth_rate' => 'GROWTH_SLOW', + 'gender_ratio' => 127 + }, + 'MILTANK' => { + 'growth_rate' => 'GROWTH_SLOW', + 'gender_ratio' => 254 + }, + 'BUTTERFREE' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'TANGELA' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'LATIOS' => { + 'gender_ratio' => 0, + 'growth_rate' => 'GROWTH_SLOW' + }, + 'METAGROSS' => { + 'gender_ratio' => 255, + 'growth_rate' => 'GROWTH_SLOW' + }, + 'OLD_UNOWN_L' => { + 'gender_ratio' => 255, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'MISDREAVUS' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_FAST' + }, + 'PLUSLE' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'QWILFISH' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'MEDICHAM' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'AMPHAROS' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'OLD_UNOWN_N' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 255 + }, + 'CLEFFA' => { + 'growth_rate' => 'GROWTH_FAST', + 'gender_ratio' => 191 + }, + 'SEALEO' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'CLEFAIRY' => { + 'gender_ratio' => 191, + 'growth_rate' => 'GROWTH_FAST' + }, + 'SENTRET' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'EXEGGUTOR' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_SLOW' + }, + 'JOLTEON' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 12 + }, + 'RHYHORN' => { + 'growth_rate' => 'GROWTH_SLOW', + 'gender_ratio' => 127 + }, + 'TYRANITAR' => { + 'growth_rate' => 'GROWTH_SLOW', + 'gender_ratio' => 127 + }, + 'DRAGONAIR' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_SLOW' + }, + 'PIDGEOT' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'KAKUNA' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'GRAVELER' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'OMASTAR' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 12 + }, + 'DUSCLOPS' => { + 'growth_rate' => 'GROWTH_FAST', + 'gender_ratio' => 127 + }, + 'DODUO' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'HOPPIP' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'DITTO' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 255 + }, + 'METANG' => { + 'gender_ratio' => 255, + 'growth_rate' => 'GROWTH_SLOW' + }, + 'CLAYDOL' => { + 'gender_ratio' => 255, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'SLOWPOKE' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'WARTORTLE' => { + 'gender_ratio' => 12, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'CATERPIE' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'LUVDISC' => { + 'gender_ratio' => 191, + 'growth_rate' => 'GROWTH_FAST' + }, + 'SILCOON' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'TRAPINCH' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'LILEEP' => { + 'growth_rate' => 'GROWTH_ERRATIC', + 'gender_ratio' => 12 + }, + 'AIPOM' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_FAST' + }, + 'MAGNEMITE' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 255 + }, + 'SLOWBRO' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'HAUNTER' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'FURRET' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'ARMALDO' => { + 'growth_rate' => 'GROWTH_ERRATIC', + 'gender_ratio' => 12 + }, + 'OLD_UNOWN_K' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 255 + }, + 'UMBREON' => { + 'gender_ratio' => 12, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'DELCATTY' => { + 'gender_ratio' => 191, + 'growth_rate' => 'GROWTH_FAST' + }, + 'GROVYLE' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 12 + }, + 'MEGANIUM' => { + 'gender_ratio' => 12, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'SHARPEDO' => { + 'growth_rate' => 'GROWTH_SLOW', + 'gender_ratio' => 127 + }, + 'HORSEA' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'NIDORAN_M' => { + 'gender_ratio' => 0, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'HITMONLEE' => { + 'gender_ratio' => 0, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'HOUNDOOM' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_SLOW' + }, + 'NIDOQUEEN' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 254 + }, + 'POLITOED' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'COMBUSKEN' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 12 + }, + 'OLD_UNOWN_T' => { + 'gender_ratio' => 255, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'BEEDRILL' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'LINOONE' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'CUBONE' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'MURKROW' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 127 + }, + 'GRANBULL' => { + 'gender_ratio' => 191, + 'growth_rate' => 'GROWTH_FAST' + }, + 'TENTACRUEL' => { + 'growth_rate' => 'GROWTH_SLOW', + 'gender_ratio' => 127 + }, + 'OLD_UNOWN_V' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 255 + }, + 'TREECKO' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 12 + }, + 'PRIMEAPE' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'PICHU' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'GASTLY' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 127 + }, + 'GROUDON' => { + 'gender_ratio' => 255, + 'growth_rate' => 'GROWTH_SLOW' + }, + 'SPEAROW' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'OLD_UNOWN_R' => { + 'gender_ratio' => 255, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'ZANGOOSE' => { + 'growth_rate' => 'GROWTH_ERRATIC', + 'gender_ratio' => 127 + }, + 'HERACROSS' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_SLOW' + }, + 'CASCOON' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'LUNATONE' => { + 'growth_rate' => 'GROWTH_FAST', + 'gender_ratio' => 255 + }, + 'BAYLEEF' => { + 'gender_ratio' => 12, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'ARCANINE' => { + 'gender_ratio' => 63, + 'growth_rate' => 'GROWTH_SLOW' + }, + 'OLD_UNOWN_S' => { + 'gender_ratio' => 255, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'SHEDINJA' => { + 'growth_rate' => 'GROWTH_ERRATIC', + 'gender_ratio' => 255 + }, + 'EKANS' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'ELECTABUZZ' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 63 + }, + 'KIRLIA' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_SLOW' + }, + 'SWINUB' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_SLOW' + }, + 'AERODACTYL' => { + 'gender_ratio' => 12, + 'growth_rate' => 'GROWTH_SLOW' + }, + 'DUGTRIO' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'SNUBBULL' => { + 'gender_ratio' => 191, + 'growth_rate' => 'GROWTH_FAST' + }, + 'LOTAD' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'EXPLOUD' => { + 'growth_rate' => 'GROWTH_MEDIUM_SLOW', + 'gender_ratio' => 127 + }, + 'KADABRA' => { + 'gender_ratio' => 63, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'STARYU' => { + 'growth_rate' => 'GROWTH_SLOW', + 'gender_ratio' => 255 + }, + 'BAGON' => { + 'growth_rate' => 'GROWTH_SLOW', + 'gender_ratio' => 127 + }, + 'GROWLITHE' => { + 'gender_ratio' => 63, + 'growth_rate' => 'GROWTH_SLOW' + }, + 'WOBBUFFET' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'OLD_UNOWN_U' => { + 'gender_ratio' => 255, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'HOOTHOOT' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'DROWZEE' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'DONPHAN' => { + 'growth_rate' => 'GROWTH_MEDIUM_FAST', + 'gender_ratio' => 127 + }, + 'PARAS' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'FLAAFFY' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'GLIGAR' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_SLOW' + }, + 'WEEDLE' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_MEDIUM_FAST' + }, + 'GOREBYSS' => { + 'gender_ratio' => 127, + 'growth_rate' => 'GROWTH_ERRATIC' + }, + 'IGGLYBUFF' => { + 'growth_rate' => 'GROWTH_FAST', + 'gender_ratio' => 191 + } + } +}; +1; diff --git a/pokeemerald b/pokeemerald new file mode 160000 index 0000000..954ba0a --- /dev/null +++ b/pokeemerald @@ -0,0 +1 @@ +Subproject commit 954ba0a15590d1eaf4929238cec4e0ea3d2e8dd4 diff --git a/resources/forest.png b/resources/forest.png new file mode 100644 index 0000000..0bfde76 Binary files /dev/null and b/resources/forest.png differ diff --git a/resources/hand_cursor.png b/resources/hand_cursor.png new file mode 100644 index 0000000..1a87e68 Binary files /dev/null and b/resources/hand_cursor.png differ diff --git a/resources/pc_background.png b/resources/pc_background.png new file mode 100644 index 0000000..e47e082 Binary files /dev/null and b/resources/pc_background.png differ diff --git a/resources/right_arrow_pc.png b/resources/right_arrow_pc.png new file mode 100644 index 0000000..3b6f43a Binary files /dev/null and b/resources/right_arrow_pc.png differ diff --git a/resources/shiny/abra.png b/resources/shiny/abra.png new file mode 100644 index 0000000..3ca221b Binary files /dev/null and b/resources/shiny/abra.png differ diff --git a/resources/shiny/absol.png b/resources/shiny/absol.png new file mode 100644 index 0000000..8317644 Binary files /dev/null and b/resources/shiny/absol.png differ diff --git a/resources/shiny/aerodactyl.png b/resources/shiny/aerodactyl.png new file mode 100644 index 0000000..1c37805 Binary files /dev/null and b/resources/shiny/aerodactyl.png differ diff --git a/resources/shiny/aggron.png b/resources/shiny/aggron.png new file mode 100644 index 0000000..6b17185 Binary files /dev/null and b/resources/shiny/aggron.png differ diff --git a/resources/shiny/aipom.png b/resources/shiny/aipom.png new file mode 100644 index 0000000..5007c39 Binary files /dev/null and b/resources/shiny/aipom.png differ diff --git a/resources/shiny/alakazam.png b/resources/shiny/alakazam.png new file mode 100644 index 0000000..f2b3785 Binary files /dev/null and b/resources/shiny/alakazam.png differ diff --git a/resources/shiny/altaria.png b/resources/shiny/altaria.png new file mode 100644 index 0000000..83f342f Binary files /dev/null and b/resources/shiny/altaria.png differ diff --git a/resources/shiny/ampharos.png b/resources/shiny/ampharos.png new file mode 100644 index 0000000..02647f0 Binary files /dev/null and b/resources/shiny/ampharos.png differ diff --git a/resources/shiny/anorith.png b/resources/shiny/anorith.png new file mode 100644 index 0000000..cc35e27 Binary files /dev/null and b/resources/shiny/anorith.png differ diff --git a/resources/shiny/arbok.png b/resources/shiny/arbok.png new file mode 100644 index 0000000..7c9a30a Binary files /dev/null and b/resources/shiny/arbok.png differ diff --git a/resources/shiny/arcanine.png b/resources/shiny/arcanine.png new file mode 100644 index 0000000..a9b5302 Binary files /dev/null and b/resources/shiny/arcanine.png differ diff --git a/resources/shiny/ariados.png b/resources/shiny/ariados.png new file mode 100644 index 0000000..42364a7 Binary files /dev/null and b/resources/shiny/ariados.png differ diff --git a/resources/shiny/armaldo.png b/resources/shiny/armaldo.png new file mode 100644 index 0000000..e2da4a5 Binary files /dev/null and b/resources/shiny/armaldo.png differ diff --git a/resources/shiny/aron.png b/resources/shiny/aron.png new file mode 100644 index 0000000..131cf66 Binary files /dev/null and b/resources/shiny/aron.png differ diff --git a/resources/shiny/articuno.png b/resources/shiny/articuno.png new file mode 100644 index 0000000..cacc5c6 Binary files /dev/null and b/resources/shiny/articuno.png differ diff --git a/resources/shiny/azumarill.png b/resources/shiny/azumarill.png new file mode 100644 index 0000000..788fc0f Binary files /dev/null and b/resources/shiny/azumarill.png differ diff --git a/resources/shiny/azurill.png b/resources/shiny/azurill.png new file mode 100644 index 0000000..1cf231d Binary files /dev/null and b/resources/shiny/azurill.png differ diff --git a/resources/shiny/bagon.png b/resources/shiny/bagon.png new file mode 100644 index 0000000..28e8ec3 Binary files /dev/null and b/resources/shiny/bagon.png differ diff --git a/resources/shiny/baltoy.png b/resources/shiny/baltoy.png new file mode 100644 index 0000000..9ecf420 Binary files /dev/null and b/resources/shiny/baltoy.png differ diff --git a/resources/shiny/banette.png b/resources/shiny/banette.png new file mode 100644 index 0000000..0a84c69 Binary files /dev/null and b/resources/shiny/banette.png differ diff --git a/resources/shiny/barboach.png b/resources/shiny/barboach.png new file mode 100644 index 0000000..9f2b18a Binary files /dev/null and b/resources/shiny/barboach.png differ diff --git a/resources/shiny/bayleef.png b/resources/shiny/bayleef.png new file mode 100644 index 0000000..11fb66c Binary files /dev/null and b/resources/shiny/bayleef.png differ diff --git a/resources/shiny/beautifly.png b/resources/shiny/beautifly.png new file mode 100644 index 0000000..fa8e0f9 Binary files /dev/null and b/resources/shiny/beautifly.png differ diff --git a/resources/shiny/beedrill.png b/resources/shiny/beedrill.png new file mode 100644 index 0000000..348a4eb Binary files /dev/null and b/resources/shiny/beedrill.png differ diff --git a/resources/shiny/beldum.png b/resources/shiny/beldum.png new file mode 100644 index 0000000..798428d Binary files /dev/null and b/resources/shiny/beldum.png differ diff --git a/resources/shiny/bellossom.png b/resources/shiny/bellossom.png new file mode 100644 index 0000000..1fb5157 Binary files /dev/null and b/resources/shiny/bellossom.png differ diff --git a/resources/shiny/bellsprout.png b/resources/shiny/bellsprout.png new file mode 100644 index 0000000..827dca5 Binary files /dev/null and b/resources/shiny/bellsprout.png differ diff --git a/resources/shiny/blastoise.png b/resources/shiny/blastoise.png new file mode 100644 index 0000000..989e22a Binary files /dev/null and b/resources/shiny/blastoise.png differ diff --git a/resources/shiny/blaziken.png b/resources/shiny/blaziken.png new file mode 100644 index 0000000..8b917cf Binary files /dev/null and b/resources/shiny/blaziken.png differ diff --git a/resources/shiny/blissey.png b/resources/shiny/blissey.png new file mode 100644 index 0000000..359c657 Binary files /dev/null and b/resources/shiny/blissey.png differ diff --git a/resources/shiny/breloom.png b/resources/shiny/breloom.png new file mode 100644 index 0000000..55560f5 Binary files /dev/null and b/resources/shiny/breloom.png differ diff --git a/resources/shiny/bulbasaur.png b/resources/shiny/bulbasaur.png new file mode 100644 index 0000000..553536a Binary files /dev/null and b/resources/shiny/bulbasaur.png differ diff --git a/resources/shiny/butterfree.png b/resources/shiny/butterfree.png new file mode 100644 index 0000000..70c1243 Binary files /dev/null and b/resources/shiny/butterfree.png differ diff --git a/resources/shiny/cacnea.png b/resources/shiny/cacnea.png new file mode 100644 index 0000000..87da898 Binary files /dev/null and b/resources/shiny/cacnea.png differ diff --git a/resources/shiny/cacturne.png b/resources/shiny/cacturne.png new file mode 100644 index 0000000..89610fa Binary files /dev/null and b/resources/shiny/cacturne.png differ diff --git a/resources/shiny/camerupt.png b/resources/shiny/camerupt.png new file mode 100644 index 0000000..88340fc Binary files /dev/null and b/resources/shiny/camerupt.png differ diff --git a/resources/shiny/carvanha.png b/resources/shiny/carvanha.png new file mode 100644 index 0000000..e261b65 Binary files /dev/null and b/resources/shiny/carvanha.png differ diff --git a/resources/shiny/cascoon.png b/resources/shiny/cascoon.png new file mode 100644 index 0000000..0f64eb8 Binary files /dev/null and b/resources/shiny/cascoon.png differ diff --git a/resources/shiny/castform.png b/resources/shiny/castform.png new file mode 100644 index 0000000..4f52dc6 Binary files /dev/null and b/resources/shiny/castform.png differ diff --git a/resources/shiny/caterpie.png b/resources/shiny/caterpie.png new file mode 100644 index 0000000..e5f443a Binary files /dev/null and b/resources/shiny/caterpie.png differ diff --git a/resources/shiny/celebi.png b/resources/shiny/celebi.png new file mode 100644 index 0000000..201abaf Binary files /dev/null and b/resources/shiny/celebi.png differ diff --git a/resources/shiny/chansey.png b/resources/shiny/chansey.png new file mode 100644 index 0000000..78256ab Binary files /dev/null and b/resources/shiny/chansey.png differ diff --git a/resources/shiny/charizard.png b/resources/shiny/charizard.png new file mode 100644 index 0000000..bfce9f4 Binary files /dev/null and b/resources/shiny/charizard.png differ diff --git a/resources/shiny/charmander.png b/resources/shiny/charmander.png new file mode 100644 index 0000000..8d8f899 Binary files /dev/null and b/resources/shiny/charmander.png differ diff --git a/resources/shiny/charmeleon.png b/resources/shiny/charmeleon.png new file mode 100644 index 0000000..e3bf227 Binary files /dev/null and b/resources/shiny/charmeleon.png differ diff --git a/resources/shiny/chikorita.png b/resources/shiny/chikorita.png new file mode 100644 index 0000000..54f8d5c Binary files /dev/null and b/resources/shiny/chikorita.png differ diff --git a/resources/shiny/chimecho.png b/resources/shiny/chimecho.png new file mode 100644 index 0000000..1b77edc Binary files /dev/null and b/resources/shiny/chimecho.png differ diff --git a/resources/shiny/chinchou.png b/resources/shiny/chinchou.png new file mode 100644 index 0000000..34c60b9 Binary files /dev/null and b/resources/shiny/chinchou.png differ diff --git a/resources/shiny/clamperl.png b/resources/shiny/clamperl.png new file mode 100644 index 0000000..322ef4a Binary files /dev/null and b/resources/shiny/clamperl.png differ diff --git a/resources/shiny/claydol.png b/resources/shiny/claydol.png new file mode 100644 index 0000000..0e73fc6 Binary files /dev/null and b/resources/shiny/claydol.png differ diff --git a/resources/shiny/clefable.png b/resources/shiny/clefable.png new file mode 100644 index 0000000..df79fd3 Binary files /dev/null and b/resources/shiny/clefable.png differ diff --git a/resources/shiny/clefairy.png b/resources/shiny/clefairy.png new file mode 100644 index 0000000..6e7f8d9 Binary files /dev/null and b/resources/shiny/clefairy.png differ diff --git a/resources/shiny/cleffa.png b/resources/shiny/cleffa.png new file mode 100644 index 0000000..f82da4d Binary files /dev/null and b/resources/shiny/cleffa.png differ diff --git a/resources/shiny/cloyster.png b/resources/shiny/cloyster.png new file mode 100644 index 0000000..43703f5 Binary files /dev/null and b/resources/shiny/cloyster.png differ diff --git a/resources/shiny/combusken.png b/resources/shiny/combusken.png new file mode 100644 index 0000000..69318e4 Binary files /dev/null and b/resources/shiny/combusken.png differ diff --git a/resources/shiny/corphish.png b/resources/shiny/corphish.png new file mode 100644 index 0000000..5feee0a Binary files /dev/null and b/resources/shiny/corphish.png differ diff --git a/resources/shiny/corsola.png b/resources/shiny/corsola.png new file mode 100644 index 0000000..61ebcfb Binary files /dev/null and b/resources/shiny/corsola.png differ diff --git a/resources/shiny/cradily.png b/resources/shiny/cradily.png new file mode 100644 index 0000000..1daf857 Binary files /dev/null and b/resources/shiny/cradily.png differ diff --git a/resources/shiny/crawdaunt.png b/resources/shiny/crawdaunt.png new file mode 100644 index 0000000..cbc56dd Binary files /dev/null and b/resources/shiny/crawdaunt.png differ diff --git a/resources/shiny/crobat.png b/resources/shiny/crobat.png new file mode 100644 index 0000000..3ce008d Binary files /dev/null and b/resources/shiny/crobat.png differ diff --git a/resources/shiny/croconaw.png b/resources/shiny/croconaw.png new file mode 100644 index 0000000..31885f1 Binary files /dev/null and b/resources/shiny/croconaw.png differ diff --git a/resources/shiny/cubone.png b/resources/shiny/cubone.png new file mode 100644 index 0000000..3a03537 Binary files /dev/null and b/resources/shiny/cubone.png differ diff --git a/resources/shiny/cyndaquil.png b/resources/shiny/cyndaquil.png new file mode 100644 index 0000000..eed9f4b Binary files /dev/null and b/resources/shiny/cyndaquil.png differ diff --git a/resources/shiny/delcatty.png b/resources/shiny/delcatty.png new file mode 100644 index 0000000..25a609e Binary files /dev/null and b/resources/shiny/delcatty.png differ diff --git a/resources/shiny/delibird.png b/resources/shiny/delibird.png new file mode 100644 index 0000000..cd7fde7 Binary files /dev/null and b/resources/shiny/delibird.png differ diff --git a/resources/shiny/deoxys.png b/resources/shiny/deoxys.png new file mode 100644 index 0000000..af61671 Binary files /dev/null and b/resources/shiny/deoxys.png differ diff --git a/resources/shiny/dewgong.png b/resources/shiny/dewgong.png new file mode 100644 index 0000000..cbc34bf Binary files /dev/null and b/resources/shiny/dewgong.png differ diff --git a/resources/shiny/diglett.png b/resources/shiny/diglett.png new file mode 100644 index 0000000..005a211 Binary files /dev/null and b/resources/shiny/diglett.png differ diff --git a/resources/shiny/ditto.png b/resources/shiny/ditto.png new file mode 100644 index 0000000..16d8f7d Binary files /dev/null and b/resources/shiny/ditto.png differ diff --git a/resources/shiny/dodrio.png b/resources/shiny/dodrio.png new file mode 100644 index 0000000..f15cd5c Binary files /dev/null and b/resources/shiny/dodrio.png differ diff --git a/resources/shiny/doduo.png b/resources/shiny/doduo.png new file mode 100644 index 0000000..48777e3 Binary files /dev/null and b/resources/shiny/doduo.png differ diff --git a/resources/shiny/donphan.png b/resources/shiny/donphan.png new file mode 100644 index 0000000..d9c91eb Binary files /dev/null and b/resources/shiny/donphan.png differ diff --git a/resources/shiny/dragonair.png b/resources/shiny/dragonair.png new file mode 100644 index 0000000..1bc9a52 Binary files /dev/null and b/resources/shiny/dragonair.png differ diff --git a/resources/shiny/dragonite.png b/resources/shiny/dragonite.png new file mode 100644 index 0000000..5763254 Binary files /dev/null and b/resources/shiny/dragonite.png differ diff --git a/resources/shiny/dratini.png b/resources/shiny/dratini.png new file mode 100644 index 0000000..d44878a Binary files /dev/null and b/resources/shiny/dratini.png differ diff --git a/resources/shiny/drowzee.png b/resources/shiny/drowzee.png new file mode 100644 index 0000000..92e29b2 Binary files /dev/null and b/resources/shiny/drowzee.png differ diff --git a/resources/shiny/dugtrio.png b/resources/shiny/dugtrio.png new file mode 100644 index 0000000..e555982 Binary files /dev/null and b/resources/shiny/dugtrio.png differ diff --git a/resources/shiny/dunsparce.png b/resources/shiny/dunsparce.png new file mode 100644 index 0000000..1589385 Binary files /dev/null and b/resources/shiny/dunsparce.png differ diff --git a/resources/shiny/dusclops.png b/resources/shiny/dusclops.png new file mode 100644 index 0000000..74d4f04 Binary files /dev/null and b/resources/shiny/dusclops.png differ diff --git a/resources/shiny/duskull.png b/resources/shiny/duskull.png new file mode 100644 index 0000000..c9f866c Binary files /dev/null and b/resources/shiny/duskull.png differ diff --git a/resources/shiny/dustox.png b/resources/shiny/dustox.png new file mode 100644 index 0000000..107ffbf Binary files /dev/null and b/resources/shiny/dustox.png differ diff --git a/resources/shiny/eevee.png b/resources/shiny/eevee.png new file mode 100644 index 0000000..30af82d Binary files /dev/null and b/resources/shiny/eevee.png differ diff --git a/resources/shiny/ekans.png b/resources/shiny/ekans.png new file mode 100644 index 0000000..bcbb22f Binary files /dev/null and b/resources/shiny/ekans.png differ diff --git a/resources/shiny/electabuzz.png b/resources/shiny/electabuzz.png new file mode 100644 index 0000000..553735f Binary files /dev/null and b/resources/shiny/electabuzz.png differ diff --git a/resources/shiny/electrike.png b/resources/shiny/electrike.png new file mode 100644 index 0000000..5955f8e Binary files /dev/null and b/resources/shiny/electrike.png differ diff --git a/resources/shiny/electrode.png b/resources/shiny/electrode.png new file mode 100644 index 0000000..05b8558 Binary files /dev/null and b/resources/shiny/electrode.png differ diff --git a/resources/shiny/elekid.png b/resources/shiny/elekid.png new file mode 100644 index 0000000..26d6537 Binary files /dev/null and b/resources/shiny/elekid.png differ diff --git a/resources/shiny/entei.png b/resources/shiny/entei.png new file mode 100644 index 0000000..b86d640 Binary files /dev/null and b/resources/shiny/entei.png differ diff --git a/resources/shiny/espeon.png b/resources/shiny/espeon.png new file mode 100644 index 0000000..3b14a13 Binary files /dev/null and b/resources/shiny/espeon.png differ diff --git a/resources/shiny/exeggcute.png b/resources/shiny/exeggcute.png new file mode 100644 index 0000000..c0ae552 Binary files /dev/null and b/resources/shiny/exeggcute.png differ diff --git a/resources/shiny/exeggutor.png b/resources/shiny/exeggutor.png new file mode 100644 index 0000000..83db085 Binary files /dev/null and b/resources/shiny/exeggutor.png differ diff --git a/resources/shiny/exploud.png b/resources/shiny/exploud.png new file mode 100644 index 0000000..81a406b Binary files /dev/null and b/resources/shiny/exploud.png differ diff --git a/resources/shiny/farfetchd.png b/resources/shiny/farfetchd.png new file mode 100644 index 0000000..649c844 Binary files /dev/null and b/resources/shiny/farfetchd.png differ diff --git a/resources/shiny/fearow.png b/resources/shiny/fearow.png new file mode 100644 index 0000000..6100bb2 Binary files /dev/null and b/resources/shiny/fearow.png differ diff --git a/resources/shiny/feebas.png b/resources/shiny/feebas.png new file mode 100644 index 0000000..9a158c8 Binary files /dev/null and b/resources/shiny/feebas.png differ diff --git a/resources/shiny/feraligatr.png b/resources/shiny/feraligatr.png new file mode 100644 index 0000000..1272c38 Binary files /dev/null and b/resources/shiny/feraligatr.png differ diff --git a/resources/shiny/flaaffy.png b/resources/shiny/flaaffy.png new file mode 100644 index 0000000..bb37982 Binary files /dev/null and b/resources/shiny/flaaffy.png differ diff --git a/resources/shiny/flareon.png b/resources/shiny/flareon.png new file mode 100644 index 0000000..5db5dc2 Binary files /dev/null and b/resources/shiny/flareon.png differ diff --git a/resources/shiny/flygon.png b/resources/shiny/flygon.png new file mode 100644 index 0000000..3b3d7f8 Binary files /dev/null and b/resources/shiny/flygon.png differ diff --git a/resources/shiny/forretress.png b/resources/shiny/forretress.png new file mode 100644 index 0000000..2abf9b0 Binary files /dev/null and b/resources/shiny/forretress.png differ diff --git a/resources/shiny/furret.png b/resources/shiny/furret.png new file mode 100644 index 0000000..c8f19f5 Binary files /dev/null and b/resources/shiny/furret.png differ diff --git a/resources/shiny/gardevoir.png b/resources/shiny/gardevoir.png new file mode 100644 index 0000000..55a441e Binary files /dev/null and b/resources/shiny/gardevoir.png differ diff --git a/resources/shiny/gastly.png b/resources/shiny/gastly.png new file mode 100644 index 0000000..9e5ce44 Binary files /dev/null and b/resources/shiny/gastly.png differ diff --git a/resources/shiny/gengar.png b/resources/shiny/gengar.png new file mode 100644 index 0000000..a8681dc Binary files /dev/null and b/resources/shiny/gengar.png differ diff --git a/resources/shiny/geodude.png b/resources/shiny/geodude.png new file mode 100644 index 0000000..de1bf07 Binary files /dev/null and b/resources/shiny/geodude.png differ diff --git a/resources/shiny/girafarig.png b/resources/shiny/girafarig.png new file mode 100644 index 0000000..5150fd6 Binary files /dev/null and b/resources/shiny/girafarig.png differ diff --git a/resources/shiny/glalie.png b/resources/shiny/glalie.png new file mode 100644 index 0000000..5053b4d Binary files /dev/null and b/resources/shiny/glalie.png differ diff --git a/resources/shiny/gligar.png b/resources/shiny/gligar.png new file mode 100644 index 0000000..0b81396 Binary files /dev/null and b/resources/shiny/gligar.png differ diff --git a/resources/shiny/gloom.png b/resources/shiny/gloom.png new file mode 100644 index 0000000..50011ea Binary files /dev/null and b/resources/shiny/gloom.png differ diff --git a/resources/shiny/golbat.png b/resources/shiny/golbat.png new file mode 100644 index 0000000..921c51e Binary files /dev/null and b/resources/shiny/golbat.png differ diff --git a/resources/shiny/goldeen.png b/resources/shiny/goldeen.png new file mode 100644 index 0000000..8df83b2 Binary files /dev/null and b/resources/shiny/goldeen.png differ diff --git a/resources/shiny/golduck.png b/resources/shiny/golduck.png new file mode 100644 index 0000000..bfd7a09 Binary files /dev/null and b/resources/shiny/golduck.png differ diff --git a/resources/shiny/golem.png b/resources/shiny/golem.png new file mode 100644 index 0000000..afcec7d Binary files /dev/null and b/resources/shiny/golem.png differ diff --git a/resources/shiny/gorebyss.png b/resources/shiny/gorebyss.png new file mode 100644 index 0000000..07fc11a Binary files /dev/null and b/resources/shiny/gorebyss.png differ diff --git a/resources/shiny/granbull.png b/resources/shiny/granbull.png new file mode 100644 index 0000000..59d7a74 Binary files /dev/null and b/resources/shiny/granbull.png differ diff --git a/resources/shiny/graveler.png b/resources/shiny/graveler.png new file mode 100644 index 0000000..08a39bd Binary files /dev/null and b/resources/shiny/graveler.png differ diff --git a/resources/shiny/grimer.png b/resources/shiny/grimer.png new file mode 100644 index 0000000..b1daca6 Binary files /dev/null and b/resources/shiny/grimer.png differ diff --git a/resources/shiny/groudon.png b/resources/shiny/groudon.png new file mode 100644 index 0000000..7696bd3 Binary files /dev/null and b/resources/shiny/groudon.png differ diff --git a/resources/shiny/grovyle.png b/resources/shiny/grovyle.png new file mode 100644 index 0000000..234f3ed Binary files /dev/null and b/resources/shiny/grovyle.png differ diff --git a/resources/shiny/growlithe.png b/resources/shiny/growlithe.png new file mode 100644 index 0000000..ed09b59 Binary files /dev/null and b/resources/shiny/growlithe.png differ diff --git a/resources/shiny/grumpig.png b/resources/shiny/grumpig.png new file mode 100644 index 0000000..f70decd Binary files /dev/null and b/resources/shiny/grumpig.png differ diff --git a/resources/shiny/gulpin.png b/resources/shiny/gulpin.png new file mode 100644 index 0000000..c3258ce Binary files /dev/null and b/resources/shiny/gulpin.png differ diff --git a/resources/shiny/gyarados.png b/resources/shiny/gyarados.png new file mode 100644 index 0000000..ee58bf0 Binary files /dev/null and b/resources/shiny/gyarados.png differ diff --git a/resources/shiny/hariyama.png b/resources/shiny/hariyama.png new file mode 100644 index 0000000..2c3bc07 Binary files /dev/null and b/resources/shiny/hariyama.png differ diff --git a/resources/shiny/haunter.png b/resources/shiny/haunter.png new file mode 100644 index 0000000..ea0157b Binary files /dev/null and b/resources/shiny/haunter.png differ diff --git a/resources/shiny/heracross.png b/resources/shiny/heracross.png new file mode 100644 index 0000000..5f9d70d Binary files /dev/null and b/resources/shiny/heracross.png differ diff --git a/resources/shiny/hitmonchan.png b/resources/shiny/hitmonchan.png new file mode 100644 index 0000000..053c492 Binary files /dev/null and b/resources/shiny/hitmonchan.png differ diff --git a/resources/shiny/hitmonlee.png b/resources/shiny/hitmonlee.png new file mode 100644 index 0000000..c194bb4 Binary files /dev/null and b/resources/shiny/hitmonlee.png differ diff --git a/resources/shiny/hitmontop.png b/resources/shiny/hitmontop.png new file mode 100644 index 0000000..1c945b3 Binary files /dev/null and b/resources/shiny/hitmontop.png differ diff --git a/resources/shiny/ho_oh.png b/resources/shiny/ho_oh.png new file mode 100644 index 0000000..6300abd Binary files /dev/null and b/resources/shiny/ho_oh.png differ diff --git a/resources/shiny/hoothoot.png b/resources/shiny/hoothoot.png new file mode 100644 index 0000000..cb0794b Binary files /dev/null and b/resources/shiny/hoothoot.png differ diff --git a/resources/shiny/hoppip.png b/resources/shiny/hoppip.png new file mode 100644 index 0000000..7f61f74 Binary files /dev/null and b/resources/shiny/hoppip.png differ diff --git a/resources/shiny/horsea.png b/resources/shiny/horsea.png new file mode 100644 index 0000000..08b5470 Binary files /dev/null and b/resources/shiny/horsea.png differ diff --git a/resources/shiny/houndoom.png b/resources/shiny/houndoom.png new file mode 100644 index 0000000..6593137 Binary files /dev/null and b/resources/shiny/houndoom.png differ diff --git a/resources/shiny/houndour.png b/resources/shiny/houndour.png new file mode 100644 index 0000000..ff41258 Binary files /dev/null and b/resources/shiny/houndour.png differ diff --git a/resources/shiny/huntail.png b/resources/shiny/huntail.png new file mode 100644 index 0000000..b67502b Binary files /dev/null and b/resources/shiny/huntail.png differ diff --git a/resources/shiny/hypno.png b/resources/shiny/hypno.png new file mode 100644 index 0000000..9ef84c1 Binary files /dev/null and b/resources/shiny/hypno.png differ diff --git a/resources/shiny/igglybuff.png b/resources/shiny/igglybuff.png new file mode 100644 index 0000000..7b57cc5 Binary files /dev/null and b/resources/shiny/igglybuff.png differ diff --git a/resources/shiny/illumise.png b/resources/shiny/illumise.png new file mode 100644 index 0000000..3ee9e5c Binary files /dev/null and b/resources/shiny/illumise.png differ diff --git a/resources/shiny/ivysaur.png b/resources/shiny/ivysaur.png new file mode 100644 index 0000000..bf017db Binary files /dev/null and b/resources/shiny/ivysaur.png differ diff --git a/resources/shiny/jigglypuff.png b/resources/shiny/jigglypuff.png new file mode 100644 index 0000000..c9083d6 Binary files /dev/null and b/resources/shiny/jigglypuff.png differ diff --git a/resources/shiny/jirachi.png b/resources/shiny/jirachi.png new file mode 100644 index 0000000..cfac8d1 Binary files /dev/null and b/resources/shiny/jirachi.png differ diff --git a/resources/shiny/jolteon.png b/resources/shiny/jolteon.png new file mode 100644 index 0000000..8621ade Binary files /dev/null and b/resources/shiny/jolteon.png differ diff --git a/resources/shiny/jumpluff.png b/resources/shiny/jumpluff.png new file mode 100644 index 0000000..a5898b5 Binary files /dev/null and b/resources/shiny/jumpluff.png differ diff --git a/resources/shiny/jynx.png b/resources/shiny/jynx.png new file mode 100644 index 0000000..3b93e0a Binary files /dev/null and b/resources/shiny/jynx.png differ diff --git a/resources/shiny/kabuto.png b/resources/shiny/kabuto.png new file mode 100644 index 0000000..938a78d Binary files /dev/null and b/resources/shiny/kabuto.png differ diff --git a/resources/shiny/kabutops.png b/resources/shiny/kabutops.png new file mode 100644 index 0000000..48e4f11 Binary files /dev/null and b/resources/shiny/kabutops.png differ diff --git a/resources/shiny/kadabra.png b/resources/shiny/kadabra.png new file mode 100644 index 0000000..6a28c64 Binary files /dev/null and b/resources/shiny/kadabra.png differ diff --git a/resources/shiny/kakuna.png b/resources/shiny/kakuna.png new file mode 100644 index 0000000..ddbbde5 Binary files /dev/null and b/resources/shiny/kakuna.png differ diff --git a/resources/shiny/kangaskhan.png b/resources/shiny/kangaskhan.png new file mode 100644 index 0000000..3ba0f58 Binary files /dev/null and b/resources/shiny/kangaskhan.png differ diff --git a/resources/shiny/kecleon.png b/resources/shiny/kecleon.png new file mode 100644 index 0000000..e8cd61c Binary files /dev/null and b/resources/shiny/kecleon.png differ diff --git a/resources/shiny/kingdra.png b/resources/shiny/kingdra.png new file mode 100644 index 0000000..463db42 Binary files /dev/null and b/resources/shiny/kingdra.png differ diff --git a/resources/shiny/kingler.png b/resources/shiny/kingler.png new file mode 100644 index 0000000..8299a5c Binary files /dev/null and b/resources/shiny/kingler.png differ diff --git a/resources/shiny/kirlia.png b/resources/shiny/kirlia.png new file mode 100644 index 0000000..1fae19c Binary files /dev/null and b/resources/shiny/kirlia.png differ diff --git a/resources/shiny/koffing.png b/resources/shiny/koffing.png new file mode 100644 index 0000000..3ba4616 Binary files /dev/null and b/resources/shiny/koffing.png differ diff --git a/resources/shiny/krabby.png b/resources/shiny/krabby.png new file mode 100644 index 0000000..efc244c Binary files /dev/null and b/resources/shiny/krabby.png differ diff --git a/resources/shiny/kyogre.png b/resources/shiny/kyogre.png new file mode 100644 index 0000000..e6c92f2 Binary files /dev/null and b/resources/shiny/kyogre.png differ diff --git a/resources/shiny/lairon.png b/resources/shiny/lairon.png new file mode 100644 index 0000000..ce2e702 Binary files /dev/null and b/resources/shiny/lairon.png differ diff --git a/resources/shiny/lanturn.png b/resources/shiny/lanturn.png new file mode 100644 index 0000000..b502fb8 Binary files /dev/null and b/resources/shiny/lanturn.png differ diff --git a/resources/shiny/lapras.png b/resources/shiny/lapras.png new file mode 100644 index 0000000..2e1f72f Binary files /dev/null and b/resources/shiny/lapras.png differ diff --git a/resources/shiny/larvitar.png b/resources/shiny/larvitar.png new file mode 100644 index 0000000..61f217e Binary files /dev/null and b/resources/shiny/larvitar.png differ diff --git a/resources/shiny/latias.png b/resources/shiny/latias.png new file mode 100644 index 0000000..e126a15 Binary files /dev/null and b/resources/shiny/latias.png differ diff --git a/resources/shiny/latios.png b/resources/shiny/latios.png new file mode 100644 index 0000000..cab56ad Binary files /dev/null and b/resources/shiny/latios.png differ diff --git a/resources/shiny/ledian.png b/resources/shiny/ledian.png new file mode 100644 index 0000000..d16ff41 Binary files /dev/null and b/resources/shiny/ledian.png differ diff --git a/resources/shiny/ledyba.png b/resources/shiny/ledyba.png new file mode 100644 index 0000000..3e3c370 Binary files /dev/null and b/resources/shiny/ledyba.png differ diff --git a/resources/shiny/lickitung.png b/resources/shiny/lickitung.png new file mode 100644 index 0000000..e977963 Binary files /dev/null and b/resources/shiny/lickitung.png differ diff --git a/resources/shiny/lileep.png b/resources/shiny/lileep.png new file mode 100644 index 0000000..e89954e Binary files /dev/null and b/resources/shiny/lileep.png differ diff --git a/resources/shiny/linoone.png b/resources/shiny/linoone.png new file mode 100644 index 0000000..49744bf Binary files /dev/null and b/resources/shiny/linoone.png differ diff --git a/resources/shiny/lombre.png b/resources/shiny/lombre.png new file mode 100644 index 0000000..7e8d564 Binary files /dev/null and b/resources/shiny/lombre.png differ diff --git a/resources/shiny/lotad.png b/resources/shiny/lotad.png new file mode 100644 index 0000000..a036c17 Binary files /dev/null and b/resources/shiny/lotad.png differ diff --git a/resources/shiny/loudred.png b/resources/shiny/loudred.png new file mode 100644 index 0000000..5ea98c7 Binary files /dev/null and b/resources/shiny/loudred.png differ diff --git a/resources/shiny/ludicolo.png b/resources/shiny/ludicolo.png new file mode 100644 index 0000000..5a87725 Binary files /dev/null and b/resources/shiny/ludicolo.png differ diff --git a/resources/shiny/lugia.png b/resources/shiny/lugia.png new file mode 100644 index 0000000..667c639 Binary files /dev/null and b/resources/shiny/lugia.png differ diff --git a/resources/shiny/lunatone.png b/resources/shiny/lunatone.png new file mode 100644 index 0000000..1905d22 Binary files /dev/null and b/resources/shiny/lunatone.png differ diff --git a/resources/shiny/luvdisc.png b/resources/shiny/luvdisc.png new file mode 100644 index 0000000..a02b1df Binary files /dev/null and b/resources/shiny/luvdisc.png differ diff --git a/resources/shiny/machamp.png b/resources/shiny/machamp.png new file mode 100644 index 0000000..066df38 Binary files /dev/null and b/resources/shiny/machamp.png differ diff --git a/resources/shiny/machoke.png b/resources/shiny/machoke.png new file mode 100644 index 0000000..c7287b9 Binary files /dev/null and b/resources/shiny/machoke.png differ diff --git a/resources/shiny/machop.png b/resources/shiny/machop.png new file mode 100644 index 0000000..75ee343 Binary files /dev/null and b/resources/shiny/machop.png differ diff --git a/resources/shiny/magby.png b/resources/shiny/magby.png new file mode 100644 index 0000000..d8d63fa Binary files /dev/null and b/resources/shiny/magby.png differ diff --git a/resources/shiny/magcargo.png b/resources/shiny/magcargo.png new file mode 100644 index 0000000..2c2bf32 Binary files /dev/null and b/resources/shiny/magcargo.png differ diff --git a/resources/shiny/magikarp.png b/resources/shiny/magikarp.png new file mode 100644 index 0000000..c8e1922 Binary files /dev/null and b/resources/shiny/magikarp.png differ diff --git a/resources/shiny/magmar.png b/resources/shiny/magmar.png new file mode 100644 index 0000000..53bd61e Binary files /dev/null and b/resources/shiny/magmar.png differ diff --git a/resources/shiny/magnemite.png b/resources/shiny/magnemite.png new file mode 100644 index 0000000..dbf7c20 Binary files /dev/null and b/resources/shiny/magnemite.png differ diff --git a/resources/shiny/magneton.png b/resources/shiny/magneton.png new file mode 100644 index 0000000..593e3f4 Binary files /dev/null and b/resources/shiny/magneton.png differ diff --git a/resources/shiny/makuhita.png b/resources/shiny/makuhita.png new file mode 100644 index 0000000..3938bd2 Binary files /dev/null and b/resources/shiny/makuhita.png differ diff --git a/resources/shiny/manectric.png b/resources/shiny/manectric.png new file mode 100644 index 0000000..8a2cabe Binary files /dev/null and b/resources/shiny/manectric.png differ diff --git a/resources/shiny/mankey.png b/resources/shiny/mankey.png new file mode 100644 index 0000000..17ebb97 Binary files /dev/null and b/resources/shiny/mankey.png differ diff --git a/resources/shiny/mantine.png b/resources/shiny/mantine.png new file mode 100644 index 0000000..3527565 Binary files /dev/null and b/resources/shiny/mantine.png differ diff --git a/resources/shiny/mareep.png b/resources/shiny/mareep.png new file mode 100644 index 0000000..05daee1 Binary files /dev/null and b/resources/shiny/mareep.png differ diff --git a/resources/shiny/marill.png b/resources/shiny/marill.png new file mode 100644 index 0000000..745698e Binary files /dev/null and b/resources/shiny/marill.png differ diff --git a/resources/shiny/marowak.png b/resources/shiny/marowak.png new file mode 100644 index 0000000..b19f186 Binary files /dev/null and b/resources/shiny/marowak.png differ diff --git a/resources/shiny/marshtomp.png b/resources/shiny/marshtomp.png new file mode 100644 index 0000000..cfd7c74 Binary files /dev/null and b/resources/shiny/marshtomp.png differ diff --git a/resources/shiny/masquerain.png b/resources/shiny/masquerain.png new file mode 100644 index 0000000..657856e Binary files /dev/null and b/resources/shiny/masquerain.png differ diff --git a/resources/shiny/mawile.png b/resources/shiny/mawile.png new file mode 100644 index 0000000..d8c7d45 Binary files /dev/null and b/resources/shiny/mawile.png differ diff --git a/resources/shiny/medicham.png b/resources/shiny/medicham.png new file mode 100644 index 0000000..960bb8a Binary files /dev/null and b/resources/shiny/medicham.png differ diff --git a/resources/shiny/meditite.png b/resources/shiny/meditite.png new file mode 100644 index 0000000..7ef20ad Binary files /dev/null and b/resources/shiny/meditite.png differ diff --git a/resources/shiny/meganium.png b/resources/shiny/meganium.png new file mode 100644 index 0000000..7adae25 Binary files /dev/null and b/resources/shiny/meganium.png differ diff --git a/resources/shiny/meowth.png b/resources/shiny/meowth.png new file mode 100644 index 0000000..7fabe82 Binary files /dev/null and b/resources/shiny/meowth.png differ diff --git a/resources/shiny/metagross.png b/resources/shiny/metagross.png new file mode 100644 index 0000000..4486f0d Binary files /dev/null and b/resources/shiny/metagross.png differ diff --git a/resources/shiny/metang.png b/resources/shiny/metang.png new file mode 100644 index 0000000..223cb22 Binary files /dev/null and b/resources/shiny/metang.png differ diff --git a/resources/shiny/metapod.png b/resources/shiny/metapod.png new file mode 100644 index 0000000..65c9755 Binary files /dev/null and b/resources/shiny/metapod.png differ diff --git a/resources/shiny/mew.png b/resources/shiny/mew.png new file mode 100644 index 0000000..e3ca527 Binary files /dev/null and b/resources/shiny/mew.png differ diff --git a/resources/shiny/mewtwo.png b/resources/shiny/mewtwo.png new file mode 100644 index 0000000..9847d75 Binary files /dev/null and b/resources/shiny/mewtwo.png differ diff --git a/resources/shiny/mightyena.png b/resources/shiny/mightyena.png new file mode 100644 index 0000000..fc96c74 Binary files /dev/null and b/resources/shiny/mightyena.png differ diff --git a/resources/shiny/milotic.png b/resources/shiny/milotic.png new file mode 100644 index 0000000..b4ecaa7 Binary files /dev/null and b/resources/shiny/milotic.png differ diff --git a/resources/shiny/miltank.png b/resources/shiny/miltank.png new file mode 100644 index 0000000..15dc680 Binary files /dev/null and b/resources/shiny/miltank.png differ diff --git a/resources/shiny/minun.png b/resources/shiny/minun.png new file mode 100644 index 0000000..b06c732 Binary files /dev/null and b/resources/shiny/minun.png differ diff --git a/resources/shiny/misdreavus.png b/resources/shiny/misdreavus.png new file mode 100644 index 0000000..aef0040 Binary files /dev/null and b/resources/shiny/misdreavus.png differ diff --git a/resources/shiny/moltres.png b/resources/shiny/moltres.png new file mode 100644 index 0000000..8c7051e Binary files /dev/null and b/resources/shiny/moltres.png differ diff --git a/resources/shiny/mr_mime.png b/resources/shiny/mr_mime.png new file mode 100644 index 0000000..c29d672 Binary files /dev/null and b/resources/shiny/mr_mime.png differ diff --git a/resources/shiny/mudkip.png b/resources/shiny/mudkip.png new file mode 100644 index 0000000..e4234fc Binary files /dev/null and b/resources/shiny/mudkip.png differ diff --git a/resources/shiny/muk.png b/resources/shiny/muk.png new file mode 100644 index 0000000..bbe46ef Binary files /dev/null and b/resources/shiny/muk.png differ diff --git a/resources/shiny/murkrow.png b/resources/shiny/murkrow.png new file mode 100644 index 0000000..4163c4a Binary files /dev/null and b/resources/shiny/murkrow.png differ diff --git a/resources/shiny/natu.png b/resources/shiny/natu.png new file mode 100644 index 0000000..0be7bdb Binary files /dev/null and b/resources/shiny/natu.png differ diff --git a/resources/shiny/nidoking.png b/resources/shiny/nidoking.png new file mode 100644 index 0000000..fa58e92 Binary files /dev/null and b/resources/shiny/nidoking.png differ diff --git a/resources/shiny/nidoqueen.png b/resources/shiny/nidoqueen.png new file mode 100644 index 0000000..bcd3e24 Binary files /dev/null and b/resources/shiny/nidoqueen.png differ diff --git a/resources/shiny/nidoran_f.png b/resources/shiny/nidoran_f.png new file mode 100644 index 0000000..74d54bb Binary files /dev/null and b/resources/shiny/nidoran_f.png differ diff --git a/resources/shiny/nidoran_m.png b/resources/shiny/nidoran_m.png new file mode 100644 index 0000000..cc1299d Binary files /dev/null and b/resources/shiny/nidoran_m.png differ diff --git a/resources/shiny/nidorina.png b/resources/shiny/nidorina.png new file mode 100644 index 0000000..8deee58 Binary files /dev/null and b/resources/shiny/nidorina.png differ diff --git a/resources/shiny/nidorino.png b/resources/shiny/nidorino.png new file mode 100644 index 0000000..708ef07 Binary files /dev/null and b/resources/shiny/nidorino.png differ diff --git a/resources/shiny/nincada.png b/resources/shiny/nincada.png new file mode 100644 index 0000000..4757cc1 Binary files /dev/null and b/resources/shiny/nincada.png differ diff --git a/resources/shiny/ninetales.png b/resources/shiny/ninetales.png new file mode 100644 index 0000000..049a20f Binary files /dev/null and b/resources/shiny/ninetales.png differ diff --git a/resources/shiny/ninjask.png b/resources/shiny/ninjask.png new file mode 100644 index 0000000..57e4dba Binary files /dev/null and b/resources/shiny/ninjask.png differ diff --git a/resources/shiny/noctowl.png b/resources/shiny/noctowl.png new file mode 100644 index 0000000..096a4d6 Binary files /dev/null and b/resources/shiny/noctowl.png differ diff --git a/resources/shiny/nosepass.png b/resources/shiny/nosepass.png new file mode 100644 index 0000000..27ffc3c Binary files /dev/null and b/resources/shiny/nosepass.png differ diff --git a/resources/shiny/numel.png b/resources/shiny/numel.png new file mode 100644 index 0000000..349bce8 Binary files /dev/null and b/resources/shiny/numel.png differ diff --git a/resources/shiny/nuzleaf.png b/resources/shiny/nuzleaf.png new file mode 100644 index 0000000..d72fc17 Binary files /dev/null and b/resources/shiny/nuzleaf.png differ diff --git a/resources/shiny/octillery.png b/resources/shiny/octillery.png new file mode 100644 index 0000000..5f46131 Binary files /dev/null and b/resources/shiny/octillery.png differ diff --git a/resources/shiny/oddish.png b/resources/shiny/oddish.png new file mode 100644 index 0000000..9575bc7 Binary files /dev/null and b/resources/shiny/oddish.png differ diff --git a/resources/shiny/omanyte.png b/resources/shiny/omanyte.png new file mode 100644 index 0000000..d6cfaa8 Binary files /dev/null and b/resources/shiny/omanyte.png differ diff --git a/resources/shiny/omastar.png b/resources/shiny/omastar.png new file mode 100644 index 0000000..fabf1cc Binary files /dev/null and b/resources/shiny/omastar.png differ diff --git a/resources/shiny/onix.png b/resources/shiny/onix.png new file mode 100644 index 0000000..94641a4 Binary files /dev/null and b/resources/shiny/onix.png differ diff --git a/resources/shiny/paras.png b/resources/shiny/paras.png new file mode 100644 index 0000000..2c48c67 Binary files /dev/null and b/resources/shiny/paras.png differ diff --git a/resources/shiny/parasect.png b/resources/shiny/parasect.png new file mode 100644 index 0000000..62fee79 Binary files /dev/null and b/resources/shiny/parasect.png differ diff --git a/resources/shiny/pelipper.png b/resources/shiny/pelipper.png new file mode 100644 index 0000000..eea1fb1 Binary files /dev/null and b/resources/shiny/pelipper.png differ diff --git a/resources/shiny/persian.png b/resources/shiny/persian.png new file mode 100644 index 0000000..ae59d4b Binary files /dev/null and b/resources/shiny/persian.png differ diff --git a/resources/shiny/phanpy.png b/resources/shiny/phanpy.png new file mode 100644 index 0000000..b5a8157 Binary files /dev/null and b/resources/shiny/phanpy.png differ diff --git a/resources/shiny/pichu.png b/resources/shiny/pichu.png new file mode 100644 index 0000000..9af5a11 Binary files /dev/null and b/resources/shiny/pichu.png differ diff --git a/resources/shiny/pidgeot.png b/resources/shiny/pidgeot.png new file mode 100644 index 0000000..eadd3e4 Binary files /dev/null and b/resources/shiny/pidgeot.png differ diff --git a/resources/shiny/pidgeotto.png b/resources/shiny/pidgeotto.png new file mode 100644 index 0000000..3b36b22 Binary files /dev/null and b/resources/shiny/pidgeotto.png differ diff --git a/resources/shiny/pidgey.png b/resources/shiny/pidgey.png new file mode 100644 index 0000000..a0fd4db Binary files /dev/null and b/resources/shiny/pidgey.png differ diff --git a/resources/shiny/pikachu.png b/resources/shiny/pikachu.png new file mode 100644 index 0000000..8caecc7 Binary files /dev/null and b/resources/shiny/pikachu.png differ diff --git a/resources/shiny/piloswine.png b/resources/shiny/piloswine.png new file mode 100644 index 0000000..11d23fb Binary files /dev/null and b/resources/shiny/piloswine.png differ diff --git a/resources/shiny/pineco.png b/resources/shiny/pineco.png new file mode 100644 index 0000000..307567a Binary files /dev/null and b/resources/shiny/pineco.png differ diff --git a/resources/shiny/pinsir.png b/resources/shiny/pinsir.png new file mode 100644 index 0000000..d3953f2 Binary files /dev/null and b/resources/shiny/pinsir.png differ diff --git a/resources/shiny/plusle.png b/resources/shiny/plusle.png new file mode 100644 index 0000000..b3a2077 Binary files /dev/null and b/resources/shiny/plusle.png differ diff --git a/resources/shiny/politoed.png b/resources/shiny/politoed.png new file mode 100644 index 0000000..5fdcb25 Binary files /dev/null and b/resources/shiny/politoed.png differ diff --git a/resources/shiny/poliwag.png b/resources/shiny/poliwag.png new file mode 100644 index 0000000..0acbaaf Binary files /dev/null and b/resources/shiny/poliwag.png differ diff --git a/resources/shiny/poliwhirl.png b/resources/shiny/poliwhirl.png new file mode 100644 index 0000000..24b42a6 Binary files /dev/null and b/resources/shiny/poliwhirl.png differ diff --git a/resources/shiny/poliwrath.png b/resources/shiny/poliwrath.png new file mode 100644 index 0000000..1a3c2db Binary files /dev/null and b/resources/shiny/poliwrath.png differ diff --git a/resources/shiny/ponyta.png b/resources/shiny/ponyta.png new file mode 100644 index 0000000..2de9938 Binary files /dev/null and b/resources/shiny/ponyta.png differ diff --git a/resources/shiny/poochyena.png b/resources/shiny/poochyena.png new file mode 100644 index 0000000..8b1d0fd Binary files /dev/null and b/resources/shiny/poochyena.png differ diff --git a/resources/shiny/porygon.png b/resources/shiny/porygon.png new file mode 100644 index 0000000..7b31f8c Binary files /dev/null and b/resources/shiny/porygon.png differ diff --git a/resources/shiny/porygon2.png b/resources/shiny/porygon2.png new file mode 100644 index 0000000..5f5c6e4 Binary files /dev/null and b/resources/shiny/porygon2.png differ diff --git a/resources/shiny/primeape.png b/resources/shiny/primeape.png new file mode 100644 index 0000000..f24aee2 Binary files /dev/null and b/resources/shiny/primeape.png differ diff --git a/resources/shiny/psyduck.png b/resources/shiny/psyduck.png new file mode 100644 index 0000000..484ef06 Binary files /dev/null and b/resources/shiny/psyduck.png differ diff --git a/resources/shiny/pupitar.png b/resources/shiny/pupitar.png new file mode 100644 index 0000000..791e32a Binary files /dev/null and b/resources/shiny/pupitar.png differ diff --git a/resources/shiny/quagsire.png b/resources/shiny/quagsire.png new file mode 100644 index 0000000..e05c852 Binary files /dev/null and b/resources/shiny/quagsire.png differ diff --git a/resources/shiny/quilava.png b/resources/shiny/quilava.png new file mode 100644 index 0000000..4583671 Binary files /dev/null and b/resources/shiny/quilava.png differ diff --git a/resources/shiny/qwilfish.png b/resources/shiny/qwilfish.png new file mode 100644 index 0000000..31540e6 Binary files /dev/null and b/resources/shiny/qwilfish.png differ diff --git a/resources/shiny/raichu.png b/resources/shiny/raichu.png new file mode 100644 index 0000000..f7e7d8e Binary files /dev/null and b/resources/shiny/raichu.png differ diff --git a/resources/shiny/raikou.png b/resources/shiny/raikou.png new file mode 100644 index 0000000..22df7de Binary files /dev/null and b/resources/shiny/raikou.png differ diff --git a/resources/shiny/ralts.png b/resources/shiny/ralts.png new file mode 100644 index 0000000..34a29e1 Binary files /dev/null and b/resources/shiny/ralts.png differ diff --git a/resources/shiny/rapidash.png b/resources/shiny/rapidash.png new file mode 100644 index 0000000..381fd2e Binary files /dev/null and b/resources/shiny/rapidash.png differ diff --git a/resources/shiny/raticate.png b/resources/shiny/raticate.png new file mode 100644 index 0000000..cfa5902 Binary files /dev/null and b/resources/shiny/raticate.png differ diff --git a/resources/shiny/rattata.png b/resources/shiny/rattata.png new file mode 100644 index 0000000..31a091e Binary files /dev/null and b/resources/shiny/rattata.png differ diff --git a/resources/shiny/rayquaza.png b/resources/shiny/rayquaza.png new file mode 100644 index 0000000..4ba9c9e Binary files /dev/null and b/resources/shiny/rayquaza.png differ diff --git a/resources/shiny/regice.png b/resources/shiny/regice.png new file mode 100644 index 0000000..be633a8 Binary files /dev/null and b/resources/shiny/regice.png differ diff --git a/resources/shiny/regirock.png b/resources/shiny/regirock.png new file mode 100644 index 0000000..3c3efac Binary files /dev/null and b/resources/shiny/regirock.png differ diff --git a/resources/shiny/registeel.png b/resources/shiny/registeel.png new file mode 100644 index 0000000..4aaed69 Binary files /dev/null and b/resources/shiny/registeel.png differ diff --git a/resources/shiny/relicanth.png b/resources/shiny/relicanth.png new file mode 100644 index 0000000..4d0cd5e Binary files /dev/null and b/resources/shiny/relicanth.png differ diff --git a/resources/shiny/remoraid.png b/resources/shiny/remoraid.png new file mode 100644 index 0000000..b8817f6 Binary files /dev/null and b/resources/shiny/remoraid.png differ diff --git a/resources/shiny/rhydon.png b/resources/shiny/rhydon.png new file mode 100644 index 0000000..690851f Binary files /dev/null and b/resources/shiny/rhydon.png differ diff --git a/resources/shiny/rhyhorn.png b/resources/shiny/rhyhorn.png new file mode 100644 index 0000000..adfb889 Binary files /dev/null and b/resources/shiny/rhyhorn.png differ diff --git a/resources/shiny/roselia.png b/resources/shiny/roselia.png new file mode 100644 index 0000000..b81e8ed Binary files /dev/null and b/resources/shiny/roselia.png differ diff --git a/resources/shiny/sableye.png b/resources/shiny/sableye.png new file mode 100644 index 0000000..80d3f34 Binary files /dev/null and b/resources/shiny/sableye.png differ diff --git a/resources/shiny/salamence.png b/resources/shiny/salamence.png new file mode 100644 index 0000000..3ff6aa5 Binary files /dev/null and b/resources/shiny/salamence.png differ diff --git a/resources/shiny/sandshrew.png b/resources/shiny/sandshrew.png new file mode 100644 index 0000000..fbf6b1d Binary files /dev/null and b/resources/shiny/sandshrew.png differ diff --git a/resources/shiny/sandslash.png b/resources/shiny/sandslash.png new file mode 100644 index 0000000..e4f2ee1 Binary files /dev/null and b/resources/shiny/sandslash.png differ diff --git a/resources/shiny/sceptile.png b/resources/shiny/sceptile.png new file mode 100644 index 0000000..dcefd70 Binary files /dev/null and b/resources/shiny/sceptile.png differ diff --git a/resources/shiny/scizor.png b/resources/shiny/scizor.png new file mode 100644 index 0000000..ee77c47 Binary files /dev/null and b/resources/shiny/scizor.png differ diff --git a/resources/shiny/scyther.png b/resources/shiny/scyther.png new file mode 100644 index 0000000..64e78e1 Binary files /dev/null and b/resources/shiny/scyther.png differ diff --git a/resources/shiny/seadra.png b/resources/shiny/seadra.png new file mode 100644 index 0000000..2bf089d Binary files /dev/null and b/resources/shiny/seadra.png differ diff --git a/resources/shiny/seaking.png b/resources/shiny/seaking.png new file mode 100644 index 0000000..2364d12 Binary files /dev/null and b/resources/shiny/seaking.png differ diff --git a/resources/shiny/sealeo.png b/resources/shiny/sealeo.png new file mode 100644 index 0000000..f11e890 Binary files /dev/null and b/resources/shiny/sealeo.png differ diff --git a/resources/shiny/seedot.png b/resources/shiny/seedot.png new file mode 100644 index 0000000..7924fba Binary files /dev/null and b/resources/shiny/seedot.png differ diff --git a/resources/shiny/seel.png b/resources/shiny/seel.png new file mode 100644 index 0000000..f0b69e8 Binary files /dev/null and b/resources/shiny/seel.png differ diff --git a/resources/shiny/sentret.png b/resources/shiny/sentret.png new file mode 100644 index 0000000..c6f28d7 Binary files /dev/null and b/resources/shiny/sentret.png differ diff --git a/resources/shiny/seviper.png b/resources/shiny/seviper.png new file mode 100644 index 0000000..e98f341 Binary files /dev/null and b/resources/shiny/seviper.png differ diff --git a/resources/shiny/sharpedo.png b/resources/shiny/sharpedo.png new file mode 100644 index 0000000..3c902c8 Binary files /dev/null and b/resources/shiny/sharpedo.png differ diff --git a/resources/shiny/shedinja.png b/resources/shiny/shedinja.png new file mode 100644 index 0000000..ed562a5 Binary files /dev/null and b/resources/shiny/shedinja.png differ diff --git a/resources/shiny/shelgon.png b/resources/shiny/shelgon.png new file mode 100644 index 0000000..8b59e31 Binary files /dev/null and b/resources/shiny/shelgon.png differ diff --git a/resources/shiny/shellder.png b/resources/shiny/shellder.png new file mode 100644 index 0000000..1e986bd Binary files /dev/null and b/resources/shiny/shellder.png differ diff --git a/resources/shiny/shiftry.png b/resources/shiny/shiftry.png new file mode 100644 index 0000000..183ff22 Binary files /dev/null and b/resources/shiny/shiftry.png differ diff --git a/resources/shiny/shroomish.png b/resources/shiny/shroomish.png new file mode 100644 index 0000000..3ccccd4 Binary files /dev/null and b/resources/shiny/shroomish.png differ diff --git a/resources/shiny/shuckle.png b/resources/shiny/shuckle.png new file mode 100644 index 0000000..1a800ca Binary files /dev/null and b/resources/shiny/shuckle.png differ diff --git a/resources/shiny/shuppet.png b/resources/shiny/shuppet.png new file mode 100644 index 0000000..a26bcd6 Binary files /dev/null and b/resources/shiny/shuppet.png differ diff --git a/resources/shiny/silcoon.png b/resources/shiny/silcoon.png new file mode 100644 index 0000000..3a16587 Binary files /dev/null and b/resources/shiny/silcoon.png differ diff --git a/resources/shiny/skarmory.png b/resources/shiny/skarmory.png new file mode 100644 index 0000000..00fefc4 Binary files /dev/null and b/resources/shiny/skarmory.png differ diff --git a/resources/shiny/skiploom.png b/resources/shiny/skiploom.png new file mode 100644 index 0000000..db4700f Binary files /dev/null and b/resources/shiny/skiploom.png differ diff --git a/resources/shiny/skitty.png b/resources/shiny/skitty.png new file mode 100644 index 0000000..cee0879 Binary files /dev/null and b/resources/shiny/skitty.png differ diff --git a/resources/shiny/slaking.png b/resources/shiny/slaking.png new file mode 100644 index 0000000..9a63494 Binary files /dev/null and b/resources/shiny/slaking.png differ diff --git a/resources/shiny/slakoth.png b/resources/shiny/slakoth.png new file mode 100644 index 0000000..2eebd6b Binary files /dev/null and b/resources/shiny/slakoth.png differ diff --git a/resources/shiny/slowbro.png b/resources/shiny/slowbro.png new file mode 100644 index 0000000..e1a3307 Binary files /dev/null and b/resources/shiny/slowbro.png differ diff --git a/resources/shiny/slowking.png b/resources/shiny/slowking.png new file mode 100644 index 0000000..f712d7b Binary files /dev/null and b/resources/shiny/slowking.png differ diff --git a/resources/shiny/slowpoke.png b/resources/shiny/slowpoke.png new file mode 100644 index 0000000..a1b4c6c Binary files /dev/null and b/resources/shiny/slowpoke.png differ diff --git a/resources/shiny/slugma.png b/resources/shiny/slugma.png new file mode 100644 index 0000000..111b84f Binary files /dev/null and b/resources/shiny/slugma.png differ diff --git a/resources/shiny/smeargle.png b/resources/shiny/smeargle.png new file mode 100644 index 0000000..a45e125 Binary files /dev/null and b/resources/shiny/smeargle.png differ diff --git a/resources/shiny/smoochum.png b/resources/shiny/smoochum.png new file mode 100644 index 0000000..51171a4 Binary files /dev/null and b/resources/shiny/smoochum.png differ diff --git a/resources/shiny/sneasel.png b/resources/shiny/sneasel.png new file mode 100644 index 0000000..4acdabc Binary files /dev/null and b/resources/shiny/sneasel.png differ diff --git a/resources/shiny/snorlax.png b/resources/shiny/snorlax.png new file mode 100644 index 0000000..ca6e9b2 Binary files /dev/null and b/resources/shiny/snorlax.png differ diff --git a/resources/shiny/snorunt.png b/resources/shiny/snorunt.png new file mode 100644 index 0000000..c3af20c Binary files /dev/null and b/resources/shiny/snorunt.png differ diff --git a/resources/shiny/snubbull.png b/resources/shiny/snubbull.png new file mode 100644 index 0000000..458ee0b Binary files /dev/null and b/resources/shiny/snubbull.png differ diff --git a/resources/shiny/solrock.png b/resources/shiny/solrock.png new file mode 100644 index 0000000..8a0ebe3 Binary files /dev/null and b/resources/shiny/solrock.png differ diff --git a/resources/shiny/spearow.png b/resources/shiny/spearow.png new file mode 100644 index 0000000..b07038b Binary files /dev/null and b/resources/shiny/spearow.png differ diff --git a/resources/shiny/spheal.png b/resources/shiny/spheal.png new file mode 100644 index 0000000..50b15b8 Binary files /dev/null and b/resources/shiny/spheal.png differ diff --git a/resources/shiny/spinarak.png b/resources/shiny/spinarak.png new file mode 100644 index 0000000..081f9c4 Binary files /dev/null and b/resources/shiny/spinarak.png differ diff --git a/resources/shiny/spinda.png b/resources/shiny/spinda.png new file mode 100644 index 0000000..b272a12 Binary files /dev/null and b/resources/shiny/spinda.png differ diff --git a/resources/shiny/spoink.png b/resources/shiny/spoink.png new file mode 100644 index 0000000..f65de67 Binary files /dev/null and b/resources/shiny/spoink.png differ diff --git a/resources/shiny/squirtle.png b/resources/shiny/squirtle.png new file mode 100644 index 0000000..d3b5c13 Binary files /dev/null and b/resources/shiny/squirtle.png differ diff --git a/resources/shiny/stantler.png b/resources/shiny/stantler.png new file mode 100644 index 0000000..4b1efd1 Binary files /dev/null and b/resources/shiny/stantler.png differ diff --git a/resources/shiny/starmie.png b/resources/shiny/starmie.png new file mode 100644 index 0000000..9164207 Binary files /dev/null and b/resources/shiny/starmie.png differ diff --git a/resources/shiny/staryu.png b/resources/shiny/staryu.png new file mode 100644 index 0000000..3687f97 Binary files /dev/null and b/resources/shiny/staryu.png differ diff --git a/resources/shiny/steelix.png b/resources/shiny/steelix.png new file mode 100644 index 0000000..6978755 Binary files /dev/null and b/resources/shiny/steelix.png differ diff --git a/resources/shiny/sudowoodo.png b/resources/shiny/sudowoodo.png new file mode 100644 index 0000000..47636e6 Binary files /dev/null and b/resources/shiny/sudowoodo.png differ diff --git a/resources/shiny/suicune.png b/resources/shiny/suicune.png new file mode 100644 index 0000000..8079e7f Binary files /dev/null and b/resources/shiny/suicune.png differ diff --git a/resources/shiny/sunflora.png b/resources/shiny/sunflora.png new file mode 100644 index 0000000..940cfb1 Binary files /dev/null and b/resources/shiny/sunflora.png differ diff --git a/resources/shiny/sunkern.png b/resources/shiny/sunkern.png new file mode 100644 index 0000000..4412ad4 Binary files /dev/null and b/resources/shiny/sunkern.png differ diff --git a/resources/shiny/surskit.png b/resources/shiny/surskit.png new file mode 100644 index 0000000..1d45cac Binary files /dev/null and b/resources/shiny/surskit.png differ diff --git a/resources/shiny/swablu.png b/resources/shiny/swablu.png new file mode 100644 index 0000000..c94e645 Binary files /dev/null and b/resources/shiny/swablu.png differ diff --git a/resources/shiny/swalot.png b/resources/shiny/swalot.png new file mode 100644 index 0000000..a1518f6 Binary files /dev/null and b/resources/shiny/swalot.png differ diff --git a/resources/shiny/swampert.png b/resources/shiny/swampert.png new file mode 100644 index 0000000..0a9d169 Binary files /dev/null and b/resources/shiny/swampert.png differ diff --git a/resources/shiny/swellow.png b/resources/shiny/swellow.png new file mode 100644 index 0000000..8f44b3f Binary files /dev/null and b/resources/shiny/swellow.png differ diff --git a/resources/shiny/swinub.png b/resources/shiny/swinub.png new file mode 100644 index 0000000..59b9128 Binary files /dev/null and b/resources/shiny/swinub.png differ diff --git a/resources/shiny/taillow.png b/resources/shiny/taillow.png new file mode 100644 index 0000000..56dc0e8 Binary files /dev/null and b/resources/shiny/taillow.png differ diff --git a/resources/shiny/tangela.png b/resources/shiny/tangela.png new file mode 100644 index 0000000..b4d7576 Binary files /dev/null and b/resources/shiny/tangela.png differ diff --git a/resources/shiny/tauros.png b/resources/shiny/tauros.png new file mode 100644 index 0000000..da6fb72 Binary files /dev/null and b/resources/shiny/tauros.png differ diff --git a/resources/shiny/teddiursa.png b/resources/shiny/teddiursa.png new file mode 100644 index 0000000..dcb7f32 Binary files /dev/null and b/resources/shiny/teddiursa.png differ diff --git a/resources/shiny/tentacool.png b/resources/shiny/tentacool.png new file mode 100644 index 0000000..f09ca93 Binary files /dev/null and b/resources/shiny/tentacool.png differ diff --git a/resources/shiny/tentacruel.png b/resources/shiny/tentacruel.png new file mode 100644 index 0000000..a457d99 Binary files /dev/null and b/resources/shiny/tentacruel.png differ diff --git a/resources/shiny/togepi.png b/resources/shiny/togepi.png new file mode 100644 index 0000000..f7b3618 Binary files /dev/null and b/resources/shiny/togepi.png differ diff --git a/resources/shiny/togetic.png b/resources/shiny/togetic.png new file mode 100644 index 0000000..d3d0a1b Binary files /dev/null and b/resources/shiny/togetic.png differ diff --git a/resources/shiny/torchic.png b/resources/shiny/torchic.png new file mode 100644 index 0000000..9c7322c Binary files /dev/null and b/resources/shiny/torchic.png differ diff --git a/resources/shiny/torkoal.png b/resources/shiny/torkoal.png new file mode 100644 index 0000000..950e7b0 Binary files /dev/null and b/resources/shiny/torkoal.png differ diff --git a/resources/shiny/totodile.png b/resources/shiny/totodile.png new file mode 100644 index 0000000..15c4c68 Binary files /dev/null and b/resources/shiny/totodile.png differ diff --git a/resources/shiny/trapinch.png b/resources/shiny/trapinch.png new file mode 100644 index 0000000..f744af6 Binary files /dev/null and b/resources/shiny/trapinch.png differ diff --git a/resources/shiny/treecko.png b/resources/shiny/treecko.png new file mode 100644 index 0000000..50faf8f Binary files /dev/null and b/resources/shiny/treecko.png differ diff --git a/resources/shiny/tropius.png b/resources/shiny/tropius.png new file mode 100644 index 0000000..0da75da Binary files /dev/null and b/resources/shiny/tropius.png differ diff --git a/resources/shiny/typhlosion.png b/resources/shiny/typhlosion.png new file mode 100644 index 0000000..0c65013 Binary files /dev/null and b/resources/shiny/typhlosion.png differ diff --git a/resources/shiny/tyranitar.png b/resources/shiny/tyranitar.png new file mode 100644 index 0000000..a0d2a1c Binary files /dev/null and b/resources/shiny/tyranitar.png differ diff --git a/resources/shiny/tyrogue.png b/resources/shiny/tyrogue.png new file mode 100644 index 0000000..97ac3ea Binary files /dev/null and b/resources/shiny/tyrogue.png differ diff --git a/resources/shiny/umbreon.png b/resources/shiny/umbreon.png new file mode 100644 index 0000000..8f7406c Binary files /dev/null and b/resources/shiny/umbreon.png differ diff --git a/resources/shiny/unown.png b/resources/shiny/unown.png new file mode 100644 index 0000000..7ba84c1 Binary files /dev/null and b/resources/shiny/unown.png differ diff --git a/resources/shiny/ursaring.png b/resources/shiny/ursaring.png new file mode 100644 index 0000000..e345218 Binary files /dev/null and b/resources/shiny/ursaring.png differ diff --git a/resources/shiny/vaporeon.png b/resources/shiny/vaporeon.png new file mode 100644 index 0000000..6d30069 Binary files /dev/null and b/resources/shiny/vaporeon.png differ diff --git a/resources/shiny/venomoth.png b/resources/shiny/venomoth.png new file mode 100644 index 0000000..2fac627 Binary files /dev/null and b/resources/shiny/venomoth.png differ diff --git a/resources/shiny/venonat.png b/resources/shiny/venonat.png new file mode 100644 index 0000000..3c205f1 Binary files /dev/null and b/resources/shiny/venonat.png differ diff --git a/resources/shiny/venusaur.png b/resources/shiny/venusaur.png new file mode 100644 index 0000000..217d1cd Binary files /dev/null and b/resources/shiny/venusaur.png differ diff --git a/resources/shiny/vibrava.png b/resources/shiny/vibrava.png new file mode 100644 index 0000000..b3fab89 Binary files /dev/null and b/resources/shiny/vibrava.png differ diff --git a/resources/shiny/victreebel.png b/resources/shiny/victreebel.png new file mode 100644 index 0000000..a9f2c97 Binary files /dev/null and b/resources/shiny/victreebel.png differ diff --git a/resources/shiny/vigoroth.png b/resources/shiny/vigoroth.png new file mode 100644 index 0000000..572f40a Binary files /dev/null and b/resources/shiny/vigoroth.png differ diff --git a/resources/shiny/vileplume.png b/resources/shiny/vileplume.png new file mode 100644 index 0000000..4fb5c2b Binary files /dev/null and b/resources/shiny/vileplume.png differ diff --git a/resources/shiny/volbeat.png b/resources/shiny/volbeat.png new file mode 100644 index 0000000..6628509 Binary files /dev/null and b/resources/shiny/volbeat.png differ diff --git a/resources/shiny/voltorb.png b/resources/shiny/voltorb.png new file mode 100644 index 0000000..22dd2d3 Binary files /dev/null and b/resources/shiny/voltorb.png differ diff --git a/resources/shiny/vulpix.png b/resources/shiny/vulpix.png new file mode 100644 index 0000000..a62e640 Binary files /dev/null and b/resources/shiny/vulpix.png differ diff --git a/resources/shiny/wailmer.png b/resources/shiny/wailmer.png new file mode 100644 index 0000000..fbb4ed7 Binary files /dev/null and b/resources/shiny/wailmer.png differ diff --git a/resources/shiny/wailord.png b/resources/shiny/wailord.png new file mode 100644 index 0000000..0e7e169 Binary files /dev/null and b/resources/shiny/wailord.png differ diff --git a/resources/shiny/walrein.png b/resources/shiny/walrein.png new file mode 100644 index 0000000..c40e30b Binary files /dev/null and b/resources/shiny/walrein.png differ diff --git a/resources/shiny/wartortle.png b/resources/shiny/wartortle.png new file mode 100644 index 0000000..190344a Binary files /dev/null and b/resources/shiny/wartortle.png differ diff --git a/resources/shiny/weedle.png b/resources/shiny/weedle.png new file mode 100644 index 0000000..cd180a6 Binary files /dev/null and b/resources/shiny/weedle.png differ diff --git a/resources/shiny/weepinbell.png b/resources/shiny/weepinbell.png new file mode 100644 index 0000000..f684cca Binary files /dev/null and b/resources/shiny/weepinbell.png differ diff --git a/resources/shiny/weezing.png b/resources/shiny/weezing.png new file mode 100644 index 0000000..6f5596b Binary files /dev/null and b/resources/shiny/weezing.png differ diff --git a/resources/shiny/whiscash.png b/resources/shiny/whiscash.png new file mode 100644 index 0000000..f93b04e Binary files /dev/null and b/resources/shiny/whiscash.png differ diff --git a/resources/shiny/whismur.png b/resources/shiny/whismur.png new file mode 100644 index 0000000..c25e648 Binary files /dev/null and b/resources/shiny/whismur.png differ diff --git a/resources/shiny/wigglytuff.png b/resources/shiny/wigglytuff.png new file mode 100644 index 0000000..f036ef1 Binary files /dev/null and b/resources/shiny/wigglytuff.png differ diff --git a/resources/shiny/wingull.png b/resources/shiny/wingull.png new file mode 100644 index 0000000..f15c7c6 Binary files /dev/null and b/resources/shiny/wingull.png differ diff --git a/resources/shiny/wobbuffet.png b/resources/shiny/wobbuffet.png new file mode 100644 index 0000000..d1d6788 Binary files /dev/null and b/resources/shiny/wobbuffet.png differ diff --git a/resources/shiny/wooper.png b/resources/shiny/wooper.png new file mode 100644 index 0000000..545cb7f Binary files /dev/null and b/resources/shiny/wooper.png differ diff --git a/resources/shiny/wurmple.png b/resources/shiny/wurmple.png new file mode 100644 index 0000000..e3366d5 Binary files /dev/null and b/resources/shiny/wurmple.png differ diff --git a/resources/shiny/wynaut.png b/resources/shiny/wynaut.png new file mode 100644 index 0000000..15090cb Binary files /dev/null and b/resources/shiny/wynaut.png differ diff --git a/resources/shiny/xatu.png b/resources/shiny/xatu.png new file mode 100644 index 0000000..91ebbd1 Binary files /dev/null and b/resources/shiny/xatu.png differ diff --git a/resources/shiny/yanma.png b/resources/shiny/yanma.png new file mode 100644 index 0000000..1941c34 Binary files /dev/null and b/resources/shiny/yanma.png differ diff --git a/resources/shiny/zangoose.png b/resources/shiny/zangoose.png new file mode 100644 index 0000000..bb264b4 Binary files /dev/null and b/resources/shiny/zangoose.png differ diff --git a/resources/shiny/zapdos.png b/resources/shiny/zapdos.png new file mode 100644 index 0000000..903092e Binary files /dev/null and b/resources/shiny/zapdos.png differ diff --git a/resources/shiny/zigzagoon.png b/resources/shiny/zigzagoon.png new file mode 100644 index 0000000..35ab894 Binary files /dev/null and b/resources/shiny/zigzagoon.png differ diff --git a/resources/shiny/zubat.png b/resources/shiny/zubat.png new file mode 100644 index 0000000..dc675d7 Binary files /dev/null and b/resources/shiny/zubat.png differ