marioparty4/src/game/board/lottery.c
2024-03-31 17:59:41 -07:00

2066 lines
61 KiB
C
Executable file

#include "game/board/lottery.h"
#include "game/audio.h"
#include "game/chrman.h"
#include "game/data.h"
#include "game/esprite.h"
#include "game/gamework_data.h"
#include "game/hsfdraw.h"
#include "game/hsfex.h"
#include "game/hsfman.h"
#include "game/objsub.h"
#include "game/pad.h"
#include "game/process.h"
#include "game/sprite.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 "math.h"
void HuSprGrpDrawNoSet(s16 group, s32 draw_no);
#define ABS(x) (((x) < 0) ? -(x) : (x))
typedef struct {
struct {
u8 unk00_field0 : 1;
s8 unk00_field1 : 1;
u8 unk00_field2 : 4;
};
u8 unk01;
s16 unk02;
s16 unk04;
char unk06[2];
AnimData *unk08;
} TicketWork;
typedef struct {
struct {
u8 unk00_field0 : 1;
};
s8 unk01;
s8 unk02;
s8 unk03;
u8 unk04;
char unk05[1];
s16 unk06;
s16 unk08;
} LotteryTicketPickWork;
static void CreateModel(void);
static void KillModel(void);
static void DestroyLottery(void);
static void ExecLottery(void);
static void DoMiniJumpUp(s32 arg0);
static void DoMiniJumpDown(s32 arg0);
static void PayEnterFee(s32 arg0);
static void ShowTicket(void);
static void SetupTicket(s32 arg0);
static void ExecBallGame(void);
static void SetBallPrize(void);
static void ExecBallPrize(void);
static void ExecScratchTicket(s32 arg0);
static void ExecScratch(void);
static void KillScratch(void);
static void ExecScratchSpr(omObjData *arg0);
static void HideScratchSpr(void);
static void InitScratchSpr(void);
static void ExecScratchPick(omObjData *arg0);
static void InitScratchPick(void);
static void InitTicketPrizes(void);
static void ExecTicketFocus(s32 arg0);
static BOOL ScratchTicketCheckDone(AnimBmpData *arg0);
static u16 TicketGetPixel(u16 arg0, u16 arg1, u16 arg2);
static s32 TicketUpdate(AnimBmpData *arg0, Vec *arg1, s32 arg2);
static void ExecCoinPrize(void);
static void ExecItemPrize(void);
static void KillCoin(void);
static void ExecPrize(void);
static void ExecLose(s32 arg0);
static void CreateLotteryWin(s32 arg0);
static void KillLotteryWin(void);
static s16 lotteryMdl[6];
static s8 coinF[12];
static s16 coinMdl[10];
static s32 lotteryMessBase;
static s16 lotterySpace;
static s8 currPrize;
s8 lbl_801D401B;
static s8 comLotteryType;
static s8 comLotteryWinType;
static u8 comInputPos;
static s32 handUpdateF;
static omObjData *lotteryTicketPickObj;
static s8 (*comInputDrawP)[2];
static Process *lotteryProc;
static s16 hostMdl = -1;
static s16 lotteryMot[4] = { -1, -1, -1, -1 };
static s16 lotterySpr = -1;
static s16 lotteryInstWin = -1;
static s16 gripMdl[2] = { 0, 0 };
static s16 turnMot = -1;
static s16 ballMdl[4] = { -1, -1, -1, -1 };
static s16 loseMot = -1;
static s16 ticketSprGrp = -1;
static s8 comInputDraw1[][2] = {
{ 0x0B, 0xF8 }, { 0x2B, 0xDD }, { 0x2A, 0xDC }, { 0x2B, 0xDC },
{ 0x2B, 0xDC }, { 0x29, 0xDB }, { 0x24, 0xD6 }, { 0x02, 0xE8 },
{ 0x00, 0x00 }, { 0xFC, 0x02 }, { 0xD8, 0x27 }, { 0xD8, 0x28 },
{ 0xD8, 0x28 }, { 0xD8, 0x27 }, { 0xDA, 0x29 }, { 0xDE, 0x2C },
{ 0xE4, 0x31 }, { 0xF0, 0x3A }, { 0x00, 0x3C }, { 0x06, 0x3A },
{ 0x1B, 0x32 }, { 0x23, 0x2B }, { 0x24, 0x2A }, { 0x25, 0x29 },
{ 0x26, 0x29 }, { 0x28, 0x27 }, { 0x28, 0x27 }, { 0x28, 0x26 },
{ 0x28, 0x26 }, { 0x2E, 0x20 }, { 0x39, 0x11 }, { 0x48, 0x00 },
{ 0x48, 0x00 }, { 0x35, 0xEA }, { 0x29, 0xDB }, { 0x24, 0xD5 },
{ 0x17, 0xCB }, { 0x00, 0xB8 }, { 0x00, 0xB8 }, { 0x00, 0xB8 },
{ 0x00, 0xB8 }, { 0x00, 0xB8 }, { 0xEB, 0xCA }, { 0xD6, 0xDB },
{ 0xD6, 0xDB }, { 0xD4, 0xDE }, { 0xD1, 0xE2 }, { 0xC4, 0xF2 },
{ 0xB8, 0x00 }, { 0xB8, 0x00 }, { 0xB8, 0x00 }, { 0xB8, 0x00 },
{ 0xB8, 0x00 }, { 0xB8, 0x00 }, { 0xB8, 0x00 }, { 0xC1, 0x0B },
{ 0xC6, 0x10 }, { 0xC9, 0x14 }, { 0xCB, 0x16 }, { 0xCB, 0x17 },
{ 0xCE, 0x1A }, { 0xD1, 0x1E }, { 0xD5, 0x23 }, { 0xD4, 0x22 },
{ 0xDB, 0x29 }, { 0xF5, 0x3E }, { 0x00, 0x48 }, { 0x00, 0x42 },
{ 0x0D, 0x3D }, { 0x24, 0x2A }, { 0x29, 0x26 }, { 0x29, 0x26 },
{ 0x29, 0x25 }, { 0x2D, 0x21 }, { 0x34, 0x18 }, { 0x40, 0x09 },
{ 0x48, 0x00 }, { 0x48, 0x00 }, { 0x43, 0xFA }, { 0x33, 0xE6 },
{ 0x29, 0xDB }, { 0x1B, 0xCF }, { 0x05, 0xBD }, { 0x00, 0xB8 },
{ 0x00, 0xB8 }, { 0x00, 0xB8 }, { 0xFB, 0xBD }, { 0xDD, 0xD5 },
{ 0xD6, 0xDC }, { 0xD6, 0xDC }, { 0xD4, 0xDE }, { 0xCB, 0xE9 },
{ 0xB8, 0x00 }, { 0xB8, 0x00 }, { 0xB8, 0x00 }, { 0xC5, 0x0F },
{ 0xD0, 0x1D }, { 0xD5, 0x23 }, { 0xDC, 0x2A }, { 0xF0, 0x3B },
{ 0x00, 0x3D }, { 0x08, 0x3F }, { 0x15, 0x36 }, { 0x24, 0x2A },
{ 0x29, 0x26 }, { 0x2A, 0x24 }, { 0x30, 0x1C }, { 0x3B, 0x0F },
{ 0x48, 0x00 }, { 0x48, 0x00 }, { 0x3E, 0xF4 }, { 0x2D, 0xE0 },
{ 0x22, 0xD4 }, { 0x02, 0xBB }, { 0x00, 0xB8 }, { 0xFB, 0xBD },
{ 0xD9, 0xD8 }, { 0xD4, 0xDE }, { 0x7F, 0x7F }
};
static s8 comInputDraw2[][2] = {
{ 0x07, 0x00 }, { 0x1F, 0x00 }, { 0x3A, 0x00 }, { 0x48, 0x00 },
{ 0x48, 0x00 }, { 0x48, 0x00 }, { 0x48, 0x00 }, { 0x48, 0x00 },
{ 0x43, 0xFA }, { 0x35, 0xEA }, { 0x2A, 0xDB }, { 0x1A, 0xCE },
{ 0x00, 0xB9 }, { 0x00, 0xB8 }, { 0x00, 0xB8 }, { 0x00, 0xB8 },
{ 0x00, 0xBA }, { 0xE9, 0xCC }, { 0xD5, 0xDD }, { 0xD4, 0xDE },
{ 0xD4, 0xDE }, { 0xD0, 0xE3 }, { 0xBD, 0xFB }, { 0xB8, 0x00 },
{ 0xB8, 0x00 }, { 0xB8, 0x00 }, { 0xB8, 0x00 }, { 0xB8, 0x00 },
{ 0xB8, 0x00 }, { 0xB8, 0x00 }, { 0xBC, 0x03 }, { 0xC2, 0x0C },
{ 0xCB, 0x17 }, { 0xD5, 0x23 }, { 0xD8, 0x27 }, { 0xF0, 0x3A },
{ 0x00, 0x43 }, { 0x18, 0x34 }, { 0x29, 0x26 }, { 0x29, 0x26 },
{ 0x29, 0x26 }, { 0x29, 0x25 }, { 0x29, 0x26 }, { 0x29, 0x25 },
{ 0x29, 0x25 }, { 0x2C, 0x22 }, { 0x31, 0x1B }, { 0x39, 0x12 },
{ 0x47, 0x00 }, { 0x48, 0x00 }, { 0x48, 0x00 }, { 0x37, 0xEC },
{ 0x26, 0xD7 }, { 0x00, 0xB8 }, { 0x00, 0xB8 }, { 0x00, 0xB8 },
{ 0x00, 0xB8 }, { 0x00, 0xB8 }, { 0x00, 0xB8 }, { 0xFB, 0xBD },
{ 0xE5, 0xCE }, { 0xD6, 0xDC }, { 0xD6, 0xDC }, { 0xD6, 0xDC },
{ 0xD5, 0xDD }, { 0xD2, 0xE0 }, { 0xCC, 0xE8 }, { 0xC4, 0xF2 },
{ 0xBE, 0xFA }, { 0xB8, 0x00 }, { 0xB8, 0x00 }, { 0xB8, 0x00 },
{ 0xB8, 0x00 }, { 0xB8, 0x00 }, { 0xB8, 0x00 }, { 0xB8, 0x00 },
{ 0xB8, 0x00 }, { 0xB8, 0x00 }, { 0xB8, 0x00 }, { 0xB8, 0x00 },
{ 0xC7, 0x12 }, { 0xD8, 0x27 }, { 0xF6, 0x3E }, { 0x00, 0x47 },
{ 0x00, 0x44 }, { 0x05, 0x42 }, { 0x16, 0x35 }, { 0x28, 0x27 },
{ 0x29, 0x26 }, { 0x29, 0x26 }, { 0x29, 0x26 }, { 0x29, 0x26 },
{ 0x7F, 0x7F }
};
static s8 comInputBall[][2] = {
{ 0xE5, 0x00 }, { 0xC0, 0x03 }, { 0xBC, 0x04 }, { 0xBC, 0x03 },
{ 0xBF, 0x07 }, { 0xC3, 0x0C }, { 0xCB, 0x17 }, { 0xD5, 0x24 },
{ 0xDE, 0x2C }, { 0xF9, 0x3E }, { 0x00, 0x48 }, { 0x00, 0x45 },
{ 0x06, 0x40 }, { 0x21, 0x2C }, { 0x28, 0x27 }, { 0x28, 0x26 },
{ 0x29, 0x25 }, { 0x30, 0x1D }, { 0x43, 0x05 }, { 0x48, 0x00 },
{ 0x33, 0xE7 }, { 0x24, 0xD6 }, { 0x07, 0xBF }, { 0x00, 0xB8 },
{ 0x00, 0xB8 }, { 0xE4, 0xCF }, { 0xD4, 0xDE }, { 0xC6, 0xF0 },
{ 0xB8, 0x00 }, { 0xC7, 0x11 }, { 0xD2, 0x20 }, { 0xD5, 0x24 },
{ 0xD6, 0x25 }, { 0xD8, 0x27 }, { 0xE1, 0x2E }, { 0x00, 0x43 },
{ 0x00, 0x48 }, { 0x00, 0x44 }, { 0x1D, 0x30 }, { 0x28, 0x27 },
{ 0x28, 0x27 }, { 0x2C, 0x22 }, { 0x39, 0x12 }, { 0x48, 0x00 },
{ 0x34, 0xE8 }, { 0x23, 0xD5 }, { 0x0A, 0xC1 }, { 0x00, 0xB8 },
{ 0x00, 0xB8 }, { 0xF4, 0xC3 }, { 0xD4, 0xDE }, { 0xC3, 0xF4 },
{ 0xB8, 0x00 }, { 0xC6, 0x10 }, { 0xD3, 0x21 }, { 0xD6, 0x25 },
{ 0xD8, 0x27 }, { 0xDF, 0x2D }, { 0xEA, 0x36 }, { 0x00, 0x48 },
{ 0x00, 0x48 }, { 0x00, 0x48 }, { 0x17, 0x35 }, { 0x28, 0x27 },
{ 0x29, 0x25 }, { 0x33, 0x19 }, { 0x48, 0x00 }, { 0x48, 0x00 },
{ 0x34, 0xE8 }, { 0x23, 0xD5 }, { 0x00, 0xB9 }, { 0x00, 0xB8 },
{ 0x00, 0xB8 }, { 0xFA, 0xBE }, { 0xD4, 0xDE }, { 0xC8, 0xED },
{ 0xB8, 0x00 }, { 0xB8, 0x00 }, { 0xC0, 0x09 }, { 0xD0, 0x1C },
{ 0xD6, 0x24 }, { 0xDC, 0x2A }, { 0xED, 0x38 }, { 0x00, 0x48 },
{ 0x00, 0x48 }, { 0x00, 0x48 }, { 0x1B, 0x31 }, { 0x28, 0x27 },
{ 0x29, 0x26 }, { 0x2D, 0x21 }, { 0x3D, 0x0C }, { 0x48, 0x00 },
{ 0x33, 0xE7 }, { 0x20, 0xD3 }, { 0x00, 0xB8 }, { 0x00, 0xB8 },
{ 0x00, 0xBB }, { 0xDB, 0xD7 }, { 0xD4, 0xDE }, { 0xD3, 0xDF },
{ 0xBB, 0xFD }, { 0xB8, 0x00 }, { 0x7F, 0x7F }
};
void BoardLotteryHostSet(s16 arg0) {
hostMdl = arg0;
}
s16 BoardLotteryHostGet(void) {
return hostMdl;
}
void BoardLotteryExec(void) {
if (BoardPlayerSizeGet(GWSystem.player_curr) == 2) {
return;
}
BoardDiceDigit2DShowSet(0);
lotteryProc = HuPrcChildCreate(ExecLottery, 0x2003, 0x3800, 0, boardMainProc);
HuPrcDestructorSet2(lotteryProc, DestroyLottery);
while (lotteryProc) {
HuPrcVSleep();
}
BoardDiceDigit2DShowSet(1);
}
void BoardLotteryInit(void) {
Vec sp14;
Vec sp8;
s32 i;
for (i = 0; i < 5; i++) {
lotteryMdl[i] = -1;
}
for (i = 0; i < 4; i++) {
lotteryMot[i] = -1;
}
for (i = 0; i < 4; i++) {
ballMdl[i] = -1;
}
turnMot = -1;
loseMot = -1;
if (GWBoardGet() != 8) {
BoardModelVisibilitySet(BoardLotteryHostGet(), 0);
BoardSpaceLinkTransformGet(0x10000000, &sp14, &sp8, NULL);
lotteryMdl[0] = BoardModelCreate(DATA_MAKE_NUM(DATADIR_BKUJIYA, 0), NULL, 0);
BoardModelMotionStart(lotteryMdl[0], 0, 0);
BoardModelMotionSpeedSet(lotteryMdl[0], 0.0f);
BoardModelPosSetV(lotteryMdl[0], &sp14);
BoardModelRotSetV(lotteryMdl[0], &sp8);
HuDataDirClose(DATA_MAKE_NUM(DATADIR_BKUJIYA, 0));
}
}
static void CreateModel(void) {
s32 i;
s32 sp10[4] = {
DATA_MAKE_NUM(DATADIR_BKUJIYA, 5),
DATA_MAKE_NUM(DATADIR_BKUJIYA, 6),
DATA_MAKE_NUM(DATADIR_BKUJIYA, 7),
DATA_MAKE_NUM(DATADIR_BKUJIYA, 8)
};
s32 sp8[2] = {
DATA_MAKE_NUM(DATADIR_BKUJIYA, 3),
DATA_MAKE_NUM(DATADIR_BKUJIYA, 4)
};
s32 sp20[9][4] = {
{
DATA_MAKE_NUM(DATADIR_BGUEST, 1),
DATA_MAKE_NUM(DATADIR_BGUEST, 2),
DATA_MAKE_NUM(DATADIR_BGUEST, 3),
DATA_MAKE_NUM(DATADIR_BGUEST, 4)
},
{
DATA_MAKE_NUM(DATADIR_BGUEST, 9),
DATA_MAKE_NUM(DATADIR_BGUEST, 10),
DATA_MAKE_NUM(DATADIR_BGUEST, 11),
DATA_MAKE_NUM(DATADIR_BGUEST, 12)
},
{
DATA_MAKE_NUM(DATADIR_BGUEST, 14),
DATA_MAKE_NUM(DATADIR_BGUEST, 15),
DATA_MAKE_NUM(DATADIR_BGUEST, 16),
DATA_MAKE_NUM(DATADIR_BGUEST, 17)
},
{
DATA_MAKE_NUM(DATADIR_BGUEST, 24),
DATA_MAKE_NUM(DATADIR_BGUEST, 25),
DATA_MAKE_NUM(DATADIR_BGUEST, 26),
DATA_MAKE_NUM(DATADIR_BGUEST, 27)
},
{
DATA_MAKE_NUM(DATADIR_BGUEST, 29),
DATA_MAKE_NUM(DATADIR_BGUEST, 30),
DATA_MAKE_NUM(DATADIR_BGUEST, 31),
DATA_MAKE_NUM(DATADIR_BGUEST, 32)
},
{
DATA_MAKE_NUM(DATADIR_BGUEST, 34),
DATA_MAKE_NUM(DATADIR_BGUEST, 35),
DATA_MAKE_NUM(DATADIR_BGUEST, 36),
DATA_MAKE_NUM(DATADIR_BGUEST, 37)
},
{
DATA_MAKE_NUM(DATADIR_BGUEST, 14),
DATA_MAKE_NUM(DATADIR_BGUEST, 15),
DATA_MAKE_NUM(DATADIR_BGUEST, 16),
DATA_MAKE_NUM(DATADIR_BGUEST, 17)
},
{
DATA_MAKE_NUM(DATADIR_BGUEST, 42),
DATA_MAKE_NUM(DATADIR_BGUEST, 43),
DATA_MAKE_NUM(DATADIR_BGUEST, 44),
DATA_MAKE_NUM(DATADIR_BGUEST, 45)
},
{
DATA_MAKE_NUM(DATADIR_BGUEST, 42),
DATA_MAKE_NUM(DATADIR_BGUEST, 43),
DATA_MAKE_NUM(DATADIR_BGUEST, 44),
DATA_MAKE_NUM(DATADIR_BGUEST, 45)
}
};
lotteryMdl[1] = BoardModelCreate(DATA_MAKE_NUM(DATADIR_BKUJIYA, 1), NULL, 0);
fn_8006DDE8(lotteryMdl[1], -1.0f);
BoardModelMotionSpeedSet(lotteryMdl[1], 0.0f);
lotteryMdl[2] = BoardModelCreate(DATA_MAKE_NUM(DATADIR_BKUJIYA, 2), NULL, 0);
BoardModelVisibilitySet(lotteryMdl[2], 0);
fn_8006DDE8(lotteryMdl[2], -1.0f);
BoardModelMotionStart(lotteryMdl[2], 0, 0);
BoardModelMotionSpeedSet(lotteryMdl[2], 0.0f);
for (i = 0; i < 4; i++) {
ballMdl[i] = BoardModelCreate(sp10[i], NULL, 0);
BoardModelVisibilitySet(ballMdl[i], 0);
fn_8006DDE8(ballMdl[i], -1.0f);
}
for (i = 0; i < 2; i++) {
gripMdl[i] = BoardModelCreate(sp8[i], NULL, 0);
BoardModelVisibilitySet(gripMdl[i], 0);
fn_8006DDE8(gripMdl[i], -1.0f);
BoardModelMotionSpeedSet(gripMdl[i], 0.0f);
}
lotteryMdl[3] = BoardModelCreate(DATA_MAKE_NUM(DATADIR_BKUJIYA, 17), NULL, 0);
BoardModelVisibilitySet(lotteryMdl[3], 0);
fn_8006DDE8(lotteryMdl[3], -1.0f);
BoardModelPosSet(BoardLotteryHostGet(), 0.0f, 0.0f, 0.0f);
BoardModelVisibilitySet(BoardLotteryHostGet(), 1);
for (i = 0; i < 4; i++) {
lotteryMot[i] = BoardModelMotionCreate(BoardLotteryHostGet(), sp20[GWBoardGet()][i]);
}
BoardModelMotionStart(BoardLotteryHostGet(), lotteryMot[0], 0x40000001);
BoardModelHookSet(lotteryMdl[0], "toto_heyhoo", BoardLotteryHostGet());
BoardModelHookSet(lotteryMdl[0], "toto_gara", lotteryMdl[1]);
BoardModelHookSet(lotteryMdl[0], "toto_efe", lotteryMdl[2]);
BoardModelHookSet(lotteryMdl[0], "toto_chibidai", lotteryMdl[3]);
BoardModelHookSet(lotteryMdl[1], "toto_grip", gripMdl[0]);
BoardModelHookSet(lotteryMdl[1], "toto_grip1", gripMdl[1]);
}
static void KillModel(void) {
s32 i;
if (lotteryMdl[1] != -1) {
BoardModelHookReset(lotteryMdl[0]);
}
BoardModelMotionStart(BoardLotteryHostGet(), 1, 0x40000001);
if (turnMot != -1) {
BoardPlayerMotionKill(GWSystem.player_curr, turnMot);
turnMot = -1;
}
for (i = 0; i < 4; i++) {
if (lotteryMot[i] != -1) {
BoardModelMotionKill(BoardLotteryHostGet(), lotteryMot[i]);
lotteryMot[i] = -1;
}
}
for (i = 0; i < 4; i++) {
if (ballMdl[i] != -1) {
BoardModelKill(ballMdl[i]);
ballMdl[i] = -1;
}
}
for (i = 0; i < 2; i++) {
if (gripMdl[i] != -1) {
BoardModelKill(gripMdl[i]);
gripMdl[i] = -1;
}
}
for (i = 0; i < 5; i++) {
if (i != 0 && lotteryMdl[i] != -1) {
BoardModelKill(lotteryMdl[i]);
lotteryMdl[i] = -1;
}
}
BoardModelVisibilitySet(BoardLotteryHostGet(), 0);
}
void BoardLotteryKill(void) {
if (lotteryProc) {
HuPrcKill(lotteryProc);
}
if (lotteryMdl[0] != -1) {
BoardModelKill(lotteryMdl[0]);
lotteryMdl[0] = -1;
}
}
static void DestroyLottery(void) {
s32 i;
for (i = 0; i < 4; i++) {
if (i != GWSystem.player_curr) {
BoardPlayerMotBlendSet(i, 0, 7);
}
}
if (loseMot != -1) {
BoardPlayerMotionKill(GWSystem.player_curr, loseMot);
loseMot = -1;
}
KillLotteryWin();
BoardConfettiKill();
BoardWinKill();
KillScratch();
KillCoin();
HuDataDirClose(DATA_MAKE_NUM(DATADIR_BKUJIYA, 0));
lotteryProc = NULL;
}
static void ExecLottery(void) {
Vec sp38;
Vec sp2C;
Vec sp20;
Vec sp14;
Vec sp8;
s16 temp_r26;
s16 temp_r28;
u32 var_r25;
s32 var_r27;
s32 temp_r31;
s32 i;
s32 temp_r29;
switch (GWBoardGet()) {
case 0:
lotteryMessBase = MAKE_MESSID(6, 2);
break;
case 1:
lotteryMessBase = MAKE_MESSID(6, 15);
break;
case 2:
lotteryMessBase = MAKE_MESSID(6, 28);
break;
case 3:
lotteryMessBase = MAKE_MESSID(6, 41);
break;
case 4:
lotteryMessBase = MAKE_MESSID(6, 54);
break;
case 5:
lotteryMessBase = MAKE_MESSID(6, 67);
break;
case 6:
lotteryMessBase = MAKE_MESSID(6, 2);
break;
case 7:
lotteryMessBase = MAKE_MESSID(6, 82);
break;
case 8:
lotteryMessBase = MAKE_MESSID(6, 82);
break;
}
temp_r29 = BoardDataDirReadAsync(DATADIR_BKUJIYA);
temp_r31 = GWSystem.player_curr;
temp_r28 = GWPlayer[temp_r31].space_curr;
BoardPlayerIdleSet(temp_r31);
BoardWinCreateChoice(0, MAKE_MESSID(6, 0), -1, 0);
if (GWPlayer[temp_r31].com) {
if (BoardPlayerCoinsGet(temp_r31) >= 5) {
BoardComKeySetLeft();
} else {
BoardComKeySetRight();
}
}
BoardWinWait();
if (BoardWinChoiceGet() != 0) {
if (temp_r29 != -1) {
BoardDataAsyncWait(temp_r29);
}
HuPrcEnd();
}
if (BoardPlayerCoinsGet(temp_r31) < 5) {
BoardWinCreate(0, MAKE_MESSID(6, 1), -1);
BoardWinWait();
BoardWinKill();
if (temp_r29 != -1) {
BoardDataAsyncWait(temp_r29);
}
HuPrcEnd();
}
BoardWinKill();
if (temp_r29 != -1) {
BoardDataAsyncWait(temp_r29);
}
BoardModelMotionStart(BoardLotteryHostGet(), 1, 0x40000001);
BoardAudSeqPause(0, 1, 1000);
CreateModel();
BoardStatusShowSetAll(0);
lotterySpace = BoardSpaceLinkFlagSearch(0, temp_r28, 0x02000000);
BoardSpacePosGet(0, temp_r28, &sp38);
BoardSpacePosGet(0, lotterySpace, &sp2C);
PSVECSubtract(&sp2C, &sp38, &sp20);
if (GWBoardGet() == 2 || GWBoardGet() == 3) {
PSVECScale(&sp20, &sp20, 0.95f);
PSVECAdd(&sp20, &sp38, &sp2C);
}
temp_r26 = 180.0 * (atan2(-sp20.x, -sp20.z) / M_PI);
if (BoardPlayerSizeGet(temp_r31) == 1) {
BoardModelVisibilitySet(gripMdl[0], 0);
BoardModelVisibilitySet(gripMdl[1], 1);
} else {
BoardModelVisibilitySet(gripMdl[0], 1);
BoardModelVisibilitySet(gripMdl[1], 0);
}
sp14.x = -3.0f;
sp14.y = temp_r26;
sp14.z = 0.0f;
sp8.x = 0.0f;
sp8.y = 200.0f;
sp8.z = 0.0f;
BoardCameraMotionStartEx(lotteryMdl[0], &sp14, &sp8, 1300.0f, -1.0f, 27);
if (BoardPlayerSizeGet(temp_r31) == 1) {
BoardModelVisibilitySet(lotteryMdl[3], 1);
}
omVibrate(temp_r31, 12, 6, 6);
HuAudFXPlay(0x331);
HuAudFXPlay(0x344);
BoardModelMotionStart(lotteryMdl[0], 0, 0);
while (!BoardModelMotionEndCheck(lotteryMdl[0])) {
HuPrcVSleep();
}
BoardModelMotionShiftSet(BoardLotteryHostGet(), lotteryMot[3], 0.0f, 10.0f, 0);
BoardPlayerRotSet(temp_r31, 0.0f, temp_r26, 0.0f);
BoardPlayerPosLerpStart(temp_r31, &sp38, &sp2C, 0x14);
while (GWPlayer[temp_r31].moving) {
HuPrcVSleep();
}
if (BoardPlayerSizeGet(temp_r31) == 1) {
DoMiniJumpUp(temp_r31);
}
BoardPlayerPosGet(temp_r31, &sp2C);
for (i = 0; i < 4; i++) {
if (i != temp_r31) {
BoardPlayerPosGet(i, &sp38);
PSVECSubtract(&sp2C, &sp38, &sp20);
PSVECNormalize(&sp20, &sp20);
BoardPlayerMotBlendSet(i, 180.0 * (atan2(sp20.x, sp20.z) / M_PI), 7);
}
}
BoardMusStart(1, 2, 0x7F, 0);
BoardPlayerIdleSet(temp_r31);
while (!BoardStatusStopCheck(temp_r31)) {
HuPrcVSleep();
}
BoardModelMotionShiftSet(BoardLotteryHostGet(), lotteryMot[0], 0.0f, 10.0f, 0x40000001);
if (GWPlayer[temp_r31].field00_bit9 == 0 && GWSystem.max_turn - GWSystem.turn >= 5) {
SetupTicket(temp_r31);
ShowTicket();
var_r27 = 1;
} else {
var_r27 = 0;
}
if (GWBoardGet() == 7 || GWBoardGet() == 8) {
var_r27 = 0;
}
PayEnterFee(var_r27);
var_r25 = BoardRandMod(100) & 0xFF;
if (var_r25 < 50) {
ExecBallGame();
} else {
ExecScratch();
}
ExecPrize();
if (BoardPlayerSizeGet(temp_r31) == 1) {
DoMiniJumpDown(temp_r31);
}
BoardPlayerMoveBetween(temp_r31, lotterySpace, temp_r28);
while (GWPlayer[temp_r31].moving) {
HuPrcVSleep();
}
BoardPlayerIdleSet(temp_r31);
BoardModelVisibilitySet(ballMdl[currPrize & 3], 0);
BoardAudSeqFadeOut(1, 1000);
BoardCameraTargetPlayerSet(temp_r31);
BoardCameraViewSet(1);
BoardStatusShowSet(temp_r31, 0);
BoardModelMotionStart(lotteryMdl[0], 0, 0x40000004);
while (!BoardModelMotionEndCheck(lotteryMdl[0])) {
HuPrcVSleep();
}
BoardModelMotionSpeedSet(lotteryMdl[0], 0.0f);
BoardModelAttrReset(lotteryMdl[0], 0x40000004);
HuAudFXPlay(0x32F);
KillModel();
BoardStatusShowSetAll(1);
BoardAudSeqPause(0, 0, 1000);
HuPrcEnd();
}
static void DoMiniJumpUp(s32 arg0) {
Mtx sp34;
Vec sp28;
Vec sp1C;
Vec sp10;
float temp_f29;
float temp_f30;
float var_f27;
s16 var_r27;
s16 temp_r26;
s16 i;
var_r27 = BoardModelIDGet(lotteryMdl[0]);
Hu3DModelObjMtxGet(var_r27, "toto_chibidai", sp34);
Hu3DMtxTransGet(sp34, &sp28);
BoardPlayerMotionStart(arg0, 4, 0);
temp_f29 = BoardPlayerMotionMaxTimeGet(arg0);
BoardPlayerPosGet(arg0, &sp1C);
sp28.y += 52.5308f;
PSVECSubtract(&sp28, &sp1C, &sp10);
sp10.x /= temp_f29;
sp10.z /= temp_f29;
sp10.y /= temp_f29;
OSf32tos16(&temp_f29, &temp_r26);
for (i = 0; i < temp_r26; i++) {
OSs16tof32(&i, &temp_f30);
if (i < 4) {
var_f27 = 5.0f;
} else {
var_f27 = 0.0f;
}
sp1C.x += sp10.x;
sp1C.y += sp10.y + var_f27 - 0.016666668f * temp_f30 * temp_f30;
sp1C.z += sp10.z;
BoardPlayerPosSetV(arg0, &sp1C);
HuPrcVSleep();
}
sp1C.y = sp28.y;
BoardPlayerPosSetV(arg0, &sp1C);
BoardPlayerIdleSet(arg0);
}
static void DoMiniJumpDown(s32 arg0) {
Vec sp24;
Vec sp18;
Vec spC;
float temp_f31;
float var_f29;
s16 i;
BoardPlayerPosGet(arg0, &sp18);
BoardSpacePosGet(0, lotterySpace, &sp24);
PSVECSubtract(&sp24, &sp18, &spC);
BoardPlayerMotionStart(arg0, 4, 0);
spC.x /= 30.0f;
spC.z /= 30.0f;
for (i = 0; i < 30; i++) {
OSs16tof32(&i, &temp_f31);
if (i < 3) {
var_f29 = 10.0f;
} else {
var_f29 = 0.0f;
}
sp18.x += spC.x;
sp18.y += var_f29 + -0.016666668f * temp_f31 * temp_f31 * 0.75f;
sp18.z += spC.z;
if (sp24.y > sp18.y) {
sp18.y = sp24.y;
break;
}
BoardPlayerPosSetV(arg0, &sp18);
HuPrcVSleep();
}
BoardPlayerMotionStart(arg0, 5, 0);
BoardPlayerPosSetV(arg0, &sp24);
while (!BoardPlayerMotionEndCheck(arg0)) {
HuPrcVSleep();
}
}
static void PayEnterFee(s32 arg0) {
s32 var_r29;
s32 temp_r31;
s32 i;
temp_r31 = GWSystem.player_curr;
BoardStatusShowSetForce(temp_r31);
BoardStatusShowSet(temp_r31, 1);
if (arg0 != 0) {
var_r29 = lotteryMessBase + 12;
} else {
var_r29 = lotteryMessBase;
}
BoardWinCreate(2, var_r29, BoardWinPortraitGet());
BoardWinWait();
BoardWinKill();
while (!BoardStatusStopCheck(temp_r31)) {
HuPrcVSleep();
}
for (i = 0; i < 5; i++) {
BoardPlayerCoinsAdd(temp_r31, -1);
HuAudFXPlay(0xE);
HuPrcSleep(6);
}
HuAudFXPlay(0xF);
BoardStatusShowSet(temp_r31, 0);
}
static void ShowTicket(void) {
s16 sp10;
s16 spE;
s16 spC;
s16 spA;
s8 sp8;
float var_f31;
s16 temp_r31;
s32 var_r29;
s32 i;
u8 *var_r28;
s32 sp14[] = {
DATA_MAKE_NUM(DATADIR_BKUJIYA, 21),
DATA_MAKE_NUM(DATADIR_BKUJIYA, 22),
DATA_MAKE_NUM(DATADIR_BKUJIYA, 23),
DATA_MAKE_NUM(DATADIR_BKUJIYA, 24),
DATA_MAKE_NUM(DATADIR_BKUJIYA, 25),
DATA_MAKE_NUM(DATADIR_BKUJIYA, 26),
DATA_MAKE_NUM(DATADIR_BKUJIYA, 27),
DATA_MAKE_NUM(DATADIR_BKUJIYA, 28)
};
if (GWBoardGet() == 7 || GWBoardGet() == 8) {
return;
}
sp8 = GWPlayer[GWSystem.player_curr].field00_bitA;
var_r28 = (u8*) &sp8;
temp_r31 = HuSprGrpCreate(4);
BoardSpriteCreate(DATA_MAKE_NUM(DATADIR_BKUJIYA, 20), 30001, 0, &spA);
HuSprGrpMemberSet(temp_r31, 0, spA);
HuSprAttrSet(temp_r31, 0, 9);
HuSprPosSet(temp_r31, 0, 288.0f, 240.0f);
HuSprTPLvlSet(temp_r31, 0, 0.0f);
var_r29 = GWPlayer[(*var_r28 >> 4) & 3].character;
BoardSpriteCreate(sp14[var_r29], 30000, 0, &spC);
HuSprGrpMemberSet(temp_r31, 1, spC);
HuSprAttrSet(temp_r31, 1, 9);
HuSprPosSet(temp_r31, 1, 200.0f, 237.0f);
HuSprTPLvlSet(temp_r31, 1, 0.0f);
var_r29 = GWPlayer[(*var_r28 >> 2) & 3].character;
BoardSpriteCreate(sp14[var_r29], 30000, 0, &spE);
HuSprGrpMemberSet(temp_r31, 2, spE);
HuSprAttrSet(temp_r31, 2, 9);
HuSprPosSet(temp_r31, 2, 294.0f, 237.0f);
HuSprTPLvlSet(temp_r31, 2, 0.0f);
var_r29 = GWPlayer[*var_r28 & 3].character;
BoardSpriteCreate(sp14[var_r29], 30000, 0, &sp10);
HuSprGrpMemberSet(temp_r31, 3, sp10);
HuSprAttrSet(temp_r31, 3, 9);
HuSprPosSet(temp_r31, 3, 388.0f, 237.0f);
HuSprTPLvlSet(temp_r31, 3, 0.0f);
BoardWinCreate(2, lotteryMessBase + 10, BoardWinPortraitGet());
BoardWinWait();
for (var_f31 = 0.0f; var_f31 <= 1.0f; var_f31 += 0.15f) {
if (var_f31 >= 1.0f) {
var_f31 = 1.0f;
}
for (i = 0; i < 4; i++) {
HuSprTPLvlSet(temp_r31, i, var_f31);
}
HuPrcVSleep();
}
BoardWinCreate(2, lotteryMessBase + 11, BoardWinPortraitGet());
BoardWinWait();
BoardWinKill();
for (var_f31 = 1.0f; var_f31 > 0.0f; var_f31 -= 0.15f) {
if (var_f31 < 0.0f) {
var_f31 = 0.0f;
}
for (i = 0; i < 4; i++) {
HuSprTPLvlSet(temp_r31, i, var_f31);
}
HuPrcVSleep();
}
HuSprGrpKill(temp_r31);
(void) var_r29; // Required to match
}
static void SetupTicket(s32 arg0) {
u8 sp8[4];
u8 var_r29;
s32 var_r28;
s32 var_r30;
s32 var_r31;
for (var_r30 = var_r31 = 0; var_r31 < 4; var_r31++) {
if (arg0 != var_r31 && GWPlayer[var_r31].field00_bit9 != 0) {
sp8[var_r30] = GWPlayer[var_r31].field00_bitA;
var_r30++;
}
}
for (var_r28 = 0; var_r28 < 1000; var_r28++) {
var_r29 = BoardRandMod(64) & 0x3F;
for (var_r31 = 0; var_r30 != 0 && var_r31 < var_r30; var_r31++) {
if (sp8[var_r31] == var_r29) {
var_r29 = 0x80;
break;
}
}
if (var_r29 != 0x80) {
break;
}
}
GWPlayer[arg0].field00_bitA = var_r29;
GWPlayer[arg0].field00_bit9 = 1;
}
static void LotteryInlineFunc00(s32 arg0, s32 arg1) {
s32 sp20[2] = {
DATA_MAKE_NUM(DATADIR_BKUJIYA, 18),
DATA_MAKE_NUM(DATADIR_BKUJIYA, 19)
};
s16 sp10[2] = { 152, 120 };
s16 sp14[2] = { 120, 120 };
Vec sp34;
float temp_f30;
s16 var_r30;
sp34.x = (sp14[arg0] / 2) + 32;
if (arg1 == 0) {
sp34.y = -sp10[arg0] / 2;
temp_f30 = 4.0f;
if (lotterySpr == -1) {
lotterySpr = espEntry(sp20[arg0], 30001, 0);
espAttrSet(lotterySpr, 1);
}
} else {
sp34.y = (sp10[arg0] / 2) + 40;
temp_f30 = -4.0f;
}
for (var_r30 = sp10[arg0] + 40; var_r30 > 0; var_r30 -= 4) {
sp34.y += temp_f30;
espPosSet(lotterySpr, sp34.x, sp34.y);
HuPrcVSleep();
}
if (arg1 != 0 && lotterySpr >= 0) {
espKill(lotterySpr);
lotterySpr = -1;
}
}
static void ExecBallGame(void) {
Vec sp4C;
float temp_f24;
float var_f23;
float var_f25;
float var_f26;
float var_f27;
float var_f19;
float var_f28;
s32 var_r22;
s32 var_r21;
s32 var_r20 = 0;
s32 temp_r25;
s32 var_r24;
s32 temp_r27;
u8 var_r26;
s8 var_r17;
s8 spB;
s8 spA;
s8 sp9;
s8 *temp_r23;
s32 sp58[] = {
DATA_MAKE_NUM(DATADIR_MARIOMOT, 29),
DATA_MAKE_NUM(DATADIR_LUIGIMOT, 29),
DATA_MAKE_NUM(DATADIR_PEACHMOT, 29),
DATA_MAKE_NUM(DATADIR_YOSHIMOT, 29),
DATA_MAKE_NUM(DATADIR_WARIOMOT, 29),
DATA_MAKE_NUM(DATADIR_DONKEYMOT, 29),
DATA_MAKE_NUM(DATADIR_DAISYMOT, 29),
DATA_MAKE_NUM(DATADIR_WALUIGIMOT, 29)
};
temp_r27 = GWSystem.player_curr;
currPrize = -1;
sp4C.x = 0.0f;
sp4C.y = 210.0f;
sp4C.z = 0.0f;
BoardCameraMotionStartEx(lotteryMdl[0], NULL, &sp4C, 980.0f, -1.0f, 21);
LotteryInlineFunc00(0, 0);
BoardCameraMotionWait();
BoardWinCreate(2, lotteryMessBase + 1, BoardWinPortraitGet());
BoardWinWait();
BoardWinKill();
HuPrcSleep(0x12);
CreateLotteryWin(0);
turnMot = BoardPlayerMotionCreate(temp_r27, sp58[GWPlayer[temp_r27].character]);
BoardPlayerMotionSpeedSet(temp_r27, 0.0f);
BoardModelAttrSet(lotteryMdl[1], 0x40000001);
BoardModelMotionSpeedSet(lotteryMdl[1], 0.0f);
BoardModelMotionTimeSet(lotteryMdl[1], 0.0f);
BoardModelAttrSet(gripMdl[0], 0x40000001);
BoardModelAttrSet(gripMdl[1], 0x40000001);
BoardPlayerMotionShiftSet(temp_r27, turnMot, 0.0f, 8.0f, 0x40000001);
BoardPlayerMotionSpeedSet(temp_r27, 0.0f);
temp_f24 = BoardModelMotionMaxTimeGet(lotteryMdl[1]);
temp_f24 -= 4.0f;
comInputPos = 0;
var_r20 = 0;
spB = spA = sp9 = var_r17 = 0;
var_r26 = var_f28 = var_f27 = var_f25 = var_f23 = var_r21 = 0;
HuPrcSleep(24);
var_r24 = var_r22 = 0;
while (1) {
HuPrcVSleep();
BoardModelMotionSpeedSet(lotteryMdl[1], var_f28);
BoardModelMotionSpeedSet(gripMdl[0], var_f28);
BoardModelMotionSpeedSet(gripMdl[1], var_f28);
BoardPlayerMotionSpeedSet(temp_r27, var_f28);
if (var_r22 != 0 && var_f28 <= 0.1f) {
BoardModelMotionSpeedSet(lotteryMdl[1], 0.0f);
BoardModelMotionSpeedSet(gripMdl[0], 0.0f);
BoardModelMotionSpeedSet(gripMdl[1], 0.0f);
BoardPlayerMotionSpeedSet(temp_r27, 0.0f);
break;
}
if (var_r24 == 0) {
if (BoardModelMotionTimeGet(lotteryMdl[1]) >= temp_f24) {
var_r21++;
if ((var_r26++) != 0 || var_r21 >= 1 || var_r20 != 0) {
var_r22 = 1;
if (currPrize == -1) {
var_f27 *= 128.0f;
OSf32tos8(&var_f27, &lbl_801D401B);
SetBallPrize();
}
}
var_r24 = 1;
}
}
if (var_r24 != 0 && BoardModelMotionTimeGet(lotteryMdl[1]) < 2.0f) {
var_r24 = 0;
}
if (var_r22 == 0) {
var_r17 = spB;
sp9 = spA;
if (!GWPlayer[temp_r27].com) {
temp_r25 = GWPlayer[temp_r27].port;
spB = HuPadStkX[temp_r25];
spA = HuPadStkY[temp_r25];
} else {
temp_r23 = comInputBall[comInputPos++];
spB = temp_r23[0];
spA = temp_r23[1];
}
} else {
spB = spA = 0;
}
if (spB == 0x7F || spA == 0x7F) {
var_r20 = 1;
} else {
if ((abs(spB) < 57.600002f && abs(spA) < 57.600002f) || (var_r17 == spB && sp9 == spA) || (spB == 0 && spA == 0)) {
var_f28 *= 0.93f;
var_f27 *= 0.8f;
if (var_f27 < 0.01f && var_r26 != 0) {
var_r26--;
}
} else {
OSs8tof32(&spB, &var_f26);
OSs8tof32(&spA, &var_f19);
var_f25 = 180.0 * (atan2(var_f26, var_f19) / M_PI);
if (var_f25 < 0.0f) {
var_f25 += 360.0f;
}
if (var_f25 < 20.0f) {
HuAudFXPlay(0x333);
}
var_f26 = var_f25 - var_f23;
if (!(var_f26 < 0.0f)) {
if (ABS(var_f26) > 30.0f) {
var_f26 = 10.0f;
}
var_f27 += 0.01f * var_f26;
if (var_f28 + var_f27 < 2.0f) {
var_f28 += var_f27;
} else {
var_f28 = 2.0f;
}
}
}
}
var_f23 = var_f25;
}
KillLotteryWin();
LotteryInlineFunc00(0, 1);
}
static void SetBallPrize(void) {
Process *sp8;
s32 temp_r31;
while (1) {
temp_r31 = BoardRandMod(100);
if (temp_r31 > 97) {
currPrize = 0;
} else if (temp_r31 > 87) {
currPrize = 1;
} else if (temp_r31 > 67) {
currPrize = 2;
} else {
currPrize = 3;
}
if (GWSystem.max_turn - GWSystem.turn != 0 || currPrize != 2) {
break;
}
}
sp8 = HuPrcChildCreate(ExecBallPrize, 0x2004, 0x3800, 0, lotteryProc);
}
static void ExecBallPrize(void) {
Vec sp30;
Vec sp24;
Vec sp18;
Vec spC;
float var_f25;
float temp_f28;
float temp_f27;
float temp_f26;
float var_f29;
float var_f30;
s32 var_r28;
s16 temp_r29;
s16 var_r27;
s16 sp8;
HsfObject *temp_r3;
Mtx sp6C;
Mtx sp3C;
var_r28 = 0;
HuAudFXPlay(0x34C);
temp_r29 = ballMdl[currPrize & 3];
BoardModelPosGet(lotteryMdl[0], &sp30);
BoardModelRotGet(lotteryMdl[0], &sp18);
PSMTXRotRad(sp6C, 'Y', MTXDegToRad(sp18.y));
var_r27 = BoardModelIDGet(lotteryMdl[0]);
temp_r3 = Hu3DModelObjPtrGet(var_r27, "toto_gara");
temp_f28 = sp30.y + temp_r3->data.curr.pos.y + 100.0f;
PSMTXTrans(sp3C, temp_r3->data.curr.pos.x, temp_r3->data.curr.pos.y + 210.0f, temp_r3->data.curr.pos.z + -40.0f);
PSMTXConcat(sp6C, sp3C, sp3C);
Hu3DMtxTransGet(sp3C, &spC);
PSVECAdd(&spC, &sp30, &sp30);
BoardModelVisibilitySet(temp_r29, 1);
sp24.x = 10.5f;
sp24.y = -3.0f;
sp24.z = 0.0f;
PSMTXMultVec(sp6C, &sp24, &sp24);
var_f29 = 0.0f;
var_f30 = 1.8f;
temp_f27 = 0.016666668f;
sp8 = 0;
while (1) {
OSs16tof32(&sp8, &var_f25);
temp_f26 = 4.9f * (2.0f * var_f25 - temp_f27) * temp_f27;
sp24.y -= temp_f26;
sp24.x *= 0.92f;
sp24.z *= 0.92f;
PSVECAdd(&sp24, &sp30, &sp30);
var_f29 += sp24.z;
if (sp30.y - 25.0f < temp_f28) {
if (var_r28 == 0) {
HuAudFXPlay(0x334);
var_r28 = 1;
}
sp30.y = 25.0f + temp_f28 + temp_f26 * var_f30;
if (var_f30 > 0.0f) {
var_f30 -= 0.1f;
}
}
BoardModelPosSetV(temp_r29, &sp30);
BoardModelRotSet(temp_r29, 0.0f, var_f29, 0.0f);
HuPrcVSleep();
sp8++;
}
}
static const s32 pickSpr[] = {
DATA_MAKE_NUM(DATADIR_BOARD, 30),
DATA_MAKE_NUM(DATADIR_BOARD, 31),
DATA_MAKE_NUM(DATADIR_BOARD, 32),
DATA_MAKE_NUM(DATADIR_BOARD, 33),
DATA_MAKE_NUM(DATADIR_BOARD, 34),
DATA_MAKE_NUM(DATADIR_BOARD, 35),
DATA_MAKE_NUM(DATADIR_BOARD, 36),
DATA_MAKE_NUM(DATADIR_BOARD, 37)
};
static const s32 handMdl[] = {
DATA_MAKE_NUM(DATADIR_BKUJIYA, 9),
DATA_MAKE_NUM(DATADIR_BKUJIYA, 10),
DATA_MAKE_NUM(DATADIR_BKUJIYA, 11),
DATA_MAKE_NUM(DATADIR_BKUJIYA, 12),
DATA_MAKE_NUM(DATADIR_BKUJIYA, 13),
DATA_MAKE_NUM(DATADIR_BKUJIYA, 14),
DATA_MAKE_NUM(DATADIR_BKUJIYA, 15),
DATA_MAKE_NUM(DATADIR_BKUJIYA, 16)
};
static const s32 ticketSpr[] = {
DATA_MAKE_NUM(DATADIR_BKUJIYA, 29),
DATA_MAKE_NUM(DATADIR_BKUJIYA, 30),
DATA_MAKE_NUM(DATADIR_BKUJIYA, 31),
DATA_MAKE_NUM(DATADIR_BKUJIYA, 32)
};
static omObjData *ticketObj[12] = { NULL };
static s8 ticketPrize[12] = { 0 };
static Vec handLastPos = { 0.0f, 0.0f, 0.0f };
static s32 loseSoundTbl[] = {
0x0000012E,
0x0000016E,
0x000001AE,
0x000001EE,
0x0000022E,
0x0000026E,
0x000002AE,
0x000002EE
};
static s32 loseMotTbl[] = {
DATA_MAKE_NUM(DATADIR_MARIOMOT, 51),
DATA_MAKE_NUM(DATADIR_LUIGIMOT, 51),
DATA_MAKE_NUM(DATADIR_PEACHMOT, 51),
DATA_MAKE_NUM(DATADIR_YOSHIMOT, 51),
DATA_MAKE_NUM(DATADIR_WARIOMOT, 51),
DATA_MAKE_NUM(DATADIR_DONKEYMOT, 51),
DATA_MAKE_NUM(DATADIR_DAISYMOT, 51),
DATA_MAKE_NUM(DATADIR_WALUIGIMOT, 51)
};
static void ExecScratchTicket(s32 arg0) {
Vec sp24;
Vec sp18;
Vec spC;
u16 var_r29;
u16 var_r28;
s16 *temp_r25;
s32 var_r24;
s32 temp_r27;
u16 var_r23;
omObjData *var_r22;
TicketWork *temp_r30;
AnimBmpData *temp_r31;
var_r24 = GWPlayer[GWSystem.player_curr].character;
var_r22 = ticketObj[arg0];
temp_r30 = OM_GET_WORK_PTR(var_r22, TicketWork);
lotteryMdl[4] = BoardModelCreate(handMdl[var_r24], NULL, 0);
BoardModelLayerSet(lotteryMdl[4], 6);
BoardModelPassSet(lotteryMdl[4], 0);
BoardCameraDirGet(&spC);
BoardModelRotYSet(lotteryMdl[4], 180.0 * (atan2(-spC.x, -spC.z) / M_PI));
BoardModelScaleSet(lotteryMdl[4], 3.0f, 3.0f, 3.0f);
sp24.x = 320.0f;
sp24.y = 480.0f;
sp24.z = 500.0f;
CreateLotteryWin(1);
while (1) {
HuPrcVSleep();
if (sp24.y <= 240.0f) {
break;
}
sp24.y -= 4.0f;
Hu3D2Dto3D(&sp24, 1, &sp18);
BoardModelPosSetV(lotteryMdl[4], &sp18);
}
comInputPos = 0;
if (BoardRandMod(100) < 50) {
comInputDrawP = comInputDraw1;
} else {
comInputDrawP = comInputDraw2;
}
temp_r27 = HuAudFXPlay(0x335);
HuAudFXVolSet(temp_r27, 0);
while (1) {
HuPrcVSleep();
if (TicketUpdate(temp_r30->unk08->bmp, &sp24, temp_r27) != 0) {
break;
}
if (ScratchTicketCheckDone(temp_r30->unk08->bmp)) {
break;
}
}
HuAudFXStop(temp_r27);
while (1) {
HuPrcVSleep();
if (sp24.y >= 480.0f) {
break;
}
sp24.y += 4.0f;
Hu3D2Dto3D(&sp24, 1, &sp18);
BoardModelPosSetV(lotteryMdl[4], &sp18);
}
BoardModelVisibilitySet(lotteryMdl[4], 0);
temp_r31 = temp_r30->unk08->bmp;
temp_r25 = temp_r31->data;
for (var_r28 = 0; var_r28 < temp_r31->sizeY; var_r28++) {
for (var_r29 = 0; var_r29 < temp_r31->sizeX; var_r29++) {
var_r23 = TicketGetPixel(temp_r31->sizeX, var_r29, var_r28);
temp_r25[var_r23] = 0;
}
HuPrcVSleep();
}
KillLotteryWin();
BoardModelKill(lotteryMdl[4]);
lotteryMdl[4] = -1;
}
static void ExecScratch(void) {
TicketWork *temp_r28;
float var_f31;
s32 temp_curr;
s32 temp_r31;
currPrize = -1;
BoardFilterFadeInit(30, 0xA0);
InitTicketPrizes();
InitScratchSpr();
temp_curr = GWSystem.player_curr;
if (GWPlayer[temp_curr].com) {
comLotteryType = BoardRandMod(4);
comLotteryWinType = BoardRandMod(3);
}
BoardWinCreate(2, lotteryMessBase + 9, BoardWinPortraitGet());
BoardWinWait();
BoardWinKill();
CreateLotteryWin(2);
InitScratchPick();
while (currPrize == -1) {
HuPrcVSleep();
}
temp_r31 = currPrize;
currPrize = ticketPrize[temp_r31];
ExecTicketFocus(temp_r31);
KillLotteryWin();
LotteryInlineFunc00(1, 0);
ExecScratchTicket(temp_r31);
LotteryInlineFunc00(1, 1);
temp_r28 = OM_GET_WORK_PTR(ticketObj[temp_r31], TicketWork);
for (var_f31 = 1.0f; var_f31 > 0.0f; var_f31 -= 0.078125f) {
if (var_f31 < 0.0f) {
var_f31 = 0.0f;
}
HuSprTPLvlSet(ticketSprGrp, temp_r28->unk00_field2, var_f31);
HuPrcVSleep();
}
HideScratchSpr();
BoardFilterFadeOut(30);
}
static void KillScratch(void) {
if (ticketSprGrp != -1) {
HuSprGrpKill(ticketSprGrp);
ticketSprGrp = -1;
}
if (lotteryTicketPickObj) {
OM_GET_WORK_PTR(lotteryTicketPickObj, LotteryTicketPickWork)->unk00_field0 = 1;
}
memset(ticketObj, 0, sizeof(ticketObj));
}
static void ExecScratchSpr(omObjData *arg0) {
Vec sp20;
Vec sp14;
Vec sp8;
s32 temp_r29;
TicketWork *temp_r30;
temp_r30 = OM_GET_WORK_PTR(arg0, TicketWork);
if (temp_r30->unk00_field0 != 0 || BoardIsKill()) {
temp_r29 = temp_r30->unk00_field2;
HuSprAttrSet(ticketSprGrp, temp_r29, 4);
HuSprAttrSet(ticketSprGrp, temp_r29 + 12, 4);
ticketObj[temp_r29] = NULL;
omDelObjEx(HuPrcCurrentGet(), arg0);
return;
}
if (temp_r30->unk01 != 0) {
temp_r30->unk01--;
return;
}
sp14.x = arg0->trans.x;
sp14.y = arg0->trans.y;
sp20.x = arg0->rot.x;
sp20.y = arg0->rot.y;
PSVECSubtract(&sp14, &sp20, &sp8);
if (ABS(sp8.x) < 1.0f && ABS(sp8.y) < 1.0f) {
sp8 = sp14;
temp_r30->unk00_field1 = 1;
} else {
PSVECScale(&sp8, &sp8, 0.2f);
PSVECAdd(&sp20, &sp8, &sp8);
temp_r30->unk00_field1 = 0;
}
HuSprPosSet(ticketSprGrp, temp_r30->unk00_field2, sp8.x, sp8.y);
HuSprPosSet(ticketSprGrp, temp_r30->unk00_field2 + 12, sp8.x, sp8.y);
arg0->rot.x = sp8.x;
arg0->rot.y = sp8.y;
}
static void HideScratchSpr(void) {
s32 i;
for (i = 0; i < 12; i++) {
if (ticketObj[i]) {
OM_GET_WORK_PTR(ticketObj[i], TicketWork)->unk00_field0 = 1;
}
}
}
static void InitScratchSpr(void) {
Vec sp18;
Vec spC;
omObjData *temp_r31;
TicketWork *temp_r29;
s32 temp_curr;
s16 temp_r28;
s16 sp8;
s16 i;
temp_curr = GWSystem.player_curr;
BoardPlayerRotGet(temp_curr, &sp18);
memset(ticketObj, 0, sizeof(ticketObj));
BoardCameraRotGet(&spC);
temp_r28 = HuSprGrpCreate(24);
ticketSprGrp = temp_r28;
for (i = 0; i < 12; i++) {
temp_r31 = omAddObjEx(boardObjMan, 0x101, 0, 0, -1, ExecScratchSpr);
ticketObj[i] = temp_r31;
temp_r29 = OM_GET_WORK_PTR(temp_r31, TicketWork);
temp_r29->unk00_field0 = 0;
temp_r29->unk00_field2 = i;
temp_r29->unk01 = (i / 4) * 2;
temp_r29->unk02 = temp_r29->unk04 = -1;
temp_r31->trans.x = 107.0f + 110.0f * (i % 4);
temp_r31->trans.y = 98.0f + 110.0f * (i / 4);
temp_r31->rot.x = -56.0f;
temp_r31->rot.y = temp_r31->trans.y;
BoardSpriteCreate(ticketSpr[ticketPrize[i]], 5500, NULL, &sp8);
HuSprGrpMemberSet(temp_r28, i, sp8);
HuSprPosSet(temp_r28, i, temp_r31->rot.x, temp_r31->rot.y);
HuSprAttrSet(temp_r28, i, 8);
temp_r29->unk02 = sp8;
BoardSpriteCreate(DATA_MAKE_NUM(DATADIR_BKUJIYA, 33), 5000, &temp_r29->unk08, &sp8);
HuSprGrpMemberSet(temp_r28, i + 12, sp8);
HuSprPosSet(temp_r28, i + 12, temp_r31->rot.x, temp_r31->rot.y);
HuSprAttrSet(temp_r28, i + 12, 8);
temp_r29->unk04 = sp8;
}
HuSprGrpDrawNoSet(temp_r28, 0x40);
}
static inline u32 ExecStratchPickInlineFunc(LotteryTicketPickWork *temp_r29) {
s32 var_r21;
s32 temp_r23;
u32 var_r26;
var_r21 = GWSystem.player_curr;
var_r26 = 0;
if (!GWPlayer[var_r21].com) {
temp_r23 = GWPlayer[GWSystem.player_curr].port;
var_r26 = HuPadDStkRep[temp_r23] | HuPadBtnDown[temp_r23];
} else if (comLotteryType != temp_r29->unk02) {
var_r26 = 2;
} else if (comLotteryWinType != temp_r29->unk03) {
var_r26 = 4;
} else if (comLotteryType == temp_r29->unk02 && comLotteryWinType == temp_r29->unk03) {
var_r26 = 0x100;
}
return var_r26;
}
static void ExecScratchPick(omObjData *arg0) {
float var_f29;
float var_f28;
s8 var_r28;
s8 var_r25;
s8 var_r24;
u32 var_r26;
LotteryTicketPickWork *temp_r29;
temp_r29 = OM_GET_WORK_PTR(arg0, LotteryTicketPickWork);
if (temp_r29->unk00_field0 || BoardIsKill()) {
HuSprGrpKill(temp_r29->unk08);
lotteryTicketPickObj = 0;
omDelObjEx(HuPrcCurrentGet(), arg0);
return;
}
if (temp_r29->unk04 != 0) {
temp_r29->unk04--;
return;
}
var_r25 = var_r24 = 0;
var_r26 = ExecStratchPickInlineFunc(temp_r29);
if (var_r26 == 0x100) {
currPrize = (temp_r29->unk02 + (temp_r29->unk03 * 4));
temp_r29->unk00_field0 = 1;
HuAudFXPlay(2);
return;
}
var_r28 = 0;
if (var_r26 == 8) {
var_r24 = -1;
var_r28 = 1;
}
if (var_r26 == 4) {
var_r24 = 1;
var_r28 = 1;
}
if (var_r26 == 1) {
var_r25 = -1;
var_r28 = 1;
}
if (var_r26 == 2) {
var_r25 = 1;
var_r28 = 1;
}
if ((var_r25 != 0 || var_r24 != 0) && GWPlayer[GWSystem.player_curr].com) {
temp_r29->unk04 = 0x14;
}
temp_r29->unk02 += var_r25;
temp_r29->unk03 += var_r24;
if (temp_r29->unk02 < 0) {
temp_r29->unk02 = 0;
var_r28 = 0;
} else if (temp_r29->unk03 < 0) {
temp_r29->unk03 = 0;
var_r28 = 0;
}
if (temp_r29->unk02 >= 4) {
temp_r29->unk02 = 3;
var_r28 = 0;
} else if (temp_r29->unk03 >= 3) {
temp_r29->unk03 = 2;
var_r28 = 0;
}
if (var_r28 != 0) {
HuAudFXPlay(0);
}
OSs8tof32(&temp_r29->unk02, &var_f29);
OSs8tof32(&temp_r29->unk03, &var_f28);
var_f29 = 107.0f + 110.0f * var_f29 - 32.0f + 16.0f;
var_f28 = 98.0f + 110.0f * var_f28 + 32.0f - 24.0f;
HuSprPosSet(temp_r29->unk08, 0, var_f29, var_f28);
}
static void InitScratchPick(void) {
float temp_f31 = 91.0f;
float temp_f30 = 106.0f;
omObjData *temp_r30;
LotteryTicketPickWork *var_r31;
temp_r30 = omAddObjEx(boardObjMan, 0x101, 0, 0, -1, ExecScratchPick);
lotteryTicketPickObj = temp_r30;
var_r31 = OM_GET_WORK_PTR(temp_r30, LotteryTicketPickWork);
var_r31->unk02 = var_r31->unk03 = 0;
var_r31->unk04 = 6;
var_r31->unk00_field0 = 0;
var_r31->unk01 = GWPlayer[GWSystem.player_curr].character;
var_r31->unk08 = HuSprGrpCreate(1);
BoardSpriteCreate(pickSpr[var_r31->unk01], 5000, 0, &var_r31->unk06);
HuSprGrpMemberSet(var_r31->unk08, 0, var_r31->unk06);
HuSprAttrSet(var_r31->unk08, 0, 8);
HuSprPosSet(var_r31->unk08, 0, temp_f31, temp_f30);
HuSprGrpDrawNoSet(var_r31->unk08, 0x40);
}
static void InitTicketPrizes(void) {
s32 temp_r31;
s32 i;
memset(ticketPrize, 3, sizeof(ticketPrize));
for (i = 0; i < 3; i++) {
do {
temp_r31 = BoardRandMod(12);
} while (ticketPrize[temp_r31] != 3);
ticketPrize[temp_r31] = i;
if (GWSystem.max_turn - GWSystem.turn == 0 && i == 2) {
ticketPrize[temp_r31] = 3;
}
}
}
static void ExecTicketFocus(s32 arg0) {
float var_f31;
float temp_f30;
omObjData *var_r30;
TicketWork *temp_r29;
s32 i;
var_r30 = ticketObj[arg0];
var_r30->trans.x = 288.0f;
var_r30->trans.y = 240.0f;
for (i = 0; i < 12; i++) {
if (i != arg0) {
OM_GET_WORK_PTR(ticketObj[i], TicketWork)->unk00_field0 = 1;
}
}
temp_r29 = OM_GET_WORK_PTR(ticketObj[arg0], TicketWork);
for (var_f31 = 0.0f; var_f31 < 90.0f; var_f31 += 2.0f) {
temp_f30 = 1.0 + 1.3f * sin(var_f31 * M_PI / 180.0);
HuSprScaleSet(ticketSprGrp, temp_r29->unk00_field2, temp_f30, temp_f30);
HuSprScaleSet(ticketSprGrp, temp_r29->unk00_field2 + 12, temp_f30, temp_f30);
HuPrcVSleep();
}
}
static BOOL ScratchTicketCheckDone(AnimBmpData *arg0) {
s32 var_r29;
s32 var_r31;
s32 var_r30;
u16 *var_r28;
var_r28 = arg0->data;
for (var_r29 = var_r30 = 0; var_r30 < arg0->sizeY; var_r30++) {
for (var_r31 = 0; var_r31 < arg0->sizeX; var_r31++) {
if (var_r28[var_r31 + var_r30 * arg0->sizeX] == 0) {
var_r29++;
}
}
}
if (var_r29 >= arg0->sizeX * arg0->sizeY - 300) {
return TRUE;
} else {
return FALSE;
}
}
static u16 TicketGetPixel(u16 arg0, u16 arg1, u16 arg2) {
u16 var_r31;
u16 var_r30;
u16 var_r29;
u16 var_r28;
var_r29 = (arg1 & 3);
var_r28 = (arg2 & 3);
var_r31 = (arg1 >> 2);
var_r30 = (arg2 >> 2);
return var_r29 + (var_r28 << 2) + ((var_r31 + var_r30 * (arg0 >> 2)) << 4);
}
static s32 TicketUpdate(AnimBmpData *arg0, Vec *arg1, s32 arg2) {
Vec sp48;
Vec sp3C;
float temp_f25;
float temp_f20;
s32 var_r18;
s16 var_r17;
s32 var_r21;
s32 var_r20;
s8 *temp_r19;
s16 *sp38;
s32 sp34;
s16 sp26;
s16 sp24;
s16 sp22;
s8 spD;
if (GWPlayer[GWSystem.player_curr].com) {
temp_r19 = comInputDrawP[comInputPos++];
if (temp_r19[0] == 0x7F && temp_r19[1] == 0x7F) {
return -1;
}
OSs8tof32(&temp_r19[0], &sp48.x);
OSs8tof32(&temp_r19[1], &sp48.y);
} else {
sp34 = GWPlayer[GWSystem.player_curr].port;
sp48.x = HuPadStkX[sp34];
sp48.y = HuPadStkY[sp34];
}
sp48.z = 0.0f;
if (sp48.x == 0.0f && sp48.y == 0.0f) {
handLastPos = *arg1;
handUpdateF = 0;
HuAudFXVolSet(arg2, 0);
return 0;
}
if (handUpdateF == 0) {
handUpdateF = 1;
}
PSVECNormalize(&sp48, &sp48);
temp_f20 = atan2f(sp48.x, -sp48.y);
sp48.x = sin(temp_f20);
sp48.y = cos(temp_f20);
temp_f25 = 127.0f * PSVECMag(&sp48);
OSf32tos8(&temp_f25, &spD);
HuAudFXVolSet(arg2, spD);
sp48.x *= 8.0f;
sp48.y *= 8.0f;
PSVECAdd(&sp48, arg1, &sp3C);
var_r18 = 0;
if (sp3C.x < 192.0f) {
sp3C.x = 192.0f;
var_r18 = 1;
}
if (sp3C.y < 192.0f) {
sp3C.y = 192.0f;
var_r18 = 1;
}
if (sp3C.x >= 384.0f) {
sp3C.x = 384.0f;
var_r18 = 1;
}
if (sp3C.y >= 288.0f) {
sp3C.y = 288.0f;
var_r18 = 1;
}
if (var_r18 != 0) {
HuAudFXVolSet(arg2, 0);
}
*arg1 = sp3C;
Hu3D2Dto3D(&sp3C, 1, &sp3C);
BoardModelPosSetV(lotteryMdl[4], &sp3C);
sp3C = *arg1;
sp3C.x -= 192.0f;
sp3C.y -= 192.0f;
sp3C.x *= arg0->sizeX / 192.0f;
sp3C.y *= arg0->sizeY / 96.0f;
sp24 = arg0->sizeX;
sp38 = arg0->data;
for (var_r20 = -8; var_r20 < 9; var_r20++) {
for (var_r21 = -8; var_r21 < 9; var_r21++) {
OSf32tos16(&sp3C.x, &var_r17);
OSf32tos16(&sp3C.y, &sp26);
if (var_r17 + var_r21 < arg0->sizeX && sp26 + var_r20 < arg0->sizeY && var_r17 + var_r21 >= 0 && sp26 + var_r20 >= 0) {
var_r17 += var_r21;
sp26 += var_r20;
sp22 = TicketGetPixel(sp24, var_r17, sp26);
if (sp22 < arg0->sizeX * arg0->sizeY) {
sp38[sp22] = 0;
}
}
}
}
DCFlushRange(arg0->data, (u32) (arg0->sizeX * arg0->sizeY * 2) >> 3);
handLastPos = *arg1;
return 0;
}
static s32 ExecCoinPrizeInlineFunc(void) {
s32 i;
for (i = 0; i < 10; i++) {
if (coinF[i] == 0) {
return i;
}
}
return -1;
}
static void ExecCoinPrize(void) {
Vec sp64[10];
Vec sp8;
float sp3C[10];
float sp14[10];
float var_f31;
s32 var_r26;
s32 var_r28;
s32 temp_r27;
s32 var_r30;
s32 i;
temp_r27 = GWSystem.player_curr;
if (currPrize == 0) {
var_r28 = 100;
} else {
var_r28 = 30;
}
memset(coinMdl, 0, sizeof(coinMdl));
memset(coinF, 0, 10);
BoardPlayerPosGet(temp_r27, &sp8);
var_f31 = 150.0f + sp8.y;
if (BoardPlayerSizeGet(temp_r27) == 1) {
var_f31 = 52.5308f + 0.3f * var_f31 + 110.0f;
}
for (i = 0; i < 10; i++) {
coinMdl[i] = BoardModelCreate(DATA_MAKE_NUM(DATADIR_BOARD, 10), NULL, 0);
BoardModelVisibilitySet(coinMdl[i], 0);
}
while (1) {
HuPrcVSleep();
if (var_r28 > 0) {
var_r30 = ExecCoinPrizeInlineFunc();
if (var_r30 != -1) {
coinF[var_r30] = 1;
sp64[var_r30].x = sp8.x + 100.0f * (BoardRandFloat() - 0.5f);
sp64[var_r30].y = sp8.y + 700.0f;
sp64[var_r30].z = sp8.z + 100.0f * (BoardRandFloat() - 0.5f);
sp14[var_r30] = -20.0f + -10.0f * BoardRandFloat();
sp3C[var_r30] = BoardRandMod(360);
BoardModelVisibilitySet(coinMdl[var_r30], 1);
BoardModelScaleSet(coinMdl[var_r30], 0.5f, 0.5f, 0.5f);
var_r28--;
}
} else {
var_r26 = 0;
for (i = 0; i < 10; i++) {
if (coinF[i] != 0) {
var_r26 = 1;
}
}
if (var_r26 == 0) {
return;
}
}
for (i = 0; i < 10; i++) {
if (coinF[i] != 0) {
if (sp64[i].y < var_f31) {
sp64[i].y = var_f31;
CharModelLayerSetAll(2);
CharModelCoinEffectCreate(1, &sp64[i]);
BoardModelVisibilitySet(coinMdl[i], 0);
coinF[i] = 0;
BoardPlayerCoinsAdd(temp_r27, 1);
HuAudFXPlay(7);
omVibrate(temp_r27, 12, 6, 6);
} else {
BoardModelPosSetV(coinMdl[i], &sp64[i]);
BoardModelRotSet(coinMdl[i], 0.0f, sp3C[i], 0.0f);
sp3C[i] = BoardDAngleCalc(45.0f + sp3C[i]);
sp64[i].y += sp14[i];
}
}
}
}
}
static void ExecItemPrize(void) {
Vec sp20;
Vec sp14;
float temp_f29;
float var_f28;
float var_f30;
float var_f31;
s32 temp_r26;
s32 var_r28;
s32 temp_r29;
s16 *var_r31;
s16 i;
s32 spC[2] = {
DATA_MAKE_NUM(DATADIR_BOARD, 111),
DATA_MAKE_NUM(DATADIR_BOARD, 112)
};
s8 sp8[2] = { 2, 3 };
temp_r29 = GWSystem.player_curr;
var_r28 = (BoardRandFloat() < 0.5f) ? 1 : 0;
memset(coinMdl, 0, sizeof(coinMdl));
var_r31 = &coinMdl[0];
*var_r31 = BoardModelCreate(spC[var_r28], NULL, 0);
var_f30 = BoardPlayerRotYGet(temp_r29);
BoardModelRotYSet(*var_r31, var_f30);
BoardModelScaleSet(*var_r31, 1.0f, 1.0f, 1.0f);
BoardSpacePosGet(0, GWPlayer[temp_r29].space_curr, &sp20);
BoardPlayerPosGet(temp_r29, &sp14);
sp14.y = sp20.y;
sp20 = sp14;
sp14.y += 700.0f;
sp20.y += 280.0f;
temp_f29 = (sp20.y - sp14.y) / 60.0f;
temp_r26 = HuAudFXPlay(0x35F);
for (i = 0; i < 60; i++) {
sp14.y += temp_f29;
BoardModelPosSetV(*var_r31, &sp14);
HuPrcVSleep();
}
HuPrcSleep(30);
BoardPlayerPosGet(temp_r29, &sp20);
if (BoardPlayerSizeGet(temp_r29) == 0) {
sp20.y += 100.0f;
} else {
sp20.y += 30.000002f;
}
temp_f29 = (sp20.y - sp14.y) / 30.0f;
var_f28 = 0.0f;
HuAudFXPlay(0x30D);
for (i = 0; i < 30; i++) {
sp14.y += temp_f29;
var_f30 = BoardDAngleCalc(15.0f + var_f30);
var_f31 = cos(var_f28 * M_PI / 180.0);
if (var_f31 <= 0.0f) {
var_f31 = 0.01f;
}
var_f28 += 3.3333333f;
BoardModelPosSetV(*var_r31, &sp14);
BoardModelRotYSet(*var_r31, var_f30);
BoardModelScaleSet(*var_r31, var_f31, var_f31, var_f31);
HuPrcVSleep();
}
HuAudFXStop(temp_r26);
BoardModelKill(*var_r31);
*var_r31 = -1;
BoardPlayerItemAdd(GWSystem.player_curr, sp8[var_r28]);
omVibrate(GWSystem.player_curr, 12, 6, 6);
}
static void KillCoin(void) {
s32 i;
for (i = 0; i < 10; i++) {
BoardModelKill(coinMdl[i]);
coinMdl[i] = -1;
}
}
static void ExecPrize(void) {
Vec sp14;
Vec sp8;
s16 var_r29;
s16 var_r23;
s32 var_r26;
s32 var_r28;
s32 var_r27;
s32 temp_r30;
s32 var_r31;
s32 i;
s32 var_r24;
var_r28 = -1;
var_r29 = 0;
var_r27 = -1;
sp14.x = 0.0f;
sp14.y = 200.0f;
sp14.z = 0.0f;
BoardCameraMotionStartEx(lotteryMdl[0], NULL, &sp14, 1300.0f, -1.0f, 21);
temp_r30 = GWSystem.player_curr;
BoardStatusShowSetForce(temp_r30);
BoardStatusShowSet(temp_r30, 1);
for (var_r24 = i = 0; i < 3; i++) {
if (GWPlayer[GWSystem.player_curr].items[i] != -1) {
var_r24++;
}
}
var_r31 = currPrize;
if (var_r31 == 0) {
BoardModelVisibilitySet(lotteryMdl[2], 1);
BoardModelMotionStart(lotteryMdl[2], 0, 0x40000001);
BoardModelMotionSpeedSet(lotteryMdl[2], 2.0f);
}
var_r26 = 0;
switch (var_r31) {
case 0:
var_r28 = lotteryMessBase + 2;
var_r29 = 7;
var_r26 = 100;
break;
case 1:
var_r28 = lotteryMessBase + 4;
var_r29 = 7;
var_r26 = 80;
break;
case 2:
var_r28 = lotteryMessBase + 5;
if (var_r24 < 3) {
var_r29 = 7;
var_r26 = 80;
} else {
var_r29 = 8;
}
break;
case 3:
var_r28 = lotteryMessBase + 7;
var_r29 = 8;
break;
}
if (var_r31 != 3) {
HuAudFXPlay(0x332);
}
if (var_r29 == 7) {
BoardModelMotionShiftSet(BoardLotteryHostGet(), lotteryMot[1], 0.0f, 10.0f, 0x40000001);
}
if (var_r26 != 0) {
BoardPlayerPosGet(temp_r30, &sp8);
sp8.y = 700.0f;
BoardConfettiCreate(&sp8, var_r26, 150.0f);
}
if (var_r31 == 0 || var_r31 == 1) {
BoardAudSeqPause(1, 1, 0x1F4);
HuPrcSleep(0x14);
if (var_r31 == 0) {
var_r27 = HuAudSStreamPlay(0xA);
} else {
var_r27 = HuAudSStreamPlay(9);
}
}
var_r23 = (s32) BoardPlayerRotYGet(temp_r30) + 180;
BoardPlayerMotBlendSet(temp_r30, var_r23, 0xF);
while (!BoardPlayerMotBlendCheck(temp_r30)) {
HuPrcVSleep();
}
if (var_r31 == 0 || var_r31 == 1) {
while (HuAudSStreamStatGet(var_r27) != 0) {
HuPrcVSleep();
}
var_r27 = -1;
BoardAudSeqPause(1, 0, 1000);
}
BoardWinCreate(2, var_r28, BoardWinPortraitGet());
BoardWinWait();
if (var_r31 == 2) {
if (var_r24 == 3) {
BoardWinCreate(2, lotteryMessBase + 6, BoardWinPortraitGet());
BoardWinWait();
} else {
BoardAudSeqPause(1, 1, 1000);
HuPrcSleep(0x30);
var_r27 = HuAudSStreamPlay(2);
}
}
if (var_r29 == 8) {
HuAudFXPlay(loseSoundTbl[GWPlayer[temp_r30].character]);
BoardPlayerVoiceEnableSet(temp_r30, var_r29, 0);
}
BoardPlayerMotionShiftSet(temp_r30, var_r29, 0.0f, 8.0f, 0);
switch (var_r31) {
case 0:
case 1:
ExecCoinPrize();
break;
case 2:
if (var_r24 < 3) {
ExecItemPrize();
} else {
var_r31 = 3;
}
break;
}
if (var_r27 != -1) {
while (HuAudSStreamStatGet(var_r27) != 0) {
HuPrcVSleep();
}
var_r27 = -1;
BoardAudSeqPause(1, 0, 1000);
}
while (!BoardPlayerMotionEndCheck(temp_r30)) {
HuPrcVSleep();
}
if (var_r31 != 3) {
var_r28 = lotteryMessBase + 3;
} else {
var_r28 = lotteryMessBase + 8;
}
BoardModelMotionShiftSet(BoardLotteryHostGet(), lotteryMot[2], 0.0f, 10.0f, 0x40000001);
BoardWinCreate(2, var_r28, BoardWinPortraitGet());
BoardWinWait();
BoardWinKill();
if (var_r26 != 0) {
BoardConfettiStop();
}
if (var_r31 == 3) {
ExecLose(temp_r30);
}
}
static void ExecLose(s32 arg0) {
s32 temp_r30;
temp_r30 = GWPlayer[arg0].character;
loseMot = BoardPlayerMotionCreate(arg0, loseMotTbl[temp_r30]);
BoardPlayerMotionShiftSet(arg0, loseMot, 0.0f, 10.0f, 0);
HuPrcSleep(10);
while (!BoardPlayerMotionEndCheck(arg0)) {
HuPrcVSleep();
}
}
static void CreateLotteryWin(s32 arg0) {
float sp8[2];
float temp_f30;
float var_f31;
s32 var_r31;
temp_f30 = -10000.0f;
if (arg0 == 0) {
var_r31 = MAKE_MESSID(6, 80);
var_f31 = 352.0f;
} else if (arg0 == 1) {
var_f31 = 352.0f;
var_r31 = MAKE_MESSID(6, 81);
} else {
var_f31 = 364.0f;
var_r31 = MAKE_MESSID(32, 22);
}
HuWinMesMaxSizeGet(1, sp8, var_r31);
lotteryInstWin = HuWinCreate(temp_f30, var_f31, sp8[0], sp8[1], 0);
HuWinBGTPLvlSet(lotteryInstWin, 0.0f);
HuWinMesSpeedSet(lotteryInstWin, 0);
HuWinMesSet(lotteryInstWin, var_r31);
}
static void KillLotteryWin(void) {
if (lotteryInstWin != -1) {
HuWinKill(lotteryInstWin);
lotteryInstWin = -1;
}
}
void BoardLotteryTutorialExec(void) {
Vec sp38;
Vec sp2C;
Vec sp20;
Vec sp14;
Vec sp8;
s16 temp_r29;
s16 temp_r28;
s16 temp_r31;
s32 temp_r30;
temp_r30 = BoardDataDirReadAsync(DATADIR_BKUJIYA);
temp_r31 = BoardSpaceFlagSearch(0, 0x10000000);
if (temp_r30 != -1) {
BoardDataAsyncWait(temp_r30);
}
BoardModelMotionStart(BoardLotteryHostGet(), 1, 0x40000001);
CreateModel();
temp_r29 = BoardSpaceLinkFlagSearch(0, temp_r31, 0x02000000);
BoardSpacePosGet(0, temp_r31, &sp38);
BoardSpacePosGet(0, temp_r29, &sp2C);
PSVECSubtract(&sp2C, &sp38, &sp20);
PSVECNormalize(&sp20, &sp20);
temp_r28 = 180.0 * (atan2(-sp20.x, -sp20.z) / M_PI);
sp14.x = -3.0f;
sp14.y = temp_r28;
sp14.z = 0.0f;
sp8.x = 0.0f;
sp8.y = 200.0f;
sp8.z = 0.0f;
BoardCameraMotionStartEx(lotteryMdl[0], &sp14, &sp8, 1300.0f, -1.0f, 21);
HuAudFXPlay(0x331);
HuAudFXPlay(0x344);
BoardModelMotionStart(lotteryMdl[0], 0, 0);
while (!BoardModelMotionEndCheck(lotteryMdl[0])) {
HuPrcVSleep();
}
BoardModelMotionShiftSet(BoardLotteryHostGet(), lotteryMot[3], 0.0f, 10.0f, 0);
HuPrcSleep(10);
while (!BoardModelMotionEndCheck(BoardShopHostGet())) {
HuPrcVSleep();
}
BoardModelMotionShiftSet(BoardLotteryHostGet(), lotteryMot[0], 0.0f, 10.0f, 0x40000001);
BoardTutorialHookExec(0x1C, 0);
BoardModelMotionShiftSet(BoardLotteryHostGet(), lotteryMot[2], 0.0f, 10.0f, 0x40000001);
HuPrcSleep(30);
BoardModelMotionStart(lotteryMdl[0], 0, 0x40000004);
while (!BoardModelMotionEndCheck(lotteryMdl[0])) {
HuPrcVSleep();
}
BoardModelMotionSpeedSet(lotteryMdl[0], 0.0f);
BoardModelAttrReset(lotteryMdl[0], 0x40000004);
HuAudFXPlay(0x32F);
KillModel();
}