257 lines
No EOL
7.1 KiB
C
257 lines
No EOL
7.1 KiB
C
#include "game/board/warp.h"
|
|
#include "game/board/main.h"
|
|
#include "game/board/player.h"
|
|
#include "game/wipe.h"
|
|
#include "game/gamework_data.h"
|
|
#include "board_unsplit.h"
|
|
#include "unsplit.h"
|
|
#include "math.h"
|
|
|
|
static void WarpInit(s32);
|
|
static void WarpLaunch(s32);
|
|
static void WarpStartImpact(s32);
|
|
static void WarpFall(s32);
|
|
static void WarpImpact(s32);
|
|
|
|
|
|
extern void omVibrate(s16, s16, s16, s16);
|
|
extern void fn_800816CC(s32, s32);
|
|
extern void fn_80081884(f32);
|
|
extern void fn_8008181C(void);
|
|
extern s32 fn_8008186C(void);
|
|
extern f32 BoardModelMotionTimeGet(s16);
|
|
extern void BoardModelHookReset(s16);
|
|
extern s32 BoardModelHookSet(s16, char*, s16);
|
|
extern void BoardPlayerPosSet(s32, f32, f32, f32);
|
|
extern void BoardPlayerRotYSet(s32, f32);
|
|
extern void Hu3DModelObjPosGet(s16, char*, Vec*);
|
|
extern s32 BoardModelMotionEndCheck(s16);
|
|
|
|
extern s32 boardTutorialData[4];
|
|
|
|
static Vec warpPos;
|
|
|
|
static s8 warpState;
|
|
static s8 warpTarget;
|
|
static s8 warpImpactCnt;
|
|
static s16 warpSpace;
|
|
static f32 warpYFloor;
|
|
static f32 warpYVel;
|
|
static Process* warpProcess;
|
|
|
|
static s16 warpSpringMdl = -1;
|
|
static s16 warpImpactMdl = -1;
|
|
static s8 warpImpactPlayer[4] = {-1, -1, -1, -1};
|
|
|
|
static void WarpProcess(void);
|
|
static void WarpKill(void);
|
|
|
|
void BoardWarpExec(s32 player, s16 space) {
|
|
omVibrate(player, 12, 4, 2);
|
|
warpProcess = HuPrcChildCreate(WarpProcess, 8195, 14336, 0, boardMainProc);
|
|
HuPrcDestructorSet2(warpProcess, WarpKill);
|
|
|
|
while (warpProcess != NULL) {
|
|
HuPrcVSleep();
|
|
}
|
|
GWPlayer[player].color = 3;
|
|
}
|
|
|
|
void WarpProcess(void) {
|
|
s32 curr_player;
|
|
s32 warp_sound[8] = {291, 355, 419, 483, 547, 611, 675, 739};
|
|
|
|
warpState = 0;
|
|
curr_player = GWSystem.player_curr;
|
|
HuAudFXPlay(842);
|
|
BoardCameraViewSet(3);
|
|
BoardCameraMotionWait();
|
|
BoardPlayerAnimBlendSet(curr_player, 0, 15);
|
|
|
|
while (BoardPlayerAnimBlendCheck(curr_player) == 0) {
|
|
HuPrcVSleep();
|
|
}
|
|
|
|
BoardRotateDiceNumbers(curr_player);
|
|
if (_CheckFlag(0x1000B) != 0) {
|
|
BoardTutorialHookExec(18, 0);
|
|
boardTutorialData[0] = 0;
|
|
}
|
|
fn_800816CC(curr_player, 3);
|
|
fn_80081884(18.0f);
|
|
fn_8008181C();
|
|
warpTarget = fn_8008186C();
|
|
BoardCameraViewSet(1);
|
|
BoardCameraMotionWait();
|
|
WarpInit(curr_player);
|
|
|
|
while (1) {
|
|
switch (warpState) {
|
|
case 0:
|
|
if (BoardModelMotionTimeGet(warpSpringMdl) < 15.0f) {
|
|
break;
|
|
}
|
|
BoardModelHookReset(warpSpringMdl);
|
|
Hu3DModelObjPosGet(BoardModelIDGet(warpSpringMdl), "warp01", &warpPos);
|
|
BoardSpacePosGet(0, GWPlayer[curr_player].space_curr, &warpPos);
|
|
warpPos.y += 700.0f;
|
|
BoardPlayerPosSetV(curr_player, &warpPos);
|
|
warpState = 1;
|
|
HuAudFXPlay(warp_sound[GWPlayer[curr_player].character]);
|
|
break;
|
|
case 1:
|
|
WarpLaunch(curr_player);
|
|
break;
|
|
case 2:
|
|
if (BoardModelMotionEndCheck(warpSpringMdl) == 0) break;
|
|
warpState = 6;
|
|
break;
|
|
case 3:
|
|
WarpStartImpact(curr_player);
|
|
break;
|
|
case 4:
|
|
WarpFall(curr_player);
|
|
break;
|
|
case 5:
|
|
WarpImpact(curr_player);
|
|
break;
|
|
case 6:
|
|
HuPrcEnd();
|
|
break;
|
|
}
|
|
HuPrcVSleep();
|
|
}
|
|
}
|
|
|
|
void WarpKill(void) {
|
|
if (warpSpringMdl != -1) {
|
|
BoardModelKill(warpSpringMdl);
|
|
warpSpringMdl = -1;
|
|
}
|
|
if (warpImpactMdl != -1) {
|
|
BoardModelKill(warpImpactMdl);
|
|
warpImpactMdl = -1;
|
|
}
|
|
warpProcess = NULL;
|
|
}
|
|
|
|
static void WarpInit(s32 player) {
|
|
Vec pos;
|
|
s16 player_mdl = BoardPlayerModelGet(player);
|
|
|
|
warpSpringMdl = BoardModelCreate(MAKE_DATA_NUM(DATADIR_BOARD, 1), NULL, 0);
|
|
BoardSpacePosGet(0, GWPlayer[player].space_curr, &pos);
|
|
warpYFloor = 1500.0f + pos.y;
|
|
BoardModelLayerSet(warpSpringMdl, 2);
|
|
BoardCameraTargetModelSet(warpSpringMdl);
|
|
BoardModelMotionStart(warpSpringMdl, 0, 0);
|
|
BoardModelHookSet(warpSpringMdl, "warp01", player_mdl);
|
|
BoardModelPosSetV(warpSpringMdl, &pos);
|
|
HuAudFXPlay(835);
|
|
BoardPlayerRotYSet(player, 0.0f);
|
|
BoardPlayerPosSet(player, 0.0f, 0.0f, 0.0f);
|
|
BoardRotateDiceNumbers(player);
|
|
}
|
|
|
|
static void WarpLaunch(s32 player) {
|
|
|
|
warpPos.y += 20.0f;
|
|
BoardPlayerPosSetV(player, &warpPos);
|
|
if (!(warpPos.y < warpYFloor)) {
|
|
WipeColorSet(0U, 0U, 0U);
|
|
WipeCreate(2, 0, 21);
|
|
|
|
while (WipeStatGet() != 0) {
|
|
HuPrcVSleep();
|
|
}
|
|
warpPos.y = warpYFloor;
|
|
BoardModelVisibilitySet(warpSpringMdl, 0);
|
|
warpState = 3;
|
|
}
|
|
}
|
|
|
|
static void WarpStartImpact(s32 player) {
|
|
s32 i;
|
|
|
|
warpSpace = GWPlayer[warpTarget].space_curr;
|
|
GWPlayer[player].space_curr = warpSpace;
|
|
BoardSpacePosGet(0, warpSpace, &warpPos);
|
|
warpYFloor = warpPos.y;
|
|
warpPos.y += 1500.0f;
|
|
BoardPlayerPosSetV(player, &warpPos);
|
|
BoardPlayerRotSet(player, 180.0f, 180.0f, 0.0f);
|
|
|
|
for (i = 0, warpImpactCnt = i; i < 4; i++) {
|
|
if (warpSpace == GWPlayer[i].space_curr) {
|
|
warpImpactPlayer[warpImpactCnt] = i;
|
|
warpImpactCnt++;
|
|
}
|
|
}
|
|
warpImpactMdl = BoardModelCreate(MAKE_DATA_NUM(DATADIR_BOARD, 2), NULL, 0);
|
|
BoardModelVisibilitySet(warpImpactMdl, 0);
|
|
BoardModelMotionSpeedSet(warpImpactMdl, 0.0f);
|
|
BoardCameraMoveSet(0);
|
|
BoardCameraTargetSpaceSet(warpSpace);
|
|
HuPrcSleep(1);
|
|
WipeCreate(1, 0, 0x15);
|
|
while (WipeStatGet() != 0) {
|
|
HuPrcVSleep();
|
|
}
|
|
BoardCameraMoveSet(1);
|
|
warpYVel = -10.0f;
|
|
warpState = 4;
|
|
}
|
|
|
|
static void WarpFall(s32 player) {
|
|
warpYVel += -2.0f;
|
|
warpPos.y += warpYVel;
|
|
if (warpPos.y <= (150.0f + warpYFloor)) {
|
|
warpPos.y = warpYFloor;
|
|
warpState = 5;
|
|
HuAudFXPlay(837);
|
|
HuAudFXPlay(829);
|
|
}
|
|
BoardPlayerPosSetV(player, &warpPos);
|
|
}
|
|
|
|
static void WarpImpact(s32 player) {
|
|
Vec pos;
|
|
Vec pos_player;
|
|
s16 temp;
|
|
f32 speed;
|
|
f32 temp_f30;
|
|
f32 angle;
|
|
s16 i;
|
|
|
|
pos.x = 288.0f;
|
|
pos.y = 240.0f;
|
|
pos.z = 700.0f;
|
|
Hu3D2Dto3D(&pos, 1, &pos);
|
|
BoardModelPosSetV(warpImpactMdl, &pos);
|
|
BoardModelVisibilitySet(warpImpactMdl, 1);
|
|
BoardModelMotionStart(warpImpactMdl, 0, 0x40000001);
|
|
|
|
for (i = 0; i < warpImpactCnt; i++) {
|
|
s32 player = warpImpactPlayer[i];
|
|
omVibrate(player, 0xC, 4, 2);
|
|
BoardPlayerMotionStart(player, 6, 0x40000001);
|
|
}
|
|
BoardPlayerRotSet(player, 0.0f, 0.0f, 0.0f);
|
|
BoardPlayerPosGet(player, &pos_player);
|
|
pos_player.y = warpYFloor;
|
|
BoardPlayerPosSetV(player, &pos_player);
|
|
speed = 4.0f;
|
|
|
|
for (angle = 0.0f, temp = angle; angle < 180.0f; angle += speed) {
|
|
temp_f30 = sin((M_PI * angle) / 180.0);
|
|
BoardModelScaleSet(warpImpactMdl, 0.5f + temp_f30, 0.5f + temp_f30, 0.5f + temp_f30);
|
|
HuPrcVSleep();
|
|
}
|
|
BoardModelVisibilitySet(warpImpactMdl, 0);
|
|
HuPrcSleep(60);
|
|
|
|
for (i = 0; i < warpImpactCnt; i++) {
|
|
BoardRotateDiceNumbers(warpImpactPlayer[i]);
|
|
}
|
|
warpState = 6;
|
|
} |