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);