marioparty4/src/game/board/star.c
2024-05-08 17:53:15 -07:00

820 lines
24 KiB
C
Executable file

#include "game/board/star.h"
#include "game/audio.h"
#include "game/data.h"
#include "game/flag.h"
#include "game/gamework.h"
#include "game/gamework_data.h"
#include "game/hsfanim.h"
#include "game/hsfman.h"
#include "game/msm.h"
#include "game/objsub.h"
#include "game/window.h"
#include "game/wipe.h"
#include "game/board/audio.h"
#include "game/board/com.h"
#include "game/board/main.h"
#include "game/board/model.h"
#include "game/board/player.h"
#include "game/board/space.h"
#include "game/board/tutorial.h"
#include "game/board/ui.h"
#include "game/board/window.h"
#include "ext_math.h"
typedef struct {
struct {
u8 unk00_field0 : 1;
u8 unk00_field1 : 1;
u8 unk00_field2 : 1;
u8 unk00_field3 : 2;
u8 unk00_field4 : 1;
};
s8 unk01;
s8 unk02;
char unk03[1];
s16 unk04;
s16 unk06;
s16 unk08;
s16 unk0A;
s16 unk0C;
} GiveStarWork;
typedef struct {
struct {
u8 unk00_field0 : 1;
};
s8 unk01;
} ShowNextWork;
static void ExecStar(void);
static void DestroyStar(void);
static void GiveStarMain(omObjData *arg0);
static void UpdateStarAngle(GiveStarWork *arg0, omObjData *arg1);
static void InitGiveStar(GiveStarWork *arg0, omObjData *arg1);
static void MoveGiveStar(GiveStarWork *arg0, omObjData *arg1);
static void ShrinkGiveStar(GiveStarWork *arg0, omObjData *arg1);
static void StopGiveStar(void);
static void InitGiveStarEffect(void);
static void KillGiveStarEffect(void);
static void ShowNextUpdate(omObjData *arg0);
static void HideNextHost(s32 arg0);
static Vec starCharPos;
static s16 hostMot[2];
static omObjData *showNextObj;
static s16 starDoneF;
static AnimData *starEffAnim;
static omObjData *giveStarObj;
static Process *starProc;
static s16 starParman = -1;
static s16 hostMdl = -1;
const s32 lbl_8011E040[9] = {
MAKE_MESSID(12, 0),
MAKE_MESSID(12, 9),
MAKE_MESSID(12, 18),
MAKE_MESSID(12, 27),
MAKE_MESSID(12, 36),
MAKE_MESSID(12, 45),
MAKE_MESSID(12, 0),
MAKE_MESSID(12, 0),
MAKE_MESSID(12, 0)
};
const s32 lbl_8011E064[9][2] = {
{ MAKE_MESSID(21, 34), MAKE_MESSID(21, 40) },
{ MAKE_MESSID(21, 35), MAKE_MESSID(21, 41) },
{ MAKE_MESSID(21, 36), MAKE_MESSID(21, 42) },
{ MAKE_MESSID(21, 37), MAKE_MESSID(21, 43) },
{ MAKE_MESSID(21, 38), MAKE_MESSID(21, 44) },
{ MAKE_MESSID(21, 39), MAKE_MESSID(21, 45) },
{ MAKE_MESSID(21, 34), MAKE_MESSID(21, 40) },
{ MAKE_MESSID(21, 34), MAKE_MESSID(21, 40) },
{ MAKE_MESSID(21, 34), MAKE_MESSID(21, 40) }
};
s32 boardStarSndTbl[] = {
0x00000120,
0x00000160,
0x000001A0,
0x000001E0,
0x00000220,
0x00000260,
0x000002A0,
0x000002E0
};
static s32 hostMotTbl[9][2] = {
{ DATA_MAKE_NUM(DATADIR_W01, 33), DATA_MAKE_NUM(DATADIR_BOARD, 157) },
{ DATA_MAKE_NUM(DATADIR_W02, 7), DATA_MAKE_NUM(DATADIR_BOARD, 158) },
{ DATA_MAKE_NUM(DATADIR_W03, 31), DATA_MAKE_NUM(DATADIR_BOARD, 159) },
{ DATA_MAKE_NUM(DATADIR_W04, 11), DATA_MAKE_NUM(DATADIR_BOARD, 160) },
{ DATA_MAKE_NUM(DATADIR_W05, 9), DATA_MAKE_NUM(DATADIR_BOARD, 161) },
{ DATA_MAKE_NUM(DATADIR_W06, 21), DATA_MAKE_NUM(DATADIR_BOARD, 162) }
};
static HsfanimStruct00 starEffParam = {
0x001E,
{ 0x00, 0x00 }, // padding?
3.3f,
70.0f,
7.0f,
{ 0.0f, -0.05f, 0.0f },
2.0f,
1.0f,
20.0f,
0.98f,
0x0002,
{
0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0x40, 0xFF,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00
},
{
0xFF, 0x80, 0x80, 0x00,
0xFF, 0x40, 0x20, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00
}
};
void BoardStarHostSet(s16 arg0) {
hostMdl = arg0;
if (GWBoardGet() == 7 || GWBoardGet() == 8) {
return;
}
if (_CheckFlag(0x10001)) {
BoardSpaceHostSet(boardSpaceStarTbl[GWSystem.star_pos]);
}
}
s16 BoardStarHostMdlGet(void) {
return hostMdl;
}
void BoardStarExec(s32 arg0, s32 arg1) {
if (GWBoardGet() == 7 || GWBoardGet() == 8) {
return;
}
if (BoardPlayerSizeGet(arg0) != 2) {
BoardDiceDigit2DShowSet(0);
starProc = HuPrcChildCreate(ExecStar, 0x2003, 0x3800, 0, boardMainProc);
HuPrcDestructorSet2(starProc, DestroyStar);
while (starProc != NULL) {
HuPrcVSleep();
}
BoardDiceDigit2DShowSet(1);
}
}
static void ExecStar(void) {
Vec sp24;
Vec sp18;
Vec spC;
float temp_f27;
float temp_f29;
float temp_f30;
float var_f28;
float var_f31;
s16 temp_r30;
u32 sp8;
s32 temp_r24;
s32 temp_r29;
s32 var_r26;
s32 var_r25;
s32 i;
s32 temp_r27;
s32 temp_r31;
s32 var_r22;
BoardSpace *var_r23;
temp_r31 = GWSystem.player_curr;
temp_r27 = GWBoardGet();
temp_r30 = BoardStarHostMdlGet();
HuAudFXPlay(0x33A);
for (i = 0; i < 2; i++) {
hostMot[i] = BoardModelMotionCreate(temp_r30, hostMotTbl[temp_r27][i]);
}
BoardPlayerPosGet(temp_r31, &sp24);
temp_r24 = GWPlayer[temp_r31].space_curr;
var_r23 = BoardSpaceGet(0, temp_r24);
sp8 = (var_r23->flag & 0x70000) >> 16;
starDoneF = 0;
var_r22 = BoardSpaceLinkFlagSearch(0, temp_r24, 0x04000000);
BoardSpacePosGet(0, var_r22, &sp18);
PSVECSubtract(&sp18, &sp24, &spC);
temp_f30 = 90.0 - atan2d(spC.z, spC.x);
temp_f30 = 90.0f * ((temp_f30 + 3.0f) / 90.0f);
temp_f29 = BoardPlayerRotYGet(temp_r31);
BoardPlayerIdleSet(temp_r31);
if (BoardDAngleCalc(temp_f30 - temp_f29) < 0.0f) {
var_f28 = -BoardDAngleCalc(temp_f30 - temp_f29);
} else {
var_f28 = BoardDAngleCalc(temp_f30 - temp_f29);
}
if (var_f28 > 90.0f) {
var_r25 = 30;
} else {
var_r25 = 15;
}
BoardPlayerMotBlendSet(temp_r31, temp_f30, var_r25);
temp_f27 = BoardModelRotYGet(temp_r30);
var_f31 = BoardDAngleCalc(temp_f30 + 180.0f) - temp_f27;
if ((var_f31 <= 4.0f && var_f31 >= 0.0f)
|| (var_f31 <= 360.0f && var_f31 >= 355.0f)
|| (var_f31 <= 0.0f && var_f31 >= -4.0f)) {
var_r26 = 0;
} else {
var_r26 = 1;
}
if (var_r26 != 0) {
var_f31 /= var_r25;
BoardModelMotionShiftSet(temp_r30, hostMot[1], 0.0f, 10.0f, 0x40000001);
BoardModelMotionSpeedSet(temp_r30, 2.0f);
}
while (!BoardPlayerMotBlendCheck(temp_r31)) {
if (var_r26 != 0) {
temp_f30 = var_f31 + BoardModelRotYGet(temp_r30);
BoardModelRotYSet(temp_r30, temp_f30);
}
HuPrcVSleep();
}
BoardModelMotionShiftSet(temp_r30, 1, 0.0f, 10.0f, 0x40000001);
BoardCameraViewSet(3);
BoardCameraMotionWait();
if (GWStarsGet(temp_r31) >= 999) {
temp_r29 = lbl_8011E040[temp_r27] + 5;
BoardWinCreate(0, temp_r29, BoardWinPortraitGetStar());
BoardWinWait();
BoardWinKill();
} else if (BoardPlayerCoinsGet(temp_r31) < 20 && GWSystem.last5_effect != 4) {
temp_r29 = lbl_8011E040[temp_r27] + 2;
BoardWinCreate(2, temp_r29, BoardWinPortraitGetStar());
BoardWinWait();
BoardWinKill();
} else {
BoardStatusShowSetAll(0);
while (!BoardStatusStopCheck(0) || !BoardStatusStopCheck(1) || !BoardStatusStopCheck(2) || !BoardStatusStopCheck(3)) {
HuPrcVSleep();
}
temp_r29 = lbl_8011E040[temp_r27];
BoardWinCreate(2, temp_r29, BoardWinPortraitGetStar());
BoardWinInsertMesSet(BoardPlayerGetCharMess(temp_r31), 0);
BoardWinWait();
BoardWinKill();
while (1) {
BoardStatusShowSetForce(temp_r31);
BoardStatusShowSet(temp_r31, 1);
while (!BoardStatusStopCheck(temp_r31)) {
HuPrcVSleep();
}
if (GWSystem.last5_effect == 4) {
temp_r29 = lbl_8011E040[temp_r27] + 8;
BoardWinCreate(2, temp_r29, BoardWinPortraitGetStar());
BoardWinWait();
break;
}
temp_r29 = lbl_8011E040[temp_r27] + 1;
BoardWinCreateChoice(1, temp_r29, BoardWinPortraitGetStar(), 0);
BoardWinAttrSet(0x10);
if (GWPlayer[temp_r31].com) {
if (BoardPlayerCoinsGet(temp_r31) >= 20) {
BoardComKeySetUp();
} else {
BoardComKeySetDown();
}
}
BoardWinWait();
switch (BoardWinChoiceGet()) {
case 0:
if (BoardPlayerCoinsGet(temp_r31) < 20) {
temp_r29 = lbl_8011E040[temp_r27] + 2;
BoardWinCreate(2, temp_r29, BoardWinPortraitGetStar());
BoardWinWait();
BoardStatusShowSet(temp_r31, 0);
while (!BoardStatusStopCheck(temp_r31)) {
HuPrcVSleep();
}
BoardStatusShowSetAll(1);
goto block_B;
}
goto block_A;
case 1:
temp_r29 = lbl_8011E040[temp_r27] + 4;
BoardWinCreate(2, temp_r29, BoardWinPortraitGetStar());
BoardWinWait();
BoardStatusShowSet(temp_r31, 0);
while (!BoardStatusStopCheck(temp_r31)) {
HuPrcVSleep();
}
BoardStatusShowSetAll(1);
goto block_B;
default:
BoardStatusShowSet(temp_r31, 0);
while (!BoardStatusStopCheck(temp_r31)) {
HuPrcVSleep();
}
BoardWinKill();
BoardViewMapExec(temp_r31);
break;
}
}
block_A:
temp_r29 = lbl_8011E040[temp_r27] + 3;
BoardWinCreate(2, temp_r29, BoardWinPortraitGetStar());
BoardWinWait();
BoardWinKill();
if (GWSystem.last5_effect != 4) {
for (i = 0; i < 20; i++) {
BoardPlayerCoinsAdd(temp_r31, -1);
HuAudFXPlay(0xE);
HuPrcSleep(3);
}
HuAudFXPlay(0xF);
}
_SetFlag(0x10017);
BoardModelMotionShiftSet(temp_r30, hostMot[0], 0.0f, 10.0f, 0);
HuPrcSleep(30);
starDoneF = 1;
BoardAudSeqFadeOut(0, 1000);
BoardModelPosGet(temp_r30, &sp24);
sp24.y += 130.0f;
BoardStarGive(temp_r31, &sp24);
BoardStatusShowSet(temp_r31, 0);
while (!BoardStatusStopCheck(temp_r31)) {
HuPrcVSleep();
}
BoardModelMotionShiftSet(temp_r30, 1, 0.0f, 10.0f, 0x40000001);
BoardStarShowNext(temp_r31);
BoardMusStartBoard();
BoardModelRotYSet(temp_r30, 0.0f);
}
block_B:
BoardWinKill();
var_f31 = -BoardModelRotYGet(temp_r30);
if (var_r26 != 0) {
var_f31 /= var_r25;
BoardModelMotionShiftSet(temp_r30, hostMot[1], 0.0f, 10.0f, 0x40000001);
BoardModelMotionSpeedSet(temp_r30, 3.0f);
}
BoardPlayerMotBlendSet(temp_r31, 0, var_r25);
while (!BoardPlayerMotBlendCheck(temp_r31)) {
if (var_r26 != 0) {
temp_f30 = var_f31 + BoardModelRotYGet(temp_r30);
BoardModelRotYSet(temp_r30, temp_f30);
}
HuPrcVSleep();
}
BoardModelRotYSet(temp_r30, 0.0f);
BoardModelMotionShiftSet(temp_r30, 1, 0.0f, 10.0f, 0x40000001);
if (!_CheckFlag(0x10016)) {
BoardCameraViewSet(1);
BoardCameraTargetPlayerSet(temp_r31);
BoardCameraMotionWait();
}
HuPrcEnd();
}
static void DestroyStar(void) {
s32 i;
_ClearFlag(0x10017);
for (i = 0; i < 2; i++) {
BoardModelMotionKill(BoardStarHostMdlGet(), hostMot[i]);
hostMot[i] = -1;
}
StopGiveStar();
KillGiveStarEffect();
starProc = NULL;
}
static void GiveStarMain(omObjData *arg0) {
GiveStarWork *temp_r30;
temp_r30 = OM_GET_WORK_PTR(arg0, GiveStarWork);
if (temp_r30->unk00_field0 != 0 || BoardIsKill()) {
KillGiveStarEffect();
BoardModelKill(temp_r30->unk0C);
giveStarObj = NULL;
omDelObjEx(HuPrcCurrentGet(), arg0);
return;
}
if (temp_r30->unk04 != 0) {
temp_r30->unk04--;
} else {
switch (temp_r30->unk01) {
case 4:
break;
case 0:
InitGiveStar(temp_r30, arg0);
break;
case 1:
MoveGiveStar(temp_r30, arg0);
break;
case 2:
ShrinkGiveStar(temp_r30, arg0);
break;
}
UpdateStarAngle(temp_r30, arg0);
}
BoardModelPosSet(temp_r30->unk0C, arg0->trans.x, arg0->trans.y, arg0->trans.z);
BoardModelRotSet(temp_r30->unk0C, 0.0f, arg0->rot.y, 0.0f);
BoardModelScaleSet(temp_r30->unk0C, arg0->scale.x, arg0->scale.y, arg0->scale.z);
if (starParman != -1) {
Hu3DParManPosSet(starParman, arg0->trans.x, -70.0f + arg0->trans.y, arg0->trans.z);
}
}
static void UpdateStarAngle(GiveStarWork *arg0, omObjData *arg1) {
float var_f31;
if (arg0->unk00_field1 != 0) {
if (arg0->unk02 < 16.0f) {
arg0->unk02 += 2.0f;
if (arg0->unk02 > 16.0f) {
arg0->unk02 = 16;
}
}
OSs8tof32(&arg0->unk02, &var_f31);
arg1->rot.y = BoardDAngleCalc(arg1->rot.y + var_f31);
}
}
static void InitGiveStar(GiveStarWork *arg0, omObjData *arg1) {
Vec sp8;
BoardPlayerPosGet(arg0->unk00_field3, &sp8);
BoardModelVisibilitySet(arg0->unk0C, 1);
BoardModelMotionStart(arg0->unk0C, 0, 0x40000001);
BoardModelMotionTimeSet(arg0->unk0C, 2.0f);
arg0->unk01 = 1;
arg0->unk0A = 0;
arg1->trans.x = starCharPos.x;
arg1->trans.y = starCharPos.y;
arg1->trans.z = starCharPos.z;
arg1->rot.x = (sp8.x - starCharPos.x) / 10.0f;
arg1->rot.z = (sp8.z - starCharPos.z) / 10.0f;
arg1->rot.y = 0.0f;
arg1->scale.x = arg1->scale.y = arg1->scale.z = 1.0f;
InitGiveStarEffect();
}
static void MoveGiveStar(GiveStarWork *arg0, omObjData *arg1) {
Vec sp8;
float temp_f31;
BoardPlayerPosGet(arg0->unk00_field3, &sp8);
if (arg0->unk00_field2 == 0) {
if (BoardModelMotionTimeGet(arg0->unk0C) >= 50.0f) {
BoardModelMotionStartEndSet(arg0->unk0C, 50, 150);
arg0->unk00_field2 = 1;
}
}
if (arg0->unk0A < 10) {
OSs16tof32(&arg0->unk0A, &temp_f31);
arg1->trans.x += arg1->rot.x;
arg1->trans.z += arg1->rot.z;
arg1->trans.y += -0.08166667f * temp_f31 * temp_f31 * 0.97f + 50.0f;
arg0->unk0A++;
} else {
arg1->trans.y += -4.0f;
if (arg1->trans.y <= sp8.y + 300.0f) {
arg1->trans.y = sp8.y + 300.0f;
arg0->unk01 = 4;
}
}
}
static void ShrinkGiveStar(GiveStarWork *arg0, omObjData *arg1) {
Vec sp8;
float var_f30;
if (arg0->unk00_field4 == 0) {
HuAudFXPlay(0x339);
arg0->unk00_field4 = 1;
}
BoardPlayerPosGet(arg0->unk00_field3, &sp8);
arg1->trans.y += -4.0f;
if (arg1->trans.y > sp8.y + 80.0f) {
if (arg0->unk08 < 90) {
if (BoardPlayerSizeGet(arg0->unk00_field3) != 1) {
arg0->unk08 += 2;
} else {
arg0->unk08 += 1.4f;
}
if (arg0->unk08 > 90) {
arg0->unk08 = 90;
}
}
OSs16tof32(&arg0->unk08, &var_f30);
arg1->scale.x = sind(var_f30 + 90.0f);
if (arg1->scale.x <= 0.0f) {
arg1->scale.x = 0.001f;
}
arg1->scale.y = arg1->scale.x;
arg1->scale.z = arg1->scale.x;
} else {
omVibrate(arg0->unk00_field3, 12, 0xC, 0);
arg0->unk00_field0 = 1;
arg0->unk01 = 4;
arg1->scale.x = arg1->scale.y = arg1->scale.z = 0.001f;
KillGiveStarEffect();
BoardModelVisibilitySet(arg0->unk0C, 0);
}
}
static void StopGiveStar(void) {
GiveStarWork *temp_r31;
if (giveStarObj) {
temp_r31 = OM_GET_WORK_PTR(giveStarObj, GiveStarWork);
temp_r31->unk00_field0 = 1;
}
}
static void InitGiveStarEffect(void) {
s16 temp_r3;
void *var_r30;
var_r30 = HuDataSelHeapReadNum(DATA_MAKE_NUM(DATADIR_EFFECT, 1), MEMORY_DEFAULT_NUM, HEAP_DATA);
starEffAnim = HuSprAnimRead(var_r30);
starParman = Hu3DParManCreate(starEffAnim, 0x64, &starEffParam);
Hu3DParManAttrSet(starParman, 0x64);
Hu3DParManRotSet(starParman, 90.0f, 0.0f, 0.0f);
temp_r3 = Hu3DParManModelIDGet(starParman);
Hu3DParticleBlendModeSet(temp_r3, 1);
Hu3DModelLayerSet(temp_r3, 2);
HuDataDirClose(DATADIR_EFFECT);
}
static void KillGiveStarEffect(void) {
if (starParman != -1) {
Hu3DParManKill(starParman);
starParman = -1;
starEffAnim = NULL;
}
}
static inline void StarInlineFunc00(void) {
GiveStarWork *temp_r28 = OM_GET_WORK_PTR(giveStarObj, GiveStarWork);
temp_r28->unk01 = 0;
}
static inline void StarInlineFunc01(void) {
GiveStarWork *temp_r27 = OM_GET_WORK_PTR(giveStarObj, GiveStarWork);
while (temp_r27->unk01 != 4) {
HuPrcVSleep();
}
}
static inline void StarInlineFunc02(void) {
GiveStarWork *temp_r29 = OM_GET_WORK_PTR(giveStarObj, GiveStarWork);
temp_r29->unk00_field1 = 1;
temp_r29->unk04 = 45;
temp_r29->unk08 = 0;
temp_r29->unk01 = 2;
}
void BoardStarGive(s32 arg0, Vec *arg1) {
Vec sp8;
s32 temp_r25;
GiveStarWork *temp_r31;
if (GWBoardGet() == 7 || GWBoardGet() == 8) {
return;
}
starCharPos = *arg1;
giveStarObj = omAddObjEx(boardObjMan, 0x101, 0, 0, -1, GiveStarMain);
BoardCameraRotGet(&sp8);
temp_r31 = OM_GET_WORK_PTR(giveStarObj, GiveStarWork);
temp_r31->unk00_field0 = 0;
temp_r31->unk00_field1 = 0;
temp_r31->unk00_field2 = 0;
temp_r31->unk00_field4 = 0;
temp_r31->unk01 = 4;
temp_r31->unk00_field3 = arg0;
temp_r31->unk06 = 0;
temp_r31->unk02 = 0;
temp_r31->unk08 = 0;
temp_r31->unk0C = BoardModelCreate(DATA_MAKE_NUM(DATADIR_BOARD, 11), NULL, 0);
BoardModelVisibilitySet(temp_r31->unk0C, 0);
BoardModelPassSet(temp_r31->unk0C, 0);
BoardModelMotionSpeedSet(temp_r31->unk0C, 0.0f);
BoardModelLayerSet(temp_r31->unk0C, 2);
StarInlineFunc00();
HuAudFXPlay(0x338);
HuAudFXPlay(0x353);
StarInlineFunc01();
if (_CheckFlag(0x1000B)) {
BoardTutorialHookExec(0x15, 0);
}
BoardPlayerMotBlendSet(arg0, 0, 0xF);
while (!BoardPlayerMotBlendCheck(arg0)) {
HuPrcVSleep();
}
StarInlineFunc02();
StarInlineFunc01();
BoardPlayerVoiceEnableSet(arg0, 7, 0);
BoardPlayerMotionShiftSet(arg0, 7, 0.0f, 8.0f, 0);
HuAudFXPlay(boardStarSndTbl[GWPlayer[arg0].character]);
BoardPlayerStarsAdd(arg0, 1);
HuAudFXPlay(8);
HuPrcSleep(10);
if (_CheckFlag(0x1000B)) {
BoardPlayerMotionEndWait(arg0);
} else {
temp_r25 = HuAudSStreamPlay(6);
BoardPlayerMotionEndWait(arg0);
while (msmStreamGetStatus(temp_r25) != 0) {
HuPrcVSleep();
}
}
BoardPlayerVoiceEnableSet(arg0, 7, 1);
}
void BoardStarShowNext(s32 arg0) {
Mtx spBC;
Mtx sp8C;
Mtx sp5C;
Vec sp50;
Vec sp44;
Vec sp38;
Vec sp2C;
Vec sp20;
float temp_f31;
WipeState *var_r26;
s32 var_r28;
s32 var_r30;
s16 var_r27;
s16 var_r29;
var_r28 = 0;
if (GWBoardGet() == 7 || GWBoardGet() == 8) {
return;
}
_SetFlag(0x1001C);
var_r26 = &wipeData;
if (var_r26->mode == 0) {
WipeColorSet(0, 0, 0);
WipeCreate(WIPE_MODE_OUT, WIPE_TYPE_NORMAL, 21);
while (WipeStatGet() != 0) {
HuPrcVSleep();
}
} else {
HuPrcSleep(18);
}
BoardStatusItemSet(0);
if (GWBoardGet() == 5 && BoardRollTypeGet() != 9 && boardStarGiveHook) {
boardStarGiveHook();
}
BoardSpaceStarMove();
if (arg0 == -1) {
var_r28 = 1;
arg0 = 0;
for (var_r29 = 0; var_r29 < 4; var_r29++) {
BoardPlayerCornerPosSet(var_r29);
}
BoardSpacePosGet(0, GWPlayer[arg0].space_curr, &sp38);
BoardPlayerPosSetV(arg0, &sp38);
}
if (!_CheckFlag(0x10017)) {
BoardAudSeqFadeOut(0, 1000);
}
showNextObj = omAddObjEx(boardObjMan, 0x7E03, 0, 0, -1, ShowNextUpdate);
BoardPlayerIdleSet(arg0);
BoardModelMotionStart(BoardStarHostMdlGet(), 1, 0x40000001);
BoardModelPosGet(BoardStarHostMdlGet(), &sp50);
showNextObj->scale.x = sp50.x;
showNextObj->scale.y = sp50.y;
showNextObj->scale.z = sp50.z;
BoardPlayerPosGet(arg0, &sp38);
sp50.y = sp38.y;
PSVECSubtract(&sp50, &sp38, &sp20);
sp20.y = 0.0f;
temp_f31 = PSVECMag(&sp20);
if (temp_f31 > 3000.0f) {
var_r27 = 0xF0;
} else if (temp_f31 > 1500.0f) {
var_r27 = 0x78;
} else {
var_r27 = 0x78;
}
BoardViewMoveStart(&sp38, &sp50, var_r27);
showNextObj->trans.x = 68.0f;
showNextObj->trans.y = 430.0f;
showNextObj->trans.z = 100.0f;
sp44.x = showNextObj->trans.x;
sp44.y = showNextObj->trans.y;
sp44.z = showNextObj->trans.z;
Hu3D2Dto3D(&sp44, 1, &sp44);
BoardModelPosSetV(BoardStarHostMdlGet(), &sp44);
BoardCameraRotGet(&sp2C);
PSMTXRotRad(sp5C, 'y', MTXDegToRad(10.0f));
PSMTXRotRad(sp8C, 'x', MTXDegToRad(sp2C.x));
PSMTXConcat(sp8C, sp5C, spBC);
BoardModelMtxSet(BoardStarHostMdlGet(), &spBC);
BoardModelRotSet(BoardStarHostMdlGet(), 0.0f, 0.0f, 0.0f);
BoardModelScaleSet(BoardStarHostMdlGet(), 0.09f, 0.09f, 0.09f);
BoardMusStart(1, 7, 0x7F, 0);
BoardCameraMoveSet(0);
BoardCameraMotionWait();
BoardCameraMoveSet(1);
HuPrcSleep(1);
WipeCreate(WIPE_MODE_IN, WIPE_TYPE_NORMAL, 21);
while (WipeStatGet() != 0) {
HuPrcVSleep();
}
if (var_r28 == 0) {
var_r30 = lbl_8011E040[GWBoardGet()] + 6;
} else {
var_r30 = lbl_8011E064[GWBoardGet()][0];
}
BoardWinCreate(3, var_r30, -1);
BoardWinPause();
BoardViewMoveEnd();
while (!BoardViewMoveCheck()) {
HuPrcVSleep();
}
HuPrcSleep(30);
BoardWinKill();
HuPrcSleep(3);
if (var_r28 == 0) {
var_r30 = lbl_8011E040[GWBoardGet()] + 7;
} else {
var_r30 = lbl_8011E064[GWBoardGet()][1];
}
BoardWinCreate(3, var_r30, -1);
BoardWinWait();
BoardWinKill();
if (GWBoardGet() == 5 && BoardRollTypeGet() != 9 && boardStarShowNextHook) {
boardStarShowNextHook();
}
BoardAudSeqFadeOut(1, 1000);
WipeColorSet(0, 0, 0);
WipeCreate(WIPE_MODE_OUT, WIPE_TYPE_NORMAL, 21);
while (WipeStatGet() != 0) {
HuPrcVSleep();
}
BoardViewWait();
PSMTXIdentity(spBC);
BoardModelMtxSet(BoardStarHostMdlGet(), &spBC);
HideNextHost(1);
while (showNextObj) {
HuPrcVSleep();
}
BoardCameraMoveSet(0);
BoardCameraTargetPlayerSet(arg0);
BoardCameraMotionWait();
BoardCameraMoveSet(1);
BoardStatusItemSet(1);
WipeCreate(WIPE_MODE_IN, WIPE_TYPE_NORMAL, 21);
while (WipeStatGet() != 0) {
HuPrcVSleep();
}
if (!_CheckFlag(0x10017)) {
BoardMusStartBoard();
}
_ClearFlag(0x1001C);
}
static void ShowNextUpdate(omObjData *arg0) {
ShowNextWork *temp_r30 = OM_GET_WORK_PTR(arg0, ShowNextWork);
Vec sp8;
if (temp_r30->unk00_field0 != 0 || BoardIsKill()) {
showNextObj = NULL;
omDelObjEx(HuPrcCurrentGet(), arg0);
return;
}
switch (temp_r30->unk01) {
case 0:
sp8.x = arg0->trans.x;
sp8.y = arg0->trans.y;
sp8.z = arg0->trans.z;
Hu3D2Dto3D(&sp8, 1, &sp8);
break;
case 1:
sp8.x = arg0->scale.x;
sp8.y = arg0->scale.y;
sp8.z = arg0->scale.z;
BoardModelLayerSet(BoardStarHostMdlGet(), 0);
BoardModelRotSet(BoardStarHostMdlGet(), 0.0f, 0.0f, 0.0f);
BoardModelScaleSet(BoardStarHostMdlGet(), 1.0f, 1.0f, 1.0f);
temp_r30->unk00_field0 = 1;
break;
}
BoardModelPosSetV(BoardStarHostMdlGet(), &sp8);
}
static void HideNextHost(s32 arg0) {
ShowNextWork *temp_r31 = OM_GET_WORK_PTR(showNextObj, ShowNextWork);
temp_r31->unk01 = arg0;
}