feat(decomp): ox wave bd overlays — 3 banked

Committed before the main batch: gate_main reverts on failure and would take these with it.
This commit is contained in:
Drew T
2026-08-24 08:53:13 -06:00
parent 7f6cd48521
commit b2a2b10435
3 changed files with 238 additions and 3 deletions
+73 -1
View File
@@ -3014,7 +3014,79 @@ s32 func_8017F730(void) {
}
INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_8017ED5C", func_8017F790);
typedef struct { u32 a, b, c, d; } B16;
extern B16 D_800A5E88, D_800A5E98, D_800A5EA8;
extern B16 D_801CE030, D_801CE040, D_801CE050;
extern u8 D_801BBA7F[];
extern s32 func_8017D9F4(s32);
extern s32 func_800291B4(s32);
extern void func_800D0C48(s32);
extern void func_8013C938(void);
extern s32 func_8012C51C(void *, s32);
extern void func_80028394(s32, s32, s32, s32);
extern void func_80028428(s32, s32, s32, s32);
typedef struct { s16 f10, f12, f14, f16, f18, f1A, f1C, f1E; s32 f20; } PrimF790;
s32 func_8017F790(s32 a0) {
u8 c;
if (*(s16 *)(a0 + 0xFE) != 0) goto L818;
c = D_801BBA7F[*(s16 *)(a0 + 0x100)];
if (c >= 0x2C) {
*(s16 *)(a0 + 0xFE) = 1;
goto L818;
}
if (func_8017D9F4(c) != 0) {
*(s16 *)(a0 + 0xFE) = 1;
if (*(s16 *)(a0 + 0x100) == 0x1C && (func_800291B4(0x7E) & 0x20)) {
func_800D0C48(1);
}
}
L818:
if (*(s16 *)(a0 + 0x10A) < 0x31) goto L874;
{
u16 n = *(u16 *)(a0 + 0x106) + 0x10;
*(s16 *)(a0 + 0x106) = n;
*(s16 *)(a0 + 0x108) = n;
if ((s16)n >= 0x100) {
*(s16 *)(a0 + 0x106) = 0xFF;
*(s16 *)(a0 + 0x108) = 0xFF;
}
*(s16 *)(a0 + 0x10A) = *(u16 *)(a0 + 0x10A) - 3;
return 0;
}
L874:
if (*(s16 *)(a0 + 0xFE) == 0) return 0;
func_8013C938();
{
PrimF790 sp;
s32 f18v;
sp.f16 = 0x1ED;
f18v = *(u16 *)(a0 + 0x100);
sp.f1A = 0;
sp.f1C = 0;
sp.f1E = 0;
sp.f20 = 0;
sp.f10 = 0;
sp.f12 = -0x400;
sp.f14 = 0;
sp.f18 = f18v;
*(s32 *)(a0 + 0xD4) = func_8012C51C(&sp, a0);
}
*(s16 *)(a0 + 0x104) = 0;
D_801CE030 = D_800A5E88;
D_801CE040 = D_800A5E98;
D_801CE050 = D_800A5EA8;
func_80028394(0, 0, 0x14, 0x13);
func_80028428(0, 0x96, 0x96, 0xAA);
func_80028394(1, 0, 0xA, 0x14);
func_80028428(1, 0x66, 0x66, 0x66);
func_80028394(2, 0, -0xA, 0);
func_80028428(2, 0x4D, 0x33, 0x80);
return 1;
}
INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_8017ED5C", func_8017F9F8);
+66 -1
View File
@@ -3856,7 +3856,72 @@ void func_8017E3A0(void *a0) {
}
INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_8017C180", func_8017E3AC);
extern s32 rand(void);
extern void func_8012A828(s32 a0, s32 a1);
extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2);
extern s32 func_8012E778(s32 param_1, s32 param_2);
extern void func_8002D4C8(s32 a0, s32 a1);
extern void func_8012F214(s32 a0, s32 a1, s32 a2);
extern s32 func_8017F76C(s16 *a0, s32 a1, s32 a2, s32 a3);
extern u8 D_801A9C08[];
extern u8 D_801A50F4[];
extern u8 D_801A5104[];
typedef struct { u8 b[8]; } Blk8_func_8017E3AC;
void func_8017E3AC(s32 a0) {
Blk8_func_8017E3AC sp10;
Blk8_func_8017E3AC sp18;
register s32 act __asm__("$18");
register s32 i __asm__("$16");
register s32 angm __asm__("$19");
register s32 angp __asm__("$20");
s32 k;
s32 j;
s32 pos;
act = a0;
if ((*(u32 *)(act + 0xE0) & 1) == 0) {
if (func_8012BD3C(act, 0x400, *(s32 *)(act + 0xDC)) == 0) {
*(u16 *)(act + 2) = 1;
} else {
func_8012A828(act, (s32)D_801A9C08);
if (func_8012E778(act, 0x8C00B4) == 1) {
func_8002D4C8(0x64A, 0);
}
}
}
if (*(s32 *)(act + 0x94) == 0x19) {
func_8012F214(act, (s32)D_801A50F4, (s32)&sp10);
func_8012F214(act, (s32)&D_801A50F4[8], (s32)&sp18);
i = 0;
{
register s32 fv __asm__("$2") = *(u16 *)(*(s32 *)(act + 0x20) + 0x12);
angp = fv + 0x400;
angm = fv - 0x400;
}
k = -0x80000;
while (i < 6) {
func_8017F76C((s16 *)&sp10, angp * 0x10000 >> 0x10,
rand() % 4 * -0x10000 + k, 0);
func_8017F76C((s16 *)&sp18, angm * 0x10000 >> 0x10,
rand() % 4 * -0x10000 + k, 0);
i++;
}
j = 0;
pos = 0x80000;
k = (s32)D_801A5104;
while (j < 4) {
func_8012F214(act, k, (s32)&sp10);
func_8017F76C((s16 *)&sp10, 0, rand() % 4 * 0x10000 + pos, 1);
j++;
k += 8;
}
}
}
extern s32 func_8012BD14(s32 a0);
extern s32 func_8012BEE8(s32 a0);
+99 -1
View File
@@ -4619,7 +4619,105 @@ void func_80180E80(u8 *self) {
}
INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8017D494", func_80180F30);
extern void func_801833D4(int a0, int a1);
extern s32 func_80183A28(u8 *a0);
extern void func_8002D4C8(s32 a0, s32 a1);
extern void func_80183564(s32 a0, s16 *a1);
extern s32 func_8012C588(s32 a0, s32 a1);
extern void func_801837C4(s32, s32);
extern void func_80183BAC(u8*);
extern void func_801861D4(s32 a0);
extern void func_8018A018(s32 a0);
extern void func_80183880(s32 a0);
extern void func_80185960(s32 target, u16 *cur, s32 step);
extern void func_8012BEE8(u8*);
extern void func_80189D38(void*);
extern void func_801811D0(s32 *a0);
extern void func_8013C9C4(void *a0);
extern u16 D_801EFD20;
extern s32 D_801EFCA4;
extern s32 aFC4C[] __asm__("D_801EFC4C");
extern s32 D_801EFCE8[];
extern u8 D_80194490[];
extern u8 D_80194470[];
extern u8 D_80190B88[];
void func_80180F30(s32 s2)
{
s32 v0;
s32 v1;
s32 s1;
s32 *s0;
if ((*(u16 *)(s2 + 0x34) < 4)) {
if (((s32 (*)(int, int))func_801833D4)(s2, 0x30) != 0) {
switch (*(u16 *)(s2 + 0x34)) {
case 0:
*(s16 *)(s2 + 0x84) = 0;
/* fallthrough */
case 1:
v1 = *(u16 *)(s2 + 0xF4) + 1;
*(u16 *)(s2 + 0xF4) = v1;
func_80183564(s2, (s16 *)(D_80194490 + (((v1 << 16) >> 13))));
*(u16 *)(s2 + 0x34) = *(u16 *)(s2 + 0x34) + 1;
break;
case 2:
func_8018A018(D_801EFCA4);
*(s16 *)(s2 + 0xF2) = 0x20;
func_80183564(s2, (s16 *)D_80194470);
*(u16 *)(s2 + 0x34) = *(u16 *)(s2 + 0x34) + 1;
func_8012C588(0x3D8, s2);
break;
case 3:
((void (*)(s32))func_801837C4)(s2);
((void (*)(s32))func_80183BAC)(s2);
*(u16 *)(s2 + 0x100) = 0;
*(s32 *)(s2 + 0x1C) = 8;
*(u16 *)(s2 + 0x34) = *(u16 *)(s2 + 0x34) + 1;
func_801861D4(s2);
break;
}
} else {
func_80183A28((u8 *)s2);
if (*(u16 *)(s2 + 0x34) == 1) {
v0 = *(u16 *)(s2 + 0x84) + 1;
*(s16 *)(s2 + 0x84) = v0;
if (((v0 << 16) >> 16) == 0x50) {
func_8002D4C8(0x992, 0);
}
}
}
} else {
func_80183880(s2);
func_80185960(0, (u16 *)(*(s32 *)(aFC4C[D_801EFD20] + 0x20) + 0x14), 0x40);
switch (*(u16 *)(s2 + 0x34)) {
case 4:
if (((s32 (*)(u8 *))func_8012BEE8)((u8 *)s2) != 0) {
*(s16 *)(s2 + 0xF2) = 0xC0;
s1 = 0x10;
s0 = D_801EFCE8;
do {
((void (*)(s32))func_80189D38)(*s0++);
s1++;
} while (s1 < 0x14);
*(u16 *)(s2 + 0x34) = 5;
}
break;
case 5:
if (*(s16 *)(s2 + 0xF2) == 0) {
func_801811D0((s32 *)s2);
}
break;
}
}
if (*(s16 *)(s2 + 0xF2) != 0) {
if ((*(u16 *)(s2 + 0xF2) & 0xF) == 0) {
func_8013C9C4(D_80190B88);
}
*(u16 *)(s2 + 0xF2) = *(u16 *)(s2 + 0xF2) - 1;
}
}
void func_801811D0(s32 *arg0) {
extern s16 D_801944A8[];