Decompile frChooseAutogunTarget

This commit is contained in:
Ryan Dwyer 2021-01-17 00:16:41 +10:00
parent 562d47398b
commit 6fe7d5d77b
1 changed files with 38 additions and 154 deletions

View File

@ -2091,161 +2091,45 @@ bool frIsTargetFacingPos(struct prop *prop, struct coord *pos)
return true;
}
GLOBAL_ASM(
glabel frChooseAutogunTarget
.late_rodata
glabel var7f1b94b8
.word 0x4096c5bf
glabel var7f1b94bc
.word 0x3fc90fdb
.text
/* f19f39c: 27bdff30 */ addiu $sp,$sp,-208
/* f19f3a0: f7b60018 */ sdc1 $f22,0x18($sp)
/* f19f3a4: 3c014e00 */ lui $at,0x4e00
/* f19f3a8: 4481b000 */ mtc1 $at,$f22
/* f19f3ac: f7b80020 */ sdc1 $f24,0x20($sp)
/* f19f3b0: 3c017f1c */ lui $at,%hi(var7f1b94b8)
/* f19f3b4: afb10030 */ sw $s1,0x30($sp)
/* f19f3b8: c43894b8 */ lwc1 $f24,%lo(var7f1b94b8)($at)
/* f19f3bc: afb50040 */ sw $s5,0x40($sp)
/* f19f3c0: afb4003c */ sw $s4,0x3c($sp)
/* f19f3c4: afb30038 */ sw $s3,0x38($sp)
/* f19f3c8: afb20034 */ sw $s2,0x34($sp)
/* f19f3cc: afb0002c */ sw $s0,0x2c($sp)
/* f19f3d0: f7b40010 */ sdc1 $f20,0x10($sp)
/* f19f3d4: 3c017f1c */ lui $at,%hi(var7f1b94bc)
/* f19f3d8: 3c11800b */ lui $s1,%hi(g_FrData)
/* f19f3dc: 00809825 */ or $s3,$a0,$zero
/* f19f3e0: afbf0044 */ sw $ra,0x44($sp)
/* f19f3e4: 00009025 */ or $s2,$zero,$zero
/* f19f3e8: 0000a825 */ or $s5,$zero,$zero
/* f19f3ec: 2631cd20 */ addiu $s1,$s1,%lo(g_FrData)
/* f19f3f0: c43494bc */ lwc1 $f20,%lo(var7f1b94bc)($at)
/* f19f3f4: 00008025 */ or $s0,$zero,$zero
/* f19f3f8: 27b40084 */ addiu $s4,$sp,0x84
.L0f19f3fc:
/* f19f3fc: 8e220010 */ lw $v0,0x10($s1)
/* f19f400: 000277c2 */ srl $t6,$v0,0x1f
/* f19f404: 11c00014 */ beqz $t6,.L0f19f458
/* f19f408: 0002c080 */ sll $t8,$v0,0x2
/* f19f40c: 07000012 */ bltz $t8,.L0f19f458
/* f19f410: 00024040 */ sll $t0,$v0,0x1
/* f19f414: 05010010 */ bgez $t0,.L0f19f458
/* f19f418: 02603025 */ or $a2,$s3,$zero
/* f19f41c: 8e240014 */ lw $a0,0x14($s1)
/* f19f420: 8e250038 */ lw $a1,0x38($s1)
/* f19f424: 0fc67ca5 */ jal frGetTargetAngleToPos
/* f19f428: 24840008 */ addiu $a0,$a0,0x8
/* f19f42c: 4600a03c */ c.lt.s $f20,$f0
/* f19f430: 00124880 */ sll $t1,$s2,0x2
/* f19f434: 02895021 */ addu $t2,$s4,$t1
/* f19f438: 45020006 */ bc1fl .L0f19f454
/* f19f43c: ad500000 */ sw $s0,0x0($t2)
/* f19f440: 4618003c */ c.lt.s $f0,$f24
/* f19f444: 00000000 */ nop
/* f19f448: 45030004 */ bc1tl .L0f19f45c
/* f19f44c: 26100001 */ addiu $s0,$s0,0x1
/* f19f450: ad500000 */ sw $s0,0x0($t2)
.L0f19f454:
/* f19f454: 26520001 */ addiu $s2,$s2,0x1
.L0f19f458:
/* f19f458: 26100001 */ addiu $s0,$s0,0x1
.L0f19f45c:
/* f19f45c: 2a010012 */ slti $at,$s0,0x12
/* f19f460: 1420ffe6 */ bnez $at,.L0f19f3fc
/* f19f464: 2631003c */ addiu $s1,$s1,0x3c
/* f19f468: 1a400021 */ blez $s2,.L0f19f4f0
/* f19f46c: 00008025 */ or $s0,$zero,$zero
/* f19f470: 3c04800b */ lui $a0,%hi(g_FrData)
/* f19f474: 2484cd20 */ addiu $a0,$a0,%lo(g_FrData)
/* f19f478: 27a30084 */ addiu $v1,$sp,0x84
/* f19f47c: c6700000 */ lwc1 $f16,0x0($s3)
/* f19f480: c6720004 */ lwc1 $f18,0x4($s3)
/* f19f484: c6740008 */ lwc1 $f20,0x8($s3)
/* f19f488: 2405003c */ addiu $a1,$zero,0x3c
.L0f19f48c:
/* f19f48c: 8c6b0000 */ lw $t3,0x0($v1)
/* f19f490: 26100001 */ addiu $s0,$s0,0x1
/* f19f494: 01650019 */ multu $t3,$a1
/* f19f498: 00006012 */ mflo $t4
/* f19f49c: 008c6821 */ addu $t5,$a0,$t4
/* f19f4a0: 8da20014 */ lw $v0,0x14($t5)
/* f19f4a4: c4440008 */ lwc1 $f4,0x8($v0)
/* f19f4a8: c446000c */ lwc1 $f6,0xc($v0)
/* f19f4ac: c4480010 */ lwc1 $f8,0x10($v0)
/* f19f4b0: 46102001 */ sub.s $f0,$f4,$f16
/* f19f4b4: 46123081 */ sub.s $f2,$f6,$f18
/* f19f4b8: 46000282 */ mul.s $f10,$f0,$f0
/* f19f4bc: 46144301 */ sub.s $f12,$f8,$f20
/* f19f4c0: 46021102 */ mul.s $f4,$f2,$f2
/* f19f4c4: 46045180 */ add.s $f6,$f10,$f4
/* f19f4c8: 460c6202 */ mul.s $f8,$f12,$f12
/* f19f4cc: 46083380 */ add.s $f14,$f6,$f8
/* f19f4d0: 4616703c */ c.lt.s $f14,$f22
/* f19f4d4: 00000000 */ nop
/* f19f4d8: 45000003 */ bc1f .L0f19f4e8
/* f19f4dc: 00000000 */ nop
/* f19f4e0: 46007586 */ mov.s $f22,$f14
/* f19f4e4: 0040a825 */ or $s5,$v0,$zero
.L0f19f4e8:
/* f19f4e8: 1612ffe8 */ bne $s0,$s2,.L0f19f48c
/* f19f4ec: 24630004 */ addiu $v1,$v1,0x4
.L0f19f4f0:
/* f19f4f0: 8fbf0044 */ lw $ra,0x44($sp)
/* f19f4f4: 02a01025 */ or $v0,$s5,$zero
/* f19f4f8: 8fb50040 */ lw $s5,0x40($sp)
/* f19f4fc: d7b40010 */ ldc1 $f20,0x10($sp)
/* f19f500: d7b60018 */ ldc1 $f22,0x18($sp)
/* f19f504: d7b80020 */ ldc1 $f24,0x20($sp)
/* f19f508: 8fb0002c */ lw $s0,0x2c($sp)
/* f19f50c: 8fb10030 */ lw $s1,0x30($sp)
/* f19f510: 8fb20034 */ lw $s2,0x34($sp)
/* f19f514: 8fb30038 */ lw $s3,0x38($sp)
/* f19f518: 8fb4003c */ lw $s4,0x3c($sp)
/* f19f51c: 03e00008 */ jr $ra
/* f19f520: 27bd00d0 */ addiu $sp,$sp,0xd0
);
struct prop *frChooseAutogunTarget(struct coord *autogunpos)
{
f32 closestdist = 0x20000000;
s32 facingtargets[ARRAYCOUNT(g_FrData.targets)];
s32 len = 0;
struct prop *closesttarget = NULL;
s32 i;
// Regalloc: s3 and s4 are swapped.
// s3 should be autogunpos and s4 should be facingtargets.
//struct prop *frChooseAutogunTarget(struct coord *autogunpos)
//{
// f32 closestdist = 0x20000000;
// s32 facingtargets[ARRAYCOUNT(g_FrData.targets)];
// s32 len = 0;
// struct prop *closesttarget = NULL;
// s32 i;
//
// // Make list of targets which are facing the laptop gun
// for (i = 0; i < ARRAYCOUNT(g_FrData.targets); i++) {
// if (g_FrData.targets[i].inuse
// && g_FrData.targets[i].destroyed == false
// && g_FrData.targets[i].active) {
// f32 angle = frGetTargetAngleToPos(&g_FrData.targets[i].prop->pos, g_FrData.targets[i].angle, autogunpos);
//
// //if (!(angle > BADDEG2RAD(90) && angle < BADDEG2RAD(270))) {
// if (!(angle > 1.5707963705063f && angle < 4.7116389274597f)) {
// facingtargets[len++] = i;
// }
// }
// }
//
// // Determine which of the facing targets is closest
// for (i = 0; i < len; i++) {
// struct prop *prop = g_FrData.targets[facingtargets[i]].prop;
// f32 xdiff = prop->pos.x - autogunpos->x;
// f32 ydiff = prop->pos.y - autogunpos->y;
// f32 zdiff = prop->pos.z - autogunpos->z;
// f32 dist = xdiff * xdiff + ydiff * ydiff + zdiff * zdiff;
//
// if (dist < closestdist) {
// closestdist = dist;
// closesttarget = prop;
// }
// }
//
// return closesttarget;
//}
// Make list of targets which are facing the laptop gun
for (i = 0; i < ARRAYCOUNT(g_FrData.targets); i++) {
if (g_FrData.targets[i].inuse
&& g_FrData.targets[i].destroyed == false
&& g_FrData.targets[i].active) {
f32 angle = frGetTargetAngleToPos(&g_FrData.targets[i].prop->pos, g_FrData.targets[i].angle, autogunpos);
if (!(angle > 1.5707963705063f && angle < 4.7116389274597f)) {
facingtargets[len++] = i;
}
}
}
// Determine which of the facing targets is closest
for (i = 0; i < len; i++) {
struct prop *prop = g_FrData.targets[facingtargets[i]].prop;
f32 xdiff = prop->pos.f[0] - autogunpos->f[0];
f32 ydiff = prop->pos.f[1] - autogunpos->f[1];
f32 zdiff = prop->pos.f[2] - autogunpos->f[2];
f32 dist = xdiff * xdiff + ydiff * ydiff + zdiff * zdiff;
if (dist < closestdist) {
closestdist = dist;
closesttarget = prop;
}
}
if (facingtargets);
return closesttarget;
}
bool frIsAmmoWasted(void)
{