marioparty4/src/game/board/mg_setup.c
CreateSource 953448f664 static
2024-03-09 12:38:25 -05:00

230 lines
5.8 KiB
C

#include "unsplit.h"
#include "game/audio.h"
#include "game/objsub.h"
#include "game/wipe.h"
#include "game/flag.h"
#include "game/board/main.h"
#include "game/board/audio.h"
#include "game/board/player.h"
#include "game/board/space.h"
#include "game/board/ui.h"
// structs
typedef struct structActiveMG {
s16 unk_00;
s16 unk_02;
s32 unk_04;
} structActiveMG;
typedef struct bitcopy {
struct {
u8 field00_bit0 : 1;
u8 field00_bit1 : 3;
u8 field00_bit4 : 2;
u8 field00_bit6 : 1;
u8 field00_bit7 : 1;
};
s8 unk_01;
s8 unk_02;
s8 unk_03;
s16 unk_04;
} bitcopy;
// bss
static structActiveMG activeMG[4];
// data
static s32 luckyMessTbl[9] = {
0x00140000, 0x00140005, 0x0014000A, 0x0014000F,
0x00140014, 0x00140019, 0x00140000, 0x00140000,
0x00140000
};
// sbss
static u8 mgType;
static s32 luckyF;
static s16 mgNext;
static omObjData* mgSetupObj;
static Process* mgSetupProc;
// sdata
// sdata2
// determined functions
void BoardMGSetupExec(void);
void DestroyMGSetup(void);
void ExecMGSetup(void);
void CreateMGSetup(void);
void HideLuckyValue(void);
void BoardMGSetupPlayPop(s32, s16);
// FUNCTIONS //
void BoardMGSetupExec(void) {
mgSetupProc = HuPrcChildCreate(&ExecMGSetup, 0x2006, 0x3800, 0, boardMainProc);
HuPrcDestructorSet2(mgSetupProc, &DestroyMGSetup);
while (mgSetupProc != 0) {
HuPrcVSleep();
}
}
static void DestroyMGSetup(void) {
GWSystem.player_curr = 0;
mgSetupProc = NULL;
}
static inline s32 setupObjGet(void) {
bitcopy* work = (bitcopy*) mgSetupObj->work;
return work->field00_bit1;
}
static void ExecMGSetup(void) {
s32 sp60[9] = {
0x750000, 0x760000, 0x770000,
0x780000, 0x790000, 0x7A0000,
0x7B0000, 0x7C0000, 0x7D0000
};
Vec sp54;
u16 var_r24;
s32 var_r22;
s32 var_r23;
s32 var_r31;
u32 var_r30;
bitcopy* temp_r29;
bitcopy* temp_r28;
bitcopy* temp_r27;
bitcopy* temp_r26;
bitcopy* temp_r25;
luckyF = 0;
mgNext = 0;
GWSystem.player_curr = -1;
GWSystem.unk_32 = 1;
for (var_r31 = 0; var_r31 < 4; var_r31++) {
activeMG[var_r31].unk_00 = -1;
activeMG[var_r31].unk_04 = 0;
}
BoardPlayerMoveAwayStartCurr(GWPlayer[GWSystem.player_curr].space_curr, 1);
BoardCameraMoveSet(0);
BoardCameraTargetSpaceSet(BoardSpaceStarGetCurr());
sp54.x = 0.0f;
sp54.y = 150.0f;
sp54.z = 0.0f;
BoardCameraMotionStartEx(-1, NULL, &sp54, 1300.0f, -1.0f, 0x15);
BoardCameraMotionWait();
WipeCreate(1, 0, 0x15);
while (WipeStatGet() != 0) {
HuPrcVSleep();
}
BoardFilterFadeInit(0x1E, 0xA0U);
CreateMGSetup();
while (setupObjGet() != 7) {
HuPrcVSleep();
}
if (BoardRandMod(0x64U) < 5U) {
HuPrcSleep(0x1E);
luckyF = 1;
temp_r29 = (bitcopy*) mgSetupObj->work;
temp_r29->field00_bit1 = 4;
temp_r29->unk_02 = 0;
temp_r29->unk_03 = 0;
temp_r29->unk_04 = 0;
HuAudFXPlay(0x35C);
while (setupObjGet() != 7) {
HuPrcVSleep();
}
temp_r28 = (bitcopy*) mgSetupObj->work;
temp_r28->field00_bit1 = 1;
temp_r28->unk_02 = 0;
temp_r28->unk_03 = 0;
temp_r28->unk_04 = 0;
while (setupObjGet() != 7) {
HuPrcVSleep();
}
var_r30 = luckyMessTbl[GWBoardGet()];
BoardWinCreate(2, var_r30, BoardWinPortraitGetStar());
BoardWinWait();
BoardWinKill();
temp_r27 = (bitcopy*) mgSetupObj->work;
temp_r27->field00_bit1 = 5;
temp_r27->unk_02 = 0;
temp_r27->unk_03 = 0;
temp_r27->unk_04 = 0;
while (setupObjGet() != 7) {
HuPrcVSleep();
}
switch (GWSystem.unk_32) {
case 1:
var_r30 = luckyMessTbl[GWBoardGet()] + 1;
break;
case 2:
var_r30 = luckyMessTbl[GWBoardGet()] + 2;
break;
case 3:
var_r30 = luckyMessTbl[GWBoardGet()] + 3;
break;
}
BoardWinCreate(2, var_r30, BoardWinPortraitGetStar());
BoardWinWait();
var_r30 = luckyMessTbl[GWBoardGet()] + 4;
BoardWinCreate(2, var_r30, BoardWinPortraitGetStar());
BoardWinWait();
BoardWinKill();
HideLuckyValue();
} else {
temp_r26 = (bitcopy*) mgSetupObj->work;
temp_r26->field00_bit1 = 1;
temp_r26->unk_02 = 0;
temp_r26->unk_03 = 0;
temp_r26->unk_04 = 0;
while (setupObjGet() != 7) {
HuPrcVSleep();
}
}
temp_r25 = (bitcopy*) mgSetupObj->work;
temp_r25->field00_bit1 = 6;
temp_r25->unk_02 = 0;
temp_r25->unk_03 = 0;
temp_r25->unk_04 = 0;
while (setupObjGet() != 7) {
HuPrcVSleep();
}
HuDataDirClose(0x70000);
HuDataDirClose(0x20000);
HuDataDirClose(sp60[GWBoardGet()]);
HuPrcSleep(2);
if (_CheckFlag(0xBU) != 0) {
var_r23 = 0x140000;
} else {
var_r23 = mgInfoTbl[mgNext].data_dir;
}
var_r22 = BoardDataDirReadAsync(var_r23);
BoardAudSeqFadeOut(0, 0x3E8U);
_SetFlag(0x1000EU);
WipeColorSet(0xFFU, 0xFFU, 0xFFU);
WipeCreate(2, 0, -1);
while (WipeStatGet() != 0) {
HuPrcVSleep();
}
HuAudFXAllStop();
_SetFlag(0x1001CU);
for (var_r31 = 0; var_r31 < 4; var_r31++) {
BoardStatusItemHideSet(var_r31, 1);
}
((bitcopy*) (mgSetupObj->work))->field00_bit0 = 1;
BoardDataAsyncWait(var_r22);
var_r24 = mgNext + 0x191;
BoardMGSetupPlayPop(mgType, var_r24);
GWSystem.mg_next_type = -1;
GWMGAvailSet(var_r24);
GWSystem.mg_next = var_r24 - 0x191;
_SetFlag(0x10002U);
if (GWSystem.turn == GWSystem.max_turn) {
_SetFlag(0xAU);
}
BoardNextOvlSet(3);
HuPrcEnd();
}