From 24df92fa4839ec36219baa4a5fcc1005c407ea42 Mon Sep 17 00:00:00 2001 From: MysterD Date: Fri, 11 Mar 2022 18:11:32 -0800 Subject: [PATCH] Added DynOS warp functions to Lua API --- autogen/convert_constants.py | 4 +- autogen/extract_constants.py | 22 +++++++- autogen/extract_structs.py | 3 + data/dynos_coop.c.h | 3 + data/dynos_coop_c.cpp | 12 ++++ docs/lua/constants.md | 52 +++++++++++++++++ docs/lua/functions.md | 84 ++++++++++++++++++++++++++++ src/pc/lua/smlua_cobject_autogen.c | 1 + src/pc/lua/smlua_constants_autogen.c | 40 +++++++++++++ src/pc/lua/smlua_functions_autogen.c | 50 +++++++++++++++++ src/pc/lua/utils/smlua_misc_utils.c | 16 ++++++ src/pc/lua/utils/smlua_misc_utils.h | 5 ++ 12 files changed, 290 insertions(+), 2 deletions(-) diff --git a/autogen/convert_constants.py b/autogen/convert_constants.py index ebe7ac20..7027f60c 100644 --- a/autogen/convert_constants.py +++ b/autogen/convert_constants.py @@ -26,10 +26,11 @@ in_files = [ "include/mario_geo_switch_case_ids.h", "src/game/object_list_processor.h", "src/engine/graph_node.h", + "levels/level_defines.h", ] exclude_constants = { - '*': [ '^MAXCONTROLLERS$', '^LEVEL_.*', '^AREA_[^T].*', '^AREA_T[HTO]', '^CONT_ERR.*', '^READ_MASK$', '^SIGN_RANGE$', ] + '*': [ '^MAXCONTROLLERS$', '^AREA_[^T].*', '^AREA_T[HTO]', '^CONT_ERR.*', '^READ_MASK$', '^SIGN_RANGE$', ] } include_constants = { @@ -125,6 +126,7 @@ def process_enum(filename, line): if saw_constant(field): print('>>> ' + line) + index += 1 ret['constants'] = constants diff --git a/autogen/extract_constants.py b/autogen/extract_constants.py index 9f27d36d..70272113 100644 --- a/autogen/extract_constants.py +++ b/autogen/extract_constants.py @@ -2,10 +2,28 @@ import os import re import sys +def extract_level_defines(txt): + tmp = txt + txt = 'enum LevelNum {\n LEVEL_NONE,\n' + for line in tmp.splitlines(): + if line.startswith('STUB_LEVEL') or line.startswith('DEFINE_LEVEL'): + txt += ' ' + line.split(',')[1].strip() + ',\n' + txt += ' LEVEL_COUNT,\n };' + return txt + +extra_steps = { + "levels/level_defines.h": extract_level_defines, +} + def extract_constants(filename): with open(filename) as file: txt = file.read() + # perform special functions + short_filename = filename.split('/../', 1)[-1] + if short_filename in extra_steps: + txt = extra_steps[short_filename](txt) + # strip comments txt = re.sub('//.*', ' ', txt) while ('/*' in txt): @@ -82,4 +100,6 @@ def extract_constants(filename): return txt -#print(extract_constants("include/audio_defines.h")) + +if __name__ == "__main__": + print(extract_constants(sys.argv[1])) diff --git a/autogen/extract_structs.py b/autogen/extract_structs.py index a31b92f1..f70c2867 100644 --- a/autogen/extract_structs.py +++ b/autogen/extract_structs.py @@ -72,3 +72,6 @@ def extract_structs(filename): txt += line + '\n' return txt.splitlines() + +if __name__ == "__main__": + print(extract_structs(sys.argv[1])) \ No newline at end of file diff --git a/data/dynos_coop.c.h b/data/dynos_coop.c.h index 1d1f59b4..f4b332e0 100644 --- a/data/dynos_coop.c.h +++ b/data/dynos_coop.c.h @@ -4,6 +4,9 @@ #ifndef __cplusplus bool dynos_warp_to_level(s32 aLevel, s32 aArea, s32 aAct); +bool dynos_warp_restart_level(void); +bool dynos_warp_exit_level(s32 aDelay); +bool dynos_warp_to_castle(s32 aLevel); int dynos_packs_get_count(void); const char* dynos_packs_get(s32 index); diff --git a/data/dynos_coop_c.cpp b/data/dynos_coop_c.cpp index eb04ffaf..d8a603f7 100644 --- a/data/dynos_coop_c.cpp +++ b/data/dynos_coop_c.cpp @@ -7,6 +7,18 @@ bool dynos_warp_to_level(s32 aLevel, s32 aArea, s32 aAct) { return DynOS_Warp_ToLevel(aLevel, aArea, aAct); } +bool dynos_warp_restart_level(void) { + return DynOS_Warp_RestartLevel(); +} + +bool dynos_warp_exit_level(s32 aDelay) { + return DynOS_Warp_ExitLevel(aDelay); +} + +bool dynos_warp_to_castle(s32 aLevel) { + return DynOS_Warp_ToCastle(aLevel); +} + // -- dynos packs -- // #define DYNOS_PACK_PATH_SPLIT_LEN 12 diff --git a/docs/lua/constants.md b/docs/lua/constants.md index df24e0b6..00c242e5 100644 --- a/docs/lua/constants.md +++ b/docs/lua/constants.md @@ -16,6 +16,8 @@ - [enum InteractionFlag](#enum-InteractionFlag) - [interaction.h](#interactionh) - [enum InteractionType](#enum-InteractionType) +- [level_defines.h](#level_definesh) + - [enum LevelNum](#enum-LevelNum) - [mario_animation_ids.h](#mario_animation_idsh) - [enum MarioAnimID](#enum-MarioAnimID) - [mario_geo_switch_case_ids.h](#mario_geo_switch_case_idsh) @@ -1460,6 +1462,56 @@
+## [level_defines.h](#level_defines.h) + +### [enum LevelNum](#LevelNum) +| Identifier | Value | +| :--------- | :---- | +| LEVEL_NONE | 0 | +| LEVEL_UNKNOWN_1 | 1 | +| LEVEL_UNKNOWN_2 | 2 | +| LEVEL_UNKNOWN_3 | 3 | +| LEVEL_BBH | 4 | +| LEVEL_CCM | 5 | +| LEVEL_CASTLE | 6 | +| LEVEL_HMC | 7 | +| LEVEL_SSL | 8 | +| LEVEL_BOB | 9 | +| LEVEL_SL | 10 | +| LEVEL_WDW | 11 | +| LEVEL_JRB | 12 | +| LEVEL_THI | 13 | +| LEVEL_TTC | 14 | +| LEVEL_RR | 15 | +| LEVEL_CASTLE_GROUNDS | 16 | +| LEVEL_BITDW | 17 | +| LEVEL_VCUTM | 18 | +| LEVEL_BITFS | 19 | +| LEVEL_SA | 20 | +| LEVEL_BITS | 21 | +| LEVEL_LLL | 22 | +| LEVEL_DDD | 23 | +| LEVEL_WF | 24 | +| LEVEL_ENDING | 25 | +| LEVEL_CASTLE_COURTYARD | 26 | +| LEVEL_PSS | 27 | +| LEVEL_COTMC | 28 | +| LEVEL_TOTWC | 29 | +| LEVEL_BOWSER_1 | 30 | +| LEVEL_WMOTR | 31 | +| LEVEL_UNKNOWN_32 | 32 | +| LEVEL_BOWSER_2 | 33 | +| LEVEL_BOWSER_3 | 34 | +| LEVEL_UNKNOWN_35 | 35 | +| LEVEL_TTM | 36 | +| LEVEL_UNKNOWN_37 | 37 | +| LEVEL_UNKNOWN_38 | 38 | +| LEVEL_COUNT | 39 | + +[:arrow_up_small:](#) + +
+ ## [mario_animation_ids.h](#mario_animation_ids.h) ### [enum MarioAnimID](#MarioAnimID) diff --git a/docs/lua/functions.md b/docs/lua/functions.md index 64585c0f..22a65034 100644 --- a/docs/lua/functions.md +++ b/docs/lua/functions.md @@ -626,6 +626,10 @@ - [get_network_area_timer](#get_network_area_timer) - [hud_hide](#hud_hide) - [hud_show](#hud_show) + - [warp_exit_level](#warp_exit_level) + - [warp_restart_level](#warp_restart_level) + - [warp_to_castle](#warp_to_castle) + - [warp_to_level](#warp_to_level)
@@ -11499,6 +11503,86 @@ The `reliable` field will ensure that the packet arrives, but should be used spa
+## [warp_exit_level](#warp_exit_level) + +### Lua Example +`local boolValue = warp_exit_level(aDelay)` + +### Parameters +| Field | Type | +| ----- | ---- | +| aDelay | `integer` | + +### Returns +- `bool` + +### C Prototype +`bool warp_exit_level(s32 aDelay);` + +[:arrow_up_small:](#) + +
+ +## [warp_restart_level](#warp_restart_level) + +### Lua Example +`local boolValue = warp_restart_level()` + +### Parameters +- None + +### Returns +- `bool` + +### C Prototype +`bool warp_restart_level(void);` + +[:arrow_up_small:](#) + +
+ +## [warp_to_castle](#warp_to_castle) + +### Lua Example +`local boolValue = warp_to_castle(aLevel)` + +### Parameters +| Field | Type | +| ----- | ---- | +| aLevel | `integer` | + +### Returns +- `bool` + +### C Prototype +`bool warp_to_castle(s32 aLevel);` + +[:arrow_up_small:](#) + +
+ +## [warp_to_level](#warp_to_level) + +### Lua Example +`local boolValue = warp_to_level(aLevel, aArea, aAct)` + +### Parameters +| Field | Type | +| ----- | ---- | +| aLevel | `integer` | +| aArea | `integer` | +| aAct | `integer` | + +### Returns +- `bool` + +### C Prototype +`bool warp_to_level(s32 aLevel, s32 aArea, s32 aAct);` + +[:arrow_up_small:](#) + +
+ --- # functions from smlua_obj_utils.h diff --git a/src/pc/lua/smlua_cobject_autogen.c b/src/pc/lua/smlua_cobject_autogen.c index 2fbf1796..f86dc585 100644 --- a/src/pc/lua/smlua_cobject_autogen.c +++ b/src/pc/lua/smlua_cobject_autogen.c @@ -426,6 +426,7 @@ static struct LuaObjectField sGlobalTexturesFields[LUA_GLOBAL_TEXTURES_FIELD_COU static struct LuaObjectField sGraphNodeFields[LUA_GRAPH_NODE_FIELD_COUNT] = { { "children", LVT_COBJECT_P, offsetof(struct GraphNode, children), false, LOT_GRAPHNODE }, { "flags", LVT_S16, offsetof(struct GraphNode, flags), false, LOT_NONE }, +// { "georef", LVT_???, offsetof(struct GraphNode, georef), true, LOT_??? }, <--- UNIMPLEMENTED { "next", LVT_COBJECT_P, offsetof(struct GraphNode, next), false, LOT_GRAPHNODE }, { "parent", LVT_COBJECT_P, offsetof(struct GraphNode, parent), false, LOT_GRAPHNODE }, { "prev", LVT_COBJECT_P, offsetof(struct GraphNode, prev), false, LOT_GRAPHNODE }, diff --git a/src/pc/lua/smlua_constants_autogen.c b/src/pc/lua/smlua_constants_autogen.c index ccc47798..ab6695c3 100644 --- a/src/pc/lua/smlua_constants_autogen.c +++ b/src/pc/lua/smlua_constants_autogen.c @@ -1514,6 +1514,46 @@ char gSmluaConstants[] = "" "INT_STATUS_HIT_MINE = (1 << 21)\n" "INT_STATUS_STOP_RIDING = (1 << 22)\n" "INT_STATUS_TOUCHED_BOB_OMB = (1 << 23)\n" +"LEVEL_NONE = 0\n" +"LEVEL_UNKNOWN_1 = 1\n" +"LEVEL_UNKNOWN_2 = 2\n" +"LEVEL_UNKNOWN_3 = 3\n" +"LEVEL_BBH = 4\n" +"LEVEL_CCM = 5\n" +"LEVEL_CASTLE = 6\n" +"LEVEL_HMC = 7\n" +"LEVEL_SSL = 8\n" +"LEVEL_BOB = 9\n" +"LEVEL_SL = 10\n" +"LEVEL_WDW = 11\n" +"LEVEL_JRB = 12\n" +"LEVEL_THI = 13\n" +"LEVEL_TTC = 14\n" +"LEVEL_RR = 15\n" +"LEVEL_CASTLE_GROUNDS = 16\n" +"LEVEL_BITDW = 17\n" +"LEVEL_VCUTM = 18\n" +"LEVEL_BITFS = 19\n" +"LEVEL_SA = 20\n" +"LEVEL_BITS = 21\n" +"LEVEL_LLL = 22\n" +"LEVEL_DDD = 23\n" +"LEVEL_WF = 24\n" +"LEVEL_ENDING = 25\n" +"LEVEL_CASTLE_COURTYARD = 26\n" +"LEVEL_PSS = 27\n" +"LEVEL_COTMC = 28\n" +"LEVEL_TOTWC = 29\n" +"LEVEL_BOWSER_1 = 30\n" +"LEVEL_WMOTR = 31\n" +"LEVEL_UNKNOWN_32 = 32\n" +"LEVEL_BOWSER_2 = 33\n" +"LEVEL_BOWSER_3 = 34\n" +"LEVEL_UNKNOWN_35 = 35\n" +"LEVEL_TTM = 36\n" +"LEVEL_UNKNOWN_37 = 37\n" +"LEVEL_UNKNOWN_38 = 38\n" +"LEVEL_COUNT = 39\n" "MARIO_ANIM_SLOW_LEDGE_GRAB = 0\n" "MARIO_ANIM_FALL_OVER_BACKWARDS = 1\n" "MARIO_ANIM_BACKWARD_AIR_KB = 2\n" diff --git a/src/pc/lua/smlua_functions_autogen.c b/src/pc/lua/smlua_functions_autogen.c index 3a55d933..b74ae050 100644 --- a/src/pc/lua/smlua_functions_autogen.c +++ b/src/pc/lua/smlua_functions_autogen.c @@ -7322,6 +7322,52 @@ int smlua_func_hud_show(UNUSED lua_State* L) { return 1; } +int smlua_func_warp_exit_level(lua_State* L) { + if(!smlua_functions_valid_param_count(L, 1)) { return 0; } + + s32 aDelay = smlua_to_integer(L, 1); + if (!gSmLuaConvertSuccess) { return 0; } + + lua_pushboolean(L, warp_exit_level(aDelay)); + + return 1; +} + +int smlua_func_warp_restart_level(UNUSED lua_State* L) { + if(!smlua_functions_valid_param_count(L, 0)) { return 0; } + + + lua_pushboolean(L, warp_restart_level()); + + return 1; +} + +int smlua_func_warp_to_castle(lua_State* L) { + if(!smlua_functions_valid_param_count(L, 1)) { return 0; } + + s32 aLevel = smlua_to_integer(L, 1); + if (!gSmLuaConvertSuccess) { return 0; } + + lua_pushboolean(L, warp_to_castle(aLevel)); + + return 1; +} + +int smlua_func_warp_to_level(lua_State* L) { + if(!smlua_functions_valid_param_count(L, 3)) { return 0; } + + s32 aLevel = smlua_to_integer(L, 1); + if (!gSmLuaConvertSuccess) { return 0; } + s32 aArea = smlua_to_integer(L, 2); + if (!gSmLuaConvertSuccess) { return 0; } + s32 aAct = smlua_to_integer(L, 3); + if (!gSmLuaConvertSuccess) { return 0; } + + lua_pushboolean(L, warp_to_level(aLevel, aArea, aAct)); + + return 1; +} + /////////////////////// // smlua_obj_utils.h // /////////////////////// @@ -8638,6 +8684,10 @@ void smlua_bind_functions_autogen(void) { smlua_bind_function(L, "get_network_area_timer", smlua_func_get_network_area_timer); smlua_bind_function(L, "hud_hide", smlua_func_hud_hide); smlua_bind_function(L, "hud_show", smlua_func_hud_show); + smlua_bind_function(L, "warp_exit_level", smlua_func_warp_exit_level); + smlua_bind_function(L, "warp_restart_level", smlua_func_warp_restart_level); + smlua_bind_function(L, "warp_to_castle", smlua_func_warp_to_castle); + smlua_bind_function(L, "warp_to_level", smlua_func_warp_to_level); // smlua_obj_utils.h smlua_bind_function(L, "obj_get_first", smlua_func_obj_get_first); diff --git a/src/pc/lua/utils/smlua_misc_utils.c b/src/pc/lua/utils/smlua_misc_utils.c index 40965db1..9f4d0826 100644 --- a/src/pc/lua/utils/smlua_misc_utils.c +++ b/src/pc/lua/utils/smlua_misc_utils.c @@ -1,5 +1,6 @@ #include "types.h" +#include "data/dynos_coop.c.h" #include "game/hud.h" #include "pc/lua/smlua.h" #include "smlua_misc_utils.h" @@ -17,3 +18,18 @@ void hud_show(void) { gOverrideHideHud = 0; } +bool warp_to_level(s32 aLevel, s32 aArea, s32 aAct) { + return dynos_warp_to_level(aLevel, aArea, aAct); +} + +bool warp_restart_level(void) { + return dynos_warp_restart_level(); +} + +bool warp_exit_level(s32 aDelay) { + return dynos_warp_exit_level(aDelay); +} + +bool warp_to_castle(s32 aLevel) { + return dynos_warp_to_castle(aLevel); +} diff --git a/src/pc/lua/utils/smlua_misc_utils.h b/src/pc/lua/utils/smlua_misc_utils.h index fe5bacef..dfa1be07 100644 --- a/src/pc/lua/utils/smlua_misc_utils.h +++ b/src/pc/lua/utils/smlua_misc_utils.h @@ -6,4 +6,9 @@ u32 get_network_area_timer(void); void hud_hide(void); void hud_show(void); +bool warp_to_level(s32 aLevel, s32 aArea, s32 aAct); +bool warp_restart_level(void); +bool warp_exit_level(s32 aDelay); +bool warp_to_castle(s32 aLevel); + #endif