HOOK_ON_PLAY_SOUND

This commit is contained in:
Agent X 2024-02-18 14:54:01 -05:00
parent c1d3aba94e
commit d7bad7dcdd
11 changed files with 71 additions and 10 deletions

View file

@ -395,4 +395,5 @@ COURSE_MIN = 1
----------------- -----------------
-- legacy font -- -- legacy font --
----------------- -----------------
FONT_TINY = -1 FONT_TINY = -1

View file

@ -397,6 +397,7 @@ COURSE_MIN = 1
----------------- -----------------
-- legacy font -- -- legacy font --
----------------- -----------------
FONT_TINY = -1 FONT_TINY = -1
--- @type integer --- @type integer
@ -9294,7 +9295,10 @@ HOOK_OVERRIDE_PHYS_STEP_DEFACTO_SPEED = 39
HOOK_ON_OBJECT_LOAD = 40 HOOK_ON_OBJECT_LOAD = 40
--- @type LuaHookedEventType --- @type LuaHookedEventType
HOOK_MAX = 41 HOOK_ON_PLAY_SOUND = 41
--- @type LuaHookedEventType
HOOK_MAX = 42
--- @class HudDisplayFlags --- @class HudDisplayFlags
@ -12595,7 +12599,7 @@ MINOR_VERSION_NUMBER = 1
PATCH_VERSION_NUMBER = 0 PATCH_VERSION_NUMBER = 0
--- @type string --- @type string
SM64COOPDX_VERSION = "v0.1.3" SM64COOPDX_VERSION = "v0.1.4"
--- @type integer --- @type integer
VERSION_NUMBER = 36 VERSION_NUMBER = 36

View file

@ -3326,7 +3326,8 @@
| HOOK_MIRROR_MARIO_RENDER | 38 | | HOOK_MIRROR_MARIO_RENDER | 38 |
| HOOK_OVERRIDE_PHYS_STEP_DEFACTO_SPEED | 39 | | HOOK_OVERRIDE_PHYS_STEP_DEFACTO_SPEED | 39 |
| HOOK_ON_OBJECT_LOAD | 40 | | HOOK_ON_OBJECT_LOAD | 40 |
| HOOK_MAX | 41 | | HOOK_ON_PLAY_SOUND | 41 |
| HOOK_MAX | 42 |
[:arrow_up_small:](#) [:arrow_up_small:](#)

View file

@ -128,6 +128,7 @@ The lua functions sent to `hook_event()` will be automatically called by SM64 wh
| HOOK_MIRROR_MARIO_RENDER | Called when a Mirror Mario is rendered | [GraphNodeObject](structs.md#GraphNodeObject) mirrorMario | `integer` mirrorMarioIndex | | HOOK_MIRROR_MARIO_RENDER | Called when a Mirror Mario is rendered | [GraphNodeObject](structs.md#GraphNodeObject) mirrorMario | `integer` mirrorMarioIndex |
| HOOK_OVERRIDE_PHYS_STEP_DEFACTO_SPEED | Called when slope defacto speed for walking is being calculated, overrides the floor normal in the equation | [MarioState](structs.md#MarioState) mario | | HOOK_OVERRIDE_PHYS_STEP_DEFACTO_SPEED | Called when slope defacto speed for walking is being calculated, overrides the floor normal in the equation | [MarioState](structs.md#MarioState) mario |
| HOOK_ON_OBJECT_LOAD | Called when an object is spawned in | [Object](structs.md#Object) obj | | HOOK_ON_OBJECT_LOAD | Called when an object is spawned in | [Object](structs.md#Object) obj |
| HOOK_ON_PLAY_SOUND | Called when a sound is going to play, return a `SOUND_*` constant or `NO_SOUND` to override the sound | `integer` soundBits, `Vec3f` pos |
### Parameters ### Parameters

View file

@ -299,7 +299,7 @@ const u8 sBackgroundMusicDefaultVolumeDefault[35] = {
}; };
// Default volume for background music sequences (playing on player 0). // Default volume for background music sequences (playing on player 0).
u8 sBackgroundMusicDefaultVolume[64] = { u8 sBackgroundMusicDefaultVolume[MAX_AUDIO_OVERRIDE] = {
127, // SEQ_SOUND_PLAYER 127, // SEQ_SOUND_PLAYER
80, // SEQ_EVENT_CUTSCENE_COLLECT_STAR 80, // SEQ_EVENT_CUTSCENE_COLLECT_STAR
80, // SEQ_MENU_TITLE_SCREEN 80, // SEQ_MENU_TITLE_SCREEN
@ -366,7 +366,7 @@ u8 sBackgroundMusicDefaultVolume[64] = {
75, // SEQ_??? 75, // SEQ_???
}; };
STATIC_ASSERT(ARRAY_COUNT(sBackgroundMusicDefaultVolume) == 64, STATIC_ASSERT(ARRAY_COUNT(sBackgroundMusicDefaultVolume) == MAX_AUDIO_OVERRIDE,
"change this array if you are adding sequences"); "change this array if you are adding sequences");
u8 sCurrentBackgroundMusicSeqId = SEQUENCE_NONE; u8 sCurrentBackgroundMusicSeqId = SEQUENCE_NONE;
@ -836,6 +836,7 @@ extern f32 *smlua_get_vec3f_for_play_sound(f32 *pos);
void play_sound(s32 soundBits, f32 *pos) { void play_sound(s32 soundBits, f32 *pos) {
pos = smlua_get_vec3f_for_play_sound(pos); pos = smlua_get_vec3f_for_play_sound(pos);
smlua_call_event_hooks_on_play_sound(HOOK_ON_PLAY_SOUND, soundBits, pos, &soundBits);
sSoundRequests[sSoundRequestCount].soundBits = soundBits; sSoundRequests[sSoundRequestCount].soundBits = soundBits;
sSoundRequests[sSoundRequestCount].position = pos; sSoundRequests[sSoundRequestCount].position = pos;
sSoundRequests[sSoundRequestCount].customFreqScale = 0; sSoundRequests[sSoundRequestCount].customFreqScale = 0;
@ -844,6 +845,7 @@ void play_sound(s32 soundBits, f32 *pos) {
void play_sound_with_freq_scale(s32 soundBits, f32* pos, f32 freqScale) { void play_sound_with_freq_scale(s32 soundBits, f32* pos, f32 freqScale) {
pos = smlua_get_vec3f_for_play_sound(pos); pos = smlua_get_vec3f_for_play_sound(pos);
smlua_call_event_hooks_on_play_sound(HOOK_ON_PLAY_SOUND, soundBits, pos, &soundBits);
sSoundRequests[sSoundRequestCount].soundBits = soundBits; sSoundRequests[sSoundRequestCount].soundBits = soundBits;
sSoundRequests[sSoundRequestCount].position = pos; sSoundRequests[sSoundRequestCount].position = pos;
sSoundRequests[sSoundRequestCount].customFreqScale = freqScale; sSoundRequests[sSoundRequestCount].customFreqScale = freqScale;

View file

@ -5,6 +5,8 @@
#include "types.h" #include "types.h"
#include "pc/lua/utils/smlua_audio_utils.h"
// Sequence arguments, passed to seq_player_play_sequence. seqId may be bit-OR'ed with // Sequence arguments, passed to seq_player_play_sequence. seqId may be bit-OR'ed with
// SEQ_VARIATION; this will load the same sequence, but set a variation // SEQ_VARIATION; this will load the same sequence, but set a variation
// bit which may be read by the sequence script. // bit which may be read by the sequence script.
@ -44,7 +46,7 @@ extern s32 gAudioErrorFlags;
extern f32 gGlobalSoundSource[3]; extern f32 gGlobalSoundSource[3];
extern const u8 sBackgroundMusicDefaultVolumeDefault[35]; extern const u8 sBackgroundMusicDefaultVolumeDefault[35];
extern u8 sBackgroundMusicDefaultVolume[64]; extern u8 sBackgroundMusicDefaultVolume[MAX_AUDIO_OVERRIDE];
// defined in data.c, used by the game // defined in data.c, used by the game
extern u32 gAudioRandom; extern u32 gAudioRandom;

View file

@ -3297,7 +3297,8 @@ char gSmluaConstants[] = ""
"HOOK_MIRROR_MARIO_RENDER = 38\n" "HOOK_MIRROR_MARIO_RENDER = 38\n"
"HOOK_OVERRIDE_PHYS_STEP_DEFACTO_SPEED = 39\n" "HOOK_OVERRIDE_PHYS_STEP_DEFACTO_SPEED = 39\n"
"HOOK_ON_OBJECT_LOAD = 40\n" "HOOK_ON_OBJECT_LOAD = 40\n"
"HOOK_MAX = 41\n" "HOOK_ON_PLAY_SOUND = 41\n"
"HOOK_MAX = 42\n"
"ACTION_HOOK_EVERY_FRAME = 0\n" "ACTION_HOOK_EVERY_FRAME = 0\n"
"ACTION_HOOK_GRAVITY = 1\n" "ACTION_HOOK_GRAVITY = 1\n"
"ACTION_HOOK_MAX = 2\n" "ACTION_HOOK_MAX = 2\n"
@ -4393,7 +4394,7 @@ char gSmluaConstants[] = ""
"COOP_OBJ_FLAG_LUA = (1 << 1)\n" "COOP_OBJ_FLAG_LUA = (1 << 1)\n"
"COOP_OBJ_FLAG_NON_SYNC = (1 << 2)\n" "COOP_OBJ_FLAG_NON_SYNC = (1 << 2)\n"
"COOP_OBJ_FLAG_INITIALIZED = (1 << 3)\n" "COOP_OBJ_FLAG_INITIALIZED = (1 << 3)\n"
"SM64COOPDX_VERSION = 'v0.1.3'\n" "SM64COOPDX_VERSION = 'v0.1.4'\n"
"VERSION_TEXT = 'beta'\n" "VERSION_TEXT = 'beta'\n"
"VERSION_NUMBER = 36\n" "VERSION_NUMBER = 36\n"
"MINOR_VERSION_NUMBER = 1\n" "MINOR_VERSION_NUMBER = 1\n"

View file

@ -671,6 +671,52 @@ void smlua_call_event_hooks_value_param(enum LuaHookedEventType hookType, int mo
} }
} }
void smlua_call_event_hooks_on_play_sound(enum LuaHookedEventType hookType, s32 soundBits, f32* pos, s32* returnValue) {
lua_State* L = gLuaState;
if (L == NULL) { return; }
struct LuaHookedEvent* hook = &sHookedEvents[hookType];
for (int i = 0; i < hook->count; i++) {
s32 prevTop = lua_gettop(L);
// push the callback onto the stack
lua_rawgeti(L, LUA_REGISTRYINDEX, hook->reference[i]);
// push sound bits
lua_pushinteger(L, soundBits);
// push vec3f
lua_newtable(L);
int valTableIndex = lua_gettop(L);
lua_pushstring(L, "x");
lua_pushnumber(L, pos[0]);
lua_settable(L, valTableIndex);
lua_pushstring(L, "y");
lua_pushnumber(L, pos[1]);
lua_settable(L, valTableIndex);
lua_pushstring(L, "z");
lua_pushnumber(L, pos[2]);
lua_settable(L, valTableIndex);
// call the callback
if (0 != smlua_call_hook(L, 2, 1, 0, hook->mod[i])) {
LOG_LUA("Failed to call the callback: %u", hookType);
continue;
}
// output the return value
if (lua_type(L, -1) == LUA_TNUMBER) {
*returnValue = smlua_to_integer(L, -1);
lua_settop(L, prevTop);
return;
} else {
lua_settop(L, prevTop);
}
}
}
void smlua_call_event_hooks_use_act_select(enum LuaHookedEventType hookType, int value, bool* foundHook, bool* returnValue) { void smlua_call_event_hooks_use_act_select(enum LuaHookedEventType hookType, int value, bool* foundHook, bool* returnValue) {
lua_State* L = gLuaState; lua_State* L = gLuaState;
*foundHook = false; *foundHook = false;

View file

@ -52,6 +52,7 @@ enum LuaHookedEventType {
HOOK_MIRROR_MARIO_RENDER, HOOK_MIRROR_MARIO_RENDER,
HOOK_OVERRIDE_PHYS_STEP_DEFACTO_SPEED, HOOK_OVERRIDE_PHYS_STEP_DEFACTO_SPEED,
HOOK_ON_OBJECT_LOAD, HOOK_ON_OBJECT_LOAD,
HOOK_ON_PLAY_SOUND,
HOOK_MAX, HOOK_MAX,
}; };
@ -97,6 +98,7 @@ static const char* LuaHookedEventTypeName[] = {
"HOOK_MIRROR_MARIO_RENDER", "HOOK_MIRROR_MARIO_RENDER",
"HOOK_OVERRIDE_PHYS_STEP_DEFACTO_SPEED", "HOOK_OVERRIDE_PHYS_STEP_DEFACTO_SPEED",
"HOOK_ON_OBJECT_LOAD", "HOOK_ON_OBJECT_LOAD",
"HOOK_ON_PLAY_SOUND",
"HOOK_MAX" "HOOK_MAX"
}; };
@ -134,6 +136,7 @@ void smlua_call_event_hooks_set_camera_mode_params(enum LuaHookedEventType hookT
void smlua_call_event_hooks_int_params_ret_bool(enum LuaHookedEventType hookType, s16 param, bool* returnValue); void smlua_call_event_hooks_int_params_ret_bool(enum LuaHookedEventType hookType, s16 param, bool* returnValue);
void smlua_call_event_hooks_int_params_ret_int(enum LuaHookedEventType hookType, s32 param, s32* returnValue); void smlua_call_event_hooks_int_params_ret_int(enum LuaHookedEventType hookType, s32 param, s32* returnValue);
void smlua_call_event_hooks_value_param(enum LuaHookedEventType hookType, int modIndex, int valueIndex); void smlua_call_event_hooks_value_param(enum LuaHookedEventType hookType, int modIndex, int valueIndex);
void smlua_call_event_hooks_on_play_sound(enum LuaHookedEventType hookType, s32 soundBits, f32* pos, s32* returnValue);
void smlua_call_event_hooks_use_act_select(enum LuaHookedEventType hookType, int value, bool* foundHook, bool* returnValue); void smlua_call_event_hooks_use_act_select(enum LuaHookedEventType hookType, int value, bool* foundHook, bool* returnValue);
void smlua_call_event_hooks_ret_bool(enum LuaHookedEventType hookType, bool* returnValue); void smlua_call_event_hooks_ret_bool(enum LuaHookedEventType hookType, bool* returnValue);
void smlua_call_event_hooks_on_chat_message(enum LuaHookedEventType hookType, struct MarioState* m, const char* message, bool* returnValue); void smlua_call_event_hooks_on_chat_message(enum LuaHookedEventType hookType, struct MarioState* m, const char* message, bool* returnValue);

View file

@ -10,8 +10,6 @@
#include "bass_audio/bass_audio_helpers.h" #include "bass_audio/bass_audio_helpers.h"
#include "pc/debuglog.h" #include "pc/debuglog.h"
#define MAX_AUDIO_OVERRIDE 128
struct AudioOverride { struct AudioOverride {
bool enabled; bool enabled;
bool loaded; bool loaded;

View file

@ -1,6 +1,8 @@
#ifndef SMLUA_AUDIO_UTILS_H #ifndef SMLUA_AUDIO_UTILS_H
#define SMLUA_AUDIO_UTILS_H #define SMLUA_AUDIO_UTILS_H
#define MAX_AUDIO_OVERRIDE 128
void smlua_audio_utils_reset_all(void); void smlua_audio_utils_reset_all(void);
bool smlua_audio_utils_override(u8 sequenceId, s32* bankId, void** seqData); bool smlua_audio_utils_override(u8 sequenceId, s32* bankId, void** seqData);
void smlua_audio_utils_replace_sequence(u8 sequenceId, u8 bankId, u8 defaultVolume, const char* m64Name); void smlua_audio_utils_replace_sequence(u8 sequenceId, u8 bankId, u8 defaultVolume, const char* m64Name);