Decompile frChooseFarsightTarget

This commit is contained in:
Ryan Dwyer 2021-05-02 21:45:20 +10:00
parent 1d2b32f45b
commit 6ff0cda75b
1 changed files with 42 additions and 164 deletions

View File

@ -6916,171 +6916,49 @@ void func0f1a0924(struct prop *prop)
}
}
GLOBAL_ASM(
glabel frChooseFarsightTarget
/* f1a0a70: 27bdffa0 */ addiu $sp,$sp,-96
/* f1a0a74: f7bc0030 */ sdc1 $f28,0x30($sp)
/* f1a0a78: 3c013f80 */ lui $at,0x3f80
/* f1a0a7c: 4481e000 */ mtc1 $at,$f28
/* f1a0a80: f7be0038 */ sdc1 $f30,0x38($sp)
/* f1a0a84: 3c01bf80 */ lui $at,0xbf80
/* f1a0a88: afbf005c */ sw $ra,0x5c($sp)
/* f1a0a8c: afb50058 */ sw $s5,0x58($sp)
/* f1a0a90: afb40054 */ sw $s4,0x54($sp)
/* f1a0a94: 4481f000 */ mtc1 $at,$f30
/* f1a0a98: afb30050 */ sw $s3,0x50($sp)
/* f1a0a9c: afb2004c */ sw $s2,0x4c($sp)
/* f1a0aa0: afb10048 */ sw $s1,0x48($sp)
/* f1a0aa4: afb00044 */ sw $s0,0x44($sp)
/* f1a0aa8: f7ba0028 */ sdc1 $f26,0x28($sp)
/* f1a0aac: f7b80020 */ sdc1 $f24,0x20($sp)
/* f1a0ab0: f7b60018 */ sdc1 $f22,0x18($sp)
/* f1a0ab4: f7b40010 */ sdc1 $f20,0x10($sp)
/* f1a0ab8: 0000a025 */ or $s4,$zero,$zero
/* f1a0abc: 0000a825 */ or $s5,$zero,$zero
/* f1a0ac0: 0fc2866a */ jal handGetWeaponNum
/* f1a0ac4: 00002025 */ or $a0,$zero,$zero
/* f1a0ac8: 24010016 */ addiu $at,$zero,0x16
/* f1a0acc: 14410042 */ bne $v0,$at,.L0f1a0bd8
/* f1a0ad0: 3c11800b */ lui $s1,%hi(g_FrData)
/* f1a0ad4: 3c13800b */ lui $s3,%hi(g_FrData+0x438)
/* f1a0ad8: 3c12800a */ lui $s2,%hi(g_Vars)
/* f1a0adc: 4480d000 */ mtc1 $zero,$f26
/* f1a0ae0: 26529fc0 */ addiu $s2,$s2,%lo(g_Vars)
/* f1a0ae4: 2673d158 */ addiu $s3,$s3,%lo(g_FrData+0x438)
/* f1a0ae8: 2631cd20 */ addiu $s1,$s1,%lo(g_FrData)
/* f1a0aec: 8e220010 */ lw $v0,0x10($s1)
.L0f1a0af0:
/* f1a0af0: 000277c2 */ srl $t6,$v0,0x1f
/* f1a0af4: 11c00035 */ beqz $t6,.L0f1a0bcc
/* f1a0af8: 0002c080 */ sll $t8,$v0,0x2
/* f1a0afc: 07000033 */ bltz $t8,.L0f1a0bcc
/* f1a0b00: 00024040 */ sll $t0,$v0,0x1
/* f1a0b04: 05030032 */ bgezl $t0,.L0f1a0bd0
/* f1a0b08: 2631003c */ addiu $s1,$s1,0x3c
/* f1a0b0c: 92290040 */ lbu $t1,0x40($s1)
/* f1a0b10: 312a0040 */ andi $t2,$t1,0x40
/* f1a0b14: 5140002e */ beqzl $t2,.L0f1a0bd0
/* f1a0b18: 2631003c */ addiu $s1,$s1,0x3c
/* f1a0b1c: 8e300014 */ lw $s0,0x14($s1)
/* f1a0b20: 8e420284 */ lw $v0,0x284($s2)
/* f1a0b24: c6060008 */ lwc1 $f6,0x8($s0)
/* f1a0b28: c444037c */ lwc1 $f4,0x37c($v0)
/* f1a0b2c: c60a000c */ lwc1 $f10,0xc($s0)
/* f1a0b30: c4480380 */ lwc1 $f8,0x380($v0)
/* f1a0b34: 46062501 */ sub.s $f20,$f4,$f6
/* f1a0b38: c6120010 */ lwc1 $f18,0x10($s0)
/* f1a0b3c: c4500384 */ lwc1 $f16,0x384($v0)
/* f1a0b40: 460a4581 */ sub.s $f22,$f8,$f10
/* f1a0b44: 4614a102 */ mul.s $f4,$f20,$f20
/* f1a0b48: 46128601 */ sub.s $f24,$f16,$f18
/* f1a0b4c: 4616b182 */ mul.s $f6,$f22,$f22
/* f1a0b50: 46062200 */ add.s $f8,$f4,$f6
/* f1a0b54: 4618c282 */ mul.s $f10,$f24,$f24
/* f1a0b58: 0c012974 */ jal sqrtf
/* f1a0b5c: 460a4300 */ add.s $f12,$f8,$f10
/* f1a0b60: 4600d03c */ c.lt.s $f26,$f0
/* f1a0b64: 00000000 */ nop
/* f1a0b68: 45020019 */ bc1fl .L0f1a0bd0
/* f1a0b6c: 2631003c */ addiu $s1,$s1,0x3c
/* f1a0b70: 8e420284 */ lw $v0,0x284($s2)
/* f1a0b74: c4500388 */ lwc1 $f16,0x388($v0)
/* f1a0b78: c444038c */ lwc1 $f4,0x38c($v0)
/* f1a0b7c: c44a0390 */ lwc1 $f10,0x390($v0)
/* f1a0b80: 4610a482 */ mul.s $f18,$f20,$f16
/* f1a0b84: 00000000 */ nop
/* f1a0b88: 4604b182 */ mul.s $f6,$f22,$f4
/* f1a0b8c: 46069200 */ add.s $f8,$f18,$f6
/* f1a0b90: 46185402 */ mul.s $f16,$f10,$f24
/* f1a0b94: 46088100 */ add.s $f4,$f16,$f8
/* f1a0b98: 46002083 */ div.s $f2,$f4,$f0
/* f1a0b9c: 461a103c */ c.lt.s $f2,$f26
/* f1a0ba0: 00000000 */ nop
/* f1a0ba4: 45000009 */ bc1f .L0f1a0bcc
/* f1a0ba8: 00000000 */ nop
/* f1a0bac: 461c103c */ c.lt.s $f2,$f28
/* f1a0bb0: 00000000 */ nop
/* f1a0bb4: 45020006 */ bc1fl .L0f1a0bd0
/* f1a0bb8: 2631003c */ addiu $s1,$s1,0x3c
/* f1a0bbc: 46001706 */ mov.s $f28,$f2
/* f1a0bc0: 0200a025 */ or $s4,$s0,$zero
/* f1a0bc4: 46000786 */ mov.s $f30,$f0
/* f1a0bc8: 24150001 */ addiu $s5,$zero,0x1
.L0f1a0bcc:
/* f1a0bcc: 2631003c */ addiu $s1,$s1,0x3c
.L0f1a0bd0:
/* f1a0bd0: 5633ffc7 */ bnel $s1,$s3,.L0f1a0af0
/* f1a0bd4: 8e220010 */ lw $v0,0x10($s1)
.L0f1a0bd8:
/* f1a0bd8: 3c12800a */ lui $s2,%hi(g_Vars)
/* f1a0bdc: 26529fc0 */ addiu $s2,$s2,%lo(g_Vars)
/* f1a0be0: 8e4b0284 */ lw $t3,0x284($s2)
/* f1a0be4: 02a01025 */ or $v0,$s5,$zero
/* f1a0be8: e57e0258 */ swc1 $f30,0x258($t3)
/* f1a0bec: 8e4c0284 */ lw $t4,0x284($s2)
/* f1a0bf0: ad94025c */ sw $s4,0x25c($t4)
/* f1a0bf4: 8fbf005c */ lw $ra,0x5c($sp)
/* f1a0bf8: 8fb50058 */ lw $s5,0x58($sp)
/* f1a0bfc: 8fb40054 */ lw $s4,0x54($sp)
/* f1a0c00: 8fb30050 */ lw $s3,0x50($sp)
/* f1a0c04: 8fb2004c */ lw $s2,0x4c($sp)
/* f1a0c08: 8fb10048 */ lw $s1,0x48($sp)
/* f1a0c0c: 8fb00044 */ lw $s0,0x44($sp)
/* f1a0c10: d7be0038 */ ldc1 $f30,0x38($sp)
/* f1a0c14: d7bc0030 */ ldc1 $f28,0x30($sp)
/* f1a0c18: d7ba0028 */ ldc1 $f26,0x28($sp)
/* f1a0c1c: d7b80020 */ ldc1 $f24,0x20($sp)
/* f1a0c20: d7b60018 */ ldc1 $f22,0x18($sp)
/* f1a0c24: d7b40010 */ ldc1 $f20,0x10($sp)
/* f1a0c28: 03e00008 */ jr $ra
/* f1a0c2c: 27bd0060 */ addiu $sp,$sp,0x60
);
bool frChooseFarsightTarget(void)
{
struct prop *bestprop = NULL;
f32 bestvalue = 1;
f32 bestdist = -1;
bool found = false;
s32 i;
// Mismatch because f26 and f28 are swapped and the multiplication order for
// travelspeed is different. f26 should be constant 0 (used in dist > 0 and
// value < 0 checks) and f28 should be bestvalue.
//bool frChooseFarsightTarget(void)
//{
// f32 bestvalue = 1;
// f32 bestdist = -1;
// struct prop *bestprop = NULL;
// bool found = false;
// s32 i;
//
// if (handGetWeaponNum(0) == WEAPON_FARSIGHT) {
// 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
// && g_FrData.targets[i].flags & FRTARGETFLAG_FARSIGHTAUTOTARGETABLE) {
// struct prop *prop = g_FrData.targets[i].prop;
// f32 xdiff = g_Vars.currentplayer->bond2.unk10.x - prop->pos.x;
// f32 ydiff = g_Vars.currentplayer->bond2.unk10.y - prop->pos.y;
// f32 zdiff = g_Vars.currentplayer->bond2.unk10.z - prop->pos.z;
// f32 dist = sqrtf(xdiff * xdiff + ydiff * ydiff + zdiff * zdiff);
//
// if (dist > 0) {
// f32 value = (
// g_Vars.currentplayer->bond2.unk1c.x * xdiff +
// g_Vars.currentplayer->bond2.unk1c.y * ydiff +
// g_Vars.currentplayer->bond2.unk1c.z * zdiff) / dist;
//
// if (value < 0 && value < bestvalue) {
// bestvalue = value;
// bestprop = prop;
// bestdist = dist;
// found = true;
// }
// }
// }
// }
// }
//
// g_Vars.currentplayer->autoeraserdist = bestdist;
// g_Vars.currentplayer->autoerasertarget = bestprop;
//
// return found;
//}
if (handGetWeaponNum(HAND_RIGHT) == WEAPON_FARSIGHT) {
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
&& g_FrData.targets[i].flags & FRTARGETFLAG_FARSIGHTAUTOTARGETABLE) {
struct prop *prop = g_FrData.targets[i].prop;
f32 xdiff = g_Vars.currentplayer->bond2.unk10.x - prop->pos.x;
f32 ydiff = g_Vars.currentplayer->bond2.unk10.y - prop->pos.y;
f32 zdiff = g_Vars.currentplayer->bond2.unk10.z - prop->pos.z;
f32 dist = sqrtf(xdiff * xdiff + ydiff * ydiff + zdiff * zdiff);
if (dist > 0) {
f32 value = (xdiff * g_Vars.currentplayer->bond2.unk1c.f[0]
+ ydiff * g_Vars.currentplayer->bond2.unk1c.f[1]
+ zdiff * g_Vars.currentplayer->bond2.unk1c.f[2]) / dist;
if (value);
if (value < 0 && value < bestvalue) {
bestvalue = value;
bestprop = prop;
bestdist = dist;
found = true;
}
}
}
}
}
g_Vars.currentplayer->autoeraserdist = bestdist;
g_Vars.currentplayer->autoerasertarget = bestprop;
return found;
}
s32 frIsInTraining(void)
{