From fef8d54a9fdb9a8eeb2181034b30c114adb8ff25 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Sun, 9 Feb 2020 17:36:09 +1000 Subject: [PATCH] Decompile aiShuffleInvestigationTerminals --- src/game/chr/chraicommands.c | 311 +++++++++-------------------------- src/include/commands.h | 14 +- 2 files changed, 82 insertions(+), 243 deletions(-) diff --git a/src/game/chr/chraicommands.c b/src/game/chr/chraicommands.c index 29989ca1a..553929eeb 100644 --- a/src/game/chr/chraicommands.c +++ b/src/game/chr/chraicommands.c @@ -10868,243 +10868,82 @@ bool aiIfHoverbotNextStep(void) /** * @cmd 0141 */ -GLOBAL_ASM( -glabel aiShuffleInvestigationTerminals -/* f05bac0: 3c02800a */ lui $v0,%hi(g_Vars) -/* f05bac4: 24429fc0 */ addiu $v0,$v0,%lo(g_Vars) -/* f05bac8: 8c4e0434 */ lw $t6,0x434($v0) -/* f05bacc: 8c4f0438 */ lw $t7,0x438($v0) -/* f05bad0: 27bdffc8 */ addiu $sp,$sp,-56 -/* f05bad4: afb00014 */ sw $s0,0x14($sp) -/* f05bad8: afbf001c */ sw $ra,0x1c($sp) -/* f05badc: afb10018 */ sw $s1,0x18($sp) -/* f05bae0: 01cf8021 */ addu $s0,$t6,$t7 -/* f05bae4: 0fc2554a */ jal tagFindById -/* f05bae8: 92040002 */ lbu $a0,0x2($s0) -/* f05baec: 92040003 */ lbu $a0,0x3($s0) -/* f05baf0: 0fc2554a */ jal tagFindById -/* f05baf4: afa2002c */ sw $v0,0x2c($sp) -/* f05baf8: 0c004b70 */ jal random -/* f05bafc: 00408825 */ or $s1,$v0,$zero -/* f05bb00: 24010003 */ addiu $at,$zero,0x3 -/* f05bb04: 0041001b */ divu $zero,$v0,$at -/* f05bb08: 0000c010 */ mfhi $t8 -/* f05bb0c: a3b80037 */ sb $t8,0x37($sp) -/* f05bb10: 0c004b70 */ jal random -/* f05bb14: 00000000 */ sll $zero,$zero,0x0 -/* f05bb18: 24010003 */ addiu $at,$zero,0x3 -/* f05bb1c: 0041001b */ divu $zero,$v0,$at -/* f05bb20: 92080008 */ lbu $t0,0x8($s0) -/* f05bb24: 00002810 */ mfhi $a1 -/* f05bb28: 30b900ff */ andi $t9,$a1,0xff -/* f05bb2c: 03202825 */ or $a1,$t9,$zero -/* f05bb30: 1500006b */ bnez $t0,.L0f05bce0 -/* f05bb34: 8fa3002c */ lw $v1,0x2c($sp) -/* f05bb38: 93a60037 */ lbu $a2,0x37($sp) -/* f05bb3c: 24010001 */ addiu $at,$zero,0x1 -/* f05bb40: 14c0000e */ bnez $a2,.L0f05bb7c -/* f05bb44: 00000000 */ sll $zero,$zero,0x0 -/* f05bb48: 92040004 */ lbu $a0,0x4($s0) -/* f05bb4c: afa60020 */ sw $a2,0x20($sp) -/* f05bb50: a3b90036 */ sb $t9,0x36($sp) -/* f05bb54: 0fc2554a */ jal tagFindById -/* f05bb58: afa3002c */ sw $v1,0x2c($sp) -/* f05bb5c: 8fa3002c */ lw $v1,0x2c($sp) -/* f05bb60: 84490006 */ lh $t1,0x6($v0) -/* f05bb64: 93a50036 */ lbu $a1,0x36($sp) -/* f05bb68: 8fa60020 */ lw $a2,0x20($sp) -/* f05bb6c: a4690006 */ sh $t1,0x6($v1) -/* f05bb70: 8c4a000c */ lw $t2,0xc($v0) -/* f05bb74: 1000002c */ beqz $zero,.L0f05bc28 -/* f05bb78: ac6a000c */ sw $t2,0xc($v1) -.L0f05bb7c: -/* f05bb7c: 54c1000f */ bnel $a2,$at,.L0f05bbbc -/* f05bb80: 24010002 */ addiu $at,$zero,0x2 -/* f05bb84: 92040005 */ lbu $a0,0x5($s0) -/* f05bb88: afa60020 */ sw $a2,0x20($sp) -/* f05bb8c: a3a50036 */ sb $a1,0x36($sp) -/* f05bb90: 0fc2554a */ jal tagFindById -/* f05bb94: afa3002c */ sw $v1,0x2c($sp) -/* f05bb98: 8fa3002c */ lw $v1,0x2c($sp) -/* f05bb9c: 844b0006 */ lh $t3,0x6($v0) -/* f05bba0: 93a50036 */ lbu $a1,0x36($sp) -/* f05bba4: 8fa60020 */ lw $a2,0x20($sp) -/* f05bba8: a46b0006 */ sh $t3,0x6($v1) -/* f05bbac: 8c4c000c */ lw $t4,0xc($v0) -/* f05bbb0: 1000001d */ beqz $zero,.L0f05bc28 -/* f05bbb4: ac6c000c */ sw $t4,0xc($v1) -/* f05bbb8: 24010002 */ addiu $at,$zero,0x2 -.L0f05bbbc: -/* f05bbbc: 54c1000f */ bnel $a2,$at,.L0f05bbfc -/* f05bbc0: 92040007 */ lbu $a0,0x7($s0) -/* f05bbc4: 92040006 */ lbu $a0,0x6($s0) -/* f05bbc8: afa60020 */ sw $a2,0x20($sp) -/* f05bbcc: a3a50036 */ sb $a1,0x36($sp) -/* f05bbd0: 0fc2554a */ jal tagFindById -/* f05bbd4: afa3002c */ sw $v1,0x2c($sp) -/* f05bbd8: 8fa3002c */ lw $v1,0x2c($sp) -/* f05bbdc: 844d0006 */ lh $t5,0x6($v0) -/* f05bbe0: 93a50036 */ lbu $a1,0x36($sp) -/* f05bbe4: 8fa60020 */ lw $a2,0x20($sp) -/* f05bbe8: a46d0006 */ sh $t5,0x6($v1) -/* f05bbec: 8c4e000c */ lw $t6,0xc($v0) -/* f05bbf0: 1000000d */ beqz $zero,.L0f05bc28 -/* f05bbf4: ac6e000c */ sw $t6,0xc($v1) -/* f05bbf8: 92040007 */ lbu $a0,0x7($s0) -.L0f05bbfc: -/* f05bbfc: afa60020 */ sw $a2,0x20($sp) -/* f05bc00: a3a50036 */ sb $a1,0x36($sp) -/* f05bc04: 0fc2554a */ jal tagFindById -/* f05bc08: afa3002c */ sw $v1,0x2c($sp) -/* f05bc0c: 8fa3002c */ lw $v1,0x2c($sp) -/* f05bc10: 844f0006 */ lh $t7,0x6($v0) -/* f05bc14: 93a50036 */ lbu $a1,0x36($sp) -/* f05bc18: 8fa60020 */ lw $a2,0x20($sp) -/* f05bc1c: a46f0006 */ sh $t7,0x6($v1) -/* f05bc20: 8c58000c */ lw $t8,0xc($v0) -/* f05bc24: ac78000c */ sw $t8,0xc($v1) -.L0f05bc28: -/* f05bc28: 14c50006 */ bne $a2,$a1,.L0f05bc44 -/* f05bc2c: 00a01025 */ or $v0,$a1,$zero -/* f05bc30: 18400004 */ blez $v0,.L0f05bc44 -/* f05bc34: 00000000 */ sll $zero,$zero,0x0 -/* f05bc38: 24a5ffff */ addiu $a1,$a1,-1 -/* f05bc3c: 10000006 */ beqz $zero,.L0f05bc58 -/* f05bc40: 30a200ff */ andi $v0,$a1,0xff -.L0f05bc44: -/* f05bc44: 14c20004 */ bne $a2,$v0,.L0f05bc58 -/* f05bc48: 28410003 */ slti $at,$v0,0x3 -/* f05bc4c: 10200002 */ beqz $at,.L0f05bc58 -/* f05bc50: 24a50001 */ addiu $a1,$a1,0x1 -/* f05bc54: 30a200ff */ andi $v0,$a1,0xff -.L0f05bc58: -/* f05bc58: 14400008 */ bnez $v0,.L0f05bc7c -/* f05bc5c: 24010001 */ addiu $at,$zero,0x1 -/* f05bc60: 0fc2554a */ jal tagFindById -/* f05bc64: 92040004 */ lbu $a0,0x4($s0) -/* f05bc68: 84490006 */ lh $t1,0x6($v0) -/* f05bc6c: a6290006 */ sh $t1,0x6($s1) -/* f05bc70: 8c4a000c */ lw $t2,0xc($v0) -/* f05bc74: 1000001a */ beqz $zero,.L0f05bce0 -/* f05bc78: ae2a000c */ sw $t2,0xc($s1) -.L0f05bc7c: -/* f05bc7c: 54410009 */ bnel $v0,$at,.L0f05bca4 -/* f05bc80: 24010002 */ addiu $at,$zero,0x2 -/* f05bc84: 0fc2554a */ jal tagFindById -/* f05bc88: 92040005 */ lbu $a0,0x5($s0) -/* f05bc8c: 844b0006 */ lh $t3,0x6($v0) -/* f05bc90: a62b0006 */ sh $t3,0x6($s1) -/* f05bc94: 8c4c000c */ lw $t4,0xc($v0) -/* f05bc98: 10000011 */ beqz $zero,.L0f05bce0 -/* f05bc9c: ae2c000c */ sw $t4,0xc($s1) -/* f05bca0: 24010002 */ addiu $at,$zero,0x2 -.L0f05bca4: -/* f05bca4: 14410008 */ bne $v0,$at,.L0f05bcc8 -/* f05bca8: 00000000 */ sll $zero,$zero,0x0 -/* f05bcac: 0fc2554a */ jal tagFindById -/* f05bcb0: 92040006 */ lbu $a0,0x6($s0) -/* f05bcb4: 844d0006 */ lh $t5,0x6($v0) -/* f05bcb8: a62d0006 */ sh $t5,0x6($s1) -/* f05bcbc: 8c4e000c */ lw $t6,0xc($v0) -/* f05bcc0: 10000007 */ beqz $zero,.L0f05bce0 -/* f05bcc4: ae2e000c */ sw $t6,0xc($s1) -.L0f05bcc8: -/* f05bcc8: 0fc2554a */ jal tagFindById -/* f05bccc: 92040007 */ lbu $a0,0x7($s0) -/* f05bcd0: 844f0006 */ lh $t7,0x6($v0) -/* f05bcd4: a62f0006 */ sh $t7,0x6($s1) -/* f05bcd8: 8c58000c */ lw $t8,0xc($v0) -/* f05bcdc: ae38000c */ sw $t8,0xc($s1) -.L0f05bce0: -/* f05bce0: 3c03800a */ lui $v1,%hi(g_Vars) -/* f05bce4: 24639fc0 */ addiu $v1,$v1,%lo(g_Vars) -/* f05bce8: 8c790438 */ lw $t9,0x438($v1) -/* f05bcec: 8fbf001c */ lw $ra,0x1c($sp) -/* f05bcf0: 8fb00014 */ lw $s0,0x14($sp) -/* f05bcf4: 8fb10018 */ lw $s1,0x18($sp) -/* f05bcf8: 27280009 */ addiu $t0,$t9,0x9 -/* f05bcfc: ac680438 */ sw $t0,0x438($v1) -/* f05bd00: 27bd0038 */ addiu $sp,$sp,0x38 -/* f05bd04: 03e00008 */ jr $ra -/* f05bd08: 00001025 */ or $v0,$zero,$zero -); +bool aiShuffleInvestigationTerminals(void) +{ + // 2 = goodtag + // 3 = badtag + // 4 = pc1 + // 5 = pc2 + // 6 = pc3 + // 7 = pc4 + // 8 = always 00 -// Mismatch due to stack pointers misaligned -//bool aiShuffleInvestigationTerminals(void) -//{ -// // 2 = dst1 -// // 3 = dst2 -// // 4 = src1 -// // 5 = src2 -// // 6 = src3 -// // 7 = src4 -// // 8 = always 00 -// -// u8 *cmd = g_Vars.ailist + g_Vars.aioffset; -// struct tag *goodpc = tagFindById(cmd[2]); -// struct tag *badpc = tagFindById(cmd[3]); -// -// /** -// * @bug: These should be using modulus 4. Because it's 1 short, the final -// * else conditions are unreachable so only 3 of the 4 terminals can be -// * selected as the destination. -// */ -// u8 rand1 = random() % 3U; -// u8 rand2 = random() % 3U; -// -// if (cmd[8] == 0) { -// struct tag *dst; -// -// // Place the good terminal -// if (rand1 == 0) { -// dst = tagFindById(cmd[4]); -// goodpc->unk06 = dst->unk06; -// goodpc->obj = dst->obj; -// } else if (rand1 == 1) { -// dst = tagFindById(cmd[5]); -// goodpc->unk06 = dst->unk06; -// goodpc->obj = dst->obj; -// } else if (rand1 == 2) { -// dst = tagFindById(cmd[6]); -// goodpc->unk06 = dst->unk06; -// goodpc->obj = dst->obj; -// } else { -// dst = tagFindById(cmd[7]); -// goodpc->unk06 = dst->unk06; -// goodpc->obj = dst->obj; -// } -// -// // Handle both good and alarm terminals having the same destination -// if (rand2 == rand1 && rand2 > 0) { -// rand2--; -// } else if (rand2 == rand1 && rand2 < 3) { -// rand2++; -// } -// -// // Place the alarm terminal -// if (rand2 == 0) { -// dst = tagFindById(cmd[4]); -// badpc->unk06 = dst->unk06; -// badpc->obj = dst->obj; -// } else if (rand2 == 1) { -// dst = tagFindById(cmd[5]); -// badpc->unk06 = dst->unk06; -// badpc->obj = dst->obj; -// } else if (rand2 == 2) { -// dst = tagFindById(cmd[6]); -// badpc->unk06 = dst->unk06; -// badpc->obj = dst->obj; -// } else { -// dst = tagFindById(cmd[7]); -// badpc->unk06 = dst->unk06; -// badpc->obj = dst->obj; -// } -// } -// -// g_Vars.aioffset += 9; -// -// return false; -//} + u8 rand1; + u8 rand2; + u8 *cmd = g_Vars.ailist + g_Vars.aioffset; + struct tag *goodtag = tagFindById(cmd[2]); + struct tag *badtag = tagFindById(cmd[3]); + struct tag *pc; + + /** + * @bug: These should be using modulus 4. Because it's 1 short, the final + * else conditions are unreachable so only 3 of the 4 terminals can be + * selected as the destination. + */ + rand1 = random() % 3; + rand2 = random() % 3; + + if (cmd[8] == 0) { + // Place the good terminal + if (rand1 == 0) { + pc = tagFindById(cmd[4]); + goodtag->unk06 = pc->unk06; + goodtag->obj = pc->obj; + } else if (rand1 == 1) { + pc = tagFindById(cmd[5]); + goodtag->unk06 = pc->unk06; + goodtag->obj = pc->obj; + } else if (rand1 == 2) { + pc = tagFindById(cmd[6]); + goodtag->unk06 = pc->unk06; + goodtag->obj = pc->obj; + } else { + pc = tagFindById(cmd[7]); + goodtag->unk06 = pc->unk06; + goodtag->obj = pc->obj; + } + + // Handle both good and alarm terminals having the same destination + if (rand2 == rand1 && rand2 > 0) { + rand2--; + } else if (rand2 == rand1 && rand2 < 3) { + rand2++; + } + + // Place the alarm terminal + if (rand2 == 0) { + pc = tagFindById(cmd[4]); + badtag->unk06 = pc->unk06; + badtag->obj = pc->obj; + } else if (rand2 == 1) { + pc = tagFindById(cmd[5]); + badtag->unk06 = pc->unk06; + badtag->obj = pc->obj; + } else if (rand2 == 2) { + pc = tagFindById(cmd[6]); + badtag->unk06 = pc->unk06; + badtag->obj = pc->obj; + } else { + pc = tagFindById(cmd[7]); + badtag->unk06 = pc->unk06; + badtag->obj = pc->obj; + } + } + + g_Vars.aioffset += 9; + + return false; +} /** * @cmd 0142 diff --git a/src/include/commands.h b/src/include/commands.h index c239cf329..e0c5087cf 100644 --- a/src/include/commands.h +++ b/src/include/commands.h @@ -2719,14 +2719,14 @@ * It works by editing the dst object tags to repoint them to the good and alarm * terminals. */ -#define shuffle_investigation_terminals(dst1, dst2, src1, src2, src3, src4) \ +#define shuffle_investigation_terminals(goodtag, badtag, pc1, pc2, pc3, pc4) \ mkshort(0x0141), \ - dst1, \ - dst2, \ - src1, \ - src2, \ - src3, \ - src4, \ + goodtag, \ + badtag, \ + pc1, \ + pc2, \ + pc3, \ + pc4, \ 0x00, /**