From 0de85bc8d2f791d17058289ba81ef49dd40e104b Mon Sep 17 00:00:00 2001 From: Drew T <50529377+Druthulu@users.noreply.github.com> Date: Mon, 24 Aug 2026 15:56:26 -0600 Subject: [PATCH] =?UTF-8?q?feat(decomp):=20ox=20wave=20bj=20overlays=20?= =?UTF-8?q?=E2=80=94=2019=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/ov_SC02_021/ov_SC02_021_jr_8017C294.c | 33 +++++++++- src/ov_SC02_041/ov_SC02_041_jr_8017BEBC.c | 40 +++++++++++- src/ov_SC03_006/ov_SC03_006_jr_8017AE2C.c | 53 ++++++++++++++-- src/ov_SC03_024/ov_SC03_024_jr_80183BF8.c | 27 +++++++- src/ov_SC03_093/ov_SC03_093_jr_8017D898.c | 53 +++++++++++++++- src/ov_SC03_112/ov_SC03_112_jr_8017C294.c | 29 ++++++++- src/ov_SC03_116/ov_SC03_116_jr_8017AE2C.c | 69 +++++++++++++++++++- src/ov_SC06_018/ov_SC06_018_jr_8017C24C.c | 20 +++++- src/ov_SC06_029/ov_SC06_029_jr_8017C954.c | 76 ++++++++++++++++++++++- 9 files changed, 379 insertions(+), 21 deletions(-) diff --git a/src/ov_SC02_021/ov_SC02_021_jr_8017C294.c b/src/ov_SC02_021/ov_SC02_021_jr_8017C294.c index c6252848e..85932c3ad 100644 --- a/src/ov_SC02_021/ov_SC02_021_jr_8017C294.c +++ b/src/ov_SC02_021/ov_SC02_021_jr_8017C294.c @@ -3311,7 +3311,29 @@ void func_8017D500(void *a0) { } -INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_8017C294", func_8017D53C); +void func_8017D53C(s32 param_1) { + extern u16 D_80126940; + extern s16 D_80126942; + extern s16 D_80126944; + extern void func_8017D5C8(s32, s16 *); + s16 buf[3]; + + buf[0] = D_80126940; + if (D_80126942 < -0x570) { + buf[1] = -0x570; + } else if (!(D_80126942 < -0x3bf)) { + buf[1] = -0x3c0; + } else { + buf[1] = D_80126942; + } + if (D_80126944 < -0x60) { + buf[2] = -0x60; + } else { + buf[2] = D_80126944; + } + func_8017D5C8(param_1, buf); +} + /* Local address-suffixed clones of the PSX MATRIX/SVECTOR layouts (cookbook: match_one's isolated @@ -3651,7 +3673,14 @@ extern void func_800D0F4C(s32 arg); INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_8017C294", func_8017EFB0); -INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_8017C294", func_8017F014); +void func_8017F014(void) { + extern u16 D_80078EAC; + extern u8 D_80078EB0; + extern u8 D_80078EB1; + extern u8 D_80193528[]; + *(s32 *)D_80193528 = D_80078EAC * 1440 + D_80078EB1 * 60 + D_80078EB0; +} + INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_8017C294", func_8017F064); diff --git a/src/ov_SC02_041/ov_SC02_041_jr_8017BEBC.c b/src/ov_SC02_041/ov_SC02_041_jr_8017BEBC.c index 164b68abe..ef5ed2cf3 100644 --- a/src/ov_SC02_041/ov_SC02_041_jr_8017BEBC.c +++ b/src/ov_SC02_041/ov_SC02_041_jr_8017BEBC.c @@ -5237,7 +5237,18 @@ void func_8017F9A4(s32 a0) { } -INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_8017BEBC", func_8017FABC); +extern void (*D_8019AD84[])(); +extern s32 func_801659CC(void); +extern void func_8002D4C8(s32 a0, s32 a1); + +void func_8017FABC(s32 a0) { + D_8019AD84[*(u16 *)(a0 + 2)](); + if (((a0 != 0) && (*(s16 *)(a0 + 0x70) == 3)) && (func_801659CC() != 0)) { + *(s16 *)(a0 + 0x70) = 0; + func_8002D4C8(0xB6B, 0); + } +} + extern u8 D_801A3AA0[]; extern u8 D_801A3BC0[]; @@ -5285,7 +5296,32 @@ void func_8017FC04(void *arg0) { } -INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_8017BEBC", func_8017FC70); +void func_8017FC70(s32 a0) { + extern u8 D_8019ACB8[]; + extern u8 D_801A3560[]; + extern u8 D_8019AD2C[]; + extern u8 D_8019ACEC[]; + extern s32 func_8012C354(s32 a0, s32 a1); + extern s32 func_80143970(s32 a0); + extern void func_8012A828(s32 a0, void *a1); + extern void func_8012B23C(s32 a0); + + if (func_8012C354(a0, (s32)D_8019ACB8) != 0) { + *(u8 *)(a0 + 0xC0) = 1; + *(s32 *)(a0 + 0xB4) = -1; + func_80143970(a0); + func_8012A828(a0, D_801A3560); + *(u16 *)(a0 + 0x2) = *(u16 *)(a0 + 0x2) + 1; + func_8012B23C(a0); + if (*(s16 *)(a0 + 0x70) == 3) { + *(s32 *)(a0 + 0xBC) = (s32)D_8019AD2C; + *(u16 *)(a0 + 0x76) = 0x280; + } else { + *(s32 *)(a0 + 0xBC) = (s32)D_8019ACEC; + } + } +} + INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_8017BEBC", func_8017FD14); diff --git a/src/ov_SC03_006/ov_SC03_006_jr_8017AE2C.c b/src/ov_SC03_006/ov_SC03_006_jr_8017AE2C.c index d80f92368..56b76cd79 100644 --- a/src/ov_SC03_006/ov_SC03_006_jr_8017AE2C.c +++ b/src/ov_SC03_006/ov_SC03_006_jr_8017AE2C.c @@ -6751,7 +6751,29 @@ void func_80181418(void *a0) { } -INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_8017AE2C", func_80181454); +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern void func_8012A828(s32 a0, void *a1); +extern void func_8012B23C(s32 a0); +extern u8 D_801BD274[]; +extern u8 D_801BAE98[]; + +void func_80181454(s32 p) { + s32 v; + + *(s32 *)(p + 0x20) = v = ((s32 (*)(void))func_8012C1B8)(); + if (v == 0) { + func_8012CAE4((void *)p); + } else { + func_8001C214(v, (s32)D_801BD274); + func_8012A828(p, D_801BAE98); + *(u16 *)(p + 2) = 1; + *(s32 *)(*(s32 *)(p + 0x20) + 4) |= 0x80000000; + func_8012B23C(p); + } +} + INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_8017AE2C", func_801814DC); @@ -12539,7 +12561,28 @@ extern void func_8012A828(s32, void*); } -INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_8017AE2C", func_8018A4B4); +#include "common.h" + +extern void func_8012A828(s32 a0, void *a1); + +extern u8 D_801DFF34; +extern u8 D_801DFB14; + +void func_8018A4B4(s32 param_1) { + *(s16 *)(param_1 + 0x2) = 3; + if (*(u16 *)(param_1 + 0x86) & 2) { + *(s16 *)(param_1 + 0x34) = 1; + *(s32 *)(param_1 + 0x1C) = 0x28; + func_8012A828(param_1, &D_801DFF34); + *(u16 *)(param_1 + 0xFE) = 0; + } else { + *(s16 *)(param_1 + 0x34) = 0; + func_8012A828(param_1, &D_801DFB14); + *(s32 *)(param_1 + 0x1C) = 0x19; + *(u16 *)(param_1 + 0x86) |= 2; + } +} + INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_8017AE2C", func_8018A538); @@ -12637,7 +12680,7 @@ extern s32 func_8012BEE8(s32 a0); extern s32 func_8012C044(s32 a0); extern s32 func_8018A698(s32 a0); -extern void func_8018A4B4(s16 *a0); +extern void func_8018A4B4(); extern void func_8018A5C4(s32 a0); extern void func_8018A6F4(s32 a0); extern void func_8018A484(short *a0); @@ -12679,7 +12722,7 @@ void func_8018A96C(s32 a0) extern s32 func_8018A698(s32 a0); extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); -extern void func_8018A4B4(s16 *a0); +extern void func_8018A4B4(); extern void func_8018A3D4(s32 a0); void func_8018AA60(s32 param_1) @@ -12723,7 +12766,7 @@ extern void func_8012AD80(s32 a0); extern void func_8018A384(s16 *a0); extern void func_8018A598(void *a0); extern s32 func_8012BEE8(s32 a0); -extern void func_8018A4B4(s16 *a0); +extern void func_8018A4B4(); void func_8018AC60(s32 a0) { func_8012AD80(a0); diff --git a/src/ov_SC03_024/ov_SC03_024_jr_80183BF8.c b/src/ov_SC03_024/ov_SC03_024_jr_80183BF8.c index 680601364..0089fd88c 100644 --- a/src/ov_SC03_024/ov_SC03_024_jr_80183BF8.c +++ b/src/ov_SC03_024/ov_SC03_024_jr_80183BF8.c @@ -3343,7 +3343,16 @@ void func_801846BC(void) { INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_80183BF8", func_80184700); -INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_80183BF8", func_801847E4); +extern u16 D_80126B62; +void func_801847E4(int param_1) +{ + if (-0x90 <= (s16)D_80126B62) { + *(unsigned int *)(param_1 + 0x1c) = 0x5a; + *(unsigned short *)(param_1 + 2) = *(unsigned short *)(param_1 + 2) + 1; + } + return; +} + INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_80183BF8", func_80184814); @@ -3397,7 +3406,21 @@ void func_80184A78(s32 a0) } -INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_80183BF8", func_80184B00); +extern void func_8012AD80(s32 a0); +extern void func_8012C218(void *); + +void func_80184B00(s32 arg0) { + s32 v = *(s32 *)(arg0 + 0x1C) - 1; + *(s32 *)(arg0 + 0x1C) = v; + if (v == 0) { + ((void (*)(void))func_8012C218)(); + } else { + func_8012AD80(arg0); + *(u16 *)(*(s32 *)(arg0 + 0x20) + 0x18) += 0x80; + *(u16 *)(*(s32 *)(arg0 + 0x20) + 0x1A) += 0x80; + } +} + /* func_80184B80 — ov_SC02_027_jr_8017AE2C (76 ins) diff --git a/src/ov_SC03_093/ov_SC03_093_jr_8017D898.c b/src/ov_SC03_093/ov_SC03_093_jr_8017D898.c index 2e675e3d0..0c3ef5d7d 100644 --- a/src/ov_SC03_093/ov_SC03_093_jr_8017D898.c +++ b/src/ov_SC03_093/ov_SC03_093_jr_8017D898.c @@ -4813,7 +4813,21 @@ void func_80181308(s32 a0) { } -INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8017D898", func_801813E0); +extern void (*D_801A4680[])(void); +extern void func_80182000(s32 a0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern s32 D_801A4620[]; + +void func_801813E0(s32 *arg0) { + D_801A4680[*(u16 *)((s32)arg0 + 2)](); + if (*(s32 *)((s32)arg0 + 0xE4) != 0) { + func_80182000((s32)arg0); + } + if ((*(u16 *)arg0 != 0) && (*(s32 *)((s32)arg0 + 0xD4) != 0)) { + func_8012F214((s32)arg0, (s32)D_801A4620, *(s32 *)((s32)arg0 + 0xD4) + 8); + } +} + #include "common.h" @@ -4896,7 +4910,26 @@ void func_80181470(s32 a0) { INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8017D898", func_801815FC); -INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8017D898", func_8018164C); +extern s32 rand(void); +extern s32 func_8004787C(s32 a0); +extern void func_80182124(s32 arg0); + +void func_8018164C(s32 a0) { + s32 ent; + + *(s16 *)(a0 + 0x100) = ((u32)func_8004787C(*(s32 *)(a0 + 0x1C) << 4) >> 5) & 0xFF; + *(s16 *)(a0 + 0xFE) = *(s16 *)(a0 + 0x100); + *(s16 *)(a0 + 0xFC) = *(s16 *)(a0 + 0xFE); + *(s32 *)(a0 + 0x1C) += 1; + if (*(s32 *)(a0 + 0x1C) >= 0x41) { + ent = *(s32 *)(a0 + 0x78); + *(s16 *)(a0 + 2) = 3; + *(s16 *)(a0 + 0x5C) = *(u16 *)(ent + 2); + *(s32 *)(a0 + 0x1C) = rand(); + func_80182124(*(s32 *)(a0 + 0xD4)); + } +} + void func_801816C8(void *a0) { s32 r; @@ -5227,7 +5260,21 @@ void func_80181DC0(void *arg0) { INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8017D898", func_80181ED4); -INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8017D898", func_80181F88); +void func_80181F88(s32 param_1, s32 param_2) { + u8 sp10[0x20]; + s32 sp30[3]; + + *(u16 *)(param_1 + 0x106) = + *(u16 *)(param_1 + 0x106) + + func_8012B608(*(s16 *)(param_1 + 0x106), func_8012B864(param_1), + *(s32 *)(param_1 + 0xE8)); + sp30[1] = 0; + sp30[0] = 0; + sp30[2] = param_2; + func_80049CAC(param_1 + 0x104, sp10); + func_800484EC(sp10, sp30, param_1 + 0x10); +} + INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8017D898", func_80182000); diff --git a/src/ov_SC03_112/ov_SC03_112_jr_8017C294.c b/src/ov_SC03_112/ov_SC03_112_jr_8017C294.c index 80631b27f..bd6e9cfcd 100644 --- a/src/ov_SC03_112/ov_SC03_112_jr_8017C294.c +++ b/src/ov_SC03_112/ov_SC03_112_jr_8017C294.c @@ -5367,7 +5367,34 @@ void func_80180808(s32 param_1) { INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_8017C294", func_801808D8); -INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_8017C294", func_801809A0); +void func_801809A0(s32 arg0) { + extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); + extern s32 func_80143BDC(u16 *a0); + s32 i; + s32 v; + s32 hit; + u16 pos[3]; + u32 buf[2]; + unsigned int *p; + + if (*(s16 *)(arg0 + 0xAA) <= 0) { + i = 0; + p = buf; + for (; i < 20; i++) { + func_8012B0B4(p, rand() % 4096, 0x40); + v = *(s32 *)buf; + pos[0] = *(u16 *)(arg0 + 0x6) + v; + pos[1] = *(u16 *)(arg0 + 0xA) - 0x60; + pos[2] = *(u16 *)(arg0 + 0xE) + (v >> 16); + hit = func_80143BDC(pos); + if (hit != 0) { + *(u8 *)(*(s32 *)(hit + 0xCC) + 0x27) = 0x5B; + } + } + func_8002D4C8(0x521, 0); + } +} + INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_8017C294", func_80180A78); diff --git a/src/ov_SC03_116/ov_SC03_116_jr_8017AE2C.c b/src/ov_SC03_116/ov_SC03_116_jr_8017AE2C.c index 8ae23e22a..96be8819a 100644 --- a/src/ov_SC03_116/ov_SC03_116_jr_8017AE2C.c +++ b/src/ov_SC03_116/ov_SC03_116_jr_8017AE2C.c @@ -4493,7 +4493,24 @@ void func_80181580(s32 arg0) { INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8017AE2C", func_80181618); -INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8017AE2C", func_80181674); +void func_80181674(void *a0) +{ + extern u8 D_80197B60[]; + extern s32 func_8012BEE8(s32 a0); + extern void func_80181864(void *a0, void *a1); + + s16 idx; + u8 *ptr; + + idx = *(s16 *)((s32)a0 + 0x70); + ptr = &D_80197B60[idx * 64]; + if (func_8012BEE8((s32)a0) != 0) { + func_8012AD50(a0); + } else { + func_80181864(a0, ptr); + } +} + void func_801816D8(void *a0) { @@ -4543,7 +4560,40 @@ INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8017AE2C", func_801819A INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8017AE2C", func_801819F4); -INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8017AE2C", func_80181A5C); +extern s32 func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001CA1C(s32 a0, s32 a1); +extern void func_8012A828(s32 a0, s32 a1); +extern u8 D_80186364[]; +extern void (*D_80186424)(void); +extern s32 D_801864AC; + +void func_80181A5C(s32 a0) { + s32 s0; + + if ((func_80029178(0x11C) & 0xFF) != 0) { + func_8012CAE4((void *)a0); + return; + } + s0 = func_8012C1B8(); + if (s0 == 0) { + func_8012CAE4((void *)a0); + return; + } + *(s32 *)(a0 + 0x20) = s0; + func_8001CA1C(s0, (s32)D_80186364); + *(u16 *)(s0 + 0x1C) = 0x4000; + *(u16 *)(s0 + 0x1A) = 0x4000; + *(u16 *)(s0 + 0x18) = 0x4000; + *(s32 *)(s0 + 0x4) |= 0x50000000; + *(u16 *)(s0 + 0x2C) |= 0x10; + *(s32 *)(a0 + 0x58) = (s32)&D_801864AC | 0x40000000 | 0x20000000; + *(u16 *)(a0 + 0x5C) = 0x8000; + *(u16 *)(a0 + 2) += 1; + func_8012A828(a0, (s32)&D_80186424); + *(s16 *)(a0 + 0xAE) = -9; +} + INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8017AE2C", func_80181B44); @@ -4716,7 +4766,20 @@ s32 func_80182280(void) { } -INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8017AE2C", func_801822A0); +void func_801822A0(void) { + extern void func_8013B6A0(s32 arg0, s32 arg1, s32 arg2); + extern s32 D_80197CC4; + extern u8 D_80186588[]; + + if (D_80197CC4 == 0) { + func_8013B6A0(0, (s32)&D_80186588[0], 0x2E0); + func_8013B6A0(1, (s32)&D_80186588[8], 0x2E0); + func_8013B6A0(2, (s32)&D_80186588[16], 0x2E0); + func_8013B6A0(3, (s32)&D_80186588[24], 0x2E0); + D_80197CC4 += 1; + } +} + extern void func_8013B7AC(void); void func_8018232C(void) { diff --git a/src/ov_SC06_018/ov_SC06_018_jr_8017C24C.c b/src/ov_SC06_018/ov_SC06_018_jr_8017C24C.c index 799b60b94..5abb244b7 100644 --- a/src/ov_SC06_018/ov_SC06_018_jr_8017C24C.c +++ b/src/ov_SC06_018/ov_SC06_018_jr_8017C24C.c @@ -3476,7 +3476,25 @@ s32 func_8017DCC0(s32 arg0) } -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8017C24C", func_8017DD88); +void func_8017DD88(s32 a0) { + extern void func_8012A828(s32 a0, void *a1); + extern s32 func_8012C354(s32 a0, void *a1); + extern void func_8001D0E8(s32 a0, s32 a1, s32 a2); + extern u8 D_801970C0[]; + extern u8 D_80197100; + + if (func_8012C354(a0, D_801970C0) != 0) { + func_8001D0E8(*(s32 *)(a0 + 0x20), 0xC8, 0x168); + *(u8 *)(a0 + 0xC0) = 1; + *(s32 *)(a0 + 0xB4) = -1; + *(s16 *)(a0 + 0xAE) = -1; + *(s16 *)(a0 + 2) = 1; + *(u8 *)(a0 + 0x75) = 0; + func_8012A828(a0, &D_80197100); + *(s32 *)(a0 + 0x1C) = 0xA; + } +} + extern s16 D_80197090; diff --git a/src/ov_SC06_029/ov_SC06_029_jr_8017C954.c b/src/ov_SC06_029/ov_SC06_029_jr_8017C954.c index 85337817f..8d5bd8519 100644 --- a/src/ov_SC06_029/ov_SC06_029_jr_8017C954.c +++ b/src/ov_SC06_029/ov_SC06_029_jr_8017C954.c @@ -3997,7 +3997,23 @@ void func_8017EBC4(Obj8017EBC4 *a0) { } -INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_8017C954", func_8017EDA8); +extern s32 func_8016F1AC(void); +extern void func_801746DC(void); +extern s32 func_80178B18(s32 param_1, s32 param_2); +extern void func_80016450(s32 a0, s32 a1); +extern void (*D_80190534[])(void); + +void func_8017EDA8(s32 param_1) { + if (func_8016F1AC() == 0) { + func_801746DC(); + func_80178B18(param_1, (s32)&D_80190534); + *(s16 *)(param_1 + 2) = 2; + *(s16 *)(param_1 + 0x34) = 0; + *(s32 *)(param_1 + 0x1C) = 3; + } + func_80016450(0xFF, 0); +} + void func_8017EE10(s32 param_1) { extern void func_8012BEE8(void); @@ -4160,7 +4176,63 @@ void func_8017FE58(void *fp, s32 count) -INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_8017C954", func_80180030); +#include "common.h" + +extern void *func_80185C6C(); /* TU idiom: calls go through a (s32,s32) fn-ptr cast */ +#define CALL_80185C6C ((void *(*)(s32, s32))func_80185C6C) +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012C658(s32 arg0, s32 arg1, s32 arg2); +extern u8 D_80126B5C; +extern void (*D_80190218[])(void); +extern s32 D_801DDB2C[5]; + +/* §37/§124 asm-label alias: the TU's own caller decl at line 4100 says + * `extern void func_80180030(void *a0, s32 a1);` but the target PROVABLY returns + * a value (count==0 path `addu $v0,$zero,$zero` @80180100 + final + * `sltu $v0,$zero,$v0` @80180164). A void definition DCEs those (LENGTH-DRIFT -3, + * 87 ins — byte-tested). The alias defines under a different C identifier and binds + * the emitted symbol back to func_80180030; the caller discards the return, so it is + * byte-neutral for the caller (§30#2 / §136f-2 in-TU precedent aF8018B20C). */ +s32 aF80180030(void *a0, s32 a1) __asm__("func_80180030"); +s32 aF80180030(void *a0, s32 a1) +{ + u8 idxArr[4]; + s32 valArr[4]; + s8 buf[8]; + void *cur; + s32 ptr; + s32 count; + s32 i; + s32 val; + s32 bestVal; + s32 bestSlot; + + count = 0; + cur = CALL_80185C6C(a1, 0); + ptr = D_801DDB2C[a1]; + for (i = 0; i < 4; i++, cur = (void *)((u8 *)cur + 8)) { + if (!(*(u8 *)((u8 *)cur + 6) & 0x80)) { + func_8012F214(ptr, (s32)&D_80190218[(*(u8 *)((u8 *)cur + 6) & 0xF) * 2], (s32)buf); + valArr[count] = func_80013478((s32)&D_80126B5C, (s32)buf); + idxArr[count] = i; + count++; + } + } + if (count == 0) { + return 0; + } + bestVal = valArr[0]; + bestSlot = 0; + for (i = 1; i < count; i++) { + if (valArr[i] < bestVal) { + bestVal = valArr[i]; + bestSlot = i; + } + } + return func_8012C658(0x2EF, idxArr[bestSlot], D_801DDB2C[a1]) != 0; +} + INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_8017C954", func_80180198);