diff --git a/PCCS b/PCCS index c59d238..d301896 160000 --- a/PCCS +++ b/PCCS @@ -1 +1 @@ -Subproject commit c59d238f1b4dac5221498077bb0a228d21a4c0ff +Subproject commit d301896b51d34a73b377ae9b3c370ed4fdb0cc93 diff --git a/source/main.cpp b/source/main.cpp index eba8c1d..964ad7d 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -157,7 +157,7 @@ void __attribute__((noinline)) game_load_error(void) delay_counter++; VBlankIntrWait(); } -} +}; // avoid inlining to avoid permanently storing the credits_decompression_buffer in IWRAM int __attribute__((noinline)) credits() @@ -206,22 +206,29 @@ int __attribute__((noinline)) credits() } }; -int tutorial() +// avoid inlining to avoid permanently storing the tutorial_decompression_buffer in IWRAM +int __attribute__((noinline)) tutorial() { - u8 text_decompression_buffer[2048]; - text_data_table tutorial_text_table(text_decompression_buffer); - int curr_tutorial_num = 0; - tutorial_text_table.decompress(get_compressed_text_table(TUTORIAL_INDEX)); + u8 tutorial_decompression_buffer[2048]; + u8 lineBuffer[1024]; + const u8 **chunkList; + u32 numChunks; + u32 chunkSize; + + get_text_table_chunks(TUTORIAL_INDEX, &chunkList, &numChunks, &chunkSize); + FileContainerReader tutorialReader(chunkList, numChunks, chunkSize); + u32 curr_tutorial_num = 0; + + tutorialReader.init(tutorial_decompression_buffer, sizeof(tutorial_decompression_buffer)); bool update = true; - global_next_frame(); while (true) { if (update) { - ptgb_write_textbox(tutorial_text_table.get_text_entry(curr_tutorial_num), true, false, - TUTORIAL_INDEX, curr_tutorial_num, false); + tutorialReader.readFile(curr_tutorial_num, lineBuffer); + ptgb_write_textbox(lineBuffer, true, false, TUTORIAL_INDEX, curr_tutorial_num, false); update = false; } @@ -237,7 +244,7 @@ int tutorial() curr_tutorial_num--; update = true; } - if (key_hit(KEY_RIGHT) && curr_tutorial_num < (tutorial_text_table.get_number_of_text_entries() - 1)) + if (key_hit(KEY_RIGHT) && curr_tutorial_num < (tutorialReader.getNumberOfFiles() - 1)) { curr_tutorial_num++; update = true; @@ -247,47 +254,6 @@ int tutorial() } }; -int tutorial() -{ - u8 text_decompression_buffer[2048]; - text_data_table tutorial_text_table(text_decompression_buffer); - int curr_tutorial_num = 0; - - tutorial_text_table.decompress(get_compressed_text_table(TUTORIAL_INDEX)); - bool update = true; - - global_next_frame(); - while (true) - { - if (update) - { - ptgb_write_textbox(tutorial_text_table.get_text_entry(curr_tutorial_num), true, false, - TUTORIAL_INDEX, curr_tutorial_num, false); - update = false; - } - - if (key_hit(KEY_B)) - { - tte_erase_rect(0, 0, H_MAX, V_MAX); - hide_textbox(); - erase_textbox_tiles(); - return 0; - } - if (key_hit(KEY_LEFT) && curr_tutorial_num > 0) - { - curr_tutorial_num--; - update = true; - } - if (key_hit(KEY_RIGHT) && curr_tutorial_num < (tutorial_text_table.get_number_of_text_entries() - 1)) - { - curr_tutorial_num++; - update = true; - } - - global_next_frame(); - } -}; - // attribute noinline is used to avoid permanently storing the general_text_table_buffer in IWRAM int __attribute__((noinline)) main_menu_loop() { diff --git a/source/mystery_gift_builder.cpp b/source/mystery_gift_builder.cpp index 90acf69..2986184 100644 --- a/source/mystery_gift_builder.cpp +++ b/source/mystery_gift_builder.cpp @@ -391,63 +391,64 @@ void mystery_gift_script::build_script(PokeBox *box) switch (curr_GBA_rom.gamecode) { case RUBY_ID: - textGreet.set_text(decompressed_text_table.get_text_entry(RSEFRLG_dia_textGreet_rse)); - textMoveBox.set_text(decompressed_text_table.get_text_entry(RSEFRLG_dia_textMoveBox_rs)); - textWeHere.set_text(decompressed_text_table.get_text_entry(RSEFRLG_dia_textWeHere_rs)); - textReceived.set_text(decompressed_text_table.get_text_entry(RSEFRLG_dia_textRecieved_rs)); - textIAm.set_text(decompressed_text_table.get_text_entry(first_time ? RSEFRLG_dia_textIAm_first_rs : RSEFRLG_dia_textIAm_second_rs)); - textPCConvo.set_text(decompressed_text_table.get_text_entry(RSEFRLG_dia_textPCConvo_rs)); // ȼDon’t worry ƲÀ,Ňyou won’t have to do a thing!"); - textPCThanks.set_text(decompressed_text_table.get_text_entry(RSEFRLG_dia_textPCThanks_rs)); - textThank.set_text(decompressed_text_table.get_text_entry(RSEFRLG_dia_textThank_rs)); - textPCFull.set_text(decompressed_text_table.get_text_entry(RSEFRLG_dia_textPCFull_rs)); - textLookerFull.set_text(decompressed_text_table.get_text_entry(RSEFRLG_dia_textLookerFull_rs)); + textGreet.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textGreet_rse)); + textMoveBox.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textMoveBox_rs)); + textWeHere.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textWeHere_rs)); + textReceived.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textRecieved_rs)); + textIAm.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(first_time ? RSEFRLG_dia_textIAm_first_rs : RSEFRLG_dia_textIAm_second_rs)); + textPCConvo.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textPCConvo_rs)); // ȼDon’t worry ƲÀ,Ňyou won’t have to do a thing!"); + textPCThanks.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textPCThanks_rs)); + textThank.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textThank_rs)); + textPCFull.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textPCFull_rs)); + textLookerFull.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textLookerFull_rs)); break; case SAPPHIRE_ID: textGreet.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textGreet_rse)); textMoveBox.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textMoveBox_rs)); textWeHere.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textWeHere_rs)); - textReceived.set_text(decompressed_text_table.get_text_entry(RSEFRLG_dia_textRecieved_rs)); - textIAm.set_text(decompressed_text_table.get_text_entry(first_time ? RSEFRLG_dia_textIAm_first_rs : RSEFRLG_dia_textIAm_second_rs)); - textPCConvo.set_text(decompressed_text_table.get_text_entry(RSEFRLG_dia_textPCConvo_rs)); // ȼDon’t worry ƲÀ,Ňyou won’t have to do a thing!"); - textPCThanks.set_text(decompressed_text_table.get_text_entry(RSEFRLG_dia_textPCThanks_rs)); - textThank.set_text(decompressed_text_table.get_text_entry(RSEFRLG_dia_textThank_rs)); - textPCFull.set_text(decompressed_text_table.get_text_entry(RSEFRLG_dia_textPCFull_rs)); - textLookerFull.set_text(decompressed_text_table.get_text_entry(RSEFRLG_dia_textLookerFull_rr)); + textReceived.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textRecieved_rs)); + textIAm.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(first_time ? RSEFRLG_dia_textIAm_first_rs : RSEFRLG_dia_textIAm_second_rs)); + textPCConvo.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textPCConvo_rs)); // ȼDon’t worry ƲÀ,Ňyou won’t have to do a thing!"); + textPCThanks.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textPCThanks_rs)); + textThank.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textThank_rs)); + textPCFull.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textPCFull_rs)); + textLookerFull.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textLookerFull_rs)); break; case FIRERED_ID: case LEAFGREEN_ID: textGreet.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textGreet_frlg)); textMoveBox.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textMoveBox_frlg)); textWeHere.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textWeHere_frlg)); - textReceived.set_text(decompressed_text_table.get_text_entry(RSEFRLG_dia_textRecieved_frlge)); - textIAm.set_text(decompressed_text_table.get_text_entry(first_time ? RSEFRLG_dia_textIAm_first_frlge : RSEFRLG_dia_textIAm_second_frlge)); - textPCConvo.set_text(decompressed_text_table.get_text_entry(RSEFRLG_dia_textPCConvo_frlge)); // ȼDon’t worry ƲÀ,Ňyou won’t have to do a thing!"); - textPCThanks.set_text(decompressed_text_table.get_text_entry(RSEFRLG_dia_textPCThanks_frlge)); - textThank.set_text(decompressed_text_table.get_text_entry(RSEFRLG_dia_textThank_frlge)); - textPCFull.set_text(decompressed_text_table.get_text_entry(RSEFRLG_dia_textPCFull_frlge)); - textLookerFull.set_text(decompressed_text_table.get_text_entry(RSEFRLG_dia_textLookerFull_frlge)); + textReceived.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textRecieved_frlge)); + textIAm.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(first_time ? RSEFRLG_dia_textIAm_first_frlge : RSEFRLG_dia_textIAm_second_frlge)); + textPCConvo.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textPCConvo_frlge)); // ȼDon’t worry ƲÀ,Ňyou won’t have to do a thing!"); + textPCThanks.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textPCThanks_frlge)); + textThank.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textThank_frlge)); + textPCFull.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textPCFull_frlge)); + textLookerFull.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textLookerFull_frlge)); break; case EMERALD_ID: textGreet.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textGreet_rse)); textMoveBox.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textMoveBox_e)); textWeHere.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textWeHere_e)); - textReceived.set_text(decompressed_text_table.get_text_entry(RSEFRLG_dia_textRecieved_frlge)); - textIAm.set_text(decompressed_text_table.get_text_entry(first_time ? RSEFRLG_dia_textIAm_first_frlge : RSEFRLG_dia_textIAm_second_frlge)); - textPCConvo.set_text(decompressed_text_table.get_text_entry(RSEFRLG_dia_textPCConvo_frlge)); // ȼDon’t worry ƲÀ,Ňyou won’t have to do a thing!"); - textPCThanks.set_text(decompressed_text_table.get_text_entry(RSEFRLG_dia_textPCThanks_frlge)); - textThank.set_text(decompressed_text_table.get_text_entry(RSEFRLG_dia_textThank_frlge)); - textPCFull.set_text(decompressed_text_table.get_text_entry(RSEFRLG_dia_textPCFull_frlge)); - textLookerFull.set_text(decompressed_text_table.get_text_entry(RSEFRLG_dia_textLookerFull_frlge)); + textReceived.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textRecieved_frlge)); + textIAm.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(first_time ? RSEFRLG_dia_textIAm_first_frlge : RSEFRLG_dia_textIAm_second_frlge)); + textPCConvo.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textPCConvo_frlge)); // ȼDon’t worry ƲÀ,Ňyou won’t have to do a thing!"); + textPCThanks.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textPCThanks_frlge)); + textThank.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textThank_frlge)); + textPCFull.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textPCFull_frlge)); + textLookerFull.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textLookerFull_frlge)); break; } - textReceived.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textRecieved)); + // Split these between rs and frlge + textReceived.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textRecieved_frlge)); textYouMustBe.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(first_time ? RSEFRLG_dia_textYouMustBe_first : RSEFRLG_dia_textYouMustBe_second)); - textIAm.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(first_time ? RSEFRLG_dia_textIAm_first : RSEFRLG_dia_textIAm_second)); - textPCConvo.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textPCConvo)); // ȼDon’t worry ƲÀ,Ňyou won’t have to do a thing!"); - textPCThanks.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textPCThanks)); - textThank.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textThank)); - textPCFull.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textPCFull)); - textLookerFull.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textLookerFull)); + textIAm.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(first_time ? RSEFRLG_dia_textIAm_first_frlge : RSEFRLG_dia_textIAm_second_frlge)); + textPCConvo.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textPCConvo_frlge)); // ȼDon’t worry ƲÀ,Ňyou won’t have to do a thing!"); + textPCThanks.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textPCThanks_frlge)); + textThank.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textThank_frlge)); + textPCFull.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textPCFull_frlge)); + textLookerFull.set_text(rsefrlgTableReader.getPointerToFileInDecompressionBuffer(RSEFRLG_dia_textLookerFull_frlge)); textThank.insert_text(decompressed_store.text.gen3_charset, save_section_30); textPCFull.insert_text(decompressed_store.text.gen3_charset, save_section_30); diff --git a/source/sprite_data.cpp b/source/sprite_data.cpp index 945a765..54b947c 100644 --- a/source/sprite_data.cpp +++ b/source/sprite_data.cpp @@ -193,7 +193,7 @@ void load_flex_background(int background_id, int layer) REG_BG1VOFS = flex->voffset; } - BG_FLEX = BG_CBB(CBB) | BG_SBB(SBB) | BG_4BPP | BG_REG_32x32 | BG_PRIO(layer); + BG_FLEX = BG_CBB(TILESET_PTGB) | BG_SBB(TILEMAP_FLEXBG) | BG_4BPP | BG_REG_32x32 | BG_PRIO(layer); curr_flex_background = background_id; } #include "textBoxBG.h" diff --git a/source/text_engine.cpp b/source/text_engine.cpp index 02f7d00..f895ea5 100644 --- a/source/text_engine.cpp +++ b/source/text_engine.cpp @@ -497,8 +497,8 @@ void scroll_text(bool instant, TTC *tc, bool scrollUp, int left, int top, int ri { // Due to the order of tonccpy, we need to store the data in a temporary buffer byte buffer[20 * 32]; - tonccpy(&buffer, &tile_mem[TEXT_CBB][0 + (i * 20)], 20 * 32); - tonccpy(&tile_mem[TEXT_CBB][2 + (i * 20)], &buffer, 20 * 32); + tonccpy(&buffer, &tile_mem[TILESET_TEXT][0 + (i * 20)], 20 * 32); + tonccpy(&tile_mem[TILESET_TEXT][2 + (i * 20)], &buffer, 20 * 32); } } // Remove text that went outside of the box and set the position diff --git a/tools/text_helper/main.py b/tools/text_helper/main.py index 807a7c0..a320519 100644 --- a/tools/text_helper/main.py +++ b/tools/text_helper/main.py @@ -875,6 +875,18 @@ def write_text_file_container(filename, dictionary, lang, section, context=None) defLine = "@chunkSize=" + str(get_file_container_chunk_size(section)) + "\n" defFile.write(defLine.encode("utf-8")) + for key, line in dictionary.items(): + with open(buildpath + str(key), 'wb') as lineFile: + dictionary[key] = convert_item(line, lang, context) + linedata = bytes.fromhex(dictionary[key]['bytes']) + lineFile.write(linedata) + lineFile.close() + + defLine = buildpath + str(key) + "\n" + defFile.write(defLine.encode("utf-8")) + defFile.close() + + def write_text_bin_file(filename, dictionary, lang, section, context=None): MAX_BIN_SIZES = { "PTGB": 6144, @@ -902,16 +914,24 @@ def write_text_bin_file(filename, dictionary, lang, section, context=None): # Append every line's binary data to bindata # keep an index of the binary offset within bindata at which each line starts for key, line in dictionary.items(): - with open(buildpath + str(key), 'wb') as lineFile: - dictionary[key] = convert_item(line, lang, context) - linedata = bytes.fromhex(dictionary[key]['bytes']) - lineFile.write(linedata) - lineFile.close() - - defLine = buildpath + str(key) + "\n" - defFile.write(defLine.encode("utf-8")) - defFile.close() - + dictionary[key] = convert_item(line, lang, context) + # store the offset of the line in the index as a 16 bit little endian value + index[num * 2] = (current_offset & 0xFF) + index[num * 2 + 1] = (current_offset >> 8) & 0xFF + linedata = bytes.fromhex(dictionary[key]['bytes']) + + bindata.extend(linedata) + current_offset += len(linedata) + + num += 1 + + # Write the index and bindata to the file + binFile.write(index) + binFile.write(bindata) + binFile.seek(0, os.SEEK_END) + if binFile.tell() > MAX_BIN_SIZES[section]: + log_warning_error(lang, "Error", f'Section {section} exceeds the max binary file size by {binFile.tell() - MAX_BIN_SIZES[section]} bytes!', context=context) + binFile.close() def write_enum_to_header_file(hFile, prefix, dictionary): num = 0 diff --git a/tools/text_helper/text.xlsx b/tools/text_helper/text.xlsx index a4de6ac..6730c5a 100644 Binary files a/tools/text_helper/text.xlsx and b/tools/text_helper/text.xlsx differ