From 31143de4ee106ec62971a328a1d0a81431a5600a Mon Sep 17 00:00:00 2001 From: gamemasterplc Date: Mon, 11 Mar 2024 10:50:14 -0500 Subject: [PATCH] Start decompiling board/last5.c --- config/GMPE01_00/symbols.txt | 4 +- include/game/board/player.h | 1 - include/game/board/window.h | 1 - include/game/process.h | 2 +- src/game/board/last5.c | 742 +++++++++++++++++++++++++++++++++++ 5 files changed, 745 insertions(+), 5 deletions(-) create mode 100644 src/game/board/last5.c diff --git a/config/GMPE01_00/symbols.txt b/config/GMPE01_00/symbols.txt index 6315e23d..193d486e 100644 --- a/config/GMPE01_00/symbols.txt +++ b/config/GMPE01_00/symbols.txt @@ -1925,9 +1925,9 @@ CreateBlock = .text:0x800AAC6C; // type:function size:0xD4 scope:local UpdateLotteryDraw = .text:0x800AAD40; // type:function size:0x170 scope:local SetLotteryDrawState = .text:0x800AAEB0; // type:function size:0x88 scope:local GetLotteryDrawState = .text:0x800AAF38; // type:function size:0x20 scope:local -KillLotteryWheel = .text:0x800AAF58; // type:function size:0x24 scope:local +KillLotteryDrawWheel = .text:0x800AAF58; // type:function size:0x24 scope:local UpdateLotteryDrawWheel = .text:0x800AAF7C; // type:function size:0x2D0 scope:local -SetLotteryWheelState = .text:0x800AB24C; // type:function size:0x1D8 scope:local +SetLotteryDrawWheelState = .text:0x800AB24C; // type:function size:0x1D8 scope:local ExecLotteryDraw = .text:0x800AB424; // type:function size:0x950 scope:local KillLotteryTicket = .text:0x800ABD74; // type:function size:0x4C scope:local InitLotteryTicket = .text:0x800ABDC0; // type:function size:0x488 scope:local diff --git a/include/game/board/player.h b/include/game/board/player.h index 229e5bdd..b7f983e1 100644 --- a/include/game/board/player.h +++ b/include/game/board/player.h @@ -8,7 +8,6 @@ #include "game/gamework.h" #include "game/window.h" #include "game/object.h" -#include "game/process.h" #include "game/hsfman.h" #include "game/hsfmotion.h" #include "game/gamework_data.h" diff --git a/include/game/board/window.h b/include/game/board/window.h index 2792395a..bf594796 100644 --- a/include/game/board/window.h +++ b/include/game/board/window.h @@ -2,7 +2,6 @@ #define _BOARD_WINDOW_H #include "game/window.h" -#include "game/process.h" typedef void (*BoardWinComKeyFunc)(); diff --git a/include/game/process.h b/include/game/process.h index aad4d97a..c83b9cf2 100644 --- a/include/game/process.h +++ b/include/game/process.h @@ -38,7 +38,7 @@ Process *HuPrcCurrentGet(void); int HuPrcKill(Process *process); void HuPrcChildKill(Process *process); void HuPrcSleep(int time); -void HuPrcVSleep(void); +void HuPrcVSleep(); void HuPrcWakeup(Process *process); void HuPrcDestructorSet2(Process *process, void (*func)(void)); void HuPrcDestructorSet(void (*func)(void)); diff --git a/src/game/board/last5.c b/src/game/board/last5.c new file mode 100644 index 00000000..f1141878 --- /dev/null +++ b/src/game/board/last5.c @@ -0,0 +1,742 @@ +#include "game/board/main.h" +#include "game/board/model.h" +#include "game/board/player.h" +#include "game/board/audio.h" +#include "game/board/window.h" +#include "game/board/ui.h" +#include "game/board/space.h" +#include "game/board/star.h" +#include "game/audio.h" +#include "game/objsub.h" +#include "game/pad.h" + +#include "game/data.h" +#include "game/wipe.h" + +static s16 stopWin = -1; +static s16 wheelMdl = -1; +s16 lbl_801D3854 = -1; +static s16 focusMdl = -1; +static s32 messBase = -1; + +static s32 hostMotTbl[][8] = { + { + DATA_MAKE_NUM(DATADIR_BLAST5, 23), + DATA_MAKE_NUM(DATADIR_BLAST5, 24), + DATA_MAKE_NUM(DATADIR_BLAST5, 25), + DATA_MAKE_NUM(DATADIR_BLAST5, 26), + DATA_MAKE_NUM(DATADIR_BLAST5, 27), + DATA_MAKE_NUM(DATADIR_BLAST5, 28), + DATA_MAKE_NUM(DATADIR_BLAST5, 29), + DATA_MAKE_NUM(DATADIR_BLAST5, 30) + }, + { + DATA_MAKE_NUM(DATADIR_BLAST5, 31), + DATA_MAKE_NUM(DATADIR_BLAST5, 32), + DATA_MAKE_NUM(DATADIR_BLAST5, 33), + DATA_MAKE_NUM(DATADIR_BLAST5, 34), + DATA_MAKE_NUM(DATADIR_BLAST5, 35), + DATA_MAKE_NUM(DATADIR_BLAST5, 36), + DATA_MAKE_NUM(DATADIR_BLAST5, 37), + DATA_MAKE_NUM(DATADIR_BLAST5, 38) + }, + { + DATA_MAKE_NUM(DATADIR_BLAST5, 39), + DATA_MAKE_NUM(DATADIR_BLAST5, 40), + DATA_MAKE_NUM(DATADIR_BLAST5, 41), + DATA_MAKE_NUM(DATADIR_BLAST5, 42), + DATA_MAKE_NUM(DATADIR_BLAST5, 43), + DATA_MAKE_NUM(DATADIR_BLAST5, 44), + DATA_MAKE_NUM(DATADIR_BLAST5, 45), + DATA_MAKE_NUM(DATADIR_BLAST5, 46) + }, + { + DATA_MAKE_NUM(DATADIR_BLAST5, 47), + DATA_MAKE_NUM(DATADIR_BLAST5, 48), + DATA_MAKE_NUM(DATADIR_BLAST5, 49), + DATA_MAKE_NUM(DATADIR_BLAST5, 50), + DATA_MAKE_NUM(DATADIR_BLAST5, 51), + DATA_MAKE_NUM(DATADIR_BLAST5, 52), + DATA_MAKE_NUM(DATADIR_BLAST5, 53), + DATA_MAKE_NUM(DATADIR_BLAST5, 54) + }, + { + DATA_MAKE_NUM(DATADIR_BLAST5, 55), + DATA_MAKE_NUM(DATADIR_BLAST5, 56), + DATA_MAKE_NUM(DATADIR_BLAST5, 57), + DATA_MAKE_NUM(DATADIR_BLAST5, 58), + DATA_MAKE_NUM(DATADIR_BLAST5, 59), + DATA_MAKE_NUM(DATADIR_BLAST5, 60), + DATA_MAKE_NUM(DATADIR_BLAST5, 61), + DATA_MAKE_NUM(DATADIR_BLAST5, 62) + }, + { + DATA_MAKE_NUM(DATADIR_BLAST5, 63), + DATA_MAKE_NUM(DATADIR_BLAST5, 64), + DATA_MAKE_NUM(DATADIR_BLAST5, 65), + DATA_MAKE_NUM(DATADIR_BLAST5, 66), + DATA_MAKE_NUM(DATADIR_BLAST5, 67), + DATA_MAKE_NUM(DATADIR_BLAST5, 68), + DATA_MAKE_NUM(DATADIR_BLAST5, 69), + DATA_MAKE_NUM(DATADIR_BLAST5, 70) + }, + { + -1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + }, + { + -1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + }, + { + -1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + }, +}; + +static s32 messBaseTbl[] = { + 0xE0000, + 0xE0018, + 0xE0030, + 0xE0048, + 0xE0060, + 0xE0078, + 0, + 0, + 0, +}; + +static float playerOfsTbl[][2] = { + { -94, 0 }, + { 0, 0 }, + { 94, 0 } +}; + +static char *plateObjNameTbl[] = { + "plate", + "plate1", + "plate2", + "plate3" +}; + +static char *hiliteObjNameTbl[] = { + "lite", + "lite1", + "lite2", + "lite3", + "kao", + "kao1", + "kao2", + "kao3", +}; + +static s32 resultRankFX12Tbl[] = { + 0x122, + 0x162, + 0x1A2, + 0x1E2, + 0x222, + 0x262, + 0x2A2, + 0x2E2 +}; + +static s32 resultRankFX3Tbl[] = { + 0x12A, + 0x16A, + 0x1AA, + 0x1EA, + 0x22A, + 0x26A, + 0x2AA, + 0x2EA +}; + +static s32 resultRankFX4Tbl[] = { + 0x12E, + 0x16E, + 0x1AE, + 0x1EE, + 0x22E, + 0x26E, + 0x2AE, + 0x2EE +}; + +static s32 impactFXTbl[] = { + 0x119, + 0x159, + 0x199, + 0x1D9, + 0x219, + 0x259, + 0x299, + 0x2D9 +}; + +static s32 lotteryWheelMdlTbl[] = { + DATA_MAKE_NUM(DATADIR_BLAST5, 13), + DATA_MAKE_NUM(DATADIR_BLAST5, 14), + DATA_MAKE_NUM(DATADIR_BLAST5, 15), + DATA_MAKE_NUM(DATADIR_BLAST5, 16), + DATA_MAKE_NUM(DATADIR_BLAST5, 17), + DATA_MAKE_NUM(DATADIR_BLAST5, 18), + DATA_MAKE_NUM(DATADIR_BLAST5, 19), + DATA_MAKE_NUM(DATADIR_BLAST5, 20), +}; + +static s16 lotterySprPrioTbl[] = { + 1520, + 1510, + 1500, + 1500, + 1500, + 1500, + 1500, + 1500, + 1500, + 1500, + 1500, + 1490, + 1490, + 1500, + 1500 +}; + +static s32 lotterySprTbl[] = { + DATA_MAKE_NUM(DATADIR_BOARD, 39), + DATA_MAKE_NUM(DATADIR_BOARD, 38), + DATA_MAKE_NUM(DATADIR_BOARD, 41), + DATA_MAKE_NUM(DATADIR_BOARD, 40), + DATA_MAKE_NUM(DATADIR_BOARD, 40), + DATA_MAKE_NUM(DATADIR_BOARD, 40), + DATA_MAKE_NUM(DATADIR_BOARD, 45), + DATA_MAKE_NUM(DATADIR_BOARD, 40), + DATA_MAKE_NUM(DATADIR_BOARD, 40), + DATA_MAKE_NUM(DATADIR_BOARD, 40), + DATA_MAKE_NUM(DATADIR_BOARD, 44), + DATA_MAKE_NUM(DATADIR_BOARD, 42), + DATA_MAKE_NUM(DATADIR_BOARD, 42), +}; + +static float lotterySprPosTbl[][2] = { + { 0, -35 }, + { 0, 0 }, + { -68, -38 }, + { 80, -22 }, + { 64, -22 }, + { 48, -22 }, + { 26, -22 }, + { 80, -48 }, + { 64, -48 }, + { 48, -48 }, + { 26, -48 }, + { -18, -40 }, + { -18, 32 }, + { -16, -72 }, + { -16, 0 } +}; + +static s32 teamCharSprTbl[] = { + DATA_MAKE_NUM(DATADIR_BOARD, 46), + DATA_MAKE_NUM(DATADIR_BOARD, 47), + DATA_MAKE_NUM(DATADIR_BOARD, 48), + DATA_MAKE_NUM(DATADIR_BOARD, 49), + DATA_MAKE_NUM(DATADIR_BOARD, 50), + DATA_MAKE_NUM(DATADIR_BOARD, 51), + DATA_MAKE_NUM(DATADIR_BOARD, 52), + DATA_MAKE_NUM(DATADIR_BOARD, 53), +}; + +static s8 currTicket; +static s8 numTickets; +static s8 last5Player; +static s16 last5Space; +static s16 hostMdl; +static omObjData *last5RouletteObj; +static Process *last5Proc; +static omObjData *teamResultObj; +static omObjData *hostMoveObj; +static omObjData *lotteryDrawObj; +static omObjData *lotteryDrawWheelObj; + +static Vec spacePos; +static Vec focusPos; +static Vec hostPos; +static s16 hostMot[8]; +static omObjData *lotteryTicketObj[4]; + +static void DestroyLast5(void); + +static void ExecLast5(void); +static void CreateLast5(void); +static void KillLast5(void); + +static void InitHost(void); +static void KillHost(void); + +static void Last5Main(void); + +static s32 CheckJump(s32 player); + +static void CreateBlock(Vec *pos); + +static void CreateLotteryDrawWheel(void); + +static void SetLotteryDrawState(s32 state); +static s32 GetLotteryDrawState(); + +static void KillLotteryDrawWheel(void); + +static void ExecLotteryDraw(void); + +static void InitLotteryTicket(void); +static void KillLotteryTicket(void); + +static void StartHostMove(Vec *from, Vec *to, s32 time); +static s32 CheckHostMove(void); + + +static void CreateStopWin(void); +static void CreateLast5Roulette(void); +static void SetLast5RouletteFade(s32 flag); +static void SetLast5RouletteState(s32 state); +static s32 GetLast5RouletteState(); +static s32 GetLast5RouletteResult(); + +static void CreateTeamResult(void); +static void GetTeamResultTaget(s32 team, Vec *pos); +static void SetTeamResultTaget(s32 team, Vec *pos); +static void KillTeamResult(void); + +void BoardLast5Exec() +{ + GWSystem.player_curr = -1; + last5Proc = HuPrcChildCreate(ExecLast5, 8200, 14336, 0, boardMainProc); + HuPrcDestructorSet2(last5Proc, DestroyLast5); + while(last5Proc != NULL) { + HuPrcVSleep(); + } + GWSystem.player_curr = 0; +} + +static void DestroyLast5(void) +{ + KillLast5(); + HuDataDirClose(DATADIR_BLAST5); + last5Proc = NULL; +} + +static void ExecLast5(void) +{ + s32 i; + messBase = messBaseTbl[GWBoardGet()]; + CreateLast5(); + WipeCreate(WIPE_MODE_IN, WIPE_TYPE_NORMAL, -1); + while(WipeStatGet()) { + HuPrcVSleep(); + } + _ClearFlag(0x1001C); + BoardLast5GfxInit(); + BoardAudSeqFadeOut(0, 1000); + BoardMusStart(1, 8, 127, 0); + BoardWinCreate(2, messBase, BoardWinPortraitGetStar()); + BoardWinWait(); + BoardWinKill(); + ExecLotteryDraw(); + Last5Main(); + BoardAudSeqFadeOut(1, 1000); + _SetFlag(0x1001C); + _SetFlag(0x1000E); + WipeColorSet(255, 255, 255); + WipeCreate(WIPE_MODE_OUT, WIPE_TYPE_NORMAL, -1); + while(WipeStatGet()) { + HuPrcVSleep(); + } + BoardModelMotionStart(hostMdl, 1, 0x40000001); + BoardCameraMoveSet(0); + BoardCameraViewSet(2); + BoardCameraMotionWait(); + BoardCameraMoveSet(1); + for(i=0; i<4; i++) { + BoardModelVisibilitySet(BoardPlayerModelGet(i), 1); + BoardPlayerCornerPosSet(i); + BoardPlayerRotYSet(i, 0.0f); + } + BoardStatusItemSet(0); + HuPrcSleep(60); + HuPrcEnd(); +} + +static void CreateLast5(void) +{ + Vec rot; + s32 i; + last5Space = BoardSpaceFlagPosGet(0, 0x80000000, &spacePos); + for(i=0; i<4; i++) { + BoardModelVisibilitySet(BoardPlayerModelGet(i), 0); + } + BoardStatusItemSet(0); + focusPos.x = 150.0f+spacePos.x; + focusPos.y = 100.0f+spacePos.y; + focusPos.z = -150.0f+spacePos.z; + focusMdl = BoardModelCreate(DATA_MAKE_NUM(DATADIR_BOARD, 10), NULL, 0); + BoardModelVisibilitySet(focusMdl, 0); + BoardModelPosSetV(focusMdl, &focusPos); + rot.x = -10.0f; + rot.y = 0.0f; + rot.z = 0.0f; + BoardCameraMoveSet(0); + BoardCameraMotionStartEx(focusMdl, &rot, NULL, 1480.0f, 25.0f, 1); + BoardCameraMotionWait(); + BoardCameraMoveSet(1); + InitHost(); + CreateLotteryDrawWheel(); + InitLotteryTicket(); +} + +static void KillLast5(void) +{ + if(stopWin != -1) { + HuWinKill(stopWin); + stopWin = -1; + } + BoardConfettiKill(); + KillHost(); + KillLotteryDrawWheel(); + KillLotteryTicket(); +} + +static void InitHost(void) +{ + Vec pos; + s32 i; + s32 board = GWBoardGet(); + hostMdl = BoardStarHostMdlGet(); + BoardModelPosGet(hostMdl, &hostPos); + for(i=0; i<8; i++) { + hostMot[i] = BoardModelMotionCreate(hostMdl, hostMotTbl[board][i]); + } + BoardModelMotionStart(hostMdl, 1, 0x40000001); + pos.x = 150.0f+spacePos.x; + pos.y = spacePos.y; + pos.z = (150.0f+spacePos.z)-50.0f; + BoardModelPosSetV(hostMdl, &pos); +} + +static void KillHost(void) +{ + s32 i; + for(i=0; i<8; i++) { + if(hostMot[i] != -1) { + BoardModelMotionKill(hostMdl, hostMot[i]); + hostMot[i] = -1; + } + } + BoardModelRotYSet(hostMdl, 0.0f); + BoardModelPosSetV(hostMdl, &hostPos); +} + +static void Last5Main(void) +{ + float temp_f31; + s32 temp_r31; + s32 temp_r30; + s32 temp_r29; + s32 temp_r27; + s32 temp_r26; + s32 temp_r25; + s32 temp_r24; + s32 temp_r23; + s32 temp_r22; + s32 temp_r21; + s32 temp_r20; + s32 temp_r19; + s32 temp_r18; + Vec sp6C[4]; + Vec sp60; + Vec sp54; + Vec sp48; + Vec sp3C; + float sp2C[4]; + s8 sp28[4]; + s8 sp24[4]; + s8 sp20[4]; + + + + temp_r18 = -1; + for(temp_r26=temp_r27=0; temp_r27<=3; temp_r27++) { + for(temp_r25=temp_r31=0; temp_r31<4; temp_r31++) { + if(GWPlayer[temp_r31].rank == temp_r27) { + sp28[temp_r26] = temp_r31; + sp24[temp_r26] = temp_r27; + temp_r26++; + if(temp_r27 > temp_r18) { + sp20[temp_r25] = temp_r31; + temp_r25++; + } + } + } + if(temp_r25 != 0) { + temp_r21 = temp_r25; + } + } + BoardWinCreate(2, messBase+10, BoardWinPortraitGetStar()); + BoardWinWait(); + BoardModelMotionShiftSet(hostMdl, hostMot[5], 0.0f, 4.0f, 0); + HuPrcVSleep(8); + BoardModelMotionShiftSet(hostMdl, hostMot[6], 0.0f, 8.0f, 0x40000001); + for(temp_r31=0; temp_r31<4; temp_r31++) { + temp_r30 = sp28[temp_r31]; + temp_r27 = sp24[temp_r31]; + temp_r23 = GWPlayer[temp_r30].character; + sp6C[temp_r31].x = -122.0f; + sp6C[temp_r31].y = (temp_r31*74)+80; + sp6C[temp_r31].z = 0.0f; + BoardStatusPosSet(temp_r30, &sp6C[temp_r31]); + HuPrcVSleep(); + BoardStatusShowSet(temp_r30, 1); + sp2C[temp_r31] = (122.0f-sp6C[temp_r31].x)/15.0f; + for(temp_r29=0; temp_r29<15; temp_r29++) { + sp6C[temp_r31].x += sp2C[temp_r31]; + BoardStatusPosSet(temp_r30, &sp6C[temp_r31]); + HuPrcVSleep(); + } + switch(temp_r27) { + case 0: + case 1: + temp_r22 = resultRankFX12Tbl[temp_r23]; + break; + + case 2: + temp_r22 = resultRankFX3Tbl[temp_r23]; + break; + + case 3: + temp_r22 = resultRankFX4Tbl[temp_r23]; + break; + } + HuAudFXPlay(temp_r22); + temp_r24 = 11+messBase+temp_r27; + BoardWinCreate(2, temp_r24, BoardWinPortraitGetStar()); + BoardWinInsertMesSet(BoardPlayerGetCharMess(temp_r30), temp_r27); + BoardWinWait(); + } + if((s32)GWSystem.team != 0) { + CreateTeamResult(); + for(temp_r31=0; temp_r31<4; temp_r31++) { + sp2C[temp_r31] = (-122.0f-sp6C[temp_r31].x)/15.0f; + } + for(temp_r29=0; temp_r29<15; temp_r29++) { + for(temp_r31=0; temp_r31<4; temp_r31++) { + temp_r30 = sp28[temp_r31]; + sp6C[temp_r31].x += sp2C[temp_r31]; + BoardStatusPosSet(temp_r30, &sp6C[temp_r31]); + } + HuPrcVSleep(); + } + BoardStatusItemSet(0); + temp_r24 = 0xE0090+GWBoardGet(); + BoardWinCreate(2, temp_r24, BoardWinPortraitGetStar()); + BoardWinWait(); + for(temp_r31=0; temp_r31<2; temp_r31++) { + GetTeamResultTaget(temp_r31, &sp6C[temp_r31]); + sp2C[temp_r31] = (122.0f-sp6C[temp_r31].x)/15.0f; + for(temp_r29=0; temp_r29<15; temp_r29++) { + sp6C[temp_r31].x += sp2C[temp_r31]; + SetTeamResultTaget(temp_r31, &sp6C[temp_r31]); + HuPrcVSleep(); + } + } + } + BoardModelMotionStart(hostMdl, hostMot[5], 0x40000004); + HuPrcVSleep(8); + BoardModelMotionShiftSet(hostMdl, 1, 0.0f, 8.0f, 0x40000001); + BoardWinCreate(2, messBase+15, BoardWinPortraitGetStar()); + BoardWinWait(); + if((s32)GWSystem.team != 0) { + for(temp_r31=0; temp_r31<2; temp_r31++) { + sp2C[temp_r31] = (-122.0f-sp6C[temp_r31].x)/15.0f; + } + for(temp_r29=0; temp_r29<15; temp_r29++) { + for(temp_r31=0; temp_r31<2; temp_r31++) { + GetTeamResultTaget(temp_r31, &sp6C[temp_r31]); + sp6C[temp_r31].x += sp2C[temp_r31]; + SetTeamResultTaget(temp_r31, &sp6C[temp_r31]); + } + HuPrcVSleep(); + } + KillTeamResult(); + } else { + for(temp_r31=0; temp_r31<4; temp_r31++) { + sp2C[temp_r31] = (-122.0f-sp6C[temp_r31].x)/15.0f; + } + for(temp_r29=0; temp_r29<15; temp_r29++) { + for(temp_r31=0; temp_r31<4; temp_r31++) { + temp_r30 = sp28[temp_r31]; + sp6C[temp_r31].x += sp2C[temp_r31]; + BoardStatusPosSet(temp_r30, &sp6C[temp_r31]); + } + HuPrcVSleep(); + } + BoardStatusItemSet(0); + } + BoardModelPosGet(hostMdl, &sp60); + sp54.x = sp60.x+100.0f; + sp54.y = sp60.y; + sp54.z = sp60.z; + StartHostMove(&sp60, &sp54, 25); + while(!CheckHostMove()) { + HuPrcVSleep(); + } + BoardModelMotionShiftSet(hostMdl, 1, 0.0f, 8.0f, 0x40000001); + HuPrcSleep(8); + if((s32)GWSystem.team != 0) { + temp_r30 = last5Player; + } else { + if(temp_r21 == 1) { + temp_r30 = sp20[0]; + } else { + temp_r30 = sp20[BoardRandMod(temp_r21)]; + } + } + sp48.x = sp60.x-100.0f; + sp48.y = sp60.y; + sp48.z = sp60.z; + sp48.y += 700.0f; + BoardPlayerPosSetV(temp_r30, &sp48); + BoardPlayerMotionStart(temp_r30, 6, 0x40000001); + BoardPlayerVoiceEnableSet(temp_r30, 6, 0); + BoardPlayerRotYSet(temp_r30, 0); + BoardModelVisibilitySet(BoardPlayerModelGet(temp_r30), 1); + BoardWinCreate(2, messBase+16, BoardWinPortraitGetStar()); + BoardWinInsertMesSet(BoardPlayerGetCharMess(temp_r30), 3); + BoardWinWait(); + BoardModelMotionShiftSet(hostMdl, hostMot[5], 0.0f, 4.0f, 0); + HuPrcVSleep(8); + BoardModelMotionShiftSet(hostMdl, hostMot[6], 0.0f, 8.0f, 0x40000001); + temp_r19 = 0; + temp_r29 = 3; + for(temp_f31=0; temp_r29>0; temp_f31++) { + sp48.y += (float)(5.0+((9.8/120)*temp_f31*temp_f31)); + if(sp60.y > sp48.y) { + omVibrate(temp_r30, 12, 6, 6); + if(!temp_r19) { + HuAudFXPlay(impactFXTbl[GWPlayer[temp_r30].character]); + temp_r19 = 1; + } + sp48.y = sp60.y; + sp48.y += temp_r29*10; + temp_r29--; + temp_f31 = 0.0f; + } + BoardPlayerPosSetV(temp_r30, &sp48); + HuPrcVSleep(); + } + HuPrcSleep(20); + BoardPlayerIdleSet(temp_r30); + sp3C = sp48; + BoardModelMotionStart(hostMdl, hostMot[5], 0x40000004); + HuPrcVSleep(8); + BoardModelMotionShiftSet(hostMdl, 1, 0.0f, 8.0f, 0x40000001); + CreateLast5Roulette(); + SetLast5RouletteFade(1); + SetLast5RouletteState(2); + CreateStopWin(); + sp48.x = sp60.x-100.0f; + sp48.y = sp60.y; + sp48.z = sp60.z; + CreateBlock(&sp48); + SetLotteryDrawState(2); + while(GetLotteryDrawState() != 0) { + HuPrcVSleep(); + } + while(!CheckJump(temp_r30)) { + HuPrcVSleep(); + } + BoardPlayerDiceJumpStart(temp_r30); + while(!BoardPlayerDiceJumpCheck(temp_r30)) { + HuPrcVSleep(); + } + SetLotteryDrawState(1); + SetLast5RouletteState(3); + while(GWPlayer[temp_r30].field08_bit3) { + HuPrcVSleep(); + } + while(GetLast5RouletteState() != 0) { + HuPrcVSleep(); + } + HuWinDispOff(stopWin); + SetLotteryDrawState(3); + temp_r20 = GetLast5RouletteResult(); + GWSystem.last5_effect = temp_r20; + if(GWSystem.last5_effect == 2) { + BoardSpaceTypeForce(2, 3); + } + if(GWSystem.last5_effect == 3) { + BoardSpaceTypeForce(2, 7); + } + temp_r24 = 18+messBase+temp_r20; + BoardWinCreate(2, temp_r24, BoardWinPortraitGetStar()); + BoardWinWait(); + StartHostMove(&sp54, &sp60, 25); + BoardPlayerPosGet(temp_r30, &sp48); + sp48 = sp3C; + sp3C.x = sp48.x-300.0f; + sp3C.y = sp48.y; + sp3C.z = sp48.z; + BoardPlayerPosLerpStart(temp_r30, &sp48, &sp3C, 25); + while(GWPlayer[temp_r30].moving) { + HuPrcVSleep(); + } + BoardPlayerIdleSet(temp_r30); + BoardModelVisibilitySet(BoardPlayerModelGet(temp_r30), 0); + SetLast5RouletteFade(0); + BoardModelMotionShiftSet(hostMdl, 1, 0.0f, 8.0f, 0x40000001); + BoardWinCreate(2, messBase+23, BoardWinPortraitGetStar()); + BoardWinWait(); + BoardModelMotionShiftSet(hostMdl, hostMot[4], 0.0f, 8.0f, 0); + HuPrcSleep(8); + while(!BoardModelMotionEndCheck(hostMdl)) { + HuPrcVSleep(); + } + BoardModelMotionShiftSet(hostMdl, hostMot[2], 0.0f, 8.0f, 0x40000001); + SetLotteryDrawState(4); +} + +static s32 CheckJump(s32 player) +{ + s32 sp8 = 0; + if(GWPlayer[player].com) { + if(BoardRandMod(100) >= 90) { + return 1; + } else { + goto return0; + } + } + if(HuPadBtnDown[GWPlayer[player].port] == PAD_BUTTON_A) { + return 1; + } else { + return0: + return 0; + } +} \ No newline at end of file