diff --git a/autogen/convert_constants.py b/autogen/convert_constants.py
index 26a1beab..36a981c5 100644
--- a/autogen/convert_constants.py
+++ b/autogen/convert_constants.py
@@ -43,12 +43,14 @@ in_files = [
"src/audio/external.h",
"src/game/envfx_snow.h",
"src/pc/mods/mod_storage.h",
- "src/game/first_person_cam.h"
+ "src/game/first_person_cam.h",
+ "src/pc/djui/djui_console.h"
]
exclude_constants = {
"*": [ "^MAXCONTROLLERS$", "^AREA_[^T].*", "^AREA_T[HTO]", "^CONT_ERR.*", "^READ_MASK$", "^SIGN_RANGE$", ],
- "src/game/obj_behaviors.c": [ "^o$" ]
+ "src/game/obj_behaviors.c": [ "^o$" ],
+ "src/pc/djui/djui_console.h": [ "CONSOLE_MAX_TMP_BUFFER" ]
}
include_constants = {
diff --git a/autogen/convert_functions.py b/autogen/convert_functions.py
index 36a57274..d9ab7a85 100644
--- a/autogen/convert_functions.py
+++ b/autogen/convert_functions.py
@@ -307,7 +307,7 @@ manual_index_documentation = """
- [texture_override_reset](#texture_override_reset)
- [smlua_anim_util_register_animation](#smlua_anim_util_register_animation)
- [level_script_parse](#level_script_parse)
- - [set_exclamation_box_contents](#set_exclamation_box_contents)
+ - [log_to_console](#log_to_console)
@@ -641,23 +641,24 @@ Parses a level script and passes area index, behavior data, macro behavior IDs a
-## [set_exclamation_box_new_contents](#set_exclamation_box_new_contents)
+## [log_to_console](#log_to_console)
-Sets the contents of an exclamation box.
+Logs a message to the in-game console.
### Lua Example
-`set_exclamation_box_new_contents(contents)`
+`log_to_console("sm64coopdx FTW", CONSOLE_MESSAGE_INFO)`
### Parameters
| Field | Type |
| ----- | ---- |
-| contents | [ExclamationBoxContents](structs.md#ExclamationBoxContents) |
+| message | `string` |
+| level | `ConsoleMessageLevel` |
### Returns
- None
### C Prototype
-`void set_exclamation_box_new_contents(struct Struct802C0DF0 contents[], u8 size);`
+`void log_to_console(const char* message, enum ConsoleMessageLevel level);`
[:arrow_up_small:](#)
diff --git a/autogen/lua_definitions/constants.lua b/autogen/lua_definitions/constants.lua
index 7fd9966e..6d4c557d 100644
--- a/autogen/lua_definitions/constants.lua
+++ b/autogen/lua_definitions/constants.lua
@@ -3299,6 +3299,17 @@ DIALOG_169 = 169
--- @type DialogId
DIALOG_COUNT = 170
+--- @class ConsoleMessageLevel
+
+--- @type ConsoleMessageLevel
+CONSOLE_MESSAGE_INFO = 0
+
+--- @type ConsoleMessageLevel
+CONSOLE_MESSAGE_WARNING = 1
+
+--- @type ConsoleMessageLevel
+CONSOLE_MESSAGE_ERROR = 2
+
--- @class DjuiFontType
--- @type DjuiFontType
diff --git a/autogen/lua_definitions/functions.lua b/autogen/lua_definitions/functions.lua
index fcb235d8..20d75b8b 100644
--- a/autogen/lua_definitions/functions.lua
+++ b/autogen/lua_definitions/functions.lua
@@ -8873,12 +8873,6 @@ function is_transition_playing()
-- ...
end
---- @param message string
---- @return nil
-function log_to_console(message)
- -- ...
-end
-
--- @param name string
--- @param level integer
--- @param area integer
diff --git a/autogen/lua_definitions/manual.lua b/autogen/lua_definitions/manual.lua
index f8ffbe61..11bb0aec 100644
--- a/autogen/lua_definitions/manual.lua
+++ b/autogen/lua_definitions/manual.lua
@@ -133,13 +133,13 @@ end
-- functions --
---------------
---- @param t number
+--- @param t number Angle
--- @return number
function sins(t)
-- ...
end
---- @param t number
+--- @param t number Angle
--- @return number
function coss(t)
-- ...
@@ -276,6 +276,21 @@ function texture_override_reset(textureName)
-- ...
end
+--- @class bhvData
+--- @field behavior BehaviorId
+--- @field behaviorArg integer
+
+--- @param levelNum LevelNum | integer
+--- @param func fun(areaIndex:number, bhvData:bhvData, macroBhvIds:BehaviorId[], macroBhvArgs:integer[])
+--- @return nil
+--- When `func` is called, arguments are filled depending on the level command:
+--- - `AREA` command: only `areaIndex` is filled. It's a number.
+--- - `OBJECT` command: only `bhvData` is filled. `bhvData` is a table with two fields: `behavior` and `behaviorArg`.
+--- - `MACRO` command: only `macroBhvIds` and `macroBhvArgs` are filled. `macrobhvIds` is a list of behavior ids. `macroBhvArgs` is a list of behavior params. Both lists have the same size and start at index 0.
+function level_script_parse(levelNum, func)
+ -- ...
+end
+
--- @param name string
--- @param flags integer
--- @param animYTransDivisor integer
@@ -290,18 +305,11 @@ function smlua_anim_util_register_animation(name, flags, animYTransDivisor, star
-- ...
end
---- @class bhvData
- --- @field behavior BehaviorId
- --- @field behaviorArg integer
-
---- @param levelNum LevelNum | integer
---- @param func fun(areaIndex:number, bhvData:bhvData, macroBhvIds:BehaviorId[], macroBhvArgs:integer[])
+--- @param message string The message to log
+--- @param level? ConsoleMessageLevel Optional; Determines whether the message should appear as info, a warning or an error.
--- @return nil
---- When `func` is called, arguments are filled depending on the level command:
---- - `AREA` command: only `areaIndex` is filled. It's a number.
---- - `OBJECT` command: only `bhvData` is filled. `bhvData` is a table with two fields: `behavior` and `behaviorArg`.
---- - `MACRO` command: only `macroBhvIds` and `macroBhvArgs` are filled. `macrobhvIds` is a list of behavior ids. `macroBhvArgs` is a list of behavior params. Both lists have the same size and start at index 0.
-function level_script_parse(levelNum, func)
+--- Logs a message to the in-game console
+function log_to_console(message, level)
-- ...
end
diff --git a/data/dynos.cpp.h b/data/dynos.cpp.h
index 9e267c81..a6e4b75e 100644
--- a/data/dynos.cpp.h
+++ b/data/dynos.cpp.h
@@ -737,7 +737,7 @@ template
void PrintConsole(const char *aFmt, Args... aArgs) {
snprintf(gDjuiConsoleTmpBuffer, CONSOLE_MAX_TMP_BUFFER, aFmt, aArgs...);
sys_swap_backslashes(gDjuiConsoleTmpBuffer);
- djui_console_message_create(gDjuiConsoleTmpBuffer);
+ djui_console_message_create(gDjuiConsoleTmpBuffer, CONSOLE_MESSAGE_INFO);
}
template
@@ -745,7 +745,7 @@ void PrintError(const char *aFmt, Args... aArgs) {
printf(aFmt, aArgs...);
printf("\r\n");
fflush(stdout);
- PrintConsole(aFmt, aArgs...);
+ PrintConsole(aFmt, CONSOLE_MESSAGE_ERROR, aArgs...);
}
#define PrintDataError(...) { \
if (aGfxData->mErrorCount == 0) Print(" ERROR!"); \
diff --git a/docs/lua/constants.md b/docs/lua/constants.md
index 55c9725e..89ce11be 100644
--- a/docs/lua/constants.md
+++ b/docs/lua/constants.md
@@ -12,6 +12,8 @@
- [enum PlayerParts](#enum-PlayerParts)
- [dialog_ids.h](#dialog_idsh)
- [enum DialogId](#enum-DialogId)
+- [djui_console.h](#djui_consoleh)
+ - [enum ConsoleMessageLevel](#enum-ConsoleMessageLevel)
- [djui_hud_utils.h](#djui_hud_utilsh)
- [enum DjuiFontType](#enum-DjuiFontType)
- [enum HudUtilsFilter](#enum-HudUtilsFilter)
@@ -1095,6 +1097,19 @@
+## [djui_console.h](#djui_console.h)
+
+### [enum ConsoleMessageLevel](#ConsoleMessageLevel)
+| Identifier | Value |
+| :--------- | :---- |
+| CONSOLE_MESSAGE_INFO | 0 |
+| CONSOLE_MESSAGE_WARNING | 1 |
+| CONSOLE_MESSAGE_ERROR | 2 |
+
+[:arrow_up_small:](#)
+
+
+
## [djui_hud_utils.h](#djui_hud_utils.h)
### [enum DjuiFontType](#DjuiFontType)
diff --git a/docs/lua/functions-5.md b/docs/lua/functions-5.md
index a13abfa9..51895995 100644
--- a/docs/lua/functions-5.md
+++ b/docs/lua/functions-5.md
@@ -1357,26 +1357,6 @@
-## [log_to_console](#log_to_console)
-
-### Lua Example
-`log_to_console(message)`
-
-### Parameters
-| Field | Type |
-| ----- | ---- |
-| message | `string` |
-
-### Returns
-- None
-
-### C Prototype
-`void log_to_console(const char* message);`
-
-[:arrow_up_small:](#)
-
-
-
## [movtexqc_register](#movtexqc_register)
### Lua Example
diff --git a/docs/lua/functions.md b/docs/lua/functions.md
index c1b8de09..b1d6b8c3 100644
--- a/docs/lua/functions.md
+++ b/docs/lua/functions.md
@@ -23,7 +23,7 @@
- [texture_override_reset](#texture_override_reset)
- [smlua_anim_util_register_animation](#smlua_anim_util_register_animation)
- [level_script_parse](#level_script_parse)
- - [set_exclamation_box_contents](#set_exclamation_box_contents)
+ - [log_to_console](#log_to_console)
@@ -1663,7 +1663,6 @@
- [hud_show](functions-5.md#hud_show)
- [is_game_paused](functions-5.md#is_game_paused)
- [is_transition_playing](functions-5.md#is_transition_playing)
- - [log_to_console](functions-5.md#log_to_console)
- [movtexqc_register](functions-5.md#movtexqc_register)
- [play_transition](functions-5.md#play_transition)
- [save_file_get_using_backup_slot](functions-5.md#save_file_get_using_backup_slot)
@@ -2125,23 +2124,24 @@ Parses a level script and passes area index, behavior data, macro behavior IDs a
-## [set_exclamation_box_new_contents](#set_exclamation_box_new_contents)
+## [log_to_console](#log_to_console)
-Sets the contents of an exclamation box.
+Logs a message to the in-game console.
### Lua Example
-`set_exclamation_box_new_contents(contents)`
+`log_to_console("sm64coopdx FTW", CONSOLE_MESSAGE_INFO)`
### Parameters
| Field | Type |
| ----- | ---- |
-| contents | [ExclamationBoxContents](structs.md#ExclamationBoxContents) |
+| message | `string` |
+| level | `ConsoleMessageLevel` |
### Returns
- None
### C Prototype
-`void set_exclamation_box_new_contents(struct Struct802C0DF0 contents[], u8 size);`
+`void log_to_console(const char* message, enum ConsoleMessageLevel level);`
[:arrow_up_small:](#)
diff --git a/src/pc/debuglog.h b/src/pc/debuglog.h
index 77fc927a..e078c538 100644
--- a/src/pc/debuglog.h
+++ b/src/pc/debuglog.h
@@ -52,6 +52,6 @@ static void _debuglog_print_log(const char* logType, char* filename) {
#define LOG_INFO(...) (configDebugInfo ? ( _debuglog_print_log("INFO", __FILE__), printf(__VA_ARGS__), printf("\n") ) : 0)
#define LOG_ERROR(...) (configDebugError ? ( _debuglog_print_log("ERROR", __FILE__), printf(__VA_ARGS__), printf("\n") ) : 0)
#endif
-#define LOG_CONSOLE(...) { snprintf(gDjuiConsoleTmpBuffer, CONSOLE_MAX_TMP_BUFFER, __VA_ARGS__), djui_console_message_create(gDjuiConsoleTmpBuffer); }
+#define LOG_CONSOLE(...) { snprintf(gDjuiConsoleTmpBuffer, CONSOLE_MAX_TMP_BUFFER, __VA_ARGS__), djui_console_message_create(gDjuiConsoleTmpBuffer, CONSOLE_MESSAGE_INFO); }
#endif
diff --git a/src/pc/djui/djui_console.c b/src/pc/djui/djui_console.c
index fd93e001..8104c2ca 100644
--- a/src/pc/djui/djui_console.c
+++ b/src/pc/djui/djui_console.c
@@ -14,14 +14,16 @@ bool sDjuiConsoleQueueMessages = true;
struct ConsoleQueuedMessage {
char* message;
+ enum ConsoleMessageLevel level;
struct ConsoleQueuedMessage* next;
};
struct ConsoleQueuedMessage* sConsoleQueuedMessages = NULL;
-static void djui_console_message_queue(const char* message) {
+static void djui_console_message_queue(const char* message, enum ConsoleMessageLevel level) {
struct ConsoleQueuedMessage* queued = malloc(sizeof(struct ConsoleQueuedMessage));
queued->message = strdup(message);
+ queued->level = level;
queued->next = NULL;
if (sConsoleQueuedMessages == NULL) {
sConsoleQueuedMessages = queued;
@@ -39,7 +41,7 @@ void djui_console_message_dequeue(void) {
struct ConsoleQueuedMessage* entry = sConsoleQueuedMessages;
while (entry) {
struct ConsoleQueuedMessage* next = entry->next;
- djui_console_message_create(entry->message);
+ djui_console_message_create(entry->message, entry->level);
free(entry->message);
free(entry);
entry = next;
@@ -101,9 +103,9 @@ static bool djui_console_on_key_down(UNUSED struct DjuiBase* base, int scancode)
return true;
}
-void djui_console_message_create(const char* message) {
+void djui_console_message_create(const char* message, enum ConsoleMessageLevel level) {
if (sDjuiConsoleQueueMessages || !gDjuiConsole) {
- djui_console_message_queue(message);
+ djui_console_message_queue(message, level);
return;
}
djui_base_compute_tree(&gDjuiConsole->base);
@@ -117,7 +119,17 @@ void djui_console_message_create(const char* message) {
djui_base_set_alignment(tBase, DJUI_HALIGN_LEFT, DJUI_VALIGN_BOTTOM);
djui_base_set_size_type(tBase, DJUI_SVT_ABSOLUTE, DJUI_SVT_ABSOLUTE);
djui_base_set_size(tBase, maxTextWidth, 32);
- djui_base_set_color(tBase, 220, 220, 220, 255);
+ switch (level) {
+ case CONSOLE_MESSAGE_INFO:
+ djui_base_set_color(tBase, 220, 220, 220, 255);
+ break;
+ case CONSOLE_MESSAGE_WARNING:
+ djui_base_set_color(tBase, 255, 255, 160, 255);
+ break;
+ case CONSOLE_MESSAGE_ERROR:
+ djui_base_set_color(tBase, 255, 160, 160, 255);
+ break;
+ }
// figure out chat message height
text->base.comp.width = maxTextWidth;
diff --git a/src/pc/djui/djui_console.h b/src/pc/djui/djui_console.h
index 79d39d24..8d187457 100644
--- a/src/pc/djui/djui_console.h
+++ b/src/pc/djui/djui_console.h
@@ -1,6 +1,12 @@
#pragma once
#include "djui.h"
+enum ConsoleMessageLevel {
+ CONSOLE_MESSAGE_INFO,
+ CONSOLE_MESSAGE_WARNING,
+ CONSOLE_MESSAGE_ERROR
+};
+
struct DjuiConsole {
struct DjuiBase base;
struct DjuiFlowLayout* flow;
@@ -13,6 +19,6 @@ extern bool gDjuiConsoleFocus;
extern char gDjuiConsoleTmpBuffer[];
void djui_console_message_dequeue(void);
-void djui_console_message_create(const char* message);
+void djui_console_message_create(const char* message, enum ConsoleMessageLevel level);
void djui_console_toggle(void);
struct DjuiConsole* djui_console_create(void);
diff --git a/src/pc/lua/smlua.h b/src/pc/lua/smlua.h
index a4d81447..0f55695b 100644
--- a/src/pc/lua/smlua.h
+++ b/src/pc/lua/smlua.h
@@ -20,8 +20,8 @@
#include "pc/debuglog.h"
#include "pc/djui/djui_console.h"
-#define LOG_LUA(...) { if (!gSmLuaSuppressErrors) { _debuglog_print_log("LUA ", __FILE__), printf(__VA_ARGS__), printf("\n"), smlua_mod_error(), snprintf(gDjuiConsoleTmpBuffer, CONSOLE_MAX_TMP_BUFFER, __VA_ARGS__), djui_console_message_create(gDjuiConsoleTmpBuffer); } }
-#define LOG_LUA_LINE(...) { if (!gSmLuaSuppressErrors) { _debuglog_print_log("LUA ", __FILE__), printf(__VA_ARGS__), printf("\n"), smlua_mod_error(); snprintf(gDjuiConsoleTmpBuffer, CONSOLE_MAX_TMP_BUFFER, __VA_ARGS__), djui_console_message_create(gDjuiConsoleTmpBuffer), smlua_logline(); } }
+#define LOG_LUA(...) { if (!gSmLuaSuppressErrors) { _debuglog_print_log("LUA ", __FILE__), printf(__VA_ARGS__), printf("\n"), smlua_mod_error(), snprintf(gDjuiConsoleTmpBuffer, CONSOLE_MAX_TMP_BUFFER, __VA_ARGS__), sys_swap_backslashes(gDjuiConsoleTmpBuffer), djui_console_message_create(gDjuiConsoleTmpBuffer, CONSOLE_MESSAGE_ERROR); } }
+#define LOG_LUA_LINE(...) { if (!gSmLuaSuppressErrors) { _debuglog_print_log("LUA ", __FILE__), printf(__VA_ARGS__), printf("\n"), smlua_mod_error(); snprintf(gDjuiConsoleTmpBuffer, CONSOLE_MAX_TMP_BUFFER, __VA_ARGS__), sys_swap_backslashes(gDjuiConsoleTmpBuffer), djui_console_message_create(gDjuiConsoleTmpBuffer, CONSOLE_MESSAGE_ERROR), smlua_logline(); } }
#ifdef DEVELOPMENT
#define LUA_STACK_CHECK_BEGIN() int __LUA_STACK_TOP = lua_gettop(gLuaState)
diff --git a/src/pc/lua/smlua_constants_autogen.c b/src/pc/lua/smlua_constants_autogen.c
index f975e6d4..c4188f54 100644
--- a/src/pc/lua/smlua_constants_autogen.c
+++ b/src/pc/lua/smlua_constants_autogen.c
@@ -1313,6 +1313,9 @@ char gSmluaConstants[] = ""
"DIALOG_168 = 168\n"
"DIALOG_169 = 169\n"
"DIALOG_COUNT = 170\n"
+"CONSOLE_MESSAGE_INFO = 0\n"
+"CONSOLE_MESSAGE_WARNING = 1\n"
+"CONSOLE_MESSAGE_ERROR = 2\n"
"RESOLUTION_DJUI = 0\n"
"RESOLUTION_N64 = 1\n"
"RESOLUTION_COUNT = 2\n"
diff --git a/src/pc/lua/smlua_functions.c b/src/pc/lua/smlua_functions.c
index 05bc963a..5d09fdd5 100644
--- a/src/pc/lua/smlua_functions.c
+++ b/src/pc/lua/smlua_functions.c
@@ -790,6 +790,29 @@ int smlua_func_smlua_anim_util_register_animation(lua_State* L) {
return 1;
}
+ /////////////
+ // console //
+/////////////
+
+int smlua_func_log_to_console(lua_State* L) {
+ if (!smlua_functions_valid_param_range(L, 1, 2)) { return 0; }
+
+ int paramCount = lua_gettop(L);
+
+ const char* message = smlua_to_string(L, 1);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter 1"); return 0; }
+
+ enum ConsoleMessageLevel level = CONSOLE_MESSAGE_INFO;
+ if (paramCount >= 2) {
+ level = smlua_to_integer(L, 2);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter 2"); return 0; }
+ }
+
+ djui_console_message_create(message, level);
+
+ return 1;
+}
+
//////////
// bind //
//////////
@@ -817,4 +840,5 @@ void smlua_bind_functions(void) {
smlua_bind_function(L, "texture_override_reset", smlua_func_texture_override_reset);
smlua_bind_function(L, "level_script_parse", smlua_func_level_script_parse);
smlua_bind_function(L, "smlua_anim_util_register_animation", smlua_func_smlua_anim_util_register_animation);
+ smlua_bind_function(L, "log_to_console", smlua_func_log_to_console);
}
diff --git a/src/pc/lua/smlua_functions_autogen.c b/src/pc/lua/smlua_functions_autogen.c
index 5736989a..aa2045c2 100644
--- a/src/pc/lua/smlua_functions_autogen.c
+++ b/src/pc/lua/smlua_functions_autogen.c
@@ -29253,23 +29253,6 @@ int smlua_func_is_transition_playing(UNUSED lua_State* L) {
return 1;
}
-int smlua_func_log_to_console(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", "log_to_console", 1, top);
- return 0;
- }
-
- const char* message = smlua_to_string(L, 1);
- if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "log_to_console"); return 0; }
-
- log_to_console(message);
-
- return 1;
-}
-
int smlua_func_movtexqc_register(lua_State* L) {
if (L == NULL) { return 0; }
@@ -32868,7 +32851,6 @@ void smlua_bind_functions_autogen(void) {
smlua_bind_function(L, "hud_show", smlua_func_hud_show);
smlua_bind_function(L, "is_game_paused", smlua_func_is_game_paused);
smlua_bind_function(L, "is_transition_playing", smlua_func_is_transition_playing);
- smlua_bind_function(L, "log_to_console", smlua_func_log_to_console);
smlua_bind_function(L, "movtexqc_register", smlua_func_movtexqc_register);
smlua_bind_function(L, "play_transition", smlua_func_play_transition);
smlua_bind_function(L, "save_file_get_using_backup_slot", smlua_func_save_file_get_using_backup_slot);
diff --git a/src/pc/lua/utils/smlua_misc_utils.c b/src/pc/lua/utils/smlua_misc_utils.c
index 285fc2a6..878d82d5 100644
--- a/src/pc/lua/utils/smlua_misc_utils.c
+++ b/src/pc/lua/utils/smlua_misc_utils.c
@@ -81,12 +81,6 @@ void djui_reset_popup_disabled_override(void) {
///
-void log_to_console(const char* message) {
- djui_console_message_create(message);
-}
-
-///
-
extern s8 gDialogBoxState;
s8 get_dialog_box_state(void) {
return gDialogBoxState;
diff --git a/src/pc/lua/utils/smlua_misc_utils.h b/src/pc/lua/utils/smlua_misc_utils.h
index b976ec9d..923142b3 100644
--- a/src/pc/lua/utils/smlua_misc_utils.h
+++ b/src/pc/lua/utils/smlua_misc_utils.h
@@ -47,8 +47,6 @@ bool djui_is_popup_disabled(void);
void djui_set_popup_disabled_override(bool value);
void djui_reset_popup_disabled_override(void);
-void log_to_console(const char* message);
-
s8 get_dialog_box_state(void);
s16 get_dialog_id(void);