From 3e04e7b31c17088dd2c2e0678d59b74fbe214e64 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Sat, 30 May 2020 14:48:28 +1000 Subject: [PATCH] Discover face_cover AI command and decompile chrFaceCover --- src/game/chr/chraction.c | 63 ++++++++-------------------- src/game/chr/chrai.c | 2 +- src/game/chr/chraicommands.c | 4 +- src/include/commands.h | 7 +++- src/include/game/chr/chraction.h | 2 +- src/include/game/chr/chraicommands.h | 2 +- src/include/types.h | 2 +- 7 files changed, 29 insertions(+), 53 deletions(-) diff --git a/src/game/chr/chraction.c b/src/game/chr/chraction.c index 543ad75c9..02d98dad7 100644 --- a/src/game/chr/chraction.c +++ b/src/game/chr/chraction.c @@ -901,52 +901,23 @@ void chrStand(struct chrdata *chr) } } -GLOBAL_ASM( -glabel func0f02ec94 -.late_rodata -glabel var7f1a8d00 -.word 0x46230028 -.text -/* f02ec94: 27bdffd0 */ addiu $sp,$sp,-48 -/* f02ec98: afb00018 */ sw $s0,0x18($sp) -/* f02ec9c: 00808025 */ or $s0,$a0,$zero -/* f02eca0: afbf001c */ sw $ra,0x1c($sp) -/* f02eca4: 84840292 */ lh $a0,0x292($a0) -/* f02eca8: 0fc458b8 */ jal coverLoad -/* f02ecac: 27a50020 */ addiu $a1,$sp,0x20 -/* f02ecb0: 14400003 */ bnez $v0,.L0f02ecc0 -/* f02ecb4: 00000000 */ sll $zero,$zero,0x0 -/* f02ecb8: 10000016 */ beqz $zero,.L0f02ed14 -/* f02ecbc: 00001025 */ or $v0,$zero,$zero -.L0f02ecc0: -/* f02ecc0: 0fc0baaf */ jal chrStand -/* f02ecc4: 02002025 */ or $a0,$s0,$zero -/* f02ecc8: 240e0010 */ addiu $t6,$zero,0x10 -/* f02eccc: 240f0001 */ addiu $t7,$zero,0x1 -/* f02ecd0: ae000038 */ sw $zero,0x38($s0) -/* f02ecd4: ae0e0030 */ sw $t6,0x30($s0) -/* f02ecd8: ae0f003c */ sw $t7,0x3c($s0) -/* f02ecdc: 8fb80024 */ lw $t8,0x24($sp) -/* f02ece0: c70c0000 */ lwc1 $f12,0x0($t8) -/* f02ece4: c70e0008 */ lwc1 $f14,0x8($t8) -/* f02ece8: 46006307 */ neg.s $f12,$f12 -/* f02ecec: 0fc259d4 */ jal func0f096750 -/* f02ecf0: 46007387 */ neg.s $f14,$f14 -/* f02ecf4: 3c017f1b */ lui $at,%hi(var7f1a8d00) -/* f02ecf8: c4248d00 */ lwc1 $f4,%lo(var7f1a8d00)($at) -/* f02ecfc: 24020001 */ addiu $v0,$zero,0x1 -/* f02ed00: 46040182 */ mul.s $f6,$f0,$f4 -/* f02ed04: 4600320d */ trunc.w.s $f8,$f6 -/* f02ed08: 44084000 */ mfc1 $t0,$f8 -/* f02ed0c: 00000000 */ sll $zero,$zero,0x0 -/* f02ed10: ae080034 */ sw $t0,0x34($s0) -.L0f02ed14: -/* f02ed14: 8fbf001c */ lw $ra,0x1c($sp) -/* f02ed18: 8fb00018 */ lw $s0,0x18($sp) -/* f02ed1c: 27bd0030 */ addiu $sp,$sp,0x30 -/* f02ed20: 03e00008 */ jr $ra -/* f02ed24: 00000000 */ sll $zero,$zero,0x0 -); +bool chrFaceCover(struct chrdata *chr) +{ + struct cover cover; + + if (!coverLoad(chr->cover, &cover)) { + return false; + } + + chrStand(chr); + chr->act_stand.unk038 = 0; + chr->act_stand.face_entitytype = ENTITYTYPE_DIRECTION; + chr->act_stand.unk03c = 1; + //chr->act_stand.face_entityid = func0f096750(-cover.look->x, -cover.look->z) * (0x4000 / DEG2RAD(90)); + chr->act_stand.face_entityid = func0f096750(-cover.look->x, -cover.look->z) * 10432.039f; + + return true; +} void func0f02ed28(struct chrdata *chr, f32 arg1) { diff --git a/src/game/chr/chrai.c b/src/game/chr/chrai.c index 082767b93..0b12e94af 100644 --- a/src/game/chr/chrai.c +++ b/src/game/chr/chrai.c @@ -334,7 +334,7 @@ bool (*g_CommandPointers[])(void) = { /*0x0139*/ ai0139, /*0x013a*/ aiSetChrPresetToUnalertedTeammate, /*0x013b*/ aiSetSquadron, - /*0x013c*/ ai013c, + /*0x013c*/ aiFaceCover, /*0x013d*/ aiIfDangerousObjectNearby, /*0x013e*/ ai013e, /*0x013f*/ aiIfHeliWeaponsArmed, diff --git a/src/game/chr/chraicommands.c b/src/game/chr/chraicommands.c index 6c9524d84..2a339ecbc 100644 --- a/src/game/chr/chraicommands.c +++ b/src/game/chr/chraicommands.c @@ -8928,11 +8928,11 @@ bool aiSetSquadron(void) /** * @cmd 013c */ -bool ai013c(void) +bool aiFaceCover(void) { u8 *cmd = g_Vars.ailist + g_Vars.aioffset; - if (func0f02ec94(g_Vars.chrdata)) { + if (chrFaceCover(g_Vars.chrdata)) { g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]); } else { g_Vars.aioffset += 3; diff --git a/src/include/commands.h b/src/include/commands.h index 35e6a0ffe..f79c73e87 100644 --- a/src/include/commands.h +++ b/src/include/commands.h @@ -2856,7 +2856,12 @@ mkshort(0x013b), \ id, -#define cmd013c(label) \ +/** + * Makes the current chr face their cover spot. Or face away from it. Not sure. + * + * The cover spot must have been assigned to the chr already. + */ +#define face_cover(label) \ mkshort(0x013c), \ label, diff --git a/src/include/game/chr/chraction.h b/src/include/game/chr/chraction.h index 0a249f040..15a3a003e 100644 --- a/src/include/game/chr/chraction.h +++ b/src/include/game/chr/chraction.h @@ -17,7 +17,7 @@ u32 func0f02e550(void); u32 func0f02e684(void); void func0f02e6dc(struct chrdata *chr, f32 arg1); void chrStand(struct chrdata *chr); -u32 func0f02ec94(struct chrdata *chr); +u32 chrFaceCover(struct chrdata *chr); void func0f02ed88(struct chrdata *chr); void func0f02ef40(struct chrdata *chr); void func0f02f070(struct chrdata *chr); diff --git a/src/include/game/chr/chraicommands.h b/src/include/game/chr/chraicommands.h index 84e68fab3..2d2205554 100644 --- a/src/include/game/chr/chraicommands.h +++ b/src/include/game/chr/chraicommands.h @@ -314,7 +314,7 @@ /*0x0139*/ bool ai0139(void); /*0x013a*/ bool aiSetChrPresetToUnalertedTeammate(void); /*0x013b*/ bool aiSetSquadron(void); -/*0x013c*/ bool ai013c(void); +/*0x013c*/ bool aiFaceCover(void); /*0x013d*/ bool aiIfDangerousObjectNearby(void); /*0x013e*/ bool ai013e(void); /*0x013f*/ bool aiIfHeliWeaponsArmed(void); diff --git a/src/include/types.h b/src/include/types.h index f9fbaa70c..d9c4feaef 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -352,7 +352,7 @@ struct aibot { struct act_stand { /*0x2c*/ s32 unk02c; /*0x30*/ u32 face_entitytype; - /*0x34*/ u32 face_entityid; + /*0x34*/ s32 face_entityid; /*0x38*/ u32 unk038; /*0x3c*/ s32 unk03c; /*0x40*/ u32 unk040;