diff --git a/include/gen12_methods.h b/include/gen12_methods.h index cbd0a12..f9bc940 100644 --- a/include/gen12_methods.h +++ b/include/gen12_methods.h @@ -6,7 +6,7 @@ u8 has_legal_moves_gen12(u8*, u8); u8 get_ivs_gen2(u16, u8); u8 get_unown_letter_gen2(u16); -s32 get_proper_exp_gen2(u16, u8, u8, u8*); +u8 to_valid_level_gen12(u8); u8 is_shiny_gen2(u8, u8, u8, u8); u8 is_shiny_gen2_unfiltered(u16); u8 is_shiny_gen2_raw(struct gen2_mon_data*); diff --git a/include/party_handler.h b/include/party_handler.h index 24d3b64..01a792d 100644 --- a/include/party_handler.h +++ b/include/party_handler.h @@ -109,7 +109,11 @@ #define GEN1_DOT 0xF2 #define MAX_LEVEL 100 +#define MAX_LEVEL_GEN3 100 +#define MAX_LEVEL_GEN12 100 #define MIN_LEVEL 1 +#define MIN_LEVEL_GEN3 2 +#define MIN_LEVEL_GEN12 2 #define EGG_LEVEL_GEN3 5 #define EGG_LEVEL_GEN2 5 #define BASE_FRIENDSHIP 70 @@ -411,8 +415,9 @@ u16 get_mon_index(int, u32, u8, u8); u8 get_unown_letter_gen3(u32); const u8* get_pokemon_name(int, u32, u8, u8, u8); u8 has_mail(struct gen3_mon*, struct gen3_mon_growth*, u8); +u8 to_valid_level_gen3_pure(u8); s32 get_proper_exp(struct gen3_mon*, struct gen3_mon_growth*, u8, u8); -u8 to_valid_level(u8); +s32 get_proper_exp_pure(u8, s32, u16, u8); u16 get_possible_abilities_pokemon(int, u32, u8, u8); u8 get_pokemon_gender_gen3(int, u32, u8, u8); u16 calc_stats_gen3(u16, u32, u8, u8, u8, u8, u8); diff --git a/source/config_settings.c b/source/config_settings.c index 2297df3..7e440cb 100644 --- a/source/config_settings.c +++ b/source/config_settings.c @@ -39,7 +39,7 @@ static u16 applied_ball; static u8 egg_met_location; static u8 first_set_egg_met_location; -const struct version_t version = { .main_version = 1, .sub_version = 1, .revision_version = 6, .revision_letter = CONSOLE_LETTER}; +const struct version_t version = { .main_version = 1, .sub_version = 1, .revision_version = 7, .revision_letter = CONSOLE_LETTER}; const u8* egg_valid_met_locations[NUMBER_OF_GAMES+FIRST_VERSION_ID] = {valid_egg_locations_rs_bin, valid_egg_locations_rs_bin, valid_egg_locations_rs_bin, valid_egg_locations_e_bin, valid_egg_locations_frlg_bin, valid_egg_locations_frlg_bin}; void set_default_settings() { diff --git a/source/gen12_methods.c b/source/gen12_methods.c index 7d0cf7b..8a55643 100644 --- a/source/gen12_methods.c +++ b/source/gen12_methods.c @@ -55,29 +55,14 @@ u8 get_unown_letter_gen2(u16 ivs){ return get_unown_letter_gen2_fast(ivs); } -s32 get_proper_exp_gen2(u16 mon_index, u8 level, u8 is_egg, u8* given_exp) { - s32 exp = (given_exp[0]<<0x10) + (given_exp[1]<<0x8) + (given_exp[2]<<0); - - if(is_egg) { - level = EGG_LEVEL_GEN2; - exp = get_level_exp_mon_index(mon_index, level); - } - - s32 min_exp = get_level_exp_mon_index(mon_index, level); - s32 max_exp = min_exp; - if(level == MAX_LEVEL) - exp = min_exp; - else - max_exp = get_level_exp_mon_index(mon_index, level+1)-1; - if(exp < min_exp) - exp = min_exp; - if(exp > max_exp) - exp = max_exp; - if(exp < 0) - exp = 0; - - return exp; +u8 to_valid_level_gen12(u8 level) { + if(level < MIN_LEVEL_GEN12) + return MIN_LEVEL_GEN12; + if(level > MAX_LEVEL_GEN12) + return MAX_LEVEL_GEN12; + return level; } + u8 is_shiny_gen2(u8 atk_ivs, u8 def_ivs, u8 spa_ivs, u8 spe_ivs) { if((atk_ivs & 2) == 2 && def_ivs == 10 && spa_ivs == 10 && spe_ivs == 10) return 1; diff --git a/source/gen_converter.c b/source/gen_converter.c index 8f030e4..7f98be6 100644 --- a/source/gen_converter.c +++ b/source/gen_converter.c @@ -52,6 +52,7 @@ u8 convert_moves_to_gen3(struct gen3_mon_attacks*, struct gen3_mon_growth*, u8*, u8 convert_item_of_gen3(u16); u16 convert_item_to_gen3(u16); void convert_exp_nature_of_gen3(struct gen3_mon*, struct gen3_mon_growth*, u8*, u8*, u8, u8); +s32 get_proper_exp_from_gen12(u16, u8, u8, u8*); u8 get_exp_nature(struct gen3_mon*, struct gen3_mon_growth*, u8, u8, u8*); void convert_evs_of_gen3(struct gen3_mon_evs*, u16*); void convert_evs_to_gen3(struct gen3_mon_evs*, u16*); @@ -266,7 +267,7 @@ void convert_exp_nature_of_gen3(struct gen3_mon* src, struct gen3_mon_growth* gr return; // Level handling - u8 level = to_valid_level_gen3(src); + u8 level = to_valid_level_gen12(to_valid_level_gen3(src)); if(is_egg) level = EGG_LEVEL_GEN2; @@ -276,7 +277,7 @@ void convert_exp_nature_of_gen3(struct gen3_mon* src, struct gen3_mon_growth* gr s32 exp = get_proper_exp(src, growth, is_egg, 0); s32 max_exp = get_level_exp_mon_index(mon_index, level); - if(level < MAX_LEVEL) + if(level < MAX_LEVEL_GEN12) max_exp = get_level_exp_mon_index(mon_index, level+1)-1; if(!is_egg) { @@ -288,9 +289,9 @@ void convert_exp_nature_of_gen3(struct gen3_mon* src, struct gen3_mon_growth* gr if(exp_nature > nature) nature += NUM_NATURES; exp += nature - exp_nature; - if(level == MAX_LEVEL) + if(level == MAX_LEVEL_GEN12) exp = max_exp; - if(level < MAX_LEVEL) + if(level < MAX_LEVEL_GEN12) while(exp > max_exp) { level++; if(level >= (MIN_LEVEL_25_EXP_DIFF+1)) { @@ -301,7 +302,7 @@ void convert_exp_nature_of_gen3(struct gen3_mon* src, struct gen3_mon_growth* gr } } /* - if ((level == MAX_LEVEL) && (exp != get_level_exp_mon_index(mon_index, MAX_LEVEL))){ + if ((level == MAX_LEVEL_GEN12) && (exp != get_level_exp_mon_index(mon_index, MAX_LEVEL_GEN12))){ level--; exp -= NUM_NATURES; } @@ -313,16 +314,25 @@ void convert_exp_nature_of_gen3(struct gen3_mon* src, struct gen3_mon_growth* gr exp_ptr[2-i] = (exp >> (8*i))&0xFF; } +s32 get_proper_exp_from_gen12(u16 mon_index, u8 level, u8 is_egg, u8* given_exp) { + s32 exp = (given_exp[0]<<0x10) + (given_exp[1]<<0x8) + (given_exp[2]<<0); + + if(given_exp[0] >= 0x80) + exp = 0; + + return get_proper_exp_pure(level, exp, mon_index, is_egg); +} + u8 get_exp_nature(struct gen3_mon* dst, struct gen3_mon_growth* growth, u8 level, u8 is_egg, u8* given_exp) { // Level handling - level = to_valid_level(level); + level = to_valid_level_gen3_pure(level); if(is_egg) - level = EGG_LEVEL_GEN2; + level = EGG_LEVEL_GEN3; u16 mon_index = get_mon_index_gen2(growth->species, 0); // Experience handling - s32 exp = get_proper_exp_gen2(mon_index, level, is_egg, given_exp); + s32 exp = get_proper_exp_from_gen12(mon_index, level, is_egg, given_exp); // Save nature in experience, like the Gen I-VII conversion u8 nature = SWI_DivMod(exp, NUM_NATURES); @@ -1359,7 +1369,7 @@ u8 gen2_to_gen3(struct gen2_mon_data* src, struct gen3_mon_data_unenc* data_dst, convert_evs_to_gen3(&data_dst->evs, evs_container); // Handle cases in which the nature would be forced - if((dst->level == MAX_LEVEL) || (is_egg)) + if((src->level >= MAX_LEVEL_GEN12) || (is_egg)) wanted_nature = get_nature(get_rng()); // Store egg cycles @@ -1439,7 +1449,7 @@ u8 gen1_to_gen3(struct gen1_mon_data* src, struct gen3_mon_data_unenc* data_dst, convert_evs_to_gen3(&data_dst->evs, evs_container); // Handle cases in which the nature would be forced - if(dst->level == MAX_LEVEL) + if(src->level >= MAX_LEVEL_GEN12) wanted_nature = get_nature(get_rng()); // Set base friendship diff --git a/source/menu_text_handler.c b/source/menu_text_handler.c index 06cb730..5b1d1dd 100644 --- a/source/menu_text_handler.c +++ b/source/menu_text_handler.c @@ -932,8 +932,8 @@ void print_evolution_menu(struct gen3_mon_data_unenc* mon, u16 index, u8 screen, if(needs_levelup) mon->src->level += 1; - if(mon->src->level > MAX_LEVEL) - mon->src->level = MAX_LEVEL; + if(mon->src->level > MAX_LEVEL_GEN3) + mon->src->level = MAX_LEVEL_GEN3; mon->growth.species = new_species; print_pokemon_base_data(1, mon, BASE_Y_SPRITE_EVOLUTION_PAGE, BASE_X_SPRITE_EVOLUTION_PAGE, 0); @@ -1105,7 +1105,7 @@ void print_pokemon_page3(struct gen3_mon_data_unenc* mon) { PRINT_FUNCTION("\nExperience: \x03\n", get_proper_exp_raw(mon)); - if(to_valid_level_gen3(mon->src) < MAX_LEVEL) + if(to_valid_level_gen3(mon->src) < MAX_LEVEL_GEN3) PRINT_FUNCTION("\nNext Lv. in: \x09 > Lv. \x09", get_level_exp_mon_index(get_mon_index_raw(mon), to_valid_level_gen3(mon->src)+1) - get_proper_exp_raw(mon), 5, to_valid_level_gen3(mon->src)+1, 3); } diff --git a/source/party_handler.c b/source/party_handler.c index a3966d1..b8bf1ac 100644 --- a/source/party_handler.c +++ b/source/party_handler.c @@ -59,6 +59,7 @@ #define PID_POSITIONS 24 +u8 _to_valid_level(u8); const u8* get_item_name(int, u8); u8 get_ability_pokemon(int, u32, u8, u8, u8); u8 is_ability_valid(u16, u32, u8, u8, u8, u8); @@ -787,6 +788,10 @@ s32 get_proper_exp(struct gen3_mon* src, struct gen3_mon_growth* growth, u8 is_e s32 exp = growth->exp; u16 mon_index = get_mon_index(growth->species, src->pid, 0, deoxys_form); + return get_proper_exp_pure(level, exp, mon_index, is_egg); +} + +s32 get_proper_exp_pure(u8 level, s32 exp, u16 mon_index, u8 is_egg) { if(is_egg) { level = EGG_LEVEL_GEN3; exp = get_level_exp_mon_index(mon_index, level); @@ -794,7 +799,7 @@ s32 get_proper_exp(struct gen3_mon* src, struct gen3_mon_growth* growth, u8 is_e s32 min_exp = get_level_exp_mon_index(mon_index, level); s32 max_exp = min_exp; - if(level == MAX_LEVEL) + if(level == MAX_LEVEL_GEN3) exp = min_exp; else max_exp = get_level_exp_mon_index(mon_index, level+1)-1; @@ -889,7 +894,7 @@ u16 calc_stats_gen3_raw_alternative(struct gen3_mon_data_unenc* data_src, struct return calc_stats_gen3(data_src->growth.species, data_alt->pid, stat_index, to_valid_level_gen3(data_src->src), get_ivs_gen3_pure(data_alt->ivs, stat_index), get_evs_gen3(&data_src->evs, stat_index), data_src->deoxys_form); } -u8 to_valid_level(u8 level) { +u8 _to_valid_level(u8 level) { if(level < MIN_LEVEL) return MIN_LEVEL; if(level > MAX_LEVEL) @@ -897,8 +902,16 @@ u8 to_valid_level(u8 level) { return level; } +u8 to_valid_level_gen3_pure(u8 level) { + if(level < MIN_LEVEL_GEN3) + return MIN_LEVEL_GEN3; + if(level > MAX_LEVEL_GEN3) + return MAX_LEVEL_GEN3; + return level; +} + u8 to_valid_level_gen3(struct gen3_mon* src) { - return to_valid_level(src->level); + return to_valid_level_gen3_pure(src->level); } void recalc_stats_gen3(struct gen3_mon_data_unenc* data_dst, struct gen3_mon* dst) { @@ -1300,8 +1313,8 @@ u8 own_menu_evolve(struct gen3_mon_data_unenc* mon_data, u8 index) { 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; + if(mon_data->src->level >= MAX_LEVEL_GEN3) + mon_data->src->level = MAX_LEVEL_GEN3; 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);