From ef9dbbd24b9a1c28d30841de7d06c149b80a731d Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Wed, 29 Jun 2022 21:27:46 +1000 Subject: [PATCH] Decompile wallhitFree --- src/game/pak.c | 6 +- src/game/propobj.c | 14 +- src/game/training.c | 4 +- src/game/wallhit.c | 396 +++++++++++++++---------------------- src/game/wallhitreset.c | 49 ++--- src/include/bss.h | 10 +- src/include/game/pak.h | 2 +- src/include/game/wallhit.h | 4 +- src/include/types.h | 15 +- 9 files changed, 210 insertions(+), 290 deletions(-) diff --git a/src/game/pak.c b/src/game/pak.c index 1b142d7b9..1dd9fa296 100644 --- a/src/game/pak.c +++ b/src/game/pak.c @@ -8614,10 +8614,10 @@ PakErr1 pakWriteEeprom(u8 address, u8 *buffer, u32 len) return result == PAK_ERR1_OK ? PAK_ERR1_OK : PAK_ERR1_EEPROMWRITEFAILED; } -void pakSetBitflag(u32 flagnum, u8 *bitstream, bool set) +void pakSetBitflag(s32 flagnum, u8 *bitstream, bool set) { - u32 byteindex = flagnum / 8; - u8 mask = 1 << (flagnum % 8); + u32 byteindex = (u32)flagnum / 8; + u8 mask = 1 << ((u32)flagnum % 8); if (set) { bitstream[byteindex] |= mask; diff --git a/src/game/propobj.c b/src/game/propobj.c index 897b401b2..66dc0a488 100644 --- a/src/game/propobj.c +++ b/src/game/propobj.c @@ -5302,8 +5302,8 @@ void objFree(struct defaultobj *obj, bool freeprop, bool canregen) chrClearReferences(obj->prop - g_Vars.props); projectilesUnrefOwner(obj->prop); - wallhitsRemoveByProp(obj->prop, 0); - wallhitsRemoveByProp(obj->prop, 1); + wallhitsFreeByProp(obj->prop, 0); + wallhitsFreeByProp(obj->prop, 1); func0f06ac90(obj->prop); child = obj->prop->child; @@ -52815,7 +52815,7 @@ void objDeform(struct defaultobj *obj, s32 level) salt &= 0xffff; } - wallhitsRemoveByProp(obj->prop, 1); + wallhitsFreeByProp(obj->prop, 1); swap = false; axis = 1; @@ -54038,8 +54038,8 @@ void glassDestroy(struct defaultobj *obj) struct prop *prop = obj->prop; struct modelrodata_bbox *bbox = objFindBboxRodata(obj); - wallhitsRemoveByProp(prop, 0); - wallhitsRemoveByProp(prop, 1); + wallhitsFreeByProp(prop, 0); + wallhitsFreeByProp(prop, 1); if (obj->modelnum == MODEL_AIVILLABOT1 || obj->modelnum == MODEL_AIVILLABOT2 @@ -54101,7 +54101,7 @@ void doorDestroyGlass(struct doorobj *door) shardsCreate((struct coord *) &matrix.m[3][0], &matrix.m[0][0], &matrix.m[1][0], &matrix.m[2][0], rodata->bbox.xmin, rodata->bbox.xmax, rodata->bbox.ymin, rodata->bbox.ymax, SHARDTYPE_GLASS, prop); - wallhitsRemoveByProp(prop, 1); + wallhitsFreeByProp(prop, 1); node = modelGetPart(model->filedata, 1); rwdata = modelGetNodeRwData(model, node); @@ -54127,7 +54127,7 @@ void cctvHandleLensShot(struct defaultobj *obj) SHARDTYPE_GLASS, prop); } - wallhitsRemoveByProp(prop, 1); + wallhitsFreeByProp(prop, 1); rwdata = modelGetNodeRwData(model, modelGetPart(model->filedata, MODELPART_CCTV_0003)); rwdata->toggle.visible = false; } diff --git a/src/game/training.c b/src/game/training.c index 9f7b113fe..a286e21ec 100644 --- a/src/game/training.c +++ b/src/game/training.c @@ -549,8 +549,8 @@ void frInitDefaults(void) g_FrData.targets[i].invincibletimer = 0; g_FrData.targets[i].frpadnum = -1; - wallhitsRemoveByProp(g_FrData.targets[i].prop, 0); - wallhitsRemoveByProp(g_FrData.targets[i].prop, 1); + wallhitsFreeByProp(g_FrData.targets[i].prop, 0); + wallhitsFreeByProp(g_FrData.targets[i].prop, 1); } g_FrData.timetaken = TICKS(-240); diff --git a/src/game/wallhit.c b/src/game/wallhit.c index 8ab0aa1f2..f53174841 100644 --- a/src/game/wallhit.c +++ b/src/game/wallhit.c @@ -60,9 +60,9 @@ const char var7f1b5cc8[] = ""; const char var7f1b5ccc[] = ""; const char var7f1b5cd0[] = "Wallhit colour %d not implemented, substituting black\n"; -struct wallhit *var800a41b0; +struct wallhit *g_Wallhits; struct wallhit *var800a41b4; -u32 var800a41b8; +struct wallhit *var800a41b8; u32 var8007f740 = 0x00000000; u8 var8007f744[4] = {0x40, 0x0a, 0x0a, 0x00}; @@ -122,199 +122,121 @@ s16 func0f13e0e0(f32 value) return value; } -GLOBAL_ASM( -glabel wallhitRemove -/* f13e1b0: 908e006f */ lbu $t6,0x6f($a0) -/* f13e1b4: 3c03800a */ lui $v1,%hi(var800a41b8) -/* f13e1b8: 246341b8 */ addiu $v1,$v1,%lo(var800a41b8) -/* f13e1bc: 31cfff7f */ andi $t7,$t6,0xff7f -/* f13e1c0: a080006d */ sb $zero,0x6d($a0) -/* f13e1c4: a080006e */ sb $zero,0x6e($a0) -/* f13e1c8: a08f006f */ sb $t7,0x6f($a0) -/* f13e1cc: 8c620000 */ lw $v0,0x0($v1) -/* f13e1d0: 54820006 */ bnel $a0,$v0,.L0f13e1ec -/* f13e1d4: 8c450074 */ lw $a1,0x74($v0) -/* f13e1d8: 8c980074 */ lw $t8,0x74($a0) -/* f13e1dc: ac780000 */ sw $t8,0x0($v1) -/* f13e1e0: 1000000b */ b .L0f13e210 -/* f13e1e4: ac800074 */ sw $zero,0x74($a0) -/* f13e1e8: 8c450074 */ lw $a1,0x74($v0) -.L0f13e1ec: -/* f13e1ec: 00401825 */ or $v1,$v0,$zero -/* f13e1f0: 50850006 */ beql $a0,$a1,.L0f13e20c -/* f13e1f4: 8c990074 */ lw $t9,0x74($a0) -/* f13e1f8: 00a01825 */ or $v1,$a1,$zero -.L0f13e1fc: -/* f13e1fc: 8ca50074 */ lw $a1,0x74($a1) -/* f13e200: 5485fffe */ bnel $a0,$a1,.L0f13e1fc -/* f13e204: 00a01825 */ or $v1,$a1,$zero -/* f13e208: 8c990074 */ lw $t9,0x74($a0) -.L0f13e20c: -/* f13e20c: ac790074 */ sw $t9,0x74($v1) -.L0f13e210: -/* f13e210: 3c03800a */ lui $v1,%hi(var800a41b4) -/* f13e214: 246341b4 */ addiu $v1,$v1,%lo(var800a41b4) -/* f13e218: 8c680000 */ lw $t0,0x0($v1) -/* f13e21c: 3c06800a */ lui $a2,%hi(var8009cc4c) -/* f13e220: 24c6cc4c */ addiu $a2,$a2,%lo(var8009cc4c) -/* f13e224: ac880074 */ sw $t0,0x74($a0) -/* f13e228: ac640000 */ sw $a0,0x0($v1) -/* f13e22c: 8c820060 */ lw $v0,0x60($a0) -/* f13e230: 5440003c */ bnezl $v0,.L0f13e324 -/* f13e234: 8c8d006c */ lw $t5,0x6c($a0) -/* f13e238: 8c89006c */ lw $t1,0x6c($a0) -/* f13e23c: 00095f00 */ sll $t3,$t1,0x1c -/* f13e240: 0563001d */ bgezl $t3,.L0f13e2b8 -/* f13e244: 84880068 */ lh $t0,0x68($a0) -/* f13e248: 848d0068 */ lh $t5,0x68($a0) -/* f13e24c: 3c0c800a */ lui $t4,%hi(g_Rooms) -/* f13e250: 8d8c4928 */ lw $t4,%lo(g_Rooms)($t4) -/* f13e254: 000d70c0 */ sll $t6,$t5,0x3 -/* f13e258: 01cd7021 */ addu $t6,$t6,$t5 -/* f13e25c: 000e7080 */ sll $t6,$t6,0x2 -/* f13e260: 01cd7023 */ subu $t6,$t6,$t5 -/* f13e264: 000e7080 */ sll $t6,$t6,0x2 -/* f13e268: 018e1021 */ addu $v0,$t4,$t6 -/* f13e26c: 8c450088 */ lw $a1,0x88($v0) -/* f13e270: 54850005 */ bnel $a0,$a1,.L0f13e288 -/* f13e274: 8ca20078 */ lw $v0,0x78($a1) -/* f13e278: 8c8f0078 */ lw $t7,0x78($a0) -/* f13e27c: 1000000b */ b .L0f13e2ac -/* f13e280: ac4f0088 */ sw $t7,0x88($v0) -/* f13e284: 8ca20078 */ lw $v0,0x78($a1) -.L0f13e288: -/* f13e288: 00a01825 */ or $v1,$a1,$zero -/* f13e28c: 50820006 */ beql $a0,$v0,.L0f13e2a8 -/* f13e290: 8c980078 */ lw $t8,0x78($a0) -/* f13e294: 00401825 */ or $v1,$v0,$zero -.L0f13e298: -/* f13e298: 8c420078 */ lw $v0,0x78($v0) -/* f13e29c: 5482fffe */ bnel $a0,$v0,.L0f13e298 -/* f13e2a0: 00401825 */ or $v1,$v0,$zero -/* f13e2a4: 8c980078 */ lw $t8,0x78($a0) -.L0f13e2a8: -/* f13e2a8: ac780078 */ sw $t8,0x78($v1) -.L0f13e2ac: -/* f13e2ac: 10000044 */ b .L0f13e3c0 -/* f13e2b0: ac800078 */ sw $zero,0x78($a0) -/* f13e2b4: 84880068 */ lh $t0,0x68($a0) -.L0f13e2b8: -/* f13e2b8: 3c19800a */ lui $t9,%hi(g_Rooms) -/* f13e2bc: 8f394928 */ lw $t9,%lo(g_Rooms)($t9) -/* f13e2c0: 000848c0 */ sll $t1,$t0,0x3 -/* f13e2c4: 01284821 */ addu $t1,$t1,$t0 -/* f13e2c8: 00094880 */ sll $t1,$t1,0x2 -/* f13e2cc: 01284823 */ subu $t1,$t1,$t0 -/* f13e2d0: 00094880 */ sll $t1,$t1,0x2 -/* f13e2d4: 03291021 */ addu $v0,$t9,$t1 -/* f13e2d8: 8c450084 */ lw $a1,0x84($v0) -/* f13e2dc: 54850005 */ bnel $a0,$a1,.L0f13e2f4 -/* f13e2e0: 8ca20078 */ lw $v0,0x78($a1) -/* f13e2e4: 8c8a0078 */ lw $t2,0x78($a0) -/* f13e2e8: 1000000b */ b .L0f13e318 -/* f13e2ec: ac4a0084 */ sw $t2,0x84($v0) -/* f13e2f0: 8ca20078 */ lw $v0,0x78($a1) -.L0f13e2f4: -/* f13e2f4: 00a01825 */ or $v1,$a1,$zero -/* f13e2f8: 50820006 */ beql $a0,$v0,.L0f13e314 -/* f13e2fc: 8c8b0078 */ lw $t3,0x78($a0) -/* f13e300: 00401825 */ or $v1,$v0,$zero -.L0f13e304: -/* f13e304: 8c420078 */ lw $v0,0x78($v0) -/* f13e308: 5482fffe */ bnel $a0,$v0,.L0f13e304 -/* f13e30c: 00401825 */ or $v1,$v0,$zero -/* f13e310: 8c8b0078 */ lw $t3,0x78($a0) -.L0f13e314: -/* f13e314: ac6b0078 */ sw $t3,0x78($v1) -.L0f13e318: -/* f13e318: 10000029 */ b .L0f13e3c0 -/* f13e31c: ac800078 */ sw $zero,0x78($a0) -/* f13e320: 8c8d006c */ lw $t5,0x6c($a0) -.L0f13e324: -/* f13e324: 00401825 */ or $v1,$v0,$zero -/* f13e328: 000d7700 */ sll $t6,$t5,0x1c -/* f13e32c: 05c30014 */ bgezl $t6,.L0f13e380 -/* f13e330: 8c650040 */ lw $a1,0x40($v1) -/* f13e334: 8c450044 */ lw $a1,0x44($v0) -/* f13e338: 54850005 */ bnel $a0,$a1,.L0f13e350 -/* f13e33c: 8ca20078 */ lw $v0,0x78($a1) -/* f13e340: 8c8f0078 */ lw $t7,0x78($a0) -/* f13e344: 1000000b */ b .L0f13e374 -/* f13e348: ac4f0044 */ sw $t7,0x44($v0) -/* f13e34c: 8ca20078 */ lw $v0,0x78($a1) -.L0f13e350: -/* f13e350: 00a01825 */ or $v1,$a1,$zero -/* f13e354: 50820006 */ beql $a0,$v0,.L0f13e370 -/* f13e358: 8c980078 */ lw $t8,0x78($a0) -/* f13e35c: 00401825 */ or $v1,$v0,$zero -.L0f13e360: -/* f13e360: 8c420078 */ lw $v0,0x78($v0) -/* f13e364: 5482fffe */ bnel $a0,$v0,.L0f13e360 -/* f13e368: 00401825 */ or $v1,$v0,$zero -/* f13e36c: 8c980078 */ lw $t8,0x78($a0) -.L0f13e370: -/* f13e370: ac780078 */ sw $t8,0x78($v1) -.L0f13e374: -/* f13e374: 10000012 */ b .L0f13e3c0 -/* f13e378: ac800078 */ sw $zero,0x78($a0) -/* f13e37c: 8c650040 */ lw $a1,0x40($v1) -.L0f13e380: -/* f13e380: 54850005 */ bnel $a0,$a1,.L0f13e398 -/* f13e384: 8ca20078 */ lw $v0,0x78($a1) -/* f13e388: 8c880078 */ lw $t0,0x78($a0) -/* f13e38c: 1000000b */ b .L0f13e3bc -/* f13e390: ac680040 */ sw $t0,0x40($v1) -/* f13e394: 8ca20078 */ lw $v0,0x78($a1) -.L0f13e398: -/* f13e398: 00a01825 */ or $v1,$a1,$zero -/* f13e39c: 50820006 */ beql $a0,$v0,.L0f13e3b8 -/* f13e3a0: 8c990078 */ lw $t9,0x78($a0) -/* f13e3a4: 00401825 */ or $v1,$v0,$zero -.L0f13e3a8: -/* f13e3a8: 8c420078 */ lw $v0,0x78($v0) -/* f13e3ac: 5482fffe */ bnel $a0,$v0,.L0f13e3a8 -/* f13e3b0: 00401825 */ or $v1,$v0,$zero -/* f13e3b4: 8c990078 */ lw $t9,0x78($a0) -.L0f13e3b8: -/* f13e3b8: ac790078 */ sw $t9,0x78($v1) -.L0f13e3bc: -/* f13e3bc: ac800078 */ sw $zero,0x78($a0) -.L0f13e3c0: -/* f13e3c0: 3c05800a */ lui $a1,%hi(var8009cc50) -/* f13e3c4: ac800060 */ sw $zero,0x60($a0) -/* f13e3c8: 24a5cc50 */ addiu $a1,$a1,%lo(var8009cc50) -/* f13e3cc: 8ca90000 */ lw $t1,0x0($a1) -/* f13e3d0: 8ccb0000 */ lw $t3,0x0($a2) -/* f13e3d4: 00801825 */ or $v1,$a0,$zero -/* f13e3d8: 252affff */ addiu $t2,$t1,-1 -/* f13e3dc: 256d0001 */ addiu $t5,$t3,0x1 -/* f13e3e0: acaa0000 */ sw $t2,0x0($a1) -/* f13e3e4: accd0000 */ sw $t5,0x0($a2) -/* f13e3e8: 24040004 */ addiu $a0,$zero,0x4 -/* f13e3ec: 00001025 */ or $v0,$zero,$zero -.L0f13e3f0: -/* f13e3f0: 24420001 */ addiu $v0,$v0,0x1 -/* f13e3f4: 24630004 */ addiu $v1,$v1,0x4 -/* f13e3f8: a060002f */ sb $zero,0x2f($v1) -/* f13e3fc: 1444fffc */ bne $v0,$a0,.L0f13e3f0 -/* f13e400: a060003f */ sb $zero,0x3f($v1) -/* f13e404: 03e00008 */ jr $ra -/* f13e408: 00000000 */ nop -); +void wallhitFree(struct wallhit *wallhit) +{ + struct wallhit *iter; + s32 i; -void wallhitsRemoveByProp(struct prop *prop, s8 layer) + wallhit->unk6d = 0; + wallhit->unk6e = 0; + wallhit->inuse = false; + + // Update the global list + if (wallhit == var800a41b8) { + var800a41b8 = wallhit->globalnext; + wallhit->globalnext = NULL; + } else { + iter = var800a41b8; + + while (wallhit != iter->globalnext) { + iter = iter->globalnext; + } + + iter->globalnext = wallhit->globalnext; + } + + wallhit->globalnext = var800a41b4; + var800a41b4 = wallhit; + + // Update the room/prop's wallhit list + if (wallhit->prop60 == NULL) { + if (wallhit->unk6f_04) { + if (wallhit == g_Rooms[wallhit->roomnum].wallhits2) { + g_Rooms[wallhit->roomnum].wallhits2 = wallhit->localnext; + } else { + iter = g_Rooms[wallhit->roomnum].wallhits2; + + while (wallhit != iter->localnext) { + iter = iter->localnext; + } + + iter->localnext = wallhit->localnext; + } + + wallhit->localnext = NULL; + } else { + if (wallhit == g_Rooms[wallhit->roomnum].wallhits1) { + g_Rooms[wallhit->roomnum].wallhits1 = wallhit->localnext; + } else { + iter = g_Rooms[wallhit->roomnum].wallhits1; + + while (wallhit != iter->localnext) { + iter = iter->localnext; + } + + iter->localnext = wallhit->localnext; + } + + wallhit->localnext = NULL; + } + } else { + struct prop *prop = wallhit->prop60; + + if (wallhit->unk6f_04) { + if (wallhit == prop->wallhits2) { + prop->wallhits2 = wallhit->localnext; + } else { + iter = prop->wallhits2; + + while (wallhit != iter->localnext) { + iter = iter->localnext; + } + + iter->localnext = wallhit->localnext; + } + + wallhit->localnext = NULL; + } else { + if (wallhit == prop->wallhits1) { + prop->wallhits1 = wallhit->localnext; + } else { + iter = prop->wallhits1; + + while (wallhit != iter->localnext) { + iter = iter->localnext; + } + + iter->localnext = wallhit->localnext; + } + + wallhit->localnext = NULL; + } + } + + wallhit->prop60 = NULL; + + g_WallhitsNumUsed--; + g_WallhitsNumFree++; + + for (i = 0; i < 4; i++) { + wallhit->unk30[i].a = 0; + wallhit->colours[i].a = 0; + } +} + +void wallhitsFreeByProp(struct prop *prop, s8 layer) { struct prop *copy = prop; if (layer) { while (copy->wallhits2) { func0f13e640(copy->wallhits2, 1); - wallhitRemove(copy->wallhits2); + wallhitFree(copy->wallhits2); } } else { while (copy->wallhits1) { func0f13e640(copy->wallhits1, 1); - wallhitRemove(copy->wallhits1); + wallhitFree(copy->wallhits1); } } } @@ -352,10 +274,10 @@ void func0f13e5c8(struct prop *prop) void func0f13e640(struct wallhit *hit, u32 arg1) { if (hit->unk6f_02 == 0) { - if (hit->unk60) { + if (hit->prop60) { var8009cc40[0]--; } else { - var8009cc40[hit->unk68]--; + var8009cc40[hit->roomnum]--; } if (hit->unk6d == 0) { @@ -366,7 +288,7 @@ void func0f13e640(struct wallhit *hit, u32 arg1) hit->unk6f_02 = true; var8009cc48--; - var8009cc50++; + g_WallhitsNumUsed++; if (var8007f75c[hit->texturenum].unk08 == 3) { var8009cc54--; @@ -397,8 +319,8 @@ glabel func0f13e744 /* f13e778: 97190000 */ lhu $t9,0x0($t8) /* f13e77c: 1320007d */ beqz $t9,.L0f13e974 .L0f13e780: -/* f13e780: 3c0c800a */ lui $t4,%hi(var8009cc44) -/* f13e784: 8d8ccc44 */ lw $t4,%lo(var8009cc44)($t4) +/* f13e780: 3c0c800a */ lui $t4,%hi(g_WallhitsMax) +/* f13e784: 8d8ccc44 */ lw $t4,%lo(g_WallhitsMax)($t4) /* f13e788: 44800000 */ mtc1 $zero,$f0 /* f13e78c: 2408ffff */ addiu $t0,$zero,-1 /* f13e790: 2409ffff */ addiu $t1,$zero,-1 @@ -410,10 +332,10 @@ glabel func0f13e744 /* f13e7a8: 00005825 */ or $t3,$zero,$zero /* f13e7ac: 19800043 */ blez $t4,.L0f13e8bc /* f13e7b0: 00003825 */ or $a3,$zero,$zero -/* f13e7b4: 3c04800a */ lui $a0,%hi(var800a41b0) +/* f13e7b4: 3c04800a */ lui $a0,%hi(g_Wallhits) /* f13e7b8: 3c1f8008 */ lui $ra,%hi(var8007f75c) /* f13e7bc: 27fff75c */ addiu $ra,$ra,%lo(var8007f75c) -/* f13e7c0: 8c8441b0 */ lw $a0,%lo(var800a41b0)($a0) +/* f13e7c0: 8c8441b0 */ lw $a0,%lo(g_Wallhits)($a0) /* f13e7c4: 240d0003 */ addiu $t5,$zero,0x3 .L0f13e7c8: /* f13e7c8: 808f006f */ lb $t7,0x6f($a0) @@ -500,12 +422,12 @@ glabel func0f13e744 /* f13e8e8: 45000017 */ bc1f .L0f13e948 /* f13e8ec: 00000000 */ nop /* f13e8f0: 16130003 */ bne $s0,$s3,.L0f13e900 -/* f13e8f4: 3c02800a */ lui $v0,%hi(var800a41b0) +/* f13e8f4: 3c02800a */ lui $v0,%hi(g_Wallhits) /* f13e8f8: 12330013 */ beq $s1,$s3,.L0f13e948 /* f13e8fc: 00000000 */ nop .L0f13e900: /* f13e900: 12130009 */ beq $s0,$s3,.L0f13e928 -/* f13e904: 8c4241b0 */ lw $v0,%lo(var800a41b0)($v0) +/* f13e904: 8c4241b0 */ lw $v0,%lo(g_Wallhits)($v0) /* f13e908: 00107940 */ sll $t7,$s0,0x5 /* f13e90c: 01f07823 */ subu $t7,$t7,$s0 /* f13e910: 000f7880 */ sll $t7,$t7,0x2 @@ -526,8 +448,8 @@ glabel func0f13e744 .L0f13e948: /* f13e948: 1253000a */ beq $s2,$s3,.L0f13e974 /* f13e94c: 0012c940 */ sll $t9,$s2,0x5 -/* f13e950: 3c0e800a */ lui $t6,%hi(var800a41b0) -/* f13e954: 8dce41b0 */ lw $t6,%lo(var800a41b0)($t6) +/* f13e950: 3c0e800a */ lui $t6,%hi(g_Wallhits) +/* f13e954: 8dce41b0 */ lw $t6,%lo(g_Wallhits)($t6) /* f13e958: 0332c823 */ subu $t9,$t9,$s2 /* f13e95c: 0019c880 */ sll $t9,$t9,0x2 /* f13e960: 2405001e */ addiu $a1,$zero,0x19 @@ -565,8 +487,8 @@ glabel func0f13e744 /* f13e778: 97190000 */ lhu $t9,0x0($t8) /* f13e77c: 1320007d */ beqz $t9,.L0f13e974 .L0f13e780: -/* f13e780: 3c0c800a */ lui $t4,%hi(var8009cc44) -/* f13e784: 8d8ccc44 */ lw $t4,%lo(var8009cc44)($t4) +/* f13e780: 3c0c800a */ lui $t4,%hi(g_WallhitsMax) +/* f13e784: 8d8ccc44 */ lw $t4,%lo(g_WallhitsMax)($t4) /* f13e788: 44800000 */ mtc1 $zero,$f0 /* f13e78c: 2408ffff */ addiu $t0,$zero,-1 /* f13e790: 2409ffff */ addiu $t1,$zero,-1 @@ -578,10 +500,10 @@ glabel func0f13e744 /* f13e7a8: 00005825 */ or $t3,$zero,$zero /* f13e7ac: 19800043 */ blez $t4,.L0f13e8bc /* f13e7b0: 00003825 */ or $a3,$zero,$zero -/* f13e7b4: 3c04800a */ lui $a0,%hi(var800a41b0) +/* f13e7b4: 3c04800a */ lui $a0,%hi(g_Wallhits) /* f13e7b8: 3c1f8008 */ lui $ra,%hi(var8007f75c) /* f13e7bc: 27fff75c */ addiu $ra,$ra,%lo(var8007f75c) -/* f13e7c0: 8c8441b0 */ lw $a0,%lo(var800a41b0)($a0) +/* f13e7c0: 8c8441b0 */ lw $a0,%lo(g_Wallhits)($a0) /* f13e7c4: 240d0003 */ addiu $t5,$zero,0x3 .L0f13e7c8: /* f13e7c8: 808f006f */ lb $t7,0x6f($a0) @@ -668,12 +590,12 @@ glabel func0f13e744 /* f13e8e8: 45000017 */ bc1f .L0f13e948 /* f13e8ec: 00000000 */ nop /* f13e8f0: 16130003 */ bne $s0,$s3,.L0f13e900 -/* f13e8f4: 3c02800a */ lui $v0,%hi(var800a41b0) +/* f13e8f4: 3c02800a */ lui $v0,%hi(g_Wallhits) /* f13e8f8: 12330013 */ beq $s1,$s3,.L0f13e948 /* f13e8fc: 00000000 */ nop .L0f13e900: /* f13e900: 12130009 */ beq $s0,$s3,.L0f13e928 -/* f13e904: 8c4241b0 */ lw $v0,%lo(var800a41b0)($v0) +/* f13e904: 8c4241b0 */ lw $v0,%lo(g_Wallhits)($v0) /* f13e908: 00107940 */ sll $t7,$s0,0x5 /* f13e90c: 01f07823 */ subu $t7,$t7,$s0 /* f13e910: 000f7880 */ sll $t7,$t7,0x2 @@ -694,8 +616,8 @@ glabel func0f13e744 .L0f13e948: /* f13e948: 1253000a */ beq $s2,$s3,.L0f13e974 /* f13e94c: 0012c940 */ sll $t9,$s2,0x5 -/* f13e950: 3c0e800a */ lui $t6,%hi(var800a41b0) -/* f13e954: 8dce41b0 */ lw $t6,%lo(var800a41b0)($t6) +/* f13e950: 3c0e800a */ lui $t6,%hi(g_Wallhits) +/* f13e954: 8dce41b0 */ lw $t6,%lo(g_Wallhits)($t6) /* f13e958: 0332c823 */ subu $t9,$t9,$s2 /* f13e95c: 0019c880 */ sll $t9,$t9,0x2 /* f13e960: 2405001e */ addiu $a1,$zero,0x1e @@ -931,11 +853,11 @@ glabel var7f1b5d18 /* f13ec50: 3c013f80 */ lui $at,0x3f80 /* f13ec54: 4481d000 */ mtc1 $at,$f26 /* f13ec58: c4680000 */ lwc1 $f8,0x0($v1) -/* f13ec5c: 3c18800a */ lui $t8,%hi(var8009cc4c) -/* f13ec60: 3c19800a */ lui $t9,%hi(var8009cc50) +/* f13ec5c: 3c18800a */ lui $t8,%hi(g_WallhitsNumFree) +/* f13ec60: 3c19800a */ lui $t9,%hi(g_WallhitsNumUsed) /* f13ec64: 4608d283 */ div.s $f10,$f26,$f8 -/* f13ec68: 8f39cc50 */ lw $t9,%lo(var8009cc50)($t9) -/* f13ec6c: 8f18cc4c */ lw $t8,%lo(var8009cc4c)($t8) +/* f13ec68: 8f39cc50 */ lw $t9,%lo(g_WallhitsNumUsed)($t9) +/* f13ec6c: 8f18cc4c */ lw $t8,%lo(g_WallhitsNumFree)($t8) /* f13ec70: 3c08800a */ lui $t0,%hi(var8009cc70) /* f13ec74: 8d08cc70 */ lw $t0,%lo(var8009cc70)($t0) /* f13ec78: 3c018008 */ lui $at,%hi(var8007f74c) @@ -963,10 +885,10 @@ glabel var7f1b5d18 /* f13eccc: 0fc4fa65 */ jal func0f13e994 /* f13ecd0: ac20f834 */ sw $zero,%lo(var8007f75c+0xd8)($at) .L0f13ecd4: -/* f13ecd4: 3c02800a */ lui $v0,%hi(var8009cc44) -/* f13ecd8: 8c42cc44 */ lw $v0,%lo(var8009cc44)($v0) -/* f13ecdc: 3c11800a */ lui $s1,%hi(var800a41b0) -/* f13ece0: 8e3141b0 */ lw $s1,%lo(var800a41b0)($s1) +/* f13ecd4: 3c02800a */ lui $v0,%hi(g_WallhitsMax) +/* f13ecd8: 8c42cc44 */ lw $v0,%lo(g_WallhitsMax)($v0) +/* f13ecdc: 3c11800a */ lui $s1,%hi(g_Wallhits) +/* f13ece0: 8e3141b0 */ lw $s1,%lo(g_Wallhits)($s1) /* f13ece4: 184001b1 */ blez $v0,.L0f13f3ac /* f13ece8: 0000b825 */ or $s7,$zero,$zero /* f13ecec: 3c013f00 */ lui $at,0x3f00 @@ -1111,7 +1033,7 @@ glabel var7f1b5d18 /* f13eeec: 10000003 */ b .L0f13eefc /* f13eef0: a22c006e */ sb $t4,0x6e($s1) .L0f13eef4: -/* f13eef4: 0fc4f86c */ jal wallhitRemove +/* f13eef4: 0fc4f86c */ jal wallhitFree /* f13eef8: 02202025 */ or $a0,$s1,$zero .L0f13eefc: /* f13eefc: 9222006d */ lbu $v0,0x6d($s1) @@ -1431,9 +1353,9 @@ glabel var7f1b5d18 .L0f13f38c: /* f13f38c: 34890004 */ ori $t1,$a0,0x4 .L0f13f390: -/* f13f390: 3c02800a */ lui $v0,%hi(var8009cc44) +/* f13f390: 3c02800a */ lui $v0,%hi(g_WallhitsMax) /* f13f394: a229006f */ sb $t1,0x6f($s1) -/* f13f398: 8c42cc44 */ lw $v0,%lo(var8009cc44)($v0) +/* f13f398: 8c42cc44 */ lw $v0,%lo(g_WallhitsMax)($v0) /* f13f39c: 26f70001 */ addiu $s7,$s7,0x1 .L0f13f3a0: /* f13f3a0: 02e2082a */ slt $at,$s7,$v0 @@ -1649,12 +1571,12 @@ glabel var7f1b5d6c /* f13f6e8: 8fbf0024 */ lw $ra,0x24($sp) /* f13f6ec: 8e6e0000 */ lw $t6,0x0($s3) .L0f13f6f0: -/* f13f6f0: 3c03800a */ lui $v1,%hi(var8009cc4c) +/* f13f6f0: 3c03800a */ lui $v1,%hi(g_WallhitsNumFree) /* f13f6f4: 3c04800a */ lui $a0,%hi(var8009cc48) /* f13f6f8: 01d01021 */ addu $v0,$t6,$s0 /* f13f6fc: 944d0000 */ lhu $t5,0x0($v0) /* f13f700: 2484cc48 */ addiu $a0,$a0,%lo(var8009cc48) -/* f13f704: 2463cc4c */ addiu $v1,$v1,%lo(var8009cc4c) +/* f13f704: 2463cc4c */ addiu $v1,$v1,%lo(g_WallhitsNumFree) /* f13f708: 25ab0001 */ addiu $t3,$t5,0x1 /* f13f70c: a44b0000 */ sh $t3,0x0($v0) /* f13f710: 87b90216 */ lh $t9,0x216($sp) @@ -2948,12 +2870,12 @@ glabel var7f1b5d6c /* f13f6e8: 8fbf0024 */ lw $ra,0x24($sp) /* f13f6ec: 8e6e0000 */ lw $t6,0x0($s3) .L0f13f6f0: -/* f13f6f0: 3c03800a */ lui $v1,%hi(var8009cc4c) +/* f13f6f0: 3c03800a */ lui $v1,%hi(g_WallhitsNumFree) /* f13f6f4: 3c04800a */ lui $a0,%hi(var8009cc48) /* f13f6f8: 01d01021 */ addu $v0,$t6,$s0 /* f13f6fc: 944d0000 */ lhu $t5,0x0($v0) /* f13f700: 2484cc48 */ addiu $a0,$a0,%lo(var8009cc48) -/* f13f704: 2463cc4c */ addiu $v1,$v1,%lo(var8009cc4c) +/* f13f704: 2463cc4c */ addiu $v1,$v1,%lo(g_WallhitsNumFree) /* f13f708: 25ab0001 */ addiu $t3,$t5,0x1 /* f13f70c: a44b0000 */ sh $t3,0x0($v0) /* f13f710: 87b90216 */ lh $t9,0x216($sp) @@ -5454,7 +5376,7 @@ Gfx *wallhitRenderBgHitsLayer1(s32 roomnum, Gfx *gdl) hit = g_Rooms[roomnum].wallhits1; while (hit) { - if (hit->unk6f_00 && hit->unk6f_05) { + if (hit->inuse && hit->unk6f_05) { if (hit->unk6f_04) { hit->unk6b = 1; } else { @@ -5485,7 +5407,7 @@ Gfx *wallhitRenderBgHitsLayer1(s32 roomnum, Gfx *gdl) gDPTri2(gdl++, 0, 1, 2, 0, 2, 3); } - hit = hit->next; + hit = hit->localnext; } gSPClearGeometryMode(gdl++, G_CULL_BOTH); @@ -5516,7 +5438,7 @@ Gfx *wallhitRenderBgHitsLayer2(s32 roomnum, Gfx *gdl) hit = g_Rooms[roomnum].wallhits2; while (hit) { - if (hit->unk6f_00 && hit->unk6f_05) { + if (hit->inuse && hit->unk6f_05) { hit->unk6b = 1; if (hit->texturenum != prevtexturenum || hit->unk6b != prev6b) { @@ -5543,7 +5465,7 @@ Gfx *wallhitRenderBgHitsLayer2(s32 roomnum, Gfx *gdl) gDPTri2(gdl++, 0, 1, 2, 0, 2, 3); } - hit = hit->next; + hit = hit->localnext; } gSPClearGeometryMode(gdl++, G_CULL_BOTH); @@ -5581,7 +5503,7 @@ Gfx *wallhitRenderPropHits(Gfx *gdl, struct prop *prop, bool withalpha) hit = withalpha ? prop->wallhits2 : prop->wallhits1; while (hit) { - if (hit->unk6f_00) { + if (hit->inuse) { hasany = true; if (hit->mtxindex != prevmtxindex) { @@ -5630,7 +5552,7 @@ Gfx *wallhitRenderPropHits(Gfx *gdl, struct prop *prop, bool withalpha) gDPTri2(gdl++, 0, 1, 2, 0, 2, 3); } - hit = hit->next; + hit = hit->localnext; } if (!hasany) { @@ -5658,11 +5580,11 @@ Gfx *wallhitRenderBgHits(s32 roomnum, Gfx *gdl) GLOBAL_ASM( glabel func0f141234 -/* f141234: 3c04800a */ lui $a0,%hi(var8009cc44) -/* f141238: 8c84cc44 */ lw $a0,%lo(var8009cc44)($a0) -/* f14123c: 3c03800a */ lui $v1,%hi(var800a41b0) +/* f141234: 3c04800a */ lui $a0,%hi(g_WallhitsMax) +/* f141238: 8c84cc44 */ lw $a0,%lo(g_WallhitsMax)($a0) +/* f14123c: 3c03800a */ lui $v1,%hi(g_Wallhits) /* f141240: 27bdffe0 */ addiu $sp,$sp,-32 -/* f141244: 8c6341b0 */ lw $v1,%lo(var800a41b0)($v1) +/* f141244: 8c6341b0 */ lw $v1,%lo(g_Wallhits)($v1) /* f141248: 188000d2 */ blez $a0,.L0f141594 /* f14124c: 00001025 */ or $v0,$zero,$zero /* f141250: 3c0d800a */ lui $t5,%hi(g_Rooms) @@ -5886,8 +5808,8 @@ glabel func0f141234 /* f141568: 24840004 */ addiu $a0,$a0,4 /* f14156c: 152cff7d */ bne $t1,$t4,.L0f141364 /* f141570: a099003e */ sb $t9,0x3e($a0) -/* f141574: 3c04800a */ lui $a0,%hi(var8009cc44) -/* f141578: 8c84cc44 */ lw $a0,%lo(var8009cc44)($a0) +/* f141574: 3c04800a */ lui $a0,%hi(g_WallhitsMax) +/* f141578: 8c84cc44 */ lw $a0,%lo(g_WallhitsMax)($a0) .L0f14157c: /* f14157c: 0044082a */ slt $at,$v0,$a0 .L0f141580: @@ -5905,11 +5827,11 @@ void func0f14159c(struct prop *prop) { s32 i; - for (i = 0; i < var8009cc44; i++) { - struct wallhit *hit = &var800a41b0[i]; + for (i = 0; i < g_WallhitsMax; i++) { + struct wallhit *hit = &g_Wallhits[i]; if (hit->prop - && hit->unk68 > 0 + && hit->roomnum > 0 && hit->prop == prop && var8007f75c[hit->texturenum].unk08 == 3) { if ((hit->texturenum >= 12 && hit->texturenum <= 12) || (random() % 100) < 35) { @@ -5930,11 +5852,11 @@ void func0f141704(struct prop *prop) s32 index = -1; s32 i; - for (i = 0; i < var8009cc44; i++) { - struct wallhit *hit = &var800a41b0[i]; + for (i = 0; i < g_WallhitsMax; i++) { + struct wallhit *hit = &g_Wallhits[i]; if (hit->prop - && hit->unk68 > 0 + && hit->roomnum > 0 && hit->prop == prop && hit->unk6f_02 == 0 && var8007f75c[hit->texturenum].unk08 == 3 @@ -5947,7 +5869,7 @@ void func0f141704(struct prop *prop) } if (index != -1) { - func0f13e640(&var800a41b0[index], TICKS(120)); + func0f13e640(&g_Wallhits[index], TICKS(120)); } } diff --git a/src/game/wallhitreset.c b/src/game/wallhitreset.c index 6d4ee2183..a1654f538 100644 --- a/src/game/wallhitreset.c +++ b/src/game/wallhitreset.c @@ -6,10 +6,10 @@ #include "types.h" u16 *var8009cc40; -s32 var8009cc44; +s32 g_WallhitsMax; u32 var8009cc48; -u32 var8009cc4c; -u32 var8009cc50; +u32 g_WallhitsNumFree; +u32 g_WallhitsNumUsed; u32 var8009cc54; u32 var8009cc58; u32 var8009cc5c; @@ -44,7 +44,7 @@ void wallhitReset(void) switch (type) { case 0: // 4MB or MP with 2+ players - var8009cc44 = 80; + g_WallhitsMax = 80; var8009cc5c = 10; var8009cc60 = 40; var8009cc64 = 1; @@ -56,7 +56,7 @@ void wallhitReset(void) break; case 1: // 2 player coop/anti - var8009cc44 = 200; + g_WallhitsMax = 200; var8009cc5c = 25; var8009cc60 = 100; var8009cc64 = 4; @@ -69,7 +69,7 @@ void wallhitReset(void) case 2: default: // 1 player 8MB - var8009cc44 = 360; + g_WallhitsMax = 360; var8009cc5c = 50; var8009cc60 = 120; var8009cc64 = 10; @@ -83,24 +83,24 @@ void wallhitReset(void) var8009cc40 = 0; var8009cc48 = 0; - var8009cc4c = 0; - var8009cc50 = 0; + g_WallhitsNumFree = 0; + g_WallhitsNumUsed = 0; var8009cc54 = 0; var8009cc58 = 0; if (g_Vars.stagenum >= STAGE_TITLE) { - var8009cc44 = 0; + g_WallhitsMax = 0; } - if (var8009cc44 == 0) { - var800a41b0 = NULL; + if (g_WallhitsMax == 0) { + g_Wallhits = NULL; } else { // Allocate an array of s16 room numbers followed by a bunch of structs u32 numberssize; u32 structssize; void *ptr; - structssize = var8009cc44 * sizeof(struct wallhit); + structssize = g_WallhitsMax * sizeof(struct wallhit); structssize += 0xf; structssize &= ~0xf; @@ -111,23 +111,24 @@ void wallhitReset(void) ptr = mempAlloc(structssize + numberssize, MEMPOOL_STAGE); var8009cc40 = ptr; - var800a41b0 = (struct wallhit *)((u32)ptr + numberssize); + g_Wallhits = (struct wallhit *)((u32)ptr + numberssize); var800a41b4 = NULL; var800a41b8 = 0; // Initialise structs - for (i = 0; i < var8009cc44; i++) { - var800a41b0[i].unk6d = 0; - var800a41b0[i].unk6e = 0; - var800a41b0[i].unk70_00 = 0; - var800a41b0[i].unk6f_00 = 0; - var800a41b0[i].unk68 = -1; - var800a41b0[i].prop = NULL; - var800a41b0[i].unk60 = 0; + for (i = 0; i < g_WallhitsMax; i++) { + g_Wallhits[i].unk6d = 0; + g_Wallhits[i].unk6e = 0; + g_Wallhits[i].unk70_00 = 0; + g_Wallhits[i].inuse = false; + g_Wallhits[i].roomnum = -1; + g_Wallhits[i].prop = NULL; + g_Wallhits[i].prop60 = NULL; - var8009cc4c++; - var800a41b0[i].prev = var800a41b4; - var800a41b4 = &var800a41b0[i]; + g_WallhitsNumFree++; + + g_Wallhits[i].globalnext = var800a41b4; + var800a41b4 = &g_Wallhits[i]; } // Initialise room numbers diff --git a/src/include/bss.h b/src/include/bss.h index 05c271cb5..9cd70d5e7 100644 --- a/src/include/bss.h +++ b/src/include/bss.h @@ -69,10 +69,10 @@ extern u8 var8009caef; extern u8 var8009caf0; extern struct prop *g_DangerousProps[MAX_DANGEROUSPROPS]; extern u16 *var8009cc40; -extern s32 var8009cc44; +extern s32 g_WallhitsMax; extern u32 var8009cc48; -extern u32 var8009cc4c; -extern u32 var8009cc50; +extern u32 g_WallhitsNumFree; +extern u32 g_WallhitsNumUsed; extern u32 var8009cc54; extern u32 var8009cc58; extern u32 var8009cc5c; @@ -206,9 +206,9 @@ extern s32 g_NextSparkIndex; extern struct sparkgroup g_SparkGroups[10]; extern s32 g_NextSparkGroupIndex; extern u8 *var800a41a0; -extern struct wallhit *var800a41b0; +extern struct wallhit *g_Wallhits; extern struct wallhit *var800a41b4; -extern u32 var800a41b8; +extern struct wallhit *var800a41b8; extern s32 g_MaxShards; extern struct shard *g_Shards; extern Gfx *var800a4634; diff --git a/src/include/game/pak.h b/src/include/game/pak.h index 133ee7a4c..2489eb34f 100644 --- a/src/include/game/pak.h +++ b/src/include/game/pak.h @@ -139,7 +139,7 @@ void pak0f11e3bc(s8 device); void pakProbeEeprom(void); PakErr1 pakReadEeprom(u8 address, u8 *buffer, u32 len); PakErr1 pakWriteEeprom(u8 address, u8 *buffer, u32 len); -void pakSetBitflag(u32 flagnum, u8 *bitstream, bool set); +void pakSetBitflag(s32 flagnum, u8 *bitstream, bool set); bool pakHasBitflag(u32 flagnum, u8 *stream); void pakClearAllBitflags(u8 *flags); void pakN64FontCodeToAscii(char *src, char *dst, s32 len); diff --git a/src/include/game/wallhit.h b/src/include/game/wallhit.h index 863eb8498..92726f2b4 100644 --- a/src/include/game/wallhit.h +++ b/src/include/game/wallhit.h @@ -7,8 +7,8 @@ void wallhitReset(void); s16 func0f13e0e0(f32 arg0); -void wallhitRemove(struct wallhit *wallhit); -void wallhitsRemoveByProp(struct prop *prop, s8 layer); +void wallhitFree(struct wallhit *wallhit); +void wallhitsFreeByProp(struct prop *prop, s8 layer); bool chrIsUsingPaintball(struct chrdata *chr); void func0f13e5c8(struct prop *prop); void func0f13e640(struct wallhit *wallhit, u32 arg1); diff --git a/src/include/types.h b/src/include/types.h index 9c2ab3e67..c22fcd12a 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -6016,22 +6016,19 @@ struct stageheadlimit { struct wallhit { /*0x00*/ struct gfxvtx vertices[4]; - /*0x30*/ u32 unk30; - /*0x34*/ u32 unk34; - /*0x38*/ u32 unk38; - /*0x3c*/ u32 unk3c; + /*0x30*/ struct colour unk30[4]; /*0x40*/ struct colour colours[4]; /*0x50*/ struct coord unk50; /*0x5c*/ struct prop *prop; - /*0x60*/ u32 unk60; + /*0x60*/ struct prop *prop60; /*0x64*/ struct gfxvtx *verticesptr; - /*0x68*/ s16 unk68; + /*0x68*/ s16 roomnum; /*0x6a*/ u8 texturenum; /*0x6b*/ u8 unk6b; /*0x6c*/ u8 mtxindex; /*0x6d*/ u8 unk6d; /*0x6e*/ u8 unk6e; - /*0x6f*/ u8 unk6f_00 : 1; + /*0x6f*/ u8 inuse : 1; /*0x6f*/ u8 unk6f_01 : 1; /*0x6f*/ u8 unk6f_02 : 1; /*0x6f*/ u8 unk6f_03 : 1; @@ -6039,8 +6036,8 @@ struct wallhit { /*0x6f*/ u8 unk6f_05 : 1; /*0x70*/ u32 unk70_00 : 28; /*0x70*/ u32 unk70_28 : 4; - /*0x74*/ struct wallhit *prev; - /*0x78*/ struct wallhit *next; + /*0x74*/ struct wallhit *globalnext; // for the used/free linked lists + /*0x78*/ struct wallhit *localnext; // for the room/prop specific linked list }; /**