diff --git a/src/ov_SC01_006/ov_SC01_006_jr_8017ED5C.c b/src/ov_SC01_006/ov_SC01_006_jr_8017ED5C.c index 36ecf5544b..bcba39edc8 100644 --- a/src/ov_SC01_006/ov_SC01_006_jr_8017ED5C.c +++ b/src/ov_SC01_006/ov_SC01_006_jr_8017ED5C.c @@ -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); diff --git a/src/ov_SC02_026/ov_SC02_026_jr_8017C180.c b/src/ov_SC02_026/ov_SC02_026_jr_8017C180.c index 225805b696..583c6a2548 100644 --- a/src/ov_SC02_026/ov_SC02_026_jr_8017C180.c +++ b/src/ov_SC02_026/ov_SC02_026_jr_8017C180.c @@ -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); 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 96511867a5..d2ff354de8 100644 --- a/src/ov_SC04_011/ov_SC04_011_jr_8017D494.c +++ b/src/ov_SC04_011/ov_SC04_011_jr_8017D494.c @@ -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[];