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