From 56e7470e7b97f9575eaa76946357030cbe6098ae Mon Sep 17 00:00:00 2001
From: Blockyyy <88585273+Blockyyy@users.noreply.github.com>
Date: Sun, 5 Nov 2023 00:58:07 +0100
Subject: [PATCH] Exposed warp_special (#493)
Exposes the warp_special function and adds some constants for it
Fixed the crash by making it so a script error happens instead.
---
autogen/convert_functions.py | 2 +-
autogen/lua_definitions/constants.lua | 15 ++++++++++
autogen/lua_definitions/functions.lua | 6 ++++
docs/lua/constants.md | 5 ++++
docs/lua/functions-3.md | 20 +++++++++++++
docs/lua/functions.md | 1 +
src/game/level_update.c | 15 ++++++----
src/game/level_update.h | 7 +++++
src/pc/lua/smlua_constants_autogen.c | 41 +++++++++++++++++++++++++++
src/pc/lua/smlua_functions_autogen.c | 18 ++++++++++++
10 files changed, 124 insertions(+), 6 deletions(-)
diff --git a/autogen/convert_functions.py b/autogen/convert_functions.py
index 8a23e3072..2cecb5a94 100644
--- a/autogen/convert_functions.py
+++ b/autogen/convert_functions.py
@@ -74,7 +74,7 @@ override_allowed_functions = {
"src/game/object_list_processor.h": [ "set_object_respawn_info_bits" ],
"src/game/mario_misc.h": [ "bhv_toad.*", "bhv_unlock_door.*" ],
"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/level_update.h": [ "level_trigger_warp", "get_painting_warp_node", "initiate_painting_warp", "warp_special" ],
"src/game/area.h": [ "area_get_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" ]
diff --git a/autogen/lua_definitions/constants.lua b/autogen/lua_definitions/constants.lua
index 09262c423..68ae603b2 100644
--- a/autogen/lua_definitions/constants.lua
+++ b/autogen/lua_definitions/constants.lua
@@ -4010,6 +4010,21 @@ MARIO_SPAWN_UNKNOWN_27 = 0x27
--- @type integer
PRESS_START_DEMO_TIMER = 800
+--- @type integer
+SPECIAL_WARP_CAKE = -1
+
+--- @type integer
+SPECIAL_WARP_GODDARD = -2
+
+--- @type integer
+SPECIAL_WARP_GODDARD_GAMEOVER = -3
+
+--- @type integer
+SPECIAL_WARP_LEVEL_SELECT = -9
+
+--- @type integer
+SPECIAL_WARP_TITLE = -8
+
--- @type integer
TIMER_CONTROL_HIDE = 3
diff --git a/autogen/lua_definitions/functions.lua b/autogen/lua_definitions/functions.lua
index 039f1dd75..1b7e532fa 100644
--- a/autogen/lua_definitions/functions.lua
+++ b/autogen/lua_definitions/functions.lua
@@ -4234,6 +4234,12 @@ function level_trigger_warp(m, warpOp)
-- ...
end
+--- @param arg integer
+--- @return nil
+function warp_special(arg)
+ -- ...
+end
+
--- @param m MarioState
--- @return nil
function adjust_sound_for_speed(m)
diff --git a/docs/lua/constants.md b/docs/lua/constants.md
index c8786da1f..706b10a46 100644
--- a/docs/lua/constants.md
+++ b/docs/lua/constants.md
@@ -1410,6 +1410,11 @@
- MARIO_SPAWN_UNKNOWN_03
- MARIO_SPAWN_UNKNOWN_27
- PRESS_START_DEMO_TIMER
+- SPECIAL_WARP_CAKE
+- SPECIAL_WARP_GODDARD
+- SPECIAL_WARP_GODDARD_GAMEOVER
+- SPECIAL_WARP_LEVEL_SELECT
+- SPECIAL_WARP_TITLE
- TIMER_CONTROL_HIDE
- TIMER_CONTROL_SHOW
- TIMER_CONTROL_START
diff --git a/docs/lua/functions-3.md b/docs/lua/functions-3.md
index 8ec27d1ff..b1fd70f8d 100644
--- a/docs/lua/functions-3.md
+++ b/docs/lua/functions-3.md
@@ -3988,6 +3988,26 @@
+## [warp_special](#warp_special)
+
+### Lua Example
+`warp_special(arg)`
+
+### Parameters
+| Field | Type |
+| ----- | ---- |
+| arg | `integer` |
+
+### Returns
+- None
+
+### C Prototype
+`void warp_special(s32 arg);`
+
+[:arrow_up_small:](#)
+
+
+
---
# functions from mario.h
diff --git a/docs/lua/functions.md b/docs/lua/functions.md
index 10c70ac95..6ee83ed77 100644
--- a/docs/lua/functions.md
+++ b/docs/lua/functions.md
@@ -851,6 +851,7 @@
- [get_painting_warp_node](functions-3.md#get_painting_warp_node)
- [initiate_painting_warp](functions-3.md#initiate_painting_warp)
- [level_trigger_warp](functions-3.md#level_trigger_warp)
+ - [warp_special](functions-3.md#warp_special)
diff --git a/src/game/level_update.c b/src/game/level_update.c
index 6f6e5f635..9f50f013d 100644
--- a/src/game/level_update.c
+++ b/src/game/level_update.c
@@ -285,6 +285,11 @@ void set_play_mode(s16 playMode) {
}
void warp_special(s32 arg) {
+ if (arg != SPECIAL_WARP_CAKE && arg != SPECIAL_WARP_GODDARD && arg != SPECIAL_WARP_GODDARD_GAMEOVER && arg != SPECIAL_WARP_TITLE && arg != SPECIAL_WARP_LEVEL_SELECT) {
+ LOG_ERROR("Invalid parameter value for warp_special: Expected SPECIAL_WARP_CAKE, SPECIAL_WARP_GODDARD, SPECIAL_WARP_GODDARD_GAMEOVER, SPECIAL_WARP_TITLE, or SPECIAL_WARP_LEVEL_SELECT");
+ return;
+ }
+
sCurrPlayMode = PLAY_MODE_CHANGE_LEVEL;
D_80339ECA = 0;
D_80339EE0 = arg;
@@ -990,12 +995,12 @@ void initiate_delayed_warp(void) {
reset_dialog_render_state();
if (gDebugLevelSelect && (sDelayedWarpOp & WARP_OP_TRIGGERS_LEVEL_SELECT)) {
- warp_special(-9);
+ warp_special(SPECIAL_WARP_LEVEL_SELECT);
} else if (gCurrDemoInput != NULL) {
if (sDelayedWarpOp == WARP_OP_DEMO_END) {
- warp_special(-8);
+ warp_special(SPECIAL_WARP_TITLE);
} else {
- warp_special(-2);
+ warp_special(SPECIAL_WARP_GODDARD);
}
} else {
switch (sDelayedWarpOp) {
@@ -1006,14 +1011,14 @@ void initiate_delayed_warp(void) {
break;
case WARP_OP_CREDITS_END:
- warp_special(-1);
+ warp_special(SPECIAL_WARP_CAKE);
sound_banks_enable(SEQ_PLAYER_SFX,
SOUND_BANKS_ALL & ~SOUND_BANKS_DISABLED_AFTER_CREDITS);
break;
case WARP_OP_DEMO_NEXT:
if (!gDjuiInMainMenu) {
- warp_special(-2);
+ warp_special(SPECIAL_WARP_GODDARD);
}
break;
diff --git a/src/game/level_update.h b/src/game/level_update.h
index 336b6a7b1..f9c2b0eb0 100644
--- a/src/game/level_update.h
+++ b/src/game/level_update.h
@@ -32,6 +32,12 @@
#define WARP_OP_TRIGGERS_LEVEL_SELECT 0x10
+#define SPECIAL_WARP_CAKE -1
+#define SPECIAL_WARP_GODDARD -2
+#define SPECIAL_WARP_GODDARD_GAMEOVER -3
+#define SPECIAL_WARP_TITLE -8
+#define SPECIAL_WARP_LEVEL_SELECT -9
+
#define MARIO_SPAWN_DOOR_WARP 0x01
#define MARIO_SPAWN_UNKNOWN_02 0x02
#define MARIO_SPAWN_UNKNOWN_03 0x03
@@ -155,6 +161,7 @@ struct WarpNode *get_painting_warp_node(void);
void initiate_painting_warp(s16 paintingIndex);
s16 level_trigger_warp(struct MarioState *m, s32 warpOp);
void level_set_transition(s16 length, void (*updateFunction)(s16 *));
+void warp_special(s32 arg);
s32 lvl_init_or_update(s16 initOrUpdate, UNUSED s32 unused);
s32 lvl_init_from_save_file(UNUSED s16 arg0, s32 levelNum);
diff --git a/src/pc/lua/smlua_constants_autogen.c b/src/pc/lua/smlua_constants_autogen.c
index b273e3f07..e0557db8b 100644
--- a/src/pc/lua/smlua_constants_autogen.c
+++ b/src/pc/lua/smlua_constants_autogen.c
@@ -1,6 +1,8 @@
char gSmluaConstants[] = ""
"math.randomseed(get_time())\n"
+"\n"
"_CObjectPool = {}\n"
+"\n"
"_CObject = {\n"
" __index = function (t,k)\n"
" return _get_field(t['_lot'], t['_pointer'], k, t)\n"
@@ -15,10 +17,12 @@ char gSmluaConstants[] = ""
" return a['_pointer'] == b['_pointer'] and a['_lot'] == b['_lot'] and a['_pointer'] ~= nil and a['_lot'] ~= nil\n"
" end\n"
"}\n"
+"\n"
"function _NewCObject(lot, pointer)\n"
" if _CObjectPool[lot] == nil then\n"
" _CObjectPool[lot] = {}\n"
" end\n"
+"\n"
" if _CObjectPool[lot][pointer] == nil then\n"
" local obj = {}\n"
" rawset(obj, '_pointer', pointer)\n"
@@ -27,9 +31,12 @@ char gSmluaConstants[] = ""
" _CObjectPool[lot][pointer] = obj\n"
" return obj\n"
" end\n"
+"\n"
" return _CObjectPool[lot][pointer]\n"
"end\n"
+"\n"
"local _CPointerPool = {}\n"
+"\n"
"_CPointer = {\n"
" __index = function (t,k)\n"
" return nil\n"
@@ -43,10 +50,12 @@ char gSmluaConstants[] = ""
" return a['_pointer'] == b['_pointer'] and a['_pointer'] ~= nil and a['_lvt'] ~= nil\n"
" end\n"
"}\n"
+"\n"
"function _NewCPointer(lvt, pointer)\n"
" if _CPointerPool[lvt] == nil then\n"
" _CPointerPool[lvt] = {}\n"
" end\n"
+"\n"
" if _CPointerPool[lvt][pointer] == nil then\n"
" local obj = {}\n"
" rawset(obj, '_pointer', pointer)\n"
@@ -55,8 +64,10 @@ char gSmluaConstants[] = ""
" _CPointerPool[lvt][pointer] = obj\n"
" return obj\n"
" end\n"
+"\n"
" return _CPointerPool[lvt][pointer]\n"
"end\n"
+"\n"
"_SyncTable = {\n"
" __index = function (t,k)\n"
" local _table = rawget(t, '_table')\n"
@@ -68,6 +79,7 @@ char gSmluaConstants[] = ""
" _set_sync_table_field(t, k, v)\n"
" end\n"
"}\n"
+"\n"
"_ReadOnlyTable = {\n"
" __index = function (t,k)\n"
" local _table = rawget(t, '_table')\n"
@@ -76,6 +88,7 @@ char gSmluaConstants[] = ""
" __newindex = function (t,k,v)\n"
" end\n"
"}\n"
+"\n"
"--- @param dest Vec3f\n"
"--- @param src Vec3f\n"
"--- @return Vec3f\n"
@@ -85,6 +98,7 @@ char gSmluaConstants[] = ""
" dest.z = src.z\n"
" return dest\n"
"end\n"
+"\n"
"--- @param dest Vec3f\n"
"--- @param x number\n"
"--- @param y number\n"
@@ -96,6 +110,7 @@ char gSmluaConstants[] = ""
" dest.z = z\n"
" return dest\n"
"end\n"
+"\n"
"--- @param dest Vec3f\n"
"--- @param a Vec3f\n"
"--- @return Vec3f\n"
@@ -105,6 +120,7 @@ char gSmluaConstants[] = ""
" dest.z = dest.z + a.z\n"
" return dest\n"
"end\n"
+"\n"
"--- @param dest Vec3f\n"
"--- @param a Vec3f\n"
"--- @param b Vec3f\n"
@@ -115,6 +131,7 @@ char gSmluaConstants[] = ""
" dest.z = a.z + b.z\n"
" return dest\n"
"end\n"
+"\n"
"--- @param dest Vec3f\n"
"--- @param a number\n"
"--- @return Vec3f\n"
@@ -124,6 +141,7 @@ char gSmluaConstants[] = ""
" dest.z = dest.z * a\n"
" return dest\n"
"end\n"
+"\n"
"--- @param dest Vec3f\n"
"--- @return Vec3f\n"
"function vec3f_normalize(dest)\n"
@@ -131,23 +149,28 @@ char gSmluaConstants[] = ""
" if divisor == 0 then\n"
" return dest\n"
" end\n"
+"\n"
" local invsqrt = 1.0 / divisor\n"
" dest.x = dest.x * invsqrt\n"
" dest.y = dest.y * invsqrt\n"
" dest.z = dest.z * invsqrt\n"
+"\n"
" return dest\n"
"end\n"
+"\n"
"--- @param a Vec3f\n"
"--- @return number\n"
"function vec3f_length(a)\n"
" return math.sqrt(a.x * a.x + a.y * a.y + a.z * a.z)\n"
"end\n"
+"\n"
"--- @param a Vec3f\n"
"--- @param b Vec3f\n"
"--- @return number\n"
"function vec3f_dot(a, b)\n"
" return a.x * b.x + a.y * b.y + a.z * b.z\n"
"end\n"
+"\n"
"--- @param vec Vec3f\n"
"--- @param onto Vec3f\n"
"--- @return Vec3f\n"
@@ -159,6 +182,7 @@ char gSmluaConstants[] = ""
" vec3f_mul(out, numerator / denominator)\n"
" return out\n"
"end\n"
+"\n"
"--- @param v1 Vec3f\n"
"--- @param v2 Vec3f\n"
"--- @return number\n"
@@ -168,6 +192,7 @@ char gSmluaConstants[] = ""
" dz = v1.z - v2.z\n"
" return math.sqrt(dx * dx + dy * dy + dz * dz)\n"
"end\n"
+"\n"
"--- @param dest Vec3s\n"
"--- @param src Vec3s\n"
"--- @return Vec3s\n"
@@ -177,6 +202,7 @@ char gSmluaConstants[] = ""
" dest.z = src.z\n"
" return dest\n"
"end\n"
+"\n"
"--- @param dest Vec3s\n"
"--- @param x number\n"
"--- @param y number\n"
@@ -188,6 +214,7 @@ char gSmluaConstants[] = ""
" dest.z = z\n"
" return dest\n"
"end\n"
+"\n"
"--- @param dest Vec3s\n"
"--- @param a Vec3s\n"
"--- @return Vec3s\n"
@@ -197,6 +224,7 @@ char gSmluaConstants[] = ""
" dest.z = dest.z + a.z\n"
" return dest\n"
"end\n"
+"\n"
"--- @param dest Vec3s\n"
"--- @param a Vec3s\n"
"--- @param b Vec3s\n"
@@ -207,6 +235,7 @@ char gSmluaConstants[] = ""
" dest.z = a.z + b.z\n"
" return dest\n"
"end\n"
+"\n"
"--- @param dest Vec3s\n"
"--- @param a number\n"
"--- @return Vec3s\n"
@@ -216,6 +245,7 @@ char gSmluaConstants[] = ""
" dest.z = dest.z * a\n"
" return dest\n"
"end\n"
+"\n"
"--- @param v1 Vec3s\n"
"--- @param v2 Vec3s\n"
"--- @return number\n"
@@ -225,6 +255,7 @@ char gSmluaConstants[] = ""
" dz = v1.z - v2.z\n"
" return math.sqrt(dx * dx + dy * dy + dz * dz)\n"
"end\n"
+"\n"
"--- @param current number\n"
"--- @param target number\n"
"--- @param inc number\n"
@@ -244,6 +275,7 @@ char gSmluaConstants[] = ""
" end\n"
" return current;\n"
"end\n"
+"\n"
"--- @param current number\n"
"--- @param target number\n"
"--- @param inc number\n"
@@ -261,6 +293,7 @@ char gSmluaConstants[] = ""
" current = target\n"
" end\n"
" end\n"
+"\n"
" -- keep within 32 bits\n"
" if current > 2147483647 then\n"
" current = -2147483648 + (current - 2147483647)\n"
@@ -269,6 +302,7 @@ char gSmluaConstants[] = ""
" end\n"
" return current;\n"
"end\n"
+"\n"
"--- @param bank number\n"
"--- @param soundID number\n"
"--- @param priority number\n"
@@ -278,9 +312,11 @@ char gSmluaConstants[] = ""
" if flags == nil then flags = 0 end\n"
" return (bank << 28) | (soundID << 16) | (priority << 8) | flags | SOUND_STATUS_WAITING\n"
"end\n"
+"\n"
"-------------\n"
"-- courses --\n"
"-------------\n"
+"\n"
"--- @type integer\n"
"COURSE_NONE = 0\n"
"--- @type integer\n"
@@ -1544,6 +1580,11 @@ char gSmluaConstants[] = ""
"WARP_OP_FORCE_SYNC = 0x20\n"
"WARP_OP_EXIT = 0x21\n"
"WARP_OP_TRIGGERS_LEVEL_SELECT = 0x10\n"
+"SPECIAL_WARP_CAKE = -1\n"
+"SPECIAL_WARP_GODDARD = -2\n"
+"SPECIAL_WARP_GODDARD_GAMEOVER = -3\n"
+"SPECIAL_WARP_TITLE = -8\n"
+"SPECIAL_WARP_LEVEL_SELECT = -9\n"
"MARIO_SPAWN_DOOR_WARP = 0x01\n"
"MARIO_SPAWN_UNKNOWN_02 = 0x02\n"
"MARIO_SPAWN_UNKNOWN_03 = 0x03\n"
diff --git a/src/pc/lua/smlua_functions_autogen.c b/src/pc/lua/smlua_functions_autogen.c
index 01d5ebd39..bb65320a4 100644
--- a/src/pc/lua/smlua_functions_autogen.c
+++ b/src/pc/lua/smlua_functions_autogen.c
@@ -13832,6 +13832,23 @@ 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 //
/////////////
@@ -32039,6 +32056,7 @@ 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);