marioparty4/src/REL/m409Dll/main.c
2024-12-30 12:58:33 -08:00

1473 lines
50 KiB
C

#include "REL/m409Dll.h"
#include "ext_math.h"
#include "game/audio.h"
#include "game/gamework_data.h"
#include "game/hsfman.h"
#include "game/hsfmotion.h"
#include "game/minigame_seq.h"
#include "game/objsub.h"
#include "game/pad.h"
#include "game/sprite.h"
#include "game/wipe.h"
#include "math.h"
// bss
Process *lbl_1_bss_E8;
s16 lbl_1_bss_E4;
omObjData *lbl_1_bss_E0;
omObjData *lbl_1_bss_DC;
Vec lbl_1_bss_D0;
unkStruct4 lbl_1_bss_40[4];
s32 lbl_1_bss_3C;
unkStruct3 lbl_1_bss_24;
s8 lbl_1_bss_21;
u8 lbl_1_bss_20;
f32 lbl_1_bss_1C;
f32 lbl_1_bss_18;
s16 lbl_1_bss_16;
s8 lbl_1_bss_14;
f32 lbl_1_bss_10;
f32 lbl_1_bss_C;
s8 lbl_1_bss_A;
s16 lbl_1_bss_8;
s8 lbl_1_bss_6;
s16 lbl_1_bss_4;
s16 lbl_1_bss_2;
s8 lbl_1_bss_0;
// data
Vec lbl_1_data_0 = { 800.0f, 1300.0f, 1000.0f };
Vec lbl_1_data_C = { 0.0f, 0.0f, 0.0f };
unkStruct2 lbl_1_data_18 = { { 0xFF, 0xFF, 0xFF, 0xFF }, { 10.0f, 45.0f, 0.0f } };
Vec lbl_1_data_28 = { 1300.0f, 2500.0f, 1300.0f };
Vec lbl_1_data_34 = { 0.0f, 1.0f, 0.0f };
Vec lbl_1_data_40 = { 0.0f, 0.0f, -1200.0f };
unkStruct lbl_1_data_4C[4]
= { { 469.8f, { 225.0f, 184.0f, -1358.0f }, { 10.62f, -109.0f, 0.0f } }, { 1800.0f, { 0.0f, 300.0f, -1316.0f }, { -20.38f, 0.0f, 0.0f } },
{ 2209.82f, { 0.0f, 478.0f, -1316.0f }, { 4.62f, 0.0f, 0.0f } }, { 2059.82f, { 0.0f, 528.0f, -1316.0f }, { 10.62f, 0.0f, 0.0f } } };
u32 lbl_1_data_BC = 0xFFFFFFFF;
s32 lbl_1_data_C0 = -1;
void ObjectSetup(void)
{
Vec sp2C;
Vec sp20;
Vec sp14;
Vec sp8;
LightData *temp_r31;
Hu3DLightAllKill();
lbl_1_bss_E4 = Hu3DGLightCreateV(&lbl_1_data_0, &lbl_1_data_C, &lbl_1_data_18.unk0);
Hu3DGLightInfinitytSet(lbl_1_bss_E4);
temp_r31 = &Hu3DGlobalLight[lbl_1_bss_E4];
temp_r31->unk_00 |= 0x8000;
sp2C.x = sp2C.y = sp2C.z = 0.0f;
Hu3DGLightPosAimSetV(lbl_1_bss_E4, &lbl_1_data_0, &sp2C);
Hu3DShadowCreate(45.0f, 20.0f, 10000.0f);
Hu3DShadowTPLvlSet(0.8f);
Hu3DShadowPosSet(&lbl_1_data_28, &lbl_1_data_34, &lbl_1_data_40);
lbl_1_bss_E8 = omInitObjMan(0x32, 0x2000);
omGameSysInit(lbl_1_bss_E8);
Hu3DCameraCreate(1);
Hu3DCameraPerspectiveSet(1, 41.5f, 5.0f, 5000.0f, 1.2f);
omAddObjEx(lbl_1_bss_E8, 0x7FDA, 0U, 0U, -1, omOutView);
sp14.x = 0.0f;
sp14.y = 374.0f;
sp14.z = 1086.0f;
sp20.x = 0.0f;
sp20.y = 568.0f;
sp20.z = -1316.0f;
sp8.z = sp20.x - sp14.x;
sp8.y = sp20.y - sp14.y;
sp8.x = sp20.z - sp14.z;
CRot.x = lbl_1_data_4C[0].rot.x;
CRot.y = lbl_1_data_4C[0].rot.y;
CRot.z = lbl_1_data_4C[0].rot.z;
Center.x = lbl_1_data_4C[0].center.x;
Center.y = lbl_1_data_4C[0].center.y;
Center.z = lbl_1_data_4C[0].center.z;
CZoom = lbl_1_data_4C[0].zoom;
omAddObjEx(lbl_1_bss_E8, 0x3E8, 0, 0, -1, fn_1_434);
lbl_1_bss_E0 = omAddObjEx(lbl_1_bss_E8, 0xA, 3U, 0U, -1, fn_1_DDC);
lbl_1_bss_DC = omAddObjEx(lbl_1_bss_E8, 0x32, 7U, 0U, -1, fn_1_2484);
Hu3DBGColorSet(0, 0, 0);
HuAudSndGrpSet(0x22);
fn_1_67E0(lbl_1_bss_E8);
}
void fn_1_434(omObjData *object)
{
if ((omSysExitReq != 0) || (lbl_1_bss_0 != 0)) {
HuAudFXListnerKill();
fn_1_5F5C(lbl_1_bss_E0->model[0]);
fn_1_5F5C(lbl_1_bss_E0->model[1]);
WipeCreate(WIPE_MODE_OUT, WIPE_TYPE_NORMAL, 0x3C);
MGSeqKillAll();
object->func = fn_1_4DC;
}
}
void fn_1_4DC(omObjData *object)
{
if ((WipeStatGet() == 0) && (MGSeqDoneCheck() != 0)) {
fn_1_6900();
omOvlReturnEx(1, 1);
}
}
s8 fn_1_524(void)
{
Vec sp8;
f32 temp_f29;
f32 var_f30;
f32 temp_f31;
s8 var_r30;
unkStruct *var_r31;
var_r31 = lbl_1_data_4C;
var_r30 = 0;
if (++lbl_1_bss_2 > 0x12C) {
lbl_1_bss_2 = 0x12C;
var_r30 = 1;
}
var_f30 = lbl_1_bss_2 / 300.0f;
temp_f31 = (sin((M_PI * (90.0f * var_f30)) / 180.0) * sin((M_PI * (90.0f * var_f30)) / 180.0));
CZoom = fn_1_4120(var_r31[0].zoom, var_r31[1].zoom, var_r31[2].zoom, temp_f31);
Center.x = fn_1_4120(var_r31[0].center.x, var_r31[1].center.x, var_r31[2].center.x, temp_f31);
Center.y = fn_1_4120(var_r31[0].center.y, var_r31[1].center.y, var_r31[2].center.y, temp_f31);
Center.z = fn_1_4120(var_r31[0].center.z, var_r31[1].center.z, var_r31[2].center.z, temp_f31);
CRot.x = fn_1_4120(var_r31[0].rot.x, var_r31[1].rot.x, var_r31[2].rot.x, temp_f31);
CRot.y = fn_1_4120(var_r31[0].rot.y, var_r31[1].rot.y, var_r31[2].rot.y, temp_f31);
CRot.z = fn_1_4120(var_r31[0].rot.z, var_r31[1].rot.z, var_r31[2].rot.z, temp_f31);
if (var_f30 > 0.65f) {
Hu3DModelAttrSet(lbl_1_bss_DC->model[1], HU3D_ATTR_DISPOFF);
}
temp_f29 = var_r31[0].rot.x + (-var_r31[0].rot.x * temp_f31);
Hu3DModelRotSet(lbl_1_bss_DC->model[2], 0.2f * temp_f29, 0.85f * CRot.y, 0.0f);
Hu3DModelRotSet(lbl_1_bss_DC->model[3], 0.2f * temp_f29, 0.85f * CRot.y, 0.0f);
Hu3DModelRotSet(lbl_1_bss_DC->model[6], 0.2f * temp_f29, 0.85f * CRot.y, 0.0f);
var_f30 *= 1.2f;
if (var_f30 > 1.0f) {
var_f30 = 1.0f;
}
temp_f31 = cosd(-45.0f + (135.0f * var_f30));
Hu3DTexScrollPosSet(lbl_1_bss_24.unk12, lbl_1_bss_24.unk14, 0.0f, 0.0f);
lbl_1_bss_24.unk14 -= 0.01f * temp_f31;
Hu3DTexScrollPosMoveSet(lbl_1_bss_24.unkC, -0.0001f - (0.005f * temp_f31), 0.0f, 0.0f);
Hu3DTexScrollPosMoveSet(lbl_1_bss_24.unkE, -0.0002f - (0.005f * temp_f31), 0.0f, 0.0f);
Hu3DTexScrollPosMoveSet(lbl_1_bss_24.unk10, -0.0003f - (0.005f * temp_f31), 0.0f, 0.0f);
sp8.x = -(sin((M_PI * CRot.y) / 180.0) * cosd(CRot.x));
sp8.y = sin((M_PI * CRot.x) / 180.0);
sp8.z = -(cosd(CRot.y) * cosd(CRot.x));
HuAudFXListnerUpdate(&Hu3DCamera->pos, &sp8);
return var_r30;
}
s8 fn_1_B80(void)
{
f32 temp_f30;
f32 temp_f31;
s8 var_r30;
unkStruct *var_r31;
var_r31 = &lbl_1_data_4C[2];
var_r30 = 0;
if (++lbl_1_bss_4 > 0x3C) {
lbl_1_bss_4 = 0x3C;
var_r30 = 1;
}
temp_f30 = lbl_1_bss_4 / 60.0f;
temp_f31 = (sin((M_PI * (90.0f * temp_f30)) / 180.0) * sin((M_PI * (90.0f * temp_f30)) / 180.0));
CZoom = var_r31[0].zoom + (temp_f31 * (var_r31[1].zoom - var_r31[0].zoom));
Center.x = var_r31[0].center.x + (temp_f31 * (var_r31[1].center.x - var_r31[0].center.x));
Center.y = var_r31[0].center.y + (temp_f31 * (var_r31[1].center.y - var_r31[0].center.y));
Center.z = var_r31[0].center.z + (temp_f31 * (var_r31[1].center.z - var_r31[0].center.z));
CRot.x = var_r31[0].rot.x + (temp_f31 * (var_r31[1].rot.x - var_r31[0].rot.x));
CRot.y = var_r31[0].rot.y + (temp_f31 * (var_r31[1].rot.y - var_r31[0].rot.y));
CRot.z = var_r31[0].rot.z + (temp_f31 * (var_r31[1].rot.z - var_r31[0].rot.z));
return var_r30;
}
void fn_1_DDC(omObjData *object)
{
s16 *var_r29;
AnimData *var_r30;
object->data = HuMemDirectMallocNum(HEAP_SYSTEM, 6, MEMORY_DEFAULT_NUM);
var_r29 = (s16 *)object->data;
var_r29[0] = 1;
var_r30 = HuSprAnimRead(HuDataReadNum(DATA_MAKE_NUM(DATADIR_M409, 0x0D), MEMORY_DEFAULT_NUM));
object->model[0] = fn_1_5A18(var_r30, 0x800, 10.0f, 0x40, 0x40);
fn_1_5FBC(object->model[0], fn_1_5408);
Hu3DModelLayerSet(object->model[0], 5);
var_r30 = HuSprAnimRead(HuDataReadNum(DATA_MAKE_NUM(DATADIR_M409, 0x0E), MEMORY_DEFAULT_NUM));
object->model[1] = fn_1_5A18(var_r30, 0x400, 2.0f, 0, 0);
fn_1_5FBC(object->model[1], fn_1_55E0);
fn_1_5FF4(object->model[1], 1);
Hu3DModelLayerSet(object->model[1], 5);
HuAudFXListnerSetEX(&Hu3DCamera->pos, &Hu3DCamera->up, 10000.0f, 566.6667f, 0.0f, 300.0f, 300.0f);
object->func = fn_1_F70;
}
void fn_1_F70(omObjData *object)
{
s16 *sp8;
s16 temp_r3;
s16 temp_r3_2;
s32 var_r31;
sp8 = (s16 *)object->data;
switch (fn_1_2454(7)) {
case 1:
if (lbl_1_bss_6 == 0) {
lbl_1_bss_6 = 1;
WipeCreate(WIPE_MODE_IN, WIPE_TYPE_NORMAL, 0x3C);
}
if (WipeStatGet() == 0) {
fn_1_2414(7, 2);
for (var_r31 = 0; var_r31 < 4; var_r31++) {
omVibrate(var_r31, 0xC8, 6, 6);
}
}
break;
case 2:
if (fn_1_10E8(object) != 0) {
fn_1_2414(7, 3);
}
break;
case 3:
switch (fn_1_2454(0x60)) {
case 0x40:
break;
case 0x20:
fn_1_2098(object);
break;
}
break;
case 4:
if (fn_1_1B74(object) != 0) {
fn_1_2414(7, 5);
return;
}
break;
case 5:
lbl_1_bss_0 = 1;
break;
}
}
s8 fn_1_10E8(omObjData *object)
{
Vec sp8;
ModelData *temp_r31;
f32 var_f26;
f32 var_f27;
f32 temp_f29;
f32 temp_f28;
f32 temp_f30;
f32 var_f31;
s8 var_r29;
unkStruct3 *temp_r30;
temp_r31 = &Hu3DData[lbl_1_bss_DC->model[4]];
temp_r30 = (unkStruct3 *)object->data;
if (lbl_1_bss_A != 0) {
var_r29 = fn_1_524();
}
switch (lbl_1_bss_8) { /* irregular */
case -1:
if ((HuPadBtnDown[0] & 0x100) != 0) {
lbl_1_bss_8 = 0;
}
break;
case 0:
Hu3DModelAttrReset(lbl_1_bss_DC->model[1], HU3D_MOTATTR_PAUSE);
if (lbl_1_bss_C == 0.0f) {
fn_1_3840();
sp8.x = 1520.0f;
sp8.y = 0.0f;
sp8.z = -1200.0f;
lbl_1_data_BC = HuAudFXEmiterPlay(0x554, &sp8);
HuAudFXEmiterPlay(0x559, &sp8);
}
lbl_1_bss_C += 0.004f;
if (lbl_1_bss_C >= 1.0f) {
lbl_1_bss_C = 1.0f;
lbl_1_bss_8 = 0x63;
}
else if (lbl_1_bss_C > 0.2f) {
lbl_1_bss_A = 1;
}
var_f31 = sin((M_PI * (90.0f * lbl_1_bss_C)) / 180.0);
var_f27 = 1520.0f;
var_f26 = -1030.0f;
temp_f30 = var_f27 + (var_f31 * (var_f26 - var_f27));
Hu3DModelPosSet(lbl_1_bss_DC->model[4], temp_f30, 0.0f, -1200.0f);
Hu3DModelPosSet(lbl_1_bss_DC->model[1], temp_f30, 0.0f, -1200.0f);
if ((lbl_1_data_BC + 0x10000) != 0xFFFF) {
sp8.x = temp_f30;
sp8.y = 0.0f;
sp8.z = -1200.0f;
HuAudFXEmiterUpDate(lbl_1_data_BC, &sp8);
}
var_f31 = 1.2f * lbl_1_bss_C;
if ((var_f31 >= 1.0f) && ((lbl_1_data_BC + 0x10000) != 0xFFFF)) {
HuAudFXEmiterPlay(0x555, &sp8);
sp8.x += 200.0f;
HuAudFXEmiterPlay(0x55E, &sp8);
HuAudFXStop(lbl_1_data_BC);
lbl_1_data_BC = -1;
}
if (var_f31 >= 1.0f) {
var_f31 = 0.0f;
}
else {
var_f31 = sin((M_PI * (90.0f + (90.0f * var_f31))) / 180.0);
}
Hu3DMotionSpeedSet(lbl_1_bss_DC->model[4], 2.0f * var_f31);
if (lbl_1_bss_C > 0.5f) {
var_f31 = 2.0f * (9.0f * (1.0f - lbl_1_bss_C));
}
else {
var_f31 = 9.0f;
}
fn_1_44F0(lbl_1_bss_E0->model[0], 0.0f, 0.0f, 0.0f, 0, var_f31);
if ((lbl_1_bss_C > 0.7f) && (lbl_1_bss_C < 0.9f)) {
var_f31 = (lbl_1_bss_C - 3.5f);
if (++lbl_1_bss_10 > (var_f31 * 10.0f)) {
lbl_1_bss_10 = 0.0f;
temp_f30 = 190.0f + temp_r31->pos.x;
temp_f29 = 20.0f + temp_r31->pos.y;
temp_f28 = 95.0f + temp_r31->pos.z;
var_f31 = 1.0f - (lbl_1_bss_C - 3.5f);
fn_1_4FFC(lbl_1_bss_E0->model[1], temp_f30, temp_f29, temp_f28, (u8)(2.0f * var_f31));
temp_f30 = 370.0f + temp_r31->pos.x;
fn_1_4FFC(lbl_1_bss_E0->model[1], temp_f30, temp_f29, temp_f28, (u8)var_f31);
temp_f30 = 490.0f + temp_r31->pos.x;
fn_1_4FFC(lbl_1_bss_E0->model[1], temp_f30, temp_f29, temp_f28, (u8)var_f31);
}
}
if (++lbl_1_bss_14 > 1) {
lbl_1_bss_14 = 0;
fn_1_44F0(lbl_1_bss_E0->model[0], 190.0f + temp_r31->pos.x, 15.0f, temp_r31->pos.z + 95.0f, 1, 1);
fn_1_44F0(lbl_1_bss_E0->model[0], 370.0f + temp_r31->pos.x, 15.0f, temp_r31->pos.z + 95.0f, 1, 1);
fn_1_44F0(lbl_1_bss_E0->model[0], 490.0f + temp_r31->pos.x, 15.0f, temp_r31->pos.z + 95.0f, 1, 1);
fn_1_44F0(lbl_1_bss_E0->model[0], 190.0f + temp_r31->pos.x, 15.0f, temp_r31->pos.z - 95.0f, 1, 1);
fn_1_44F0(lbl_1_bss_E0->model[0], 370.0f + temp_r31->pos.x, 15.0f, temp_r31->pos.z - 95.0f, 1, 1);
fn_1_44F0(lbl_1_bss_E0->model[0], 490.0f + temp_r31->pos.x, 15.0f, temp_r31->pos.z - 95.0f, 1, 1);
}
break;
case 99:
if (var_r29 == 0) {
return 0;
}
temp_r30->unk2 = MGSeqCreate(3, 0);
MGSeqPosSet(temp_r30->unk2, 320.0f, 240.0f);
lbl_1_bss_8 = 0x270F;
break;
default:
if (MGSeqStatGet(temp_r30->unk2) == 0) {
lbl_1_bss_8 = 0;
return 1;
}
if ((lbl_1_data_C0 == -1) && ((MGSeqStatGet(temp_r30->unk2) & 0x10) != 0)) {
lbl_1_data_C0 = HuAudSeqPlay(0x48);
}
break;
}
return 0;
}
s8 fn_1_1B74(omObjData *object)
{
f32 temp_f30;
f32 temp_f31;
s16 temp_r27;
s32 temp_r28;
unkStruct4 *temp_r30;
temp_r30 = (unkStruct4 *)object->data;
switch (lbl_1_bss_8) {
case 0:
temp_r30->unk2 = MGSeqCreate(3, 1);
MGSeqPosSet(temp_r30->unk2, 320.0f, 240.0f);
HuAudSeqFadeOut(lbl_1_data_C0, 0x64);
lbl_1_bss_16 = 0;
lbl_1_bss_8 = 1;
break;
case 1:
if (++lbl_1_bss_16 > 30) {
lbl_1_bss_8 = 2;
}
break;
case 2:
if (fn_1_B80()) {
lbl_1_bss_8 = 3;
}
break;
case 3:
fn_1_2414(0x80, 0x80);
if (temp_r30->unk4 >= 0) {
GWPlayerCoinWinAdd(temp_r30->unk4, 10);
temp_r30->unk2 = MGSeqCreate(5, 3, GWPlayerCfg[temp_r30->unk4].character, -1, -1, -1);
HuAudSStreamPlay(1);
}
else {
temp_r30->unk2 = MGSeqCreate(3, 2);
HuAudSStreamPlay(4);
}
MGSeqPosSet(temp_r30->unk2, 320.0f, 240.0f);
lbl_1_bss_8 = 4;
lbl_1_bss_16 = 0;
break;
case 4:
lbl_1_bss_16++;
if (MGSeqStatGet(temp_r30->unk2) == 0) {
lbl_1_bss_8 = 5;
}
break;
case 5:
lbl_1_bss_16++;
if (lbl_1_bss_16 > 210.0f) {
return 1;
}
break;
}
return 0;
}
void fn_1_2098(omObjData *object)
{
ModelData *temp_r31;
f32 var_f28;
f32 var_f29;
f32 var_f31;
f32 var_f30;
s32 var_r30;
temp_r31 = &Hu3DData[lbl_1_bss_DC->model[4]];
if (fn_1_2454(0x18) != 0x18) {
lbl_1_bss_18 += 0.008f;
if (lbl_1_bss_18 >= 1.0f) {
fn_1_2414(0x60, 0x40);
Hu3DModelAttrSet(lbl_1_bss_DC->model[4], HU3D_ATTR_DISPOFF);
lbl_1_bss_18 = 1.0f;
}
var_f31 = sin((M_PI * (90.0f * lbl_1_bss_18)) / 180.0);
var_f29 = -1030.0f;
var_f28 = -1880.0f;
var_f30 = var_f29 + (var_f31 * (var_f28 - var_f29));
Hu3DModelPosSet(lbl_1_bss_DC->model[4], var_f30, 0.0f, -1200.0f);
Hu3DMotionSpeedSet(lbl_1_bss_DC->model[4], 3.0f * var_f31);
var_f31 = (4.0f * (9.0f * lbl_1_bss_18));
fn_1_44F0(lbl_1_bss_E0->model[0], 0.0f, 0.0f, 0.0f, 0, var_f31);
fn_1_44F0(lbl_1_bss_E0->model[0], 190.0f + var_f30, 15.0f, 95.0f + temp_r31->pos.z, 1, 1);
fn_1_44F0(lbl_1_bss_E0->model[0], 370.0f + var_f30, 15.0f, 95.0f + temp_r31->pos.z, 1, 1);
fn_1_44F0(lbl_1_bss_E0->model[0], 490.0f + var_f30, 15.0f, 95.0f + temp_r31->pos.z, 1, 1);
}
}
void fn_1_23EC(s16 arg0)
{
unkStruct4 *var_r31;
var_r31 = (unkStruct4 *)lbl_1_bss_E0->data;
var_r31->unk4 = arg0;
}
void fn_1_2414(u16 arg0, u16 arg1)
{
unkStruct4 *var_r31;
var_r31 = (unkStruct4 *)lbl_1_bss_E0->data;
var_r31->unk0 &= ~arg0;
var_r31->unk0 |= arg1;
}
u16 fn_1_2454(u16 arg0)
{
unkStruct4 *var_r31;
var_r31 = (unkStruct4 *)lbl_1_bss_E0->data;
return var_r31->unk0 & arg0;
}
static inline void unkInline(unkStruct4 *var_r31, s16 var_r29, s16 *var_r28, s16 arg3)
{
var_r31[var_r29].unk2 = Hu3DModelCreateFile(DATA_MAKE_NUM(DATADIR_M409, 0x02));
var_r31[var_r29].unk4 = Hu3DModelCreateFile(DATA_MAKE_NUM(DATADIR_M409, 0x03));
Hu3DModelAttrSet(var_r31[var_r29].unk2, HU3D_MOTATTR_LOOP);
Hu3DModelAttrSet(var_r31[var_r29].unk4, HU3D_MOTATTR_PAUSE);
if (arg3) {
Hu3DModelAttrSet(var_r31[var_r29].unk2, HU3D_ATTR_DISPOFF);
Hu3DModelAttrSet(var_r31[var_r29].unk4, HU3D_ATTR_DISPOFF);
}
var_r31[var_r29].unk6 = Hu3DModelCreateFile(0x2001C);
var_r31[var_r29].unk8 = Hu3DJointMotionFile(var_r31[var_r29].unk6, DATA_MAKE_NUM(DATADIR_M409, 11));
var_r31[var_r29].unkA = Hu3DJointMotionFile(var_r31[var_r29].unk6, DATA_MAKE_NUM(DATADIR_M409, 12));
Hu3DModelAttrSet(var_r31[var_r29].unk6, HU3D_MOTATTR_LOOP);
Hu3DMotionSet(var_r31[var_r29].unk6, var_r31[var_r29].unk8);
var_r31[var_r29].unkC = var_r29 + 3;
if (arg3) {
*var_r28 += (((rand8() << 8) | rand8()) % 4) + 2;
}
else {
*var_r28 = 2;
}
fn_1_3988(&var_r31[var_r29], *var_r28, var_r29);
Hu3DModelPosSet(var_r31[var_r29].unk2, var_r31[var_r29].unk18, 0.0f, -1200.0f);
Hu3DModelPosSet(var_r31[var_r29].unk4, var_r31[var_r29].unk18, 0.0f, -1200.0f);
}
void fn_1_2484(omObjData *object)
{
s16 var_r28; // ! - uninitialized
s16 var_r29;
unkStruct4 *var_r31;
var_r31 = &lbl_1_bss_40[0];
object->stat |= 0x100;
object->model[0] = Hu3DModelCreateFile(DATA_MAKE_NUM(DATADIR_M409, 0x00));
object->model[5] = Hu3DModelCreateFile(DATA_MAKE_NUM(DATADIR_M409, 0x08));
Hu3DModelLayerSet(object->model[0], 2);
Hu3DModelLayerSet(object->model[5], 2);
object->model[2] = Hu3DModelCreateFile(DATA_MAKE_NUM(DATADIR_M409, 0x05));
object->model[3] = Hu3DModelCreateFile(DATA_MAKE_NUM(DATADIR_M409, 0x06));
Hu3DModelScaleSet(object->model[2], 1.1f, 1.0f, 1.0f);
Hu3DModelScaleSet(object->model[3], 1.1f, 1.0f, 1.0f);
Hu3DModelRotSet(object->model[2], 0.2f * lbl_1_data_4C->rot.x, 0.85f * lbl_1_data_4C->rot.y, 0.0f);
Hu3DModelRotSet(object->model[3], 0.2f * lbl_1_data_4C->rot.x, 0.85f * lbl_1_data_4C->rot.y, 0.0f);
Hu3DModelLayerSet(object->model[2], 2);
Hu3DModelLayerSet(object->model[3], 2);
lbl_1_bss_24.unkE = Hu3DTexScrollCreate(object->model[2], "cr_kumo2");
Hu3DTexScrollPosMoveSet(lbl_1_bss_24.unkE, -0.0002f, 0.0f, 0.0f);
lbl_1_bss_24.unk10 = Hu3DTexScrollCreate(object->model[3], "cr_kumo3");
Hu3DTexScrollPosMoveSet(lbl_1_bss_24.unk10, -0.0003f, 0.0f, 0.0f);
var_r29 = Hu3DModelCreateFile(DATA_MAKE_NUM(DATADIR_M409, 0x0A));
Hu3DModelLayerSet(var_r29, 0);
object->model[6] = Hu3DModelCreateFile(DATA_MAKE_NUM(DATADIR_M409, 0x07));
Hu3DModelAttrSet(object->model[6], HU3D_ATTR_ZWRITE_OFF);
Hu3DModelScaleSet(object->model[6], 1.1f, 1.0f, 1.0f);
Hu3DModelRotSet(object->model[6], 0.2f * lbl_1_data_4C->rot.x, 0.85f * lbl_1_data_4C->rot.y, 0.0f);
Hu3DModelLayerSet(object->model[6], 1);
lbl_1_bss_24.unk12 = Hu3DTexScrollCreate(object->model[6], "bg");
lbl_1_bss_24.unk14 = 0.0f;
object->model[4] = Hu3DModelCreateFile(DATA_MAKE_NUM(DATADIR_M409, 0x01));
object->model[1] = Hu3DModelCreateFile(DATA_MAKE_NUM(DATADIR_M409, 0x04));
Hu3DModelAttrSet(object->model[4], HU3D_MOTATTR_LOOP);
Hu3DModelPosSet(object->model[4], 1660.0f, 0.0f, -1200.0f);
Hu3DModelPosSet(object->model[1], 1660.0f, 0.0f, -1200.0f);
Hu3DModelLayerSet(object->model[1], 6);
Hu3DModelAttrSet(object->model[1], HU3D_MOTATTR_PAUSE);
unkInline(var_r31, 0, &var_r28, 0);
for (var_r29 = 1; var_r29 < 4; var_r29++) {
unkInline(var_r31, var_r29, &var_r28, 1);
}
lbl_1_bss_24.unk0 = 0;
lbl_1_bss_24.unk1 = 0;
lbl_1_bss_24.unk8 = 0;
lbl_1_bss_24.unkA = 0xB4;
Hu3DModelShadowMapSet(object->model[0]);
Hu3DModelShadowSet(object->model[4]);
for (var_r29 = 0; var_r29 < 4; var_r29++) {
Hu3DModelShadowSet(var_r31[var_r29].unk2);
Hu3DModelShadowSet(var_r31[var_r29].unk4);
}
lbl_1_bss_3C = 0;
object->func = fn_1_2DCC;
}
void fn_1_2DCC(omObjData *object)
{
u16 spE;
u16 spC;
u16 spA;
u16 sp8;
ModelData *temp_r30;
f32 temp_f29;
f32 var_f31;
f32 var_f30;
s16 var_r22;
s16 var_r23;
s16 var_r28;
s16 var_r27;
s16 var_r29;
s32 temp_r16;
s16 var_r18;
unkStruct4 *var_r31;
if ((lbl_1_bss_24.unk0 == 0) || (fn_1_2454(0x18) == 0x18)) {
if (lbl_1_bss_24.unk1 != 0) {
var_r31 = lbl_1_bss_24.unk4;
switch (lbl_1_bss_24.unk1) {
case 1:
if (++lbl_1_bss_24.unk8 == (lbl_1_bss_24.unkA - 5)) {
Hu3DMotionSet(var_r31->unk6, var_r31->unkA);
Hu3DModelAttrReset(var_r31->unk6, HU3D_MOTATTR_LOOP);
lbl_1_bss_3C++;
break;
}
if (lbl_1_bss_24.unk8 > lbl_1_bss_24.unkA) {
lbl_1_bss_24.unk8 = 0;
lbl_1_bss_24.unkA = 0xF;
Hu3DModelAttrReset(var_r31->unk4, HU3D_MOTATTR_PAUSE);
lbl_1_bss_24.unk1 = 2;
HuAudFXPlay(0x55B);
HuAudFXPlay(0x55D);
}
break;
case 2:
temp_f29 = Hu3DMotionMaxTimeGet(var_r31->unk4);
if (Hu3DMotionTimeGet(var_r31->unk4) >= temp_f29) {
Hu3DMotionSet(var_r31->unk6, var_r31->unk8);
Hu3DModelAttrSet(var_r31->unk6, HU3D_MOTATTR_LOOP);
Hu3DModelAttrSet(var_r31->unk4, HU3D_MOTATTR_PAUSE);
fn_1_2414(24, 8);
lbl_1_bss_24.unk1 = 0;
}
break;
}
}
else {
var_r31 = lbl_1_bss_24.unk4;
switch (fn_1_2454(0x18)) {
case 16:
Hu3DMotionSet(var_r31->unk6, var_r31->unkA);
Hu3DMotionTimeSet(var_r31->unk6, Hu3DMotionMaxTimeGet(var_r31->unk6));
Hu3DMotionSpeedSet(var_r31->unk6, -1.0f);
Hu3DModelAttrReset(var_r31->unk6, HU3D_MOTATTR_LOOP);
Hu3DMotionSpeedSet(var_r31->unk4, -1.0f);
Hu3DModelAttrReset(var_r31->unk4, HU3D_MOTATTR_PAUSE);
fn_1_2414(24, 0x18);
HuAudFXPlay(0x55C);
HuAudFXPlay(0x55D);
break;
case 24:
if (Hu3DMotionTimeGet(var_r31->unk4) <= 0.0f) {
Hu3DMotionSet(var_r31->unk6, var_r31->unk8);
Hu3DMotionSpeedSet(var_r31->unk6, 1.0f);
Hu3DModelAttrSet(var_r31->unk6, HU3D_MOTATTR_LOOP);
Hu3DMotionSpeedSet(var_r31->unk4, 1.0f);
Hu3DModelAttrSet(var_r31->unk4, HU3D_MOTATTR_PAUSE);
fn_1_2414(24, 0);
}
break;
}
}
}
else {
if (fn_1_2454(7) == 2) {
var_f30 = 0.004f;
}
else {
var_f30 = 0.008f;
}
var_r29 = 0;
var_r23 = 0;
var_r31 = lbl_1_bss_40;
for (; var_r29 < 4; var_r29++, var_r31++) {
if ((s8)var_r31->unk0b == 0) {
var_r23++;
}
else {
if (var_r31->unkE-- <= 0) {
temp_r30 = &Hu3DData[var_r31->unk2];
if ((var_r31->unkC < 2) && (lbl_1_bss_3C < 0xBU)) {
Hu3DModelAttrReset(var_r31->unk2, HU3D_ATTR_DISPOFF);
Hu3DModelAttrReset(var_r31->unk4, HU3D_ATTR_DISPOFF);
Hu3DModelAttrReset(var_r31->unk6, HU3D_ATTR_DISPOFF);
}
var_r31->unk10 += var_f30;
var_f31 = sin((M_PI * (90.0f * var_r31->unk10)) / 180.0);
if (var_r31->unk10 >= 1.0f) {
var_f31 = 1.0f;
var_r31->unk10 = var_f31;
temp_r30->pos.x = var_r31->unk1C;
if (var_r31->unkC == 0) {
lbl_1_bss_24.unk4 = var_r31;
}
var_r27 = var_r31->unkC - 1;
if (var_r27 == -3) {
Hu3DModelAttrSet(var_r31->unk2, HU3D_ATTR_DISPOFF);
Hu3DModelAttrSet(var_r31->unk4, HU3D_ATTR_DISPOFF);
Hu3DModelAttrSet(var_r31->unk6, HU3D_ATTR_DISPOFF);
var_r31->unkC = 2;
var_r27 = 1;
}
fn_1_3988(var_r31, 0, var_r27);
}
else {
temp_r30->pos.x = var_r31->unk18 + (var_f31 * (var_r31->unk1C - var_r31->unk18));
}
if (var_f31 > 0.1f) {
if (++var_r31->unk16 > 1) {
var_r31->unk16 = 0;
fn_1_44F0(*lbl_1_bss_E0->model, 130.0f + temp_r30->pos.x, 15.0f, 95.0f + temp_r30->pos.z, 1, 1);
fn_1_44F0(*lbl_1_bss_E0->model, 630.0f + temp_r30->pos.x, 15.0f, 95.0f + temp_r30->pos.z, 1, 1);
}
}
if ((var_r31->unk10 > 0.7f) && (var_r31->unk10 < 0.9f)) {
var_f31 = var_r31->unk10 - 3.5f;
if (++lbl_1_bss_1C > (40.0f * var_f31)) {
lbl_1_bss_1C = 0.0f;
var_f31 = 1.0f - var_f31;
fn_1_4FFC(lbl_1_bss_E0->model[1], 130.0f + temp_r30->pos.x, 20.0f + temp_r30->pos.y, 95.0f + temp_r30->pos.z,
(u8)(2.0f * var_f31));
fn_1_4FFC(
lbl_1_bss_E0->model[1], 630.0f + temp_r30->pos.x, 20.0f + temp_r30->pos.y, 95.0f + temp_r30->pos.z, (u8)var_f31);
}
if (var_r31->unk10 < (0.7f + var_f30)) {
HuAudFXEmiterPlay(0x55E, &temp_r30->pos);
}
}
Hu3DModelPosSet(var_r31->unk6, 70.0f + temp_r30->pos.x, 290.0f, -1200.0f);
Hu3DData[var_r31->unk4].pos.x = temp_r30->pos.x;
var_f31 = (0.800000011920929 * sin((M_PI * (180.0f * var_r31->unk10)) / 180.0));
Hu3DMotionSpeedSet(var_r31->unk2, var_f31);
}
}
}
if (var_r23 == 4) {
var_r22 = 0x63;
lbl_1_bss_24.unk0 = 0;
for (var_r29 = 0, var_r31 = &lbl_1_bss_40[0]; var_r29 < 4; var_r29++, var_r31++) {
if (var_r31->unkC < var_r22) {
var_r22 = var_r31->unkC;
var_r27 = var_r29;
}
for (var_r28 = 0, var_r31->unk20 = NULL; var_r28 < 4; var_r28++) {
if ((var_r31->unkC + 1) == lbl_1_bss_40[var_r28].unkC) {
var_r31->unk20 = &lbl_1_bss_40[var_r28];
}
}
}
var_r31 = &lbl_1_bss_40[var_r27];
var_r31->unkE = 0;
loop:
if (var_r31->unk20) {
var_r31->unk20->unkE = 2 + (((rand8() << 8) | rand8()) % 4) + var_r31->unkE;
var_r31 = var_r31->unk20;
goto loop;
}
lbl_1_bss_24.unk1 = 1;
}
}
}
void fn_1_3840(void)
{
s16 var_r31;
if ((lbl_1_bss_24.unk0 == 0) && (fn_1_2454(7) != 4)) {
lbl_1_bss_24.unk0 = 1;
for (var_r31 = 0; var_r31 < 4; var_r31++) {
lbl_1_bss_40[var_r31].unk0b = 1;
}
if (++lbl_1_bss_20 == 2) {
for (var_r31 = 0; var_r31 < 4; var_r31++) {
lbl_1_bss_40[var_r31].unkE += 3;
}
fn_1_2414(0x60, 0x20);
}
HuAudFXPlay(0x55F);
}
}
void fn_1_3988(unkStruct4 *arg0, s16 arg1, s16 arg2)
{
arg0->unk0b = 0;
arg0->unkE = arg1;
arg0->unk10 = 0.0f;
arg0->unk18 = ((850.0f * arg0->unkC) - 370.0f);
arg0->unk1C = ((850.0f * arg2) - 370.0f);
arg0->unkC = arg2;
if ((arg0->unkC >= 2) && (fn_1_2454(7) != 2)) {
Hu3DModelAttrSet(arg0->unk2, HU3D_ATTR_DISPOFF);
Hu3DModelAttrSet(arg0->unk4, HU3D_ATTR_DISPOFF);
Hu3DModelAttrSet(arg0->unk6, HU3D_ATTR_DISPOFF);
}
}
s32 fn_1_3AD8(s32 arg0, f32 arg8, f32 arg9, f32 argA, f32 argB, f32 argC, f32 argD)
{
f32 sp1C;
f32 temp;
ModelData *temp_r31;
f32 temp_f31;
f32 temp_f30;
f32 temp_f29;
f32 temp_f28;
f32 temp_f27;
f32 temp_f26;
s16 var_r29;
unkStruct4 *var_r30;
var_r30 = lbl_1_bss_24.unk4;
if (!var_r30)
return;
for (var_r29 = 0; var_r29 < 2; var_r29++) {
temp_r31 = &Hu3DData[var_r30->unk6];
temp_f31 = temp_r31->pos.x;
temp_f30 = 75.0f + temp_r31->pos.y;
temp_f29 = temp_r31->pos.z;
temp_f28 = arg8 + argB;
temp_f27 = arg9 + argC;
temp_f26 = argA + argD;
temp = sqrtf((temp_f28 - temp_f31) * (temp_f28 - temp_f31) + (temp_f27 - temp_f30) * (temp_f27 - temp_f30)
+ (temp_f26 - temp_f29) * (temp_f26 - temp_f29));
if (temp < 50.0f) {
return 1;
}
sp1C = -((argA * argD) + (((arg9 * argC) + (((-temp_f31 * argB) + (arg8 * argB)) - (temp_f30 * argC))) - (temp_f29 * argD)))
/ ((argD * argD) + ((argB * argB) + (argC * argC)));
if (sp1C >= 1.0f)
continue;
temp_f28 = arg8 + (argB * sp1C);
temp_f27 = arg9 + (argC * sp1C);
temp_f26 = argA + (argD * sp1C);
temp = sqrtf((temp_f28 - temp_f31) * (temp_f28 - temp_f31) + (temp_f27 - temp_f30) * (temp_f27 - temp_f30)
+ (temp_f26 - temp_f29) * (temp_f26 - temp_f29));
if (temp < 50.0f) {
return 1;
}
var_r30 = var_r30->unk20;
continue;
}
return 0;
}
void fn_1_40A4(Mtx arg0, Mtx arg1)
{
arg1[0][0] = arg0[0][0];
arg1[1][0] = arg0[0][1];
arg1[2][0] = arg0[0][2];
arg1[0][1] = arg0[1][0];
arg1[1][1] = arg0[1][1];
arg1[2][1] = arg0[1][2];
arg1[0][2] = arg0[2][0];
arg1[1][2] = arg0[2][1];
arg1[2][2] = arg0[2][2];
arg1[0][3] = 0.0f;
arg1[1][3] = 0.0f;
arg1[2][3] = 0.0f;
}
f32 fn_1_4120(f32 arg0, f32 arg1, f32 arg2, f32 arg3)
{
f32 temp_f31;
temp_f31 = 1.0f - arg3;
return (arg2 * (arg3 * arg3)) + ((arg0 * (temp_f31 * temp_f31)) + (arg1 * (2.0f * temp_f31 * arg3)));
}
void fn_1_417C(void)
{
if ((HuPadBtnDown[0] & 0x40) != 0) {
lbl_1_bss_21 ^= 1;
}
if (lbl_1_bss_21 != 0) {
if ((HuPadBtn[0] & 1) != 0) {
CRot.y++;
}
if ((HuPadBtn[0] & 2) != 0) {
CRot.y--;
}
if ((HuPadBtn[0] & 8) != 0) {
CRot.x--;
}
if ((HuPadBtn[0] & 4) != 0) {
CRot.x++;
}
Center.x += HuPadSubStkX[0];
if ((HuPadBtn[0] & 0x20) != 0) {
Center.y += HuPadSubStkY[0];
}
else {
Center.z += HuPadSubStkY[0];
}
if ((HuPadBtn[0] & 0x400) != 0) {
CZoom += 10.0f;
}
if ((HuPadBtn[0] & 0x800) != 0) {
CZoom -= 10.0f;
}
if ((HuPadBtnDown[0] & 0x100) != 0) {
OSReport("\nCZoom = %.2f \n", CZoom);
OSReport("Center x = %.2f: y = %.2f: z = %.2f \n", Center.x, Center.y, Center.z);
OSReport("CRot x = %.2f: y = %.2f: z = %.2f \n", CRot.x, CRot.y, CRot.z);
}
}
}
void fn_1_44F0(s16 arg0, f32 arg8, f32 arg9, f32 argA, s8 arg1, s16 arg2)
{
Vec sp20;
Vec sp14;
unkStruct4 *sp10;
GXColor spA;
ModelData *temp_r30;
f32 temp_f31;
s16 var_r29;
unkStruct5 *var_r31;
temp_r30 = &Hu3DData[lbl_1_bss_DC->model[4]];
sp10 = (unkStruct4 *)temp_r30->unk_120;
if (arg1 == 0) {
arg8 = 150.0f + temp_r30->pos.x;
arg9 = 360.0f + temp_r30->pos.y;
argA = temp_r30->pos.z;
}
for (var_r29 = 0; var_r29 < arg2; var_r29++) {
switch (arg1) { /* irregular */
case 0:
sp20.x = arg8 + ((((rand8() << 8) | rand8()) % 41) - 20);
sp20.z = argA + ((((rand8() << 8) | rand8()) % 41) - 20);
sp20.y = arg9;
sp14.x = 0.01f * ((((rand8() << 8) | rand8()) % 101) + 200);
sp14.y = 0.01f * ((((rand8() << 8) | rand8()) % 101) + 200);
sp14.z = 0.01f * ((((rand8() << 8) | rand8()) % 101) + 200);
spA.r = spA.g = spA.b = (((rand8() << 8) | rand8()) % 33) + 32;
spA.a = 0xFF;
var_r31 = fn_1_58E0(arg0, &sp20, &sp14, 0.0f, &spA);
if (!var_r31)
return;
temp_f31 = (((rand8() << 8) | rand8()) % 361);
var_r31->unk0.x = (2.0 + (3.0 * sin((M_PI * temp_f31) / 180.0)));
var_r31->unk0.y = (0.1f * ((((rand8() << 8) | rand8()) % 31) + 40));
var_r31->unk0.z = (3.5 * cosd(temp_f31));
var_r31->unk28 = 0;
var_r31->unk2A = ((((rand8() << 8) | rand8()) % 3) + 2);
var_r31->unk18 = (f32)spA.r;
var_r31->unk1C = (((((rand8() << 8) | rand8()) % 69) + 0x80) / (f32)(var_r31->unk2A * 0xE));
var_r31->unk20 = 255.0f;
var_r31->unk24 = (((((rand8() << 8) | rand8())) % 128 + 0x80) / (f32)(var_r31->unk2A * 0xE));
break;
case 1:
sp20.x = arg8 + ((((rand8() << 8) | rand8()) % 41) - 20);
sp20.z = argA + ((((rand8() << 8) | rand8()) % 41) - 20);
sp20.y = arg9 + ((((rand8() << 8) | rand8()) % 41) - 20);
sp14.x = 0.01f * ((((rand8() << 8) | rand8()) % 101) + 300);
sp14.y = 0.01f * ((((rand8() << 8) | rand8()) % 101) + 300);
sp14.z = 0.01f * ((((rand8() << 8) | rand8()) % 101) + 300);
spA.r = 0xFF;
spA.g = 0xDC;
spA.b = 0x8C;
spA.a = 0x80;
var_r31 = fn_1_58E0(arg0, &sp20, &sp14, 0.0f, &spA);
if (!var_r31)
return;
var_r31->unk28 = 0;
var_r31->unk2A = ((((rand8() << 8) | rand8()) % 3) + 2);
var_r31->unk0.x = (0.1f * ((((rand8() << 8) | rand8()) % 11) + 30));
var_r31->unk0.y = 0.0f;
var_r31->unk0.z = (0.1f * ((((rand8() << 8) | rand8()) % 41) - 20));
var_r31->unk20 = 32.0f;
var_r31->unk24 = (32.0f / (var_r31->unk2A * 0xE));
break;
}
var_r31->unk2C = arg1;
}
}
void fn_1_4FFC(s16 arg0, f32 arg1, f32 arg2, f32 arg3, s16 arg4)
{
Vec sp2C;
Vec sp20;
GXColor sp1A;
s16 sp18;
f32 temp_f31;
s16 var_r30;
unkStruct5 *temp_r31;
for (var_r30 = 0; var_r30 < arg4; var_r30++) {
sp2C.x = arg1 + ((((rand8() << 8) | rand8()) % 21) - 10);
sp2C.y = arg2;
sp2C.z = arg3 + ((((rand8() << 8) | rand8()) % 21) - 10);
sp20.x = 0.1f * ((((rand8() << 8) | rand8()) % 31) + 10);
sp20.y = 1.0f;
sp20.z = 1.0f;
sp1A.r = sp1A.g = sp1A.b = sp1A.a = 0xFF;
temp_r31 = fn_1_58E0(arg0, &sp2C, &sp20, 0.0f, &sp1A);
if (!temp_r31)
break;
temp_r31->unk4C = -1;
temp_f31 = ((((rand8() << 8) | rand8()) % 81) - 40);
temp_r31->unk0.x = (13.0 * cosd(temp_f31));
temp_r31->unk0.y = 0.1f * ((((rand8() << 8) | rand8()) % 21) + 20);
temp_r31->unk0.z = (9.0 * sin((M_PI * temp_f31) / 180.0));
temp_r31->unkC.x = (0.05f * temp_r31->unk0.x);
temp_r31->unkC.z = (0.05f * temp_r31->unk0.z);
temp_r31->unk18 = 500.0f;
temp_r31->unk1C = ((((rand8() << 8) | rand8()) % 21) + 40);
}
}
void fn_1_5408(ModelData *arg0, struct _unkStruct6 *arg1, Mtx arg2)
{
s16 var_r29;
GXColor *var_r30;
unkStruct5 *var_r31;
var_r29 = 0;
var_r31 = arg1->unk18;
var_r30 = arg1->unk24;
for (; var_r29 < arg1->unk0; var_r29++, var_r31++, var_r30++) {
if (var_r31->unk4E != 0) {
switch (var_r31->unk2C) {
case 0:
var_r31->unk0.y -= 0.1f;
var_r31->unk40.x += var_r31->unk0.x;
var_r31->unk40.y += var_r31->unk0.y;
var_r31->unk40.z += var_r31->unk0.z;
var_r31->unk18 += var_r31->unk1C;
if (var_r31->unk18 > 255.0f) {
var_r31->unk18 = 255.0f;
}
var_r30->r = var_r30->g = var_r30->b = var_r31->unk18;
break;
case 1:
var_r31->unk40.x += var_r31->unk0.x;
var_r31->unk40.z += var_r31->unk0.z;
break;
}
var_r31->unk20 -= var_r31->unk24;
if (var_r31->unk20 < 0.0f) {
var_r31->unk20 = 0.0f;
}
var_r30->a = var_r31->unk20;
var_r31->unk28++;
if (var_r31->unk28 >= var_r31->unk2A) {
var_r31->unk28 = 0;
var_r31->unk4C++;
}
if (var_r31->unk4C >= (arg1->unk14 - 2)) {
var_r31->unk4E = 0;
}
}
}
}
void fn_1_55E0(ModelData *arg0, struct _unkStruct6 *arg1, Mtx arg2)
{
GXColor *var_r30;
f32 var_f31;
f32 var_f30;
s16 var_r29;
s32 var_r28;
unkStruct5 *var_r31;
var_r29 = 0;
var_r31 = arg1->unk18;
var_r30 = arg1->unk24;
for (; var_r29 < arg1->unk0; var_r29++, var_r31++, var_r30++) {
if (var_r31->unk4E != 0) {
var_r31->unk0.x -= var_r31->unkC.x;
var_r31->unk0.y -= 0.2f;
var_r31->unk0.z -= var_r31->unkC.z;
if (var_r31->unk0.x < var_r31->unkC.x) {
var_r31->unk0.x = var_r31->unkC.x;
}
if (var_r31->unkC.z < 0.0f) {
var_f31 = -var_r31->unkC.z;
}
else {
var_f31 = var_r31->unkC.z;
}
if (var_r31->unk0.z < 0.0f) {
var_f30 = -var_r31->unk0.z;
}
else {
var_f30 = var_r31->unk0.z;
}
if (var_f30 < var_f31) {
var_r31->unk0.z = var_r31->unkC.z;
}
var_r31->unk40.x += var_r31->unk0.x;
var_r31->unk40.y += var_r31->unk0.y;
var_r31->unk40.z += var_r31->unk0.z;
var_r31->unk18 -= var_r31->unk1C;
if (var_r31->unk18 < 0.0f) {
var_r31->unk18 = 0.0f;
}
if (var_r31->unk18 > 255.0f) {
var_r28 = 0xFF;
}
else {
var_r28 = (u8)var_r31->unk18;
}
var_r30->a = var_r28;
if (0.0f == var_r31->unk18) {
var_r31->unk4E = 0;
}
}
}
}
void fn_1_57DC(ModelData *arg0, struct _unkStruct6 *arg1, Mtx arg2)
{
Vec sp18;
Vec spC;
GXColor sp8;
ModelData *temp_r30;
unkStruct5 *temp_r31;
temp_r30 = &Hu3DData[lbl_1_bss_DC->model[4]];
temp_r31 = arg1->unk18;
if (temp_r31->unk4E == 0) {
spC.x = spC.y = spC.z = 1.0f;
sp8.r = sp8.g = sp8.b = sp8.a = 0xFF;
fn_1_58E0(lbl_1_bss_E0->model[2], &sp18, &spC, 0.0f, &sp8);
}
temp_r31->unk40.x = (60.0f + temp_r30->pos.x);
temp_r31->unk40.y = (260.0f + temp_r30->pos.y);
temp_r31->unk40.z = temp_r30->pos.z;
}
unkStruct5 *fn_1_58E0(s16 arg0, Vec *arg1, Vec *arg2, f32 arg3, GXColor *arg4)
{
s16 var_r29;
unkStruct5 *var_r31;
unkStruct6 *temp_r30;
ModelData *var_r28;
var_r28 = &Hu3DData[arg0];
temp_r30 = (unkStruct6 *)var_r28->unk_120;
var_r29 = 0;
var_r31 = temp_r30->unk18;
for (; var_r29 < temp_r30->unk0; var_r29++, var_r31++) {
if (var_r31->unk4E == 0) {
break;
}
}
if (var_r29 == temp_r30->unk0) {
return NULL;
}
temp_r30->unk24[var_r29].r = arg4->r;
temp_r30->unk24[var_r29].g = arg4->g;
temp_r30->unk24[var_r29].b = arg4->b;
temp_r30->unk24[var_r29].a = arg4->a;
var_r31->unk2E = var_r29;
var_r31->unk30 = arg3;
var_r31->unk34 = *arg2;
var_r31->unk40 = *arg1;
var_r31->unk4C = 0;
var_r31->unk4E = 1;
return var_r31;
}
s16 fn_1_5A18(AnimData *arg0, s16 arg1, f32 arg8, s16 arg2, s16 arg3)
{
ModelData *temp_r28;
f32 temp_f0;
s16 var_r21;
s16 var_r22;
s16 var_r30;
s16 var_r20;
unkStruct6 *var_r31;
void *var_r19;
void *var_r18;
unkStruct5 *var_r24;
Vec *var_r25;
GXColor *var_r27;
HsfVector2f *var_r29;
var_r21 = Hu3DHookFuncCreate(fn_1_602C);
temp_r28 = &Hu3DData[var_r21];
var_r31 = HuMemDirectMallocNum(HEAP_DATA, sizeof(unkStruct6), temp_r28->unk_48);
temp_r28->unk_120 = var_r31;
arg0->useNum++;
var_r31->unk10 = arg0;
var_r31->unk0 = arg1;
var_r31->unk8 = 0;
var_r31->unkC = NULL;
var_r24 = HuMemDirectMallocNum(HEAP_DATA, arg1 * sizeof(unkStruct5), temp_r28->unk_48);
var_r31->unk18 = var_r24;
for (var_r30 = 0; var_r30 < arg1; var_r30++, var_r24++) {
var_r24->unk4C = -1;
var_r24->unk4E = 0;
}
var_r25 = HuMemDirectMallocNum(HEAP_DATA, arg1 * sizeof(Vec) * 4, temp_r28->unk_48);
var_r31->unk1C = var_r25;
for (var_r30 = 0; var_r30 < (arg1 * 4); var_r30++, var_r25++) {
var_r25->x = var_r25->y = var_r25->z = 0.0f;
}
var_r27 = HuMemDirectMallocNum(HEAP_DATA, arg1 * sizeof(GXColor), temp_r28->unk_48);
var_r31->unk24 = var_r27;
for (var_r30 = 0; var_r30 < arg1; var_r30++, var_r27++) {
var_r27->r = var_r27->g = var_r27->b = var_r27->a = 0xFF;
}
var_r29 = HuMemDirectMallocNum(HEAP_DATA, arg1 * sizeof(HsfVector2f) * 4, temp_r28->unk_48);
var_r31->unk20 = var_r29;
for (var_r30 = 0; var_r30 < arg1; var_r30++) {
var_r29->x = 0.0f;
var_r29->y = 0.0f;
var_r29++;
var_r29->x = 1.0f;
var_r29->y = 0.0f;
var_r29++;
var_r29->x = 1.0f;
var_r29->y = 1.0f;
var_r29++;
var_r29->x = 0.0f;
var_r29->y = 1.0f;
var_r29++;
}
if ((arg2 != 0) || (arg3 != 0)) {
var_r22 = arg0->bmp->sizeX / arg2;
var_r20 = arg0->bmp->sizeY / arg3;
var_r31->unk14 = (var_r22 * var_r20);
var_r31->unk60 = (1.0f / var_r22);
var_r31->unk64 = (1.0f / var_r20);
}
else {
var_r22 = 1;
var_r31->unk14 = 1;
var_r31->unk60 = 1.0f;
var_r31->unk64 = 1.0f;
}
var_r31->unk5C = HuMemDirectMallocNum(HEAP_DATA, var_r31->unk14 * sizeof(HsfVector2f), temp_r28->unk_48);
fn_1_6608(var_r31->unk5C, var_r31->unk14, var_r22, var_r31->unk60, var_r31->unk64);
var_r31->unk2C.x = var_r31->unk50.x = var_r31->unk44.y = var_r31->unk50.y = -arg8;
var_r31->unk38.x = var_r31->unk44.x = var_r31->unk2C.y = var_r31->unk38.y = arg8;
var_r31->unk2C.z = var_r31->unk38.z = var_r31->unk44.z = var_r31->unk50.z = 0.0f;
var_r19 = var_r18 = HuMemDirectMallocNum(HEAP_DATA, 0x20000, temp_r28->unk_48);
DCFlushRange(var_r19, 0x20000);
GXBeginDisplayList(var_r19, 0x20000);
GXBegin(GX_QUADS, GX_VTXFMT0, (arg1 * 4));
for (var_r30 = 0; var_r30 < arg1; var_r30++) {
GXPosition1x16(var_r30 * 4);
GXColor1x16(var_r30);
GXTexCoord1x16(var_r30 * 4);
GXPosition1x16((var_r30 * 4) + 1);
GXColor1x16(var_r30);
GXTexCoord1x16((var_r30 * 4) + 1);
GXPosition1x16((var_r30 * 4) + 2);
GXColor1x16(var_r30);
GXTexCoord1x16((var_r30 * 4) + 2);
GXPosition1x16((var_r30 * 4) + 3);
GXColor1x16(var_r30);
GXTexCoord1x16((var_r30 * 4) + 3);
}
var_r31->unk4 = GXEndDisplayList();
var_r31->unk28 = HuMemDirectMallocNum(HEAP_DATA, var_r31->unk4, temp_r28->unk_48);
memcpy(var_r31->unk28, var_r18, var_r31->unk4);
DCFlushRange(var_r31->unk28, var_r31->unk4);
HuMemDirectFree(var_r18);
return var_r21;
}
void fn_1_5F5C(s16 arg0)
{
ModelData *var_r31;
unkStruct6 *var_r30;
var_r31 = &Hu3DData[arg0];
var_r30 = (unkStruct6 *)var_r31->unk_120;
HuSprAnimKill(var_r30->unk10);
Hu3DModelKill(arg0);
}
void fn_1_5FBC(s16 arg0, m409Func6 arg1)
{
ModelData *var_r31;
unkStruct6 *var_r30;
var_r31 = &Hu3DData[arg0];
var_r30 = (unkStruct6 *)var_r31->unk_120;
var_r30->unkC = arg1;
}
void fn_1_5FF4(s16 arg0, u8 arg1)
{
ModelData *var_r31;
unkStruct6 *var_r30;
var_r31 = &Hu3DData[arg0];
var_r30 = (unkStruct6 *)var_r31->unk_120;
var_r30->unk8 = arg1;
}
void fn_1_602C(ModelData *arg0, f32 (*arg1)[4])
{
Mtx sp128;
ROMtx spF8;
Mtx spC8;
Mtx sp98;
Vec sp68[4];
Vec sp5C;
Vec sp50;
Vec sp44;
Vec sp38;
Vec sp2C;
Vec sp20;
Vec sp14;
Vec sp8;
Vec *var_r31;
s16 var_r24;
HsfVector2f *var_r26;
s16 var_r25;
unkStruct6 *temp_r30;
unkStruct5 *var_r29;
m409Func6 var_r23;
temp_r30 = (unkStruct6 *)arg0->unk_120;
GXLoadPosMtxImm(arg1, 0);
GXSetNumTevStages(1);
GXSetNumTexGens(1);
GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY, GX_FALSE, GX_PTIDENTITY);
GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0);
var_r24 = temp_r30->unk10->bmp->dataFmt & 0xF;
if ((var_r24 == 7) || (var_r24 == 8)) {
GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_ONE, GX_CC_RASC, GX_CC_ZERO);
}
else {
GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_TEXC, GX_CC_RASC, GX_CC_ZERO);
}
GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_TEXA, GX_CA_RASA, GX_CA_ZERO);
GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
GXSetNumChans(1);
GXSetChanCtrl(GX_COLOR0A0, GX_FALSE, GX_SRC_REG, GX_SRC_VTX, 0, GX_DF_CLAMP, GX_AF_NONE);
if ((arg0->attr & 2) != 0) {
GXSetZMode(GX_TRUE, GX_LEQUAL, GX_TRUE);
}
else {
GXSetZMode(GX_TRUE, GX_LEQUAL, GX_FALSE);
}
HuSprTexLoad(temp_r30->unk10, 0, 0, GX_REPEAT, GX_REPEAT, GX_LINEAR);
GXSetAlphaCompare(GX_GEQUAL, 1, GX_AOP_AND, GX_GEQUAL, 1);
GXSetZCompLoc(0);
switch (temp_r30->unk8) {
case 0:
GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_NOOP);
break;
case 1:
GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_ONE, GX_LO_NOOP);
break;
case 2:
GXSetBlendMode(GX_BM_BLEND, GX_BL_ZERO, GX_BL_INVDSTCLR, GX_LO_NOOP);
break;
}
GXClearVtxDesc();
GXSetVtxDesc(GX_VA_POS, GX_INDEX16);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0);
GXSetArray(GX_VA_POS, temp_r30->unk1C, 12);
GXSetVtxDesc(GX_VA_CLR0, GX_INDEX16);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0);
GXSetArray(GX_VA_CLR0, temp_r30->unk24, 4);
GXSetVtxDesc(GX_VA_TEX0, GX_INDEX16);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0);
GXSetArray(GX_VA_TEX0, temp_r30->unk20, 8);
fn_1_40A4(arg1, sp128);
PSMTXReorder(sp128, spF8);
if (((u8)omPauseChk() == 0) && (temp_r30->unkC)) {
var_r23 = temp_r30->unkC;
var_r23(arg0, temp_r30, arg1);
}
var_r29 = temp_r30->unk18;
var_r31 = temp_r30->unk1C;
var_r26 = temp_r30->unk20;
PSMTXROMultVecArray(spF8, &temp_r30->unk2C, &sp68[0], 4);
for (var_r25 = 0; var_r25 < temp_r30->unk0; var_r25++, var_r29++, var_r26 += 4) {
if (var_r29->unk4E == 0) {
var_r31->x = var_r31->y = var_r31->z = 0.0f;
var_r31++;
var_r31->x = var_r31->y = var_r31->z = 0.0f;
var_r31++;
var_r31->x = var_r31->y = var_r31->z = 0.0f;
var_r31++;
var_r31->x = var_r31->y = var_r31->z = 0.0f;
var_r31++;
}
else {
if (var_r29->unk30 == 0.0f) {
fn_1_6778(&sp68[0], &sp38, &var_r29->unk34, 4);
VECAdd(&sp38, &var_r29->unk40, var_r31++);
VECAdd(&sp44, &var_r29->unk40, var_r31++);
VECAdd(&sp50, &var_r29->unk40, var_r31++);
VECAdd(&sp5C, &var_r29->unk40, var_r31++);
}
else {
fn_1_6778(&temp_r30->unk2C, &sp38, &var_r29->unk34, 4);
PSMTXRotRad(spC8, 0x5A, 0.017453292f * var_r29->unk30);
PSMTXConcat(sp128, spC8, sp98);
PSMTXMultVecArray(sp98, &sp38, &sp8, 4);
VECAdd(&sp8, &var_r29->unk40, var_r31++);
VECAdd(&sp14, &var_r29->unk40, var_r31++);
VECAdd(&sp20, &var_r29->unk40, var_r31++);
VECAdd(&sp2C, &var_r29->unk40, var_r31++);
}
if (var_r29->unk4C != -1) {
fn_1_66D4(var_r26, temp_r30->unk5C, var_r29->unk4C, temp_r30->unk60, temp_r30->unk64);
}
}
}
DCFlushRangeNoSync(temp_r30->unk1C, temp_r30->unk0 * 0xC * 4);
DCFlushRangeNoSync(temp_r30->unk20, temp_r30->unk0 * 8 * 4);
PPCSync();
GXCallDisplayList(temp_r30->unk28, temp_r30->unk4);
}
void fn_1_6608(HsfVector2f *arg0, s16 arg1, s16 arg2, f32 arg3, f32 arg4)
{
s16 var_r31;
s16 var_r30;
s16 var_r29;
for (var_r31 = 0; var_r31 < arg1; var_r31++, arg0++) {
var_r30 = (var_r31 % arg2);
var_r29 = (var_r31 / arg2);
arg0->x = (var_r30 * arg3);
arg0->y = (var_r29 * arg4);
}
}
void fn_1_66D4(HsfVector2f *arg0, HsfVector2f *arg1, s16 arg2, f32 arg3, f32 arg4)
{
arg0[0].x = arg1[arg2].x;
arg0[0].y = arg1[arg2].y;
arg0[1].x = (arg3 + arg1[arg2].x);
arg0[1].y = arg1[arg2].y;
arg0[2].x = (arg3 + arg1[arg2].x);
arg0[2].y = (arg4 + arg1[arg2].y);
arg0[3].x = arg1[arg2].x;
arg0[3].y = (arg4 + arg1[arg2].y);
}
void fn_1_6778(Vec *arg0, Vec *arg1, Vec *arg2, s16 arg3)
{
s16 var_r31;
for (var_r31 = 0; var_r31 < arg3; var_r31++, arg0++, arg1++) {
arg1->x = arg0->x * arg2->x;
arg1->y = arg0->y * arg2->y;
arg1->z = arg0->z * arg2->z;
}
}