allocate_mario_action fix and improvement (#453)

This commit is contained in:
PeachyPeach 2023-08-18 18:55:39 +02:00 committed by GitHub
parent 930d225b5e
commit cdc1b30c6f
7 changed files with 31 additions and 6 deletions

View File

@ -7597,6 +7597,9 @@ ACT_IDLE = 0x0C400201
--- @type integer
ACT_ID_MASK = 0x000001FF
--- @type integer
ACT_INDEX_MASK = (ACT_ID_MASK & ~ACT_GROUP_MASK)
--- @type integer
ACT_INTRO_CUTSCENE = 0x04001301
@ -7672,6 +7675,12 @@ ACT_METAL_WATER_WALKING = 0x000044F2
--- @type integer
ACT_MOVE_PUNCHING = 0x00800457
--- @type integer
ACT_NUM_ACTIONS_PER_GROUP = (ACT_INDEX_MASK + 1)
--- @type integer
ACT_NUM_GROUPS = ((ACT_GROUP_MASK >> 6) + 1)
--- @type integer
ACT_PANTING = 0x0C400205

View File

@ -2714,6 +2714,7 @@
- ACT_HOLD_WATER_JUMP
- ACT_IDLE
- ACT_ID_MASK
- ACT_INDEX_MASK
- ACT_INTRO_CUTSCENE
- ACT_IN_CANNON
- ACT_IN_QUICKSAND
@ -2739,6 +2740,8 @@
- ACT_METAL_WATER_STANDING
- ACT_METAL_WATER_WALKING
- ACT_MOVE_PUNCHING
- ACT_NUM_ACTIONS_PER_GROUP
- ACT_NUM_GROUPS
- ACT_PANTING
- ACT_PICKING_UP
- ACT_PICKING_UP_BOWSER

View File

@ -151,6 +151,10 @@
#define ACT_GROUP_AUTOMATIC /* 0x00000140 */ (5 << 6)
#define ACT_GROUP_OBJECT /* 0x00000180 */ (6 << 6)
#define ACT_INDEX_MASK (ACT_ID_MASK & ~ACT_GROUP_MASK)
#define ACT_NUM_GROUPS ((ACT_GROUP_MASK >> 6) + 1)
#define ACT_NUM_ACTIONS_PER_GROUP (ACT_INDEX_MASK + 1)
#define ACT_FLAG_STATIONARY /* 0x00000200 */ (1 << 9)
#define ACT_FLAG_MOVING /* 0x00000400 */ (1 << 10)
#define ACT_FLAG_AIR /* 0x00000800 */ (1 << 11)

View File

@ -2678,6 +2678,9 @@ char gSmluaConstants[] = ""
"ACT_GROUP_CUTSCENE = (4 << 6)\n"
"ACT_GROUP_AUTOMATIC = (5 << 6)\n"
"ACT_GROUP_OBJECT = (6 << 6)\n"
"ACT_INDEX_MASK = (ACT_ID_MASK & ~ACT_GROUP_MASK)\n"
"ACT_NUM_GROUPS = ((ACT_GROUP_MASK >> 6) + 1)\n"
"ACT_NUM_ACTIONS_PER_GROUP = (ACT_INDEX_MASK + 1)\n"
"ACT_FLAG_STATIONARY = (1 << 9)\n"
"ACT_FLAG_MOVING = (1 << 10)\n"
"ACT_FLAG_AIR = (1 << 11)\n"

View File

@ -1,4 +1,5 @@
#include "smlua.h"
#include "sm64.h"
#include "behavior_commands.h"
#include "pc/mods/mod.h"
#include "src/game/object_list_processor.h"
@ -851,11 +852,11 @@ struct LuaHookedMarioAction {
struct Mod* mod;
};
#define MAX_HOOKED_ACTIONS 128
#define MAX_HOOKED_ACTIONS (ACT_NUM_GROUPS * ACT_NUM_ACTIONS_PER_GROUP)
static struct LuaHookedMarioAction sHookedMarioActions[MAX_HOOKED_ACTIONS] = { 0 };
static int sHookedMarioActionsCount = 0;
u32 gLuaMarioActionIndex = 0;
u32 gLuaMarioActionIndex[ACT_NUM_GROUPS] = { 0 };
int smlua_hook_mario_action(lua_State* L) {
if (L == NULL) { return 0; }
@ -1564,7 +1565,7 @@ void smlua_clear_hooks(void) {
hooked->mod = NULL;
}
sHookedBehaviorsCount = 0;
gLuaMarioActionIndex = 0;
memset(gLuaMarioActionIndex, 0, sizeof(gLuaMarioActionIndex));
}
void smlua_bind_hooks(void) {

View File

@ -98,7 +98,7 @@ static const char* LuaActionHookTypeArgName[] = {
"max (dummy)",
};
extern u32 gLuaMarioActionIndex;
extern u32 gLuaMarioActionIndex[];
int smlua_hook_custom_bhv(BehaviorScript *bhvScript, const char *bhvName);

View File

@ -441,8 +441,13 @@ bool is_transition_playing(void) {
///
u32 allocate_mario_action(u32 actFlags) {
actFlags = actFlags & (~((u32)0x3F));
return actFlags | ACT_FLAG_CUSTOM_ACTION | gLuaMarioActionIndex++;
u32 actGroup = ((actFlags & ACT_GROUP_MASK) >> 6);
u32 actIndex = gLuaMarioActionIndex[actGroup]++;
if (actIndex >= ACT_NUM_ACTIONS_PER_GROUP) {
LOG_LUA("Cannot allocate more actions for group %u", actGroup);
return 0;
}
return (actFlags & ~ACT_INDEX_MASK) | ACT_FLAG_CUSTOM_ACTION | actIndex;
}
///