diff --git a/include/functions.h b/include/functions.h index 04e7e2c2..5cb35ad2 100644 --- a/include/functions.h +++ b/include/functions.h @@ -5,7 +5,7 @@ f32 func_80004E20(f32 arg0, f32 arg1); void func_80004E4C(void); -f32 func_80004EB0(void); +f32 Rand_ZeroOne(void); void func_80004FC8(s32 arg0, s32 arg1, s32 arg2); f32 func_80004FE8(void); f32 func_80005100(f32 arg0, f32 arg1); @@ -72,11 +72,16 @@ void func_8008D0DC(f32, f32, f32, f32, f32); void func_8008E9EC(f32 arg0, f32 arg1); void func_8008EA14(f32, f32); void func_8008FFF0(UnkStruct_D_8016F110* arg0, s32); +s32 func_8009092C(UnkStruct_func_80090A00*); +s32 func_800915FC(UnkStruct_func_80090A00*); void func_80094D20(f32, f32); f32 func_8009BC2C(f32*, f32, f32, f32, f32); +f32 func_8009BD38(f32*, f32, f32, f32, f32); void func_8009D418(Gfx**, void*, u32, u32, f32, f32, f32, f32); void func_8009D994(Gfx**, void*, u32, u32, f32, f32, f32, f32); +void func_8009F6CC(Vec3f*, f32, f32, f32); void func_8009FC0C(s32, s32, s32); +f32 func_8009F768(f32); void func_8009FEA0(s32, s32, s32); void func_800A1200(s32, s32, f32, f32, char*); s32 func_800A3F50(s32); @@ -84,6 +89,7 @@ void func_800A5D6C(void); void func_800B8DD0(Gfx**, s16); void func_800BA490(void); void func_800BA4F0(void); +void func_800BA808(u16*, s32); void func_800BB5D0(void); void func_800B6F50(f32, f32, f32, f32, f32, f32); void func_800B9358(void); diff --git a/include/hud.h b/include/hud.h index 4e12e314..00b749ad 100644 --- a/include/hud.h +++ b/include/hud.h @@ -34,8 +34,8 @@ void func_8008D7F4(void); void func_8008D984(void); void func_8008DC34(void); void func_8008E5E8(void); -void func_80090E8C(void); -void func_800910C0(void); +s32 func_80090E8C(UnkStruct_func_80090A00* arg0); +s32 func_800910C0(UnkStruct_func_80090A00* arg0); void func_8009C320(Gfx**, void*, void*, s32, s32, f32, f32, f32, f32); void func_8009D0BC(Gfx**, void*, void*, u32, u32, f32, f32, f32, f32); void func_8009D994(Gfx**, void*, u32, u32, f32, f32, f32, f32); diff --git a/include/structs.h b/include/structs.h index d3969897..c17fb627 100644 --- a/include/structs.h +++ b/include/structs.h @@ -16,7 +16,7 @@ typedef struct { /* 0x01 */ char pad_01; /* 0x02 */ u16 unk_02; /* 0x04 */ Vec3f pos; - /* 0x10 */ Vec3f unk10; + /* 0x10 */ Vec3f unk_10; } ElementType1; // size = 0x1C typedef struct UnkStruct_D_80178280 { @@ -24,9 +24,11 @@ typedef struct UnkStruct_D_80178280 { /* 0x00C */ f32 unk_00C; /* 0x010 */ char pad_010[0x64]; /* 0x074 */ f32 unk_074; - /* 0x078 */ char pad_078[0x4]; + /* 0x078 */ f32 unk_078; /* 0x07C */ f32 unk_07C; - /* 0x080 */ char pad_080[0xB8]; + /* 0x080 */ char pad_080[0x50]; + /* 0x0D0 */ f32 unk_0D0; + /* 0x0D4 */ char pad_0D4[0x64]; /* 0x138 */ f32 unk_138; /* 0x13C */ char pad_13C[0x8C]; /* 0x1C8 */ s32 unk_1C8; @@ -47,24 +49,34 @@ typedef struct UnkStruct_D_80178280 { typedef struct { /* 0x000 */ ElementType1 unk_000; - /* 0x01C */ char pad_0[0x32]; - /* 0x4E */ s16 unk4E; - /* 0x50 */ char pad_50[0x88]; - /* 0xD8 */ f32 unkD8[50]; -} UnkStruct_D_8016F110; + /* 0x01C */ char pad_01C[0x32]; + /* 0x04E */ s16 unk_04E; + /* 0x050 */ char pad_050[0x88]; + /* 0x0D8 */ f32 unk_0D8[50]; + /* 0x1A0 */ char pad_1A0[0x268]; +} UnkStruct_D_8016F110; // size = 0x408 typedef struct { /* 0x000 */ ElementType1 unk_000; /* 0x01C */ char pad_01C[0x34]; /* 0x050 */ s32 unk_050[25]; - /* 0x0B4 */ char pad_0B4[0x8]; + /* 0x0B4 */ char pad_0B4[0x4]; + /* 0x0B8 */ s16 unk_0B8; + /* 0x0BA */ char pad_0BA[0x2]; /* 0x0BC */ u16 unk_0BC; - /* 0x0BE */ char pad_0BE[0x36]; + /* 0x0BC */ u16 unk_0BE; + /* 0x0C0 */ char pad_0C0[0x24]; + /* 0x0E4 */ s16 unk_0E4; + /* 0x0E6 */ s16 unk_0E6; + /* 0x0E8 */ f32 unk_0E8; + /* 0x0EC */ f32 unk_0EC; + /* 0x0F0 */ f32 unk_0F0; /* 0x0F4 */ f32 unk_0F4; /* 0x0F8 */ f32 unk_0F8; /* 0x0FC */ char pad_0FC[0x4]; /* 0x100 */ f32 unk_100[5]; /* 0x114 */ f32 unk_114[30]; + /* 0x18C */ Vec3f unk_18C[30]; } UnkStruct_func_80090A00; #endif diff --git a/include/variables.h b/include/variables.h index d38b45ee..8f045f9d 100644 --- a/include/variables.h +++ b/include/variables.h @@ -70,6 +70,7 @@ extern s32 D_801778A0; extern s32 D_801778A8; extern s32 D_801778B8; extern s32 D_801778E8; +extern f32 D_80177940; extern f32 D_80177978; extern f32 D_80177980; extern f32 D_80177988; @@ -79,6 +80,7 @@ extern f32 D_801779C0; extern s32 D_80177AE0; extern s32 D_80177AF8; extern u8 D_80177C98; +extern f32 D_80177D08; extern f32 D_80177D68; extern s32 D_80177DA0[]; extern s32 D_80177DB0; @@ -102,6 +104,10 @@ extern s32 D_80178554; extern s32 D_80178558; extern s32 D_8017855C; +extern u16 D_801839B8[]; +extern u16 D_80183A08[]; +extern u16 D_80183A64[]; + extern f32 D_801B7BC8; extern f32 D_801B7BCC; extern s32 D_801B8220[]; diff --git a/linker_scripts/us/symbol_addrs.txt b/linker_scripts/us/symbol_addrs.txt index 911b306b..dee5fd38 100644 --- a/linker_scripts/us/symbol_addrs.txt +++ b/linker_scripts/us/symbol_addrs.txt @@ -1,4 +1,5 @@ bootproc = 0x80004DA8; +Rand_ZeroOne = 0x80004EB0; D_800C90F0 = 0x800C90F0; D_800D934C = 0x800D934C; // force_migration:True diff --git a/src/main/5A20.c b/src/main/5A20.c index 5f807340..451dc0c9 100644 --- a/src/main/5A20.c +++ b/src/main/5A20.c @@ -17,7 +17,7 @@ void func_80004E4C(void) { D_8013B3AC = (s32) osGetTime() % 30000; } -f32 func_80004EB0(void) { +f32 Rand_ZeroOne(void) { D_8013B3A4 = (D_8013B3A4 * 0xAB) % 30269; D_8013B3A8 = (D_8013B3A8 * 0xAC) % 30307; D_8013B3AC = (D_8013B3AC * 0xAA) % 30323; diff --git a/src/main/sf_hud.c b/src/main/sf_hud.c index 50e0c2c0..653c1f3d 100644 --- a/src/main/sf_hud.c +++ b/src/main/sf_hud.c @@ -1103,9 +1103,6 @@ void func_8008DE68(void) { void func_8008E2C8(f32 arg0, f32 arg1, s32* arg2, f32 arg3) { f32 var_fs0 = 0.0f; s32 var_s2 = 0; - f32 temp_fs2; - f32 temp_fs3; - f32 temp_fv0; s32 i; arg0 -= (arg3 - 1.0f) * 34.0f; @@ -1291,23 +1288,23 @@ void func_8008F96C(void) { #pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_80090200.s") void func_800907C4(UnkStruct_D_8016F110* arg0) { - switch (arg0->unk4E) { + switch (arg0->unk_04E) { case 0: - if ((arg0->unkD8[1] == 255.0f) && (arg0->unkD8[2] == 212.0f)) { - arg0->unk4E = 1; + if ((arg0->unk_0D8[1] == 255.0f) && (arg0->unk_0D8[2] == 212.0f)) { + arg0->unk_04E = 1; } else { - func_8009BC2C(&arg0->unkD8[1], 255.0f, 0.3f, 6.0f, 6.0f); - func_8009BC2C(&arg0->unkD8[2], 212.0f, 0.3f, 4.98f, 4.98f); + func_8009BC2C(&arg0->unk_0D8[1], 255.0f, 0.3f, 6.0f, 6.0f); + func_8009BC2C(&arg0->unk_0D8[2], 212.0f, 0.3f, 4.98f, 4.98f); } break; case 1: - if ((arg0->unkD8[1] == 28.0f) && (arg0->unkD8[2] == 23.0f)) { - arg0->unk4E = 0; + if ((arg0->unk_0D8[1] == 28.0f) && (arg0->unk_0D8[2] == 23.0f)) { + arg0->unk_04E = 0; } else { - func_8009BC2C(&arg0->unkD8[1], 28.0f, 0.3f, 6.0f, 6.0f); - func_8009BC2C(&arg0->unkD8[2], 23.0f, 0.3f, 4.98f, 4.98f); + func_8009BC2C(&arg0->unk_0D8[1], 28.0f, 0.3f, 6.0f, 6.0f); + func_8009BC2C(&arg0->unk_0D8[2], 23.0f, 0.3f, 4.98f, 4.98f); } break; } @@ -1338,6 +1335,7 @@ s32 func_80090A00(UnkStruct_func_80090A00* arg0) { arg0->unk_000.pos.y -= 8.0f; break; } + case 2: arg0->unk_114[4] = D_8016F110[0].unk_000.pos.x + 1000.0f; arg0->unk_114[5] = 300.0f; @@ -1389,31 +1387,315 @@ s32 func_80090A00(UnkStruct_func_80090A00* arg0) { return false; } -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_80090CCC.s") +s32 func_80090CCC(UnkStruct_func_80090A00* arg0) { + s32 ret = 0; -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_80090E8C.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_800910C0.s") - -void func_80091254(void) { - if (D_80177880 == 1) { - func_80090E8C(); + if (func_8009092C(arg0) != 0) { + arg0->unk_114[6] = D_8016F110[arg0->unk_0E6].unk_000.pos.z; + arg0->unk_114[5] = D_8016F110[arg0->unk_0E6].unk_000.pos.y; + arg0->unk_114[4] = D_8016F110[arg0->unk_0E6].unk_000.pos.x; } else { - func_800910C0(); + arg0->unk_114[6] = D_8016F110[0].unk_000.pos.z; + arg0->unk_114[5] = D_8016F110[0].unk_000.pos.y; + arg0->unk_114[4] = D_8016F110[0].unk_000.pos.x; + } + + if ((fabsf(arg0->unk_000.pos.x - arg0->unk_114[4]) < 2000.0f) && + (fabsf(arg0->unk_000.pos.z - arg0->unk_114[6]) < 2000.0f)) { + arg0->unk_050[6]++; + if (arg0->unk_050[6] >= 9) { + arg0->unk_050[0] = 1; + arg0->unk_050[6] = 0; + } + } + + if ((fabsf(arg0->unk_000.pos.x - arg0->unk_114[4]) < 700.0f) && + (fabsf(arg0->unk_000.pos.x - arg0->unk_114[4]) < 700.0f)) { + arg0->unk_0B8 = 1; + arg0->unk_050[6] = 0; + ret = 1; + } + + if (arg0->unk_0BE == 0) { + arg0->unk_0BE = (s32) (Rand_ZeroOne() * 200.0f) + 200; + arg0->unk_114[10] = 30.0f; + } + + if (D_8016F110[arg0->unk_0E6].unk_000.unk_00 == 0) { + arg0->unk_0B8 = 1; + arg0->unk_0E6 = 0; + arg0->unk_050[6] = 0; + ret = 1; + } + + return ret; +} + +s32 func_80090E8C(UnkStruct_func_80090A00* arg0) { + f32 x; + f32 y; + f32 z; + f32 var_fv1_2; + + if (arg0->unk_0BC == 0) { + if (D_80177C98 == 1) { + x = (Rand_ZeroOne() - 0.5f) * 20000.0f; + y = (Rand_ZeroOne() - 0.5f) * 5000.0f; + z = (Rand_ZeroOne() - 0.5f) * 20000.0f; + } else { + x = (Rand_ZeroOne() - 0.5f) * 10000.0f; + y = Rand_ZeroOne() * 1000.0f; + z = (Rand_ZeroOne() - 0.5f) * 10000.0f; + } + + if ((fabsf(arg0->unk_000.pos.x - x) > 2000.0f) && (fabsf(arg0->unk_000.pos.z - z) > 2000.0f)) { + arg0->unk_114[4] = x; + arg0->unk_114[5] = y; + arg0->unk_114[6] = z; + arg0->unk_0BC = (s32) (Rand_ZeroOne() * 20.0f) + 10; + } + } + + if (arg0->unk_0E4 == 1) { + var_fv1_2 = 3000.0f; + } else { + var_fv1_2 = 5000.0f; + } + + if ((var_fv1_2 < fabsf(arg0->unk_000.pos.x - D_8016F110->unk_000.pos.x)) && + (var_fv1_2 < fabsf(arg0->unk_000.pos.z - D_8016F110->unk_000.pos.z))) { + arg0->unk_0B8 = 0; + } + + if (arg0->unk_0BE == 0) { + arg0->unk_0BE = (s32) (Rand_ZeroOne() * 200.0f) + 200; + arg0->unk_114[10] = 30.0f; + } + return false; +} + +s32 func_800910C0(UnkStruct_func_80090A00* arg0) { + f32 var_fv1; + + if (arg0->unk_0BC == 0) { + arg0->unk_18C[28].x = (Rand_ZeroOne() - 0.5f) * 2000.0f; + arg0->unk_18C[28].y = (Rand_ZeroOne() * 1000.0f) + 200.0f; + arg0->unk_18C[28].z = (Rand_ZeroOne() - 0.5f) * 2000.0f; + arg0->unk_0BC = (s32) (Rand_ZeroOne() * 20.0f) + 10; + } + + arg0->unk_114[4] = arg0->unk_18C[28].x + D_8016F110->unk_000.pos.x; + arg0->unk_114[5] = arg0->unk_18C[28].y; + arg0->unk_114[6] = arg0->unk_18C[28].z + D_8016F110->unk_000.pos.z; + + if (arg0->unk_0E4 == 1) { + var_fv1 = 1500.0f; + } else { + var_fv1 = 3000.0f; + } + + if ((var_fv1 < fabsf(arg0->unk_000.pos.x - arg0->unk_114[4])) && + (var_fv1 < fabsf(arg0->unk_000.pos.z - arg0->unk_114[6]))) { + arg0->unk_0B8 = 0; + } + + if (arg0->unk_0BE == 0) { + arg0->unk_0BE = (s32) (Rand_ZeroOne() * 200.0f) + 200; + arg0->unk_114[10] = 30.0f; + } + return false; +} + +void func_80091254(UnkStruct_func_80090A00* arg0) { + if (D_80177880 == 1) { + func_80090E8C(arg0); + } else { + func_800910C0(arg0); } } -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_80091298.s") +s32 func_80091298(UnkStruct_func_80090A00* arg0) { + arg0->unk_114[1] = D_80178280->unk_0D0 + 10.0f; + arg0->unk_114[3] = 3.6f; + arg0->unk_114[4] = D_80178280->unk_074 + ((f32) (arg0->unk_0E4 - 2) * 700.0f); + arg0->unk_114[5] = D_80178280->unk_078; + arg0->unk_114[6] = D_80178280->unk_138; -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_80091368.s") + if ((fabsf(arg0->unk_000.pos.x - arg0->unk_114[4]) < 700.0f) || + (fabsf(arg0->unk_000.pos.z - arg0->unk_114[6]) < 700.0f)) { + arg0->unk_114[1] = D_80178280->unk_0D0 - 10.0f; + arg0->unk_114[3] = 1.2f; + } + return false; +} -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_800914FC.s") +s32 func_80091368(UnkStruct_func_80090A00* arg0) { + switch (arg0->unk_050[5]) { + case 0: + arg0->unk_114[5] = 20000.0f; + arg0->unk_050[1] = 1; + arg0->unk_050[5] = 1; + D_801778B0[arg0->unk_0E4] = 1; + + switch (arg0->unk_0E4) { + case 1: + func_800BA808(D_801839B8, 10); + break; + + case 3: + func_800BA808(D_80183A08, 30); + break; + + case 2: + func_800BA808(D_80183A64, 20); + break; + } + D_801778B0[arg0->unk_0E4] = -1; + break; + + case 1: + if (arg0->unk_114[29] < 2.0f) { + arg0->unk_114[29] = 2.0f; + } + + if (arg0->unk_0BC == 0) { + arg0->unk_0BC = (s32) (Rand_ZeroOne() * 20.0f) + 30; + arg0->unk_114[7] = 360.0f; + arg0->unk_114[8] = 0.0f; + } + + if (arg0->unk_000.pos.y > 3000.0f) { + func_80060FBC(&arg0->unk_000.unk_00, arg0->unk_100); + } + break; + } + return false; +} + +void func_800914FC(UnkStruct_func_80090A00* arg0) { + switch (arg0->unk_0B8) { + case 0: + if (func_80090CCC(arg0) == 0) { + break; + } + case 1: + func_80091254(arg0); + break; + + case 2: + func_80091298(arg0); + break; + + case 3: + func_80091368(arg0); + break; + + case 7: + func_80090A00(arg0); + break; + } + + if ((D_801778B0[arg0->unk_0E4] <= 0) && (arg0->unk_0B8 != 3)) { + arg0->unk_050[5] = 0; + arg0->unk_0B8 = 3; + } + + if (D_80178280->unk_1C8 == 7) { + if ((arg0->unk_0B8 != 2) && (arg0->unk_0B8 != 3)) { + arg0->unk_050[4] = 1; + arg0->unk_0B8 = 2; + } + } +} #pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_800915FC.s") -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_80091864.s") +s32 func_80091864(UnkStruct_func_80090A00* arg0) { + f32 sp44; + f32 sp40; + f32 sp3C; + f32 x; + f32 y; + f32 z; + f32 sp2C; + f32 sp28; -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_80091B90.s") + x = arg0->unk_114[4] - arg0->unk_000.pos.x; + y = arg0->unk_114[5] - arg0->unk_000.pos.y; + z = arg0->unk_114[6] - arg0->unk_000.pos.z; + + sp40 = func_8009F768(func_80005100(x, z)); + sp44 = func_8009F768(func_80005100(y, sqrtf(SQ(x) + SQ(z)))); + + if ((func_800915FC(arg0) != 0) && (arg0->unk_050[4] == 0)) { + sp44 += 40.0f; + if (sp44 >= 360.0f) { + sp44 -= 360.0f; + } else if ((arg0->unk_000.pos.y < (D_80177940 + 50.0f)) && (D_80177C98 == 0) && (sp44 > 180.0f)) { + sp44 = 0.0f; + } + arg0->unk_050[0] = 0; + } + + sp3C = func_8009BD38(&arg0->unk_0F8, sp40, 0.5f, arg0->unk_114[2], 0.001f) * 30.0f; + func_8009BD38(&arg0->unk_0F4, sp44, 0.5f, arg0->unk_114[2], 0.0001f); + sp2C = sp28 = 0.0f; + + if (sp3C < 0.0f) { + sp2C = -sp3C; + } else { + sp28 = sp3C; + } + + func_8009BC2C(&arg0->unk_114[15], sp2C, 0.2f, 30.0f, 0.00f); + func_8009BC2C(&arg0->unk_114[26], -sp2C, 0.2f, 30.0f, 0.00f); + func_8009BC2C(&arg0->unk_114[16], sp28, 0.2f, 30.0f, 0.00f); + func_8009BC2C(&arg0->unk_114[27], -sp28, 0.2f, 30.0f, 0.00f); + + if (sp3C < 0.0f) { + sp3C *= -1.0f; + } else { + sp3C = 360.0f - sp3C; + } + + func_8009BC2C(&arg0->unk_114[7], arg0->unk_114[8], 0.2f, 30.0f, 0.0001f); + + if ((arg0->unk_114[7] > 0.01f) && (arg0->unk_114[7] < 359.9f)) { + func_8009BD38(&arg0->unk_000.unk_10.z, arg0->unk_114[7], 0.2f, 100.0f, 0.01f); + } else { + func_8009BD38(&arg0->unk_000.unk_10.z, sp3C, 0.1f, 3.0f, 0.01f); + } + + return false; +} + +s32 func_80091B90(UnkStruct_func_80090A00* arg0) { + Vec3f vec; + + arg0->unk_000.unk_10.x = -arg0->unk_0F4; + arg0->unk_000.unk_10.y = arg0->unk_0F8; + + func_8009BC2C(arg0->unk_114, arg0->unk_114[1], 0.2f, 1.0f, 0.0f); + func_8009BC2C(&arg0->unk_114[2], arg0->unk_114[3], 1.0f, 1.0f, 0.0f); + + func_8009F6CC(&vec, arg0->unk_000.unk_10.x, arg0->unk_000.unk_10.y, arg0->unk_114[0] + arg0->unk_114[9]); + + arg0->unk_0EC = arg0->unk_114[14] + vec.y; + arg0->unk_0E8 = arg0->unk_114[13] + vec.x; + arg0->unk_0F0 = arg0->unk_114[12] + vec.z; + + arg0->unk_114[13] -= arg0->unk_114[13] * 0.1f; + arg0->unk_114[14] -= arg0->unk_114[14] * 0.1f; + arg0->unk_114[12] -= arg0->unk_114[12] * 0.1f; + + if ((arg0->unk_000.pos.y < D_80177940 + 40.0f) && (arg0->unk_0EC < 0.0f) && (D_80177C98 == 0)) { + arg0->unk_000.pos.y = D_80177940 + 40.0f; + arg0->unk_0EC = 0.0f; + } + arg0->unk_0F0 -= D_80177D08; + + return false; +} #pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_80091CF8.s")