From aa03070e6dfcd7eba1d2e6741173facdc53d7c26 Mon Sep 17 00:00:00 2001 From: Drew T <50529377+Druthulu@users.noreply.github.com> Date: Sat, 29 Aug 2026 18:25:50 -0600 Subject: [PATCH] =?UTF-8?q?feat(decomp):=20family-remap-hnorm=20gate=20?= =?UTF-8?q?=E2=80=94=20+2=20fns=20x0=20propagated=20(fleet=2098.9%)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ov_SC03_030/ov_SC03_030_jr_8017AE2C.c | 115 +++++++++++++++++++++- 1 file changed, 113 insertions(+), 2 deletions(-) diff --git a/src/ov_SC03_030/ov_SC03_030_jr_8017AE2C.c b/src/ov_SC03_030/ov_SC03_030_jr_8017AE2C.c index 749268465..421d4d4fc 100644 --- a/src/ov_SC03_030/ov_SC03_030_jr_8017AE2C.c +++ b/src/ov_SC03_030/ov_SC03_030_jr_8017AE2C.c @@ -3436,7 +3436,96 @@ void func_8017C18C(s32 a0) { DEFINE_func_8017C230() /* dedup: shared engine-core @0x8017C230 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8017AE2C", func_8017C294); +typedef struct { s16 vx, vy; } DVEC2_C59C; + + + + + +typedef struct { s16 vx, vy, vz, pad; } SVEC_BEBC; + +extern s32 func_800491EC(void); +extern void func_8017C66C(u16 *a0, void *a1); +extern int func_8017C710(short *param_1, short *param_2, short *param_3, int param_4); +extern void func_8017C908(s32 a0, s32 a1); + +void func_8017C294(void *a0, void *a1, s32 a2) +{ + SVEC_BEBC corner[4]; + SVEC_BEBC view[4]; + SVEC_BEBC hit[4]; + SVEC_BEBC org; + SVEC_BEBC eye; + s16 *rect = (s16 *)a0; + s32 i; + s32 x0, y0, x1, y1; + s16 m; + s32 d; + s32 z; + s16 u, v; + s32 mnx, mnz, mxx, mxz; + + x0 = rect[0]; + y0 = rect[1]; + x1 = x0 + rect[2]; + y1 = y0 + rect[3]; + m = (rect[2] < rect[3]) ? rect[3] : rect[2]; + d = (s16)(m / 20); + z = func_800491EC(); + + corner[0].vx = x0; corner[0].vy = y0; corner[0].vz = z; + corner[1].vx = x1; corner[1].vy = y0; corner[1].vz = z; + corner[2].vx = x0; corner[2].vy = y1; corner[2].vz = z; + corner[3].vx = x1; corner[3].vy = y1; corner[3].vz = z; + + org.vx = 0; + org.vy = 0; + org.vz = 0; + func_8017C66C((u16 *)&org, &eye); + + for (i = 0; i < 4; i++) { + func_8017C66C((u16 *)&corner[i], &view[i]); + if (func_8017C710((short *)&eye, (short *)&view[i], (short *)&hit[i], a2)) { + func_8017C908((s32)&hit[i], (s32)&corner[i]); + corner[i].vx = (corner[i].vx < x0 - d) ? (x0 - d) + : ((corner[i].vx > x1 + d) ? (x1 + d) : corner[i].vx); + corner[i].vy = (corner[i].vy < y0 - d) ? (y0 - d) + : ((corner[i].vy > y1 + d) ? (y1 + d) : corner[i].vy); + func_8017C66C((u16 *)&corner[i], &view[i]); + func_8017C710((short *)&eye, (short *)&view[i], (short *)&hit[i], a2); + } + } + + v = (hit[2].vx > hit[3].vx) ? hit[3].vx : hit[2].vx; + u = (hit[0].vx > hit[1].vx) ? hit[1].vx : hit[0].vx; + if (u > v) u = v; + mnx = u; + if (eye.vx < mnx) mnx = eye.vx; + + v = (hit[2].vz > hit[3].vz) ? hit[3].vz : hit[2].vz; + u = (hit[0].vz > hit[1].vz) ? hit[1].vz : hit[0].vz; + if (u > v) u = v; + mnz = u; + if (eye.vz < mnz) mnz = eye.vz; + + v = (hit[2].vx < hit[3].vx) ? hit[3].vx : hit[2].vx; + u = (hit[0].vx < hit[1].vx) ? hit[1].vx : hit[0].vx; + if (u < v) u = v; + mxx = u; + if (mxx < eye.vx) mxx = eye.vx; + + v = (hit[2].vz < hit[3].vz) ? hit[3].vz : hit[2].vz; + u = (hit[0].vz < hit[1].vz) ? hit[1].vz : hit[0].vz; + if (u < v) u = v; + mxz = u; + if (mxz < eye.vz) mxz = eye.vz; + + ((s16 *)a1)[0] = mnx; + ((s16 *)a1)[1] = mnz; + ((s16 *)a1)[2] = mxx - mnx; + ((s16 *)a1)[3] = mxz - mnz; +} + DEFINE_func_8017C66C() /* dedup: shared engine-core @0x8017C66C (src/shared) */ @@ -4781,7 +4870,29 @@ void func_8017ED30(void *a0) { } -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8017AE2C", func_8017ED6C); + + +extern void func_8012C1B8(void); +extern void func_8001C214(s32 a0, s32 a1); +extern void func_8017F018(s32); +extern s32 func_8012AD50(void *a0); +extern s32 D_801DF018; +extern s32 D_8118596C; + +void func_8017ED6C(s32 a0) +{ + s32 s1 = a0; + s32 s0; + + if ((*(s32 *)(s1 + 0x20) = s0 = ((s32 (*)(void))func_8012C1B8)()) == 0) goto L_end; + func_8001C214(s0, (s32)&D_801DF018); + *(s32 *)(s0 + 0x20) = (s32)&D_8118596C; + ((void (*)(u8 *))func_8017F018)((u8 *)s1); + func_8012AD50((void *)s1); +L_end: + return; +} + #include "common.h"