diff --git a/autogen/lua_definitions/functions.lua b/autogen/lua_definitions/functions.lua
index 0fdb1c45..dfa50e0b 100644
--- a/autogen/lua_definitions/functions.lua
+++ b/autogen/lua_definitions/functions.lua
@@ -8242,6 +8242,12 @@ function level_register(scriptEntryName, courseNum, fullName, shortName, acousti
-- ...
end
+--- @param areaIndex integer
+--- @return nil
+function smlua_level_util_change_area(areaIndex)
+ -- ...
+end
+
--- @param levelNum integer
--- @return CustomLevelInfo
function smlua_level_util_get_info(levelNum)
diff --git a/docs/lua/functions-4.md b/docs/lua/functions-4.md
index 467ced20..06aca719 100644
--- a/docs/lua/functions-4.md
+++ b/docs/lua/functions-4.md
@@ -7524,6 +7524,26 @@
+## [smlua_level_util_change_area](#smlua_level_util_change_area)
+
+### Lua Example
+`smlua_level_util_change_area(areaIndex)`
+
+### Parameters
+| Field | Type |
+| ----- | ---- |
+| areaIndex | `integer` |
+
+### Returns
+- None
+
+### C Prototype
+`void smlua_level_util_change_area(s32 areaIndex);`
+
+[:arrow_up_small:](#)
+
+
+
## [smlua_level_util_get_info](#smlua_level_util_get_info)
### Lua Example
diff --git a/docs/lua/functions.md b/docs/lua/functions.md
index ee11ad99..f4cddf94 100644
--- a/docs/lua/functions.md
+++ b/docs/lua/functions.md
@@ -1535,6 +1535,7 @@
- smlua_level_utils.h
- [level_is_vanilla_level](functions-4.md#level_is_vanilla_level)
- [level_register](functions-4.md#level_register)
+ - [smlua_level_util_change_area](functions-4.md#smlua_level_util_change_area)
- [smlua_level_util_get_info](functions-4.md#smlua_level_util_get_info)
- [smlua_level_util_get_info_from_short_name](functions-4.md#smlua_level_util_get_info_from_short_name)
- [warp_exit_level](functions-4.md#warp_exit_level)
diff --git a/src/pc/lua/smlua_functions_autogen.c b/src/pc/lua/smlua_functions_autogen.c
index be5a2ec9..728315e8 100644
--- a/src/pc/lua/smlua_functions_autogen.c
+++ b/src/pc/lua/smlua_functions_autogen.c
@@ -35,7 +35,7 @@
#include "src/game/object_list_processor.h"
#include "src/game/behavior_actions.h"
#include "src/game/mario_misc.h"
-#include "src/pc/mods/mod_storage.h"
+#include "src/pc/mods/mod_storage.c.h"
#include "src/pc/utils/misc.h"
#include "src/game/level_update.h"
#include "src/game/area.h"
@@ -300,6 +300,22 @@ int smlua_func_bhv_1up_sliding_loop(UNUSED lua_State* L) {
return 1;
}
+int smlua_func_bhv_1up_trigger_init(UNUSED lua_State* L) {
+ if (!gCurrentObject) { return 0; }
+ 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", "bhv_1up_trigger_init", 0, top);
+ return 0;
+ }
+
+
+ bhv_1up_trigger_init();
+
+ return 1;
+}
+
int smlua_func_bhv_1up_walking_loop(UNUSED lua_State* L) {
if (!gCurrentObject) { return 0; }
if (L == NULL) { return 0; }
@@ -13685,23 +13701,6 @@ int smlua_func_level_trigger_warp(lua_State* L) {
return 1;
}
-int smlua_func_warp_special(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", "warp_special", 1, top);
- return 0;
- }
-
- s32 arg = smlua_to_integer(L, 1);
- if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "warp_special"); return 0; }
-
- warp_special(arg);
-
- return 1;
-}
-
/////////////
// mario.h //
/////////////
@@ -19370,9 +19369,24 @@ int smlua_func_update_all_mario_stars(UNUSED lua_State* L) {
return 1;
}
- ///////////////////
- // mod_storage.h //
-///////////////////
+ /////////////////////
+ // mod_storage.c.h //
+/////////////////////
+
+int smlua_func_mod_storage_clear(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", "mod_storage_clear", 0, top);
+ return 0;
+ }
+
+
+ lua_pushboolean(L, mod_storage_clear());
+
+ return 1;
+}
int smlua_func_mod_storage_load(lua_State* L) {
if (L == NULL) { return 0; }
@@ -19391,6 +19405,40 @@ int smlua_func_mod_storage_load(lua_State* L) {
return 1;
}
+int smlua_func_mod_storage_load_bool(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", "mod_storage_load_bool", 1, top);
+ return 0;
+ }
+
+ const char* key = smlua_to_string(L, 1);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "mod_storage_load_bool"); return 0; }
+
+ lua_pushboolean(L, mod_storage_load_bool(key));
+
+ return 1;
+}
+
+int smlua_func_mod_storage_load_number(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", "mod_storage_load_number", 1, top);
+ return 0;
+ }
+
+ const char* key = smlua_to_string(L, 1);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "mod_storage_load_number"); return 0; }
+
+ lua_pushnumber(L, mod_storage_load_number(key));
+
+ return 1;
+}
+
int smlua_func_mod_storage_save(lua_State* L) {
if (L == NULL) { return 0; }
@@ -19410,6 +19458,44 @@ int smlua_func_mod_storage_save(lua_State* L) {
return 1;
}
+int smlua_func_mod_storage_save_bool(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", "mod_storage_save_bool", 2, top);
+ return 0;
+ }
+
+ const char* key = smlua_to_string(L, 1);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "mod_storage_save_bool"); return 0; }
+ bool value = smlua_to_boolean(L, 2);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "mod_storage_save_bool"); return 0; }
+
+ lua_pushboolean(L, mod_storage_save_bool(key, value));
+
+ return 1;
+}
+
+int smlua_func_mod_storage_save_number(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", "mod_storage_save_number", 2, top);
+ return 0;
+ }
+
+ const char* key = smlua_to_string(L, 1);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "mod_storage_save_number"); return 0; }
+ double value = smlua_to_number(L, 2);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "mod_storage_save_number"); return 0; }
+
+ lua_pushboolean(L, mod_storage_save_number(key, value));
+
+ return 1;
+}
+
//////////////////////
// network_player.h //
//////////////////////
@@ -27398,7 +27484,7 @@ int smlua_func_smlua_level_util_get_info_from_short_name(lua_State* L) {
return 0;
}
- char* shortName = (char*)smlua_to_cobject(L, 1, LOT_NONE);
+ const char* shortName = smlua_to_string(L, 1);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "smlua_level_util_get_info_from_short_name"); return 0; }
smlua_push_object(L, LOT_CUSTOMLEVELINFO, smlua_level_util_get_info_from_short_name(shortName));
@@ -27714,6 +27800,23 @@ int smlua_func_allocate_mario_action(lua_State* L) {
return 1;
}
+int smlua_func_camera_allow_toxic_gas_camera(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", "camera_allow_toxic_gas_camera", 1, top);
+ return 0;
+ }
+
+ u8 allow = smlua_to_integer(L, 1);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "camera_allow_toxic_gas_camera"); return 0; }
+
+ camera_allow_toxic_gas_camera(allow);
+
+ return 1;
+}
+
int smlua_func_camera_config_enable_analog_cam(lua_State* L) {
if (L == NULL) { return 0; }
@@ -29641,6 +29744,21 @@ int smlua_func_obj_set_vel(lua_State* L) {
return 1;
}
+int smlua_func_restore_exclamation_box_original_contents(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", "restore_exclamation_box_original_contents", 0, top);
+ return 0;
+ }
+
+
+ restore_exclamation_box_original_contents();
+
+ return 1;
+}
+
int smlua_func_set_whirlpools(lua_State* L) {
if (L == NULL) { return 0; }
@@ -30580,6 +30698,7 @@ void smlua_bind_functions_autogen(void) {
smlua_bind_function(L, "bhv_1up_loop", smlua_func_bhv_1up_loop);
smlua_bind_function(L, "bhv_1up_running_away_loop", smlua_func_bhv_1up_running_away_loop);
smlua_bind_function(L, "bhv_1up_sliding_loop", smlua_func_bhv_1up_sliding_loop);
+ smlua_bind_function(L, "bhv_1up_trigger_init", smlua_func_bhv_1up_trigger_init);
smlua_bind_function(L, "bhv_1up_walking_loop", smlua_func_bhv_1up_walking_loop);
smlua_bind_function(L, "bhv_act_selector_init", smlua_func_bhv_act_selector_init);
smlua_bind_function(L, "bhv_act_selector_loop", smlua_func_bhv_act_selector_loop);
@@ -31362,7 +31481,6 @@ void smlua_bind_functions_autogen(void) {
smlua_bind_function(L, "get_painting_warp_node", smlua_func_get_painting_warp_node);
smlua_bind_function(L, "initiate_painting_warp", smlua_func_initiate_painting_warp);
smlua_bind_function(L, "level_trigger_warp", smlua_func_level_trigger_warp);
- smlua_bind_function(L, "warp_special", smlua_func_warp_special);
// mario.h
smlua_bind_function(L, "adjust_sound_for_speed", smlua_func_adjust_sound_for_speed);
@@ -31605,9 +31723,14 @@ void smlua_bind_functions_autogen(void) {
// misc.h
smlua_bind_function(L, "update_all_mario_stars", smlua_func_update_all_mario_stars);
- // mod_storage.h
+ // mod_storage.c.h
+ smlua_bind_function(L, "mod_storage_clear", smlua_func_mod_storage_clear);
smlua_bind_function(L, "mod_storage_load", smlua_func_mod_storage_load);
+ smlua_bind_function(L, "mod_storage_load_bool", smlua_func_mod_storage_load_bool);
+ smlua_bind_function(L, "mod_storage_load_number", smlua_func_mod_storage_load_number);
smlua_bind_function(L, "mod_storage_save", smlua_func_mod_storage_save);
+ smlua_bind_function(L, "mod_storage_save_bool", smlua_func_mod_storage_save_bool);
+ smlua_bind_function(L, "mod_storage_save_number", smlua_func_mod_storage_save_number);
// network_player.h
smlua_bind_function(L, "get_network_player_from_area", smlua_func_get_network_player_from_area);
@@ -32046,6 +32169,7 @@ void smlua_bind_functions_autogen(void) {
// smlua_misc_utils.h
smlua_bind_function(L, "add_scroll_target", smlua_func_add_scroll_target);
smlua_bind_function(L, "allocate_mario_action", smlua_func_allocate_mario_action);
+ smlua_bind_function(L, "camera_allow_toxic_gas_camera", smlua_func_camera_allow_toxic_gas_camera);
smlua_bind_function(L, "camera_config_enable_analog_cam", smlua_func_camera_config_enable_analog_cam);
smlua_bind_function(L, "camera_config_enable_free_cam", smlua_func_camera_config_enable_free_cam);
smlua_bind_function(L, "camera_config_enable_mouse_look", smlua_func_camera_config_enable_mouse_look);
@@ -32161,6 +32285,7 @@ void smlua_bind_functions_autogen(void) {
smlua_bind_function(L, "obj_move_xyz", smlua_func_obj_move_xyz);
smlua_bind_function(L, "obj_set_model_extended", smlua_func_obj_set_model_extended);
smlua_bind_function(L, "obj_set_vel", smlua_func_obj_set_vel);
+ smlua_bind_function(L, "restore_exclamation_box_original_contents", smlua_func_restore_exclamation_box_original_contents);
smlua_bind_function(L, "set_whirlpools", smlua_func_set_whirlpools);
smlua_bind_function(L, "spawn_non_sync_object", smlua_func_spawn_non_sync_object);
smlua_bind_function(L, "spawn_sync_object", smlua_func_spawn_sync_object);
diff --git a/src/pc/lua/utils/smlua_level_utils.c b/src/pc/lua/utils/smlua_level_utils.c
index 1ed0c53b..49ce6d65 100644
--- a/src/pc/lua/utils/smlua_level_utils.c
+++ b/src/pc/lua/utils/smlua_level_utils.c
@@ -2,6 +2,9 @@
#include "types.h"
#include "smlua_level_utils.h"
#include "pc/lua/smlua.h"
+#include "game/area.h"
+
+#define MIN_AREA_INDEX 0
struct CustomLevelInfo* sCustomLevelHead = NULL;
static s16 sCustomLevelNumNext = CUSTOM_LEVEL_NUM_START;