Fix possible issue with level being too low for gen 1/2

This commit is contained in:
Lorenzooone 2023-07-05 00:04:23 +02:00
parent 74ef9140e8
commit 0b7c40d159
7 changed files with 56 additions and 43 deletions

View File

@ -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*);

View File

@ -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);

View File

@ -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() {

View File

@ -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;

View File

@ -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

View File

@ -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);
}

View File

@ -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);