From 7a42fa782d09f10c3f89f00b62a7995d4618c2d8 Mon Sep 17 00:00:00 2001 From: CreateSource Date: Sat, 9 Mar 2024 21:20:03 -0500 Subject: [PATCH] halfway through mg_setup also fixed up m401 --- src/REL/m401Dll/m401Dll.c | 38 +-- src/REL/m401Dll/m401Dll.h | 47 ++-- src/game/board/mg_setup.c | 579 +++++++++++++++++++++++++++++++++++++- 3 files changed, 617 insertions(+), 47 deletions(-) diff --git a/src/REL/m401Dll/m401Dll.c b/src/REL/m401Dll/m401Dll.c index 020305ca..3c19e79f 100644 --- a/src/REL/m401Dll/m401Dll.c +++ b/src/REL/m401Dll/m401Dll.c @@ -220,8 +220,8 @@ void fn_2_C1C(unkStructBSS114* arg0) { void fn_2_11D0(unkStructBSS114* arg0) { unkStructBSS114* sp1C; - Vec3f sp18; - Vec3f spC; + Vec sp18; + Vec spC; unkSubstructBSS114* sp8; unkSubstructBSS114* temp_r31; s32 i; @@ -341,9 +341,9 @@ void fn_2_1858(s16 arg0, s16 arg1) { } // void fn_2_1A38(unkStructBSS114* arg0) { -// Vec3f sp20; -// Vec3f sp14; -// Vec3f sp8; +// Vec sp20; +// Vec sp14; +// Vec sp8; // unkStructBSS114 *temp; // unkStructBSS114 *temp2; @@ -364,8 +364,8 @@ void fn_2_1858(s16 arg0, s16 arg1) { // } // void fn_2_1B80(unkStructBSS114* arg0) { -// Vec3f sp14; -// Vec3f sp8; +// Vec sp14; +// Vec sp8; // unkStructBSS114* temp; // unkStructBSS114* temp2; @@ -384,9 +384,9 @@ void fn_2_1858(s16 arg0, s16 arg1) { // } // void fn_2_1CF0(unkStructBSS114* arg0) { -// Vec3f sp20; -// Vec3f sp14; -// Vec3f sp8; +// Vec sp20; +// Vec sp14; +// Vec sp8; // unkStructBSS114 *temp; // temp = Hu3DModelObjPtrGet(arg0->unk_40->unk_00[0], lbl_2_data_124[2]); @@ -404,10 +404,10 @@ void fn_2_1858(s16 arg0, s16 arg1) { // } // void fn_2_1DE8(unkStructBSS114* arg0) { -// Vec3f sp2C; -// Vec3f sp20; -// Vec3f sp14; -// Vec3f sp8; +// Vec sp2C; +// Vec sp20; +// Vec sp14; +// Vec sp8; // unkStructBSS114 *temp2; // unkStructBSS114 *temp; @@ -440,7 +440,7 @@ void fn_2_1858(s16 arg0, s16 arg1) { // } // void fn_2_20B0(omObjData* arg0) { -// Vec3f sp8; +// Vec sp8; // omObjData* temp; // temp = Hu3DModelObjPtrGet(arg0->model[0], lbl_2_data_124[4]); @@ -461,10 +461,10 @@ void fn_2_1858(s16 arg0, s16 arg1) { // } // void fn_2_21F8(omObjData* arg0) { -// Vec3f sp2C; -// Vec3f sp20; -// Vec3f sp14; -// Vec3f sp8; +// Vec sp2C; +// Vec sp20; +// Vec sp14; +// Vec sp8; // s32 i; // s32 var_r30_2; // unkStructBSS114* temp; diff --git a/src/REL/m401Dll/m401Dll.h b/src/REL/m401Dll/m401Dll.h index 76adade8..0bf29f61 100644 --- a/src/REL/m401Dll/m401Dll.h +++ b/src/REL/m401Dll/m401Dll.h @@ -1,7 +1,8 @@ -#include "common.h" +#include "unsplit.h" #include "REL/executor.h" #include #include "game/objsub.h" +#include "game/object.h" // global data // typedef struct unkStruct18FC10 { @@ -35,7 +36,7 @@ typedef struct unkStructBSS114 { s32 unk_04; char unk_08[0xC]; void *unk_14; - Vec3f unk_18; + Vec unk_18; char unk_24[0x1C]; unkSubstructBSS114 *unk_40; char unk_44[0x8]; @@ -46,7 +47,7 @@ typedef struct unkStructBSS114 { } unkStructBSS114; typedef struct unkStruct18BFC0 { char unk_00[0x14]; - Vec3f unk_14; + Vec unk_14; } unkStruct18BFC0; typedef struct unkStruct18C8FC { s16 unk_00; @@ -61,12 +62,12 @@ extern s16 lbl_801D3CC2; extern void Hu3DModelAttrSet(s16, s32); extern void Hu3DModelAttrReset(s16, s32); extern omObjData* Hu3DModelObjPtrGet(s16, s32); -extern void Hu3DCameraPosSetV(s32, Vec3f*, Vec3f*, Vec3f*); -extern s16 Hu3DGLightCreateV(Vec3f*, Vec3f*, s32*); +extern void Hu3DCameraPosSetV(s32, Vec*, Vec*, Vec*); +extern s16 Hu3DGLightCreateV(Vec*, Vec*, s32*); extern void Hu3DGLightInfinitytSet(s16); extern void Hu3DReflectNoSet(s16); extern void Hu3DShadowCreate(f32, f32, f32); -extern void Hu3DShadowPosSet(Vec3f*, Vec3f*, Vec3f*); +extern void Hu3DShadowPosSet(Vec*, Vec*, Vec*); extern void Hu3DShadowTPLvlSet(f32); extern void Hu3DFogSet(f32, f32, u8, u8, u8); extern void omOvlReturnEx(s16, s16); @@ -80,7 +81,7 @@ extern void omSetSca(omObjData*, f32, f32, f32); extern u8 frand(void); extern s32 HuAudFXPlay(s32); extern void HuAudFXStop(s32); -extern s32 HuAudFXEmiterPlay(s32, Vec3f*); +extern s32 HuAudFXEmiterPlay(s32, Vec*); extern void HuAudFXListnerKill(void); extern void HuAudSeqFadeOut(s32, s32); extern s16 MGSeqCreate(s32, ...); @@ -95,11 +96,11 @@ extern void espBankSet(s16, s16); extern void espDrawNoSet(s16, s16); extern void WipeCreate(s16, s16, s16); extern u8 WipeStatGet(void); -extern f32 PSVECNormalize(Vec3f*, Vec3f*); +extern f32 PSVECNormalize(Vec*, Vec*); // local data // typedef struct unkStructBSS54 { - Vec3f unk_00; + Vec unk_00; } unkStructBSS54; typedef struct unkStructBSS100 { void *unk_00; @@ -108,12 +109,12 @@ typedef struct unkStructBSS100 { extern f32 lbl_2_data_0 = -7.1875f; extern s16 lbl_2_data_4[8] = { 0, 1, 2, 3, 4, 5, 6, 7 }; -extern Vec3f lbl_2_data_14 = { 1500.0f, 2500.0f, 1500.0f }; -extern Vec3f lbl_2_data_20 = { 0.0f, -1.0f, 0.0f }; +extern Vec lbl_2_data_14 = { 1500.0f, 2500.0f, 1500.0f }; +extern Vec lbl_2_data_20 = { 0.0f, -1.0f, 0.0f }; extern s32 lbl_2_data_2C = -1; -extern Vec3f lbl_2_data_30 = { 0.0f, 2500.0f, 0.0f }; -extern Vec3f lbl_2_data_3C = { 0.0f, 1.0f, -1.0f }; -extern Vec3f lbl_2_data_48 = { 0.0f, 0.0f, 0.0f }; +extern Vec lbl_2_data_30 = { 0.0f, 2500.0f, 0.0f }; +extern Vec lbl_2_data_3C = { 0.0f, 1.0f, -1.0f }; +extern Vec lbl_2_data_48 = { 0.0f, 0.0f, 0.0f }; extern char lbl_2_data_6F[] = "winnercnt:%d"; extern s32 lbl_2_data_80[8] = { 0x610000, 0x610001, 0x610002, 0x610003, 0x610004, 0x610005, 0x610006, 0x610007 }; extern s32 lbl_2_data_124[5]; @@ -121,13 +122,13 @@ extern s32 lbl_2_data_124[5]; extern s32 lbl_2_bss_8; extern f32 lbl_2_bss_10; extern unkStruct18FC10* lbl_2_bss_1C; -extern Vec3f lbl_2_bss_2C; -extern Vec3f lbl_2_bss_38; -extern Vec3f lbl_2_bss_44; +extern Vec lbl_2_bss_2C; +extern Vec lbl_2_bss_38; +extern Vec lbl_2_bss_44; extern f32 lbl_2_bss_50; extern unkStructBSS54 lbl_2_bss_54; -extern Vec3f lbl_2_bss_60; -extern Vec3f lbl_2_bss_6C; +extern Vec lbl_2_bss_60; +extern Vec lbl_2_bss_6C; extern f32 lbl_2_bss_84; extern f32 lbl_2_bss_88; extern s32 lbl_2_bss_90[4]; @@ -180,7 +181,7 @@ void fn_2_48A0(void*); void fn_2_7CB4(void*); void fn_2_8E74(void*); void fn_2_95E4(void*); -void fn_2_91AC(void*, Vec3f*); +void fn_2_91AC(void*, Vec*); void fn_2_9D00(void*); void fn_2_BD90(void*); void fn_2_C6DC(void*); @@ -188,10 +189,10 @@ void fn_2_C130(void); void fn_2_D088(void*); void fn_2_DBCC(s16); void fn_2_E6BC(s32, f32, f32, f32, f32, f32); -unkStructBSS114* fn_2_FC40(s32, Vec3f*, Vec3f*, Vec3f*); -void fn_2_10240(Vec3f*, Vec3f*); +unkStructBSS114* fn_2_FC40(s32, Vec*, Vec*, Vec*); +void fn_2_10240(Vec*, Vec*); void fn_2_1041C(void); s32 fn_2_14640(void*); void fn_2_10710(void); s16 fn_2_1079C(void); -s32 fn_2_10A88(Vec3f*, s16); +s32 fn_2_10A88(Vec*, s16); diff --git a/src/game/board/mg_setup.c b/src/game/board/mg_setup.c index 108e67e3..c021ac6a 100644 --- a/src/game/board/mg_setup.c +++ b/src/game/board/mg_setup.c @@ -8,14 +8,22 @@ #include "game/board/player.h" #include "game/board/space.h" #include "game/board/ui.h" +#include "game/board/tutorial.h" // structs typedef struct structActiveMG { s16 unk_00; - s16 unk_02; + s8 unk_02; + s8 unk_03; s32 unk_04; } structActiveMG; +typedef struct unkSubstructR31 { + s16 unk_00[4]; + char unk_08[0x14]; + Vec unk_1C[13][13]; +} unkSubstructR31; + typedef struct bitcopy { struct { u8 field00_bit0 : 1; @@ -24,16 +32,46 @@ typedef struct bitcopy { u8 field00_bit6 : 1; u8 field00_bit7 : 1; }; - s8 unk_01; - s8 unk_02; + struct { + u8 field01_bit0 : 4; + }; + u8 unk_02; s8 unk_03; s16 unk_04; + u8 unk_06; + s32 unk_08; + unkSubstructR31* unk_0C; } bitcopy; // bss static structActiveMG activeMG[4]; +static s16 mgListAll[0x20]; // data +static s32 mgSetupSprTbl[13] = { + 0x0007004B, 0x0007004C, 0x0007004D, 0x0007004E, + 0x0007004F, 0x00070052, 0x00070050, 0x00070051, + 0x00070053, 0x00070054, 0x00070055, 0x00070068, + 0x00070056 +}; +static Vec statusLayout4P[4] = { + { 170.0f, 244.0f, 0.0f }, + { 406.0f, 244.0f, 0.0f }, + { 170.0f, 364.0f, 0.0f }, + { 406.0f, 364.0f, 0.0f }, +}; +static Vec statusLayout1Vs3[4] = { + { 170.0f, 304.0f, 0.0f }, + { 406.0f, 224.0f, 0.0f }, + { 406.0f, 304.0f, 0.0f }, + { 406.0f, 384.0f, 0.0f }, +}; +static Vec statusLayout2Vs2[4] = { + { 170.0f, 260.0f, 0.0f }, + { 170.0f, 348.0f, 0.0f }, + { 406.0f, 260.0f, 0.0f }, + { 406.0f, 348.0f, 0.0f }, +}; static s32 luckyMessTbl[9] = { 0x00140000, 0x00140005, 0x0014000A, 0x0014000F, 0x00140014, 0x00140019, 0x00140000, 0x00140000, @@ -55,8 +93,22 @@ static Process* mgSetupProc; void BoardMGSetupExec(void); static void DestroyMGSetup(void); static void ExecMGSetup(void); -void CreateMGSetup(void); -void HideLuckyValue(void); +static void DetermineMGList(bitcopy*); +static void SetupStatusLayout(void); +static s32 GetMGType(void); +static s32 GetMGTypeTeam(void); +static void CreateMGSetup(void); +static void UpdateMGSetup(omObjData*); +static void CenterStatus(bitcopy*, omObjData*); +static void SeparateStatus(bitcopy*, omObjData*); +static void PopupVS(bitcopy*, omObjData*); +// ... +static void FallMGType(bitcopy*, omObjData*); +static void LuckyMGFall(bitcopy*, omObjData*); +static void UpdateLuckyValue(bitcopy*, omObjData*); +static void UpdateMGList(bitcopy*, omObjData*); +static void HideLuckyValue(void); +s32 BoardMGSetupPlayPush(s32, s16); void BoardMGSetupPlayPop(s32, s16); // FUNCTIONS // @@ -228,3 +280,520 @@ static void ExecMGSetup(void) { BoardNextOvlSet(3); HuPrcEnd(); } + +static void DetermineMGList(bitcopy* arg0) { + MgInfo* var_r31; + s32 temp_r23; + s32 var_r30; + s16* var_r28; + s32 var_r22; + s32 var_r21; + s32 var_r24; + s32 var_r27; + u32 temp_r20; + s32 var_r29; + u32 var_r19; + s32 temp_r18; + u32* temp_r26; + s16* temp_r25; + + var_r24 = 0; + var_r31 = mgInfoTbl; + + for (var_r27 = 0; var_r31->ovl != 0xFFFF; var_r31++, var_r27++) { + if ((var_r31->flag & 1) == 0) { + mgListAll[var_r24] = (var_r31 - mgInfoTbl) + 0x191; + var_r24++; + } + } + mgListAll[var_r24] = -1; + temp_r26 = HuMemDirectMallocNum(HEAP_SYSTEM, var_r27 * 4, 0x10000000U); + temp_r25 = HuMemDirectMallocNum(HEAP_SYSTEM, var_r27 * 2, 0x10000000U); + var_r31 = mgInfoTbl; + + for (var_r29 = var_r30 = 0; var_r30 < var_r27; var_r30++, var_r31++) { + if ((mgType == var_r31->type) && (var_r31->ovl != 0x29)) { + if ((GWMGListGet() != 2) || (GWMGCustomGet(var_r30 + 0x191) != 0)) { + if (GWMGListGet() == 1) { + var_r21 = 0; + var_r28 = &mgListAll[0]; + while (*var_r28 != -1) { + if (var_r30 + 0x191 == *var_r28) { + var_r21 = 1; + break; + } + var_r28++; + } + if (var_r21 != 0) continue; + } + temp_r26[var_r29] = var_r31->name_mess; + temp_r25[var_r29] = var_r30; + var_r29++; + } + } + } + + var_r19 = var_r29; + var_r30 = 0; + while (var_r30 < arg0->field01_bit0) { + var_r29 = BoardRandMod(var_r19); + temp_r20 = temp_r26[var_r29]; + temp_r23 = temp_r25[var_r29]; + temp_r18 = temp_r23 + 0x191; + + if (GWMGListGet() == 2 || BoardMGSetupPlayPush(mgType, temp_r18) == 0) { + var_r22 = 0; + for (var_r29 = 0; var_r29 < var_r30; var_r29++) { + if (temp_r20 == activeMG[var_r29].unk_04) { + var_r22 = 1; + break; + } + } + if (var_r22 == 0) { + if (GWMGAvailGet(temp_r23 + 0x191) == 0) { + activeMG[var_r30].unk_03 = 0; + } else { + activeMG[var_r30].unk_03 = 1; + } + activeMG[var_r30].unk_04 = temp_r20; + activeMG[var_r30].unk_02 = temp_r23; + var_r30++; + } + } + } + HuMemDirectFree(temp_r26); + HuMemDirectFree(temp_r25); +} + +static void SetupStatusLayout(void) { + s32 var_r27; + s32 var_r26; + s32 var_r28; + s32 var_r30; + s32 var_r29; + s32 var_r31; + + if (mgType != 0) { + if (mgType == 1) { + for (var_r28 = var_r31 = 0; var_r31 < 4; var_r31++) { + if (GWPlayer[var_r31].color == 2) { + var_r27 = var_r31; + GWPlayer[var_r31].field08_bit11 = GWPlayerTeamGet(var_r31); + GWPlayerCfg[var_r31].group = 0; + var_r28++; + } else { + GWPlayer[var_r31].field08_bit11 = GWPlayerTeamGet(var_r31); + GWPlayerCfg[var_r31].group = 1; + var_r26 = var_r31; + } + } + if (var_r28 == 1) { + BoardStatusTargetPosSet(var_r27, statusLayout1Vs3); + var_r30 = 1; + + for (var_r31 = 0; var_r31 < 4; var_r31++) { + if (var_r31 != var_r27) { + BoardStatusTargetPosSet(var_r31, &statusLayout1Vs3[var_r30++]); + } + } + return; + } + BoardStatusTargetPosSet(var_r26, statusLayout1Vs3); + var_r29 = 1; + + for (var_r31 = 0; var_r31 < 4; var_r31++) { + if (var_r31 == var_r26) { + GWPlayer[var_r31].field08_bit11 = GWPlayerTeamGet(var_r31); + GWPlayerCfg[var_r31].group = 0; + } else { + BoardStatusTargetPosSet(var_r31, &statusLayout1Vs3[var_r29++]); + GWPlayer[var_r31].field08_bit11 = GWPlayerTeamGet(var_r31); + GWPlayerCfg[var_r31].group = 1; + } + } + return; + } + var_r30 = 2; + for (var_r29 = var_r31 = 0; var_r31 < 4; var_r31++) { + if (GWPlayer[var_r31].color == 2) { + BoardStatusTargetPosSet(var_r31, &statusLayout2Vs2[var_r29++]); + GWPlayer[var_r31].field08_bit11 = GWPlayerTeamGet(var_r31); + GWPlayerCfg[var_r31].group = 0; + } else { + BoardStatusTargetPosSet(var_r31, &statusLayout2Vs2[var_r30++]); + GWPlayer[var_r31].field08_bit11 = GWPlayerTeamGet(var_r31); + GWPlayerCfg[var_r31].group = 1; + } + } + } +} + +static s32 GetMGType(void) { + s32 var_r27; + s32 var_r28; + s32 var_r30; + s32 var_r31; + s32 var_r25; + s32 var_r26; + s8 var_r29; + + for (var_r28 = var_r30 = var_r27 = var_r31 = 0; var_r31 < 4; var_r31++) { + if (GWPlayer[var_r31].color == 2) { + var_r30++; + } else if (GWPlayer[var_r31].color == 1) { + var_r28++; + } else { + var_r27++; + } + } + if ((var_r30 != 2) || (var_r28 != 2)) { + if (var_r27 == 4) { + var_r31 = BoardRandMod(4); + GWPlayer[var_r31].color = 1; + var_r27 = 3; + var_r28 = 1; + var_r30 = 0; + } + var_r26 = var_r25 = -1; + if (var_r30 == 3) { + var_r26 = 2; + var_r25 = 1; + } else if (var_r28 == 3) { + var_r26 = 1; + var_r25 = 2; + } + if (((var_r27 >= 3) || ((var_r27 == 2) && (var_r28 == 1) && (var_r30 == 1))) && (BoardRandMod(0x64U) > 0x28U)) { + if (var_r30 == 1) { + var_r29 = 2; + } else { + var_r29 = 1; + } + do { + var_r31 = BoardRandMod(4); + } while (GWPlayer[var_r31].color != 3); + GWPlayer[var_r31].color = var_r29; + if (var_r29 == 1) { + var_r29 = 2; + } else { + var_r29 = 1; + } + for (var_r31 = 0; var_r31 < 4; var_r31++) { + if (GWPlayer[var_r31].color == 3) { + GWPlayer[var_r31].color = var_r29; + } + } + } else { + + for (var_r31 = 0; var_r31 < 4; var_r31++) { + if ((GWPlayer[var_r31].color == 3) || (GWPlayer[var_r31].color == 0)) { + if (var_r26 == -1) { + if (BoardRandMod(0x64) < 0x32) { + var_r29 = 2; + } else { + var_r29 = 1; + } + } else if (BoardRandMod(0x64) < 0x5A) { + var_r29 = var_r26; + } else { + var_r29 = var_r25; + } + GWPlayer[var_r31].color = var_r29; + } + } + } + } + + + for (var_r30 = var_r28 = var_r31 = 0; var_r31 < 4; var_r31++) { + if (GWPlayer[var_r31].color == 2) { + var_r30++; + } else if (GWPlayer[var_r31].color == 1) { + var_r28++; + } + } + + if (var_r30 == 1 || var_r30 == 3) { + return 1; + } else if (var_r30 == 2) { + return 2; + } else { + return 0; + } +} + +static s32 GetMGTypeTeam(void) { + s8 sp12[4]; + s8 spE[4]; + s8 spA[4]; + s8 sp8[2] = { 2, 1 }; + s32 var_r30; + s32 var_r31; + s32 temp_r25; + s8 var_r27; + s8 var_r26; + s8 var_r28; + s8* var_r29; + + spA[0] = spA[1] = spA[2] = spA[3] = -1; + spE[0] = spE[1] = spE[2] = spE[3] = -1; + sp12[0] = sp12[1] = sp12[2] = sp12[3] = -1; + + for (var_r28 = var_r27 = var_r26 = var_r31 = 0; var_r31 < 4; var_r31++) { + switch (GWPlayer[var_r31].color) { + case 2: + sp12[var_r28] = var_r31; + var_r28++; + break; + case 1: + spE[var_r26] = var_r31; + var_r26++; + break; + default: + spA[var_r27] = var_r31; + var_r27++; + break; + } + } + if (var_r27 != 0) { + + for (var_r31 = 0; var_r31 < var_r27; var_r31++) { + GWPlayer[spA[var_r31]].color = sp8[BoardRandMod(2)]; + } + return GetMGTypeTeam(); + } + if ((var_r28 == 4) || (var_r26 == 4)) { + return 0; + } + if ((var_r28 == 1) || (var_r26 == 1)) { + if (var_r28 == 1) { + var_r29 = sp12; + } else { + var_r29 = spE; + } + if (BoardRandMod(0x64U) < 0x46U) { + var_r30 = BoardPlayerSameTeamFind(*var_r29); + GWPlayer[*var_r29].color = GWPlayer[var_r30].color; + return 0; + } + var_r30 = BoardPlayerSameTeamFind(*var_r29); + GWPlayer[var_r30].color = GWPlayer[*var_r29].color; + return 2; + } + var_r30 = BoardPlayerSameTeamFind(sp12[0]); + if (GWPlayer[sp12[0]].color != GWPlayer[var_r30].color) { + temp_r25 = GWPlayer[var_r30].color; + GWPlayer[var_r30].color = GWPlayer[sp12[0]].color; + + + for (var_r31 = 0; var_r31 < 4; var_r31++) { + if ((var_r31 != sp12[0]) && (var_r31 != var_r30)) { + break; + } + } + GWPlayer[var_r31].color = temp_r25; + var_r30 = BoardPlayerSameTeamFind(var_r31); + GWPlayer[var_r30].color = temp_r25; + } + return 2; +} + +static void CreateMGSetup(void) { + s32 var_r30; + unkSubstructR31* temp_r31; + bitcopy* temp_r28; + bitcopy* temp_r29; + + mgSetupObj = omAddObjEx(boardObjMan, 0x200, 0U, 0U, -1, UpdateMGSetup); + temp_r28 = (bitcopy*) mgSetupObj->work; + temp_r28->field00_bit0 = 0; + temp_r29 = (bitcopy*) mgSetupObj->work; + temp_r29->field00_bit1 = 0; + temp_r29->unk_02 = 0; + temp_r29->unk_03 = 0; + temp_r29->unk_04 = 0; + temp_r28->unk_0C = HuMemDirectMallocNum(HEAP_SYSTEM, 0x154, 0x10000000U); + temp_r31 = temp_r28->unk_0C; + temp_r31->unk_00[0] = HuSprGrpCreate(0xD); + + for (var_r30 = 0; var_r30 < 13; var_r30++) { + BoardSpriteCreate(mgSetupSprTbl[var_r30], 0x5DC, NULL, &temp_r31->unk_00[var_r30] + 1); + HuSprGrpMemberSet(*temp_r31->unk_00, var_r30, *(&temp_r31->unk_00[var_r30] + 1)); + HuSprAttrSet(*temp_r31->unk_00, var_r30, 4); + temp_r31->unk_1C[0][var_r30].x = temp_r31->unk_1C[0][var_r30].y = temp_r31->unk_1C[0][var_r30].z = 0.0f; + temp_r31->unk_1C[1][var_r30].x = temp_r31->unk_1C[1][var_r30].y = temp_r31->unk_1C[1][var_r30].z = 0.0f; + } + HuSprGrpPosSet(temp_r31->unk_00[0], 288.0f, 240.0f); +} + +void UpdateMGSetup(omObjData* arg0) { + bitcopy* var_r31; + s32 var_r29; + + var_r31 = (bitcopy*) arg0->work; + if (var_r31->field00_bit0 != 0 || BoardIsKill() != 0) { + for (var_r29 = 0; var_r29 < 4; var_r29++) { + if (activeMG[var_r29].unk_00 != -1) { + HuWinKill(activeMG[var_r29].unk_00); + activeMG[var_r29].unk_00 = -1; + } + } + HuSprGrpKill(var_r31->unk_0C->unk_00[0]); + HuMemDirectFree(var_r31->unk_0C); + mgSetupObj = NULL; + omDelObjEx(HuPrcCurrentGet(), arg0); + } else if (var_r31->unk_06 != 0) { + var_r31->unk_06--; + } else { + switch (var_r31->field00_bit1) { + case 1: + CenterStatus(var_r31, arg0); + break; + case 2: + SeparateStatus(var_r31, arg0); + break; + case 3: + PopupVS(var_r31, arg0); + break; + case 4: + FallMGType(var_r31, arg0); + break; + case 5: + LuckyMGFall(var_r31, arg0); + break; + case 6: + UpdateLuckyValue(var_r31, arg0); + break; + case 7: + UpdateMGList(var_r31, arg0); + break; + } + } +} + +void CenterStatus(bitcopy* arg0, omObjData* arg1) { + s32 var_r31; + bitcopy* temp_r30; + + if (arg0->unk_02 == 0) { + for (var_r31 = 0; var_r31 < 4; var_r31++) { + BoardStatusItemHideSet(var_r31, 0); + BoardStatusTargetPosSet(var_r31, &statusLayout4P[var_r31]); + } + arg0->unk_02 = 1; + HuAudFXPlay(0x354); + return; + } + + for (var_r31 = 0; var_r31 < 4; var_r31++) { + if (!BoardStatusStopCheck(var_r31)) { + return; + } + } + if ((s32) GWSystem.team != 0) { + mgType = GetMGTypeTeam(); + } else { + mgType = GetMGType(); + } + if (mgType == 0) { + arg0->field01_bit0 = 4; + } else { + arg0->field01_bit0 = 3; + } + SetupStatusLayout(); + DetermineMGList(arg0); + if (_CheckFlag(0x1000BU) != 0) { + BoardTutorialHookExec(0x1A, 0); + } + temp_r30 = (bitcopy*) mgSetupObj->work; + temp_r30->field00_bit1 = 2; + temp_r30->unk_02 = 0; + temp_r30->unk_03 = 0; + temp_r30->unk_04 = 0; +} + +void SeparateStatus(bitcopy* arg0, omObjData* arg1) { + Vec sp8; + f32 temp_f30; + f32 temp_f29; + s32 var_r28; + bitcopy* temp_r29; + unkSubstructR31* temp_r27; + + temp_r27 = arg0->unk_0C; + switch (arg0->unk_02) { + case 0: + for (var_r28 = 0; var_r28 < 4; var_r28++) { + BoardStatusPosGet(var_r28, &sp8.x); + if (sp8.x < 288.0f) { + sp8.x = -98.0f; + } else { + sp8.x = 674.0f; + } + BoardStatusTargetPosSet(var_r28, &sp8); + } + arg0->unk_02 = 1; + arg0->unk_03 = 0; + return; + case 1: + if ((s8) arg0->unk_03 >= 0x5A) { + arg0->unk_03 = 0; + temp_r29 = (bitcopy*) mgSetupObj->work; + temp_r29->field00_bit1 = 7; + temp_r29->unk_02 = 0; + temp_r29->unk_03 = 0; + temp_r29->unk_04 = 0; + return; + } + OSu8tof32((u8*)&arg0->unk_03, &temp_f29); + temp_f30 = sin((temp_f29 * M_PI) / 180.0) * 4.0 + 1.0; + arg0->unk_03 += 6; + if (arg0->unk_03 > 0x5A) { + arg0->unk_03 = 0x5A; + } + HuSprScaleSet(temp_r27->unk_00[0], 0, temp_f30, temp_f30); + if (arg0->unk_03 > 0x3C) { + HuSprTPLvlSet(temp_r27->unk_00[0], 0, (90.0f - arg0->unk_03) / 30.0f); + } + } +} + +void PopupVS(bitcopy* arg0, omObjData* arg1) { + f32 var_f30; + f32 temp_f31; + bitcopy* temp_r28; + unkSubstructR31* temp_r29; + + temp_r29 = arg0->unk_0C; + if (arg0->unk_02 == 0) { + HuSprAttrReset(temp_r29->unk_00[0], 0, 4); + HuSprAttrSet(temp_r29->unk_00[0], 0, 8); + HuSprScaleSet(temp_r29->unk_00[0], 0, 0.001f, 0.001f); + HuSprPosSet(temp_r29->unk_00[0], 0, 0.0f, 64.0f); + arg0->unk_02 = 1; + HuAudFXPlay(0x355); + return; + } + OSs16tof32(&arg0->unk_04, &temp_f31); + if (arg0->unk_04 < 0x5A) { + var_f30 = 2.0 * sin((M_PI * temp_f31) / 180.0); + } else { + var_f30 = 1.0 + sin((M_PI * temp_f31) / 180.0); + if (arg0->unk_04 >= 0xB4) { + var_f30 = 1.0f; + temp_r28 = (bitcopy*) mgSetupObj->work; + temp_r28->field00_bit1 = 3; + temp_r28->unk_02 = 0; + temp_r28->unk_03 = 0; + temp_r28->unk_04 = 0; + arg0->unk_06 = 0x3C; + } + } + HuSprScaleSet(temp_r29->unk_00[0], 0, var_f30, var_f30); + arg0->unk_04 += 9; + if ((_CheckFlag(0x1000BU) != 0) && arg0->field00_bit1 == 3) { + BoardTutorialHookExec(0x1B, 0); + if (*boardTutorialData == 1) { + arg0->field00_bit1 = 0; + } + } +}