From 5c3b02570def78bfd7a16d83fec658aa6daeae4b Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 18 Jun 2025 14:03:03 +0200 Subject: [PATCH] Add text script command macro for textbox auto press --- include/data_script.h | 1 + include/string_format.h | 7 +- include/text_3.h | 6 +- include/textbox.h | 2 + src/data/ground/ground_data_a04p01_station.h | 6 +- src/data/ground/ground_data_a05p01_station.h | 10 +- src/data/ground/ground_data_a05p02_station.h | 2 +- src/data/ground/ground_data_a05p03_station.h | 2 +- src/data/ground/ground_data_b01p01a_station.h | 10 +- src/data/ground/ground_data_d07p02_station.h | 20 +-- src/data/ground/ground_data_d13p03_station.h | 4 +- src/data/ground/ground_data_d20p01_station.h | 12 +- src/data/ground/ground_data_t01p01_station.h | 4 +- src/data/ground/ground_data_t01p03_station.h | 20 +-- src/debug_field_map.c | 2 +- src/dungeon_message.c | 4 +- src/ground_main.c | 3 +- src/ground_script.c | 3 +- src/main_loops.c | 8 +- src/string_format.c | 156 ++++++++++-------- src/text_3.c | 32 ++-- src/textbox.c | 55 +++--- 22 files changed, 195 insertions(+), 174 deletions(-) diff --git a/include/data_script.h b/include/data_script.h index 16006d3f2..f935df7cb 100644 --- a/include/data_script.h +++ b/include/data_script.h @@ -35,6 +35,7 @@ // 20: execute script as parented object, maybe? Unused in ROM // 21: follow object/make object follow/get parented? // 22..2f: ??? +#define TEXTBOX_AUTO_PRESS(endF, midF) { 0x2b, 0, 0, endF, midF, NULL} // Waits specified number of frames, then automatically does a button press without waiting for player's input. -1 disables it. // 30..39: various text printing // 3a: yes/no choice (only used for saving) // 3b: uber command (conditional jump) diff --git a/include/string_format.h b/include/string_format.h index 220d6a3ce..bd595a5d7 100644 --- a/include/string_format.h +++ b/include/string_format.h @@ -17,8 +17,8 @@ extern u8 gFormatBuffer_Names[10][FORMAT_BUFFER_LEN]; extern u8 gSpeakerNameBuffer[FORMAT_BUFFER_LEN]; extern u8 gFormatBuffer_FriendArea[FRIEND_AREA_BUFFER_LEN]; -void sub_8014144(void); -void sub_801416C(s32 param_1,s32 param_2); +void ResetDialogueBox(void); +void SetDialogueBoxAutoPressFrames(s32 endMsgFrames, s32 midMsgFrames); void CreateDialogueBoxAndPortrait(const u8 *text, void *param_2, MonPortraitMsg *monPortraitPtr, u16 flags); void CreateYesNoDialogueBoxAndPortrait_DefaultYes(const u8 *text, MonPortraitMsg *monPortraitPtr, u16 flags); void CreateYesNoDialogueBoxAndPortrait_DefaultNo(const u8 *text, MonPortraitMsg *monPortraitPtr, u16 flags); @@ -30,10 +30,13 @@ const u8 *FormatString(const u8 *str, u8 *dst, u8 *dstMax, u16 flags); void PrintFormattedStringOnWindow(s32 x, s32 y, const u8 *str, u32 windowId, u32 terminatingChr); void PrintFormattedStringOnWindow2(s32 x, s32 y, const u8 *str, u32 windowId, u32 terminatingChr, s32 lineSpacing); +#define STR_FORMAT_FLAG_WAIT_FOR_BUTTON_PRESS_2 0x1 // Same as STR_FORMAT_FLAG_WAIT_FOR_BUTTON_PRESS, except the check is in a different place. Functionally, both need to be set to wait for the button press. +#define STR_FORMAT_FLAG_TIMED_AUTO_MSG_CLOSE 0x2 // Textbox closes automatically after waiting a couple of frames. #define STR_FORMAT_FLAG_DIALOGUE_SOUND 0x4 #define STR_FORMAT_FLAG_SPEAKER_NAME 0x8 #define STR_FORMAT_FLAG_INSTANT_TEXT 0x20 #define STR_FORMAT_FLAG_INSTANT_TEXT_ON_AB_PRESS 0x40 #define STR_FORMAT_FLAG_NEW_LINE_TERMINATES 0x80 +#define STR_FORMAT_FLAG_WAIT_FOR_BUTTON_PRESS 0x100 #endif // GUARD_STRING_FORMAT_H diff --git a/include/text_3.h b/include/text_3.h index 9f4d39351..5c313cf3d 100644 --- a/include/text_3.h +++ b/include/text_3.h @@ -5,7 +5,7 @@ typedef struct UnkDrawStringStruct { s16 x; - s16 unk2; + s16 y; s16 unk4; s16 unk6; s16 unk8; @@ -15,8 +15,8 @@ typedef struct UnkDrawStringStruct u32 unk14; u32 unk18; u32 unk1C; - u8 unk20; - u8 unk21; + bool8 waitButtonPress; + bool8 waitFrames; u8 fill22; u8 fill23; const u8 * (*unk24)(const u8 *, const u8 *, struct UnkDrawStringStruct *); diff --git a/include/textbox.h b/include/textbox.h index 74883f0ac..fce7f5337 100644 --- a/include/textbox.h +++ b/include/textbox.h @@ -4,6 +4,8 @@ void TextboxInit(void); void TextboxFree(void); +void SetAutoPressTextboxFrames(s32 frames); +void SetAutoPressTextboxMidEndMsgFrames(s32 endMsgFrames, s32 midMsgFrames); bool8 ScriptClearTextbox(void); bool8 ScriptClearTextbox2(void); void ResetTextboxPortrait(s16 id_); diff --git a/src/data/ground/ground_data_a04p01_station.h b/src/data/ground/ground_data_a04p01_station.h index db7309523..3e1b5ab65 100644 --- a/src/data/ground/ground_data_a04p01_station.h +++ b/src/data/ground/ground_data_a04p01_station.h @@ -1322,7 +1322,7 @@ static const struct ScriptCommand s_gs171_g6_s0_lives0_dlg0[] = { /* 0x8223d40 * { 0xe4, 0x00, 0x0008, 0x00000000, 0x00000000, NULL }, { 0xe4, 0x00, 0x0009, 0x00000000, 0x00000000, NULL }, WAIT(30), - { 0x2b, 0x00, 0x0000, 0x0000003c, 0x0000003c, NULL }, + TEXTBOX_AUTO_PRESS(60, 60), { 0x2d, 0x09, 0x0009, 0x0000004e, 0x00000000, NULL }, { 0x2e, 0x0c, 0x0009, 0x00000041, 0x00000000, NULL }, { 0x34, 0x00, 0x0009, 0x00000000, 0x00000000, _(" {NAME_0}!") }, @@ -1344,7 +1344,7 @@ static const struct ScriptCommand s_gs171_g6_s0_lives0_dlg0[] = { /* 0x8223d40 * { 0xe3, 0x00, 0x0005, 0x00000000, 0x00000000, NULL }, { 0x59, 0x00, 0x0000, -0x000000c8, 0x00000000, NULL }, { 0xe3, 0x00, 0x0005, 0x00000000, 0x00000000, NULL }, - { 0x2b, 0x00, 0x0000, 0x000000b4, 0x000000b4, NULL }, + TEXTBOX_AUTO_PRESS(180, 180), { 0x2e, 0x03, 0x0001, 0x00000006, 0x00000000, NULL }, { 0x34, 0x00, 0x0001, 0x00000000, 0x00000000, _(" {NAME_0}!!! Nooooo!!!") }, { 0x30, 0x00, 0x0000, 0x00000000, 0x00000000, NULL }, @@ -2119,7 +2119,7 @@ static const struct ScriptCommand s_gs171_g7_s0_lives0_dlg0[] = { /* 0x8227f54 * WAIT(90), { 0xdf, 0x00, 0x0000, 0x00000000, 0x00000000, NULL }, WAIT(90), - { 0x2b, 0x00, 0x0000, -0x00000001, -0x00000001, NULL }, + TEXTBOX_AUTO_PRESS(-1, -1), { 0x2e, 0x02, 0x0006, 0x00000042, 0x00000000, NULL }, { 0x34, 0x00, 0x0006, 0x00000000, 0x00000000, _(" Snivel... {NAME_0}...{WAIT_PRESS}\nWhy...{WAIT_PRESS} I don't understand...") }, { 0x30, 0x00, 0x0000, 0x00000000, 0x00000000, NULL }, diff --git a/src/data/ground/ground_data_a05p01_station.h b/src/data/ground/ground_data_a05p01_station.h index ee4bc6864..f9e89a68f 100644 --- a/src/data/ground/ground_data_a05p01_station.h +++ b/src/data/ground/ground_data_a05p01_station.h @@ -41,18 +41,18 @@ static const struct ScriptCommand s_gs175_g1_s0_eff1_script[] = { /* 0x822b0f4 * WAIT(40), BGM_SWITCH(44), WAIT(300), - { 0x2b, 0x00, 0x0000, -0x000000c8, 0x0000003c, NULL }, + TEXTBOX_AUTO_PRESS(-200, 60), { 0x33, 0x00, 0x0000, 0x00000000, 0x00000000, _("(..................)") }, { 0x33, 0x00, 0x0000, 0x00000000, 0x00000000, _("(What is this...?)") }, { 0x33, 0x00, 0x0000, 0x00000000, 0x00000000, _("(I'm rising into the sky...)") }, - { 0x2b, 0x00, 0x0000, -0x000000be, 0x0000003c, NULL }, + TEXTBOX_AUTO_PRESS(-190, 60), { 0x33, 0x00, 0x0000, 0x00000000, 0x00000000, _("(Is this my spirit...?)") }, { 0x33, 0x00, 0x0000, 0x00000000, 0x00000000, _("(I wonder where I'm going?)") }, { 0x30, 0x00, 0x0000, 0x00000000, 0x00000000, NULL }, WAIT(120), - { 0x2b, 0x00, 0x0000, -0x0000006e, 0x0000003c, NULL }, + TEXTBOX_AUTO_PRESS(-110, 60), { 0x33, 0x00, 0x0000, 0x00000000, 0x00000000, _("(......!)") }, - { 0x2b, 0x00, 0x0000, -0x000000d2, 0x00000032, NULL }, + TEXTBOX_AUTO_PRESS(-210, 50), { 0x33, 0x00, 0x0000, 0x00000000, 0x00000000, _("(Voices...{WAIT_PRESS}\nI hear voices...)") }, { 0x30, 0x00, 0x0000, 0x00000000, 0x00000000, NULL }, { 0xe4, 0x00, 0x0003, 0x00000000, 0x00000000, NULL }, @@ -85,7 +85,7 @@ static const struct ScriptCommand s_gs175_g2_s0_eff1_script[] = { /* 0x822b3d0 * WAIT(120), BGM_SWITCH(45), WAIT(60), - { 0x2b, 0x00, 0x0000, 0x000000be, 0x000000be, NULL }, + TEXTBOX_AUTO_PRESS(190, 190), { 0x26, 0x01, 0x0000, 0x00000000, 0x00000000, NULL }, WAIT(1), { 0x39, 0x00, 0x001e, 0x00000000, 0x00000000, _("\n{CENTER_ALIGN}I don't want to leave...") }, diff --git a/src/data/ground/ground_data_a05p02_station.h b/src/data/ground/ground_data_a05p02_station.h index 3982989e0..46d1a850d 100644 --- a/src/data/ground/ground_data_a05p02_station.h +++ b/src/data/ground/ground_data_a05p02_station.h @@ -96,7 +96,7 @@ static const struct ScriptCommand s_gs176_g1_s0_eff1_script[] = { /* 0x822bb50 * { 0x26, 0x01, 0x0000, 0x00000000, 0x00000000, NULL }, { 0xdf, 0x00, 0x0000, 0x00000000, 0x00000000, NULL }, WAIT(90), - { 0x2b, 0x00, 0x0000, 0x000000b4, 0x000000b4, NULL }, + TEXTBOX_AUTO_PRESS(180, 180), WAIT(60), { 0x39, 0x00, 0x005a, 0x00000000, 0x00000000, _("{CENTER_ALIGN}Your friend is heartbroken...") }, WAIT(80), diff --git a/src/data/ground/ground_data_a05p03_station.h b/src/data/ground/ground_data_a05p03_station.h index a8cea2669..92e3cf53e 100644 --- a/src/data/ground/ground_data_a05p03_station.h +++ b/src/data/ground/ground_data_a05p03_station.h @@ -22,7 +22,7 @@ static const struct ScriptCommand s_gs177_g1_s0_station_sref_script[] = { /* 0x8 { 0x22, 0x01, 0x001e, 0x00000000, 0x00000000, NULL }, { 0xe0, 0x00, 0x002d, 0x00000000, 0x00000000, NULL }, WAIT(240), - { 0x2b, 0x00, 0x0000, -0x00000001, -0x00000001, NULL }, + TEXTBOX_AUTO_PRESS(-1, -1), { 0x38, 0x00, -0x0001, 0x00000000, 0x00000000, _("\n") }, { 0x30, 0x00, 0x0000, 0x00000000, 0x00000000, NULL }, WAIT(1), diff --git a/src/data/ground/ground_data_b01p01a_station.h b/src/data/ground/ground_data_b01p01a_station.h index 291e85760..c94cae379 100644 --- a/src/data/ground/ground_data_b01p01a_station.h +++ b/src/data/ground/ground_data_b01p01a_station.h @@ -7875,7 +7875,7 @@ static const struct ScriptCommand s_gs9_g53_s0_lives0_dlg0[] = { /* 0x81c02fc */ { 0xe4, 0x00, 0x0006, 0x00000000, 0x00000000, NULL }, { 0xe3, 0x00, 0x0005, 0x00000000, 0x00000000, NULL }, WAIT(30), - { 0x2b, 0x00, 0x0000, -0x00000001, -0x00000001, NULL }, + TEXTBOX_AUTO_PRESS(-1, -1), { 0x2e, 0x02, 0x0001, 0x00000000, 0x00000000, NULL }, MSG_VAR(2, PARTNER_TALK_KIND, 1), VARIANT(/* == */ 1, _(" OK! Thanks!")), @@ -8001,11 +8001,11 @@ static const struct ScriptCommand s_gs9_g53_s0_lives2_dlg0[] = { /* 0x81c1678 */ { 0xe3, 0x00, 0x0007, 0x00000000, 0x00000000, NULL }, { 0x91, 0x04, 0x000b, 0x00000000, 0x00000000, NULL }, WAIT(20), - { 0x2b, 0x00, 0x0000, 0x0000003c, 0x0000003c, NULL }, + TEXTBOX_AUTO_PRESS(60, 60), { 0x2e, 0x0b, 0x0002, 0x00000000, 0x00000000, NULL }, { 0x34, 0x00, 0x0002, 0x00000000, 0x00000000, _(" Take care!") }, { 0x31, 0x00, 0x0000, 0x00000000, 0x00000000, NULL }, - { 0x2b, 0x00, 0x0000, -0x00000001, -0x00000001, NULL }, + TEXTBOX_AUTO_PRESS(-1, -1), { 0xe3, 0x00, 0x0007, 0x00000000, 0x00000000, NULL }, HALT, }; @@ -8118,11 +8118,11 @@ static const struct ScriptCommand s_gs9_g53_s0_lives5_dlg0[] = { /* 0x81c1d74 */ { 0xe3, 0x00, 0x000b, 0x00000000, 0x00000000, NULL }, { 0x91, 0x04, 0x000b, 0x00000000, 0x00000000, NULL }, WAIT(110), - { 0x2b, 0x00, 0x0000, 0x00000050, 0x00000050, NULL }, + TEXTBOX_AUTO_PRESS(80, 80), { 0x2e, 0x0b, 0x0006, 0x00000000, 0x00000000, NULL }, { 0x34, 0x00, 0x0006, 0x00000000, 0x00000000, _(" We'll be waiting for both\nof you to return!") }, { 0x31, 0x00, 0x0000, 0x00000000, 0x00000000, NULL }, - { 0x2b, 0x00, 0x0000, -0x00000001, -0x00000001, NULL }, + TEXTBOX_AUTO_PRESS(-1, -1), { 0xe4, 0x00, 0x0005, 0x00000000, 0x00000000, NULL }, { 0xe3, 0x00, 0x000b, 0x00000000, 0x00000000, NULL }, HALT, diff --git a/src/data/ground/ground_data_d07p02_station.h b/src/data/ground/ground_data_d07p02_station.h index 1684c4546..8a44899a0 100644 --- a/src/data/ground/ground_data_d07p02_station.h +++ b/src/data/ground/ground_data_d07p02_station.h @@ -284,39 +284,39 @@ static const struct ScriptCommand s_gs192_g2_s0_lives0_dlg0[] = { /* 0x823ef68 * { 0xe3, 0x00, 0x0005, 0x00000000, 0x00000000, NULL }, WAIT(20), { 0xe4, 0x00, 0x0006, 0x00000000, 0x00000000, NULL }, - { 0x2b, 0x00, 0x0000, 0x0000001e, 0x0000001e, NULL }, + TEXTBOX_AUTO_PRESS(30, 30), { 0x2e, 0x15, 0x0001, 0x00000000, 0x00000000, NULL }, { 0x34, 0x00, 0x0001, 0x00000000, 0x00000000, _(" Tickle, tickle, tickle.") }, { 0x30, 0x00, 0x0000, 0x00000000, 0x00000000, NULL }, - { 0x2b, 0x00, 0x0000, -0x00000001, -0x00000001, NULL }, + TEXTBOX_AUTO_PRESS(-1, -1), WAIT(30), { 0x34, 0x00, -0x0001, 0x00000000, 0x00000000, _(" ............") }, { 0x30, 0x00, 0x0000, 0x00000000, 0x00000000, NULL }, WAIT(10), { 0xe4, 0x00, 0x0006, 0x00000000, 0x00000000, NULL }, WAIT(10), - { 0x2b, 0x00, 0x0000, 0x0000001e, 0x0000001e, NULL }, + TEXTBOX_AUTO_PRESS(30, 30), { 0x34, 0x00, 0x0001, 0x00000000, 0x00000000, _(" Tickle, tickle, tickle, tickle,\ntickle, tickle.") }, { 0x30, 0x00, 0x0000, 0x00000000, 0x00000000, NULL }, - { 0x2b, 0x00, 0x0000, -0x00000001, -0x00000001, NULL }, + TEXTBOX_AUTO_PRESS(-1, -1), WAIT(30), { 0x34, 0x00, -0x0001, 0x00000000, 0x00000000, _(" ....................................") }, { 0x30, 0x00, 0x0000, 0x00000000, 0x00000000, NULL }, WAIT(10), { 0xe4, 0x00, 0x0006, 0x00000000, 0x00000000, NULL }, WAIT(20), - { 0x2b, 0x00, 0x0000, 0x00000014, 0x00000014, NULL }, + TEXTBOX_AUTO_PRESS(20, 20), { 0x34, 0x00, 0x0001, 0x00000000, 0x00000000, _(" Tickle, tickle, tickle, tickle,\ntickle, tickle, tickle, tickle, tickle, tickle,\ntickle, tickle, tickle, tickle, tickle, tickle.") }, { 0x30, 0x00, 0x0000, 0x00000000, 0x00000000, NULL }, - { 0x2b, 0x00, 0x0000, -0x00000001, -0x00000001, NULL }, + TEXTBOX_AUTO_PRESS(-1, -1), WAIT(30), { 0x34, 0x00, -0x0001, 0x00000000, 0x00000000, _(" ................................................\n............................................................\n............................................................") }, { 0x30, 0x00, 0x0000, 0x00000000, 0x00000000, NULL }, WAIT(10), { 0xe4, 0x00, 0x0006, 0x00000000, 0x00000000, NULL }, - { 0x2b, 0x00, 0x0000, 0x0000001e, 0x0000001e, NULL }, + TEXTBOX_AUTO_PRESS(30, 30), { 0x34, 0x00, 0x0001, 0x00000000, 0x00000000, _(" Tickle, tickle, tickle......") }, - { 0x2b, 0x00, 0x0000, -0x00000001, -0x00000001, NULL }, + TEXTBOX_AUTO_PRESS(-1, -1), WAIT(10), { 0xe4, 0x00, 0x0006, 0x00000000, 0x00000000, NULL }, { 0xe3, 0x00, 0x0005, 0x00000000, 0x00000000, NULL }, @@ -417,14 +417,14 @@ static const struct ScriptCommand s_gs192_g2_s0_lives0_dlg0[] = { /* 0x823ef68 * { 0x91, 0x05, 0x0002, 0x00000003, 0x00000000, NULL }, { 0xe3, 0x00, 0x0005, 0x00000000, 0x00000000, NULL }, WAIT(30), - { 0x2b, 0x00, 0x0000, 0x0000002d, 0x0000003c, NULL }, + TEXTBOX_AUTO_PRESS(45, 60), { 0x2e, 0x03, 0x0001, 0x00000003, 0x00000000, NULL }, MSG_VAR(2, PARTNER_TALK_KIND, 1), VARIANT(/* == */ 1, _(" All right. Counting down.{WAIT_PRESS}\nThree...{WAIT_PRESS} Two...{WAIT_PRESS} One...{WAIT_PRESS} Now...!")), VARIANT_DEFAULT(_(" OK. Counting down.{WAIT_PRESS}\nThree...{WAIT_PRESS} Two...{WAIT_PRESS} One...{WAIT_PRESS} Now...!")), { 0x30, 0x00, 0x0000, 0x00000000, 0x00000000, NULL }, WAIT(10), - { 0x2b, 0x00, 0x0000, -0x00000001, -0x00000001, NULL }, + TEXTBOX_AUTO_PRESS(-1, -1), { 0xe4, 0x00, 0x0007, 0x00000000, 0x00000000, NULL }, WAIT(10), { 0x36, 0x00, -0x0001, 0x00000000, 0x00000000, _("Kwaaaaaaaaah!") }, diff --git a/src/data/ground/ground_data_d13p03_station.h b/src/data/ground/ground_data_d13p03_station.h index 841cd35e0..98f962f80 100644 --- a/src/data/ground/ground_data_d13p03_station.h +++ b/src/data/ground/ground_data_d13p03_station.h @@ -405,7 +405,7 @@ static const struct ScriptCommand s_gs209_g3_s0_station_sref_script[] = { /* 0x8 { 0x28, 0x01, 0x0005, 0x0000003c, 0x00ffffff, NULL }, WAIT(120), { 0x31, 0x00, 0x0000, 0x00000000, 0x00000000, NULL }, - { 0x2b, 0x00, 0x0000, -0x00000001, -0x00000001, NULL }, + TEXTBOX_AUTO_PRESS(-1, -1), WAIT(240), RET, }; @@ -419,7 +419,7 @@ static const struct ScriptCommand s_gs209_g3_s0_lives0_dlg0[] = { /* 0x8263a7c * { 0xdf, 0x00, 0x0000, 0x00000000, 0x00000000, NULL }, WAIT(30), WAIT(30), - { 0x2b, 0x00, 0x0000, 0x0000000f, 0x0000000f, NULL }, + TEXTBOX_AUTO_PRESS(15, 15), { 0x2e, 0x02, 0x0001, 0x0000000c, 0x00000000, NULL }, { 0x34, 0x00, 0x0001, 0x00000000, 0x00000000, _(" Waaaaaaaaaaaaaaaaaah!") }, { 0xe4, 0x00, 0x0003, 0x00000000, 0x00000000, NULL }, diff --git a/src/data/ground/ground_data_d20p01_station.h b/src/data/ground/ground_data_d20p01_station.h index 5392902b1..65b668678 100644 --- a/src/data/ground/ground_data_d20p01_station.h +++ b/src/data/ground/ground_data_d20p01_station.h @@ -140,7 +140,7 @@ static const struct ScriptCommand s_gs216_g1_s0_lives0_dlg0[] = { /* 0x8267cc8 * { 0x30, 0x00, 0x0000, 0x00000000, 0x00000000, NULL }, WAIT(10), BGM_SWITCH(35), - { 0x2b, 0x00, 0x0000, 0x0000003c, 0x0000003c, NULL }, + TEXTBOX_AUTO_PRESS(60, 60), { 0x34, 0x00, -0x0001, 0x00000000, 0x00000000, _(" ............{WAIT_PRESS}Is it{WAIT_PRESS} \nyou...?") }, { 0x34, 0x00, -0x0001, 0x00000000, 0x00000000, _(" ......Who...disturbs...my sleep...{WAIT_PRESS}\nIs it{WAIT_PRESS} you?!\n") }, { 0x30, 0x00, 0x0000, 0x00000000, 0x00000000, NULL }, @@ -154,7 +154,7 @@ static const struct ScriptCommand s_gs216_g1_s0_lives0_dlg0[] = { /* 0x8267cc8 * WAIT(15), { 0x92, 0x04, 0x0002, 0x00000005, 0x00000000, NULL }, WAIT(30), - { 0x2b, 0x00, 0x0000, -0x00000001, -0x00000001, NULL }, + TEXTBOX_AUTO_PRESS(-1, -1), { 0x34, 0x00, 0x0000, 0x00000000, 0x00000000, _(" Wh-who's there?!") }, { 0x34, 0x00, 0x0000, 0x00000000, 0x00000000, _(" Who are you?!{WAIT_PRESS}\nShow yourself!") }, { 0x30, 0x00, 0x0000, 0x00000000, 0x00000000, NULL }, @@ -162,7 +162,7 @@ static const struct ScriptCommand s_gs216_g1_s0_lives0_dlg0[] = { /* 0x8267cc8 * FANFARE_PLAY2(453), { 0x97, 0x00, 0x0001, 0x00000000, 0x00000000, NULL }, WAIT(60), - { 0x2b, 0x00, 0x0000, 0x0000005a, 0x0000005a, NULL }, + TEXTBOX_AUTO_PRESS(90, 90), { 0x34, 0x00, -0x0001, 0x00000000, 0x00000000, _(" Me...?") }, { 0x34, 0x00, -0x0001, 0x00000000, 0x00000000, _(" I was...{WAIT_PRESS}\nEngineered...") }, { 0x30, 0x00, 0x0000, 0x00000000, 0x00000000, NULL }, @@ -188,7 +188,7 @@ static const struct ScriptCommand s_gs216_g1_s0_lives0_dlg0[] = { /* 0x8267cc8 * BGM_SWITCH(11), { 0x27, 0x01, 0x0001, 0x00000005, 0x00ffffff, NULL }, { 0x23, 0x01, 0x000a, 0x00000000, 0x00000000, NULL }, - { 0x2b, 0x00, 0x0000, 0x00000078, 0x00000078, NULL }, + TEXTBOX_AUTO_PRESS(120, 120), { 0x39, 0x00, 0x001e, 0x00000000, 0x00000000, _("{CENTER_ALIGN}The most powerful of all Pokémon!") }, { 0x30, 0x00, 0x0000, 0x00000000, 0x00000000, NULL }, WAIT(1), @@ -198,7 +198,7 @@ static const struct ScriptCommand s_gs216_g1_s0_lives0_dlg0[] = { /* 0x8267cc8 * { 0xe4, 0x00, 0x0006, 0x00000000, 0x00000000, NULL }, WAIT(60), { 0x28, 0x01, 0x0005, 0x00000078, 0x00ffffff, NULL }, - { 0x2b, 0x00, 0x0000, 0x0000003c, 0x0000003c, NULL }, + TEXTBOX_AUTO_PRESS(60, 60), { 0x2e, 0x02, 0x0000, 0x00000003, 0x00000000, NULL }, FANFARE_PLAY2(877), { 0x34, 0x00, 0x0000, 0x00000000, 0x00000000, _(" Gwaaaaaaaaaaaah!") }, @@ -208,7 +208,7 @@ static const struct ScriptCommand s_gs216_g1_s0_lives0_dlg0[] = { /* 0x8267cc8 * FANFARE_PLAY2(877), { 0x34, 0x00, 0x0001, 0x00000000, 0x00000000, _(" Gyaaaaaaaah!") }, { 0x30, 0x00, 0x0000, 0x00000000, 0x00000000, NULL }, - { 0x2b, 0x00, 0x0000, -0x00000001, -0x00000001, NULL }, + TEXTBOX_AUTO_PRESS(-1, -1), BGM_FADEOUT(60), WAIT(60), { 0xe4, 0x00, 0x0003, 0x00000000, 0x00000000, NULL }, diff --git a/src/data/ground/ground_data_t01p01_station.h b/src/data/ground/ground_data_t01p01_station.h index 2dd9f841a..892820df9 100644 --- a/src/data/ground/ground_data_t01p01_station.h +++ b/src/data/ground/ground_data_t01p01_station.h @@ -5995,11 +5995,11 @@ static const struct ScriptCommand s_gs1_g23_s0_lives0_dlg0[] = { /* 0x814dc14 */ { 0x91, 0x04, 0x000a, 0x00000002, 0x00000000, NULL }, { 0xe4, 0x00, 0x000f, 0x00000000, 0x00000000, NULL }, WAIT(15), - { 0x2b, 0x00, 0x0000, 0x000000d2, 0x000000d2, NULL }, + TEXTBOX_AUTO_PRESS(210, 210), { 0x2e, 0x03, 0x0009, -0x00000002, 0x00000000, NULL }, { 0x34, 0x00, 0x0009, 0x00000000, 0x00000000, _(" Extra! Extra!\nRead all about it!") }, { 0x31, 0x00, 0x0000, 0x00000000, 0x00000000, NULL }, - { 0x2b, 0x00, 0x0000, -0x00000001, -0x00000001, NULL }, + TEXTBOX_AUTO_PRESS(-1, -1), { 0x91, 0x0a, 0x000a, 0x00000003, 0x00000000, NULL }, { 0xe3, 0x00, 0x0005, 0x00000000, 0x00000000, NULL }, WAIT(20), diff --git a/src/data/ground/ground_data_t01p03_station.h b/src/data/ground/ground_data_t01p03_station.h index ffb3a72ab..178ba5931 100644 --- a/src/data/ground/ground_data_t01p03_station.h +++ b/src/data/ground/ground_data_t01p03_station.h @@ -499,7 +499,7 @@ static const struct ScriptCommand s_gs4_g1_s1_lives0_dlg0[] = { /* 0x818b710 */ { 0xe3, 0x00, 0x0005, 0x00000000, 0x00000000, NULL }, { 0x34, 0x00, 0x0002, 0x00000000, 0x00000000, _(" Get set!") }, { 0x30, 0x00, 0x0000, 0x00000000, 0x00000000, NULL }, - { 0x2b, 0x00, 0x0000, 0x00000000, 0x00000000, NULL }, + TEXTBOX_AUTO_PRESS(0, 0), WAIT(10), { 0xe4, 0x00, 0x0007, 0x00000000, 0x00000000, NULL }, { 0xe3, 0x00, 0x0005, 0x00000000, 0x00000000, NULL }, @@ -542,7 +542,7 @@ static const struct ScriptCommand s_gs4_g1_s1_lives0_dlg0[] = { /* 0x818b710 */ { 0xe4, 0x00, 0x0007, 0x00000000, 0x00000000, NULL }, { 0xe3, 0x00, 0x0005, 0x00000000, 0x00000000, NULL }, WAIT(30), - { 0x2b, 0x00, 0x0000, -0x00000001, -0x00000001, NULL }, + TEXTBOX_AUTO_PRESS(-1, -1), { 0xe4, 0x00, 0x0008, 0x00000000, 0x00000000, NULL }, { 0x34, 0x00, 0x0003, 0x00000000, 0x00000000, _(" Papa!") }, { 0x30, 0x00, 0x0000, 0x00000000, 0x00000000, NULL }, @@ -2207,7 +2207,7 @@ static const struct ScriptCommand s_gs4_g20_s1_lives1_dlg0[] = { /* 0x81929a0 */ { 0x34, 0x00, 0x0002, 0x00000000, 0x00000000, _(" ..................{WAIT_PRESS}\nWell, Son...{WAIT_PRESS}\nThe three of us cooperate, and...") }, { 0x30, 0x00, 0x0000, 0x00000000, 0x00000000, NULL }, WAIT(10), - { 0x2b, 0x00, 0x0000, 0x00000000, 0x00000000, NULL }, + TEXTBOX_AUTO_PRESS(0, 0), { 0xe4, 0x00, 0x0007, 0x00000000, 0x00000000, NULL }, { 0xe3, 0x00, 0x0005, 0x00000000, 0x00000000, NULL }, { 0x2e, 0x07, 0x0002, 0x00000000, 0x00000000, NULL }, @@ -2238,13 +2238,13 @@ static const struct ScriptCommand s_gs4_g20_s1_lives1_dlg0[] = { /* 0x81929a0 */ { 0xe4, 0x00, 0x0006, 0x00000000, 0x00000000, NULL }, { 0xe4, 0x00, 0x0008, 0x00000000, 0x00000000, NULL }, { 0x93, 0x04, 0x000a, 0x00000042, 0x00000000, NULL }, - { 0x2b, 0x00, 0x0000, 0x0000001e, 0x0000001e, NULL }, + TEXTBOX_AUTO_PRESS(30, 30), { 0x2e, 0x07, 0x0002, 0x00000000, 0x00000000, NULL }, { 0x34, 0x00, 0x0002, 0x00000000, 0x00000000, _(" Hah!") }, { 0x30, 0x00, 0x0000, 0x00000000, 0x00000000, NULL }, { 0xe4, 0x00, 0x0007, 0x00000000, 0x00000000, NULL }, { 0xe3, 0x00, 0x0005, 0x00000000, 0x00000000, NULL }, - { 0x2b, 0x00, 0x0000, -0x00000001, -0x00000001, NULL }, + TEXTBOX_AUTO_PRESS(-1, -1), { 0x2e, 0x02, 0x0002, 0x00000000, 0x00000000, NULL }, { 0x34, 0x00, 0x0002, 0x00000000, 0x00000000, _(" ...And that's sort of how\nwe swim!{WAIT_PRESS}\nGasp, gasp...") }, { 0x34, 0x00, 0x0002, 0x00000000, 0x00000000, _(" What do you...{WAIT_PRESS}\nTake us for?!{WAIT_PRESS}\nGasp, gasp...") }, @@ -2466,7 +2466,7 @@ static const struct ScriptCommand s_gs4_g21_s1_lives0_dlg0[] = { /* 0x8193870 */ { 0x34, 0x00, 0x0002, 0x00000000, 0x00000000, _(" What do you...{WAIT_PRESS}\nTake us for?!") }, { 0x34, 0x00, 0x0002, 0x00000000, 0x00000000, _(" If we were in charge...{WAIT_PRESS}\nThis is what we'd do to any earthquake!") }, { 0x30, 0x00, 0x0000, 0x00000000, 0x00000000, NULL }, - { 0x2b, 0x00, 0x0000, 0x00000000, 0x00000000, NULL }, + TEXTBOX_AUTO_PRESS(0, 0), { 0xe4, 0x00, 0x0007, 0x00000000, 0x00000000, NULL }, { 0xe3, 0x00, 0x0005, 0x00000000, 0x00000000, NULL }, { 0x2e, 0x02, 0x0002, 0x00000000, 0x00000000, NULL }, @@ -2497,13 +2497,13 @@ static const struct ScriptCommand s_gs4_g21_s1_lives0_dlg0[] = { /* 0x8193870 */ { 0xe4, 0x00, 0x0006, 0x00000000, 0x00000000, NULL }, { 0xe4, 0x00, 0x0008, 0x00000000, 0x00000000, NULL }, { 0x93, 0x04, 0x000a, 0x00000042, 0x00000000, NULL }, - { 0x2b, 0x00, 0x0000, 0x0000001e, 0x0000001e, NULL }, + TEXTBOX_AUTO_PRESS(30, 30), { 0x2e, 0x08, 0x0002, 0x00000000, 0x00000000, NULL }, { 0x34, 0x00, 0x0002, 0x00000000, 0x00000000, _(" Hah!") }, { 0x30, 0x00, 0x0000, 0x00000000, 0x00000000, NULL }, { 0xe4, 0x00, 0x0007, 0x00000000, 0x00000000, NULL }, { 0xe3, 0x00, 0x0005, 0x00000000, 0x00000000, NULL }, - { 0x2b, 0x00, 0x0000, -0x00000001, -0x00000001, NULL }, + TEXTBOX_AUTO_PRESS(-1, -1), { 0x2e, 0x02, 0x0002, 0x00000000, 0x00000000, NULL }, { 0x34, 0x00, 0x0002, 0x00000000, 0x00000000, _(" Gasp, gasp...") }, { 0x30, 0x00, 0x0000, 0x00000000, 0x00000000, NULL }, @@ -2722,13 +2722,13 @@ static const struct ScriptCommand s_gs4_g22_s1_lives0_dlg0[] = { /* 0x81947b4 */ { 0x34, 0x00, 0x0002, 0x00000000, 0x00000000, _(" If we were in charge...{WAIT_PRESS}\nThis is what we'd do to the {COLOR YELLOW_D}Magma\nCavern{RESET}!{WAIT_PRESS} Hah!") }, { 0x30, 0x00, 0x0000, 0x00000000, 0x00000000, NULL }, WAIT(30), - { 0x2b, 0x00, 0x0000, 0x0000000a, 0x0000000a, NULL }, + TEXTBOX_AUTO_PRESS(10, 10), { 0x34, 0x00, 0x0002, 0x00000000, 0x00000000, _(" Hah!") }, { 0x30, 0x00, 0x0000, 0x00000000, 0x00000000, NULL }, FANFARE_PLAY2(486), { 0xe4, 0x00, 0x0007, 0x00000000, 0x00000000, NULL }, { 0xe3, 0x00, 0x0005, 0x00000000, 0x00000000, NULL }, - { 0x2b, 0x00, 0x0000, -0x00000001, -0x00000001, NULL }, + TEXTBOX_AUTO_PRESS(-1, -1), { 0x34, 0x00, 0x0003, 0x00000000, 0x00000000, _(" ............") }, { 0x34, 0x00, 0x0003, 0x00000000, 0x00000000, _(" ........................") }, { 0x34, 0x00, 0x0003, 0x00000000, 0x00000000, _(" ....................................{WAIT_PRESS}Huh?{WAIT_PRESS}\nPapa?{WAIT_PRESS} Where did you go, Papa?") }, diff --git a/src/debug_field_map.c b/src/debug_field_map.c index 0fcd23418..0cc0fe887 100644 --- a/src/debug_field_map.c +++ b/src/debug_field_map.c @@ -46,7 +46,7 @@ UNUSED static void DebugMapViewer(void) sub_8099648(); sub_809975C(); sub_809D0AC(); - sub_8014144(); + ResetDialogueBox(); sub_8005838(NULL, 0); AllocGroundMapAction(); while (1) { diff --git a/src/dungeon_message.c b/src/dungeon_message.c index b799c9050..215246db0 100644 --- a/src/dungeon_message.c +++ b/src/dungeon_message.c @@ -234,7 +234,7 @@ void xxx_draw_string_80524F0(void) const u8 *txtPtr = strPtr->unk0[id]; sp.x = 4; - sp.unk2 = strPtr->unk1C066; + sp.y = strPtr->unk1C066; sp.unk10 = 7; sub_80073B8(0); if (strPtr->unk1C054[id] != 0 && strPtr->unk1C066 >= 8) { @@ -250,7 +250,7 @@ void xxx_draw_string_80524F0(void) sp.x += 6; } else { - sp.x += DrawCharOnWindow(sp.x, sp.unk2, currChr, sp.unk10, 0); + sp.x += DrawCharOnWindow(sp.x, sp.y, currChr, sp.unk10, 0); } } sub_80073E0(0); diff --git a/src/ground_main.c b/src/ground_main.c index b94e21bd9..c2f1926ab 100644 --- a/src/ground_main.c +++ b/src/ground_main.c @@ -64,7 +64,6 @@ extern u16 gUnknown_2026E4E; extern void GroundSprite_Reset(s32); extern s16 sub_8098FCC(u32 unused); extern s16 sub_80A2654(s16 r0); -extern void sub_809A71C(s32); extern bool8 sub_809AFAC(void); extern bool8 sub_80048BC(void); extern u8 sub_80023E4(u32); @@ -206,7 +205,7 @@ u32 xxx_script_related_8098468(s32 param_1) gUnknown_20398C4 = -1; r7 = -1; while (gUnknown_20398A8 - 1 <= 1) { - sub_809A71C(-1); + SetAutoPressTextboxFrames(-1); ScriptClearTextbox(); sub_809977C(); switch (gUnknown_20398B4) { diff --git a/src/ground_script.c b/src/ground_script.c index 21167ec51..7bf4d8706 100644 --- a/src/ground_script.c +++ b/src/ground_script.c @@ -83,7 +83,6 @@ void sub_80973A8(s16, bool8); void sub_80975A8(s16, bool8); u32 sub_809A6E4(); u32 sub_809A6F8(); -u32 sub_809A738(); u32 sub_809A768(); u32 sub_809AC7C(); u32 sub_809ADD8(); @@ -1845,7 +1844,7 @@ s32 ExecuteScriptCommand(Action *action) break; } case 0x2b: { - sub_809A738(curCmd.arg1, curCmd.arg2); + SetAutoPressTextboxMidEndMsgFrames(curCmd.arg1, curCmd.arg2); break; } case 0x2c: { diff --git a/src/main_loops.c b/src/main_loops.c index e724f68f8..d2fcdd9e7 100644 --- a/src/main_loops.c +++ b/src/main_loops.c @@ -132,7 +132,7 @@ void GameLoop(void) NDS_DebugInit(); ResetSoundEffectCounters(); NDS_LoadOverlay_GroundMain(); - sub_8014144(); + ResetDialogueBox(); LoadMonsterParameters(); sub_8097670(); InitializePlayTime(); @@ -356,7 +356,7 @@ static void QuickSave_Async(u32 mode) saveStatus = 0; counter = 0; UpdateFadeInTile(0); - sub_8014144(); + ResetDialogueBox(); InitFontPalette(); sub_800CDA8(2); sub_80095CC(0, 20); @@ -467,7 +467,7 @@ static void sub_80008C0_Async(u32 errorKind) s32 counter = 0; UpdateFadeInTile(0); - sub_8014144(); + ResetDialogueBox(); InitFontPalette(); sub_800CDA8(2); sub_80095CC(0, 20); @@ -888,7 +888,7 @@ static void LoadAndRunQuickSaveDungeon_Async(DungeonSetupStruct *setupStr) sUnknown_203B03C = 1; sub_800A8F8(3); - sub_8014144(); + ResetDialogueBox(); sub_8043D50(&local_1c, &dungeonStructSize); setupStr->info.unk74 = MemoryAlloc(local_1c, 7); // size: 0x4800 diff --git a/src/string_format.c b/src/string_format.c index 51e391adb..bc9bf48cf 100644 --- a/src/string_format.c +++ b/src/string_format.c @@ -83,14 +83,14 @@ static EWRAM_DATA SpriteOAM sDialogueBoxArrowSprite = {0}; // 't' - team name. This buffer seems wastefully large, given team name can be max 10(or so) characters. static EWRAM_DATA u8 sFormatBuffer_TeamName[FORMAT_BUFFER_LEN] = {0}; -static EWRAM_DATA s32 gUnknown_202E738 = 0; -static EWRAM_DATA s32 gUnknown_202E73C = 0; -static EWRAM_DATA s32 gUnknown_202E740 = 0; +static EWRAM_DATA s32 sAutoPressNewTextboxFrames = 0; +static EWRAM_DATA s32 sAutoPressMidTextboxFrames = 0; +static EWRAM_DATA s32 sAutoPressFramesEndMsg = 0; static EWRAM_DATA s32 sPrintStringState = 0; static EWRAM_DATA UnkDrawStringStruct sTextPrintStruct = {0}; static EWRAM_DATA u16 sStringFormatFlags = 0; -static EWRAM_DATA s32 gUnknown_202E780 = 0; -static EWRAM_DATA s32 gUnknown_202E784 = 0; +static EWRAM_DATA s32 sAutoPressFrames = 0; +static EWRAM_DATA s32 sDialoguePrintFrames = 0; static EWRAM_DATA s32 sTextPrintSpeed = 0; static EWRAM_DATA s32 sFramesBetweenCharPrints = 0; static EWRAM_DATA bool8 sInstantText = FALSE; @@ -144,25 +144,40 @@ static EWRAM_INIT WindowTemplates sUnknown_203B198 = { } }; -void sub_8014144(void) +enum { - sPrintStringState = 0; - gUnknown_202E738 = 60; - gUnknown_202E73C = 60; - gUnknown_202E740 = 0; + STATE_FINISHED, + STATE_PRINT_CHAR, + STATE_PRINT_CHAR_SOUND_WAIT, + STATE_PRINT_FINISHED_MENU, + STATE_4, + STATE_5, + STATE_PRINT_FINISHED, + // These 3 are the same + STATE_WAIT_FOR_BUTTON_MID_TEXTBOX, + STATE_WAIT_FOR_BUTTON_NEW_TEXTBOX, + STATE_WAIT_FOR_BUTTON_PRESS_END_MSG, +}; + +void ResetDialogueBox(void) +{ + sPrintStringState = STATE_FINISHED; + sAutoPressNewTextboxFrames = 60; + sAutoPressMidTextboxFrames = 60; + sAutoPressFramesEndMsg = 0; } -void sub_801416C(s32 param_1,s32 param_2) +void SetDialogueBoxAutoPressFrames(s32 endMsgFrames, s32 midMsgFrames) { - if (param_1 < -1) { - gUnknown_202E738 = param_2; - gUnknown_202E740 = -param_1; + if (endMsgFrames < -1) { + sAutoPressNewTextboxFrames = midMsgFrames; + sAutoPressFramesEndMsg = -endMsgFrames; } else { - gUnknown_202E738 = param_1; - gUnknown_202E740 = 0; + sAutoPressNewTextboxFrames = endMsgFrames; + sAutoPressFramesEndMsg = 0; } - gUnknown_202E73C = (param_2 < 0 ) ? 0 : param_2; + sAutoPressMidTextboxFrames = (midMsgFrames < 0 ) ? 0 : midMsgFrames; } void CreateDialogueBoxAndPortrait(const u8 *text, void *param_2, MonPortraitMsg *monPortraitPtr, u16 flags) @@ -180,12 +195,9 @@ void CreateYesNoDialogueBoxAndPortrait_DefaultNo(const u8 *text, MonPortraitMsg CreateMenuDialogueBoxAndPortrait(text, NULL, -1, sYesNoMenuItems_DefaultNo, NULL, 3, 0, monPortraitPtr, flags | 0x300); } -enum -{ - STATE_FINISHED, - STATE_PRINT_CHAR, - STATE_PRINT_CHAR_SOUND_WAIT, -}; +#define TEXTBOX_LINE_HEIGHT 11 +#define TEXTBOX_HEIGHT ((TEXTBOX_LINE_HEIGHT * 3) + 1) +#define TEXTBOX_OUT_OF_SPACE(y)(y > TEXTBOX_HEIGHT) // arm9.bin::0201D700 void CreateMenuDialogueBoxAndPortrait(const u8 *text, void *a1, u32 r9, const MenuItem *menuItems, void *arg_0, u32 a5, u32 unknownUnused, MonPortraitMsg *monPortraitPtr, u16 flags) @@ -237,12 +249,12 @@ void CreateMenuDialogueBoxAndPortrait(const u8 *text, void *a1, u32 r9, const Me ResetUnusedInputStruct(); ShowWindows(&sUnknown_203B198, TRUE, TRUE); sTextPrintStruct.x = 4; - sTextPrintStruct.unk2 = 4; + sTextPrintStruct.y = 4; sTextPrintStruct.unk8 = 0x70; - sTextPrintStruct.unkA = (gWindows[0].y * 8) + 34; + sTextPrintStruct.unkA = (gWindows[0].y * 8) + TEXTBOX_HEIGHT; sTextPrintStruct.unk10 = 7; sTextPrintStruct.unk1C = 0; - sTextPrintStruct.unk20 = 0; + sTextPrintStruct.waitButtonPress = 0; SetCharacterMask((flags & 0x10) ? 8 : 3); sPrintStringState = 1; sStringFormatFlags = flags; @@ -260,7 +272,7 @@ void CreateMenuDialogueBoxAndPortrait(const u8 *text, void *a1, u32 r9, const Me sFramesBetweenCharPrints = 1; UnpressButtons(); sArrowFrames = 0; - gUnknown_202E784 = 0; + sDialoguePrintFrames = 0; if (portraitOn) { const u8 *data = monPortraitPtr->faceData->sprites[monPortraitPtr->spriteId].gfx; @@ -294,7 +306,7 @@ void DrawDialogueBoxString(void) { bool8 keepLooping = TRUE; - gUnknown_202E784++; + sDialoguePrintFrames++; while (keepLooping) { switch (sPrintStringState) { case STATE_FINISHED: { @@ -315,17 +327,17 @@ void DrawDialogueBoxString(void) sub_80073B8(0); while (txtSpeed > 0) { str = HandleSpecialCharFormat(str, &sTextPrintStruct); - if (sTextPrintStruct.unk21 != 0) { + if (sTextPrintStruct.waitFrames) { break; } - if (sTextPrintStruct.unk20 != 0) { - if (sTextPrintStruct.unk2 > 34) { - sPrintStringState = 8; - gUnknown_202E780 = gUnknown_202E738; + if (sTextPrintStruct.waitButtonPress) { + if (TEXTBOX_OUT_OF_SPACE(sTextPrintStruct.y)) { + sPrintStringState = STATE_WAIT_FOR_BUTTON_NEW_TEXTBOX; + sAutoPressFrames = sAutoPressNewTextboxFrames; } else { - sPrintStringState = 7; - gUnknown_202E780 = gUnknown_202E73C; + sPrintStringState = STATE_WAIT_FOR_BUTTON_MID_TEXTBOX; + sAutoPressFrames = sAutoPressMidTextboxFrames; } sArrowFrames = 0; break; @@ -336,28 +348,28 @@ void DrawDialogueBoxString(void) if (*str == '\r' || *str == '\n') { sTextPrintStruct.x = 4; - sTextPrintStruct.unk2 += 11; + sTextPrintStruct.y += TEXTBOX_LINE_HEIGHT; str++; } else { u32 chr; str = GetNextCharFromStr(str, &chr); - sTextPrintStruct.x += DrawCharOnWindow(sTextPrintStruct.x, sTextPrintStruct.unk2, chr, sTextPrintStruct.unk10, 0); + sTextPrintStruct.x += DrawCharOnWindow(sTextPrintStruct.x, sTextPrintStruct.y, chr, sTextPrintStruct.unk10, 0); sTextPrintStruct.framesToWait = sFramesBetweenCharPrints; } - if (sTextPrintStruct.unk2 > 34) { + if (TEXTBOX_OUT_OF_SPACE(sTextPrintStruct.y)) { if (!(sStringFormatFlags & 0x10)) { sTextPrintStruct.unk1C = 0; - sTextPrintStruct.unk20 = 1; - sPrintStringState = 8; + sTextPrintStruct.waitButtonPress = TRUE; + sPrintStringState = STATE_WAIT_FOR_BUTTON_NEW_TEXTBOX; sArrowFrames = 0; - gUnknown_202E780 = gUnknown_202E738; + sAutoPressFrames = sAutoPressNewTextboxFrames; break; } else { - sTextPrintStruct.unk2 = 4; + sTextPrintStruct.y = 4; } } txtSpeed--; @@ -367,20 +379,20 @@ void DrawDialogueBoxString(void) ResetTouchScreenMenuInput(&sDialogueMenuTouchScreenInput); if (*sCurrStr == '\0') { if (sDialogueMenuItems != NULL) { - sPrintStringState = 3; + sPrintStringState = STATE_PRINT_FINISHED_MENU; } else { - sPrintStringState = 6; + sPrintStringState = STATE_PRINT_FINISHED; } keepLooping = FALSE; } else { sTextPrintStruct.currFrames = 0; - if (sTextPrintStruct.unk20 != 0) { - if (sPrintStringState == 1) { + if (sTextPrintStruct.waitButtonPress) { + if (sPrintStringState == STATE_PRINT_CHAR) { sPrintStringState = 7; sArrowFrames = 0; - gUnknown_202E780 = gUnknown_202E738; + sAutoPressFrames = sAutoPressNewTextboxFrames; } keepLooping = FALSE; } @@ -403,26 +415,26 @@ void DrawDialogueBoxString(void) if (++sTextPrintStruct.currFrames > sTextPrintStruct.framesToWait) { sPrintStringState = STATE_PRINT_CHAR; - sTextPrintStruct.unk21 = 0; + sTextPrintStruct.waitFrames = FALSE; } else { keepLooping = FALSE; } } break; - case 6: { - if (sStringFormatFlags & 0x100) { - sPrintStringState = 9; + case STATE_PRINT_FINISHED: { + if (sStringFormatFlags & STR_FORMAT_FLAG_WAIT_FOR_BUTTON_PRESS) { + sPrintStringState = STATE_WAIT_FOR_BUTTON_PRESS_END_MSG; sArrowFrames = 0; - if (gUnknown_202E740 > 0) { - gUnknown_202E780 = gUnknown_202E740 - gUnknown_202E784; - if (gUnknown_202E780 < 0) { + if (sAutoPressFramesEndMsg > 0) { + sAutoPressFrames = sAutoPressFramesEndMsg - sDialoguePrintFrames; + if (sAutoPressFrames < 0) { sPrintStringState = 11; - gUnknown_202E780 = 0; + sAutoPressFrames = 0; } } else { - gUnknown_202E780 = gUnknown_202E738; + sAutoPressFrames = sAutoPressNewTextboxFrames; } } else { @@ -430,19 +442,19 @@ void DrawDialogueBoxString(void) } } break; - case 7: - case 8: - case 9: { + case STATE_WAIT_FOR_BUTTON_MID_TEXTBOX: + case STATE_WAIT_FOR_BUTTON_NEW_TEXTBOX: + case STATE_WAIT_FOR_BUTTON_PRESS_END_MSG: { bool8 buttonPress = FALSE; - sTextPrintStruct.unk20 = 0; + sTextPrintStruct.waitButtonPress = 0; GetTouchScreenMenuInput(&sDialogueMenuTouchScreenInput, 0); - if (!(sStringFormatFlags & 1)) { + if (!(sStringFormatFlags & STR_FORMAT_FLAG_WAIT_FOR_BUTTON_PRESS_2)) { buttonPress = TRUE; } else { - if (sStringFormatFlags & 2) { - if (gUnknown_202E780 > 0) { - gUnknown_202E780--; + if (sStringFormatFlags & STR_FORMAT_FLAG_TIMED_AUTO_MSG_CLOSE) { + if (sAutoPressFrames > 0) { + sAutoPressFrames--; } else { buttonPress = TRUE; @@ -461,7 +473,7 @@ void DrawDialogueBoxString(void) if (!buttonPress) { sArrowFrames++; - if (!(sStringFormatFlags & 0x2) && sArrowFrames & 8) { + if (!(sStringFormatFlags & STR_FORMAT_FLAG_TIMED_AUTO_MSG_CLOSE) && sArrowFrames & 8) { SpriteSetAffine1(&sDialogueBoxArrowSprite, 0); SpriteSetAffine2(&sDialogueBoxArrowSprite, 0); SpriteSetObjMode(&sDialogueBoxArrowSprite, 0); @@ -483,7 +495,7 @@ void DrawDialogueBoxString(void) SpriteSetX(&sDialogueBoxArrowSprite, sTextPrintStruct.unk8); } - AddSprite(&sDialogueBoxArrowSprite, 0x100, NULL, NULL); + AddSprite(&sDialogueBoxArrowSprite, 256, NULL, NULL); } } else { @@ -495,8 +507,8 @@ void DrawDialogueBoxString(void) } else if (sPrintStringState == 8) { sTextPrintStruct.x = 4; - if (sTextPrintStruct.unk2 > 34) { - sTextPrintStruct.unk2 = 4; + if (TEXTBOX_OUT_OF_SPACE(sTextPrintStruct.y)) { + sTextPrintStruct.y = 4; if (sStringFormatFlags & 0x10) { CallPrepareTextbox_8008C54(0); sPrintStringState = 1; @@ -519,7 +531,7 @@ void DrawDialogueBoxString(void) } sTextPrintStruct.unk8 = 0x70; - sTextPrintStruct.unkA = (gWindows[0].y * 8) + 34; + sTextPrintStruct.unkA = (gWindows[0].y * 8) + TEXTBOX_HEIGHT; } keepLooping = FALSE; } @@ -537,15 +549,15 @@ void DrawDialogueBoxString(void) if (sStringFormatFlags & 0x200) { ResetUnusedInputStruct(); ShowWindows(NULL, TRUE, TRUE); - sPrintStringState = 0; + sPrintStringState = STATE_FINISHED; } else { - sPrintStringState = 0; + sPrintStringState = STATE_FINISHED; } keepLooping = FALSE; } break; - case 3: { + case STATE_PRINT_FINISHED_MENU: { sub_8014A88(); sPrintStringState = 4; keepLooping = FALSE; diff --git a/src/text_3.c b/src/text_3.c index 12de1f996..3ae2bd48c 100644 --- a/src/text_3.c +++ b/src/text_3.c @@ -174,7 +174,7 @@ static void DrawStringInternal(Window *windows, s32 x, s32 y, const u8 *str, u32 u32 currChr; sp.x = x; - sp.unk2 = y; + sp.y = y; sp.unkC = x; sp.unk10 = 7; while (TRUE) { @@ -194,17 +194,17 @@ static void DrawStringInternal(Window *windows, s32 x, s32 y, const u8 *str, u32 } else if (currChr == '\r' || currChr == '\n') { sp.x = sp.unkC; - sp.unk2 += lineSpacing; + sp.y += lineSpacing; } else if (currChr == '\x1D') { // ASCII group separator. sp.x = sp.unkC; - sp.unk2 += 5; + sp.y += 5; } else if (currChr == '`') { sp.x += 6; } else if (characterSpacing == 0) { - sp.x += DrawCharOnWindowInternal(windows, sp.x, sp.unk2, currChr, sp.unk10, windowId); + sp.x += DrawCharOnWindowInternal(windows, sp.x, sp.y, currChr, sp.unk10, windowId); } else { const unkChar *chrPtr = GetCharacter(currChr); @@ -212,7 +212,7 @@ static void DrawStringInternal(Window *windows, s32 x, s32 y, const u8 *str, u32 s32 x = sp.x; s32 x2 = gCharacterSpacing + 10; x +=((x2 - chrPtr->width) / 2); - DrawCharOnWindowInternal(windows, x, sp.unk2, currChr, sp.unk10, windowId); + DrawCharOnWindowInternal(windows, x, sp.y, currChr, sp.unk10, windowId); sp.x += characterSpacing; } } @@ -265,7 +265,7 @@ static const u8 *HandleCharFormatInternal(Window *windows, const u8 *str, UnkDra if (str[1] == '[') { const u8 *strBefore = str; str += 2; - sp->unk21 = 0; + sp->waitFrames = FALSE; while (*str != '\0') { if (*str == ']') { str++; @@ -279,7 +279,7 @@ static const u8 *HandleCharFormatInternal(Window *windows, const u8 *str, UnkDra str = strNew; } - if (sp->unk21 != 0) + if (sp->waitFrames) break; } else if (str[1] == '=') { @@ -289,7 +289,7 @@ static const u8 *HandleCharFormatInternal(Window *windows, const u8 *str, UnkDra str++; } else if (str[1] == 'y') { - sp->unk2 = str[2]; + sp->y = str[2]; str += 3; if (*str == '.') str++; @@ -303,7 +303,7 @@ static const u8 *HandleCharFormatInternal(Window *windows, const u8 *str, UnkDra } else if (str[1] == 'n') { sp->x = sp->unkC; - sp->unk2 += 11; + sp->y += 11; str += 2; } else if (str[1] == ':') { @@ -351,27 +351,27 @@ static const u8 *HandleCharFormatInternal(Window *windows, const u8 *str, UnkDra else if (str[1] == 'W') { str += 2; sp->unk8 = ((windows[0].x * 8) + sp->x) - 2; - sp->unkA = ((windows[0].y * 8) + sp->unk2) + 3; - sp->unk20 = 1; + sp->unkA = ((windows[0].y * 8) + sp->y) + 3; + sp->waitButtonPress = TRUE; break; } else if (str[1] == 'P') { str += 2; - sp->unk2 = 9999; + sp->y = 9999; sp->unk1C = 0; - sp->unk20 = 1; + sp->waitButtonPress = TRUE; break; } else if (str[1] == 'p') { str += 2; - sp->unk2 = 9999; + sp->y = 9999; sp->unk1C = 1; - sp->unk20 = 1; + sp->waitButtonPress = TRUE; break; } else if (str[1] == '~') { sp->framesToWait = str[2]; - sp->unk21 = 1; + sp->waitFrames = TRUE; str += 3; } else { diff --git a/src/textbox.c b/src/textbox.c index 76e8e8149..34fc0d65a 100644 --- a/src/textbox.c +++ b/src/textbox.c @@ -73,8 +73,8 @@ struct Textbox { // size: 0x5A8 u32 unk0; - u32 unk4; - u32 unk8; + s32 endMsgFrames; + s32 midMsgFrames; struct TextboxText unkC; u32 unk414; const struct unkStruct_3001B64_unk418 *unk418; @@ -213,7 +213,12 @@ void sub_809C414(void); void sub_809C4B0(void); void sub_809C550(void); -#define TEXTBOX_FLAG_INTANT_TEXT 0x20 +#define TEXTBOX_FLAG_UNUSED_x2 0x2 // Unused, but set for almost all flag sets +#define TEXTBOX_FLAG_INSTANT_TEXT 0x20 +// Both need to be set to wait for the player's button press. One flag would be sufficient in my opinion, but what can you do? +#define TEXTBOX_FLAG_WAIT_FOR_BUTTON_PRESS_2 0x40 +#define TEXTBOX_FLAG_WAIT_FOR_BUTTON_PRESS 0x80 + #define TEXTBOX_FLAG_SPEAKER 0x100 // Speaker's name + dialogue sound #define TEXTBOX_FLAG_DIALOGUE_SOUND 0x200 // Only dialogue sound @@ -275,10 +280,10 @@ static const u32 sTextboxTypes[] = static const u16 sFlagSets[] = { - 0x02 | 0x40 | 0x80 | TEXTBOX_FLAG_INTANT_TEXT, - 0x02 | 0x40 | 0x80, - 0x02 | 0x40 | 0x80 | TEXTBOX_FLAG_SPEAKER, - 0x02 | 0x40 | 0x80 | TEXTBOX_FLAG_DIALOGUE_SOUND, + TEXTBOX_FLAG_UNUSED_x2 | TEXTBOX_FLAG_WAIT_FOR_BUTTON_PRESS_2 | TEXTBOX_FLAG_WAIT_FOR_BUTTON_PRESS | TEXTBOX_FLAG_INSTANT_TEXT, + TEXTBOX_FLAG_UNUSED_x2 | TEXTBOX_FLAG_WAIT_FOR_BUTTON_PRESS_2 | TEXTBOX_FLAG_WAIT_FOR_BUTTON_PRESS, + TEXTBOX_FLAG_UNUSED_x2 | TEXTBOX_FLAG_WAIT_FOR_BUTTON_PRESS_2 | TEXTBOX_FLAG_WAIT_FOR_BUTTON_PRESS | TEXTBOX_FLAG_SPEAKER, + TEXTBOX_FLAG_UNUSED_x2 | TEXTBOX_FLAG_WAIT_FOR_BUTTON_PRESS_2 | TEXTBOX_FLAG_WAIT_FOR_BUTTON_PRESS | TEXTBOX_FLAG_DIALOGUE_SOUND, 0x01, // These are effectively unused 0x121, 0x101, 0x10D, 0x105, 0 @@ -300,11 +305,11 @@ static void ResetTextbox(void); void TextboxInit(void) { - sub_8014144(); + ResetDialogueBox(); sTextbox = MemoryAlloc(sizeof(struct Textbox), 6); sTextbox->unk0 = 0; - sTextbox->unk4 = -1; - sTextbox->unk8 = -1; + sTextbox->endMsgFrames = -1; + sTextbox->midMsgFrames = -1; gUnknown_20399DC = 0; gUnknown_20399DE = 0; sub_80095CC(0,0x14); @@ -335,8 +340,8 @@ void sub_809A62C(void) s32 index; sTextbox->unk0 = 0; - sTextbox->unk4 = -1; - sTextbox->unk8 = -1; + sTextbox->endMsgFrames = -1; + sTextbox->midMsgFrames = -1; gUnknown_20399DC = 0; gUnknown_20399DE = 0; for (index = 0; index < MAX_TEXTBOX_PORTRAITS; index++) { @@ -393,18 +398,18 @@ UNUSED static void nullsub_209(void) { } -void sub_809A71C(s32 param_1) +void SetAutoPressTextboxFrames(s32 frames) { - sTextbox->unk4 = param_1; - sTextbox->unk8 = param_1; - sub_801416C(param_1, param_1); + sTextbox->endMsgFrames = frames; + sTextbox->midMsgFrames = frames; + SetDialogueBoxAutoPressFrames(frames, frames); } -void sub_809A738(s32 param_1, s32 param_2) +void SetAutoPressTextboxMidEndMsgFrames(s32 endMsgFrames, s32 midMsgFrames) { - sTextbox->unk4 = param_1; - sTextbox->unk8 = param_2; - sub_801416C(param_1, param_2); + sTextbox->endMsgFrames = endMsgFrames; + sTextbox->midMsgFrames = midMsgFrames; + SetDialogueBoxAutoPressFrames(endMsgFrames, midMsgFrames); } u8 IsTextboxOpen_809A750(void) @@ -889,7 +894,7 @@ void sub_809B028(const MenuItem * menuItems, s32 a1_, s32 a2, s32 a3, s32 a4_, c CreateMenuDialogueBoxAndPortrait(text, sub_809B428, a2, menuItems, 0, 4, 0, GetSpeakerPortrait(a4), ((sFlagSets[a3] & TEXTBOX_FLAG_SPEAKER) ? STR_FORMAT_FLAG_SPEAKER_NAME | STR_FORMAT_FLAG_DIALOGUE_SOUND : 0) | ((sFlagSets[a3] & TEXTBOX_FLAG_DIALOGUE_SOUND) ? STR_FORMAT_FLAG_DIALOGUE_SOUND : 0) - | ((sFlagSets[a3] & 0x20) ? 0x21 : 1)); // What an ugly way to get flags lol + | ((sFlagSets[a3] & TEXTBOX_FLAG_INSTANT_TEXT) ? STR_FORMAT_FLAG_INSTANT_TEXT | STR_FORMAT_FLAG_WAIT_FOR_BUTTON_PRESS_2 : STR_FORMAT_FLAG_WAIT_FOR_BUTTON_PRESS_2)); if (sTextbox->unk424 & 2) { sub_809A6E4(1); @@ -994,11 +999,11 @@ static bool8 ScriptPrintTextInternal(struct TextboxText *textboxText, u32 flags_ | ((flags & TEXTBOX_FLAG_DIALOGUE_SOUND) ? STR_FORMAT_FLAG_DIALOGUE_SOUND : 0) | ((sTextbox->unk0 == 3) ? 0x10 : 0) | ((sTextbox->unk0 == 2) ? 0x10 : 0) - | ((flags & TEXTBOX_FLAG_INTANT_TEXT) ? STR_FORMAT_FLAG_INSTANT_TEXT : 0) - | ((flags & 0x40) ? 0x1 : 0) - | ((flags & 0x80) ? 0x100 : 0) + | ((flags & TEXTBOX_FLAG_INSTANT_TEXT) ? STR_FORMAT_FLAG_INSTANT_TEXT : 0) + | ((flags & TEXTBOX_FLAG_WAIT_FOR_BUTTON_PRESS_2) ? STR_FORMAT_FLAG_WAIT_FOR_BUTTON_PRESS_2 : 0) + | ((flags & TEXTBOX_FLAG_WAIT_FOR_BUTTON_PRESS) ? STR_FORMAT_FLAG_WAIT_FOR_BUTTON_PRESS : 0) | ((flags & 0x4) ? 0x200 : 0) - | ((sTextbox->unk4 != -1) ? 0x2 : 0) + | ((sTextbox->endMsgFrames != -1) ? STR_FORMAT_FLAG_TIMED_AUTO_MSG_CLOSE : 0) ); return TRUE;