From f9ba47b8a7e18d307c2b9b9bb4393699e1c36186 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Sat, 3 Jun 2023 23:36:30 +1000 Subject: [PATCH] Decompile bodiesReset --- src/game/body.c | 4 +- src/game/bodyreset.c | 305 +++++-------------------------------------- src/include/bss.h | 4 +- src/include/types.h | 5 - 4 files changed, 35 insertions(+), 283 deletions(-) diff --git a/src/game/body.c b/src/game/body.c index 93e2eb31f..38c313aba 100644 --- a/src/game/body.c +++ b/src/game/body.c @@ -26,8 +26,8 @@ s32 g_NumActiveHeadsPerGender; u32 var8009cd24; -u32 g_ActiveMaleHeads[8]; -u32 g_ActiveFemaleHeads[8]; +s32 g_ActiveMaleHeads[8]; +s32 g_ActiveFemaleHeads[8]; s32 g_NumBondBodies = 0; s32 g_NumMaleGuardHeads = 0; diff --git a/src/game/bodyreset.c b/src/game/bodyreset.c index 048b91566..18b0a9973 100644 --- a/src/game/bodyreset.c +++ b/src/game/bodyreset.c @@ -12,268 +12,6 @@ #include "data.h" #include "types.h" -struct stageheadlimit g_StageHeadLimits[3] = { - { STAGE_INFILTRATION, 5 }, - { STAGE_RESCUE, 4 }, - { STAGE_ESCAPE, 5 }, -}; - -u32 var80061708 = 0x00000000; -u32 var8006170c = 0x00000000; - -#if MATCHING -GLOBAL_ASM( -glabel bodiesReset -/* f00b820: 27bdffd0 */ addiu $sp,$sp,-48 -/* f00b824: 3c0e8008 */ lui $t6,%hi(g_HeadsAndBodies+0x2) -/* f00b828: 95cecf06 */ lhu $t6,%lo(g_HeadsAndBodies+0x2)($t6) -/* f00b82c: afb10018 */ sw $s1,0x18($sp) -/* f00b830: afb00014 */ sw $s0,0x14($sp) -/* f00b834: 00808025 */ or $s0,$a0,$zero -/* f00b838: afbf002c */ sw $ra,0x2c($sp) -/* f00b83c: afb50028 */ sw $s5,0x28($sp) -/* f00b840: afb40024 */ sw $s4,0x24($sp) -/* f00b844: afb30020 */ sw $s3,0x20($sp) -/* f00b848: afb2001c */ sw $s2,0x1c($sp) -/* f00b84c: 11c00009 */ beqz $t6,.L0f00b874 -/* f00b850: 00008825 */ or $s1,$zero,$zero -/* f00b854: 3c028008 */ lui $v0,%hi(g_HeadsAndBodies) -/* f00b858: 2442cf04 */ addiu $v0,$v0,%lo(g_HeadsAndBodies) -/* f00b85c: 944f0016 */ lhu $t7,0x16($v0) -.L0f00b860: -/* f00b860: 24420014 */ addiu $v0,$v0,0x14 -/* f00b864: ac40fff8 */ sw $zero,-0x8($v0) -/* f00b868: 55e0fffd */ bnezl $t7,.L0f00b860 -/* f00b86c: 944f0016 */ lhu $t7,0x16($v0) -/* f00b870: 00008825 */ or $s1,$zero,$zero -.L0f00b874: -/* f00b874: 0c004b70 */ jal random -/* f00b878: 00000000 */ nop -/* f00b87c: 3c188006 */ lui $t8,%hi(g_NumBondBodies) -/* f00b880: 8f182b00 */ lw $t8,%lo(g_NumBondBodies)($t8) -/* f00b884: 3c018006 */ lui $at,%hi(var80062c80) -/* f00b888: 3c128006 */ lui $s2,%hi(var80062b14) -/* f00b88c: 0058001b */ divu $zero,$v0,$t8 -/* f00b890: 0000c810 */ mfhi $t9 -/* f00b894: ac392c80 */ sw $t9,%lo(var80062c80)($at) -/* f00b898: 26522b14 */ addiu $s2,$s2,%lo(var80062b14) -/* f00b89c: 3c06800a */ lui $a2,%hi(g_Vars) -/* f00b8a0: ae400000 */ sw $zero,0x0($s2) -/* f00b8a4: 3c018006 */ lui $at,%hi(var80062b18) -/* f00b8a8: 24c69fc0 */ addiu $a2,$a2,%lo(g_Vars) -/* f00b8ac: ac202b18 */ sw $zero,%lo(var80062b18)($at) -/* f00b8b0: 8cc8006c */ lw $t0,0x6c($a2) -/* f00b8b4: 17000002 */ bnez $t8,.L0f00b8c0 -/* f00b8b8: 00000000 */ nop -/* f00b8bc: 0007000d */ break 0x7 -.L0f00b8c0: -/* f00b8c0: 00002825 */ or $a1,$zero,$zero -/* f00b8c4: 11000003 */ beqz $t0,.L0f00b8d4 -/* f00b8c8: 00001825 */ or $v1,$zero,$zero -/* f00b8cc: 10000001 */ b .L0f00b8d4 -/* f00b8d0: 24050001 */ addiu $a1,$zero,0x1 -.L0f00b8d4: -/* f00b8d4: 8cc90068 */ lw $t1,0x68($a2) -/* f00b8d8: 00002025 */ or $a0,$zero,$zero -/* f00b8dc: 00001025 */ or $v0,$zero,$zero -/* f00b8e0: 11200003 */ beqz $t1,.L0f00b8f0 -/* f00b8e4: 00000000 */ nop -/* f00b8e8: 10000001 */ b .L0f00b8f0 -/* f00b8ec: 24030001 */ addiu $v1,$zero,0x1 -.L0f00b8f0: -/* f00b8f0: 8cca0064 */ lw $t2,0x64($a2) -/* f00b8f4: 3c15800a */ lui $s5,%hi(g_NumActiveHeadsPerGender) -/* f00b8f8: 26b5cd20 */ addiu $s5,$s5,%lo(g_NumActiveHeadsPerGender) -/* f00b8fc: 11400003 */ beqz $t2,.L0f00b90c -/* f00b900: 24180008 */ addiu $t8,$zero,0x8 -/* f00b904: 10000001 */ b .L0f00b90c -/* f00b908: 24040001 */ addiu $a0,$zero,0x1 -.L0f00b90c: -/* f00b90c: 8ccb0070 */ lw $t3,0x70($a2) -/* f00b910: 240f0004 */ addiu $t7,$zero,0x4 -/* f00b914: 3c198006 */ lui $t9,%hi(g_StageHeadLimits) -/* f00b918: 11600003 */ beqz $t3,.L0f00b928 -/* f00b91c: 00000000 */ nop -/* f00b920: 10000001 */ b .L0f00b928 -/* f00b924: 24020001 */ addiu $v0,$zero,0x1 -.L0f00b928: -/* f00b928: 00446021 */ addu $t4,$v0,$a0 -/* f00b92c: 01836821 */ addu $t5,$t4,$v1 -/* f00b930: 01a57021 */ addu $t6,$t5,$a1 -/* f00b934: 29c10002 */ slti $at,$t6,0x2 -/* f00b938: 14200005 */ bnez $at,.L0f00b950 -/* f00b93c: 27221700 */ addiu $v0,$t9,%lo(g_StageHeadLimits) -/* f00b940: 3c15800a */ lui $s5,%hi(g_NumActiveHeadsPerGender) -/* f00b944: 26b5cd20 */ addiu $s5,$s5,%lo(g_NumActiveHeadsPerGender) -/* f00b948: 1000000d */ b .L0f00b980 -/* f00b94c: aeaf0000 */ sw $t7,0x0($s5) -.L0f00b950: -/* f00b950: aeb80000 */ sw $t8,0x0($s5) -/* f00b954: 24440006 */ addiu $a0,$v0,0x6 -/* f00b958: 90480000 */ lbu $t0,0x0($v0) -.L0f00b95c: -/* f00b95c: 56080004 */ bnel $s0,$t0,.L0f00b970 -/* f00b960: 24420002 */ addiu $v0,$v0,0x2 -/* f00b964: 90490001 */ lbu $t1,0x1($v0) -/* f00b968: aea90000 */ sw $t1,0x0($s5) -/* f00b96c: 24420002 */ addiu $v0,$v0,0x2 -.L0f00b970: -/* f00b970: 0044082b */ sltu $at,$v0,$a0 -/* f00b974: 5420fff9 */ bnezl $at,.L0f00b95c -/* f00b978: 90480000 */ lbu $t0,0x0($v0) -/* f00b97c: 00008825 */ or $s1,$zero,$zero -.L0f00b980: -/* f00b980: 0fc41b99 */ jal cheatIsActive -/* f00b984: 24040010 */ addiu $a0,$zero,0x10 -/* f00b988: 10400005 */ beqz $v0,.L0f00b9a0 -/* f00b98c: 3c148006 */ lui $s4,%hi(g_MaleGuardTeamHeads) -/* f00b990: 3c138006 */ lui $s3,%hi(g_NumMaleGuardTeamHeads) -/* f00b994: 26942c14 */ addiu $s4,$s4,%lo(g_MaleGuardTeamHeads) -/* f00b998: 10000005 */ b .L0f00b9b0 -/* f00b99c: 8e732b0c */ lw $s3,%lo(g_NumMaleGuardTeamHeads)($s3) -.L0f00b9a0: -/* f00b9a0: 3c148006 */ lui $s4,%hi(g_MaleGuardHeads) -/* f00b9a4: 3c138006 */ lui $s3,%hi(g_NumMaleGuardHeads) -/* f00b9a8: 26942b68 */ addiu $s4,$s4,%lo(g_MaleGuardHeads) -/* f00b9ac: 8e732b04 */ lw $s3,%lo(g_NumMaleGuardHeads)($s3) -.L0f00b9b0: -/* f00b9b0: 8eaa0000 */ lw $t2,0x0($s5) -/* f00b9b4: 3c12800a */ lui $s2,%hi(g_ActiveMaleHeads) -/* f00b9b8: 2652cd28 */ addiu $s2,$s2,%lo(g_ActiveMaleHeads) -/* f00b9bc: 19400022 */ blez $t2,.L0f00ba48 -/* f00b9c0: 00000000 */ nop -.L0f00b9c4: -/* f00b9c4: 0c004b70 */ jal random -/* f00b9c8: 24100001 */ addiu $s0,$zero,0x1 -/* f00b9cc: 0053001b */ divu $zero,$v0,$s3 -/* f00b9d0: 00005810 */ mfhi $t3 -/* f00b9d4: 8ea50000 */ lw $a1,0x0($s5) -/* f00b9d8: 000b6080 */ sll $t4,$t3,0x2 -/* f00b9dc: 028c6821 */ addu $t5,$s4,$t4 -/* f00b9e0: 8dae0000 */ lw $t6,0x0($t5) -/* f00b9e4: 16600002 */ bnez $s3,.L0f00b9f0 -/* f00b9e8: 00000000 */ nop -/* f00b9ec: 0007000d */ break 0x7 -.L0f00b9f0: -/* f00b9f0: 00b3082a */ slt $at,$a1,$s3 -/* f00b9f4: 1020000d */ beqz $at,.L0f00ba2c -/* f00b9f8: ae4e0000 */ sw $t6,0x0($s2) -/* f00b9fc: 1a20000b */ blez $s1,.L0f00ba2c -/* f00ba00: 00001825 */ or $v1,$zero,$zero -/* f00ba04: 3c02800a */ lui $v0,%hi(g_ActiveMaleHeads) -/* f00ba08: 2442cd28 */ addiu $v0,$v0,%lo(g_ActiveMaleHeads) -/* f00ba0c: 01c02025 */ or $a0,$t6,$zero -.L0f00ba10: -/* f00ba10: 8c4f0000 */ lw $t7,0x0($v0) -/* f00ba14: 24630001 */ addiu $v1,$v1,0x1 -/* f00ba18: 15e40002 */ bne $t7,$a0,.L0f00ba24 -/* f00ba1c: 00000000 */ nop -/* f00ba20: 00008025 */ or $s0,$zero,$zero -.L0f00ba24: -/* f00ba24: 1471fffa */ bne $v1,$s1,.L0f00ba10 -/* f00ba28: 24420004 */ addiu $v0,$v0,0x4 -.L0f00ba2c: -/* f00ba2c: 1200ffe5 */ beqz $s0,.L0f00b9c4 -/* f00ba30: 00000000 */ nop -/* f00ba34: 26310001 */ addiu $s1,$s1,0x1 -/* f00ba38: 0225082a */ slt $at,$s1,$a1 -/* f00ba3c: 1420ffe1 */ bnez $at,.L0f00b9c4 -/* f00ba40: 26520004 */ addiu $s2,$s2,0x4 -/* f00ba44: 00008825 */ or $s1,$zero,$zero -.L0f00ba48: -/* f00ba48: 0fc41b99 */ jal cheatIsActive -/* f00ba4c: 24040010 */ addiu $a0,$zero,0x10 -/* f00ba50: 10400006 */ beqz $v0,.L0f00ba6c -/* f00ba54: 3c148006 */ lui $s4,%hi(g_FemaleGuardHeads) -/* f00ba58: 3c148006 */ lui $s4,%hi(g_FemaleGuardTeamHeads) -/* f00ba5c: 3c138006 */ lui $s3,%hi(g_NumFemaleGuardTeamHeads) -/* f00ba60: 26942c6c */ addiu $s4,$s4,%lo(g_FemaleGuardTeamHeads) -/* f00ba64: 10000004 */ b .L0f00ba78 -/* f00ba68: 8e732b10 */ lw $s3,%lo(g_NumFemaleGuardTeamHeads)($s3) -.L0f00ba6c: -/* f00ba6c: 3c138006 */ lui $s3,%hi(g_NumFemaleGuardHeads) -/* f00ba70: 26942c58 */ addiu $s4,$s4,%lo(g_FemaleGuardHeads) -/* f00ba74: 8e732b08 */ lw $s3,%lo(g_NumFemaleGuardHeads)($s3) -.L0f00ba78: -/* f00ba78: 8ea50000 */ lw $a1,0x0($s5) -/* f00ba7c: 3c12800a */ lui $s2,%hi(g_ActiveFemaleHeads) -/* f00ba80: 2652cd48 */ addiu $s2,$s2,%lo(g_ActiveFemaleHeads) -/* f00ba84: 18a00022 */ blez $a1,.L0f00bb10 -/* f00ba88: 00000000 */ nop -.L0f00ba8c: -/* f00ba8c: 0c004b70 */ jal random -/* f00ba90: 24100001 */ addiu $s0,$zero,0x1 -/* f00ba94: 0053001b */ divu $zero,$v0,$s3 -/* f00ba98: 0000c010 */ mfhi $t8 -/* f00ba9c: 8ea50000 */ lw $a1,0x0($s5) -/* f00baa0: 0018c880 */ sll $t9,$t8,0x2 -/* f00baa4: 02994021 */ addu $t0,$s4,$t9 -/* f00baa8: 8d090000 */ lw $t1,0x0($t0) -/* f00baac: 16600002 */ bnez $s3,.L0f00bab8 -/* f00bab0: 00000000 */ nop -/* f00bab4: 0007000d */ break 0x7 -.L0f00bab8: -/* f00bab8: 00b3082a */ slt $at,$a1,$s3 -/* f00babc: 1020000d */ beqz $at,.L0f00baf4 -/* f00bac0: ae490000 */ sw $t1,0x0($s2) -/* f00bac4: 1a20000b */ blez $s1,.L0f00baf4 -/* f00bac8: 00001825 */ or $v1,$zero,$zero -/* f00bacc: 3c02800a */ lui $v0,%hi(g_ActiveFemaleHeads) -/* f00bad0: 2442cd48 */ addiu $v0,$v0,%lo(g_ActiveFemaleHeads) -/* f00bad4: 01202025 */ or $a0,$t1,$zero -.L0f00bad8: -/* f00bad8: 8c4a0000 */ lw $t2,0x0($v0) -/* f00badc: 24630001 */ addiu $v1,$v1,0x1 -/* f00bae0: 15440002 */ bne $t2,$a0,.L0f00baec -/* f00bae4: 00000000 */ nop -/* f00bae8: 00008025 */ or $s0,$zero,$zero -.L0f00baec: -/* f00baec: 1471fffa */ bne $v1,$s1,.L0f00bad8 -/* f00baf0: 24420004 */ addiu $v0,$v0,0x4 -.L0f00baf4: -/* f00baf4: 1200ffe5 */ beqz $s0,.L0f00ba8c -/* f00baf8: 00000000 */ nop -/* f00bafc: 26310001 */ addiu $s1,$s1,0x1 -/* f00bb00: 0225082a */ slt $at,$s1,$a1 -/* f00bb04: 1420ffe1 */ bnez $at,.L0f00ba8c -/* f00bb08: 26520004 */ addiu $s2,$s2,0x4 -/* f00bb0c: 00008825 */ or $s1,$zero,$zero -.L0f00bb10: -/* f00bb10: 3c018006 */ lui $at,%hi(g_ActiveMaleHeadsIndex) -/* f00bb14: ac202c84 */ sw $zero,%lo(g_ActiveMaleHeadsIndex)($at) -/* f00bb18: 3c018006 */ lui $at,%hi(g_ActiveFemaleHeadsIndex) -/* f00bb1c: 18a00006 */ blez $a1,.L0f00bb38 -/* f00bb20: ac202c88 */ sw $zero,%lo(g_ActiveFemaleHeadsIndex)($at) -/* f00bb24: 26310001 */ addiu $s1,$s1,0x1 -.L0f00bb28: -/* f00bb28: 0225082a */ slt $at,$s1,$a1 -/* f00bb2c: 5420fffe */ bnezl $at,.L0f00bb28 -/* f00bb30: 26310001 */ addiu $s1,$s1,0x1 -/* f00bb34: 00008825 */ or $s1,$zero,$zero -.L0f00bb38: -/* f00bb38: 18a00005 */ blez $a1,.L0f00bb50 -/* f00bb3c: 8fb00014 */ lw $s0,0x14($sp) -/* f00bb40: 26310001 */ addiu $s1,$s1,0x1 -.L0f00bb44: -/* f00bb44: 0225082a */ slt $at,$s1,$a1 -/* f00bb48: 5420fffe */ bnezl $at,.L0f00bb44 -/* f00bb4c: 26310001 */ addiu $s1,$s1,0x1 -.L0f00bb50: -/* f00bb50: 8fbf002c */ lw $ra,0x2c($sp) -/* f00bb54: 8fb10018 */ lw $s1,0x18($sp) -/* f00bb58: 8fb2001c */ lw $s2,0x1c($sp) -/* f00bb5c: 8fb30020 */ lw $s3,0x20($sp) -/* f00bb60: 8fb40024 */ lw $s4,0x24($sp) -/* f00bb64: 8fb50028 */ lw $s5,0x28($sp) -/* f00bb68: 03e00008 */ jr $ra -/* f00bb6c: 27bd0030 */ addiu $sp,$sp,0x30 -); -#else -// Mismatches: -// - Address of var80062b14 Should be loaded to a callee-save register -// - PLAYERCOUNT() calculation is more spread out -// (does other register preparation during calculation) -// - Loop at 950 is calculated differently void bodiesReset(s32 stagenum) { s32 *headsavailablelist; @@ -281,8 +19,10 @@ void bodiesReset(s32 stagenum) bool done; s32 i; s32 j; + s32 whichteamlist = 1; + s32 index; - for (i = 0; g_HeadsAndBodies[i].filenum; i++) { + for (i = 0; g_HeadsAndBodies[i].filenum != 0; i++) { g_HeadsAndBodies[i].modeldef = NULL; } @@ -293,20 +33,32 @@ void bodiesReset(s32 stagenum) if (PLAYERCOUNT() >= 2) { g_NumActiveHeadsPerGender = 4; } else { - // 950 + s32 len = 3; + + static u8 overrides[3][2] = { + { STAGE_INFILTRATION, 5 }, + { STAGE_RESCUE, 4 }, + { STAGE_ESCAPE, 5 }, + }; + g_NumActiveHeadsPerGender = 8; - for (i = 0; i < ARRAYCOUNT(g_StageHeadLimits); i++) { - if (g_StageHeadLimits[i].stagenum == stagenum) { - g_NumActiveHeadsPerGender = g_StageHeadLimits[i].maxheads; + for (i = 0; i < len; i++) { + if (overrides[i][0] == stagenum) { + g_NumActiveHeadsPerGender = overrides[i][1]; } } } // Male heads if (cheatIsActive(CHEAT_TEAMHEADSONLY)) { - headsavailablelist = g_MaleGuardTeamHeads; - headsavailablelen = g_NumMaleGuardTeamHeads; + if (whichteamlist) { + headsavailablelist = g_MaleGuardTeamHeads; + headsavailablelen = g_NumMaleGuardTeamHeads; + } else { + headsavailablelist = g_MaleGuardTeamHeads; + headsavailablelen = var80062b14; + } } else { headsavailablelist = g_MaleGuardHeads; headsavailablelen = g_NumMaleGuardHeads; @@ -319,18 +71,24 @@ void bodiesReset(s32 stagenum) if (headsavailablelen > g_NumActiveHeadsPerGender) { for (j = 0; j < i; j++) { - if (g_ActiveMaleHeads[i] == g_ActiveMaleHeads[j]) { + if (g_ActiveMaleHeads[j] == g_ActiveMaleHeads[i]) { done = false; } } + if (j && j && j); } } while (!done); } // Female heads if (cheatIsActive(CHEAT_TEAMHEADSONLY)) { - headsavailablelist = g_FemaleGuardTeamHeads; - headsavailablelen = g_NumFemaleGuardTeamHeads; + if (whichteamlist) { + headsavailablelist = g_FemaleGuardTeamHeads; + headsavailablelen = g_NumFemaleGuardTeamHeads; + } else { + headsavailablelist = g_FemaleGuardTeamHeads; + headsavailablelen = var80062b18; + } } else { headsavailablelist = g_FemaleGuardHeads; headsavailablelen = g_NumFemaleGuardHeads; @@ -343,7 +101,7 @@ void bodiesReset(s32 stagenum) if (headsavailablelen > g_NumActiveHeadsPerGender) { for (j = 0; j < i; j++) { - if (g_ActiveFemaleHeads[i] == g_ActiveFemaleHeads[j]) { + if (g_ActiveFemaleHeads[j] == g_ActiveFemaleHeads[i]) { done = false; } } @@ -357,4 +115,3 @@ void bodiesReset(s32 stagenum) for (i = 0; i < g_NumActiveHeadsPerGender; i++); for (i = 0; i < g_NumActiveHeadsPerGender; i++); } -#endif diff --git a/src/include/bss.h b/src/include/bss.h index 74b947566..e4b7b4df2 100644 --- a/src/include/bss.h +++ b/src/include/bss.h @@ -91,8 +91,8 @@ extern s32 g_NumChrs; extern s16 *g_Chrnums; extern s16 *g_ChrIndexes; extern s32 g_NumActiveHeadsPerGender; -extern u32 g_ActiveMaleHeads[8]; -extern u32 g_ActiveFemaleHeads[8]; +extern s32 g_ActiveMaleHeads[8]; +extern s32 g_ActiveFemaleHeads[8]; extern s16 *g_RoomPropListChunkIndexes; extern struct roomproplistchunk *g_RoomPropListChunks; extern struct prop *g_InteractProp; diff --git a/src/include/types.h b/src/include/types.h index 55780499e..665cd4c82 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -5674,11 +5674,6 @@ struct vtxstoretype { s32 numallocated; }; -struct stageheadlimit { - u8 stagenum; - u8 maxheads; -}; - struct wallhit { /*0x00*/ Vtx vertices[4]; /*0x30*/ Col basecolours[4]; // without room lighting applied