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:
engineer124
2022-01-11 11:27:36 +11:00
committed by GitHub
parent 6069a1585f
commit 133e02a8a7
62 changed files with 239 additions and 169 deletions
+1 -1
View File
@@ -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")
+1 -1
View File
@@ -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")
-11
View File
@@ -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
View File
@@ -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);
+10 -10
View File
@@ -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);
}
/**
+2 -2
View File
@@ -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);
+4 -4
View File
@@ -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;
}
+1 -1
View File
@@ -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
View File
@@ -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) {
+75
View File
@@ -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);
}