* Port some of hsfload.c * More byteswaps in hsfload.c * Finish hsfload besides cenv * hsfload fixes * Some x64 improvements * More x64 improvements * 64 bit improvements * Link in lots of files * Fix armem bug * Fix dll killing, load modeseldll * Fixes, clearing TODOs * Tons of warning/error fixes * Linux build fixes * Add -fPIC flag to fix build on x64 linux * GXSETARRAY sizes and misc fixes * More fixes * Build all RELs * Implement C_Quat functions * Fix PAL build
809 lines
24 KiB
C
809 lines
24 KiB
C
#include "game/hsfdraw.h"
|
|
#include "game/hsfman.h"
|
|
#include "game/object.h"
|
|
#include "game/objsub.h"
|
|
|
|
#include "game/hsfmotion.h"
|
|
#include "game/pad.h"
|
|
|
|
#include "REL/m455Dll.h"
|
|
#include "game/audio.h"
|
|
#include "game/chrman.h"
|
|
#include "game/frand.h"
|
|
#include "game/gamework_data.h"
|
|
#include "game/minigame_seq.h"
|
|
#include "game/wipe.h"
|
|
|
|
#include "ext_math.h"
|
|
#include "math.h"
|
|
|
|
#ifndef __MWERKS__
|
|
#include "game/esprite.h"
|
|
#endif
|
|
|
|
typedef struct camera_view_params {
|
|
float zoom;
|
|
Vec pos;
|
|
Vec rot;
|
|
} CameraViewParams;
|
|
|
|
CameraViewParams lbl_1_data_0[2] = { { 500, { 0, 1000, 0 }, { 40, 0, 0 } }, { 1985, { 0, 300, 0 }, { -6, 0, 0 } } };
|
|
Vec lbl_1_data_38 = { 700, 2500, -700 };
|
|
Vec lbl_1_data_44 = { 0, 0, 0 };
|
|
GXColor lbl_1_data_50 = { 255, 255, 255, 255 };
|
|
Vec lbl_1_data_54 = { 200, 15000, -200 };
|
|
Vec lbl_1_data_60 = { 0, 1, 0 };
|
|
|
|
omObjData *lbl_1_bss_40;
|
|
omObjData *lbl_1_bss_3C;
|
|
omObjData *lbl_1_bss_38;
|
|
s32 lbl_1_bss_34;
|
|
s32 lbl_1_bss_30;
|
|
s32 lbl_1_bss_2C;
|
|
s32 lbl_1_bss_28;
|
|
s16 lbl_1_bss_26;
|
|
s16 lbl_1_bss_24;
|
|
s16 lbl_1_bss_22;
|
|
s16 lbl_1_bss_20;
|
|
s16 lbl_1_bss_18[4];
|
|
s16 lbl_1_bss_16;
|
|
s16 lbl_1_bss_14;
|
|
Vec lbl_1_bss_8;
|
|
s16 lbl_1_bss_4;
|
|
s32 lbl_1_bss_0;
|
|
|
|
void fn_1_330(omObjData *object);
|
|
void fn_1_B94(Process *objman);
|
|
void fn_1_2A90(Process *objman);
|
|
|
|
void ObjectSetup(void)
|
|
{
|
|
Process *objman;
|
|
CameraData *camera = &Hu3DCamera[0];
|
|
s16 light;
|
|
OSReport("******* M455ObjectSetup *********\n");
|
|
objman = omInitObjMan(50, 8192);
|
|
omGameSysInit(objman);
|
|
Hu3DCameraCreate(HU3D_CAM0);
|
|
Hu3DCameraPerspectiveSet(HU3D_CAM0, -1, 20, 25000, 1.2f);
|
|
Hu3DCameraViewportSet(HU3D_CAM0, 0, 0, 640, 480, 0, 1);
|
|
lbl_1_bss_3C = omAddObjEx(objman, 32730, 0, 0, -1, omOutView);
|
|
lbl_1_bss_8.x = lbl_1_data_44.x - lbl_1_data_38.x;
|
|
lbl_1_bss_8.y = lbl_1_data_44.y - lbl_1_data_38.y;
|
|
lbl_1_bss_8.z = lbl_1_data_44.z - lbl_1_data_38.z;
|
|
VECNormalize(&lbl_1_bss_8, &lbl_1_bss_8);
|
|
light = Hu3DGLightCreateV(&lbl_1_data_38, &lbl_1_bss_8, &lbl_1_data_50);
|
|
Hu3DGLightInfinitytSet(light);
|
|
Hu3DGLightStaticSet(light, 1);
|
|
Hu3DShadowCreate(10, camera->nnear, camera->ffar);
|
|
Hu3DShadowTPLvlSet(0.7f);
|
|
Hu3DShadowPosSet(&lbl_1_data_54, &lbl_1_data_60, &lbl_1_data_44);
|
|
HuAudSndGrpSet(77);
|
|
lbl_1_bss_38 = omAddObjEx(objman, 0, 0, 0, -1, fn_1_330);
|
|
fn_1_2A90(objman);
|
|
fn_1_B94(objman);
|
|
fn_1_32C4(objman);
|
|
}
|
|
|
|
void fn_1_310(s32 arg0)
|
|
{
|
|
lbl_1_bss_34 = arg0;
|
|
}
|
|
|
|
s32 fn_1_320(void)
|
|
{
|
|
return lbl_1_bss_34;
|
|
}
|
|
|
|
void fn_1_478(omObjData *object);
|
|
|
|
void fn_1_330(omObjData *object)
|
|
{
|
|
CameraData *camera = &Hu3DCamera[0];
|
|
lbl_1_bss_34 = 0;
|
|
lbl_1_bss_2C = 60;
|
|
lbl_1_bss_30 = -1;
|
|
lbl_1_bss_26 = 30;
|
|
lbl_1_bss_24 = 60;
|
|
lbl_1_bss_22 = -1;
|
|
lbl_1_bss_20 = 0;
|
|
lbl_1_bss_16 = ((frand16() * 270.0f) / 65536.0f) + 30.0f;
|
|
WipeCreate(WIPE_MODE_IN, WIPE_TYPE_NORMAL, 60);
|
|
camera->fov = 30.0f;
|
|
object->func = fn_1_478;
|
|
}
|
|
|
|
void fn_1_B38(omObjData *object);
|
|
void fn_1_C28(void);
|
|
s32 fn_1_C90(void);
|
|
|
|
typedef struct m455_player {
|
|
u8 field0 : 1;
|
|
u8 field1 : 1;
|
|
u8 field2 : 1;
|
|
s16 unk2;
|
|
s16 unk4;
|
|
s8 unk6;
|
|
s8 unk7;
|
|
u16 unk8;
|
|
u16 unkA;
|
|
s32 unkC;
|
|
s16 unk10;
|
|
s16 unk12;
|
|
s16 unk14;
|
|
s16 unk16;
|
|
s32 unk18;
|
|
s32 unk1C;
|
|
u32 unk20;
|
|
s16 unk24;
|
|
s16 unk26;
|
|
s16 unk28;
|
|
s16 unk2A;
|
|
s16 unk2C;
|
|
s16 unk2E;
|
|
s16 unk30;
|
|
Vec unk34[2];
|
|
Vec unk4C;
|
|
s16 unk58;
|
|
s32 unk5C[4];
|
|
} M455Player;
|
|
|
|
s16 lbl_1_data_90 = -1;
|
|
s32 lbl_1_data_94 = -1;
|
|
s32 lbl_1_data_98 = -1;
|
|
|
|
void fn_1_478(omObjData *object)
|
|
{
|
|
s32 i;
|
|
omObjData **playerList;
|
|
M455Player *player;
|
|
|
|
switch (fn_1_320()) {
|
|
case 0:
|
|
if (lbl_1_data_98 < 0) {
|
|
lbl_1_data_98 = HuAudFXPlay(1985);
|
|
}
|
|
if (--lbl_1_bss_2C == 0) {
|
|
fn_1_310(1);
|
|
lbl_1_bss_2C = 120;
|
|
}
|
|
break;
|
|
|
|
case 1:
|
|
if (--lbl_1_bss_2C == 0) {
|
|
fn_1_310(2);
|
|
lbl_1_bss_4 = MGSeqStartCreate();
|
|
}
|
|
break;
|
|
|
|
case 2:
|
|
if (!MGSeqStatGet(lbl_1_bss_4)) {
|
|
fn_1_310(3);
|
|
}
|
|
if (lbl_1_data_94 < 0 && (MGSeqStatGet(lbl_1_bss_4) & 0x10)) {
|
|
lbl_1_data_94 = HuAudSeqPlay(60);
|
|
}
|
|
break;
|
|
|
|
case 3:
|
|
if (--lbl_1_bss_24 == 0) {
|
|
lbl_1_bss_26--;
|
|
if (lbl_1_data_90 >= 0) {
|
|
MGSeqParamSet(lbl_1_data_90, 1, lbl_1_bss_26);
|
|
}
|
|
lbl_1_bss_24 = 60;
|
|
if (lbl_1_bss_26 == 10) {
|
|
lbl_1_data_90 = MGSeqTimerCreate(10);
|
|
}
|
|
}
|
|
if (lbl_1_bss_16 >= 0) {
|
|
lbl_1_bss_16--;
|
|
}
|
|
if (lbl_1_bss_26 == 0 || fn_1_C90()) {
|
|
fn_1_310(4);
|
|
lbl_1_bss_4 = MGSeqFinishCreate();
|
|
HuAudSeqFadeOut(lbl_1_data_94, 100);
|
|
}
|
|
break;
|
|
|
|
case 4:
|
|
if (lbl_1_data_90 >= 0) {
|
|
MGSeqParamSet(lbl_1_data_90, 2, -1);
|
|
lbl_1_data_90 = -1;
|
|
}
|
|
if (!MGSeqStatGet(lbl_1_bss_4)) {
|
|
fn_1_310(7);
|
|
lbl_1_bss_2C = 120;
|
|
}
|
|
break;
|
|
|
|
case 7:
|
|
if (--lbl_1_bss_2C == 0) {
|
|
fn_1_310(9);
|
|
if (lbl_1_bss_30 >= 0) {
|
|
HuAudSStreamPlay(1);
|
|
playerList = omGetGroupMemberListEx(HuPrcCurrentGet(), 0);
|
|
for (i = 0; i < 4; i++) {
|
|
player = playerList[i]->data;
|
|
if (player->unk28 < 0) {
|
|
GWPlayerCoinWinSet(i, lbl_1_bss_22 + 1);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
HuAudSStreamPlay(4);
|
|
for (i = 0; i < 4; i++) {
|
|
GWPlayerCoinWinSet(i, 3);
|
|
}
|
|
}
|
|
lbl_1_bss_2C = 210;
|
|
}
|
|
break;
|
|
|
|
case 9:
|
|
if (--lbl_1_bss_2C == 0) {
|
|
WipeCreate(WIPE_MODE_OUT, WIPE_TYPE_NORMAL, 60);
|
|
HuAudFXStop(lbl_1_data_98);
|
|
object->func = fn_1_B38;
|
|
}
|
|
break;
|
|
}
|
|
if (lbl_1_bss_20) {
|
|
if (lbl_1_bss_20 >= 2) {
|
|
for (i = 0; i < 100; i++) {
|
|
s32 srcIdx = (frand8() * lbl_1_bss_20) >> 8;
|
|
s32 dstIdx = (frand8() * lbl_1_bss_20) >> 8;
|
|
s32 temp = lbl_1_bss_18[srcIdx];
|
|
lbl_1_bss_18[srcIdx] = lbl_1_bss_18[dstIdx];
|
|
lbl_1_bss_18[dstIdx] = temp;
|
|
}
|
|
}
|
|
playerList = omGetGroupMemberListEx(HuPrcCurrentGet(), 0);
|
|
for (i = 0; i < lbl_1_bss_20; i++) {
|
|
lbl_1_bss_22++;
|
|
GWPlayerCoinWinSet(lbl_1_bss_18[i], lbl_1_bss_22);
|
|
player = playerList[lbl_1_bss_18[i]]->data;
|
|
player->unk28 = lbl_1_bss_22;
|
|
}
|
|
lbl_1_bss_20 = 0;
|
|
}
|
|
if (omSysExitReq && !WipeStatGet()) {
|
|
WipeCreate(WIPE_MODE_OUT, WIPE_TYPE_NORMAL, 60);
|
|
object->func = fn_1_B38;
|
|
}
|
|
}
|
|
|
|
void fn_1_B38(omObjData *object)
|
|
{
|
|
if (WipeStatGet()) {
|
|
return;
|
|
}
|
|
fn_1_C28();
|
|
fn_1_340C();
|
|
MGSeqKillAll();
|
|
HuAudFadeOut(1);
|
|
omOvlReturnEx(1, 1);
|
|
OSReport("******* M455Exit *********\n");
|
|
}
|
|
|
|
void fn_1_D14(omObjData *object);
|
|
|
|
void fn_1_B94(Process *objman)
|
|
{
|
|
s32 i;
|
|
lbl_1_bss_28 = 0;
|
|
lbl_1_bss_14 = 3;
|
|
omMakeGroupEx(objman, 0, 4);
|
|
for (i = 0; i < 4; i++) {
|
|
omAddObjEx(objman, 5, 10, 50, 0, fn_1_D14);
|
|
}
|
|
}
|
|
|
|
void fn_1_2010(omObjData *object);
|
|
|
|
void fn_1_C28(void)
|
|
{
|
|
s32 i;
|
|
omObjData **playerList;
|
|
playerList = omGetGroupMemberListEx(HuPrcCurrentGet(), 0);
|
|
if (playerList == NULL) {
|
|
return;
|
|
}
|
|
for (i = 0; i < 4; i++) {
|
|
fn_1_2010(playerList[i]);
|
|
}
|
|
}
|
|
|
|
s32 fn_1_C90(void)
|
|
{
|
|
s32 i;
|
|
omObjData **playerList;
|
|
playerList = omGetGroupMemberListEx(HuPrcCurrentGet(), 0);
|
|
for (i = 0; i < 4; i++) {
|
|
M455Player *player = playerList[i]->data;
|
|
if (!player->field1) {
|
|
return 0;
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
s32 fn_1_3214(void);
|
|
|
|
u32 lbl_1_data_E0[5][2] = {
|
|
DATA_MAKE_NUM(DATADIR_MARIOMOT, 0x00),
|
|
0,
|
|
0x540024,
|
|
1,
|
|
0x54001C,
|
|
1,
|
|
DATA_MAKE_NUM(DATADIR_MARIOMOT, 0x17),
|
|
0,
|
|
DATA_MAKE_NUM(DATADIR_MARIOMOT, 0x18),
|
|
0,
|
|
};
|
|
|
|
Vec lbl_1_data_108[4] = {
|
|
{ -300, 0, -100 },
|
|
{ -100, 0, -100 },
|
|
{ 100, 0, -100 },
|
|
{ 300, 0, -100 },
|
|
};
|
|
|
|
void fn_1_1444(omObjData *object);
|
|
|
|
void fn_1_2060(ModelData *arg0, Mtx arg1);
|
|
|
|
void fn_1_D14(omObjData *object)
|
|
{
|
|
M455Player *player;
|
|
s32 charNo;
|
|
u32 i;
|
|
player = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(M455Player), MEMORY_DEFAULT_NUM);
|
|
object->data = player;
|
|
memset(player, 0, sizeof(M455Player));
|
|
player->unk2 = lbl_1_bss_28++;
|
|
player->unk4 = GWPlayerCfg[player->unk2].pad_idx;
|
|
player->unkC = fn_1_3214();
|
|
charNo = GWPlayerCfg[player->unk2].character;
|
|
player->unk10 = charNo;
|
|
player->unk12 = GWPlayerCfg[player->unk2].diff;
|
|
player->unk14 = GWPlayerCfg[player->unk2].group;
|
|
object->model[0] = CharModelCreate(charNo, 8);
|
|
Hu3DModelShadowSet(object->model[0]);
|
|
Hu3DModelLayerSet(object->model[0], 3);
|
|
Hu3DModelCameraSet(object->model[0], HU3D_CAM0);
|
|
object->model[1] = Hu3DModelCreateFile(0x540002);
|
|
Hu3DModelHookSet(object->model[0], "test11_tex_we-itemhook-r", object->model[1]);
|
|
Hu3DModelAttrSet(object->model[1], HU3D_MOTATTR_SHAPE_PAUSE | HU3D_MOTATTR_PAUSE);
|
|
player->unk1C = 1;
|
|
for (i = 0; i < 5; i++) {
|
|
if (lbl_1_data_E0[i][1] == 0) {
|
|
object->motion[i] = CharModelMotionCreate(player->unk10, lbl_1_data_E0[i][0]);
|
|
}
|
|
else {
|
|
object->motion[i] = CharModelMotionCreate(player->unk10, player->unk10 + lbl_1_data_E0[i][0]);
|
|
}
|
|
}
|
|
Hu3DMotionSet(object->model[0], object->motion[player->unk1C]);
|
|
Hu3DModelAttrSet(object->model[0], HU3D_MOTATTR_LOOP);
|
|
object->trans.x = lbl_1_data_108[player->unk2].x;
|
|
object->trans.y = lbl_1_data_108[player->unk2].y;
|
|
object->trans.z = lbl_1_data_108[player->unk2].z;
|
|
player->unk2A = espEntry(0x54000C, 0x8000, 0);
|
|
espDispOff(player->unk2A);
|
|
object->model[3] = Hu3DHookFuncCreate(fn_1_2060);
|
|
Hu3DModelLayerSet(object->model[3], 3);
|
|
Hu3DModelCameraSet(object->model[3], HU3D_CAM0);
|
|
Hu3DData[object->model[3]].unk_120 = object;
|
|
object->model[4] = Hu3DModelCreateFile(0x54000A);
|
|
Hu3DModelLayerSet(object->model[4], 3);
|
|
Hu3DModelCameraSet(object->model[4], HU3D_CAM0);
|
|
Hu3DModelShadowSet(object->model[4]);
|
|
i = Hu3DMotionCreateFile(0x54000B);
|
|
Hu3DMotionSet(object->model[4], i);
|
|
Hu3DModelAttrSet(object->model[4], HU3D_MOTATTR_LOOP);
|
|
Hu3DModelAttrSet(object->model[4], HU3D_MOTATTR_PAUSE);
|
|
player->unk4C.x = object->trans.x + (50.0f * ((((s32)frand() & 0x1FF) - 256.0f) / 256.0f));
|
|
player->unk4C.y = -200;
|
|
player->unk4C.z = -1500;
|
|
Hu3DModelPosSetV(object->model[4], &player->unk4C);
|
|
Hu3DModelAttrSet(object->model[4], HU3D_ATTR_DISPOFF);
|
|
player->unk34[0].x = object->trans.x;
|
|
player->unk34[0].y = 0;
|
|
player->unk34[0].z = -500;
|
|
player->unk34[1].x = object->trans.x;
|
|
player->unk34[1].y = -200;
|
|
player->unk34[1].z = -1000;
|
|
CharModelDataClose(player->unk10);
|
|
object->rot.y = 180;
|
|
if (((s32)frand() & 0x1F) < 4 - player->unk12) {
|
|
player->unk58 = lbl_1_bss_16 - (60.0f * (0.05f * (4 - player->unk12))) - ((frand8() / 256.0f) * 6.0f);
|
|
if (player->unk58 < 0) {
|
|
player->unk58 = 0;
|
|
}
|
|
}
|
|
else {
|
|
player->unk58 = lbl_1_bss_16 + (60.0f * (0.1f * (4 - player->unk12))) + ((frand8() / 256.0f) * 30.0f) + 6.0f;
|
|
}
|
|
player->unk28 = -1;
|
|
object->func = fn_1_1444;
|
|
}
|
|
|
|
void fn_1_1400(omObjData *object)
|
|
{
|
|
M455Player *player = object->data;
|
|
if (player->unk58 != 0) {
|
|
player->unk58--;
|
|
}
|
|
else {
|
|
player->unkA |= PAD_BUTTON_A;
|
|
}
|
|
}
|
|
|
|
float lbl_1_data_154[4] = { -350, -170, 170, 350 };
|
|
|
|
float lbl_1_data_164[3] = { 1.5f, 1.0f, 0.5f };
|
|
|
|
float fn_1_2390(float arg0, float arg1, float arg2);
|
|
s32 fn_1_24F0(Vec *arg0, Vec *arg1, float arg2);
|
|
|
|
void fn_1_1444(omObjData *object)
|
|
{
|
|
M455Player *temp_r31;
|
|
s32 temp_r29;
|
|
u32 temp_r28;
|
|
Vec sp24[3];
|
|
Vec sp18;
|
|
Vec spC;
|
|
float temp_f31;
|
|
|
|
temp_r31 = object->data;
|
|
temp_r29 = temp_r31->unk1C;
|
|
temp_r28 = temp_r31->unk20;
|
|
object->trans.y = fn_1_687C();
|
|
if (fn_1_320() < 3) {
|
|
return;
|
|
}
|
|
switch (temp_r31->unk16) {
|
|
case 0:
|
|
if (fn_1_320() == 4 || lbl_1_bss_14 == 0) {
|
|
temp_r31->field1 = 1;
|
|
temp_r31->unk16 = 2;
|
|
espDispOff(temp_r31->unk2A);
|
|
return;
|
|
}
|
|
if (!GWPlayerCfg[temp_r31->unk2].iscom) {
|
|
temp_r31->unk6 = HuPadStkX[temp_r31->unk4];
|
|
temp_r31->unk7 = HuPadStkY[temp_r31->unk4];
|
|
temp_r31->unk8 = HuPadBtn[temp_r31->unk4];
|
|
temp_r31->unkA = HuPadBtnDown[temp_r31->unk4];
|
|
}
|
|
else {
|
|
temp_r31->unk8 = temp_r31->unkA = 0;
|
|
temp_r31->unk6 = temp_r31->unk7 = 0;
|
|
fn_1_1400(object);
|
|
}
|
|
if (lbl_1_bss_16 == 0) {
|
|
if (temp_r31->unkC) {
|
|
omVibrate(temp_r31->unk2, 12, 12, 0);
|
|
}
|
|
else {
|
|
sp18.x = object->trans.x;
|
|
sp18.y = object->trans.y + 300;
|
|
sp18.z = object->trans.z;
|
|
Hu3D3Dto2D(&sp18, HU3D_CAM0, &sp18);
|
|
espPosSet(temp_r31->unk2A, sp18.x, sp18.y);
|
|
espDispOn(temp_r31->unk2A);
|
|
temp_r31->unk30 = 0;
|
|
}
|
|
temp_r31->unk2C = temp_r31->unk2E = 30;
|
|
}
|
|
|
|
if (temp_r31->unkA & PAD_BUTTON_A) {
|
|
temp_r31->unk16 = 1;
|
|
temp_r31->unk24 = temp_r31->unk26 = 90;
|
|
temp_r31->unk2C = -1;
|
|
if (lbl_1_bss_16 <= 0) {
|
|
lbl_1_bss_18[lbl_1_bss_20++] = temp_r31->unk2;
|
|
}
|
|
Hu3DModelAttrReset(object->model[1], HU3D_MOTATTR_SHAPE_PAUSE | HU3D_MOTATTR_PAUSE);
|
|
Hu3DMotionSpeedSet(object->model[1], 1.2f);
|
|
Hu3DMotionShapeSpeedSet(object->model[1], 1.2f);
|
|
HuAudFXPlay(1986);
|
|
}
|
|
temp_r29 = 1;
|
|
temp_r28 = HU3D_MOTATTR_LOOP;
|
|
break;
|
|
|
|
case 1:
|
|
temp_r29 = 2;
|
|
temp_r28 = HU3D_MOTATTR_NONE;
|
|
if (!temp_r31->field0) {
|
|
if (temp_r31->unk28 >= 0 && temp_r31->unk28 < 3) {
|
|
temp_r31->field0 = 1;
|
|
if (temp_r31->unk28 == 0) {
|
|
lbl_1_bss_30 = temp_r31->unk2;
|
|
}
|
|
temp_f31 = lbl_1_data_164[temp_r31->unk28];
|
|
Hu3DModelScaleSet(object->model[4], temp_f31, temp_f31, temp_f31);
|
|
Hu3DModelAttrReset(object->model[4], HU3D_ATTR_DISPOFF);
|
|
}
|
|
}
|
|
temp_f31 = 1.0f - ((float)temp_r31->unk24 / temp_r31->unk26);
|
|
sp24[0].x = temp_r31->unk4C.x;
|
|
sp24[0].y = temp_r31->unk4C.y;
|
|
sp24[0].z = temp_r31->unk4C.z;
|
|
sp24[1].x = object->trans.x;
|
|
sp24[1].y = object->trans.y + 1500;
|
|
sp24[1].z = object->trans.z - 200;
|
|
sp24[2].x = lbl_1_data_154[temp_r31->unk2];
|
|
sp24[2].y = 0;
|
|
sp24[2].z = 150;
|
|
fn_1_24F0(sp24, &sp18, temp_f31);
|
|
VECSubtract(&sp18, &Hu3DData[object->model[4]].pos, &spC);
|
|
Hu3DModelRotSet(object->model[4], atan2d(-spC.y, VECMagXZ(&spC)), atan2d(spC.x, spC.z), 0);
|
|
Hu3DModelPosSetV(object->model[4], &sp18);
|
|
if (sp18.y > 0.0f) {
|
|
if (!temp_r31->field2 && temp_r31->field0) {
|
|
fn_1_6CB0(&sp18, -1);
|
|
fn_1_6698(&sp18, -1, -1, -1);
|
|
temp_r31->field2 = 1;
|
|
}
|
|
}
|
|
temp_r31->unk34[0].x = temp_f31 * (2.0f * lbl_1_data_154[temp_r31->unk2]);
|
|
temp_r31->unk34[0].y = -200.0f + (-400.0f * temp_f31);
|
|
temp_r31->unk34[0].z = -500.0f + (-1500.0f * temp_f31);
|
|
temp_r31->unk34[1].x = temp_f31 * lbl_1_data_154[temp_r31->unk2];
|
|
temp_r31->unk34[1].y = -200.0f + (400.0f * temp_f31);
|
|
temp_r31->unk34[1].z = -1000.0f + (750.0f * temp_f31);
|
|
if (--temp_r31->unk24 == 0) {
|
|
temp_r31->unk16 = 2;
|
|
temp_r31->field1 = 1;
|
|
if (temp_r31->field0) {
|
|
Hu3DModelAttrReset(object->model[4], HU3D_MOTATTR_PAUSE);
|
|
Hu3DModelRotSet(object->model[4], 0, 0, 0);
|
|
lbl_1_bss_14--;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 2:
|
|
if (fn_1_320() == 7) {
|
|
temp_r31->unk16 = 3;
|
|
Hu3DModelObjPosGet(object->model[0], "test11_tex_we-itemhook-r", &sp18);
|
|
CharModelEffectCreate(1, &sp18);
|
|
Hu3DModelAttrSet(object->model[1], HU3D_ATTR_DISPOFF);
|
|
Hu3DModelAttrSet(object->model[3], HU3D_ATTR_DISPOFF);
|
|
}
|
|
break;
|
|
|
|
case 3:
|
|
if (fn_1_320() < 9) {
|
|
temp_r29 = 0;
|
|
temp_r28 = HU3D_MOTATTR_LOOP;
|
|
}
|
|
else {
|
|
object->rot.y = fn_1_2390(object->rot.y, 0, 0.2f);
|
|
if (temp_r31->unk2 == lbl_1_bss_30) {
|
|
temp_r29 = 3;
|
|
temp_r28 = HU3D_MOTATTR_NONE;
|
|
}
|
|
else {
|
|
temp_r29 = 4;
|
|
temp_r28 = HU3D_MOTATTR_NONE;
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
if (temp_r31->unk2C) {
|
|
if (temp_r31->unk2C >= 0) {
|
|
temp_f31 = (0.5 * sind((90.0f * (float)temp_r31->unk2C) / (float)temp_r31->unk2E)) + 0.5;
|
|
espScaleSet(temp_r31->unk2A, temp_f31, temp_f31);
|
|
if (--temp_r31->unk2C == 0) {
|
|
temp_r31->unk2C = temp_r31->unk2E;
|
|
}
|
|
temp_r31->unk30++;
|
|
}
|
|
else {
|
|
if (temp_r31->unk30 > 30.0f) {
|
|
espDispOff(temp_r31->unk2A);
|
|
temp_r31->unk2C = 0;
|
|
}
|
|
else {
|
|
temp_r31->unk30++;
|
|
}
|
|
}
|
|
}
|
|
if (temp_r31->unk16 >= 2 && temp_r31->unk16 <= 3 && temp_r31->field0) {
|
|
Hu3DData[object->model[4]].rot.y += 2.0f;
|
|
if (0.0f == Hu3DData[object->model[4]].unk_64) {
|
|
HuAudFXPlay(1987);
|
|
}
|
|
}
|
|
if ((temp_r29 >= 0 && temp_r29 != temp_r31->unk1C) || temp_r28 != temp_r31->unk20) {
|
|
temp_r31->unk1C = temp_r29;
|
|
temp_r31->unk20 = temp_r28;
|
|
CharModelMotionShiftSet(temp_r31->unk10, object->motion[temp_r31->unk1C], 0, 8, temp_r28);
|
|
}
|
|
}
|
|
|
|
void fn_1_2010(omObjData *object)
|
|
{
|
|
M455Player *player = object->data;
|
|
if (object->data != NULL) {
|
|
HuMemDirectFree(object->data);
|
|
object->data = NULL;
|
|
}
|
|
}
|
|
|
|
GXColor lbl_1_data_170 = { 255, 255, 255, 255 };
|
|
|
|
void fn_1_27A0(Vec *arg0, Vec *arg1, float arg2);
|
|
|
|
void fn_1_2060(ModelData *arg0, Mtx arg1)
|
|
{
|
|
Vec vtxPos[4];
|
|
Mtx mtxHook;
|
|
|
|
Vec pos;
|
|
Vec itemHookPos;
|
|
s32 i;
|
|
omObjData *object = arg0->unk_120;
|
|
M455Player *player = object->data;
|
|
ModelData *modelPuku = &Hu3DData[object->model[4]];
|
|
GXLoadPosMtxImm(arg1, GX_PNMTX0);
|
|
GXSetNumChans(1);
|
|
GXSetChanCtrl(GX_COLOR0A0, GX_FALSE, GX_SRC_REG, GX_SRC_REG, 0, GX_DF_CLAMP, GX_AF_NONE);
|
|
GXSetChanMatColor(GX_COLOR0A0, lbl_1_data_170);
|
|
GXSetNumTexGens(0);
|
|
GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_NOOP);
|
|
GXSetZMode(GX_TRUE, GX_LEQUAL, GX_TRUE);
|
|
GXSetAlphaCompare(GX_ALWAYS, 0, GX_AOP_AND, GX_ALWAYS, 0);
|
|
GXSetNumTevStages(1);
|
|
GXSetTevOp(GX_TEVSTAGE0, GX_PASSCLR);
|
|
GXClearVtxDesc();
|
|
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
|
|
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0);
|
|
Hu3DModelObjMtxGet(object->model[0], "test11_tex_we-itemhook-r", mtxHook);
|
|
Hu3DModelObjPosGet(object->model[1], "hook", &pos);
|
|
MTXMultVec(mtxHook, &pos, &vtxPos[0]);
|
|
for (i = 0; i < 2; i++) {
|
|
vtxPos[i + 1].x = player->unk34[i].x;
|
|
vtxPos[i + 1].y = player->unk34[i].y;
|
|
vtxPos[i + 1].z = player->unk34[i].z;
|
|
}
|
|
if (player->field0) {
|
|
Mtx hookMtx;
|
|
Vec hookPos;
|
|
Hu3DModelObjMtxGet(object->model[4], "itemhook_C", hookMtx);
|
|
hookPos.x = 0;
|
|
hookPos.y = -60.000004f;
|
|
hookPos.z = 35.0f;
|
|
MTXMultVec(hookMtx, &hookPos, &vtxPos[3]);
|
|
}
|
|
else {
|
|
vtxPos[3].x = modelPuku->pos.x;
|
|
vtxPos[3].y = modelPuku->pos.y;
|
|
vtxPos[3].z = modelPuku->pos.z;
|
|
}
|
|
GXBegin(GX_LINESTRIP, GX_VTXFMT0, 20);
|
|
for (i = 0; i < 20; i++) {
|
|
fn_1_27A0(vtxPos, &pos, i / 19.0f);
|
|
GXPosition3f32(pos.x, pos.y, pos.z);
|
|
}
|
|
GXEnd();
|
|
}
|
|
|
|
float fn_1_2390(float arg0, float arg1, float arg2)
|
|
{
|
|
float temp_f31 = fmod(arg1 - arg0, 360);
|
|
float temp_f30;
|
|
if (temp_f31 < 0) {
|
|
temp_f31 += 360.0f;
|
|
}
|
|
if (temp_f31 > 180) {
|
|
temp_f31 -= 360.0f;
|
|
}
|
|
temp_f30 = fmod(arg0 + (arg2 * temp_f31), 360);
|
|
if (temp_f30 < 0) {
|
|
temp_f30 += 360.0f;
|
|
}
|
|
return temp_f30;
|
|
}
|
|
|
|
float fn_1_2494(float arg0, float arg1, float arg2, float arg3)
|
|
{
|
|
float temp_f31 = 1.0f - arg3;
|
|
return (arg0 * (temp_f31 * temp_f31)) + ((2.0f * temp_f31) * arg3 * arg1) + (arg2 * (arg3 * arg3));
|
|
}
|
|
|
|
s32 fn_1_24F0(Vec *arg0, Vec *arg1, float arg2)
|
|
{
|
|
arg1->x = fn_1_2494(arg0[0].x, arg0[1].x, arg0[2].x, arg2);
|
|
arg1->y = fn_1_2494(arg0[0].y, arg0[1].y, arg0[2].y, arg2);
|
|
arg1->z = fn_1_2494(arg0[0].z, arg0[1].z, arg0[2].z, arg2);
|
|
}
|
|
|
|
float fn_1_26F8(float arg0, float arg1, float arg2, float arg3, float arg4)
|
|
{
|
|
float temp_f31 = 1.0f - arg0;
|
|
float temp_f30 = temp_f31 * temp_f31;
|
|
float temp_f29 = temp_f31 * temp_f31 * temp_f31;
|
|
return (arg4 * (arg0 * (arg0 * arg0))) + ((arg3 * (arg0 * (3.0f * temp_f31 * arg0))) + ((temp_f29 * arg1) + (arg2 * (3.0f * temp_f30 * arg0))));
|
|
}
|
|
|
|
void fn_1_27A0(Vec *arg0, Vec *arg1, float arg2)
|
|
{
|
|
arg1->x = fn_1_26F8(arg2, arg0[0].x, arg0[1].x, arg0[2].x, arg0[3].x);
|
|
arg1->y = fn_1_26F8(arg2, arg0[0].y, arg0[1].y, arg0[2].y, arg0[3].y);
|
|
arg1->z = fn_1_26F8(arg2, arg0[0].z, arg0[1].z, arg0[2].z, arg0[3].z);
|
|
}
|
|
|
|
float lbl_1_data_184[2] = {};
|
|
|
|
void fn_1_2AF4(s32 arg0, s32 arg1, float arg2);
|
|
|
|
void fn_1_2D44(omObjData *object);
|
|
|
|
void fn_1_2A90(Process *objman)
|
|
{
|
|
fn_1_2AF4(0, 0, 0);
|
|
lbl_1_bss_40 = omAddObjEx(objman, 10, 0, 0, -1, fn_1_2D44);
|
|
}
|
|
|
|
void fn_1_2AF4(s32 arg0, s32 arg1, float arg2)
|
|
{
|
|
CZoom = lbl_1_data_0[arg0].zoom + (arg2 * (lbl_1_data_0[arg1].zoom - lbl_1_data_0[arg0].zoom));
|
|
Center.x = lbl_1_data_0[arg0].pos.x + (arg2 * (lbl_1_data_0[arg1].pos.x - lbl_1_data_0[arg0].pos.x));
|
|
Center.y = lbl_1_data_0[arg0].pos.y + (arg2 * (lbl_1_data_0[arg1].pos.y - lbl_1_data_0[arg0].pos.y));
|
|
Center.z = lbl_1_data_0[arg0].pos.z + (arg2 * (lbl_1_data_0[arg1].pos.z - lbl_1_data_0[arg0].pos.z));
|
|
CRot.x = lbl_1_data_0[arg0].rot.x + (arg2 * (lbl_1_data_0[arg1].rot.x - lbl_1_data_0[arg0].rot.x));
|
|
CRot.y = lbl_1_data_0[arg0].rot.y + (arg2 * (lbl_1_data_0[arg1].rot.y - lbl_1_data_0[arg0].rot.y));
|
|
CRot.z = lbl_1_data_0[arg0].rot.z + (arg2 * (lbl_1_data_0[arg1].rot.z - lbl_1_data_0[arg0].rot.z));
|
|
}
|
|
|
|
void fn_1_2D44(omObjData *object)
|
|
{
|
|
CameraData *camera = &Hu3DCamera[0];
|
|
switch (fn_1_320()) {
|
|
case 1:
|
|
fn_1_2AF4(0, 1, sind(lbl_1_data_184[0] * 90.0f));
|
|
if (lbl_1_data_184[0] < 1.0f) {
|
|
lbl_1_data_184[0] += 1.0f / 60.0f;
|
|
if (lbl_1_data_184[0] > 1.0f) {
|
|
lbl_1_data_184[0] = 1.0f;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 6:
|
|
fn_1_2AF4(1, 1, 0);
|
|
break;
|
|
|
|
case 4:
|
|
case 5:
|
|
case 7:
|
|
break;
|
|
}
|
|
}
|
|
|
|
u32 lbl_1_data_18C[4] = { PAD_CHAN0_BIT, PAD_CHAN1_BIT, PAD_CHAN2_BIT, PAD_CHAN3_BIT };
|
|
s32 fn_1_3214(void)
|
|
{
|
|
s32 rumble = HuPadRumbleGet();
|
|
s32 i;
|
|
for (i = 0; i < 4; i++) {
|
|
if (!GWPlayerCfg[i].iscom) {
|
|
if ((rumble & lbl_1_data_18C[GWPlayerCfg[i].pad_idx]) == 0) {
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
return GWGameStat.rumble;
|
|
}
|
|
|
|
float lbl_1_data_19C[] = { 0, 355, 0, 0, 0, 275, 128, 950, 6, 0, 0, 0, 190, 0, 550 };
|