marioparty4/src/REL/m455Dll/main.c
Dávid Balatoni 34cf507e3f
x64 and hsfload improvements, build every REL (#582)
* 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
2025-04-14 18:02:42 +02:00

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 };