Decompile chrGetAttackEntityRelativeAngle

This commit is contained in:
Ryan Dwyer 2021-05-23 13:17:37 +10:00
parent 152c955a6f
commit e3e2b948db
4 changed files with 47 additions and 76 deletions

View File

@ -1563,62 +1563,33 @@ f32 chrGetRangedArghSpeed(struct chrdata *chr, f32 min, f32 max)
return (max - min) * arghrating * 0.01f + min;
}
GLOBAL_ASM(
glabel chrGetRelativeAttackAngle
.late_rodata
glabel var7f1a8cf8
.word 0x38c907a9
glabel var7f1a8cfc
.word 0x40c907a9
.text
/* f02e2d0: 27bdffb8 */ addiu $sp,$sp,-72
/* f02e2d4: 30ae0002 */ andi $t6,$a1,0x2
/* f02e2d8: 11c00004 */ beqz $t6,.L0f02e2ec
/* f02e2dc: afbf001c */ sw $ra,0x1c($sp)
/* f02e2e0: 44800000 */ mtc1 $zero,$f0
/* f02e2e4: 1000001f */ b .L0f02e364
/* f02e2e8: 8fbf001c */ lw $ra,0x1c($sp)
.L0f02e2ec:
/* f02e2ec: 30af0010 */ andi $t7,$a1,0x10
/* f02e2f0: 11e00014 */ beqz $t7,.L0f02e344
/* f02e2f4: 27a70038 */ addiu $a3,$sp,0x38
/* f02e2f8: 44862000 */ mtc1 $a2,$f4
/* f02e2fc: 3c017f1b */ lui $at,%hi(var7f1a8cf8)
/* f02e300: c4288cf8 */ lwc1 $f8,%lo(var7f1a8cf8)($at)
/* f02e304: 468021a0 */ cvt.s.w $f6,$f4
/* f02e308: 46083302 */ mul.s $f12,$f6,$f8
/* f02e30c: 0fc0f917 */ jal chrGetInverseTheta
/* f02e310: e7ac0020 */ swc1 $f12,0x20($sp)
/* f02e314: c7ac0020 */ lwc1 $f12,0x20($sp)
/* f02e318: 44805000 */ mtc1 $zero,$f10
/* f02e31c: 3c017f1b */ lui $at,%hi(var7f1a8cfc)
/* f02e320: 46006081 */ sub.s $f2,$f12,$f0
/* f02e324: 460a103c */ c.lt.s $f2,$f10
/* f02e328: 00000000 */ nop
/* f02e32c: 45000003 */ bc1f .L0f02e33c
/* f02e330: 00000000 */ nop
/* f02e334: c4308cfc */ lwc1 $f16,%lo(var7f1a8cfc)($at)
/* f02e338: 46101080 */ add.s $f2,$f2,$f16
.L0f02e33c:
/* f02e33c: 10000008 */ b .L0f02e360
/* f02e340: 46001006 */ mov.s $f0,$f2
.L0f02e344:
/* f02e344: 27b80028 */ addiu $t8,$sp,0x28
/* f02e348: afb80010 */ sw $t8,0x10($sp)
/* f02e34c: 0fc122de */ jal func0f048b78
/* f02e350: afa40048 */ sw $a0,0x48($sp)
/* f02e354: 8fa40048 */ lw $a0,0x48($sp)
/* f02e358: 0fc122a1 */ jal chrGetAngleToPos
/* f02e35c: 27a50038 */ addiu $a1,$sp,0x38
.L0f02e360:
/* f02e360: 8fbf001c */ lw $ra,0x1c($sp)
.L0f02e364:
/* f02e364: 27bd0048 */ addiu $sp,$sp,0x48
/* f02e368: 03e00008 */ jr $ra
/* f02e36c: 00000000 */ nop
);
f32 chrGetAttackEntityRelativeAngle(struct chrdata *chr, u32 attackflags, s32 entityid)
{
f32 angle;
struct coord pos;
s16 rooms[8];
f32 chrGetDistanceToEntity(struct chrdata *chr, u32 attackflags, s32 entityid)
if (attackflags & ATTACKFLAG_AIMFORWARD) {
return 0;
}
if (attackflags & ATTACKFLAG_AIMATDIRECTION) {
angle = entityid * (M_BADTAU / 65536);
angle -= chrGetInverseTheta(chr);
if (angle < 0) {
angle += M_BADTAU;
}
return angle;
}
chrGetAttackEntityPos(chr, attackflags, entityid, &pos, rooms);
return chrGetAngleToPos(chr, &pos);
}
f32 chrGetAttackEntityDistance(struct chrdata *chr, u32 attackflags, s32 entityid)
{
if (attackflags & ATTACKFLAG_AIMATTARGET) {
return chrGetDistanceToTarget(chr);
@ -3849,7 +3820,7 @@ void chrAttack(struct chrdata *chr, struct attackanimgroup **animgroups, bool fl
struct prop *prop;
struct weaponobj *weapon;
s32 groupindex;
bool doneburst = false;
bool dooneburst = false;
s32 index;
bool everytick[] = {false, false};
bool singleshot[] = {false, false};
@ -3873,7 +3844,7 @@ void chrAttack(struct chrdata *chr, struct attackanimgroup **animgroups, bool fl
}
} else {
// Non-sniping animations: Choose animation based on angle to target
angle = chrGetRelativeAttackAngle(chr, attackflags, entityid);
angle = chrGetAttackEntityRelativeAngle(chr, attackflags, entityid);
if (flip) {
groupindex = (M_BADTAU - angle) * 5.0937690734863f + 0.5f;
@ -3909,7 +3880,7 @@ void chrAttack(struct chrdata *chr, struct attackanimgroup **animgroups, bool fl
}
} else {
dorecoil = false;
doneburst = true;
dooneburst = true;
}
// There's an easter egg here: Any guard with Chris T's head
@ -3946,7 +3917,7 @@ void chrAttack(struct chrdata *chr, struct attackanimgroup **animgroups, bool fl
chr->act_attack.singleshot[HAND_LEFT] = singleshot[HAND_LEFT];
chr->act_attack.singleshot[HAND_RIGHT] = singleshot[HAND_RIGHT];
chr->act_attack.dorecoil = dorecoil;
chr->act_attack.doneburst = doneburst;
chr->act_attack.dooneburst = dooneburst;
chr->act_attack.unk040 = 0;
chr->act_attack.numshots = 0;
@ -4014,7 +3985,7 @@ void chrAttackAmount(struct chrdata *chr, u32 attackflags, u32 entityid, u32 max
chr->actiontype = ACT_ATTACKAMOUNT;
chr->act_attack.numshots = 0;
chr->act_attack.maxshots = maxshots;
chr->act_attack.doneburst = false;
chr->act_attack.dooneburst = false;
}
#if PAL
@ -8489,7 +8460,7 @@ glabel chrCanSeeEntity
/* f038fd8: afaa0010 */ sw $t2,0x10($sp)
/* f038fdc: 8fa40078 */ lw $a0,0x78($sp)
/* f038fe0: 8fa50088 */ lw $a1,0x88($sp)
/* f038fe4: 0fc122de */ jal func0f048b78
/* f038fe4: 0fc122de */ jal chrGetAttackEntityPos
/* f038fe8: 8fa6008c */ lw $a2,0x8c($sp)
/* f038fec: 8fa40078 */ lw $a0,0x78($sp)
/* f038ff0: 0fc079ef */ jal chrSetOrUnsetHiddenFlag00000100
@ -10702,7 +10673,7 @@ glabel var7f1a8f08
/* f03c2e4: ae000030 */ sw $zero,0x30($s0)
/* f03c2e8: 8e060034 */ lw $a2,0x34($s0)
.L0f03c2ec:
/* f03c2ec: 0fc0b8b4 */ jal chrGetRelativeAttackAngle
/* f03c2ec: 0fc0b8b4 */ jal chrGetAttackEntityRelativeAngle
/* f03c2f0: afa300b4 */ sw $v1,0xb4($sp)
/* f03c2f4: 3c017f1b */ lui $at,%hi(var7f1a8edc)
/* f03c2f8: c4308edc */ lwc1 $f16,%lo(var7f1a8edc)($at)
@ -12383,7 +12354,7 @@ glabel var7f1a8f40
.L0f03e850:
/* f03e850: 8e05004c */ lw $a1,0x4c($s0)
/* f03e854: 8e060050 */ lw $a2,0x50($s0)
/* f03e858: 0fc0b8b4 */ jal chrGetRelativeAttackAngle
/* f03e858: 0fc0b8b4 */ jal chrGetAttackEntityRelativeAngle
/* f03e85c: e7ac0028 */ swc1 $f12,0x28($sp)
/* f03e860: 1000001a */ b .L0f03e8cc
/* f03e864: c7ac0028 */ lwc1 $f12,0x28($sp)
@ -12393,7 +12364,7 @@ glabel var7f1a8f40
/* f03e870: 02002025 */ or $a0,$s0,$zero
/* f03e874: 8e050030 */ lw $a1,0x30($s0)
/* f03e878: 8e060034 */ lw $a2,0x34($s0)
/* f03e87c: 0fc0b8b4 */ jal chrGetRelativeAttackAngle
/* f03e87c: 0fc0b8b4 */ jal chrGetAttackEntityRelativeAngle
/* f03e880: e7ac0028 */ swc1 $f12,0x28($sp)
/* f03e884: 10000011 */ b .L0f03e8cc
/* f03e888: c7ac0028 */ lwc1 $f12,0x28($sp)
@ -12404,7 +12375,7 @@ glabel var7f1a8f40
/* f03e898: 8e05002c */ lw $a1,0x2c($s0)
/* f03e89c: 8e060030 */ lw $a2,0x30($s0)
/* f03e8a0: e7ac0028 */ swc1 $f12,0x28($sp)
/* f03e8a4: 0fc0b8b4 */ jal chrGetRelativeAttackAngle
/* f03e8a4: 0fc0b8b4 */ jal chrGetAttackEntityRelativeAngle
/* f03e8a8: 02002025 */ or $a0,$s0,$zero
/* f03e8ac: 10000007 */ b .L0f03e8cc
/* f03e8b0: c7ac0028 */ lwc1 $f12,0x28($sp)
@ -13073,7 +13044,7 @@ glabel var7f1a8fc8
/* f03f140: 8fa40190 */ lw $a0,0x190($sp)
/* f03f144: 8fa50184 */ lw $a1,0x184($sp)
/* f03f148: 8fa60180 */ lw $a2,0x180($sp)
/* f03f14c: 0fc122de */ jal func0f048b78
/* f03f14c: 0fc122de */ jal chrGetAttackEntityPos
/* f03f150: 27a70154 */ addiu $a3,$sp,0x154
/* f03f154: c7a60154 */ lwc1 $f6,0x154($sp)
/* f03f158: c7a80134 */ lwc1 $f8,0x134($sp)
@ -20411,11 +20382,11 @@ void chrTickAttackAmount(struct chrdata *chr)
chrResetAimEndProperties(chr);
}
if (frame >= chr->act_attack.animcfg->unk18 && chr->act_attack.doneburst == false) {
chr->act_attack.doneburst = true;
if (frame >= chr->act_attack.animcfg->unk18 && chr->act_attack.dooneburst == false) {
chr->act_attack.dooneburst = true;
}
if (chr->act_attack.doneburst) {
if (chr->act_attack.dooneburst) {
if (chr->act_attack.numshots++ < chr->act_attack.maxshots) {
func0f03f988(chr, 0, 1);
} else {
@ -28818,7 +28789,7 @@ f32 chrGetAngleToTarget(struct chrdata *chr)
}
GLOBAL_ASM(
glabel func0f048b78
glabel chrGetAttackEntityPos
/* f048b78: 27bdff80 */ addiu $sp,$sp,-128
/* f048b7c: 30ae0004 */ andi $t6,$a1,0x4
/* f048b80: 11c0001f */ beqz $t6,.L0f048c00

View File

@ -54520,7 +54520,7 @@ glabel var7f1aa978
/* f083588: 8c85002c */ lw $a1,0x2c($a0)
.L0f08358c:
/* f08358c: 8c860030 */ lw $a2,0x30($a0)
/* f083590: 0fc0b8dc */ jal chrGetDistanceToEntity
/* f083590: 0fc0b8dc */ jal chrGetAttackEntityDistance
/* f083594: afa40088 */ sw $a0,0x88($sp)
/* f083598: 8fa40088 */ lw $a0,0x88($sp)
/* f08359c: 46000086 */ mov.s $f2,$f0
@ -55493,7 +55493,7 @@ glabel var7f1aa978
/* f083588: 8c85002c */ lw $a1,0x2c($a0)
.L0f08358c:
/* f08358c: 8c860030 */ lw $a2,0x30($a0)
/* f083590: 0fc0b8dc */ jal chrGetDistanceToEntity
/* f083590: 0fc0b8dc */ jal chrGetAttackEntityDistance
/* f083594: afa40088 */ sw $a0,0x88($sp)
/* f083598: 8fa40088 */ lw $a0,0x88($sp)
/* f08359c: 46000086 */ mov.s $f2,$f0

View File

@ -20,8 +20,8 @@ bool weaponIsOneHanded(struct prop *prop);
f32 chrGetRangedSpeed(struct chrdata *chr, f32 min, f32 max);
s32 chrGetPercentageOfSlowness(struct chrdata *chr, s32 percentage);
f32 chrGetRangedArghSpeed(struct chrdata *chr, f32 min, f32 max);
f32 chrGetRelativeAttackAngle(struct chrdata *chr, u32 attackflags, s32 entityid);
f32 chrGetDistanceToEntity(struct chrdata *chr, u32 attackflags, s32 entityid);
f32 chrGetAttackEntityRelativeAngle(struct chrdata *chr, u32 attackflags, s32 entityid);
f32 chrGetAttackEntityDistance(struct chrdata *chr, u32 attackflags, s32 entityid);
void func0f02e3dc(struct coord *a, struct coord *b, struct coord *c, struct coord *d, struct coord *dst);
void func0f02e4f8(struct coord *arg0, struct coord *arg1, struct coord *dst);
f32 func0f02e550(struct prop *prop, f32 arg1, f32 arg2, u32 arg3, f32 ymax, f32 ymin);
@ -181,7 +181,7 @@ void chrTick(struct chrdata *chr);
void func0f0482cc(u32 ailistid);
void func0f048398(void);
f32 chrGetAngleToPos(struct chrdata *chr, struct coord *pos);
u32 func0f048b78(void);
void chrGetAttackEntityPos(struct chrdata *chr, u32 attackflags, s32 entityid, struct coord *pos, s16 *rooms);
f32 chrGetAngleFromTargetsFov(struct chrdata *chr);
f32 chrGetVerticalAngleToTarget(struct chrdata *chr);
bool chrIsInTargetsFovX(struct chrdata *chr, u8 fov360);

View File

@ -1082,7 +1082,7 @@ struct act_attack {
/*0x34*/ s8 maxshots; // number of shots to attempt in this anim
/*0x35*/ s8 onehanded;
/*0x36*/ s8 dorecoil;
/*0x37*/ s8 doneburst;
/*0x37*/ s8 dooneburst;
/*0x38*/ u8 firegun[2]; // whether this gun is going to attempt to fire in this anim
/*0x3a*/ u8 everytick[2]; // whether gun's fire rate is high enough to fire on every tick
/*0x3c*/ u8 singleshot[2];