From 4c5c88f6627abcb03572c80689609fddcfc6f92e Mon Sep 17 00:00:00 2001
From: Dominicentek <69892109+Dominicentek@users.noreply.github.com>
Date: Mon, 19 Jun 2023 05:04:39 +0200
Subject: [PATCH] Customizable dialogs (#411)
* add customizable dialogs
* remove testing mod
* add HOOK_ON_DIALOG
* Reset dialog overrides in `network_shutdown`
It may have compile errors idk editing code on phone sucks
* typo smh
* copy over the file from original repo so this fork can be synced
* run autogen again
* actually im stupid
---
autogen/convert_functions.py | 8 +-
autogen/lua_definitions/constants.lua | 5 +-
autogen/lua_definitions/functions.lua | 36 +++++
docs/lua/constants.md | 3 +-
docs/lua/functions-3.md | 110 +++++++++++++++
docs/lua/functions.md | 9 ++
docs/lua/guides/hooks.md | 1 +
src/game/ingame_menu.c | 189 +++++++++++++++++++-------
src/game/ingame_menu.h | 19 +++
src/pc/lua/smlua_constants_autogen.c | 5 +-
src/pc/lua/smlua_functions_autogen.c | 109 +++++++++++++++
src/pc/lua/smlua_hooks.h | 2 +
src/pc/network/network.c | 4 +
13 files changed, 442 insertions(+), 58 deletions(-)
diff --git a/autogen/convert_functions.py b/autogen/convert_functions.py
index 0cb464c6..21063559 100644
--- a/autogen/convert_functions.py
+++ b/autogen/convert_functions.py
@@ -60,7 +60,8 @@ in_files = [
"src/pc/utils/misc.h",
"src/game/level_update.h",
"src/game/area.h",
- "src/engine/level_script.h"
+ "src/engine/level_script.h",
+ "src/game/ingame_menu.h"
]
override_allowed_functions = {
@@ -74,7 +75,8 @@ override_allowed_functions = {
"src/pc/utils/misc.h": [ "update_all_mario_stars" ],
"src/game/level_update.h": [ "level_trigger_warp", "get_painting_warp_node", "initiate_painting_warp" ],
"src/game/area.h": [ "area_get_warp_node" ],
- "src/engine/level_script.h": [ "area_create_warp_node" ]
+ "src/engine/level_script.h": [ "area_create_warp_node" ],
+ "src/game/ingame_menu.h": [ "set_min_dialog_width", "set_dialog_override_pos", "reset_dialog_override_pos", "set_dialog_override_color", "reset_dialog_override_color" ]
}
override_disallowed_functions = {
@@ -107,7 +109,7 @@ override_disallowed_functions = {
"src/pc/djui/djui_hud_utils.h": [ "djui_hud_render_texture", "djui_hud_render_texture_raw", "djui_hud_render_texture_tile", "djui_hud_render_texture_tile_raw" ],
"src/pc/lua/utils/smlua_level_utils.h": [ "smlua_level_util_reset" ],
"src/pc/lua/utils/smlua_anim_utils.h": [ "smlua_anim_util_reset", "smlua_anim_util_register_animation" ],
- "src/pc/network/lag_compensation.h": [ "lag_compensation_clear", "lag_compensation_store" ],
+ "src/pc/network/lag_compensation.h": [ "lag_compensation_clear", "lag_compensation_store" ]
}
override_hide_functions = {
diff --git a/autogen/lua_definitions/constants.lua b/autogen/lua_definitions/constants.lua
index 151392ff..02423677 100644
--- a/autogen/lua_definitions/constants.lua
+++ b/autogen/lua_definitions/constants.lua
@@ -8274,7 +8274,10 @@ HOOK_JOINED_GAME = 31
HOOK_ON_OBJECT_ANIM_UPDATE = 32
--- @type LuaHookedEventType
-HOOK_MAX = 33
+HOOK_ON_DIALOG = 33
+
+--- @type LuaHookedEventType
+HOOK_MAX = 34
--- @class HudDisplayFlags
diff --git a/autogen/lua_definitions/functions.lua b/autogen/lua_definitions/functions.lua
index a562558b..144c7803 100644
--- a/autogen/lua_definitions/functions.lua
+++ b/autogen/lua_definitions/functions.lua
@@ -3953,6 +3953,42 @@ function stop_sounds_in_continuous_banks()
-- ...
end
+--- @return nil
+function reset_dialog_override_color()
+ -- ...
+end
+
+--- @return nil
+function reset_dialog_override_pos()
+ -- ...
+end
+
+--- @param bgR integer
+--- @param bgG integer
+--- @param bgB integer
+--- @param bgA integer
+--- @param textR integer
+--- @param textG integer
+--- @param textB integer
+--- @param textA integer
+--- @return nil
+function set_dialog_override_color(bgR, bgG, bgB, bgA, textR, textG, textB, textA)
+ -- ...
+end
+
+--- @param x integer
+--- @param y integer
+--- @return nil
+function set_dialog_override_pos(x, y)
+ -- ...
+end
+
+--- @param width integer
+--- @return nil
+function set_min_dialog_width(width)
+ -- ...
+end
+
--- @param m MarioState
--- @param o Object
--- @return integer
diff --git a/docs/lua/constants.md b/docs/lua/constants.md
index 83f365d1..b8ee6824 100644
--- a/docs/lua/constants.md
+++ b/docs/lua/constants.md
@@ -2955,7 +2955,8 @@
| HOOK_BEFORE_SET_MARIO_ACTION | 30 |
| HOOK_JOINED_GAME | 31 |
| HOOK_ON_OBJECT_ANIM_UPDATE | 32 |
-| HOOK_MAX | 33 |
+| HOOK_ON_DIALOG | 33 |
+| HOOK_MAX | 34 |
[:arrow_up_small:](#)
diff --git a/docs/lua/functions-3.md b/docs/lua/functions-3.md
index 1746f890..f33d3006 100644
--- a/docs/lua/functions-3.md
+++ b/docs/lua/functions-3.md
@@ -3107,6 +3107,116 @@
+---
+# functions from ingame_menu.h
+
+
+
+
+## [reset_dialog_override_color](#reset_dialog_override_color)
+
+### Lua Example
+`reset_dialog_override_color()`
+
+### Parameters
+- None
+
+### Returns
+- None
+
+### C Prototype
+`void reset_dialog_override_color();`
+
+[:arrow_up_small:](#)
+
+
+
+## [reset_dialog_override_pos](#reset_dialog_override_pos)
+
+### Lua Example
+`reset_dialog_override_pos()`
+
+### Parameters
+- None
+
+### Returns
+- None
+
+### C Prototype
+`void reset_dialog_override_pos();`
+
+[:arrow_up_small:](#)
+
+
+
+## [set_dialog_override_color](#set_dialog_override_color)
+
+### Lua Example
+`set_dialog_override_color(bgR, bgG, bgB, bgA, textR, textG, textB, textA)`
+
+### Parameters
+| Field | Type |
+| ----- | ---- |
+| bgR | `integer` |
+| bgG | `integer` |
+| bgB | `integer` |
+| bgA | `integer` |
+| textR | `integer` |
+| textG | `integer` |
+| textB | `integer` |
+| textA | `integer` |
+
+### Returns
+- None
+
+### C Prototype
+`void set_dialog_override_color(u8 bgR, u8 bgG, u8 bgB, u8 bgA, u8 textR, u8 textG, u8 textB, u8 textA);`
+
+[:arrow_up_small:](#)
+
+
+
+## [set_dialog_override_pos](#set_dialog_override_pos)
+
+### Lua Example
+`set_dialog_override_pos(x, y)`
+
+### Parameters
+| Field | Type |
+| ----- | ---- |
+| x | `integer` |
+| y | `integer` |
+
+### Returns
+- None
+
+### C Prototype
+`void set_dialog_override_pos(s16 x, s16 y);`
+
+[:arrow_up_small:](#)
+
+
+
+## [set_min_dialog_width](#set_min_dialog_width)
+
+### Lua Example
+`set_min_dialog_width(width)`
+
+### Parameters
+| Field | Type |
+| ----- | ---- |
+| width | `integer` |
+
+### Returns
+- None
+
+### C Prototype
+`void set_min_dialog_width(s16 width);`
+
+[:arrow_up_small:](#)
+
+
+
---
# functions from interaction.h
diff --git a/docs/lua/functions.md b/docs/lua/functions.md
index cbff5959..770caa34 100644
--- a/docs/lua/functions.md
+++ b/docs/lua/functions.md
@@ -779,6 +779,15 @@
+- ingame_menu.h
+ - [reset_dialog_override_color](functions-3.md#reset_dialog_override_color)
+ - [reset_dialog_override_pos](functions-3.md#reset_dialog_override_pos)
+ - [set_dialog_override_color](functions-3.md#set_dialog_override_color)
+ - [set_dialog_override_pos](functions-3.md#set_dialog_override_pos)
+ - [set_min_dialog_width](functions-3.md#set_min_dialog_width)
+
+
+
- interaction.h
- [determine_interaction](functions-3.md#determine_interaction)
- [does_mario_have_normal_cap_on_head](functions-3.md#does_mario_have_normal_cap_on_head)
diff --git a/docs/lua/guides/hooks.md b/docs/lua/guides/hooks.md
index 7f8eca33..22198c86 100644
--- a/docs/lua/guides/hooks.md
+++ b/docs/lua/guides/hooks.md
@@ -120,6 +120,7 @@ The lua functions sent to `hook_event()` will be automatically called by SM64 wh
| HOOK_JOINED_GAME | Called when the local player finishes the join process (if the player isn't the host) | None |
| HOOK_BEFORE_SET_MARIO_ACTION | Called before Mario's action changes. Return an action to change the incoming action or `1` to cancel the action change. | [MarioState](structs.md#MarioState) mario, `integer` incomingAction |
| HOOK_ON_OBJECT_ANIM_UPDATE | Called when an object's animation is updated. | [Object](structs.md#Object) objNode |
+| HOOK_ON_DIALOG | Called when a dialog appears. Return `false` to prevent it from appearing. | `integer` dialogId |
### Parameters
diff --git a/src/game/ingame_menu.c b/src/game/ingame_menu.c
index 09b43e0c..79a63755 100644
--- a/src/game/ingame_menu.c
+++ b/src/game/ingame_menu.c
@@ -34,6 +34,8 @@
#include "pc/utils/misc.h"
#include "data/dynos_mgr_builtin_externs.h"
#include "hud.h"
+#include "pc/lua/smlua_hooks.h"
+#include "game/camera.h"
#ifdef BETTERCAMERA
#include "bettercamera.h"
#endif
@@ -48,6 +50,19 @@ s16 gDialogY; // D_8032F69C
#endif
s16 gCutsceneMsgXOffset;
s16 gCutsceneMsgYOffset;
+s16 gDialogMinWidth = 0;
+s16 gDialogOverrideX = 0;
+s16 gDialogOverrideY = 0;
+u8 gOverrideDialogPos = 0;
+u8 gOverrideDialogColor = 0;
+u8 gDialogBgColorR = 0;
+u8 gDialogBgColorG = 0;
+u8 gDialogBgColorB = 0;
+u8 gDialogBgColorA = 0;
+u8 gDialogTextColorR = 0;
+u8 gDialogTextColorG = 0;
+u8 gDialogTextColorB = 0;
+u8 gDialogTextColorA = 0;
extern u8 gLastCompletedCourseNum;
extern u8 gLastCompletedStarNum;
@@ -1094,7 +1109,66 @@ s16 get_dialog_id(void) {
return gDialogID;
}
+void handle_special_dialog_text(s16 dialogID) { // dialog ID tables, in order
+ // King Bob-omb (Start), Whomp (Start), King Bob-omb (throw him out), Eyerock (Start), Wiggler (Start)
+ s16 dialogBossStart[] = { 17, 114, 128, 117, 150 };
+ // Koopa the Quick (BOB), Koopa the Quick (THI), Penguin Race, Fat Penguin Race (120 stars)
+ s16 dialogRaceSound[] = { 5, 9, 55, 164 };
+ // Red Switch, Green Switch, Blue Switch, 100 coins star, Bowser Red Coin Star
+ s16 dialogStarSound[] = { 10, 11, 12, 13, 14 };
+ // King Bob-omb (Start), Whomp (Defeated), King Bob-omb (Defeated, missing in JP), Eyerock (Defeated), Wiggler (Defeated)
+#if BUGFIX_KING_BOB_OMB_FADE_MUSIC
+ s16 dialogBossStop[] = { 17, 115, 116, 118, 152 };
+#else
+ //! @bug JP misses King Bob-omb defeated dialog "116", meaning that the boss music will still
+ //! play after King Bob-omb is defeated until BOB loads it's music after the star cutscene
+ s16 dialogBossStop[] = { 17, 115, 118, 152 };
+#endif
+ s16 i;
+
+ for (i = 0; i < (s16) ARRAY_COUNT(dialogBossStart); i++) {
+ if (dialogBossStart[i] == dialogID) {
+ seq_player_unlower_volume(SEQ_PLAYER_LEVEL, 60);
+ play_music(SEQ_PLAYER_LEVEL, SEQUENCE_ARGS(4, SEQ_EVENT_BOSS), 0);
+ return;
+ }
+ }
+
+ for (i = 0; i < (s16) ARRAY_COUNT(dialogRaceSound); i++) {
+ if (dialogRaceSound[i] == dialogID && gDialogLineNum == 1) {
+ play_race_fanfare();
+ return;
+ }
+ }
+
+ for (i = 0; i < (s16) ARRAY_COUNT(dialogStarSound); i++) {
+ if (dialogStarSound[i] == dialogID && gDialogLineNum == 1) {
+ play_sound(SOUND_MENU_STAR_SOUND, gGlobalSoundSource);
+ return;
+ }
+ }
+
+ for (i = 0; i < (s16) ARRAY_COUNT(dialogBossStop); i++) {
+ if (dialogBossStop[i] == dialogID) {
+ seq_player_fade_out(SEQ_PLAYER_LEVEL, 1);
+ return;
+ }
+ }
+}
+
+bool handle_dialog_hook(s16 dialogId) {
+ bool open = false;
+ smlua_call_event_hooks_int_params_ret_bool(HOOK_ON_DIALOG, dialogId, &open);
+ if (!open) {
+ gDialogLineNum = 1;
+ gDialogBoxState = DIALOG_STATE_CLOSING;
+ gDialogBoxOpenTimer = 20;
+ handle_special_dialog_text(dialogId);
+ }
+}
+
void create_dialog_box(s16 dialog) {
+ handle_dialog_hook(dialog);
if (gDialogID == -1) {
gDialogID = dialog;
gDialogBoxType = DIALOG_TYPE_ROTATE;
@@ -1102,6 +1176,7 @@ void create_dialog_box(s16 dialog) {
}
void create_dialog_box_with_var(s16 dialog, s32 dialogVar) {
+ handle_dialog_hook(dialog);
if (gDialogID == -1) {
gDialogID = dialog;
gDialogVariable = dialogVar;
@@ -1110,6 +1185,7 @@ void create_dialog_box_with_var(s16 dialog, s32 dialogVar) {
}
void create_dialog_inverted_box(s16 dialog) {
+ handle_dialog_hook(dialog);
if (gDialogID == -1) {
gDialogID = dialog;
gDialogBoxType = DIALOG_TYPE_ZOOM;
@@ -1117,6 +1193,7 @@ void create_dialog_inverted_box(s16 dialog) {
}
void create_dialog_box_with_response(s16 dialog) {
+ handle_dialog_hook(dialog);
if (gDialogID == -1) {
gDialogID = dialog;
gDialogBoxType = DIALOG_TYPE_ROTATE;
@@ -1154,7 +1231,12 @@ void reset_dialog_render_state(void) {
void render_dialog_box_type(struct DialogEntry *dialog, s8 linesPerBox) {
UNUSED s32 unused;
- create_dl_translation_matrix(MENU_MTX_NOPUSH, dialog->leftOffset, dialog->width, 0);
+ if (gOverrideDialogPos != 0) {
+ create_dl_translation_matrix(MENU_MTX_NOPUSH, gDialogOverrideX - 61, 240 - gDialogOverrideY - 5, 0);
+ }
+ else {
+ create_dl_translation_matrix(MENU_MTX_NOPUSH, dialog->leftOffset, dialog->width, 0);
+ }
switch (gDialogBoxType) {
case DIALOG_TYPE_ROTATE: // Renders a dialog black box with zoom and rotation
@@ -1191,9 +1273,14 @@ void render_dialog_box_type(struct DialogEntry *dialog, s8 linesPerBox) {
gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, 150);
break;
}
+ if (gOverrideDialogColor) {
+ gDPSetEnvColor(gDisplayListHead++, gDialogBgColorR, gDialogBgColorG, gDialogBgColorB, gDialogBgColorA);
+ }
+ f32 dialogWidth = 130 * 1.1f;
+ if (dialogWidth < gDialogMinWidth) dialogWidth = gDialogMinWidth;
create_dl_translation_matrix(MENU_MTX_PUSH, X_VAL1, Y_VAL1, 0);
- create_dl_scale_matrix(MENU_MTX_NOPUSH, 1.1f, ((f32) linesPerBox / Y_VAL2) + 0.1, 1.0f);
+ create_dl_scale_matrix(MENU_MTX_NOPUSH, dialogWidth / 130, ((f32) linesPerBox / Y_VAL2) + 0.1, 1.0f);
gSPDisplayList(gDisplayListHead++, dl_draw_text_bg_box);
gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);
@@ -1222,6 +1309,9 @@ void change_and_flash_dialog_text_color_lines(s8 colorMode, s8 lineNum) {
break;
}
}
+ if (gOverrideDialogColor) {
+ gDPSetEnvColor(gDisplayListHead++, gDialogTextColorR, gDialogTextColorG, gDialogTextColorB, gDialogTextColorA)
+ }
}
#ifdef VERSION_EU
@@ -1720,6 +1810,9 @@ void render_dialog_triangle_choice(void) {
} else {
gDPSetEnvColor(gDisplayListHead++, 0, 0, 0, 255);
}
+ if (gOverrideDialogColor) {
+ gDPSetEnvColor(gDisplayListHead++, gDialogTextColorR, gDialogTextColorG, gDialogTextColorB, gDialogTextColorA);
+ }
gSPDisplayList(gDisplayListHead++, dl_draw_triangle);
}
@@ -1748,7 +1841,10 @@ void render_dialog_string_color(s8 linesPerBox) {
return;
}
- create_dl_translation_matrix(MENU_MTX_PUSH, X_VAL5, (linesPerBox * Y_VAL5_1) + Y_VAL5_2, 0);
+ f32 triangleOffset = gDialogMinWidth - 143;
+ if (triangleOffset < 0) triangleOffset = 0;
+
+ create_dl_translation_matrix(MENU_MTX_PUSH, X_VAL5 + triangleOffset, (linesPerBox * Y_VAL5_1) + Y_VAL5_2, 0);
create_dl_scale_matrix(MENU_MTX_NOPUSH, X_Y_VAL6, X_Y_VAL6, 1.0f);
create_dl_rotation_matrix(MENU_MTX_NOPUSH, -DEFAULT_DIALOG_BOX_ANGLE, 0, 0, 1.0f);
@@ -1757,58 +1853,14 @@ void render_dialog_string_color(s8 linesPerBox) {
} else { // Black Text
gDPSetEnvColor(gDisplayListHead++, 0, 0, 0, 255);
}
+ if (gOverrideDialogColor) {
+ gDPSetEnvColor(gDisplayListHead++, gDialogTextColorR, gDialogTextColorG, gDialogTextColorB, gDialogTextColorA);
+ }
gSPDisplayList(gDisplayListHead++, dl_draw_triangle);
gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);
}
-void handle_special_dialog_text(s16 dialogID) { // dialog ID tables, in order
- // King Bob-omb (Start), Whomp (Start), King Bob-omb (throw him out), Eyerock (Start), Wiggler (Start)
- s16 dialogBossStart[] = { 17, 114, 128, 117, 150 };
- // Koopa the Quick (BOB), Koopa the Quick (THI), Penguin Race, Fat Penguin Race (120 stars)
- s16 dialogRaceSound[] = { 5, 9, 55, 164 };
- // Red Switch, Green Switch, Blue Switch, 100 coins star, Bowser Red Coin Star
- s16 dialogStarSound[] = { 10, 11, 12, 13, 14 };
- // King Bob-omb (Start), Whomp (Defeated), King Bob-omb (Defeated, missing in JP), Eyerock (Defeated), Wiggler (Defeated)
-#if BUGFIX_KING_BOB_OMB_FADE_MUSIC
- s16 dialogBossStop[] = { 17, 115, 116, 118, 152 };
-#else
- //! @bug JP misses King Bob-omb defeated dialog "116", meaning that the boss music will still
- //! play after King Bob-omb is defeated until BOB loads it's music after the star cutscene
- s16 dialogBossStop[] = { 17, 115, 118, 152 };
-#endif
- s16 i;
-
- for (i = 0; i < (s16) ARRAY_COUNT(dialogBossStart); i++) {
- if (dialogBossStart[i] == dialogID) {
- seq_player_unlower_volume(SEQ_PLAYER_LEVEL, 60);
- play_music(SEQ_PLAYER_LEVEL, SEQUENCE_ARGS(4, SEQ_EVENT_BOSS), 0);
- return;
- }
- }
-
- for (i = 0; i < (s16) ARRAY_COUNT(dialogRaceSound); i++) {
- if (dialogRaceSound[i] == dialogID && gDialogLineNum == 1) {
- play_race_fanfare();
- return;
- }
- }
-
- for (i = 0; i < (s16) ARRAY_COUNT(dialogStarSound); i++) {
- if (dialogStarSound[i] == dialogID && gDialogLineNum == 1) {
- play_sound(SOUND_MENU_STAR_SOUND, gGlobalSoundSource);
- return;
- }
- }
-
- for (i = 0; i < (s16) ARRAY_COUNT(dialogBossStop); i++) {
- if (dialogBossStop[i] == dialogID) {
- seq_player_fade_out(SEQ_PLAYER_LEVEL, 1);
- return;
- }
- }
-}
-
s16 gMenuMode = -1;
u8 gEndCutsceneStrEn0[] = { TEXT_FILE_MARIO_EXCLAMATION };
@@ -2039,10 +2091,15 @@ void render_dialog_entries(void) {
#else
u32 scissorHeight = ensure_nonnegative(240 + ((dialog->linesPerBox * 80) / DIAG_VAL4) - dialog->width);
#endif
+ u32 scissorY = ensure_nonnegative(DIAG_VAL2 - dialog->width);
+ if (gOverrideDialogPos) {
+ scissorHeight = ensure_nonnegative(((dialog->linesPerBox * 80) / DIAG_VAL4) + gDialogOverrideY + 5);
+ scissorY = ensure_nonnegative(gDialogOverrideY + 5);
+ }
gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE,
0,
- ensure_nonnegative(DIAG_VAL2 - dialog->width),
+ scissorY,
SCREEN_WIDTH,
scissorHeight);
#if defined(VERSION_JP)
@@ -3582,3 +3639,33 @@ s16 render_menus_and_dialogs(void) {
}
return mode;
}
+
+void set_min_dialog_width(s16 width) {
+ gDialogMinWidth = width;
+}
+
+void set_dialog_override_pos(s16 x, s16 y) {
+ gOverrideDialogPos = 1;
+ gDialogOverrideX = x;
+ gDialogOverrideY = y;
+}
+
+void reset_dialog_override_pos() {
+ gOverrideDialogPos = 0;
+}
+
+void set_dialog_override_color(u8 bgR, u8 bgG, u8 bgB, u8 bgA, u8 textR, u8 textG, u8 textB, u8 textA) {
+ gOverrideDialogColor = 1;
+ gDialogBgColorR = bgR;
+ gDialogBgColorG = bgG;
+ gDialogBgColorB = bgB;
+ gDialogBgColorA = bgA;
+ gDialogTextColorR = textR;
+ gDialogTextColorG = textG;
+ gDialogTextColorB = textB;
+ gDialogTextColorA = textA;
+}
+
+void reset_dialog_override_color() {
+ gOverrideDialogColor = 0;
+}
\ No newline at end of file
diff --git a/src/game/ingame_menu.h b/src/game/ingame_menu.h
index 05185add..b4a55a78 100644
--- a/src/game/ingame_menu.h
+++ b/src/game/ingame_menu.h
@@ -115,6 +115,20 @@ extern s32 gDialogVariable;
extern u16 gDialogTextAlpha;
extern s16 gCutsceneMsgXOffset;
extern s16 gCutsceneMsgYOffset;
+extern s16 gDialogMinWidth;
+extern s16 gDialogMinHeight;
+extern s16 gDialogOverrideX;
+extern s16 gDialogOverrideY;
+extern u8 gOverrideDialogPos;
+extern u8 gOverrideDialogColor;
+extern u8 gDialogBgColorR;
+extern u8 gDialogBgColorG;
+extern u8 gDialogBgColorB;
+extern u8 gDialogBgColorA;
+extern u8 gDialogTextColorR;
+extern u8 gDialogTextColorG;
+extern u8 gDialogTextColorB;
+extern u8 gDialogTextColorA;
void create_dl_identity_matrix(void);
void create_dl_translation_matrix(s8 pushOp, f32 x, f32 y, f32 z);
@@ -160,5 +174,10 @@ void render_hud_cannon_reticle(void);
void reset_red_coins_collected(void);
s16 render_menus_and_dialogs(void);
void create_dl_scale_matrix(s8 pushOp, f32 x, f32 y, f32 z);
+void set_min_dialog_width(s16 width);
+void set_dialog_override_pos(s16 x, s16 y);
+void reset_dialog_override_pos();
+void set_dialog_override_color(u8 bgR, u8 bgG, u8 bgB, u8 bgA, u8 textR, u8 textG, u8 textB, u8 textA);
+void reset_dialog_override_color();
#endif // INGAME_MENU_H
diff --git a/src/pc/lua/smlua_constants_autogen.c b/src/pc/lua/smlua_constants_autogen.c
index 1267ccd7..edf9f614 100644
--- a/src/pc/lua/smlua_constants_autogen.c
+++ b/src/pc/lua/smlua_constants_autogen.c
@@ -2934,7 +2934,8 @@ char gSmluaConstants[] = ""
"HOOK_BEFORE_SET_MARIO_ACTION = 30\n"
"HOOK_JOINED_GAME = 31\n"
"HOOK_ON_OBJECT_ANIM_UPDATE = 32\n"
-"HOOK_MAX = 33\n"
+"HOOK_ON_DIALOG = 33\n"
+"HOOK_MAX = 34\n"
"ACTION_HOOK_EVERY_FRAME = 0\n"
"ACTION_HOOK_GRAVITY = 1\n"
"ACTION_HOOK_MAX = 2\n"
@@ -4039,4 +4040,4 @@ char gSmluaConstants[] = ""
"VERSION_REGION = 'US'\n"
"MAX_VERSION_LENGTH = 32\n"
"MAX_LOCAL_VERSION_LENGTH = 36\n"
-;
\ No newline at end of file
+;
diff --git a/src/pc/lua/smlua_functions_autogen.c b/src/pc/lua/smlua_functions_autogen.c
index b06acbb3..b1074e56 100644
--- a/src/pc/lua/smlua_functions_autogen.c
+++ b/src/pc/lua/smlua_functions_autogen.c
@@ -40,6 +40,7 @@
#include "src/game/level_update.h"
#include "src/game/area.h"
#include "src/engine/level_script.h"
+#include "src/game/ingame_menu.h"
////////////
@@ -13033,6 +13034,107 @@ int smlua_func_stop_sounds_in_continuous_banks(UNUSED lua_State* L) {
return 1;
}
+ ///////////////////
+ // ingame_menu.h //
+///////////////////
+
+int smlua_func_reset_dialog_override_color(UNUSED lua_State* L) {
+ if (L == NULL) { return 0; }
+
+ int top = lua_gettop(L);
+ if (top != 0) {
+ LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "reset_dialog_override_color", 0, top);
+ return 0;
+ }
+
+
+ reset_dialog_override_color();
+
+ return 1;
+}
+
+int smlua_func_reset_dialog_override_pos(UNUSED lua_State* L) {
+ if (L == NULL) { return 0; }
+
+ int top = lua_gettop(L);
+ if (top != 0) {
+ LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "reset_dialog_override_pos", 0, top);
+ return 0;
+ }
+
+
+ reset_dialog_override_pos();
+
+ return 1;
+}
+
+int smlua_func_set_dialog_override_color(lua_State* L) {
+ if (L == NULL) { return 0; }
+
+ int top = lua_gettop(L);
+ if (top != 8) {
+ LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "set_dialog_override_color", 8, top);
+ return 0;
+ }
+
+ u8 bgR = smlua_to_integer(L, 1);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "set_dialog_override_color"); return 0; }
+ u8 bgG = smlua_to_integer(L, 2);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "set_dialog_override_color"); return 0; }
+ u8 bgB = smlua_to_integer(L, 3);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 3, "set_dialog_override_color"); return 0; }
+ u8 bgA = smlua_to_integer(L, 4);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 4, "set_dialog_override_color"); return 0; }
+ u8 textR = smlua_to_integer(L, 5);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 5, "set_dialog_override_color"); return 0; }
+ u8 textG = smlua_to_integer(L, 6);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 6, "set_dialog_override_color"); return 0; }
+ u8 textB = smlua_to_integer(L, 7);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 7, "set_dialog_override_color"); return 0; }
+ u8 textA = smlua_to_integer(L, 8);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 8, "set_dialog_override_color"); return 0; }
+
+ set_dialog_override_color(bgR, bgG, bgB, bgA, textR, textG, textB, textA);
+
+ return 1;
+}
+
+int smlua_func_set_dialog_override_pos(lua_State* L) {
+ if (L == NULL) { return 0; }
+
+ int top = lua_gettop(L);
+ if (top != 2) {
+ LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "set_dialog_override_pos", 2, top);
+ return 0;
+ }
+
+ s16 x = smlua_to_integer(L, 1);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "set_dialog_override_pos"); return 0; }
+ s16 y = smlua_to_integer(L, 2);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "set_dialog_override_pos"); return 0; }
+
+ set_dialog_override_pos(x, y);
+
+ return 1;
+}
+
+int smlua_func_set_min_dialog_width(lua_State* L) {
+ if (L == NULL) { return 0; }
+
+ int top = lua_gettop(L);
+ if (top != 1) {
+ LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "set_min_dialog_width", 1, top);
+ return 0;
+ }
+
+ s16 width = smlua_to_integer(L, 1);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "set_min_dialog_width"); return 0; }
+
+ set_min_dialog_width(width);
+
+ return 1;
+}
+
///////////////////
// interaction.h //
///////////////////
@@ -31065,6 +31167,13 @@ void smlua_bind_functions_autogen(void) {
smlua_bind_function(L, "stop_sounds_from_source", smlua_func_stop_sounds_from_source);
smlua_bind_function(L, "stop_sounds_in_continuous_banks", smlua_func_stop_sounds_in_continuous_banks);
+ // ingame_menu.h
+ smlua_bind_function(L, "reset_dialog_override_color", smlua_func_reset_dialog_override_color);
+ smlua_bind_function(L, "reset_dialog_override_pos", smlua_func_reset_dialog_override_pos);
+ smlua_bind_function(L, "set_dialog_override_color", smlua_func_set_dialog_override_color);
+ smlua_bind_function(L, "set_dialog_override_pos", smlua_func_set_dialog_override_pos);
+ smlua_bind_function(L, "set_min_dialog_width", smlua_func_set_min_dialog_width);
+
// interaction.h
smlua_bind_function(L, "determine_interaction", smlua_func_determine_interaction);
smlua_bind_function(L, "does_mario_have_normal_cap_on_head", smlua_func_does_mario_have_normal_cap_on_head);
diff --git a/src/pc/lua/smlua_hooks.h b/src/pc/lua/smlua_hooks.h
index f44f9af2..2980b4d3 100644
--- a/src/pc/lua/smlua_hooks.h
+++ b/src/pc/lua/smlua_hooks.h
@@ -44,6 +44,7 @@ enum LuaHookedEventType {
HOOK_BEFORE_SET_MARIO_ACTION,
HOOK_JOINED_GAME,
HOOK_ON_OBJECT_ANIM_UPDATE,
+ HOOK_ON_DIALOG,
HOOK_MAX,
};
@@ -81,6 +82,7 @@ static const char* LuaHookedEventTypeName[] = {
"HOOK_BEFORE_SET_MARIO_ACTION",
"HOOK_JOINED_GAME",
"HOOK_ON_OBJECT_ANIM_UPDATE",
+ "HOOK_ON_DIALOG",
"HOOK_MAX"
};
diff --git a/src/pc/network/network.c b/src/pc/network/network.c
index d2cea507..387c28d8 100644
--- a/src/pc/network/network.c
+++ b/src/pc/network/network.c
@@ -28,6 +28,7 @@
#include "game/object_helpers.h"
#include "game/level_geo.h"
#include "menu/intro_geo.h"
+#include "game/ingame_menu.h"
#ifdef DISCORD_SDK
#include "pc/discord/discord.h"
@@ -652,6 +653,9 @@ void network_shutdown(bool sendLeaving, bool exiting, bool popup, bool reconnect
gMarioStates[0].cap = 0;
extern s16 gTTCSpeedSetting;
gTTCSpeedSetting = 0;
+ gOverrideDialogPos = 0;
+ gOverrideDialogColor = 0;
+ gDialogMinWidth = 0;
struct Controller* cnt = gMarioStates[0].controller;
cnt->rawStickX = 0;