diff --git a/config/overlays.mk b/config/overlays.mk index 3d63d918ce..93c00aba8b 100644 --- a/config/overlays.mk +++ b/config/overlays.mk @@ -1704,7 +1704,7 @@ build/src/ov_SC03_028/ov_SC03_028_jr_80159C84.o: JTBL_PADS := 0,4 # §8e pads ( build/src/ov_SC03_028/ov_SC03_028_jr_8015AE2C.o: JTBL_PADS := 0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20 build/src/ov_SC03_028/ov_SC03_028_jr_8016AB6C.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20 build/src/ov_SC03_028/ov_SC03_028_jr_80178D40.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x178 -build/src/ov_SC03_028/ov_SC03_028_jr_8017DF98.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20 +build/src/ov_SC03_028/ov_SC03_028_jr_8017DF98.o: JTBL_PADS := 0,0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20,+0x40 build/src/ov_SC03_028/ov_SC03_028_jr_80184914.o: JTBL_PADS := 0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x30 build/src/ov_SC03_028/ov_SC03_028_jr_80185864.o: JTBL_PADS := 0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x28 build/src/ov_SC03_028/ov_SC03_028_o0c.o: JTBL_PADS := 0,4,4,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x38,+0xa8,+0x118 @@ -1957,7 +1957,7 @@ build/src/ov_SC03_092/ov_SC03_092_jr_80159C84.o: JTBL_PADS := 0,4 # §8e pads ( build/src/ov_SC03_092/ov_SC03_092_jr_8015AE2C.o: JTBL_PADS := 0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20 build/src/ov_SC03_092/ov_SC03_092_jr_8016AB6C.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20 build/src/ov_SC03_092/ov_SC03_092_jr_80178D40.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x178 -build/src/ov_SC03_092/ov_SC03_092_jr_8017AE2C.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x14 +build/src/ov_SC03_092/ov_SC03_092_jr_8017AE2C.o: JTBL_PADS := 0,0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x14,+0x2c build/src/ov_SC03_092/ov_SC03_092_jr_80181694.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x18 build/src/ov_SC03_092/ov_SC03_092_o0c.o: JTBL_PADS := 0,4,4,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x38,+0xa8,+0x118 ov_SC03_092_CHECK_SHA := config/check.ov_SC03_092.sha diff --git a/config/splat.ov_SC03_028.yaml b/config/splat.ov_SC03_028.yaml index 5cea357894..5fd32db8de 100644 --- a/config/splat.ov_SC03_028.yaml +++ b/config/splat.ov_SC03_028.yaml @@ -170,7 +170,7 @@ segments: - [0xc1d58, .rodata, ov_SC03_028_jr_8017AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xc1d6c, data, tail18] - [0xc1ea4, .rodata, ov_SC03_028_jr_8017DF98] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc1ee4, data, tail19] + - [0xc1f00, data, tail19] - [0xc1f04, .rodata, ov_SC03_028_jr_80183A74] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xc1f1c, .rodata, ov_SC03_028_jr_801847E8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xc1f48, data, tail20] diff --git a/config/splat.ov_SC03_092.yaml b/config/splat.ov_SC03_092.yaml index 89b725d1a0..d6e0e4c46e 100644 --- a/config/splat.ov_SC03_092.yaml +++ b/config/splat.ov_SC03_092.yaml @@ -163,7 +163,7 @@ segments: - [0x898c0, .rodata, ov_SC03_092_jr_8017A4AC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x8994c, data, tail17] - [0x89950, .rodata, ov_SC03_092_jr_8017AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x89978, data, tail18] + - [0x89990, data, tail18] - [0x89994, .rodata, ov_SC03_092_jr_8017FE88] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x899a8, .rodata, ov_SC03_092_jr_80181694] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x899d4, data, tail19] 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 1682ed798b..8fdcaed7e5 100644 --- a/src/ov_SC03_028/ov_SC03_028_jr_8017DF98.c +++ b/src/ov_SC03_028/ov_SC03_028_jr_8017DF98.c @@ -4510,7 +4510,115 @@ void func_80180B44(s32 a0, s32 a1) { } -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8017DF98", func_80181000); +#include "common.h" + +extern void func_8012A828(s32 a0, void *a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B23C(s32 a0); +extern void func_8012CBCC(s32 a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B744(void *a0, void *a1); +extern void Square0(s32 *a0, s32 *a1); +extern s32 rand(void); + +extern u8 D_80126B5C; +extern s32 D_80126B64; +extern u8 D_8018F8E4[]; +extern void (*D_8018F9A8)(void *); +extern s16 D_8018FB2C[]; +extern u8 D_801ADC24[]; +extern u8 D_801ADD34[]; +extern u8 D_801AE08C[]; +extern u8 D_801AE824[]; + +typedef struct { s16 vx, vy, vz, pad; } SV_80181000; + +void func_80181000(s32 a0) +{ + s32 vec[4]; + SV_80181000 sv; + s32 d; + s32 dy; + s32 r; + s16 t; + + sv.vx = 0; + sv.vz = 0x3C0; + d = func_8012B744((void *)(a0 + 4), &sv); + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) += func_8012B608(*(s16 *)(*(s32 *)(a0 + 0x20) + 0x12), d, 8); + func_8012B1B4(a0, (s32)&D_8018F9A8); + func_8012CBCC(a0); + + dy = (s16)*(u16 *)(a0 + 6); + vec[0] = dy; + vec[2] = *(s16 *)(a0 + 0xE) - 0x3C0; + vec[1] = 0; + *(u16 *)(a0 + 6) -= dy >> 6; + *(u16 *)(a0 + 0xE) -= vec[2] >> 6; + Square0(vec, vec); + + if (vec[0] + vec[2] < 0x400) { + t = *(s16 *)(a0 + 0x76); + if (t > 0x50) { + r = rand() & 3; + } else if (t > 0x28) { + r = (rand() & 5) + 3; + } else { + r = (rand() & 5) + 8; + } + + switch (D_8018FB2C[r]) { + case 0: + *(s16 *)(a0 + 2) = 7; + func_8012A828(a0, D_801ADC24); + *(s32 *)(a0 + 0x1C) = 0x1E; + break; + case 1: + *(s16 *)(a0 + 2) = 0xC; + func_8012A828(a0, D_801ADD34); + *(s32 *)(a0 + 0x1C) = 0; + *(s16 *)(a0 + 0x84) = 0; + *(s16 *)(a0 + 0xDE) = 0; + *(s16 *)(a0 + 0x34) = 5; + *(s16 *)(a0 + 0xDC) = 0x111 - (*(s16 *)(a0 + 0x76) * 0x88) / 0x78; + break; + case 2: + *(s16 *)(a0 + 2) = 0x16; + func_8012A828(a0, D_801AE824); + func_8012B23C(a0); + *(s16 *)(a0 + 0x16) = -0x1E; + *(s32 *)(a0 + 0x10) = (*(s32 *)&D_80126B5C - *(s32 *)(a0 + 4)) >> 5; + *(s32 *)(a0 + 0x18) = (D_80126B64 - *(s32 *)(a0 + 0xC)) >> 5; + *(s32 *)(a0 + 0x58) = (s32)D_8018F8E4 | 0x40000000 | 0x20000000; + break; + case 3: + *(s16 *)(a0 + 2) = 0xD; + func_8012A828(a0, D_801AE08C); + *(s32 *)(a0 + 0x1C) = 0; + *(s16 *)(a0 + 0x84) = 0; + break; + case 4: + *(s16 *)(a0 + 2) = 0xE; + *(s16 *)(a0 + 0xFE) = 0; + break; + case 5: + *(s16 *)(a0 + 2) = 0x19; + func_8012A828(a0, D_801ADC24); + *(s32 *)(a0 + 0x1C) = 0x1E; + break; + case 6: + *(s16 *)(a0 + 2) = 0xC; + func_8012A828(a0, D_801ADD34); + *(s32 *)(a0 + 0x1C) = 0; + *(s16 *)(a0 + 0x84) = 0; + *(s16 *)(a0 + 0xDE) = 0; + *(s16 *)(a0 + 0x34) = 0x16; + *(s16 *)(a0 + 0xDC) = 0x111 - (*(s16 *)(a0 + 0x76) * 0x88) / 0x78; + break; + } + } +} + extern void func_8012A828(s32 a0, void *a1); extern s32 func_8012BA10(s32 a0, s32 a1); diff --git a/src/ov_SC03_092/ov_SC03_092_jr_8017AE2C.c b/src/ov_SC03_092/ov_SC03_092_jr_8017AE2C.c index e93f67a66f..48dabb6375 100644 --- a/src/ov_SC03_092/ov_SC03_092_jr_8017AE2C.c +++ b/src/ov_SC03_092/ov_SC03_092_jr_8017AE2C.c @@ -5593,7 +5593,98 @@ void func_8017F8D8(s32 arg0) } -INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_8017AE2C", func_8017FA74); +extern s32 func_8017B368(s32); +extern s32 func_80178970(); +extern void func_80178D18(void); +extern s32 func_80029504(void); + +void func_8017FA74(s32 arg0) +{ + /* NOTE: this typedef is deliberately BLOCK scope. The file-scope + * `typedef ... Tbl8_8017FC44;` lives a few lines below this function and a + * second file-scope copy is a C89 redefinition -- gcc-2.7.2 exits 33 + * ("conflicting types for `Tbl8_8017FC44'"), which is what the whole-binary + * gate kept rejecting even though the body is byte-identical. */ + typedef struct { + /* 0x00 */ s32 unk00; + /* 0x04 */ s32 unk04; + } Tbl8_8017FC44; + + extern s32 D_801B2E70; + extern void func_8017FE04(s32 a0); + extern u8 D_80188EF8; + extern u8 D_80188F10; + extern u8 D_80188F30[]; + extern u8 D_80188F40[]; + extern u8 D_80188F50[]; + extern u8 D_80188F70[]; + extern Tbl8_8017FC44 D_80189380[]; + + s32 a0; + s32 v1; + s32 idx; + Tbl8_8017FC44 *rec; + + switch (D_801B2E70) { + case 0: + break; + case 1: + ((s32 (*)(s32, s32))func_8017B368)(arg0, (s32)D_80188F30); + break; + case 2: + ((s32 (*)(s32, s32))func_8017B368)(arg0, (s32)D_80188F40); + break; + case 3: + ((s32 (*)(s32, s32))func_8017B368)(arg0, (s32)D_80188F50); + break; + case 4: + ((s32 (*)(s32, s32))func_8017B368)(arg0, (s32)D_80188F70); + D_801B2E70 = 0; + break; + } + + if (((s32 (*)(s32))func_80178970)(arg0) != 0) { + ((void (*)(s32))func_80178D18)(arg0); + v1 = func_80029504(); + a0 = 0; + if (v1 >= 0x140) { + if (v1 < 0x14A) { + a0 = 1; + } else if (v1 < 0x172) { + a0 = 2; + } else if (v1 < 0x17C) { + a0 = 3; + } else { + a0 = 4; + } + } + if (a0 == 4) { + func_8017FE04(arg0); + } else { + *(u16 *)(arg0 + 2) = 1; + v1 = func_80029504(); + idx = 0; + if (v1 >= 0x140) { + if (v1 < 0x14A) { + idx = 1; + } else if (v1 < 0x172) { + idx = 2; + } else if (v1 < 0x17C) { + idx = 3; + } else { + idx = 4; + } + } + rec = &D_80189380[idx]; + func_8012E8E0(arg0, (s32)&D_80188EF8 + rec->unk00 * 8); + func_8012A828(arg0, (void *)rec->unk04); + *(s32 *)(arg0 + 0x58) = (s32)&D_80188F10 | 0x40000000; + *(u16 *)(arg0 + 0x5C) = 0x800; + D_801B2E70 = 0; + } + } +} + typedef struct { /* 0x00 */ s32 unk00;