#include "ext_math.h" #include "game/audio.h" #include "game/gamework_data.h" #include "game/hsfdraw.h" #include "game/hsfman.h" #include "game/hsfmotion.h" #include "game/object.h" #include "game/objsub.h" #include "game/sprite.h" #include "REL/m410Dll.h" typedef void (*lbl_1_bss_44_type)(u16, u16, u16); omObjData *lbl_1_bss_5C; omObjData *lbl_1_bss_58; omObjData *lbl_1_bss_54; float lbl_1_bss_50; float lbl_1_bss_4C; float lbl_1_bss_48; lbl_1_bss_44_type lbl_1_bss_44; Process *lbl_1_bss_40; s32 lbl_1_bss_3C; s32 lbl_1_bss_38; s32 lbl_1_bss_34; s32 lbl_1_bss_30; s16 lbl_1_data_D8 = 0x0384; s32 lbl_1_data_DC[] = { DATA_MAKE_NUM(DATADIR_M410, 0), DATA_MAKE_NUM(DATADIR_M410, 1), DATA_MAKE_NUM(DATADIR_M410, 2), DATA_MAKE_NUM(DATADIR_M410, 3), DATA_MAKE_NUM(DATADIR_M410, 4), DATA_MAKE_NUM(DATADIR_M410, 5), DATA_MAKE_NUM(DATADIR_M410, 6), DATA_MAKE_NUM(DATADIR_M410, 7) }; void fn_1_34C0(omObjData *object); void fn_1_3614(omObjData *object); void fn_1_3BE0(s16 arg0); float fn_1_48D8(UnkM410Struct2 *arg0, u8 *arg1); float fn_1_4C04(Vec arg0, Vec arg1, float arg8, Vec arg2, Vec arg3, float arg9); float fn_1_4FEC(Vec arg0, Vec arg1, float arg8, Vec arg2, Vec arg3, float arg9, float argA); float fn_1_55C8(Vec arg0, Vec arg1, float arg8, Vec arg2, float arg9); s32 fn_1_598C(Vec *arg0, Vec *arg1, float arg8, Vec *arg2, Vec *arg3, float arg9, float argA); void fn_1_5AF4(UnkM410Struct2 *arg0, u8 arg1); void fn_1_5CA0(Vec arg0, Vec arg1, Vec arg2, Vec *arg3, Vec *arg4); void fn_1_61DC(UnkM410Struct2 *arg0, UnkM410Struct2 *arg1); void fn_1_6364(UnkM410Struct2 *arg0, UnkM410Struct2 *arg1); void fn_1_66B8(UnkM410Struct2 *arg0, UnkM410Struct2 *arg1); void fn_1_67D4(omObjData *object); void fn_1_6968(omObjData *object); void fn_1_6D84(omObjData *object); void fn_1_6DB4(omObjData *object); void fn_1_7138(omObjData *object); void fn_1_7464(omObjData *object); void fn_1_7494(void); void fn_1_7520(Vec *arg0); void fn_1_75A0(ModelData *model, ParticleData *particle, Mtx matrix); void fn_1_33A8(Process *objman) { lbl_1_bss_5C = omAddObjEx(objman, 3, 3, 0, -1, fn_1_34C0); lbl_1_bss_54 = omAddObjEx(objman, 5, 54, 3, -1, fn_1_6DB4); lbl_1_bss_58 = omAddObjEx(objman, 7, 60, 0, -1, fn_1_67D4); lbl_1_bss_44 = NULL; lbl_1_bss_40 = objman; lbl_1_bss_3C = 300; fn_1_7494(); } void fn_1_3484(void) { fn_1_6D84(lbl_1_bss_58); fn_1_7464(lbl_1_bss_54); } void fn_1_34C0(omObjData *object) { s32 var_r30; object->stat |= 0x100; for (var_r30 = 0; var_r30 < 3; var_r30++) { if (!var_r30) { object->model[var_r30] = Hu3DModelCreateFile(DATA_MAKE_NUM(DATADIR_M410, 12)); } else { object->model[var_r30] = Hu3DModelLink(*object->model); } Hu3DModelPosSet(object->model[var_r30], 0.0f, 140.0f + (140.0f * var_r30), -790.0f); } object->func = fn_1_3614; Hu3DLayerHookSet(7, fn_1_3BE0); lbl_1_bss_50 = lbl_1_bss_4C = lbl_1_bss_48 = 0.0f; } void fn_1_3614(omObjData *object) { float var_f31; float var_f30; float var_f29; ModelData *var_r30; s32 var_r29; s16 var_r28; switch (object->work[0]) { case 0: if (fn_1_2804() == 1) { object->work[0]++; object->work[1] = 256; } break; case 1: if (!--object->work[1]) { object->work[0]++; object->work[1] = 90; lbl_1_bss_50 = 0.0f; lbl_1_bss_4C = -10.000001f; lbl_1_bss_48 = 2.0000002f; lbl_1_bss_34 = HuAudFXPlay(1381); } break; case 2: if (!--object->work[1]) { object->work[0]++; lbl_1_bss_4C = 0.0f; lbl_1_bss_48 = 0.40000007f; } break; case 3: if (fn_1_281C() == 2) { object->work[0]++; lbl_1_bss_4C = -2.0000002f; lbl_1_bss_48 = 0.05000001f; } break; } if (fn_1_281C() == 2) { if (!--lbl_1_data_D8) { lbl_1_bss_4C = -lbl_1_bss_4C; lbl_1_data_D8 = 900; } } else if (fn_1_281C() > 2) { lbl_1_bss_4C = 0.0f; } if (lbl_1_bss_50 != lbl_1_bss_4C) { if (lbl_1_bss_50 < lbl_1_bss_4C) { lbl_1_bss_50 += lbl_1_bss_48; if (lbl_1_bss_50 > lbl_1_bss_4C) { lbl_1_bss_50 = lbl_1_bss_4C; } } else { lbl_1_bss_50 -= lbl_1_bss_48; if (lbl_1_bss_50 < lbl_1_bss_4C) { lbl_1_bss_50 = lbl_1_bss_4C; } } } if (lbl_1_bss_34 >= 0) { var_r28 = 512.0 * fabs(lbl_1_bss_50); if (var_r28 > 127) { var_r28 = 127; } HuAudFXVolSet(lbl_1_bss_34, var_r28); var_f31 = (0.5 * (16384.0 * fabs(lbl_1_bss_50))) - 8191.0; if (var_f31 < -8191.0f) { var_f31 = -8191.0f; } else if (var_f31 > 8191.0f) { var_f31 = 8191.0f; } HuAudFXPitchSet(lbl_1_bss_34, var_f31); } for (var_r29 = 0; var_r29 < 3; var_r29++) { var_r30 = &Hu3DData[object->model[var_r29]]; if (var_r29 & 1) { var_f29 = lbl_1_bss_50; } else { var_f29 = -lbl_1_bss_50; } var_f30 = var_f29; var_r30->pos.x += var_f30; if (var_f30 < 0.0) { if (var_r30->pos.x <= -40.0f) { var_r30->pos.x += 40.0f; } } else { if (var_r30->pos.x >= 40.0f) { var_r30->pos.x -= 40.0f; } } } } void fn_1_3BE0(s16 arg0) // what happens with the argument? { UnkM410Struct4 sp1B0[128]; // TODO get size right UnkM410Struct2 *spC0[60]; // TODO get size right Vec spB4; Vec spA8; u8 sp8; f32 var_f31; f32 var_f30; f32 var_f29; UnkM410Struct2 *var_r31; UnkM410Struct2 *var_r30; s32 var_r29; UnkM410Struct2 *var_r28; u8 var_r27; s32 var_r26; s32 var_r25; s32 var_r24; omObjData *var_r23; omObjData **var_r22; var_r24 = 0; if (omPauseChk()) { return; } for (var_r25 = 0, var_r31 = lbl_1_bss_58->data, var_r29 = 0; var_r29 < 60; var_r29++, var_r31++) { if (var_r31->unk_00_field0) { spC0[var_r25++] = var_r31; var_r31->unk_10 = var_r31->unk_04; } } for (var_r29 = 0; var_r29 < var_r25; var_r29++) { var_r31 = spC0[var_r29]; var_r31->unk_00_field5 = 0; var_r31->unk_40 = 0; var_r31->unk_3C = 0; } for (var_r31 = lbl_1_bss_54->data, var_r29 = 0; var_r29 < 18; var_r29++, var_r31++) { var_r31->unk_40 = 0; var_r31->unk_10 = var_r31->unk_04; } var_f30 = 1.0f; do { for (var_r27 = 0, var_f29 = var_f30, var_r29 = 0; var_r29 < var_r25; var_r29++) { var_r30 = spC0[var_r29]; if (var_r30->unk_00_field5) { continue; } if (var_r30->unk_3C >= 8) { var_r30->unk_1C.x = var_r30->unk_1C.y = var_r30->unk_1C.z = 0.0f; continue; } var_r30->unk_00_field5 = 1; if (!var_r30->unk_00_field1) { var_f31 = fn_1_48D8(var_r30, &sp8); if (var_f31 >= 0.0f && var_f31 < var_f30) { var_r30->unk_00_field5 = 0; if (var_f31 <= var_f29) { if (var_f31 < var_f29) { var_r27 = 0; } sp1B0[var_r27].unk_00 = 0; sp1B0[var_r27].unk_08 = var_r30; sp1B0[var_r27].unk_04 = sp8; var_r27++; var_f29 = var_f31; if (!var_r30->unk_00_field3 && (sp8 & 2) && var_r30->unk_1C.y < 0.0f) { var_r30->unk_00_field3 = 1; var_r30->unk_36 = 240; } } } } for (var_r26 = 0; var_r26 < var_r25; var_r26++) { var_r28 = spC0[var_r26]; if (var_r30 != var_r28 && (var_r30->unk_40 != var_r28 || var_r28->unk_40 != var_r30) && !(var_r30->unk_00_field3 ^ var_r28->unk_00_field3)) { var_f31 = fn_1_4C04(var_r30->unk_04, var_r30->unk_1C, var_r30->unk_28, var_r28->unk_04, var_r28->unk_1C, var_r28->unk_28); if (var_f31 >= 0.0f && var_f31 < var_f30) { var_r30->unk_00_field5 = 0; if (var_f31 <= var_f29) { if (var_f31 < var_f29) { var_r27 = 0; } sp1B0[var_r27].unk_00 = 1; sp1B0[var_r27].unk_08 = var_r30; sp1B0[var_r27].unk_0C_unk = var_r28; var_r27++; var_f29 = var_f31; } } } } var_r22 = omGetGroupMemberListEx(lbl_1_bss_40, 0); for (var_r26 = 0; var_r26 < 4; var_r26++) { var_r23 = var_r22[var_r26]; if (var_r30->unk_40 != var_r23 && var_r30->unk_00_field3) { var_f31 = fn_1_55C8(var_r30->unk_04, var_r30->unk_1C, var_r30->unk_28, var_r23->trans, 30.000002f); if (var_f31 >= 0.0f && var_f31 < var_f30) { var_r30->unk_00_field5 = 0; if (var_f31 <= var_f29) { if (var_f31 < var_f29) { var_r27 = 0; } sp1B0[var_r27].unk_00 = 2; sp1B0[var_r27].unk_08 = var_r30; sp1B0[var_r27].unk_0C_obj = var_r23; var_r27++; var_f29 = var_f31; } } } } if (!var_r30->unk_00_field3) { var_r28 = lbl_1_bss_54->data; for (var_r26 = 0; var_r26 < 18; var_r26++, var_r28++) { if (var_r30->unk_40 != var_r28 || var_r28->unk_40 != var_r30) { var_f31 = fn_1_4FEC( var_r30->unk_04, var_r30->unk_1C, var_r30->unk_28, var_r28->unk_04, var_r28->unk_1C, var_r28->unk_28, var_r28->unk_2C); if (var_f31 >= 0.0f && var_f31 < var_f30) { var_r30->unk_00_field5 = 0; if (var_f31 <= var_f29) { if (var_f31 < var_f29) { var_r27 = 0; } sp1B0[var_r27].unk_00 = 3; sp1B0[var_r27].unk_08 = var_r30; sp1B0[var_r27].unk_0C_unk = var_r28; var_r27++; var_f29 = var_f31; } } } } } } if (!var_r27) { break; } for (var_r29 = 0; var_r29 < var_r25; var_r29++) { var_r31 = spC0[var_r29]; var_r31->unk_04.x += var_r31->unk_1C.x * var_f29 * var_f30; var_r31->unk_04.y += var_r31->unk_1C.y * var_f29 * var_f30; var_r31->unk_04.z += var_r31->unk_1C.z * var_f29 * var_f30; } var_r31 = lbl_1_bss_54->data; for (var_r29 = 0; var_r29 < 18; var_r29++, var_r31++) { var_r31->unk_04.x += var_r31->unk_1C.x * var_f29 * var_f30; var_r31->unk_04.y += var_r31->unk_1C.y * var_f29 * var_f30; var_r31->unk_04.z += var_r31->unk_1C.z * var_f29 * var_f30; } for (var_r29 = 0; var_r29 < var_r27; var_r29++) { switch (sp1B0[var_r29].unk_00) { case 0: fn_1_5AF4(sp1B0[var_r29].unk_08, sp1B0[var_r29].unk_04); sp1B0[var_r29].unk_08->unk_40 = NULL; sp1B0[var_r29].unk_08->unk_3C++; break; case 1: fn_1_61DC(sp1B0[var_r29].unk_08, sp1B0[var_r29].unk_0C_unk); sp1B0[var_r29].unk_08->unk_40 = sp1B0[var_r29].unk_0C_unk; sp1B0[var_r29].unk_0C_unk->unk_40 = sp1B0[var_r29].unk_08; sp1B0[var_r29].unk_08->unk_3C++; sp1B0[var_r29].unk_0C_unk->unk_3C++; break; case 2: fn_1_66B8(sp1B0[var_r29].unk_08, sp1B0[var_r29].unk_0C_unk); sp1B0[var_r29].unk_08->unk_40 = sp1B0[var_r29].unk_0C_unk; sp1B0[var_r29].unk_08->unk_3C++; break; case 3: fn_1_6364(sp1B0[var_r29].unk_08, sp1B0[var_r29].unk_0C_unk); sp1B0[var_r29].unk_08->unk_40 = sp1B0[var_r29].unk_0C_unk; sp1B0[var_r29].unk_0C_unk->unk_40 = sp1B0[var_r29].unk_08; sp1B0[var_r29].unk_08->unk_3C++; sp1B0[var_r29].unk_08->unk_44 = 2; if (VECMag(&sp1B0[var_r29].unk_08->unk_1C) > 10.0f) { HuAudFXPlay(1377); } break; } } var_f30 *= 1.0f - var_f29; var_r24++; } while (var_r24 < 100); (void)var_r24; for (var_r29 = 0; var_r29 < var_r25; var_r29++) { var_r31 = spC0[var_r29]; var_r31->unk_04.x += var_r31->unk_1C.x * var_f30; var_r31->unk_04.y += var_r31->unk_1C.y * var_f30; var_r31->unk_04.z += var_r31->unk_1C.z * var_f30; } var_r31 = lbl_1_bss_54->data; for (var_r29 = 0; var_r29 < 18; var_r29++, var_r31++) { var_r31->unk_04.x += var_r31->unk_1C.x * var_f30; var_r31->unk_04.y += var_r31->unk_1C.y * var_f30; var_r31->unk_04.z += var_r31->unk_1C.z * var_f30; } for (var_r29 = 0; var_r29 < var_r25; var_r29++) { var_r30 = spC0[var_r29]; VECSubtract(&var_r30->unk_04, &var_r30->unk_10, &spB4); var_r28 = lbl_1_bss_54->data; for (var_r26 = 0; var_r26 < 18; var_r26++, var_r28++) { VECSubtract(&var_r28->unk_04, &var_r28->unk_10, &spA8); if (fn_1_598C(&var_r30->unk_10, &spB4, var_r30->unk_28, &var_r28->unk_10, &spA8, var_r28->unk_28, var_r28->unk_2C) && !var_r30->unk_00_field1 && var_r28->unk_38 == NULL) { var_r30->unk_00_field1 = 1; var_r30->unk_38 = var_r28; var_r30->unk_36 = 10; var_r28->unk_00_field4 = 1; var_r28->unk_38 = var_r30; if (lbl_1_bss_44 != NULL) { lbl_1_bss_44(var_r30->unk_34, (var_r28->unk_34 & 1) + 1, var_r28->unk_32); if (fn_1_281C() == 2) { omVibrate(var_r30->unk_34, 12, 6, 6); HuAudFXPlay(9); HuAudFXPlay(1378); } } } } } } float fn_1_48D8(UnkM410Struct2 *arg0, u8 *arg1) { float var_f31; float var_f30; float var_f29; var_f30 = 1.0f; if (0.0f == arg0->unk_1C.x && 0.0f == arg0->unk_1C.y && 0.0f == arg0->unk_1C.z) { return -1.0f; } *arg1 = 0; if (0.0f != arg0->unk_1C.x) { if (arg0->unk_1C.x < 0.0f) { var_f29 = (-500.0f - arg0->unk_04.x + arg0->unk_28) / arg0->unk_1C.x; } else { var_f29 = (500.0f - arg0->unk_04.x - arg0->unk_28) / arg0->unk_1C.x; } var_f31 = var_f29; if (var_f31 < 0.0f) { var_f31 = 0.0f; } if (var_f31 >= 0.0f && var_f31 < 1.0f && var_f31 < var_f30) { *arg1 = 1; var_f30 = var_f31; } } if (arg0->unk_1C.y < 0.0f) { var_f31 = (-arg0->unk_04.y + arg0->unk_28) / arg0->unk_1C.y; if (var_f31 < 0.0f) { var_f31 = 0.0f; } if (var_f31 >= 0.0f && var_f31 < 1.0f) { if (var_f31 == var_f30) { *arg1 |= 2; } else if (var_f31 < var_f30) { var_f30 = var_f31; *arg1 = 2; } } } if (arg0->unk_1C.z < 0.0f) { var_f31 = (-800.0f - arg0->unk_04.z + arg0->unk_28) / arg0->unk_1C.z; if (var_f31 < 0.0f) { var_f31 = 0.0f; } if (var_f31 >= 0.0f && var_f31 < 1.0f) { if (var_f31 == var_f30) { *arg1 |= 4; } else if (var_f31 < var_f30) { *arg1 = 4; var_f30 = var_f31; } } } if (var_f30 >= 0.0f && var_f30 < 1.0f) { return var_f30; } return -1.0f; } float fn_1_4C04(Vec arg0, Vec arg1, float arg8, Vec arg2, Vec arg3, float arg9) { float var_f30; float var_f29; float var_f28; float var_f27; float var_f26; float var_f22; float var_f21; VECSubtract(&arg2, &arg0, &arg2); VECSubtract(&arg3, &arg1, &arg3); if (VECMag(&arg2) > arg9 + (arg8 + VECMag(&arg3))) { return -1.0f; } var_f22 = (arg8 + arg9) * (arg8 + arg9); var_f28 = arg3.z * arg3.z + (arg3.x * arg3.x + (arg3.y * arg3.y)); var_f27 = 2.0f * (arg3.z * arg2.z + (arg3.x * arg2.x + arg3.y * arg2.y)); var_f21 = (arg2.z * arg2.z + (arg2.x * arg2.x + arg2.y * arg2.y)) - var_f22; if (0.0f == var_f28) { return -1.0f; } var_f30 = var_f27 * var_f27 - 4.0f * var_f28 * var_f21; if (var_f30 <= 0.0f) { return -1.0f; } var_f30 = sqrtf(var_f30); var_f26 = (-var_f27 + var_f30) / (2.0f * var_f28); var_f29 = (-var_f27 - var_f30) / (2.0f * var_f28); if (var_f26 * var_f29 < 0.0f && var_f29 < 0.0f) { if (var_f26 > fabs(var_f29)) { return 0.0f; } } if (var_f29 >= 0.0f && var_f29 < 1.0f) { return var_f29; } return -1.0f; } float fn_1_4FEC(Vec arg0, Vec arg1, float arg8, Vec arg2, Vec arg3, float arg9, float argA) { float sp2C; float var_f28; float var_f26; float var_f25; float var_f24; float var_f23; float var_f22; float var_f21; float var_f18; VECSubtract(&arg0, &arg2, &arg0); VECSubtract(&arg1, &arg3, &arg1); if (VECMag(&arg0) > (arg8) + VECMag(&arg1) + arg9 + argA) { return -1.0f; } arg8 += arg9; var_f24 = VECMagXZ(&arg0); var_f23 = VECSumXZ(&arg0, &arg1) - var_f24; var_f22 = (var_f23 * var_f23) + (arg1.y * arg1.y); var_f21 = 2.0f * ((arg0.y * arg1.y) + ((-argA * var_f23) + (var_f24 * var_f23))); sp2C = (arg0.y * arg0.y + (((argA * argA) + (var_f24 * var_f24)) - (2.0f * argA * var_f24))) - (arg8 * arg8); if (0.0f == var_f22) { return -1.0f; } var_f28 = (var_f21 * var_f21) - (4.0f * var_f22 * sp2C); if (var_f28 < 0.0f) { return -1.0f; } var_f28 = sqrtf(var_f28); var_f18 = (-var_f21 + var_f28) / (2.0f * var_f22); var_f25 = (-var_f21 - var_f28) / (2.0f * var_f22); if (var_f18 * var_f25 < 0.0f && var_f25 < 0.0f) { if (var_f18 > fabs(var_f25)) { return 0.0f; } } if (var_f25 >= 0.0f && var_f25 < 1.0f) { return var_f25; } return -1.0f; } float fn_1_55C8(Vec arg0, Vec arg1, float arg8, Vec arg2, float arg9) { float var_f30; float var_f29; float var_f28; float var_f27; float var_f26; float var_f22; float var_f21; VECSubtract(&arg0, &arg2, &arg0); arg0.y = 0.0f; arg1.y = 0.0f; if (VECMag(&arg0) > arg8 + VECMag(&arg1) + arg9) { return -1.0f; } var_f22 = (arg8 + arg9) * (arg8 + arg9); var_f28 = (arg1.x * arg1.x) + (arg1.z * arg1.z); var_f27 = 2.0f * ((arg1.x * arg0.x) + (arg1.z * arg0.z)); var_f21 = ((arg0.x * arg0.x) + (arg0.z * arg0.z)) - var_f22; if (0.0f == var_f28) { return -1.0f; } var_f30 = (var_f27 * var_f27) - (4.0f * var_f28 * var_f21); if (var_f30 <= 0.0f) { return -1.0f; } var_f30 = sqrtf(var_f30); var_f26 = (-var_f27 + var_f30) / (2.0f * var_f28); var_f29 = (-var_f27 - var_f30) / (2.0f * var_f28); if (var_f26 * var_f29 < 0.0f && var_f29 < 0.0f) { if (var_f26 > fabs(var_f29)) { return 0.0f; } } if (var_f29 >= 0.0f && var_f29 < 1.0f) { return var_f29; } return -1.0f; } s32 fn_1_598C(Vec *arg0, Vec *arg1, float arg8, Vec *arg2, Vec *arg3, float arg9, float argA) { Vec sp38; Vec sp2C; Vec sp20; float var_f31; VECSubtract(arg0, arg2, &sp38); VECSubtract(arg1, arg3, &sp2C); if (VECMag(&sp38) > arg8 + VECMag(&sp2C) + arg9 + argA) { return 0; } if (sp2C.y < 0.0f) { var_f31 = -sp38.y / sp2C.y; if (var_f31 >= 0.0f && var_f31 < 1.0f) { sp20.x = var_f31 * sp2C.x + sp38.x; sp20.y = var_f31 * sp2C.y + sp38.y; sp20.z = var_f31 * sp2C.z + sp38.z; if (VECMag(&sp20) < argA) { return 1; } } } return 0; } void fn_1_5AF4(UnkM410Struct2 *arg0, u8 arg1) { if (arg1 & 1) { arg0->unk_1C.x = -arg0->unk_1C.x; } if (arg1 & 2) { arg0->unk_1C.y = -arg0->unk_1C.y; if (fabs(arg0->unk_1C.y) < 4.0) { arg0->unk_1C.y = 0.0f; } if (fabs(arg0->unk_1C.y) > 10.0) { if (arg0->unk_04.z < -400.0f) { HuAudFXPlay(1380); } else { HuAudFXPlay(1379); } } } if (arg1 & 4) { arg0->unk_1C.z = -arg0->unk_1C.z; } arg0->unk_1C.x *= 0.7f; arg0->unk_1C.y *= 0.7f; arg0->unk_1C.z *= 0.7f; } void fn_1_5CA0(Vec arg0, Vec arg1, Vec arg2, Vec *arg3, Vec *arg4) { Vec sp34; Vec sp28; Vec sp1C; Vec sp10; float var_f31; float var_f30; float var_f29; float var_f28; sp34 = arg1; var_f31 = VECMag(&sp34); if (var_f31 < 0.001f) { arg3->x = arg3->y = arg3->z = 0.0f; arg4->x = arg4->y = arg4->z = 0.0f; return; } VECNormalize(&sp34, &sp34); var_f31 *= 0.9f; VECSubtract(&arg2, &arg0, &sp28); VECNormalize(&sp28, &sp28); var_f28 = VECDotProduct(&sp34, &sp28); if (var_f28 < 0.0f) { arg3->x = arg1.x; arg3->y = arg1.y; arg3->z = arg1.z; arg4->x = arg4->y = arg4->z = 0.0f; return; } var_f29 = var_f31 * var_f28; var_f30 = var_f31 - var_f29; if (var_f30 < 0.001f) { arg3->x = arg3->y = arg3->z = 0.0f; } else { VECCrossProduct(&sp34, &sp28, &sp10); VECNormalize(&sp10, &sp10); VECCrossProduct(&sp28, &sp10, &sp1C); VECNormalize(&sp1C, &sp1C); arg3->x = sp1C.x * var_f30; arg3->y = sp1C.y * var_f30; arg3->z = sp1C.z * var_f30; } arg4->x = sp28.x * var_f29; arg4->y = sp28.y * var_f29; arg4->z = sp28.z * var_f29; } void fn_1_5EDC(UnkM410Struct2 *arg0, UnkM410Struct2 *arg1) { Vec sp14; Vec sp8; float var_f31; float var_f30; float var_f29; arg0->unk_1C.x *= 0.9f; arg0->unk_1C.y *= 0.9f; arg0->unk_1C.z *= 0.9f; VECSubtract(&arg0->unk_04, &arg1->unk_04, &sp14); VECNormalize(&sp14, &sp8); var_f30 = (arg0->unk_28 + arg1->unk_28) - VECMag(&sp14); if (var_f30 > 0.001f) { VECSubtract(&arg0->unk_1C, &arg1->unk_1C, &sp14); if (VECMag(&sp14) < 0.001f) { arg0->unk_04.x += sp8.x * var_f30; arg0->unk_04.y += sp8.y * var_f30; arg0->unk_04.z += sp8.z * var_f30; } else { VECNormalize(&sp14, &sp14); arg0->unk_04.x -= sp14.x * var_f30; arg0->unk_04.y -= sp14.y * var_f30; arg0->unk_04.z -= sp14.z * var_f30; } } var_f31 = ((-arg0->unk_1C.x * sp8.x) - (arg0->unk_1C.y * sp8.y)) - (arg0->unk_1C.z * sp8.z); if (var_f31 > 0.0f) { arg0->unk_1C.x += 2.0f * sp8.x * var_f31; arg0->unk_1C.y += 2.0f * sp8.y * var_f31; arg0->unk_1C.z += 2.0f * sp8.z * var_f31; } VECSubtract(&arg1->unk_1C, &arg0->unk_1C, &sp14); var_f29 = VECMag(&sp14); if (var_f29 < 0.001f) { return; } VECNormalize(&sp14, &sp14); var_f31 = VECDotProduct(&sp8, &sp14); if (var_f31 > 0.0f) { arg0->unk_1C.x += sp8.x * var_f31 * var_f29; arg0->unk_1C.y += sp8.y * var_f31 * var_f29; arg0->unk_1C.z += sp8.z * var_f31 * var_f29; } } void fn_1_61DC(UnkM410Struct2 *arg0, UnkM410Struct2 *arg1) { Vec sp74; Vec sp68; Vec sp5C; Vec sp50; Vec sp44; Vec sp38; Vec sp2C; Vec sp20; Vec sp14; Vec sp8; Vec *var_r29; Vec *var_r28; Vec *var_r27; Vec *var_r26; Vec *var_r25; Vec *var_r24; if (arg0->unk_00_field1 || arg1->unk_00_field1) { if (arg0->unk_00_field1) { fn_1_5EDC(arg1, arg0); } else { fn_1_5EDC(arg0, arg1); } return; } fn_1_5CA0(arg0->unk_04, arg0->unk_1C, arg1->unk_04, &sp68, &sp74); fn_1_5CA0(arg1->unk_04, arg1->unk_1C, arg0->unk_04, &sp50, &sp5C); VECAdd(&sp68, &sp5C, &arg0->unk_1C); VECAdd(&sp74, &sp50, &arg1->unk_1C); } void fn_1_6364(UnkM410Struct2 *arg0, UnkM410Struct2 *arg1) { Vec sp20; Vec sp14; Vec sp8; float var_f31; float var_f30; arg0->unk_1C.x *= 0.7f; arg0->unk_1C.y *= 0.7f; arg0->unk_1C.z *= 0.7f; VECSubtract(&arg0->unk_04, &arg1->unk_04, &sp14); sp14.y = 0.0f; VECNormalize(&sp14, &sp14); sp20.x = sp14.x * arg1->unk_2C + arg1->unk_04.x; sp20.y = arg1->unk_04.y; sp20.z = sp14.z * arg1->unk_2C + arg1->unk_04.z; VECSubtract(&arg0->unk_04, &sp20, &sp14); VECNormalize(&sp14, &sp8); var_f31 = (arg0->unk_28 + arg1->unk_28) - VECMag(&sp14); if (var_f31 > 0.001f) { VECSubtract(&arg0->unk_1C, &arg1->unk_1C, &sp14); if (VECMag(&sp14) < 0.001f) { arg0->unk_04.x += sp8.x * var_f31; arg0->unk_04.y += sp8.y * var_f31; arg0->unk_04.z += sp8.z * var_f31; } else { VECNormalize(&sp14, &sp14); arg0->unk_04.x -= sp14.x * var_f31; arg0->unk_04.y -= sp14.y * var_f31; arg0->unk_04.z -= sp14.z * var_f31; } } var_f30 = -arg0->unk_1C.x * sp8.x - arg0->unk_1C.y * sp8.y - arg0->unk_1C.z * sp8.z; if (var_f30 > 0.0f) { arg0->unk_1C.x += 2.0f * sp8.x * var_f30; arg0->unk_1C.y += 2.0f * sp8.y * var_f30; arg0->unk_1C.z += 2.0f * sp8.z * var_f30; } VECSubtract(&arg1->unk_1C, &arg0->unk_1C, &sp14); var_f31 = VECMag(&sp14); if (!(var_f31 < 0.001f)) { VECNormalize(&sp14, &sp14); var_f30 = VECDotProduct(&sp8, &sp14); if (var_f30 > 0.0f) { arg0->unk_1C.x += sp8.x * var_f30 * var_f31; arg0->unk_1C.y += sp8.y * var_f30 * var_f31; arg0->unk_1C.z += sp8.z * var_f30 * var_f31; } } } void fn_1_66B8(UnkM410Struct2 *arg0, UnkM410Struct2 *arg1) // TODO maybe UnkM410Struct3? { Vec spC; float var_f31; VECSubtract(&arg0->unk_04, (Vec *)&arg1->unk_10.z, &spC); spC.y = 0.0f; VECNormalize(&spC, &spC); var_f31 = -arg0->unk_1C.x * spC.x - arg0->unk_1C.z * spC.z; arg0->unk_1C.x += 2.0f * spC.x * var_f31; arg0->unk_1C.z += 2.0f * spC.z * var_f31; arg0->unk_1C.x *= 0.5f; arg0->unk_1C.y *= 0.5f; arg0->unk_1C.z *= 0.5f; } void fn_1_67D4(omObjData *arg0) { s32 var_r30; UnkM410Struct2 *var_r29; s16 var_r28; arg0->stat |= 0x100; var_r29 = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(UnkM410Struct2) * 60, MEMORY_DEFAULT_NUM); arg0->data = var_r29; memset(var_r29, 0, 4320); for (var_r30 = 0; var_r30 < 60; var_r30++, var_r29++) { var_r29->unk_32 = var_r30; var_r29->unk_34 = var_r30 / 15; if ((var_r30 % 15) == 0) { arg0->model[var_r30] = Hu3DModelCreateFile(lbl_1_data_DC[GWPlayerCfg[var_r29->unk_34].character]); var_r28 = arg0->model[var_r30]; } else { arg0->model[var_r30] = Hu3DModelLink(var_r28); } var_r29->unk_30 = arg0->model[var_r30]; Hu3DModelAttrSet(arg0->model[var_r30], HU3D_ATTR_DISPOFF); Hu3DModelShadowSet(arg0->model[var_r30]); } arg0->func = fn_1_6968; } void fn_1_6968(omObjData *object) { Mtx sp14; Vec sp8; float var_f31; float var_f30; UnkM410Struct2 *var_r31; s32 var_r30; ModelData *var_r28; var_r31 = object->data; for (var_r30 = 0; var_r30 < 60; var_r30++, var_r31++) { if (!var_r31->unk_00_field0) { Hu3DModelAttrSet(var_r31->unk_30, HU3D_ATTR_DISPOFF); continue; } if (var_r31->unk_00_field1) { Hu3DModelObjPosGet(var_r31->unk_38->unk_30, "i_hook", &sp8); VECSubtract(&sp8, &var_r31->unk_04, &sp8); if (var_r31->unk_36 != 0) { var_f31 = cosd(90.0f * var_r31->unk_36 / 10.0f); var_r31->unk_1C.x = var_f31 * sp8.x; var_r31->unk_1C.y = var_f31 * sp8.y; var_r31->unk_1C.z = var_f31 * sp8.z; var_r31->unk_36--; } else { var_r31->unk_1C = sp8; } } else { var_r31->unk_1C.y += -0.95277786f; if (var_r31->unk_00_field3 && (fn_1_281C() != 4 || (fn_1_281C() == 4 && var_r31->unk_36 < 15))) { if (--var_r31->unk_36 == 0) { var_r31->unk_00_field0 = 0; } if (var_r31->unk_36 < 15) { var_r31->unk_00_field2 ^= 1; } } if (!var_r31->unk_44) { if (0.0f != var_r31->unk_1C.x || 0.0f != var_r31->unk_1C.z) { sp8.x = var_r31->unk_1C.z; sp8.y = 0.0f; sp8.z = -var_r31->unk_1C.x; var_f30 = VECMag(&sp8) / 30.000002f; if (var_f30 >= 0.001f) { MTXRotAxisRad(sp14, &sp8, var_f30); var_r28 = &Hu3DData[object->model[var_r30]]; MTXConcat(sp14, var_r28->unk_F0, var_r28->unk_F0); } } } else { var_r31->unk_44--; } } if (var_r31->unk_00_field2) { Hu3DModelAttrReset(var_r31->unk_30, HU3D_ATTR_DISPOFF); } else { Hu3DModelAttrSet(var_r31->unk_30, HU3D_ATTR_DISPOFF); } Hu3DModelPosSet(object->model[var_r30], var_r31->unk_04.x, var_r31->unk_04.y, var_r31->unk_04.z); } if (fn_1_281C() > 2 && fn_1_28DC() == 1) { var_r31 = lbl_1_bss_58->data; for (var_r30 = 0; var_r30 < 60; var_r30++, var_r31++) { if (var_r31->unk_00_field0) { fn_1_7520(&var_r31->unk_04); Hu3DModelAttrSet(var_r31->unk_30, HU3D_ATTR_DISPOFF); var_r31->unk_00_field0 = 0; } } lbl_1_bss_58->func = NULL; Hu3DModelAttrReset(lbl_1_bss_38, HU3D_ATTR_DISPOFF); fn_1_287C(4); } } void fn_1_6D84(omObjData *object) { HuMemDirectFree(object->data); } s32 lbl_1_data_104[] = { DATA_MAKE_NUM(DATADIR_M410, 8), DATA_MAKE_NUM(DATADIR_M410, 9), DATA_MAKE_NUM(DATADIR_M410, 8) }; void fn_1_6DB4(omObjData *object) { UnkM410Struct2 *var_r31; s32 var_r29; s16 var_r28; object->stat |= 0x100; var_r31 = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(UnkM410Struct2) * 18, MEMORY_DEFAULT_NUM); object->data = var_r31; memset(var_r31, 0, sizeof(UnkM410Struct2) * 18); for (var_r29 = 0; var_r29 < 18; var_r29++, var_r31++) { var_r31->unk_34 = var_r29 / 6; object->model[var_r29] = Hu3DModelCreateFile(lbl_1_data_104[var_r31->unk_34]); var_r28 = object->model[var_r29]; (void)var_r28; Hu3DModelAttrSet(object->model[var_r29], HU3D_MOTATTR_PAUSE); Hu3DData[object->model[var_r29]].cluster_attr[0] = 0; var_r31->unk_30 = object->model[var_r29]; var_r31->unk_32 = var_r29; var_r31->unk_04.x = (250.0f * (var_r29 % 6)) - 750.0f; if ((var_r31->unk_34 & 1) == 0) { var_r31->unk_04.x += 125.0f; } var_r31->unk_04.y = 140.0f + (140.0f * var_r31->unk_34); var_r31->unk_04.z = -700.0f; var_r31->unk_28 = 1.0f; var_r31->unk_2C = 50.0f; Hu3DModelPosSet(object->model[var_r29], var_r31->unk_04.x, var_r31->unk_04.y, var_r31->unk_04.z); if (!var_r29) { object->model[var_r29 + 0x12] = Hu3DModelCreateFile(DATA_MAKE_NUM(DATADIR_M410, 10)); } else { object->model[var_r29 + 0x12] = Hu3DModelLink(object->model[18]); } Hu3DModelShadowMapSet(object->model[var_r29 + 18]); Hu3DModelPosSet(object->model[var_r29 + 18], var_r31->unk_04.x, var_r31->unk_04.y, var_r31->unk_04.z); if (!var_r29) { object->model[var_r29 + 36] = Hu3DModelCreateFile(DATA_MAKE_NUM(DATADIR_M410, 11)); } else { object->model[var_r29 + 36] = Hu3DModelLink(object->model[36]); } Hu3DModelPosSet(object->model[var_r29 + 0x24], 20.0f + var_r31->unk_04.x, -10.0f + var_r31->unk_04.y, var_r31->unk_04.z); } object->func = fn_1_7138; } void fn_1_7138(omObjData *object) { float var_f31; UnkM410Struct2 *var_r31; s32 var_r29; var_r31 = object->data; for (var_r29 = 0; var_r29 < 18; var_r29++, var_r31++) { if (var_r31->unk_34 & 1) { var_f31 = lbl_1_bss_50; } else { var_f31 = -lbl_1_bss_50; } var_r31->unk_1C.x = var_f31; if (var_r31->unk_00_field4) { Hu3DModelAttrReset(object->model[var_r29], HU3D_MOTATTR_PAUSE); Hu3DMotionSpeedSet(object->model[var_r29], 4.0f); Hu3DMotionSet(object->model[var_r29], 0); Hu3DMotionClusterNoSet(object->model[var_r29], Hu3DData[object->model[var_r29]].unk_10[0], 0); Hu3DData[object->model[var_r29]].unk_B4[0] = 4.0f; var_r31->unk_00_field4 = 0; } if (var_r31->unk_1C.x < 0.0f) { if (var_r31->unk_04.x < -750.0f) { var_r31->unk_04.x += 1500.0f; var_r31->unk_00_field6 = 1; } } else if (var_r31->unk_04.x > 750.0f) { var_r31->unk_04.x -= 1500.0f; var_r31->unk_00_field6 = 1; } if (var_r31->unk_00_field6) { if (var_r31->unk_38 != NULL) { var_r31->unk_38->unk_00_field0 = 0; var_r31->unk_38 = NULL; Hu3DMotionClusterNoSet(object->model[var_r29], Hu3DData[object->model[var_r29]].unk_10[0], 0); Hu3DData[object->model[var_r29]].unk_B4[0] = 0.0f; } var_r31->unk_00_field6 = 0; } Hu3DModelPosSet(object->model[var_r29], var_r31->unk_04.x, var_r31->unk_04.y, var_r31->unk_04.z); Hu3DModelPosSet(object->model[var_r29 + 18], var_r31->unk_04.x, var_r31->unk_04.y, var_r31->unk_04.z); Hu3DModelPosSet(object->model[var_r29 + 36], 20.0f + var_r31->unk_04.x, -10.0f + var_r31->unk_04.y, var_r31->unk_04.z); } } void fn_1_7464(omObjData *object) { HuMemDirectFree(object->data); } void fn_1_7494(void) { AnimData *var_r31; var_r31 = HuSprAnimRead(HuDataReadNum(DATA_MAKE_NUM(DATADIR_EFFECT, 2), MEMORY_DEFAULT_NUM)); lbl_1_bss_38 = Hu3DParticleCreate(var_r31, 60); Hu3DParticleHookSet(lbl_1_bss_38, fn_1_75A0); Hu3DModelAttrSet(lbl_1_bss_38, HU3D_ATTR_DISPOFF); } void fn_1_7520(Vec *arg0) { ParticleData *var_r30; HsfanimStruct01 *var_r31; var_r30 = Hu3DData[lbl_1_bss_38].unk_120; var_r31 = &var_r30->unk_48[var_r30->unk_02++]; var_r31->unk2C = 100.0f; var_r31->unk34.x = arg0->x; var_r31->unk34.y = arg0->y; var_r31->unk34.z = arg0->z; } s32 lbl_1_data_110 = 60; void fn_1_75A0(ModelData *model, ParticleData *particle, Mtx matrix) { HsfanimStruct01 *var_r30; s32 var_r29; s32 var_r28; if (!particle->unk_00) { particle->unk_00 = 1; var_r30 = &particle->unk_48[particle->unk_02]; for (var_r29 = particle->unk_02; var_r29 < particle->unk_30; var_r29++, var_r30++) { var_r30->unk2C = 0.0f; } } var_r28 = (lbl_1_data_110 * 0xFF) / 60; var_r30 = particle->unk_48; for (var_r29 = 0; var_r29 < particle->unk_02; var_r29++, var_r30++) { var_r30->unk40.a = var_r28; // 43? } if (--lbl_1_data_110 == 0) { model->attr |= 1; } DCStoreRange(particle->unk_48, particle->unk_30 * 0x44); } s32 fn_1_76B8(Vec arg0, Vec arg1, u16 arg2) { UnkM410Struct2 *var_r31 = lbl_1_bss_58->data; s32 var_r30; var_r31 = &var_r31[arg2 * 15]; for (var_r30 = 0; var_r30 < 15; var_r30++, var_r31++) { if (!var_r31->unk_00_field0) { *(s16 *)var_r31 = 0; var_r31->unk_00_field0 = 1; var_r31->unk_00_field2 = 1; var_r31->unk_04 = arg0; var_r31->unk_1C = arg1; var_r31->unk_28 = 30.000002f; var_r31->unk_38 = NULL; var_r31->unk_36 = 0; return 1; } } return 0; } void fn_1_77A4(u16 arg0, u16 arg1, u16 arg2) { OSReport("GOAL!!(%d , %d , %d)\n", arg0, arg1, arg2); } void fn_1_77E8(void *arg0) { lbl_1_bss_44 = arg0; } void fn_1_77F8(u16 arg0, Vec *arg1) { UnkM410Struct2 *var_r31; var_r31 = &((UnkM410Struct2 *)lbl_1_bss_54->data)[arg0]; arg1->x = var_r31->unk_04.x; arg1->y = var_r31->unk_04.y; arg1->z = var_r31->unk_04.z; } void fn_1_7840(u16 arg0, Vec *arg1) { UnkM410Struct2 *var_r31; var_r31 = &((UnkM410Struct2 *)lbl_1_bss_54->data)[arg0]; arg1->x = var_r31->unk_1C.x; arg1->y = var_r31->unk_1C.y; arg1->z = var_r31->unk_1C.z; } void fn_1_7888(u16 arg0, u16 arg1, Vec *arg2) { Vec sp8; UnkM410Struct2 *var_r31; var_r31 = &((UnkM410Struct2 *)lbl_1_bss_54->data)[arg0]; sp8.x = var_r31->unk_04.x + var_r31->unk_1C.x * arg1; sp8.y = var_r31->unk_04.y + var_r31->unk_1C.y * arg1; sp8.z = var_r31->unk_04.z + var_r31->unk_1C.z * arg1; if (var_r31->unk_1C.x < 0.0f) { while (sp8.x < -750.0f) { sp8.x += 1500.0f; } } else { while (sp8.x > 750.0f) { sp8.x -= 1500.0f; } } arg2->x = sp8.x; arg2->y = sp8.y; arg2->z = sp8.z; } s32 fn_1_79F8(s16 arg0, char *arg1, Mtx arg2) { Mtx sp44; Mtx sp14; HsfData *var_r30; ModelData *var_r31; var_r31 = &Hu3DData[arg0]; var_r30 = var_r31->hsfData; lbl_1_bss_30 = 0; mtxRot(sp14, var_r31->rot.x, var_r31->rot.y, var_r31->rot.z); MTXScale(sp44, var_r31->scale.x, var_r31->scale.y, var_r31->scale.z); MTXConcat(sp14, sp44, sp44); mtxTransCat(sp44, var_r31->pos.x, var_r31->pos.y, var_r31->pos.z); fn_1_7AC4(var_r30->root, sp44, arg1, arg2); return lbl_1_bss_30; } void fn_1_7AC4(HsfObject *arg0, Mtx arg1, char *arg2, Mtx arg3) { Mtx sp15C; Mtx sp12C; Mtx spFC; Mtx spCC; Mtx sp9C; Mtx sp6C; Mtx sp3C; Mtx spC; HsfTransform *var_r31; HsfTransform *var_r30; HsfTransform *var_r29; HsfTransform *var_r28; HsfObject *var_r27; HsfObject *var_r26; HsfObject *var_r25; u32 var_r23; u32 var_r22; u32 var_r21; u32 var_r20; if (lbl_1_bss_30) { return; } var_r31 = &arg0->data.curr; mtxRot(sp12C, var_r31->rot.x, var_r31->rot.y, var_r31->rot.z); MTXScale(sp15C, var_r31->scale.x, var_r31->scale.y, var_r31->scale.z); MTXConcat(sp12C, sp15C, sp15C); mtxTransCat(sp15C, var_r31->pos.x, var_r31->pos.y, var_r31->pos.z); MTXConcat(arg1, sp15C, sp15C); if (!strcmp(arg2, arg0->name)) { MTXCopy(sp15C, arg3); lbl_1_bss_30 = 1; } for (var_r23 = 0; var_r23 < arg0->data.childrenCount; var_r23++) { var_r27 = arg0->data.children[var_r23]; if (!lbl_1_bss_30) { var_r30 = &var_r27->data.curr; mtxRot(spFC, var_r30->rot.x, var_r30->rot.y, var_r30->rot.z); MTXScale(spCC, var_r30->scale.x, var_r30->scale.y, var_r30->scale.z); MTXConcat(spFC, spCC, spCC); mtxTransCat(spCC, var_r30->pos.x, var_r30->pos.y, var_r30->pos.z); MTXConcat(sp15C, spCC, spCC); if (!strcmp(arg2, var_r27->name)) { MTXCopy(spCC, arg3); lbl_1_bss_30 = 1; } for (var_r22 = 0; var_r22 < var_r27->data.childrenCount; var_r22++) { var_r26 = var_r27->data.children[var_r22]; if (!lbl_1_bss_30) { var_r29 = &var_r26->data.curr; mtxRot(sp9C, var_r29->rot.x, var_r29->rot.y, var_r29->rot.z); MTXScale(sp6C, var_r29->scale.x, var_r29->scale.y, var_r29->scale.z); MTXConcat(sp9C, sp6C, sp6C); mtxTransCat(sp6C, var_r29->pos.x, var_r29->pos.y, var_r29->pos.z); MTXConcat(spCC, sp6C, sp6C); if (!strcmp(arg2, var_r26->name)) { MTXCopy(sp6C, arg3); lbl_1_bss_30 = 1; } for (var_r21 = 0; var_r21 < var_r26->data.childrenCount; var_r21++) { var_r25 = var_r26->data.children[var_r21]; if (!lbl_1_bss_30) { var_r28 = &var_r25->data.curr; mtxRot(sp3C, var_r28->rot.x, var_r28->rot.y, var_r28->rot.z); MTXScale(spC, var_r28->scale.x, var_r28->scale.y, var_r28->scale.z); MTXConcat(sp3C, spC, spC); mtxTransCat(spC, var_r28->pos.x, var_r28->pos.y, var_r28->pos.z); MTXConcat(sp6C, spC, spC); if (!strcmp(arg2, var_r25->name)) { MTXCopy(spC, arg3); lbl_1_bss_30 = 1; } for (var_r20 = 0; var_r20 < var_r25->data.childrenCount; var_r20++) { fn_1_7AC4(var_r25->data.children[var_r20], spC, arg2, arg3); } } } } } } } }