From 574091e31021f2198dcea74e5b76013dcaf3f1bc Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Thu, 20 Aug 2020 20:06:09 +1000 Subject: [PATCH] Decompile mpCalculateLockIfLastWinnerOrLoser --- src/game/game_01bea0.c | 4 +- src/game/mplayer.c | 100 ++++++++++++------------------------- src/gvars/gvars.c | 2 +- src/include/game/mplayer.h | 2 +- src/include/gvars/gvars.h | 2 +- src/include/types.h | 6 +++ 6 files changed, 44 insertions(+), 72 deletions(-) diff --git a/src/game/game_01bea0.c b/src/game/game_01bea0.c index 06ab3cf62..582df8cd8 100644 --- a/src/game/game_01bea0.c +++ b/src/game/game_01bea0.c @@ -561,7 +561,7 @@ glabel var7f1a863c .L0f01c588: /* f01c588: 1621fff0 */ bne $s1,$at,.L0f01c54c /* f01c58c: 24630e70 */ addiu $v1,$v1,0x0e70 -/* f01c590: 0fc63005 */ jal func0f18c014 +/* f01c590: 0fc63005 */ jal mpCalculateLockIfLastWinnerOrLoser /* f01c594: 00000000 */ nop /* f01c598: 0fc66d50 */ jal func0f19b540 /* f01c59c: 00000000 */ nop @@ -2114,7 +2114,7 @@ glabel var7f1a863c // } // } // -// func0f18c014(); +// mpCalculateLockIfLastWinnerOrLoser(); // func0f19b540(); // } // diff --git a/src/game/mplayer.c b/src/game/mplayer.c index 9de964b90..d49653624 100644 --- a/src/game/mplayer.c +++ b/src/game/mplayer.c @@ -838,8 +838,8 @@ glabel func0f188210 /* f1882dc: 0fc6256f */ jal mpSetWeaponSet /* f1882e0: 00002025 */ or $a0,$zero,$zero .L0f1882e4: -/* f1882e4: 3c02800b */ lui $v0,%hi(g_MpLockPlayerNum) -/* f1882e8: 2442cc20 */ addiu $v0,$v0,%lo(g_MpLockPlayerNum) +/* f1882e4: 3c02800b */ lui $v0,%hi(g_MpLockInfo) +/* f1882e8: 2442cc20 */ addiu $v0,$v0,%lo(g_MpLockInfo) /* f1882ec: 2403ffff */ addiu $v1,$zero,-1 /* f1882f0: 3c04800a */ lui $a0,%hi(g_Vars) /* f1882f4: 24849fc0 */ addiu $a0,$a0,%lo(g_Vars) @@ -1276,8 +1276,8 @@ glabel func0f1885e4 /* f1888d4: 1490ffcf */ bne $a0,$s0,.L0f188814 /* f1888d8: 24c60004 */ addiu $a2,$a2,0x4 .L0f1888dc: -/* f1888dc: 3c11800b */ lui $s1,%hi(g_MpLockPlayerNum) -/* f1888e0: 2631cc20 */ addiu $s1,$s1,%lo(g_MpLockPlayerNum) +/* f1888dc: 3c11800b */ lui $s1,%hi(g_MpLockInfo) +/* f1888e0: 2631cc20 */ addiu $s1,$s1,%lo(g_MpLockInfo) /* f1888e4: a22d0001 */ sb $t5,0x1($s1) /* f1888e8: a23f0002 */ sb $ra,0x2($s1) /* f1888ec: 3c19800b */ lui $t9,%hi(g_MpSetup+0x88) @@ -5204,9 +5204,9 @@ bool mpSetLock(s32 locktype, s32 playernum) g_MpSetupSaveFile.locktype = locktype; if (g_MpSetupSaveFile.locktype == MPLOCKTYPE_RANDOM) { - g_MpLockPlayerNum = mpChooseRandomLockPlayer(); + g_MpLockInfo.lockedplayernum = mpChooseRandomLockPlayer(); } else { - g_MpLockPlayerNum = playernum; + g_MpLockInfo.lockedplayernum = playernum; } return true; @@ -5219,7 +5219,7 @@ u32 mpGetLockType(void) u32 mpGetLockPlayerNum(void) { - return g_MpLockPlayerNum; + return g_MpLockInfo.lockedplayernum; } bool mpIsPlayerLockedOut(u32 playernum) @@ -5228,64 +5228,30 @@ bool mpIsPlayerLockedOut(u32 playernum) return false; } - if (g_MpLockPlayerNum == playernum) { + if (g_MpLockInfo.lockedplayernum == playernum) { return false; } return true; } -GLOBAL_ASM( -glabel func0f18c014 -/* f18c014: 3c04800b */ lui $a0,%hi(g_MpSetup+0x88) -/* f18c018: 9084cc10 */ lbu $a0,%lo(g_MpSetup+0x88)($a0) -/* f18c01c: 27bdffe8 */ addiu $sp,$sp,-24 -/* f18c020: 24010001 */ addiu $at,$zero,0x1 -/* f18c024: 14810007 */ bne $a0,$at,.L0f18c044 -/* f18c028: afbf0014 */ sw $ra,0x14($sp) -/* f18c02c: 3c03800b */ lui $v1,%hi(g_MpLockPlayerNum) -/* f18c030: 2463cc20 */ addiu $v1,$v1,%lo(g_MpLockPlayerNum) -/* f18c034: 80620001 */ lb $v0,0x1($v1) -/* f18c038: 04400002 */ bltz $v0,.L0f18c044 -/* f18c03c: 00000000 */ nop -/* f18c040: a0620000 */ sb $v0,0x0($v1) -.L0f18c044: -/* f18c044: 3c03800b */ lui $v1,%hi(g_MpLockPlayerNum) -/* f18c048: 24010002 */ addiu $at,$zero,0x2 -/* f18c04c: 14810005 */ bne $a0,$at,.L0f18c064 -/* f18c050: 2463cc20 */ addiu $v1,$v1,%lo(g_MpLockPlayerNum) -/* f18c054: 80620002 */ lb $v0,0x2($v1) -/* f18c058: 04420003 */ bltzl $v0,.L0f18c068 -/* f18c05c: 80620000 */ lb $v0,0x0($v1) -/* f18c060: a0620000 */ sb $v0,0x0($v1) -.L0f18c064: -/* f18c064: 80620000 */ lb $v0,0x0($v1) -.L0f18c068: -/* f18c068: 24010005 */ addiu $at,$zero,0x5 -/* f18c06c: 04420011 */ bltzl $v0,.L0f18c0b4 -/* f18c070: 8fbf0014 */ lw $ra,0x14($sp) -/* f18c074: 1081000e */ beq $a0,$at,.L0f18c0b0 -/* f18c078: 3c0e800b */ lui $t6,%hi(g_MpSetup+0x16) -/* f18c07c: 95cecb9e */ lhu $t6,%lo(g_MpSetup+0x16)($t6) -/* f18c080: 240f0001 */ addiu $t7,$zero,0x1 -/* f18c084: 004fc004 */ sllv $t8,$t7,$v0 -/* f18c088: 01d8c824 */ and $t9,$t6,$t8 -/* f18c08c: 17200008 */ bnez $t9,.L0f18c0b0 -/* f18c090: 2408ffff */ addiu $t0,$zero,-1 -/* f18c094: a0680002 */ sb $t0,0x2($v1) -/* f18c098: 80690002 */ lb $t1,0x2($v1) -/* f18c09c: 0fc62fba */ jal mpChooseRandomLockPlayer -/* f18c0a0: a0690001 */ sb $t1,0x1($v1) -/* f18c0a4: 3c03800b */ lui $v1,%hi(g_MpLockPlayerNum) -/* f18c0a8: 2463cc20 */ addiu $v1,$v1,%lo(g_MpLockPlayerNum) -/* f18c0ac: a0620000 */ sb $v0,0x0($v1) -.L0f18c0b0: -/* f18c0b0: 8fbf0014 */ lw $ra,0x14($sp) -.L0f18c0b4: -/* f18c0b4: 27bd0018 */ addiu $sp,$sp,0x18 -/* f18c0b8: 03e00008 */ jr $ra -/* f18c0bc: 00000000 */ nop -); +void mpCalculateLockIfLastWinnerOrLoser(void) +{ + if (g_MpSetupSaveFile.locktype == MPLOCKTYPE_LASTWINNER && g_MpLockInfo.lastwinner >= 0) { + g_MpLockInfo.lockedplayernum = g_MpLockInfo.lastwinner; + } + + if (g_MpSetupSaveFile.locktype == MPLOCKTYPE_LASTLOSER && g_MpLockInfo.lastloser >= 0) { + g_MpLockInfo.lockedplayernum = g_MpLockInfo.lastloser; + } + + if (g_MpLockInfo.lockedplayernum >= 0 + && g_MpSetupSaveFile.locktype != MPLOCKTYPE_CHALLENGE + && (g_MpSetup.chrslots & (1 << g_MpLockInfo.lockedplayernum)) == 0) { + g_MpLockInfo.lastwinner = g_MpLockInfo.lastloser = -1; + g_MpLockInfo.lockedplayernum = mpChooseRandomLockPlayer(); + } +} GLOBAL_ASM( glabel mpIsTrackUnlocked @@ -5514,8 +5480,8 @@ glabel func0f18c4c0 /* f18c524: 00000000 */ nop .L0f18c528: /* f18c528: 16a0001e */ bnez $s5,.L0f18c5a4 -/* f18c52c: 3c16800b */ lui $s6,%hi(g_MpLockPlayerNum) -/* f18c530: 26d6cc20 */ addiu $s6,$s6,%lo(g_MpLockPlayerNum) +/* f18c52c: 3c16800b */ lui $s6,%hi(g_MpLockInfo) +/* f18c530: 26d6cc20 */ addiu $s6,$s6,%lo(g_MpLockInfo) .L0f18c534: /* f18c534: 0c004b70 */ jal random /* f18c538: 00000000 */ nop @@ -5547,8 +5513,8 @@ glabel func0f18c4c0 /* f18c59c: 10000073 */ b .L0f18c76c /* f18c5a0: 00031242 */ srl $v0,$v1,0x9 .L0f18c5a4: -/* f18c5a4: 3c16800b */ lui $s6,%hi(g_MpLockPlayerNum) -/* f18c5a8: 26d6cc20 */ addiu $s6,$s6,%lo(g_MpLockPlayerNum) +/* f18c5a4: 3c16800b */ lui $s6,%hi(g_MpLockInfo) +/* f18c5a8: 26d6cc20 */ addiu $s6,$s6,%lo(g_MpLockInfo) /* f18c5ac: 00008025 */ or $s0,$zero,$zero .L0f18c5b0: /* f18c5b0: 0c004b70 */ jal random @@ -5621,9 +5587,9 @@ glabel func0f18c4c0 /* f18c69c: 00409825 */ or $s3,$v0,$zero /* f18c6a0: 0fc63080 */ jal func0f18c200 /* f18c6a4: 00000000 */ nop -/* f18c6a8: 3c16800b */ lui $s6,%hi(g_MpLockPlayerNum) +/* f18c6a8: 3c16800b */ lui $s6,%hi(g_MpLockInfo) /* f18c6ac: 00408025 */ or $s0,$v0,$zero -/* f18c6b0: 26d6cc20 */ addiu $s6,$s6,%lo(g_MpLockPlayerNum) +/* f18c6b0: 26d6cc20 */ addiu $s6,$s6,%lo(g_MpLockInfo) .L0f18c6b4: /* f18c6b4: 0c004b70 */ jal random /* f18c6b8: 00000000 */ nop @@ -5658,9 +5624,9 @@ glabel func0f18c4c0 /* f18c724: 0fc63065 */ jal mpGetTrackNumAtSlotIndex /* f18c728: 02602025 */ or $a0,$s3,$zero /* f18c72c: 00024080 */ sll $t0,$v0,0x2 -/* f18c730: 3c16800b */ lui $s6,%hi(g_MpLockPlayerNum) +/* f18c730: 3c16800b */ lui $s6,%hi(g_MpLockInfo) /* f18c734: 01024023 */ subu $t0,$t0,$v0 -/* f18c738: 26d6cc20 */ addiu $s6,$s6,%lo(g_MpLockPlayerNum) +/* f18c738: 26d6cc20 */ addiu $s6,$s6,%lo(g_MpLockInfo) /* f18c73c: 00084040 */ sll $t0,$t0,0x1 /* f18c740: 3c038008 */ lui $v1,%hi(g_MpTracks) /* f18c744: aec20004 */ sw $v0,0x4($s6) diff --git a/src/gvars/gvars.c b/src/gvars/gvars.c index cd55d42f7..a0ca46830 100644 --- a/src/gvars/gvars.c +++ b/src/gvars/gvars.c @@ -20315,7 +20315,7 @@ u8 g_ActiveMenuMpBotCommands[16] = {0}; struct mpsetup g_MpSetup = {0}; struct savefile_setup g_MpSetupSaveFile = {0}; u32 var800acc1c = 0; -s8 g_MpLockPlayerNum = 0; +struct mplockinfo g_MpLockInfo = {0}; u32 var800acc24 = 0; u32 var800acc28[18] = {0}; u32 var800acc70 = 0; diff --git a/src/include/game/mplayer.h b/src/include/game/mplayer.h index bfd8fe4f8..2745aad1d 100644 --- a/src/include/game/mplayer.h +++ b/src/include/game/mplayer.h @@ -61,7 +61,7 @@ bool mpSetLock(s32 locktype, s32 playernum); u32 mpGetLockType(void); u32 mpGetLockPlayerNum(void); bool mpIsPlayerLockedOut(u32 playernum); -void func0f18c014(void); +void mpCalculateLockIfLastWinnerOrLoser(void); bool mpIsTrackUnlocked(s32 tracknum); s32 mpGetTrackSlotIndex(s32 tracknum); s32 mpGetTrackNumAtSlotIndex(s32 slotindex); diff --git a/src/include/gvars/gvars.h b/src/include/gvars/gvars.h index b2f04cc2f..0a3c8eeb1 100644 --- a/src/include/gvars/gvars.h +++ b/src/include/gvars/gvars.h @@ -817,7 +817,7 @@ extern struct mpplayer g_MpPlayers[6]; extern u8 g_ActiveMenuMpBotCommands[16]; extern struct mpsetup g_MpSetup; extern struct savefile_setup g_MpSetupSaveFile; -extern s8 g_MpLockPlayerNum; +extern struct mplockinfo g_MpLockInfo; extern u32 var800acc28[18]; extern u32 var800acc70; extern u32 var800acc74; diff --git a/src/include/types.h b/src/include/types.h index f4a0603ce..e503e6a45 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -6398,4 +6398,10 @@ struct var8009d510 { /*0x40*/ u32 unk40; }; +struct mplockinfo { + s8 lockedplayernum; + s8 lastwinner; + s8 lastloser; +}; + #endif