Decompile wallhitFree

This commit is contained in:
Ryan Dwyer 2022-06-29 21:27:46 +10:00
parent 00f84bc48d
commit ef9dbbd24b
9 changed files with 210 additions and 290 deletions

View File

@ -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;

View File

@ -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;
}

View File

@ -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);

View File

@ -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));
}
}

View File

@ -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

View File

@ -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;

View File

@ -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);

View File

@ -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);

View File

@ -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
};
/**