From d643543085edd92495bb3728350143c5ee5a381d Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Wed, 25 May 2022 23:33:37 +1000 Subject: [PATCH] Decompile body0f02ce8c --- src/game/body.c | 578 ++++++++++-------------------------------------- 1 file changed, 119 insertions(+), 459 deletions(-) diff --git a/src/game/body.c b/src/game/body.c index d4b7adfd1..8f44c5d1e 100644 --- a/src/game/body.c +++ b/src/game/body.c @@ -165,466 +165,126 @@ bool bodyLoad(s32 bodynum) return false; } -GLOBAL_ASM( -glabel body0f02ce8c -.late_rodata -glabel var7f1a8a70 -.word 0x3dccccce -glabel var7f1a8a74 -.word 0x3f4ccccd -glabel var7f1a8a78 -.word 0x3d4ccccd -glabel var7f1a8a7c -.word 0x3ecccccd -glabel var7f1a8a80 -.word 0x3ecccccd -glabel var7f1a8a84 -.word 0x3dcccccd -.text -/* f02ce8c: 00047880 */ sll $t7,$a0,0x2 -/* f02ce90: 01e47821 */ addu $t7,$t7,$a0 -/* f02ce94: 3c188008 */ lui $t8,%hi(g_HeadsAndBodies) -/* f02ce98: 2718cf04 */ addiu $t8,$t8,%lo(g_HeadsAndBodies) -/* f02ce9c: 000f7880 */ sll $t7,$t7,0x2 -/* f02cea0: 01f81021 */ addu $v0,$t7,$t8 -/* f02cea4: 3c017f1b */ lui $at,%hi(var7f1a8a70) -/* f02cea8: c4268a70 */ lwc1 $f6,%lo(var7f1a8a70)($at) -/* f02ceac: c4440004 */ lwc1 $f4,0x4($v0) -/* f02ceb0: 27bdffb8 */ addiu $sp,$sp,-72 -/* f02ceb4: c44a0008 */ lwc1 $f10,0x8($v0) -/* f02ceb8: 46062202 */ mul.s $f8,$f4,$f6 -/* f02cebc: afbf0014 */ sw $ra,0x14($sp) -/* f02cec0: afa40048 */ sw $a0,0x48($sp) -/* f02cec4: afa5004c */ sw $a1,0x4c($sp) -/* f02cec8: afa60050 */ sw $a2,0x50($sp) -/* f02cecc: afa70054 */ sw $a3,0x54($sp) -/* f02ced0: afa0003c */ sw $zero,0x3c($sp) -/* f02ced4: e7a80044 */ swc1 $f8,0x44($sp) -/* f02ced8: 24040007 */ addiu $a0,$zero,0x7 -/* f02cedc: afa2001c */ sw $v0,0x1c($sp) -/* f02cee0: 0fc41b99 */ jal cheatIsActive -/* f02cee4: e7aa0040 */ swc1 $f10,0x40($sp) -/* f02cee8: 10400005 */ beqz $v0,.L0f02cf00 -/* f02ceec: c7b00044 */ lwc1 $f16,0x44($sp) -/* f02cef0: 3c017f1b */ lui $at,%hi(var7f1a8a74) -/* f02cef4: c4328a74 */ lwc1 $f18,%lo(var7f1a8a74)($at) -/* f02cef8: 46128102 */ mul.s $f4,$f16,$f18 -/* f02cefc: e7a40044 */ swc1 $f4,0x44($sp) -.L0f02cf00: -/* f02cf00: 8fb90050 */ lw $t9,0x50($sp) -/* f02cf04: 8fa8001c */ lw $t0,0x1c($sp) -/* f02cf08: 1720000a */ bnez $t9,.L0f02cf34 -/* f02cf0c: 00000000 */ nop -/* f02cf10: 8d03000c */ lw $v1,0xc($t0) -/* f02cf14: 54600007 */ bnezl $v1,.L0f02cf34 -/* f02cf18: afa30050 */ sw $v1,0x50($sp) -/* f02cf1c: 0fc69e11 */ jal modeldefLoadToNew -/* f02cf20: 95040002 */ lhu $a0,0x2($t0) -/* f02cf24: 8fa4001c */ lw $a0,0x1c($sp) -/* f02cf28: 00401825 */ or $v1,$v0,$zero -/* f02cf2c: ac82000c */ sw $v0,0xc($a0) -/* f02cf30: afa30050 */ sw $v1,0x50($sp) -.L0f02cf34: -/* f02cf34: 0c008b49 */ jal modelCalculateRwDataLen -/* f02cf38: 8fa40050 */ lw $a0,0x50($sp) -/* f02cf3c: 8fa9001c */ lw $t1,0x1c($sp) -/* f02cf40: 8fac0050 */ lw $t4,0x50($sp) -/* f02cf44: 8d220000 */ lw $v0,0x0($t1) -/* f02cf48: 00025840 */ sll $t3,$v0,0x1 -/* f02cf4c: 056200b9 */ bltzl $t3,.L0f02d234 -/* f02cf50: 8fa2005c */ lw $v0,0x5c($sp) -/* f02cf54: 8d830004 */ lw $v1,0x4($t4) -/* f02cf58: 3c0d8008 */ lui $t5,%hi(g_SkelChr) -/* f02cf5c: 25adce40 */ addiu $t5,$t5,%lo(g_SkelChr) -/* f02cf60: 15a30090 */ bne $t5,$v1,.L0f02d1a4 -/* f02cf64: 01802025 */ or $a0,$t4,$zero -/* f02cf68: 0c006a47 */ jal modelGetPart -/* f02cf6c: 24050004 */ addiu $a1,$zero,0x4 -/* f02cf70: 104000af */ beqz $v0,.L0f02d230 -/* f02cf74: afa2003c */ sw $v0,0x3c($sp) -/* f02cf78: 8fa7004c */ lw $a3,0x4c($sp) -/* f02cf7c: 240effff */ addiu $t6,$zero,-1 -/* f02cf80: 04e1000a */ bgez $a3,.L0f02cfac -/* f02cf84: 01c72023 */ subu $a0,$t6,$a3 -/* f02cf88: 0fc6395f */ jal func0f18e57c -/* f02cf8c: 27a5004c */ addiu $a1,$sp,0x4c -/* f02cf90: 8faf0050 */ lw $t7,0x50($sp) -/* f02cf94: afa20054 */ sw $v0,0x54($sp) -/* f02cf98: 84590014 */ lh $t9,0x14($v0) -/* f02cf9c: 85f80014 */ lh $t8,0x14($t7) -/* f02cfa0: 03194021 */ addu $t0,$t8,$t9 -/* f02cfa4: 10000061 */ b .L0f02d12c -/* f02cfa8: a5e80014 */ sh $t0,0x14($t7) -.L0f02cfac: -/* f02cfac: 18e0005f */ blez $a3,.L0f02d12c -/* f02cfb0: 8fa90054 */ lw $t1,0x54($sp) -/* f02cfb4: 15200036 */ bnez $t1,.L0f02d090 -/* f02cfb8: 3c0a800a */ lui $t2,%hi(g_Vars+0x318) -/* f02cfbc: 8d4aa2d8 */ lw $t2,%lo(g_Vars+0x318)($t2) -/* f02cfc0: 00074080 */ sll $t0,$a3,0x2 -/* f02cfc4: 3c0b8009 */ lui $t3,%hi(g_Is4Mb) -/* f02cfc8: 1140001e */ beqz $t2,.L0f02d044 -/* f02cfcc: 01074021 */ addu $t0,$t0,$a3 -/* f02cfd0: 916b0af0 */ lbu $t3,%lo(g_Is4Mb)($t3) -/* f02cfd4: 24010001 */ addiu $at,$zero,0x1 -/* f02cfd8: 00076880 */ sll $t5,$a3,0x2 -/* f02cfdc: 11610019 */ beq $t3,$at,.L0f02d044 -/* f02cfe0: 01a76821 */ addu $t5,$t5,$a3 -/* f02cfe4: 000d6880 */ sll $t5,$t5,0x2 -/* f02cfe8: 3c048008 */ lui $a0,%hi(g_HeadsAndBodies+0x2) -/* f02cfec: 008d2021 */ addu $a0,$a0,$t5 -/* f02cff0: 0fc69e11 */ jal modeldefLoadToNew -/* f02cff4: 9484cf06 */ lhu $a0,%lo(g_HeadsAndBodies+0x2)($a0) -/* f02cff8: 8fa5004c */ lw $a1,0x4c($sp) -/* f02cffc: 3c0e8008 */ lui $t6,%hi(g_HeadsAndBodies) -/* f02d000: 25cecf04 */ addiu $t6,$t6,%lo(g_HeadsAndBodies) -/* f02d004: 00056080 */ sll $t4,$a1,0x2 -/* f02d008: 01856021 */ addu $t4,$t4,$a1 -/* f02d00c: 000c6080 */ sll $t4,$t4,0x2 -/* f02d010: 018e1821 */ addu $v1,$t4,$t6 -/* f02d014: 94780002 */ lhu $t8,0x2($v1) -/* f02d018: 3c01800a */ lui $at,%hi(g_FileInfo) -/* f02d01c: ac62000c */ sw $v0,0xc($v1) -/* f02d020: 0018c8c0 */ sll $t9,$t8,0x3 -/* f02d024: 00390821 */ addu $at,$at,$t9 -/* f02d028: afa20054 */ sw $v0,0x54($sp) -/* f02d02c: ac206680 */ sw $zero,%lo(g_FileInfo)($at) -/* f02d030: 00402025 */ or $a0,$v0,$zero -/* f02d034: 0fc0b76f */ jal bodyCalculateHeadOffset -/* f02d038: 8fa60048 */ lw $a2,0x48($sp) -/* f02d03c: 10000014 */ b .L0f02d090 -/* f02d040: 00000000 */ nop -.L0f02d044: -/* f02d044: 3c0f8008 */ lui $t7,%hi(g_HeadsAndBodies) -/* f02d048: 25efcf04 */ addiu $t7,$t7,%lo(g_HeadsAndBodies) -/* f02d04c: 00084080 */ sll $t0,$t0,0x2 -/* f02d050: 010f1821 */ addu $v1,$t0,$t7 -/* f02d054: 8c64000c */ lw $a0,0xc($v1) -/* f02d058: 5480000d */ bnezl $a0,.L0f02d090 -/* f02d05c: afa40054 */ sw $a0,0x54($sp) -/* f02d060: 0fc69e11 */ jal modeldefLoadToNew -/* f02d064: 94640002 */ lhu $a0,0x2($v1) -/* f02d068: 8fa7004c */ lw $a3,0x4c($sp) -/* f02d06c: 3c0a8008 */ lui $t2,%hi(g_HeadsAndBodies) -/* f02d070: 254acf04 */ addiu $t2,$t2,%lo(g_HeadsAndBodies) -/* f02d074: 00074880 */ sll $t1,$a3,0x2 -/* f02d078: 01274821 */ addu $t1,$t1,$a3 -/* f02d07c: 00094880 */ sll $t1,$t1,0x2 -/* f02d080: 012a1821 */ addu $v1,$t1,$t2 -/* f02d084: ac62000c */ sw $v0,0xc($v1) -/* f02d088: 00402025 */ or $a0,$v0,$zero -/* f02d08c: afa40054 */ sw $a0,0x54($sp) -.L0f02d090: -/* f02d090: 0c008b49 */ jal modelCalculateRwDataLen -/* f02d094: 8fa40054 */ lw $a0,0x54($sp) -/* f02d098: 8fab0050 */ lw $t3,0x50($sp) -/* f02d09c: 8fac0054 */ lw $t4,0x54($sp) -/* f02d0a0: 856d0014 */ lh $t5,0x14($t3) -/* f02d0a4: 858e0014 */ lh $t6,0x14($t4) -/* f02d0a8: 01aec021 */ addu $t8,$t5,$t6 -/* f02d0ac: a5780014 */ sh $t8,0x14($t3) -/* f02d0b0: 8fb9001c */ lw $t9,0x1c($sp) -/* f02d0b4: 93aa0067 */ lbu $t2,0x67($sp) -/* f02d0b8: 8f280000 */ lw $t0,0x0($t9) -/* f02d0bc: 00084880 */ sll $t1,$t0,0x2 -/* f02d0c0: 0523001b */ bgezl $t1,.L0f02d130 -/* f02d0c4: 8fac0060 */ lw $t4,0x60($sp) -/* f02d0c8: 51400019 */ beqzl $t2,.L0f02d130 -/* f02d0cc: 8fac0060 */ lw $t4,0x60($sp) -/* f02d0d0: 0c004b70 */ jal random -/* f02d0d4: 00000000 */ nop -/* f02d0d8: 44823000 */ mtc1 $v0,$f6 -/* f02d0dc: 3c017f1b */ lui $at,%hi(var7f1a8a78) -/* f02d0e0: c4228a78 */ lwc1 $f2,%lo(var7f1a8a78)($at) -/* f02d0e4: 04410005 */ bgez $v0,.L0f02d0fc -/* f02d0e8: 46803220 */ cvt.s.w $f8,$f6 -/* f02d0ec: 3c014f80 */ lui $at,0x4f80 -/* f02d0f0: 44815000 */ mtc1 $at,$f10 -/* f02d0f4: 00000000 */ nop -/* f02d0f8: 460a4200 */ add.s $f8,$f8,$f10 -.L0f02d0fc: -/* f02d0fc: 3c012f80 */ lui $at,0x2f80 -/* f02d100: 44818000 */ mtc1 $at,$f16 -/* f02d104: 3c013f80 */ lui $at,0x3f80 -/* f02d108: 44815000 */ mtc1 $at,$f10 -/* f02d10c: 46104482 */ mul.s $f18,$f8,$f16 -/* f02d110: c7b00044 */ lwc1 $f16,0x44($sp) -/* f02d114: 46029002 */ mul.s $f0,$f18,$f2 -/* f02d118: 46000100 */ add.s $f4,$f0,$f0 -/* f02d11c: 46022181 */ sub.s $f6,$f4,$f2 -/* f02d120: 460a3200 */ add.s $f8,$f6,$f10 -/* f02d124: 46088482 */ mul.s $f18,$f16,$f8 -/* f02d128: e7b20044 */ swc1 $f18,0x44($sp) -.L0f02d12c: -/* f02d12c: 8fac0060 */ lw $t4,0x60($sp) -.L0f02d130: -/* f02d130: 15800013 */ bnez $t4,.L0f02d180 -/* f02d134: 00000000 */ nop -/* f02d138: 0fc41b99 */ jal cheatIsActive -/* f02d13c: 2404000b */ addiu $a0,$zero,0xb -/* f02d140: 10400005 */ beqz $v0,.L0f02d158 -/* f02d144: c7a40044 */ lwc1 $f4,0x44($sp) -/* f02d148: 3c017f1b */ lui $at,%hi(var7f1a8a7c) -/* f02d14c: c4268a7c */ lwc1 $f6,%lo(var7f1a8a7c)($at) -/* f02d150: 46062282 */ mul.s $f10,$f4,$f6 -/* f02d154: e7aa0044 */ swc1 $f10,0x44($sp) -.L0f02d158: -/* f02d158: 0fc41b99 */ jal cheatIsActive -/* f02d15c: 24040007 */ addiu $a0,$zero,0x7 -/* f02d160: 10400033 */ beqz $v0,.L0f02d230 -/* f02d164: c7b00044 */ lwc1 $f16,0x44($sp) -/* f02d168: 3c013fa0 */ lui $at,0x3fa0 -/* f02d16c: 44814000 */ mtc1 $at,$f8 -/* f02d170: 00000000 */ nop -/* f02d174: 46088482 */ mul.s $f18,$f16,$f8 -/* f02d178: 1000002d */ b .L0f02d230 -/* f02d17c: e7b20044 */ swc1 $f18,0x44($sp) -.L0f02d180: -/* f02d180: 0fc41b99 */ jal cheatIsActive -/* f02d184: 2404000a */ addiu $a0,$zero,0xa -/* f02d188: 10400029 */ beqz $v0,.L0f02d230 -/* f02d18c: c7a40044 */ lwc1 $f4,0x44($sp) -/* f02d190: 3c017f1b */ lui $at,%hi(var7f1a8a80) -/* f02d194: c4268a80 */ lwc1 $f6,%lo(var7f1a8a80)($at) -/* f02d198: 46062282 */ mul.s $f10,$f4,$f6 -/* f02d19c: 10000024 */ b .L0f02d230 -/* f02d1a0: e7aa0044 */ swc1 $f10,0x44($sp) -.L0f02d1a4: -/* f02d1a4: 3c0d8008 */ lui $t5,%hi(g_SkelSkedar) -/* f02d1a8: 25adce98 */ addiu $t5,$t5,%lo(g_SkelSkedar) -/* f02d1ac: 15a30020 */ bne $t5,$v1,.L0f02d230 -/* f02d1b0: 0002c080 */ sll $t8,$v0,0x2 -/* f02d1b4: 0701001e */ bgez $t8,.L0f02d230 -/* f02d1b8: 93ab0067 */ lbu $t3,0x67($sp) -/* f02d1bc: 1160001c */ beqz $t3,.L0f02d230 -/* f02d1c0: 8fb9001c */ lw $t9,0x1c($sp) -/* f02d1c4: 3c088008 */ lui $t0,%hi(g_HeadsAndBodies+0x730) -/* f02d1c8: 2508d634 */ addiu $t0,$t0,%lo(g_HeadsAndBodies+0x730) -/* f02d1cc: 57280019 */ bnel $t9,$t0,.L0f02d234 -/* f02d1d0: 8fa2005c */ lw $v0,0x5c($sp) -/* f02d1d4: 0c004b70 */ jal random -/* f02d1d8: 00000000 */ nop -/* f02d1dc: 44828000 */ mtc1 $v0,$f16 -/* f02d1e0: 3c017f1b */ lui $at,%hi(var7f1a8a84) -/* f02d1e4: c4228a84 */ lwc1 $f2,%lo(var7f1a8a84)($at) -/* f02d1e8: 04410005 */ bgez $v0,.L0f02d200 -/* f02d1ec: 46808220 */ cvt.s.w $f8,$f16 -/* f02d1f0: 3c014f80 */ lui $at,0x4f80 -/* f02d1f4: 44819000 */ mtc1 $at,$f18 -/* f02d1f8: 00000000 */ nop -/* f02d1fc: 46124200 */ add.s $f8,$f8,$f18 -.L0f02d200: -/* f02d200: 3c012f80 */ lui $at,0x2f80 -/* f02d204: 44812000 */ mtc1 $at,$f4 -/* f02d208: 3c013f40 */ lui $at,0x3f40 -/* f02d20c: 44819000 */ mtc1 $at,$f18 -/* f02d210: 46044182 */ mul.s $f6,$f8,$f4 -/* f02d214: c7a40044 */ lwc1 $f4,0x44($sp) -/* f02d218: 46061002 */ mul.s $f0,$f2,$f6 -/* f02d21c: 46000280 */ add.s $f10,$f0,$f0 -/* f02d220: 46025401 */ sub.s $f16,$f10,$f2 -/* f02d224: 46128200 */ add.s $f8,$f16,$f18 -/* f02d228: 46082182 */ mul.s $f6,$f4,$f8 -/* f02d22c: e7a60044 */ swc1 $f6,0x44($sp) -.L0f02d230: -/* f02d230: 8fa2005c */ lw $v0,0x5c($sp) -.L0f02d234: -/* f02d234: 8fa90050 */ lw $t1,0x50($sp) -/* f02d238: 10400008 */ beqz $v0,.L0f02d25c -/* f02d23c: 00000000 */ nop -/* f02d240: 844f0002 */ lh $t7,0x2($v0) -/* f02d244: 852a0014 */ lh $t2,0x14($t1) -/* f02d248: 01ea082a */ slt $at,$t7,$t2 -/* f02d24c: 50200007 */ beqzl $at,.L0f02d26c -/* f02d250: 8fac005c */ lw $t4,0x5c($sp) -/* f02d254: 10000005 */ b .L0f02d26c -/* f02d258: 8fac005c */ lw $t4,0x5c($sp) -.L0f02d25c: -/* f02d25c: 0fc2cca0 */ jal modelInstantiateWithAnim -/* f02d260: 8fa40050 */ lw $a0,0x50($sp) -/* f02d264: afa2005c */ sw $v0,0x5c($sp) -/* f02d268: 8fac005c */ lw $t4,0x5c($sp) -.L0f02d26c: -/* f02d26c: 1180002d */ beqz $t4,.L0f02d324 -/* f02d270: 01802025 */ or $a0,$t4,$zero -/* f02d274: 0c006bd6 */ jal modelSetScale -/* f02d278: 8fa50044 */ lw $a1,0x44($sp) -/* f02d27c: 8fa4005c */ lw $a0,0x5c($sp) -/* f02d280: 0c006bd9 */ jal modelSetAnimScale -/* f02d284: 8fa50040 */ lw $a1,0x40($sp) -/* f02d288: 8fa60054 */ lw $a2,0x54($sp) -/* f02d28c: 8fad001c */ lw $t5,0x1c($sp) -/* f02d290: 50c00025 */ beqzl $a2,.L0f02d328 -/* f02d294: 8fbf0014 */ lw $ra,0x14($sp) -/* f02d298: 8dae0000 */ lw $t6,0x0($t5) -/* f02d29c: 8fb90050 */ lw $t9,0x50($sp) -/* f02d2a0: 000e5840 */ sll $t3,$t6,0x1 -/* f02d2a4: 05620020 */ bltzl $t3,.L0f02d328 -/* f02d2a8: 8fbf0014 */ lw $ra,0x14($sp) -/* f02d2ac: 87280014 */ lh $t0,0x14($t9) -/* f02d2b0: 84c90014 */ lh $t1,0x14($a2) -/* f02d2b4: 01097823 */ subu $t7,$t0,$t1 -/* f02d2b8: a72f0014 */ sh $t7,0x14($t9) -/* f02d2bc: 8fa5003c */ lw $a1,0x3c($sp) -/* f02d2c0: 0fc2cca8 */ jal func0f0b32a0 -/* f02d2c4: 8fa4005c */ lw $a0,0x5c($sp) -/* f02d2c8: 8faa0054 */ lw $t2,0x54($sp) -/* f02d2cc: 2401000d */ addiu $at,$zero,0xd -/* f02d2d0: 8fad0058 */ lw $t5,0x58($sp) -/* f02d2d4: 854c0006 */ lh $t4,0x6($t2) -/* f02d2d8: 55810013 */ bnel $t4,$at,.L0f02d328 -/* f02d2dc: 8fbf0014 */ lw $ra,0x14($sp) -/* f02d2e0: 15a00008 */ bnez $t5,.L0f02d304 -/* f02d2e4: 01402025 */ or $a0,$t2,$zero -/* f02d2e8: 0c006a47 */ jal modelGetPart -/* f02d2ec: 00002825 */ or $a1,$zero,$zero -/* f02d2f0: 10400004 */ beqz $v0,.L0f02d304 -/* f02d2f4: 00402825 */ or $a1,$v0,$zero -/* f02d2f8: 0c006a87 */ jal modelGetNodeRwData -/* f02d2fc: 8fa4005c */ lw $a0,0x5c($sp) -/* f02d300: ac400000 */ sw $zero,0x0($v0) -.L0f02d304: -/* f02d304: 8fa40054 */ lw $a0,0x54($sp) -/* f02d308: 0c006a47 */ jal modelGetPart -/* f02d30c: 24050004 */ addiu $a1,$zero,0x4 -/* f02d310: 10400004 */ beqz $v0,.L0f02d324 -/* f02d314: 00402825 */ or $a1,$v0,$zero -/* f02d318: 0c006a87 */ jal modelGetNodeRwData -/* f02d31c: 8fa4005c */ lw $a0,0x5c($sp) -/* f02d320: ac400000 */ sw $zero,0x0($v0) -.L0f02d324: -/* f02d324: 8fbf0014 */ lw $ra,0x14($sp) -.L0f02d328: -/* f02d328: 8fa2005c */ lw $v0,0x5c($sp) -/* f02d32c: 27bd0048 */ addiu $sp,$sp,0x48 -/* f02d330: 03e00008 */ jr $ra -/* f02d334: 00000000 */ nop -); +struct model *body0f02ce8c(s32 bodynum, s32 headnum, struct modelfiledata *bodyfiledata, struct modelfiledata *headfiledata, bool sunglasses, struct model *model, bool isplayer, u8 varyheight) +{ + f32 scale = g_HeadsAndBodies[bodynum].scale * 0.10000001f; + f32 animscale = g_HeadsAndBodies[bodynum].animscale; + struct modelnode *node = NULL; + u32 stack[2]; -// Mismatch: The model->unk02 < headfiledata->rwdatalen statement needs to use -// bodyfiledata instead of headfiledata, but the extra reference to bodyfiledata -// causes bodyfiledata to be promoted from t registers to a registers, which -// causes significant codegen changes. -//struct model *body0f02ce8c(s32 bodynum, s32 headnum, struct modelfiledata *bodyfiledata, struct modelfiledata *headfiledata, bool sunglasses, struct model *model, bool isplayer, u8 varyheight) -//{ -// f32 scale = g_HeadsAndBodies[bodynum].scale * 0.1f; -// f32 animscale = g_HeadsAndBodies[bodynum].animscale; -// struct modelnode *node = NULL; -// u32 stack[2]; -// -// if (cheatIsActive(CHEAT_DKMODE)) { -// scale *= 0.8f; -// } -// -// if (bodyfiledata == NULL) { -// if (g_HeadsAndBodies[bodynum].filedata == NULL) { -// g_HeadsAndBodies[bodynum].filedata = modeldefLoadToNew(g_HeadsAndBodies[bodynum].filenum); -// } -// -// bodyfiledata = g_HeadsAndBodies[bodynum].filedata; -// } -// -// modelCalculateRwDataLen(bodyfiledata); -// -// if (!g_HeadsAndBodies[bodynum].unk00_01) { -// if (bodyfiledata->type == &g_SkelChr) { -// node = modelGetPart(bodyfiledata, MODELPART_CHR_HEADSPOT); -// -// if (node != NULL) { -// if (headnum < 0) { -// headfiledata = func0f18e57c(-1 - headnum, &headnum); -// bodyfiledata->rwdatalen += headfiledata->rwdatalen; -// } else if (headnum > 0) { -// if (headfiledata == NULL) { -// if (g_Vars.normmplayerisrunning && !IS4MB()) { -// headfiledata = modeldefLoadToNew(g_HeadsAndBodies[headnum].filenum); -// g_HeadsAndBodies[headnum].filedata = headfiledata; -// g_FileInfo[g_HeadsAndBodies[headnum].filenum].size = 0; -// bodyCalculateHeadOffset(headfiledata, headnum, bodynum); -// } else { -// if (g_HeadsAndBodies[headnum].filedata == NULL) { -// g_HeadsAndBodies[headnum].filedata = modeldefLoadToNew(g_HeadsAndBodies[headnum].filenum); -// } -// -// headfiledata = g_HeadsAndBodies[headnum].filedata; -// } -// } -// -// modelCalculateRwDataLen(headfiledata); -// -// bodyfiledata->rwdatalen += headfiledata->rwdatalen; -// -// if (g_HeadsAndBodies[bodynum].canvaryheight && varyheight) { -// // Set height to between 95% and 115% -// f32 frac = RANDOMFRAC() * 0.05f; -// scale *= 2.0f * frac - 0.05f + 1.0f; -// } -// } -// -// if (!isplayer) { -// if (cheatIsActive(CHEAT_SMALLCHARACTERS)) { -// scale *= 0.4f; -// } -// -// if (cheatIsActive(CHEAT_DKMODE)) { -// scale *= 1.25f; -// } -// } else { -// if (cheatIsActive(CHEAT_SMALLJO)) { -// scale *= 0.4f; -// } -// } -// } -// } else if (bodyfiledata->type == &g_SkelSkedar) { -// if (g_HeadsAndBodies[bodynum].canvaryheight && varyheight && bodynum == BODY_SKEDAR) { -// // Set height to between 65% and 85% -// f32 frac = RANDOMFRAC(); -// scale *= 2.0f * (0.1f * frac) - 0.1f + 0.75f; -// } -// } -// } -// -// if (model) { -// if (model->unk02 < bodyfiledata->rwdatalen) { -// // empty -// } -// } else { -// model = modelInstantiateWithAnim(bodyfiledata); -// } -// -// if (model) { -// modelSetScale(model, scale); -// modelSetAnimScale(model, animscale); -// -// if (headfiledata && !g_HeadsAndBodies[bodynum].unk00_01) { -// bodyfiledata->rwdatalen -= headfiledata->rwdatalen; -// -// func0f0b32a0(model, node, headfiledata); -// -// if ((s16)*(s32 *)&headfiledata->type == SKEL_HEAD) { -// struct modelnode *node2; -// -// if (!sunglasses) { -// node2 = modelGetPart(headfiledata, MODELPART_HEAD_SUNGLASSES); -// -// if (node2) { -// union modelrwdata *rwdata = modelGetNodeRwData(model, node2); -// rwdata->toggle.visible = false; -// } -// } -// -// node2 = modelGetPart(headfiledata, MODELPART_HEAD_HUDPIECE); -// -// if (node2) { -// union modelrwdata *rwdata = modelGetNodeRwData(model, node2); -// rwdata->toggle.visible = false; -// } -// } -// } -// } -// -// return model; -//} + if (cheatIsActive(CHEAT_DKMODE)) { + scale *= 0.8f; + } + + if (bodyfiledata == NULL) { + if (g_HeadsAndBodies[bodynum].filedata == NULL) { + g_HeadsAndBodies[bodynum].filedata = modeldefLoadToNew(g_HeadsAndBodies[bodynum].filenum); + } + + bodyfiledata = g_HeadsAndBodies[bodynum].filedata; + } + + modelCalculateRwDataLen(bodyfiledata); + + if (!g_HeadsAndBodies[bodynum].unk00_01) { + if (bodyfiledata->skel == &g_SkelChr) { + node = modelGetPart(bodyfiledata, MODELPART_CHR_HEADSPOT); + + if (node != NULL) { + if (headnum < 0) { + headfiledata = func0f18e57c(-1 - headnum, &headnum); + bodyfiledata->rwdatalen += headfiledata->rwdatalen; + } else if (headnum > 0) { + if (headfiledata == NULL) { + if (g_Vars.normmplayerisrunning && !IS4MB()) { + headfiledata = modeldefLoadToNew(g_HeadsAndBodies[headnum].filenum); + g_HeadsAndBodies[headnum].filedata = headfiledata; + g_FileInfo[g_HeadsAndBodies[headnum].filenum].loadedsize = 0; + bodyCalculateHeadOffset(headfiledata, headnum, bodynum); + } else { + if (g_HeadsAndBodies[headnum].filedata == NULL) { + g_HeadsAndBodies[headnum].filedata = modeldefLoadToNew(g_HeadsAndBodies[headnum].filenum); + } + + headfiledata = g_HeadsAndBodies[headnum].filedata; + } + } + + modelCalculateRwDataLen(headfiledata); + + bodyfiledata->rwdatalen += headfiledata->rwdatalen; + + if (g_HeadsAndBodies[bodynum].canvaryheight && varyheight) { + // Set height to between 95% and 115% + f32 frac = RANDOMFRAC() * 0.05f; + scale *= 2.0f * frac - 0.05f + 1.0f; + } + } + + if (!isplayer) { + if (cheatIsActive(CHEAT_SMALLCHARACTERS)) { + scale *= 0.4f; + } + + if (cheatIsActive(CHEAT_DKMODE)) { + scale *= 1.25f; + } + } else { + if (cheatIsActive(CHEAT_SMALLJO)) { + scale *= 0.4f; + } + } + } + } else if (bodyfiledata->skel == &g_SkelSkedar) { + if (g_HeadsAndBodies[bodynum].canvaryheight && varyheight && bodynum == BODY_SKEDAR) { + // Set height to between 65% and 85% + f32 frac = RANDOMFRAC(); + scale *= 2.0f * (0.1f * frac) - 0.1f + 0.75f; + } + + if (1); + } + } + + if (model) { + if (model->unk02 < bodyfiledata->rwdatalen); + } else { + model = modelInstantiateWithAnim(bodyfiledata); + } + + if (model) { + modelSetScale(model, scale); + modelSetAnimScale(model, animscale); + + if (headfiledata && !g_HeadsAndBodies[bodynum].unk00_01) { + bodyfiledata->rwdatalen -= headfiledata->rwdatalen; + + func0f0b32a0(model, node, headfiledata); + + if ((s16)*(s32 *)&headfiledata->skel == SKEL_HEAD) { + struct modelnode *node2; + + if (!sunglasses) { + node2 = modelGetPart(headfiledata, MODELPART_HEAD_SUNGLASSES); + + if (node2) { + union modelrwdata *rwdata = modelGetNodeRwData(model, node2); + rwdata->toggle.visible = false; + } + } + + node2 = modelGetPart(headfiledata, MODELPART_HEAD_HUDPIECE); + + if (node2) { + union modelrwdata *rwdata = modelGetNodeRwData(model, node2); + rwdata->toggle.visible = false; + } + } + } + } + + return model; +} struct model *body0f02d338(s32 bodynum, s32 headnum, struct modelfiledata *bodyfiledata, struct modelfiledata *headfiledata, bool sunglasses, u8 varyheight) {