820 lines
24 KiB
C
Executable file
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;
|
|
}
|