mirror of
https://github.com/Lorenzooone/Pokemon-Gen3-to-Gen-X.git
synced 2026-03-21 17:24:39 -05:00
Fix possible issue with level being too low for gen 1/2
This commit is contained in:
parent
74ef9140e8
commit
0b7c40d159
|
|
@ -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*);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user