From 4a474237547b67e3a60bc6f67dff2c3ae2be6fc2 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Thu, 30 Jun 2022 17:54:56 +1000 Subject: [PATCH] Attempt to decompile wallhitsTick --- src/game/gfxmemory.c | 2 +- src/game/sparks.c | 2 +- src/game/utils.c | 4 +- src/game/wallhit.c | 287 +++++++++++++++++++++++++++++------ src/game/wallhitreset.c | 4 +- src/include/bss.h | 4 +- src/include/data.h | 2 +- src/include/game/gfxmemory.h | 2 +- src/include/game/wallhit.h | 2 +- 9 files changed, 253 insertions(+), 56 deletions(-) diff --git a/src/game/gfxmemory.c b/src/game/gfxmemory.c index 5a6fb4440..ce09d8082 100644 --- a/src/game/gfxmemory.c +++ b/src/game/gfxmemory.c @@ -121,7 +121,7 @@ Gfx *gfxGetMasterDisplayList(void) return (Gfx *)g_GfxBuffers[g_GfxActiveBufferIndex]; } -struct gfxvtx *gfxAllocateVertices(s32 count) +struct gfxvtx *gfxAllocateVertices(u32 count) { void *ptr = g_GfxMemPos; g_GfxMemPos += count * sizeof(struct gfxvtx); diff --git a/src/game/sparks.c b/src/game/sparks.c index 4900970d8..f2b76ae10 100644 --- a/src/game/sparks.c +++ b/src/game/sparks.c @@ -448,7 +448,7 @@ Gfx *sparksRender(Gfx *gdl) struct gfxvtx *vertices = gfxAllocateVertices(3); f32 f2; - for (k = 0; k < 3U; k++) { + for (k = 0; k < 3; k++) { vertices[k].s = 0; vertices[k].t = 0; } diff --git a/src/game/utils.c b/src/game/utils.c index 2d74bedd1..b8fbc3690 100644 --- a/src/game/utils.c +++ b/src/game/utils.c @@ -26,9 +26,7 @@ u32 var800ac0f8[4]; f32 var800845d0 = 999999; f32 var800845d4 = 0.00001f; s32 var800845d8 = 1; -u32 var800845dc = 0x00000000; -u32 var800845e0 = 0x00000000; -u32 var800845e4 = 0x00000000; +struct coord var800845dc = {0, 0, 0}; u32 var800845e8 = 0x00000000; u32 var800845ec = 0x3f800000; u32 var800845f0 = 0x00000000; diff --git a/src/game/wallhit.c b/src/game/wallhit.c index f53174841..1335451aa 100644 --- a/src/game/wallhit.c +++ b/src/game/wallhit.c @@ -19,56 +19,16 @@ #include "types.h" const char var7f1b5a10[] = "WallHit_MakeSpaceRoom : ERROR - Couldn't find any space in room %d\n"; -const char var7f1b5a54[] = "wallhit"; -const char var7f1b5a5c[] = "g_MaxRound = %s%s%f"; -const char var7f1b5a70[] = ""; -const char var7f1b5a74[] = ""; -const char var7f1b5a78[] = "g_MinRound = %s%s%f"; -const char var7f1b5a8c[] = ""; -const char var7f1b5a90[] = ""; -const char var7f1b5a94[] = "Done %d Z buffer calcs"; -const char var7f1b5aac[] = "ZOOM : g_ZoomFactor=%s%s%f"; -const char var7f1b5ac8[] = ""; -const char var7f1b5acc[] = ""; -const char var7f1b5ad0[] = "ZOOM : g_ZoomScalar=%s%s%f"; -const char var7f1b5aec[] = ""; -const char var7f1b5af0[] = ""; -const char var7f1b5af4[] = "ZOOM : scale=%s%s%f"; -const char var7f1b5b08[] = ""; -const char var7f1b5b0c[] = ""; -const char var7f1b5b10[] = "WallHit_Tick : Status - RED"; -const char var7f1b5b2c[] = "WallHit_Tick : Status - YELLOW (%u)"; -const char var7f1b5b50[] = "WallHit_Tick : Status - GREEN"; -const char var7f1b5b70[] = "WallHit_Tick : %d Used"; -const char var7f1b5b88[] = "WallHit_Tick : %d Free"; -const char var7f1b5ba0[] = "WallHit_Tick : %d Pending"; -const char var7f1b5bbc[] = "WallHit_Tick : %d Blood"; -const char var7f1b5bd4[] = "WallHit_Tick : %d Other"; -const char var7f1b5bec[] = "WallHit_Tick : %d Ratio"; -const char var7f1b5c04[] = "WallHit_Tick : %d(%d) Prop Hits"; -const char var7f1b5c24[] = "tLifeTime=%s%s%f, tScalarGbl=%f"; -const char var7f1b5c44[] = ""; -const char var7f1b5c48[] = ""; -const char var7f1b5c4c[] = "wallhit.c"; -const char var7f1b5c58[] = "wallhit.c"; -const char var7f1b5c64[] = "wallhit.c"; -const char var7f1b5c70[] = "AFT : tVecU (along) = (%s%s%f,%f,%f)\n"; -const char var7f1b5c98[] = ""; -const char var7f1b5c9c[] = ""; -const char var7f1b5ca0[] = "AFT : tVecV (up) = (%s%s%f,%f,%f)\n"; -const char var7f1b5cc8[] = ""; -const char var7f1b5ccc[] = ""; -const char var7f1b5cd0[] = "Wallhit colour %d not implemented, substituting black\n"; struct wallhit *g_Wallhits; struct wallhit *var800a41b4; struct wallhit *var800a41b8; -u32 var8007f740 = 0x00000000; +s32 var8007f740 = 0; u8 var8007f744[4] = {0x40, 0x0a, 0x0a, 0x00}; -u32 var8007f748 = 0x3f800000; +f32 var8007f748 = 1; f32 var8007f74c = 1; -u32 var8007f750 = 0x00000000; +u32 var8007f750 = 0; f32 var8007f754 = 0; f32 var8007f758 = 0; @@ -1382,6 +1342,245 @@ glabel var7f1b5d18 /* f13f3f0: 27bd0130 */ addiu $sp,$sp,0x130 ); +const char var7f1b5a54[] = "wallhit"; + +s32 var8007f834 = 0; + +// Mismatch: float regalloc for midx, midy and midz +//void wallhitsTick(void) +//{ +// f32 sp12c; +// f32 fov; +// s32 numallocated; +// s32 i; +// s32 j; +// u32 stack[3]; +// f32 midx; +// f32 midy; +// f32 midz; +// f32 f22; +// f32 f24; +// struct wallhit *wallhit; +// struct coord spc8[4]; +// u32 stack2[4]; +// +// static s32 var8007f834 = 0; +// +// sp12c = (g_Vars.lvupdate240 + 2.0f) * 0.25f; +// fov = currentPlayerGetGunZoomFov(); +// +// mainOverrideVariable("wallhit", &var8007f750); +// +// var8007f740 = 0; +// +// if (fov == 0.0f || fov == 60.0f) { +// var8007f748 = 1; +// } else { +// f32 tmp = fov / g_Vars.currentplayer->zoominfovy; +// var8007f748 = 60.0f / fov - 1.00f / tmp + 1; +// } +// +// var8007f74c = 1.0f / var8007f748; +// +// numallocated = g_WallhitsNumFree + g_WallhitsNumUsed; +// +// if (numallocated < var8009cc70) { +// func0f13e994(); +// } else if (numallocated < var8009cc74) { +// var8007f834++; +// +// if (var8007f834 == 8) { +// var8007f834 = 0; +// func0f13e994(); +// } +// } +// +// wallhit = g_Wallhits; +// +// for (i = 0; i < g_WallhitsMax; i++) { +// f32 f0 = sp12c; +// +// if (wallhit->inuse) { +// if (wallhit->unk70_28 != 8) { +// f0 *= 0.6f * ((wallhit->unk70_28 - 8.0f) * 0.125f); +// } +// +// if (wallhit->unk6d) { +// u32 amount = (u32)(f0 + 0.5f); +// +// if (wallhit->unk6f_03) { +// if (wallhit->unk6e > wallhit->unk6d) { +// wallhit->unk6d = 0; +// wallhit->unk6e = 0; +// wallhit->inuse = true; +// } +// +// wallhit->unk6e += amount; +// } else { +// if (amount < wallhit->unk6e) { +// wallhit->unk6e -= amount; +// } else { +// wallhitFree(wallhit); +// } +// } +// +// if (wallhit->unk6d) { +// f24 = (f32) wallhit->unk6e / wallhit->unk6d; +// +// if (f24 > 1.0f) { +// f24 = 1.0f; +// } +// +// f22 = f24; +// +// if (wallhit->unk6f_03) { +// f32 frac = 0.2f; +// f32 sizefrac; +// f32 f30; +// s32 minindex; +// f32 tmp; +// s32 j; +// +// tmp = 1.5707964f * f24; +// f30 = (1.0f - frac) * sinf(tmp); +// f22 = 1.0f - tmp + 0.6f; +// +// wallhit->verticesptr = gfxAllocateVertices(4); +// +// midx = var800845dc.x; \ +// midy = var800845dc.y; \ +// midz = var800845dc.z; +// +// // Copy the vertices into a float array +// for (j = 0; j < 4; j++) { +// spc8[j].x = wallhit->vertices[j].x; +// spc8[j].y = wallhit->vertices[j].y; +// spc8[j].z = wallhit->vertices[j].z; +// } +// +// // Sum the vertices and divide them by 4 to get the centre +// minindex = 0; +// +// for (j = 0; j < 4; j++) { +// midx = midx + spc8[j].x; +// midy = midy + spc8[j].y; +// midz = midz + spc8[j].z; +// +// // This should be j != 0, but minindex is unused +// // so it doesn't affect anything +// if (minindex != 0 && spc8[j].y < spc8[minindex].y) { +// minindex = j; +// } +// } +// +// midx = 0.25f * midx; +// midy = 0.25f * midy; +// midz = 0.25f * midz; +// +// sizefrac = frac + f30; +// +// // Calculate and apply the new size +// for (j = 0; j < 4; j++) { +// f32 xradius = spc8[j].x - midx; +// f32 yradius = spc8[j].y - midy; +// f32 zradius = spc8[j].z - midz; +// +// wallhit->verticesptr[j].x = midx + xradius * sizefrac; +// wallhit->verticesptr[j].y = midy + yradius * sizefrac; +// wallhit->verticesptr[j].z = midz + zradius * sizefrac; +// wallhit->verticesptr[j].s = wallhit->vertices[j].s; +// wallhit->verticesptr[j].t = wallhit->vertices[j].t; +// wallhit->verticesptr[j].colour = wallhit->vertices[j].colour; +// } +// +// if (1); +// +// f24 *= 2.0f; +// +// if (f24 > 1.0f) { +// f24 = 1.0f; +// } +// +// if (1); +// } +// +// for (j = 0; j < 4; j++) { +// u32 alpha; +// +// if (f22 > 1.0f) { +// f22 = 1.0f; +// } +// +// alpha = wallhit->unk30[j].a * f24; +// +// if (alpha > 255) { +// alpha = 255; +// } +// +// wallhit->colours[j].a = alpha; +// } +// } else { +// if (wallhit->inuse) { +// wallhit->verticesptr = NULL; +// +// for (j = 0; j < 4; j++) { +// wallhit->colours[j].a = wallhit->unk30[j].a; +// } +// } else { +// wallhit->verticesptr = NULL; +// } +// } +// } +// +// wallhit->unk6f_05 = true; +// } +// +// wallhit++; +// +// if (1); +// } +//} + +const char var7f1b5a5c[] = "g_MaxRound = %s%s%f"; +const char var7f1b5a70[] = ""; +const char var7f1b5a74[] = ""; +const char var7f1b5a78[] = "g_MinRound = %s%s%f"; +const char var7f1b5a8c[] = ""; +const char var7f1b5a90[] = ""; +const char var7f1b5a94[] = "Done %d Z buffer calcs"; +const char var7f1b5aac[] = "ZOOM : g_ZoomFactor=%s%s%f"; +const char var7f1b5ac8[] = ""; +const char var7f1b5acc[] = ""; +const char var7f1b5ad0[] = "ZOOM : g_ZoomScalar=%s%s%f"; +const char var7f1b5aec[] = ""; +const char var7f1b5af0[] = ""; +const char var7f1b5af4[] = "ZOOM : scale=%s%s%f"; +const char var7f1b5b08[] = ""; +const char var7f1b5b0c[] = ""; +const char var7f1b5b10[] = "WallHit_Tick : Status - RED"; +const char var7f1b5b2c[] = "WallHit_Tick : Status - YELLOW (%u)"; +const char var7f1b5b50[] = "WallHit_Tick : Status - GREEN"; +const char var7f1b5b70[] = "WallHit_Tick : %d Used"; +const char var7f1b5b88[] = "WallHit_Tick : %d Free"; +const char var7f1b5ba0[] = "WallHit_Tick : %d Pending"; +const char var7f1b5bbc[] = "WallHit_Tick : %d Blood"; +const char var7f1b5bd4[] = "WallHit_Tick : %d Other"; +const char var7f1b5bec[] = "WallHit_Tick : %d Ratio"; +const char var7f1b5c04[] = "WallHit_Tick : %d(%d) Prop Hits"; +const char var7f1b5c24[] = "tLifeTime=%s%s%f, tScalarGbl=%f"; +const char var7f1b5c44[] = ""; +const char var7f1b5c48[] = ""; +const char var7f1b5c4c[] = "wallhit.c"; +const char var7f1b5c58[] = "wallhit.c"; +const char var7f1b5c64[] = "wallhit.c"; +const char var7f1b5c70[] = "AFT : tVecU (along) = (%s%s%f,%f,%f)\n"; +const char var7f1b5c98[] = ""; +const char var7f1b5c9c[] = ""; +const char var7f1b5ca0[] = "AFT : tVecV (up) = (%s%s%f,%f,%f)\n"; +const char var7f1b5cc8[] = ""; +const char var7f1b5ccc[] = ""; +const char var7f1b5cd0[] = "Wallhit colour %d not implemented, substituting black\n"; + void wallhitCreate(struct coord *arg0, struct coord *arg1, struct coord *arg2, u32 arg3, u32 arg4, s16 arg5, s16 room, struct prop *arg7, s8 arg8, s8 arg9, struct chrdata *chr, bool arg11) { f32 f0 = RANDOMFRAC() * 0.1f + 0.6f; @@ -5835,7 +6034,7 @@ void func0f14159c(struct prop *prop) && hit->prop == prop && var8007f75c[hit->texturenum].unk08 == 3) { if ((hit->texturenum >= 12 && hit->texturenum <= 12) || (random() % 100) < 35) { - func0f13e640(hit, (PAL ? 100 : 120)); + func0f13e640(hit, TICKS(120)); } else { hit->unk70_00 = g_Vars.lvframenum; } diff --git a/src/game/wallhitreset.c b/src/game/wallhitreset.c index a1654f538..230380f26 100644 --- a/src/game/wallhitreset.c +++ b/src/game/wallhitreset.c @@ -17,8 +17,8 @@ u32 var8009cc60; s32 var8009cc64; u32 var8009cc68; u32 var8009cc6c; -u32 var8009cc70; -u32 var8009cc74; +s32 var8009cc70; +s32 var8009cc74; f32 var8009cc78; /** diff --git a/src/include/bss.h b/src/include/bss.h index 9cd70d5e7..416ec89bf 100644 --- a/src/include/bss.h +++ b/src/include/bss.h @@ -79,8 +79,8 @@ extern u32 var8009cc5c; extern u32 var8009cc60; extern s32 var8009cc64; extern u32 var8009cc68; -extern u32 var8009cc70; -extern u32 var8009cc74; +extern s32 var8009cc70; +extern s32 var8009cc74; extern f32 var8009cc78; extern Mtx *var8009cc80; extern Mtx *var8009cc84; diff --git a/src/include/data.h b/src/include/data.h index bdf7ac857..a5e834e78 100644 --- a/src/include/data.h +++ b/src/include/data.h @@ -463,7 +463,7 @@ extern s32 g_LanguageId; extern struct surfacetype *g_SurfaceTypes[15]; extern u16 *var800844f0; extern f32 var800845d4; -extern u32 var800845dc; +extern struct coord var800845dc; extern struct menudialogdef g_2PMissionInventoryHMenuDialog; extern struct menudialogdef g_2PMissionInventoryVMenuDialog; extern struct menudialogdef g_MpEndscreenChallengeCheatedMenuDialog; diff --git a/src/include/game/gfxmemory.h b/src/include/game/gfxmemory.h index 6f90a212d..6f65a462b 100644 --- a/src/include/game/gfxmemory.h +++ b/src/include/game/gfxmemory.h @@ -8,7 +8,7 @@ extern u8 *g_GfxBuffers[3]; void gfxReset(void); Gfx *gfxGetMasterDisplayList(void); -struct gfxvtx *gfxAllocateVertices(s32 count); +struct gfxvtx *gfxAllocateVertices(u32 count); void *gfxAllocateMatrix(void); void *gfxAllocateLookAt(s32 count); void *gfxAllocateColours(s32 count); diff --git a/src/include/game/wallhit.h b/src/include/game/wallhit.h index 92726f2b4..7932924ed 100644 --- a/src/include/game/wallhit.h +++ b/src/include/game/wallhit.h @@ -13,7 +13,7 @@ bool chrIsUsingPaintball(struct chrdata *chr); void func0f13e5c8(struct prop *prop); void func0f13e640(struct wallhit *wallhit, u32 arg1); u32 func0f13e744(void); -u32 func0f13e994(void); +void func0f13e994(void); void wallhitsTick(void); void wallhitCreate(struct coord *arg0, struct coord *arg1, struct coord *arg2, u32 arg3,