From e769524c340ca93b1f4fcbe1c6ee1e9da3597986 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Mon, 4 Jan 2021 15:07:44 +1000 Subject: [PATCH] Attempt to decompile acousticReset --- src/game/core.c | 2 +- src/game/game_0b63b0.c | 84 ++++++++++++++++++++++++++++++++-- src/game/game_157db0.c | 12 ++--- src/gvars/gvars.c | 23 +--------- src/include/game/game_0b63b0.h | 2 +- src/include/gvars/gvars.h | 4 +- src/include/types.h | 16 ++++++- 7 files changed, 105 insertions(+), 38 deletions(-) diff --git a/src/game/core.c b/src/game/core.c index b6e39036a..3c89e7df4 100644 --- a/src/game/core.c +++ b/src/game/core.c @@ -426,7 +426,7 @@ void coreLoadStage(s32 stagenum) } } - func0f0b6764(); + acousticReset(); func0f0b65f8(); func0f001bdc(); setCurrentPlayerNum(0); diff --git a/src/game/game_0b63b0.c b/src/game/game_0b63b0.c index a0b34e159..43191a8bc 100644 --- a/src/game/game_0b63b0.c +++ b/src/game/game_0b63b0.c @@ -84,8 +84,8 @@ const char var7f1ad2f0[] = "Acoustic Reset -> Allocating %d bytes for %d roomaco const char var7f1ad33c[] = "ACOUSTIC -> room %d bb %f %f\n"; const char var7f1ad360[] = "ACOUSTIC -> DGD: acousticReset room %d does not have a 3D bounding box => radata[room].roomvolume is bodged!\n"; const char var7f1ad3d0[] = "%s%sL2 -> Surface area bodged for room %d - using %f\n"; -const u32 var7f1ad408[] = {0x00000000}; -const u32 var7f1ad40c[] = {0x00000000}; +const char var7f1ad408[] = ""; +const char var7f1ad40c[] = ""; const u32 var7f1ad410[] = {0x3b808081}; const u32 var7f1ad414[] = {0x3d888889}; @@ -314,7 +314,7 @@ void func0f0b65f8(void) } GLOBAL_ASM( -glabel func0f0b6764 +glabel acousticReset /* f0b6764: 3c0b800a */ lui $t3,%hi(g_Vars) /* f0b6768: 256b9fc0 */ addiu $t3,$t3,%lo(g_Vars) /* f0b676c: 8d6402bc */ lw $a0,0x2bc($t3) @@ -332,8 +332,8 @@ glabel func0f0b6764 /* f0b679c: 3c0b800a */ lui $t3,%hi(g_Vars) /* f0b67a0: 256b9fc0 */ addiu $t3,$t3,%lo(g_Vars) /* f0b67a4: 8d6302bc */ lw $v1,0x2bc($t3) -/* f0b67a8: 3c07800a */ lui $a3,%hi(var8009dd70) -/* f0b67ac: 24e7dd70 */ addiu $a3,$a3,%lo(var8009dd70) +/* f0b67a8: 3c07800a */ lui $a3,%hi(g_RoomAcousticData) +/* f0b67ac: 24e7dd70 */ addiu $a3,$a3,%lo(g_RoomAcousticData) /* f0b67b0: ace20000 */ sw $v0,0x0($a3) /* f0b67b4: 18600066 */ blez $v1,.L0f0b6950 /* f0b67b8: 00003025 */ or $a2,$zero,$zero @@ -487,6 +487,80 @@ glabel func0f0b6764 /* f0b69cc: 27bd0030 */ addiu $sp,$sp,0x30 ); +// Mismatch: regalloc for range variable +//void acousticReset(void) +//{ +// s32 i; +// s32 j; +// u32 size = ALIGN16(g_Vars.roomcount * sizeof(struct roomacousticdata)); +// f32 range; +// f32 width; +// f32 height; +// f32 depth; +// f32 halfsurfacearea; +// +// osSyncPrintf("Acoustic Reset -> Allocating %d bytes for %d roomacousticdata structures\n", size, g_Vars.roomcount); +// +// g_RoomAcousticData = malloc(size, 4); +// +// for (i = 0; i < g_Vars.roomcount; i++) { +// bool allgood = true; +// +// g_RoomAcousticData[i].roomvolume = 1; +// g_RoomAcousticData[i].surfacearea = 1; +// +// for (j = 0; j < 3; j++) { +// osSyncPrintf("ACOUSTIC -> room %d bb %f %f\n", i, g_Rooms[i].bbmin[j], g_Rooms[i].bbmax[j]); +// +// range = g_Rooms[i].bbmax[j] - g_Rooms[i].bbmin[j]; +// +// if (range > 0) { +// g_RoomAcousticData[i].roomvolume *= range / 100; +// } else { +// osSyncPrintf("ACOUSTIC -> DGD: acousticReset room %d does not have a 3D bounding box => radata[room].roomvolume is bodged!\n", i); +// allgood = false; +// } +// } +// +// if (allgood) { +// if (g_Rooms[i].bbmin[0] < g_Rooms[i].bbmax[0]) { +// width = g_Rooms[i].bbmax[0] - g_Rooms[i].bbmin[0]; +// } else { +// width = -(g_Rooms[i].bbmax[0] - g_Rooms[i].bbmin[0]); +// } +// +// if (g_Rooms[i].bbmin[1] < g_Rooms[i].bbmax[1]) { +// height = g_Rooms[i].bbmax[1] - g_Rooms[i].bbmin[1]; +// } else { +// height = -(g_Rooms[i].bbmax[1] - g_Rooms[i].bbmin[1]); +// } +// +// if (g_Rooms[i].bbmin[2] < g_Rooms[i].bbmax[2]) { +// depth = g_Rooms[i].bbmax[2] - g_Rooms[i].bbmin[2]; +// } else { +// depth = -(g_Rooms[i].bbmax[2] - g_Rooms[i].bbmin[2]); +// } +// +// halfsurfacearea = width * height + width * depth + height * depth; +// +// g_RoomAcousticData[i].surfacearea = halfsurfacearea + halfsurfacearea; +// } else { +// osSyncPrintf("%s%sL2 -> Surface area bodged for room %d - using %f\n", "", "", i, 20000000); +// g_RoomAcousticData[i].surfacearea = 20000000; +// } +// } +// +// for (j = 0; j < g_Vars.roomcount; j++) { +// g_RoomAcousticData[j].unk08 = 0; +// g_RoomAcousticData[j].unk04 = g_RoomAcousticData[j].unk08; +// } +// +// for (j = 0; j < ARRAYCOUNT(var8009dd78); j++) { +// var8009dd78[j].unk00 = -1; +// var8009dd78[j].unk04 = 0; +// } +//} + GLOBAL_ASM( glabel func0f0b69d0 /* f0b69d0: 27bdfd78 */ addiu $sp,$sp,-648 diff --git a/src/game/game_157db0.c b/src/game/game_157db0.c index 929ff3377..75686215f 100644 --- a/src/game/game_157db0.c +++ b/src/game/game_157db0.c @@ -6782,21 +6782,21 @@ bool func0f15cd90(u32 room, struct screenbox *screen) for (i = 0; i != 8; i++) { if (i & 1) { - corner.x = g_Rooms[room].unk18.x; + corner.x = g_Rooms[room].bbmin[0]; } else { - corner.x = g_Rooms[room].unk24.x; + corner.x = g_Rooms[room].bbmax[0]; } if (i & 2) { - corner.y = g_Rooms[room].unk18.y; + corner.y = g_Rooms[room].bbmin[1]; } else { - corner.y = g_Rooms[room].unk24.y; + corner.y = g_Rooms[room].bbmax[1]; } if (i & 4) { - corner.z = g_Rooms[room].unk18.z; + corner.z = g_Rooms[room].bbmin[2]; } else { - corner.z = g_Rooms[room].unk24.z; + corner.z = g_Rooms[room].bbmax[2]; } if (func0f15d08c(&corner, &roomscreenpos) == 0) { diff --git a/src/gvars/gvars.c b/src/gvars/gvars.c index e0975dd5b..679d11770 100644 --- a/src/gvars/gvars.c +++ b/src/gvars/gvars.c @@ -14702,28 +14702,9 @@ u32 var8009dd60 = 0; u32 var8009dd64 = 0; u32 var8009dd68 = 0; u32 var8009dd6c = 0; -u32 var8009dd70 = 0; +struct roomacousticdata *g_RoomAcousticData = NULL; u32 var8009dd74 = 0; -u32 var8009dd78 = 0; -u32 var8009dd7c = 0; -u32 var8009dd80 = 0; -u32 var8009dd84 = 0; -u32 var8009dd88 = 0; -u32 var8009dd8c = 0; -u32 var8009dd90 = 0; -u32 var8009dd94 = 0; -u32 var8009dd98 = 0; -u32 var8009dd9c = 0; -u32 var8009dda0 = 0; -u32 var8009dda4 = 0; -u32 var8009dda8 = 0; -u32 var8009ddac = 0; -u32 var8009ddb0 = 0; -u32 var8009ddb4 = 0; -u32 var8009ddb8 = 0; -u32 var8009ddbc = 0; -u32 var8009ddc0 = 0; -u32 var8009ddc4 = 0; +struct var8009dd78 var8009dd78[10] = {0}; u16 *var8009ddc8 = NULL; s32 var8009ddcc = 0; s32 g_DefaultWeapons[2] = {0}; diff --git a/src/include/game/game_0b63b0.h b/src/include/game/game_0b63b0.h index 5bc781bd9..e8e15ab13 100644 --- a/src/include/game/game_0b63b0.h +++ b/src/include/game/game_0b63b0.h @@ -9,7 +9,7 @@ void func0f0b6534(s32 arg0); void func0f0b656c(s32 arg0); u32 func0f0b65a8(void); void func0f0b65f8(void); -void func0f0b6764(void); +void acousticReset(void); f32 func0f0b69d0(f32 arg0, struct coord *pos, s16 *rooms, struct prop *prop, s16 *spawnpads, s16 numspawnpads); f32 func0f0b72a8(f32 arg0, struct coord *pos, s16 *rooms, struct prop *prop); void func0f0b72dc(void); diff --git a/src/include/gvars/gvars.h b/src/include/gvars/gvars.h index d14cd2601..37a47b9a2 100644 --- a/src/include/gvars/gvars.h +++ b/src/include/gvars/gvars.h @@ -579,8 +579,8 @@ extern u32 var8009dd40; extern u32 var8009dd50; extern u32 var8009dd60; extern u32 var8009dd6c; -extern u32 var8009dd70; -extern u32 var8009dd78; +extern struct roomacousticdata *g_RoomAcousticData; +extern struct var8009dd78 var8009dd78[10]; extern u16 *var8009ddc8; extern s32 var8009ddcc; extern s32 g_DefaultWeapons[2]; diff --git a/src/include/types.h b/src/include/types.h index df50abdc1..1f97ab0bc 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -3503,8 +3503,8 @@ struct room { /*0x0e*/ s16 unk0e; /*0x10*/ u32 unk10; /*0x14*/ struct room14 *unk14; - /*0x18*/ struct coord unk18; - /*0x24*/ struct coord unk24; + /*0x18*/ f32 bbmin[3]; + /*0x24*/ f32 bbmax[3]; /*0x30*/ u32 unk30; /*0x34*/ u32 unk34; /*0x38*/ u32 unk38; @@ -6792,4 +6792,16 @@ struct var8009cb08 { u32 unk24; }; +struct roomacousticdata { + f32 surfacearea; + f32 unk04; + f32 unk08; + f32 roomvolume; +}; + +struct var8009dd78 { + s16 unk00; + f32 unk04; +}; + #endif