mirror of
https://github.com/zeldaret/mm.git
synced 2026-05-24 23:21:26 -04:00
z_sound_source OK (#353)
* z_sound_source OK * Fix Pos * Lib_PlaySfxByPos * Change function names * format * Update names to match OoT * cleanup from the merge * Fix name
This commit is contained in:
@@ -134,7 +134,7 @@
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019F170.s")
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019F1C0.s")
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/Audio_PlaySfxAtPos.s")
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019F208.s")
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/code/code_801A5BD0/func_801A7284.s")
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/code/code_801A5BD0/func_801A72CC.s")
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/code/code_801A5BD0/Audio_StopSfxByPos.s")
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/code/code_801A5BD0/func_801A7328.s")
|
||||
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
#include "global.h"
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/code/code_800F0390/func_800F0390.s")
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/code/code_800F0390/func_800F03C0.s")
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/code/code_800F0390/func_800F048C.s")
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/code/code_800F0390/Audio_PlaySoundAtPosition.s")
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/code/code_800F0390/func_800F0590.s")
|
||||
+7
-7
@@ -2139,7 +2139,7 @@ void func_800B8E58(Player* player, u16 sfxId) {
|
||||
* Plays the sound effect at the actor's position
|
||||
*/
|
||||
void Actor_PlaySfxAtPos(Actor* actor, u16 sfxId) {
|
||||
func_8019F1C0(&actor->projectedPos, sfxId);
|
||||
Audio_PlaySfxAtPos(&actor->projectedPos, sfxId);
|
||||
}
|
||||
|
||||
void func_800B8EF4(GlobalContext* globalCtx, Actor* actor) {
|
||||
@@ -2155,8 +2155,8 @@ void func_800B8EF4(GlobalContext* globalCtx, Actor* actor) {
|
||||
sfxId = SurfaceType_GetSfx(&globalCtx->colCtx, actor->floorPoly, actor->floorBgId);
|
||||
}
|
||||
|
||||
func_8019F1C0(&actor->projectedPos, NA_SE_EV_BOMB_BOUND);
|
||||
func_8019F1C0(&actor->projectedPos, sfxId + SFX_FLAG);
|
||||
Audio_PlaySfxAtPos(&actor->projectedPos, NA_SE_EV_BOMB_BOUND);
|
||||
Audio_PlaySfxAtPos(&actor->projectedPos, sfxId + SFX_FLAG);
|
||||
}
|
||||
|
||||
void func_800B8F98(Actor* actor, u16 sfxId) {
|
||||
@@ -2580,7 +2580,7 @@ void func_800B9D1C(Actor* actor) {
|
||||
} else if (actor->audioFlags & 0x10) {
|
||||
func_801A0810(&D_801DB4A4, NA_SE_SY_TIMER - SFX_FLAG, (sfxId - 1));
|
||||
} else if (actor->audioFlags & 1) {
|
||||
func_8019F1C0(&actor->projectedPos, sfxId);
|
||||
Audio_PlaySfxAtPos(&actor->projectedPos, sfxId);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3345,7 +3345,7 @@ Actor* Actor_Delete(ActorContext* actorCtx, Actor* actor, GlobalContext* globalC
|
||||
actorCtx->targetContext.bgmEnemy = NULL;
|
||||
}
|
||||
|
||||
func_801A72CC(&actor->projectedPos);
|
||||
Audio_StopSfxByPos(&actor->projectedPos);
|
||||
Actor_Destroy(actor, globalCtx);
|
||||
|
||||
newHead = Actor_RemoveFromCategory(globalCtx, actorCtx, actor);
|
||||
@@ -3487,7 +3487,7 @@ void func_800BB8EC(GameState* gameState, ActorContext* actorCtx, Actor** arg2, A
|
||||
*/
|
||||
void Enemy_StartFinishingBlow(GlobalContext* globalCtx, Actor* actor) {
|
||||
globalCtx->actorCtx.freezeFlashTimer = 5;
|
||||
Audio_PlaySoundAtPosition(globalCtx, &actor->world.pos, 20, NA_SE_EN_LAST_DAMAGE);
|
||||
SoundSource_PlaySfxAtFixedWorldPos(globalCtx, &actor->world.pos, 20, NA_SE_EN_LAST_DAMAGE);
|
||||
}
|
||||
|
||||
// blinking routine
|
||||
@@ -4717,7 +4717,7 @@ void Actor_SpawnIceEffects(GlobalContext* globalCtx, Actor* actor, Vec3f limbPos
|
||||
s16 yaw;
|
||||
s32 j;
|
||||
|
||||
Audio_PlaySoundAtPosition(globalCtx, &actor->world.pos, 30, NA_SE_EV_ICE_BROKEN);
|
||||
SoundSource_PlaySfxAtFixedWorldPos(globalCtx, &actor->world.pos, 30, NA_SE_EV_ICE_BROKEN);
|
||||
|
||||
for (i = 0; i < limbPosCount; i++) {
|
||||
yaw = Actor_YawToPoint(actor, limbPos);
|
||||
|
||||
@@ -1525,7 +1525,7 @@ void CollisionCheck_HitSolid(GlobalContext* globalCtx, ColliderInfo* info, Colli
|
||||
if (collider->actor == NULL) {
|
||||
play_sound(NA_SE_IT_SHIELD_BOUND);
|
||||
} else {
|
||||
func_8019F1C0(&collider->actor->projectedPos, NA_SE_IT_SHIELD_BOUND);
|
||||
Audio_PlaySfxAtPos(&collider->actor->projectedPos, NA_SE_IT_SHIELD_BOUND);
|
||||
}
|
||||
} else if (flags == TOUCH_SFX_NORMAL) {
|
||||
EffectSsHitMark_SpawnFixedScale(globalCtx, 3, hitPos);
|
||||
@@ -1539,14 +1539,14 @@ void CollisionCheck_HitSolid(GlobalContext* globalCtx, ColliderInfo* info, Colli
|
||||
if (collider->actor == NULL) {
|
||||
play_sound(NA_SE_IT_SHIELD_BOUND);
|
||||
} else {
|
||||
func_8019F1C0(&collider->actor->projectedPos, NA_SE_IT_SHIELD_BOUND);
|
||||
Audio_PlaySfxAtPos(&collider->actor->projectedPos, NA_SE_IT_SHIELD_BOUND);
|
||||
}
|
||||
} else if (flags == TOUCH_SFX_WOOD) {
|
||||
EffectSsHitMark_SpawnFixedScale(globalCtx, 1, hitPos);
|
||||
if (collider->actor == NULL) {
|
||||
play_sound(NA_SE_IT_REFLECTION_WOOD);
|
||||
} else {
|
||||
func_8019F1C0(&collider->actor->projectedPos, NA_SE_IT_REFLECTION_WOOD);
|
||||
Audio_PlaySfxAtPos(&collider->actor->projectedPos, NA_SE_IT_REFLECTION_WOOD);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1557,13 +1557,13 @@ void CollisionCheck_HitSolid(GlobalContext* globalCtx, ColliderInfo* info, Colli
|
||||
s32 CollisionCheck_SwordHitAudio(Collider* at, ColliderInfo* acInfo) {
|
||||
if (at->actor != NULL && at->actor->category == ACTORCAT_PLAYER) {
|
||||
if (acInfo->elemType == ELEMTYPE_UNK0) {
|
||||
func_8019F1C0(&at->actor->projectedPos, NA_SE_IT_SWORD_STRIKE);
|
||||
Audio_PlaySfxAtPos(&at->actor->projectedPos, NA_SE_IT_SWORD_STRIKE);
|
||||
} else if (acInfo->elemType == ELEMTYPE_UNK1) {
|
||||
func_8019F1C0(&at->actor->projectedPos, NA_SE_IT_SWORD_STRIKE_HARD);
|
||||
Audio_PlaySfxAtPos(&at->actor->projectedPos, NA_SE_IT_SWORD_STRIKE_HARD);
|
||||
} else if (acInfo->elemType == ELEMTYPE_UNK2) {
|
||||
func_8019F1C0(&at->actor->projectedPos, 0);
|
||||
Audio_PlaySfxAtPos(&at->actor->projectedPos, 0);
|
||||
} else if (acInfo->elemType == ELEMTYPE_UNK3) {
|
||||
func_8019F1C0(&at->actor->projectedPos, 0);
|
||||
Audio_PlaySfxAtPos(&at->actor->projectedPos, 0);
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
@@ -1618,7 +1618,7 @@ void CollisionCheck_HitEffects(GlobalContext* globalCtx, Collider* at, ColliderI
|
||||
if (ac->actor == NULL) {
|
||||
play_sound(NA_SE_IT_SHIELD_BOUND);
|
||||
} else {
|
||||
func_8019F1C0(&ac->actor->projectedPos, NA_SE_IT_SHIELD_BOUND);
|
||||
Audio_PlaySfxAtPos(&ac->actor->projectedPos, NA_SE_IT_SHIELD_BOUND);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3905,7 +3905,7 @@ void CollisionCheck_SpawnShieldParticlesMetal(GlobalContext* globalCtx, Vec3f* v
|
||||
*/
|
||||
void CollisionCheck_SpawnShieldParticlesMetalSound(GlobalContext* globalCtx, Vec3f* v, Vec3f* pos) {
|
||||
CollisionCheck_SpawnShieldParticles(globalCtx, v);
|
||||
func_8019F1C0(pos, NA_SE_IT_SHIELD_REFLECT_SW);
|
||||
Audio_PlaySfxAtPos(pos, NA_SE_IT_SHIELD_REFLECT_SW);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -3945,7 +3945,7 @@ void CollisionCheck_SpawnShieldParticlesWood(GlobalContext* globalCtx, Vec3f* v,
|
||||
shieldParticleInitWood.lightPoint.z = shieldParticleInitWood.position.z;
|
||||
|
||||
Effect_Add(globalCtx, &effectIndex, EFFECT_SHIELD_PARTICLE, 0, 1, &shieldParticleInitWood);
|
||||
func_8019F1C0(pos, NA_SE_IT_REFLECTION_WOOD);
|
||||
Audio_PlaySfxAtPos(pos, NA_SE_IT_REFLECTION_WOOD);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -58,11 +58,11 @@ EffectSs* EffectSS_GetTable() {
|
||||
|
||||
void EffectSS_Delete(EffectSs* effectSs) {
|
||||
if (effectSs->flags & 2) {
|
||||
func_801A72CC(&effectSs->pos);
|
||||
Audio_StopSfxByPos(&effectSs->pos);
|
||||
}
|
||||
|
||||
if (effectSs->flags & 4) {
|
||||
func_801A72CC(&effectSs->vec);
|
||||
Audio_StopSfxByPos(&effectSs->vec);
|
||||
}
|
||||
|
||||
EffectSS_ResetEntry(effectSs);
|
||||
|
||||
@@ -858,7 +858,7 @@ Actor* Item_DropCollectible(GlobalContext* globalCtx, Vec3f* spawnPos, u32 param
|
||||
spawnedActor = Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_ELF, spawnPos->x, spawnPos->y + 40.0f,
|
||||
spawnPos->z, 0, 0, 0, ((((param7F00 >> 8) & 0x7F) << 9) & 0xFE00) | 0x102);
|
||||
if (!Flags_GetCollectible(globalCtx, (param7F00 >> 8) & 0x7F)) {
|
||||
Audio_PlaySoundAtPosition(globalCtx, spawnPos, 40, NA_SE_EV_BUTTERFRY_TO_FAIRY);
|
||||
SoundSource_PlaySfxAtFixedWorldPos(globalCtx, spawnPos, 40, NA_SE_EV_BUTTERFRY_TO_FAIRY);
|
||||
}
|
||||
} else {
|
||||
spawnedActor =
|
||||
@@ -866,7 +866,7 @@ Actor* Item_DropCollectible(GlobalContext* globalCtx, Vec3f* spawnPos, u32 param
|
||||
spawnPos->z, 0, 0, 0, ((((param7F00 >> 8) & 0x7F) & 0x7F) << 9) | 7);
|
||||
if (param20000 == 0) {
|
||||
if (!Flags_GetCollectible(globalCtx, (param7F00 >> 8) & 0x7F)) {
|
||||
Audio_PlaySoundAtPosition(globalCtx, spawnPos, 40, NA_SE_EV_BUTTERFRY_TO_FAIRY);
|
||||
SoundSource_PlaySfxAtFixedWorldPos(globalCtx, spawnPos, 40, NA_SE_EV_BUTTERFRY_TO_FAIRY);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -924,7 +924,7 @@ Actor* Item_DropCollectible2(GlobalContext* globalCtx, Vec3f* spawnPos, s32 para
|
||||
spawnPos->z, 0, 0, 0, ((((param7F00 >> 8) & 0x7F) & 0x7F) << 9) | 7);
|
||||
}
|
||||
if (Flags_GetCollectible(globalCtx, (param7F00 >> 8) & 0x7F) == 0) {
|
||||
Audio_PlaySoundAtPosition(globalCtx, spawnPos, 40, NA_SE_EV_BUTTERFRY_TO_FAIRY);
|
||||
SoundSource_PlaySfxAtFixedWorldPos(globalCtx, spawnPos, 40, NA_SE_EV_BUTTERFRY_TO_FAIRY);
|
||||
}
|
||||
} else {
|
||||
params = func_800A7650(params & 0xFF);
|
||||
@@ -1080,7 +1080,7 @@ void Item_DropCollectibleRandom(GlobalContext* globalCtx, Actor* fromActor, Vec3
|
||||
if (gSaveContext.health <= 0x10) {
|
||||
Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_ELF, spawnPos->x, spawnPos->y + 40.0f,
|
||||
spawnPos->z, 0, 0, 0, 2);
|
||||
Audio_PlaySoundAtPosition(globalCtx, spawnPos, 40, NA_SE_EV_BUTTERFRY_TO_FAIRY);
|
||||
SoundSource_PlaySfxAtFixedWorldPos(globalCtx, spawnPos, 40, NA_SE_EV_BUTTERFRY_TO_FAIRY);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -131,7 +131,7 @@ void FireObj_UpdateStateTransitions(GlobalContext* globalCtx, FireObj* fire) {
|
||||
}
|
||||
} else if (player->unk_B28 == 0) {
|
||||
player->unk_B28 = 0xD2;
|
||||
Audio_PlaySoundAtPosition(globalCtx, &fire->position, 20, NA_SE_EV_FLAME_IGNITION);
|
||||
SoundSource_PlaySfxAtFixedWorldPos(globalCtx, &fire->position, 20, NA_SE_EV_FLAME_IGNITION);
|
||||
} else if (player->unk_B28 < 0xC8) {
|
||||
player->unk_B28 = 0xC8;
|
||||
}
|
||||
|
||||
+2
-2
@@ -647,8 +647,8 @@ void func_801000CC(u16 sfxId) {
|
||||
func_8019F128(sfxId);
|
||||
}
|
||||
|
||||
void func_801000F4(s32 a0, u16 sfxId) {
|
||||
func_8019F1C0(a0, sfxId);
|
||||
void Lib_PlaySfxAtPos(Vec3f* pos, u16 sfxId) {
|
||||
Audio_PlaySfxAtPos(pos, sfxId);
|
||||
}
|
||||
|
||||
void Lib_Vec3f_TranslateAndRotateY(Vec3f* translation, s16 a, Vec3f* src, Vec3f* dst) {
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
#include "global.h"
|
||||
|
||||
void SoundSource_InitAll(GlobalContext* globalCtx) {
|
||||
SoundSource* sources = &globalCtx->soundSources[0];
|
||||
s32 i;
|
||||
|
||||
// clang-format off
|
||||
for (i = 0; i < ARRAY_COUNT(globalCtx->soundSources); i++) { sources[i].countdown = 0; }
|
||||
// clang-format on
|
||||
}
|
||||
|
||||
void SoundSource_UpdateAll(GlobalContext* globalCtx) {
|
||||
SoundSource* source = &globalCtx->soundSources[0];
|
||||
s32 i;
|
||||
|
||||
for (i = 0; i < ARRAY_COUNT(globalCtx->soundSources); i++) {
|
||||
if (source->countdown != 0) {
|
||||
if (DECR(source->countdown) == 0) {
|
||||
Audio_StopSfxByPos(&source->projectedPos);
|
||||
} else {
|
||||
SkinMatrix_Vec3fMtxFMultXYZ(&globalCtx->viewProjectionMtxF, &source->worldPos, &source->projectedPos);
|
||||
if (source->playSfxEachFrame) {
|
||||
Audio_PlaySfxAtPos(&source->projectedPos, source->sfxId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
source++;
|
||||
}
|
||||
}
|
||||
|
||||
void SoundSource_Add(GlobalContext* globalCtx, Vec3f* worldPos, u32 duration, u16 sfxId, u32 playSfxEachFrame) {
|
||||
s32 countdown;
|
||||
SoundSource* source;
|
||||
s32 smallestCountdown = 0xFFFF;
|
||||
SoundSource* backupSource = NULL;
|
||||
s32 i;
|
||||
|
||||
source = &globalCtx->soundSources[0];
|
||||
for (i = 0; i < ARRAY_COUNT(globalCtx->soundSources); i++) {
|
||||
if (source->countdown == 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
// Store the sound source with the smallest remaining countdown
|
||||
countdown = source->countdown;
|
||||
if (countdown < smallestCountdown) {
|
||||
smallestCountdown = countdown;
|
||||
backupSource = source;
|
||||
}
|
||||
source++;
|
||||
}
|
||||
|
||||
// If no sound source is available, replace the sound source with the smallest remaining countdown
|
||||
if (i >= ARRAY_COUNT(globalCtx->soundSources)) {
|
||||
source = backupSource;
|
||||
Audio_StopSfxByPos(&source->projectedPos);
|
||||
}
|
||||
|
||||
source->worldPos = *worldPos;
|
||||
source->countdown = duration;
|
||||
source->playSfxEachFrame = playSfxEachFrame;
|
||||
source->sfxId = sfxId;
|
||||
|
||||
SkinMatrix_Vec3fMtxFMultXYZ(&globalCtx->viewProjectionMtxF, &source->worldPos, &source->projectedPos);
|
||||
Audio_PlaySfxAtPos(&source->projectedPos, sfxId);
|
||||
}
|
||||
|
||||
void SoundSource_PlaySfxAtFixedWorldPos(GlobalContext* globalCtx, Vec3f* worldPos, u32 duration, u16 sfxId) {
|
||||
SoundSource_Add(globalCtx, worldPos, duration, sfxId, false);
|
||||
}
|
||||
|
||||
void SoundSource_PlaySfxEachFrameAtFixedWorldPos(GlobalContext* globalCtx, Vec3f* worldPos, u32 duration, u16 sfxId) {
|
||||
SoundSource_Add(globalCtx, worldPos, duration, sfxId, true);
|
||||
}
|
||||
Reference in New Issue
Block a user