diff options
Diffstat (limited to 'src/code')
| -rw-r--r-- | src/code/audio/code_8019AF00.c | 2 | ||||
| -rw-r--r-- | src/code/audio/code_801A5BD0.c | 2 | ||||
| -rw-r--r-- | src/code/code_800F0390.c | 11 | ||||
| -rw-r--r-- | src/code/z_actor.c | 14 | ||||
| -rw-r--r-- | src/code/z_collision_check.c | 20 | ||||
| -rw-r--r-- | src/code/z_effect_soft_sprite.c | 4 | ||||
| -rw-r--r-- | src/code/z_en_item00.c | 8 | ||||
| -rw-r--r-- | src/code/z_fireobj.c | 2 | ||||
| -rw-r--r-- | src/code/z_lib.c | 4 | ||||
| -rw-r--r-- | src/code/z_sound_source.c | 75 |
10 files changed, 103 insertions, 39 deletions
diff --git a/src/code/audio/code_8019AF00.c b/src/code/audio/code_8019AF00.c index 9354af188..5d0a166a2 100644 --- a/src/code/audio/code_8019AF00.c +++ b/src/code/audio/code_8019AF00.c @@ -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") diff --git a/src/code/audio/code_801A5BD0.c b/src/code/audio/code_801A5BD0.c index 0a13b00ec..7d796aa9f 100644 --- a/src/code/audio/code_801A5BD0.c +++ b/src/code/audio/code_801A5BD0.c @@ -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") diff --git a/src/code/code_800F0390.c b/src/code/code_800F0390.c deleted file mode 100644 index f495cfe5e..000000000 --- a/src/code/code_800F0390.c +++ /dev/null @@ -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") diff --git a/src/code/z_actor.c b/src/code/z_actor.c index 49eee7235..0b38d135f 100644 --- a/src/code/z_actor.c +++ b/src/code/z_actor.c @@ -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); diff --git a/src/code/z_collision_check.c b/src/code/z_collision_check.c index 44885d6c7..ddf21fe17 100644 --- a/src/code/z_collision_check.c +++ b/src/code/z_collision_check.c @@ -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); } /** diff --git a/src/code/z_effect_soft_sprite.c b/src/code/z_effect_soft_sprite.c index fddcf7f95..11545da01 100644 --- a/src/code/z_effect_soft_sprite.c +++ b/src/code/z_effect_soft_sprite.c @@ -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); diff --git a/src/code/z_en_item00.c b/src/code/z_en_item00.c index ec32550f8..2f0668c66 100644 --- a/src/code/z_en_item00.c +++ b/src/code/z_en_item00.c @@ -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; } diff --git a/src/code/z_fireobj.c b/src/code/z_fireobj.c index 7c5de646a..2cf05e02a 100644 --- a/src/code/z_fireobj.c +++ b/src/code/z_fireobj.c @@ -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; } diff --git a/src/code/z_lib.c b/src/code/z_lib.c index 5bc49c8ac..84eb8c051 100644 --- a/src/code/z_lib.c +++ b/src/code/z_lib.c @@ -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) { diff --git a/src/code/z_sound_source.c b/src/code/z_sound_source.c new file mode 100644 index 000000000..ba7036a4c --- /dev/null +++ b/src/code/z_sound_source.c @@ -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); +} |
