Finished m421Dll

This commit is contained in:
dbalatoni13 2024-11-25 12:47:58 +01:00
parent 0acb3abd08
commit f5e953cd61
6 changed files with 2424 additions and 200 deletions

View file

@ -1,5 +1,3 @@
#include "dolphin/gx/GXEnum.h"
#include "dolphin/gx/GXVert.h"
#include "ext_math.h"
#include "game/audio.h"
#include "game/gamework.h"
@ -22,27 +20,24 @@ typedef struct M421DllWork {
u32 unk_00;
s32 unk_04;
s32 unk_08;
u32 unk0C;
u32 unk_0C;
s32 unk_10;
u32 unk_14;
u32 unk_18;
u32 unk_1C;
u32 unk_20;
u32 unk24;
s32 unk28;
u32 unk_28;
u32 unk_2C;
s32 unk30;
char unk34[0x4];
u32 unk38;
s32 unk3C;
s32 unk40;
s32 unk44;
s32 unk48;
s32 unk4C;
u32 unk50;
s32 unk54[4];
s32 unk64[4];
} M421DllWork; /* size = 0x74 */ // TODO check the fields, they are copy pasted
s32 unk_30[4];
s32 unk_40[4];
s32 unk_50[4];
u32 unk_60;
u32 unk_64;
u32 unk_68;
u32 unk_6C;
s32 unk_70;
} M421DllWork; /* size = 0x74 */
void fn_1_10EC(omObjData *object);
void fn_1_142C(omObjData *object);
@ -66,6 +61,24 @@ void fn_1_784(omObjData *object);
void fn_1_8B8(omObjData *object);
void fn_1_CBC(omObjData *object);
Vec lbl_1_data_0 = { 100.0f, 800.0f, -100.0f };
Vec lbl_1_data_C = { 0.3f, -0.8f, 0.3f };
Vec lbl_1_data_18 = { 10.0f, 45.0f, 3500.0f };
GXColor lbl_1_data_24 = { 0xFF, 0xFF, 0xFF, 0xFF };
Vec lbl_1_data_28 = { 50.0f, 150000.0f, 50.0f };
Vec lbl_1_data_34 = { 0.0f, 1.0f, 0.0f };
Vec lbl_1_data_40 = { 0.0f, 0.0f, 0.0f };
Vec lbl_1_data_4C[3] = {
{ 0.0f, 200.0f, -50.0f },
{ 0.0f, 200.0f, -50.0f },
{ 0.0f, 200.0f, -50.0f },
};
Vec lbl_1_data_70[3] = {
{ -37.5f, 0.0f, 1500.0f },
{ -37.5f, 0.0f, 1500.0f },
{ -37.5f, 0.0f, 2300.0f },
};
s32 lbl_1_data_94[3] = { 0xF0, 0x1E, 0 };
GXColor lbl_1_data_A0 = { 0, 0, 0, 0 };
Process *lbl_1_bss_28;
@ -74,7 +87,7 @@ omObjData *lbl_1_bss_20;
// M421DllCameraStruct
omObjData *lbl_1_bss_1C;
s16 lbl_1_bss_18;
s16 lbl_1_bss_12;
s16 lbl_1_bss_12[3];
s16 lbl_1_bss_10;
s16 lbl_1_bss_E;
s16 lbl_1_bss_C;
@ -82,21 +95,92 @@ s32 lbl_1_bss_8;
s32 lbl_1_bss_4;
s32 lbl_1_bss_0;
void fn_1_578(omObjData *var_r29)
void ObjectSetup(void)
{
Mtx sp2C;
Vec sp20 = { 0.0f, 0.0f, 0.0f };
Vec sp14 = { 0.0f, 0.0f, -1.0f };
Vec sp8;
Process *process;
LightData *lightData;
lbl_1_bss_8 = 0;
HuAudSndGrpSet(0x2E);
HuAudFXListnerSetEX(&sp20, &sp14, 11200.0f, 4166.6665f, 0.0f, 300.0f, 0.0f);
lbl_1_bss_4 = lbl_1_bss_0 = -1;
lbl_1_bss_18 = -1;
lbl_1_data_28.x = 200.0f;
lbl_1_data_28.y = 1200.0f;
lbl_1_data_28.z = 160.0f;
lbl_1_data_34.x = 0.0f;
lbl_1_data_34.y = 1.0f;
lbl_1_data_34.z = 0.0f;
lbl_1_data_40.x = 0.0f;
lbl_1_data_40.y = 0.0f;
lbl_1_data_40.z = 0.0f;
Hu3DShadowCreate(22.0f, 20.0f, 25000.0f);
Hu3DShadowTPLvlSet(0.625f);
Hu3DShadowPosSet(&lbl_1_data_28, &lbl_1_data_34, &lbl_1_data_40);
lbl_1_bss_12[0] = Hu3DGLightCreateV(&lbl_1_data_0, &lbl_1_data_C, &lbl_1_data_24);
Hu3DGLightInfinitytSet(lbl_1_bss_12[0]);
lightData = &Hu3DGlobalLight[lbl_1_bss_12[0]];
lightData->unk_00 |= 0x8000;
lbl_1_data_18.x = 1.0f;
lbl_1_data_18.y = 0.0f;
lbl_1_data_18.z = 4200.0f;
sp8.x = sp8.z = 0.0f;
sp8.y = lbl_1_data_18.z;
mtxRot(sp2C, lbl_1_data_18.x, lbl_1_data_18.y, 0.0f);
PSMTXMultVec(sp2C, &sp8, &lbl_1_data_28);
Hu3DGLightPosAimSetV(lbl_1_bss_12[0], &lbl_1_data_28, &lbl_1_data_40);
Hu3DShadowPosSet(&lbl_1_data_28, &lbl_1_data_34, &lbl_1_data_40);
lbl_1_bss_10 = lbl_1_bss_E = lbl_1_bss_C = -1;
process = omInitObjMan(0x32, 0x2000);
lbl_1_bss_28 = process;
omGameSysInit(process);
fn_1_3020(process);
lbl_1_bss_24 = omAddObjEx(process, 0xA, 0, 0, -1, fn_1_4A0);
fn_1_B15C(process);
fn_1_4648(process);
}
void fn_1_4A0(omObjData *object)
{
M421DllWork *work;
object->data = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(M421DllWork), MEMORY_DEFAULT_NUM);
work = object->data;
memset(work, 0, sizeof(M421DllWork));
work->unk_00 = 0;
work->unk_04 = 0;
work->unk_0C = 0;
work->unk_10 = 0;
work->unk_14 = 0;
work->unk_18 = 0;
work->unk_28 = 0;
work->unk_2C = 0;
work->unk_08 = 0;
work->unk_64 = 2;
work->unk_50[0] = work->unk_50[1] = work->unk_50[2] = work->unk_50[3] = -1;
work->unk_68 = 0;
work->unk_70 = 0;
object->func = fn_1_8B8;
}
void fn_1_578(omObjData *object)
{
Vec sp14;
Vec sp8;
M421DllCameraStruct *var_r31;
M421DllWork *var_r30;
var_r30 = var_r29->data;
var_r30->unk_04++;
var_r30->unk_10++;
var_r30->unk_18++;
var_r30->unk_2C++;
if ((omSysExitReq != 0) && (var_r30->unk_00 != 5)) {
var_r30->unk_00 = 4;
fn_1_784(var_r29);
M421DllWork *work = object->data;
work->unk_04++;
work->unk_10++;
work->unk_18++;
work->unk_2C++;
if ((omSysExitReq != 0) && (work->unk_00 != 5)) {
work->unk_00 = 4;
fn_1_784(object);
}
var_r31 = fn_1_3B78(1);
sp8.x = -(sind(var_r31->unk_28.y) * cosd(var_r31->unk_28.x));
@ -182,7 +266,7 @@ void fn_1_142C(omObjData *object)
case 0:
work->unk_1C = 0x2D;
work->unk_20 = 0x3C;
lbl_1_bss_18 = MGSeqCreate(3, 0);
lbl_1_bss_10 = MGSeqCreate(3, 0);
MGSeqPosSet(lbl_1_bss_10, 320.0f, 240.0f);
lbl_1_bss_18 = -1;
work->unk_14 = 1;
@ -192,7 +276,7 @@ void fn_1_142C(omObjData *object)
if ((lbl_1_bss_4 < 0) && ((MGSeqStatGet(lbl_1_bss_10) & 0x10) != 0)) {
lbl_1_bss_4 = HuAudSeqPlay(0x48);
}
if (MGSeqStatGet(lbl_1_bss_18) == 0 && (work->unk_08 == 0)) {
if (MGSeqStatGet(lbl_1_bss_10) == 0 && (work->unk_08 == 0)) {
work->unk_14 = 2;
work->unk_18 = 0;
object->func = fn_1_1850;
@ -201,6 +285,61 @@ void fn_1_142C(omObjData *object)
}
}
void fn_1_1850(omObjData *object)
{
M421DllWork *work = object->data;
s32 var_r26 = 0;
fn_1_578(object);
if (--work->unk_20 == 0) {
work->unk_20 = 0x3C;
work->unk_1C--;
if ((work->unk_1C == 0) && (work->unk_64 == 2)) {
work->unk_64 = 1;
var_r26 = 1;
}
}
if (lbl_1_bss_18 < 0) {
lbl_1_bss_18 = MGSeqCreate(1, work->unk_1C, -1, -1);
}
MGSeqParamSet(lbl_1_bss_18, 1, work->unk_1C);
if (work->unk_64 != 2) {
var_r26 = 1;
}
if (var_r26 != 0) {
lbl_1_bss_E = MGSeqCreate(3, 1);
MGSeqPosSet(lbl_1_bss_E, 320.0f, 240.0f);
HuAudSeqFadeOut(lbl_1_bss_4, 0x64);
work->unk_14 = 3;
work->unk_18 = 0;
if (work->unk_08 == 0) {
object->func = fn_1_1C90;
}
}
}
void fn_1_1C90(omObjData *object)
{
M421DllWork *work = object->data;
s32 var_r25 = 0;
if (lbl_1_bss_18 >= 0) {
MGSeqParamSet(lbl_1_bss_18, 2, -1);
lbl_1_bss_18 = -1;
}
fn_1_578(object);
if (work->unk_14 == 3) {
var_r25 = 1;
if ((MGSeqStatGet(lbl_1_bss_E) == 0) && (work->unk_68 == 0x1111) && (var_r25 != 0)) {
work->unk_14 = 4;
work->unk_18 = 0;
}
}
else {
work->unk_14 = 5;
work->unk_18 = 0;
fn_1_784(object);
}
}
omObjFunc fn_1_213C(Process *process, omObjData *object)
{
M421DllCameraStruct *var_r31;
@ -213,6 +352,121 @@ omObjFunc fn_1_213C(Process *process, omObjData *object)
return fn_1_21AC;
}
void fn_1_21AC(omObjData *object)
{
Vec sp20;
float var_f31;
M421DllCameraStruct *var_r30;
M421DllWork *work;
work = object->data;
fn_1_578(object);
work->unk_0C = 1;
object->work[0]++;
var_f31 = (float)object->work[0] / lbl_1_data_94[object->work[1]];
VECSubtract(&lbl_1_data_4C[object->work[1] + 1], &lbl_1_data_4C[object->work[1]], &sp20);
VECScale(&sp20, &sp20, var_f31);
VECAdd(&lbl_1_data_4C[object->work[1]], &sp20, &sp20);
Center.x = sp20.x;
Center.y = sp20.y;
Center.z = sp20.z;
VECSubtract(&lbl_1_data_70[object->work[1] + 1], &lbl_1_data_70[object->work[1]], &sp20);
VECScale(&sp20, &sp20, var_f31);
VECAdd(&lbl_1_data_70[object->work[1]], &sp20, &sp20);
CRot.x = sp20.x;
CRot.y = sp20.y;
CRot.z = 0.0f;
CZoom = sp20.z;
var_r30 = fn_1_3CB0(0);
var_r30->unk_1C = Center;
var_r30->unk_28 = CRot;
var_r30->unk_34 = CZoom;
var_r30->unk_94++;
if (var_r30->unk_94 > 180.0f) {
var_r30->unk_84 -= 0.025000002f;
if (var_r30->unk_84 < 0.0f) {
var_r30->unk_84 = 0.0f;
}
var_r30->unk_1C.x += var_r30->unk_84 * ((0.02f * frandmod(0x3E8)) - 10.0f);
var_r30->unk_1C.y += var_r30->unk_84 * ((0.02f * frandmod(0x3E8)) - 10.0f);
var_r30->unk_1C.z += var_r30->unk_84 * ((0.02f * frandmod(0x3E8)) - 10.0f);
}
if (var_f31 >= 1.0f) {
object->work[0] = 0;
object->work[1]++;
if (lbl_1_data_94[object->work[1]] == 0) {
work->unk_0C = 2;
fn_1_784(object);
}
}
}
omObjFunc fn_1_2A28(Process *process, omObjData *object)
{
M421DllCameraStruct *var_r31;
s32 var_r30;
M421DllWork *var_r29;
s32 var_r28;
var_r29 = object->data;
var_r28 = 1;
var_r31 = fn_1_3CB0(0);
if (var_r29->unk_64 == 1) {
var_r28 = 0;
}
for (var_r30 = 0; var_r30 < 4; var_r30++) {
var_r29->unk_50[var_r30] = -1;
if ((var_r29->unk_40[var_r30] == 0) == var_r28) {
var_r29->unk_50[var_r30] = var_r29->unk_30[var_r30];
}
}
for (var_r30 = 0; var_r30 < 4; var_r30++) {
if (var_r29->unk_50[var_r30] >= 0) {
GWPlayerCoinWinAdd(var_r30, 10);
}
}
var_r31->unk_54 = 0.0f;
var_r31->unk_58 = 150.0f;
var_r31->unk_5C = 0.0f;
var_r31->unk_60 = -30.0f;
var_r31->unk_64 = 0.0f;
var_r31->unk_68 = 1000.0f;
var_r31->unk_84 = 0.0f;
return fn_1_2BB8;
}
void fn_1_2BB8(omObjData *var_r29)
{
M421DllCameraStruct *var_r31;
M421DllWork *var_r28;
var_r28 = var_r29->data;
var_r31 = fn_1_3CB0(0);
fn_1_578(var_r29);
var_r31->unk_84 += 0.0016666668f;
if (var_r31->unk_84 > 0.1f) {
var_r31->unk_84 = 0.1f;
}
var_r31->unk_1C.y += var_r31->unk_84 * (var_r31->unk_58 - var_r31->unk_1C.y);
var_r31->unk_1C.z += var_r31->unk_84 * (var_r31->unk_5C - var_r31->unk_1C.z);
var_r31->unk_28.x = fn_1_4478(var_r31->unk_28.x, var_r31->unk_60, var_r31->unk_84);
var_r31->unk_34 += var_r31->unk_84 * (var_r31->unk_68 - var_r31->unk_34);
if (var_r28->unk_6C == 0x1111) {
var_r28->unk_28 = 1;
if (lbl_1_bss_0 < 0) {
lbl_1_bss_0 = HuAudSStreamPlay(1);
}
if (lbl_1_bss_C < 0) {
lbl_1_bss_C = MGSeqCreate(5, 3, var_r28->unk_50[0], var_r28->unk_50[1], var_r28->unk_50[2], var_r28->unk_50[3]);
return;
}
if ((MGSeqStatGet(lbl_1_bss_C) == 0) && (var_r28->unk_2C >= 210.0f)) {
var_r28->unk_28 = 2;
fn_1_784(var_r29);
}
}
}
void fn_1_3020(Process *process)
{
Hu3DCameraCreate(0x1F);
@ -275,7 +529,7 @@ void fn_1_3334(omObjData *object)
fn_1_335C(object);
}
void fn_1_335C(omObjData *var_r28)
void fn_1_335C(omObjData *object)
{
float var_f31;
M421DllCameraStruct *var_r31;
@ -289,7 +543,7 @@ void fn_1_335C(omObjData *var_r28)
u32 var_r22;
u32 var_r21;
var_r27 = var_r28->data;
var_r27 = object->data;
{
s32 sp40[4] = { 2, 4, 8, 16 };
u32 sp30[4];
@ -299,7 +553,7 @@ void fn_1_335C(omObjData *var_r28)
var_r24 = 0;
var_r26 = 0;
memcpy(&var_r27[5], var_r27, 5 * sizeof(M421DllCameraStruct));
switch (var_r28->work[1]) {
switch (object->work[1]) {
case 0:
break;
case 1:
@ -314,10 +568,10 @@ void fn_1_335C(omObjData *var_r28)
break;
}
if (var_r24 != 0) {
Hu3DModelAttrReset(var_r28->model[0], HU3D_ATTR_DISPOFF);
Hu3DModelAttrReset(object->model[0], HU3D_ATTR_DISPOFF);
}
else {
Hu3DModelAttrSet(var_r28->model[0], HU3D_ATTR_DISPOFF);
Hu3DModelAttrSet(object->model[0], HU3D_ATTR_DISPOFF);
}
for (var_r30 = 0; var_r30 < 4; var_r30++) {
sp30[var_r30] = var_r27[var_r30 + 6].unk_04;
@ -509,18 +763,86 @@ void fn_1_3D84(s32 arg0, s32 arg1)
}
}
s32 fn_1_3E1C(void)
{
return ((M421DllWork *)lbl_1_bss_24->data)->unk_00;
}
u32 fn_1_3E34(void)
{
return ((M421DllWork *)lbl_1_bss_24->data)->unk_0C;
}
u32 fn_1_3E4C(void)
{
return ((M421DllWork *)lbl_1_bss_24->data)->unk_14;
}
u32 fn_1_3E64(void)
{
return ((M421DllWork *)lbl_1_bss_24->data)->unk_28;
}
s32 fn_1_3E7C(s32 arg0)
{
M421DllWork *work = lbl_1_bss_24->data;
if (work->unk_64 != 2) {
return 0;
}
work->unk_60 |= (1 << ((arg0 & 3) * 4));
if (((work->unk_60 & 0x1110) == 0x1110) && (work->unk_64 == 2)) {
work->unk_64 = 0;
}
return 1;
}
s32 fn_1_3EF8(s32 arg0)
{
M421DllWork *work = lbl_1_bss_24->data;
return work->unk_50[arg0];
}
void fn_1_3F28(s32 arg0, s32 arg1, s32 arg2)
{
M421DllWork *work = lbl_1_bss_24->data;
arg0 &= 3;
work->unk_40[arg0] = arg1;
work->unk_30[arg0] = arg2;
}
void fn_1_3F68(s32 arg0)
{
((M421DllWork *)lbl_1_bss_24->data)->unk_68 |= (1 << ((arg0 & 7) * 4));
}
void fn_1_3F98(s32 arg0)
{
((M421DllWork *)lbl_1_bss_24->data)->unk_6C |= (1 << ((arg0 & 3) * 4));
}
void fn_1_3FC8(s32 arg0)
{
((M421DllWork *)lbl_1_bss_24->data)->unk_70 |= (1 << ((arg0 & 3) * 4));
}
s32 fn_1_3FF8(void)
{
return MGSeqStatGet(lbl_1_bss_E) == 0;
}
void fn_1_4030(Vec *sp8, Vec *var_r31)
{
Vec sp10;
float var_f30;
float var_f29;
PSVECSubtract(var_r31, sp8, &sp10);
VECSubtract(var_r31, sp8, &sp10);
Center = *var_r31;
CRot.x = atan2d(sp10.y, sqrtf((sp10.x * sp10.x) + (sp10.z * sp10.z)));
CRot.y = atan2d(-sp10.x, -sp10.z);
CRot.z = 0.0f;
CZoom = PSVECMag(&sp10);
CZoom = VECMag(&sp10);
}
void fn_1_4238(float arg8, float arg9, float argA, float argB, float argC, float argD)
@ -535,12 +857,12 @@ void fn_1_4238(float arg8, float arg9, float argA, float argB, float argC, float
sp30.x = argB;
sp30.y = argC;
sp30.z = argD;
PSVECSubtract(&sp30, &sp3C, &sp24);
VECSubtract(&sp30, &sp3C, &sp24);
Center = sp30;
CRot.x = atan2d(sp24.y, sqrtf((sp24.x * sp24.x) + (sp24.z * sp24.z)));
CRot.y = atan2d(-sp24.x, -sp24.z);
CRot.z = 0.0f;
CZoom = PSVECMag(&sp24);
CZoom = VECMag(&sp24);
}
float fn_1_4478(float arg8, float arg9, float argA)