diff --git a/src/game/chr/chraction.c b/src/game/chr/chraction.c index df3080692..e27e2d85c 100644 --- a/src/game/chr/chraction.c +++ b/src/game/chr/chraction.c @@ -25942,7 +25942,7 @@ struct prop *chrSpawnAtCoord(s32 bodynum, s32 headnum, struct coord *pos, s16 *r if (chrsGetNumFree() > 1) { if (headnum < 0) { - headnum = bodyGetHead(bodynum); + headnum = bodyChooseHead(bodynum); } pos2.x = pos->x; diff --git a/src/game/data/data_003dc0.c b/src/game/data/data_003dc0.c index 8b27af7b3..041769fe0 100644 --- a/src/game/data/data_003dc0.c +++ b/src/game/data/data_003dc0.c @@ -2487,8 +2487,13 @@ u32 var800616f0 = 0x00000000; u32 var800616f4 = 0x00000000; u32 var800616f8 = 0x00000000; u32 var800616fc = 0x00000000; -u32 var80061700 = 0x2f053504; -u32 var80061704 = 0x19050000; + +struct stageheadlimit g_StageHeadLimits[3] = { + { STAGE_INFILTRATION, 5 }, + { STAGE_RESCUE, 4 }, + { STAGE_ESCAPE, 5 }, +}; + u32 var80061708 = 0x00000000; u32 var8006170c = 0x00000000; u32 var80061710 = 0x00000000; diff --git a/src/game/data/data_0083d0.c b/src/game/data/data_0083d0.c index 589ea837e..f48b1d112 100644 --- a/src/game/data/data_0083d0.c +++ b/src/game/data/data_0083d0.c @@ -127,15 +127,15 @@ u32 var80062af4 = 0x00000003; u32 var80062af8 = 0x00000001; u32 var80062afc = 0x00000005; -s32 var80062b00 = 0; -s32 var80062b04 = 0; -s32 var80062b08 = 0; -s32 var80062b0c = 0; -s32 var80062b10 = 0; -u32 var80062b14 = 0; -u32 var80062b18 = 0; +s32 g_NumBondBodies = 0; +s32 g_NumMaleGuardHeads = 0; +s32 g_NumFemaleGuardHeads = 0; +s32 g_NumMaleGuardTeamHeads = 0; +s32 g_NumFemaleGuardTeamHeads = 0; +s32 var80062b14 = 0; +s32 var80062b18 = 0; -s32 var80062b1c[] = { +s32 g_BondBodies[] = { BODY_DJBOND, BODY_CONNERY, BODY_DALTON, @@ -143,7 +143,7 @@ s32 var80062b1c[] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }; -s32 var80062b68[] = { +s32 g_MaleGuardHeads[] = { HEAD_BEAU1, HEAD_CHRIST, HEAD_DARLING, @@ -189,7 +189,7 @@ s32 var80062b68[] = { -1, }; -s32 var80062c14[] = { +s32 g_MaleGuardTeamHeads[] = { HEAD_BEAU1, HEAD_CHRIST, HEAD_DARLING, @@ -209,7 +209,7 @@ s32 var80062c14[] = { -1, }; -s32 var80062c58[] = { +s32 g_FemaleGuardHeads[] = { HEAD_LESLIE_S, HEAD_ANKA, HEAD_EILEEN_T, @@ -217,7 +217,7 @@ s32 var80062c58[] = { -1, }; -s32 var80062c6c[] = { +s32 g_FemaleGuardTeamHeads[] = { HEAD_LESLIE_S, HEAD_ANKA, HEAD_EILEEN_T, @@ -226,9 +226,15 @@ s32 var80062c6c[] = { }; s32 var80062c80 = 0; -u32 g_HeadsAIndex = 0x00000000; -u32 g_HeadsBIndex = 0x00000000; -u32 g_FemaleHeads[3] = {HEAD_ALEX, HEAD_JULIANNE, HEAD_LAURA}; +s32 g_ActiveMaleHeadsIndex = 0; +s32 g_ActiveFemaleHeadsIndex = 0; + +s32 g_FemGuardHeads[3] = { + HEAD_ALEX, + HEAD_JULIANNE, + HEAD_LAURA, +}; + u32 var80062c98 = 0x00000000; u32 var80062c9c = 0x00000000; f32 var80062ca0 = 1; diff --git a/src/game/data/data_020df0.c b/src/game/data/data_020df0.c index 0cab82a98..0f2a7c39d 100644 --- a/src/game/data/data_020df0.c +++ b/src/game/data/data_020df0.c @@ -3612,13 +3612,9 @@ struct body g_Bodies[] = { { /*0x0094*/ 1, 0x0da8, FILE_CELVISWAISTCOAT, 1, 0.57276993989944, 0, FILE_GHAND_ELVIS }, { /*0x0095*/ 0, 0x067c, FILE_CDARK_LEATHER, 1, 0.95305162668228, 0, FILE_GHAND_JOFROCK }, { /*0x0096*/ 0, 0x067c, FILE_CDARK_NEGOTIATOR, 1, 0.95305162668228, 0, FILE_GHAND_JOAF1 }, + { /*0x0097*/ 0, 0x0000, 0, 1, 0, 0, FILE_GCOMBATHANDSLOD }, }; -u32 var8007dad0 = 0x00000000; -u32 var8007dad4 = 0x3f800000; -u32 var8007dad8 = 0x00000000; -u32 var8007dadc = 0x00000000; -u32 var8007dae0 = 0x04e50000; u32 var8007dae4 = 0xbd8ff972; u32 var8007dae8 = 0x3efbda51; u32 var8007daec = 0xbf5566cf; diff --git a/src/game/game_000130.c b/src/game/game_000130.c index 45ff3f8ae..0883b664e 100644 --- a/src/game/game_000130.c +++ b/src/game/game_000130.c @@ -20,34 +20,34 @@ const u32 var7f1a78cc[] = {0x00000000}; void func0f000130(void) { - var80062b00 = 0; + g_NumBondBodies = 0; - while (var80062b1c[var80062b00] >= 0) { - var80062b00++; + while (g_BondBodies[g_NumBondBodies] >= 0) { + g_NumBondBodies++; } - var80062b0c = 0; + g_NumMaleGuardTeamHeads = 0; - while (var80062c14[var80062b0c] >= 0) { - var80062b0c++; + while (g_MaleGuardTeamHeads[g_NumMaleGuardTeamHeads] >= 0) { + g_NumMaleGuardTeamHeads++; } - var80062b10 = 0; + g_NumFemaleGuardTeamHeads = 0; - while (var80062c6c[var80062b10] >= 0) { - var80062b10++; + while (g_FemaleGuardTeamHeads[g_NumFemaleGuardTeamHeads] >= 0) { + g_NumFemaleGuardTeamHeads++; } - var80062b04 = 0; + g_NumMaleGuardHeads = 0; - while (var80062b68[var80062b04] >= 0) { - var80062b04++; + while (g_MaleGuardHeads[g_NumMaleGuardHeads] >= 0) { + g_NumMaleGuardHeads++; } - var80062b08 = 0; + g_NumFemaleGuardHeads = 0; - while (var80062c58[var80062b08] >= 0) { - var80062b08++; + while (g_FemaleGuardHeads[g_NumFemaleGuardHeads] >= 0) { + g_NumFemaleGuardHeads++; } } diff --git a/src/game/game_00b820.c b/src/game/game_00b820.c index 5fe9e5cc7..48d54a16e 100644 --- a/src/game/game_00b820.c +++ b/src/game/game_00b820.c @@ -19,7 +19,7 @@ #include "types.h" GLOBAL_ASM( -glabel func0f00b820 +glabel stageChooseActiveHeads /* f00b820: 27bdffd0 */ addiu $sp,$sp,-48 /* f00b824: 3c0e8008 */ lui $t6,%hi(g_Bodies+0x2) /* f00b828: 95cecf06 */ lhu $t6,%lo(g_Bodies+0x2)($t6) @@ -45,8 +45,8 @@ glabel func0f00b820 .L0f00b874: /* f00b874: 0c004b70 */ jal random /* f00b878: 00000000 */ nop -/* f00b87c: 3c188006 */ lui $t8,%hi(var80062b00) -/* f00b880: 8f182b00 */ lw $t8,%lo(var80062b00)($t8) +/* 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 @@ -78,8 +78,8 @@ glabel func0f00b820 /* f00b8ec: 24030001 */ addiu $v1,$zero,0x1 .L0f00b8f0: /* f00b8f0: 8cca0064 */ lw $t2,0x64($a2) -/* f00b8f4: 3c15800a */ lui $s5,%hi(g_MaxHeadsPerBank) -/* f00b8f8: 26b5cd20 */ addiu $s5,$s5,%lo(g_MaxHeadsPerBank) +/* 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 @@ -87,7 +87,7 @@ glabel func0f00b820 .L0f00b90c: /* f00b90c: 8ccb0070 */ lw $t3,0x70($a2) /* f00b910: 240f0004 */ addiu $t7,$zero,0x4 -/* f00b914: 3c198006 */ lui $t9,%hi(var80061700) +/* f00b914: 3c198006 */ lui $t9,%hi(g_StageHeadLimits) /* f00b918: 11600003 */ beqz $t3,.L0f00b928 /* f00b91c: 00000000 */ nop /* f00b920: 10000001 */ b .L0f00b928 @@ -98,9 +98,9 @@ glabel func0f00b820 /* f00b930: 01a57021 */ addu $t6,$t5,$a1 /* f00b934: 29c10002 */ slti $at,$t6,0x2 /* f00b938: 14200005 */ bnez $at,.L0f00b950 -/* f00b93c: 27221700 */ addiu $v0,$t9,%lo(var80061700) -/* f00b940: 3c15800a */ lui $s5,%hi(g_MaxHeadsPerBank) -/* f00b944: 26b5cd20 */ addiu $s5,$s5,%lo(g_MaxHeadsPerBank) +/* 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: @@ -122,20 +122,20 @@ glabel func0f00b820 /* f00b980: 0fc41b99 */ jal cheatIsActive /* f00b984: 24040010 */ addiu $a0,$zero,0x10 /* f00b988: 10400005 */ beqz $v0,.L0f00b9a0 -/* f00b98c: 3c148006 */ lui $s4,%hi(var80062c14) -/* f00b990: 3c138006 */ lui $s3,%hi(var80062b0c) -/* f00b994: 26942c14 */ addiu $s4,$s4,%lo(var80062c14) +/* 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(var80062b0c)($s3) +/* f00b99c: 8e732b0c */ lw $s3,%lo(g_NumMaleGuardTeamHeads)($s3) .L0f00b9a0: -/* f00b9a0: 3c148006 */ lui $s4,%hi(var80062b68) -/* f00b9a4: 3c138006 */ lui $s3,%hi(var80062b04) -/* f00b9a8: 26942b68 */ addiu $s4,$s4,%lo(var80062b68) -/* f00b9ac: 8e732b04 */ lw $s3,%lo(var80062b04)($s3) +/* 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_HeadsA) -/* f00b9b8: 2652cd28 */ addiu $s2,$s2,%lo(g_HeadsA) +/* f00b9b4: 3c12800a */ lui $s2,%hi(g_ActiveMaleHeads) +/* f00b9b8: 2652cd28 */ addiu $s2,$s2,%lo(g_ActiveMaleHeads) /* f00b9bc: 19400022 */ blez $t2,.L0f00ba48 /* f00b9c0: 00000000 */ nop .L0f00b9c4: @@ -156,8 +156,8 @@ glabel func0f00b820 /* f00b9f8: ae4e0000 */ sw $t6,0x0($s2) /* f00b9fc: 1a20000b */ blez $s1,.L0f00ba2c /* f00ba00: 00001825 */ or $v1,$zero,$zero -/* f00ba04: 3c02800a */ lui $v0,%hi(g_HeadsA) -/* f00ba08: 2442cd28 */ addiu $v0,$v0,%lo(g_HeadsA) +/* 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) @@ -180,20 +180,20 @@ glabel func0f00b820 /* f00ba48: 0fc41b99 */ jal cheatIsActive /* f00ba4c: 24040010 */ addiu $a0,$zero,0x10 /* f00ba50: 10400006 */ beqz $v0,.L0f00ba6c -/* f00ba54: 3c148006 */ lui $s4,%hi(var80062c58) -/* f00ba58: 3c148006 */ lui $s4,%hi(var80062c6c) -/* f00ba5c: 3c138006 */ lui $s3,%hi(var80062b10) -/* f00ba60: 26942c6c */ addiu $s4,$s4,%lo(var80062c6c) +/* 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(var80062b10)($s3) +/* f00ba68: 8e732b10 */ lw $s3,%lo(g_NumFemaleGuardTeamHeads)($s3) .L0f00ba6c: -/* f00ba6c: 3c138006 */ lui $s3,%hi(var80062b08) -/* f00ba70: 26942c58 */ addiu $s4,$s4,%lo(var80062c58) -/* f00ba74: 8e732b08 */ lw $s3,%lo(var80062b08)($s3) +/* 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_HeadsB) -/* f00ba80: 2652cd48 */ addiu $s2,$s2,%lo(g_HeadsB) +/* f00ba7c: 3c12800a */ lui $s2,%hi(g_ActiveFemaleHeads) +/* f00ba80: 2652cd48 */ addiu $s2,$s2,%lo(g_ActiveFemaleHeads) /* f00ba84: 18a00022 */ blez $a1,.L0f00bb10 /* f00ba88: 00000000 */ nop .L0f00ba8c: @@ -214,8 +214,8 @@ glabel func0f00b820 /* f00bac0: ae490000 */ sw $t1,0x0($s2) /* f00bac4: 1a20000b */ blez $s1,.L0f00baf4 /* f00bac8: 00001825 */ or $v1,$zero,$zero -/* f00bacc: 3c02800a */ lui $v0,%hi(g_HeadsB) -/* f00bad0: 2442cd48 */ addiu $v0,$v0,%lo(g_HeadsB) +/* 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) @@ -235,11 +235,11 @@ glabel func0f00b820 /* f00bb08: 26520004 */ addiu $s2,$s2,0x4 /* f00bb0c: 00008825 */ or $s1,$zero,$zero .L0f00bb10: -/* f00bb10: 3c018006 */ lui $at,%hi(g_HeadsAIndex) -/* f00bb14: ac202c84 */ sw $zero,%lo(g_HeadsAIndex)($at) -/* f00bb18: 3c018006 */ lui $at,%hi(g_HeadsBIndex) +/* 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_HeadsBIndex)($at) +/* f00bb20: ac202c88 */ sw $zero,%lo(g_ActiveFemaleHeadsIndex)($at) /* f00bb24: 26310001 */ addiu $s1,$s1,0x1 .L0f00bb28: /* f00bb28: 0225082a */ slt $at,$s1,$a1 @@ -265,6 +265,95 @@ glabel func0f00b820 /* f00bb6c: 27bd0030 */ addiu $sp,$sp,0x30 ); +// 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 stageChooseActiveHeads(s32 stagenum) +//{ +// s32 *headsavailablelist; +// s32 headsavailablelen; +// bool done; +// s32 i; +// s32 j; +// +// for (i = 0; g_Bodies[i].bodyfileid; i++) { +// g_Bodies[i].unk0c = NULL; +// } +// +// var80062c80 = random() % g_NumBondBodies; +// var80062b14 = 0; +// var80062b18 = 0; +// +// if (PLAYERCOUNT() >= 2) { +// g_NumActiveHeadsPerGender = 4; +// } else { +// // 950 +// g_NumActiveHeadsPerGender = 8; +// +// for (i = 0; i < ARRAYCOUNT(g_StageHeadLimits); i++) { +// if (g_StageHeadLimits[i].stagenum == stagenum) { +// g_NumActiveHeadsPerGender = g_StageHeadLimits[i].maxheads; +// } +// } +// } +// +// // Male heads +// if (cheatIsActive(CHEAT_TEAMHEADSONLY)) { +// headsavailablelist = g_MaleGuardTeamHeads; +// headsavailablelen = g_NumMaleGuardTeamHeads; +// } else { +// headsavailablelist = g_MaleGuardHeads; +// headsavailablelen = g_NumMaleGuardHeads; +// } +// +// for (i = 0; i < g_NumActiveHeadsPerGender; i++) { +// do { +// done = true; +// g_ActiveMaleHeads[i] = headsavailablelist[random() % headsavailablelen]; +// +// if (headsavailablelen > g_NumActiveHeadsPerGender) { +// for (j = 0; j < i; j++) { +// if (g_ActiveMaleHeads[i] == g_ActiveMaleHeads[j]) { +// done = false; +// } +// } +// } +// } while (!done); +// } +// +// // Female heads +// if (cheatIsActive(CHEAT_TEAMHEADSONLY)) { +// headsavailablelist = g_FemaleGuardTeamHeads; +// headsavailablelen = g_NumFemaleGuardTeamHeads; +// } else { +// headsavailablelist = g_FemaleGuardHeads; +// headsavailablelen = g_NumFemaleGuardHeads; +// } +// +// for (i = 0; i < g_NumActiveHeadsPerGender; i++) { +// do { +// done = true; +// g_ActiveFemaleHeads[i] = headsavailablelist[random() % headsavailablelen]; +// +// if (headsavailablelen > g_NumActiveHeadsPerGender) { +// for (j = 0; j < i; j++) { +// if (g_ActiveFemaleHeads[i] == g_ActiveFemaleHeads[j]) { +// done = false; +// } +// } +// } +// } while (!done); +// } +// +// g_ActiveMaleHeadsIndex = 0; +// g_ActiveFemaleHeadsIndex = 0; +// +// for (i = 0; i < g_NumActiveHeadsPerGender; i++); +// for (i = 0; i < g_NumActiveHeadsPerGender; i++); +//} + void resetSomeStageThings(void) { s32 i; diff --git a/src/game/game_02cde0.c b/src/game/game_02cde0.c index daf16427b..50b1860b0 100644 --- a/src/game/game_02cde0.c +++ b/src/game/game_02cde0.c @@ -429,26 +429,26 @@ struct model *modelAllocateChr(u32 bodynum, u32 headnum, u32 flags) s32 func0f02d3f8(void) { - return var80062b1c[var80062c80]; + return g_BondBodies[var80062c80]; } -u32 bodyGetHead(u32 bodynum) +s32 bodyChooseHead(s32 bodynum) { - u32 head; + s32 head; if (g_Bodies[bodynum].ismale) { - head = g_HeadsA[g_HeadsAIndex++]; + head = g_ActiveMaleHeads[g_ActiveMaleHeadsIndex++]; - if (g_HeadsAIndex == g_MaxHeadsPerBank) { - g_HeadsAIndex = 0; + if (g_ActiveMaleHeadsIndex == g_NumActiveHeadsPerGender) { + g_ActiveMaleHeadsIndex = 0; } } else if (bodynum == BODY_FEM_GUARD) { - head = g_FemaleHeads[random() % 3]; + head = g_FemGuardHeads[random() % 3]; } else { - head = g_HeadsB[g_HeadsBIndex++]; + head = g_ActiveFemaleHeads[g_ActiveFemaleHeadsIndex++]; - if (g_HeadsBIndex == g_MaxHeadsPerBank) { - g_HeadsBIndex = 0; + if (g_ActiveFemaleHeadsIndex == g_NumActiveHeadsPerGender) { + g_ActiveFemaleHeadsIndex = 0; } } @@ -564,7 +564,7 @@ glabel chrUnpack .L0f02d688: /* f02d688: 15610005 */ bne $t3,$at,.L0f02d6a0 /* f02d68c: 8fa4004c */ lw $a0,0x4c($sp) -/* f02d690: 0fc0b505 */ jal bodyGetHead +/* f02d690: 0fc0b505 */ jal bodyChooseHead /* f02d694: afa70058 */ sw $a3,0x58($sp) /* f02d698: 8fa70058 */ lw $a3,0x58($sp) /* f02d69c: afa20048 */ sw $v0,0x48($sp) diff --git a/src/game/game_167ae0.c b/src/game/game_167ae0.c index 1a447400f..02d3df347 100644 --- a/src/game/game_167ae0.c +++ b/src/game/game_167ae0.c @@ -362,7 +362,7 @@ void func0f167e7c(s32 stagenum) func0f00c240(); func0f00c490(); func0f00b510(); - func0f00b820(stagenum); + stageChooseActiveHeads(stagenum); setupParseObjects(stagenum); tagsAllocatePtrs(); func0f013010(); diff --git a/src/gvars/gvars.c b/src/gvars/gvars.c index 0bbf761d8..2d81adc7d 100644 --- a/src/gvars/gvars.c +++ b/src/gvars/gvars.c @@ -14616,10 +14616,10 @@ s32 g_NumChrsC = 0; s16 *g_ChrnumsC = NULL; s16 *g_ChrIndexesC = NULL; u32 var8009cd1c = 0; -u32 g_MaxHeadsPerBank = 0; +s32 g_NumActiveHeadsPerGender = 0; u32 var8009cd24 = 0; -u32 g_HeadsA[8] = {0}; -u32 g_HeadsB[8] = {0}; +u32 g_ActiveMaleHeads[8] = {0}; +u32 g_ActiveFemaleHeads[8] = {0}; u32 var8009cd68 = 0; u32 var8009cd6c = 0; s32 g_RecentQuipsPlayed[] = {0, 0, 0, 0, 0}; diff --git a/src/include/game/data/data_000000.h b/src/include/game/data/data_000000.h index c1824ca8e..ae6239749 100644 --- a/src/include/game/data/data_000000.h +++ b/src/include/game/data/data_000000.h @@ -217,6 +217,7 @@ extern u32 var80061694; extern u32 var800616dc; extern u32 var800616e4; extern u32 var800616e8; +extern struct stageheadlimit g_StageHeadLimits[3]; extern u32 var80061710; extern struct monitorscreen var80061a80; extern struct monitorscreen var80061af4; diff --git a/src/include/game/data/data_0083d0.h b/src/include/game/data/data_0083d0.h index 05eff41e0..04027606e 100644 --- a/src/include/game/data/data_0083d0.h +++ b/src/include/game/data/data_0083d0.h @@ -109,21 +109,22 @@ extern struct var80062a8c *var80062a8c; // pointer to array extern s32 var80062a90; // true if var80062a8c has anything in its array extern u32 var80062a94; extern u32 var80062aa0; -extern s32 var80062b00; -extern s32 var80062b04; -extern s32 var80062b08; -extern s32 var80062b0c; -extern s32 var80062b10; -extern u32 var80062b14; -extern s32 var80062b1c[]; -extern s32 var80062b68[]; -extern s32 var80062c14[]; -extern s32 var80062c58[]; -extern s32 var80062c6c[]; +extern s32 g_NumBondBodies; +extern s32 g_NumMaleGuardHeads; +extern s32 g_NumFemaleGuardHeads; +extern s32 g_NumMaleGuardTeamHeads; +extern s32 g_NumFemaleGuardTeamHeads; +extern s32 var80062b14; +extern s32 var80062b18; +extern s32 g_BondBodies[]; +extern s32 g_MaleGuardHeads[]; +extern s32 g_MaleGuardTeamHeads[]; +extern s32 g_FemaleGuardHeads[]; +extern s32 g_FemaleGuardTeamHeads[]; extern s32 var80062c80; -extern u32 g_HeadsAIndex; -extern u32 g_HeadsBIndex; -extern u32 g_FemaleHeads[3]; +extern s32 g_ActiveMaleHeadsIndex; +extern s32 g_ActiveFemaleHeadsIndex; +extern s32 g_FemGuardHeads[3]; extern f32 var80062ca0; extern f32 var80062ca4; extern f32 var80062ca8; diff --git a/src/include/game/game_00b820.h b/src/include/game/game_00b820.h index 91e5c8b7a..4af9a99f7 100644 --- a/src/include/game/game_00b820.h +++ b/src/include/game/game_00b820.h @@ -3,7 +3,7 @@ #include #include "types.h" -void func0f00b820(s32 stagenum); +void stageChooseActiveHeads(s32 stagenum); void resetSomeStageThings(void); void func0f00bbc8(void); diff --git a/src/include/game/game_02cde0.h b/src/include/game/game_02cde0.h index 34ac37d3c..768510bf3 100644 --- a/src/include/game/game_02cde0.h +++ b/src/include/game/game_02cde0.h @@ -9,7 +9,7 @@ u32 func0f02ce8c(void); struct model *func0f02d338(u32 bodynum, u32 headnum, u32 arg2, u32 arg3, bool arg4, u32 arg5); struct model *modelAllocateChr(u32 bodynum, u32 headnum, u32 flags); s32 func0f02d3f8(void); -u32 bodyGetHead(u32 bodynum); +s32 bodyChooseHead(s32 bodynum); void chrUnpack(s32 stagenum, void *cmddata, s32 cmdindex); struct prop *propAllocateEyespy(struct pad *pad, s16 room); u32 func0f02ddbc(void); diff --git a/src/include/gvars/gvars.h b/src/include/gvars/gvars.h index 0dcd4553f..24d27c57b 100644 --- a/src/include/gvars/gvars.h +++ b/src/include/gvars/gvars.h @@ -548,9 +548,9 @@ extern void *var8009ccc0[20]; extern s32 g_NumChrsC; extern s16 *g_ChrnumsC; extern s16 *g_ChrIndexesC; -extern u32 g_MaxHeadsPerBank; -extern u32 g_HeadsA[8]; -extern u32 g_HeadsB[8]; +extern s32 g_NumActiveHeadsPerGender; +extern u32 g_ActiveMaleHeads[8]; +extern u32 g_ActiveFemaleHeads[8]; extern s32 g_RecentQuipsPlayed[5]; extern u8 g_RecentQuipsIndex; extern u32 var8009cda0; diff --git a/src/include/types.h b/src/include/types.h index bd08548c1..935606bc0 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -3043,13 +3043,13 @@ struct cheat { }; struct body { - u16 ismale : 1; - u16 flags_01 : 15; - u16 bodyfileid; - f32 unk04; - f32 unk08; - void *unk0c; // likely a pointer to bodyfile data if loaded - u16 handfileid; + /*0x00*/ u16 ismale : 1; + /*0x00*/ u16 flags_01 : 15; + /*0x02*/ u16 bodyfileid; + /*0x04*/ f32 unk04; + /*0x08*/ f32 unk08; + /*0x0c*/ void *unk0c; // likely a pointer to bodyfile data if loaded + /*0x10*/ u16 handfileid; }; struct stagetableentry { @@ -6762,4 +6762,9 @@ struct var8007e3d0 { s32 numallocated; }; +struct stageheadlimit { + u8 stagenum; + u8 maxheads; +}; + #endif