diff --git a/graphics/Label_Unknown.grit b/graphics/Label_Unknown.grit new file mode 100644 index 0000000..16fa305 --- /dev/null +++ b/graphics/Label_Unknown.grit @@ -0,0 +1,3 @@ +# +# label sprites : 4bpp, LZ77 compressed. Pallet 8, copy from 0 to 16. +-gB4 -ps0 -gzl -pe16 \ No newline at end of file diff --git a/graphics/Label_Unknown.png b/graphics/Label_Unknown.png new file mode 100644 index 0000000..c829efc Binary files /dev/null and b/graphics/Label_Unknown.png differ diff --git a/include/link_handler.h b/include/link_handler.h index 3158b48..78099b8 100644 --- a/include/link_handler.h +++ b/include/link_handler.h @@ -1,6 +1,3 @@ -// Loosely based on code created by StevenChaulk -// Source: https://github.com/stevenchaulk/arduino-poke-gen2 - #ifndef LINK_HANDLER_H_ #define LINK_HANDLER_H_ @@ -131,7 +128,8 @@ const u16 GameBoyROMChecksumTable[][4]{ enum CompositeState { NO_COMPOSITE_STATE, - INITIAL_CONNECTION + INITIAL_CONNECTION, + SEND_PAYLOAD, }; enum SubstateState @@ -149,7 +147,10 @@ enum SubstateState MAIL, WAIT_FOR_PAYLOAD, GET_CHECKSUM, + + // SEND_PAYLOAD END, + }; enum LinkConnectionError @@ -163,10 +164,12 @@ public: LinkConnection *globalPtr; CompositeState compState = NO_COMPOSITE_STATE; - SubstateState subState = NO_SUBSTATE; - CompositeState prevCompState = NO_COMPOSITE_STATE; + bool compStateChanged = false; + + SubstateState subState = NO_SUBSTATE; SubstateState prevSubState = NO_SUBSTATE; + bool subStateChanged = false; LinkConnectionError lastError = NO_ERROR; @@ -176,7 +179,7 @@ public: int compStateCounter = 0; // the counter for the total number of bytes sent compstate int subStateCounter = 0; // The counter for the total number of bytes sent in this substate - int gen = 0; // The generation we are trading with + int gen = 0; // The generation we are trading with GameBoyROM currROM = NO_GB_ROM; // The GameBoy ROM we're communicating with int FF_count = 0; // The number of 0xFF bytes that have been in a row diff --git a/include/sprite_data.h b/include/sprite_data.h index 2f0bbc6..e8aa312 100644 --- a/include/sprite_data.h +++ b/include/sprite_data.h @@ -5,6 +5,7 @@ #include "pokemon_party.h" #include "rom_data.h" #include "box_menu.h" +#include "link_handler.h" #define FENNEL_SHIFT 4 @@ -36,6 +37,7 @@ extern OBJ_ATTR *flag; #include "Label_Gold.h" #include "Label_Silver.h" #include "Label_Crystal.h" +#include "Label_Unknown.h" extern OBJ_ATTR *cart_label; #include "GB_Shell.h" #include "GBC_Shell.h" @@ -129,7 +131,7 @@ void load_type_sprites(const u8* pkmn_type_table, int pkmn_index, int dex_offset void add_menu_box(int options, int startTileX, int startTileY); void add_menu_box(int startTileX, int startTileY, int width, int height); void reload_textbox_background(); -void load_select_sprites(u8 game_id, u8 lang); +void load_select_sprites(GameBoyROM currROM); void fennel_blink(int frame); void fennel_speak(int frame); int get_curr_flex_background(); diff --git a/source/link_handler.cpp b/source/link_handler.cpp index 32c8c2d..00539bf 100644 --- a/source/link_handler.cpp +++ b/source/link_handler.cpp @@ -60,21 +60,6 @@ void LinkConnection::setup(const u16 *debug_charset) this->debug_charset = debug_charset; - { - u8 general_text_table_buffer[2048]; - u8 lineBuffer[1024]; // text_helper/main.py restricts the lines to 1024 bytes. - const u8 **chunkList; - u32 numChunks; - u32 chunkSize; - - get_text_table_chunks(GENERAL_INDEX, &chunkList, &numChunks, &chunkSize); - - FileContainerReader general_text_reader(chunkList, numChunks, chunkSize); - general_text_reader.init(general_text_table_buffer, sizeof(general_text_table_buffer)); - general_text_reader.readFile(GENERAL_connecting, lineBuffer); - ptgb_write_textbox(lineBuffer, true, false, GENERAL_INDEX, GENERAL_connecting, false); - } - if (g_debug_options.print_link_data == true) { create_textbox(0, 0, 138, 128, false); @@ -161,19 +146,23 @@ void LinkConnection::handleStateLogic() if (prevSubState != subState) { subStateCounter = 0; + subStateChanged = true; } else { subStateCounter++; + subStateChanged = false; } if (prevCompState != compState) { compStateCounter = 0; + compStateChanged = true; } else { compStateCounter++; + compStateChanged = false; } } @@ -307,8 +296,6 @@ void LinkConnection::logicState_initConnection() if (inData == 0xFD) { subState = GET_CHECKSUM; - g_debug_options.print_link_data = true; - paused = true; } outData = 0x00; break; diff --git a/source/script_array.cpp b/source/script_array.cpp index b05b368..c644e0f 100644 --- a/source/script_array.cpp +++ b/source/script_array.cpp @@ -13,6 +13,7 @@ #include "select_menu.h" #include "translated_text.h" #include "link_handler.h" +#include "text_tables.h" int last_error; Pokemon_Party party_data; @@ -164,7 +165,7 @@ const script_obj_params transfer_script_params[SCRIPT_SIZE] = { // PTGB_DIA_MG_OTHER_EVENT { .text_entry_index = PTGB_DIA_MG_OTHER_EVENT, - .next_if_true = PTGB_DIA_ASK_QUEST}, + .next_if_true = PTGB_DIA_LETS_START}, // PTGB_DIA_PKMN_TO_COLLECT { .text_entry_index = PTGB_DIA_PKMN_TO_COLLECT, @@ -256,7 +257,7 @@ const script_obj_params transfer_script_params[SCRIPT_SIZE] = { // E_SCRIPT_START { .conditional_index = CMD_SHOW_PROF, - .next_if_true = PTGB_DIA_ASK_QUEST}, + .next_if_true = PTGB_DIA_LETS_START}, // CMD_START_LINK { .conditional_index = CMD_START_LINK, @@ -390,7 +391,7 @@ const script_obj_params transfer_script_params[SCRIPT_SIZE] = { { .conditional_index = COND_PKMN_TO_COLLECT, .next_if_true = PTGB_DIA_PKMN_TO_COLLECT, - .next_if_false = PTGB_DIA_ASK_QUEST}, + .next_if_false = PTGB_DIA_LETS_START}, // COND_GB_ROM_EXISTS { .conditional_index = COND_GB_ROM_EXISTS, @@ -730,11 +731,72 @@ bool run_conditional(int index) } else { + + u8 general_text_table_buffer[2048]; + u8 lineBuffer[1024]; // text_helper/main.py restricts the lines to 1024 bytes. + const u8 **chunkList; + u32 numChunks; + u32 chunkSize; + + get_text_table_chunks(GENERAL_INDEX, &chunkList, &numChunks, &chunkSize); + + FileContainerReader general_text_reader(chunkList, numChunks, chunkSize); + general_text_reader.init(general_text_table_buffer, sizeof(general_text_table_buffer)); + + general_text_reader.readFile(GENERAL_connecting, lineBuffer); + ptgb_write_textbox(lineBuffer, true, false, GENERAL_INDEX, GENERAL_connecting, false); + + load_select_sprites(NO_GB_ROM); + obj_unhide(gba_cart, 0); + obj_set_pos(gba_cart, 17 * 8, 14 * 8); + + obj_unhide(cart_shell, 0); + obj_set_pos(cart_shell, (8 * 8), (11 * 8) + 11); + + obj_unhide(cart_label, 0); + obj_set_pos(cart_label, (8 * 8) + 8, (11 * 8) + 11 + 13); + u16 debug_charset[256]; load_localized_charset(debug_charset, 3, ENGLISH); globalLinkCable.setup(debug_charset); globalLinkCable.startConnection(INITIAL_CONNECTION); while (globalLinkCable.subState != END) + { + if (globalLinkCable.subStateChanged) + { + switch (globalLinkCable.subState) + { + case SAVE_SUCCESS: + general_text_reader.readFile(GENERAL_link_success, lineBuffer); + ptgb_write_textbox(lineBuffer, true, false, GENERAL_INDEX, GENERAL_link_success, false); + break; + case TRADE_PREAMBLE: + general_text_reader.readFile(GENERAL_transferring, lineBuffer); + ptgb_write_textbox(lineBuffer, true, false, GENERAL_INDEX, GENERAL_transferring, false); + break; + default: + break; + } + } + VBlankIntrWait(); + } + load_select_sprites(globalLinkCable.currROM); + + obj_unhide(gba_cart, 0); + obj_set_pos(gba_cart, 17 * 8, 14 * 8); + + obj_unhide(cart_shell, 0); + obj_set_pos(cart_shell, (8 * 8), (11 * 8) + 11); + + obj_unhide(cart_label, 0); + obj_set_pos(cart_label, (8 * 8) + 8, (11 * 8) + 11 + 13); + + obj_unhide(flag, 0); + obj_set_pos(flag, 1.5 * 8, 14 * 8); + + globalLinkCable.startConnection(INITIAL_CONNECTION); + + while (true) { VBlankIntrWait(); } diff --git a/source/select_menu.cpp b/source/select_menu.cpp index d4cad16..5e0d11f 100644 --- a/source/select_menu.cpp +++ b/source/select_menu.cpp @@ -119,12 +119,12 @@ void Select_Menu::on_selection_changed(unsigned new_index, unsigned x, unsigned switch (menu_type) { case CART_MENU: - load_select_sprites(item_value, lang); + //load_select_sprites(item_value, lang); obj_unhide(cart_shell, 0); obj_unhide(cart_label, 0); break; case LANG_MENU: - load_select_sprites(0, item_value); + //load_select_sprites(0, item_value); obj_unhide(flag, 0); break; } diff --git a/source/sprite_data.cpp b/source/sprite_data.cpp index 71ae024..92496b4 100644 --- a/source/sprite_data.cpp +++ b/source/sprite_data.cpp @@ -103,7 +103,7 @@ void set_background_pal(int curr_rom_id, bool dark, bool fade) ((((NUM_CYCLES - n) * INV_NUM_CYCLES) * old_pal[1]) + ((n * INV_NUM_CYCLES) * new_pal[1])) >> 16, ((((NUM_CYCLES - n) * INV_NUM_CYCLES) * old_pal[2]) + ((n * INV_NUM_CYCLES) * new_pal[2])) >> 16); } - //global_next_frame(); + // global_next_frame(); } } else @@ -132,7 +132,7 @@ void load_flex_background(int background_id, int layer) if (curr_flex_background != background_id) // Only load the background if it isn't already loaded { // This prevents screen tearing on this frame - //global_next_frame(); + // global_next_frame(); BG_FLEX = (BG_FLEX && !BG_PRIO_MASK) | BG_PRIO(3); switch (background_id) @@ -143,7 +143,7 @@ void load_flex_background(int background_id, int layer) // Load tiles into CBB 0 LZ77UnCompVram(openingBGTiles, &tile_mem[CBB][0]); // Give it a frame to uncompress the data - //global_next_frame(); + // global_next_frame(); // Load map into SBB 0 LZ77UnCompVram(openingBGMap, &se_mem[SBB][0]); REG_BG1VOFS = 96; @@ -154,7 +154,7 @@ void load_flex_background(int background_id, int layer) // Load tiles into CBB 0 LZ77UnCompVram(fennelBGTiles, &tile_mem[CBB][0]); // Give it a frame to uncompress the data - //global_next_frame(); + // global_next_frame(); // Load map into SBB 0 LZ77UnCompVram(fennelBGMap, &se_mem[SBB][0]); REG_BG1VOFS = FENNEL_SHIFT; @@ -165,7 +165,7 @@ void load_flex_background(int background_id, int layer) // Load tiles into CBB 0 LZ77UnCompVram(dexBGTiles, &tile_mem[CBB][0]); // Give it a frame to uncompress the data - //global_next_frame(); + // global_next_frame(); // Load map into SBB 0 LZ77UnCompVram(dexBGMap, &se_mem[SBB][0]); REG_BG1VOFS = 0; @@ -176,7 +176,7 @@ void load_flex_background(int background_id, int layer) // Load tiles into CBB 0 LZ77UnCompVram(menu_barsTiles, &tile_mem[CBB][0]); // Give it a frame to uncompress the data - //global_next_frame(); + // global_next_frame(); // Load map into SBB 0 LZ77UnCompVram(menu_barsMap, &se_mem[SBB][0]); REG_BG1VOFS = 0; @@ -187,7 +187,7 @@ void load_flex_background(int background_id, int layer) // Load tiles into CBB 0 LZ77UnCompVram(boxBGTiles, &tile_mem[CBB][0]); // Give it a frame to uncompress the data - //global_next_frame(); + // global_next_frame(); // Load map into SBB 0 LZ77UnCompVram(boxBGMap, &se_mem[SBB][0]); REG_BG1VOFS = 0; @@ -580,7 +580,7 @@ void load_sprite_compressed(OBJ_ATTR *sprite, const unsigned int objTiles[], obj_hide(sprite); }; -void load_select_sprites(u8 game_id, u8 lang) +void load_select_sprites(GameBoyROM currROM) { u32 curr_tile_id = global_tile_id_end; // Alpha Shadow Main Color Grey Black Mid @@ -598,103 +598,144 @@ void load_select_sprites(u8 game_id, u8 lang) const unsigned short *label_palette = 0; const unsigned int *cart_tiles = 0; const unsigned short *cart_palette = 0; - switch (game_id) + + switch (currROM) { - case (GREEN_ID): + case GREEN_JP_v0: + case GREEN_JP_v1: label_tiles = Label_GreenTiles; label_palette = Label_GreenPal; cart_tiles = GB_ShellTiles; cart_palette = jpn_gb_pal; break; - case (RED_ID): + case RED_JP_v0: + case RED_JP_v1: label_tiles = Label_RedTiles; label_palette = Label_RedPal; cart_tiles = GB_ShellTiles; - if (lang == JPN_ID) - { - cart_palette = jpn_gb_pal; - } - else - { - cart_palette = eng_red_pal; - } + cart_palette = jpn_gb_pal; + break; + case RED_EN: + case RED_FR: + case RED_IT: + case RED_DE: + case RED_SP: + label_tiles = Label_RedTiles; + label_palette = Label_RedPal; + cart_tiles = GB_ShellTiles; + cart_palette = eng_red_pal; break; - case (BLUE_ID): + case BLUE_JP: label_tiles = Label_BlueTiles; label_palette = Label_BluePal; cart_tiles = GB_ShellTiles; - if (lang == JPN_ID) - { - cart_palette = jpn_gb_pal; - } - else - { - cart_palette = eng_blue_pal; - } + cart_palette = jpn_gb_pal; break; - case (YELLOW_ID): + case BLUE_EN: + case BLUE_FR: + case BLUE_IT: + case BLUE_DE: + case BLUE_SP: + label_tiles = Label_BlueTiles; + label_palette = Label_BluePal; + cart_tiles = GB_ShellTiles; + cart_palette = eng_blue_pal; + break; + + case YELLOW_JP_v0: + case YELLOW_JP_v1: + case YELLOW_JP_v2: + case YELLOW_JP_v3: label_tiles = Label_YellowTiles; label_palette = Label_YellowPal; cart_tiles = GB_ShellTiles; - if (lang == JPN_ID) - { - cart_palette = jpn_gb_pal; - } - else - { - cart_palette = eng_yellow_pal; - } + cart_palette = jpn_gb_pal; break; - case (GOLD_ID): + case YELLOW_EN: + case YELLOW_FR: + case YELLOW_IT: + case YELLOW_DE: + case YELLOW_SP: + label_tiles = Label_YellowTiles; + label_palette = Label_YellowPal; + cart_tiles = GB_ShellTiles; + cart_palette = eng_yellow_pal; + break; + + case GOLD_JP_v0: + case GOLD_JP_v1: label_tiles = Label_GoldTiles; label_palette = Label_GoldPal; - if (lang == JPN_ID) - { - cart_tiles = GB_ShellTiles; - cart_palette = jpn_gold_pal; - } - else if (lang == KOR_ID) - { - cart_tiles = GBC_ShellTiles; - cart_palette = jpn_gold_pal; - } - else - { - cart_tiles = GBS_ShellTiles; - cart_palette = eng_gold_pal; - } + cart_tiles = GB_ShellTiles; + cart_palette = jpn_gold_pal; break; - case (SILVER_ID): + case GOLD_EN: + case GOLD_FR: + case GOLD_IT: + case GOLD_DE: + case GOLD_SP: + label_tiles = Label_GoldTiles; + label_palette = Label_GoldPal; + cart_tiles = GBS_ShellTiles; + cart_palette = eng_gold_pal; + break; + + case GOLD_KOR: + label_tiles = Label_GoldTiles; + label_palette = Label_GoldPal; + cart_tiles = GBC_ShellTiles; + cart_palette = jpn_gold_pal; + break; + + case SILVER_JP_v0: + case SILVER_JP_v1: label_tiles = Label_SilverTiles; label_palette = Label_SilverPal; - if (lang == JPN_ID) - { - cart_tiles = GB_ShellTiles; - cart_palette = jpn_silver_pal; - } - else if (lang == KOR_ID) - { - cart_tiles = GBC_ShellTiles; - cart_palette = jpn_silver_pal; - } - else - { - cart_tiles = GBS_ShellTiles; - cart_palette = eng_silver_pal; - } + cart_tiles = GB_ShellTiles; + cart_palette = jpn_silver_pal; break; - case (CRYSTAL_ID): + case SILVER_EN: + case SILVER_FR: + case SILVER_IT: + case SILVER_DE: + case SILVER_SP: + label_tiles = Label_SilverTiles; + label_palette = Label_SilverPal; + cart_tiles = GBS_ShellTiles; + cart_palette = eng_silver_pal; + break; + + case SILVER_KOR: + label_tiles = Label_SilverTiles; + label_palette = Label_SilverPal; + cart_tiles = GBC_ShellTiles; + cart_palette = jpn_silver_pal; + break; + + case CRYSTAL_JP: + case CRYSTAL_EN: + case CRYSTAL_FR: + case CRYSTAL_IT: + case CRYSTAL_DE: + case CRYSTAL_SP: label_tiles = Label_CrystalTiles; label_palette = Label_CrystalPal; cart_tiles = GBCS_ShellTiles; cart_palette = crystal_pal; break; + + default: + label_tiles = Label_UnknownTiles; + label_palette = Label_UnknownPal; + cart_tiles = GB_ShellTiles; + cart_palette = jpn_gb_pal; + break; } tonccpy(pal_obj_mem + (GB_CART_PAL * 16), cart_palette, 12); @@ -704,36 +745,86 @@ void load_select_sprites(u8 game_id, u8 lang) const unsigned int *flag_tiles = 0; const unsigned short *flag_palette = 0; - switch (lang) + switch (currROM) { - case JPN_ID: + case RED_JP_v0: + case RED_JP_v1: + case GREEN_JP_v0: + case GREEN_JP_v1: + case BLUE_JP: + case YELLOW_JP_v0: + case YELLOW_JP_v1: + case YELLOW_JP_v2: + case YELLOW_JP_v3: + case GOLD_JP_v0: + case GOLD_JP_v1: + case SILVER_JP_v0: + case SILVER_JP_v1: + case CRYSTAL_JP: flag_tiles = flag_jpnTiles; flag_palette = flag_jpnPal; break; - case ENG_ID: + + case RED_EN: + case BLUE_EN: + case YELLOW_EN: + case GOLD_EN: + case SILVER_EN: + case CRYSTAL_EN: flag_tiles = flag_engTiles; flag_palette = flag_engPal; break; - case FRE_ID: + + case RED_FR: + case BLUE_FR: + case YELLOW_FR: + case GOLD_FR: + case SILVER_FR: + case CRYSTAL_FR: flag_tiles = flag_freTiles; flag_palette = flag_frePal; break; - case ITA_ID: + + case RED_IT: + case BLUE_IT: + case YELLOW_IT: + case GOLD_IT: + case SILVER_IT: + case CRYSTAL_IT: flag_tiles = flag_itaTiles; flag_palette = flag_itaPal; break; - case GER_ID: + + case RED_DE: + case BLUE_DE: + case YELLOW_DE: + case GOLD_DE: + case SILVER_DE: + case CRYSTAL_DE: flag_tiles = flag_gerTiles; flag_palette = flag_gerPal; break; - case SPA_ID: + + case RED_SP: + case BLUE_SP: + case YELLOW_SP: + case GOLD_SP: + case SILVER_SP: + case CRYSTAL_SP: flag_tiles = flag_spaTiles; flag_palette = flag_spaPal; break; - case KOR_ID: + + case GOLD_KOR: + case SILVER_KOR: flag_tiles = flag_korTiles; flag_palette = flag_korPal; break; + + default: + flag_tiles = flag_korTiles; + flag_palette = flag_jpnPal; + break; } load_sprite_compressed(flag, flag_tiles, curr_tile_id, FLAG_PAL, ATTR0_WIDE, ATTR1_SIZE_32x64, 1); @@ -906,7 +997,7 @@ void update_front_box_sprite(Pokemon *curr_pkmn, bool make_greyscale) LZ77UnCompWram((const unsigned short *)palette_location, buffer); // This is a little silly, but it's being weird with bytes vs shorts when we copy it directly - if(make_greyscale) + if (make_greyscale) { for (int i = 0; i < 16; i++) { diff --git a/tools/text_helper/text.xlsx b/tools/text_helper/text.xlsx index 3d0ca48..a4de6ac 100644 Binary files a/tools/text_helper/text.xlsx and b/tools/text_helper/text.xlsx differ