diff --git a/configure.py b/configure.py index 92dd8b02..ac6cc8ac 100644 --- a/configure.py +++ b/configure.py @@ -374,7 +374,7 @@ config.libs = [ Object(NonMatching, "game/board/char_wheel.c"), Object(NonMatching, "game/board/mushroom.c"), Object(NonMatching, "game/board/star.c"), - Object(NonMatching, "game/board/roll.c"), + Object(Matching, "game/board/roll.c"), Object(Matching, "game/board/ui.c"), Object(NonMatching, "game/board/block.c"), Object(NonMatching, "game/board/item.c"), diff --git a/include/game/board/player.h b/include/game/board/player.h index 2acc9a20..21f1921b 100644 --- a/include/game/board/player.h +++ b/include/game/board/player.h @@ -138,6 +138,7 @@ void BoardPlayerAutoSizeSet(s32, s32); void BoardPlayerCopyMat(s32); void BoardBowserSuitKill(s32); void SetRollPlayerSize(s32); +void BoardDiceDigit2DInit(s32, s32); void BoardDiceDigit2DUpdateEnable(s32); s32 DoSparkSpace(s32, s16*); s32 MegaPlayerPassFunc(s32, s16); diff --git a/include/game/board/roll.h b/include/game/board/roll.h new file mode 100755 index 00000000..7b801c28 --- /dev/null +++ b/include/game/board/roll.h @@ -0,0 +1,18 @@ +#ifndef _BOARD_ROLL_H +#define _BOARD_ROLL_H + +#include "dolphin/types.h" + +s32 BoardRollExec(s32 arg0); +void BoardRollKill(void); +void BoardRollUPauseSet(s32 arg0); +void BoardRollWinDispSet(s32 arg0); +s16 BoardDiceEffectCreate(void); +void BoardDicePauseAll(void); +BOOL BoardDiceDoneCheck(void); +void BoardDiceStop(s32 arg0); +void BoardDiceVisibleSet(s32 arg0, s32 arg1); +void BoardDiceValueSet(s32 arg0, s32 arg1); +void BoardRollTutorialSet(s16 *arg0); + +#endif diff --git a/include/game/board/tutorial.h b/include/game/board/tutorial.h new file mode 100755 index 00000000..2d8368f1 --- /dev/null +++ b/include/game/board/tutorial.h @@ -0,0 +1,8 @@ +#ifndef _BOARD_TUTORIAL_H +#define _BOARD_TUTORIAL_H + +#include "dolphin/types.h" + +extern s8 boardTutorialUseItem; + +#endif diff --git a/src/game/board/com.c b/src/game/board/com.c index 71bc7baa..fae9cae0 100755 --- a/src/game/board/com.c +++ b/src/game/board/com.c @@ -5,6 +5,7 @@ #include "game/board/main.h" #include "game/board/player.h" #include "game/board/space.h" +#include "game/board/tutorial.h" #include "game/board/window.h" #include "math.h" @@ -25,8 +26,6 @@ static BOOL CheckSwapUse(s32 arg0, s32 arg1); static BOOL CheckBooUse(s32 arg0, s32 arg1); static BOOL CheckLampUse(s32 arg0, s32 arg1); -extern s8 boardTutorialUseItem; - static s8 itemUse = -1; static s8 comItemWeightTbl[8][12] = { diff --git a/src/game/board/player.c b/src/game/board/player.c index cb722d27..1b97cccc 100644 --- a/src/game/board/player.c +++ b/src/game/board/player.c @@ -1,6 +1,7 @@ #include "game/board/player.h" #include "game/objsub.h" #include "game/board/com.h" +#include "game/board/roll.h" #include "game/board/view.h" //// #include "game/board/ui.h" @@ -35,9 +36,6 @@ extern void BoardModelAttrReset(s16, s32); extern BoardTutorialHookExec(s16, s32); //// #include "game/board/com.h" //// #include "game/board/overhead.h" -//// #include "game/board/roll.h" -extern s32 BoardRollExec(s32); -extern void BoardRollKill(void); //// #include "game/chrman.h" extern void CharModelDataClose(s16); extern void CharModelStepTypeSet(s16, s32); diff --git a/src/game/board/roll.c b/src/game/board/roll.c new file mode 100755 index 00000000..dfb26bf1 --- /dev/null +++ b/src/game/board/roll.c @@ -0,0 +1,936 @@ +#include "game/board/roll.h" +#include "game/audio.h" +#include "game/gamework_data.h" +#include "game/hsfanim.h" +#include "game/object.h" +#include "game/pad.h" +#include "game/process.h" +#include "game/window.h" +#include "game/board/main.h" +#include "game/board/model.h" +#include "game/board/player.h" +#include "game/board/tutorial.h" + +typedef struct { + struct { + u8 unk00_field0 : 1; + u8 unk00_field1 : 1; + u8 unk00_field2 : 3; + u8 unk00_field3 : 2; + }; + s8 unk01; + s8 unk02; + char unk03[1]; + s16 unk04; + s16 unk06; +} DiceWork; + +typedef struct { + struct { + u8 unk00_field0 : 1; + u8 unk00_field1 : 1; + u8 unk00_field2 : 1; + u8 unk00_field3 : 2; + }; + s8 unk01; + s16 unk02; + s16 unk04[2]; + float unk08; +} DiceDigitWork; + +s32 BoardRollResizeCheck(void); +s32 BoardPauseActiveCheck(void); +void BoardTutorialHookExec(s16, s32); + +static void RollMain(void); +static void DiceCreate(s32 arg0); +static void DoInput(s32 arg0); +static void DiceWaitFull(s32 arg0); +static void DiceSetHit(s32 arg0); +static void RollDestroy(void); +static void DiceMain(omObjData *arg0); +static void DicePause(s32 arg0); +static void DicePauseAll(void); +static void DiceHideEffect(s32 arg0, s32 arg1); +static void DiceDigitMain(omObjData *arg0); +static void DiceDigitKill(DiceDigitWork *arg0); +static void DiceKill(void); +static void DiceDigitMove(DiceDigitWork *arg0, s32 arg1); +static void DiceDigitRotate(DiceDigitWork *arg0, s32 arg1); +static void SameRollExec(void); +static s32 GetBtnRoll(s32 arg0); +static s32 GetComBtnRoll(s32 arg0); + +static s32 tutorialRoll[3]; + +static s8 diceValue[3]; +static s8 rollPlayer; +static s8 numDice; +static s8 inputTimer; +static s8 maxRoll; +static s8 destMode; +static s8 diceSize; +s32 lbl_801D4098; +static char sameRollCoinStr[8]; +static s8 tutorialRollF; +static Process *rollProc; + +static s16 diceMdl[3] = { -1, -1, -1 }; +static s16 diceEff[3] = { -1, -1, -1 }; +static s16 rollWin = -1; + +static omObjData *diceObj[3] = { NULL, NULL, NULL }; +static omObjData *diceDigitObj[3] = { NULL, NULL, NULL }; +static s32 diceSndStatus[3] = { -1, -1, -1 }; + +static HsfanimStruct00 diceEffParam = { + 0x0096, + { 0x00, 0x00 }, // padding? + 50.0f, + 0.0f, + 65.0f, + { 0.0f, -0.195f, 0.0f }, + 100.0f, + 0.99f, + 40.0f, + 0.999f, + 0x0004, + { + { 0xFF, 0xFF, 0x20, 0xFF }, + { 0xFF, 0xFF, 0x00, 0xFF }, + { 0xFF, 0xFF, 0x80, 0xFF }, + { 0xFF, 0xFF, 0xFF, 0xFF } + }, + { + { 0xFF, 0xFF, 0xFF, 0x00 }, + { 0xFF, 0xFF, 0xFF, 0x00 }, + { 0xFF, 0xFF, 0xFF, 0x00 }, + { 0xFF, 0xFF, 0xFF, 0x00 } + } +}; + +static s32 diceDigitMdlTbl[10] = { + 0x0007000C, + 0x0007000D, + 0x0007000E, + 0x0007000F, + 0x00070010, + 0x00070011, + 0x00070012, + 0x00070013, + 0x00070014, + 0x00070015 +}; + +s32 BoardRollExec(s32 arg0) { + rollPlayer = arg0; + inputTimer = 0; + numDice = 1; + diceSize = 0; + maxRoll = 0xA; + switch (BoardRollTypeGet()) { + case 0: + numDice = 1; + break; + case 2: + numDice = 2; + break; + case 1: + numDice = 2; + break; + case 3: + numDice = 3; + break; + } + if (BoardPlayerSizeGet(arg0) == 1) { + diceSize = 1; + maxRoll = 5; + } else if (BoardPlayerSizeGet(arg0) == 2) { + diceSize = 2; + maxRoll = 10; + if (BoardRollResizeCheck() != 0) { + numDice = 2; + } + } + if (GWPlayer[rollPlayer].bowser_suit != 0) { + diceSize = 3; + } + GWPlayer[arg0].field08_bit7 = numDice; + rollProc = HuPrcChildCreate(RollMain, 0x2005, 0x6000, 0, boardMainProc); + HuPrcDestructorSet2(rollProc, RollDestroy); + while (rollProc != NULL) { + HuPrcVSleep(); + } + while (diceObj[0] || diceObj[1] || diceObj[2]) { + HuPrcVSleep(); + } + return destMode; +} + +void BoardRollKill(void) { + if (rollProc) { + HuPrcKill(rollProc); + } + DicePauseAll(); + DiceKill(); +} + +void BoardRollUPauseSet(s32 arg0) { + if (!rollProc) { + return; + } + BoardRollWinDispSet(arg0); + BoardDiceVisibleSet(0, arg0); + BoardDiceVisibleSet(1, arg0); + BoardDiceVisibleSet(2, arg0); + DiceHideEffect(0, arg0); + DiceHideEffect(1, arg0); + DiceHideEffect(2, arg0); +} + +void BoardRollWinDispSet(s32 arg0) { + if (rollWin == -1) { + return; + } + if (arg0 != 0) { + HuWinDispOn(rollWin); + } else { + HuWinDispOff(rollWin); + } +} + +static void RollMain(void) { + float sp8[2]; + float var_f31; + float var_f30; + s32 var_r28; + s32 var_r27; + s32 temp_r26; + s32 temp_r25; + s32 var_r30; + s32 var_r29; + s32 i; + + diceValue[0] = diceValue[1] = diceValue[2] = 0; + if (BoardPlayerSizeGet(rollPlayer) == 2 || GWPlayer[rollPlayer].bowser_suit != 0) { + BoardCameraViewSet(2); + } + BoardCameraMotionWait(); + BoardCameraTargetModelSet(-1); + for (i = 0; i < numDice; i++) { + temp_r26 = rollPlayer; + if (!_CheckFlag(0x1000B)) { + var_r27 = BoardPlayerItemCount(temp_r26); + if (GWTeamGet()) { + temp_r25 = BoardPlayerSameTeamFind(temp_r26); + var_r27 += BoardPlayerItemCount(temp_r25); + } + if (BoardRollTypeGet() != -1 || var_r27 == 0 || _CheckFlag(0x10009) || BoardRollResizeCheck()) { + var_r29 = 0x90004; + } else { + var_r29 = 0x90002; + } + if (inputTimer != 0) { + var_r29 = 0x300025; + } + HuWinMesMaxSizeGet(1, sp8, var_r29); + switch (GWGameStat.language) { + case 0: + var_f31 = -10000.0f; + break; + case 1: + var_f31 = 288.0f - (sp8[0] / 2 - 16.0f); + break; + } + var_f30 = 304.0f; + rollWin = HuWinCreate(var_f31, var_f30, sp8[0], sp8[1], 0); + HuWinBGTPLvlSet(rollWin, 0.0f); + HuWinMesSpeedSet(rollWin, 0); + HuWinMesSet(rollWin, var_r29); + } + DiceCreate(i); + DiceWaitFull(i); + DoInput(i); + if (rollWin != -1) { + HuWinKill(rollWin); + rollWin = -1; + } + if (destMode == -2 || destMode == -1 || destMode == -3 || destMode == -4) { + HuPrcEnd(); + } + BoardPlayerDiceJumpStart(rollPlayer); + while (!BoardPlayerDiceJumpCheck(rollPlayer)) { + HuPrcVSleep(); + } + DiceSetHit(i); + while (GWPlayer[rollPlayer].field08_bit3 != 0) { + HuPrcVSleep(); + } + } + for (var_r30 = i = 0; i < numDice; i++) { + var_r30 += diceValue[i]; + } + var_r28 = 0; + switch (numDice) { + case 2: + if (diceValue[0] == diceValue[1]) { + var_r28 = 1; + } + break; + case 3: + if (diceValue[0] == diceValue[1] && diceValue[0] == diceValue[2]) { + var_r28 = 1; + } + break; + } + if (var_r28 != 0) { + SameRollExec(); + } + BoardDicePauseAll(); + while (!BoardDiceDoneCheck()) { + HuPrcVSleep(); + } + for (i = 0; i < numDice; i++) { + BoardDiceStop(i); + } + destMode = var_r30; + GWPlayer[rollPlayer].roll = var_r30; + BoardDiceDigit2DInit(rollPlayer, 1); + if (_CheckFlag(0x1000B)) { + BoardTutorialHookExec(6, 0); + } + if (tutorialRollF != 0) { + tutorialRollF = 0; + } + HuPrcEnd(); +} + +static void DiceCreate(s32 arg0) { + Vec sp1C; + float temp_f30; + float var_f31; + omObjData *temp_r31; + DiceWork *temp_r30; + s32 sp8; + s32 spC[4] = { + 0x00070018, + 0x00070019, + 0x0007001A, + 0x0007001B + }; + + sp8 = 0; + diceMdl[arg0] = BoardModelCreate(spC[diceSize], NULL, 0); + temp_f30 = BoardRandMod(maxRoll) + 0.5f; + BoardPlayerPosGet(rollPlayer, &sp1C); + HuAudFXPlay(0x302); + BoardModelMotionStart(diceMdl[arg0], 0, 0); + BoardModelMotionSpeedSet(diceMdl[arg0], 0.0f); + BoardModelMotionTimeSet(diceMdl[arg0], temp_f30); + BoardModelScaleSet(diceMdl[arg0], 0.001f, 0.001f, 0.001f); + temp_r31 = omAddObjEx(boardObjMan, 0x102, 0, 0, -1, DiceMain); + temp_r30 = OM_GET_WORK_PTR(temp_r31, DiceWork); + temp_r30->unk00_field0 = 0; + temp_r30->unk00_field1 = 0; + temp_r30->unk00_field2 = 0; + temp_r30->unk00_field3 = arg0; + temp_r30->unk04 = 0; + temp_r30->unk01 = 4; + temp_r30->unk02 = 0; + diceObj[arg0] = temp_r31; + var_f31 = 250.0f; + if (diceSize == 2) { + var_f31 = 625.0f; + } else if (GWPlayer[rollPlayer].bowser_suit != 0) { + var_f31 = 575.0f; + } + sp1C.y += var_f31; + temp_r31->trans.x = sp1C.x; + temp_r31->trans.y = sp1C.y; + temp_r31->trans.z = sp1C.z; + temp_r31->scale.x = 0.1f; + temp_r31->scale.y = 0.1f; + temp_r31->scale.z = 0.1f; + sp1C.z += 70.0f; +} + +static void DoInput(s32 arg0) { + s32 var_r31; + s32 var_r30; + u16 sp8[1]; + + destMode = 0; + lbl_801D4098 = 0; + while (1) { + HuPrcVSleep(); + *sp8 = GetBtnRoll(rollPlayer); + if (BoardPauseActiveCheck()) { + *sp8 = 0; + continue; + } + if (*sp8 == 0x100) { + inputTimer++; + break; + } + if (inputTimer == 0) { + if (*sp8 == 0x10) { + destMode = -3; + HuAudFXPlay(1); + break; + } + if (*sp8 == 0x20) { + destMode = -4; + HuAudFXPlay(1); + break; + } + var_r31 = BoardPlayerItemCount(rollPlayer); + if (GWTeamGet()) { + var_r30 = BoardPlayerSameTeamFind(rollPlayer); + var_r31 += BoardPlayerItemCount(var_r30); + } + if (var_r31 == 0 || BoardRollTypeGet() != -1 || BoardRollResizeCheck() || _CheckFlag(0x10009)) { + if (_CheckFlag(0x10009) && GWBoardGet() == 5 && *sp8 == 0x200 && var_r31 != 0) { + HuAudFXPlay(4); + } + } else if (*sp8 == 0x200) { + destMode = -2; + HuAudFXPlay(3); + BoardPauseDisableSet(1); + break; + } + } + } +} + +static void DiceWaitFull(s32 arg0) { + DiceWork *temp_r31 = OM_GET_WORK_PTR(diceObj[arg0], DiceWork); + + while (temp_r31->unk00_field2 != 1) { + HuPrcVSleep(); + } +} + +static void DiceSetHit(s32 arg0) { + DiceWork *temp_r30 = OM_GET_WORK_PTR(diceObj[arg0], DiceWork); + + temp_r30->unk00_field2 = 2; + temp_r30->unk04 = 0; + BoardModelMotionSpeedSet(diceMdl[arg0], 0.0f); + diceValue[arg0] = (s32) BoardModelMotionTimeGet(diceMdl[arg0]) + 1; + if (tutorialRollF != 0 && tutorialRoll[arg0] != -1) { + BoardModelMotionTimeSet(diceMdl[arg0], tutorialRoll[arg0] - 1); + diceValue[arg0] = tutorialRoll[arg0]; + } +} + +static void RollDestroy(void) { + if (rollWin != -1) { + HuWinKill(rollWin); + rollWin = -1; + } + if (rollProc) { + HuPrcKill(rollProc); + } + DicePauseAll(); + DiceKill(); + BoardConfettiKill(); + rollProc = NULL; +} + +static void DiceMain(omObjData *arg0) { + DiceWork *temp_r29 = OM_GET_WORK_PTR(arg0, DiceWork); + float temp_f29; + float var_f28; + float var_f27; + s16 temp_r26; + s16 temp_r27; + + if (temp_r29->unk00_field0 != 0 || BoardIsKill()) { + if (diceSndStatus[temp_r29->unk00_field3] != -1) { + HuAudFXStop(diceSndStatus[temp_r29->unk00_field3]); + diceSndStatus[temp_r29->unk00_field3] = -1; + } + if (diceMdl[temp_r29->unk00_field3] != -1) { + BoardModelKill(diceMdl[temp_r29->unk00_field3]); + diceMdl[temp_r29->unk00_field3] = -1; + } + if (diceEff[temp_r29->unk00_field3] != -1) { + Hu3DParManKill(diceEff[temp_r29->unk00_field3]); + diceEff[temp_r29->unk00_field3] = -1; + } + DicePause(temp_r29->unk00_field3); + diceObj[temp_r29->unk00_field3] = NULL; + omDelObjEx(HuPrcCurrentGet(), arg0); + return; + } + switch (temp_r29->unk00_field2) { + case 0: + if (temp_r29->unk06 >= 0x438) { + temp_r29->unk00_field2 = 1; + arg0->scale.x = arg0->scale.y = arg0->scale.z = 1.0f; + arg0->rot.y = temp_r29->unk04 = 0; + } else { + if (temp_r29->unk04 == 0 && diceSndStatus[temp_r29->unk00_field3] == -1) { + diceSndStatus[temp_r29->unk00_field3] = HuAudFXPlay(0x300); + } + arg0->rot.y = temp_r29->unk06 % 360; + temp_r29->unk06 += 0x19; + if (temp_r29->unk04 < 0xB4) { + var_f27 = 0.0f; + var_f28 = 1.0f; + } else { + var_f27 = 1.0f; + var_f28 = 0.5f; + } + arg0->scale.x = var_f27 + var_f28 * sin((float) (temp_r29->unk04 % 180) * M_PI / 180.0); + arg0->scale.y = arg0->scale.x; + arg0->scale.z = arg0->scale.x; + if (temp_r29->unk04 <= 360) { + if (temp_r29->unk04 < 0xB4) { + temp_r29->unk04 += 6; + } else { + temp_r29->unk04 += 0x12; + } + if (temp_r29->unk04 > 360) { + temp_r29->unk04 = 360; + } + } + } + break; + case 1: + temp_r29->unk04 += 4; + if (temp_r29->unk04 > 360) { + temp_r29->unk04 -= 360; + } + OSs16tof32(&temp_r29->unk04, &temp_f29); + arg0->trans.y += 0.20000000298023224 * sin(temp_f29 * M_PI / 180.0); + break; + case 2: + temp_r29->unk04++; + if (temp_r29->unk04 >= 8) { + if (diceSndStatus[temp_r29->unk00_field3] != -1) { + HuAudFXStop(diceSndStatus[temp_r29->unk00_field3]); + diceSndStatus[temp_r29->unk00_field3] = -1; + } + HuAudFXPlay(0x303); + HuAudFXPlay(0x30C); + temp_r29->unk00_field2 = 3; + temp_r29->unk04 = 0; + BoardDiceValueSet(temp_r29->unk00_field3, diceValue[temp_r29->unk00_field3]); + diceEff[temp_r29->unk00_field3] = BoardDiceEffectCreate(); + Hu3DParManPosSet(diceEff[temp_r29->unk00_field3], arg0->trans.x, arg0->trans.y, arg0->trans.z); + BoardModelVisibilitySet(diceMdl[temp_r29->unk00_field3], 0); + } else { + OSs16tof32(&temp_r29->unk04, &temp_f29); + if (temp_r29->unk04 < 4) { + arg0->trans.y += 10.0f + (0.5f * temp_f29); + arg0->scale.x = (arg0->scale.x + (0.10000000149011612 * sin((M_PI * (4.0f * temp_f29)) / 180.0))); + arg0->scale.y = arg0->scale.x; + arg0->scale.z = arg0->scale.x; + } else { + BoardModelAlphaSet(diceMdl[temp_r29->unk00_field3], 0xFF - (temp_r29->unk04 << 5)); + } + arg0->trans.y += -0.49f * temp_f29 * temp_f29; + } + break; + case 3: + break; + } + if (diceEff[temp_r29->unk00_field3] != -1 && ++temp_r29->unk04 >= 150) { + temp_r29->unk00_field0 = 1; + DiceHideEffect(temp_r29->unk00_field3, 0); + } + if (temp_r29->unk00_field1 == 0 || temp_r29->unk00_field2 != 3) { + if (temp_r29->unk02++ > temp_r29->unk01) { + temp_r29->unk02 = 0; + temp_r26 = BoardModelMotionTimeGet(diceMdl[temp_r29->unk00_field3]); + do { + temp_r27 = BoardRandMod(maxRoll); + } while (temp_r27 == temp_r26); + BoardModelMotionTimeSet(diceMdl[temp_r29->unk00_field3], temp_r27 + 0.5f); + } + } + BoardModelPosSet(diceMdl[temp_r29->unk00_field3], arg0->trans.x, arg0->trans.y, arg0->trans.z); + BoardModelRotSet(diceMdl[temp_r29->unk00_field3], arg0->rot.x, arg0->rot.y, arg0->rot.z); + BoardModelScaleSet(diceMdl[temp_r29->unk00_field3], arg0->scale.x, arg0->scale.y, arg0->scale.z); +} + +static void DicePause(s32 arg0) { + omObjData *temp_r31 = diceObj[arg0]; + + if (temp_r31) { + OM_GET_WORK_PTR(temp_r31, DiceWork)->unk00_field0 = 1; + } +} + +static void DicePauseAll(void) { + DicePause(0); + DicePause(1); + DicePause(2); +} + +s16 BoardDiceEffectCreate(void) { + s16 temp_r31; + s16 temp_r30; + AnimData *temp_r29; + void *temp_r28; + + temp_r28 = HuDataSelHeapReadNum(0x7006B, MEMORY_DEFAULT_NUM, HEAP_DATA); + temp_r29 = HuSprAnimRead(temp_r28); + temp_r31 = Hu3DParManCreate(temp_r29, 0x64, &diceEffParam); + Hu3DParManAttrSet(temp_r31, 0x108); + Hu3DParManRotSet(temp_r31, 0.0f, 0.0f, 0.0f); + Hu3DParManVecSet(temp_r31, 0.0f, 0.4f, 0.2f); + Hu3DParManTimeLimitSet(temp_r31, 0x96); + temp_r30 = Hu3DParManModelIDGet(temp_r31); + Hu3DModelLayerSet(temp_r30, 1); + Hu3DParticleBlendModeSet(temp_r30, 0); + return temp_r31; +} + +static void DiceHideEffect(s32 arg0, s32 arg1) { + s16 temp_r31; + + if (diceEff[arg0] == -1) { + return; + } + temp_r31 = Hu3DParManModelIDGet(diceEff[arg0]); + if (arg1 != 0) { + Hu3DModelAttrReset(temp_r31, 1); + } else { + Hu3DModelAttrSet(temp_r31, 1); + } +} + +void BoardDicePauseAll(void) { + DiceDigitWork *temp_r30; + s32 i; + + for (i = 0; i < numDice; i++) { + if (diceDigitObj[i]) { + temp_r30 = OM_GET_WORK_PTR(diceDigitObj[i], DiceDigitWork); + temp_r30->unk00_field1 = 1; + temp_r30->unk00_field2 = 1; + temp_r30->unk02 = 0; + } + } +} + +BOOL BoardDiceDoneCheck(void) { + DiceDigitWork *temp_r30; + s32 i; + + for (i = 0; i < numDice; i++) { + if (diceDigitObj[i]) { + temp_r30 = OM_GET_WORK_PTR(diceDigitObj[i], DiceDigitWork); + if (temp_r30->unk00_field2 != 0) { + return FALSE; + } + } + } + return TRUE; +} + +void BoardDiceStop(s32 arg0) { + DiceDigitWork *temp_r31; + + if (!diceDigitObj[arg0]) { + return; + } + temp_r31 = OM_GET_WORK_PTR(diceDigitObj[arg0], DiceDigitWork); + temp_r31->unk00_field0 = 1; +} + +void BoardDiceVisibleSet(s32 arg0, s32 arg1) { + DiceDigitWork *temp_r31; + + if (!diceDigitObj[arg0]) { + return; + } + temp_r31 = OM_GET_WORK_PTR(diceDigitObj[arg0], DiceDigitWork); + if ((temp_r31->unk01 / 10) == 0) { + BoardModelVisibilitySet(temp_r31->unk04[1], 0); + } else { + BoardModelVisibilitySet(temp_r31->unk04[1], arg1); + } + BoardModelVisibilitySet(temp_r31->unk04[0], arg1); +} + +void BoardDiceValueSet(s32 arg0, s32 arg1) { + omObjData *temp_r27; + DiceDigitWork *temp_r31; + Vec spC; + s16 sp8[2]; + s16 temp_r30; + s16 i; + + if (arg1 > 0x63) { + arg1 = 0x63; + } + sp8[0] = (arg1 % 10); + sp8[1] = (arg1 / 10); + BoardPlayerPosGet(GWSystem.player_curr, &spC); + spC.y += 300.0f; + temp_r27 = omAddObjEx(boardObjMan, 0x102, 0, 0, -1, DiceDigitMain); + temp_r31 = OM_GET_WORK_PTR(temp_r27, DiceDigitWork); + temp_r31->unk00_field0 = 0; + temp_r31->unk00_field1 = 0; + temp_r31->unk00_field2 = 0; + temp_r31->unk00_field3 = arg0; + temp_r31->unk08 = 0.3f; + temp_r31->unk01 = arg1; + temp_r31->unk02 = 360; + for (i = 0; i < 2; i++) { + temp_r30 = BoardModelCreate(diceDigitMdlTbl[sp8[i]], NULL, 0); + BoardModelPosSetV(temp_r30, &spC); + BoardModelMotionStart(temp_r30, 0, 0); + BoardModelMotionSpeedSet(temp_r30, 0.0f); + BoardModelMotionTimeSet(temp_r30, 0.0f); + BoardModelScaleSet(temp_r30, 0.143f, 0.143f, 0.143f); + temp_r31->unk04[i] = temp_r30; + } + if (sp8[1] == 0) { + BoardModelVisibilitySet(temp_r31->unk04[1], 0); + } + diceDigitObj[arg0] = temp_r27; +} + +static void DiceDigitMain(omObjData *arg0) { + DiceDigitWork *temp_r31 = OM_GET_WORK_PTR(arg0, DiceDigitWork); + + if (temp_r31->unk00_field0 != 0 || BoardIsKill()) { + DiceDigitKill(temp_r31); + diceDigitObj[temp_r31->unk00_field3] = NULL; + omDelObjEx(HuPrcCurrentGet(), arg0); + return; + } + DiceDigitMove(temp_r31, temp_r31->unk00_field1); + DiceDigitRotate(temp_r31, temp_r31->unk00_field1); +} + +static void DiceDigitKill(DiceDigitWork *arg0) { + s32 i; + + for (i = 0; i < 2; i++) { + if (arg0->unk04[i] != -1) { + BoardModelKill(arg0->unk04[i]); + } + } +} + +static void DiceKill(void) { + DiceDigitWork *temp_r29; + s32 i; + + for (i = 0; i < 3; i++) { + if (diceDigitObj[i]) { + temp_r29 = OM_GET_WORK_PTR(diceDigitObj[i], DiceDigitWork); + DiceDigitKill(temp_r29); + } + } +} + +static void DiceDigitMove(DiceDigitWork *arg0, s32 arg1) { + s32 sp8 = 0; + Vec sp30; + Vec sp24; + Vec sp54[2]; + Vec sp18 = { 288.0f, 155.0f, 240.0f }; + Vec sp3C[2] = { + { 144.0f, 155.0f, 240.0f }, + { 432.0f, 155.0f, 240.0f } + }; + Vec sp6C[3] = { + { 144.0f, 155.0f, 240.0f }, + { 432.0f, 155.0f, 240.0f }, + { 288.0f, 155.0f, 240.0f } + }; + Vec spC = { 288.0f, 176.0f, 240.0f }; + Vec *var_r29; + float var_f31; + s16 var_r27; + s16 i; + + var_r27 = (arg0->unk01 / 10); + if (arg1 != 0) { + var_r29 = &spC; + var_f31 = -20.0f * arg0->unk00_field3; + } else { + switch (numDice) { + case 1: + var_r29 = &sp18; + break; + case 2: + var_r29 = &sp3C[arg0->unk00_field3]; + break; + case 3: + var_r29 = &sp6C[arg0->unk00_field3]; + break; + } + var_f31 = 0.0f; + } + for (i = 0; i < 2; i++) { + if (var_r27 == 0) { + sp54[i].x = var_r29->x; + } else if (i != 0) { + sp54[i].x = var_r29->x - 30.0f; + } else { + sp54[i].x = var_r29->x + 30.0f; + } + sp54[i].y = var_r29->y; + sp54[i].z = var_r29->z + var_f31; + } + for (i = 0; i < 2; i++) { + BoardModelPosGet(arg0->unk04[i], &sp30); + Hu3D2Dto3D(&sp54[i], 1, &sp54[i]); + PSVECSubtract(&sp54[i], &sp30, &sp24); + if (PSVECMag(&sp24) < 0.01f) { + arg0->unk00_field2 = 0; + if (arg1 != 0 && arg0->unk00_field3 != 0) { + BoardModelVisibilitySet(arg0->unk04[i], 0); + } + } else { + arg0->unk00_field2 = 1; + } + PSVECScale(&sp24, &sp24, arg0->unk08); + PSVECAdd(&sp30, &sp24, &sp30); + BoardModelPosSetV(arg0->unk04[i], &sp30); + } +} + +static void DiceDigitRotate(DiceDigitWork *arg0, s32 arg1) { + float var_f30; + s32 i; + + if (arg1 != 0) { + arg0->unk02 += 0x12; + if (arg0->unk02 >= 360) { + arg0->unk02 = 360; + } + } else { + arg0->unk02 -= 0x12; + if (arg0->unk02 <= 0) { + arg0->unk02 = 0; + } + } + OSs16tof32(&arg0->unk02, &var_f30); + for (i = 0; i < 2; i++) { + if (arg0->unk04[i] != -1) { + BoardModelRotSet(arg0->unk04[i], 0.0f, var_f30, 0.0f); + } + } +} + +static void SameRollExec(void) { + Vec sp8; + float var_f31; + s32 var_r28; + s32 temp_r27; + s32 var_r31; + s32 i; + s32 var_r29; + + temp_r27 = -1; + BoardPauseDisableSet(1); + var_r28 = 0x50; + switch (numDice) { + case 2: + if (diceValue[0] == 7) { + var_r31 = 0x1E; + } else { + var_r31 = 0xA; + } + break; + case 3: + if (diceValue[0] == 7) { + var_r31 = 0x32; + var_r28 = 0x118; + } else if (diceValue[0] & 1) { + var_r31 = 0x1E; + } else { + var_r31 = 0xA; + } + break; + default: + return; + } + sprintf(sameRollCoinStr, "%d", var_r31); + BoardPlayerPosGet(rollPlayer, &sp8); + if (BoardPlayerSizeGet(rollPlayer) == 2 || GWPlayer[rollPlayer].bowser_suit != 0) { + sp8.y += 700.0f; + var_f31 = 450.0f; + } else { + sp8.y += 600.0f; + var_f31 = 300.0f; + } + BoardConfettiCreate(&sp8, var_r28, var_f31); + BoardAudSeqPause(0, 1, 0x3E8); + HuPrcSleep(0xA); + temp_r27 = HuAudSStreamPlay(9); + while (HuAudSStreamStatGet(temp_r27) != 0) { + HuPrcVSleep(); + } + BoardAudSeqPause(0, 0, 0x3E8); + BoardWinCreate(0, 0x90000, -1); + BoardWinInsertMesSet(sameRollCoinStr, 0); + BoardWinWait(); + BoardWinKill(); + if (var_r31 >= 0x32) { + var_r29 = 1; + } else if (var_r31 >= 0x14) { + var_r29 = 3; + } else { + var_r29 = 6; + } + for (i = 0; i < var_r31; i++) { + BoardPlayerCoinsAdd(rollPlayer, 1); + HuAudFXPlay(7); + HuPrcSleep(var_r29); + } + HuAudFXPlay(0xF); + BoardConfettiStop(); + BoardPauseDisableSet(0); +} + +static s32 GetBtnRoll(s32 arg0) { + s32 var_r31 = 0; + s32 var_r29; + + if (boardTutorialUseItem >= 0 && boardTutorialUseItem <= 0xD) { + var_r31 = 0x200; + return var_r31; + } + if (_CheckFlag(0x1000B)) { + var_r31 = 0x100; + return var_r31; + } + if (!GWPlayer[arg0].com) { + var_r29 = GWPlayer[arg0].port; + var_r31 = HuPadBtnDown[var_r29]; + return var_r31; + } + if (_CheckFlag(0x10009) || BoardRollTypeGet() != -1) { + return 0x100; + } + var_r31 = GetComBtnRoll(arg0); + return var_r31; +} + +static s32 GetComBtnRoll(s32 arg0) { + if (BoardRollTypeGet() != -1 || BoardPlayerItemCount(arg0) == 0 || BoardRollResizeCheck() || _CheckFlag(0x10009)) { + return 0x100; + } + if (BoardComUseItemCheck(arg0)) { + return 0x200; + } + return 0x100; +} + +void BoardRollTutorialSet(s16 *arg0) { + s32 i; + + for (i = 0; i < 3; i++) { + tutorialRoll[i] = arg0[i]; + } + tutorialRollF = 1; +}