diff --git a/src/ov_SC01_077/ov_SC01_077_jr_8015AE2C.c b/src/ov_SC01_077/ov_SC01_077_jr_8015AE2C.c index e6cc9881aa..dfd8c17366 100644 --- a/src/ov_SC01_077/ov_SC01_077_jr_8015AE2C.c +++ b/src/ov_SC01_077/ov_SC01_077_jr_8015AE2C.c @@ -5926,7 +5926,84 @@ void func_80169B80(void *a0) { D_80189BF4[*(u16 *)((s32)a0 + 0x2)](); } -INCLUDE_ASM("asm/ov_SC01_077/nonmatchings/ov_SC01_077_jr_8015AE2C", func_80169BBC); +#include "common.h" + +extern s32 D_801269A4; +extern s32 D_801269A8; +extern s32 D_801269AC; +extern u16 D_80189B48[]; +extern u8 D_80189BB8[]; +extern u8 D_80189BE8[]; +extern u8 D_801DA9C8[]; + +extern void func_800D2318(void); +extern void RotMatrixYXZ(void *a0, void *a1); +extern void ApplyMatrixSV(void *a0, void *a1, void *a2); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern s32 func_800D222C(void *a0, void *a1, s32 a2); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_80048D9C(void *a0, void *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern void func_80146C3C(void); + +void func_80169BBC(s32 arg0) { + u16 rot[4]; + s16 vec[4]; + s32 pos[4]; + s16 mtx[16]; + s32 p1; + s32 s2; + + func_800D2318(); + rot[0] = *(u16 *)(arg0 + 0x12); + rot[1] = *(u16 *)(arg0 + 0x16); + rot[2] = 0; + RotMatrixYXZ(rot, mtx); + vec[0] = 0; + vec[1] = -2; + vec[2] = -0x14; + ApplyMatrixSV(mtx, vec, vec); + *(u16 *)(arg0 + 6) = *(u16 *)(arg0 + 6) + (u16)vec[0]; + *(u16 *)(arg0 + 0xA) = *(u16 *)(arg0 + 0xA) + (u16)vec[1]; + *(u16 *)(arg0 + 0xE) = *(u16 *)(arg0 + 0xE) + (u16)vec[2]; + p1 = func_80146A6C(9, (void *)arg0, *(s16 *)(arg0 + 6), *(s16 *)(arg0 + 0xA), + *(s16 *)(arg0 + 0xE), 0, 0); + if (p1 != 0) { + *(u16 *)(p1 + 0x12) = rot[0]; + *(u16 *)(p1 + 0x16) = rot[1]; + *(u16 *)(p1 + 0x1A) = rot[2]; + } + func_80146A6C(0xC, (void *)arg0, *(s16 *)(arg0 + 6), *(s16 *)(arg0 + 0xA), + *(s16 *)(arg0 + 0xE), 0, 0); + s2 = func_800D222C((void *)arg0, D_80189BE8, 0x17); + if (s2 != 0) { + *(s32 *)(arg0 + 0x20) = s2; + rot[0] = rot[0] + D_80189B48[*(s32 *)(arg0 + 0x30)]; + rot[1] = rot[1] - 0x400; + RotMatrixYXZ(rot, mtx); + pos[0] = D_801269A4 - *(s16 *)(arg0 + 6); + pos[1] = D_801269A8 - *(s16 *)(arg0 + 0xA); + pos[2] = D_801269AC - *(s16 *)(arg0 + 0xE); + ApplyTransposeMatrixLV(mtx, pos, pos); + rot[2] = -ratan2(pos[0], pos[1]); + vec[0] = 0x400; + vec[1] = -0x400; + vec[2] = 0; + RotMatrixYXZ(vec, mtx); + *(s32 *)(s2 + 0x34) = (s32)D_801DA9C8; + RotMatrixYXZ(rot, D_801DA9C8); + func_80048D9C(D_801DA9C8, mtx); + *(u16 *)(s2 + 0x18) = 0x5000; + *(u16 *)(s2 + 0x1A) = 0x2000; + *(s32 *)(s2 + 4) = *(s32 *)(s2 + 4) | 0xC000140; + func_80128EA8(s2, arg0 + 0x24, (s32)D_80189BB8); + *(u16 *)(arg0 + 2) = *(u16 *)(arg0 + 2) + 1; + } else { + ((void (*)(s32))func_80146C3C)(arg0); + } +} + DEFINE_func_80169E44() /* dedup: shared engine-core @0x80169E44 (src/shared) */