From 1372b151f78db1f6d121fb96f924be239d4749b3 Mon Sep 17 00:00:00 2001 From: Drew T <50529377+Druthulu@users.noreply.github.com> Date: Tue, 25 Aug 2026 10:42:32 -0600 Subject: [PATCH] =?UTF-8?q?feat(decomp):=20ox=20wave=20db=20overlays=20?= =?UTF-8?q?=E2=80=94=208=20banked?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Committed before the main batch: gate_main reverts on failure and would take these with it. --- src/md_MAIN_015/md_MAIN_015.c | 62 ++++++++- src/ov_SC02_017/ov_SC02_017_jr_8017DF34.c | 156 +++++++++++++++++++++- src/ov_SC03_028/ov_SC03_028_jr_8017DF98.c | 33 ++++- src/ov_SC03_090/ov_SC03_090_jr_80188274.c | 32 ++++- src/ov_SC04_011/ov_SC04_011_jr_8017D494.c | 16 ++- src/ov_SC06_033/ov_SC06_033_jr_8017C24C.c | 59 +++++++- 6 files changed, 350 insertions(+), 8 deletions(-) diff --git a/src/md_MAIN_015/md_MAIN_015.c b/src/md_MAIN_015/md_MAIN_015.c index e90ee13870..b51cf5d0e0 100644 --- a/src/md_MAIN_015/md_MAIN_015.c +++ b/src/md_MAIN_015/md_MAIN_015.c @@ -92,7 +92,67 @@ void func_800CB1C0(void *arg0) { INCLUDE_ASM("asm/md_MAIN_015/nonmatchings/md_MAIN_015", func_800CB21C); -INCLUDE_ASM("asm/md_MAIN_015/nonmatchings/md_MAIN_015", func_800CB2E0); +void func_800CB2E0(void *arg0) { + extern s32 func_80146E98(s32 a0); + extern void func_80013F3C(void *a0); + extern void func_800126C4(s32 a0, s32 a1); + extern void func_800123F0(s32 a0, s32 a1); + extern void func_80012558(s32 a0, s32 a1); + extern void func_80163194(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); + extern void func_80162FC0(s32 *a0); + extern s32 func_80163408(s32 a0, s32 a1, s32 a2, s32 a3); + extern void func_80163328(); + extern s32 func_801632F0(); + extern void func_80013E94(void *a0, void *a1); + extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); + extern void func_80146CA0(void *a0); + extern s16 D_80126B18[]; + extern s16 D_80126B1A[]; + extern s16 D_80126B1C; + extern s32 D_80114EB0; + extern s32 D_80114EC8; + + register void *a0v __asm__("$17"); + register void *fp __asm__("$18"); + u8 buf[0x40]; + s32 sp60; + s32 cmd; + + a0v = arg0; + fp = *(void **)((u8 *)a0v + 0x20); + + if (func_80146E98((s32)a0v)) { + func_80146A6C(3, a0v, *(s16 *)((u8 *)a0v + 6), *(s16 *)((u8 *)a0v + 0xA), *(s16 *)((u8 *)a0v + 0xE), 0, 0x80001C00); + } else { + register u8 *bp __asm__("$16"); + bp = buf + 0x20; + func_80013F3C(bp); + func_800126C4((s32)bp, *(s16 *)((u8 *)fp + 0x10)); + func_800123F0((s32)bp, *(s16 *)((u8 *)fp + 0x14)); + func_80012558((s32)bp, *(s16 *)((u8 *)fp + 0x12)); + func_80163194((s32)a0v, 0, 0, 0, (s32)bp); + func_80162FC0((s32 *)a0v); + func_80163408((s32)a0v, 0x10, 0x80, 0x200); + func_80163328(a0v); + switch ((u32)func_801632F0(a0v)) { + case 1: + func_80013E94(&D_80114EB0, &sp60); + cmd = 0x1F; + break; + case 2: + case 4: + func_80013E94(&D_80114EC8, &sp60); + cmd = 7; + break; + default: + return; + } + sp60 |= 0x80000000; + func_80146A6C(cmd, a0v, D_80126B18[0], D_80126B1A[0], D_80126B1C, sp60, 0); + } + func_80146CA0(a0v); +} + extern void func_80162CCC(void); void func_800CB474(void) { diff --git a/src/ov_SC02_017/ov_SC02_017_jr_8017DF34.c b/src/ov_SC02_017/ov_SC02_017_jr_8017DF34.c index e11dd32fb0..a0086b9f1b 100644 --- a/src/ov_SC02_017/ov_SC02_017_jr_8017DF34.c +++ b/src/ov_SC02_017/ov_SC02_017_jr_8017DF34.c @@ -7283,7 +7283,21 @@ void func_801859C4(s32 arg0) { } -INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_8017DF34", func_80185AF0); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern char D_801D0DA8; + +s32 aF80185AF0(s32 arg0) __asm__("func_80185AF0"); +s32 aF80185AF0(s32 arg0) { + if (*(s32 *)(arg0 + 0xDC) & 1) { + return 0; + } + if (func_8012D5E4(arg0, (s32)&D_801D0DA8, (s32)&D_801D0DA8 + 8, 0xB) != 1) { + return 0; + } + *(s32 *)(arg0 + 0xDC) |= 1; + return 1; +} + #include "common.h" @@ -7599,7 +7613,145 @@ void func_801866C8(s32 a0) { } -INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_8017DF34", func_80186770); +#include "common.h" + +extern s32 func_8012B8E4(s32 a0, s32 a1); +extern s32 func_8012BEE8(s32 a0); +extern void func_8012A828(s32 a0, void *a1); +extern void func_80142414(s32 a0, s16 a1); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012CBA4(s32); +extern void func_80131E00(s32 a0, s32 a1); +extern void func_80185F88(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_80186C38(s32 a0, s32 a1); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BCCC(s32 a0); +extern s32 rand(void); +extern s32 func_8012B744(void *a0, void *a1); +extern void func_8012ADE4(u8 *a0); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_80186B08(void); +extern void func_80186B34(s32 a0); +extern void func_80186B7C(s32 a0); + +extern s32 D_801D619C; +extern s16 D_801E1264; +extern s16 D_801E11DC; +extern s16 D_801E1AFC; +extern short D_801E1134; + +void func_80186770(s32 param_1) +{ + struct { s32 vx, vy, vz, pad; } vec; + s32 v; + s32 d; + s32 b178arg; + void *target; + + switch (*(u16 *)(param_1 + 0x34)) { + case 0: + v = func_8012B8E4(param_1, 4); + *(u16 *)(*(s32 *)(param_1 + 0x20) + 0x12) += v; + if (*(s32 *)(param_1 + 0x1C) == 0xF) { + func_80142414(param_1, -0x78); + func_8002D4C8(0x6A9, 0); + } + if (func_8012BEE8(param_1) != 0) { + *(s16 *)(param_1 + 0x2) = 3; + if ((*(u16 *)(param_1 + 0x86) & 2) != 0) { + *(s16 *)(param_1 + 0x34) = 1; + *(s32 *)(param_1 + 0x1C) = 0x28; + if ((*(u16 *)(param_1 + 0x70) & 0x200) != 0) { + func_8012A828(param_1, &D_801E1AFC); + } else { + func_8012A828(param_1, &D_801E11DC); + } + *(u16 *)(param_1 + 0xFE) = 0; + } else { + *(s16 *)(param_1 + 0x34) = 0; + func_8012A828(param_1, &D_801E1264); + *(s32 *)(param_1 + 0x1C) = 0x19; + *(u16 *)(param_1 + 0x86) |= 2; + } + } + break; + case 1: + v = func_8012B8E4(param_1, 6); + b178arg = D_801D619C; + { + register u16 *pp __asm__("$3"); + register s32 nv __asm__("$6"); + + pp = (u16 *)(*(s32 *)(param_1 + 0x20) + 0x12); + nv = *pp + v; + *pp = nv; + } + func_8012B178(param_1, b178arg); + d = ((s32 (*)(s32))func_8012CBA4)(param_1); + if ((d & 0x1000) != 0) { + func_80131E00(param_1, 0x12); + } else if (d != 0x2000) { + func_8012ADE4((u8 *)param_1); + } + func_80185F88(param_1); + v = *(u16 *)(param_1 + 0xFE) - 1; + *(u16 *)(param_1 + 0xFE) = v; + if ((v << 16) <= 0) { + func_80143B6C(param_1, 0); + *(u16 *)(param_1 + 0xFE) = 8; + } + if ((*(u16 *)(param_1 + 0x70) & 0x200) != 0) { + func_80186C38(param_1, 0x11); + } + target = (void *)(param_1 + 0x88); + vec.vx = *(s16 *)(param_1 + 6) - *(s16 *)(param_1 + 0x88); + vec.vy = 0; + vec.vz = *(s16 *)(param_1 + 0xE) - *(s16 *)(param_1 + 0x8C); + Square0(&vec.vx, &vec.vx); + if (vec.vx + vec.vz > 0x8FFFF || (d = func_8012BCCC(param_1), d > 0x24000)) { + *(s16 *)(param_1 + 0x2) = 1; + *(s16 *)(param_1 + 0x34) = 0; + *(u16 *)(param_1 + 0x5C) = 0xAA10; + *(s32 *)(param_1 + 0x1C) = (rand() & 0x1F) + 0x28; + vec.vx = *(s16 *)(param_1 + 6) - *(s16 *)(param_1 + 0x88); + vec.vy = 0; + vec.vz = *(s16 *)(param_1 + 0xE) - *(s16 *)(param_1 + 0x8C); + Square0(&vec.vx, &vec.vx); + if (vec.vx + vec.vz > 0x8FFFF) { + *(u16 *)(param_1 + 0xFC) = func_8012B744((void *)(param_1 + 4), target); + } else { + register s32 t __asm__("$2") = rand() & 0x3FF; + s32 off = t - 0x200; + + if (off < 0) { + off = t - 0x500; + } else { + off = t + 0x100; + } + *(u16 *)(param_1 + 0xFC) = + (*(u16 *)(*(s32 *)(param_1 + 0x20) + 0x12) + off) & 0xFFF; + } + func_8012A828(param_1, &D_801E1134); + } + if ((*(u16 *)(param_1 + 0x70) & 0x100) == 0) { + if (func_8012BD3C(param_1, 0x400, 0x1000) != 0) { + if ((*(u16 *)(param_1 + 0x70) & 0xF00) == 0) { + ((void (*)(s32))func_80186B08)(param_1); + } else { + func_80186B34(param_1); + } + } + } else { + if (func_8012BD3C(param_1, 0x400, 0x40000) != 0) { + func_80186B7C(param_1); + } + } + break; + } +} + diff --git a/src/ov_SC03_028/ov_SC03_028_jr_8017DF98.c b/src/ov_SC03_028/ov_SC03_028_jr_8017DF98.c index 12d2880a9e..1cf27389d3 100644 --- a/src/ov_SC03_028/ov_SC03_028_jr_8017DF98.c +++ b/src/ov_SC03_028/ov_SC03_028_jr_8017DF98.c @@ -7928,7 +7928,38 @@ void func_80188EC0(void *arg0) { } -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8017DF98", func_80188F4C); +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001CA1C(s32 a0, s32 a1); +extern void func_8012A828(s32 a0, void *a1); + +void func_80188F4C(void *a0) +{ + register void *s0 __asm__("$16"); + s32 v0; + + s0 = a0; + + v0 = ((s32 (*)(void))func_8012C1B8)(); + *(s32 *)((s32)s0 + 0x20) = v0; + if (v0 == 0) { + func_8012CAE4(s0); + } else { + extern u8 D_801905E4[]; + extern u8 D_801905F0[]; + + func_8001CA1C(v0, (s32)&D_801905E4); + func_8012A828((s32)s0, &D_801905F0); + *(s16 *)((s32)s0 + 0x2) = 1; + + *(s16 *)(*(s32 *)((s32)s0 + 0x20) + 0x18) = 0x2800; + *(s16 *)(*(s32 *)((s32)s0 + 0x20) + 0x1A) = 0x2800; + *(s16 *)(*(s32 *)((s32)s0 + 0x20) + 0x1C) = 0x2800; + + *(u16 *)(*(s32 *)((s32)s0 + 0x20) + 0x2C) |= 0x10; + } +} + INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8017DF98", func_80188FF0); diff --git a/src/ov_SC03_090/ov_SC03_090_jr_80188274.c b/src/ov_SC03_090/ov_SC03_090_jr_80188274.c index 101ddd49cb..b8d20bcc9f 100644 --- a/src/ov_SC03_090/ov_SC03_090_jr_80188274.c +++ b/src/ov_SC03_090/ov_SC03_090_jr_80188274.c @@ -4779,7 +4779,37 @@ void func_8018A8DC(void *a0) } -INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_80188274", func_8018A9C8); +extern void Square0(s32 *a0, s32 *a1); + +s32 func_8018A9C8(void *a0, s32 a1) { + extern u16 D_80126B62; + extern u16 D_80126B5E; + extern u16 D_80126B66; + + s32 sp10[3]; + s32 sp20[3]; + s32 m; + s16 e; + register s32 ret __asm__("$2"); + + sp10[0] = *(s16 *)((s32)a0 + 6) - *(s16 *)&D_80126B5E; + sp10[1] = 0; + sp10[2] = *(s16 *)((s32)a0 + 0xE) - *(s16 *)&D_80126B66; + Square0(sp10, sp20); + + m = D_80126B62 - *(u16 *)((s32)a0 + 0xA); + e = m; + if ((s16)m < 0) { + e = -m; + } + + ret = 0; + if (sp20[0] + sp20[2] < (u16)a1 * (u16)a1) { + ret = (s16)e < 4; + } + return ret; +} + INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_80188274", func_8018AA88); diff --git a/src/ov_SC04_011/ov_SC04_011_jr_8017D494.c b/src/ov_SC04_011/ov_SC04_011_jr_8017D494.c index 17c63f72b4..b3de21b029 100644 --- a/src/ov_SC04_011/ov_SC04_011_jr_8017D494.c +++ b/src/ov_SC04_011/ov_SC04_011_jr_8017D494.c @@ -6343,7 +6343,21 @@ void aF80183E20(void *a0) { } -INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8017D494", func_80183EA8); +extern s32 rand(void); +extern s32 D_801EFC54; +extern void func_8018B0B0(void *a0, void *a1, void *a2, u32 a3); + +void func_80183EA8(void) { + s16 svec[4]; + s32 obj; + + obj = D_801EFC54; + svec[0] = (rand() & 0x3F) - 0x20; + svec[1] = 0x80; + svec[2] = (rand() & 0x3F) - 0x20; + func_8018B0B0((void *)obj, svec, (void *)0, 8); +} + #include "common.h" diff --git a/src/ov_SC06_033/ov_SC06_033_jr_8017C24C.c b/src/ov_SC06_033/ov_SC06_033_jr_8017C24C.c index 6b1d8f7e19..03983ad407 100644 --- a/src/ov_SC06_033/ov_SC06_033_jr_8017C24C.c +++ b/src/ov_SC06_033/ov_SC06_033_jr_8017C24C.c @@ -3581,7 +3581,39 @@ void func_8017DF44(s32 a0) { } -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_8017C24C", func_8017DFE8); +extern s32 func_8004787C(s32); +extern s32 func_80047948(s32); +extern void func_8017E0E4(); + +void func_8017DFE8(s32 arg0, s32 arg1, s32 arg2) +{ + register s32 s2 __asm__("$18") = arg0; + register s32 s3 __asm__("$19") = arg1; + register s32 s4 __asm__("$20") = arg2; + register s32 r1; + register s32 r2; + s32 w; + + r1 = func_8004787C(*(s16 *)((u8 *)s2 + 0x100)); + if (r1 < 0) { + r1 += 0x7F; + } + r1 >>= 7; + w = (*(u16 *)((u8 *)s2 + 0x100)) + (*(u16 *)((u8 *)s2 + 0x102)); + *(u16 *)((u8 *)s2 + 0x100) = w; + r2 = func_80047948((s16)w); + if (r2 < 0) { + r2 += 0x7F; + } + r2 >>= 7; + *(s32 *)((u8 *)s2 + 0xE4) += 4; + if (*(s32 *)((u8 *)s2 + 0xE4) >= 0x40) { + *(s32 *)((u8 *)s2 + 0xE4) = 0; + } + func_8017E0E4(s2, 0, (s16)r1, (s16)r2, s3, s4); + func_8017E0E4(s2, 1, (s16)r1, (s16)r2, s3, s4); +} + INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_8017C24C", func_8017E0E4); @@ -3653,7 +3685,30 @@ void func_8017E7DC(s32 a0) } -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_8017C24C", func_8017E82C); +extern s16 currentLocationId; +extern u8 D_801953A4[]; +extern void func_80147324(s32 a0); +extern int func_801511E0(int arg); +extern void func_80154274(s32 *a0, s32 a1); +extern void func_80149020(s32 *a0); +extern void func_8017EA60(void); +extern void func_80146CA0(void *a0); + +void func_8017E82C(s32 p) +{ + if (currentLocationId == 0x3083) { + *(u16 *)(p + 0xA) -= 8; + } + func_80147324(0x451); + ((void (*)(s32))func_801511E0)(p); + ((void (*)(s32, s32))func_80154274)(p, (s32)D_801953A4); + ((void (*)(s32))func_80149020)(p); + *(u8 *)(p + 0xDE) = 0xA; + *(u8 *)(p + 0xDF) = 0; + func_8017EA60(); + ((void (*)(s32))func_80146CA0)((void *)p); +} + extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); extern s32 func_8017EA84(void);