Updating text engine backend

This commit is contained in:
GearsProgress 2026-03-18 22:55:38 -04:00
parent 1f29379810
commit a7ebcd06fe
13 changed files with 117 additions and 180 deletions

View File

@ -6,10 +6,6 @@
#define H_MAX 240
#define V_MAX 160
#define LEFT 8
#define RIGHT (H_MAX - LEFT)
#define TOP 120
#define BOTTOM V_MAX
#define INK_WHITE 15
#define INK_ROM_COLOR 14
@ -23,11 +19,11 @@ void init_text_engine();
int text_loop(int script);
int text_next_obj_id(script_obj current_line);
void set_text_exit();
int ptgb_write_textbox(const byte *text, bool instant, int text_section, int text_key, bool eraseMainBox);
int ptgb_write_textbox(const byte *text, bool instant, bool waitForUser, int text_section, int text_key, bool eraseMainBox);
int ptgb_write_simple(const byte *text, bool instant);
int ptgb_write(const byte *text, bool instant, int length);
int ptgb_write(const byte *text, bool instant, int length, int box_type);
int ptgb_write_debug(const u16* charset, const char *text, bool instant);
void wait_for_user_to_continue(bool clear_text);
void scroll_text(bool instant, TTC *tc);
void wait_for_user_to_continue();
void scroll_text(bool instant, TTC *tc, int left, int top, int right, int bottom);
#endif

View File

@ -20,7 +20,8 @@ void background_frame(int global_frame_count)
}
void create_textbox(int startTileX, int startTileY, int text_space_width, int text_space_height, bool eraseMainBox)
{ // Empty function for compiling
{
// Blank for compiling for now
}
// This could honestly be an object... might want to do that in the future, depending on how complex using this gets
@ -38,16 +39,17 @@ void create_textbox_new(int text_section, int text_key, bool eraseMainBox)
add_menu_box(startTileX, startTileY, text_space_width + 16, text_space_height + 16);
tte_set_pos((startTileX + 1) * 8, (startTileY + 1) * 8);
tte_set_margins((startTileX + 1) * 8, (startTileY + 1) * 8,
(startTileX + text_space_width) * 8, (startTileY + text_space_height) * 8);
((startTileX + 1) * 8) + text_space_width, ((startTileY + 1) * 8) + text_space_height);
tte_erase_rect(0, 0, H_MAX, V_MAX);
show_textbox();
}
void reset_textbox()
{
tte_erase_rect(0, 0, H_MAX, V_MAX);
//tte_erase_rect(0, 0, H_MAX, V_MAX);
reload_textbox_background();
tte_set_pos(LEFT, TOP);
tte_set_margins(LEFT, TOP, RIGHT, BOTTOM);
//tte_set_pos(, TOP);
//tte_set_margins(LEFT, TOP, RIGHT, BOTTOM);
}
void show_textbox()

View File

@ -30,7 +30,6 @@ void Button_Menu::set_xy_min_max(int nX_min, int nX_max, int nY_min, int nY_max)
int Button_Menu::button_main()
{
tte_set_pos(0, 0);
organize_buttons();
show_buttons();
button_vector.at(curr_position).set_highlight(true);

View File

@ -30,7 +30,7 @@ void show_debug_menu()
const vertical_menu_settings menu_settings = {
.x = 20,
.y = 0,
.width = 200,
.width = 208,
.height = 155,
.margin_top = 8,
.margin_bottom = 8,

View File

@ -106,7 +106,7 @@ void print_mem_section()
out[0] = get_char_from_charset(charset, mem_name);
out[1] = get_char_from_charset(charset, '-');
out[2] = get_char_from_charset(charset, mem_id + 0xA1); // Kinda a dumb way to
tte_set_pos(0, 0);
//tte_set_pos(0, 0);
ptgb_write_simple(out, true);
*/
}
@ -153,7 +153,7 @@ bool read_flag(u16 flag_id)
{
if (false)
{
tte_set_pos(0, 0);
//tte_set_pos(0, 0);
tte_write("#{cx:0xD000}Attempting to read byte ");
tte_write(ptgb::to_string((curr_GBA_rom.offset_flags + (flag_id / 8)) % 0xF80));
tte_write(" of memory section ");

View File

@ -122,8 +122,7 @@ void print(const char *format, ...)
npf_vsnprintf(spi_text_out_array[0], SPI_TEXT_OUT_ARRAY_ELEMENT_SIZE, format, args);
va_end(args);
tte_erase_rect(LEFT, TOP, RIGHT, BOTTOM);
tte_set_pos(LEFT, 0);
tte_erase_rect(0, 0, H_MAX, V_MAX);
for (int j = 0; j < 10; j++)
{
ptgb_write_simple(reinterpret_cast<const byte *>("#{cx:0xE000}"), true);
@ -162,15 +161,13 @@ void setup(const u16 *debug_charset)
failed_packet = false;
init_packet = true;
end_of_data = false;
create_textbox(5, 1, 128, 60, true);
{
u8 general_text_table_buffer[2048];
text_data_table general_text(general_text_table_buffer);
general_text.decompress(get_compressed_text_table(GENERAL_INDEX));
ptgb_write_simple(general_text.get_text_entry(GENERAL_connecting), true);
ptgb_write_textbox(general_text.get_text_entry(GENERAL_connecting), true, true,
GENERAL_INDEX, GENERAL_connecting, true);
}
}
@ -222,8 +219,6 @@ byte handleIncomingByte(byte in, byte *box_data_storage, byte *curr_payload, GB_
{
if (in == 0x60 || in == 0x61)
{
tte_erase_rect(0, 0, H_MAX, V_MAX);
tte_set_pos(40, 24);
{
u8 general_text_table_buffer[2048];
text_data_table general_text(general_text_table_buffer);
@ -274,8 +269,6 @@ byte handleIncomingByte(byte in, byte *box_data_storage, byte *curr_payload, GB_
{
if (in == 0xfd)
{
tte_erase_rect(0, 0, H_MAX, V_MAX);
tte_set_pos(40, 24);
{
u8 general_text_table_buffer[2048];
text_data_table general_text(general_text_table_buffer);
@ -385,11 +378,8 @@ int loop(byte *box_data_storage, byte *curr_payload, GB_ROM *curr_gb_rom, PokeBo
if (g_debug_options.print_link_data && !key_held(KEY_DOWN))
{
// tte_set_margins(0, 0, H_MAX, V_MAX);
// print("%d: [%d][%d][%" PRIu8 "][%" PRIu8 "]\n\n", counter, data_counter, state, in_data, out_data);
for (int i = 0; i < NUM_LINES; i++)
{
// ptgb_write_debug(debug_charset, "\n", true);
for (int j = 0; j < LINE_WIDTH; j++)
{
stuff[i][j] = stuff[i + 1][j];
@ -407,7 +397,7 @@ int loop(byte *box_data_storage, byte *curr_payload, GB_ROM *curr_gb_rom, PokeBo
n2hexstr(&stuff[NUM_LINES - 1][18], out_data & 0xFF, 2);
stuff[NUM_LINES - 1][20] = '\0';
create_textbox(0, 0, 125, 80, false);
// create_textbox(0, 0, 125, 80, false);
ptgb_write_debug(debug_charset, *stuff, true);
}
else if (g_debug_options.write_cable_data_to_save)
@ -616,7 +606,7 @@ byte exchange_boxes(byte curr_in, byte *box_data_storage, GB_ROM *curr_gb_rom, c
n2hexstr(&outArr[currRow][14], init_packet, 2);
outArr[currRow][16] = ' ';
create_textbox(0, 0, 125, 110, false);
//create_textbox(0, 0, 125, 110, false);
link_animation_state(0);
ptgb_write_debug(debug_charset, *outArr, true);

View File

@ -28,7 +28,7 @@ static void __attribute__((noinline)) show_pulled_cart_error()
text_data_table general_text(general_text_table_buffer);
general_text.decompress(get_compressed_text_table(GENERAL_INDEX));
ptgb_write_textbox(general_text.get_text_entry(GENERAL_pulled_cart_error), true,
ptgb_write_textbox(general_text.get_text_entry(GENERAL_pulled_cart_error), true, true,
GENERAL_INDEX, GENERAL_pulled_cart_error, true);
}
@ -36,8 +36,6 @@ void global_next_frame()
{
key_poll();
rand_next_frame();
// tte_set_pos(0, 0);
// tte_write(ptgb::to_string(get_rand_u32()));
background_frame(global_frame_count);
determine_fennel_blink();
if (missingno_enabled)
@ -53,7 +51,6 @@ void global_next_frame()
{
BG_BACKDROP = (BG_BACKDROP & ~BG_PRIO_MASK) | BG_PRIO(2);
BG_TEXTBOX = (BG_TEXTBOX & ~BG_PRIO_MASK) | BG_PRIO(1);
tte_set_pos(40, 24);
obj_hide_multi(ptgb_logo_l, num_sprites);
show_pulled_cart_error();

View File

@ -58,8 +58,7 @@ Button_Menu yes_no_menu(1, 2, 40, 24, false);
void load_graphics()
{
tte_erase_rect(0, 0, H_MAX, V_MAX);
// Load opening background first so it hides everything else
// Load opening background first so it hides everything else
load_flex_background(FLEXBG_OPENING, 1);
load_background();
load_textbox_background();
@ -84,7 +83,7 @@ void initialization_script(void)
irq_init(NULL);
irq_enable(II_VBLANK);
// This currently crashes when you try to transfer a Pokemon:
//sound_init();
// sound_init();
// Graphics init
oam_init(obj_buffer, 128);
@ -97,7 +96,6 @@ void initialization_script(void)
rand_set_seed(0x1216);
// Clean up the main screen quick
tte_erase_rect(0, 0, 240, 160);
VBlankIntrWait();
REG_DISPCNT &= ~DCNT_BLANK;
@ -107,14 +105,13 @@ void game_load_error(void)
{
BG_TEXTBOX = (BG_TEXTBOX & ~BG_PRIO_MASK) | BG_PRIO(1);
create_textbox(4, 1, 152, 100, true);
{
u8 general_text_table_buffer[2048];
text_data_table general_text(general_text_table_buffer);
general_text.decompress(get_compressed_text_table(GENERAL_INDEX));
ptgb_write_simple(general_text.get_text_entry(GENERAL_cart_load_error), true);
ptgb_write_textbox(general_text.get_text_entry(GENERAL_cart_load_error), true, true,
GENERAL_INDEX, GENERAL_cart_load_error, true);
}
key_poll();
@ -123,8 +120,6 @@ void game_load_error(void)
global_next_frame();
} while (!key_hit(KEY_A) && !key_hit(KEY_SELECT));
tte_erase_rect(0, 0, H_MAX, V_MAX);
if (key_hit(KEY_SELECT))
{
// We also want to give the option in this screen to upload the multiboot rom to another GBA.
@ -147,8 +142,6 @@ void game_load_error(void)
void first_load_message(void)
{
tte_set_margins(8, 8, H_MAX - 8, V_MAX);
tte_set_pos(8, 8);
tte_set_ink(INK_ROM_COLOR);
{
@ -163,7 +156,6 @@ void first_load_message(void)
{
global_next_frame();
}
tte_erase_rect(0, 0, H_MAX, V_MAX);
}
int credits()
@ -180,16 +172,16 @@ int credits()
{
if (update)
{
create_textbox(1, 1, 200, 120, true);
show_textbox();
ptgb_write_simple(credits_text_table.get_text_entry(curr_credits_num), true);
ptgb_write_textbox(credits_text_table.get_text_entry(curr_credits_num), true, false,
CREDITS_INDEX, curr_credits_num, false);
update = false;
}
if (key_hit(KEY_B))
{
tte_erase_rect(0, 0, H_MAX, V_MAX);
hide_textbox();
reset_textbox();
erase_textbox_tiles();
return 0;
}
if (key_hit(KEY_LEFT) && curr_credits_num > 0)
@ -225,7 +217,6 @@ int main_menu_loop()
{
if (update)
{
tte_erase_rect(0, 80, 240, 160);
for (int i = 0; i < NUM_MENU_OPTIONS; i++)
{
text_entry = general_text.get_text_entry(menu_options[i]);
@ -257,7 +248,6 @@ int main_menu_loop()
else if (key_hit(KEY_A))
{
tte_erase_rect(0, test, H_MAX, V_MAX);
ptgb_write_simple(reinterpret_cast<const byte *>("#{cx:0xF000}"), true);
return return_values[curr_selection];
}
else if ((key_held(KEY_L) && key_held(KEY_R)))
@ -273,28 +263,9 @@ int main_menu_loop()
}
}
// Legal stuff
static void show_legal_text(const u8 *intro_text)
{
tte_set_margins(4, 0, H_MAX - 4, V_MAX);
tte_set_pos(4, 0);
tte_set_ink(INK_ROM_COLOR);
ptgb_write_simple(intro_text, true);
bool wait = true;
while (wait)
{
global_next_frame();
if (key_hit(KEY_A))
{
wait = false;
}
}
}
// Gears of Progress
static void show_gears_of_progress()
{
tte_erase_rect(0, 0, 240, 160);
REG_BG1VOFS = 0;
delay_counter = 0;
while (delay_counter < (15 * 60))
@ -316,20 +287,17 @@ static void __attribute__((noinline)) show_intro()
{
bool start_pressed = false;
u8 general_text_table_buffer[2048];
u8 press_start_text[32];
u8 press_start_text_length;
text_data_table general_text(general_text_table_buffer);
const u8 *text_entry;
general_text.decompress(get_compressed_text_table(GENERAL_INDEX));
text_entry = general_text.get_text_entry(GENERAL_press_start);
press_start_text_length = get_string_char_count(text_entry);
memcpy(press_start_text, text_entry, press_start_text_length + 1);
text_entry = general_text.get_text_entry(GENERAL_intro_legal);
show_legal_text(text_entry);
tte_set_ink(INK_ROM_COLOR);
ptgb_write_textbox(text_entry, true, true,
GENERAL_INDEX, GENERAL_intro_legal, true);
show_gears_of_progress();
BG_FLEX = BG_FLEX | BG_PRIO(3);
@ -343,22 +311,12 @@ static void __attribute__((noinline)) show_intro()
REG_BLDCNT = BLD_BUILD(BLD_BG3, BLD_BG0, 1);
#ifndef PTGB_BUILD_LANGUAGE
#error PTGB_NOT_DEFINED
#endif
#ifndef JPN_ID
#error JPN_ID_NOT_DEFINED
#endif
#pragma message "PTGB_BUILD_LANGUAGE=" PTGB_BUILD_LANGUAGE
#pragma message "JPN_ID=" JPN_ID
int char_width = (PTGB_BUILD_LANGUAGE == JPN_ID ? 8 : 6);
int x = ((240 - (press_start_text_length * char_width)) / 2);
tte_set_pos(x, 12 * 8);
general_text.decompress(get_compressed_text_table(GENERAL_INDEX));
text_entry = general_text.get_text_entry(GENERAL_press_start);
tte_set_pos(0, 12 * 8);
tte_set_ink(INK_DARK_GREY);
ptgb_write_simple(press_start_text, true);
ptgb_write_simple(text_entry, true);
int fade = 0;
while (!start_pressed)
@ -383,7 +341,6 @@ int main(void)
{
first_load_message();
}*/
show_intro();
key_poll();
@ -408,7 +365,6 @@ int main(void)
}
// Initialize memory and save data after loading the game
reset_textbox();
BG_TEXTBOX = BG_TEXTBOX | BG_PRIO(3);
init_bank();
initialize_memory_locations();
@ -462,11 +418,8 @@ int main(void)
break;
case (BTN_CREDITS):
tte_set_ink(INK_DARK_GREY);
// create_textbox(0, 0, 160, 80, true);
// show_textbox();
BG_FLEX = (BG_FLEX & ~BG_PRIO_MASK) | BG_PRIO(3);
obj_set_pos(ptgb_logo_l, 56, 108);
obj_set_pos(ptgb_logo_r, 56 + 64, 108);
obj_hide_multi(ptgb_logo_l, 2);
credits();
break;
case (BTN_EVENTS):

View File

@ -9,7 +9,7 @@
static void multiboot_show_textbox()
{
tte_erase_rect(0, 0, RIGHT, BOTTOM);
tte_erase_rect(0, 0, H_MAX, V_MAX);
create_textbox(4, 1, 152, 100, true);
}
@ -52,7 +52,6 @@ void multiboot_upload_screen()
// (when this returns true, the transfer will be canceled)
});
// show result
// clear_textbox();
multiboot_show_textbox();
if (multibootResult == LinkCableMultiboot::Result::SUCCESS)
{

View File

@ -180,7 +180,6 @@ void rom_data::print_rom_info()
npf_snprintf(buffer, sizeof(buffer), "%c-%d-%c", gameTypeChar, version, language);
tte_set_pos(0, 8);
ptgb_write_simple(reinterpret_cast<const byte *>(buffer), true);
}

View File

@ -275,37 +275,37 @@ void add_menu_box(int startTileX, int startTileY, int full_width, int full_heigh
int SBB = 20;
int start = (32 * startTileY) + startTileX;
int tiles = (full_height / 8) - 2; // For the extra 2 tiles
int rem = full_height % 8;
full_width /= 8;
int tiles = (full_height / 8) - 1; // For the flex edge
int vert_rem = full_height % 8;
full_width = (full_width / 8) - 1; // For the right edge
// Corners
se_mem[SBB][start] = TILE_NW;
se_mem[SBB][start + full_width] = TILE_NE;
se_mem[SBB][start + (32 * (tiles + 1))] = TILE_SW_U_ARR[rem / 2];
se_mem[SBB][start + (32 * (tiles + 2))] = TILE_SW_L_ARR[rem / 2];
se_mem[SBB][start + (32 * (tiles + 1)) + full_width] = TILE_SE_U_ARR[rem / 2];
se_mem[SBB][start + (32 * (tiles + 2)) + full_width] = TILE_SE_L_ARR[rem / 2];
se_mem[SBB][start + (32 * (tiles))] = TILE_SW_U_ARR[vert_rem / 2];
se_mem[SBB][start + (32 * (tiles + 1))] = TILE_SW_L_ARR[vert_rem / 2];
se_mem[SBB][start + (32 * (tiles)) + full_width] = TILE_SE_U_ARR[vert_rem / 2];
se_mem[SBB][start + (32 * (tiles + 1)) + full_width] = TILE_SE_L_ARR[vert_rem / 2];
// Top and bottom edge
for (int i = 1; i < full_width; i++)
{
se_mem[SBB][start + i] = TILE_N;
se_mem[SBB][start + ((32 * (tiles + 1))) + i] = TILE_S_U_ARR[rem / 2];
se_mem[SBB][start + ((32 * (tiles + 2))) + i] = TILE_S_L_ARR[rem / 2];
se_mem[SBB][start + ((32 * (tiles))) + i] = TILE_S_U_ARR[vert_rem / 2];
se_mem[SBB][start + ((32 * (tiles + 1))) + i] = TILE_S_L_ARR[vert_rem / 2];
}
// Sides
for (int i = 0; i < tiles; i++)
for (int i = 1; i < tiles; i++)
{
se_mem[SBB][start + (32 * (i + 1)) + full_width] = TILE_E;
se_mem[SBB][start + (32 * (i + 1))] = TILE_W;
se_mem[SBB][start + (32 * i) + full_width] = TILE_E;
se_mem[SBB][start + (32 * i)] = TILE_W;
}
// Middle
for (int x = 1; x < full_width; x++)
{
for (int y = 1; y < tiles + 1; y++)
for (int y = 1; y < tiles; y++)
{
se_mem[SBB][start + (32 * y) + x] = TILE_MID;
}

View File

@ -125,17 +125,15 @@ int text_loop(int script)
if (script != SCRIPT_DEBUG)
{
BG_FLEX = (BG_FLEX && !BG_PRIO_MASK) | BG_PRIO(2); // Show Fennel
show_textbox();
while (true) // This loops through all the connected script objects
while (true) // This loops through all the connected script objects
{
if (curr_text != NULL && curr_text[char_index] != 0xFF && curr_text[char_index] != 0xFB)
{
tte_set_pos(LEFT, TOP);
tte_erase_rect(LEFT, TOP, RIGHT, BOTTOM);
ptgb_write_simple(curr_text, false);
ptgb_write_textbox(curr_text, false, true,
PTGB_INDEX, curr_line.get_text_entry_index(), true);
}
wait_for_user_to_continue(false);
// wait_for_user_to_continue();
line_char_index = 0;
switch (script)
@ -154,7 +152,8 @@ int text_loop(int script)
if (text_exit)
{
hide_textbox();
tte_erase_rect(LEFT, TOP, RIGHT, BOTTOM);
// tte_erase_rect(LEFT, TOP, RIGHT, BOTTOM);
tte_erase_screen();
text_exit = false;
return 0;
}
@ -166,7 +165,7 @@ int text_loop(int script)
load_localized_charset(debug_charset, 3, ENGLISH);
int text_section = 0;
int text_identifier = 0;
int text_key = 0;
while (true)
{
bool exit = false;
@ -177,12 +176,12 @@ int text_loop(int script)
{
if (key_hit(KEY_LEFT))
{
text_identifier = (text_identifier + (text_section_lengths[text_section] - 1)) % text_section_lengths[text_section];
text_key = (text_key + (text_section_lengths[text_section] - 1)) % text_section_lengths[text_section];
update_text = true;
}
else if (key_hit(KEY_RIGHT))
{
text_identifier = (text_identifier + 1) % text_section_lengths[text_section];
text_key = (text_key + 1) % text_section_lengths[text_section];
update_text = true;
}
else if (key_hit(KEY_UP))
@ -199,12 +198,13 @@ int text_loop(int script)
{
instant_text = key_hit(KEY_START); // instant with start, not with select
exit = true;
tte_erase_line();
}
if (update_text)
{
if (text_identifier > text_section_lengths[text_section])
if (text_key > text_section_lengths[text_section])
{
text_identifier = text_section_lengths[text_section];
text_key = text_section_lengths[text_section];
}
if (text_section > NUM_TEXT_SECTIONS)
{
@ -215,7 +215,7 @@ int text_loop(int script)
ptgb_write_debug(debug_charset, "(", true);
ptgb_write_debug(debug_charset, ptgb::to_string(text_section), true);
ptgb_write_debug(debug_charset, ", ", true);
ptgb_write_debug(debug_charset, ptgb::to_string(text_identifier), true);
ptgb_write_debug(debug_charset, ptgb::to_string(text_key), true);
ptgb_write_debug(debug_charset, ")", true);
update_text = false;
}
@ -223,27 +223,19 @@ int text_loop(int script)
}
line_char_index = 0;
curr_text = read_dialogue_text_entry(text_identifier, text_section, diag_entry_text_buffer);
curr_text = read_dialogue_text_entry(text_key, text_section, diag_entry_text_buffer);
char_index = 0;
if (curr_text != NULL && curr_text[char_index] != 0xFF && curr_text[char_index] != 0xFB)
{
if (text_section == PTGB_INDEX)
{
reset_textbox();
}
else
{
create_textbox(4, 1, 160, 80, true);
}
show_textbox();
tte_erase_rect(0, 0, 240, 160);
ptgb_write_simple(curr_text, instant_text);
ptgb_write_textbox(curr_text, instant_text, true,
text_section, text_key, true);
}
wait_for_user_to_continue(false);
// wait_for_user_to_continue();
update_text = true;
hide_textbox();
tte_erase_rect(0, 0, H_MAX, V_MAX);
if (text_exit)
{
@ -279,41 +271,60 @@ void set_text_exit()
}
// Implement a version that creates the textbox as well
int ptgb_write_textbox(const byte *text, bool instant,
int ptgb_write_textbox(const byte *text, bool instant, bool waitForUser,
int text_section, int text_key, bool eraseMainBox)
{
create_textbox_new(text_section, text_key, eraseMainBox);
return ptgb_write(text, instant, 9999); // This is kinda silly but it'll work.
int out = ptgb_write(text, instant, 9999, text_box_type_tables[text_section][text_key]); // This is kinda silly but it'll work.
if (waitForUser)
{
wait_for_user_to_continue();
}
if (eraseMainBox)
{
tte_erase_rect(0, 0, H_MAX, V_MAX);
hide_textbox();
erase_textbox_tiles();
}
return out;
}
// Implement a version that just writes the whole string
int ptgb_write_simple(const byte *text, bool instant)
{
return ptgb_write(text, instant, 9999); // This is kinda silly but it'll work.
return ptgb_write(text, instant, 9999, -1); // This is kinda silly but it'll work.
}
// Re-implementing TTE's "tte_write" to use the gen 3 character encoding chart
int ptgb_write(const byte *text, bool instant, int length)
int ptgb_write(const byte *text, bool instant, int length, int box_type)
{
int left, top, right, bottom;
instant = instant || g_debug_options.instant_text_speed;
if (text == NULL)
return 0;
if (box_type == -1)
{
left = 0;
top = 0;
right = H_MAX;
bottom = V_MAX;
}
else
{
left = 8 * (box_type_info[box_type][BOX_TYPE_VAL_START_TILE_X] + 1);
top = 8 * (box_type_info[box_type][BOX_TYPE_VAL_START_TILE_Y] + 1);
right = left + box_type_info[box_type][BOX_TYPE_VAL_PIXELS_PER_LINE];
bottom = top + box_type_info[box_type][BOX_TYPE_VAL_NUM_OF_LINES] * 16;
}
uint ch, gid;
char *str = (char *)text;
TTC *tc = tte_get_context();
TFont *font;
int num = 0;
/*
if (curr_text[char_index] == 0xFB) // This will need to be moved
{
line_char_index += char_index;
line_char_index++;
// Low key kinda scuffed, but it works to split the string
curr_text = &curr_line.get_text()[line_char_index];
}
*/
while ((ch = *str) != 0xFF && num < length)
{
if (get_frame_count() % 2 == 0 || key_held(KEY_B) || key_held(KEY_A) || instant)
@ -326,17 +337,17 @@ int ptgb_write(const byte *text, bool instant, int length)
{
tc->drawgProc(0x79);
}
wait_for_user_to_continue(false);
scroll_text(instant, tc);
tc->cursorY += tc->font->charH;
tc->cursorX = tc->marginLeft;
wait_for_user_to_continue();
scroll_text(instant, tc, left, top, right, bottom);
break;
case 0xFB:
if (g_debug_options.display_control_char)
{
tc->drawgProc(0xB9);
}
wait_for_user_to_continue(true);
wait_for_user_to_continue();
tte_erase_rect(left, top, right, bottom);
tte_set_pos(left, top);
break;
case 0xFC:
ch = *str;
@ -373,13 +384,6 @@ int ptgb_write(const byte *text, bool instant, int length)
// Character wrap
int charW = font->widths ? font->widths[gid] : font->charW;
// We don't want this tbh- all of the newlines should deal with moving to the next line
/* if (tc->cursorX + charW > tc->marginRight)
{
tc->cursorY += 10; // font->charH;
tc->cursorX = tc->marginLeft;
} */
// Draw and update position
tc->drawgProc(gid);
tc->cursorX += charW;
@ -423,7 +427,7 @@ int ptgb_write_debug(const u16 *charset, const char *text, bool instant)
return ptgb_write_simple(temp_holding, instant);
}
void wait_for_user_to_continue(bool clear_text)
void wait_for_user_to_continue()
{
if (get_curr_flex_background() == FLEXBG_FENNEL)
{
@ -438,23 +442,18 @@ void wait_for_user_to_continue(bool clear_text)
}
}
key_poll();
while (!(key_hit(KEY_A) || key_hit(KEY_B) || curr_text == NULL))
while (!(key_hit(KEY_A) || key_hit(KEY_B)))
{
global_next_frame();
}
if (clear_text)
{
tte_erase_rect(LEFT, TOP, RIGHT, BOTTOM);
tte_set_pos(LEFT, TOP);
}
}
void scroll_text(bool instant, TTC *tc)
void scroll_text(bool instant, TTC *tc, int left, int top, int right, int bottom)
{
for (int i = 1; i <= tc->font->charH; i++)
{
REG_BG3VOFS = i;
tte_erase_rect(LEFT, TOP - tc->font->charH, RIGHT, TOP + i);
tte_erase_rect(left, top - tc->font->charH, right, top + i);
if (!instant)
{
global_next_frame();
@ -465,10 +464,13 @@ void scroll_text(bool instant, TTC *tc)
// The map starts at tile 0 in the top left, increases by 1 as you go down, and then loops back at the top.
for (int i = 0; i < 30; i++)
{
tonccpy(&tile_mem[TEXT_CBB][14 + (i * 20)], &tile_mem[TEXT_CBB][16 + (i * 20)], 2 * 2 * 32);
tonccpy(&tile_mem[TEXT_CBB][0 + (i * 20)], &tile_mem[TEXT_CBB][2 + (i * 20)], 20 * 32);
}
// Remove text that went outside of the box and set the position
tte_erase_rect(LEFT, TOP + tc->font->charH, RIGHT, BOTTOM);
tte_set_pos(LEFT, BOTTOM - (8 + (2 * tc->font->charH))); // The newline will trigger after this and move it down a line
}
tte_erase_rect(left, top - tc->font->charH, right, top);
tte_set_pos(left, bottom - (8 + (2 * tc->font->charH))); // The newline will trigger after this and move it down a line
tc->cursorY = bottom - tc->font->charH;
tc->cursorX = left;
}

Binary file not shown.