From ae8e7a821db00cadee0ddda82f9f534f0e301e4f Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Wed, 19 Feb 2020 23:06:49 +1000 Subject: [PATCH] Decompile aiObjectDoAnimation --- src/game/chr/chraicommands.c | 223 +++++++-------------------- src/game/data/data_0083d0.c | 2 +- src/include/game/chr/chraicommands.h | 2 +- src/include/game/game_0b28d0.h | 2 +- src/include/game/game_157db0.h | 2 +- src/include/library/library_1a500.h | 6 +- src/include/types.h | 2 +- 7 files changed, 62 insertions(+), 177 deletions(-) diff --git a/src/game/chr/chraicommands.c b/src/game/chr/chraicommands.c index c3279b1b4..6c3b4112f 100644 --- a/src/game/chr/chraicommands.c +++ b/src/game/chr/chraicommands.c @@ -5434,178 +5434,63 @@ bool ai0175(void) return false; } + /** * @cmd 0112 */ -GLOBAL_ASM( -glabel ai0112 -/* f056f50: 3c0e800a */ lui $t6,0x800a -/* f056f54: 3c0f800a */ lui $t7,0x800a -/* f056f58: 8defa3f8 */ lw $t7,-0x5c08($t7) -/* f056f5c: 8dcea3f4 */ lw $t6,-0x5c0c($t6) -/* f056f60: 27bdffc8 */ addiu $sp,$sp,-56 -/* f056f64: afbf001c */ sw $ra,0x1c($sp) -/* f056f68: 01cf2821 */ addu $a1,$t6,$t7 -/* f056f6c: 90b80002 */ lbu $t8,0x2($a1) -/* f056f70: 90a80003 */ lbu $t0,0x3($a1) -/* f056f74: 3401ffff */ dli $at,0xffff -/* f056f78: 0018ca00 */ sll $t9,$t8,0x8 -/* f056f7c: 03284825 */ or $t1,$t9,$t0 -/* f056f80: a7a90032 */ sh $t1,0x32($sp) -/* f056f84: 90aa0006 */ lbu $t2,0x6($a1) -/* f056f88: 90ac0007 */ lbu $t4,0x7($a1) -/* f056f8c: 00001825 */ or $v1,$zero,$zero -/* f056f90: 000a5a00 */ sll $t3,$t2,0x8 -/* f056f94: 016c3025 */ or $a2,$t3,$t4 -/* f056f98: 54c10005 */ bnel $a2,$at,.L0f056fb0 -/* f056f9c: 3401fffe */ dli $at,0xfffe -/* f056fa0: 44801000 */ mtc1 $zero,$f2 -/* f056fa4: 1000001a */ beqz $zero,.L0f057010 -/* f056fa8: 90a40004 */ lbu $a0,0x4($a1) -/* f056fac: 3401fffe */ dli $at,0xfffe -.L0f056fb0: -/* f056fb0: 14c10013 */ bne $a2,$at,.L0f057000 -/* f056fb4: 87a40032 */ lh $a0,0x32($sp) -/* f056fb8: afa3002c */ sw $v1,0x2c($sp) -/* f056fbc: afa50034 */ sw $a1,0x34($sp) -/* f056fc0: 0c008dda */ jal func00023768 -/* f056fc4: afa60024 */ sw $a2,0x24($sp) -/* f056fc8: 244dfffe */ addiu $t5,$v0,-2 -/* f056fcc: 448d2000 */ mtc1 $t5,$f4 -/* f056fd0: 44803000 */ mtc1 $zero,$f6 -/* f056fd4: 8fa3002c */ lw $v1,0x2c($sp) -/* f056fd8: 468020a0 */ cvt.s.w $f2,$f4 -/* f056fdc: 8fa50034 */ lw $a1,0x34($sp) -/* f056fe0: 8fa60024 */ lw $a2,0x24($sp) -/* f056fe4: 4606103c */ c.lt.s $f2,$f6 -/* f056fe8: 00000000 */ sll $zero,$zero,0x0 -/* f056fec: 45020008 */ bc1fl .L0f057010 -/* f056ff0: 90a40004 */ lbu $a0,0x4($a1) -/* f056ff4: 44801000 */ mtc1 $zero,$f2 -/* f056ff8: 10000005 */ beqz $zero,.L0f057010 -/* f056ffc: 90a40004 */ lbu $a0,0x4($a1) -.L0f057000: -/* f057000: 44864000 */ mtc1 $a2,$f8 -/* f057004: 00000000 */ sll $zero,$zero,0x0 -/* f057008: 468040a0 */ cvt.s.w $f2,$f8 -/* f05700c: 90a40004 */ lbu $a0,0x4($a1) -.L0f057010: -/* f057010: 240100ff */ addiu $at,$zero,0xff -/* f057014: 3c02800a */ lui $v0,0x800a -/* f057018: 54810011 */ bnel $a0,$at,.L0f057060 -/* f05701c: afa50034 */ sw $a1,0x34($sp) -/* f057020: 8c42a3e4 */ lw $v0,-0x5c1c($v0) -/* f057024: 10400015 */ beqz $v0,.L0f05707c -/* f057028: 00000000 */ sll $zero,$zero,0x0 -/* f05702c: 8c4402e4 */ lw $a0,0x2e4($v0) -/* f057030: 04800012 */ bltz $a0,.L0f05707c -/* f057034: 00000000 */ sll $zero,$zero,0x0 -/* f057038: afa50034 */ sw $a1,0x34($sp) -/* f05703c: afa60024 */ sw $a2,0x24($sp) -/* f057040: 0fc2556c */ jal objFindByTagId -/* f057044: e7a20020 */ swc1 $f2,0x20($sp) -/* f057048: 8fa50034 */ lw $a1,0x34($sp) -/* f05704c: 8fa60024 */ lw $a2,0x24($sp) -/* f057050: c7a20020 */ lwc1 $f2,0x20($sp) -/* f057054: 10000009 */ beqz $zero,.L0f05707c -/* f057058: 00401825 */ or $v1,$v0,$zero -/* f05705c: afa50034 */ sw $a1,0x34($sp) -.L0f057060: -/* f057060: afa60024 */ sw $a2,0x24($sp) -/* f057064: 0fc2556c */ jal objFindByTagId -/* f057068: e7a20020 */ swc1 $f2,0x20($sp) -/* f05706c: 8fa50034 */ lw $a1,0x34($sp) -/* f057070: 8fa60024 */ lw $a2,0x24($sp) -/* f057074: c7a20020 */ lwc1 $f2,0x20($sp) -/* f057078: 00401825 */ or $v1,$v0,$zero -.L0f05707c: -/* f05707c: 10600049 */ beqz $v1,.L0f0571a4 -/* f057080: 00000000 */ sll $zero,$zero,0x0 -/* f057084: 8c6e0014 */ lw $t6,0x14($v1) -/* f057088: 11c00046 */ beqz $t6,.L0f0571a4 -/* f05708c: 00000000 */ sll $zero,$zero,0x0 -/* f057090: 8c6f0018 */ lw $t7,0x18($v1) -/* f057094: 8de40020 */ lw $a0,0x20($t7) -/* f057098: 1480000e */ bnez $a0,.L0f0570d4 -/* f05709c: 00000000 */ sll $zero,$zero,0x0 -/* f0570a0: afa3002c */ sw $v1,0x2c($sp) -/* f0570a4: afa50034 */ sw $a1,0x34($sp) -/* f0570a8: afa60024 */ sw $a2,0x24($sp) -/* f0570ac: 0fc2ccb9 */ jal func0f0b32e4 -/* f0570b0: e7a20020 */ swc1 $f2,0x20($sp) -/* f0570b4: 8fa3002c */ lw $v1,0x2c($sp) -/* f0570b8: 8fa50034 */ lw $a1,0x34($sp) -/* f0570bc: 8fa60024 */ lw $a2,0x24($sp) -/* f0570c0: 8c780018 */ lw $t8,0x18($v1) -/* f0570c4: c7a20020 */ lwc1 $f2,0x20($sp) -/* f0570c8: af020020 */ sw $v0,0x20($t8) -/* f0570cc: 8c790018 */ lw $t9,0x18($v1) -/* f0570d0: 8f240020 */ lw $a0,0x20($t9) -.L0f0570d4: -/* f0570d4: 10800033 */ beqz $a0,.L0f0571a4 -/* f0570d8: 00000000 */ sll $zero,$zero,0x0 -/* f0570dc: 90a80005 */ lbu $t0,0x5($a1) -/* f0570e0: 3c09800a */ lui $t1,0x800a -/* f0570e4: 8d29a48c */ lw $t1,-0x5b74($t1) -/* f0570e8: 44888000 */ mtc1 $t0,$f16 -/* f0570ec: 3c013f80 */ lui $at,0x3f80 -/* f0570f0: 44815000 */ mtc1 $at,$f10 -/* f0570f4: 468084a0 */ cvt.s.w $f18,$f16 -/* f0570f8: 3401fffe */ dli $at,0xfffe -/* f0570fc: 1120000d */ beqz $t1,.L0f057134 -/* f057100: 46125003 */ div.s $f0,$f10,$f18 -/* f057104: 10c1000b */ beq $a2,$at,.L0f057134 -/* f057108: 3c0a800a */ lui $t2,0x800a -/* f05710c: 8d4ade20 */ lw $t2,-0x21e0($t2) -/* f057110: 3c013e80 */ lui $at,0x3e80 -/* f057114: 44818000 */ mtc1 $at,$f16 -/* f057118: 448a2000 */ mtc1 $t2,$f4 -/* f05711c: 00000000 */ sll $zero,$zero,0x0 -/* f057120: 468021a0 */ cvt.s.w $f6,$f4 -/* f057124: 46003202 */ mul.s $f8,$f6,$f0 -/* f057128: 00000000 */ sll $zero,$zero,0x0 -/* f05712c: 46104282 */ mul.s $f10,$f8,$f16 -/* f057130: 460a1080 */ add.s $f2,$f2,$f10 -.L0f057134: -/* f057134: afa3002c */ sw $v1,0x2c($sp) -/* f057138: e7a00028 */ swc1 $f0,0x28($sp) -/* f05713c: 0c008c28 */ jal func000230a0 -/* f057140: e7a20020 */ swc1 $f2,0x20($sp) -/* f057144: 8fa3002c */ lw $v1,0x2c($sp) -/* f057148: c7a20020 */ lwc1 $f2,0x20($sp) -/* f05714c: c7a00028 */ lwc1 $f0,0x28($sp) -/* f057150: 44809000 */ mtc1 $zero,$f18 -/* f057154: 8c640018 */ lw $a0,0x18($v1) -/* f057158: 44071000 */ mfc1 $a3,$f2 -/* f05715c: 87a50032 */ lh $a1,0x32($sp) -/* f057160: 00003025 */ or $a2,$zero,$zero -/* f057164: e7a00010 */ swc1 $f0,0x10($sp) -/* f057168: 0c007733 */ jal func0001dccc -/* f05716c: e7b20014 */ swc1 $f18,0x14($sp) -/* f057170: 0fc57222 */ jal func0f15c888 -/* f057174: 00000000 */ sll $zero,$zero,0x0 -/* f057178: 8fa3002c */ lw $v1,0x2c($sp) -/* f05717c: 3c0142c8 */ lui $at,0x42c8 -/* f057180: 44814000 */ mtc1 $at,$f8 -/* f057184: 8c640018 */ lw $a0,0x18($v1) -/* f057188: c4840014 */ lwc1 $f4,0x14($a0) -/* f05718c: 46040182 */ mul.s $f6,$f0,$f4 -/* f057190: 00000000 */ sll $zero,$zero,0x0 -/* f057194: 46083402 */ mul.s $f16,$f6,$f8 -/* f057198: 44058000 */ mfc1 $a1,$f16 -/* f05719c: 0c006bd9 */ jal func0001af64 -/* f0571a0: 00000000 */ sll $zero,$zero,0x0 -.L0f0571a4: -/* f0571a4: 3c0b800a */ lui $t3,0x800a -/* f0571a8: 8d6ba3f8 */ lw $t3,-0x5c08($t3) -/* f0571ac: 8fbf001c */ lw $ra,0x1c($sp) -/* f0571b0: 3c01800a */ lui $at,0x800a -/* f0571b4: 256c0008 */ addiu $t4,$t3,0x8 -/* f0571b8: ac2ca3f8 */ sw $t4,-0x5c08($at) -/* f0571bc: 27bd0038 */ addiu $sp,$sp,0x38 -/* f0571c0: 03e00008 */ jr $ra -/* f0571c4: 00001025 */ or $v0,$zero,$zero -); +bool aiObjectDoAnimation(void) +{ + u8 *cmd = g_Vars.ailist + g_Vars.aioffset; + s16 anim_id = cmd[3] | (cmd[2] << 8); + struct defaultobj *obj = NULL; + f32 thing; + s32 startframe = cmd[7] | (cmd[6] << 8); + f32 fstartframe; + + if (startframe == 0xffff) { + fstartframe = 0; + } else if (startframe == 0xfffe) { + fstartframe = func00023768(anim_id) - 2; + + if (fstartframe < 0) { + fstartframe = 0; + } + } else { + fstartframe = startframe; + } + + if (cmd[4] == 255) { + if (g_Vars.chrdata && g_Vars.chrdata->myspecial >= 0) { + obj = objFindByTagId(g_Vars.chrdata->myspecial); + } + } else { + obj = objFindByTagId(cmd[4]); + } + + if (obj && obj->prop) { + struct anim *anim = obj->unk18->anim; + + if (obj->unk18->anim == NULL) { + obj->unk18->anim = func0f0b32e4(); + } + + if (obj->unk18->anim) { + thing = 1.0f / (s32)cmd[5]; + + if (g_Vars.in_cutscene && startframe != 0xfffe) { + fstartframe += var8009de20 * thing * 0.25f; + } + + func000230a0(obj->unk18->anim); + func0001dccc(obj->unk18, anim_id, 0, fstartframe, thing, 0); + func0001af64(obj->unk18, func0f15c888() * obj->unk18->unk14 * 100.0f); + } + } + + g_Vars.aioffset += 8; + + return false; +} /** * @cmd 0114 diff --git a/src/game/data/data_0083d0.c b/src/game/data/data_0083d0.c index 591f1f4d3..7995e4c92 100644 --- a/src/game/data/data_0083d0.c +++ b/src/game/data/data_0083d0.c @@ -6491,7 +6491,7 @@ bool (*g_CommandPointers[])(void) = { /*0x010f*/ aiIfChrShieldLessThan, /*0x0110*/ aiIfChrShieldGreaterThan, /*0x0111*/ aiSetCameraAnimation, - /*0x0112*/ ai0112, + /*0x0112*/ aiObjectDoAnimation, /*0x0113*/ aiIfInCutscene, /*0x0114*/ aiShowChr, /*0x0115*/ aiHideChr, diff --git a/src/include/game/chr/chraicommands.h b/src/include/game/chr/chraicommands.h index 2a987c802..bb49c154d 100644 --- a/src/include/game/chr/chraicommands.h +++ b/src/include/game/chr/chraicommands.h @@ -274,7 +274,7 @@ /*0x010f*/ bool aiIfChrShieldLessThan(void); /*0x0110*/ bool aiIfChrShieldGreaterThan(void); /*0x0111*/ bool aiSetCameraAnimation(void); -/*0x0112*/ bool ai0112(void); +/*0x0112*/ bool aiObjectDoAnimation(void); /*0x0113*/ bool aiIfInCutscene(void); /*0x0114*/ bool aiShowChr(void); /*0x0115*/ bool aiHideChr(void); diff --git a/src/include/game/game_0b28d0.h b/src/include/game/game_0b28d0.h index dc0e06f4a..525f6e40b 100644 --- a/src/include/game/game_0b28d0.h +++ b/src/include/game/game_0b28d0.h @@ -10,7 +10,7 @@ u32 func0f0b30ac(void); u32 func0f0b30cc(void); u32 func0f0b3280(void); u32 func0f0b32a0(void); -u32 func0f0b32e4(void); +struct anim *func0f0b32e4(void); u32 func0f0b3338(void); #endif diff --git a/src/include/game/game_157db0.h b/src/include/game/game_157db0.h index d594acba7..f8d571952 100644 --- a/src/include/game/game_157db0.h +++ b/src/include/game/game_157db0.h @@ -27,7 +27,7 @@ u32 func0f15b534(void); u32 func0f15b908(void); u32 func0f15c850(void); u32 func0f15c880(void); -u32 func0f15c888(void); +f32 func0f15c888(void); u32 func0f15c8b8(void); u32 func0f15c8c8(void); u32 func0f15c920(void); diff --git a/src/include/library/library_1a500.h b/src/include/library/library_1a500.h index 0eb1462b1..dbbbcef3a 100644 --- a/src/include/library/library_1a500.h +++ b/src/include/library/library_1a500.h @@ -26,7 +26,7 @@ u32 func0001ad5c(void); f32 func0001ae44(struct chr020 *chr020); void func0001ae90(struct chr020 *chr020, f32 arg1); u32 func0001af58(void); -u32 func0001af64(void); +void func0001af64(struct chr020 *chr020, f32 arg1); f32 func0001af80(struct chr020 *chr020); u32 func0001af98(void); f32 func0001afe8(f32 arg0, f32 distance, f32 arg2); @@ -62,7 +62,7 @@ u32 func0001d4fc(void); u32 func0001d62c(void); u32 func0001db94(struct chr020 *chr020); u32 func0001dbfc(void); -void func0001dccc(struct chr020 *chr020, s32 animnum, s32 flip, f32 arg3, f32 arg4, f32 arg5); +void func0001dccc(struct chr020 *chr020, s32 animnum, s32 flip, f32 fstartframe, f32 arg4, f32 arg5); u32 func0001dd90(void); u32 func0001ddec(void); void func0001de1c(struct chr020 *chr020, f32 arg1); @@ -97,7 +97,7 @@ u32 func00022b68(void); void func00022d24(void *data); u32 func00022d50(void); u32 func00022fa4(void); -u32 func000230a0(void); +bool func000230a0(struct anim *anim); u32 func00023108(void); u32 func0002319c(void); u32 func00023314(void); diff --git a/src/include/types.h b/src/include/types.h index 6bd782c3e..a3f2936ab 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -610,7 +610,7 @@ struct chrdata { /*0x2e1*/ u8 cloakfade_06 : 1; /*0x2e2*/ u8 teamscandist; /*0x2e3*/ u8 naturalanim[1]; - /*0x2e4*/ u32 myspecial; + /*0x2e4*/ s32 myspecial; // This is an object tag ID /*0x2e8*/ f32 timeextra; /*0x2ec*/ f32 elapseextra; /*0x2f0*/ struct coord extraspeed;