From b7a48d1cde4352fdccc11389c37895d288e9c448 Mon Sep 17 00:00:00 2001 From: kabiskac Date: Wed, 26 Jun 2024 04:13:43 +0200 Subject: [PATCH] Finished m406Dll --- config/GMPE01_00/rels/m406Dll/symbols.txt | 17 +- configure.py | 2 +- include/REL/m406Dll.h | 20 + src/REL/m406Dll/map.c | 229 ++- src/REL/m406Dll/player.c | 2081 +++++++++++++++++++++ 5 files changed, 2243 insertions(+), 106 deletions(-) create mode 100644 src/REL/m406Dll/player.c diff --git a/config/GMPE01_00/rels/m406Dll/symbols.txt b/config/GMPE01_00/rels/m406Dll/symbols.txt index 0676ffe9..f611684a 100644 --- a/config/GMPE01_00/rels/m406Dll/symbols.txt +++ b/config/GMPE01_00/rels/m406Dll/symbols.txt @@ -372,23 +372,23 @@ lbl_1_data_8DC = .data:0x000008DC; // type:object size:0x4 lbl_1_data_8E0 = .data:0x000008E0; // type:object size:0x30 lbl_1_data_910 = .data:0x00000910; // type:object size:0x20 lbl_1_data_930 = .data:0x00000930; // type:object size:0x30 -lbl_1_data_960 = .data:0x00000960; // type:object size:0x348 -lbl_1_data_CA8 = .data:0x00000CA8; // type:object size:0x348 +lbl_1_data_960 = .data:0x00000960; // type:object size:0x348 data:float +lbl_1_data_CA8 = .data:0x00000CA8; // type:object size:0x348 data:float lbl_1_data_FF0 = .data:0x00000FF0; // type:object size:0x10 lbl_1_data_1000 = .data:0x00001000; // type:object size:0x19 data:string lbl_1_data_1019 = .data:0x00001019; // type:object size:0x19 data:string lbl_1_data_1032 = .data:0x00001032; // type:object size:0x1A data:string -lbl_1_data_104C = .data:0x0000104C; // type:object size:0x1C +lbl_1_data_104C = .data:0x0000104C; // type:object size:0x1C data:string lbl_1_data_1068 = .data:0x00001068; // type:object size:0x10 lbl_1_data_1078 = .data:0x00001078; // type:object size:0x28 -lbl_1_data_10A0 = .data:0x000010A0; // type:object size:0x80 +lbl_1_data_10A0 = .data:0x000010A0; // type:object size:0x80 data:4byte lbl_1_data_1120 = .data:0x00001120; // type:object size:0x20 lbl_1_data_1140 = .data:0x00001140; // type:object size:0x8 lbl_1_data_1148 = .data:0x00001148; // type:object size:0x1C data:string -lbl_1_data_1164 = .data:0x00001164; // type:object size:0x90 +lbl_1_data_1164 = .data:0x00001164; // type:object size:0x90 data:float lbl_1_data_11F4 = .data:0x000011F4; // type:object size:0x4 data:4byte -lbl_1_data_11F8 = .data:0x000011F8; // type:object size:0x20 -lbl_1_data_1218 = .data:0x00001218; // type:object size:0x18 +lbl_1_data_11F8 = .data:0x000011F8; // type:object size:0x20 data:float +lbl_1_data_1218 = .data:0x00001218; // type:object size:0x18 data:float lbl_1_bss_0 = .bss:0x00000000; // type:object size:0x4 data:4byte lbl_1_bss_4 = .bss:0x00000004; // type:object size:0x4 data:4byte lbl_1_bss_8 = .bss:0x00000008; // type:object size:0x4 data:4byte @@ -421,7 +421,8 @@ lbl_1_bss_C8 = .bss:0x000000C8; // type:object size:0x4 data:4byte lbl_1_bss_CC = .bss:0x000000CC; // type:object size:0x4 data:4byte lbl_1_bss_D0 = .bss:0x000000D0; // type:object size:0x4 data:4byte lbl_1_bss_D4 = .bss:0x000000D4; // type:object size:0x4 data:4byte -lbl_1_bss_D8 = .bss:0x000000D8; // type:object size:0x8 data:4byte +lbl_1_bss_D8 = .bss:0x000000D8; // type:object size:0x4 data:4byte +lbl_1_bss_DC = .bss:0x000000DC; // type:object size:0x4 data:4byte lbl_1_bss_E0 = .bss:0x000000E0; // type:object size:0x18 data:float lbl_1_bss_F8 = .bss:0x000000F8; // type:object size:0x8 data:4byte lbl_1_bss_100 = .bss:0x00000100; // type:object size:0x4 data:float diff --git a/configure.py b/configure.py index e8a541da..6d6cd6e1 100644 --- a/configure.py +++ b/configure.py @@ -862,7 +862,7 @@ config.libs = [ Object(Matching, "REL/executor.c"), Object(Matching, "REL/m406Dll/main.c"), Object(Matching, "REL/m406Dll/map.c"), - Object(NonMatching, "REL/m406Dll/player.c"), + Object(Matching, "REL/m406Dll/player.c"), }, ), Rel( diff --git a/include/REL/m406Dll.h b/include/REL/m406Dll.h index 656521ae..64862a57 100644 --- a/include/REL/m406Dll.h +++ b/include/REL/m406Dll.h @@ -4,16 +4,36 @@ #include "game/object.h" #include "game/process.h" +typedef struct UnkM406Struct2 { + /* 0x00 */ float unk_00; + /* 0x04 */ float unk_04; + /* 0x08 */ Vec unk_08; + /* 0x14 */ Vec unk_14; +} UnkM406Struct2; /* size = 0x20 */ + s32 fn_1_122C(void); +void fn_1_123C(void); +void fn_1_1274(s32 arg0); +void fn_1_1284(void); +void fn_1_12BC(void); + omObjData *fn_1_2308(Process *arg0); void fn_1_2BEC(void); void fn_1_3064(s32 arg0); void fn_1_696C(float arg8); void fn_1_6B5C(void); +void fn_1_69C0(Vec *arg0); +s32 fn_1_6A44(Vec arg0); +void fn_1_6BB4(Vec *arg0); +void fn_1_82C8(Mtx arg0, s32 arg1, float arg8); +s32 fn_1_94C0(Mtx arg0, s32 arg1, s32 arg2); void fn_1_B104(float arg8); void fn_1_B25C(void); void fn_1_B41C(void); void fn_1_D65C(Process *arg0); void fn_1_D8B0(void); +extern UnkM406Struct2 *lbl_1_bss_B8; +extern s32 lbl_1_bss_B4; + #endif diff --git a/src/REL/m406Dll/map.c b/src/REL/m406Dll/map.c index 01786521..ede77b39 100644 --- a/src/REL/m406Dll/map.c +++ b/src/REL/m406Dll/map.c @@ -21,13 +21,6 @@ typedef struct UnkM406Struct { /* 0x2C */ float unk_2C; } UnkM406Struct; /* size = 0x30 */ -typedef struct UnkM406Struct2 { - /* 0x00 */ float unk_00; - /* 0x04 */ float unk_04; - /* 0x08 */ Vec unk_08; - /* 0x14 */ Vec unk_14; -} UnkM406Struct2; /* size = 0x20 */ - typedef struct UnkM406Struct3 { /* 0x00 */ s32 unk_00; /* 0x04 */ float unk_04; @@ -492,7 +485,8 @@ omObjData *fn_1_2308(Process *arg0) if (var_r31 < 6) { var_r30 = Hu3DModelCreateFile(lbl_1_data_7C4[var_r31]); lbl_1_bss_CC->model[var_r31 + 7] = var_r30; - } else { + } + else { var_r30 = -1; lbl_1_bss_CC->model[var_r31 + 7] = var_r30; } @@ -519,7 +513,8 @@ omObjData *fn_1_2308(Process *arg0) for (var_r31 = 0; var_r31 < 3; var_r31++) { if (var_r31 == 0) { lbl_1_bss_C4->model[var_r31] = Hu3DModelCreateFile(DATA_MAKE_NUM(DATADIR_M406, 34)); - } else { + } + else { lbl_1_bss_C4->model[var_r31] = Hu3DModelLink(*lbl_1_bss_C4->model); } Hu3DModelShadowSet(lbl_1_bss_C4->model[var_r31]); @@ -599,7 +594,8 @@ void fn_1_2C24(omObjData *object) if (object->model[var_r29] != -1) { Hu3DModelAttrSet(object->model[var_r29], 1); } - } else { + } + else { if (object->model[var_r30] != -1) { Hu3DModelAttrReset(object->model[var_r30], 1); } @@ -614,7 +610,8 @@ void fn_1_2C24(omObjData *object) var_f31 = 25000.0f; if (fabs(Center.z - var_f31) < 15000.0) { Hu3DModelAttrSet(object->model[var_r29], 1); - } else { + } + else { Hu3DModelAttrReset(object->model[var_r29], 1); } } @@ -625,7 +622,8 @@ void fn_1_2C24(omObjData *object) for (var_r30 = 0; var_r30 < 3; var_r30++) { if (fabs(Center.z - lbl_1_data_780[var_r30].z) > 10000.0) { Hu3DModelAttrSet(lbl_1_bss_C4->model[var_r30], 1); - } else { + } + else { Hu3DModelAttrReset(lbl_1_bss_C4->model[var_r30], 1); } } @@ -749,7 +747,8 @@ void fn_1_3158(void) } if (var_r29 == 1 || var_r29 == 103) { var_r27->unk_14 = 0.6f; - } else { + } + else { var_r27->unk_14 = 1.0f; } var_r27->unk_18.x = var_r27->unk_18.y = var_r27->unk_18.z = 0.0f; @@ -842,22 +841,26 @@ void fn_1_3158(void) var_r30->unk_01 = 1; if (var_r29 < 6) { var_r30->unk_08 = (6 - var_r29) / 6.0f; - } else { + } + else { var_r30->unk_08 = 1.0f; } - } else { + } + else { var_r30->unk_01 = 0; var_r30->unk_08 = 0.0f; } if (!var_r25 || var_r25 == 34 || !var_r29) { var_r30->unk_00 = 0; var_r30->unk_04 = 0.0f; - } else { + } + else { var_r30->unk_00 = 1; if (var_r29 < 3) { var_r30->unk_04 = 0.5f + (0.5f * (var_r29 / 3.0f)); var_r30->unk_04 = sind(90.0f * var_r30->unk_04); - } else { + } + else { var_r30->unk_04 = 1.0f; } } @@ -870,7 +873,8 @@ void fn_1_3158(void) var_f31 = var_r25 / 6.0f; var_r30->unk_04 = var_r30->unk_04 * sind(90.0f * var_f31); var_r30->unk_0C = var_r30->unk_0C * sind(90.0f * var_f31); - } else if (var_r25 > 28) { + } + else if (var_r25 > 28) { var_f31 = (var_r25 - 28) / 6.0f; var_r30->unk_04 = var_r30->unk_04 * cosd(90.0f * var_f31); var_r30->unk_0C = var_r30->unk_0C * cosd(90.0f * var_f31); @@ -996,13 +1000,15 @@ void fn_1_4084(void) sp28.y = 0.5f * (var_r31->unk_34.y + var_r31->unk_40.y); sp28.z = 0.5f * (var_r31->unk_34.z + var_r31->unk_40.z); var_r31->unk_20 = HuAudFXEmiterPlay(1337, &sp28); - } else if (var_r31->unk_20 != -1) { + } + else if (var_r31->unk_20 != -1) { sp28.x = 0.5f * (var_r31->unk_34.x + var_r31->unk_40.x); sp28.y = 0.5f * (var_r31->unk_34.y + var_r31->unk_40.y); sp28.z = 0.5f * (var_r31->unk_34.z + var_r31->unk_40.z); HuAudFXEmiterUpDate(var_r31->unk_20, &sp28); } - } else if (var_r31->unk_20 != -1) { + } + else if (var_r31->unk_20 != -1) { HuAudFXStop(var_r31->unk_20); var_r31->unk_20 = -1; } @@ -1010,7 +1016,8 @@ void fn_1_4084(void) if (var_r31->unk_0C > var_r31->unk_18) { var_r31->unk_1C = var_r31->unk_0C - var_r31->unk_18; var_r31->unk_0C = var_r31->unk_18; - } else { + } + else { var_r31->unk_1C = 0.0f; } var_r28 = var_r31->unk_84; @@ -1025,10 +1032,12 @@ void fn_1_4084(void) var_r30 = 0; sp1C = lbl_1_data_F0[var_r30]; sp10 = lbl_1_data_438[var_r30]; - } else if (var_r30 < (lbl_1_bss_B4 - 1)) { + } + else if (var_r30 < (lbl_1_bss_B4 - 1)) { fn_1_D488(sp8, &lbl_1_data_F0[var_r30], &lbl_1_data_F0[var_r30 + 1], &sp1C); fn_1_D488(sp8, &lbl_1_data_438[var_r30], &lbl_1_data_438[var_r30 + 1], &sp10); - } else { + } + else { var_r30 = lbl_1_bss_B4 - 1; sp1C = lbl_1_data_F0[var_r30]; sp10 = lbl_1_data_438[var_r30]; @@ -1151,11 +1160,11 @@ void fn_1_4964(ModelData *arg0) GXColor *var_r19; var_r30 = arg0->unk_120; - (void)var_f31; - (void)var_f31; - (void)var_f31; - (void)var_f31; - + (void)var_f31; + (void)var_f31; + (void)var_f31; + (void)var_f31; + if (var_r30->unk_28) { if (!omPauseChk()) { fn_1_67CC(arg0); @@ -1241,12 +1250,13 @@ void fn_1_4964(ModelData *arg0) fn_1_71C4(spC4, spA0, 100.0f + (50.0f * (0.007874016f * (frand() & 0x7F))), -0.1f, sp3C); } var_r29 = var_r30->unk_2C; - memset(lbl_1_bss_48, 0, sizeof(UnkM406Struct5)); + memset(lbl_1_bss_48, 0, sizeof(UnkM406Struct5)); for (var_r27 = 0; var_r27 < 105; var_r27++, var_r29++) { fn_1_D488(var_r29->unk_04, &var_r30->unk_84[var_r29->unk_00], &var_r30->unk_84[var_r29->unk_00 + 1], &var_r29->unk_18); if (var_r29->unk_08 >= 0) { var_r29->unk_08--; - } else { + } + else { var_r29->unk_24 = fn_1_7B2C(var_r29->unk_0C); if (var_r29->unk_24 == NULL) { var_r29->unk_24 = &lbl_1_bss_48; @@ -1261,12 +1271,14 @@ void fn_1_4964(ModelData *arg0) sp3C.a = 0xFF; if (frand() & 1) { var_f31 = 0.05f; - } else { + } + else { var_f31 = -0.05f; } var_r29->unk_10 = 0.01f * (100.0f * (0.007874016f * (frand() & 0x7F))); var_r29->unk_0C = fn_1_79F8(spC4, spA0, 75.0f + (var_r29->unk_14 * (75.0f * (0.007874016f * (frand() & 0x7F)))), var_f31, sp3C); - } else { + } + else { var_r29->unk_18.y += var_r29->unk_10; var_r29->unk_24->unk_30 = var_r29->unk_18; } @@ -1277,13 +1289,15 @@ void fn_1_4964(ModelData *arg0) if ((frand() & 3) == 0) { var_f31 = 45.0f + (30.0f * (0.007874016f * (frand() & 0x7F))); var_f29 = 0.75f + (0.75f * (0.007874016f * (frand() & 0x7F))); - } else { + } + else { var_f31 = -(15.0f * (0.007874016f * (frand() & 0x7F))); var_f29 = 1.75f + (0.75f * (0.007874016f * (frand() & 0x7F))); } if (var_r30->unk_10 != 0.0f) { var_f30 = 15.000001f / var_r30->unk_10; - } else { + } + else { var_f30 = 1.0f; } spA0.y = var_f30 * ((7.5000005f * var_f29) * sind(var_f31)); @@ -1324,49 +1338,52 @@ void fn_1_4964(ModelData *arg0) default: break; } - } else { + } + else { Hu3DModelAttrSet(var_r31->unk_00, 1); var_r31->unk_08 = -1; var_r31->unk_0C--; } - } else if (var_r31->unk_08 >= 0) { + } + else if (var_r31->unk_08 >= 0) { var_r24 = fn_1_66F4(var_r30->unk_0C + var_r31->unk_18, &sp38); if (var_r24 >= 0 && var_r24 < (lbl_1_bss_B4 - 1)) { - fn_1_D488(sp38, &lbl_1_data_F0[var_r24], &lbl_1_data_F0[var_r24+1], &spB8); + fn_1_D488(sp38, &lbl_1_data_F0[var_r24], &lbl_1_data_F0[var_r24 + 1], &spB8); fn_1_D488(sp38, &lbl_1_data_438[var_r24], &lbl_1_data_438[var_r24 + 1], &spAC); fn_1_D488(var_r31->unk_10, &spB8, &spAC, &var_r31->unk_3C); Hu3DModelAttrReset(var_r31->unk_00, 1); - } else { + } + else { Hu3DModelAttrSet(var_r31->unk_00, 1); var_r31->unk_08 = -1; - continue; + continue; + } + + switch (var_r31->unk_04) { + case 0: + var_r31->unk_18 = var_r31->unk_1C * sind(5.0f * var_r31->unk_08); + var_r31->unk_20 = var_r31->unk_20 - var_r31->unk_2C; + Hu3DModelPosSet(var_r31->unk_00, var_r31->unk_3C.x, var_r31->unk_3C.y, var_r31->unk_3C.z); + Hu3DModelRotSet(var_r31->unk_00, var_r31->unk_20, var_r31->unk_24, 0.0f); + break; + case 1: + var_r31->unk_18 = var_r31->unk_1C * sind((float)var_r31->unk_08); + var_r31->unk_20 = var_r31->unk_20 - var_r31->unk_2C; + var_r31->unk_14 = var_r31->unk_14 + var_r31->unk_28; + if (var_r31->unk_14 < 0.0f) { + var_f30 = 0.65 + (0.15 * (0.007874016f * (frand() & 0x7F))); + var_f30 = var_f30; + var_r31->unk_14 = 0.0f; + var_r31->unk_28 = var_r31->unk_28 * -var_f30; + } + var_r31->unk_28 = var_r31->unk_28 - 0.32666668f; + var_r31->unk_3C.y += var_r31->unk_14; + Hu3DModelPosSet(var_r31->unk_00, var_r31->unk_3C.x, var_r31->unk_3C.y, var_r31->unk_3C.z); + Hu3DModelRotSet(var_r31->unk_00, var_r31->unk_20, var_r31->unk_24, 0.0f); + break; + default: + break; } - - switch (var_r31->unk_04) { - case 0: - var_r31->unk_18 = var_r31->unk_1C * sind(5.0f * var_r31->unk_08); - var_r31->unk_20 = var_r31->unk_20 - var_r31->unk_2C; - Hu3DModelPosSet(var_r31->unk_00, var_r31->unk_3C.x, var_r31->unk_3C.y, var_r31->unk_3C.z); - Hu3DModelRotSet(var_r31->unk_00, var_r31->unk_20, var_r31->unk_24, 0.0f); - break; - case 1: - var_r31->unk_18 = var_r31->unk_1C * sind((float)var_r31->unk_08); - var_r31->unk_20 = var_r31->unk_20 - var_r31->unk_2C; - var_r31->unk_14 = var_r31->unk_14 + var_r31->unk_28; - if (var_r31->unk_14 < 0.0f) { - var_f30 = 0.65 + (0.15 * (0.007874016f * (frand() & 0x7F))); - var_f30 = var_f30; - var_r31->unk_14 = 0.0f; - var_r31->unk_28 = var_r31->unk_28 * -var_f30; - } - var_r31->unk_28 = var_r31->unk_28 - 0.32666668f; - var_r31->unk_3C.y += var_r31->unk_14; - Hu3DModelPosSet(var_r31->unk_00, var_r31->unk_3C.x, var_r31->unk_3C.y, var_r31->unk_3C.z); - Hu3DModelRotSet(var_r31->unk_00, var_r31->unk_20, var_r31->unk_24, 0.0f); - break; - default: - break; - } } if (var_r31->unk_18 < (-0.1f * var_r31->unk_1C)) { var_r31->unk_08 = -1; @@ -1444,7 +1461,8 @@ void fn_1_64F8(UnkM406Struct2 *arg0) PSVECSubtract(&var_r28->unk_14, &var_r31->unk_14, &var_r31->unk_08); var_r31->unk_00 = PSVECMag(&var_r31->unk_08); PSVECNormalize(&var_r31->unk_08, &var_r31->unk_08); - } else { + } + else { var_r31->unk_00 = 100000.0f; var_r31->unk_08.x = 0.0f; var_r31->unk_08.y = 0.0f; @@ -1490,7 +1508,8 @@ void fn_1_67CC(ModelData *arg0) if (var_r31->unk_04 != 3 || var_r31->unk_0C > 0) { Hu3DModelAttrSet(var_r31->unk_00, 1); var_r31->unk_0C--; - } else { + } + else { var_r31->unk_20 = var_r31->unk_20 - var_r31->unk_2C; var_r31->unk_3C.x += var_r31->unk_30.x; var_r31->unk_3C.y += var_r31->unk_30.y; @@ -1533,7 +1552,7 @@ void fn_1_69C0(Vec *arg0) } } -s32 fn_1_6A44(Vec *arg0) +s32 fn_1_6A44(Vec arg0) { Vec sp20; Vec sp14; @@ -1553,7 +1572,7 @@ s32 fn_1_6A44(Vec *arg0) PSVECScale(&sp8, &sp8, 0.5f); PSVECSubtract(&var_r31->unk_34, &sp8, &sp20); PSVECSubtract(&var_r31->unk_40, &sp8, &sp14); - var_f31 = fn_1_D5CC(&sp20, &sp14, arg0->x - sp8.x, arg0->z - sp8.z); + var_f31 = fn_1_D5CC(&sp20, &sp14, arg0.x - sp8.x, arg0.z - sp8.z); if (var_f31 <= 0.0f) { return 0; } @@ -1795,7 +1814,8 @@ void fn_1_77F0(void) var_r31 = var_r29->unk_3C; if (fn_1_122C() < 3) { var_r29->unk_22 |= 1; - } else { + } + else { var_r29->unk_22 &= 0xFFFFFFFE; } for (var_r28 = 0; var_r28 < var_r29->unk_26; var_r28++, var_r31++) { @@ -2039,24 +2059,23 @@ void fn_1_7F80(void) void fn_1_8100(void) { } - s32 fn_1_8104(Vec arg0, Vec arg1, float arg8, GXColor arg2) { UnkM406Struct5 *var_r31; UnkM406Unk120Struct2 *var_r30; - UnkM406Struct6 *var_r28; + UnkM406Struct6 *var_r28; s32 var_r29; - + ModelData *var_r27; - - var_r28 = lbl_1_bss_A4; - + + var_r28 = lbl_1_bss_A4; + var_r27 = &Hu3DData[var_r28->unk_00]; var_r30 = var_r27->unk_120; var_r31 = var_r30->unk_3C; for (var_r29 = 0; var_r29 < var_r30->unk_26; var_r29++, var_r31++) { if (var_r31->unk_28 <= 0.0f) { - + break; } } @@ -2090,7 +2109,6 @@ s32 fn_1_8104(Vec arg0, Vec arg1, float arg8, GXColor arg2) return var_r29; } - void fn_1_8244(s32 arg0, s32 arg1, float arg8, float arg9) { UnkM406Struct5 *var_r31; @@ -2212,7 +2230,8 @@ void fn_1_8F98(void) PSMTXIdentity(var_r31->unk_1C); if (var_r30 == 0) { var_r31->unk_04 = Hu3DModelCreateFile(DATA_MAKE_NUM(DATADIR_M406, 59)); - } else { + } + else { var_r31->unk_04 = Hu3DModelLink(lbl_1_bss_A0->unk_04); } Hu3DModelLayerSet(var_r31->unk_04, 3); @@ -2230,7 +2249,8 @@ void fn_1_8F98(void) PSMTXIdentity(var_r31->unk_1C); if (var_r30 == 0) { var_r31->unk_04 = Hu3DModelCreateFile(DATA_MAKE_NUM(DATADIR_M406, 60)); - } else { + } + else { var_r31->unk_04 = Hu3DModelLink(lbl_1_bss_A0[64].unk_04); } Hu3DModelLayerSet(var_r31->unk_04, 3); @@ -2338,7 +2358,8 @@ s32 fn_1_94C0(Mtx arg0, s32 arg1, s32 arg2) sp40.y += sp64.y; sp40.z += sp64.z; mtxRotCat(spA0, 0.0f, 180.0f + (45.0f * (0.007874016f * (frand() & 0x7F))), 0.0f); - } else { + } + else { sp4C = sp64; sp4C.x = -25.0f; sp4C.z = -50.0f; @@ -2380,7 +2401,8 @@ s32 fn_1_94C0(Mtx arg0, s32 arg1, s32 arg2) if (var_r28 >= 64) { return -1; } - } else { + } + else { for (var_r28 = 0, var_r31 = &lbl_1_bss_A0[64]; var_r28 < 64; var_r28++, var_r31++) { if (!var_r31->unk_00) { break; @@ -2533,15 +2555,17 @@ void fn_1_A2C8(ModelData *arg0, UnkM406Unk120Struct2 *arg1, Mtx arg2) var_r31->unk_30.y = -27000.0f + (var_f26 * sp18.y); var_r31->unk_30.z = -63000.0f + (var_f26 * sp18.z); var_r31->unk_28 = (0.3f + (0.7f * (var_f25 * var_f25))) - * (lbl_1_data_8A4[var_r29->unk_02] * (0.699999988079071 + (0.30000001192092896 * (1.52587890625e-05 * (float)(frand() & 0xFFFF))))); + * (lbl_1_data_8A4[var_r29->unk_02] + * (0.699999988079071 + (0.30000001192092896 * (1.52587890625e-05 * (float)(frand() & 0xFFFF))))); var_r31->unk_3C.r = (s32)(160.0 * (1.52587890625e-05 * (float)(frand() & 0xFFFF))) + 0x20; var_r31->unk_3C.g = (s32)(96.0 * (1.52587890625e-05 * (float)(frand() & 0xFFFF))) + 0x20; var_r31->unk_3C.b = (s32)(128.0 * (1.52587890625e-05 * (float)(frand() & 0xFFFF))) + 0x20; - var_r31->unk_3C.a - = ((1.0 - (0.4 * var_f25)) * (255.0f * lbl_1_data_8B4[var_r29->unk_02])) - (int)(16.0 * (1.52587890625e-05 * (float)(frand() & 0xFFFF))); + var_r31->unk_3C.a = ((1.0 - (0.4 * var_f25)) * (255.0f * lbl_1_data_8B4[var_r29->unk_02])) + - (int)(16.0 * (1.52587890625e-05 * (float)(frand() & 0xFFFF))); } var_r29->unk_04++; - } else { + } + else { var_r31->unk_30.x = 0.0f; var_r31->unk_30.y = -27000.0f; var_r31->unk_30.z = -63000.0f; @@ -2881,18 +2905,22 @@ void fn_1_BC18(ModelData *arg0, float (*arg1)[4]) if (shadowModelDrawF) { GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ONE, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO); GXSetZMode(GX_FALSE, GX_LEQUAL, GX_FALSE); - } else { + } + else { var_r21 = var_r31->unk_38->bmp->dataFmt & 0xF; if (var_r21 == 7 || var_r21 == 8) { GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_ONE, GX_CC_RASC, GX_CC_ZERO); - } else { + } + else { GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_TEXC, GX_CC_RASC, GX_CC_ZERO); } if (var_r31->unk_22 & 1) { GXSetZMode(GX_FALSE, GX_LEQUAL, GX_FALSE); - } else if (arg0->attr & 2) { + } + else if (arg0->attr & 2) { GXSetZMode(GX_TRUE, GX_LEQUAL, GX_TRUE); - } else { + } + else { GXSetZMode(GX_TRUE, GX_LEQUAL, GX_FALSE); } } @@ -2947,7 +2975,8 @@ void fn_1_BC18(ModelData *arg0, float (*arg1)[4]) var_r30++; var_r30->x = var_r30->y = var_r30->z = 0.0f; var_r30++; - } else if (!var_r29->unk_2C) { + } + else if (!var_r29->unk_2C) { var_r27 = &sp98[0]; var_r24 = &sp38[0]; PSVECScale(var_r24++, var_r27, var_r29->unk_28); @@ -2958,7 +2987,8 @@ void fn_1_BC18(ModelData *arg0, float (*arg1)[4]) PSVECAdd(var_r27++, &var_r29->unk_30, var_r30++); PSVECScale(var_r24++, var_r27, var_r29->unk_28); PSVECAdd(var_r27++, &var_r29->unk_30, var_r30++); - } else { + } + else { PSVECScale(lbl_1_data_8E0, &sp98[0], var_r29->unk_28); PSVECScale(&lbl_1_data_8E0[1], &sp98[1], var_r29->unk_28); PSVECScale(&lbl_1_data_8E0[2], &sp98[2], var_r29->unk_28); @@ -2983,7 +3013,8 @@ void fn_1_BC18(ModelData *arg0, float (*arg1)[4]) var_r28->y = (0.25f * var_r19) + lbl_1_data_910[var_r25].y; } } - } else { + } + else { for (var_r26 = 0; var_r26 < var_r31->unk_26; var_r26++, var_r29++) { for (var_r25 = 0; var_r25 < 4; var_r25++, var_r28++) { var_r28->x = 4.0f * lbl_1_data_910[var_r25].x; @@ -3113,7 +3144,8 @@ void fn_1_C86C(ModelData *arg0, Mtx arg1) GXSetZCompLoc(GX_FALSE); if (arg0->attr & 2) { GXSetZMode(GX_TRUE, GX_LEQUAL, GX_TRUE); - } else { + } + else { GXSetZMode(GX_TRUE, GX_LEQUAL, GX_FALSE); } switch (var_r31->unk_20) { @@ -3156,7 +3188,8 @@ void fn_1_C86C(ModelData *arg0, Mtx arg1) var_r30++; var_r30->x = var_r30->y = var_r30->z = 0.0f; var_r30++; - } else { + } + else { var_r28 = (Vec *)&sp6C; var_r27 = (Vec *)&sp3C; PSVECScale(var_r27++, var_r28, var_r29->unk_28); @@ -3332,13 +3365,15 @@ void fn_1_D13C(LightData *arg0, s16 arg1, Mtx arg2, Mtx arg3, float arg8) PSMTXMultVec(arg2, &arg0->unk_28, &sp24); PSMTXMultVec(arg3, &arg0->unk_1C, &sp18); GXInitLightPos(&sp30, sp18.x, sp18.y, sp18.z); - } else { + } + else { GXInitLightPos(&sp30, arg0->unk_1C.x, arg0->unk_1C.y, arg0->unk_1C.z); sp24 = arg0->unk_28; } if (arg8 == 0.0f) { GXInitLightDir(&sp30, sp24.x, sp24.y, sp24.z); - } else { + } + else { GXInitSpecularDir(&sp30, sp24.x, sp24.y, sp24.z); GXInitLightAttn(&sp30, 0.0f, 0.0f, 1.0f, arg8 / 2, 0.0f, 1.0f - (arg8 / 2)); } diff --git a/src/REL/m406Dll/player.c b/src/REL/m406Dll/player.c new file mode 100644 index 00000000..62e6e5da --- /dev/null +++ b/src/REL/m406Dll/player.c @@ -0,0 +1,2081 @@ +#include "ext_math.h" +#include "game/audio.h" +#include "game/chrman.h" +#include "game/gamework_data.h" +#include "game/hsfdraw.h" +#include "game/hsfload.h" +#include "game/hsfman.h" +#include "game/hsfmotion.h" +#include "game/objsub.h" +#include "game/pad.h" +#include "game/sprite.h" + +#include "REL/m406Dll.h" + +typedef struct UnkM406PlayerStruct { + /* 0x00 */ float unk_00; + /* 0x04 */ float unk_04; +} UnkM406PlayerStruct; /* size = 0x08 */ + +typedef struct UnkM406PlayerStruct2 { + /* 0x00 */ Vec *unk_00; + /* 0x04 */ HsfFace *unk_04; + /* 0x08 */ s16 unk_08; +} UnkM406PlayerStruct2; /* size = 0x084C */ + +typedef struct M406PlayerWork { + /* 0x00 */ union { + struct { + u8 unk_00_field0 : 1; + u8 unk_00_field1 : 1; + u8 unk_00_field2 : 1; + u8 unk_00_field3 : 1; + u8 unk_00_field4 : 1; + u8 unk_00_field5 : 1; + }; + s16 unk_00; + }; + s16 unk_02; + s16 unk_04; + s8 unk_06; + s8 unk_07; + u16 unk_08; + u16 unk_0A; + s16 unk_0C; + s16 unk_0E; + s16 unk_10; + s16 unk_12; + Vec unk_14; + char unk20[0xC]; + Vec unk_2C; + s32 unk_38; + u32 unk_3C; + float unk_40; + UnkM406PlayerStruct2 unk_44; + float unk_50; + float unk_54; + s16 unk_58; + s16 unk_5A; + s16 unk_5C; + s16 unk_5E; + s16 unk_60; + s16 unk_62; + s16 unk_64; + float unk_68; + float unk_6C; + float unk_70; + float unk_74; + float unk_78; + s32 unk_7C[2]; +} M406PlayerWork; /* size = 0x84 */ + +void fn_1_1065C(omObjData *object); +void fn_1_10744(omObjData *object); +void fn_1_11058(omObjData *object); +void fn_1_114A0(omObjData *object); +void fn_1_117BC(float arg8, float arg9, UnkM406PlayerStruct2 *arg0, Vec *arg1); +float fn_1_12194(Vec *arg0); +void fn_1_12270(omObjData *object); +void fn_1_1275C(); +s32 fn_1_127B8(); +s32 fn_1_129E4(omObjData *object); +void fn_1_12AB8(omObjData *object); +void fn_1_12B00(omObjData *object); +void fn_1_12B38(Vec *arg0); +void fn_1_12BC4(omObjData *); +void fn_1_13A88(s16 arg0, char *arg1, Mtx arg2); +float fn_1_13AF4(float arg8, float arg9, float argA); +s32 fn_1_13C10(Vec *arg0, Vec *arg1); +float fn_1_143F4(Vec *arg0, UnkM406PlayerStruct2 *arg1); +void fn_1_D90C(omObjData *object); +void fn_1_DD7C(omObjData *object, s32 arg1, float arg8, u32 arg2); +void fn_1_DE60(omObjData *object); +void fn_1_E214(omObjData *object); +void fn_1_F194(omObjData *object); +void fn_1_F694(omObjData *object); +void fn_1_FA50(ModelData *model, Mtx mtx); + +Vec lbl_1_data_960[70] = { + { -495.876f, 50.005f, -0.0f }, + { -500.023f, -2841.226f, -5007.74f }, + { -502.015f, -7170.411f, -12506.11f }, + { -515.622f, -8314.231f, -14487.27f }, + { -515.6f, -8761.908f, -15262.67f }, + { -508.661f, -9195.703f, -16014.02f }, + { -494.762f, -9629.499f, -16765.38f }, + { -473.947f, -10063.294f, -17516.73f }, + { -471.378f, -10495.727f, -18265.73f }, + { -495.719f, -10915.74f, -18993.21f }, + { -552.519f, -11337.781f, -19724.21f }, + { -621.485f, -11611.703f, -20198.66f }, + { -731.018f, -11887.653f, -20676.62f }, + { -950.131f, -12303.607f, -21397.07f }, + { -1209.766f, -12735.795f, -22145.64f }, + { -1469.474f, -13170.012f, -22897.73f }, + { -1627.69f, -13466.252f, -23410.83f }, + { -1757.595f, -13772.641f, -23941.51f }, + { -1838.731f, -14079.026f, -24472.19f }, + { -1871.186f, -14393.528f, -25016.92f }, + { -1834.734f, -14703.97f, -25554.62f }, + { -1749.541f, -15014.414f, -26092.33f }, + { -1623.78f, -15312.685f, -26608.94f }, + { -1384.433f, -15761.101f, -27385.62f }, + { -1124.798f, -16191.259f, -28130.68f }, + { -775.859f, -16769.535f, -29132.28f }, + { -568.923f, -17183.457f, -29849.22f }, + { -398.537f, -17621.73f, -30608.33f }, + { -187.485f, -18055.945f, -31360.41f }, + { 96.491f, -18634.223f, -32362.02f }, + { 254.886f, -19042.057f, -33068.41f }, + { 315.738f, -19315.977f, -33542.85f }, + { 331.965f, -19581.783f, -34003.24f }, + { 291.397f, -19839.473f, -34449.57f }, + { 189.969f, -20091.07f, -34885.35f }, + { -12.871f, -20340.645f, -35317.62f }, + { -325.245f, -20598.332f, -35763.96f }, + { -747.265f, -20870.219f, -36234.88f }, + { -1230.024f, -21152.258f, -36723.38f }, + { -2276.853f, -21730.535f, -37724.99f }, + { -2759.968f, -22028.799f, -38241.6f }, + { -3189.989f, -22343.3f, -38786.33f }, + { -3514.533f, -22669.979f, -39352.15f }, + { -3620.335f, -22840.408f, -39647.35f }, + { -3693.358f, -23018.965f, -39956.61f }, + { -3705.528f, -23193.463f, -40258.85f }, + { -3693.358f, -23367.96f, -40561.09f }, + { -3551.37f, -23698.695f, -41133.94f }, + { -3307.945f, -24019.275f, -41689.2f }, + { -2995.571f, -24323.633f, -42216.36f }, + { -2646.686f, -24621.904f, -42732.99f }, + { -1920.124f, -25200.174f, -43734.58f }, + { -1457.648f, -25612.07f, -44448.0f }, + { -1238.474f, -25871.78f, -44897.83f }, + { -1084.316f, -26137.584f, -45358.22f }, + { -958.555f, -26417.594f, -45843.21f }, + { -861.049f, -26697.596f, -46328.19f }, + { -783.97f, -26979.635f, -46816.69f }, + { -715.004f, -27261.672f, -47305.2f }, + { -617.584f, -27979.957f, -48549.3f }, + { -548.553f, -28700.271f, -49796.93f }, + { -491.712f, -29278.535f, -50798.51f }, + { -475.485f, -29856.814f, -51800.12f }, + { -479.514f, -30433.059f, -52798.2f }, + { -505.531f, -34619.363f, -60049.28f }, + { -513.632f, -34659.062f, -60100.39f }, + { -509.573f, -34721.215f, -60151.54f }, + { -509.589f, -34805.496f, -60191.15f }, + { -509.587f, -34970.055f, -60233.17f }, + { -509.591f, -45195.266f, -61377.84f }, +}; + +Vec lbl_1_data_CA8[70] = { + { 497.979f, 49.997f, 0.0f }, + { 501.235f, -2841.251f, -5007.79f }, + { 497.983f, -7170.06f, -12505.5f }, + { 479.876f, -8314.231f, -14487.27f }, + { 479.899f, -8761.908f, -15262.67f }, + { 486.837f, -9195.703f, -16014.02f }, + { 500.736f, -9629.499f, -16765.38f }, + { 521.552f, -10063.294f, -17516.73f }, + { 524.121f, -10495.727f, -18265.73f }, + { 503.13f, -10936.027f, -19028.35f }, + { 446.486f, -11379.887f, -19797.14f }, + { 364.665f, -11685.236f, -20326.02f }, + { 245.082f, -11987.438f, -20849.45f }, + { 18.48f, -12434.451f, -21623.7f }, + { -252.156f, -12875.162f, -22387.03f }, + { -497.617f, -13300.134f, -23123.1f }, + { -655.129f, -13580.305f, -23608.37f }, + { -768.419f, -13847.879f, -24071.83f }, + { -843.945f, -14131.193f, -24562.54f }, + { -875.687f, -14393.528f, -25016.92f }, + { -850.353f, -14653.739f, -25467.62f }, + { -768.533f, -14927.61f, -25941.98f }, + { -642.655f, -15201.48f, -26416.33f }, + { -428.664f, -15620.156f, -27141.5f }, + { -170.569f, -16051.424f, -27888.48f }, + { 188.182f, -16636.941f, -28902.62f }, + { 408.467f, -17083.947f, -29676.86f }, + { 572.186f, -17512.059f, -30418.37f }, + { 786.178f, -17940.18f, -31159.9f }, + { 1075.696f, -18525.695f, -32174.04f }, + { 1245.631f, -18972.703f, -32948.28f }, + { 1315.06f, -19274.898f, -33471.7f }, + { 1327.648f, -19592.842f, -34022.39f }, + { 1283.591f, -19907.637f, -34567.64f }, + { 1157.714f, -20235.021f, -35134.68f }, + { 887.077f, -20562.406f, -35701.73f }, + { 496.857f, -20883.496f, -36257.87f }, + { 31.029f, -21188.842f, -36786.75f }, + { -491.693f, -21487.889f, -37304.71f }, + { -1517.594f, -22057.664f, -38291.59f }, + { -1958.808f, -22331.527f, -38765.94f }, + { -2323.853f, -22595.953f, -39223.93f }, + { -2588.195f, -22850.938f, -39665.58f }, + { -2651.134f, -22964.264f, -39861.87f }, + { -2695.42f, -23074.441f, -40052.7f }, + { -2714.302f, -23187.768f, -40248.99f }, + { -2689.126f, -23316.832f, -40472.53f }, + { -2594.718f, -23552.928f, -40881.46f }, + { -2393.337f, -23814.195f, -41334.0f }, + { -2116.406f, -24081.771f, -41797.45f }, + { -1782.831f, -24371.38f, -42299.07f }, + { -1059.036f, -24941.158f, -43285.95f }, + { -561.404f, -25391.299f, -44065.62f }, + { -290.767f, -25709.24f, -44616.31f }, + { -108.245f, -26024.033f, -45161.55f }, + { 23.926f, -26323.088f, -45679.52f }, + { 130.922f, -26625.29f, -46202.95f }, + { 212.947f, -26918.023f, -46709.98f }, + { 275.886f, -27213.93f, -47222.51f }, + { 376.588f, -27941.104f, -48482.01f }, + { 452.187f, -28658.824f, -49725.14f }, + { 508.832f, -29241.193f, -50733.83f }, + { 521.5f, -29814.105f, -51726.14f }, + { 515.985f, -30433.059f, -52798.2f }, + { 503.81f, -34617.785f, -60046.38f }, + { 495.709f, -34657.49f, -60097.48f }, + { 499.768f, -34719.64f, -60148.64f }, + { 499.752f, -34803.92f, -60188.25f }, + { 499.754f, -34968.48f, -60230.3f }, + { 499.75f, -45193.69f, -61374.92f }, +}; + +float lbl_1_data_FF0[4] = { -300.0f, -100.0f, 100.0f, 300.0f }; + +char *lbl_1_data_1068[4] = { + "test11_tex_we-itemhook-l", + "test11_tex_we-itemhook-r", + "test11_tex_we-itemhook-fl", + "test11_tex_we-itemhook-fr", +}; + +s32 lbl_1_data_1078[10] = { + 0x5F0037, + 0x5F0055, + 0x5F0039, + 0x5F0054, + 0x5F0041, + 0x5F0056, + 0x5F0050, + 0x5F0016, + 0x5F0053, + 0x5F0023, +}; + +s32 lbl_1_data_10A0[8][4] = { + { 0x250000, 0x250001, 0x250010, 0x250011 }, + { 0x250002, 0x250003, 0x250012, 0x250013 }, + { 0x250004, 0x250005, 0x250014, 0x250015 }, + { 0x250006, 0x250007, 0x250016, 0x250017 }, + { 0x250008, 0x250009, 0x250018, 0x250019 }, + { 0x25000A, 0x25000B, 0x25001A, 0x25001B }, + { 0x25000C, 0x25000D, 0x25001C, 0x25001D }, + { 0x25000E, 0x25000F, 0x25001E, 0x25001F }, +}; + +s32 lbl_1_data_1120[8] = { + 0x250045, + 0x250046, + 0x250047, + 0x250048, + 0x250049, + 0x25004A, + 0x25004B, + 0x25004C, +}; + +s16 lbl_1_data_1140[4] = { 0, 40, 20, 90 }; + +omObjData *lbl_1_bss_1F8; +s16 lbl_1_bss_1F6; +s16 lbl_1_bss_1F4; +s16 lbl_1_bss_1E8[6]; +s16 lbl_1_bss_1DC[6]; +s16 lbl_1_bss_1D0[6]; +s32 lbl_1_bss_1CC; +Process *lbl_1_bss_1C8; +s32 lbl_1_bss_1C4; +Vec lbl_1_bss_104[16]; +float lbl_1_bss_100; +s32 lbl_1_bss_F8[2]; +Vec lbl_1_bss_E0[2]; +s32 lbl_1_bss_DC; +s32 lbl_1_bss_D8; + +void fn_1_D65C(Process *arg0) +{ + HsfMaterial *var_r31; + s32 var_r30; + s32 var_r29; + HsfData *var_r28; + omObjData **var_r26; + ModelData *var_r25; + s16 var_r24; + + lbl_1_bss_1CC = -1; + lbl_1_bss_1F6 = lbl_1_bss_1F4 = 0; + lbl_1_bss_1C8 = arg0; + omMakeGroupEx(arg0, 0, 4); + for (var_r30 = 0; var_r30 < 4; var_r30++) { + omAddObjEx(arg0, 0x40, 0xA, 0x32, 0, fn_1_D90C); + } + var_r24 = Hu3DHookFuncCreate(fn_1_FA50); + Hu3DModelLayerSet(var_r24, 7); + lbl_1_bss_1F8 = omAddObjEx(arg0, 0x45, 0, 0, -1, fn_1_12B00); + var_r26 = omGetGroupMemberListEx(HuPrcCurrentGet(), 2); + for (var_r30 = 0; var_r30 < 6; var_r30++) { + lbl_1_bss_1E8[var_r30] = lbl_1_bss_1DC[var_r30] = lbl_1_bss_1D0[var_r30] = -1; + var_r25 = &Hu3DData[(*var_r26)->model[var_r30]]; + var_r28 = var_r25->hsfData; + for (var_r29 = 0; var_r29 < var_r28->materialCnt; var_r29++) { + var_r31 = &var_r28->material[var_r29]; + if (var_r31->color[0] == 0xFF && var_r31->color[1] == 0 && var_r31->color[2] == 0) { + lbl_1_bss_1E8[var_r30] = var_r29; + } + if (var_r31->color[0] == 0 && var_r31->color[1] == 0xFF && var_r31->color[2] == 0) { + lbl_1_bss_1D0[var_r30] = var_r29; + } + if (var_r31->color[0] == 0 && var_r31->color[1] == 0 && var_r31->color[2] == 0xFF) { + lbl_1_bss_1DC[var_r30] = var_r29; + } + } + } +} + +void fn_1_D8B0(void) +{ + s32 var_r31; + omObjData **var_r30; + + var_r30 = omGetGroupMemberListEx(HuPrcCurrentGet(), 0); + for (var_r31 = 0; var_r31 < 4; var_r31++) { + fn_1_12AB8(var_r30[var_r31]); + } +} + +void fn_1_D90C(omObjData *object) +{ + Mtx sp8; + + M406PlayerWork *var_r31; + s32 var_r29; + s32 var_r28; + + object->data = var_r31 = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(M406PlayerWork), MEMORY_DEFAULT_NUM); + memset(var_r31, 0, sizeof(M406PlayerWork)); + var_r31->unk_02 = lbl_1_bss_1F6++; + var_r31->unk_00_field0 = 0; + var_r31->unk_00_field1 = 1; + var_r31->unk_04 = GWPlayerCfg[var_r31->unk_02].pad_idx; + var_r28 = var_r31->unk_0C = GWPlayerCfg[var_r31->unk_02].character; + var_r31->unk_0E = GWPlayerCfg[var_r31->unk_02].diff; + var_r31->unk_10 = GWPlayerCfg[var_r31->unk_02].group; + object->model[0] = CharModelCreate(var_r28, 8); + for (var_r29 = 0; var_r29 < 4; var_r29++) { + object->model[var_r29 + 1] = Hu3DModelCreateFile(lbl_1_data_10A0[var_r28][var_r29]); + Hu3DModelHookSet(object->model[0], lbl_1_data_1068[var_r29], object->model[var_r29 + 1]); + } + Hu3DModelShadowSet(object->model[0]); + CharModelLayerSetAll(Hu3DData[object->model[0]].layer + 1); + object->model[5] = Hu3DModelCreateFile(DATA_MAKE_NUM(DATADIR_M406, 32)); + Hu3DModelHookSet(object->model[0], "test11_tex_we-itemhook-body", object->model[5]); + Hu3DModelAttrSet(object->model[5], 1); + fn_1_13A88(object->model[0], "test11_tex_we-itemhook-body", sp8); + var_r31->unk_68 = sp8[0][3]; + var_r31->unk_6C = sp8[1][3]; + var_r31->unk_70 = sp8[2][3]; + object->model[6] = Hu3DModelCreateFile(DATA_MAKE_NUM(DATADIR_M406, 33)); + Hu3DModelAttrSet(object->model[6], 1); + object->model[7] = Hu3DModelCreateFile(lbl_1_data_1120[var_r31->unk_0C]); + Hu3DModelAttrSet(object->model[7], 1); + for (var_r29 = 0; (u32)var_r29 < 10; var_r29++) { + object->motion[var_r29] = CharModelMotionCreate(var_r31->unk_0C, lbl_1_data_1078[var_r29]); + } + var_r31->unk_38 = -1; + var_r31->unk_58 = 0; + var_r31->unk_14.y = 0.0f; + var_r31->unk_14.z = 45.0f; + fn_1_DD7C(object, 0, 1.0f, 0x40000001); + object->trans.x = lbl_1_data_FF0[var_r31->unk_02]; + object->trans.z = -500.0f; + object->trans.y = fn_1_143F4(&object->trans, &var_r31->unk_44); + fn_1_117BC(var_r31->unk_14.x, 50.0f, &var_r31->unk_44, &var_r31->unk_2C); + object->rot.x = 30.0f; + object->rot.y = 180.0f; + object->work[3] = lbl_1_data_1140[var_r31->unk_02]; + CharModelDataClose(var_r31->unk_0C); + var_r31->unk_7C[0] = var_r31->unk_7C[1] = -1; + var_r31->unk_78 = 600.0f * ((frand() & 0x1FF) - 256.0f) / 256.0f; + object->func = fn_1_DE60; +} + +Vec lbl_1_data_1164[12] = { + { -100.0f, 0.0f, -1000.0f }, + { -200.0f, 0.0f, -2000.0f }, + { -100.0f, 0.0f, -3000.0f }, + { -50.0f, 0.0f, -1000.0f }, + { 100.0f, 0.0f, -1500.0f }, + { 0.0f, 0.0f, -3000.0f }, + { 100.0f, 0.0f, -1000.0f }, + { -100.0f, 0.0f, -2000.0f }, + { 200.0f, 0.0f, -3000.0f }, + { 200.0f, 0.0f, -1000.0f }, + { 300.0f, 0.0f, -1500.0f }, + { -100.0f, 0.0f, -3000.0f }, +}; + +s32 lbl_1_data_11F4 = 0xC0; + +UnkM406PlayerStruct lbl_1_data_11F8[4] = { + { -300.0f, -600.0f }, + { -100.0f, -400.0f }, + { 100.0f, -300.0f }, + { 450.0f, -900.0f }, +}; + +UnkM406PlayerStruct lbl_1_data_1218[3] = { + { -320.0f, -700.0f }, + { 250.0f, -1000.0f }, + { 380.0f, -500.0f }, +}; + +void fn_1_DD7C(omObjData *object, s32 arg1, float arg8, u32 arg2) +{ + ModelData *spC; + M406PlayerWork *var_r31; + + var_r31 = object->data; + spC = &Hu3DData[object->model[0]]; + if (arg1 != var_r31->unk_38) { + CharModelMotionShiftSet(var_r31->unk_0C, object->motion[arg1], 0.0f, 10.0f, arg2); + var_r31->unk_40 = -1.0f; + var_r31->unk_38 = arg1; + var_r31->unk_3C = arg2; + } + if (arg8 != var_r31->unk_40) { + CharModelMotionSpeedSet(var_r31->unk_0C, 1.0f); + } +} + +void fn_1_DE60(omObjData *object) +{ + float sp8; + + float var_f31; + float var_f30; + float var_f29; + float var_f28; + float var_f27; + float var_f26; + + M406PlayerWork *var_r30; + Vec *var_r29; + + var_r30 = object->data; + if (var_r30->unk_00_field4 == 0) { + if (fn_1_122C() <= 1 && var_r30->unk_7C[0] < 0) { + var_r30->unk_7C[0] = HuAudFXEmiterPlay(0x53A, &object->trans); + } + if (object->work[3] != 0) { + object->work[3] -= 1; + return; + } + var_r29 = &lbl_1_data_1164[object->work[0] + (var_r30->unk_02 * 3)]; + var_f31 = var_r29->x - object->trans.x; + var_f30 = var_r29->z - object->trans.z; + var_f27 = atan2d(-var_f31, -var_f30); + var_r30->unk_14.x += 0.1f * (var_f27 - var_r30->unk_14.x); + var_f26 = sqrtf((var_f31 * var_f31) + (var_f30 * var_f30)); + if (var_f26 < 100.0f) { + object->work[0]++; + if (object->work[0] > 2) { + var_r30->unk_00_field4 = 1; + var_r30->unk_14.x = 0.0f; + object->trans.x = lbl_1_data_FF0[var_r30->unk_02]; + object->trans.z = -3000.0f; + object->trans.y = fn_1_143F4(&object->trans, &var_r30->unk_44); + fn_1_117BC(var_r30->unk_14.x, 50.0f, &var_r30->unk_44, &var_r30->unk_2C); + object->func = fn_1_E214; + } + } + fn_1_F694(object); + object->trans.x += var_r30->unk_2C.x; + object->trans.y += var_r30->unk_2C.y; + object->trans.z += var_r30->unk_2C.z; + object->trans.y = fn_1_143F4(&object->trans, &var_r30->unk_44); + object->rot.x = 30.0f; + object->rot.y = 180.0f + var_r30->unk_14.x; + HuAudFXEmiterUpDate(var_r30->unk_7C[0], &object->trans); + } +} + +void fn_1_E214(omObjData *object) +{ + Mtx sp94; + Mtx sp64; + Mtx sp34; + Vec sp28; + Vec sp1C; + + float var_f31; + float var_f30; + float var_f29; + double var_f28; + + M406PlayerWork *var_r31; + u16 var_r27; + ModelData *var_r26; + u16 var_r25; + s32 var_r24; + s16 var_r23; + s16 var_r22; + + var_r31 = object->data; + var_r27 = 0xFFFF; + var_r25 = 0; + var_r26 = &Hu3DData[object->model[0]]; + + if (fn_1_122C() >= 2) { + if (var_r31->unk_00_field0 != 0) { + fn_1_DD7C(object, 9, 1.0f, 0); + if ((var_r26->attr & 1) == 0) { + Hu3D3Dto2D(&object->trans, 1, &sp28); + if (sp28.x < 0.0 || sp28.x >= 576.0f || sp28.y < 0.0 || sp28.y >= 480.0f) { + Hu3DModelAttrSet(object->model[0], 1); + } + } + return; + } + if (fn_1_122C() != 4) { + var_r31->unk_08 = var_r31->unk_0A = 0; + var_r31->unk_06 = var_r31->unk_07 = 0; + } + else if (!GWPlayerCfg[var_r31->unk_02].iscom) { + var_r31->unk_06 = HuPadStkX[var_r31->unk_04]; + var_r31->unk_07 = HuPadStkY[var_r31->unk_04]; + var_r31->unk_08 = HuPadBtn[var_r31->unk_04]; + var_r31->unk_0A = HuPadBtnDown[var_r31->unk_04]; + } + else { + var_r31->unk_08 = var_r31->unk_0A = 0; + var_r31->unk_06 = var_r31->unk_07 = 0; + fn_1_12270(object); + } + switch (var_r31->unk_12) { + case 0: + var_r23 = (var_r31->unk_06 * cosd(CRot.y)) - var_r31->unk_07 * sind(CRot.y); + var_r22 = (var_r31->unk_06 * sind(CRot.y)) + var_r31->unk_07 * cosd(CRot.y); + if (((var_r23 * var_r23) + (var_r22 * var_r22)) > 16.0f) { + var_f29 = 180.0 + (atan2d(var_r23, -var_r22)); + var_r31->unk_14.x = fn_1_13AF4(var_r31->unk_14.x, var_f29, 0.05f); + if (var_r31->unk_14.x >= 180.0f) { + var_r31->unk_14.x -= 360.0f; + } + if (var_r31->unk_14.x < -60.0f) { + var_r31->unk_14.x = -60.0f; + } + else if (var_r31->unk_14.x > 60.0f) { + var_r31->unk_14.x = 60.0f; + } + } + var_r27 = 0; + var_f31 = 1.0f; + var_r25 = 1; + if (var_r31->unk_00_field2 == 0 && var_r31->unk_58 == 0 && var_r31->unk_0A & 0x100) { + var_r31->unk_58 = 0x1E; + var_r31->unk_38 = -1; + var_r31->unk_62 = 0; + } + if (var_r31->unk_58 != 0) { + var_r27 = 1; + var_f31 = 1.0f; + var_r25 = 0; + var_r31->unk_58--; + if (var_r31->unk_58 == 5) { + HuAudFXPlay(0x540); + fn_1_117BC(var_r31->unk_14.x, 10.0f, &var_r31->unk_44, &sp1C); + PSVECAdd(&var_r31->unk_2C, &sp1C, &var_r31->unk_2C); + } + } + if (var_r31->unk_00_field2 == 0) { + if (var_r31->unk_44.unk_08 == 1) { + var_r31->unk_00_field2 = 1; + var_r31->unk_60 = 0x14; + PSVECScale(&var_r31->unk_2C, &var_r31->unk_2C, 1.5f); + if (PSVECMag(&var_r31->unk_2C) > 50.0f) { + PSVECNormalize(&var_r31->unk_2C, &var_r31->unk_2C); + PSVECScale(&var_r31->unk_2C, &var_r31->unk_2C, 50.0f); + } + HuAudFXPlay(0x53E); + HuAudFXVolSet(var_r31->unk_7C[0], 0); + HuAudCharVoicePlay(var_r31->unk_0C, 0x125); + } + if (fn_1_122C() == 4) { + var_r31->unk_62++; + if (var_r31->unk_62 > 240.0f) { + var_r31->unk_62 = 240; + } + } + } + else { + var_r27 = 4; + var_f31 = 2.0f; + var_r25 = 0; + if (var_r31->unk_60 == 0 && var_r31->unk_00_field1 != 0) { + var_r31->unk_00_field2 = 0; + HuAudFXPlay(0x53D); + HuAudFXVolSet(var_r31->unk_7C[0], 127); + } + if (var_r31->unk_60 != 0) { + var_r31->unk_60--; + } + } + if (fn_1_129E4(object) != 0) { + var_r31->unk_00_field3 = 1; + var_r31->unk_12 = 1; + var_r31->unk_5A = 10; + var_r31->unk_54 = 1.0f; + var_r31->unk_78 = 0.0f; + var_r31->unk_62 = 0; + fn_1_117BC(var_r31->unk_14.x, 50.0f, &var_r31->unk_44, &var_r31->unk_2C); + omVibrate(var_r31->unk_02, 12, 6, 6); + var_r31->unk_7C[1] = HuAudFXPlay(0x53C); + } + break; + case 1: + var_r27 = 6; + var_f31 = 1.0f; + var_r25 = 0; + if (--var_r31->unk_5A == 0) { + var_r31->unk_12 = 2; + var_r31->unk_5A = 60; + } + break; + case 2: + Hu3DModelAttrReset(object->model[5], 1); + if (var_r31->unk_5A < 20) { + var_r31->unk_54 = var_r31->unk_5A / 20.0f; + } + else { + var_r31->unk_54 = 1.0f; + } + var_f30 = (0x3C - var_r31->unk_5A) / 10.0f; + if (var_f30 > 1.0f) { + var_f30 = 1.0f; + } + Hu3DModelScaleSet(object->model[5], var_f30, var_f30, var_f30); + var_r31->unk_50 += PSVECMag(&var_r31->unk_2C) / 3.125f; + PSMTXTrans(sp94, -var_r31->unk_68, -var_r31->unk_6C, -var_r31->unk_70); + PSMTXRotRad(sp64, 0x78, 0.017453292f * var_r31->unk_50); + PSMTXConcat(sp64, sp94, sp34); + PSMTXTrans(sp94, var_r31->unk_68, var_r31->unk_6C, var_r31->unk_70); + PSMTXConcat(sp94, sp34, var_r26->unk_F0); + var_r27 = 6; + var_f31 = 2.0f; + var_r25 = 0; + if (--var_r31->unk_5A == 0) { + var_r31->unk_12 = 3; + if (var_r31->unk_7C[1] >= 0) { + HuAudFXStop(var_r31->unk_7C[1]); + var_r31->unk_7C[1] = -1; + } + } + break; + case 3: + if (var_r31->unk_5E == 0 && var_r31->unk_0A & 0x100) { + var_r31->unk_5E = 8; + } + if (var_r31->unk_00_field1) { + var_r31->unk_2C.x = var_r31->unk_2C.y = var_r31->unk_2C.z = 0.0f; + } + var_r31->unk_50 = fn_1_13AF4(var_r31->unk_50, 0.0f, 0.5f); + PSMTXTrans(sp94, -var_r31->unk_68, -var_r31->unk_6C, -var_r31->unk_70); + PSMTXRotRad(sp64, 0x78, 0.017453292f * var_r31->unk_50); + PSMTXConcat(sp64, sp94, sp34); + PSMTXTrans(sp94, var_r31->unk_68, var_r31->unk_6C, var_r31->unk_70); + PSMTXConcat(sp94, sp34, var_r26->unk_F0); + if (var_r31->unk_5E != 0) { + PSMTXTrans(sp94, 100.0f * (0.2f * (((var_r31->unk_5E & 1) * 2) - 1)), 0.0f, 0.0f); + PSMTXConcat(sp94, var_r26->unk_F0, var_r26->unk_F0); + if (--var_r31->unk_5E == 0) { + if (++var_r31->unk_5C >= 4) { + var_r31->unk_00_field3 = 0; + var_r31->unk_12 = 0; + var_r31->unk_5C = 0; + Hu3DModelAttrSet(object->model[5], 1); + Hu3DData[object->model[6]].unk_64 = 0.0f; + Hu3DModelPosSet(object->model[6], object->trans.x + var_r31->unk_68, object->trans.y + var_r31->unk_6C, + object->trans.z + var_r31->unk_70); + Hu3DModelAttrReset(object->model[6], 1); + PSMTXIdentity(var_r26->unk_F0); + fn_1_117BC(var_r31->unk_14.x, 25.0f, &var_r31->unk_44, &var_r31->unk_2C); + } + } + } + var_r27 = 7; + var_f31 = 1.0f; + var_r25 = 1; + break; + } + if (Hu3DMotionEndCheck(object->model[6])) { + Hu3DModelAttrSet(object->model[6], 1); + } + fn_1_DD7C(object, var_r27, var_f31, var_r25); + fn_1_F194(object); + if (object->trans.z + var_r31->unk_2C.z < -60000.0f) { + lbl_1_bss_1CC = var_r31->unk_02; + return; + } + sp28.x = object->trans.x; + sp28.y = object->trans.y; + sp28.z = object->trans.z; + if (fn_1_6A44(sp28) == 1) { + var_r31->unk_00_field0 = 1; + var_r26 = &Hu3DData[object->model[0]]; + PSMTXIdentity(var_r26->unk_F0); + omVibrate(var_r31->unk_02, 0xC, 4, 2); + HuAudCharVoicePlayPos(var_r31->unk_0C, 0x123, &object->trans); + for (var_r24 = 0; var_r24 < 2; var_r24++) { + if (var_r31->unk_7C[var_r24] >= 0) { + HuAudFXStop(var_r31->unk_7C[var_r24]); + var_r31->unk_7C[var_r24] = -1; + } + } + } + object->rot.y = 180.0f + var_r31->unk_14.x; + } +} + +void fn_1_F194(omObjData *object) +{ + Mtx sp80; + Mtx sp50; + Vec sp44; + Vec sp38; + Vec sp2C; + Vec sp20; + Vec sp14; + Vec sp8; + + float var_f31; + float var_f30; + float var_f29; + float var_f28; + float var_f27; + + M406PlayerWork *var_r31; + ModelData *var_r30; + + var_r31 = object->data; + var_r30 = &Hu3DData[object->model[0]]; + if (var_r31->unk_00_field1 && var_r31->unk_44.unk_00 != NULL) { + var_f27 = !var_r31->unk_00_field3 ? 0.7f : 3.5f; + sp44.x = 0.0f; + sp44.y = -0.27222222f; + sp44.z = 0.0f; + var_f28 = 0.27222222f * var_r31->unk_44.unk_00[3].y; + PSVECScale(&var_r31->unk_44.unk_00[3], &sp38, var_f28); + PSVECAdd(&sp44, &sp38, &sp2C); + PSVECAdd(&var_r31->unk_2C, &sp2C, &var_r31->unk_2C); + sp20.x = sp20.y = sp20.z = 0.0f; + sp14.x = sp14.y = sp14.z = 0.0f; + var_f29 = PSVECMag(&var_r31->unk_2C); + if (var_f29 > 0.0f && fn_1_122C() == 4) { + PSVECNormalize(&var_r31->unk_2C, &sp8); + sp20.x = -sp8.x; + sp20.y = -sp8.y; + sp20.z = -sp8.z; + if (var_r31->unk_62 < 120.0f) { + PSVECScale(&sp20, &sp20, var_f28 * var_f27); + } + else { + PSVECScale(&sp20, &sp20, (0.15f * (var_r31->unk_62 / 240.0f)) + (var_f28 * var_f27)); + } + if (!var_r31->unk_00_field3) { + fn_1_117BC(var_r31->unk_14.x, 1.0f, &var_r31->unk_44, &sp44); + var_f30 = PSVECDotProduct(&sp44, &sp8); + var_f31 = 0.02f * var_f29; + sp14.x = (-sp8.x * var_f31) - (var_f30 * (-sp44.x * var_f31)); + sp14.y = (-sp8.y * var_f31) - (var_f30 * (-sp44.y * var_f31)); + sp14.z = (-sp8.z * var_f31) - (var_f30 * (-sp44.z * var_f31)); + if ((var_f30 < 0.9f) && (var_f29 >= 20.0f)) { + mtxRot(sp80, var_r30->rot.x, var_r30->rot.y, var_r30->rot.z); + mtxTransCat(sp80, var_r30->pos.x, var_r30->pos.y, var_r30->pos.z); + PSVECCrossProduct(&sp44, &sp8, &sp44); + if (sp44.y >= 0.0f) { + PSMTXTrans(sp50, -10.0f, 0.0f, 0.0f); + PSMTXConcat(sp50, sp80, sp80); + fn_1_94C0(sp80, 10, 0); + } + else { + PSMTXTrans(sp50, 10.0f, 0.0f, 0.0f); + PSMTXConcat(sp50, sp80, sp80); + fn_1_94C0(sp80, 10, 1); + } + } + } + } + PSVECAdd(&sp20, &sp14, &sp2C); + if (PSVECMag(&sp2C) > var_f29) { + var_r31->unk_2C.x = var_r31->unk_2C.y = var_r31->unk_2C.z = 0.0f; + return; + } + PSVECAdd(&var_r31->unk_2C, &sp2C, &var_r31->unk_2C); + return; + } + var_r31->unk_2C.y += -0.27222222f; +} + +void fn_1_F694(omObjData *object) +{ + Mtx sp68; + Mtx sp38; + Vec sp2C; + Vec sp20; + Vec sp14; + Vec sp8; + + float var_f31; + float var_f30; + float var_f29; + float var_f28; + + M406PlayerWork *var_r31; + ModelData *var_r30; + + var_r31 = object->data; + var_r30 = &Hu3DData[object->model[0]]; + var_r31->unk_2C.y += -1.0f; + if (var_r31->unk_00_field1 && var_r31->unk_44.unk_00 != NULL) { + sp2C.x = var_r31->unk_2C.x; + sp2C.y = var_r31->unk_2C.y; + sp2C.z = var_r31->unk_2C.z; + + var_f30 = -((var_r31->unk_44.unk_00[3].z * sp2C.z) + ((var_r31->unk_44.unk_00[3].x * sp2C.x) + (var_r31->unk_44.unk_00[3].y * sp2C.y))); + + sp2C.x += var_f30 * var_r31->unk_44.unk_00[3].x; + sp2C.y += var_f30 * var_r31->unk_44.unk_00[3].y; + sp2C.z += var_f30 * var_r31->unk_44.unk_00[3].z; + if (!var_r31->unk_00_field3) { + fn_1_117BC(var_r31->unk_14.x, 1.0f, &var_r31->unk_44, &sp20); + PSVECNormalize(&sp2C, &sp14); + var_f29 = PSVECDotProduct(&sp20, &sp14); + var_f31 = var_f29 * var_f29; + var_f31 *= var_f31; + if (var_f31 < 0.999f && PSVECMag(&var_r31->unk_2C) >= 10.0f) { + mtxRot(sp68, var_r30->rot.x, var_r30->rot.y, var_r30->rot.z); + mtxTransCat(sp68, var_r30->pos.x, var_r30->pos.y, var_r30->pos.z); + PSVECCrossProduct(&sp20, &sp14, &sp8); + if (sp8.y >= 0.0f) { + PSMTXTrans(sp38, -10.0f, 0.0f, 0.0f); + PSMTXConcat(sp38, sp68, sp68); + fn_1_94C0(sp68, 10, 0); + } + else { + PSMTXTrans(sp38, 10.0f, 0.0f, 0.0f); + PSMTXConcat(sp38, sp68, sp68); + fn_1_94C0(sp68, 10, 1); + } + } + var_f28 = PSVECMag(&sp2C); + PSVECScale(&sp20, &sp20, var_f28); + var_r31->unk_2C.x = sp2C.x + (0.9f * (sp20.x - sp2C.x)); + var_r31->unk_2C.y = sp2C.y + (0.9f * (sp20.y - sp2C.y)); + var_r31->unk_2C.z = sp2C.z + (0.9f * (sp20.z - sp2C.z)); + } + else { + var_r31->unk_2C.x = sp2C.x; + var_r31->unk_2C.y = sp2C.y; + var_r31->unk_2C.z = sp2C.z; + PSVECScale(&var_r31->unk_2C, &var_r31->unk_2C, var_r31->unk_54); + } + PSVECScale(&var_r31->unk_2C, &var_r31->unk_2C, 0.98f); + } +} + +void fn_1_FA50(ModelData *model, Mtx mtx) +{ + omObjData *sp2C[4]; + Vec sp20; + Vec sp14; + Vec sp8; + + float var_f31; + float var_f30; + float var_f29; + float var_f28; + float var_f27; + float var_f26; + float var_f25; + + M406PlayerWork *var_r31; + omObjData *var_r30; + s32 var_r29; + omObjData **var_r28; + s32 var_r27; + s32 var_r26; + s32 var_r25; + omObjData *var_r24; + omObjData *var_r23; + M406PlayerWork *var_r22; + M406PlayerWork *var_r21; + + if (omPauseChk() == 0) { + var_r28 = omGetGroupMemberListEx(lbl_1_bss_1C8, 0); + switch (lbl_1_bss_D8) { + case 0: + if (--lbl_1_data_11F4 == 0) { + fn_1_123C(); + lbl_1_bss_D8++; + lbl_1_bss_F8[0] = lbl_1_bss_F8[1] = 0; + } + if ((lbl_1_data_11F4 % 6) == 0) { + for (var_r29 = 0; var_r29 < 4; var_r29++) { + var_r31 = var_r28[var_r29]->data; + omVibrate(var_r31->unk_02, 6, 2, 4); + } + return; + } + break; + case 1: + if (lbl_1_bss_1CC >= 0) { + fn_1_1274(lbl_1_bss_1CC); + for (var_r29 = 0; var_r29 < 4; var_r29++) { + var_r30 = var_r28[var_r29]; + var_r31 = var_r30->data; + if (var_r29 == lbl_1_bss_1CC) { + var_r30->func = fn_1_1065C; + } + else { + var_r30->func = fn_1_11058; + } + Hu3DModelAttrSet(*var_r30->model, 1); + for (var_r26 = 0; var_r26 < 2; var_r26++) { + if (var_r31->unk_7C[var_r26] >= 0) { + HuAudFXStop(var_r31->unk_7C[var_r26]); + var_r31->unk_7C[var_r26] = -1; + } + } + } + lbl_1_bss_D8++; + return; + } + for (var_r29 = 0; var_r29 < 4; var_r29++) { + var_r31 = var_r28[var_r29]->data; + if (!var_r31->unk_00_field0) { + break; + } + } + if (var_r29 >= 4) { + fn_1_1274(0x63); + for (var_r29 = 0; var_r29 < 4; var_r29++) { + var_r28[var_r29]->func = fn_1_11058; + } + lbl_1_bss_D8++; + return; + } + fn_1_1275C(); + for (var_r29 = 0; var_r29 < 4; var_r29++) { + var_r30 = var_r28[var_r29]; + var_r31 = var_r28[var_r29]->data; + if (!var_r31->unk_00_field0) { + var_r31->unk_14.y = PSVECMag(&var_r31->unk_2C); + if (!var_r31->unk_00_field3 && !var_r31->unk_00_field2 && (var_r31->unk_14.y > var_r31->unk_14.z)) { + var_r31->unk_14.y = var_r31->unk_14.z; + PSVECNormalize(&var_r31->unk_2C, &var_r31->unk_2C); + PSVECScale(&var_r31->unk_2C, &var_r31->unk_2C, var_r31->unk_14.y); + } + var_f31 = var_r31->unk_14.y; + PSVECNormalize(&var_r31->unk_2C, &sp14); + + while (var_f31 > 0.0f) { + if (var_f31 < 50.0f) { + var_r30->trans.x += sp14.x * var_f31; + var_r30->trans.y += sp14.y * var_f31; + var_r30->trans.z += sp14.z * var_f31; + } + else { + var_r30->trans.x += 50.0f * sp14.x; + var_r30->trans.y += 50.0f * sp14.y; + var_r30->trans.z += 50.0f * sp14.z; + } + sp8.x = var_r30->trans.x; + sp8.y = 10.0f + var_r30->trans.y; + sp8.z = var_r30->trans.z; + if (fn_1_13C10(&sp8, &sp20)) { + var_r30->trans.x = sp8.x; + var_r30->trans.z = sp8.z; + if (var_r31->unk_00_field2 == 0) { + PSVECNormalize(&var_r31->unk_2C, &sp14); + var_f26 = PSVECDotProduct(&sp14, &sp20); + if (var_f26 < -0.2f && var_r31->unk_14.y >= 10.0f) { + omVibrate(var_r31->unk_02, 12, 6, 6); + } + if (var_f26 < 0.0f) { + var_f28 + = 0.8f * (((-var_r31->unk_2C.x * sp20.x) - (var_r31->unk_2C.y * sp20.y)) - (var_r31->unk_2C.z * sp20.z)); + var_r31->unk_2C.x += (2.0f * sp20.x * var_f28); + var_r31->unk_2C.y += (2.0f * sp20.y * var_f28); + var_r31->unk_2C.z += (2.0f * sp20.z * var_f28); + } + } + } + var_f31 -= 50.0f; + } + var_f25 = fn_1_143F4(&var_r30->trans, &var_r31->unk_44); + if (var_r31->unk_44.unk_00 != NULL && var_r30->trans.y < (0.01f + var_f25)) { + var_r30->trans.y = var_f25; + var_r31->unk_00_field1 = 1; + } + else { + var_r31->unk_00_field1 = 0; + } + fn_1_12B38(&var_r30->trans); + if (var_r31->unk_7C[0] >= 0) { + HuAudFXEmiterUpDate(var_r31->unk_7C[0], &var_r30->trans); + } + } + } + for (var_r29 = 0; var_r29 < 4; var_r29++) { + sp2C[var_r29] = NULL; + } + for (var_r27 = 0, var_r29 = 0; var_r29 < 4; var_r29++) { + var_r24 = var_r28[var_r29]; + var_r22 = var_r24->data; + if (!var_r22->unk_00_field0) { + for (var_r25 = 0, var_r26 = 0; var_r26 < 4; var_r26++) { + var_r23 = var_r28[var_r26]; + var_r21 = var_r23->data; + if (var_r24 != var_r23 && (!var_r21->unk_00_field0 && var_r24->trans.z > var_r23->trans.z)) { + var_r25++; + } + } + while (sp2C[var_r25] != NULL) { + var_r25++; + } + sp2C[var_r25] = var_r24; + var_r27++; + } + } + if (var_r27 != 0) { + var_f29 = fn_1_12194(&sp2C[0]->trans) - 1500.0f; + if (var_f29 >= 0.0f) { + fn_1_696C(30.000002f + (0.005f * var_f29)); + } + else { + fn_1_696C(30.000002f); + } + lbl_1_bss_E0[0].x = sp2C[0]->trans.x; + lbl_1_bss_E0[0].y = sp2C[0]->trans.y; + lbl_1_bss_E0[0].z = sp2C[0]->trans.z - 1000.0f; + fn_1_12B38(&lbl_1_bss_E0[0]); + if (lbl_1_bss_F8[1] == 0) { + lbl_1_bss_E0[1].x = sp2C[var_r27 - 1]->trans.x; + lbl_1_bss_E0[1].y = sp2C[var_r27 - 1]->trans.y; + lbl_1_bss_E0[1].z = sp2C[var_r27 - 1]->trans.z; + lbl_1_bss_F8[1] = 1; + } + sp20.x = sp2C[var_r27 - 1]->trans.x - lbl_1_bss_E0[1].x; + sp20.y = sp2C[var_r27 - 1]->trans.y - lbl_1_bss_E0[1].y; + sp20.z = sp2C[var_r27 - 1]->trans.z - lbl_1_bss_E0[1].z; + var_f29 = PSVECMag(&sp20); + PSVECNormalize(&sp20, &sp20); + if (var_f29 < 100.0f) { + lbl_1_bss_E0[1].x = sp2C[var_r27 - 1]->trans.x; + lbl_1_bss_E0[1].y = sp2C[var_r27 - 1]->trans.y; + lbl_1_bss_E0[1].z = sp2C[var_r27 - 1]->trans.z; + } + else { + lbl_1_bss_E0[1].x += (100.0f * sp20.x); + lbl_1_bss_E0[1].y += (100.0f * sp20.y); + lbl_1_bss_E0[1].z += (100.0f * sp20.z); + } + fn_1_12B38(&lbl_1_bss_E0[1]); + if (fn_1_122C() == 2 || fn_1_122C() == 3) { + return; + } + for (var_r29 = 0; var_r29 < var_r27; var_r29++) { + var_r30 = sp2C[var_r29]; + var_r31 = var_r30->data; + if (!var_r31->unk_00_field0) { + var_f30 = sp2C[var_r27 - 1]->trans.z - var_r30->trans.z; + if (var_f30 > 3000.0f) { + if (var_f30 > 5000.0f) { + var_f30 = 5000.0f; + } + var_f27 = 45.0f - (9.0f * (var_f30 / 5000.0f)); + } + else { + var_f27 = 45.0f; + } + var_r31->unk_14.z += (0.2f * (var_f27 - var_r31->unk_14.z)); + } + } + return; + } + break; + case 2: + if (fn_1_122C() == 8 || fn_1_122C() == 10) { + lbl_1_bss_D8++; + lbl_1_data_11F4 = 210; + return; + } + break; + case 3: + if (--lbl_1_data_11F4 == 0) { + fn_1_12BC(); + } + break; + } + } +} + +void fn_1_1065C(omObjData *object) +{ + M406PlayerWork *var_r31 = object->data; + + var_r31->unk_12 = 0; + var_r31->unk_00 = 0; + var_r31->unk_54 = 1.0f; + var_r31->unk_14.x = 0.0f; + var_r31->unk_64 = 60; + object->trans.z = -60000.0f; + object->rot.x = object->rot.y = object->rot.z = 0.0f; + var_r31->unk_2C.x = var_r31->unk_2C.y = 0.0f; + var_r31->unk_2C.z = -20.0f; + Hu3DModelShadowReset(object->model[0]); + fn_1_6BB4(&object->trans); + Hu3DModelAttrReset(object->model[0], 1); + object->func = fn_1_10744; +} + +void fn_1_10744(omObjData *object) +{ + Mtx sp48; + Mtx sp18; + + float var_f31; + + M406PlayerWork *var_r31; + ModelData *var_r29; + s32 var_r24; + + var_r31 = object->data; + var_r29 = &Hu3DData[object->model[0]]; + switch (var_r31->unk_12) { + case 0: + fn_1_DD7C(object, 0, 1.0f, 0); + if (--var_r31->unk_64 == 0) { + fn_1_1284(); + var_r31->unk_12++; + } + if (var_r31->unk_64 == 54.0f) { + HuAudFXPlay(0x541); + } + mtxRot(sp48, var_r29->rot.x, var_r29->rot.y, var_r29->rot.z); + mtxTransCat(sp48, var_r29->pos.x, var_r29->pos.y, var_r29->pos.z); + if (var_r31->unk_64 < 0x1E) { + var_f31 = 0.0f; + } + else { + var_f31 = (255.0f * (var_r31->unk_64 - 0x1E)) / 30.0f; + } + fn_1_82C8(sp48, frand() & 0xF, var_f31); + break; + case 1: + if (fn_1_122C() == 8) { + var_r31->unk_12++; + var_r31->unk_14.x = 180.0f; + var_r31->unk_64 = 90; + var_r31->unk_2C.x = 100.0 * (0.10000000149011612 * sind(180.0f + var_r31->unk_14.x)); + var_r31->unk_2C.y = 0.0f; + var_r31->unk_2C.z = 100.0 * (0.10000000149011612 * cosd(180.0f + var_r31->unk_14.x)); + object->trans.x = 300.0f; + object->trans.z = -1000.0f; + object->trans.y = 1000.0f; + CharModelKill(var_r31->unk_0C); + object->model[0] = CharModelCreate(var_r31->unk_0C, 2); + for (var_r24 = 0; var_r24 < 4; var_r24++) { + Hu3DModelHookSet(object->model[0], lbl_1_data_1068[var_r24], object->model[var_r24 + 1]); + } + for (var_r24 = 0; var_r24 < 10U; var_r24++) { + object->motion[var_r24] = CharModelMotionCreate(var_r31->unk_0C, lbl_1_data_1078[var_r24]); + } + var_r31->unk_38 = -1; + fn_1_DD7C(object, 0, 1.0f, 0); + Hu3DModelShadowSet(object->model[0]); + return; + } + break; + case 2: + var_r31->unk_2C.y += -2.0f; + if (object->trans.y < 0.0f) { + object->trans.y = 0.0f; + var_r31->unk_12++; + var_r31->unk_2C.y = 0.0f; + fn_1_DD7C(object, 2, 1.0f, 0); + omVibrate(var_r31->unk_02, 0xC, 6, 6); + var_r31->unk_7C[0] = HuAudFXPlay(0x53B); + } + break; + case 3: + var_r31->unk_14.x -= 0.5f; + var_r31->unk_54 = 1.0f; + if (var_r31->unk_64 < 0x14) { + var_r31->unk_54 = var_r31->unk_64 / 20.0f; + } + if ((var_r31->unk_64 < 0x50) && (var_r31->unk_64 > 0x1E)) { + mtxRot(sp48, var_r29->rot.x, var_r29->rot.y, var_r29->rot.z); + mtxTransCat(sp48, var_r29->pos.x, var_r29->pos.y, var_r29->pos.z); + PSMTXTrans(sp18, 10.0f, 0.0f, 0.0f); + PSMTXConcat(sp18, sp48, sp48); + fn_1_94C0(sp48, 10, 0); + } + var_r31->unk_2C.x = var_r31->unk_54 * (100.0 * (0.10000000149011612 * sind(180.0f + var_r31->unk_14.x))); + var_r31->unk_2C.z = var_r31->unk_54 * (100.0 * (0.10000000149011612 * cosd(180.0f + var_r31->unk_14.x))); + if (var_r31->unk_64 == 48.0f) { + fn_1_DD7C(object, 8, 1.0f, 0); + } + if (--var_r31->unk_64 == 0) { + var_r31->unk_12 = -1; + var_r31->unk_2C.x = var_r31->unk_2C.z = 0.0f; + } + break; + default: + break; + } + object->trans.x += var_r31->unk_2C.x; + object->trans.y += var_r31->unk_2C.y; + object->trans.z += var_r31->unk_2C.z; + object->rot.y = 180.0f + var_r31->unk_14.x; +} + +void fn_1_11058(omObjData *object) +{ + ModelData *sp8; + + M406PlayerWork *var_r30; + void *var_r29; + s32 var_r28; + + var_r30 = object->data; + if (lbl_1_bss_1CC < 0) { + object->trans.x = lbl_1_data_11F8[lbl_1_bss_1F4].unk_00; + object->trans.z = lbl_1_data_11F8[lbl_1_bss_1F4].unk_04; + var_r30->unk_64 = 30.0f + (frand() & 0x1F); + } + else { + object->trans.x = lbl_1_data_1218[lbl_1_bss_1F4].unk_00; + object->trans.z = lbl_1_data_1218[lbl_1_bss_1F4].unk_04; + var_r30->unk_64 = 90.0f + (frand() & 0x1F); + } + for (var_r28 = 0; var_r28 < 8; var_r28++) { + Hu3DModelAttrSet(object->model[var_r28], 1); + Hu3DModelPosSet(object->model[var_r28], 0.0f, 0.0f, 0.0f); + Hu3DModelRotSet(object->model[var_r28], 0.0f, 0.0f, 0.0f); + Hu3DModelScaleSet(object->model[var_r28], 1.0f, 1.0f, 1.0f); + } + Hu3DModelHookReset(object->model[0]); + fn_1_DD7C(object, 0, 1.0f, 0); + var_r30->unk_00 = 0; + var_r30->unk_12 = 0; + var_r30->unk_00_field3 = 1; + var_r30->unk_50 = 360.0f * frandf(); + var_r30->unk_50 = 160.0f + ((frand() & 0x3F) - 0x20); + var_r30->unk_54 = 30.0f; + var_r30->unk_5A = 3; + object->trans.y = 1000.0f; + object->rot.x = object->rot.y = 0.0f; + object->rot.z = (frand() & 0x3F) - 0x20; + var_r30->unk_2C.x = var_r30->unk_2C.y = var_r30->unk_2C.z = 0.0f; + lbl_1_bss_1F4++; + object->func = fn_1_114A0; +} + +void fn_1_114A0(omObjData *object) +{ + Mtx sp9C; + Mtx sp6C; + Mtx sp3C; + Mtx spC; + ModelData *sp8; + M406PlayerWork *var_r31; + + var_r31 = object->data; + sp8 = &Hu3DData[object->model[0]]; + switch (var_r31->unk_12) { + case 0: + if (fn_1_122C() == 8 || fn_1_122C() == 10) { + var_r31->unk_12++; + } + return; + case 1: + if (var_r31->unk_64 != 0) { + if (--var_r31->unk_64 == 0) { + Hu3DModelAttrReset(object->model[5], 1); + Hu3DModelAttrReset(object->model[7], 1); + } + else { + return; + } + } + var_r31->unk_50 += var_r31->unk_54; + var_r31->unk_54 -= 0.5f; + if (var_r31->unk_54 < 0.0f) { + var_r31->unk_54 = 0.0f; + } + if (var_r31->unk_5A != 0) { + var_r31->unk_2C.y += -2.0f; + object->trans.y += var_r31->unk_2C.y; + if (object->trans.y < 0.0f) { + object->trans.y = 0.0f; + var_r31->unk_2C.y = 0.5f * -var_r31->unk_2C.y; + var_r31->unk_5A--; + if (!var_r31->unk_00_field5) { + omVibrate(var_r31->unk_02, 12, 4, 2); + var_r31->unk_00_field5 = 1; + HuAudFXPlay(0x53F); + } + } + } + break; + default: + break; + } + mtxRot(sp9C, object->rot.x, object->rot.y, object->trans.z); + mtxScaleCat(sp9C, object->scale.x, object->scale.y, object->scale.z); + PSMTXTrans(sp9C, object->trans.x, object->trans.y, object->trans.z); + PSMTXRotRad(sp6C, 0x78, 0.017453292f * var_r31->unk_50); + PSMTXConcat(sp9C, sp6C, sp9C); + PSMTXCopy(sp9C, spC); + mtxScaleCat(spC, 2.0f, 2.0f, 2.0f); + PSMTXCopy(spC, Hu3DData[object->model[5]].unk_F0); + PSMTXTrans(sp3C, 0.0f, 110.0f, 0.0f); + PSMTXConcat(sp9C, sp3C, spC); + PSMTXCopy(spC, Hu3DData[object->model[7]].unk_F0); +} + +void fn_1_117BC(float arg8, float arg9, UnkM406PlayerStruct2 *arg0, Vec *arg1) +{ + Vec sp10; + float spC; + + float var_f30; + Vec *var_r31; + + if (arg0->unk_00 == NULL) { + arg1->x = arg1->y = arg1->z = 0.0f; + return; + } + var_r31 = &arg0->unk_00[3]; + sp10.x = var_r31->y * sind((180.0f + arg8)); + sp10.z = var_r31->y * cosd((180.0f + arg8)); + var_f30 = 1.0f - (var_r31->y * var_r31->y); + sp10.y = -sqrtf(var_f30); + PSVECScale(&sp10, arg1, arg9); +} +s32 fn_1_119E4(Vec *arg0, UnkM406PlayerStruct *arg1) +{ + Vec sp8; + + float var_f31; + float var_f30; + float var_f29; + float var_f28; + float var_f27; + float var_f26; + float var_f25; + float var_f24; + float var_f23; + float var_f22; + float var_f21; + float var_f20; + float var_f19; + float var_f18; + + s32 var_r31; + s32 var_r30; + + for (var_r31 = 0; var_r31 < lbl_1_bss_B4 - 1; var_r31++) { + var_r30 = var_r31 + 1; + var_f31 = lbl_1_data_960[var_r30].x - lbl_1_data_CA8[var_r31].x; + var_f30 = lbl_1_data_960[var_r30].z - lbl_1_data_CA8[var_r31].z; + if (((var_f31 * (arg0->z - lbl_1_data_CA8[var_r31].z)) - (var_f30 * (arg0->x - lbl_1_data_CA8[var_r31].x))) < 0.0f) { + var_f31 = lbl_1_data_960[var_r30].x - lbl_1_data_960[var_r31].x; + var_f28 = lbl_1_data_CA8[var_r31].x - lbl_1_data_960[var_r31].x; + var_f30 = lbl_1_data_960[var_r30].z - lbl_1_data_960[var_r31].z; + var_f27 = lbl_1_data_CA8[var_r31].z - lbl_1_data_960[var_r31].z; + var_f26 = 0.0f; + var_f25 = 1.0f; + var_f24 = 1.0f; + var_f23 = 0.0f; + var_f29 = (var_f31 * var_f27) - (var_f28 * var_f30); + var_f22 = ((var_f26 * var_f27) - (var_f25 * var_f30)) / var_f29; + var_f21 = ((var_f25 * var_f31) - (var_f26 * var_f28)) / var_f29; + var_f20 = ((var_f24 * var_f27) - (var_f23 * var_f30)) / var_f29; + var_f19 = ((var_f23 * var_f31) - (var_f24 * var_f28)) / var_f29; + sp8.z = -(var_f22 * lbl_1_data_960[var_r31].x) - (var_f21 * lbl_1_data_960[var_r31].z); + sp8.y = -(var_f20 * lbl_1_data_960[var_r31].x) - (var_f19 * lbl_1_data_960[var_r31].z); + } + else { + var_f31 = lbl_1_data_CA8[var_r30].x - lbl_1_data_960[var_r30].x; + var_f28 = lbl_1_data_CA8[var_r31].x - lbl_1_data_960[var_r30].x; + var_f30 = lbl_1_data_CA8[var_r30].z - lbl_1_data_960[var_r30].z; + var_f27 = lbl_1_data_CA8[var_r31].z - lbl_1_data_960[var_r30].z; + var_f26 = 1.0f; + var_f25 = 1.0f; + var_f24 = 0.0f; + var_f23 = -1.0f; + var_f29 = (var_f31 * var_f27) - (var_f28 * var_f30); + var_f22 = ((var_f26 * var_f27) - (var_f25 * var_f30)) / var_f29; + var_f21 = ((var_f25 * var_f31) - (var_f26 * var_f28)) / var_f29; + var_f20 = ((var_f24 * var_f27) - (var_f23 * var_f30)) / var_f29; + var_f19 = ((var_f23 * var_f31) - (var_f24 * var_f28)) / var_f29; + sp8.z = -(var_f22 * lbl_1_data_960[var_r30].x) - (var_f21 * lbl_1_data_960[var_r30].z); + sp8.y = (1.0f - (var_f20 * lbl_1_data_960[var_r30].x)) - (var_f19 * lbl_1_data_960[var_r30].z); + } + var_f18 = sp8.z + ((var_f22 * arg0->x) + (var_f21 * arg0->z)); + sp8.x = sp8.y + ((var_f20 * arg0->x) + (var_f19 * arg0->z)); + if ((var_f18 >= 0.0f) && (var_f18 < 1.0f) && (sp8.x >= 0.0f) && (sp8.x < 1.0f)) { + arg1->unk_00 = var_f18; + arg1->unk_04 = sp8.x; + return var_r31; + } + } + return -1; +} + +void fn_1_11FC4(Vec *arg0, float arg8, Vec *arg1) +{ + UnkM406PlayerStruct spC; + + float var_f30; + float var_f31; + float var_f29; + float var_f28; + + UnkM406Struct2 *var_r31; + s32 var_r29; + s32 var_r28; + + var_r29 = -1; + var_r29 = fn_1_119E4(arg0, &spC); + if (var_r29 >= 0) { + var_r31 = &lbl_1_bss_B8[var_r29]; + var_f31 = 0.0f; + var_f30 = var_r31->unk_00 * spC.unk_04; + var_f29 = var_r31->unk_00 - var_f30; + + for (var_r28 = var_r29; var_r28 < lbl_1_bss_B4 - 1; var_r28++) { + if (var_f31 + var_f29 >= 3000.0f) { + var_f28 = (3000.0f + var_f30) - var_f31; + arg1->x = (var_r31->unk_14.x + (var_r31->unk_08.x * var_f28)) - (var_r31->unk_08.z * arg8); + arg1->y = var_r31->unk_14.y + (var_r31->unk_08.y * var_f28); + arg1->z = var_r31->unk_14.z + (var_r31->unk_08.z * var_f28) + (var_r31->unk_08.x * arg8); + return; + } + var_f31 += var_f29; + var_f30 = 0.0f; + var_r31++; + var_f29 = var_r31->unk_00; + } + } + arg1->x = arg1->y = 0.0f; + arg1->z = -61000.0f; +} + +float fn_1_12194(Vec *arg0) +{ + Vec sp1C; + UnkM406PlayerStruct sp14; + UnkM406PlayerStruct spC; + + UnkM406Struct2 *var_r31; + UnkM406Struct2 *var_r30; + s32 var_r29; + s32 var_r28; + + fn_1_69C0(&sp1C); + var_r28 = fn_1_119E4(&sp1C, &sp14); + var_r29 = fn_1_119E4(arg0, &spC); + if (var_r28 < 0 || var_r29 < 0) { + return -1.0f; + } + var_r31 = &lbl_1_bss_B8[var_r28]; + var_r30 = &lbl_1_bss_B8[var_r29]; + return (var_r30->unk_04 + (var_r30->unk_00 * spC.unk_04)) - (var_r31->unk_04 + (var_r31->unk_00 * sp14.unk_04)); +} + +void fn_1_12270(omObjData *object) +{ + Vec sp1C; + Vec sp10; + UnkM406PlayerStruct sp8; + + float var_f31; + float var_f30; + float var_f29; + float var_f28; + float var_f27; + + M406PlayerWork *var_r31; + UnkM406Struct2 *var_r30; + s32 var_r29; + s32 var_r28; + + var_r31 = object->data; + if (!var_r31->unk_00_field3) { + if (var_r31->unk_14.y < 30.000002f) { + var_r31->unk_0A = 0x100; + } + else if ((frand() & 0x1FF) < (var_r31->unk_0E + 6)) { + var_r31->unk_0A = 0x100; + } + if ((frand() & 0xFF) == 0) { + var_r31->unk_78 = (400.0f + (100.0f * (4 - GWPlayerCfg[var_r31->unk_02].diff))) * ((frand() & 0x1FF) - 256.0f) / 256; + } + if (fabs(var_r31->unk_74 - var_r31->unk_78) > 10.0) { + var_r31->unk_74 = var_r31->unk_74 + (0.05f * (var_r31->unk_78 - var_r31->unk_74)); + } + var_f27 = var_r31->unk_74; + var_r29 = -1; + var_r29 = fn_1_119E4(&object->trans, &sp8); + if (var_r29 >= 0) { + var_r30 = &lbl_1_bss_B8[var_r29]; + var_f31 = 0.0f; + var_f28 = var_r30->unk_00 * sp8.unk_04; + var_f29 = var_r30->unk_00 - var_f28; + for (var_r28 = var_r29; var_r28 < lbl_1_bss_B4 - 1; var_r28++) { + if (var_f31 + var_f29 >= 3000.0f) { + var_f30 = (3000.0f + var_f28) - var_f31; + sp1C.x = (var_r30->unk_14.x + (var_r30->unk_08.x * var_f30)) - (var_r30->unk_08.z * var_f27); + sp1C.y = var_r30->unk_14.y + (var_r30->unk_08.y * var_f30); + sp1C.z = var_r30->unk_14.z + (var_r30->unk_08.z * var_f30) + (var_r30->unk_08.x * var_f27); + goto block_12270; // TODO + } + else { + var_f31 += var_f29; + var_f28 = 0.0f; + var_r30++; + var_f29 = var_r30->unk_00; + } + } + } + sp1C.x = sp1C.y = 0.0f; + sp1C.z = -61000.0f; + + block_12270: + PSVECSubtract(&sp1C, &object->trans, &sp10); + if (PSVECMag(&sp10) > 0.0f) { + PSVECNormalize(&sp10, &sp10); + var_r31->unk_06 = 72.0 * ((sp10.x * cosd(CRot.y)) - sp10.z * sind(CRot.y)); + var_r31->unk_07 = 72.0 * -((sp10.x * sind(CRot.y)) + sp10.z * cosd(CRot.y)); + } + } + else if ((frand() & 3) == 0) { + var_r31->unk_0A = 256; + } +} + +void fn_1_1275C(void) +{ + omObjData **sp8; + s32 var_r31; + + var_r31 = 0; + sp8 = omGetGroupMemberListEx(lbl_1_bss_1C8, 0); + + while (fn_1_127B8() != 0 && var_r31 < 10) { + var_r31++; + } +} + +s32 fn_1_127B8(void) +{ + Vec sp14[4]; + Vec sp8; + + float var_f31; + float var_f30; + + s32 var_r31; + s32 var_r30; + omObjData **var_r29; + omObjData *var_r28; + s32 var_r27; + omObjData *var_r26; + omObjData *var_r25; + M406PlayerWork *var_r24; + M406PlayerWork *var_r23; + M406PlayerWork *var_r22; + + var_r27 = 0; + var_r29 = omGetGroupMemberListEx(lbl_1_bss_1C8, 0); + for (var_r31 = 0; var_r31 < 4; var_r31++) { + sp14[var_r31].x = sp14[var_r31].y = sp14[var_r31].z = 0.0f; + } + for (var_r31 = 0; var_r31 < 3; var_r31++) { + var_r26 = var_r29[var_r31]; + var_r23 = var_r26->data; + if (!var_r23->unk_00_field0) { + for (var_r30 = var_r31 + 1; var_r30 < 4; var_r30++) { + var_r25 = var_r29[var_r30]; + var_r22 = var_r25->data; + if (!var_r22->unk_00_field0) { + PSVECSubtract(&var_r26->trans, &var_r25->trans, &sp8); + var_f31 = PSVECMag(&sp8); + if (var_f31 < 100.0f) { + PSVECNormalize(&sp8, &sp8); + var_f30 = 0.01f + (0.5f * (100.0f - var_f31)); + PSVECScale(&sp8, &sp8, var_f30); + PSVECAdd(&sp14[var_r31], &sp8, &sp14[var_r31]); + PSVECSubtract(&sp14[var_r30], &sp8, &sp14[var_r30]); + var_r27++; + } + } + } + } + } + for (var_r31 = 0; var_r31 < 4; var_r31++) { + var_r28 = var_r29[var_r31]; + var_r24 = var_r28->data; + if (!var_r24->unk_00_field0) { + PSVECAdd(&var_r28->trans, &sp14[var_r31], &var_r28->trans); + } + } + return var_r27; +} + +s32 fn_1_129E4(omObjData *object) +{ + Vec spC; + + float var_f31; + + s32 var_r31; + omObjData **var_r30; + ModelData *var_r29; + + var_r30 = omGetGroupMemberListEx(HuPrcCurrentGet(), 3); + for (var_r31 = 0; var_r31 < var_r30[0]->mdlcnt; var_r31++) { + var_r29 = &Hu3DData[(*var_r30)->model[var_r31]]; + PSVECSubtract(&var_r29->pos, &object->trans, &spC); + var_f31 = PSVECMag(&spC); + if (var_f31 < 100.0f) { + return 1; + } + } + return 0; +} + +void fn_1_12AB8(omObjData *object) +{ + if (object->data != NULL) { + HuMemDirectFree(object->data); + object->data = NULL; + } +} + +void fn_1_12B00(omObjData *object) +{ + lbl_1_bss_1C4 = 0; + lbl_1_bss_100 = -1.0f; + object->func = fn_1_12BC4; +} + +void fn_1_12B38(Vec *arg0) +{ + lbl_1_bss_104[lbl_1_bss_1C4].x = arg0->x; + lbl_1_bss_104[lbl_1_bss_1C4].y = arg0->y; + lbl_1_bss_104[lbl_1_bss_1C4].z = arg0->z; + lbl_1_bss_1C4++; +} + +void fn_1_12BC4(omObjData *object) +{ + Vec sp198[16]; + Vec spD8[16]; + Mtx spA8; + Vec sp9C; + Vec sp90; + Vec sp84; + Vec sp78; + + float var_f31; + float var_f30; + float var_f29; + float var_f28; + + s32 var_r31; + CameraData *var_r30 = Hu3DCamera; + + if (lbl_1_bss_1C4 != 0) { + if (fn_1_122C() == 4) { + var_f30 = 0.4f; + } + else { + var_f30 = 0.05f; + } + var_f31 = var_f30; + for (var_r31 = 0; var_r31 < lbl_1_bss_1C4; var_r31++) { + if (var_r31 == 0) { + sp9C = sp90 = lbl_1_bss_104[var_r31]; + } + else { + if (lbl_1_bss_104[var_r31].x < sp9C.x) { + sp9C.x = lbl_1_bss_104[var_r31].x; + } + else if (lbl_1_bss_104[var_r31].x > sp90.x) { + sp90.x = lbl_1_bss_104[var_r31].x; + } + if (lbl_1_bss_104[var_r31].y < sp9C.y) { + sp9C.y = lbl_1_bss_104[var_r31].y; + } + else if (lbl_1_bss_104[var_r31].y > sp90.y) { + sp90.y = lbl_1_bss_104[var_r31].y; + } + if (lbl_1_bss_104[var_r31].z < sp9C.z) { + sp9C.z = lbl_1_bss_104[var_r31].z; + } + else if (lbl_1_bss_104[var_r31].z > sp90.z) { + sp90.z = lbl_1_bss_104[var_r31].z; + } + } + } + var_f31 = 0.4f; + Center.x += var_f31 * ((0.5f * (sp9C.x + sp90.x)) - Center.x); + Center.y += var_f31 * ((0.5f * (sp9C.y + sp90.y)) - Center.y); + Center.z += var_f31 * ((0.5f * (sp9C.z + sp90.z)) - Center.z); + + var_r30->target.x = Center.x; + var_r30->target.y = Center.y; + var_r30->target.z = Center.z; + C_MTXLookAt(spA8, &var_r30->pos, &var_r30->up, &var_r30->target); + for (var_r31 = 0; var_r31 < lbl_1_bss_1C4; var_r31++) { + PSMTXMultVec(spA8, &lbl_1_bss_104[var_r31], &sp198[var_r31]); + spD8[var_r31].x = sp198[var_r31].x / (sp198[var_r31].z * (sind((var_r30->fov / 2)) / cosd((var_r30->fov / 2)))); + spD8[var_r31].y = sp198[var_r31].y / (sp198[var_r31].z * (sind((var_r30->fov / 2)) / cosd((var_r30->fov / 2)))); + } + sp90.x = 0.0f; + for (var_r31 = 0; var_r31 < lbl_1_bss_1C4; var_r31++) { + if (fabs(spD8[var_r31].x) > fabs(spD8[var_r31].y)) { + if (fabs(spD8[var_r31].x) > sp90.x) { + sp90.x = fabs(spD8[var_r31].x); + sp90.y = fabs(sp198[var_r31].x); + sp90.z = sp198[var_r31].z; + } + } + else { + if (fabs(spD8[var_r31].y) > sp90.x) { + sp90.x = fabs(spD8[var_r31].y); + sp90.y = fabs(sp198[var_r31].y); + sp90.z = sp198[var_r31].z; + } + } + } + var_f29 = -sp90.y / (sind((var_r30->fov / 2)) / cosd((var_r30->fov / 2))); + var_f28 = CZoom - (var_f29 - sp90.z); + var_f31 = 0.05f; + if (lbl_1_bss_100 >= 0.0f) { + lbl_1_bss_100 += var_f31 * (var_f28 - lbl_1_bss_100); + } + else { + lbl_1_bss_100 = CZoom - 500.0f; + } + CZoom = 500.0f + lbl_1_bss_100; + if (CZoom < 1500.0f) { + CZoom = 1500.0f; + } + lbl_1_bss_1C4 = 0; + if (fn_1_122C() >= 3) { + sp84.x = Center.x + (CZoom * (sind(CRot.y) * cosd(CRot.x))); + sp84.y = Center.y + (CZoom * -sind(CRot.x)); + sp84.z = Center.z + (CZoom * (cosd(CRot.y) * cosd(CRot.x))); + PSVECSubtract(&Center, &sp84, &sp78); + PSVECNormalize(&sp78, &sp78); + HuAudFXListnerUpdate(&sp84, &sp78); + } + } +} + +void fn_1_136A8(void) { } + +s32 fn_1_136AC(HsfObject *arg0, Mtx arg1, char *arg2, Mtx arg3) +{ + char sp4A4[256]; + Mtx sp174; + Mtx sp144; + u32 var_r23; + + HsfTransform *var_r31 = &arg0->data.curr; + + mtxRot(sp144, var_r31->rot.x, var_r31->rot.y, var_r31->rot.z); + PSMTXScale(sp174, var_r31->scale.x, var_r31->scale.y, var_r31->scale.z); + PSMTXConcat(sp144, sp174, sp174); + mtxTransCat(sp174, var_r31->pos.x, var_r31->pos.y, var_r31->pos.z); + PSMTXConcat(arg1, sp174, sp174); + strcpy(sp4A4, MakeObjectName(arg2)); + if (strcmp(sp4A4, arg0->name) == 0) { + PSMTXCopy(sp174, arg3); + return 1; + } + for (var_r23 = 0; var_r23 < arg0->data.childrenCount; var_r23++) { + s32 sp20 = fn_1_136AC(arg0->data.children[var_r23], sp174, arg2, arg3); + if (sp20) { + return 1; + } + } + return 0; +} + +void fn_1_13A88(s16 arg0, char *arg1, Mtx arg2) +{ + Mtx sp14; + + ModelData *var_r31; + HsfData *var_r30; + + var_r31 = &Hu3DData[arg0]; + var_r30 = var_r31->hsfData; + PSMTXIdentity(sp14); + fn_1_136AC(var_r30->root, sp14, arg1, arg2); +} + +float fn_1_13AF4(float arg8, float arg9, float argA) +{ + float var_f31; + float var_f30; + float var_f29; + + var_f30 = fmod(arg9 - arg8, 360.0); + var_f31 = var_f30; + if (var_f31 < 0.0f) { + var_f31 += 360.0f; + } + if (var_f31 > 180.0f) { + var_f31 -= 360.0f; + } + var_f29 = fmod(arg8 + (argA * var_f31), 360.0); + var_f31 = var_f29; + if (var_f31 < 0.0f) { + var_f31 += 360.0f; + } + return var_f31; +} + +s32 fn_1_13C10(Vec *arg0, Vec *arg1) +{ + Vec *sp48[3]; + Vec sp3C; + Vec sp30; + Vec sp24; + Vec sp18; + Vec spC; + HsfBuffer *sp8; + + float var_f31; + float var_f30; + float var_f29; + float var_f28; + + HsfFace *var_r31; + s32 var_r29; + HsfFace *var_r28; + HsfObject *var_r27; + HsfBuffer *var_r26; + HsfBuffer *var_r24; + s32 var_r23; + s32 var_r22; + s32 var_r21; + omObjData **var_r20; + ModelData *var_r19; + + var_r20 = omGetGroupMemberListEx(lbl_1_bss_1C8, 2); + var_r21 = arg0->z / -10000.0f; + if (var_r21 >= 6) { + return; + } + var_r19 = &Hu3DData[(*var_r20)->model[var_r21]]; + var_f29 = 100000.0f; + var_r27 = var_r19->hsfData->root; + if (var_r27->type != 2) { + return; + } + var_r24 = var_r27->data.face; + var_r26 = var_r27->data.vertex; + sp8 = var_r27->data.normal; + var_r31 = var_r24->data; + for (var_r23 = 0; var_r23 < var_r24->count; var_r23++, var_r31++) { + if ((var_r31->type == 2) && ((var_r31->mat & 0xFFF) == lbl_1_bss_1E8[var_r21])) { + sp48[0] = &((Vec *)var_r26->data)[var_r31->indices[0][0]]; + sp48[1] = &((Vec *)var_r26->data)[var_r31->indices[1][0]]; + sp48[2] = &((Vec *)var_r26->data)[var_r31->indices[2][0]]; + + var_f28 = (var_r31->nbt.z * sp48[0]->z) + ((var_r31->nbt.x * sp48[0]->x) + (var_r31->nbt.y * sp48[0]->y)); + sp24.x = -var_r31->nbt.x; + sp24.y = 0.0f; + sp24.z = -var_r31->nbt.z; + PSVECNormalize(&sp24, &sp24); + var_f31 = (var_f28 + (((-var_r31->nbt.x * arg0->x) - (var_r31->nbt.y * arg0->y)) - (var_r31->nbt.z * arg0->z))) + / ((var_r31->nbt.x * sp24.x) + (var_r31->nbt.z * sp24.z)); + if (var_f31 <= 0.0) { + continue; + } + spC.x = arg0->x + (sp24.x * var_f31); + spC.y = arg0->y; + spC.z = arg0->z + (sp24.z * var_f31); + PSVECSubtract(sp48[1], sp48[0], &sp3C); + PSVECSubtract(&spC, sp48[1], &sp30); + PSVECCrossProduct(&sp3C, &sp30, &sp24); + if (!(PSVECDotProduct(&var_r31->nbt, &sp24) < 0.0f)) { + PSVECSubtract(sp48[2], sp48[1], &sp3C); + PSVECSubtract(&spC, sp48[2], &sp30); + PSVECCrossProduct(&sp3C, &sp30, &sp24); + if (!(PSVECDotProduct(&var_r31->nbt, &sp24) < 0.0f)) { + PSVECSubtract(sp48[0], sp48[2], &sp3C); + PSVECSubtract(&spC, sp48[0], &sp30); + PSVECCrossProduct(&sp3C, &sp30, &sp24); + if (!(PSVECDotProduct(&var_r31->nbt, &sp24) < 0.0f) && (var_f31 < var_f29)) { + var_f29 = var_f31; + sp18 = spC; + var_r28 = var_r31; + } + } + } + for (var_r29 = 0; var_r29 < 3; var_r29++) { + var_r22 = var_r29 + 1; + if (var_r22 > 2) { + var_r22 = 0; + } + PSVECSubtract(sp48[var_r22], sp48[var_r29], &sp3C); + if (sp3C.y != 0.0f) { + var_f30 = (arg0->y - sp48[var_r29]->y) / sp3C.y; + if ((var_f30 >= 0.0f) && (var_f30 < 1.0f)) { + spC.x = sp48[var_r29]->x + (var_f30 * sp3C.x); + spC.z = sp48[var_r29]->z + (var_f30 * sp3C.z); + PSVECSubtract(&spC, arg0, &sp3C); + sp3C.y = 0.0f; + var_f31 = PSVECMag(&sp3C); + if (var_f31 < var_f29) { + var_f29 = var_f31; + sp18 = spC; + var_r28 = var_r31; + } + } + } + var_f31 = (sp3C.x * sp3C.x) + (sp3C.z * sp3C.z); + if (var_f31 != 0.0f) { + var_f30 = (((arg0->z * sp3C.z) + ((arg0->x * sp3C.x) - (sp3C.x * sp48[var_r29]->x))) - (sp3C.z * sp48[var_r29]->z)) / var_f31; + if ((var_f30 >= 0.0f) && (var_f30 < 1.0f)) { + sp30.y = sp48[var_r29]->y + (var_f30 * sp3C.y); + if ((sp30.y >= arg0->y) && (sp30.y < (150.0f + arg0->y))) { + sp30.x = sp48[var_r29]->x + (var_f30 * sp3C.x); + sp30.z = sp48[var_r29]->z + (var_f30 * sp3C.z); + PSVECSubtract(&sp30, arg0, &sp3C); + sp3C.y = 0.0f; + var_f31 = PSVECMag(&sp3C); + if (var_f31 < var_f29) { + var_f29 = var_f31; + sp18 = sp30; + var_r28 = var_r31; + } + } + } + } + if ((sp48[var_r29]->y >= arg0->y) && (sp48[var_r29]->y < (150.0f + arg0->y))) { + PSVECSubtract(arg0, sp48[var_r29], &sp3C); + sp3C.y = 0.0f; + var_f31 = PSVECMag(&sp3C); + if (var_f31 < var_f29) { + var_f29 = var_f31; + sp18.x = sp48[var_r29]->x; + sp18.z = sp48[var_r29]->z; + var_r28 = var_r31; + } + } + } + } + } + if (var_f29 < 100.0f) { + PSVECSubtract(arg0, &sp18, &sp3C); + sp3C.y = 0.0f; + PSVECNormalize(&sp3C, &sp3C); + arg0->x = sp18.x + (100.001f * sp3C.x); + arg0->z = sp18.z + (100.001f * sp3C.z); + arg1->x = var_r28->nbt.x; + arg1->y = var_r28->nbt.y; + arg1->z = var_r28->nbt.z; + return 1; + } + return 0; +} + +float fn_1_143F4(Vec *arg0, UnkM406PlayerStruct2 *arg1) +{ + Vec *sp34[3]; + Vec sp28; + Vec sp1C; + Vec sp10; + HsfBuffer *spC; + float sp8; + + float var_f31; + float var_f30; + + HsfFace *var_r31; + HsfObject *var_r30; + HsfBuffer *var_r28; + s32 var_r27; + HsfBuffer *var_r25; + s32 var_r24; + omObjData **var_r23; + ModelData *var_r22; + s32 var_r21; + + arg1->unk_00 = NULL; + var_r23 = omGetGroupMemberListEx(lbl_1_bss_1C8, 2); + var_r27 = arg0->z / -10000.0f; + if (var_r27 >= 6) { + return sp8; + } + var_r22 = &Hu3DData[var_r23[0]->model[var_r27]]; + var_r30 = var_r22->hsfData->root; + if (var_r30->type != 2) { + return -100000.0f; + } + var_r25 = var_r30->data.face; + var_r28 = var_r30->data.vertex; + spC = var_r30->data.normal; + for (var_r31 = var_r25->data, var_r24 = 0; var_r24 < var_r25->count; var_r24++, var_r31++) { + if (var_r31->type == 2 && (((var_r31->mat & 0xFFF) == lbl_1_bss_1DC[var_r27]) || ((var_r31->mat & 0xFFF) == lbl_1_bss_1D0[var_r27]))) { + sp34[0] = &((Vec *)var_r28->data)[var_r31->indices[0][0]]; + sp34[1] = &((Vec *)var_r28->data)[var_r31->indices[1][0]]; + sp34[2] = &((Vec *)var_r28->data)[var_r31->indices[2][0]]; + PSVECSubtract(sp34[1], sp34[0], &sp28); + PSVECSubtract(arg0, sp34[1], &sp1C); + PSVECCrossProduct(&sp28, &sp1C, &sp10); + if (sp10.y < 0.0f) { + continue; + } + PSVECSubtract(sp34[2], sp34[1], &sp28); + PSVECSubtract(arg0, sp34[2], &sp1C); + PSVECCrossProduct(&sp28, &sp1C, &sp10); + if (sp10.y < 0.0f) { + continue; + } + PSVECSubtract(sp34[0], sp34[2], &sp28); + PSVECSubtract(arg0, sp34[0], &sp1C); + PSVECCrossProduct(&sp28, &sp1C, &sp10); + if (sp10.y < 0.0f) { + continue; + } + var_f30 = (var_r31->nbt.z * sp34[0]->z) + ((var_r31->nbt.x * sp34[0]->x) + (var_r31->nbt.y * sp34[0]->y)); + var_f31 = ((var_f30 - (var_r31->nbt.x * arg0->x)) - (var_r31->nbt.z * arg0->z)) / var_r31->nbt.y; + arg1->unk_00 = (Vec *)var_r31; + arg1->unk_08 = (var_r31->mat & 0xFFF) == lbl_1_bss_1D0[var_r27] ? 1 : 0; + return var_f31; + } + } + return -100000.0f; +}