Decompile aiIfSafety2LessThan

This commit is contained in:
Ryan Dwyer 2022-08-07 10:41:37 +10:00
parent b00e534bf1
commit d828328563
3 changed files with 85 additions and 301 deletions

View File

@ -298,7 +298,7 @@ bool (*g_CommandPointers[])(void) = {
/*0x011d*/ aiIfChrHasHiddenFlag,
/*0x011e*/ aiIfHuman,
/*0x011f*/ aiIfSkedar,
/*0x0120*/ ai0120,
/*0x0120*/ aiIfSafety2LessThan,
/*0x0121*/ aiFindCover,
/*0x0122*/ aiFindCoverWithinDist,
/*0x0123*/ aiFindCoverOutsideDist,

View File

@ -6095,306 +6095,90 @@ bool aiIfSkedar(void)
/**
* @cmd 0120
*/
GLOBAL_ASM(
glabel ai0120
.late_rodata
glabel var7f1a9ce4
.word ai0120+0xb8 # f0593bc
glabel var7f1a9ce8
.word ai0120+0xb8 # f0593bc
glabel var7f1a9cec
.word ai0120+0xb8 # f0593bc
glabel var7f1a9cf0
.word ai0120+0xb8 # f0593bc
glabel var7f1a9cf4
.word ai0120+0xb8 # f0593bc
glabel var7f1a9cf8
.word ai0120+0xb8 # f0593bc
glabel var7f1a9cfc
.word ai0120+0xb8 # f0593bc
glabel var7f1a9d00
.word ai0120+0xb8 # f0593bc
glabel var7f1a9d04
.word ai0120+0x8c # f059390
glabel var7f1a9d08
.word ai0120+0x8c # f059390
glabel var7f1a9d0c
.word ai0120+0x8c # f059390
glabel var7f1a9d10
.word ai0120+0x8c # f059390
glabel var7f1a9d14
.word ai0120+0x8c # f059390
glabel var7f1a9d18
.word ai0120+0x8c # f059390
glabel var7f1a9d1c
.word ai0120+0x8c # f059390
glabel var7f1a9d20
.word ai0120+0x8c # f059390
glabel var7f1a9d24
.word ai0120+0x8c # f059390
glabel var7f1a9d28
.word ai0120+0x8c # f059390
glabel var7f1a9d2c
.word ai0120+0x9c # f0593a0
glabel var7f1a9d30
.word ai0120+0x8c # f059390
glabel var7f1a9d34
.word ai0120+0x9c # f0593a0
glabel var7f1a9d38
.word ai0120+0x9c # f0593a0
glabel var7f1a9d3c
.word ai0120+0x9c # f0593a0
glabel var7f1a9d40
.word ai0120+0x9c # f0593a0
glabel var7f1a9d44
.word ai0120+0xac # f0593b0
glabel var7f1a9d48
.word ai0120+0xb8 # f0593bc
glabel var7f1a9d4c
.word 0x455ac000
.text
/* f059304: 27bdffd0 */ addiu $sp,$sp,-48
/* f059308: afb30020 */ sw $s3,0x20($sp)
/* f05930c: 3c13800a */ lui $s3,%hi(g_Vars)
/* f059310: 26739fc0 */ addiu $s3,$s3,%lo(g_Vars)
/* f059314: 8e6e0434 */ lw $t6,0x434($s3)
/* f059318: 8e6f0438 */ lw $t7,0x438($s3)
/* f05931c: 8e790424 */ lw $t9,0x424($s3)
/* f059320: afbf0024 */ sw $ra,0x24($sp)
/* f059324: 01cfc021 */ addu $t8,$t6,$t7
/* f059328: afb2001c */ sw $s2,0x1c($sp)
/* f05932c: afb10018 */ sw $s1,0x18($sp)
/* f059330: afb00014 */ sw $s0,0x14($sp)
/* f059334: afb8002c */ sw $t8,0x2c($sp)
/* f059338: 0fc13380 */ jal teamGetChrIds
/* f05933c: 93240125 */ lbu $a0,0x125($t9)
/* f059340: 24080006 */ addiu $t0,$zero,0x6
/* f059344: 00408825 */ or $s1,$v0,$zero
/* f059348: a3a8002b */ sb $t0,0x2b($sp)
/* f05934c: 00009025 */ or $s2,$zero,$zero
/* f059350: 0fc12840 */ jal chrGetNumArghs
/* f059354: 8e640424 */ lw $a0,0x424($s3)
/* f059358: 18400002 */ blez $v0,.L0f059364
/* f05935c: 24090004 */ addiu $t1,$zero,0x4
/* f059360: a3a9002b */ sb $t1,0x2b($sp)
.L0f059364:
/* f059364: 0fc2866a */ jal bgunGetWeaponNum
/* f059368: 00002025 */ or $a0,$zero,$zero
/* f05936c: 244afffe */ addiu $t2,$v0,-2
/* f059370: 2d41001a */ sltiu $at,$t2,0x1a
/* f059374: 1020000e */ beqz $at,.L0f0593b0
/* f059378: 000a5080 */ sll $t2,$t2,0x2
/* f05937c: 3c017f1b */ lui $at,%hi(var7f1a9ce4)
/* f059380: 002a0821 */ addu $at,$at,$t2
/* f059384: 8c2a9ce4 */ lw $t2,%lo(var7f1a9ce4)($at)
/* f059388: 01400008 */ jr $t2
/* f05938c: 00000000 */ nop
/* f059390: 93ab002b */ lbu $t3,0x2b($sp)
/* f059394: 256cffff */ addiu $t4,$t3,-1
/* f059398: 10000008 */ b .L0f0593bc
/* f05939c: a3ac002b */ sb $t4,0x2b($sp)
/* f0593a0: 93ad002b */ lbu $t5,0x2b($sp)
/* f0593a4: 25aefffe */ addiu $t6,$t5,-2
/* f0593a8: 10000004 */ b .L0f0593bc
/* f0593ac: a3ae002b */ sb $t6,0x2b($sp)
.L0f0593b0:
/* f0593b0: 93af002b */ lbu $t7,0x2b($sp)
/* f0593b4: 25f80001 */ addiu $t8,$t7,0x1
/* f0593b8: a3b8002b */ sb $t8,0x2b($sp)
.L0f0593bc:
/* f0593bc: 86240000 */ lh $a0,0x0($s1)
/* f0593c0: 2401fffe */ addiu $at,$zero,-2
/* f0593c4: 1081002d */ beq $a0,$at,.L0f05947c
/* f0593c8: 00000000 */ nop
.L0f0593cc:
/* f0593cc: 0fc0a1dd */ jal chrFindByLiteralId
/* f0593d0: 00000000 */ nop
/* f0593d4: 10400024 */ beqz $v0,.L0f059468
/* f0593d8: 00408025 */ or $s0,$v0,$zero
/* f0593dc: 8c590020 */ lw $t9,0x20($v0)
/* f0593e0: 53200022 */ beqzl $t9,.L0f05946c
/* f0593e4: 86240002 */ lh $a0,0x2($s1)
/* f0593e8: 0fc0e6a5 */ jal chrIsDead
/* f0593ec: 00402025 */ or $a0,$v0,$zero
/* f0593f0: 5440001e */ bnezl $v0,.L0f05946c
/* f0593f4: 86240002 */ lh $a0,0x2($s1)
/* f0593f8: 82080007 */ lb $t0,0x7($s0)
/* f0593fc: 24010005 */ addiu $at,$zero,0x5
/* f059400: 5101001a */ beql $t0,$at,.L0f05946c
/* f059404: 86240002 */ lh $a0,0x2($s1)
/* f059408: 92090113 */ lbu $t1,0x113($s0)
/* f05940c: 29210065 */ slti $at,$t1,0x65
/* f059410: 54200016 */ bnezl $at,.L0f05946c
/* f059414: 86240002 */ lh $a0,0x2($s1)
/* f059418: 8e640424 */ lw $a0,0x424($s3)
/* f05941c: 920a02a2 */ lbu $t2,0x2a2($s0)
/* f059420: 908b02a2 */ lbu $t3,0x2a2($a0)
/* f059424: 554b0011 */ bnel $t2,$t3,.L0f05946c
/* f059428: 86240002 */ lh $a0,0x2($s1)
/* f05942c: 86050000 */ lh $a1,0x0($s0)
/* f059430: 848c0000 */ lh $t4,0x0($a0)
/* f059434: 50ac000d */ beql $a1,$t4,.L0f05946c
/* f059438: 86240002 */ lh $a0,0x2($s1)
/* f05943c: 0fc1272c */ jal chrGetDistanceToChr
/* f059440: 00000000 */ nop
/* f059444: 3c017f1b */ lui $at,%hi(var7f1a9d4c)
/* f059448: c4249d4c */ lwc1 $f4,%lo(var7f1a9d4c)($at)
/* f05944c: 4604003c */ c.lt.s $f0,$f4
/* f059450: 00000000 */ nop
/* f059454: 45020005 */ bc1fl .L0f05946c
/* f059458: 86240002 */ lh $a0,0x2($s1)
/* f05945c: 26520001 */ addiu $s2,$s2,0x1
/* f059460: 324d00ff */ andi $t5,$s2,0xff
/* f059464: 01a09025 */ or $s2,$t5,$zero
.L0f059468:
/* f059468: 86240002 */ lh $a0,0x2($s1)
.L0f05946c:
/* f05946c: 2401fffe */ addiu $at,$zero,-2
/* f059470: 26310002 */ addiu $s1,$s1,0x2
/* f059474: 1481ffd5 */ bne $a0,$at,.L0f0593cc
/* f059478: 00000000 */ nop
.L0f05947c:
/* f05947c: 16400005 */ bnez $s2,.L0f059494
/* f059480: 02401825 */ or $v1,$s2,$zero
/* f059484: 93ae002b */ lbu $t6,0x2b($sp)
/* f059488: 25cffffe */ addiu $t7,$t6,-2
/* f05948c: 10000006 */ b .L0f0594a8
/* f059490: a3af002b */ sb $t7,0x2b($sp)
.L0f059494:
/* f059494: 24010001 */ addiu $at,$zero,0x1
/* f059498: 14610003 */ bne $v1,$at,.L0f0594a8
/* f05949c: 93b8002b */ lbu $t8,0x2b($sp)
/* f0594a0: 2719ffff */ addiu $t9,$t8,-1
/* f0594a4: a3b9002b */ sb $t9,0x2b($sp)
.L0f0594a8:
/* f0594a8: 93a2002b */ lbu $v0,0x2b($sp)
/* f0594ac: 28410003 */ slti $at,$v0,0x3
/* f0594b0: 50200005 */ beqzl $at,.L0f0594c8
/* f0594b4: 8fa3002c */ lw $v1,0x2c($sp)
/* f0594b8: 50600003 */ beqzl $v1,.L0f0594c8
/* f0594bc: 8fa3002c */ lw $v1,0x2c($sp)
/* f0594c0: 24020003 */ addiu $v0,$zero,0x3
/* f0594c4: 8fa3002c */ lw $v1,0x2c($sp)
.L0f0594c8:
/* f0594c8: 90680002 */ lbu $t0,0x2($v1)
/* f0594cc: 0048082a */ slt $at,$v0,$t0
/* f0594d0: 50200008 */ beqzl $at,.L0f0594f4
/* f0594d4: 8e690438 */ lw $t1,0x438($s3)
/* f0594d8: 8e640434 */ lw $a0,0x434($s3)
/* f0594dc: 8e650438 */ lw $a1,0x438($s3)
/* f0594e0: 0fc13583 */ jal chraiGoToLabel
/* f0594e4: 90660003 */ lbu $a2,0x3($v1)
/* f0594e8: 10000004 */ b .L0f0594fc
/* f0594ec: ae620438 */ sw $v0,0x438($s3)
/* f0594f0: 8e690438 */ lw $t1,0x438($s3)
.L0f0594f4:
/* f0594f4: 252a0004 */ addiu $t2,$t1,0x4
/* f0594f8: ae6a0438 */ sw $t2,0x438($s3)
.L0f0594fc:
/* f0594fc: 8fbf0024 */ lw $ra,0x24($sp)
/* f059500: 8fb00014 */ lw $s0,0x14($sp)
/* f059504: 8fb10018 */ lw $s1,0x18($sp)
/* f059508: 8fb2001c */ lw $s2,0x1c($sp)
/* f05950c: 8fb30020 */ lw $s3,0x20($sp)
/* f059510: 27bd0030 */ addiu $sp,$sp,0x30
/* f059514: 03e00008 */ jr $ra
/* f059518: 00001025 */ or $v0,$zero,$zero
);
bool aiIfSafety2LessThan(void)
{
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
u8 score;
u8 numnearby;
s16 *chrnums = teamGetChrIds(g_Vars.chrdata->team);
// Mismatch: The below has an extra store to score and it's due to the
// `if (score);` trick. But removing it creates vastly different codegen.
// Could be related to the switch statement because cmd 0129 is similar and
// matches but has no switch.
//bool ai0120(void)
//{
// u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
// u8 score;
// u8 numnearby;
// s16 *chrnums = teamGetChrIds(g_Vars.chrdata->team);
//
// score = 6;
// numnearby = 0;
//
// // 350
// if (chrGetNumArghs(g_Vars.chrdata) > 0) {
// score -= 2;
// }
//
// switch (bgunGetWeaponNum(HAND_RIGHT)) {
// case WEAPON_CMP150:
// case WEAPON_CYCLONE:
// case WEAPON_CALLISTO:
// case WEAPON_RCP120:
// case WEAPON_LAPTOPGUN:
// case WEAPON_DRAGON:
// case WEAPON_K7AVENGER:
// case WEAPON_AR34:
// case WEAPON_SUPERDRAGON:
// case WEAPON_SHOTGUN:
// case WEAPON_SNIPERRIFLE:
// score--;
// break;
// case WEAPON_REAPER:
// case WEAPON_FARSIGHT:
// case WEAPON_DEVASTATOR:
// case WEAPON_ROCKETLAUNCHER:
// case WEAPON_SLAYER:
// score -= 2;
// break;
// default:
// score++;
// break;
// case WEAPON_FALCON2:
// case WEAPON_FALCON2_SILENCER:
// case WEAPON_FALCON2_SCOPE:
// case WEAPON_MAGSEC4:
// case WEAPON_MAULER:
// case WEAPON_PHOENIX:
// case WEAPON_DY357MAGNUM:
// case WEAPON_DY357LX:
// case WEAPON_CROSSBOW:
// break;
// }
//
// // 3bc
// while (*chrnums != -2) {
// struct chrdata *chr = chrFindByLiteralId(*chrnums);
//
// if (chr && chr->model
// && !chrIsDead(chr)
// && chr->actiontype != ACT_DEAD
// && chr->alertness > 100
// && g_Vars.chrdata->squadron == chr->squadron
// && g_Vars.chrdata->chrnum != chr->chrnum
// && chrGetDistanceToChr(g_Vars.chrdata, chr->chrnum) < 3500) {
// numnearby++;
// }
//
// chrnums++;
// }
//
// // 47c
// if (numnearby == 0) {
// score -= 2;
// } else if (numnearby == 1) {
// score--;
// }
//
// // 4a8
// if (score < 3 && numnearby != 0) {
// score = 3;
// }
//
// if (score);
//
// if (score < cmd[2]) {
// g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
// } else {
// g_Vars.aioffset += 4;
// }
//
// return false;
//}
score = 6;
numnearby = 0;
if (chrGetNumArghs(g_Vars.chrdata) > 0) {
score -= 2;
}
switch (bgunGetWeaponNum(HAND_RIGHT)) {
case WEAPON_FALCON2:
case WEAPON_FALCON2_SILENCER:
case WEAPON_FALCON2_SCOPE:
case WEAPON_MAGSEC4:
case WEAPON_MAULER:
case WEAPON_PHOENIX:
case WEAPON_DY357MAGNUM:
case WEAPON_DY357LX:
case WEAPON_CROSSBOW:
break;
case WEAPON_CMP150:
case WEAPON_CYCLONE:
case WEAPON_CALLISTO:
case WEAPON_RCP120:
case WEAPON_LAPTOPGUN:
case WEAPON_DRAGON:
case WEAPON_K7AVENGER:
case WEAPON_AR34:
case WEAPON_SUPERDRAGON:
case WEAPON_SHOTGUN:
case WEAPON_SNIPERRIFLE:
score--;
break;
case WEAPON_REAPER:
case WEAPON_FARSIGHT:
case WEAPON_DEVASTATOR:
case WEAPON_ROCKETLAUNCHER:
case WEAPON_SLAYER:
score -= 2;
break;
default:
score++;
break;
}
while (*chrnums != -2) {
struct chrdata *chr = chrFindByLiteralId(*chrnums);
if (chr && chr->model
&& !chrIsDead(chr)
&& chr->actiontype != ACT_DEAD
&& chr->alertness > 100
&& g_Vars.chrdata->squadron == chr->squadron
&& g_Vars.chrdata->chrnum != chr->chrnum
&& chrGetDistanceToChr(g_Vars.chrdata, chr->chrnum) < 3500) {
numnearby++;
}
chrnums++;
}
if (numnearby == 0) {
score -= 2;
} else if (numnearby == 1) {
score--;
}
if (score < 3 && numnearby != 0) {
score = 3;
}
if (score < cmd[2]) {
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
} else {
g_Vars.aioffset += 4;
}
return false;
}
/**
* @cmd 0121

View File

@ -289,7 +289,7 @@
/*0x011d*/ bool aiIfChrHasHiddenFlag(void);
/*0x011e*/ bool aiIfHuman(void);
/*0x011f*/ bool aiIfSkedar(void);
/*0x0120*/ bool ai0120(void);
/*0x0120*/ bool aiIfSafety2LessThan(void);
/*0x0121*/ bool aiFindCover(void);
/*0x0122*/ bool aiFindCoverWithinDist(void);
/*0x0123*/ bool aiFindCoverOutsideDist(void);