diff --git a/autogen/lua_definitions/constants.lua b/autogen/lua_definitions/constants.lua index 678ab435..3913bc7f 100644 --- a/autogen/lua_definitions/constants.lua +++ b/autogen/lua_definitions/constants.lua @@ -4385,6 +4385,9 @@ ACT_FLAG_BUTT_OR_STOMACH_SLIDE = (1 << 18) --- @type integer ACT_FLAG_CONTROL_JUMP_HEIGHT = (1 << 25) +--- @type integer +ACT_FLAG_CUSTOM_ACTION = (1 << 30) + --- @type integer ACT_FLAG_DIVING = (1 << 19) diff --git a/autogen/lua_definitions/functions.lua b/autogen/lua_definitions/functions.lua index a45ac4c8..b318d282 100644 --- a/autogen/lua_definitions/functions.lua +++ b/autogen/lua_definitions/functions.lua @@ -3476,6 +3476,12 @@ function collision_find_surface_on_ray(startX, startY, startZ, endX, endY, endZ) -- ... end +--- @param actFlags integer +--- @return integer +function allocate_mario_action(actFlags) + -- ... +end + --- @return integer function get_network_area_timer() -- ... diff --git a/docs/lua/constants.md b/docs/lua/constants.md index 560dd496..3dcb4592 100644 --- a/docs/lua/constants.md +++ b/docs/lua/constants.md @@ -1550,6 +1550,7 @@ - ACT_FLAG_ATTACKING - ACT_FLAG_BUTT_OR_STOMACH_SLIDE - ACT_FLAG_CONTROL_JUMP_HEIGHT +- ACT_FLAG_CUSTOM_ACTION - ACT_FLAG_DIVING - ACT_FLAG_HANGING - ACT_FLAG_IDLE diff --git a/docs/lua/functions.md b/docs/lua/functions.md index 5296ab61..6c550dd2 100644 --- a/docs/lua/functions.md +++ b/docs/lua/functions.md @@ -634,6 +634,7 @@
- smlua_misc_utils.h + - [allocate_mario_action](#allocate_mario_action) - [get_network_area_timer](#get_network_area_timer) - [hud_hide](#hud_hide) - [hud_show](#hud_show) @@ -11614,6 +11615,26 @@ The `reliable` field will ensure that the packet arrives, but should be used spa
+## [allocate_mario_action](#allocate_mario_action) + +### Lua Example +`local integerValue = allocate_mario_action(actFlags)` + +### Parameters +| Field | Type | +| ----- | ---- | +| actFlags | `integer` | + +### Returns +- `integer` + +### C Prototype +`u32 allocate_mario_action(u32 actFlags);` + +[:arrow_up_small:](#) + +
+ ## [get_network_area_timer](#get_network_area_timer) ### Lua Example diff --git a/include/sm64.h b/include/sm64.h index b3f1ed34..e31e3eda 100644 --- a/include/sm64.h +++ b/include/sm64.h @@ -167,6 +167,7 @@ #define ACT_FLAG_PAUSE_EXIT /* 0x08000000 */ (1 << 27) #define ACT_FLAG_SWIMMING_OR_FLYING /* 0x10000000 */ (1 << 28) #define ACT_FLAG_WATER_OR_TEXT /* 0x20000000 */ (1 << 29) +#define ACT_FLAG_CUSTOM_ACTION /* 0x40000000 */ (1 << 30) #define ACT_FLAG_THROWING /* 0x80000000 */ (1 << 31) #define ACT_UNINITIALIZED 0x00000000 // (0x000) diff --git a/mods/character-movesets.lua b/mods/character-movesets.lua index 3339976c..515e2b9d 100644 --- a/mods/character-movesets.lua +++ b/mods/character-movesets.lua @@ -36,8 +36,8 @@ end -- luigi -- ----------- -ACT_SPIN_POUND_LAND = (0x037 | ACT_FLAG_STATIONARY | ACT_FLAG_ATTACKING) -ACT_SPIN_POUND = (0x08F | ACT_FLAG_AIR | ACT_FLAG_ATTACKING) +ACT_SPIN_POUND_LAND = allocate_mario_action(ACT_FLAG_STATIONARY | ACT_FLAG_ATTACKING) +ACT_SPIN_POUND = allocate_mario_action(ACT_FLAG_AIR | ACT_FLAG_ATTACKING) function act_spin_pound(m) local e = gStateExtras[m.playerIndex] @@ -360,7 +360,7 @@ gEventTable[CT_TOAD] = { -- waluigi -- ------------- -ACT_WALL_SLIDE = (0x0BF | ACT_FLAG_AIR | ACT_FLAG_MOVING | ACT_FLAG_ALLOW_VERTICAL_WIND_ACTION) +ACT_WALL_SLIDE = allocate_mario_action(ACT_FLAG_AIR | ACT_FLAG_MOVING | ACT_FLAG_ALLOW_VERTICAL_WIND_ACTION) function act_wall_slide(m) if (m.input & INPUT_A_PRESSED) ~= 0 then @@ -482,10 +482,10 @@ gEventTable[CT_WALUIGI] = { -- wario -- ----------- -ACT_WARIO_DASH = (0x05B | ACT_FLAG_MOVING | ACT_FLAG_ATTACKING) -ACT_WARIO_AIR_DASH = (0x05B | ACT_FLAG_AIR | ACT_FLAG_ATTACKING) -ACT_CORKSCREW_CONK = (0x05D | ACT_FLAG_AIR | ACT_FLAG_ATTACKING | ACT_FLAG_ALLOW_VERTICAL_WIND_ACTION) -ACT_WARIO_SPINNING_OBJ = (0x05B | ACT_FLAG_STATIONARY) +ACT_WARIO_DASH = allocate_mario_action(ACT_FLAG_MOVING | ACT_FLAG_ATTACKING) +ACT_WARIO_AIR_DASH = allocate_mario_action(ACT_FLAG_AIR | ACT_FLAG_ATTACKING) +ACT_CORKSCREW_CONK = allocate_mario_action(ACT_FLAG_AIR | ACT_FLAG_ATTACKING | ACT_FLAG_ALLOW_VERTICAL_WIND_ACTION) +ACT_WARIO_SPINNING_OBJ = allocate_mario_action(ACT_FLAG_STATIONARY) function act_corkscrew_conk(m) local e = gStateExtras[m.playerIndex] diff --git a/mods/extended-moveset.lua b/mods/extended-moveset.lua index c9777e1a..b3b5f02e 100644 --- a/mods/extended-moveset.lua +++ b/mods/extended-moveset.lua @@ -6,18 +6,18 @@ -- initialize actions -- ------------------------ -ACT_SPIN_POUND_LAND = (0x037 | ACT_FLAG_STATIONARY | ACT_FLAG_ATTACKING) -ACT_ROLL = (0x05B | ACT_FLAG_MOVING | ACT_FLAG_BUTT_OR_STOMACH_SLIDE) -ACT_GROUND_POUND_JUMP = (0x084 | ACT_FLAG_AIR | ACT_FLAG_ALLOW_VERTICAL_WIND_ACTION) -ACT_SPIN_JUMP = (0x08B | ACT_FLAG_AIR | ACT_FLAG_ALLOW_VERTICAL_WIND_ACTION) -ACT_SPIN_POUND = (0x08F | ACT_FLAG_AIR | ACT_FLAG_ATTACKING) -ACT_LEDGE_PARKOUR = (0x09D | ACT_FLAG_AIR) -ACT_ROLL_AIR = (0x0BA | ACT_FLAG_AIR | ACT_FLAG_ALLOW_VERTICAL_WIND_ACTION) -ACT_WALL_SLIDE = (0x0BF | ACT_FLAG_AIR | ACT_FLAG_MOVING | ACT_FLAG_ALLOW_VERTICAL_WIND_ACTION) -ACT_WATER_GROUND_POUND = (0x0C9 | ACT_FLAG_MOVING | ACT_FLAG_SWIMMING | ACT_FLAG_SWIMMING_OR_FLYING | ACT_FLAG_WATER_OR_TEXT | ACT_FLAG_ATTACKING) -ACT_WATER_GROUND_POUND_LAND = (0x0CA | ACT_FLAG_STATIONARY | ACT_FLAG_SWIMMING | ACT_FLAG_SWIMMING_OR_FLYING | ACT_FLAG_WATER_OR_TEXT) -ACT_WATER_GROUND_POUND_STROKE = (0x0CB | ACT_FLAG_MOVING | ACT_FLAG_SWIMMING | ACT_FLAG_SWIMMING_OR_FLYING | ACT_FLAG_WATER_OR_TEXT) -ACT_WATER_GROUND_POUND_JUMP = (0x0CC | ACT_FLAG_MOVING | ACT_FLAG_SWIMMING | ACT_FLAG_SWIMMING_OR_FLYING | ACT_FLAG_WATER_OR_TEXT) +ACT_SPIN_POUND_LAND = allocate_mario_action(ACT_FLAG_STATIONARY | ACT_FLAG_ATTACKING) +ACT_ROLL = allocate_mario_action(ACT_FLAG_MOVING | ACT_FLAG_BUTT_OR_STOMACH_SLIDE) +ACT_GROUND_POUND_JUMP = allocate_mario_action(ACT_FLAG_AIR | ACT_FLAG_ALLOW_VERTICAL_WIND_ACTION) +ACT_SPIN_JUMP = allocate_mario_action(ACT_FLAG_AIR | ACT_FLAG_ALLOW_VERTICAL_WIND_ACTION) +ACT_SPIN_POUND = allocate_mario_action(ACT_FLAG_AIR | ACT_FLAG_ATTACKING) +ACT_LEDGE_PARKOUR = allocate_mario_action(ACT_FLAG_AIR) +ACT_ROLL_AIR = allocate_mario_action(ACT_FLAG_AIR | ACT_FLAG_ALLOW_VERTICAL_WIND_ACTION) +ACT_WALL_SLIDE = allocate_mario_action(ACT_FLAG_AIR | ACT_FLAG_MOVING | ACT_FLAG_ALLOW_VERTICAL_WIND_ACTION) +ACT_WATER_GROUND_POUND = allocate_mario_action(ACT_FLAG_MOVING | ACT_FLAG_SWIMMING | ACT_FLAG_SWIMMING_OR_FLYING | ACT_FLAG_WATER_OR_TEXT | ACT_FLAG_ATTACKING) +ACT_WATER_GROUND_POUND_LAND = allocate_mario_action(ACT_FLAG_STATIONARY | ACT_FLAG_SWIMMING | ACT_FLAG_SWIMMING_OR_FLYING | ACT_FLAG_WATER_OR_TEXT) +ACT_WATER_GROUND_POUND_STROKE = allocate_mario_action(ACT_FLAG_MOVING | ACT_FLAG_SWIMMING | ACT_FLAG_SWIMMING_OR_FLYING | ACT_FLAG_WATER_OR_TEXT) +ACT_WATER_GROUND_POUND_JUMP = allocate_mario_action(ACT_FLAG_MOVING | ACT_FLAG_SWIMMING | ACT_FLAG_SWIMMING_OR_FLYING | ACT_FLAG_WATER_OR_TEXT) ----------------------------- -- initialize extra fields -- diff --git a/src/pc/lua/smlua_constants_autogen.c b/src/pc/lua/smlua_constants_autogen.c index a43e9121..ea73d035 100644 --- a/src/pc/lua/smlua_constants_autogen.c +++ b/src/pc/lua/smlua_constants_autogen.c @@ -1651,6 +1651,7 @@ char gSmluaConstants[] = "" "ACT_FLAG_PAUSE_EXIT = (1 << 27)\n" "ACT_FLAG_SWIMMING_OR_FLYING = (1 << 28)\n" "ACT_FLAG_WATER_OR_TEXT = (1 << 29)\n" +"ACT_FLAG_CUSTOM_ACTION = (1 << 30)\n" "ACT_FLAG_THROWING = (1 << 31)\n" "ACT_UNINITIALIZED = 0x00000000\n" "ACT_IDLE = 0x0C400201\n" diff --git a/src/pc/lua/smlua_functions_autogen.c b/src/pc/lua/smlua_functions_autogen.c index 3ef69dcf..f7021451 100644 --- a/src/pc/lua/smlua_functions_autogen.c +++ b/src/pc/lua/smlua_functions_autogen.c @@ -7400,6 +7400,17 @@ int smlua_func_collision_find_surface_on_ray(lua_State* L) { // smlua_misc_utils.h // //////////////////////// +int smlua_func_allocate_mario_action(lua_State* L) { + if(!smlua_functions_valid_param_count(L, 1)) { return 0; } + + u32 actFlags = smlua_to_integer(L, 1); + if (!gSmLuaConvertSuccess) { return 0; } + + lua_pushinteger(L, allocate_mario_action(actFlags)); + + return 1; +} + int smlua_func_get_network_area_timer(UNUSED lua_State* L) { if(!smlua_functions_valid_param_count(L, 0)) { return 0; } @@ -8769,6 +8780,7 @@ void smlua_bind_functions_autogen(void) { smlua_bind_function(L, "collision_find_surface_on_ray", smlua_func_collision_find_surface_on_ray); // smlua_misc_utils.h + smlua_bind_function(L, "allocate_mario_action", smlua_func_allocate_mario_action); 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); diff --git a/src/pc/lua/smlua_hooks.c b/src/pc/lua/smlua_hooks.c index 296d8b35..4507cecb 100644 --- a/src/pc/lua/smlua_hooks.c +++ b/src/pc/lua/smlua_hooks.c @@ -230,6 +230,7 @@ struct LuaHookedMarioAction { static struct LuaHookedMarioAction sHookedMarioActions[MAX_HOOKED_ACTIONS] = { 0 }; static int sHookedMarioActionsCount = 0; +u32 gLuaMarioActionIndex = 0; int smlua_hook_mario_action(lua_State* L) { if (L == NULL) { return 0; } @@ -742,6 +743,7 @@ static void smlua_clear_hooks(void) { hooked->mod = NULL; } sHookedBehaviorsCount = 0; + gLuaMarioActionIndex = 0; } void smlua_bind_hooks(void) { diff --git a/src/pc/lua/smlua_hooks.h b/src/pc/lua/smlua_hooks.h index 987be442..e81eede4 100644 --- a/src/pc/lua/smlua_hooks.h +++ b/src/pc/lua/smlua_hooks.h @@ -40,6 +40,8 @@ static char* LuaHookedEventTypeName[] = { "HOOK_MAX" }; +extern u32 gLuaMarioActionIndex; + void smlua_call_event_hooks(enum LuaHookedEventType hookType); void smlua_call_event_hooks_mario_param(enum LuaHookedEventType hookType, struct MarioState* m); void smlua_call_event_hooks_mario_params(enum LuaHookedEventType hookType, struct MarioState* m1, struct MarioState* m2); diff --git a/src/pc/lua/utils/smlua_misc_utils.c b/src/pc/lua/utils/smlua_misc_utils.c index 9f4d0826..0b786268 100644 --- a/src/pc/lua/utils/smlua_misc_utils.c +++ b/src/pc/lua/utils/smlua_misc_utils.c @@ -1,3 +1,4 @@ +#include "sm64.h" #include "types.h" #include "data/dynos_coop.c.h" @@ -33,3 +34,8 @@ bool warp_exit_level(s32 aDelay) { bool warp_to_castle(s32 aLevel) { return dynos_warp_to_castle(aLevel); } + +u32 allocate_mario_action(u32 actFlags) { + actFlags = actFlags & (~((u32)0xFF)); + return actFlags | ACT_FLAG_CUSTOM_ACTION | gLuaMarioActionIndex++; +} \ No newline at end of file diff --git a/src/pc/lua/utils/smlua_misc_utils.h b/src/pc/lua/utils/smlua_misc_utils.h index dfa1be07..5fdd83ed 100644 --- a/src/pc/lua/utils/smlua_misc_utils.h +++ b/src/pc/lua/utils/smlua_misc_utils.h @@ -11,4 +11,6 @@ bool warp_restart_level(void); bool warp_exit_level(s32 aDelay); bool warp_to_castle(s32 aLevel); +u32 allocate_mario_action(u32 actFlags); + #endif