From 0be51bfa429607f21fd3183f1a0ecc4b223de0d8 Mon Sep 17 00:00:00 2001 From: Drew T <50529377+Druthulu@users.noreply.github.com> Date: Wed, 12 Aug 2026 16:19:39 -0600 Subject: [PATCH] feat(phase-30 S48-T6): propagate func_80183BC8 to its zero-crack siblings --- src/ov_SC04_002/ov_SC04_002_jr_8017BEBC.c | 76 ++++++++++++++++++++++- src/ov_SC04_005/ov_SC04_005_jr_8017BEBC.c | 76 ++++++++++++++++++++++- src/ov_SC04_007/ov_SC04_007_jr_8017BEBC.c | 76 ++++++++++++++++++++++- 3 files changed, 225 insertions(+), 3 deletions(-) diff --git a/src/ov_SC04_002/ov_SC04_002_jr_8017BEBC.c b/src/ov_SC04_002/ov_SC04_002_jr_8017BEBC.c index ff0e5c0933..bbebac5a80 100644 --- a/src/ov_SC04_002/ov_SC04_002_jr_8017BEBC.c +++ b/src/ov_SC04_002/ov_SC04_002_jr_8017BEBC.c @@ -7156,7 +7156,81 @@ INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_8017BEBC", func_8018710 INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_8017BEBC", func_80187174); -INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_8017BEBC", func_801871EC); + + + + + + + + +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012CBCC(s32); +extern void func_8012AD80(s32 a0); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); + + +void func_801871EC(s32 a0) +{ + + extern u8 D_80126B5C; + extern u8 D_801B4F44[]; + s16 sp10[4]; + s32 v0; + + if ((*(s32 *)(*(s32 *)(a0 + 0x64) + 0xE0) & 2) == 0) { + if (func_8012BDBC(*(s32 *)(a0 + 0x64), 0x200) == 0) { + goto skip_update; + } + v0 = func_8012B6D4((s16 *)(*(s32 *)(a0 + 0x64) + 4), (s16 *)&D_80126B5C); + { + s32 r = func_8012B608(*(s16 *)(*(s32 *)(a0 + 0x20) + 0x12), v0, 1); + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) = + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) + r; + } + } else { + sp10[0] = *(u16 *)(a0 + 0x6); + sp10[1] = *(u16 *)(a0 + 0xA); + sp10[2] = *(u16 *)(a0 + 0xE); + v0 = func_8012B70C((s16 *)(a0 + 0x88), sp10); + { + s32 r = func_8012B608(*(s16 *)(*(s32 *)(a0 + 0x20) + 0x12), v0, 4); + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) = + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) + r; + } + } + +skip_update: + func_8012B178(a0, *(s32 *)(a0 + 0xE8)); + + *(s32 *)(a0 + 0xE8) = *(s32 *)(a0 + 0xE8) + 0x18000; + if (*(u16 *)(a0 + 0x34) == 0) { + v0 = ((s32 (*)(s32))func_8012CBCC)(a0); + if (v0 != 0) { + if ((*(s32 *)(*(s32 *)(a0 + 0x64) + 0xE0) & 2) == 0) { + *(s32 *)(a0 + 0xE8) = 0; + *(s32 *)(*(s32 *)(a0 + 0x64) + 0xE0) |= 2; + *(u16 *)(a0 + 0x34) = *(u16 *)(a0 + 0x34) + 1; + } + } else { + s32 obj2 = *(s32 *)(a0 + 0x64); + s32 flags2 = *(s32 *)(obj2 + 0xE0); + if ((flags2 & 2) == 0 && *(s32 *)(a0 + 0x1C) == 0x15) { + *(s32 *)(obj2 + 0xE0) = flags2 | 2; + } + } + } else { + func_8012AD80(a0); + } + + func_8012D5E4(a0, (s32)D_801B4F44, (s32)D_801B4F44 + 8, 0xA); + *(s32 *)(a0 + 0x1C) = *(s32 *)(a0 + 0x1C) + 1; +} + /* --- types: ALREADY PRESENT in src/shared/engine_types.h (pulled into the real TU diff --git a/src/ov_SC04_005/ov_SC04_005_jr_8017BEBC.c b/src/ov_SC04_005/ov_SC04_005_jr_8017BEBC.c index d4b011a875..b1aa199783 100644 --- a/src/ov_SC04_005/ov_SC04_005_jr_8017BEBC.c +++ b/src/ov_SC04_005/ov_SC04_005_jr_8017BEBC.c @@ -7501,7 +7501,81 @@ INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_8017BEBC", func_801864D INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_8017BEBC", func_80186544); -INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_8017BEBC", func_801865BC); + + + + + + + + +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012CBCC(s32); +extern void func_8012AD80(s32 a0); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); + + +void func_801865BC(s32 a0) +{ + + extern u8 D_80126B5C; + extern u8 D_801B59D0[]; + s16 sp10[4]; + s32 v0; + + if ((*(s32 *)(*(s32 *)(a0 + 0x64) + 0xE0) & 2) == 0) { + if (func_8012BDBC(*(s32 *)(a0 + 0x64), 0x200) == 0) { + goto skip_update; + } + v0 = func_8012B6D4((s16 *)(*(s32 *)(a0 + 0x64) + 4), (s16 *)&D_80126B5C); + { + s32 r = func_8012B608(*(s16 *)(*(s32 *)(a0 + 0x20) + 0x12), v0, 1); + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) = + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) + r; + } + } else { + sp10[0] = *(u16 *)(a0 + 0x6); + sp10[1] = *(u16 *)(a0 + 0xA); + sp10[2] = *(u16 *)(a0 + 0xE); + v0 = func_8012B70C((s16 *)(a0 + 0x88), sp10); + { + s32 r = func_8012B608(*(s16 *)(*(s32 *)(a0 + 0x20) + 0x12), v0, 4); + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) = + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) + r; + } + } + +skip_update: + func_8012B178(a0, *(s32 *)(a0 + 0xE8)); + + *(s32 *)(a0 + 0xE8) = *(s32 *)(a0 + 0xE8) + 0x18000; + if (*(u16 *)(a0 + 0x34) == 0) { + v0 = ((s32 (*)(s32))func_8012CBCC)(a0); + if (v0 != 0) { + if ((*(s32 *)(*(s32 *)(a0 + 0x64) + 0xE0) & 2) == 0) { + *(s32 *)(a0 + 0xE8) = 0; + *(s32 *)(*(s32 *)(a0 + 0x64) + 0xE0) |= 2; + *(u16 *)(a0 + 0x34) = *(u16 *)(a0 + 0x34) + 1; + } + } else { + s32 obj2 = *(s32 *)(a0 + 0x64); + s32 flags2 = *(s32 *)(obj2 + 0xE0); + if ((flags2 & 2) == 0 && *(s32 *)(a0 + 0x1C) == 0x15) { + *(s32 *)(obj2 + 0xE0) = flags2 | 2; + } + } + } else { + func_8012AD80(a0); + } + + func_8012D5E4(a0, (s32)D_801B59D0, (s32)D_801B59D0 + 8, 0xA); + *(s32 *)(a0 + 0x1C) = *(s32 *)(a0 + 0x1C) + 1; +} + /* --- types: ALREADY PRESENT in src/shared/engine_types.h (pulled into the real TU diff --git a/src/ov_SC04_007/ov_SC04_007_jr_8017BEBC.c b/src/ov_SC04_007/ov_SC04_007_jr_8017BEBC.c index c65611378c..9965095e64 100644 --- a/src/ov_SC04_007/ov_SC04_007_jr_8017BEBC.c +++ b/src/ov_SC04_007/ov_SC04_007_jr_8017BEBC.c @@ -6227,7 +6227,81 @@ INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_8017BEBC", func_80182B4 INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_8017BEBC", func_80182BB0); -INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_8017BEBC", func_80182C28); + + + + + + + + +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012CBCC(s32); +extern void func_8012AD80(s32 a0); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); + + +void func_80182C28(s32 a0) +{ + + extern u8 D_80126B5C; + extern u8 D_80198078[]; + s16 sp10[4]; + s32 v0; + + if ((*(s32 *)(*(s32 *)(a0 + 0x64) + 0xE0) & 2) == 0) { + if (func_8012BDBC(*(s32 *)(a0 + 0x64), 0x200) == 0) { + goto skip_update; + } + v0 = func_8012B6D4((s16 *)(*(s32 *)(a0 + 0x64) + 4), (s16 *)&D_80126B5C); + { + s32 r = func_8012B608(*(s16 *)(*(s32 *)(a0 + 0x20) + 0x12), v0, 1); + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) = + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) + r; + } + } else { + sp10[0] = *(u16 *)(a0 + 0x6); + sp10[1] = *(u16 *)(a0 + 0xA); + sp10[2] = *(u16 *)(a0 + 0xE); + v0 = func_8012B70C((s16 *)(a0 + 0x88), sp10); + { + s32 r = func_8012B608(*(s16 *)(*(s32 *)(a0 + 0x20) + 0x12), v0, 4); + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) = + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) + r; + } + } + +skip_update: + func_8012B178(a0, *(s32 *)(a0 + 0xE8)); + + *(s32 *)(a0 + 0xE8) = *(s32 *)(a0 + 0xE8) + 0x18000; + if (*(u16 *)(a0 + 0x34) == 0) { + v0 = ((s32 (*)(s32))func_8012CBCC)(a0); + if (v0 != 0) { + if ((*(s32 *)(*(s32 *)(a0 + 0x64) + 0xE0) & 2) == 0) { + *(s32 *)(a0 + 0xE8) = 0; + *(s32 *)(*(s32 *)(a0 + 0x64) + 0xE0) |= 2; + *(u16 *)(a0 + 0x34) = *(u16 *)(a0 + 0x34) + 1; + } + } else { + s32 obj2 = *(s32 *)(a0 + 0x64); + s32 flags2 = *(s32 *)(obj2 + 0xE0); + if ((flags2 & 2) == 0 && *(s32 *)(a0 + 0x1C) == 0x15) { + *(s32 *)(obj2 + 0xE0) = flags2 | 2; + } + } + } else { + func_8012AD80(a0); + } + + func_8012D5E4(a0, (s32)D_80198078, (s32)D_80198078 + 8, 0xA); + *(s32 *)(a0 + 0x1C) = *(s32 *)(a0 + 0x1C) + 1; +} + /* --- types: ALREADY PRESENT in src/shared/engine_types.h (pulled into the real TU