1322 lines
42 KiB
C
1322 lines
42 KiB
C
#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_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;
|
|
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|