From ac62088088b6ef28e5f149f6a8900a029f8ef8e6 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Tue, 14 Sep 2021 19:32:08 +1000 Subject: [PATCH] Decompile mpplayerfileLoadWad --- src/game/game_0b69d0.c | 4 +- src/game/game_0f09f0.c | 18 +- src/game/mplayer/mplayer.c | 276 +++++++---------------------- src/game/mplayer/setup.c | 30 ++-- src/include/game/mplayer/mplayer.h | 6 +- src/include/types.h | 49 ++--- 6 files changed, 109 insertions(+), 274 deletions(-) diff --git a/src/game/game_0b69d0.c b/src/game/game_0b69d0.c index 4c105ae32..3f7e8710a 100644 --- a/src/game/game_0b69d0.c +++ b/src/game/game_0b69d0.c @@ -1555,10 +1555,10 @@ void currentPlayerChooseBodyAndHead(s32 *bodynum, s32 *headnum, s32 *arg2) } if (g_Vars.normmplayerisrunning) { - if (g_MpPlayers[g_Vars.currentplayerstats->mpindex].base.mpheadnum < func0f18bb1c()) { + if (g_MpPlayers[g_Vars.currentplayerstats->mpindex].base.mpheadnum < mpGetNumHeads2()) { *headnum = mpGetHeadId(g_MpPlayers[g_Vars.currentplayerstats->mpindex].base.mpheadnum); } else { - *headnum = g_MpPlayers[g_Vars.currentplayerstats->mpindex].base.mpheadnum - func0f18bb1c(); + *headnum = g_MpPlayers[g_Vars.currentplayerstats->mpindex].base.mpheadnum - mpGetNumHeads2(); if (arg2) { *arg2 = true; diff --git a/src/game/game_0f09f0.c b/src/game/game_0f09f0.c index ee7cd02bf..f9fc0a95b 100644 --- a/src/game/game_0f09f0.c +++ b/src/game/game_0f09f0.c @@ -5300,7 +5300,7 @@ glabel var7f1b3c40pf /* f0f4164: 01408825 */ move $s1,$t2 /* f0f4168: 0fc6330d */ jal mpGetBodyId /* f0f416c: 316400ff */ andi $a0,$t3,0xff -/* f0f4170: 0fc632f0 */ jal func0f18bb1c +/* f0f4170: 0fc632f0 */ jal mpGetNumHeads2 /* f0f4174: afa20404 */ sw $v0,0x404($sp) /* f0f4178: 0222082a */ slt $at,$s1,$v0 /* f0f417c: 10200005 */ beqz $at,.PF0f0f4194 @@ -5310,13 +5310,13 @@ glabel var7f1b3c40pf /* f0f418c: 1000000b */ b .PF0f0f41bc /* f0f4190: afa20400 */ sw $v0,0x400($sp) .PF0f0f4194: -/* f0f4194: 0fc632f0 */ jal func0f18bb1c +/* f0f4194: 0fc632f0 */ jal mpGetNumHeads2 /* f0f4198: 00000000 */ nop /* f0f419c: 0fc52daa */ jal func0f14a9f8 /* f0f41a0: 02222023 */ subu $a0,$s1,$v0 /* f0f41a4: 0fc63302 */ jal mpGetBeauHeadId /* f0f41a8: 304400ff */ andi $a0,$v0,0xff -/* f0f41ac: 0fc632f0 */ jal func0f18bb1c +/* f0f41ac: 0fc632f0 */ jal mpGetNumHeads2 /* f0f41b0: afa20400 */ sw $v0,0x400($sp) /* f0f41b4: 02226823 */ subu $t5,$s1,$v0 /* f0f41b8: a20d05b0 */ sb $t5,0x5b0($s0) @@ -6902,7 +6902,7 @@ glabel var7f1b2948 /* f0f3a10: 01808825 */ or $s1,$t4,$zero /* f0f3a14: 0fc62ee4 */ jal mpGetBodyId /* f0f3a18: 31a400ff */ andi $a0,$t5,0xff -/* f0f3a1c: 0fc62ec7 */ jal func0f18bb1c +/* f0f3a1c: 0fc62ec7 */ jal mpGetNumHeads2 /* f0f3a20: afa20404 */ sw $v0,0x404($sp) /* f0f3a24: 0222082a */ slt $at,$s1,$v0 /* f0f3a28: 10200005 */ beqz $at,.L0f0f3a40 @@ -6912,13 +6912,13 @@ glabel var7f1b2948 /* f0f3a38: 1000000b */ b .L0f0f3a68 /* f0f3a3c: afa20400 */ sw $v0,0x400($sp) .L0f0f3a40: -/* f0f3a40: 0fc62ec7 */ jal func0f18bb1c +/* f0f3a40: 0fc62ec7 */ jal mpGetNumHeads2 /* f0f3a44: 00000000 */ nop /* f0f3a48: 0fc52a7e */ jal func0f14a9f8 /* f0f3a4c: 02222023 */ subu $a0,$s1,$v0 /* f0f3a50: 0fc62ed9 */ jal mpGetBeauHeadId /* f0f3a54: 304400ff */ andi $a0,$v0,0xff -/* f0f3a58: 0fc62ec7 */ jal func0f18bb1c +/* f0f3a58: 0fc62ec7 */ jal mpGetNumHeads2 /* f0f3a5c: afa20400 */ sw $v0,0x400($sp) /* f0f3a60: 02227823 */ subu $t7,$s1,$v0 /* f0f3a64: a20f05b0 */ sb $t7,0x5b0($s0) @@ -8511,7 +8511,7 @@ glabel var7f1b2948 /* f0f0554: 01808025 */ or $s0,$t4,$zero /* f0f0558: 0fc6177a */ jal mpGetBodyId /* f0f055c: 31a400ff */ andi $a0,$t5,0xff -/* f0f0560: 0fc6175d */ jal func0f18bb1c +/* f0f0560: 0fc6175d */ jal mpGetNumHeads2 /* f0f0564: afa2042c */ sw $v0,0x42c($sp) /* f0f0568: 0202082a */ slt $at,$s0,$v0 /* f0f056c: 10200005 */ beqz $at,.NB0f0f0584 @@ -8521,13 +8521,13 @@ glabel var7f1b2948 /* f0f057c: 1000000b */ beqz $zero,.NB0f0f05ac /* f0f0580: afa20428 */ sw $v0,0x428($sp) .NB0f0f0584: -/* f0f0584: 0fc6175d */ jal func0f18bb1c +/* f0f0584: 0fc6175d */ jal mpGetNumHeads2 /* f0f0588: 00000000 */ sll $zero,$zero,0x0 /* f0f058c: 0fc51472 */ jal func0f14a9f8 /* f0f0590: 02022023 */ subu $a0,$s0,$v0 /* f0f0594: 0fc6176f */ jal mpGetBeauHeadId /* f0f0598: 304400ff */ andi $a0,$v0,0xff -/* f0f059c: 0fc6175d */ jal func0f18bb1c +/* f0f059c: 0fc6175d */ jal mpGetNumHeads2 /* f0f05a0: afa20428 */ sw $v0,0x428($sp) /* f0f05a4: 02027823 */ subu $t7,$s0,$v0 /* f0f05a8: a22f05b0 */ sb $t7,0x5b0($s1) diff --git a/src/game/mplayer/mplayer.c b/src/game/mplayer/mplayer.c index c06208cd2..df161f317 100644 --- a/src/game/mplayer/mplayer.c +++ b/src/game/mplayer/mplayer.c @@ -6948,7 +6948,7 @@ void mpEndMatch(void) func0f0f820c(NULL, -6); } -s32 func0f18bb1c(void) +s32 mpGetNumHeads2(void) { return NUM_MPHEADS; } @@ -8633,210 +8633,70 @@ glabel func0f18d238 /* f18d2b4: 27bd0028 */ addiu $sp,$sp,0x28 ); -GLOBAL_ASM( -glabel func0f18d2b8 -/* f18d2b8: 27bdffa8 */ addiu $sp,$sp,-88 -/* f18d2bc: afb40024 */ sw $s4,0x24($sp) -/* f18d2c0: 0080a025 */ or $s4,$a0,$zero -/* f18d2c4: 00147080 */ sll $t6,$s4,0x2 -/* f18d2c8: 01d47021 */ addu $t6,$t6,$s4 -/* f18d2cc: 3c0f800b */ lui $t7,%hi(g_MpPlayers) -/* f18d2d0: afb50028 */ sw $s5,0x28($sp) -/* f18d2d4: afb30020 */ sw $s3,0x20($sp) -/* f18d2d8: afb00014 */ sw $s0,0x14($sp) -/* f18d2dc: 25efc7b8 */ addiu $t7,$t7,%lo(g_MpPlayers) -/* f18d2e0: 000e7140 */ sll $t6,$t6,0x5 -/* f18d2e4: 00c08025 */ or $s0,$a2,$zero -/* f18d2e8: 00a09825 */ or $s3,$a1,$zero -/* f18d2ec: afbf002c */ sw $ra,0x2c($sp) -/* f18d2f0: 01cfa821 */ addu $s5,$t6,$t7 -/* f18d2f4: 00a02025 */ or $a0,$a1,$zero -/* f18d2f8: afb2001c */ sw $s2,0x1c($sp) -/* f18d2fc: afb10018 */ sw $s1,0x18($sp) -/* f18d300: 02a02825 */ or $a1,$s5,$zero -/* f18d304: 0fc35539 */ jal savebufferReadString -/* f18d308: 24060001 */ addiu $a2,$zero,0x1 -/* f18d30c: 02602025 */ or $a0,$s3,$zero -/* f18d310: 0fc354fe */ jal savebufferReadBits -/* f18d314: 2405001c */ addiu $a1,$zero,0x1c -/* f18d318: 12000037 */ beqz $s0,.L0f18d3f8 -/* f18d31c: aea20068 */ sw $v0,0x68($s5) -/* f18d320: 02602025 */ or $a0,$s3,$zero -/* f18d324: 0fc354fe */ jal savebufferReadBits -/* f18d328: 24050007 */ addiu $a1,$zero,0x7 -/* f18d32c: a2a2000f */ sb $v0,0xf($s5) -/* f18d330: 02602025 */ or $a0,$s3,$zero -/* f18d334: 0fc354fe */ jal savebufferReadBits -/* f18d338: 24050007 */ addiu $a1,$zero,0x7 -/* f18d33c: a2a20010 */ sb $v0,0x10($s5) -/* f18d340: 02602025 */ or $a0,$s3,$zero -/* f18d344: 0fc355e7 */ jal func0f0d579c -/* f18d348: 27a50050 */ addiu $a1,$sp,0x50 -/* f18d34c: 0fc62ec7 */ jal func0f18bb1c -/* f18d350: 00000000 */ nop -/* f18d354: 92b8000f */ lbu $t8,0xf($s5) -/* f18d358: 8fa60050 */ lw $a2,0x50($sp) -/* f18d35c: 0302082a */ slt $at,$t8,$v0 -/* f18d360: 5420002f */ bnezl $at,.L0f18d420 -/* f18d364: 02602025 */ or $a0,$s3,$zero -/* f18d368: 10c00021 */ beqz $a2,.L0f18d3f0 -/* f18d36c: 97a70054 */ lhu $a3,0x54($sp) -/* f18d370: 10e0001f */ beqz $a3,.L0f18d3f0 -/* f18d374: 3c02800a */ lui $v0,%hi(g_MenuData) -/* f18d378: 244219c0 */ addiu $v0,$v0,%lo(g_MenuData) -/* f18d37c: 80450668 */ lb $a1,0x668($v0) -/* f18d380: 28a1000b */ slti $at,$a1,0xb -/* f18d384: 10200025 */ beqz $at,.L0f18d41c -/* f18d388: 24b90001 */ addiu $t9,$a1,0x1 -/* f18d38c: a0590668 */ sb $t9,0x668($v0) -/* f18d390: 80480668 */ lb $t0,0x668($v0) -/* f18d394: 2404000c */ addiu $a0,$zero,0xc -/* f18d398: 3c038007 */ lui $v1,%hi(g_MpPlayerNum) -/* f18d39c: 01040019 */ multu $t0,$a0 -/* f18d3a0: 00004812 */ mflo $t1 -/* f18d3a4: 00495021 */ addu $t2,$v0,$t1 -/* f18d3a8: ad4605d8 */ sw $a2,0x5d8($t2) -/* f18d3ac: 804b0668 */ lb $t3,0x668($v0) -/* f18d3b0: 01640019 */ multu $t3,$a0 -/* f18d3b4: 00006012 */ mflo $t4 -/* f18d3b8: 004c6821 */ addu $t5,$v0,$t4 -/* f18d3bc: a5a705dc */ sh $a3,0x5dc($t5) -/* f18d3c0: 804e0668 */ lb $t6,0x668($v0) -/* f18d3c4: 8c631448 */ lw $v1,%lo(g_MpPlayerNum)($v1) -/* f18d3c8: 01c40019 */ multu $t6,$a0 -/* f18d3cc: 00007812 */ mflo $t7 -/* f18d3d0: 004fc021 */ addu $t8,$v0,$t7 -/* f18d3d4: a30305e0 */ sb $v1,0x5e0($t8) -/* f18d3d8: 80590668 */ lb $t9,0x668($v0) -/* f18d3dc: 03240019 */ multu $t9,$a0 -/* f18d3e0: 00004012 */ mflo $t0 -/* f18d3e4: 00484821 */ addu $t1,$v0,$t0 -/* f18d3e8: 1000000c */ b .L0f18d41c -/* f18d3ec: a12305e1 */ sb $v1,0x5e1($t1) -.L0f18d3f0: -/* f18d3f0: 1000000a */ b .L0f18d41c -/* f18d3f4: a2a0000f */ sb $zero,0xf($s5) -.L0f18d3f8: -/* f18d3f8: 02602025 */ or $a0,$s3,$zero -/* f18d3fc: 0fc354fe */ jal savebufferReadBits -/* f18d400: 24050007 */ addiu $a1,$zero,0x7 -/* f18d404: 02602025 */ or $a0,$s3,$zero -/* f18d408: 0fc354fe */ jal savebufferReadBits -/* f18d40c: 24050007 */ addiu $a1,$zero,0x7 -/* f18d410: 02602025 */ or $a0,$s3,$zero -/* f18d414: 0fc355e7 */ jal func0f0d579c -/* f18d418: 27a50050 */ addiu $a1,$sp,0x50 -.L0f18d41c: -/* f18d41c: 02602025 */ or $a0,$s3,$zero -.L0f18d420: -/* f18d420: 0fc354fe */ jal savebufferReadBits -/* f18d424: 24050008 */ addiu $a1,$zero,0x8 -/* f18d428: aea20014 */ sw $v0,0x14($s5) -/* f18d42c: 02602025 */ or $a0,$s3,$zero -/* f18d430: 0fc354fe */ jal savebufferReadBits -/* f18d434: 24050014 */ addiu $a1,$zero,0x14 -/* f18d438: aea20054 */ sw $v0,0x54($s5) -/* f18d43c: 02602025 */ or $a0,$s3,$zero -/* f18d440: 0fc354fe */ jal savebufferReadBits -/* f18d444: 24050014 */ addiu $a1,$zero,0x14 -/* f18d448: aea20058 */ sw $v0,0x58($s5) -/* f18d44c: 02602025 */ or $a0,$s3,$zero -/* f18d450: 0fc354fe */ jal savebufferReadBits -/* f18d454: 24050013 */ addiu $a1,$zero,0x13 -/* f18d458: aea2005c */ sw $v0,0x5c($s5) -/* f18d45c: 02602025 */ or $a0,$s3,$zero -/* f18d460: 0fc354fe */ jal savebufferReadBits -/* f18d464: 24050013 */ addiu $a1,$zero,0x13 -/* f18d468: aea20060 */ sw $v0,0x60($s5) -/* f18d46c: 02602025 */ or $a0,$s3,$zero -/* f18d470: 0fc354fe */ jal savebufferReadBits -/* f18d474: 24050013 */ addiu $a1,$zero,0x13 -/* f18d478: aea20064 */ sw $v0,0x64($s5) -/* f18d47c: 02602025 */ or $a0,$s3,$zero -/* f18d480: 0fc354fe */ jal savebufferReadBits -/* f18d484: 24050019 */ addiu $a1,$zero,0x19 -/* f18d488: aea2006c */ sw $v0,0x6c($s5) -/* f18d48c: 02602025 */ or $a0,$s3,$zero -/* f18d490: 0fc354fe */ jal savebufferReadBits -/* f18d494: 2405000a */ addiu $a1,$zero,0xa -/* f18d498: aea20070 */ sw $v0,0x70($s5) -/* f18d49c: 02602025 */ or $a0,$s3,$zero -/* f18d4a0: 0fc354fe */ jal savebufferReadBits -/* f18d4a4: 2405001a */ addiu $a1,$zero,0x1a -/* f18d4a8: aea20074 */ sw $v0,0x74($s5) -/* f18d4ac: 02602025 */ or $a0,$s3,$zero -/* f18d4b0: 0fc354fe */ jal savebufferReadBits -/* f18d4b4: 2405001a */ addiu $a1,$zero,0x1a -/* f18d4b8: aea20078 */ sw $v0,0x78($s5) -/* f18d4bc: 02602025 */ or $a0,$s3,$zero -/* f18d4c0: 0fc354fe */ jal savebufferReadBits -/* f18d4c4: 24050014 */ addiu $a1,$zero,0x14 -/* f18d4c8: aea2007c */ sw $v0,0x7c($s5) -/* f18d4cc: 02602025 */ or $a0,$s3,$zero -/* f18d4d0: 0fc354fe */ jal savebufferReadBits -/* f18d4d4: 2405001e */ addiu $a1,$zero,0x1e -/* f18d4d8: aea20080 */ sw $v0,0x80($s5) -/* f18d4dc: 02602025 */ or $a0,$s3,$zero -/* f18d4e0: 0fc354fe */ jal savebufferReadBits -/* f18d4e4: 24050012 */ addiu $a1,$zero,0x12 -/* f18d4e8: aea20084 */ sw $v0,0x84($s5) -/* f18d4ec: 02602025 */ or $a0,$s3,$zero -/* f18d4f0: 0fc354fe */ jal savebufferReadBits -/* f18d4f4: 24050012 */ addiu $a1,$zero,0x12 -/* f18d4f8: aea20088 */ sw $v0,0x88($s5) -/* f18d4fc: 02602025 */ or $a0,$s3,$zero -/* f18d500: 0fc354fe */ jal savebufferReadBits -/* f18d504: 24050012 */ addiu $a1,$zero,0x12 -/* f18d508: aea2008c */ sw $v0,0x8c($s5) -/* f18d50c: 02602025 */ or $a0,$s3,$zero -/* f18d510: 0fc354fe */ jal savebufferReadBits -/* f18d514: 24050010 */ addiu $a1,$zero,0x10 -/* f18d518: aea20090 */ sw $v0,0x90($s5) -/* f18d51c: 02602025 */ or $a0,$s3,$zero -/* f18d520: 0fc354fe */ jal savebufferReadBits -/* f18d524: 24050002 */ addiu $a1,$zero,0x2 -/* f18d528: a2a20044 */ sb $v0,0x44($s5) -/* f18d52c: 02602025 */ or $a0,$s3,$zero -/* f18d530: 0fc354fe */ jal savebufferReadBits -/* f18d534: 2405000c */ addiu $a1,$zero,0xc -/* f18d538: a6a20048 */ sh $v0,0x48($s5) -/* f18d53c: 00008825 */ or $s1,$zero,$zero -/* f18d540: 24120005 */ addiu $s2,$zero,0x5 -/* f18d544: 24100001 */ addiu $s0,$zero,0x1 -.L0f18d548: -/* f18d548: 02602025 */ or $a0,$s3,$zero -.L0f18d54c: -/* f18d54c: 0fc354fe */ jal savebufferReadBits -/* f18d550: 24050001 */ addiu $a1,$zero,0x1 -/* f18d554: 02802025 */ or $a0,$s4,$zero -/* f18d558: 02202825 */ or $a1,$s1,$zero -/* f18d55c: 02003025 */ or $a2,$s0,$zero -/* f18d560: 0fc6712e */ jal mpSetChallengeCompletedByPlayerWithNumPlayers -/* f18d564: 00403825 */ or $a3,$v0,$zero -/* f18d568: 26100001 */ addiu $s0,$s0,0x1 -/* f18d56c: 5612fff7 */ bnel $s0,$s2,.L0f18d54c -/* f18d570: 02602025 */ or $a0,$s3,$zero -/* f18d574: 26310001 */ addiu $s1,$s1,0x1 -/* f18d578: 2401001e */ addiu $at,$zero,0x1e -/* f18d57c: 5621fff2 */ bnel $s1,$at,.L0f18d548 -/* f18d580: 24100001 */ addiu $s0,$zero,0x1 -/* f18d584: 0fc66bf7 */ jal mpDetermineUnlockedFeatures -/* f18d588: 00000000 */ nop -/* f18d58c: 0fc62864 */ jal mpCalculatePlayerTitle -/* f18d590: 02a02025 */ or $a0,$s5,$zero -/* f18d594: 02602025 */ or $a0,$s3,$zero -/* f18d598: 0fc6346e */ jal func0f18d1b8 -/* f18d59c: 02802825 */ or $a1,$s4,$zero -/* f18d5a0: 8fbf002c */ lw $ra,0x2c($sp) -/* f18d5a4: 8fb00014 */ lw $s0,0x14($sp) -/* f18d5a8: 8fb10018 */ lw $s1,0x18($sp) -/* f18d5ac: 8fb2001c */ lw $s2,0x1c($sp) -/* f18d5b0: 8fb30020 */ lw $s3,0x20($sp) -/* f18d5b4: 8fb40024 */ lw $s4,0x24($sp) -/* f18d5b8: 8fb50028 */ lw $s5,0x28($sp) -/* f18d5bc: 03e00008 */ jr $ra -/* f18d5c0: 27bd0058 */ addiu $sp,$sp,0x58 -); +void mpplayerfileLoadWad(s32 playernum, struct savebuffer *buffer, s32 arg2) +{ + struct maybesavelocation_2d8 thing; + u32 stack; + s32 i; + s32 j; + + savebufferReadString(buffer, g_MpPlayers[playernum].base.name, 1); + g_MpPlayers[playernum].time = savebufferReadBits(buffer, 28); + + if (arg2 != 0) { + g_MpPlayers[playernum].base.mpheadnum = savebufferReadBits(buffer, 7); + g_MpPlayers[playernum].base.mpbodynum = savebufferReadBits(buffer, 7); + + func0f0d579c(buffer, &thing); + + if (g_MpPlayers[playernum].base.mpheadnum >= mpGetNumHeads2()) { + if (thing.unk00 != 0 && thing.unk04 != 0) { + if (g_MenuData.unk668 < 11) { + g_MenuData.unk668++; + g_MenuData.unk5d8[g_MenuData.unk668].unk00 = thing.unk00; + g_MenuData.unk5d8[g_MenuData.unk668].unk04 = thing.unk04; + g_MenuData.unk5d8[g_MenuData.unk668].unk08 = g_MpPlayerNum; + g_MenuData.unk5d8[g_MenuData.unk668].unk09 = g_MpPlayerNum; + } + } else { + g_MpPlayers[playernum].base.mpheadnum = MPHEAD_DARK_COMBAT; + } + } + } else { + savebufferReadBits(buffer, 7); + savebufferReadBits(buffer, 7); + func0f0d579c(buffer, &thing); + } + + g_MpPlayers[playernum].base.displayoptions = savebufferReadBits(buffer, 8); + g_MpPlayers[playernum].kills = savebufferReadBits(buffer, 20); + g_MpPlayers[playernum].deaths = savebufferReadBits(buffer, 20); + g_MpPlayers[playernum].gamesplayed = savebufferReadBits(buffer, 19); + g_MpPlayers[playernum].gameswon = savebufferReadBits(buffer, 19); + g_MpPlayers[playernum].gameslost = savebufferReadBits(buffer, 19); + g_MpPlayers[playernum].distance = savebufferReadBits(buffer, 25); + g_MpPlayers[playernum].accuracy = savebufferReadBits(buffer, 10); + g_MpPlayers[playernum].damagedealt = savebufferReadBits(buffer, 26); + g_MpPlayers[playernum].painreceived = savebufferReadBits(buffer, 26); + g_MpPlayers[playernum].headshots = savebufferReadBits(buffer, 20); + g_MpPlayers[playernum].ammoused = savebufferReadBits(buffer, 30); + g_MpPlayers[playernum].accuracymedals = savebufferReadBits(buffer, 18); + g_MpPlayers[playernum].headshotmedals = savebufferReadBits(buffer, 18); + g_MpPlayers[playernum].killmastermedals = savebufferReadBits(buffer, 18); + g_MpPlayers[playernum].survivormedals = savebufferReadBits(buffer, 16); + g_MpPlayers[playernum].base.controlmode = savebufferReadBits(buffer, 2); + g_MpPlayers[playernum].options = savebufferReadBits(buffer, 12); + + for (i = 0; i < 30; i++) { + for (j = 1; j < 5; j++) { + mpSetChallengeCompletedByPlayerWithNumPlayers(playernum, i, j, savebufferReadBits(buffer, 1)); + } + } + + mpDetermineUnlockedFeatures(); + mpCalculatePlayerTitle(&g_MpPlayers[playernum]); + func0f18d1b8(buffer, playernum); +} GLOBAL_ASM( glabel func0f18d5c4 @@ -8877,13 +8737,13 @@ glabel func0f18d5c4 /* f18d648: 92050010 */ lbu $a1,0x10($s0) /* f18d64c: 0fc354be */ jal savebufferOr /* f18d650: 24060007 */ addiu $a2,$zero,0x7 -/* f18d654: 0fc62ec7 */ jal func0f18bb1c +/* f18d654: 0fc62ec7 */ jal mpGetNumHeads2 /* f18d658: 00000000 */ nop /* f18d65c: 9219000f */ lbu $t9,0xf($s0) /* f18d660: 0322082a */ slt $at,$t9,$v0 /* f18d664: 5420000e */ bnezl $at,.L0f18d6a0 /* f18d668: a7a00040 */ sh $zero,0x40($sp) -/* f18d66c: 0fc62ec7 */ jal func0f18bb1c +/* f18d66c: 0fc62ec7 */ jal mpGetNumHeads2 /* f18d670: 00000000 */ nop /* f18d674: 9208000f */ lbu $t0,0xf($s0) /* f18d678: 27b10044 */ addiu $s1,$sp,0x44 @@ -9206,7 +9066,7 @@ s32 mpplayerfileLoad(s32 playernum, s32 arg1, s32 arg2, u16 arg3) g_MpPlayers[playernum].unk4c.unk00 = arg2; g_MpPlayers[playernum].unk4c.unk04 = arg3; - func0f18d2b8(playernum, &buffer, 1); + mpplayerfileLoadWad(playernum, &buffer, 1); func0f0d54c4(&buffer); g_MpPlayers[playernum].handicap = 0x80; diff --git a/src/game/mplayer/setup.c b/src/game/mplayer/setup.c index d65481af4..fca662fd5 100644 --- a/src/game/mplayer/setup.c +++ b/src/game/mplayer/setup.c @@ -2647,7 +2647,7 @@ glabel var7f1b814c /* f17b520: 8c2e80f0 */ lw $t6,%lo(var7f1b80f0)($at) /* f17b524: 01c00008 */ jr $t6 /* f17b528: 00000000 */ nop -/* f17b52c: 0fc62ec7 */ jal func0f18bb1c +/* f17b52c: 0fc62ec7 */ jal mpGetNumHeads2 /* f17b530: afa60038 */ sw $a2,0x38($sp) /* f17b534: 8fa60038 */ lw $a2,0x38($sp) /* f17b538: 100000bc */ b .L0f17b82c @@ -2672,7 +2672,7 @@ glabel var7f1b814c /* f17b584: c46a0d64 */ lwc1 $f10,0xd64($v1) /* f17b588: 46085000 */ add.s $f0,$f10,$f8 /* f17b58c: e4600d8c */ swc1 $f0,0xd8c($v1) -/* f17b590: 0fc62ec7 */ jal func0f18bb1c +/* f17b590: 0fc62ec7 */ jal mpGetNumHeads2 /* f17b594: e4600d64 */ swc1 $f0,0xd64($v1) /* f17b598: 8fa3003c */ lw $v1,0x3c($sp) /* f17b59c: 0062082a */ slt $at,$v1,$v0 @@ -2704,7 +2704,7 @@ glabel var7f1b814c /* f17b604: 1000002e */ b .L0f17b6c0 /* f17b608: ac6c084c */ sw $t4,0x84c($v1) .L0f17b60c: -/* f17b60c: 0fc62ec7 */ jal func0f18bb1c +/* f17b60c: 0fc62ec7 */ jal mpGetNumHeads2 /* f17b610: 00000000 */ nop /* f17b614: 8faf003c */ lw $t7,0x3c($sp) /* f17b618: 0fc52a7e */ jal func0f14a9f8 @@ -2732,7 +2732,7 @@ glabel var7f1b814c /* f17b670: 954acf06 */ lhu $t2,%lo(g_HeadsAndBodies+0x2)($t2) /* f17b674: 358d0080 */ ori $t5,$t4,0x80 /* f17b678: a06d0df1 */ sb $t5,0xdf1($v1) -/* f17b67c: 0fc62ec7 */ jal func0f18bb1c +/* f17b67c: 0fc62ec7 */ jal mpGetNumHeads2 /* f17b680: ac6a084c */ sw $t2,0x84c($v1) /* f17b684: 3c0e8007 */ lui $t6,%hi(g_MpPlayerNum) /* f17b688: 8dce1448 */ lw $t6,%lo(g_MpPlayerNum)($t6) @@ -2781,7 +2781,7 @@ glabel var7f1b814c /* f17b730: 01ac6823 */ subu $t5,$t5,$t4 /* f17b734: 000d6900 */ sll $t5,$t5,0x4 /* f17b738: 002d0821 */ addu $at,$at,$t5 -/* f17b73c: 0fc62ec7 */ jal func0f18bb1c +/* f17b73c: 0fc62ec7 */ jal mpGetNumHeads2 /* f17b740: a02be840 */ sb $t3,%lo(g_Menus+0x840)($at) /* f17b744: 3c0e8007 */ lui $t6,%hi(g_MpPlayerNum) /* f17b748: 8dce1448 */ lw $t6,%lo(g_MpPlayerNum)($t6) @@ -2915,7 +2915,7 @@ glabel var7f1b814c /* f17b520: 8c2e80f0 */ lw $t6,%lo(var7f1b80f0)($at) /* f17b524: 01c00008 */ jr $t6 /* f17b528: 00000000 */ nop -/* f17b52c: 0fc62ec7 */ jal func0f18bb1c +/* f17b52c: 0fc62ec7 */ jal mpGetNumHeads2 /* f17b530: afa60038 */ sw $a2,0x38($sp) /* f17b534: 8fa60038 */ lw $a2,0x38($sp) /* f17b538: 100000bc */ b .L0f17b82c @@ -2940,7 +2940,7 @@ glabel var7f1b814c /* f17b584: c46a0d64 */ lwc1 $f10,0xd64($v1) /* f17b588: 46085000 */ add.s $f0,$f10,$f8 /* f17b58c: e4600d8c */ swc1 $f0,0xd8c($v1) -/* f17b590: 0fc62ec7 */ jal func0f18bb1c +/* f17b590: 0fc62ec7 */ jal mpGetNumHeads2 /* f17b594: e4600d64 */ swc1 $f0,0xd64($v1) /* f17b598: 8fa3003c */ lw $v1,0x3c($sp) /* f17b59c: 0062082a */ slt $at,$v1,$v0 @@ -2972,7 +2972,7 @@ glabel var7f1b814c /* f17b604: 1000002e */ b .L0f17b6c0 /* f17b608: ac6c084c */ sw $t4,0x84c($v1) .L0f17b60c: -/* f17b60c: 0fc62ec7 */ jal func0f18bb1c +/* f17b60c: 0fc62ec7 */ jal mpGetNumHeads2 /* f17b610: 00000000 */ nop /* f17b614: 8faf003c */ lw $t7,0x3c($sp) /* f17b618: 0fc52a7e */ jal func0f14a9f8 @@ -3000,7 +3000,7 @@ glabel var7f1b814c /* f17b670: 954acf06 */ lhu $t2,%lo(g_HeadsAndBodies+0x2)($t2) /* f17b674: 358d0080 */ ori $t5,$t4,0x80 /* f17b678: a06d0df1 */ sb $t5,0xdf1($v1) -/* f17b67c: 0fc62ec7 */ jal func0f18bb1c +/* f17b67c: 0fc62ec7 */ jal mpGetNumHeads2 /* f17b680: ac6a084c */ sw $t2,0x84c($v1) /* f17b684: 3c0e8007 */ lui $t6,%hi(g_MpPlayerNum) /* f17b688: 8dce1448 */ lw $t6,%lo(g_MpPlayerNum)($t6) @@ -3049,7 +3049,7 @@ glabel var7f1b814c /* f17b730: 01ac6823 */ subu $t5,$t5,$t4 /* f17b734: 000d6900 */ sll $t5,$t5,0x4 /* f17b738: 002d0821 */ addu $at,$at,$t5 -/* f17b73c: 0fc62ec7 */ jal func0f18bb1c +/* f17b73c: 0fc62ec7 */ jal mpGetNumHeads2 /* f17b740: a02be840 */ sb $t3,%lo(g_Menus+0x840)($at) /* f17b744: 3c0e8007 */ lui $t6,%hi(g_MpPlayerNum) /* f17b748: 8dce1448 */ lw $t6,%lo(g_MpPlayerNum)($t6) @@ -3183,7 +3183,7 @@ glabel var7f1b814c /* f175cb0: 8c2e29e4 */ lw $t6,0x29e4($at) /* f175cb4: 01c00008 */ jr $t6 /* f175cb8: 00000000 */ sll $zero,$zero,0x0 -/* f175cbc: 0fc6175d */ jal func0f18bb1c +/* f175cbc: 0fc6175d */ jal mpGetNumHeads2 /* f175cc0: afa60038 */ sw $a2,0x38($sp) /* f175cc4: 8fa60038 */ lw $a2,0x38($sp) /* f175cc8: 100000b0 */ beqz $zero,.NB0f175f8c @@ -3208,7 +3208,7 @@ glabel var7f1b814c /* f175d14: c46a0cc0 */ lwc1 $f10,0xcc0($v1) /* f175d18: 46085000 */ add.s $f0,$f10,$f8 /* f175d1c: e4600ce8 */ swc1 $f0,0xce8($v1) -/* f175d20: 0fc6175d */ jal func0f18bb1c +/* f175d20: 0fc6175d */ jal mpGetNumHeads2 /* f175d24: e4600cc0 */ swc1 $f0,0xcc0($v1) /* f175d28: 8fa3003c */ lw $v1,0x3c($sp) /* f175d2c: 0062082a */ slt $at,$v1,$v0 @@ -3240,7 +3240,7 @@ glabel var7f1b814c /* f175d94: 1000002e */ beqz $zero,.NB0f175e50 /* f175d98: ac6c07a8 */ sw $t4,0x7a8($v1) .NB0f175d9c: -/* f175d9c: 0fc6175d */ jal func0f18bb1c +/* f175d9c: 0fc6175d */ jal mpGetNumHeads2 /* f175da0: 00000000 */ sll $zero,$zero,0x0 /* f175da4: 8faf003c */ lw $t7,0x3c($sp) /* f175da8: 0fc51472 */ jal func0f14a9f8 @@ -3268,7 +3268,7 @@ glabel var7f1b814c /* f175e00: 954af766 */ lhu $t2,-0x89a($t2) /* f175e04: 358d0080 */ ori $t5,$t4,0x80 /* f175e08: a06d0d4d */ sb $t5,0xd4d($v1) -/* f175e0c: 0fc6175d */ jal func0f18bb1c +/* f175e0c: 0fc6175d */ jal mpGetNumHeads2 /* f175e10: ac6a07a8 */ sw $t2,0x7a8($v1) /* f175e14: 3c0e8007 */ lui $t6,0x8007 /* f175e18: 8dce3af0 */ lw $t6,0x3af0($t6) @@ -3305,7 +3305,7 @@ glabel var7f1b814c /* f175e90: 8faa003c */ lw $t2,0x3c($sp) /* f175e94: 1000003d */ beqz $zero,.NB0f175f8c /* f175e98: acca0000 */ sw $t2,0x0($a2) -/* f175e9c: 0fc6175d */ jal func0f18bb1c +/* f175e9c: 0fc6175d */ jal mpGetNumHeads2 /* f175ea0: 00000000 */ sll $zero,$zero,0x0 /* f175ea4: 3c0b8007 */ lui $t3,0x8007 /* f175ea8: 8d6b3af0 */ lw $t3,0x3af0($t3) diff --git a/src/include/game/mplayer/mplayer.h b/src/include/game/mplayer/mplayer.h index 9a3a6b640..c4c75a5af 100644 --- a/src/include/game/mplayer/mplayer.h +++ b/src/include/game/mplayer/mplayer.h @@ -46,7 +46,7 @@ u32 func0f18a030(void); void mpCalculatePlayerTitle(struct mpplayer *mpplayer); void func0f18a56c(void); void mpEndMatch(void); -s32 func0f18bb1c(void); +s32 mpGetNumHeads2(void); s32 mpGetNumHeads(void); s32 mpGetHeadId(u8 headnum); s32 mpGetHeadRequiredFeature(u8 headnum); @@ -97,9 +97,9 @@ s32 mpPlayerGetIndex(struct chrdata *chr); struct chrdata *mpGetChrFromPlayerIndex(s32 index); s32 func0f18d074(s32 index); s32 func0f18d0e8(s32 arg0); -u32 func0f18d1b8(void); +void func0f18d1b8(struct savebuffer *buffer, s32 playernum); u32 func0f18d238(void); -void func0f18d2b8(s32 playernum, struct savebuffer *buffer, s32 arg2); +void mpplayerfileLoadWad(s32 playernum, struct savebuffer *buffer, s32 arg2); u32 func0f18d5c4(void); void mpplayerfileGetOverview(char *arg0, char *buffer, u32 *arg2); s32 mpplayerfileSave(void *arg0, s32 arg1, s32 arg2, u16 arg3); diff --git a/src/include/types.h b/src/include/types.h index 91789f6a9..81a36f84e 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -5320,6 +5320,16 @@ struct frdata { /*0x47c*/ u32 unk47c; }; +struct menudata_5d8 { + s32 unk00; + u16 unk04; + u16 unk06; + u8 unk08; + u8 unk09; + u8 unk0a; + u8 unk0b; +}; + struct menudata { /*0x000*/ s32 count; /*0x004*/ s32 root; @@ -5706,43 +5716,8 @@ struct menudata { /*0x5d5*/ u8 unk5d5_06 : 1; /*0x5d5*/ u8 unk5d5_07 : 1; /*0x5d5*/ u8 unk5d5_08 : 1; - /*0x5d8*/ u32 unk5d8; - /*0x5dc*/ u32 unk5dc; - /*0x5e0*/ u32 unk5e0; - /*0x5e4*/ u32 unk5e4; - /*0x5e8*/ u32 unk5e8; - /*0x5ec*/ u32 unk5ec; - /*0x5f0*/ u32 unk5f0; - /*0x5f4*/ u32 unk5f4; - /*0x5f8*/ u32 unk5f8; - /*0x5fc*/ u32 unk5fc; - /*0x600*/ u32 unk600; - /*0x604*/ u32 unk604; - /*0x608*/ u32 unk608; - /*0x60c*/ u32 unk60c; - /*0x610*/ u32 unk610; - /*0x614*/ u32 unk614; - /*0x618*/ u32 unk618; - /*0x61c*/ u32 unk61c; - /*0x620*/ u32 unk620; - /*0x624*/ u32 unk624; - /*0x628*/ u32 unk628; - /*0x62c*/ u32 unk62c; - /*0x630*/ u32 unk630; - /*0x634*/ u32 unk634; - /*0x638*/ u32 unk638; - /*0x63c*/ u32 unk63c; - /*0x640*/ u32 unk640; - /*0x644*/ u32 unk644; - /*0x648*/ u32 unk648; - /*0x64c*/ u32 unk64c; - /*0x650*/ u32 unk650; - /*0x654*/ u32 unk654; - /*0x658*/ u32 unk658; - /*0x65c*/ u32 unk65c; - /*0x660*/ u32 unk660; - /*0x664*/ u32 unk664; - /*0x668*/ u8 unk668; + /*0x5d8*/ struct menudata_5d8 unk5d8[12]; + /*0x668*/ s8 unk668; /*0x669*/ u8 unk669[4]; /*0x66d*/ u8 unk66d; /*0x66e*/ s8 unk66e; // index into 669