diff --git a/src/ov_SC01_074/ov_SC01_074_jr_8017BE9C.c b/src/ov_SC01_074/ov_SC01_074_jr_8017BE9C.c index 197b8fece4..673a6076dd 100644 --- a/src/ov_SC01_074/ov_SC01_074_jr_8017BE9C.c +++ b/src/ov_SC01_074/ov_SC01_074_jr_8017BE9C.c @@ -3488,7 +3488,56 @@ extern s32 func_8012AD50(void *a0); INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_8017BE9C", func_8017E07C); -INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_8017BE9C", func_8017E158); +#include "common.h" + +/* identical layout to SVECTOR_8016E7C8 (src/shared/engine_types.h); + own tag so this draft compiles standalone via match_one (no shared TU). */ +typedef struct { short vx, vy, vz, pad; } SVEC_8017E158; + +void func_8017E158(SVEC_8017E158 *p0, SVEC_8017E158 *p1) { + /* conform to the sibling TU's canon (`extern void func_8012EF70(s32, s32);`) + and read the GTE flag through a cast at the call. */ + extern void func_8012EF70(s32 a0, s32 a1); + extern void func_8017E3E0(void *a0, void *a1, void *a2, void *a3); + + SVEC_8017E158 prev; + SVEC_8017E158 cur; + SVEC_8017E158 lo0; + SVEC_8017E158 lo1; + SVEC_8017E158 sv0; + SVEC_8017E158 sv1; + SVEC_8017E158 sv2; + SVEC_8017E158 sv3; + s32 more; + + more = 1; + cur = *p0; + do { + prev = cur; + cur.vz += 0x40; + cur.vy = p0->vy + (p1->vy - p0->vy) * (cur.vz - p0->vz) / (p1->vz - p0->vz); + if (cur.vz >= p1->vz) { + cur.vz = p1->vz; + more = 0; + } + lo0 = prev; + lo0.vy -= 4; + lo1 = cur; + lo1.vy -= 4; + if ((((s32 (*)(void *, void *))func_8012EF70)(&lo0, &sv0) & ~0x1000) == 0 && + (((s32 (*)(void *, void *))func_8012EF70)(&lo1, &sv1) & ~0x1000) == 0) { + lo0 = prev; + lo0.vy += 4; + lo1 = cur; + lo1.vy += 4; + if ((((s32 (*)(void *, void *))func_8012EF70)(&lo0, &sv2) & ~0x1000) == 0 && + (((s32 (*)(void *, void *))func_8012EF70)(&lo1, &sv3) & ~0x1000) == 0) { + func_8017E3E0(&sv0, &sv1, &sv2, &sv3); + } + } + } while (more); +} +