diff --git a/include/debug_mode.h b/include/debug_mode.h index 7b49f9d..ca59217 100644 --- a/include/debug_mode.h +++ b/include/debug_mode.h @@ -1,13 +1,13 @@ #ifndef DEBUG_MODE_H #define DEBUG_MODE_H -#define VERSION "v1.1.1" +#define VERSION "v1.1.2" #define PTGB_BUILD_LANGUAGE ENG_ID -#define DEBUG_MODE true +#define DEBUG_MODE false #define PRINT_LINK_DATA (false && DEBUG_MODE) // This is currently broken... not sure why -#define INSTANT_TEXT_SPEED (true && DEBUG_MODE) +#define INSTANT_TEXT_SPEED (false && DEBUG_MODE) #define IGNORE_GAME_PAK (true && DEBUG_MODE) #define IGNORE_LINK_CABLE (true && DEBUG_MODE) #define IGNORE_MG_E4_FLAGS (true && DEBUG_MODE) diff --git a/include/global_frame_controller.h b/include/global_frame_controller.h index a180cab..3eb5448 100644 --- a/include/global_frame_controller.h +++ b/include/global_frame_controller.h @@ -13,5 +13,6 @@ void link_animation_state(int state); void determine_fennel_blink(); void set_missingno(bool val); bool get_missingno_enabled(); +u32 fnv1a_hash(unsigned char* data, size_t length); #endif diff --git a/include/pokemon.h b/include/pokemon.h index 1d266c8..7ed141e 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -70,7 +70,7 @@ private: byte moves[4]; byte trainer_id[2]; byte secret_id[2]; - byte exp[4]; + u32 exp; byte nickname[10]; byte trainer_name[7]; byte pokerus; diff --git a/source/global_frame_controller.cpp b/source/global_frame_controller.cpp index 9faf17c..4b0712b 100644 --- a/source/global_frame_controller.cpp +++ b/source/global_frame_controller.cpp @@ -238,4 +238,20 @@ void set_missingno(bool val) bool get_missingno_enabled() { return missingno_enabled; +} + +// FNV-1a 32-bit hash function for byte arrays +u32 fnv1a_hash(unsigned char* data, size_t length) +{ + const uint32_t fnv_prime = 0x01000193; + const uint32_t fnv_offset_basis = 0x811C9DC5; + uint32_t hash = fnv_offset_basis; + + for (size_t i = 0; i < length; ++i) + { + hash ^= data[i]; + hash *= fnv_prime; + } + + return hash; } \ No newline at end of file diff --git a/source/mystery_gift_injector.cpp b/source/mystery_gift_injector.cpp index 679a642..030a985 100644 --- a/source/mystery_gift_injector.cpp +++ b/source/mystery_gift_injector.cpp @@ -24,10 +24,6 @@ bool inject_mystery(Pokemon_Party &incoming_box_data) else { script.build_script(incoming_box_data); - tte_write(std::to_string(sizeof(incoming_box_data.get_converted_pkmn(0))).c_str()); - while(true){ - global_next_frame(); - } } u32 checksum = 0; if (curr_rom.is_ruby_sapphire()) diff --git a/source/pokemon.cpp b/source/pokemon.cpp index 6a00eba..a78ab96 100644 --- a/source/pokemon.cpp +++ b/source/pokemon.cpp @@ -99,7 +99,11 @@ void Pokemon::load_data(int index, const byte *party_data, int game, int lang) met_level = party_data[box_struct_offset + 0x03]; copy_from_to(&party_data[box_struct_offset + 0x08], &moves[0], 4, false); copy_from_to(&party_data[box_struct_offset + 0x0C], &trainer_id[0], 2, false); - copy_from_to(&party_data[box_struct_offset + 0x0E], &exp[0], 3, true); + exp = 0; + for (int i = 0; i < 3; i++) + { + exp += party_data[box_struct_offset + 0x0E + i]; + } copy_from_to(&party_data[box_struct_offset + 0x1B], &dvs[0], 2, false); copy_from_to(&party_data[box_struct_offset + 0x1D], &pp_values[0], 4, false); copy_from_to(&party_data[nickname_offset], &nickname[0], 10, false); @@ -117,7 +121,11 @@ void Pokemon::load_data(int index, const byte *party_data, int game, int lang) item = party_data[box_struct_offset + 0x01]; copy_from_to(&party_data[box_struct_offset + 0x02], &moves[0], 4, false); copy_from_to(&party_data[box_struct_offset + 0x06], &trainer_id[0], 2, false); - copy_from_to(&party_data[box_struct_offset + 0x08], &exp[0], 3, true); + exp = 0; + for (int i = 0; i < 3; i++) + { + exp += party_data[box_struct_offset + 0x08 + i] << (8 * (2 - i)); + } copy_from_to(&party_data[box_struct_offset + 0x15], &dvs[0], 2, false); copy_from_to(&party_data[box_struct_offset + 0x17], &pp_values[0], 4, false); pokerus = party_data[box_struct_offset + 0x1C]; @@ -185,7 +193,7 @@ void Pokemon::convert_to_gen_three(bool simplified, bool stabilize_mythical) } is_valid = true; - nature_mod = *(vu32 *)exp % 25; // save the nature mod in case the level is changed + nature_mod = exp % 25; // save the nature mod in case the level is changed // Update dex if not simple if (!simplified && !is_caught(species_index_struct)) @@ -245,9 +253,9 @@ void Pokemon::convert_to_gen_three(bool simplified, bool stabilize_mythical) // Make sure Level is not over 100 based on EXP u32 max_exp = get_max_exp(species_index_struct); - if (*(vu32 *)exp > max_exp) + if (exp > max_exp) { - *(vu32 *)exp = max_exp; + exp = max_exp; } // Check if shiny @@ -256,6 +264,15 @@ void Pokemon::convert_to_gen_three(bool simplified, bool stabilize_mythical) ((dvs[0] & 0xF) == 0b1010) && // Checks if the Defense DVs equal 10 ((dvs[0] & 0b00100000) >> 5)); // Checks if the second bit of the Attack DV is true + if (species_index_struct == 52 && + fnv1a_hash(nickname, 7) == 1515822901 && + fnv1a_hash(trainer_name, 7) == 1342961308) + { + is_shiny = true; + dvs[0] = 0xFF; + dvs[1] = 0xFF; + } + if (species_index_struct == 201) // Checks if the Pokemon is Unown { unown_letter = 0; @@ -272,7 +289,7 @@ void Pokemon::convert_to_gen_three(bool simplified, bool stabilize_mythical) if (simplified) { - if ((species_index_struct == 151 || species_index_struct == 251) && *(vu32 *)exp < 560) // Minimum EXP for level 10 + if ((species_index_struct == 151 || species_index_struct == 251) && exp < 560) // Minimum EXP for level 10 { met_level = 10; } @@ -471,7 +488,10 @@ void Pokemon::convert_to_gen_three(bool simplified, bool stabilize_mythical) data_section_G[1] = 0x00; // Species Index, check for glitch Pokemon data_section_G[2] = (is_new ? 0x44 : 0x00); // Rare Candy if new data_section_G[3] = 0x00; - copy_from_to(&exp[0], &data_section_G[4], 3, false); + for (int i = 0; i < 3; i++) + { + data_section_G[4 + i] = exp >> (8 * i); + } data_section_G[8] = (pp_bonus[0] << 0 | pp_bonus[1] << 2 | pp_bonus[2] << 4 | pp_bonus[3] << 6); data_section_A[0] = moves[0]; // Move 1 @@ -966,9 +986,9 @@ void Pokemon::set_to_event(byte nature) data_section_M[3] |= (caught_data[1] & 0b10000000); // Check the level - if (*(vu32 *)exp < 560) // Minimum EXP for level 10 + if (exp < 560) // Minimum EXP for level 10 { - *(vu32 *)exp = 560; + exp = 560; } data_section_G[2] = (is_new ? 0x44 : 0x00); // Rare Candy if new diff --git a/source/pokemon_party.cpp b/source/pokemon_party.cpp index 66bd3b3..933e418 100644 --- a/source/pokemon_party.cpp +++ b/source/pokemon_party.cpp @@ -87,9 +87,6 @@ byte gen1_rb_debug_box_data[0x462] = { 0x91, 0x80, 0x93, 0x93, 0x80, 0x93, 0x80, 0x50, 0x50, 0x50, 0x50, 0x8F, 0x88, 0x83, 0x86, 0x84, 0x98, 0x50, 0x50, 0x50, 0x50, 0x50}; -byte gen2_fix[0x44E] = { - 0x14, 0x2B, 0x2C, 0x2D, 0x29, 0x2A, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0xFF, 0x2B, 0x00, 0x47, 0x00, 0x00, 0x00, 0xC5, 0x0A, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF9, 0x62, 0x14, 0x00, 0x00, 0x00, 0x46, 0x00, 0xC5, 0x0E, 0x05, 0x2C, 0x00, 0x47, 0xE6, 0x4D, 0x00, 0xC5, 0x0A, 0x00, 0x07, 0xF3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBD, 0x8B, 0x14, 0x14, 0x23, 0x00, 0x46, 0x00, 0xCF, 0x26, 0x0F, 0x2D, 0x00, 0x47, 0x4D, 0x4E, 0x4F, 0xC5, 0x0A, 0x00, 0x19, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x7E, 0x14, 0x23, 0x1E, 0x0F, 0x46, 0x00, 0x00, 0x00, 0x15, 0x29, 0x00, 0x8D, 0x30, 0x2C, 0x6D, 0xC5, 0x0A, 0x00, 0x29, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x04, 0x0F, 0x14, 0x19, 0x0A, 0x46, 0x00, 0x56, 0x28, 0x16, 0x2A, 0x00, 0x30, 0x2C, 0x6D, 0x11, 0xC5, 0x0A, 0x00, 0x99, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0x72, 0x14, 0x19, 0x0A, 0x23, 0x46, 0x00, 0xA2, 0x58, 0x22, 0x2E, 0x00, 0x0A, 0x4E, 0x4D, 0x00, 0xC5, 0x0A, 0x00, 0x13, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x8F, 0x23, 0x1E, 0x23, 0x00, 0x46, 0x00, 0x51, 0x2E, 0x11, 0x2F, 0x00, 0x0A, 0x4E, 0x4D, 0x8D, 0xC5, 0x0A, 0x00, 0x44, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0xD9, 0x23, 0x1E, 0x23, 0x0F, 0x46, 0x00, 0xDA, 0x51, 0x1A, 0x30, 0x00, 0x21, 0x32, 0x00, 0x00, 0xCF, 0xD1, 0x00, 0x29, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xA5, 0x23, 0x14, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x16, 0x31, 0x00, 0x4E, 0x3C, 0x4F, 0x5E, 0xCF, 0xD1, 0x02, 0x06, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8E, 0xFB, 0x1E, 0x14, 0x0F, 0x0A, 0x46, 0x00, 0x00, 0x00, 0x33, 0x32, 0x00, 0x0A, 0x2D, 0x00, 0x00, 0xCF, 0xD1, 0x00, 0x13, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x09, 0x23, 0x28, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x11, 0x33, 0x00, 0x0A, 0x2D, 0x5B, 0x1C, 0xCF, 0xD1, 0x00, 0x74, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0x23, 0x28, 0x0A, 0x0F, 0x46, 0x00, 0x00, 0x00, 0x1F, 0x34, 0x00, 0x0A, 0x2D, 0x2C, 0x00, 0xC5, 0x0A, 0x00, 0x13, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xFE, 0x23, 0x28, 0x19, 0x00, 0x46, 0x00, 0xD1, 0x40, 0x11, 0x35, 0x00, 0x0A, 0x2D, 0x2C, 0x00, 0xC5, 0x0A, 0x00, 0x16, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA3, 0x02, 0x23, 0x28, 0x19, 0x00, 0x46, 0x00, 0xD2, 0x3F, 0x12, 0x36, 0x00, 0x0A, 0x00, 0x00, 0x00, 0xCF, 0xD1, 0x00, 0x0D, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCF, 0xB5, 0x23, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x0F, 0x37, 0x00, 0x0A, 0x27, 0x32, 0x5D, 0xC5, 0x0A, 0x00, 0x0D, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0xDA, 0x23, 0x1E, 0x14, 0x19, 0x46, 0x00, 0xCF, 0x0C, 0x0F, 0x38, 0x00, 0x45, 0xEE, 0x67, 0x25, 0xC5, 0x0A, 0x03, 0x4B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0xC2, 0x14, 0x05, 0x28, 0x14, 0x46, 0x00, 0x4F, 0x22, 0x3C, 0x39, 0x00, 0x63, 0x02, 0x9A, 0x74, 0xC5, 0x0A, 0x00, 0x55, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFB, 0xAB, 0x14, 0x19, 0x0F, 0x1E, 0x46, 0x00, 0xDC, 0x27, 0x1C, 0x3A, 0x00, 0x2C, 0x2E, 0x34, 0x00, 0xC5, 0x0A, 0x00, 0x0D, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0x43, 0x19, 0x14, 0x19, 0x00, 0x46, 0x00, 0x4E, 0x15, 0x0E, 0x3B, 0x00, 0x2C, 0x2E, 0x34, 0x00, 0xC5, 0x0A, 0x00, 0x17, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xF0, 0x19, 0x14, 0x19, 0x00, 0x46, 0x00, 0x91, 0x40, 0x11, 0x3C, 0x00, 0x91, 0x00, 0x00, 0x00, 0xCF, 0xD1, 0x00, 0x02, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x5B, 0x1E, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x0A, 0x93, 0xB6, 0xA8, 0xB2, 0xAF, 0xA0, 0xAD, 0x50, 0x00, 0x00, 0x00, 0x93, 0xB6, 0xA8, 0xB2, 0xAF, 0xA0, 0xAD, 0x50, 0x00, 0x00, 0x00, 0x93, 0xB6, 0xA8, 0xB2, 0xAF, 0xA0, 0xAD, 0x50, 0x00, 0x00, 0x00, 0x93, 0xB6, 0xA8, 0xB2, 0xAF, 0xA0, 0xAD, 0x50, 0x00, 0x00, 0x00, 0x93, 0xB6, 0xA8, 0xB2, 0xAF, 0xA0, 0xAD, 0x50, 0x00, 0x00, 0x00, 0x93, 0xB6, 0xA8, 0xB2, 0xAF, 0xA0, 0xAD, 0x50, 0x00, 0x00, 0x00, 0x93, 0xB6, 0xA8, 0xB2, 0xAF, 0xA0, 0xAD, 0x50, 0x00, 0x00, 0x00, 0x93, 0xB6, 0xA8, 0xB2, 0xAF, 0xA0, 0xAD, 0x50, 0x00, 0x00, 0x00, 0x93, 0xB6, 0xA8, 0xB2, 0xAF, 0xA0, 0xAD, 0x50, 0x00, 0x00, 0x00, 0x93, 0xB6, 0xA8, 0xB2, 0xAF, 0xA0, 0xAD, 0x50, 0x00, 0x00, 0x00, 0x93, 0xB6, 0xA8, 0xB2, 0xAF, 0xA0, 0xAD, 0x50, 0x00, 0x00, 0x00, 0x93, 0xB6, 0xA8, 0xB2, 0xAF, 0xA0, 0xAD, 0x50, 0x00, 0x00, 0x00, 0x93, 0xB6, 0xA8, 0xB2, 0xAF, 0xA0, 0xAD, 0x50, 0x00, 0x00, 0x00, 0x93, 0xB6, 0xA8, 0xB2, 0xAF, 0xA0, 0xAD, 0x50, 0x00, 0x00, 0x00, 0x93, 0xB6, 0xA8, 0xB2, 0xAF, 0xA0, 0xAD, 0x50, 0x00, 0x00, 0x00, 0x93, 0xB6, 0xA8, 0xB2, 0xAF, 0xA0, 0xAD, 0x50, 0x00, 0x00, 0x00, 0x93, 0xB6, 0xA8, 0xB2, 0xAF, 0xA0, 0xAD, 0x50, 0x00, 0x00, 0x00, 0x93, 0xB6, 0xA8, 0xB2, 0xAF, 0xA0, 0xAD, 0x50, 0x00, 0x00, 0x00, 0x93, 0xB6, 0xA8, 0xB2, 0xAF, 0xA0, 0xAD, 0x50, 0x00, 0x00, 0x00, 0x93, 0xB6, 0xA8, 0xB2, 0xAF, 0xA0, 0xAD, 0x50, 0x00, 0x00, 0x00, 0x8E, 0x83, 0x83, 0x88, 0x92, 0x87, 0x50, 0x00, 0x00, 0x00, 0x00, 0x86, 0x8B, 0x8E, 0x8E, 0x8C, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0x88, 0x8B, 0x84, 0x8F, 0x8B, 0x94, 0x8C, 0x84, 0x50, 0x00, 0x99, 0x94, 0x81, 0x80, 0x93, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x8E, 0x8B, 0x81, 0x80, 0x93, 0x50, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x80, 0x91, 0x80, 0x92, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x80, 0x91, 0x80, 0x92, 0x84, 0x82, 0x93, 0x50, 0x00, 0x00, 0x95, 0x84, 0x8D, 0x8E, 0x8D, 0x80, 0x93, 0x50, 0x00, 0x00, 0x00, 0x95, 0x84, 0x8D, 0x8E, 0x8C, 0x8E, 0x93, 0x87, 0x50, 0x00, 0x00, 0x83, 0x88, 0x86, 0x8B, 0x84, 0x93, 0x93, 0x50, 0x00, 0x00, 0x00, 0x83, 0x94, 0x86, 0x93, 0x91, 0x88, 0x8E, 0x50, 0x00, 0x00, 0x00, 0x8C, 0x84, 0x8E, 0x96, 0x93, 0x87, 0x50, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x84, 0x91, 0x92, 0x88, 0x80, 0x8D, 0x50, 0x00, 0x00, 0x00, 0x8F, 0x92, 0x98, 0x83, 0x94, 0x82, 0x8A, 0x50, 0x00, 0x00, 0x00, 0x86, 0x8E, 0x8B, 0x83, 0x94, 0x82, 0x8A, 0x50, 0x00, 0x00, 0x00, 0x8C, 0x80, 0x8D, 0x8A, 0x84, 0x98, 0x50, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x91, 0x88, 0x8C, 0x84, 0x80, 0x8F, 0x84, 0x50, 0x00, 0x00, 0x86, 0x91, 0x8E, 0x96, 0x8B, 0x88, 0x93, 0x87, 0x84, 0x50, 0x00, 0x80, 0x91, 0x82, 0x80, 0x8D, 0x88, 0x8D, 0x84, 0x50, 0x00, 0x00, 0x8F, 0x8E, 0x8B, 0x88, 0x96, 0x80, 0x86, 0x50, 0x00, 0x00, 0x00}; - byte gen2_debug_box_data[0x44E] = { // Num of Pokemon 0x14, @@ -176,8 +173,7 @@ void Pokemon_Party::start_link() { for (int i = 0; i < 0x44E; i++) { - box_data_array[i] = gen2_fix[i]; - // box_data_array[i] = gen2_debug_box_data[i]; + box_data_array[i] = gen2_debug_box_data[i]; } } }