start m409dll

This commit is contained in:
CreateSource 2024-06-25 22:45:56 -04:00
parent 9f927310ac
commit 90ff851468
2 changed files with 512 additions and 0 deletions

85
include/REL/m409Dll.h Normal file
View file

@ -0,0 +1,85 @@
#include "dolphin.h"
#include "game/object.h"
#include "game/animdata.h"
// types
typedef void (*m409VoidFunc)(void);
typedef struct _unkStruct {
f32 zoom;
Vec center;
Vec rot;
} unkStruct;
typedef struct _unkStruct2 {
GXColor unk0;
Vec unk4;
} unkStruct2; // sizeof 0x10
typedef struct _unkStruct3 {
char unk0[0x2];
s16 unk2;
s16 unk4;
char unk6[0x8];
s16 unkC;
s16 unkE;
s16 unk10;
s16 unk12;
f32 unk14;
} unkStruct3;
// bss
extern Process* lbl_1_bss_E8;
extern s16 lbl_1_bss_E4;
extern omObjData* lbl_1_bss_E0;
extern omObjData* lbl_1_bss_DC;
extern unkStruct3 lbl_1_bss_24;
extern s16 lbl_1_bss_16;
extern s8 lbl_1_bss_14;
extern f32 lbl_1_bss_10;
extern f32 lbl_1_bss_C;
extern s8 lbl_1_bss_A;
extern s16 lbl_1_bss_8;
extern s8 lbl_1_bss_6;
extern s16 lbl_1_bss_4;
extern s16 lbl_1_bss_2;
extern s8 lbl_1_bss_0;
// data
extern Vec lbl_1_data_0;
extern Vec lbl_1_data_C;
extern unkStruct2 lbl_1_data_18;
extern Vec lbl_1_data_28;
extern Vec lbl_1_data_34;
extern Vec lbl_1_data_40;
extern unkStruct lbl_1_data_4C[4];
extern u32 lbl_1_data_BC;
extern s32 lbl_1_data_C0;
// prototypes
extern void ModuleProlog(void);
extern void fn_1_434(omObjData* object);
extern void fn_1_4DC(omObjData* object);
extern s8 fn_1_524(void);
extern s8 fn_1_B80(void);
extern void fn_1_DDC(omObjData* object);
extern void fn_1_F70(omObjData* object);
extern s8 fn_1_10E8(omObjData* object);
extern s8 fn_1_1B74(omObjData* object);
extern void fn_1_2098(omObjData* object);
extern void fn_1_2484(omObjData* object);
extern void fn_1_3840(void);
extern f32 fn_1_4120(f32, f32, f32, f32);
extern void fn_1_4FFC(s16, f32, f32, f32, u8);
extern void fn_1_5408(void);
extern void fn_1_55E0(void);
extern void fn_1_67E0(Process*);
extern void fn_1_6900(void);
// ...
extern void fn_1_2414(s32, s32);
extern u16 fn_1_2454(s32);
extern s16 fn_1_5A18(AnimData*, s32, f32, s32, s32);
extern void fn_1_5FBC(s16, m409VoidFunc);
extern void fn_1_5FF4(s16, s32);
extern void fn_1_5F5C(s16);
extern void fn_1_44F0(s16, f32, f32, f32, s32, s32);

427
src/REL/m409Dll/main.c Normal file
View file

@ -0,0 +1,427 @@
#include "REL/m409Dll.h"
#include "rel_sqrt_consts.h"
#include "math.h"
#include "game/hsfman.h"
#include "game/objsub.h"
#include "game/audio.h"
#include "game/wipe.h"
#include "game/minigame_seq.h"
#include "game/sprite.h"
#include "game/pad.h"
#include "game/hsfmotion.h"
#include "game/gamework_data.h"
// bss
Process* lbl_1_bss_E8;
s16 lbl_1_bss_E4;
omObjData* lbl_1_bss_E0;
omObjData* lbl_1_bss_DC;
unkStruct3 lbl_1_bss_24;
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(2, 0, 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], 1U);
}
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 = cos((M_PI * (-45.0f + (135.0f * var_f30))) / 180.0);
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) * cos((M_PI * CRot.x) / 180.0));
sp8.y = sin((M_PI * CRot.x) / 180.0);
sp8.z = -(cos((M_PI * CRot.y) / 180.0) * cos((M_PI * CRot.x) / 180.0));
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, 0x10000000);
var_r29 = (s16*)object->data;
var_r29[0] = 1;
var_r30 = HuSprAnimRead(HuDataReadNum(0x28000D, 0x10000000));
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(0x28000E, 0x10000000));
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(1, 0, 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 temp_f1;
f32 var_f26;
f32 var_f27;
f32 temp_f29;
f32 temp_f28;
f32 temp_f30;
f32 var_f31;
s8 var_r29;
u8 temp_r0;
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], 0x40000002);
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, (s8)(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, (s8)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, (s8)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;
unkStruct3* temp_r30;
temp_r30 = (unkStruct3*)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;
}