658 lines
20 KiB
C
658 lines
20 KiB
C
#include "datadir_enum.h"
|
|
#include "ext_math.h"
|
|
#include "game/audio.h"
|
|
#include "game/chrman.h"
|
|
#include "game/gamework_data.h"
|
|
#include "game/hsfman.h"
|
|
#include "game/hsfmotion.h"
|
|
#include "game/memory.h"
|
|
#include "game/object.h"
|
|
#include "game/pad.h"
|
|
#include "string.h"
|
|
|
|
#include "REL/m460Dll.h"
|
|
|
|
#ifndef __MWERKS__
|
|
#include "game/frand.h"
|
|
#endif
|
|
|
|
typedef struct UnkData110Struct {
|
|
/* 0x00 */ u16 unk_00;
|
|
/* 0x04 */ float unk_04;
|
|
/* 0x08 */ float unk_08;
|
|
/* 0x0C */ float unk_0C;
|
|
/* 0x10 */ u32 unk_10;
|
|
} UnkData110Struct; /* size = 0x14 */
|
|
|
|
typedef struct UnkM460DllPlayerWork {
|
|
s32 unk_00;
|
|
s32 unk_04;
|
|
s32 unk_08;
|
|
s32 unk_0C;
|
|
s32 unk_10;
|
|
u32 unk_14;
|
|
u32 unk_18;
|
|
float unk_1C;
|
|
float unk_20;
|
|
s32 unk_24;
|
|
s32 unk_28;
|
|
u16 unk_2C;
|
|
s32 unk_30;
|
|
char unk34[0x4];
|
|
s16 unk_38;
|
|
char unk3A[6];
|
|
s32 unk_40;
|
|
float unk_44;
|
|
float unk_48;
|
|
float unk_4C;
|
|
float unk_50;
|
|
float unk_54;
|
|
s32 unk_58;
|
|
float unk_5C;
|
|
Vec unk_60;
|
|
Vec unk_6C;
|
|
Vec unk_78;
|
|
s32 unk_84;
|
|
} UnkM460DllPlayerWork; /* size = 0x88 */
|
|
|
|
void fn_1_4C08(omObjData *object);
|
|
void fn_1_4F6C(omObjData *object);
|
|
void fn_1_5168(omObjData *object);
|
|
void fn_1_55EC(omObjData *object);
|
|
void fn_1_57D8(omObjData *object);
|
|
s32 fn_1_58C8(omObjData *object, float arg8, float arg9);
|
|
void fn_1_5A14(omObjData *object);
|
|
void fn_1_5C88(omObjData *object);
|
|
void fn_1_5CE0(omObjData *object, u32 arg1);
|
|
s32 fn_1_5E6C(omObjData *object);
|
|
void fn_1_60B0(omObjData *object);
|
|
void fn_1_61F4(omObjData *object);
|
|
|
|
u32 lbl_1_data_F0[8] = { 0, 2, 3, 0x590015, 0x59000D, 0x17, 0x18, 0x1A };
|
|
struct UnkData110Struct lbl_1_data_110[8] = {
|
|
{ 0, 0.2f, 0.0f, -1.0f, 0x40000001 },
|
|
{ 1, 0.2f, 0.0f, -1.0f, 0x40000001 },
|
|
{ 2, 0.2f, 0.0f, -1.0f, 0x40000001 },
|
|
{ 3, 0.2f, 0.0f, -1.0f, 0x40000001 },
|
|
{ 4, 0.2f, 0.0f, -1.0f, 0 },
|
|
{ 5, 0.2f, 0.0f, -1.0f, 0 },
|
|
{ 6, 0.2f, 0.0f, -1.0f, 0 },
|
|
{ 7, 0.2f, 0.0f, -1.0f, 0x40000001 },
|
|
};
|
|
|
|
omObjData *lbl_1_bss_40[1];
|
|
omObjData *lbl_1_bss_3C;
|
|
s32 lbl_1_bss_38[1];
|
|
|
|
void fn_1_49A0(Process *process)
|
|
{
|
|
u32 spC[1];
|
|
u32 sp8[1];
|
|
|
|
s16 var_r31;
|
|
s16 var_r30;
|
|
u32 var_r29;
|
|
omObjData *var_r27;
|
|
|
|
for (var_r31 = 0; var_r31 < 1; var_r31++) {
|
|
spC[var_r31] = GWPlayerCfg[var_r31].group;
|
|
sp8[var_r31] = var_r31;
|
|
}
|
|
for (var_r31 = 0; var_r31 < 0; var_r31++) {
|
|
for (var_r30 = var_r31 + 1; var_r30 < 1; var_r30++) {
|
|
if (spC[var_r31] > spC[var_r30]) {
|
|
var_r29 = spC[var_r31];
|
|
spC[var_r31] = spC[var_r30];
|
|
spC[var_r30] = var_r29;
|
|
var_r29 = sp8[var_r31];
|
|
sp8[var_r31] = sp8[var_r30];
|
|
sp8[var_r30] = var_r29;
|
|
}
|
|
}
|
|
}
|
|
for (var_r31 = 0; var_r31 < 1; var_r31++) {
|
|
lbl_1_bss_38[sp8[var_r31]] = var_r31;
|
|
}
|
|
omMakeGroupEx(process, 0, 1);
|
|
omGetGroupMemberListEx(process, 0);
|
|
for (var_r31 = 0; var_r31 < 1; var_r31++) {
|
|
var_r27 = lbl_1_bss_40[var_r31] = omAddObjEx(process, 0x28, 1, 8, 0, fn_1_4C08);
|
|
var_r27->work[0] = var_r31;
|
|
}
|
|
lbl_1_bss_3C = omAddObjEx(process, 0x28, 1, 5, -1, fn_1_60B0);
|
|
}
|
|
|
|
void fn_1_4BE4(void)
|
|
{
|
|
CharModelKill(-1);
|
|
}
|
|
|
|
void fn_1_4C08(omObjData *object)
|
|
{
|
|
UnkM460DllPlayerWork *var_r31;
|
|
s32 var_r29;
|
|
|
|
float sp8[4] = { 0.25f, 0.5f, 0.75f, 1.0f };
|
|
Vec sp18[4] = {
|
|
{ 0.0f, 0.0f, 300.0f },
|
|
{ -450.0f, 0.0f, -50.0f },
|
|
{ 0.0f, 0.0f, -350.0f },
|
|
{ 450.0f, 0.0f, -50.0f },
|
|
};
|
|
object->data = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(UnkM460DllPlayerWork), MEMORY_DEFAULT_NUM);
|
|
var_r31 = object->data;
|
|
memset(var_r31, 0, sizeof(UnkM460DllPlayerWork));
|
|
object->stat |= 0x100;
|
|
var_r31->unk_00 = GWPlayerCfg[object->work[0]].character;
|
|
var_r31->unk_08 = lbl_1_bss_38[object->work[0]];
|
|
fn_1_41B4(object->work[0], var_r31->unk_08, var_r31->unk_00);
|
|
var_r31->unk_54 = sp8[GWPlayerCfg[object->work[0]].diff & 3];
|
|
var_r31->unk_24 = GWPlayerCfg[object->work[0]].iscom;
|
|
object->model[0] = CharModelCreate(var_r31->unk_00, 2);
|
|
Hu3DModelLayerSet(object->model[0], 1);
|
|
CharModelLayerSetAll(2);
|
|
Hu3DModelShadowSet(object->model[0]);
|
|
for (var_r29 = 0; var_r29 < 8; var_r29++) {
|
|
if (lbl_1_data_F0[var_r29] < 0x10000) {
|
|
object->motion[var_r29] = CharModelMotionCreate(var_r31->unk_00, lbl_1_data_F0[var_r29]);
|
|
}
|
|
else {
|
|
object->motion[var_r29] = Hu3DJointMotionFile(object->model[0], var_r31->unk_00 + lbl_1_data_F0[var_r29]);
|
|
}
|
|
}
|
|
CharModelMotionDataClose(var_r31->unk_00);
|
|
CharModelEffectNpcInitSilent(object->model[0], object->motion[3], 1);
|
|
object->trans.x = var_r31->unk_60.x = sp18[var_r31->unk_08].x;
|
|
object->trans.y = var_r31->unk_60.y = sp18[var_r31->unk_08].y;
|
|
object->trans.z = var_r31->unk_60.z = sp18[var_r31->unk_08].z;
|
|
var_r31->unk_44 = var_r31->unk_48 = 0.0f;
|
|
var_r31->unk_4C = 0.0f;
|
|
var_r31->unk_50 = 0.02f;
|
|
var_r31->unk_5C = 50.0f;
|
|
var_r31->unk_58 = 0;
|
|
var_r31->unk_2C = 0;
|
|
var_r31->unk_04 = -1;
|
|
fn_1_5CE0(object, 0);
|
|
var_r31->unk_84 = -1;
|
|
object->func = fn_1_4F6C;
|
|
}
|
|
|
|
void fn_1_4F6C(omObjData *object)
|
|
{
|
|
UnkM460DllPlayerWork *var_r31;
|
|
s32 var_r29;
|
|
|
|
var_r31 = object->data;
|
|
var_r31->unk_14 = var_r31->unk_18 = 0;
|
|
var_r31->unk_0C = var_r31->unk_10 = 0;
|
|
var_r31->unk_1C = 0.0f;
|
|
var_r31->unk_20 = 0.0f;
|
|
switch (var_r31->unk_2C) {
|
|
case 0:
|
|
var_r31->unk_44 = var_r31->unk_48 = 180.0f;
|
|
var_r31->unk_60.x = 0.0f;
|
|
var_r31->unk_60.y = 0.0f;
|
|
var_r31->unk_60.z = -450.0f;
|
|
fn_1_5CE0(object, 7);
|
|
var_r31->unk_2C = 1;
|
|
var_r31->unk_30 = 0;
|
|
break;
|
|
case 1:
|
|
if (fn_1_414C() == 1) {
|
|
var_r31->unk_60.x = 0.0f;
|
|
var_r31->unk_60.y = 0.0f;
|
|
var_r31->unk_60.z = -100.0f;
|
|
var_r31->unk_78.x = 0.0f;
|
|
var_r31->unk_78.y = 0.0f;
|
|
var_r31->unk_78.z = -450.0f;
|
|
var_r31->unk_2C = 2;
|
|
var_r31->unk_30 = 0;
|
|
}
|
|
break;
|
|
case 2:
|
|
var_r29 = fn_1_58C8(object, 0.5f, 20.0f);
|
|
fn_1_5A14(object);
|
|
if (var_r29 != 0) {
|
|
var_r31->unk_2C = 3;
|
|
var_r31->unk_30 = 0;
|
|
}
|
|
break;
|
|
}
|
|
VECAdd(&var_r31->unk_60, &var_r31->unk_6C, &var_r31->unk_60);
|
|
fn_1_57D8(object);
|
|
if (fn_1_414C() == 2) {
|
|
var_r31->unk_2C = 0;
|
|
object->func = fn_1_5168;
|
|
}
|
|
}
|
|
|
|
void fn_1_5168(omObjData *object)
|
|
{
|
|
UnkM460DllPlayerWork *var_r31;
|
|
s32 var_r29;
|
|
u32 var_r28;
|
|
s32 var_r27;
|
|
|
|
var_r31 = object->data;
|
|
var_r27 = 0;
|
|
{
|
|
Vec sp20[2] = {
|
|
{ -250.0f, 0.0f, -900.0f },
|
|
{ 250.0f, 0.0f, -900.0f },
|
|
};
|
|
|
|
Vec sp8[2] = {
|
|
{ -250.0f, 0.0f, -1400.0f },
|
|
{ 250.0f, 0.0f, -1400.0f },
|
|
};
|
|
var_r31->unk_14 = var_r31->unk_18 = 0;
|
|
var_r31->unk_0C = var_r31->unk_10 = 0;
|
|
var_r31->unk_1C = 0.0f;
|
|
var_r31->unk_20 = 0.0f;
|
|
if (fn_1_4164() == 2) {
|
|
if (var_r31->unk_24 != 0) {
|
|
fn_1_5C88(object);
|
|
}
|
|
else {
|
|
if (HuPadTrigL[GWPlayerCfg[object->work[0]].pad_idx] > 0x28) {
|
|
var_r31->unk_14 = 1;
|
|
}
|
|
if (HuPadTrigR[GWPlayerCfg[object->work[0]].pad_idx] > 0x28) {
|
|
var_r31->unk_18 = 1;
|
|
}
|
|
}
|
|
}
|
|
switch (var_r31->unk_2C) {
|
|
case 0:
|
|
if (fn_1_4370() != 0) {
|
|
var_r31->unk_60.x = -140.0f;
|
|
var_r31->unk_60.y = 0.0f;
|
|
var_r31->unk_60.z = -150.0f;
|
|
}
|
|
var_r31->unk_78.x = 0.0f;
|
|
var_r31->unk_78.y = 0.0f;
|
|
var_r31->unk_78.z = -450.0f;
|
|
var_r31->unk_40 = 3;
|
|
var_r31->unk_2C = 4;
|
|
case 4:
|
|
var_r29 = fn_1_58C8(object, 0.5f, 20.0f);
|
|
fn_1_5A14(object);
|
|
if ((var_r29 != 0) && (fn_1_4164() == 2)) {
|
|
var_r31->unk_48 = 180.0f;
|
|
var_r31->unk_6C.x = var_r31->unk_6C.y = var_r31->unk_6C.z = 0.0f;
|
|
var_r31->unk_2C = 5;
|
|
}
|
|
break;
|
|
case 5:
|
|
var_r29 = 0;
|
|
fn_1_5A14(object);
|
|
if (CharModelMotionShiftIDGet(var_r31->unk_00) < 0) {
|
|
var_r29 = 1;
|
|
}
|
|
var_r28 = fn_1_42F0();
|
|
if (var_r28 == 3) {
|
|
if (var_r29 != 0) {
|
|
if (var_r31->unk_14 != 0) {
|
|
var_r28 = 0;
|
|
}
|
|
else if (var_r31->unk_18 != 0) {
|
|
var_r28 = 1;
|
|
}
|
|
if (var_r28 != 3) {
|
|
fn_1_42BC(var_r28);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
var_r31->unk_40 = var_r28;
|
|
var_r31->unk_78 = sp20[var_r31->unk_40];
|
|
var_r31->unk_2C = 6;
|
|
}
|
|
break;
|
|
case 6:
|
|
var_r29 = fn_1_58C8(object, 1.0f, 20.0f);
|
|
fn_1_5A14(object);
|
|
if (var_r29 != 0) {
|
|
fn_1_4308();
|
|
var_r31->unk_48 = 180.0f;
|
|
var_r31->unk_6C.x = var_r31->unk_6C.y = var_r31->unk_6C.z = 0.0f;
|
|
var_r31->unk_2C = 7;
|
|
}
|
|
break;
|
|
case 7:
|
|
fn_1_5A14(object);
|
|
if (fn_1_4358() != 0) {
|
|
if (fn_1_419C() == 0) {
|
|
var_r31->unk_78 = sp8[var_r31->unk_40];
|
|
var_r31->unk_2C = 8;
|
|
}
|
|
else {
|
|
var_r27 = 1;
|
|
}
|
|
}
|
|
break;
|
|
case 8:
|
|
var_r29 = fn_1_58C8(object, 0.5f, 20.0f);
|
|
fn_1_5A14(object);
|
|
|
|
default:
|
|
if (fn_1_4164() == 1) {
|
|
var_r31->unk_2C = 0;
|
|
}
|
|
var_r27 = 1;
|
|
break;
|
|
}
|
|
}
|
|
VECAdd(&var_r31->unk_60, &var_r31->unk_6C, &var_r31->unk_60);
|
|
fn_1_57D8(object);
|
|
if ((fn_1_4164() == 5) && (var_r27 != 0)) {
|
|
var_r31->unk_2C = 0;
|
|
object->func = fn_1_55EC;
|
|
}
|
|
}
|
|
|
|
void fn_1_55EC(omObjData *object)
|
|
{
|
|
Vec sp8;
|
|
UnkM460DllPlayerWork *var_r31;
|
|
s32 var_r29;
|
|
|
|
var_r31 = object->data;
|
|
var_r29 = 0;
|
|
switch (var_r31->unk_2C) {
|
|
case 0:
|
|
fn_1_41F4(object->work[0]);
|
|
fn_1_5CE0(object, 4);
|
|
sp8 = var_r31->unk_60;
|
|
sp8.y += 160.0f;
|
|
var_r31->unk_2C = 9;
|
|
break;
|
|
case 9:
|
|
if (fn_1_5E6C(object) != 0) {
|
|
var_r31->unk_78.x = 0.0f;
|
|
var_r31->unk_78.y = 0.0f;
|
|
var_r31->unk_78.z = 500.0f;
|
|
fn_1_4224(object->work[0]);
|
|
HuAudCharVoicePlay(var_r31->unk_00, 0x128);
|
|
var_r31->unk_28 = 1;
|
|
var_r31->unk_2C = 0xA;
|
|
}
|
|
break;
|
|
case 10:
|
|
var_r29 = fn_1_58C8(object, 1.0f, 20.0f);
|
|
fn_1_5A14(object);
|
|
if (var_r29 != 0) {
|
|
var_r31->unk_6C.x = var_r31->unk_6C.y = var_r31->unk_6C.z = 0.0f;
|
|
var_r31->unk_2C = 0xB;
|
|
}
|
|
break;
|
|
case 11:
|
|
fn_1_5CE0(object, 0);
|
|
break;
|
|
}
|
|
VECAdd(&var_r31->unk_60, &var_r31->unk_6C, &var_r31->unk_60);
|
|
fn_1_57D8(object);
|
|
if (var_r31->unk_84 >= 0) {
|
|
sp8 = var_r31->unk_60;
|
|
sp8.y += 160.0f;
|
|
HuAudFXEmiterUpDate(var_r31->unk_84, &sp8);
|
|
}
|
|
}
|
|
|
|
void fn_1_57D8(omObjData *object)
|
|
{
|
|
UnkM460DllPlayerWork *var_r31 = object->data;
|
|
var_r31->unk_38++;
|
|
var_r31->unk_30++;
|
|
object->trans.x = var_r31->unk_60.x;
|
|
object->trans.y = var_r31->unk_60.y;
|
|
object->trans.z = var_r31->unk_60.z;
|
|
var_r31->unk_4C = var_r31->unk_4C + var_r31->unk_50;
|
|
if (var_r31->unk_4C > 0.45f) {
|
|
var_r31->unk_4C = 0.45f;
|
|
}
|
|
var_r31->unk_44 = fn_1_47D0(var_r31->unk_44, var_r31->unk_48, var_r31->unk_4C);
|
|
object->rot.y = var_r31->unk_44;
|
|
Hu3DModelPosSetV(object->model[0], &var_r31->unk_60);
|
|
Hu3DModelRotSet(object->model[0], 0.0f, var_r31->unk_44, 0.0f);
|
|
}
|
|
|
|
s32 fn_1_58C8(omObjData *object, float arg8, float arg9)
|
|
{
|
|
Vec spC;
|
|
float var_f31;
|
|
UnkM460DllPlayerWork *var_r31;
|
|
s32 var_r30;
|
|
|
|
var_r31 = object->data;
|
|
var_r30 = 0;
|
|
VECSubtract(&var_r31->unk_78, &var_r31->unk_60, &spC);
|
|
spC.y = 0.0f;
|
|
var_f31 = VECMag(&spC);
|
|
if (var_f31 < arg9) {
|
|
var_f31 = 0.0f;
|
|
var_r30 = 1;
|
|
}
|
|
else {
|
|
if (VECMag(&spC) >= 100.0f) {
|
|
var_f31 = 100.0f;
|
|
}
|
|
var_f31 = 0.2f + (0.008f * var_f31);
|
|
}
|
|
var_r31->unk_1C = atan2d(spC.x, spC.z);
|
|
var_r31->unk_20 = var_f31;
|
|
if (var_r31->unk_20 > arg8) {
|
|
var_r31->unk_20 = arg8;
|
|
}
|
|
return var_r30;
|
|
}
|
|
|
|
void fn_1_5A14(omObjData *object)
|
|
{
|
|
float var_f31;
|
|
float var_f30;
|
|
|
|
UnkM460DllPlayerWork *var_r31 = object->data;
|
|
if (var_r31->unk_20 > 0.0f) {
|
|
var_r31->unk_48 = var_r31->unk_1C;
|
|
}
|
|
if (var_r31->unk_20 > 0.05f) {
|
|
// 1 / REFRESH_RATE?
|
|
var_r31->unk_6C.x = 0.01666666753590107 * (550.0 * (var_r31->unk_20 * sind(var_r31->unk_1C)));
|
|
var_r31->unk_6C.z = 0.01666666753590107 * (550.0 * (var_r31->unk_20 * cosd(var_r31->unk_1C)));
|
|
if (var_r31->unk_28 != 0) {
|
|
var_r31->unk_6C.x *= 1.5f;
|
|
var_r31->unk_6C.z *= 1.5f;
|
|
}
|
|
var_r31->unk_4C = 0.2f;
|
|
var_r31->unk_50 = 0.0f;
|
|
if (CharModelMotionShiftIDGet(var_r31->unk_00) < 0) {
|
|
var_f31 = 0.5f;
|
|
if (var_r31->unk_04 == 2) {
|
|
var_f31 = 0.45f;
|
|
}
|
|
if (var_r31->unk_20 > var_f31) {
|
|
if (var_r31->unk_28 != 0) {
|
|
fn_1_5CE0(object, 3);
|
|
}
|
|
else {
|
|
fn_1_5CE0(object, 2);
|
|
}
|
|
var_f30 = var_r31->unk_20;
|
|
}
|
|
else {
|
|
fn_1_5CE0(object, 1);
|
|
var_f30 = var_r31->unk_20 / var_f31;
|
|
}
|
|
CharModelMotionSpeedSet(var_r31->unk_00, var_f30);
|
|
}
|
|
}
|
|
else {
|
|
var_r31->unk_6C.x = var_r31->unk_6C.y = var_r31->unk_6C.z = 0.0f;
|
|
if (CharModelMotionShiftIDGet(var_r31->unk_00) < 0) {
|
|
fn_1_5CE0(object, 0);
|
|
}
|
|
}
|
|
}
|
|
|
|
void fn_1_5C88(omObjData *object)
|
|
{
|
|
UnkM460DllPlayerWork *var_r31 = object->data;
|
|
if (frandmod(0x3E8) < 0x1F4) {
|
|
var_r31->unk_14 = 1;
|
|
return;
|
|
}
|
|
var_r31->unk_18 = 1;
|
|
}
|
|
|
|
void fn_1_5CE0(omObjData *object, u32 arg1)
|
|
{
|
|
UnkM460DllPlayerWork *var_r30 = object->data;
|
|
if ((var_r30->unk_04 != arg1) && (arg1 < 8)) {
|
|
float var_f31 = 60.0f * lbl_1_data_110[arg1].unk_04;
|
|
if (var_r30->unk_04 < 0) {
|
|
var_f31 = 0.0f;
|
|
}
|
|
var_r30->unk_04 = arg1;
|
|
CharModelMotionShiftSet(
|
|
var_r30->unk_00, object->motion[lbl_1_data_110[arg1].unk_00], 60.0f * lbl_1_data_110[arg1].unk_08, var_f31, lbl_1_data_110[arg1].unk_10);
|
|
if (lbl_1_data_110[arg1].unk_0C >= 0.0f) {
|
|
Hu3DMotionShiftStartEndSet(object->model[0], 60.0f * lbl_1_data_110[arg1].unk_08, 60.0f * lbl_1_data_110[arg1].unk_0C);
|
|
}
|
|
}
|
|
}
|
|
|
|
s32 fn_1_5E6C(omObjData *object)
|
|
{
|
|
M460DllCameraStruct *var_r31 = object->data;
|
|
s32 var_r30 = 0;
|
|
if ((CharModelMotionEndCheck(var_r31->unk_00) != 0) && (CharModelMotionShiftIDGet(var_r31->unk_00) < 0)) {
|
|
var_r30 = 1;
|
|
}
|
|
return var_r30;
|
|
}
|
|
|
|
s32 fn_1_5EE0(omObjData *object, u32 arg1)
|
|
{
|
|
s32 var_r27 = 0;
|
|
if (fn_1_5E6C(object)) {
|
|
fn_1_5CE0(object, arg1);
|
|
var_r27 = 1;
|
|
}
|
|
return var_r27;
|
|
}
|
|
|
|
s32 lbl_1_data_1D4[5] = {
|
|
DATA_MAKE_NUM(DATADIR_M460, 0x1E),
|
|
DATA_MAKE_NUM(DATADIR_M460, 0x1F),
|
|
DATA_MAKE_NUM(DATADIR_M460, 0x20),
|
|
DATA_MAKE_NUM(DATADIR_M460, 0x21),
|
|
DATA_MAKE_NUM(DATADIR_M460, 0x22),
|
|
};
|
|
|
|
void fn_1_60B0(omObjData *object)
|
|
{
|
|
s32 var_r30;
|
|
s32 var_r29;
|
|
|
|
omSetTra(object, 0.0f, 0.0f, 0.0f);
|
|
var_r30 = Hu3DModelCreateFile(DATA_MAKE_NUM(DATADIR_M460, 0x1D));
|
|
object->model[0] = var_r30;
|
|
Hu3DModelLayerSet(var_r30, 1);
|
|
Hu3DModelShadowSet(var_r30);
|
|
Hu3DModelAttrSet(var_r30, HU3D_ATTR_DISPOFF);
|
|
for (var_r29 = 0; var_r29 < 5; var_r29++) {
|
|
object->motion[var_r29] = Hu3DJointMotionFile(var_r30, lbl_1_data_1D4[var_r29]);
|
|
}
|
|
CharModelEffectNpcInitSilent(var_r30, object->motion[1], 0);
|
|
CharModelEffectNpcInitSilent(var_r30, object->motion[2], 1);
|
|
CharModelEffectNpcInitSilent(var_r30, object->motion[3], 1);
|
|
object->work[1] = 0;
|
|
object->func = fn_1_61F4;
|
|
}
|
|
|
|
void fn_1_61F4(omObjData *object)
|
|
{
|
|
float var_f31;
|
|
float var_f30;
|
|
s32 var_r30;
|
|
s32 var_r29;
|
|
|
|
Vec sp1C[2] = {
|
|
{ -250.0f, 0.0f, -2200.0f },
|
|
{ 250.0f, 0.0f, -2200.0f },
|
|
};
|
|
Vec sp10;
|
|
s32 sp8[2] = { 6, 21 };
|
|
switch (object->work[1]) {
|
|
case 0:
|
|
if ((fn_1_4164() == 3) && (fn_1_419C() != 0) && (fn_1_4324() != 0)) {
|
|
Hu3DModelAttrReset(object->model[0], HU3D_ATTR_DISPOFF);
|
|
Hu3DMotionShiftSet(object->model[0], object->motion[0], 0.0f, 0.0f, HU3D_MOTATTR_LOOP);
|
|
var_r30 = fn_1_42F0();
|
|
object->trans.x = sp1C[var_r30].x;
|
|
object->trans.y = sp1C[var_r30].y;
|
|
object->trans.z = sp1C[var_r30].z;
|
|
object->rot.y = 0.0f;
|
|
object->work[1] = 1;
|
|
object->work[2] = 0;
|
|
}
|
|
break;
|
|
case 1:
|
|
object->work[2]++;
|
|
if (object->work[2] > 18.0f) {
|
|
Hu3DMotionShiftSet(object->model[0], object->motion[2], 0.0f, 30.0f, HU3D_MOTATTR_LOOP);
|
|
object->work[1] = 2;
|
|
}
|
|
break;
|
|
case 2:
|
|
sp10.x = (*lbl_1_bss_40)->trans.x - object->trans.x;
|
|
sp10.y = 0.0f;
|
|
sp10.z = (*lbl_1_bss_40)->trans.z - object->trans.z;
|
|
object->rot.y = fn_1_47D0(object->rot.y, atan2d(sp10.x, sp10.z), 0.1f);
|
|
object->trans.z += 6.666667f;
|
|
if (fn_1_4358() != 0) {
|
|
HuAudFXPlay(0x3C);
|
|
Hu3DMotionShiftSet(object->model[0], object->motion[3], 0.0f, 30.0f, HU3D_MOTATTR_LOOP);
|
|
object->work[1] = 3;
|
|
object->work[3] = 0x3C;
|
|
}
|
|
break;
|
|
case 3:
|
|
Hu3DMotionSpeedSet(object->model[0], 0.9f);
|
|
var_r29 = Hu3DMotionTimeGet(object->model[0]);
|
|
for (var_r30 = 0; var_r30 < 2; var_r30++) {
|
|
if (var_r29 == sp8[var_r30]) {
|
|
var_f30 = 2.1166666f * object->work[3];
|
|
HuAudFXPlayVol(0x6B, var_f30);
|
|
}
|
|
}
|
|
sp10.x = (*lbl_1_bss_40)->trans.x - object->trans.x;
|
|
sp10.y = 0.0f;
|
|
sp10.z = (*lbl_1_bss_40)->trans.z - object->trans.z;
|
|
object->rot.y = fn_1_47D0(object->rot.y, atan2d(sp10.x, sp10.z), 0.1f);
|
|
if (object->trans.z < -900.0f) {
|
|
// depending on refresh rate?
|
|
object->trans.z += 11.666667f;
|
|
}
|
|
else {
|
|
var_f31 = VECMag(&sp10);
|
|
if (var_f31 < 20.0f) {
|
|
var_f31 = 0.0f;
|
|
}
|
|
else {
|
|
if (VECMag(&sp10) >= 100.0f) {
|
|
var_f31 = 100.0f;
|
|
}
|
|
var_f31 = 0.2f + (0.008f * var_f31);
|
|
var_f31 *= 11.666667f;
|
|
}
|
|
object->trans.x = object->trans.x + (var_f31 * sind(object->rot.y));
|
|
object->trans.z = object->trans.z + (var_f31 * cosd(object->rot.y));
|
|
}
|
|
if ((object->trans.z > 450.0f) && (object->work[3] != 0)) {
|
|
object->work[3]--;
|
|
}
|
|
break;
|
|
}
|
|
}
|