464 lines
No EOL
14 KiB
C
464 lines
No EOL
14 KiB
C
#include "REL/w02Dll.h"
|
|
|
|
// Temporary defines
|
|
#define BOARD_ITEM_MINI 0x0
|
|
#define BOARD_ITEM_MEGA 0x1
|
|
#define BOARD_ITEM_SUPERMINI 0x2
|
|
#define BOARD_ITEM_SUPERMEGA 0x3
|
|
#define BOARD_ITEM_HAMMER 0x4
|
|
#define BOARD_ITEM_PIPE 0x5
|
|
#define BOARD_ITEM_CARD 0x6
|
|
#define BOARD_ITEM_SPARKY 0x7
|
|
#define BOARD_ITEM_GADDLIGHT 0x8
|
|
#define BOARD_ITEM_CHOMPCALL 0x9
|
|
#define BOARD_ITEM_SUIT 0xA
|
|
#define BOARD_ITEM_BOO 0xB
|
|
#define BOARD_ITEM_LAMP 0xC
|
|
#define BOARD_ITEM_BAG 0xD
|
|
#define BOARD_ITEM_MAX 0xE
|
|
#define BOARD_ITEM_NONE -1
|
|
|
|
typedef struct ModelTransform {
|
|
/* 0x00 */ Vec pos;
|
|
/* 0x0C */ Vec rot;
|
|
/* 0x18 */ Vec scale;
|
|
/* 0x24 */ s32 id;
|
|
} ModelTransform;
|
|
|
|
/* BSS */
|
|
s16 lbl_1_bss_30[0x10]; // Model List
|
|
s16 lbl_1_bss_2E;
|
|
s16 lbl_1_bss_2C;
|
|
Point3d lbl_1_bss_20;
|
|
Point3d lbl_1_bss_14;
|
|
s32* lbl_1_bss_10;
|
|
s16 lbl_1_bss_8[4]; // Item List
|
|
Process* lbl_1_bss_4;
|
|
u8* lbl_1_bss_0;
|
|
|
|
/* DATA */
|
|
ModelTransform lbl_1_data_0[0x10] = {
|
|
{{2550.0f, 0.0f, -450.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, MAKE_DATA_NUM(0x0076, 0x000C)},
|
|
{{-3150.0f, 0.0f, -1350.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, MAKE_DATA_NUM(0x0076, 0x000D)},
|
|
{{-3150.0f, 0.0f, 1650.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, MAKE_DATA_NUM(0x0076, 0x000E)},
|
|
{{-150.0f, 0.0f, 900.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, MAKE_DATA_NUM(0x0076, 0x0008)},
|
|
{{-150.0f, 0.0f, 900.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, MAKE_DATA_NUM(0x0076, 0x0009)},
|
|
{{-150.0f, 0.0f, 900.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, MAKE_DATA_NUM(0x0076, 0x000A)},
|
|
{{-150.0f, 0.0f, 900.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, MAKE_DATA_NUM(0x0076, 0x000B)},
|
|
{{1350.0f, 0.0f, -300.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, MAKE_DATA_NUM(0x0076, 0x0011)},
|
|
{{1350.0f, 0.0f, -300.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, MAKE_DATA_NUM(0x0076, 0x0012)},
|
|
{{1350.0f, 0.0f, -300.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, MAKE_DATA_NUM(0x0076, 0x0015)},
|
|
{{-300.0f, 0.0f, -900.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, MAKE_DATA_NUM(0x0076, 0x0016)},
|
|
{{1175.0f, 0.0f, -125.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, MAKE_DATA_NUM(0x0002, 0x0005)},
|
|
{{-525.0f, 0.0f, -825.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, MAKE_DATA_NUM(0x0002, 0x0005)},
|
|
{{-2225.0f, 0.0f, -2100.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, MAKE_DATA_NUM(0x0002, 0x0005)},
|
|
{{1925.0f, 0.0f, -2100.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, MAKE_DATA_NUM(0x0002, 0x0005)},
|
|
{{150.0f, 0.0f, 1650.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, MAKE_DATA_NUM(0x0002, 0x0005)},
|
|
};
|
|
|
|
// Special Models
|
|
s16 lbl_1_data_280 = -1;
|
|
s16 lbl_1_data_282 = -1;
|
|
s16 lbl_1_data_284 = -1;
|
|
s16 lbl_1_data_286 = -1;
|
|
|
|
s32 lbl_1_data_288[] = {
|
|
MAKE_DATA_NUM(0x0076, 0x0004),
|
|
DATA_NUM_LISTEND
|
|
};
|
|
s32 lbl_1_data_290[] = {
|
|
MAKE_DATA_NUM(0x0076, 0x0004),
|
|
MAKE_DATA_NUM(0x0076, 0x0004),
|
|
MAKE_DATA_NUM(0x0076, 0x0004),
|
|
MAKE_DATA_NUM(0x0076, 0x0004),
|
|
DATA_NUM_LISTEND,
|
|
0x00000000 // Padding
|
|
};
|
|
|
|
/* Functions */
|
|
//Actual externs
|
|
extern void BoardMusStart(s32, s32, s32, s32);
|
|
extern void BoardAudSeqPause(s32, s32, s32);
|
|
s8 BoardComPreferItemCheck(s32, s8, s8, s8);
|
|
extern void BoardComKeySetLeft();
|
|
extern void BoardComKeySetRight();
|
|
extern void CharModelDataClose(s16);
|
|
extern u32 frand();
|
|
extern u32 frandmod(u32);
|
|
|
|
// function is probably global. only inlined in rels?
|
|
inline s32 get_current_board(void) {
|
|
return GWSystem.board;
|
|
}
|
|
|
|
void BoardCreate(void) {
|
|
s32 i, boardData;
|
|
ModelTransform* modelTransform;
|
|
|
|
boardData = get_current_board();
|
|
lbl_1_bss_0 = GWSystem.board_data;
|
|
BoardSpaceInit(0x760000);
|
|
lbl_1_data_280 = BoardModelCreate(0x760001, NULL, 0);
|
|
fn_8006DDE8(lbl_1_data_280, -1.0f);
|
|
BoardModelPosSet(lbl_1_data_280, 0.0f, 0.0f, 0.0f);
|
|
BoardModelMotionStart(lbl_1_data_280, 0, 0x40000001);
|
|
BoardModelMotionSpeedSet(lbl_1_data_280, 0.1f);
|
|
lbl_1_data_282 = BoardModelCreate(0x760002, NULL, 0);
|
|
fn_8006DDE8(lbl_1_data_282, -1.0f);
|
|
BoardModelPosSet(lbl_1_data_282, 0.0f, 0.0f, 0.0f);
|
|
BoardModelMotionStart(lbl_1_data_282, 0, 0x40000001);
|
|
lbl_1_data_284 = BoardModelCreate(0x760003, lbl_1_data_288, 0);
|
|
BoardModelPosSet(lbl_1_data_284, 0.0f, 0.0f, 0.0f);
|
|
BoardModelMotionStart(lbl_1_data_284, 1, 0x40000001);
|
|
lbl_1_data_286 = BoardModelCreate(0x20005, lbl_1_data_290, 0);
|
|
BoardModelMotionStart(lbl_1_data_286, 1, 0x40000001);
|
|
BoardLightHookSet(fn_1_72C, fn_1_770);
|
|
|
|
for(i = 0; i < 0x10; i++) {
|
|
modelTransform = &lbl_1_data_0[i];
|
|
if (modelTransform->id != -1) {
|
|
if ((i == 0xB) || (i == 0xC) || (i == 0xD) || (i == 0xE) || (i == 0xF)) {
|
|
lbl_1_bss_10 = lbl_1_data_290;
|
|
} else {
|
|
lbl_1_bss_10 = NULL;
|
|
}
|
|
lbl_1_bss_30[i] = BoardModelCreate(modelTransform->id, lbl_1_bss_10, 0);
|
|
BoardModelPosSetV(lbl_1_bss_30[i], &modelTransform->pos);
|
|
BoardModelRotSetV(lbl_1_bss_30[i], &modelTransform->rot);
|
|
BoardModelScaleSetV(lbl_1_bss_30[i], &modelTransform->scale);
|
|
BoardModelVisibilitySet(lbl_1_bss_30[i], 1);
|
|
if (lbl_1_bss_10 != NULL) {
|
|
BoardModelMotionStart(lbl_1_bss_30[i], 1, 0x40000001);
|
|
}
|
|
}
|
|
}
|
|
|
|
BoardModelAttrSet(lbl_1_bss_30[0], 0x40000002);
|
|
BoardModelAttrSet(lbl_1_bss_30[1], 0x40000002);
|
|
BoardModelAttrSet(lbl_1_bss_30[2], 0x40000002);
|
|
fn_1_BC1C();
|
|
fn_1_92C();
|
|
BoardModelPosGet(lbl_1_bss_30[13], &lbl_1_bss_20);
|
|
BoardModelPosGet(lbl_1_bss_30[14], &lbl_1_bss_14);
|
|
lbl_1_bss_2E = BoardModelCreate(0x760010, NULL, 1);
|
|
lbl_1_bss_2C = BoardModelCreate(0x760010, NULL, 1);
|
|
fn_1_9250();
|
|
BoardSpaceWalkEventFuncSet(fn_1_800);
|
|
BoardSpaceWalkMiniEventFuncSet(fn_1_1128);
|
|
BoardSpaceLandEventFuncSet(fn_1_774);
|
|
BoardStarHostSet(lbl_1_data_284);
|
|
BoardBooHouseHostSet(lbl_1_data_286);
|
|
BoardLotteryHostSet(lbl_1_data_286);
|
|
BoardShopHostSet(lbl_1_data_286);
|
|
BoardJunctionMaskSet(0xE);
|
|
BoardJunctionMaskSet(0x30);
|
|
}
|
|
|
|
void BoardDestroy(void) {
|
|
/* Kill Model List */
|
|
s32 i;
|
|
for (i = 0; i < 0x10; i++) {
|
|
if (lbl_1_bss_30[i] != 0) {
|
|
BoardModelKill(lbl_1_bss_30[i]);
|
|
lbl_1_bss_30[i] = 0;
|
|
}
|
|
}
|
|
|
|
/* Kill Special Models */
|
|
if (lbl_1_data_286 != -1) {
|
|
BoardModelKill(lbl_1_data_286);
|
|
lbl_1_data_286 = -1;
|
|
}
|
|
if (lbl_1_data_284 != -1) {
|
|
BoardModelKill(lbl_1_data_284);
|
|
lbl_1_data_284 = -1;
|
|
}
|
|
if (lbl_1_data_280 != -1) {
|
|
BoardModelKill(lbl_1_data_280);
|
|
lbl_1_data_280 = -1;
|
|
}
|
|
if (lbl_1_data_282 != -1) {
|
|
BoardModelKill(lbl_1_data_282);
|
|
lbl_1_data_282 = -1;
|
|
}
|
|
BoardSpaceDestroy();
|
|
}
|
|
|
|
void fn_1_72C(void) {
|
|
s16 var = BoardModelIDGet(lbl_1_data_280);
|
|
Hu3DModelLightInfoSet(var, 1);
|
|
}
|
|
|
|
void fn_1_770(void) {
|
|
|
|
}
|
|
|
|
/* Decrement current space's [UNKNOWN] flag */
|
|
s32 fn_1_774(void) {
|
|
u32 unkFlag;
|
|
u32 currPlayer;
|
|
u32 currSpace;
|
|
u32 spaceFlags;
|
|
currPlayer = GWSystem.player_curr;
|
|
currSpace = GWPlayer[currPlayer].space_curr;
|
|
spaceFlags = BoardSpaceFlagGet(0, currSpace);
|
|
//temp_r31 = (temp_r)
|
|
unkFlag = (spaceFlags & 0x1C0) >> 6;
|
|
if (unkFlag != 0) {
|
|
unkFlag--;
|
|
fn_1_93C8(unkFlag);
|
|
}
|
|
}
|
|
|
|
/* Check if can iteract with board object? */
|
|
s32 fn_1_800(void) {
|
|
BoardSpace* currSpace;
|
|
s32 currPlayer;
|
|
s32 var_r29;
|
|
|
|
currPlayer = GWSystem.player_curr;
|
|
currSpace = BoardSpaceGet(0, GWPlayer[currPlayer].space_curr);
|
|
if ((currSpace->flag & 0x30) != 0) {
|
|
|
|
|
|
// If mega mushroom state return
|
|
if (BoardPlayerSizeGet(currPlayer) == 2) {
|
|
return 0;
|
|
}
|
|
// If using the bowser suit return
|
|
if (GWPlayer[currPlayer].bowser_suit) {
|
|
return 0;
|
|
}
|
|
|
|
if ((currSpace->flag & 0x20) != 0 && (currSpace->flag & 0x10) != 0) {
|
|
var_r29 = 2;
|
|
} else if ((currSpace->flag & 0x20) != 0) {
|
|
var_r29 = 1;
|
|
} else {
|
|
var_r29 = 0;
|
|
}
|
|
fn_1_394C(var_r29);
|
|
return 1;
|
|
}
|
|
if ((currSpace->flag & 1) != 0) {
|
|
fn_1_E41C();
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void fn_1_92C(void) {
|
|
fn_1_39F4();
|
|
fn_1_5CF8();
|
|
}
|
|
|
|
void fn_1_950(void) {
|
|
|
|
}
|
|
|
|
void fn_1_954(void) {
|
|
HuPrcSleep(0x3C);
|
|
BoardMusStart(1, 0x12, 0x7F, 0);
|
|
HuPrcEnd();
|
|
}
|
|
|
|
void fn_1_990(void) {
|
|
Vec rotation;
|
|
Vec offset;
|
|
Vec boardSpacePos;
|
|
|
|
s32 textChoice;
|
|
s32 currPlayer;
|
|
s32 currSpace;
|
|
s32 spaceLinkFlag;
|
|
|
|
|
|
currPlayer = GWSystem.player_curr;
|
|
BoardWinCreateChoice(2, 0x130011U, 4, 0);
|
|
if (GWPlayer[currPlayer].com) {
|
|
if ((s32) (frand() & 1) != 0) {
|
|
BoardComKeySetLeft();
|
|
} else {
|
|
BoardComKeySetRight();
|
|
}
|
|
}
|
|
BoardWinWait();
|
|
BoardWinKill();
|
|
textChoice = BoardWinChoiceGet();
|
|
if ((textChoice == 1) || (textChoice == -1)) {
|
|
BoardWinCreate(2, 0x130012U, 4);
|
|
BoardWinWait();
|
|
BoardWinKill();
|
|
BoardMGExit();
|
|
while (BoardMGDoneFlagGet() != 1) {
|
|
HuPrcVSleep();
|
|
}
|
|
BoardMGDoneFlagSet(0);
|
|
return;
|
|
}
|
|
BoardAudSeqPause(0, 1, 0x3E8);
|
|
HuPrcChildCreate(fn_1_954, 0x2003U, 0x1000U, 0, boardMainProc);
|
|
rotation.x = 0.0f;
|
|
rotation.y = rotation.z = 0.0f;
|
|
offset.y = 135.0f;
|
|
offset.x = offset.z = 0.0f;
|
|
BoardCameraMotionStartEx(lbl_1_bss_30[8], &rotation, &offset, 1200.0f, 25.0f, 0x15);
|
|
currSpace = GWPlayer[currPlayer].space_curr;
|
|
spaceLinkFlag = BoardSpaceLinkFlagSearch(0, currSpace, 0x02000000U);
|
|
BoardSpacePosGet(0, spaceLinkFlag, &boardSpacePos);
|
|
BoardPlayerMoveBetween(currPlayer, currSpace, spaceLinkFlag);
|
|
while (GWPlayer[currPlayer].moving) {
|
|
HuPrcVSleep();
|
|
}
|
|
BoardPlayerMotionStart(currPlayer, 1, 0x40000001);
|
|
fn_1_3BF4();
|
|
|
|
while (GWPlayer[currPlayer].moving) {
|
|
HuPrcVSleep();
|
|
}
|
|
while (BoardEventFlagGet() != 0) {
|
|
HuPrcVSleep();
|
|
}
|
|
while (GWPlayer[currPlayer].moving) {
|
|
HuPrcVSleep();
|
|
}
|
|
BoardPlayerMotionStart(currPlayer, 1, 0x40000001);
|
|
}
|
|
|
|
void fn_1_C50(void) {
|
|
Vec rotation;
|
|
Vec offset;
|
|
s32 currSpace;
|
|
s32 spaceLinkFlags;
|
|
s32 textChoice;
|
|
s32 currPlayer;
|
|
s32 i, j;
|
|
|
|
currPlayer = GWSystem.player_curr;
|
|
if (BoardPlayerItemCount((s32) currPlayer) == 3) {
|
|
BoardWinCreate(2, 0x13001A, 4);
|
|
BoardWinWait();
|
|
BoardWinKill();
|
|
HuPrcEnd();
|
|
}
|
|
BoardCameraTargetModelSet(lbl_1_bss_30[10]);
|
|
BoardCameraMotionWait();
|
|
|
|
/* Generate three random unique items where
|
|
the first item is MINI_MUSHROOM and the
|
|
other two are not BOWSER_SUIT or ITEM_BAG.
|
|
*/
|
|
lbl_1_bss_8[0] = BOARD_ITEM_MINI;
|
|
for (i = 1; i < 3;) {
|
|
lbl_1_bss_8[i] = frandmod(BOARD_ITEM_MAX);
|
|
if (lbl_1_bss_8[i] != BOARD_ITEM_SUIT && lbl_1_bss_8[i] != BOARD_ITEM_BAG) {
|
|
for (j = 0; j < i; j++) {
|
|
if (lbl_1_bss_8[i] == lbl_1_bss_8[j]) {
|
|
lbl_1_bss_8[i] = BOARD_ITEM_NONE;
|
|
}
|
|
}
|
|
if (lbl_1_bss_8[i] != BOARD_ITEM_NONE) {
|
|
i++;
|
|
}
|
|
}
|
|
}
|
|
fn_1_79BC(lbl_1_bss_8);
|
|
|
|
HuAudFXPlay(0x43);
|
|
BoardWinCreateChoice(2, 0x130016, 4, 0);
|
|
if (GWPlayer[currPlayer].com) {
|
|
if (BoardComPreferItemCheck(currPlayer, lbl_1_bss_8[0], lbl_1_bss_8[1], lbl_1_bss_8[2]) != -1) {
|
|
BoardComKeySetLeft();
|
|
} else {
|
|
BoardComKeySetRight();
|
|
}
|
|
}
|
|
BoardWinWait();
|
|
BoardWinKill();
|
|
textChoice = BoardWinChoiceGet();
|
|
if ((textChoice == 1) || (textChoice == -1)) {
|
|
HuAudFXPlay(0x44);
|
|
BoardWinCreate(2, 0x130017, 4);
|
|
BoardWinWait();
|
|
BoardWinKill();
|
|
BoardMGExit();
|
|
fn_1_8244(1);
|
|
while (BoardMGDoneFlagGet() != 1) {
|
|
HuPrcVSleep();
|
|
}
|
|
BoardMGDoneFlagSet(0);
|
|
fn_1_5F90();
|
|
HuPrcEnd();
|
|
}
|
|
rotation.x = -30.0f;
|
|
rotation.y = rotation.z = 0.0f;
|
|
offset.x = 0.0f;
|
|
offset.y = 0.0f;
|
|
offset.z = -250.0f;
|
|
BoardCameraMotionStartEx(lbl_1_bss_30[10], (Point3d* ) &rotation, (Point3d* ) &offset, 1500.0f, 25.0f, 0x15);
|
|
currSpace = GWPlayer[currPlayer].space_curr;
|
|
spaceLinkFlags = BoardSpaceLinkFlagSearch(0, currSpace, 0x02000000U);
|
|
BoardPlayerMoveBetween(currPlayer, currSpace, spaceLinkFlags);
|
|
while (GWPlayer[currPlayer].moving) {
|
|
HuPrcVSleep();
|
|
}
|
|
BoardPlayerMotionStart((s32) currPlayer, 1, 0x40000001);
|
|
BoardPlayerMotBlendSet(currPlayer, 0xB4, 0xF);
|
|
while (BoardPlayerMotBlendCheck(currPlayer) == 0) {
|
|
HuPrcVSleep();
|
|
}
|
|
BoardCameraMotionWait();
|
|
fn_1_5D28();
|
|
while (BoardEventFlagGet() != 0) {
|
|
HuPrcVSleep();
|
|
}
|
|
fn_1_8244(0);
|
|
while (GWPlayer[currPlayer].moving) {
|
|
HuPrcVSleep();
|
|
}
|
|
fn_1_5F90();
|
|
BoardPlayerMotionStart((s32) currPlayer, 1, 0x40000001);
|
|
HuPrcEnd();
|
|
}
|
|
|
|
void fn_1_1070(void) {
|
|
BoardWinKill();
|
|
CharModelDataClose(-1);
|
|
lbl_1_bss_4 = 0;
|
|
}
|
|
|
|
void fn_1_10A8(void) {
|
|
lbl_1_bss_4 = HuPrcChildCreate(fn_1_C50, 0x2003U, 0x2000U, 0, boardMainProc);
|
|
HuPrcDestructorSet2(lbl_1_bss_4, fn_1_1070);
|
|
while (lbl_1_bss_4) {
|
|
HuPrcVSleep();
|
|
}
|
|
}
|
|
|
|
s32 fn_1_1128(void) {
|
|
u32 spaceFlags;
|
|
s16 currSpace;
|
|
currSpace = GWPlayer[GWSystem.player_curr].space_curr;
|
|
spaceFlags = BoardSpaceFlagGet(0, currSpace) & 0x600000;
|
|
BoardDiceDigit2DShowSet(0);
|
|
|
|
if (spaceFlags & 0x200000) {
|
|
fn_1_990();
|
|
} else if (spaceFlags & 0x400000) {
|
|
lbl_1_bss_4 = HuPrcChildCreate(fn_1_C50, 0x2003U, 0x2000U, 0, boardMainProc);
|
|
HuPrcDestructorSet2(lbl_1_bss_4, fn_1_1070);
|
|
while (lbl_1_bss_4) {
|
|
HuPrcVSleep();
|
|
}
|
|
}
|
|
|
|
BoardDiceDigit2DShowSet(1);
|
|
}
|
|
|
|
void fn_1_121C(u32 arg0) {
|
|
BoardWinCreate(2, arg0, 4);
|
|
BoardWinWait();
|
|
BoardWinKill();
|
|
}
|
|
|
|
f32 const padMain = 0.0f; |