From acd7ef0a2aa6f7b44d0e5313c8ba5872f89279a1 Mon Sep 17 00:00:00 2001 From: Drew T <50529377+Druthulu@users.noreply.github.com> Date: Wed, 12 Aug 2026 16:19:25 -0600 Subject: [PATCH] feat(phase-30 S48-T6): propagate func_801887DC to its zero-crack siblings --- src/ov_SC03_107/ov_SC03_107_jr_801789AC.c | 49 ++++++++++++++++++++++- src/ov_SC03_119/ov_SC03_119_jr_801863CC.c | 49 ++++++++++++++++++++++- src/ov_SC03_124/ov_SC03_124_jr_80188544.c | 49 ++++++++++++++++++++++- 3 files changed, 144 insertions(+), 3 deletions(-) diff --git a/src/ov_SC03_107/ov_SC03_107_jr_801789AC.c b/src/ov_SC03_107/ov_SC03_107_jr_801789AC.c index 11ca9de74c..76e5578f87 100644 --- a/src/ov_SC03_107/ov_SC03_107_jr_801789AC.c +++ b/src/ov_SC03_107/ov_SC03_107_jr_801789AC.c @@ -7973,7 +7973,54 @@ INCLUDE_ASM("asm/ov_SC03_107/nonmatchings/ov_SC03_107_jr_801789AC", func_801812B INCLUDE_ASM("asm/ov_SC03_107/nonmatchings/ov_SC03_107_jr_801789AC", func_801812F8); -INCLUDE_ASM("asm/ov_SC03_107/nonmatchings/ov_SC03_107_jr_801789AC", func_8018134C); + +extern s32 func_8004787C(s32 a0); +extern s32 func_80047948(s32 a0); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); + +s32 func_8018134C(s32 a0, s16 a1, s16 a2) { + s16 p1[3]; + s16 p2[3]; + s32 t; + s32 result; + + p1[0] = *(u16 *)(a0 + 6); + p1[1] = *(u16 *)(a0 + 0xA); + p1[2] = *(u16 *)(a0 + 0xE); + + t = func_8004787C(*(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) & 0xFFF) * a1; + p2[1] = p1[1]; + p2[0] = p1[0] - (t >> 12); + + t = func_80047948(*(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) & 0xFFF) * a1; + p2[2] = p1[2] - (t >> 12); + + result = func_80133784(1, p1, (s32)p2); + + if ((result & 0x8000) && a2) { + t = func_8004787C(*(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) & 0xFFF) * a1; + p1[1] = p2[1]; + p1[0] = p2[0] + (t >> 12); + + t = func_80047948(*(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) & 0xFFF) * a1; + p1[2] = p2[2] + (t >> 12); + + result = func_80133784(1, p2, (s32)p1); + + *(s16 *)(a0 + 6) = p1[0]; + *(s16 *)(a0 + 0xA) = p1[1]; + *(s16 *)(a0 + 0xE) = p1[2]; + + if (!(*(u16 *)(a0 + 0x84) & 2)) { + *(u16 *)(a0 + 0x84) |= 2; + } + } else { + *(u16 *)(a0 + 0x84) &= ~2; + } + + return result; +} + INCLUDE_ASM("asm/ov_SC03_107/nonmatchings/ov_SC03_107_jr_801789AC", func_80181500); diff --git a/src/ov_SC03_119/ov_SC03_119_jr_801863CC.c b/src/ov_SC03_119/ov_SC03_119_jr_801863CC.c index 323d93e77c..2b06635fe1 100644 --- a/src/ov_SC03_119/ov_SC03_119_jr_801863CC.c +++ b/src/ov_SC03_119/ov_SC03_119_jr_801863CC.c @@ -4085,7 +4085,54 @@ INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_801863CC", func_8018874 INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_801863CC", func_80188788); -INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_801863CC", func_801887DC); + +extern s32 func_8004787C(s32 a0); +extern s32 func_80047948(s32 a0); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); + +s32 func_801887DC(s32 a0, s16 a1, s16 a2) { + s16 p1[3]; + s16 p2[3]; + s32 t; + s32 result; + + p1[0] = *(u16 *)(a0 + 6); + p1[1] = *(u16 *)(a0 + 0xA); + p1[2] = *(u16 *)(a0 + 0xE); + + t = func_8004787C(*(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) & 0xFFF) * a1; + p2[1] = p1[1]; + p2[0] = p1[0] - (t >> 12); + + t = func_80047948(*(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) & 0xFFF) * a1; + p2[2] = p1[2] - (t >> 12); + + result = func_80133784(1, p1, (s32)p2); + + if ((result & 0x8000) && a2) { + t = func_8004787C(*(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) & 0xFFF) * a1; + p1[1] = p2[1]; + p1[0] = p2[0] + (t >> 12); + + t = func_80047948(*(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) & 0xFFF) * a1; + p1[2] = p2[2] + (t >> 12); + + result = func_80133784(1, p2, (s32)p1); + + *(s16 *)(a0 + 6) = p1[0]; + *(s16 *)(a0 + 0xA) = p1[1]; + *(s16 *)(a0 + 0xE) = p1[2]; + + if (!(*(u16 *)(a0 + 0x84) & 2)) { + *(u16 *)(a0 + 0x84) |= 2; + } + } else { + *(u16 *)(a0 + 0x84) &= ~2; + } + + return result; +} + INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_801863CC", func_80188990); diff --git a/src/ov_SC03_124/ov_SC03_124_jr_80188544.c b/src/ov_SC03_124/ov_SC03_124_jr_80188544.c index 4df9c04bb0..4055d8c924 100644 --- a/src/ov_SC03_124/ov_SC03_124_jr_80188544.c +++ b/src/ov_SC03_124/ov_SC03_124_jr_80188544.c @@ -3681,7 +3681,54 @@ void func_80189CB0(s32 a0) { INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_80188544", func_80189CF0); -INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_80188544", func_80189D4C); + +extern s32 func_8004787C(s32 a0); +extern s32 func_80047948(s32 a0); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); + +s32 func_80189D4C(s32 a0, s16 a1, s16 a2) { + s16 p1[3]; + s16 p2[3]; + s32 t; + s32 result; + + p1[0] = *(u16 *)(a0 + 6); + p1[1] = *(u16 *)(a0 + 0xA); + p1[2] = *(u16 *)(a0 + 0xE); + + t = func_8004787C(*(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) & 0xFFF) * a1; + p2[1] = p1[1]; + p2[0] = p1[0] - (t >> 12); + + t = func_80047948(*(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) & 0xFFF) * a1; + p2[2] = p1[2] - (t >> 12); + + result = func_80133784(1, p1, (s32)p2); + + if ((result & 0x8000) && a2) { + t = func_8004787C(*(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) & 0xFFF) * a1; + p1[1] = p2[1]; + p1[0] = p2[0] + (t >> 12); + + t = func_80047948(*(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) & 0xFFF) * a1; + p1[2] = p2[2] + (t >> 12); + + result = func_80133784(1, p2, (s32)p1); + + *(s16 *)(a0 + 6) = p1[0]; + *(s16 *)(a0 + 0xA) = p1[1]; + *(s16 *)(a0 + 0xE) = p1[2]; + + if (!(*(u16 *)(a0 + 0x84) & 2)) { + *(u16 *)(a0 + 0x84) |= 2; + } + } else { + *(u16 *)(a0 + 0x84) &= ~2; + } + + return result; +} + INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_80188544", func_80189F00);