match audioline_reset and func_80009D6C in audio_spatial.c (#536)

* wip

* match audioline_reset

* match func_80009D6C

* move ABS to macros.h
This commit is contained in:
Unnunu
2025-04-28 17:28:18 +03:00
committed by GitHub
parent eaf2af275b
commit 57aa448faa
10 changed files with 144 additions and 145 deletions
+5 -5
View File
@@ -7,7 +7,7 @@ All versions are supported, and the US 1.0 version (SHA1 = 0cb115d8716dbbc2922fd
<!-- README_SCORE_SUMMARY_BEGIN -->
As of April 28, 2025, this is our current score:
&emsp;&emsp;&emsp;&emsp;Decomp progress: 81.07%
&emsp;&emsp;&emsp;&emsp;Decomp progress: 81.27%
&emsp;&emsp;&emsp;&emsp;Documentation progress: 53.79%
<!-- README_SCORE_SUMMARY_END -->
@@ -121,11 +121,11 @@ As of April 28, 2025, this is our current score:
```
========================================================
ADVENTURE ONE (ASM -> C Decompilation)
-------- 81.07% Complete (83.88% NON_MATCHING) ---------
# Decompiled functions: 1863
# GLOBAL_ASM remaining: 88
-------- 81.27% Complete (84.08% NON_MATCHING) ---------
# Decompiled functions: 1865
# GLOBAL_ASM remaining: 86
# NON_MATCHING functions: 13
# NON_EQUIVALENT WIP functions: 28
# NON_EQUIVALENT WIP functions: 27
--------------------- Game Status ----------------------
Balloons: 39/47, Keys: 4/4, Trophies: 3/5
T.T. Amulets: 4/4, Wizpig Amulets: 3/4
+1
View File
@@ -58,6 +58,7 @@
#else
#define inline
#define ABSF(x) (x < 0.f ? -x : x)
#define ABS(x) ((x) >= 0 ? (x) : -(x))
#endif
// convert a virtual address to physical.
+127 -116
View File
@@ -62,7 +62,7 @@ void audioline_init(void) {
for (i = 0; i < SOUND_MASK_HEAP_COUNT; i++) {
gSoundMaskHeap[i].soundPtr = NULL;
}
func_80008174();
audioline_reset();
}
/**
@@ -82,20 +82,12 @@ void audioline_on(void) {
gAudioLinesOff = FALSE;
}
#ifdef NON_EQUIVALENT
s16 D_8011AC20[128];
// audioline_reset
void func_80008174(void) {
void audioline_reset(void) {
s32 i;
s32 j;
ALSoundState *sound;
SoundMask *heap;
// unk8011A6D8 *var_a1;
// unk8011A6D8 *var_a2;
// unk8011A6E0 *var_a3;
// unk80119C58 *var_s1;
// u32 target;
// f32 *var_v0;
f32 *ptr;
heap = gSoundMaskHeap;
gFreeMasks = 0;
@@ -116,96 +108,41 @@ void func_80008174(void) {
}
gUsedMasks = 0;
// var_s1 = D_80119C58;
// do {
// var_s1->soundID = 0;
// sound = var_s1->soundPtr;
// if (sound != 0) {
// if (var_s1->unk0.unk0_02 == 0) {
// sound_stop(sound);
// } else if (var_s1->unk0.unk0_02 == 1) {
// music_jingle_stop();
// }
// var_s1->soundPtr = NULL;
// var_s1->unk17C = -1;
// }
// var_s1->unk4.unk4_floats[0] = -100000.0f;;
// var_s1->unk4.unk4_floats[1] = -100000.0f;
// var_v0 = var_s1->unk4.unk4_floats;
// var_v0[4] = -100000.0f;
// var_v0[3] = -100000.0f;
// var_v0[2] = -100000.0f;
// var_v0[1] = -100000.0f;
for (i = 0; i < 7; i++) {
D_80119C58[i].soundID = 0;
if (D_80119C58[i].soundPtr != 0) {
if (D_80119C58[i].unk0_02 == 0) {
sound_stop(D_80119C58[i].soundPtr);
} else if (D_80119C58[i].unk0_02 == 1) {
music_jingle_stop();
}
D_80119C58[i].soundPtr = NULL;
}
D_80119C58[i].unk17C = -1;
// var_v0 = &var_s1->unk4.unk4_floats[5];
// for (j = 2; j != 30; j++, j+= 3) {// this should be j+=4 but has to be split up to match?
// // 2, 6, 10, 14, 18, 22, 26
// var_v0[3] = -100000.0f;;
// var_v0[4] = -100000.0f;
// var_v0[5] = -100000.0f;
// var_v0[6] = -100000.0f;
// var_v0[7] = -100000.0f;
// var_v0[8] = -100000.0f;
// var_v0[9] = -100000.0f;
// var_v0[10] = -100000.0f;
// var_v0[11] = -100000.0f;
// var_v0+= 12;
// var_v0[-12] = -100000.0f;
// var_v0[-11] = -100000.0f;
// var_v0[-10] = -100000.0f;
// };
// var_s1++;
// i++;
// } while (i != ARRAY_COUNT(D_80119C58));
ptr = D_80119C58[i].unk4_floats;
for (j = 0; j < 30; j++) {
*ptr++ = -100000.0f;
*ptr++ = -100000.0f;
*ptr++ = -100000.0f;
}
}
// target = D_8011AC20;
// var_a3 = D_8011A6E0;
// var_a2 = &D_8011A6DC;
// var_a1 = D_8011A6D8;
// do {
// var_a1->unkB8 = -1;
// var_a1->unk0.unk0_02 = 0;
// var_a1->unkBC = 0.0f;
// var_a1 = var_a2;
// var_a1->unk0.unk0_01 = -100000.0f;
for (i = 0; i < 7; i++) {
D_8011A6D8[i].unkB8 = -1;
D_8011A6D8[i].unk0_02 = 0;
D_8011A6D8[i].unkBC = 0.0f;
// var_a3->unk0 = -100000.0f;
// var_a3->unk1C = -100000.0f;
// var_a3->unk18 = -100000.0f;
// var_a3->unk14 = -100000.0f;
// var_a3->unk10 = -100000.0f;
// var_a3->unkC = -100000.0f;;
// var_a3->unk8 = -100000.0f;
// var_a3->unk4 = -100000.0f;
// var_v0_2 = var_a3->unk20;
// for (j = 3; j != 15; j++, j+= 3) {// this should be j+=4 but has to be split up to match?
// // 3, 7, 11
// var_v0_2->unkC = -100000.0f;;
// var_v0_2->unk10 = -100000.0f;
// var_v0_2->unk14 = -100000.0f;
// var_v0_2->unk18 = -100000.0f;
// var_v0_2->unk1C = -100000.0f;
// var_v0_2->unk20 = -100000.0f;
// var_v0_2->unk24 = -100000.0f;
// var_v0_2->unk28 = -100000.0f;
// var_v0_2->unk2C = -100000.0f;
// var_v0_2++;
// var_v0_2[-1].unk0 = -100000.0f;
// var_v0_2[-1].unk4 = -100000.0f;
// var_v0_2[-1].unk8 = -100000.0f;
// };
// var_a3++;
// var_a1++;
// var_a2++;
// } while((s32)var_a3 != target);
ptr = D_8011A6D8[i].unk4_floats;
for (j = 0; j < 15; j++) {
*ptr++ = -100000.0f;
*ptr++ = -100000.0f;
*ptr++ = -100000.0f;
}
}
gAudioLinesOff = 0;
}
#else
#pragma GLOBAL_ASM("asm/nonmatchings/audio_spatial/func_80008174.s")
#endif
// audioline_ambient
// Official Name: amPlayAudioMap
@@ -371,13 +308,13 @@ void audioline_ambient_create(u8 arg0, u16 soundId, f32 x, f32 y, f32 z, u8 arg5
if (lineID < 7 && argC < 30) {
temp_v1 = &D_80119C58[lineID];
temp_a0 = &temp_v1->unk4.unk4_floats[argC * 3];
temp_a0 = &temp_v1->unk4_floats[argC * 3];
temp_a0[0] = x;
temp_a0[1] = y;
temp_a0[2] = z;
if (argC == 0) {
temp_v1->soundID = soundId;
temp_v1->unk0.unk0_02 = arg0;
temp_v1->unk0_02 = arg0;
temp_v1->unk170 = arg9;
temp_v1->unk17D = argA;
temp_v1->unk174 = arg6;
@@ -393,13 +330,13 @@ void audioline_ambient_create(u8 arg0, u16 soundId, f32 x, f32 y, f32 z, u8 arg5
void audioline_reverb_create(f32 x, f32 y, f32 z, u8 arg3, u8 arg4, u8 arg5) {
unk8011A6D8 *temp;
if (arg4 < ARRAY_COUNT(D_8011A6D8) && arg5 < ARRAY_COUNT(D_8011A6D8[0].unk4.unk4_vec)) {
if (arg4 < ARRAY_COUNT(D_8011A6D8) && arg5 < 15) {
temp = &D_8011A6D8[arg4];
temp->unk4.unk4_floats[3 * arg5 + 0] = x;
temp->unk4.unk4_floats[3 * arg5 + 1] = y;
temp->unk4.unk4_floats[3 * arg5 + 2] = z;
temp->unk4_floats[3 * arg5 + 0] = x;
temp->unk4_floats[3 * arg5 + 1] = y;
temp->unk4_floats[3 * arg5 + 2] = z;
if (arg5 == 0) {
temp->unk0.unk0_02 = arg3;
temp->unk0_02 = arg3;
}
if (temp->unkB8 < arg5) {
temp->unkB8 = arg5;
@@ -411,21 +348,22 @@ s32 func_800099EC(u8 arg0) {
s32 ret;
s32 i;
unk80119C58 *temp_v0;
Vec3f *var_a2;
f32 *var_a2;
ret = 1;
temp_v0 = &D_80119C58[arg0];
var_a2 = temp_v0->unk4.unk4_vec;
var_a2 = temp_v0->unk4_floats;
if (temp_v0->unk17C <= 0) {
return 0;
}
for (i = 0; i < temp_v0->unk17C; i++) {
if (var_a2->x == -100000.0 || var_a2->x + 1 == -100000.0 || var_a2->x + 2 == -100000.0) {
//@bug should be *(var_a2 + 0), *(var_a2 + 1), *(var_a2 + 2)
if (*var_a2 + 0 == -100000.0 || *var_a2 + 1 == -100000.0 || *var_a2 + 2 == -100000.0) {
ret = 0;
}
var_a2 += 1;
var_a2 += 3;
}
return ret;
@@ -435,21 +373,22 @@ s32 func_80009AB4(u8 arg0) {
s32 ret;
s32 i;
unk8011A6D8 *temp_v0;
Vec3f *var_a2;
f32 *var_a2;
ret = 1;
temp_v0 = &D_8011A6D8[arg0];
var_a2 = temp_v0->unk4.unk4_vec;
var_a2 = temp_v0->unk4_floats;
if (temp_v0->unkB8 <= 0) {
return 0;
}
for (i = 0; i < temp_v0->unkB8; i++) {
if (var_a2->x == -100000.0 || var_a2->x + 1 == -100000.0 || var_a2->x + 2 == -100000.0) {
//@bug should be *(var_a2 + 0), *(var_a2 + 1), *(var_a2 + 2)
if (*var_a2 == -100000.0 || *var_a2 + 1 == -100000.0 || *var_a2 + 2 == -100000.0) {
ret = 0;
}
var_a2 += 1;
var_a2 += 3;
}
return ret;
@@ -477,9 +416,9 @@ void audioline_reverb(s32 *soundState, f32 x, f32 y, f32 z) {
maxDist = 400;
for (i = 0; i < ARRAY_COUNT(D_8011A6D8); i++) {
temp = &D_8011A6D8[i];
if (temp->unk0.unk0_02 != 0) {
if (temp->unk0_02 != 0) {
if (func_80009AB4(i) != 0) {
coords = temp->unk4.unk4_floats;
coords = temp->unk4_floats;
for (j = 0; j < temp->unkB8; j++) {
distBetween = audioline_distance(x, y, z, coords, &outX, &outY, &outZ);
if (distBetween < maxDist) {
@@ -504,7 +443,79 @@ void audioline_reverb(s32 *soundState, f32 x, f32 y, f32 z) {
}
}
#pragma GLOBAL_ASM("asm/nonmatchings/audio_spatial/func_80009D6C.s")
u8 func_80009D6C(unk8011A6D8 *arg0, f32 arg1, f32 arg2, f32 arg3) {
f32 deltaX;
f32 deltaY;
f32 deltaZ;
f32 *coords;
f32 x1, y1, z1;
f32 x2, y2, z2;
f32 dx, dy, dz;
f32 f20;
f32 sp5C;
f32 length;
u8 sp57;
f32 f12;
if (arg0->unkBC == 0.0f) {
coords = arg0->unk4_floats;
for (f20 = 0.0f; f20 < arg0->unkB8; f20 += 1.0f) {
deltaX = coords[3] - coords[0];
deltaY = coords[4] - coords[1];
deltaZ = coords[5] - coords[2];
arg0->unkBC += sqrtf((deltaX * deltaX) + (deltaY * deltaY) + (deltaZ * deltaZ));
coords += 3;
}
}
coords = arg0->unk4_floats;
sp5C = 0.0f;
sp57 = FALSE;
for (; !sp57; coords += 3) {
x1 = coords[0];
y1 = coords[1];
z1 = coords[2];
x2 = coords[3];
y2 = coords[4];
z2 = coords[5];
dx = x2 - x1;
dy = y2 - y1;
dz = z2 - z1;
length = sqrtf((dx * dx) + (dy * dy) + (dz * dz));
if (arg1 >= x1 && arg1 <= x2 || arg1 >= x2 && arg1 <= x1) {
if (dx != 0.0f) {
f12 = (arg1 - x1) / dx;
} else if (dy != 0.0f) {
f12 = (arg2 - y1) / dy;
} else if (dz != 0.0f) {
f12 = (arg3 - z1) / dz;
} else {
f12 = 0.0f;
}
if (ABS(dy * f12 + y1 - arg2) < 2.0f && ABS(dz * f12 + z1 - arg3) < 2.0f) {
sp57 = TRUE;
sp5C += f12 * length;
} else {
sp5C += length;
}
} else {
sp5C += length;
}
}
if (sp5C > arg0->unkBC / 2) {
sp5C = arg0->unkBC - sp5C;
}
if (sp5C < 300.0f) {
return arg0->unk0_02 * sp5C / 300.0f;
} else {
return arg0->unk0_02;
}
}
void debug_render_audio_effects(Gfx **dList, Vertex **verts, Triangle **tris) {
s32 i, j;
@@ -514,7 +525,7 @@ void debug_render_audio_effects(Gfx **dList, Vertex **verts, Triangle **tris) {
for (i = 0; i < ARRAY_COUNT(D_80119C58); i++) {
var_s2 = &D_80119C58[i];
coords = var_s2->unk4.unk4_floats;
coords = var_s2->unk4_floats;
if (D_80119C58[i].soundID != 0) {
for (j = 0; j < var_s2->unk17C; j++) {
debug_render_line(dList, verts, tris, coords, 255, 255, 0);
@@ -525,8 +536,8 @@ void debug_render_audio_effects(Gfx **dList, Vertex **verts, Triangle **tris) {
for (i = 0; i < ARRAY_COUNT(D_8011A6D8); i++) {
var_s2_2 = &D_8011A6D8[i];
coords = var_s2_2->unk4.unk4_floats;
if (D_8011A6D8[i].unk0.unk0_02 != 0) {
coords = var_s2_2->unk4_floats;
if (D_8011A6D8[i].unk0_02 != 0) {
for (j = 0; j < var_s2_2->unkB8; j++) {
debug_render_line(dList, verts, tris, coords, 255, 0, 255);
coords += 3;
+5 -18
View File
@@ -25,15 +25,8 @@ typedef struct unk8011A6D8_04 {
/* Size: 0x180 / 384 bytes */
typedef struct unk80119C58 {
union {
/* 0x00 */ f32 unk0_01;
/* 0x00 */ u8 unk0_02;
/* 0x00 */ s32 unk0_03;
} unk0;
union {
/* 0x004 */ f32 unk4_floats[30 * 3]; // Should be a Vec3f, but that just doesn't match
/* 0x004 */ Vec3f unk4_vec[30];
} unk4;
/* 0x000 */ u8 unk0_02;
/* 0x004 */ f32 unk4_floats[30 * 3]; // Should be a Vec3f, but that just doesn't match
/* 0x16C */ s32 soundID;
/* 0x170 */ s32 unk170;
/* 0x174 */ u8 unk174;
@@ -48,14 +41,8 @@ typedef struct unk80119C58 {
/* Size: 0xC0 / 192 bytes - Thought it was a LevelHeader, but that didn't match other usages */
typedef struct unk8011A6D8 {
union {
/* 0x00 */ f32 unk0_01;
/* 0x00 */ u8 unk0_02;
} unk0;
union {
f32 unk4_floats[15 * 3];
Vec3f unk4_vec[15];
} unk4;
/* 0x00 */ u8 unk0_02;
/* 0x04 */ f32 unk4_floats[15 * 3];
/* 0xB8 */ s8 unkB8;
/* 0xB9 */ u8 padB9[0x03];
/* 0xBC */ f32 unkBC;
@@ -91,7 +78,7 @@ void audioline_reverb_create(f32, f32, f32, u8, u8, u8);
void audioline_reverb(s32 *soundState, f32 x, f32 y, f32 z);
s32 audioline_distance(f32 inX, f32 inY, f32 inZ, f32 coords[6], f32 *outX, f32 *outY, f32 *outZ);
void func_80008174(void); // Non Matching
void audioline_reset(void);
void func_80008438(Object **arg0, s32 numRacers, s32 updateRate); // Non Matching
void func_80006FC8(Object **objs, s32 numRacers, ObjectSegment *segment, u8 arg3, s32 updateRate); // Non Matching
u8 func_80009D6C(unk8011A6D8 *, f32, f32, f32);
+1 -1
View File
@@ -704,7 +704,7 @@ void clear_audio_and_track(void) {
music_channel_reset_all();
free_lights();
free_track();
func_80008174();
audioline_reset();
sound_volume_change(VOLUME_NORMAL);
if (gCurrentLevelHeader->weatherEnable > 0) {
weather_free();
+1 -1
View File
@@ -136,7 +136,7 @@ func_80007FA4 = 0x80007FA4;
audioline_init = 0x80008040;
audioline_off = 0x80008140;
audioline_on = 0x80008168;
func_80008174 = 0x80008174;
audioline_reset = 0x80008174;
func_80008438 = 0x80008438;
func_800090C0 = 0x800090C0;
audioline_distance = 0x800092A8;
+1 -1
View File
@@ -136,7 +136,7 @@ func_80007FA4 = 0x80007FA4;
audioline_init = 0x80008040;
audioline_off = 0x80008140;
audioline_on = 0x80008168;
func_80008174 = 0x80008174;
audioline_reset = 0x80008174;
func_80008438 = 0x80008438;
func_800090C0 = 0x800090C0;
audioline_distance = 0x800092A8;
+1 -1
View File
@@ -136,7 +136,7 @@ func_80007FA4 = 0x80007FA4;
audioline_init = 0x80008040;
audioline_off = 0x80008140;
audioline_on = 0x80008168;
func_80008174 = 0x80008174;
audioline_reset = 0x80008174;
func_80008438 = 0x80008438;
func_800090C0 = 0x800090C0;
audioline_distance = 0x800092A8;
+1 -1
View File
@@ -136,7 +136,7 @@ func_80007FA4 = 0x80007FA4;
audioline_init = 0x80008040;
audioline_off = 0x80008140;
audioline_on = 0x80008168;
func_80008174 = 0x80008174;
audioline_reset = 0x80008174;
func_80008438 = 0x80008438;
func_800090C0 = 0x800090C0;
audioline_distance = 0x800092A8;
+1 -1
View File
@@ -136,7 +136,7 @@ func_80007FA4 = 0x80007FA4;
audioline_init = 0x80008040;
audioline_off = 0x80008140;
audioline_on = 0x80008168;
func_80008174 = 0x80008174;
audioline_reset = 0x80008174;
func_80008438 = 0x80008438;
func_800090C0 = 0x800090C0;
audioline_distance = 0x800092A8;