mirror of
https://github.com/Lorenzooone/Pokemon-Gen3-to-Gen-X.git
synced 2026-04-26 00:27:27 -05:00
Add Espeon/Umbreon evolutions
This commit is contained in:
parent
ba975ed01d
commit
6a8cd8ad7f
BIN
data/special_evolutions.bin
Normal file
BIN
data/special_evolutions.bin
Normal file
Binary file not shown.
|
|
@ -5,5 +5,7 @@ void setup_trade_animation(struct gen3_mon_data_unenc*, struct gen3_mon_data_une
|
|||
void setup_evolution_animation(struct gen3_mon_data_unenc*, u8);
|
||||
void advance_trade_animation(void);
|
||||
u8 has_animation_completed(void);
|
||||
void start_with_evolution_animation(void);
|
||||
void prepare_evolution_animation_only(struct gen3_mon_data_unenc* own_mon);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@ void set_default_conversion_game(u8);
|
|||
void set_gen1_everstone(u8);
|
||||
void set_allow_cross_gen_evos(u8);
|
||||
void set_single_colour(u8, u8, u8);
|
||||
void set_evolve_without_trade(u8);
|
||||
u8 get_sys_language(void);
|
||||
u8 get_target_int_language(void);
|
||||
u8 get_filtered_target_int_language(void);
|
||||
|
|
@ -31,5 +32,6 @@ u16 get_full_colour(u8);
|
|||
u8 get_single_colour(u8, u8);
|
||||
u8 get_gen1_everstone(void);
|
||||
u8 get_allow_cross_gen_evos(void);
|
||||
u8 get_evolve_without_trade(void);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -51,6 +51,7 @@ enum TRADE_POSSIBILITY {FULL_TRADE_POSSIBLE, PARTIAL_TRADE_POSSIBLE, TRADE_IMPOS
|
|||
|
||||
void init_game_data(struct game_data_t*);
|
||||
void init_save_data(void);
|
||||
void increase_game_stat(u32*, u32);
|
||||
u8 has_cartridge_been_removed(void);
|
||||
u8 get_is_cartridge_loaded(void);
|
||||
enum TRADE_POSSIBILITY can_trade(struct game_data_priv_t*, u8);
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@
|
|||
#define CANCEL_INFO 0xFF
|
||||
#define CANCEL_TRADING 0xFF
|
||||
#define CANCEL_IV_FIX 0xFF
|
||||
#define EXIT_EVOLUTION 0xFF
|
||||
#define DENIED_LEARNING 0xFF
|
||||
#define EXIT_BASE_SETTINGS 0xFF
|
||||
#define EXIT_COLOURS_SETTINGS 0xFF
|
||||
|
|
@ -46,5 +47,6 @@ u8 handle_input_offer_options(u16, u8*, u8*);
|
|||
u8 handle_input_swap_cartridge_menu(u16);
|
||||
u8 handle_input_trade_setup(u16, u8);
|
||||
u8 handle_input_colours_menu(u16, u8*, u8*, u8*);
|
||||
u8 handle_input_evolution_menu(u16, u8*, u8*, u16);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -5,11 +5,15 @@
|
|||
#include "gen3_save.h"
|
||||
#include "multiboot_handler.h"
|
||||
|
||||
#define ENABLE_PRINT_GAME_INFO 0
|
||||
|
||||
enum MOVES_PRINTING_TYPE{LEARNT_P, DID_NOT_LEARN_P, LEARNABLE_P};
|
||||
enum CRASH_REASONS{BAD_SAVE, BAD_TRADE, CARTRIDGE_REMOVED};
|
||||
|
||||
void print_learnable_move(struct gen3_mon_data_unenc*, u16, enum MOVES_PRINTING_TYPE);
|
||||
#if ENABLE_PRINT_GAME_INFO
|
||||
void print_game_info(struct game_data_t*, int);
|
||||
#endif
|
||||
void print_learnable_move(struct gen3_mon_data_unenc*, u16, enum MOVES_PRINTING_TYPE);
|
||||
void print_crash(enum CRASH_REASONS);
|
||||
void print_trade_menu(struct game_data_t*, u8, u8, u8, u8);
|
||||
void print_trade_menu_cancel(u8);
|
||||
|
|
@ -33,7 +37,9 @@ void print_rejected(u8);
|
|||
void print_offer_screen(struct game_data_t*, u8, u8);
|
||||
void print_base_settings_menu(struct game_identity*, u8, u8);
|
||||
void print_offer_options_screen(struct game_data_t*, u8, u8);
|
||||
void print_trade_options(u8, u8);
|
||||
void print_trade_options(u8, u8, u8);
|
||||
void print_colour_settings_menu(u8);
|
||||
void print_evolution_menu(struct gen3_mon_data_unenc*, u16, u8, u8);
|
||||
void print_evolution_window(struct gen3_mon_data_unenc*);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -74,10 +74,13 @@
|
|||
#define KADABRA_SPECIES 64
|
||||
#define ALAKAZAM_SPECIES 65
|
||||
#define MR_MIME_SPECIES 122
|
||||
#define EEVEE_SPECIES 133
|
||||
#define ARTICUNO_SPECIES 144
|
||||
#define ZAPDOS_SPECIES 145
|
||||
#define MOLTRES_SPECIES 146
|
||||
#define MEW_SPECIES 151
|
||||
#define ESPEON_SPECIES 196
|
||||
#define UMBREON_SPECIES 197
|
||||
#define UNOWN_SPECIES 201
|
||||
#define RAIKOU_SPECIES 243
|
||||
#define ENTEI_SPECIES 244
|
||||
|
|
@ -465,5 +468,8 @@ void give_pokerus_gen3(struct gen3_mon_data_unenc*);
|
|||
u8 would_update_end_pokerus_gen3(struct gen3_mon_data_unenc*, u16);
|
||||
void sanitize_ot_name(u8*, u8, u8, u8);
|
||||
void set_deoxys_form(struct gen3_mon_data_unenc*, u8, u8);
|
||||
u16 can_own_menu_evolve(struct gen3_mon_data_unenc*);
|
||||
u8 own_menu_evolve(struct gen3_mon_data_unenc*, u8);
|
||||
u16 get_own_menu_evolution_species(struct gen3_mon_data_unenc*, u8, u8*);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -26,6 +26,12 @@
|
|||
#define BASE_Y_SPRITE_IV_FIX_PAGE (TOP_SCREEN_SPRITE_POS-8)
|
||||
#define BASE_X_SPRITE_IV_FIX_PAGE 0
|
||||
|
||||
#define BASE_Y_SPRITE_LEARN_MOVE_PAGE (TOP_SCREEN_SPRITE_POS-8)
|
||||
#define BASE_X_SPRITE_LEARN_MOVE_PAGE 0
|
||||
|
||||
#define BASE_Y_SPRITE_EVOLUTION_PAGE (TOP_SCREEN_SPRITE_POS-8)
|
||||
#define BASE_X_SPRITE_EVOLUTION_PAGE 0
|
||||
|
||||
#define X_OFFSET_TRADE_MENU 0
|
||||
#define Y_OFFSET_TRADE_MENU -3
|
||||
#define Y_OFFSET_TRADE_MENU_SPRITES (Y_OFFSET_TRADE_MENU + 2)
|
||||
|
|
@ -48,6 +54,10 @@
|
|||
#define BASE_Y_CURSOR_BASE_SETTINGS_MENU 8
|
||||
#define BASE_Y_CURSOR_INCREMENT_BASE_SETTINGS_MENU 16
|
||||
|
||||
#define BASE_X_CURSOR_EVOLUTIONS_MENU (2+(EVOLUTION_WINDOW_X<<3))
|
||||
#define BASE_Y_CURSOR_EVOLUTIONS_MENU (EVOLUTION_WINDOW_Y<<3)
|
||||
#define BASE_Y_CURSOR_INCREMENT_EVOLUTIONS_MENU (EVOLUTION_WINDOW_Y_SIZE_INCREMENT<<3)
|
||||
|
||||
#define BASE_X_CURSOR_COLOURS_SETTINGS_MENU 2
|
||||
#define BASE_X_CURSOR_COLOURS_SETTINGS_MENU_IN (2+112)
|
||||
#define BASE_X_CURSOR_INCREMENT_COLOURS_SETTINGS_MENU_IN 40
|
||||
|
|
|
|||
|
|
@ -51,6 +51,13 @@
|
|||
#define COLOURS_WINDOW_Y (TOTAL_Y_SIZE-1-1-COLOURS_WINDOW_Y_SIZE)
|
||||
#define COLOURS_WINDOW_X_SIZE (TOTAL_X_SIZE-COLOURS_WINDOW_X-1)
|
||||
|
||||
#define EVOLUTION_WINDOW_SCREEN 3
|
||||
#define EVOLUTION_WINDOW_Y_SIZE 1
|
||||
#define EVOLUTION_WINDOW_Y_SIZE_INCREMENT 2
|
||||
#define EVOLUTION_WINDOW_X_SIZE (NICKNAME_GEN3_MAX_SIZE+2)
|
||||
#define EVOLUTION_WINDOW_X (TOTAL_X_SIZE-1-EVOLUTION_WINDOW_X_SIZE)
|
||||
#define EVOLUTION_WINDOW_Y (TOTAL_Y_SIZE-1-1-EVOLUTION_WINDOW_Y_SIZE)
|
||||
|
||||
#define CRASH_WINDOW_SCREEN 3
|
||||
#define CRASH_WINDOW_X_SIZE 21
|
||||
#define CRASH_WINDOW_Y_SIZE 5
|
||||
|
|
@ -111,6 +118,9 @@ void clear_offer_options_window(void);
|
|||
void init_waiting_window(s8);
|
||||
void clear_waiting_window(s8);
|
||||
|
||||
void init_evolution_window(u8);
|
||||
void clear_evolution_window(u8);
|
||||
|
||||
void init_crash_window(void);
|
||||
void clear_crash_window(void);
|
||||
|
||||
|
|
|
|||
|
|
@ -39,6 +39,20 @@ u8 curr_fade_val;
|
|||
enum EVOLUTION_ANIMATION_STATE {START, FADE_IN, REVERSE_FADE_IN, END};
|
||||
enum EVOLUTION_ANIMATION_STATE curr_evolution_animation_state;
|
||||
|
||||
void start_with_evolution_animation() {
|
||||
animation_counter = WAIT_TRADE_END-1;
|
||||
}
|
||||
|
||||
void prepare_evolution_animation_only(struct gen3_mon_data_unenc* own_mon) {
|
||||
sprite_indexes[OTHER_SPRITE_INDEX] = get_next_sprite_index();
|
||||
sprite_ys[OTHER_SPRITE_INDEX] = BASE_Y_SPRITE_TRADE_ANIMATION_SEND;
|
||||
load_pokemon_sprite_raw(own_mon, 0, BASE_Y_SPRITE_TRADE_ANIMATION_SEND, BASE_X_SPRITE_TRADE_ANIMATION);
|
||||
animation_counter = 0;
|
||||
animation_completed = 0;
|
||||
animate_evolution = 0;
|
||||
is_animating_evolution = 0;
|
||||
}
|
||||
|
||||
void setup_evolution_animation(struct gen3_mon_data_unenc* own_mon, u8 evo_screen) {
|
||||
sprite_indexes[EVOLUTION_SPRITE_INDEX] = get_next_sprite_index();
|
||||
screen_nums[EVOLUTION_SPRITE_INDEX] = evo_screen;
|
||||
|
|
@ -89,7 +103,7 @@ void advance_evolution_animation() {
|
|||
if(curr_fade_val == EVO_FADES_NUM) {
|
||||
curr_evolution_animation_state = REVERSE_FADE_IN;
|
||||
raw_update_sprite_y(sprite_indexes[EVOLUTION_SPRITE_INDEX], sprite_ys[OTHER_SPRITE_INDEX]);
|
||||
raw_update_sprite_y(sprite_indexes[OTHER_SPRITE_INDEX], sprite_ys[OWN_SPRITE_INDEX]);
|
||||
raw_update_sprite_y(sprite_indexes[OTHER_SPRITE_INDEX], BASE_Y_SPRITE_TRADE_ANIMATION_RECV);
|
||||
}
|
||||
else
|
||||
fade_all_sprites_to_white(curr_fade_val + FADE_VAL_BASE);
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@
|
|||
#define DEFAULT_DEFAULT_CONVERSION_GAME FR_VERSION_ID
|
||||
#define DEFAULT_GEN1_EVERSTONE 0
|
||||
#define DEFAULT_ALLOW_CROSS_GEN_EVOS 0
|
||||
#define DEFAULT_EVOLVE_WITHOUT_TRADE 0
|
||||
|
||||
static u8 sys_language;
|
||||
static u8 target_int_language;
|
||||
|
|
@ -20,6 +21,7 @@ static u8 default_conversion_game;
|
|||
static u8 default_colours[NUM_COLOURS][NUM_SUB_COLOURS];
|
||||
static u8 gen1_everstone;
|
||||
static u8 allow_cross_gen_evos;
|
||||
static u8 evolve_without_trade;
|
||||
|
||||
void set_default_settings() {
|
||||
set_sys_language(DEFAULT_SYS_LANGUAGE);
|
||||
|
|
@ -31,6 +33,7 @@ void set_default_settings() {
|
|||
set_single_colour(i, j, default_colours_bin[(i*NUM_SUB_COLOURS)+j]);
|
||||
set_gen1_everstone(DEFAULT_GEN1_EVERSTONE);
|
||||
set_allow_cross_gen_evos(DEFAULT_ALLOW_CROSS_GEN_EVOS);
|
||||
set_evolve_without_trade(DEFAULT_EVOLVE_WITHOUT_TRADE);
|
||||
}
|
||||
|
||||
void set_sys_language(u8 new_val) {
|
||||
|
|
@ -76,6 +79,10 @@ void set_allow_cross_gen_evos(u8 new_val) {
|
|||
allow_cross_gen_evos = new_val;
|
||||
}
|
||||
|
||||
void set_evolve_without_trade(u8 new_val) {
|
||||
evolve_without_trade = new_val;
|
||||
}
|
||||
|
||||
void set_single_colour(u8 index, u8 sub_index, u8 new_colour) {
|
||||
if(index >= NUM_COLOURS)
|
||||
index = 0;
|
||||
|
|
@ -136,3 +143,7 @@ u8 get_gen1_everstone() {
|
|||
u8 get_allow_cross_gen_evos() {
|
||||
return allow_cross_gen_evos;
|
||||
}
|
||||
|
||||
u8 get_evolve_without_trade() {
|
||||
return evolve_without_trade;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -44,6 +44,8 @@
|
|||
#define SAVED_GAME_STAT_NUM 0
|
||||
#define NUM_TRADES_STAT_NUM 21
|
||||
|
||||
#define GAME_STAT_LIMIT 0xFFFFFF
|
||||
|
||||
#define RSE_PARTY 0x234
|
||||
#define FRLG_PARTY 0x34
|
||||
|
||||
|
|
@ -328,6 +330,13 @@ void set_stat_save(u8* buffer_8, u8 game_id, u16 stat_num, u32 value) {
|
|||
buffer_8[game_stats_pos[game_id] + (stat_num<<2) + j] = (value >> (8*j)) & 0xFF;
|
||||
}
|
||||
|
||||
void increase_game_stat(u32* game_stat, u32 increase) {
|
||||
if((*game_stat) < GAME_STAT_LIMIT)
|
||||
*game_stat += increase;
|
||||
if((*game_stat) > GAME_STAT_LIMIT)
|
||||
*game_stat = GAME_STAT_LIMIT;
|
||||
}
|
||||
|
||||
void process_party_data(struct game_data_t* game_data, struct gen2_party* party_2, struct gen1_party* party_1) {
|
||||
if(game_data->party_3.total > PARTY_SIZE)
|
||||
game_data->party_3.total = PARTY_SIZE;
|
||||
|
|
|
|||
|
|
@ -434,6 +434,33 @@ u8 handle_input_learnable_moves_menu(u16 keys, u8* cursor_y_pos) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
u8 handle_input_evolution_menu(u16 keys, u8* cursor_y_pos, u8* update, u16 num_evolutions) {
|
||||
if(keys & KEY_B)
|
||||
return EXIT_EVOLUTION;
|
||||
|
||||
if(keys & KEY_A)
|
||||
return 1;
|
||||
|
||||
u8 new_cursor_y_pos = *cursor_y_pos;
|
||||
if(keys & KEY_UP) {
|
||||
if(new_cursor_y_pos)
|
||||
new_cursor_y_pos -= 1;
|
||||
else
|
||||
new_cursor_y_pos = num_evolutions-1;
|
||||
}
|
||||
else if(keys & KEY_DOWN) {
|
||||
new_cursor_y_pos += 1;
|
||||
if(new_cursor_y_pos >= num_evolutions)
|
||||
new_cursor_y_pos = 0;
|
||||
}
|
||||
|
||||
if((*cursor_y_pos) != new_cursor_y_pos)
|
||||
*update = 1;
|
||||
*cursor_y_pos = new_cursor_y_pos;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
u8 handle_input_base_settings_menu(u16 keys, u8* cursor_y_pos, u8* update, struct game_identity* game_identifier, u8 is_loaded) {
|
||||
if(keys & KEY_B)
|
||||
return EXIT_BASE_SETTINGS;
|
||||
|
|
|
|||
140
source/main.c
140
source/main.c
|
|
@ -44,6 +44,7 @@
|
|||
#define INFO_SCREEN 3
|
||||
#define NATURE_SCREEN 2
|
||||
#define IV_FIX_SCREEN 2
|
||||
#define EVOLUTION_MENU_SCREEN 2
|
||||
|
||||
void vblank_update_function(void);
|
||||
void find_optimal_ewram_settings(void);
|
||||
|
|
@ -57,6 +58,7 @@ void cursor_update_trade_options(u8);
|
|||
void cursor_update_offer_options(u8, u8);
|
||||
void cursor_update_base_settings_menu(u8);
|
||||
void cursor_update_colours_settings_menu(u8, u8);
|
||||
void cursor_update_evolutions_menu(u8, u16);
|
||||
void handle_learnable_moves_message(struct game_data_t*, u8, u8*, u32*, enum MOVES_PRINTING_TYPE);
|
||||
void change_nature(struct game_data_t*, u8, u8, u8*, u8);
|
||||
void check_bad_trade_received(struct game_data_t*, struct game_data_priv_t*, u8, u8, u8, u8, u8, u8*);
|
||||
|
|
@ -64,7 +66,7 @@ void trade_cancel_print_screen(u8);
|
|||
void saving_print_screen(void);
|
||||
void loading_print_screen(void);
|
||||
void rejected_print_screen(u8);
|
||||
void trading_animation_init(struct game_data_t*, u8, u8);
|
||||
void trading_animation_init(struct game_data_t*, u8, u8, u8);
|
||||
void evolution_animation_init(struct game_data_t*, u8);
|
||||
void offer_init(struct game_data_t*, u8, u8, u8*, u8*, u8);
|
||||
void waiting_init(s8);
|
||||
|
|
@ -72,7 +74,7 @@ void invalid_init(u8);
|
|||
void waiting_offer_init(u8, u8);
|
||||
void waiting_accept_init(u8);
|
||||
void waiting_success_init(void);
|
||||
void trade_options_init(u8, u8*, u8);
|
||||
void trade_options_init(u8, u8*, u8, u8);
|
||||
void trade_menu_init(struct game_data_t*, struct game_data_priv_t*, u8, u8, u8, u8, u8, u8*, u8*);
|
||||
void start_trade_init(struct game_data_t*, struct game_data_priv_t*, u8, u8, u8, u8, u8*);
|
||||
void main_menu_init(struct game_data_t*, struct game_data_priv_t*, u8, u8, u8, u8*);
|
||||
|
|
@ -83,6 +85,7 @@ void base_settings_menu_init(struct game_data_t*, u8*);
|
|||
void colours_settings_menu_init(u8*, u8*);
|
||||
void learnable_moves_message_init(struct game_data_t*, u8);
|
||||
void learnable_move_menu_init(struct game_data_t*, u8, u8, u8*);
|
||||
void evolution_menu_init(struct game_data_t*, u8, u8, u8*, u16);
|
||||
void conclude_trade(struct game_data_t*, struct game_data_priv_t*, u8, u8, u8, u8*);
|
||||
void return_to_trade_menu(struct game_data_t*, struct game_data_priv_t*, u8, u8, u8, u8, u8, u8*, u8*);
|
||||
void prepare_crash_screen(enum CRASH_REASONS);
|
||||
|
|
@ -90,9 +93,10 @@ void crash_on_cartridge_removed(void);
|
|||
void crash_on_bad_save(u8, u8);
|
||||
void crash_on_bad_trade(void);
|
||||
void wait_frames(int);
|
||||
void complete_save_menu(struct game_data_t*, struct game_data_priv_t*, u8, u8);
|
||||
int main(void);
|
||||
|
||||
enum STATE {MAIN_MENU, MULTIBOOT, TRADING_MENU, INFO_MENU, START_TRADE, WAITING_DATA, TRADE_OPTIONS, NATURE_SETTING, OFFER_MENU, TRADING_ANIMATION, OFFER_INFO_MENU, IV_FIX_MENU, LEARNABLE_MOVES_MESSAGE, LEARNABLE_MOVES_MESSAGE_MENU, LEARNABLE_MOVES_MENU, SWAP_CARTRIDGE_MENU, BASE_SETTINGS_MENU, COLOURS_SETTINGS_MENU, CLOCK_SETTINGS_MENU, CHEATS_MENU};
|
||||
enum STATE {MAIN_MENU, MULTIBOOT, TRADING_MENU, INFO_MENU, START_TRADE, WAITING_DATA, TRADE_OPTIONS, NATURE_SETTING, OFFER_MENU, TRADING_ANIMATION, OFFER_INFO_MENU, IV_FIX_MENU, LEARNABLE_MOVES_MESSAGE, LEARNABLE_MOVES_MESSAGE_MENU, LEARNABLE_MOVES_MENU, SWAP_CARTRIDGE_MENU, BASE_SETTINGS_MENU, COLOURS_SETTINGS_MENU, CLOCK_SETTINGS_MENU, CHEATS_MENU, EVOLUTION_MENU};
|
||||
enum STATE curr_state;
|
||||
u32 counter = 0;
|
||||
u32 input_counter = 0;
|
||||
|
|
@ -218,6 +222,10 @@ void cursor_update_base_settings_menu(u8 cursor_y_pos) {
|
|||
update_cursor_y(BASE_Y_CURSOR_BASE_SETTINGS_MENU + (BASE_Y_CURSOR_INCREMENT_BASE_SETTINGS_MENU * cursor_y_pos));
|
||||
}
|
||||
|
||||
void cursor_update_evolutions_menu(u8 cursor_y_pos, u16 num_evolutions) {
|
||||
update_cursor_y(BASE_Y_CURSOR_EVOLUTIONS_MENU - ((num_evolutions-1)*(EVOLUTION_WINDOW_Y_SIZE_INCREMENT<<3)) + (BASE_Y_CURSOR_INCREMENT_EVOLUTIONS_MENU * cursor_y_pos));
|
||||
}
|
||||
|
||||
void cursor_update_colours_settings_menu(u8 cursor_y_pos, u8 cursor_x_pos) {
|
||||
if(!cursor_x_pos)
|
||||
update_cursor_base_x(BASE_X_CURSOR_COLOURS_SETTINGS_MENU);
|
||||
|
|
@ -320,21 +328,26 @@ void loading_print_screen() {
|
|||
prepare_flush();
|
||||
}
|
||||
|
||||
void trading_animation_init(struct game_data_t* game_data, u8 own_mon, u8 other_mon) {
|
||||
void trading_animation_init(struct game_data_t* game_data, u8 own_mon, u8 other_mon, u8 print_messages) {
|
||||
set_screen(BASE_SCREEN);
|
||||
reset_sprites_to_party();
|
||||
disable_all_screens_but_current();
|
||||
disable_all_cursors();
|
||||
disable_all_sprites();
|
||||
default_reset_screen();
|
||||
set_screen(TRADE_ANIMATION_SEND_WINDOW_SCREEN);
|
||||
print_trade_animation_send(&game_data[0].party_3_undec[own_mon]);
|
||||
set_screen(TRADE_ANIMATION_RECV_WINDOW_SCREEN);
|
||||
print_trade_animation_recv(&game_data[1].party_3_undec[other_mon]);
|
||||
if(print_messages) {
|
||||
set_screen(TRADE_ANIMATION_SEND_WINDOW_SCREEN);
|
||||
print_trade_animation_send(&game_data[0].party_3_undec[own_mon]);
|
||||
set_screen(TRADE_ANIMATION_RECV_WINDOW_SCREEN);
|
||||
print_trade_animation_recv(&game_data[1].party_3_undec[other_mon]);
|
||||
enable_screen(TRADE_ANIMATION_SEND_WINDOW_SCREEN);
|
||||
}
|
||||
set_screen(BASE_SCREEN);
|
||||
enable_screen(BASE_SCREEN);
|
||||
enable_screen(TRADE_ANIMATION_SEND_WINDOW_SCREEN);
|
||||
setup_trade_animation(&game_data[0].party_3_undec[own_mon], &game_data[1].party_3_undec[other_mon], TRADE_ANIMATION_SEND_WINDOW_SCREEN, TRADE_ANIMATION_RECV_WINDOW_SCREEN);
|
||||
if(print_messages)
|
||||
setup_trade_animation(&game_data[0].party_3_undec[own_mon], &game_data[1].party_3_undec[other_mon], TRADE_ANIMATION_SEND_WINDOW_SCREEN, TRADE_ANIMATION_RECV_WINDOW_SCREEN);
|
||||
else
|
||||
prepare_evolution_animation_only(&game_data[0].party_3_undec[own_mon]);
|
||||
prepare_flush();
|
||||
}
|
||||
|
||||
|
|
@ -403,10 +416,10 @@ void waiting_success_init() {
|
|||
try_to_success();
|
||||
}
|
||||
|
||||
void trade_options_init(u8 cursor_x_pos, u8* submenu_cursor_x_pos, u8 own_menu) {
|
||||
void trade_options_init(u8 cursor_x_pos, u8* submenu_cursor_x_pos, u8 own_menu, u8 evolve) {
|
||||
curr_state = TRADE_OPTIONS;
|
||||
set_screen(TRADE_OPTIONS_WINDOW_SCREEN);
|
||||
print_trade_options(cursor_x_pos, own_menu);
|
||||
print_trade_options(cursor_x_pos, own_menu, evolve);
|
||||
enable_screen(TRADE_OPTIONS_WINDOW_SCREEN);
|
||||
*submenu_cursor_x_pos = 0;
|
||||
cursor_update_trade_options(*submenu_cursor_x_pos);
|
||||
|
|
@ -424,6 +437,7 @@ void trade_menu_init(struct game_data_t* game_data, struct game_data_priv_t* gam
|
|||
trade_cancel_print_screen(1);
|
||||
set_party_sprite_counter();
|
||||
cursor_update_trading_menu(*cursor_y_pos, *cursor_x_pos);
|
||||
enable_screen(BASE_SCREEN);
|
||||
check_bad_trade_received(game_data, game_data_priv, target, region, master, curr_gen, own_menu, cursor_y_pos);
|
||||
prepare_flush();
|
||||
}
|
||||
|
|
@ -439,6 +453,7 @@ void start_trade_init(struct game_data_t* game_data, struct game_data_priv_t* ga
|
|||
disable_all_screens_but_current();
|
||||
reset_sprites_to_cursor(1);
|
||||
disable_all_cursors();
|
||||
enable_screen(BASE_SCREEN);
|
||||
prepare_flush();
|
||||
start_transfer(master, curr_gen);
|
||||
}
|
||||
|
|
@ -458,6 +473,7 @@ void main_menu_init(struct game_data_t* game_data, struct game_data_priv_t* game
|
|||
*cursor_y_pos = init_cursor_y_pos_main_menu();
|
||||
update_cursor_base_x(BASE_X_CURSOR_MAIN_MENU);
|
||||
cursor_update_main_menu(*cursor_y_pos);
|
||||
enable_screen(BASE_SCREEN);
|
||||
prepare_flush();
|
||||
}
|
||||
|
||||
|
|
@ -494,6 +510,20 @@ void iv_fix_menu_init(struct game_data_t* game_data, u8 cursor_x_pos, u8 curr_mo
|
|||
prepare_flush();
|
||||
}
|
||||
|
||||
void evolution_menu_init(struct game_data_t* game_data, u8 cursor_x_pos, u8 curr_mon, u8* cursor_y_pos, u16 num_evolutions) {
|
||||
curr_state = EVOLUTION_MENU;
|
||||
disable_all_sprites();
|
||||
*cursor_y_pos = 0;
|
||||
print_evolution_menu(&game_data[cursor_x_pos].party_3_undec[curr_mon], *cursor_y_pos, EVOLUTION_MENU_SCREEN, 1);
|
||||
enable_screen(EVOLUTION_MENU_SCREEN);
|
||||
set_screen(EVOLUTION_WINDOW_SCREEN);
|
||||
print_evolution_window(&game_data[cursor_x_pos].party_3_undec[curr_mon]);
|
||||
enable_screen(EVOLUTION_WINDOW_SCREEN);
|
||||
update_cursor_base_x(BASE_X_CURSOR_EVOLUTIONS_MENU);
|
||||
cursor_update_evolutions_menu(*cursor_y_pos, num_evolutions);
|
||||
prepare_flush();
|
||||
}
|
||||
|
||||
void learnable_move_menu_init(struct game_data_t* game_data, u8 curr_mon, u8 curr_move, u8* cursor_y_pos) {
|
||||
curr_state = LEARNABLE_MOVES_MENU;
|
||||
set_screen(LEARNABLE_MOVES_MENU_SCREEN);
|
||||
|
|
@ -560,6 +590,7 @@ void return_to_trade_menu(struct game_data_t* game_data, struct game_data_priv_t
|
|||
enable_all_sprites();
|
||||
trade_cancel_print_screen(1);
|
||||
cursor_update_trading_menu(*cursor_y_pos, *cursor_x_pos);
|
||||
enable_screen(BASE_SCREEN);
|
||||
check_bad_trade_received(game_data, game_data_priv, target, region, master, curr_gen, own_menu, cursor_y_pos);
|
||||
prepare_flush();
|
||||
}
|
||||
|
|
@ -611,6 +642,13 @@ void crash_on_bad_trade() {
|
|||
VBlankIntrWait();
|
||||
}
|
||||
|
||||
void complete_save_menu(struct game_data_t* game_data, struct game_data_priv_t* game_data_priv, u8 disable_transfer, u8 master) {
|
||||
u8 success = complete_write_gen_3_data(game_data);
|
||||
if(!success)
|
||||
crash_on_bad_save(disable_transfer, master);
|
||||
process_party_data(game_data, &game_data_priv->party_2, &game_data_priv->party_1);
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
curr_state = MAIN_MENU;
|
||||
|
|
@ -657,6 +695,7 @@ int main(void)
|
|||
u8 region = 0;
|
||||
u8 master = 0;
|
||||
u8 curr_gen = 0;
|
||||
u16 num_evolutions = 0;
|
||||
u8 own_menu = 0;
|
||||
u8 cursor_y_pos = 0;
|
||||
u8 cursor_x_pos = 0;
|
||||
|
|
@ -725,18 +764,13 @@ int main(void)
|
|||
case RECEIVED_ACCEPT:
|
||||
keys = 0;
|
||||
if(has_accepted_offer()) {
|
||||
trading_animation_init(game_data, curr_mon, other_mon);
|
||||
trading_animation_init(game_data, curr_mon, other_mon, 1);
|
||||
prepare_gen23_success(&game_data[0].party_3_undec[curr_mon], &game_data[1].party_3_undec[other_mon]);
|
||||
evolved = trade_mons(game_data, &game_data_priv, curr_mon, other_mon, curr_gen);
|
||||
if(evolved)
|
||||
evolution_animation_init(game_data, curr_mon);
|
||||
game_data_priv.num_trades_stat++;
|
||||
if(game_data_priv.num_trades_stat > 0xFFFFFF)
|
||||
game_data_priv.num_trades_stat = 0xFFFFFF;
|
||||
if(game_data_priv.num_saves_stat < 0xFFFFFF)
|
||||
game_data_priv.num_saves_stat--;
|
||||
if(game_data_priv.num_saves_stat > 0xFFFFFF)
|
||||
game_data_priv.num_saves_stat = 0xFFFFFF;
|
||||
increase_game_stat(&game_data_priv.num_trades_stat, 1);
|
||||
increase_game_stat(&game_data_priv.num_saves_stat, -1);
|
||||
curr_state = TRADING_ANIMATION;
|
||||
learnable_moves = game_data[0].party_3_undec[curr_mon].learnable_moves != NULL;
|
||||
success = pre_write_gen_3_data(&game_data[0], &game_data_priv, !learnable_moves);
|
||||
|
|
@ -755,12 +789,9 @@ int main(void)
|
|||
break;
|
||||
case RECEIVED_SUCCESS:
|
||||
keys = 0;
|
||||
success = complete_write_gen_3_data(&game_data[0]);
|
||||
if(!success)
|
||||
crash_on_bad_save(1, master);
|
||||
complete_save_menu(&game_data[0], &game_data_priv, 1, master);
|
||||
if(curr_gen == 3)
|
||||
wait_frames(SWI_DivMod(get_rng() & 0x7FFFFFFF, MAX_RANDOM_WAIT_TIME));
|
||||
process_party_data(&game_data[0], &game_data_priv.party_2, &game_data_priv.party_1);
|
||||
stop_transfer(master);
|
||||
start_trade_init(&game_data[0], &game_data_priv, target, region, master, curr_gen, &cursor_y_pos);
|
||||
break;
|
||||
|
|
@ -776,8 +807,13 @@ int main(void)
|
|||
learnable_moves_message_init(game_data, curr_mon);
|
||||
curr_move = 0;
|
||||
}
|
||||
else
|
||||
else if(!own_menu)
|
||||
waiting_success_init();
|
||||
else {
|
||||
saving_print_screen();
|
||||
complete_save_menu(&game_data[0], &game_data_priv, 0, master);
|
||||
main_menu_init(&game_data[0], &game_data_priv, target, region, master, &cursor_y_pos);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case LEARNABLE_MOVES_MESSAGE:
|
||||
|
|
@ -803,7 +839,13 @@ int main(void)
|
|||
disable_screen(LEARN_MOVE_MESSAGE_WINDOW_SCREEN);
|
||||
prepare_flush();
|
||||
move_go_on = 1;
|
||||
waiting_success_init();
|
||||
if(!own_menu)
|
||||
waiting_success_init();
|
||||
else {
|
||||
saving_print_screen();
|
||||
complete_save_menu(&game_data[0], &game_data_priv, 0, master);
|
||||
main_menu_init(&game_data[0], &game_data_priv, target, region, master, &cursor_y_pos);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
curr_move++;
|
||||
|
|
@ -858,9 +900,10 @@ int main(void)
|
|||
if(returned_val == CANCEL_TRADING)
|
||||
main_menu_init(&game_data[0], &game_data_priv, target, region, master, &cursor_y_pos);
|
||||
else if(returned_val) {
|
||||
// TODO: Handle Eevee into Umbreon/Espeon
|
||||
if(game_data[cursor_x_pos].party_3_undec[curr_mon].is_valid_gen3 && (!game_data[cursor_x_pos].party_3_undec[curr_mon].is_egg) && game_data[cursor_x_pos].party_3_undec[curr_mon].can_roamer_fix)
|
||||
trade_options_init(cursor_x_pos, &submenu_cursor_x_pos, own_menu);
|
||||
trade_options_init(cursor_x_pos, &submenu_cursor_x_pos, own_menu, 0);
|
||||
else if(can_own_menu_evolve(&game_data[cursor_x_pos].party_3_undec[curr_mon]))
|
||||
trade_options_init(cursor_x_pos, &submenu_cursor_x_pos, own_menu, 1);
|
||||
else
|
||||
info_menu_init(game_data, cursor_x_pos, curr_mon, &curr_page, 0);
|
||||
}
|
||||
|
|
@ -872,7 +915,7 @@ int main(void)
|
|||
if(cursor_x_pos && ((curr_gen ==3) || (!game_data[cursor_x_pos].party_3_undec[curr_mon].is_valid_gen3) || game_data[cursor_x_pos].party_3_undec[curr_mon].is_egg))
|
||||
info_menu_init(game_data, cursor_x_pos, curr_mon, &curr_page, 0);
|
||||
else
|
||||
trade_options_init(cursor_x_pos, &submenu_cursor_x_pos, own_menu);
|
||||
trade_options_init(cursor_x_pos, &submenu_cursor_x_pos, own_menu, 0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
|
@ -909,8 +952,13 @@ int main(void)
|
|||
if(!submenu_cursor_x_pos)
|
||||
info_menu_init(game_data, cursor_x_pos, curr_mon, &curr_page, 0);
|
||||
else if(own_menu) {
|
||||
// TODO: Handle Eevee into Umbreon/Espeon
|
||||
iv_fix_menu_init(game_data, cursor_x_pos, curr_mon);
|
||||
if(game_data[cursor_x_pos].party_3_undec[curr_mon].can_roamer_fix)
|
||||
iv_fix_menu_init(game_data, cursor_x_pos, curr_mon);
|
||||
else {
|
||||
num_evolutions = can_own_menu_evolve(&game_data[cursor_x_pos].party_3_undec[curr_mon]);
|
||||
if(num_evolutions)
|
||||
evolution_menu_init(game_data, cursor_x_pos, curr_mon, &submenu_cursor_y_pos, num_evolutions);
|
||||
}
|
||||
}
|
||||
else if(!cursor_x_pos) {
|
||||
prepare_gen3_offer(&game_data[0].party_3_undec[curr_mon]);
|
||||
|
|
@ -925,6 +973,32 @@ int main(void)
|
|||
break;
|
||||
case WAITING_DATA:
|
||||
break;
|
||||
case EVOLUTION_MENU:
|
||||
returned_val = handle_input_evolution_menu(keys, &submenu_cursor_y_pos, &update, num_evolutions);
|
||||
if(returned_val == CANCEL_NATURE)
|
||||
return_to_trade_menu(game_data, &game_data_priv, target, region, master, curr_gen, own_menu, &cursor_y_pos, &cursor_x_pos);
|
||||
else if(returned_val) {
|
||||
trading_animation_init(game_data, curr_mon, other_mon, 0);
|
||||
evolved = own_menu_evolve(&game_data[0].party_3_undec[curr_mon], submenu_cursor_y_pos);
|
||||
if(!evolved)
|
||||
main_menu_init(&game_data[0], &game_data_priv, target, region, master, &cursor_y_pos);
|
||||
else {
|
||||
evolution_animation_init(game_data, curr_mon);
|
||||
start_with_evolution_animation();
|
||||
increase_game_stat(&game_data_priv.num_trades_stat, 2);
|
||||
increase_game_stat(&game_data_priv.num_saves_stat, -1);
|
||||
curr_state = TRADING_ANIMATION;
|
||||
learnable_moves = game_data[0].party_3_undec[curr_mon].learnable_moves != NULL;
|
||||
success = pre_write_gen_3_data(&game_data[0], &game_data_priv, !learnable_moves);
|
||||
if(!success)
|
||||
crash_on_bad_save(0, master);
|
||||
}
|
||||
}
|
||||
else {
|
||||
print_evolution_menu(&game_data[cursor_x_pos].party_3_undec[curr_mon], submenu_cursor_y_pos, EVOLUTION_MENU_SCREEN, 1);
|
||||
cursor_update_evolutions_menu(submenu_cursor_y_pos, num_evolutions);
|
||||
}
|
||||
break;
|
||||
case NATURE_SETTING:
|
||||
returned_val = handle_input_nature_menu(keys);
|
||||
if(returned_val) {
|
||||
|
|
@ -955,11 +1029,9 @@ int main(void)
|
|||
if(!cursor_x_pos) {
|
||||
saving_print_screen();
|
||||
success = pre_write_gen_3_data(&game_data[0], &game_data_priv, 1);
|
||||
if(success)
|
||||
success = complete_write_gen_3_data(&game_data[0]);
|
||||
if(!success)
|
||||
crash_on_bad_save(0, master);
|
||||
process_party_data(&game_data[0], &game_data_priv.party_2, &game_data_priv.party_1);
|
||||
complete_save_menu(&game_data[0], &game_data_priv, 0, master);
|
||||
}
|
||||
}
|
||||
return_to_trade_menu(game_data, &game_data_priv, target, region, master, curr_gen, own_menu, &cursor_y_pos, &cursor_x_pos);
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@
|
|||
#define PRINTABLE_INVALID_STRINGS 3
|
||||
|
||||
void print_basic_alter_conf_data(struct gen3_mon_data_unenc*, struct alternative_data_gen3*);
|
||||
void print_pokemon_base_data(u8, struct gen3_mon_data_unenc*, u8, u8);
|
||||
void print_pokemon_base_data(u8, struct gen3_mon_data_unenc*, u8, u8, u8);
|
||||
void print_pokemon_base_info(u8, struct gen3_mon_data_unenc*, u8);
|
||||
void print_bottom_info(void);
|
||||
void print_pokemon_page1(struct gen3_mon_data_unenc*);
|
||||
|
|
@ -33,10 +33,12 @@ const u8* get_language_string(u8);
|
|||
void print_single_colour_info(u8);
|
||||
|
||||
const char* person_strings[] = {"You", "Other"};
|
||||
#if ENABLE_PRINT_GAME_INFO
|
||||
const char* maingame_strings[] = {"RS", "FRLG", "E"};
|
||||
const char* unidentified_string = "Unidentified";
|
||||
const char* subgame_rs_strings[] = {"R", "S"};
|
||||
const char* subgame_frlg_strings[] = {"FR", "LG"};
|
||||
#endif
|
||||
const char* game_strings[] = {"???", "Sapphire", "Ruby", "Emerald", "Fire Red", "Leaf Green"};
|
||||
const char* actor_strings[] = {"Master", "Slave"};
|
||||
const char* region_strings[] = {"Int", "Jap"};
|
||||
|
|
@ -53,6 +55,7 @@ const u8 ribbon_print_pos[NUM_LINES*2] = {0,1,2,3,4,5,6,7,8,9,14,15,13,16,10,0xF
|
|||
typedef void (*print_info_functions_t)(struct gen3_mon_data_unenc*);
|
||||
print_info_functions_t print_info_functions[PAGES_TOTAL] = {print_pokemon_page1, print_pokemon_page2, print_pokemon_page3, print_pokemon_page4, print_pokemon_page5};
|
||||
|
||||
#if ENABLE_PRINT_GAME_INFO
|
||||
void print_game_info(struct game_data_t* game_data, int index) {
|
||||
default_reset_screen();
|
||||
PRINT_FUNCTION("\n Game: ");
|
||||
|
|
@ -74,6 +77,7 @@ void print_game_info(struct game_data_t* game_data, int index) {
|
|||
}
|
||||
PRINT_FUNCTION("\x01\n", chosen_str);
|
||||
}
|
||||
#endif
|
||||
|
||||
void print_crash(enum CRASH_REASONS reason) {
|
||||
reset_screen(BLANK_FILL);
|
||||
|
|
@ -425,7 +429,7 @@ void print_colour_settings_menu(u8 update) {
|
|||
PRINT_FUNCTION(" - UP/DOWN: Change");
|
||||
}
|
||||
|
||||
void print_trade_options(u8 cursor_x_pos, u8 own_menu){
|
||||
void print_trade_options(u8 cursor_x_pos, u8 own_menu, u8 evolution){
|
||||
reset_screen(BLANK_FILL);
|
||||
init_trade_options_window();
|
||||
clear_trade_options_window();
|
||||
|
|
@ -433,7 +437,9 @@ void print_trade_options(u8 cursor_x_pos, u8 own_menu){
|
|||
set_text_x(TRADE_OPTIONS_WINDOW_X);
|
||||
PRINT_FUNCTION(" Summary");
|
||||
set_text_x(TRADE_OPTIONS_WINDOW_X + (TRADE_OPTIONS_WINDOW_X_SIZE>>1));
|
||||
if(own_menu)
|
||||
if(own_menu && evolution)
|
||||
PRINT_FUNCTION(" Evolve");
|
||||
else if(own_menu)
|
||||
PRINT_FUNCTION(" Fix IV");
|
||||
else if(cursor_x_pos)
|
||||
PRINT_FUNCTION(" Set Nature");
|
||||
|
|
@ -578,7 +584,7 @@ void print_set_nature(u8 load_sprites, struct gen3_mon_data_unenc* mon) {
|
|||
return;
|
||||
}
|
||||
|
||||
print_pokemon_base_data(load_sprites, mon, BASE_Y_SPRITE_NATURE_PAGE, BASE_X_SPRITE_NATURE_PAGE);
|
||||
print_pokemon_base_data(load_sprites, mon, BASE_Y_SPRITE_NATURE_PAGE, BASE_X_SPRITE_NATURE_PAGE, 1);
|
||||
|
||||
print_basic_alter_conf_data(mon, &mon->alter_nature);
|
||||
|
||||
|
|
@ -597,7 +603,7 @@ void print_iv_fix(struct gen3_mon_data_unenc* mon) {
|
|||
return;
|
||||
}
|
||||
|
||||
print_pokemon_base_data(1, mon, BASE_Y_SPRITE_IV_FIX_PAGE, BASE_X_SPRITE_IV_FIX_PAGE);
|
||||
print_pokemon_base_data(1, mon, BASE_Y_SPRITE_IV_FIX_PAGE, BASE_X_SPRITE_IV_FIX_PAGE, 1);
|
||||
u16 species = mon->growth.species;
|
||||
|
||||
print_basic_alter_conf_data(mon, &mon->fixed_ivs);
|
||||
|
|
@ -630,7 +636,7 @@ void print_learnable_moves_menu(struct gen3_mon_data_unenc* mon, u16 index) {
|
|||
|
||||
u16 move = mon->learnable_moves->moves[index];
|
||||
|
||||
print_pokemon_base_data(1, mon, BASE_Y_SPRITE_IV_FIX_PAGE, BASE_X_SPRITE_IV_FIX_PAGE);
|
||||
print_pokemon_base_data(1, mon, BASE_Y_SPRITE_LEARN_MOVE_PAGE, BASE_X_SPRITE_LEARN_MOVE_PAGE, 1);
|
||||
|
||||
u8 base_x = 0;
|
||||
u8 base_y = get_text_y() + 1;
|
||||
|
|
@ -664,7 +670,88 @@ void print_learnable_moves_menu(struct gen3_mon_data_unenc* mon, u16 index) {
|
|||
PRINT_FUNCTION("NEW");
|
||||
}
|
||||
|
||||
void print_pokemon_base_data(u8 load_sprites, struct gen3_mon_data_unenc* mon, u8 y, u8 x) {
|
||||
void print_evolution_window(struct gen3_mon_data_unenc* mon) {
|
||||
u8 useless = 0;
|
||||
reset_screen(BLANK_FILL);
|
||||
|
||||
if((!mon->is_valid_gen3) || (mon->is_egg))
|
||||
return;
|
||||
|
||||
u16 num_species = can_own_menu_evolve(mon);
|
||||
if(!num_species)
|
||||
return;
|
||||
|
||||
init_evolution_window(num_species);
|
||||
clear_evolution_window(num_species);
|
||||
|
||||
set_text_y(EVOLUTION_WINDOW_Y-(EVOLUTION_WINDOW_Y_SIZE_INCREMENT*num_species));
|
||||
set_text_x(EVOLUTION_WINDOW_X);
|
||||
PRINT_FUNCTION("Evolve into:\n\n");
|
||||
for(size_t i = 0; i < num_species; i++) {
|
||||
u16 new_species = get_own_menu_evolution_species(mon, i, &useless);
|
||||
set_text_x(EVOLUTION_WINDOW_X);
|
||||
if(new_species && (new_species <= LAST_VALID_GEN_3_MON))
|
||||
PRINT_FUNCTION(" \x05\n\n", get_pokemon_name_pure(new_species, 0, SYS_LANGUAGE), SYS_LANGUAGE_LIMIT, IS_SYS_LANGUAGE_JAPANESE);
|
||||
}
|
||||
}
|
||||
|
||||
void print_evolution_menu(struct gen3_mon_data_unenc* mon, u16 index, u8 screen, u8 update) {
|
||||
if(!update)
|
||||
return;
|
||||
|
||||
u8 old_screen = get_screen_num();
|
||||
set_screen(screen);
|
||||
default_reset_screen();
|
||||
|
||||
if((!mon->is_valid_gen3) || (mon->is_egg))
|
||||
return;
|
||||
|
||||
u8 needs_levelup = 0;
|
||||
u16 old_species = mon->growth.species;
|
||||
u16 new_species = get_own_menu_evolution_species(mon, index, &needs_levelup);
|
||||
mon->src->level = to_valid_level_gen3(mon->src);
|
||||
u8 old_level = mon->src->level;
|
||||
if((!new_species) || (new_species > LAST_VALID_GEN_3_MON))
|
||||
return;
|
||||
|
||||
if(needs_levelup)
|
||||
mon->src->level += 1;
|
||||
if(mon->src->level > MAX_LEVEL)
|
||||
mon->src->level = MAX_LEVEL;
|
||||
mon->growth.species = new_species;
|
||||
|
||||
print_pokemon_base_data(1, mon, BASE_Y_SPRITE_EVOLUTION_PAGE, BASE_X_SPRITE_EVOLUTION_PAGE, 0);
|
||||
|
||||
u8 base_x = 0;
|
||||
u8 base_y = get_text_y() + 1;
|
||||
set_text_y(base_y);
|
||||
for(int i = 0; i < GEN2_STATS_TOTAL; i++) {
|
||||
set_text_x(base_x);
|
||||
PRINT_FUNCTION("\x11: \x09\x02\n", stat_strings[i], 3, calc_stats_gen3_raw(mon,i), 4, get_nature_symbol(mon->src->pid, i));
|
||||
if(i == ((GEN2_STATS_TOTAL-1)>>1)) {
|
||||
set_text_y(base_y);
|
||||
base_x += X_LIMIT>>1;
|
||||
}
|
||||
}
|
||||
PRINT_FUNCTION("Ability: \x01", get_ability_name_raw(mon));
|
||||
PRINT_FUNCTION("\nHidden Power: \x01 \x03\n", get_hidden_power_type_name_gen3(&mon->misc), get_hidden_power_power_gen3(&mon->misc));
|
||||
if(needs_levelup)
|
||||
PRINT_FUNCTION("Level: from \x03 to \x03\n", old_level, mon->src->level);
|
||||
else
|
||||
PRINT_FUNCTION("\n");
|
||||
PRINT_FUNCTION("MOVES\n\n");
|
||||
for(size_t i = 0; i < MOVES_SIZE; i++)
|
||||
PRINT_FUNCTION("\x01\n\n", get_move_name_gen3(&mon->attacks, i));
|
||||
|
||||
set_text_y(Y_LIMIT-1);
|
||||
PRINT_FUNCTION("A: Confirm - B: Go Back");
|
||||
|
||||
mon->growth.species = old_species;
|
||||
mon->src->level = old_level;
|
||||
set_screen(old_screen);
|
||||
}
|
||||
|
||||
void print_pokemon_base_data(u8 load_sprites, struct gen3_mon_data_unenc* mon, u8 y, u8 x, u8 print_nickname) {
|
||||
u8 is_shiny = is_shiny_gen3_raw(mon, 0);
|
||||
u8 has_pokerus = has_pokerus_gen3_raw(mon);
|
||||
u8 language = get_valid_language(mon->src->language);
|
||||
|
|
@ -679,7 +766,9 @@ void print_pokemon_base_data(u8 load_sprites, struct gen3_mon_data_unenc* mon, u
|
|||
set_text_x((x>>3) + POKEMON_SPRITE_X_TILES);
|
||||
|
||||
if(!is_egg) {
|
||||
PRINT_FUNCTION("\x05 - \x05 \x02\n", mon->src->nickname, GET_LANGUAGE_NICKNAME_LIMIT(language), GET_LANGUAGE_IS_JAPANESE(language), get_pokemon_name_raw(mon), SYS_LANGUAGE_LIMIT, IS_SYS_LANGUAGE_JAPANESE, get_pokemon_gender_char_raw(mon));
|
||||
if(print_nickname)
|
||||
PRINT_FUNCTION("\x05 - ", mon->src->nickname, GET_LANGUAGE_NICKNAME_LIMIT(language), GET_LANGUAGE_IS_JAPANESE(language));
|
||||
PRINT_FUNCTION("\x05 \x02\n", get_pokemon_name_raw(mon), SYS_LANGUAGE_LIMIT, IS_SYS_LANGUAGE_JAPANESE, get_pokemon_gender_char_raw(mon));
|
||||
|
||||
set_text_x((x>>3) + POKEMON_SPRITE_X_TILES);
|
||||
|
||||
|
|
@ -718,7 +807,7 @@ void print_pokemon_base_info(u8 load_sprites, struct gen3_mon_data_unenc* mon, u
|
|||
if(page < page_total)
|
||||
PRINT_FUNCTION(">");
|
||||
|
||||
print_pokemon_base_data(load_sprites, mon, BASE_Y_SPRITE_INFO_PAGE, BASE_X_SPRITE_INFO_PAGE);
|
||||
print_pokemon_base_data(load_sprites, mon, BASE_Y_SPRITE_INFO_PAGE, BASE_X_SPRITE_INFO_PAGE, 1);
|
||||
}
|
||||
|
||||
void print_bottom_info(){
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@
|
|||
#include "pokemon_moves_pp_bin.h"
|
||||
#include "trainer_names_bin.h"
|
||||
#include "trainer_names_celebi_bin.h"
|
||||
#include "special_evolutions_bin.h"
|
||||
|
||||
#define UNOWN_B_START 415
|
||||
#define INITIAL_MAIL_GEN3 121
|
||||
|
|
@ -81,6 +82,9 @@ void sanitize_nickname(u8*, u8, u8, u16, u8);
|
|||
void set_deoxys_form_inner(struct gen3_mon_data_unenc*, u8, u8);
|
||||
u8 decrypt_to_data_unenc(struct gen3_mon*, struct gen3_mon_data_unenc*);
|
||||
const struct learnset_data_mon_moves* extract_learnable_moves(const u16*, u16, u8);
|
||||
const u16* get_special_evolutions(u16);
|
||||
u16 get_trade_evolution(u16, u16, u8, u8*, u8*);
|
||||
void evolve_mon(struct gen3_mon*, struct gen3_mon_data_unenc*, u16, u8, const u16*);
|
||||
|
||||
// Order is G A E M. Initialized by init_enc_positions
|
||||
u8 enc_positions[PID_POSITIONS];
|
||||
|
|
@ -1008,6 +1012,8 @@ void process_gen3_data(struct gen3_mon* src, struct gen3_mon_data_unenc* dst, u8
|
|||
struct gen3_mon_misc* misc = &dst->misc;
|
||||
|
||||
// Evolution testing
|
||||
//if((growth->species == ESPEON_SPECIES) || (growth->species == UMBREON_SPECIES))
|
||||
// growth->species = EEVEE_SPECIES;
|
||||
//if(growth->species == ALAKAZAM_SPECIES)
|
||||
// growth->species = KADABRA_SPECIES;
|
||||
|
||||
|
|
@ -1066,7 +1072,7 @@ void process_gen3_data(struct gen3_mon* src, struct gen3_mon_data_unenc* dst, u8
|
|||
|
||||
src->level = to_valid_level_gen3(src);
|
||||
|
||||
growth->exp = get_proper_exp_raw(dst);
|
||||
growth->exp = get_proper_exp(src, growth, dst->is_egg, dst->deoxys_form);
|
||||
|
||||
// Fix Nincada evolving to Shedinja in a Japanese game
|
||||
if((!dst->is_egg) && (growth->species == SHEDINJA_SPECIES))
|
||||
|
|
@ -1102,62 +1108,21 @@ void clean_mail_gen3(struct mail_gen3* mail, struct gen3_mon* mon){
|
|||
mon->mail_id = GEN3_NO_MAIL;
|
||||
}
|
||||
|
||||
u8 trade_evolve(struct gen3_mon* mon, struct gen3_mon_data_unenc* mon_data, u8 curr_gen) {
|
||||
const u16* learnsets = (const u16*)learnset_evos_gen3_bin;
|
||||
const u16* trade_evolutions = (const u16*)trade_evolutions_bin;
|
||||
u16 num_entries = trade_evolutions[0];
|
||||
const u16* trade_evolutions_base_ids = trade_evolutions+1;
|
||||
const u16* trade_evolutions_item_ids = trade_evolutions+1+num_entries;
|
||||
const u16* trade_evolutions_evo_ids = trade_evolutions+1+(2*num_entries);
|
||||
|
||||
u16 max_index = LAST_VALID_GEN_3_MON;
|
||||
if(curr_gen == 1) {
|
||||
learnsets = (const u16*)learnset_evos_gen1_bin;
|
||||
max_index = LAST_VALID_GEN_1_MON;
|
||||
}
|
||||
if(curr_gen == 2) {
|
||||
learnsets = (const u16*)learnset_evos_gen2_bin;
|
||||
max_index = LAST_VALID_GEN_2_MON;
|
||||
}
|
||||
|
||||
if((!mon_data->is_valid_gen3) || mon_data->is_egg)
|
||||
return 0;
|
||||
|
||||
struct gen3_mon_growth* growth = &mon_data->growth;
|
||||
|
||||
u8 found = 0;
|
||||
|
||||
for(int i = 0; i < num_entries; i++)
|
||||
if(growth->species == trade_evolutions_base_ids[i])
|
||||
if((!trade_evolutions_item_ids[i]) || (growth->item == trade_evolutions_item_ids[i]))
|
||||
if(((ACT_AS_GEN1_TRADE && (curr_gen == 1)) || (growth->item != EVERSTONE_ID))) {
|
||||
u8 found_value = trade_evolutions_evo_ids[i] <= max_index;
|
||||
if((!found_value) && get_allow_cross_gen_evos()) {
|
||||
learnsets = (const u16*)learnset_evos_gen3_bin;
|
||||
found_value = 1;
|
||||
}
|
||||
if(found_value) {
|
||||
found = 1;
|
||||
// Load the pre-evo name
|
||||
mon_data->pre_evo_string = get_pokemon_name_raw(mon_data);
|
||||
// Determine if we're going to change the name
|
||||
u8 replace_name = 0;
|
||||
if(text_gen3_is_same(get_pokemon_name_pure(growth->species, mon_data->is_egg, mon->language), mon->nickname, GET_LANGUAGE_NICKNAME_LIMIT(mon->language), GET_LANGUAGE_NICKNAME_LIMIT(mon->language)))
|
||||
replace_name = 1;
|
||||
// Evolve
|
||||
growth->species = trade_evolutions_evo_ids[i];
|
||||
// Consume the evolution item, if needed
|
||||
if(growth->item == trade_evolutions_item_ids[i])
|
||||
growth->item = NO_ITEM_ID;
|
||||
// Update the name, if needed
|
||||
if(replace_name)
|
||||
text_gen3_copy(get_pokemon_name_pure(growth->species, mon_data->is_egg, mon->language), mon->nickname, GET_LANGUAGE_NICKNAME_LIMIT(mon->language), GET_LANGUAGE_NICKNAME_LIMIT(mon->language));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(!found)
|
||||
return 0;
|
||||
void evolve_mon(struct gen3_mon* mon, struct gen3_mon_data_unenc* mon_data, u16 evolved_species, u8 consume_item, const u16* learnsets) {
|
||||
// Load the pre-evo name
|
||||
mon_data->pre_evo_string = get_pokemon_name_raw(mon_data);
|
||||
// Determine if we're going to change the name
|
||||
u8 replace_name = 0;
|
||||
if(text_gen3_is_same(get_pokemon_name_pure(mon_data->growth.species, mon_data->is_egg, mon->language), mon->nickname, GET_LANGUAGE_NICKNAME_LIMIT(mon->language), GET_LANGUAGE_NICKNAME_LIMIT(mon->language)))
|
||||
replace_name = 1;
|
||||
// Evolve
|
||||
mon_data->growth.species = evolved_species;
|
||||
// Consume the evolution item, if needed
|
||||
if(consume_item)
|
||||
mon_data->growth.item = NO_ITEM_ID;
|
||||
// Update the name, if needed
|
||||
if(replace_name)
|
||||
text_gen3_copy(get_pokemon_name_pure(mon_data->growth.species, mon_data->is_egg, mon->language), mon->nickname, GET_LANGUAGE_NICKNAME_LIMIT(mon->language), GET_LANGUAGE_NICKNAME_LIMIT(mon->language));
|
||||
|
||||
// Update growth
|
||||
place_and_encrypt_gen3_data(mon_data, mon);
|
||||
|
|
@ -1166,9 +1131,157 @@ u8 trade_evolve(struct gen3_mon* mon, struct gen3_mon_data_unenc* mon_data, u8 c
|
|||
recalc_stats_gen3(mon_data, mon);
|
||||
|
||||
// Find if the mon should learn new moves
|
||||
const struct learnset_data_mon_moves* found_learnset = extract_learnable_moves(learnsets, growth->species, mon->level);
|
||||
const struct learnset_data_mon_moves* found_learnset = extract_learnable_moves(learnsets, mon_data->growth.species, mon->level);
|
||||
if(found_learnset != NULL)
|
||||
mon_data->learnable_moves = found_learnset;
|
||||
}
|
||||
|
||||
const u16* get_special_evolutions(u16 species) {
|
||||
const u16* special_evolutions = (const u16*)special_evolutions_bin;
|
||||
u16 num_entries = special_evolutions[0];
|
||||
for(size_t i = 0; i < num_entries; i++) {
|
||||
size_t pos = special_evolutions[1+i]>>1;
|
||||
if(special_evolutions[pos] == species)
|
||||
return &special_evolutions[pos+1];
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
u8 own_menu_evolve(struct gen3_mon_data_unenc* mon_data, u8 index) {
|
||||
const u16* learnsets = (const u16*)learnset_evos_gen3_bin;
|
||||
|
||||
if((!mon_data->is_valid_gen3) || mon_data->is_egg)
|
||||
return 0;
|
||||
|
||||
const u16* special_evolutions = get_special_evolutions(mon_data->growth.species);
|
||||
|
||||
mon_data->growth.friendship = BASE_FRIENDSHIP;
|
||||
|
||||
if(!special_evolutions) {
|
||||
if(get_evolve_without_trade())
|
||||
return trade_evolve(mon_data->src, mon_data, 3);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
u16 num_evos = special_evolutions[0];
|
||||
|
||||
if(index >= num_evos)
|
||||
return 0;
|
||||
|
||||
u16 evolved_species = special_evolutions[1+index];
|
||||
|
||||
if((!evolved_species) || (evolved_species > LAST_VALID_GEN_3_MON))
|
||||
return 0;
|
||||
|
||||
mon_data->src->level = to_valid_level_gen3(mon_data->src);
|
||||
mon_data->src->level += 1;
|
||||
if(mon_data->src->level >= MAX_LEVEL)
|
||||
mon_data->src->level = MAX_LEVEL;
|
||||
mon_data->growth.exp = get_proper_exp_raw(mon_data);
|
||||
// The actual evolution logic
|
||||
evolve_mon(mon_data->src, mon_data, evolved_species, 0, learnsets);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
u16 get_own_menu_evolution_species(struct gen3_mon_data_unenc* mon_data, u8 index, u8* is_special) {
|
||||
u8 useless = 0;
|
||||
*is_special = 0;
|
||||
|
||||
if((!mon_data->is_valid_gen3) || mon_data->is_egg)
|
||||
return 0;
|
||||
|
||||
const u16* special_evolutions = get_special_evolutions(mon_data->growth.species);
|
||||
|
||||
if(!special_evolutions) {
|
||||
if(get_evolve_without_trade())
|
||||
return get_trade_evolution(mon_data->growth.species, mon_data->growth.item, 3, &useless, &useless);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
u16 num_evos = special_evolutions[0];
|
||||
|
||||
if(index >= num_evos)
|
||||
return 0;
|
||||
|
||||
u16 evolved_species = special_evolutions[1+index];
|
||||
|
||||
if((!evolved_species) || (evolved_species > LAST_VALID_GEN_3_MON))
|
||||
evolved_species = 0;
|
||||
|
||||
*is_special = 1;
|
||||
return evolved_species;
|
||||
}
|
||||
|
||||
u16 can_own_menu_evolve(struct gen3_mon_data_unenc* mon_data) {
|
||||
u8 useless = 0;
|
||||
|
||||
if((!mon_data->is_valid_gen3) || mon_data->is_egg)
|
||||
return 0;
|
||||
|
||||
const u16* special_evolutions = get_special_evolutions(mon_data->growth.species);
|
||||
if(special_evolutions)
|
||||
return special_evolutions[0];
|
||||
|
||||
if(get_evolve_without_trade() && get_trade_evolution(mon_data->growth.species, mon_data->growth.item, 3, &useless, &useless))
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
u16 get_trade_evolution(u16 species, u16 item, u8 curr_gen, u8* consume_item, u8* cross_gen_evo) {
|
||||
const u16* trade_evolutions = (const u16*)trade_evolutions_bin;
|
||||
u16 num_entries = trade_evolutions[0];
|
||||
const u16* trade_evolutions_base_ids = trade_evolutions+1;
|
||||
const u16* trade_evolutions_item_ids = trade_evolutions+1+num_entries;
|
||||
const u16* trade_evolutions_evo_ids = trade_evolutions+1+(2*num_entries);
|
||||
u16 max_index = LAST_VALID_GEN_3_MON;
|
||||
if(curr_gen == 1)
|
||||
max_index = LAST_VALID_GEN_1_MON;
|
||||
if(curr_gen == 2)
|
||||
max_index = LAST_VALID_GEN_2_MON;
|
||||
*consume_item = 0;
|
||||
*cross_gen_evo = 0;
|
||||
for(int i = 0; i < num_entries; i++)
|
||||
if(species == trade_evolutions_base_ids[i])
|
||||
if((!trade_evolutions_item_ids[i]) || (item == trade_evolutions_item_ids[i]))
|
||||
if(((ACT_AS_GEN1_TRADE && (curr_gen == 1)) || (item != EVERSTONE_ID)))
|
||||
if((trade_evolutions_evo_ids[i] <= max_index) || get_allow_cross_gen_evos()) {
|
||||
if(trade_evolutions_item_ids[i])
|
||||
*consume_item = 1;
|
||||
if(trade_evolutions_evo_ids[i] > max_index)
|
||||
*cross_gen_evo = 1;
|
||||
return trade_evolutions_evo_ids[i];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
u8 trade_evolve(struct gen3_mon* mon, struct gen3_mon_data_unenc* mon_data, u8 curr_gen) {
|
||||
const u16* learnsets = (const u16*)learnset_evos_gen3_bin;
|
||||
|
||||
if(curr_gen == 1)
|
||||
learnsets = (const u16*)learnset_evos_gen1_bin;
|
||||
if(curr_gen == 2)
|
||||
learnsets = (const u16*)learnset_evos_gen2_bin;
|
||||
|
||||
if((!mon_data->is_valid_gen3) || mon_data->is_egg)
|
||||
return 0;
|
||||
|
||||
u8 consume_item = 0;
|
||||
u8 cross_gen_evo = 0;
|
||||
|
||||
u16 evolved_species = get_trade_evolution(mon_data->growth.species, mon_data->growth.item, curr_gen, &consume_item, &cross_gen_evo);
|
||||
|
||||
if((!evolved_species) || (evolved_species > LAST_VALID_GEN_3_MON))
|
||||
return 0;
|
||||
|
||||
if(cross_gen_evo)
|
||||
learnsets = (const u16*)learnset_evos_gen3_bin;
|
||||
|
||||
// The actual evolution logic
|
||||
evolve_mon(mon, mon_data, evolved_species, consume_item, learnsets);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -94,7 +94,15 @@ void init_colour_window() {
|
|||
}
|
||||
|
||||
void clear_colour_window() {
|
||||
reset_window(COLOURS_WINDOW_X, COLOURS_WINDOW_Y, COLOURS_WINDOW_X_SIZE, COLOURS_WINDOW_Y_SIZE, COLOURS_WINDOW_SCREEN);
|
||||
reset_window(COLOURS_WINDOW_X, COLOURS_WINDOW_Y, COLOURS_WINDOW_X_SIZE, COLOURS_WINDOW_Y_SIZE, COLOURS_WINDOW_SCREEN);
|
||||
}
|
||||
|
||||
void init_evolution_window(u8 num_entries) {
|
||||
create_window(EVOLUTION_WINDOW_X, EVOLUTION_WINDOW_Y-(EVOLUTION_WINDOW_Y_SIZE_INCREMENT*num_entries), EVOLUTION_WINDOW_X_SIZE, EVOLUTION_WINDOW_Y_SIZE + (EVOLUTION_WINDOW_Y_SIZE_INCREMENT*num_entries), EVOLUTION_WINDOW_SCREEN);
|
||||
}
|
||||
|
||||
void clear_evolution_window(u8 num_entries) {
|
||||
reset_window(EVOLUTION_WINDOW_X, EVOLUTION_WINDOW_Y-(EVOLUTION_WINDOW_Y_SIZE_INCREMENT*num_entries), EVOLUTION_WINDOW_X_SIZE, EVOLUTION_WINDOW_Y_SIZE + (EVOLUTION_WINDOW_Y_SIZE_INCREMENT*num_entries), EVOLUTION_WINDOW_SCREEN);
|
||||
}
|
||||
|
||||
void init_loading_window() {
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user