From a3d642a12a2fb7b9140fc45ebb52fd7f3fed3778 Mon Sep 17 00:00:00 2001 From: Drew T <50529377+Druthulu@users.noreply.github.com> Date: Thu, 13 Aug 2026 11:29:45 -0600 Subject: [PATCH] =?UTF-8?q?feat(decomp):=20worker=20gate=20=E2=80=94=20+2?= =?UTF-8?q?=20fns=20x0=20propagated=20(fleet=2095.2%)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ov_SC06_008/ov_SC06_008_jr_8017C294.c | 165 +++++++++++++++++++++- 1 file changed, 163 insertions(+), 2 deletions(-) diff --git a/src/ov_SC06_008/ov_SC06_008_jr_8017C294.c b/src/ov_SC06_008/ov_SC06_008_jr_8017C294.c index 0c7d5afe5..d04081f7c 100644 --- a/src/ov_SC06_008/ov_SC06_008_jr_8017C294.c +++ b/src/ov_SC06_008/ov_SC06_008_jr_8017C294.c @@ -3379,7 +3379,124 @@ void func_8017D5A4(s32 param_1, s16 *param_2) { } -INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_8017C294", func_8017D73C); +#include "common.h" + +/* func_8017D73C -- ov_SC06_008 / ov_SC06_008_jr_8017C294 + * Adapted from the byte-matched sibling func_8017FAC0 (src/ov_SC02_026/ov_SC02_026_jr_8017C180.c). + * Symbol surface renamed per this TU's own .s (asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_8017C294/func_8017D73C.s). + * Semantic edits vs the seed (measured against the target .s): + * 1. The 3x20-entry scan loops use a variable trip count `n` instead of the seed's fixed 20: + * n = 0x14; if (*(s16 *)(a0 + 0x70) >= 2) { n = 0x10; } + * 2. The tail func_8002D59C calls read entity field +0x36 (u16) where the seed reads +0x70 + * (a different field on this entity type -- confirmed directly off the target .s + * `lhu $a2, 0x36($s3)` at both call sites, not caught by the site-diff card). + */ + +typedef struct { + u16 x; /* 0x00 */ + u16 y; /* 0x02 */ + u16 z; /* 0x04 */ + u16 w; /* 0x06 */ +} V4_8017D73C; + +extern u16 D_80126B62; +extern u16 D_80126B96; +extern u16 D_80189324[]; +extern u16 D_8018934C[]; +extern u16 D_80189374[]; +extern void (*D_8018939C[])(s32); +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012BD14(s32 a0); +extern void func_8002D59C(s32 a0, u16 a1, s32 a2); + +void func_8017D73C(s32 a0) { + + V4_8017D73C p1; + V4_8017D73C p2; + V4_8017D73C unused0; + V4_8017D73C unused1; + V4_8017D73C unused2; + s32 i; + s32 t; + s32 y; + s32 ret; + s32 n; + + t = *(s16 *)(a0 + 0xA) + 0x20; + y = *(s16 *)&D_80126B62 - t; + if (y < -0x110) { + y = -0x110; + } else if (y > 0) { + y = 0; + } + + n = 0x14; + if (*(s16 *)(a0 + 0x70) >= 2) { + n = 0x10; + } + + p1.y = y; + p2.y = y; + i = 0; + if (n != 0) { + do { + p1.x = D_80189324[i]; + p1.z = D_80189324[i + 1]; + p2.x = D_80189324[i + 2]; + p2.z = D_80189324[i + 3]; + if (func_8012DEB8(a0, (s32)&p1, (s32)&p2) == 1) { + D_80126B96 = 0x4004; + } + i += 4; + } while (i < n); + } + + __asm__ ("" : "=r"(n) : "0"(n)); + i = 0; + if (n != 0) { + do { + p1.x = D_8018934C[i]; + p1.z = D_8018934C[i + 1]; + p2.x = D_8018934C[i + 2]; + p2.z = D_8018934C[i + 3]; + if (func_8012DEB8(a0, (s32)&p1, (s32)&p2) == 1) { + D_80126B96 = 0x4004; + } + i += 4; + } while (i < n); + } + + __asm__ ("" : "=r"(n) : "0"(n)); + i = 0; + if (n != 0) { + do { + p1.x = D_80189374[i]; + p1.z = D_80189374[i + 1]; + p2.x = D_80189374[i + 2]; + p2.z = D_80189374[i + 3]; + if (func_8012DEB8(a0, (s32)&p1, (s32)&p2) == 1) { + D_80126B96 = 0x4004; + } + i += 4; + } while (i < n); + } + + D_8018939C[*(u16 *)(a0 + 0x2)](a0); + + ret = func_8012BD14(a0); + if (ret > 0x3FFFF) { + *(s16 *)(a0 + 0xFE) = 1; + func_8002D59C(4, 0x609, *(u16 *)(a0 + 0x36)); + } else { + *(s16 *)(a0 + 0xFE) = *(u16 *)(a0 + 0xFE) - 1; + if (*(s16 *)(a0 + 0xFE) == 0) { + *(s16 *)(a0 + 0xFE) = 4; + func_8002D59C(0x609, ((0x40000 - ret) * 127) / 0x40000 | 0x1000, + *(u16 *)(a0 + 0x36)); + } + } +} + INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_8017C294", func_8017DA00); @@ -6546,7 +6663,51 @@ void func_80183658(s32 a0) { void func_80183748(void) { } -INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_8017C294", func_80183750); +extern s32 func_80047948(s32 a0); +extern s32 func_8004787C(s32 a0); +extern void func_8012B370(s32 a0); + +void func_80183750(s32 a0) +{ + register s32 s0 asm("$16") = a0; + register s32 v0 asm("$2"); + register s32 v1 asm("$3"); + s32 temp; + + v0 = *(s16 *)(*(s32 *)(s0 + 0x20) + 0x14); + + if (v0 < 0x401) { + v0 = *(u16 *)(s0 + 0xFC); + v1 = *(u16 *)(s0 + 0xFE); + v0 = v0 + 1; + v1 = v1 + v0; + *(u16 *)(s0 + 0xFC) = v0; + *(u16 *)(s0 + 0xFE) = v1; + v0 = *(u16 *)(*(s32 *)(s0 + 0x20) + 0x14); + v0 = v0 + v1; + *(u16 *)(*(s32 *)(s0 + 0x20) + 0x14) = v0; + v0 = *(u16 *)(s0 + 0xA); + v0 = v0 - 4; + *(u16 *)(s0 + 0xA) = v0; + v0 = func_80047948(*(s16 *)(*(s32 *)(s0 + 0x20) + 0x12)); + v0 = v0 << 6; + v1 = *(s32 *)(s0 + 0x4); + v1 = v1 + v0; + *(s32 *)(s0 + 0x4) = v1; + v0 = func_8004787C(*(s16 *)(*(s32 *)(s0 + 0x20) + 0x12)); + v0 = v0 << 6; + v1 = *(s32 *)(s0 + 0xC); + v1 = v1 - v0; + *(s32 *)(s0 + 0xC) = v1; + } else { + *(u16 *)(s0 + 0x2) = 0x3; + *(s32 *)(s0 + 0x1C) = 0x1E; + *(u16 *)(s0 + 0x98) = 0; + } + + func_8012B370(s0); +} + extern void func_8012B370(int a0);