diff --git a/src/ov_SC01_005/ov_SC01_005_jr_8017C340.c b/src/ov_SC01_005/ov_SC01_005_jr_8017C340.c index eb9217fbc..9c0c2f1df 100644 --- a/src/ov_SC01_005/ov_SC01_005_jr_8017C340.c +++ b/src/ov_SC01_005/ov_SC01_005_jr_8017C340.c @@ -3351,7 +3351,41 @@ void func_8017D5FC(void) { } -INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_8017C340", func_8017D624); +void func_8017D624(void) { + extern void func_8012A018(s32 a0, s32 a1); + extern void func_8012A094(s32 a0); + extern void func_8017D7A4(void *a0); + extern s32 D_80126954; + extern s32 D_8012695C; + extern s16 D_80126968; + extern s16 D_8012696A; + extern s16 D_8012696C; + extern s16 D_80126976; + extern s16 D_80126978; + extern s16 D_8012697A; + extern u8 D_80126948[]; + extern s32 D_801274E8; + extern s16 D_801274EA; + extern s16 D_801274EC; + s32 val; + + D_80126954 = 300; + D_8012695C = 700; + D_80126968 = 0; + D_8012696A = 0x850; + D_8012696C = 0; + D_80126976 = 0; + val = -130; + D_80126978 = val; + D_8012697A = 0; + func_8012A018((s32)func_8017D7A4, 0); + *(s16 *)&D_801274E8 = 13; + D_801274EA = val; + D_801274EC = 138; + func_8017D7A4(D_80126948); + func_8012A094((s32)D_80126948); +} + void func_8017D6E4(void) { extern void func_8012A018(s32 a, s32 b); diff --git a/src/ov_SC01_005/ov_SC01_005_jr_8017ED5C.c b/src/ov_SC01_005/ov_SC01_005_jr_8017ED5C.c index 4e55b076d..e5e58910b 100644 --- a/src/ov_SC01_005/ov_SC01_005_jr_8017ED5C.c +++ b/src/ov_SC01_005/ov_SC01_005_jr_8017ED5C.c @@ -4530,7 +4530,48 @@ void func_80182000(void *a0) { } -INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_8017ED5C", func_8018203C); +extern u8 D_801CDA10[]; +extern s32 D_801C36F8[]; +extern s32 D_801CDD30; +extern u8 D_811CDE20[]; + +void func_8018203C(s32 a0, s32 a1) { + register u32 *d __asm__("$5"); + register s32 *p __asm__("$6"); + register u16 *dh __asm__("$3"); + register u16 *sh __asm__("$4"); + register s32 mask __asm__("$9"); + register s32 *elseVal __asm__("$8"); + register u8 *ifVal __asm__("$7"); + + *(s16 *)(a0 + 0xFE) = a1; + p = *(s32 **)(D_801C36F8[(s16)a1] + (*(s16 *)(a0 + 0x70)) * 4); + d = (u32 *)D_801CDA10; + if (*p != 0) { + mask = 0x1000000; + elseVal = &D_801CDD30; + ifVal = D_811CDE20; + sh = (u16 *)((u8 *)p + 6); + dh = (u16 *)((u8 *)d + 6); + do { + if (!(*p & mask)) { + *d = (u32)elseVal; + } else { + *d = (u32)ifVal; + } + d += 2; + dh[-1] = sh[-1]; + p += 2; + dh[0] = sh[0]; + sh += 4; + dh += 4; + } while (*p != 0); + } + *d = 0; + *(s16 *)((u8 *)d + 4) = -1; + *(s16 *)((u8 *)d + 6) = 0; +} + typedef struct { u8 b[12]; } Blk12_820F8; typedef struct { u8 b[8]; } Blk8_820F8; diff --git a/src/ov_SC02_015/ov_SC02_015_jr_8017AE2C.c b/src/ov_SC02_015/ov_SC02_015_jr_8017AE2C.c index 80d1b9d61..cc162a0fa 100644 --- a/src/ov_SC02_015/ov_SC02_015_jr_8017AE2C.c +++ b/src/ov_SC02_015/ov_SC02_015_jr_8017AE2C.c @@ -4232,7 +4232,46 @@ extern s32 func_8012AD50(void *a0); } -INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_8017AE2C", func_8017D9E4); +extern s32 func_8012BEE8(s32 a0); +extern void func_80015978(s32 a0, s32 *a1); +extern u8 *func_801290DC(s32 a0, u8 *a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern s32 rand(void); + +void func_8017D9E4(s32 param_1) { + u16 delta[4]; + register s32 t __asm__("$3"); + s32 t2; + s16 d; + s32 obj; + + if (func_8012BEE8(param_1) == 0) { + return; + } + func_80015978(param_1 + 4, (s32 *)delta); + if (*(s32 *)(param_1 + 0xDC) != 0) { + t = rand() % 352; + d = t; + if (t & 1) { + d = -t; + } + delta[0] += d; + t2 = rand(); + t2 = t2 % 256; + d = t2; + if (t2 & 1) { + d = -t2; + } + delta[2] += d; + } + obj = (s32)func_801290DC(0x27, (u8 *)delta); + if (obj == 0) { + return; + } + func_8012BF4C((s32 *)param_1, (rand() & 0x7F) + 0x60); + *(u16 *)(obj + 0x2E) = *(u16 *)(param_1 + 0xFC); +} + extern void (*D_80181D94[])(void); diff --git a/src/ov_SC03_010/ov_SC03_010_jr_8017C730.c b/src/ov_SC03_010/ov_SC03_010_jr_8017C730.c index 0916201f7..253ade4b2 100644 --- a/src/ov_SC03_010/ov_SC03_010_jr_8017C730.c +++ b/src/ov_SC03_010/ov_SC03_010_jr_8017C730.c @@ -3765,7 +3765,55 @@ void func_8017E04C(void *a0) { } -INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_8017C730", func_8017E088); + + +extern u16 D_80126B5E; +extern u16 D_80126B66; +extern SVECTOR_8016E7C8 D_8019EBC4; +extern SVECTOR_8016E7C8 D_80126940; +extern u16 D_80126942; + +extern s32 ratan2(s32 a0, s32 a1); +extern s32 func_80013294(void *a0, void *a1); +extern void func_8017F1B0(s32 a0, void *a1, void *a2); +extern void func_8017E1EC(s32 param_1, s32 param_2, s16 *param_3); + +void func_8017E088(s32 arg0) { + SVECTOR_8016E7C8 sp10; + SVECTOR_8016E7C8 sp18; + s32 angle; + s32 finalAngle; + s16 temp; + register s32 zr __asm__("$0"); + + sp18 = D_8019EBC4; + angle = ratan2(*(s16 *) &D_80126B5E, *(s16 *) &D_80126B66) & 0xFFF; + sp10 = D_80126940; + sp18.vy = D_80126942; + temp = func_80013294(&sp10, &sp18); + finalAngle = angle + zr; + if (temp >= 0x281) { + sp10.vx = 0; + sp10.vy = D_80126942; + sp10.vz = 0x280; + func_8017F1B0(angle, &sp10, &sp10); + sp10.vx >>= 3; + sp10.vy >>= 3; + sp10.vz >>= 3; + } else { + if (temp < 0x1C0) { + sp10.vx = 0; + sp10.vy = D_80126942; + sp10.vz = 0x1C0; + func_8017F1B0(angle, &sp10, &sp10); + sp10.vx >>= 3; + sp10.vy >>= 3; + sp10.vz >>= 3; + } + } + func_8017E1EC(arg0, finalAngle, (s16 *) &sp10); +} + extern s32 func_80012C6C(s32 a0, s32 a1, s32 a2); diff --git a/src/ov_SC03_014/ov_SC03_014_jr_801848E4.c b/src/ov_SC03_014/ov_SC03_014_jr_801848E4.c index 724c3ae5e..c09511f3d 100644 --- a/src/ov_SC03_014/ov_SC03_014_jr_801848E4.c +++ b/src/ov_SC03_014/ov_SC03_014_jr_801848E4.c @@ -2756,7 +2756,46 @@ extern void func_80184440(void); DEFINE_func_801848E4() /* dedup: shared engine-core @0x801848E4 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_801848E4", func_80184920); +extern s32 func_80184E4C(s32 a0, s32 a1, s16 a2, s16 a3, s32 a4); +extern void func_80016714(void *a0, s32 a1); +extern s32 func_80029178(s32 arg); +extern void func_8012CAE4(void *a0); +extern u16 D_8018FB40[]; + +void func_80184920(void *param_1) { + s32 v0; + + v0 = func_80184E4C((s32)param_1, (s32)D_8018FB40, 0x300, 0x140, 0x88); + *(s32 *)((s32)param_1 + 0xCC) = v0; + if (v0 == 0) { + goto L8018498C; + } + v0 = func_80184E4C((s32)param_1, (s32)D_8018FB40, 0x310, 0x140, 0x89); + *(s32 *)((s32)param_1 + 0xD0) = v0; + if (v0 != 0) { + goto L8018499C; + } + func_80016714(*(void **)((s32)param_1 + 0xCC), 0x38); +L8018498C: + func_8012CAE4(param_1); + return; +L8018499C: + *(s16 *)(*(s32 *)((s32)param_1 + 0xCC) + 0x12) = + *(s16 *)(*(s32 *)((s32)param_1 + 0x68) + 0xC); + *(s16 *)(*(s32 *)((s32)param_1 + 0xD0) + 0x12) = + *(s16 *)(*(s32 *)((s32)param_1 + 0x68) + 0xC); + *(s16 *)((s32)param_1 + 0x100) = 0; + v0 = func_80029178(0xB9) & 0xFF; + if (v0 == 0) { + *(s16 *)((s32)param_1 + 2) = 1; + *(s16 *)((s32)param_1 + 0x34) = 0; + return; + } + *(s16 *)((s32)param_1 + 2) = 2; + *(s16 *)((s32)param_1 + 0x34) = 2; + return; +} + #include "common.h" diff --git a/src/ov_SC03_118/ov_SC03_118_jr_801863CC.c b/src/ov_SC03_118/ov_SC03_118_jr_801863CC.c index 781c4fc1f..295eecfa9 100644 --- a/src/ov_SC03_118/ov_SC03_118_jr_801863CC.c +++ b/src/ov_SC03_118/ov_SC03_118_jr_801863CC.c @@ -4463,7 +4463,81 @@ s32 func_801887DC(s32 a0, s16 a1, s16 a2) { DEFINE_func_80188990() /* dedup: shared engine-core @0x80188990 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_801863CC", func_80188C8C); +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8012C218(void *a0); +extern s32 func_80029504(void); +extern s32 func_800291DC(s32 a0); +extern void func_800291C8(s32 a0, s32 a1); +extern void func_8012B23C(s32 a0); +extern s32 func_80143970(void *a0); +extern s32 func_8012B030(u8 *a0); +extern u8 D_800AF630[]; +extern u16 D_801D099C; +extern u16 D_801D099E; +extern u16 D_801D09A0; +extern u8 D_801D095C[]; +extern u8 D_801D09A4[]; + +void func_80188C8C(s32 arg0) +{ + register s32 s0 __asm__("$16"); + register u8 *s1 __asm__("$17"); + s32 w; + u16 t; + + s1 = D_800AF630; + if (func_8012C354(arg0, (s32)D_801D095C) == 0) { + return; + } + s0 = arg0; + + if ((u32)func_80029504() >= 0x1D7u) { + goto close; + } + + *(u16 *)(s0 + 0x10A) = 1; + w = func_800291DC(10); + if (w & 0x100) { + goto fieldset; + } + + if ((s16)w == 0x3043) { + goto close; + } + if ((s16)w != 0x1052) { + goto join; + } + +close: + func_8012C218((void *)s0); + return; + +fieldset: + *(u16 *)(s0 + 6) = 0x10BD; + *(s16 *)(s0 + 0xA) = -0x282; + *(s16 *)(s0 + 0xE) = -0x374; + *(u16 *)(s0 + 0x10A) = 0; + +join: + t = *(u16 *)(s1 + 0xA3D8); + *(u16 *)(s0 + 0xFE) = t; + func_800291C8(10, (s16)t); + *(u8 *)(s0 + 0xC0) = 1; + *(s32 *)(s0 + 0xB4) = -0x489; + *(s32 *)(s0 + 0xBC) = (s32)D_801D09A4; + *(u8 *)(s0 + 0xC1) = 0; + *(s32 *)(s0 + 0xC4) = 1; + func_8012B23C(s0); + func_80143970((void *)s0); + func_8012B030((u8 *)s0); + *(u16 *)(s0 + 2) = 1; + *(s16 *)(s0 + 0xAE) = -1; + *(u8 *)(s0 + 0x75) = 8; + D_801D099C = *(u16 *)(s0 + 6); + D_801D099E = *(u16 *)(s0 + 0xA); + D_801D09A0 = *(u16 *)(s0 + 0xE); +} + void func_80188DE4(void *a0) { extern u16 D_80126B62; diff --git a/src/ov_SC03_118/ov_SC03_118_o0d.c b/src/ov_SC03_118/ov_SC03_118_o0d.c index 4a2121b83..f021ccdbc 100644 --- a/src/ov_SC03_118/ov_SC03_118_o0d.c +++ b/src/ov_SC03_118/ov_SC03_118_o0d.c @@ -2927,7 +2927,41 @@ void func_801833C4(s32 arg0) } -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_o0d", func_801834DC); +void func_801834DC(s32 arg0) +{ + extern u8 D_801D47E0[]; + extern u8 D_801B5D38[]; + extern u8 D_801B86B4[]; + extern s32 (*D_8018A0C4[])(void *); + extern u16 D_800B99DC; + + typedef struct { + u8 pad0[2]; + union { s16 s; u16 u; } f02; + u8 pad1[0xD8]; + union { s16 s; u16 u; } fDC; + u8 pad2[4]; + s16 fE2; + u8 pad3[2]; + s16 fE6; + u8 pad4[4]; + s16 fEC; + s16 fEE; + } St; + +#define P ((St *)arg0) + + func_80180A64(D_801D47E0, D_801B5D38, P->fDC.s, P->fE2); + func_80180A64(D_801D47E0, D_801B86B4, P->fDC.s, P->fE6); + if (--P->fEC == 0) { + func_8013C9C4(D_8018A0C4); + P->fEC = (D_800B99DC & 7) + 3; + } + if (--P->fEE == 0) { + P->f02.u++; + } +} + extern s32 D_801D47E0; diff --git a/src/ov_SC04_018/ov_SC04_018_jr_8017AE2C.c b/src/ov_SC04_018/ov_SC04_018_jr_8017AE2C.c index 3d34ff97c..cbb9f403a 100644 --- a/src/ov_SC04_018/ov_SC04_018_jr_8017AE2C.c +++ b/src/ov_SC04_018/ov_SC04_018_jr_8017AE2C.c @@ -8238,7 +8238,64 @@ extern void func_80184CB8(s32 *a0, s32 a1); } -INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_8017AE2C", func_80183338); +extern s32 func_801847BC(void *a0, void *a1); +extern s32 func_80184BAC(s32 arg0, s32 arg1); +extern void func_8012E88C(s32 a0); +extern void func_8012A828(s32 *a0, s32 a1); +extern void func_80184C90(s32 a0); +extern void func_80184ED4(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80184CB8(s32 *a0, s32 a1); +extern s32 func_801788B8(s32 arg0, s32 arg1); +extern void func_80183578(void *a0); +extern s32 func_80183604(s32 param_1); + +void func_80183338(void *param_1) +{ + extern u8 D_80192040; + extern short D_80192030; + extern short D_801B9AA8; + extern s32 D_801B673C; + void *s0 = param_1; + void *v1; + s32 v0; + + if (func_801847BC(param_1, &D_80192040) != 0) { + v0 = func_80184BAC(7, 0xA); + if (v0 != 0) { + v0 = 2; + goto set_and_cb; + } + + v0 = func_80184BAC(0xA, 0xC); + if (v0 != 0) { + v0 = 6; + *(short *)((char *)s0 + 2) = v0; + func_8012E88C((s32)s0); + func_8012A828((s32 *)s0, (s32)&D_801B9AA8); + func_80184C90((s32)s0); + func_80184ED4((s32)s0, (s32)&D_801B673C, 0, 0x40); + goto tail; + } + + v0 = func_80184BAC(0xC, 0x14); + if (v0 != 0) { + v0 = 8; + } else { + v0 = 1; + } + + set_and_cb: + *(short *)((char *)s0 + 2) = v0; + func_80184CB8((s32 *)s0, (s32)&D_80192030); + + tail: + v1 = *(void **)((char *)s0 + 0x68); + *(short *)((char *)v1 + 0xC) = 0x7FFF; + *(s32 *)((char *)s0 + 0xD4) = func_801788B8((s32)s0, (s32)&func_80183578); + *(s32 *)((char *)s0 + 0xD8) = func_801788B8((s32)s0, (s32)&func_80183604); + } +} + extern void (*D_8019211C[])(void); diff --git a/src/ov_SC04_018/ov_SC04_018_jr_80188E1C.c b/src/ov_SC04_018/ov_SC04_018_jr_80188E1C.c index af1356cbf..f5ec0a562 100644 --- a/src/ov_SC04_018/ov_SC04_018_jr_80188E1C.c +++ b/src/ov_SC04_018/ov_SC04_018_jr_80188E1C.c @@ -4138,7 +4138,43 @@ void func_8018A1D0(s32 a0) } -INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_80188E1C", func_8018A224); +extern u16 D_800B99DA; +extern u8 D_801E04E0[]; +extern void func_8018A2E0(u16 *a0, s32 a1); + +typedef struct { + u16 f0; + u16 f1; + u16 f2; + s16 f3; +} Ent_8018A224; + +s32 func_8018A224(Ent_8018A224 *arg0, s32 arg1) +{ + u8 rect[4]; + s32 step; + register s32 q __asm__("$3"); + register s32 half __asm__("$2"); + + step = 0x50; + if (D_801E04E0[D_800B99DA & 0xF] == 0) { + step = 0x60; + } + arg1 += 1; + q = (step * arg1) / 32; + half = q / 2; + rect[0] = q; + rect[1] = q; + rect[2] = half; + rect[3] = 0; + if (arg0->f3 != -1) { + do { + func_8018A2E0(&arg0->f0, *(s32 *)rect); + arg0++; + } while (arg0->f3 != -1); + } +} + /* func_8018A2E0 (ov_SC04_018, ov_SC04_018_jr_8017AE2C) — MATCH (250 ins) * diff --git a/src/ov_SC05_003/ov_SC05_003_jr_8017BEBC.c b/src/ov_SC05_003/ov_SC05_003_jr_8017BEBC.c index 8629efda8..0e87b3190 100644 --- a/src/ov_SC05_003/ov_SC05_003_jr_8017BEBC.c +++ b/src/ov_SC05_003/ov_SC05_003_jr_8017BEBC.c @@ -4744,7 +4744,7 @@ s32 func_8017F62C(s32 a0) { extern void (*D_801A466C[])(void); extern s32 D_801A9620; -extern void func_80180834(void *a0); +extern s32 func_80180834(); extern s32 func_8012C0EC(s32 a0); void func_8017F68C(void *a0) { @@ -5532,7 +5532,29 @@ void func_801807F8(s32 a0) { } -INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_8017BEBC", func_80180834); +#include "common.h" +#include "/home/musashi/bfm-decomp/src/shared/engine_core.h" + +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern s32 D_801A46A4; +extern s32 *D_80126B78; +extern u8 D_801152A8[]; + +s32 func_80180834(void *a0) { + SVECTOR buf1; + SVECTOR buf2; + + func_8012F14C((s32)D_80126B78 + 0x34, (s32)&D_801A46A4, (s32)&buf1); + func_8012F14C((s32)D_80126B78 + 0x34, (s32)&D_801A46A4 + 8, (s32)&buf2); + if (func_80135888(*(s32 *)((s32)a0 + 0x20), *(s32 *)((s32)a0 + 0x58), (s32)&buf1, (s32)&buf2) != 0) { + func_8012F568(1, 1, *(s16 *)(*(s32 *)((s32)a0 + 0x20) + 0x12), 0x20, (s32)&buf2, (s32)D_801152A8); + return 1; + } + return 0; +} + #include "common.h" #include "/home/musashi/bfm-decomp/src/shared/engine_core.h" diff --git a/src/ov_SC06_018/ov_SC06_018_jr_80187AEC.c b/src/ov_SC06_018/ov_SC06_018_jr_80187AEC.c index fcfd9713a..4da2e8c75 100644 --- a/src/ov_SC06_018/ov_SC06_018_jr_80187AEC.c +++ b/src/ov_SC06_018/ov_SC06_018_jr_80187AEC.c @@ -5453,7 +5453,50 @@ void func_8018B330(s32 param_1) } -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_80187AEC", func_8018B4D8); +#include "common.h" + + + + +extern Blk20_8018AF88 D_800AE620; +extern void RotMatrixY(s32 a0, void *a1); +extern void ApplyMatrixSV(void *a0, void *a1, void *a2); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 rand(void); + +void func_8018B4D8(s32 param_1) +{ + Blk20_8018AF88 local_38; + Blk20_8018AF88 *m; + SVECTOR out; + s32 c; + s32 b; + + local_38 = D_800AE620; + out.vx = 0; + out.vy = -((rand() & 0x3F) + 0x50); + out.vz = -0x40; + m = &local_38; + c = rand() & 0x3F0; + b = *(u16 *)(*(s32 *)(param_1 + 0x64) + 0x10A); + b -= 0x200; + RotMatrixY((s16)(((*(u16 *)(param_1 + 0x70) & 3) * 0x400) + c + b), m); + ApplyMatrixSV(m, &out, &out); + + *(u16 *)(param_1 + 6) += out.vx; + *(u16 *)(param_1 + 0xA) += out.vy; + *(u16 *)(param_1 + 0xE) += out.vz; + + *(s32 *)(param_1 + 0x10) = out.vx << 13; + *(s32 *)(param_1 + 0x18) = out.vz << 13; + *(s32 *)(param_1 + 0x14) = -(((rand() & 0xF) << 15) + 0x80000); + + *(u16 *)(param_1 + 0x106) = rand() & 0xF0; + *(u16 *)(param_1 + 0x108) = rand() & 0xF0; + *(s32 *)(param_1 + 0x1C) = 0x20; + func_8012AD44((s32 *)param_1, 3); +} + extern void (*D_801CD4B0[])(void);