From fe98d9a8d9e9763fa70d39c9f9873428dc81393a Mon Sep 17 00:00:00 2001 From: sergiotarxz Date: Fri, 8 Mar 2024 03:54:27 +0100 Subject: [PATCH] Fixing pokemon with alternative forms. --- create_shiny_folder.pl | 13 ++- lib/GEmeTool/Save/Pokemon.pm | 9 ++ lib/GEmeTool/View/PokemonPCWindow.pm | 138 ++++++++++++++++----------- resources/shiny/castform.png | Bin 0 -> 382 bytes resources/shiny/unown.png | Bin 0 -> 324 bytes 5 files changed, 100 insertions(+), 60 deletions(-) create mode 100644 resources/shiny/castform.png create mode 100644 resources/shiny/unown.png diff --git a/create_shiny_folder.pl b/create_shiny_folder.pl index c050701..c9e33b4 100644 --- a/create_shiny_folder.pl +++ b/create_shiny_folder.pl @@ -14,9 +14,18 @@ $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', - $pokemon_dir->child('front.png'), $bpp; + $front, $bpp; system './pokeemerald/tools/gbagfx/gbagfx', $bpp, $shiny_dir->child( $pokemon_dir->basename . '.png' ), - '-palette', $pokemon_dir->child('shiny.pal'), '-mwidth', 8, '-object'; + '-palette', $shiny, '-mwidth', 8, '-object'; } diff --git a/lib/GEmeTool/Save/Pokemon.pm b/lib/GEmeTool/Save/Pokemon.pm index 61d4e7a..7ae725b 100644 --- a/lib/GEmeTool/Save/Pokemon.pm +++ b/lib/GEmeTool/Save/Pokemon.pm @@ -23,6 +23,9 @@ sub species { 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"; } @@ -32,6 +35,12 @@ sub get_front { 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/View/PokemonPCWindow.pm b/lib/GEmeTool/View/PokemonPCWindow.pm index 1042e6a..750e143 100644 --- a/lib/GEmeTool/View/PokemonPCWindow.pm +++ b/lib/GEmeTool/View/PokemonPCWindow.pm @@ -30,19 +30,16 @@ has _save => ( required => 1, ); -has _current_box => ( - is => 'rw', -); +has _current_box => ( is => 'rw', ); - -my $BOX_X = 275; -my $BOX_Y = 50; -my $BOX_WIDTH = 312; +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_X = 28; +my $ARROW_Y = 6; +my $ARROW_WIDTH = 16; my $ARROW_HEIGHT = 32; has _cursor_position => ( is => 'rw' ); @@ -50,13 +47,13 @@ has _cursor_position => ( is => 'rw' ); my $root = path(__FILE__)->parent->parent->parent->parent; sub start { - my $self = shift; - my $gtk_window = Gtk4::Window->new; - my $controller_motion = Gtk4::EventControllerMotion->new; + my $self = shift; + my $gtk_window = Gtk4::Window->new; + 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 $save = $self->_save; + my $pc = $save->get_pc_system; + my $box = $pc->get_box(0); $controller_gesture->set_button(1); $self->_current_box($box); $controller_gesture->signal_connect( @@ -74,7 +71,7 @@ sub start { $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); + 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( @@ -85,17 +82,19 @@ sub start { my $height = shift; my $selected_pokemon = $self->get_selected_pokemon; - $self->draw_pc($cairo, $scale_factor_pc); + $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); + 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_pokemon_details( $cairo, $selected_pokemon ); $self->draw_cursor($cairo); } ); @@ -112,13 +111,13 @@ sub start { sub _on_primary_click { my $self = shift; - my ($gesture, $n_press, $x, $y) = @_; - return if $self->_check_click_next_box($gesture, $n_press, $x, $y); + my ( $gesture, $n_press, $x, $y ) = @_; + return if $self->_check_click_next_prev_box( $gesture, $n_press, $x, $y ); } -sub _check_click_next_box { +sub _check_click_next_prev_box { my $self = shift; - my ($gesture, $n_press, $x, $y) = @_; + my ( $gesture, $n_press, $x, $y ) = @_; return if $x < $BOX_X; return if $y < $BOX_Y; @@ -129,44 +128,63 @@ sub _check_click_next_box { return if $x >= $BOX_WIDTH; return if $y >= $BOX_HEIGHT; - my ($x_arrow, $width_arrow) = ($BOX_WIDTH - $ARROW_X, $BOX_WIDTH - $ARROW_X + $ARROW_WIDTH); - my ($y_arrow, $height_arrow) = ($ARROW_Y, $ARROW_Y + $ARROW_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)); + 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)); + $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 $self = shift; + my $cairo = shift; my $selected_pokemon = shift; return if !defined $selected_pokemon; - my $surface = Cairo::ImageSurface->create_from_png($root->child($selected_pokemon->get_front)); + 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 ); - $cairo->set_source_surface( $surface, 20, 30 ); + $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->scale( ( 1 / $scale_factor ) x 2 ); $cairo->paint; - $cairo->scale( (1/$scale_factor) x 2 ); } sub draw_pc { - my $self = shift; - my $cairo = shift; + 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')); + 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; @@ -240,7 +258,7 @@ sub draw_pokemon { if ($is_selected) { $cairo->set_source_rgb( 1, 1, 0 ); - $cairo->arc( $x + 5 + 11, $y + 10 + 11, 22/2, 0, pi*2 ); + $cairo->arc( $x + 5 + 11, $y + 10 + 11, 22 / 2, 0, pi * 2 ); $cairo->fill; } @@ -262,7 +280,7 @@ sub get_selected_pokemon { my $self = shift; my $cursor_position = $self->_cursor_position; return if !defined $cursor_position; - my ($x, $y) = @$cursor_position; + my ( $x, $y ) = @$cursor_position; return if $x < $BOX_X; return if $y < $BOX_Y; @@ -274,17 +292,17 @@ sub get_selected_pokemon { return if $y >= $BOX_HEIGHT; my $scale_factor = 0.95 * 2; - ( $x, $y ) = map { $_ / $scale_factor } ($x, $y); + ( $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; + 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; @@ -303,14 +321,18 @@ sub draw_box { $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->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->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, 1 ); $cairo->scale( 1 / 2, 1 / 2 ); } diff --git a/resources/shiny/castform.png b/resources/shiny/castform.png new file mode 100644 index 0000000000000000000000000000000000000000..4f52dc674b4d2c8d708060038ead2433a5ef8559 GIT binary patch literal 382 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|eg8-ip*P}J{i(WGUB@XSjt8O_rG4i)+3lRWyW`a~CP{%9r}P7y3m>sW?Fc)-w3frI zzj%5IXYYf~s0|jr67hLqA+LP42Q0WgXXT0K8y1}{X{_G!@xqpG+9gZ#&(tIwc*e2H W-)nEqAv0l6XnDH&xvX;%z5exp$;{$o`iq1( z!=@8u0!viB3Vif#c{EedDf+oGv$Nb@jvFER`!;y&c9(l>a5mvg`~4ovZPhPS`If)F zQpdH|ZSzJ(HqJI?0}al@yjvIOh+C*cdY1a$j|=X+a%MqwRHQ7!l{2XmSs1?F;*6V} zp||7TWS_bZ#uBOTS_>3{@>@!d1