#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[] = { MAKE_MESSID(14, 0), MAKE_MESSID(14, 24), MAKE_MESSID(14, 48), MAKE_MESSID(14, 72), MAKE_MESSID(14, 96), MAKE_MESSID(14, 120), 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" }; static char *faceObjNameTbl[] = { "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 teamSprPrioTbl[] = { 1520, 1510, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1490, 1490, 1500, 1500 }; static s32 teamSprTbl[] = { 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 teamSprPosTbl[][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 CreateLotteryDrawWheel(void); static void CreateLotteryDraw(Vec *pos); static void UpdateLotteryDraw(omObjData *object); static void SetLotteryDrawState(s32 state); static s32 GetLotteryDrawState(); static void KillLotteryDrawWheel(void); static void UpdateLotteryDrawWheel(omObjData *object); static void SetLotteryDrawWheelState(s32 state); static void ExecLotteryDraw(void); static void KillLotteryTicket(void); static void InitLotteryTicket(void); static void UpdateLotteryTicket(omObjData *object); static void SetLotteryTicketState(s32 player, s32 state); static s32 GetLotteryTicketPlayer(void); static s32 CheckLotteryTicket(void); static void UpdateLotteryTicketMatch(s32 progress, s32 character); static void StartHostMove(Vec *from, Vec *to, s16 time); static void ExecHostMove(omObjData *object); static s32 CheckHostMove(void); static void CreateStopWin(void); static void CreateLast5Roulette(void); static void UpdateLast5Roulette(omObjData *object); static void SetLast5RouletteFade(s32 flag); static void SetLast5RouletteState(s32 state); static s32 GetLast5RouletteState(void); static s32 GetLast5RouletteResult(void); static void CreateTeamResult(void); static void GetTeamResultTarget(s32 team, Vec *pos); static void SetTeamResultTarget(s32 team, Vec *pos); static void KillTeamResult(void); static void UpdateTeamResult(omObjData *object); 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 = MAKE_MESSID(14, 144) + GWBoardGet(); BoardWinCreate(2, temp_r24, BoardWinPortraitGetStar()); BoardWinWait(); for(temp_r31=0; temp_r31<2; temp_r31++) { GetTeamResultTarget(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]; SetTeamResultTarget(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++) { GetTeamResultTarget(temp_r31, &sp6C[temp_r31]); sp6C[temp_r31].x += sp2C[temp_r31]; SetTeamResultTarget(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; CreateLotteryDraw(&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].jump) { 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 if(HuPadBtnDown[GWPlayer[player].port] == PAD_BUTTON_A) { return 1; } return 0; } typedef struct draw_wheel_mdl { s16 plate[4]; s16 face[4]; s16 center; } DrawWheelMdl; typedef struct draw_wheel_work { struct { u8 kill : 1; }; s8 state; s8 hilite; u16 timer; u8 hilite_vel; u8 hilite_accel; DrawWheelMdl *mdl; } DrawWheelWork; typedef struct lottery_draw_work { struct { u8 kill : 1; }; u8 state; s16 block_mdl; float min_y; } LotteryDrawWork; static void CreateLotteryDrawWheel(void) { omObjData *object; DrawWheelWork *work; DrawWheelMdl *mdl; s32 i; object = omAddObjEx(boardObjMan, 257, 0, 0, -1, UpdateLotteryDrawWheel); lotteryDrawWheelObj = object; work = OM_GET_WORK_PTR(object, DrawWheelWork); work->kill = 0; work->state = 0; work->mdl = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(DrawWheelMdl), MEMORY_DEFAULT_NUM); work->hilite = 0; work->hilite_vel = 2; work->hilite_accel = 5; mdl = work->mdl; object->trans.x = spacePos.x + -300.0f; object->trans.y = spacePos.y; object->trans.z = spacePos.z + -50.0f; wheelMdl = BoardModelCreate(DATA_MAKE_NUM(DATADIR_BLAST5, 12), NULL, 0); BoardModelPosSet(wheelMdl, object->trans.x, object->trans.y, object->trans.z); mdl->center = BoardModelCreate(DATA_MAKE_NUM(DATADIR_BLAST5, 22), NULL, 0); BoardModelVisibilitySet(mdl->center, 0); for(i=0; i<4; i++) { s32 character = GWPlayer[i].character; mdl->face[i] = BoardModelCreate(lotteryWheelMdlTbl[character], NULL, 0); BoardModelPosSet(mdl->face[i], 0, 0, -10); mdl->plate[i] = BoardModelCreate(DATA_MAKE_NUM(DATADIR_BLAST5, 21), NULL, 1); BoardModelHookSet(wheelMdl, faceObjNameTbl[i], mdl->face[i]); BoardModelHookSet(wheelMdl, plateObjNameTbl[i], mdl->plate[i]); } } static void CreateLotteryDraw(Vec *pos) { omObjData *object; LotteryDrawWork *work; object = omAddObjEx(boardObjMan, 257, 0, 0, -1, UpdateLotteryDraw); lotteryDrawObj = object; work = OM_GET_WORK_PTR(object, LotteryDrawWork); work->kill = 0; work->state = 0; work->block_mdl = BoardModelCreate(DATA_MAKE_NUM(DATADIR_BLAST5, 11), NULL, 0); work->min_y = pos->y+300.0f; pos->y += 700.0f; BoardModelPosSetV(work->block_mdl, pos); object->trans.x = 1.0f; BoardModelAlphaSet(work->block_mdl, 255); } static void UpdateLotteryDraw(omObjData *object) { LotteryDrawWork *work = OM_GET_WORK_PTR(object, LotteryDrawWork); Vec pos; if(work->kill || BoardIsKill()) { BoardModelKill(work->block_mdl); lotteryDrawObj = NULL; omDelObjEx(HuPrcCurrentGet(), object); return; } switch(work->state) { case 1: BoardModelPosGet(work->block_mdl, &pos); pos.y += 50.0f; BoardModelPosSetV(work->block_mdl, &pos); SetLotteryDrawState(2); break; case 2: BoardModelPosGet(work->block_mdl, &pos); if(pos.y < work->min_y) { pos.y = work->min_y; SetLotteryDrawState(0); } pos.y -= 20.0f; BoardModelPosSetV(work->block_mdl, &pos); break; case 3: object->trans.x -= 0.1f; if(object->trans.x < 0.0f) { object->trans.x = 0; SetLotteryDrawState(0); } BoardModelAlphaSet(work->block_mdl, 255.0f*object->trans.x); break; case 0: break; default: break; } } static void SetLotteryDrawState(s32 state) { LotteryDrawWork *work; if(!lotteryDrawObj) { return; } work = OM_GET_WORK_PTR(lotteryDrawObj, LotteryDrawWork); work->state = state; if(state == 4) { work->kill = 1; } if(state == 3) { lotteryDrawObj->trans.x = 1.0f; } if(state == 1) { HuAudFXPlay(780); } } static s32 GetLotteryDrawState(void) { LotteryDrawWork *work = OM_GET_WORK_PTR(lotteryDrawObj, LotteryDrawWork); return work->state; } static void KillLotteryDrawWheel(void) { SetLotteryDrawWheelState(5); } static void UpdateLotteryDrawWheel(omObjData *object) { DrawWheelWork *work = OM_GET_WORK_PTR(object, DrawWheelWork); DrawWheelMdl *mdl = work->mdl; s32 i; if(work->kill || BoardIsKill()) { BoardModelHookReset(wheelMdl); for(i=0; i<4; i++) { if(mdl->face[i] != -1) { BoardModelKill(mdl->face[i]); } if(mdl->plate[i] != -1) { BoardModelKill(mdl->plate[i]); } } if(wheelMdl != -1) { BoardModelKill(wheelMdl); wheelMdl = -1; } if(lbl_801D3854 != -1) { BoardModelKill(lbl_801D3854); lbl_801D3854 = -1; } if(mdl->center != -1) { BoardModelKill(mdl->center); } HuMemDirectFree(work->mdl); lotteryDrawWheelObj = NULL; omDelObjEx(HuPrcCurrentGet(), object); return; } switch(work->state) { case 4: if(work->timer == 0) { work->hilite_vel += work->hilite_accel; work->hilite_accel++; if(work->hilite_vel > 60 || (work->hilite_vel > 40 && BoardRandMod(100) > 80)) { BoardModelMotionStart(mdl->center, 0, 0x40000001); HuAudFXPlay(870); SetLotteryDrawWheelState(0); break; } } case 3: if(work->timer < work->hilite_vel) { work->timer++; } else { BoardModelHookObjReset(wheelMdl, hiliteObjNameTbl[work->hilite]); work->hilite = (work->hilite+1) & 0x3; HuAudFXPlay(855); BoardModelHookSet(wheelMdl, hiliteObjNameTbl[work->hilite], mdl->center); work->timer = 0; } break; case 1: case 2: if(work->timer != 0) { object->trans.x += object->rot.x; object->trans.z += object->rot.z; work->timer--; } else { BoardModelMotionSpeedSet(wheelMdl, 0); work->state = 0; } break; case 0: break; default: break; } BoardModelPosSet(wheelMdl, object->trans.x, object->trans.y, object->trans.z); } static void SetLotteryDrawWheelState(s32 state) { DrawWheelWork *work; DrawWheelMdl *mdl; Vec pos_wheel, pos_space, dist; if(!lotteryDrawWheelObj) { return; } work = OM_GET_WORK_PTR(lotteryDrawWheelObj, DrawWheelWork); work->state = state; mdl = work->mdl; switch(state) { case 5: work->kill = 1; break; case 3: work->timer = 0; work->hilite = 0; work->hilite_vel = 2; BoardModelVisibilitySet(mdl->center, 1); BoardModelMotionStart(mdl->center, 0, 0); BoardModelMotionSpeedSet(mdl->center, 0.0f); BoardModelMotionTimeSet(mdl->center, 3.0f); BoardModelHookSet(wheelMdl, hiliteObjNameTbl[work->hilite], mdl->center); break; default: if(state == 2 || state == 1) { BoardModelPosGet(wheelMdl, &pos_wheel); if(state == 2) { pos_space = spacePos; } else { pos_space.x = -300.0f+pos_wheel.x; pos_space.y = pos_wheel.y; pos_space.z = -50.0f+pos_wheel.z; } VECSubtract(&pos_space, &pos_wheel, &dist); lotteryDrawWheelObj->rot.x = dist.x/26.0f; lotteryDrawWheelObj->rot.z = dist.z/26.0f; BoardModelMotionStart(wheelMdl, 0, 0x40000001); BoardModelMotionSpeedSet(wheelMdl, 3.0f); work->timer = 26; } break; } } static s32 GetLotteryDrawWheelState() { DrawWheelWork *work; if(!lotteryDrawWheelObj) { return -1; } work = OM_GET_WORK_PTR(lotteryDrawWheelObj, DrawWheelWork); return work->state; } static s32 GetLotteryDrawWheelResult() { DrawWheelWork *work; if(!lotteryDrawWheelObj) { return -1; } work = OM_GET_WORK_PTR(lotteryDrawWheelObj, DrawWheelWork); return GWPlayer[work->hilite].character; } static void ExecLotteryDraw(void) { s32 ticket; s32 valid; s32 character; s32 stream; s32 player; Vec rot; Vec offset; Vec confetti_pos; Vec pos; Vec star_pos; Vec host_end; Vec host_start; Vec player_end; Vec player_start; if(GWPlayer[0].draw_ticket || GWPlayer[1].draw_ticket || GWPlayer[2].draw_ticket || GWPlayer[3].draw_ticket) { BoardWinCreate(2, messBase+1, BoardWinPortraitGetStar()); BoardWinWait(); BoardModelPosGet(hostMdl, &host_end); 250.0f+host_end.y; CreateLotteryDraw(&host_end); SetLotteryDrawState(2); SetLotteryDrawWheelState(2); for(ticket=0; ticket<4; ticket++) { SetLotteryTicketState(ticket, 3); } HuPrcSleep(15); while(GetLotteryDrawWheelState() != 0) { HuPrcVSleep(); } offset.x = 50.0f; offset.z = 0.0f; offset.y = 100.0f; valid = 0; for(currTicket=ticket=0; ticket<3; ticket++, currTicket++) { BoardCameraBackup(); SetLotteryDrawWheelState(3); BoardWinCreate(2, 2+messBase+ticket, BoardWinPortraitGetStar()); BoardWinWait(); BoardModelMotionShiftSet(hostMdl, hostMot[7], 0, 8, 0); HuPrcSleep(8); while(BoardModelMotionTimeGet(hostMdl) < 26.0f) { HuPrcVSleep(); } SetLotteryDrawState(1); HuPrcSleep(BoardRandMod(20)); SetLotteryDrawWheelState(4); BoardCameraMotionStartEx(wheelMdl, NULL, &offset, 700, -1, 21); while(!BoardModelMotionEndCheck(hostMdl)) { HuPrcVSleep(); } BoardModelMotionShiftSet(hostMdl, 1, 0, 8, 0x40000001); while(GetLotteryDrawWheelState() != 0) { HuPrcVSleep(); } character = GetLotteryDrawWheelResult(); UpdateLotteryTicketMatch(ticket, character); HuPrcSleep(120); if(CheckLotteryTicket()) { valid = 1; break; } if(ticket == 2) { player = GetLotteryTicketPlayer(); BoardModelPosGet(hostMdl, &confetti_pos); confetti_pos.y += 400.0f; BoardConfettiCreate(&confetti_pos, 100, 200.0f); break; } BoardCameraRestore(); BoardCameraMotionWait(); } rot.x = -10.0f; rot.y = 0.0f; rot.z = 0.0f; BoardCameraMotionStartEx(focusMdl, &rot, NULL, 1480.0f, 25.0f, 20); if(valid) { BoardWinCreate(2, 9+messBase, BoardWinPortraitGetStar()); BoardWinWait(); SetLotteryDrawState(3); SetLotteryDrawWheelState(1); for(ticket=0; ticket<4; ticket++) { SetLotteryTicketState(ticket, 4); } } else { BoardAudSeqPause(1, 1, 1000); BoardModelMotionShiftSet(hostMdl, hostMot[3], 0, 8, 0x40000001); stream = HuAudSStreamPlay(10); while(HuAudSStreamStatGet(stream)) { HuPrcVSleep(); } BoardAudSeqPause(1, 0, 1000); BoardWinCreate(2, 5+messBase, BoardWinPortraitGetStar()); BoardWinWait(); BoardCameraRestore(); BoardCameraMotionWait(); SetLotteryDrawState(3); SetLotteryDrawWheelState(1); for(ticket=0; ticket<4; ticket++) { SetLotteryTicketState(ticket, 4); } player_end.x = spacePos.x + -300.0f; player_end.y = spacePos.y; player_end.z = spacePos.z + -50.0f; BoardPlayerPosSetV(player, &player_end); BoardModelVisibilitySet(BoardPlayerModelGet(player), 1); BoardModelPosGet(hostMdl, &host_end); player_start = host_end; host_start.x = host_end.x+200.0f; host_start.y = host_end.y; host_start.z = host_end.z; StartHostMove(&host_end, &host_start, 25); BoardPlayerPosLerpStart(player, &player_end, &player_start, 25); while(GWPlayer[player].moving) { HuPrcVSleep(); } BoardPlayerIdleSet(player); BoardModelMotionShiftSet(hostMdl, hostMot[0], 0, 8, 0x40000001); while(!CheckHostMove()) { HuPrcVSleep(); } BoardModelMotionShiftSet(hostMdl, 1, 0, 8, 0x40000001); BoardStatusShowSetForce(player); BoardStatusShowSet(player, 1); BoardPlayerMotBlendSet(player, 0, 7); while(!BoardPlayerMotBlendCheck(player)) { HuPrcVSleep(); } BoardWinCreate(2, 6+messBase, BoardWinPortraitGetStar()); BoardWinWait(); BoardAudSeqPause(1, 1, 1000); BoardModelMotionShiftSet(hostMdl, hostMot[1], 0, 8, 0); star_pos.x = host_start.x; star_pos.y = 60.0f+host_start.y; star_pos.z = host_start.z; HuPrcSleep(30); BoardStarGive(player, &star_pos); BoardAudSeqPause(1, 0, 1000); BoardStatusShowSet(player, 0); StartHostMove(&host_start, &host_end, 25); BoardPlayerPosLerpStart(player, &player_start, &player_end, 25); BoardModelMotionShiftSet(hostMdl, hostMot[0], 0, 8, 0x40000001); while(!CheckHostMove()) { HuPrcVSleep(); } BoardModelMotionShiftSet(hostMdl, 1, 0, 8, 0x40000001); while(GWPlayer[player].moving) { HuPrcVSleep(); } BoardPlayerIdleSet(player); BoardModelVisibilitySet(BoardPlayerModelGet(player), 0); BoardConfettiStop(); BoardModelVisibilitySet(wheelMdl, 0); } SetLotteryDrawState(4); BoardWinCreate(2, 7+messBase, BoardWinPortraitGetStar()); BoardWinWait(); BoardWinKill(); } } static void KillLotteryTicket(void) { s32 i; for(i=0; ikill = 0; work->player = i; work->index = numTickets; work->angle = 0; work->unk02 = 0; work->done = 0; work->group = HuSprGrpCreate(6); object->trans.x = 680.0f; object->trans.y = 64.0f+(82.0f*numTickets); object->rot.x = 0.0f; object->rot.y = 0.0f; HuSprGrpPosSet(work->group, object->trans.x, object->trans.y); HuSprGrpScaleSet(work->group, 0.4f, 0.4f); BoardSpriteCreate(DATA_MAKE_NUM(DATADIR_BLAST5, 9), 2000, NULL, &sprite); HuSprGrpMemberSet(work->group, 0, sprite); HuSprAttrSet(work->group, 0, HUSPR_ATTR_LINEAR); HuSprScaleSet(work->group, 0, 2.5f, 2.5f); character = GWPlayer[i].character; BoardSpriteCreate(ownerSprTbl[character], 1200, NULL, &sprite); HuSprGrpMemberSet(work->group, 5, sprite); HuSprAttrSet(work->group, 5, HUSPR_ATTR_LINEAR); HuSprScaleSet(work->group, 5, 2.5f, 2.5f); HuSprPosSet(work->group, 5, -200, -32); HuSprScaleSet(work->group, 5, 1.75f, 1.75f); BoardSpriteCreate(DATA_MAKE_NUM(DATADIR_BLAST5, 8), 1200, NULL, &sprite); HuSprGrpMemberSet(work->group, 4, sprite); HuSprAttrSet(work->group, 4, HUSPR_ATTR_LINEAR); HuSprAttrSet(work->group, 4, HUSPR_ATTR_DISPOFF); HuSprAttrSet(work->group, 4, HUSPR_ATTR_ADDCOL); HuSprScaleSet(work->group, 4, 1.3f, 1.3f); ticket_player = GWPlayer[i].ticket_player; j=3; while(j>=0) { s32 player_spr; j--; work->character[j] = GWPlayer[ticket_player & 0x3].character; player_spr = playerSprTbl[work->character[j]]; member = j+1; BoardSpriteCreate(player_spr, 1500, NULL, &sprite); HuSprGrpMemberSet(work->group, member, sprite); HuSprAttrSet(work->group, member, HUSPR_ATTR_LINEAR); HuSprPosSet(work->group, member, playerOfsTbl[j][0], playerOfsTbl[j][1]); ticket_player >>= 2; } numTickets++; } } static void UpdateLotteryTicket(omObjData *object) { TicketWork *work = OM_GET_WORK_PTR(object, TicketWork); if(work->kill || BoardIsKill()) { HuSprGrpKill(work->group); omDelObjEx(HuPrcCurrentGet(), object); lotteryTicketObj[work->index] = NULL; return; } switch(work->state) { case 2: if(work->angle < 540) { float scale = 0.4f+(0.1f*sin(M_PI*(float)(work->angle%180)/180.0)); HuSprGrpScaleSet(work->group, scale, scale); work->angle += 9; } else { work->angle = 0; work->state = 0; HuSprGrpScaleSet(work->group, 0.4f, 0.4f); } break; case 1: if(work->angle > 96) { u16 color = work->angle; HuSprColorSet(work->group, 0, color, color, color); HuSprColorSet(work->group, 1, color, color, color); HuSprColorSet(work->group, 2, color, color, color); HuSprColorSet(work->group, 3, color, color, color); HuSprColorSet(work->group, 5, color, color, color); work->angle -= 3; } else { work->angle = 0; work->state = 0; } break; case 3: case 4: if(work->angle != 0) { object->trans.x += object->rot.x; HuSprGrpPosSet(work->group, object->trans.x, object->trans.y); work->angle--; } else { if(work->state == 4) { BoardModelVisibilitySet(wheelMdl, 0); } SetLotteryTicketState(work->player, 0); } break; case 0: break; default: break; } } static void SetLotteryTicketState(s32 player, s32 state) { TicketWork *work; omObjData *object; s32 i; for(i=0; iplayer == player) { work->state = state; work->angle = 0; switch(state) { case 2: HuSprAttrReset(work->group, 4, HUSPR_ATTR_DISPOFF); HuSprPosSet(work->group, 4, playerOfsTbl[currTicket][0], playerOfsTbl[currTicket][1]); break; case 1: work->angle = 255; work->done = 1; HuSprAttrSet(work->group, 4, HUSPR_ATTR_DISPOFF); break; case 3: object->rot.x = 472.0f-object->trans.x; object->rot.x /= 15.0f; work->angle = 15; break; case 4: object->rot.x = 680.0f-object->trans.x; object->rot.x /= 15.0f; work->angle = 15; break; case 5: work->kill = 1; default: break; } return; } } } static s32 GetLotteryTicketPlayer(void) { s32 i; for(i=0; idone) { return work->player; } } return -1; } static s32 CheckLotteryTicket(void) { TicketWork *work; omObjData *object; s32 i; for(i=0; idone) { return 0; } } return 1; } static void UpdateLotteryTicketMatch(s32 progress, s32 character) { s32 i; TicketWork *work; omObjData *object; s32 match_state; for(i=0; idone) { if(work->character[progress] == character) { match_state = 2; } else { match_state = 1; } SetLotteryTicketState(work->player, match_state); } } } typedef struct host_move_work { struct { u8 kill : 1; u8 finish : 1; }; u8 state; s16 time; s16 angle; s16 angle_end; } HostMoveWork; static void StartHostMove(Vec *from, Vec *to, s16 time) { HostMoveWork *work; omObjData *object; float duration; float angle; if(time <= 0) { time = 1; } object = omAddObjEx(boardObjMan, 257, 0, 0, -1, ExecHostMove); hostMoveObj = object; work = OM_GET_WORK_PTR(object, HostMoveWork); work->kill = 0; work->finish = 0; work->time = time; work->state = 0; OSs16tof32(&time, &duration); omSetTra(object, from->x, from->y, from->z); omSetRot(object, (to->x-from->x)/duration, 0.0f, (to->z-from->z)/duration); omSetSca(object, to->x, to->y, to->z); angle = 180.0*(atan2(object->rot.x, object->rot.z)/M_PI); work->angle = 0; OSf32tos16(&angle, &work->angle_end); BoardModelMotionShiftSet(hostMdl, hostMot[0], 0, 8, 0x40000001); BoardModelMotionSpeedSet(hostMdl, 3.0f); } static void ExecHostMove(omObjData *object) { HostMoveWork *work = OM_GET_WORK_PTR(object, HostMoveWork); float angle; float angle_end; if(work->kill || BoardIsKill()) { hostMoveObj = NULL; omDelObjEx(HuPrcCurrentGet(), object); return; } OSs16tof32(&work->angle, &angle); OSs16tof32(&work->angle_end, &angle_end); switch(work->state) { case 0: if(BoardDAngleCalcRange(&angle, angle_end, 10.0f)) { if(work->finish) { work->kill = 1; } else { work->state = 1; } BoardModelMotionSpeedSet(hostMdl, 1.0f); } OSf32tos16(&angle, &work->angle); BoardModelRotYSet(hostMdl, angle); break; case 1: if(work->time) { work->time--; object->trans.x += object->rot.x; object->trans.y += object->rot.y; object->trans.z += object->rot.z; } else { object->trans.x = object->scale.x; object->trans.y = object->scale.y; object->trans.z = object->scale.z; work->angle_end = 0; work->finish = 1; work->state = 0; BoardModelMotionSpeedSet(hostMdl, 3.0f); } break; default: break; } BoardModelPosSet(hostMdl, object->trans.x, object->trans.y, object->trans.z); } static s32 CheckHostMove(void) { if(hostMoveObj) { return 0; } else { return 1; } } static void CreateStopWin(void) { s32 mess = MAKE_MESSID(0x12, 0x11); float size[2]; float pos_x, pos_y; HuWinMesMaxSizeGet(1, size, mess); pos_x = -10000; pos_y = 352; stopWin = HuWinCreate(pos_x, pos_y, size[0], size[1], 0); HuWinBGTPLvlSet(stopWin, 0.0f); HuWinMesSpeedSet(stopWin, 0); HuWinMesSet(stopWin, mess); } typedef struct last5_roulette_work { struct { u8 kill : 1; u8 state : 3; }; s8 choice; s8 fade_speed; s8 choices[4]; s16 alpha; u16 switch_timer; u8 switch_vel; u8 switch_accel; s16 model; } Last5RouletteWork; static void CreateLast5Roulette(void) { Last5RouletteWork *work; omObjData *object; s32 choice1, choice2; Vec pos; object = omAddObjEx(boardObjMan, 257, 0, 0, -1, UpdateLast5Roulette); last5RouletteObj = object; work = OM_GET_WORK_PTR(object, Last5RouletteWork); work->kill = 0; work->choice = 0; work->switch_timer = 0; work->switch_vel = 4; work->state = 2; work->alpha = 0; work->fade_speed = 0; work->switch_accel = 5; choice1 = BoardRandMod(3)+2; do { choice2 = BoardRandMod(3)+2; } while(choice1 == choice2); work->choices[0] = 1; work->choices[1] = 1; work->choices[2] = choice1; work->choices[3] = choice2; work->model = BoardModelCreate(DATA_MAKE_NUM(DATADIR_BLAST5, 10), NULL, 0); pos.x = 150.0f+spacePos.x; pos.y = 177.0f+spacePos.y; pos.z = -135.0f+spacePos.z; BoardModelPosSetV(work->model, &pos); BoardModelMotionStart(work->model, 0, 0); BoardModelMotionSpeedSet(work->model, 0); } static void UpdateLast5Roulette(omObjData *object) { Last5RouletteWork *work = OM_GET_WORK_PTR(object, Last5RouletteWork); if(work->kill || BoardIsKill()) { BoardModelHookReset(wheelMdl); if(work->model != -1) { BoardModelKill(work->model); } last5RouletteObj = NULL; omDelObjEx(HuPrcCurrentGet(), object); return; } switch(work->state) { case 3: if(work->switch_timer == 0) { work->switch_vel += work->switch_accel; work->switch_accel++; if(work->switch_vel > 60 || (work->switch_vel > 40 && BoardRandMod(100) > 80)) { if((GWBoardGet() == BOARD_ID_MAIN1 || GWBoardGet() == BOARD_ID_MAIN3) && work->choices[work->choice] == 2) { work->switch_timer++; return; } else { HuAudFXPlay(870); SetLast5RouletteState(0); break; } } } case 2: if(work->switch_timer < work->switch_vel) { work->switch_timer++; } else { s32 choice = work->choices[work->choice]; float time; do { work->choice = BoardRandMod(4); } while(work->choices[work->choice] == choice); OSs8tof32(&work->choices[work->choice], &time); HuAudFXPlay(855); BoardModelMotionTimeSet(work->model, 0.1f+time); work->switch_timer = 0; } break; case 0: break; default: break; } if(work->fade_speed) { work->alpha += work->fade_speed; if(work->alpha >= 255) { work->alpha = 255; work->fade_speed = 0; } if(work->alpha < 0) { work->alpha = 0; work->fade_speed = 0; } BoardModelAlphaSet(work->model, work->alpha); } } static void SetLast5RouletteFade(s32 flag) { Last5RouletteWork *work; if(!last5RouletteObj) { return; } work = OM_GET_WORK_PTR(last5RouletteObj, Last5RouletteWork); if(flag) { work->fade_speed = 4; } else { work->fade_speed = -4; } } static void SetLast5RouletteState(s32 state) { Last5RouletteWork *work; if(!last5RouletteObj) { return; } work = OM_GET_WORK_PTR(last5RouletteObj, Last5RouletteWork); work->state = state; } static s32 GetLast5RouletteState(void) { Last5RouletteWork *work; if(!last5RouletteObj) { return -1; } work = OM_GET_WORK_PTR(last5RouletteObj, Last5RouletteWork); return work->state; } static s32 GetLast5RouletteResult(void) { Last5RouletteWork *work; if(!last5RouletteObj) { return -1; } work = OM_GET_WORK_PTR(last5RouletteObj, Last5RouletteWork); return work->choices[work->choice]; } typedef struct team_result_work { struct { u8 kill : 1; }; u8 delay; u8 player[2][2]; s16 group[2]; } TeamResultWork; static void CreateTeamResultWork(TeamResultWork *work); static void CreateTeamResult(void) { TeamResultWork *work; omObjData *object; s32 i; s32 j; s32 coins[2]; s32 stars[2]; u32 score[2]; s32 team, player; s32 rank1, rank2; object = omAddObjEx(boardObjMan, 268, 0, 0, -1, UpdateTeamResult); teamResultObj = object; work = OM_GET_WORK_PTR(object, TeamResultWork); CreateTeamResultWork(work); coins[0] = coins[1] = stars[0] = stars[1] = 0; for(i=0; i<2; i++) { for(j=0; j<2; j++) { coins[i] += BoardPlayerCoinsGet(work->player[i][j]); stars[i] += GWStarsGet(work->player[i][j]); } } for(i=0; i<2; i++) { score[i] = coins[i]+(stars[i] << 11); } team = BoardRandMod(2); player = BoardRandMod(2); if(score[0] >= score[1]) { object->trans.x = -108.0f; object->trans.y = 152.0f; object->rot.x = -108.0f; object->rot.y = 302.0f; if(score[0] == score[1]) { last5Player = work->player[team][player]; } else { rank1 = GWPlayer[work->player[1][0]].rank; rank2 = GWPlayer[work->player[1][1]].rank; if(rank1 == rank2) { last5Player = work->player[1][player]; } else { if(rank1 < rank2) { last5Player = work->player[1][1]; } else { last5Player = work->player[1][0]; } } } } else { object->rot.x = -108.0f; object->rot.y = 152.0f; object->trans.x = -108.0f; object->trans.y = 302.0f; rank1 = GWPlayer[work->player[0][0]].rank; rank2 = GWPlayer[work->player[0][1]].rank; if(rank1 == rank2) { last5Player = work->player[0][player]; } else { if(rank1 < rank2) { last5Player = work->player[0][1]; } else { last5Player = work->player[0][0]; } } } } static void CreateTeamResultWork(TeamResultWork *work) { GXColor color = { 128, 128, 128, 0 }; s32 i; s32 character; s16 group; s32 j; s32 team1_idx, team2_idx; s16 sprite; s32 spr_file; s16 prio; float x, y; for(team1_idx=team2_idx=i=0; i<4; i++) { s32 team = GWPlayer[i].team; if(team == 0) { work->player[0][team1_idx] = i; team1_idx++; } else { work->player[1][team2_idx] = i; team2_idx++; } } for(j=0; j<2; j++) { group = HuSprGrpCreate(15); work->group[j] = group; for(i=0; i<13; i++) { spr_file = teamSprTbl[i]; prio = teamSprPrioTbl[i]; BoardSpriteCreate(spr_file, prio, NULL, &sprite); HuSprGrpMemberSet(group, i, sprite); HuSprAttrSet(group, i, HUSPR_ATTR_NOANIM); HuSprAttrSet(group, i, HUSPR_ATTR_LINEAR); HuSprPosSet(group, i, teamSprPosTbl[i][0], teamSprPosTbl[i][1]); } HuSprTPLvlSet(group, 0, 0.7f); HuSprScaleSet(group, 0, 1.0f, 2.5f); HuSprColorSet(group, 0, color.r, color.g, color.b); if(!GWPlayer[work->player[j][0]].com) { HuSprAttrSet(group, 11, HUSPR_ATTR_DISPOFF); } if(!GWPlayer[work->player[j][1]].com) { HuSprAttrSet(group, 12, HUSPR_ATTR_DISPOFF); } if(j == 0) { HuSprBankSet(group, 1, 2); } else { HuSprBankSet(group, 1, 1); } for(i=0; i<2; i++) { character = GWPlayer[work->player[j][i]].character; BoardSpriteCreate(teamCharSprTbl[character], 1500, NULL, &sprite); HuSprGrpMemberSet(group, i+13, sprite); HuSprAttrSet(group, i+13, HUSPR_ATTR_LINEAR); x = teamSprPosTbl[i+13][0]; y = teamSprPosTbl[i+13][1]; HuSprPosSet(group, i+13, x, y); } } } static void SetTeamResultTarget(s32 team, Vec *pos) { if(!teamResultObj || !pos) { return; } if(team) { teamResultObj->rot.x = pos->x; teamResultObj->rot.y = pos->y; } else { teamResultObj->trans.x = pos->x; teamResultObj->trans.y = pos->y; } } static void GetTeamResultTarget(s32 team, Vec *pos) { if(!teamResultObj || !pos) { return; } if(team) { pos->x = teamResultObj->rot.x; pos->y = teamResultObj->rot.y; } else { pos->x = teamResultObj->trans.x; pos->y = teamResultObj->trans.y; } } static void KillTeamResult(void) { TeamResultWork *work; if(!teamResultObj) { return; } work = OM_GET_WORK_PTR(teamResultObj, TeamResultWork); work->kill = 1; } static void UpdateTeamResult(omObjData *object) { TeamResultWork *work; s32 i, j; work = OM_GET_WORK_PTR(object, TeamResultWork); if(work->kill || BoardIsKill()) { HuSprGrpKill(work->group[0]); HuSprGrpKill(work->group[1]); teamResultObj = NULL; omDelObjEx(HuPrcCurrentGet(), object); return; } if(work->delay) { work->delay--; return; } { s8 rank[2]; u32 score[2]; s32 coins[2]; s32 stars[2]; coins[0] = coins[1] = stars[0] = stars[1] = 0; for(i=0; i<2; i++) { for(j=0; j<2; j++) { coins[i] += BoardPlayerCoinsGet(work->player[i][j]); stars[i] += GWStarsGet(work->player[i][j]); } } for(i=0; i<2; i++) { s32 star_val; s32 coin_val; score[i] = coins[i]+(stars[i] << 11); coin_val = coins[i]; if(coin_val > 999) { coin_val = 999; } star_val = stars[i]; if(star_val > 999) { star_val = 999; } BoardSpriteDigitUpdate(work->group[i], 3, coin_val); BoardSpriteDigitUpdate(work->group[i], 7, star_val); } if(score[0] == score[1]) { rank[0] = rank[1] = 0; } else if(score[0] > score[1]) { rank[0] = 0; rank[1] = 1; } else { rank[1] = 0; rank[0] = 1; } HuSprBankSet(work->group[0], 2, rank[0]); HuSprBankSet(work->group[1], 2, rank[1]); HuSprGrpPosSet(work->group[0], object->trans.x, object->trans.y); HuSprGrpPosSet(work->group[1], object->rot.x, object->rot.y); } }