feat(decomp): S70-standalone gate — +15 fns x0 propagated (fleet 99.4%)

This commit is contained in:
Drew T
2026-09-01 16:23:11 -06:00
parent b31d5a2cae
commit ac5aede5ac
+431 -15
View File
@@ -6,9 +6,47 @@ INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8017EEEC", func_8017F09
INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8017EEEC", func_8017F0D8);
INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8017EEEC", func_8017F114);
extern s32 D_8019E1B8;
extern u8 D_8018077C[];
void func_8017F114(void *a0) {
if (func_8012C354((s32)a0, (s32)&D_8019E1B8) != 0) {
*(u8 *)((s32)a0 + 0xC0) = 1;
*(s16 *)((s32)a0 + 0xAE) = -1;
func_8012A828((s32 *)a0, (s32)D_8018077C);
*(u16 *)((s32)a0 + 0x2) = *(u16 *)((s32)a0 + 0x2) + 1;
*(u16 *)(*(s32 *)(a0 + 0x20) + 0x2C) |= 0x10;
*(s16 *)(*(s32 *)(a0 + 0x20) + 0x18) = 0xE00;
*(s16 *)(*(s32 *)(a0 + 0x20) + 0x1A) = 0xE00;
*(s16 *)(*(s32 *)(a0 + 0x20) + 0x1C) = 0xE00;
*(u16 *)((s32)a0 + 0xFC) = 0x300;
*(u8 *)((s32)a0 + 0x75) = 8;
}
}
extern s32 func_8012C354(s32 a0, s32 a1);
extern u8 D_8018077C[];
extern u8 D_8019E270[];
extern void func_8012A828(s32 *a0, s32 a1);
void func_8017F1BC(arg0)
s32 arg0;
{
extern u8 D_8019E270[];
s32 s0 = arg0;
if (func_8012C354(s0, (s32)D_8019E270) != 0) {
*(u8 *)(s0 + 0xC0) = 1;
func_8012A828((s32 *)s0, (s32)D_8018077C);
*(u16 *)(s0 + 2) = *(u16 *)(s0 + 2) + 1;
*(u16 *)(*(s32 *)(s0 + 0x20) + 0x2C) = *(u16 *)(*(s32 *)(s0 + 0x20) + 0x2C) | 0x10;
*(u16 *)(*(s32 *)(s0 + 0x20) + 0x18) = 0xAAA;
*(u16 *)(*(s32 *)(s0 + 0x20) + 0x1C) = 0xAAA;
}
}
INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8017EEEC", func_8017F1BC);
INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8017EEEC", func_8017F240);
@@ -24,52 +62,430 @@ INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8017EEEC", func_8017F36
INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8017EEEC", func_8017F38C);
INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8017EEEC", func_8017F3C8);
extern s32 func_80012A60(s32 a0, s32 a1);
extern s32 func_80171990(u8 *a0);
extern s32 D_801ABBD8;
void func_8017F3C8(void *a0)
{
register void *s3 __asm__("$19") = a0;
void *s2;
register void *p __asm__("$3");
register s32 v1 __asm__("$3");
register s32 v0 __asm__("$2");
s32 bits;
register s32 s0 __asm__("$16");
s32 s1;
s2 = *(void **)((s32)s3 + 0x20);
func_8017F5F0(s3);
p = (*(void * *)&D_801ABBD8);
if (p == 0) {
goto END;
}
v0 = *(u16 *)((s32)s2 + 0x12) + 0x800;
p = *(void **)((s32)p + 0x20);
bits = *(u16 *)((s32)p + 0x12) & 0x400;
s0 = v0 & 0xFFF;
if (bits == 0) {
goto ELSE;
}
s1 = func_80012A60(s0, 0x400);
v0 = func_80012A60(s0, 0xC00);
v1 = (s16)s1;
v0 = (s16)v0;
v0 = (v0 < v1);
if (v0 != 0) {
goto TRUE1;
}
v0 = 0x400;
goto STORE;
TRUE1:
v0 = 0xC00;
goto STORE;
ELSE:
s1 = func_80012A60(s0, 0);
v0 = func_80012A60(s0, 0x800);
v1 = (s16)s1;
v0 = (s16)v0;
v0 = (v0 < v1);
if (v0 != 0) {
goto TRUE2;
}
*(u16 *)((s32)s2 + 0x12) = 0;
goto END;
TRUE2:
v0 = 0x800;
STORE:
*(u16 *)((s32)s2 + 0x12) = v0;
END:
func_80171990((u8 *)s3);
}
INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8017EEEC", func_8017F4D0);
INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8017EEEC", func_8017F510);
extern s32 func_80013328(s32 a0, s32 a1);
extern u8 D_801202A0[];
extern void func_800D1724(s32 a0);
extern void func_80171928(void *a0);
void func_8017F510(arg0)
void *arg0;
{
u8 *p;
u8 *found;
s32 i;
s32 best;
s16 t;
found = 0;
best = 0x7FFFFFFF;
for (i = 0; i < 0x60; i++) {
p = &D_801202A0[i * 0x10C];
if ((*(u16 *)(p + 0) != 0) && ((*(u16 *)(p + 0x5C) & 0x80) != 0)) {
t = (s16)func_80013328((s32)arg0 + 4, (s32)p + 4);
if (t < best) {
best = t;
found = p;
}
}
}
if (found != 0) {
func_800D1724(*(s32 *)(found + 0xDC));
}
func_80171928(arg0);
}
extern u8 D_801202A0[];
extern s32 D_801ABBD8;
extern void func_8002D4C8(s32 a0, s32 a1);
extern void func_80015978(s32 a0, s32 *a1);
extern s32 func_80013328(s32 a0, s32 a1);
extern void func_8012F2E8(s32 a0, s32 a1, s32 a2);
void func_8017F5F0(s32 arg0)
{
s16 v;
s32 i;
s32 best;
unsigned short *p;
s32 buf[2];
best = 0x7FFFFFFF;
i = 0;
p = (unsigned short *)D_801202A0;
D_801ABBD8 = 0;
loop:
if (*p == 0x26E) {
v = (s16)func_80013328(arg0 + 4, (s32)(p + 2));
if (v < best) {
best = v;
D_801ABBD8 = (s32)p;
}
}
__asm__("" ::
"r"(best));
i++;
p += 0x86;
if (i < 0x60) {
goto loop;
}
*(s16 *)(arg0 + 0x208) = 0;
func_80015978(arg0 + 4, buf);
func_8012F2E8(D_801ABBD8, (s32)buf, arg0 + 0x20C);
*(s32 *)(arg0 + 0x204) = D_801ABBD8;
func_8002D4C8(0x8B0, 0);
}
INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8017EEEC", func_8017F5F0);
INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8017EEEC", func_8017F6CC);
INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8017EEEC", func_8017F760);
INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8017EEEC", func_8017F7D4);
typedef struct { s16 vx, vy, vz, pad; } SVECTOR;
void func_8017F7D4(s32 a0) {
SVECTOR in;
SVECTOR out;
s32 v0;
in.vx = *(s16 *)(a0 + 0x6);
in.vy = *(s16 *)(a0 + 0xA);
in.vz = *(s16 *)(a0 + 0xE);
out = in;
out.vy += 8;
if ((func_80133784(1, &in, (s32)&out) & 0x6000) != 0) {
v0 = 1;
} else {
func_8012B23C(a0);
v0 = 0;
}
if (v0 == 0) {
*(s16 *)(a0 + 0x2) = 0x8;
*(s16 *)(a0 + 0x98) = 0;
return;
}
if (*(s32 *)(a0 + 0xC4) & 4) {
func_8017F8AC(a0);
} else {
func_8017F8F8(a0);
}
}
INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8017EEEC", func_8017F8AC);
INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8017EEEC", func_8017F8F8);
#include "common.h"
extern s32 rand(void);
extern s32 func_8012B744(void *a0, void *a1);
extern void func_8012A828(s32 *a0, s32 a1);
extern void func_8012B23C(void *a0);
extern void Square0(s32 *a0, s32 *a1);
extern u8 D_801A8AE8[];
void func_8017F8F8(void *param_1) {
s32 d[3];
void *target;
*(s16 *)((s32)param_1 + 0x2) = 1;
*(s16 *)((s32)param_1 + 0x34) = 0;
*(u16 *)((s32)param_1 + 0x5C) = 0xAA10;
*(s32 *)((s32)param_1 + 0x1C) = (rand() & 0x1F) + 0x24;
target = (void *)((s32)param_1 + 0x88);
d[0] = *(s16 *)((s32)param_1 + 0x6) - *(s16 *)target;
d[1] = 0;
d[2] = *(s16 *)((s32)param_1 + 0xE) - *(s16 *)((s32)param_1 + 0x8C);
Square0(&d[0], &d[0]);
if (d[0] + d[2] > 0x8FFFF) {
*(s16 *)((s32)param_1 + 0xFC) = func_8012B744((void *)((s32)param_1 + 4), target);
} else {
register s32 t __asm__("$2") = rand() & 0x3FF;
s32 v1 = t - 0x200;
if (v1 < 0) {
v1 = t - 0x500;
} else {
v1 = t + 0x100;
}
*(s16 *)((s32)param_1 + 0xFC) =
(*(u16 *)(*(s32 *)((s32)param_1 + 0x20) + 0x12) + v1) & 0xFFF;
}
func_8012B23C(param_1);
func_8012A828((s32 *)param_1, (s32)&D_801A8AE8);
}
INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8017EEEC", func_8017FA00);
INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8017EEEC", func_8017FA30);
extern void func_8012A828(s32 *a0, s32 a1);
extern short D_801A8B90;
extern short D_801A8C18;
void func_8017FA30(s32 a0) {
*(s16 *)(a0 + 2) = 3;
if (*(u16 *)(a0 + 0x86) & 2) {
*(s16 *)(a0 + 0x34) = 1;
*(s32 *)(a0 + 0x1C) = 0x28;
func_8012A828((s32 *)a0, (s32)&D_801A8B90);
*(u16 *)(a0 + 0xFE) = 0;
} else {
*(s16 *)(a0 + 0x34) = 0;
func_8012A828((s32 *)a0, (s32)&D_801A8C18);
*(s32 *)(a0 + 0x1C) = 0x19;
*(u16 *)(a0 + 0x86) |= 2;
}
}
INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8017EEEC", func_8017FAB4);
INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8017EEEC", func_8017FC7C);
extern char D_801A8CE8[];
extern void func_8012A828(s32 *a0, s32 a1);
void func_8017FC7C(param_1)
int param_1;
{
*(short *)(param_1 + 2) = 4;
*(short *)(param_1 + 0x34) = 0;
func_8012A828(param_1, &D_801A8CE8);
*(int *)(param_1 + 0x1c) = 0x14;
}
INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8017EEEC", func_8017FCC0);
INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8017EEEC", func_8017FE34);
extern s32 D_801A085C[];
extern void func_8012A828(s32 *a0, s32 a1);
extern void func_8012B2CC(s32 a0);
extern void func_8012B200(u8 *a0);
extern void func_8012B178(s32 a0, s32 a1);
void func_8017FE34(s32 arg0) {
s32 *tbl = D_801A085C;
if ((*(u16 *)(arg0 + 0x70) & 0x2000) == 0) {
tbl += 3;
}
*(u16 *)(arg0 + 2) = 7;
func_8012A828((s32 *)arg0, tbl[0]);
func_8012B2CC(arg0);
func_8012B200((u8 *)arg0);
func_8012B178(arg0, tbl[1]);
*(s32 *)(arg0 + 0x1C) = tbl[2];
}
#include "common.h"
extern s32 D_801A0874[];
extern s32 func_8012C044(s32 arg0);
extern void func_8002AC00(s32 arg0);
extern void func_8012C098(void *arg0);
void func_8017FEB4(s32 arg0) {
void (*handler)(s32);
register u8 val __asm__("$3");
handler = (void (*)(s32))D_801A0874[((u16 *)arg0)[1]];
handler(arg0);
if (((u16 *)arg0)[0] == 0)
return;
if (func_8012C044(arg0) == 0)
return;
*(u16 *)(arg0 + 0x100) = 1;
val = ((u8 *)arg0)[0xC1];
if (val == 5 || val == 0xD || val == 0xB || val == 0xE) {
func_8002AC00(0x7);
}
func_8012C098((void *)arg0);
}
INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8017EEEC", func_8017FEB4);
INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8017EEEC", func_8017FF58);
INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8017EEEC", func_8017FF7C);
INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8017EEEC", func_8017FFAC);
extern void func_8012CBF4(s32 a0);
extern void func_8017F8F8();
void func_8017FFAC(s32 a0)
{
func_8012CBF4(a0);
if (*(u16 *)(a0 + 0x72) & 0x4000) {
func_8017F8F8(a0);
}
}
INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8017EEEC", func_8017FFF0);
INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8017EEEC", func_80180098);
extern void Square0(s32 *a0, s32 *a1);
extern s32 func_8012BCCC(s32 a0);
extern void func_8017FA30(s32 a0);
extern void func_8017F8F8();
void func_80180098(s32 a0)
{
s32 s0 = a0;
s32 d[3];
if (*(u16 *)(s0 + 0x34) == 0 && (*(u16 *)(s0 + 0x72) & 0x4000)) {
d[0] = *(s16 *)(s0 + 0x6) - *(s16 *)(s0 + 0x88);
d[1] = 0;
d[2] = *(s16 *)(s0 + 0xE) - *(s16 *)(s0 + 0x8C);
Square0(d, d);
if (d[0] + d[2] <= 0x8FFFF && func_8012BCCC(s0) <= 0x10000) {
func_8017FA30(s0);
} else {
func_8017F8F8(s0);
}
}
}
INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8017EEEC", func_8018015C);
INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8017EEEC", func_801801AC);
extern void func_8012AD80(s32 a0);
extern s32 func_8012BEE8(s32 a0);
extern s32 func_80143B6C(s32 a0, s32 a1);
extern void func_8012A828(s32*, s32);
extern s16 D_801A8B90;
extern s16 D_801A8C18;
void func_801801AC(s32 a0) {
s32 v0;
func_8012AD80(a0);
if (*(u16 *)(a0 + 0x70) & 0x2000) {
v0 = *(u16 *)(a0 + 0xFE) - 1;
*(u16 *)(a0 + 0xFE) = v0;
if ((s16)v0 <= 0) {
func_80143B6C(a0, 0);
*(u16 *)(a0 + 0xFE) = 8;
}
}
if (func_8012BEE8(a0)) {
*(u16 *)(a0 + 0x86) |= 2;
*(s16 *)(a0 + 0x2) = 3;
if (*(u16 *)(a0 + 0x86) & 2) {
*(s16 *)(a0 + 0x34) = 1;
*(s32 *)(a0 + 0x1C) = 0x28;
((void (*)(s32, void *))func_8012A828)(a0, &D_801A8B90);
*(u16 *)(a0 + 0xFE) = 0;
} else {
*(s16 *)(a0 + 0x34) = 0;
((void (*)(s32, void *))func_8012A828)(a0, &D_801A8C18);
*(s32 *)(a0 + 0x1C) = 0x19;
*(u16 *)(a0 + 0x86) |= 2;
}
}
}
INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8017EEEC", func_80180298);
INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8017EEEC", func_80180360);
extern s32 D_801A07CC;
extern u8 D_801A0800[];
extern s32 func_8012C354(s32 a0, s32 a1);
extern s32 func_80143970(s32 a0);
extern s32 func_8012B030(u8 *a0);
extern void func_8012A828(s32 *a0, s32 a1);
extern short D_801A89A0;
extern void func_8012E8A8(u8 *a0);
extern void func_8017F8F8();
void func_80180360(void *a0) {
if (func_8012C354((s32)a0, (s32)&D_801A07CC) != 0) {
*(u8 *)((s32)a0 + 0xC0) = 1;
*(s32 *)((s32)a0 + 0xB4) = -1;
*(u8 *)((s32)a0 + 0xC1) = 0;
*(s32 *)((s32)a0 + 0xBC) = (s32)D_801A0800;
func_80143970((s32)a0);
func_8012B030((u8 *)a0);
if (*(u16 *)((s32)a0 + 0x70) & 0x6000) {
*(u16 *)((s32)a0 + 0x2) = 6;
func_8012A828((s32 *)a0, (s32)&D_801A89A0);
func_8012E8A8(a0);
} else {
func_8017F8F8(a0);
}
}
}