diff --git a/src/ov_SC01_074/ov_SC01_074_jr_8017BE9C.c b/src/ov_SC01_074/ov_SC01_074_jr_8017BE9C.c index c011a9f99..0eec77430 100644 --- a/src/ov_SC01_074/ov_SC01_074_jr_8017BE9C.c +++ b/src/ov_SC01_074/ov_SC01_074_jr_8017BE9C.c @@ -3351,7 +3351,27 @@ void func_8017D2F8(void *a0, s32 a1) { } -INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_8017BE9C", func_8017D364); +extern void func_800139C8(s32 a0, void *a1, void *a2); +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 u16 D_800B99DA; +extern u8 D_801821C8[]; + +void func_8017D364(int param_1) +{ + u64 vec; + u32 out; + + func_800139C8(*(s16 *)(*(s32 *)(param_1 + 0x20) + 0x12), D_801821C8, &vec); + func_80013E94(&vec, &out); + out |= 0x80000000; + if ((D_800B99DA & 3) == 0) { + func_80146A6C(6, (void *)param_1, *(s16 *)(param_1 + 6), + (s16)(*(u16 *)(param_1 + 0xA) - 0x40), + *(s16 *)(param_1 + 0xE), out, 0); + } +} + extern void func_8016EE40(s32 a0, s32 a1, s32 a2); void func_8017D3FC(void) { diff --git a/src/ov_SC02_003/ov_SC02_003_jr_8018173C.c b/src/ov_SC02_003/ov_SC02_003_jr_8018173C.c index 24ca11d8f..896621ec8 100644 --- a/src/ov_SC02_003/ov_SC02_003_jr_8018173C.c +++ b/src/ov_SC02_003/ov_SC02_003_jr_8018173C.c @@ -4249,7 +4249,90 @@ DEFINE_func_801863E8() /* dedup: shared engine-core @0x801863E8 (src/shared) */ DEFINE_func_80186424() /* dedup: shared engine-core @0x80186424 (src/shared) */ -INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8018173C", func_80186530); +void func_80186530(s32 self) +{ + extern void func_80186424(s32 a0); + extern void func_8002D4C8(s32 a0, s32 a1); + extern s32 func_8012BD14(s32 a0); + extern void func_8016EDEC(s32 a0, s32 a1, s32 a2); + extern void func_8005C2C8(s32 a0, s32 a1); + extern void func_8012C218(void *a0); + extern void func_801827C0(void *a0); + extern s32 D_8018F314; + extern s32 D_8018F318; + extern s32 D_801270C8; + extern s32 D_801270D4; + + s32 v1; + s32 v0; + s32 *a0; + s32 t; + s32 a1; + + func_80186424(self); + v1 = *(s32 *)(self + 0x20); + *(u16 *)(v1 + 0x12) += 0x10; + a1 = *(s32 *)(self + 0xCC); + *(u16 *)(a1 + 8) = *(u16 *)(self + 6); + *(u16 *)(a1 + 10) = *(u16 *)(self + 10); + t = *(u16 *)(self + 0xE); + *(u16 *)(a1 + 0x2C) |= 0x10; + *(u16 *)(a1 + 0xC) = t; + v1 = D_8018F318 * *(s16 *)(self + 0xFC); + if (v1 < 0) { + v1 += 15; + } + v1 = (v1 >> 4) + D_8018F314; + *(s16 *)(a1 + 0x1C) = v1; + *(s16 *)(a1 + 0x1A) = v1; + *(s16 *)(a1 + 0x18) = v1; + a0 = &D_801270C8; + if (*(s32 *)(self + 0xDC) != *a0) { + *(s32 *)(self + 0xDC) = *a0; + *(s32 *)(self + 0xE0) = 8; + } + v0 = *(s32 *)(self + 0xE0); + if (v0 != 0) { + *(s32 *)(self + 0xE0) = v0 - 1; + } else if (*a0 != 0) { + if (*(s16 *)(self + 0xFE) == 0) { + func_8002D4C8(0x4C6, 0); + func_8002D4C8(0x4CE, 0); + } + *(s16 *)(self + 0xFE) = 1; + *(s32 *)(*(s32 *)(self + 0x20) + 4) |= 0x80000000; + *(s16 *)(self + 0x5C) = 0; + if (func_8012BD14(self) < 0x901) { + ((void (*)(void *, s32))func_8016EDEC)(func_801827C0, 0x1000000); + D_801270D4 = 1; + func_8005C2C8(*(s32 *)(self + 0xCC), 0x84); + func_8012C218((void *)self); + return; + } + } else { + if (*(s16 *)(self + 0xFE) == 1) { + func_8002D4C8(0x4C7, 0); + } + *(s16 *)(self + 0xFE) = 0; + *(s16 *)(self + 0x5C) = 0x800; + *(s32 *)(*(s32 *)(self + 0x20) + 4) &= 0x7FFFFFFF; + } + v0 = *(s32 *)(*(s32 *)(self + 0x20) + 4); + if (v0 < 0) { + v0 = *(u16 *)(self + 0xFC) - 1; + *(s16 *)(self + 0xFC) = v0; + if ((s16)v0 < 0) { + *(s16 *)(self + 0xFC) = 0; + } + } else { + v0 = *(u16 *)(self + 0xFC) + 1; + *(s16 *)(self + 0xFC) = v0; + if ((s16)v0 >= 0x11) { + *(s16 *)(self + 0xFC) = 0x10; + } + } +} + DEFINE_func_80186764() /* dedup: shared engine-core @0x80186764 (src/shared) */ @@ -5206,7 +5289,39 @@ void func_80189A00(void *param_1) { } -INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8018173C", func_80189A70); +typedef struct { + s16 start; + s16 end; +} Range_80189A70; + +extern u8 D_8018F71C[]; +extern s16 D_8018F71E; +extern void *func_80189DB8(); + +void func_80189A70(s32 *a0) +{ + s32 v; + s32 t; + s32 c; + Range_80189A70 range; + + v = (s16)(*(u16 *)((s32)a0 + 0x100) -= 0x10); + if (v < 0) { + D_8018F71E = 1; + func_8012AD44(a0, 0); + return; + } + t = v << 8; + if (v >= 0x20) { + c = v | 0x202000; + } else { + c = v | ((v << 16) | t); + } + range.start = 0; + range.end = 0x50; + func_80189B1C(a0, &range, D_8018F71C, func_80189DB8(a0, c)); +} + INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8018173C", func_80189B1C); 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 352179a57..a4aa44f5c 100644 --- a/src/ov_SC03_028/ov_SC03_028_jr_8017DF98.c +++ b/src/ov_SC03_028/ov_SC03_028_jr_8017DF98.c @@ -7951,7 +7951,25 @@ void func_80189234(void) { INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8017DF98", func_8018923C); -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8017DF98", func_801892E0); +void func_801892E0(s32 arg0) { + s16 var; + s16 t; + s16 idx; + s32 s0; + + extern s32 D_80190748[]; + + s0 = arg0; + var = *(u16 *)(s0 + 0xFC); + t = var >> 1; + idx = t % 6; + func_800183E0(D_80190748[idx]); + *(u16 *)(s0 + 6) -= 8; + if (--*(s32 *)(s0 + 0x1C) == 0) { + *(u16 *)(s0 + 2) = 2; + } +} + extern void func_800183E0(s32 a0); extern s32 func_8012C588(s32 a0, s32 a1); diff --git a/src/ov_SC03_030/ov_SC03_030_jr_8017AE2C.c b/src/ov_SC03_030/ov_SC03_030_jr_8017AE2C.c index d4f286722..c1db8e345 100644 --- a/src/ov_SC03_030/ov_SC03_030_jr_8017AE2C.c +++ b/src/ov_SC03_030/ov_SC03_030_jr_8017AE2C.c @@ -4999,7 +4999,29 @@ void func_8017FCBC(void) { INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8017AE2C", func_80180054); -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8017AE2C", func_801801E8); +extern s16 D_80126CB4; + +s32 func_801801E8(void *arg0, s32 arg1) { + void *p; + s32 best; + s32 lim; + s32 w; + s32 val; + + best = 0xFFFF; + p = arg0; + while (*(s16 *)((u8 *)p + 6) == 0) { + lim = (s16)arg1; + w = func_80013294(&D_80126CB4, p); + val = w & 0xFFFF; + if (val < lim && (u32)val < (u32)(u16)best) { + best = w; + } + p = (u8 *)p + 8; + } + return best & 0xFFFF; +} + extern void (*D_80186884[])(void); 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 0c3ef5d7d..5c69ac99f 100644 --- a/src/ov_SC03_093/ov_SC03_093_jr_8017D898.c +++ b/src/ov_SC03_093/ov_SC03_093_jr_8017D898.c @@ -5374,7 +5374,48 @@ s32 func_80182208(s32 a0, s16 a1) { INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8017D898", func_80182288); -INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8017D898", func_8018232C); +extern void func_801292C8(u8 *a0); + +void func_8018232C(int param_1) { + s32 s1; + s32 r; + s16 rs; + u32 prod; + u32 t; + u8 b; + + s1 = *(s32 *)(param_1 + 0x20); + if (*(u16 *)(param_1 + 2) == 0) { + r = func_8004787C(*(s32 *)(param_1 + 0x1C) << 6); + t = r * 3; + t += t >> 31; + t >>= 1; + *(s16 *)(s1 + 0x18) = t; + *(s16 *)(s1 + 0x1A) = t; + *(s32 *)(param_1 + 0x1C) += 1; + if (*(s32 *)(param_1 + 0x1C) >= 0x10) { + *(u16 *)(param_1 + 2) += 1; + *(s32 *)(param_1 + 0x1C) = *(s32 *)(param_1 + 0x1C) * 2 - 1; + } + } else { + rs = func_8004787C(*(s32 *)(param_1 + 0x1C) << 5); + prod = *(s32 *)(param_1 + 0x2C) * rs; + t = rs * 3; + t += t >> 31; + t >>= 1; + *(s16 *)(s1 + 0x18) = t; + *(s16 *)(s1 + 0x1A) = t; + b = prod >> 12; + *(s8 *)(s1 + 0x24) = b; + *(s8 *)(s1 + 0x25) = b; + *(s8 *)(s1 + 0x26) = b; + *(s32 *)(param_1 + 0x1C) -= 1; + if (*(s32 *)(param_1 + 0x1C) == 0) { + func_801292C8((u8 *)param_1); + } + } +} + /* func_80182434 — "spawn a paired effect entity above/below the actor" template 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 ab01e9fdf..1d754b38b 100644 --- a/src/ov_SC03_107/ov_SC03_107_jr_801789AC.c +++ b/src/ov_SC03_107/ov_SC03_107_jr_801789AC.c @@ -6053,7 +6053,33 @@ void func_8017D5C4(void *a0) { void func_8017D690(void) { } -INCLUDE_ASM("asm/ov_SC03_107/nonmatchings/ov_SC03_107_jr_801789AC", func_8017D698); +#include "common.h" + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C2C4(s32 a0); +extern u8 D_801860C8[]; + +void func_8017D698(s32 a0) { + s32 r; + s32 v1; + + if (*(u16 *)(a0 + 0x2) == 0) { + r = ((s32 (*)(void))func_8012C1B8)(); + *(s32 *)(a0 + 0x20) = r; + if (r == 0) { + func_8012CAE4((void *)a0); + return; + } + ((void (*)(s32))func_8001C2C4)(r); + *(s16 *)(a0 + 0x5C) = 0x40; + *(u8 *)(a0 + 0x75) = 0x4; + *(u16 *)(a0 + 0x2) = *(u16 *)(a0 + 0x2) + 1; + v1 = *(s16 *)(a0 + 0x70) << 4; + *(s32 *)(a0 + 0x58) = (s32)&D_801860C8 + v1; + } +} + s32 func_8017D728(void) { @@ -8091,7 +8117,25 @@ void func_801805BC(void *a0) { INCLUDE_ASM("asm/ov_SC03_107/nonmatchings/ov_SC03_107_jr_801789AC", func_801805F8); -INCLUDE_ASM("asm/ov_SC03_107/nonmatchings/ov_SC03_107_jr_801789AC", func_8018065C); +void func_8018065C(void *a0) { + extern s32 D_801151D4; + extern void (*D_80197554[])(void *); + s16 in[8]; + s32 out[2]; + s32 s0 = (s32)a0; + s32 v1 = D_801151D4; + s32 t; + + in[1] = *(s32 *)(v1 + 0x5C); + in[3] = *(s32 *)(v1 + 0x60); + in[5] = *(s32 *)(v1 + 0x64); + func_8012B77C((s32)out, s0 + 4, (s32)in); + t = out[0]; + *(s16 *)(*(s32 *)(s0 + 0x20) + 0x10) = t; + *(s16 *)(*(s32 *)(s0 + 0x20) + 0x12) = t >> 16; + D_80197554[*(u16 *)(s0 + 2)](a0); +} + extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); diff --git a/src/ov_SC03_118/ov_SC03_118_jr_8017FB84.c b/src/ov_SC03_118/ov_SC03_118_jr_8017FB84.c index 454abdf84..db06859e6 100644 --- a/src/ov_SC03_118/ov_SC03_118_jr_8017FB84.c +++ b/src/ov_SC03_118/ov_SC03_118_jr_8017FB84.c @@ -4621,7 +4621,7 @@ extern void func_800D0C48(s32 a0); /* TU:1469 */ extern s32 func_8014CB2C(void); /* TU:560 */ extern void func_8012A018(s32 a, s32 b); /* TU:2412 */ extern void func_801842DC(s32 a0); /* TU:4023 INCLUDE_ASM (no decl) */ -extern s32 func_80183830(void); /* TU:3930 INCLUDE_ASM (no decl) */ +extern s32 func_80183830(); /* TU:3930 INCLUDE_ASM (no decl) */ extern void func_80029124(s32, s32); /* TU:50 */ extern s32 func_8016F0AC(); /* TU:1945 */ extern void func_8012C588(s32 a0, s32 a1); /* not in TU */ diff --git a/src/ov_SC03_119/ov_SC03_119_jr_8017FB84.c b/src/ov_SC03_119/ov_SC03_119_jr_8017FB84.c index 95a36d996..7a0b19b67 100644 --- a/src/ov_SC03_119/ov_SC03_119_jr_8017FB84.c +++ b/src/ov_SC03_119/ov_SC03_119_jr_8017FB84.c @@ -4632,7 +4632,7 @@ extern void func_800D0C48(s32 a0); /* TU:1469 */ extern s32 func_8014CB2C(void); /* TU:560 */ extern void func_8012A018(s32 a, s32 b); /* TU:2412 */ extern void func_801842DC(s32 a0); /* TU:4023 INCLUDE_ASM (no decl) */ -extern s32 func_80183830(void); /* TU:3930 INCLUDE_ASM (no decl) */ +extern s32 func_80183830(); /* TU:3930 INCLUDE_ASM (no decl) */ extern void func_80029124(s32, s32); /* TU:50 */ extern s32 func_8016F0AC(); /* TU:1945 */ extern void func_8012C588(s32 a0, s32 a1); /* not in TU */ 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 84e9cf6b7..6863bb894 100644 --- a/src/ov_SC04_011/ov_SC04_011_jr_8017D494.c +++ b/src/ov_SC04_011/ov_SC04_011_jr_8017D494.c @@ -8318,7 +8318,12 @@ default_case: void func_801873D0(void) { } -INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8017D494", func_801873D8); +extern void func_8012AD44(s32 *a0, s16 a1); + +void func_801873D8(s32 arg0) { + func_8012AD44((s32 *)arg0, 3); +} + #include "common.h" diff --git a/src/ov_SC05_017/ov_SC05_017_jr_8017AE2C.c b/src/ov_SC05_017/ov_SC05_017_jr_8017AE2C.c index d3e6e1afe..9ce6b25cb 100644 --- a/src/ov_SC05_017/ov_SC05_017_jr_8017AE2C.c +++ b/src/ov_SC05_017/ov_SC05_017_jr_8017AE2C.c @@ -5107,7 +5107,23 @@ extern s32 func_80029178(s32 arg); INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_8017AE2C", func_8017EE10); -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_8017AE2C", func_8017EEC8); +extern s32 func_801848AC(s32 arg0, s32 arg1); +extern s16 func_80184B44(void); + +void func_8017EEC8(void *a0) { + s32 ok; + + if (((s32 (*)(void))func_80184B44)() == 1) { + ok = 0; + } else { + ok = func_801848AC(9, 0x11) != 0; + } + + if (ok != 0) { + func_8017E7EC(a0); + } +} + INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_8017AE2C", func_8017EF20); @@ -6865,7 +6881,52 @@ void func_801818A0(s32 a0) { } -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_8017AE2C", func_8018193C); +extern void func_8012A828(s32, s32); +extern void func_801849B8(s32*, s32); + +void func_8018193C(void *a0) { + + /* [T51] shadow: file-scope `extern s16 ((s32 (*)(void))func_80184B44)(void)` (this TU, near + func_8017FA58) is in scope at this point and would sign-extend $v0 with + an sll after the jal; the target has none. Block-scope int-return decl + restores the implicit-int call shape (cf. func_80181364's cast). */ + extern s16 func_80184B44(void); + + extern s16 D_801918BC; + extern s16 D_801918B4; + extern short D_801C0CFC; + extern short D_801918AC; + extern s32 D_801D5AFC; + extern s32 D_801D2C58; + extern s32 D_801ECE80; + extern s32 func_80181A4C(void*); + void *v1; + + if (((s32 (*)(void))func_80184B44)() != 0) { + func_8012CAE4(a0); + return; + } + if (func_801844BC(a0, &D_801918BC) == 0) { + return; + } + func_8001C97C((s32)&D_801D5AFC); + D_801ECE80 = D_801D2C58; + D_801D2C58 = D_801D5AFC; + if (func_801848AC(7, 0xE) != 0) { + *(s16 *)((char *)a0 + 0x2) = 3; + func_8012E8E0((s32)a0, (s32)&D_801918B4); + func_8012E88C((s32)a0); + ((void (*)(s32 *, s32))func_8012A828)((s32 *)a0, (s32)&D_801C0CFC); + func_80184990((s32)a0); + } else { + *(s16 *)((char *)a0 + 0x2) = 1; + ((void (*)(s32, s32))func_801849B8)((int)a0, (int)&D_801918AC); + } + v1 = *(void **)((char *)a0 + 0x68); + *(s16 *)((char *)v1 + 0xC) = 0x7FFF; + *(s32 *)((char *)a0 + 0xD4) = func_801788B8((s32)a0, (s32)&func_80181A4C); +} + extern s32 func_8012BD14(s32 a0); extern s32 func_8012E544(s32 a0); @@ -7223,7 +7284,25 @@ void func_80182410(int param_1) } -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_8017AE2C", func_80182448); +extern void func_80184BD4(s32, s32, s32, s32); +extern s32 func_801848AC(s32 arg0, s32 arg1); +extern s32 func_80184CA4(s32); + +void func_80182448(s32 a0) { + extern s32 D_801B6578; + extern void func_80181F60(s32); + + if (func_80184CA4(a0) == 0) { + return; + } + + if (func_801848AC(9, 0x11) == 0) { + ((void (*)(void *))func_80181F60)((void *)a0); + } else { + func_80184BD4(a0, (s32)&D_801B6578, 0, 0x40); + } +} + extern int func_80178970(void); extern s32 D_801B9C0C; diff --git a/src/ov_SC06_000/ov_SC06_000_jr_8017AE2C.c b/src/ov_SC06_000/ov_SC06_000_jr_8017AE2C.c index fd9ed32c9..b3cf03b10 100644 --- a/src/ov_SC06_000/ov_SC06_000_jr_8017AE2C.c +++ b/src/ov_SC06_000/ov_SC06_000_jr_8017AE2C.c @@ -3356,7 +3356,14 @@ void func_8017BF58(void *a0) { DEFINE_func_8017BF98() /* dedup: shared engine-core @0x8017BF98 (src/shared) */ -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8017AE2C", func_8017BFA0); +extern void func_80174684(void *); +extern void func_8017BFC8(void *); + +s32 func_8017BFA0(void) +{ + func_80174684((void *)func_8017BFC8); +} + extern void (*D_8018BC80[])(void); @@ -8358,7 +8365,7 @@ extern void func_8017BEBC(void); } -extern s32 func_8017BFA0(void); +extern s32 func_8017BFA0(); void func_801849C8(void) { func_8017BFA0(); } diff --git a/src/shared/engine_core.h b/src/shared/engine_core.h index 3dc571787..34561aec6 100644 --- a/src/shared/engine_core.h +++ b/src/shared/engine_core.h @@ -3238,7 +3238,7 @@ } #define DEFINE_func_801890D8() \ - extern void func_8017BFA0(void); \ + extern void func_8017BFA0(); \ void func_801890D8(void) { \ func_8017BFA0(); \ } @@ -50947,7 +50947,7 @@ } #define DEFINE_func_801828C4() \ - extern void func_8017BFA0(void); \ + extern void func_8017BFA0(); \ void func_801828C4(void) { \ func_8017BFA0(); \ } @@ -56458,7 +56458,7 @@ extern void func_80182704(void *a0); \ extern void func_8017BEBC(void); \ extern void func_801828A4(void); \ - extern void func_8017BFA0(void); \ + extern void func_8017BFA0(); \ extern void func_801828C4(void); \ extern void func_800D0C48(s32 arg); \ extern void func_801828E4(void); \ @@ -98636,7 +98636,7 @@ } #define DEFINE_func_801890D8() \ - extern void func_8017BFA0(void); \ + extern void func_8017BFA0(); \ void func_801890D8(void) { \ func_8017BFA0(); \ } @@ -146345,7 +146345,7 @@ } #define DEFINE_func_801828C4() \ - extern void func_8017BFA0(void); \ + extern void func_8017BFA0(); \ void func_801828C4(void) { \ func_8017BFA0(); \ } @@ -151856,7 +151856,7 @@ extern void func_80182704(void *a0); \ extern void func_8017BEBC(void); \ extern void func_801828A4(void); \ - extern void func_8017BFA0(void); \ + extern void func_8017BFA0(); \ extern void func_801828C4(void); \ extern void func_800D0C48(s32 arg); \ extern void func_801828E4(void); \