diff --git a/include/REL/w02Dll.h b/include/REL/w02Dll.h new file mode 100644 index 00000000..bf99e873 --- /dev/null +++ b/include/REL/w02Dll.h @@ -0,0 +1,47 @@ +#ifndef W02DLL +#define W02DLL + +#include "math.h" +#include "dolphin.h" +#include "game/process.h" +#include "game/gamework_data.h" +#include "game/board/model.h" +#include "game/board/space.h" +#include "game/board/main.h" +#include "game/board/player.h" +#include "game/board/window.h" +#include "game/board/map_object.h" + +extern s16 lbl_1_bss_30[0x10]; // Model List + +// main.c +extern void fn_1_770(); +extern void fn_1_72C(); +extern s32 fn_1_774(); +extern s32 fn_1_800(); +extern void fn_1_92C(); +extern s32 fn_1_1128(); +extern void fn_1_121C(u32); + +// roulette.c +extern void fn_1_D3AC(); +extern s32 fn_1_D8C4(); +extern void fn_1_DF48(); +// unorganized +extern void fn_1_394C(s32); +extern void fn_1_3BF4(); +extern void fn_1_39F4(); +extern void fn_1_5CF8(); +extern void fn_1_5D28(); +extern void fn_1_5F90(); +extern void fn_1_79BC(s16* itemList); +extern void fn_1_8244(s32); +extern void fn_1_9250(); +extern void fn_1_93C8(s32 spaceFlag); +extern void fn_1_BC1C(); +extern s32 fn_1_BE88(); +extern s32 fn_1_C108(s32); +extern void fn_1_CD04(s32); +extern void fn_1_E41C(); + +#endif //W02DLL \ No newline at end of file diff --git a/src/REL/w02Dll/gamble.c b/src/REL/w02Dll/gamble.c new file mode 100644 index 00000000..dcb77bfa --- /dev/null +++ b/src/REL/w02Dll/gamble.c @@ -0,0 +1,24 @@ +#include "REL/w02Dll.h" + +Process* lbl_1_bss_50; +s32 lbl_1_bss_54; + +void fn_1_2D04(); + + +void fn_1_3938(void) { + lbl_1_bss_50 = NULL; +} + + +void fn_1_394C(s32 arg0) { + s32 currPlayer; + currPlayer = GWSystem.player_curr; + + lbl_1_bss_54 = arg0; + lbl_1_bss_50 = HuPrcChildCreate(fn_1_2D04, 0x2003U, 0x2000U, 0, boardMainProc); + HuPrcDestructorSet2(lbl_1_bss_50, fn_1_3938); + while (lbl_1_bss_50) { + HuPrcVSleep(); + } +} \ No newline at end of file diff --git a/src/REL/w02Dll/main.c b/src/REL/w02Dll/main.c new file mode 100644 index 00000000..9981ac30 --- /dev/null +++ b/src/REL/w02Dll/main.c @@ -0,0 +1,457 @@ +#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 + +/* 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 */ +static BoardMapObject lbl_1_data_0[0x10] = { + {{2550.0f, 0.0f, -450.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, DATA_MAKE_NUM(0x0076, 0x000C)}, + {{-3150.0f, 0.0f, -1350.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, DATA_MAKE_NUM(0x0076, 0x000D)}, + {{-3150.0f, 0.0f, 1650.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, DATA_MAKE_NUM(0x0076, 0x000E)}, + {{-150.0f, 0.0f, 900.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, DATA_MAKE_NUM(0x0076, 0x0008)}, + {{-150.0f, 0.0f, 900.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, DATA_MAKE_NUM(0x0076, 0x0009)}, + {{-150.0f, 0.0f, 900.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, DATA_MAKE_NUM(0x0076, 0x000A)}, + {{-150.0f, 0.0f, 900.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, DATA_MAKE_NUM(0x0076, 0x000B)}, + {{1350.0f, 0.0f, -300.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, DATA_MAKE_NUM(0x0076, 0x0011)}, + {{1350.0f, 0.0f, -300.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, DATA_MAKE_NUM(0x0076, 0x0012)}, + {{1350.0f, 0.0f, -300.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, DATA_MAKE_NUM(0x0076, 0x0015)}, + {{-300.0f, 0.0f, -900.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, DATA_MAKE_NUM(0x0076, 0x0016)}, + {{1175.0f, 0.0f, -125.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, DATA_MAKE_NUM(0x0002, 0x0005)}, + {{-525.0f, 0.0f, -825.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, DATA_MAKE_NUM(0x0002, 0x0005)}, + {{-2225.0f, 0.0f, -2100.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, DATA_MAKE_NUM(0x0002, 0x0005)}, + {{1925.0f, 0.0f, -2100.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, DATA_MAKE_NUM(0x0002, 0x0005)}, + {{150.0f, 0.0f, 1650.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, DATA_MAKE_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[] = { + DATA_MAKE_NUM(0x0076, 0x0004), + DATA_NUM_LISTEND +}; +s32 lbl_1_data_290[] = { + DATA_MAKE_NUM(0x0076, 0x0004), + DATA_MAKE_NUM(0x0076, 0x0004), + DATA_MAKE_NUM(0x0076, 0x0004), + DATA_MAKE_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; + BoardMapObject* 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->data_num != -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->data_num, 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 mesg) { + BoardWinCreate(2, mesg, 4); + BoardWinWait(); + BoardWinKill(); +} + +f32 const padMain = 0.0f; \ No newline at end of file diff --git a/src/REL/w02Dll/roulette.c b/src/REL/w02Dll/roulette.c new file mode 100644 index 00000000..9105d06e --- /dev/null +++ b/src/REL/w02Dll/roulette.c @@ -0,0 +1,584 @@ +#include "REL/w02Dll.h" +#include "game/audio.h" + +#define ROULETTE_CHOICE_YES 0 +#define ROULETTE_CHOICE_NO 1 +#define ROULETTE_CHOICE_MAP 2 + +#define BRIBE_CHOICE_20 0 +#define BRIBE_CHOICE_10 1 +#define BRIBE_CHOICE_5 2 +#define BRIBE_CHOICE_NVM 3 +#define BRIBE_CHOICE_INVALID -1 + +/* RODATA */ +extern f32 lbl_1_rodata_408; +extern f32 lbl_1_rodata_40C; +extern f32 lbl_1_rodata_410; +extern f32 lbl_1_rodata_414; +extern f32 lbl_1_rodata_418; +extern f32 lbl_1_rodata_41C; +extern f32 lbl_1_rodata_420; +extern f32 lbl_1_rodata_424; +extern f32 lbl_1_rodata_428; +extern f32 lbl_1_rodata_42C; +extern f32 lbl_1_rodata_430; +extern f32 lbl_1_rodata_434; +extern f32 lbl_1_rodata_438; +extern f32 lbl_1_rodata_43C; +extern f32 lbl_1_rodata_440; +extern f32 lbl_1_rodata_444; +extern f32 lbl_1_rodata_448; +extern f64 lbl_1_rodata_450; +extern f64 lbl_1_rodata_458; +extern f32 lbl_1_rodata_460; +extern f32 lbl_1_rodata_464; +extern f32 lbl_1_rodata_468; +extern f32 lbl_1_rodata_46C; +extern f32 lbl_1_rodata_470; +extern f32 lbl_1_rodata_474; +extern f32 lbl_1_rodata_478; +extern f32 lbl_1_rodata_47C; +extern f64 lbl_1_rodata_480; +extern f64 lbl_1_rodata_488; +extern f32 lbl_1_rodata_490; +extern f32 lbl_1_rodata_494; +extern f64 lbl_1_rodata_498; +extern f64 lbl_1_rodata_4A0; +extern f32 lbl_1_rodata_4A8; +extern f32 lbl_1_rodata_4AC; +extern f32 lbl_1_rodata_4B0; +extern f32 lbl_1_rodata_4B8; +extern f32 lbl_1_rodata_4C0; +extern f32 lbl_1_rodata_4C4; +extern f32 lbl_1_rodata_4C8; +extern f32 lbl_1_rodata_4CC; +extern f64 lbl_1_rodata_4D0; +extern f32 lbl_1_rodata_4D8; +extern f32 lbl_1_rodata_4DC; + +/* DATA */ +extern s32 lbl_1_data_4D0[]; + +/* BSS */ +extern s32 lbl_1_bss_38C; +extern s16 lbl_1_bss_388; +extern s32 lbl_1_bss_384; +extern f32 lbl_1_bss_380; + +//Function Externs +extern s16 BoardBowserSuitModelGet(); +extern s16 BoardBowserSuitPlayerModelGet(); +extern void BoardComKeySetDown(); +extern void BoardComKeySetUp(); +extern void omVibrate(s16 player, s16 duration, s16 off, s16 on); +extern u32 frand(); + +//Local Functions +s32 fn_1_E2AC(void); +void fn_1_E310(f32); + +// Unknown Structures +typedef struct UnkPoint { + f32 unk00; + Vec point; +} UnkPoint; + + +/* FUNCTIONS */ +void fn_1_BC1C(void) { + Point3d sp8; + + BoardModelPosGet(lbl_1_bss_30[15], &sp8); + sp8.z -= lbl_1_rodata_408; + sp8.y += lbl_1_rodata_40C; + BoardModelPosSetV(lbl_1_bss_30[6], &sp8); + BoardModelAttrSet(lbl_1_bss_30[5], 0x40000002); + BoardModelMotionTimeSet(lbl_1_bss_30[5], lbl_1_rodata_410); + BoardModelRotGet(lbl_1_bss_30[15], &sp8); + sp8.y = lbl_1_rodata_410; + BoardModelRotSetV(lbl_1_bss_30[15], &sp8); +} + +void fn_1_BCFC(void) { + s32 spaceLinkFlags; + s32 temp_r30; + s32 temp_r29; + + BoardDiceDigit2DShowSet(0); + spaceLinkFlags = BoardSpaceLinkFlagSearch(0, (s32) GWPlayer[lbl_1_bss_388].space_curr, 2U); + BoardPlayerMoveToAsync(lbl_1_bss_388, spaceLinkFlags); + while (GWPlayer[lbl_1_bss_388].moving) { + HuPrcVSleep(); + } + BoardRotateDiceNumbers((s32) lbl_1_bss_388); + BoardCameraViewSet(2); + BoardCameraMotionWait(); + BoardPlayerMotBlendSet((s32) lbl_1_bss_388, 0x5A, 0xF); + while (BoardPlayerMotBlendCheck((s32) lbl_1_bss_388) == 0) { + HuPrcVSleep(); + } + BoardModelRotYSet(lbl_1_bss_30[15], lbl_1_rodata_414); + fn_1_121C(0x130000); + HuAudFXPlay(0x44); + temp_r29 = fn_1_BE88(); + BoardStatusShowSetAll(0); + fn_1_121C(0x130001); + temp_r30 = fn_1_C108(temp_r29); + fn_1_CD04(temp_r30); + BoardCameraViewSet(1); + BoardStatusShowSetAll(1); + BoardCameraMotionWait(); + BoardDiceDigit2DShowSet(1); + HuPrcKill(NULL); + while(TRUE) { + HuPrcVSleep(); + } +} + +s32 fn_1_BE74(void) { + lbl_1_bss_38C = 0; +} + +s32 fn_1_BE88(void) { + s32 coinAmount; + s32 var_r30; + s16 playerCoinRegion; + s32 bribeChoice; + s32 i; + s32 rouletteChoice; + s32 mesg; + + var_r30 = -1; + coinAmount = BoardPlayerCoinsGet((s32) lbl_1_bss_388); + if (coinAmount < 5) { + return var_r30; + } + fn_1_121C(0x130002); + + do { + BoardWinCreateChoice(2, 0x13001DU, 4, 0); + /* COM has 50% to bribe goomba */ + if (GWPlayer[lbl_1_bss_388].com) { + if (frand() & 1) { + BoardComKeySetRight(); + } else { + BoardComKeySetLeft(); + } + } + BoardWinWait(); + BoardWinKill(); + rouletteChoice = BoardWinChoiceGet(); + // If chose to play roulette + if (rouletteChoice == ROULETTE_CHOICE_YES) { + BoardWinCreateChoice(1, 0x130003U, 4, 0); + playerCoinRegion = 3; + if (coinAmount < 0x14) { + BoardWinChoiceDisable(0); + playerCoinRegion--; + } + if (coinAmount < 0xA) { + BoardWinChoiceDisable(1); + playerCoinRegion--; + } + /* COM always bribes max unless it has 20 or + more coins. Then 50% max, 50% 10 coin bribe. */ + if (GWPlayer[lbl_1_bss_388].com) { + if (playerCoinRegion < 2) { + BoardComKeySetUp(); + } else if (frand() & 1) { + BoardComKeySetUp(); + } else { + BoardComKeySetDown(); + } + } + BoardWinWait(); + BoardWinKill(); + bribeChoice = BoardWinChoiceGet(); + if (bribeChoice == BRIBE_CHOICE_INVALID || + bribeChoice == BRIBE_CHOICE_NVM) { + continue; + } + + // Coin amount is now the bribe amount in coins + switch (bribeChoice) { + case BRIBE_CHOICE_20: + mesg = 0x130004; + coinAmount = 0x14; + var_r30 = 0x5A; // 90% + break; + case BRIBE_CHOICE_10: + mesg = 0x130005; + coinAmount = 0xA; + var_r30 = 0x3C; // 60% + break; + case BRIBE_CHOICE_5: + mesg = 0x130006; + coinAmount = 5; + var_r30 = 0x1E; // 30% + break; + } + fn_1_121C(mesg); + + + for (i = 0; i < coinAmount; i++) { + BoardPlayerCoinsAdd(lbl_1_bss_388, -1); + HuAudFXPlay(0xE); + HuPrcSleep(6); + } + HuAudFXPlay(0xF); + // If chose to view map + } else if (rouletteChoice == ROULETTE_CHOICE_MAP) { + BoardViewMapExec(lbl_1_bss_388); + } + } while (rouletteChoice == ROULETTE_CHOICE_MAP); // While viewing map + if (var_r30 == -1) { + fn_1_121C(0x130007); + } + return var_r30; +} + +// https://decomp.me/scratch/rctvo +s32 fn_1_C108(s32 arg0) { + Vec sp34; + Vec sp28; + Vec sp1C; + UnkPoint spC; + + + f32 var_f27; + f32 var_f26; + f32 var_f25; + f32 var_f28; + f32 var_f29; + f64 var_f30; + f32 var_f31; + + s32 var_r26; + s32 var_r27; + s16 var_r28; + s32 var_r30; + s32 var_r29; + s32 i; + + if ((s32) frandmod(0x64U) < arg0) { + s32 temp_r25 = fn_1_E2AC(); + var_r27 = 4; + var_r29 = frandmod(3U); + if ((s32) frandmod(0x64U) < 0x14) { + var_r29 += 1; + } + var_r29 = var_r29 + (3 - temp_r25) * 4; + } else { + var_r29 = frandmod(0x10U); + var_r27 = frandmod(4U); + } + BoardModelPosGet(lbl_1_bss_30[4], &spC.point); + BoardCameraViewSet(1); + BoardCameraMotionWait(); + var_r26 = BoardSpaceFlagSearch(0, 0x800U); + BoardCameraTargetSpaceSet(var_r26); + BoardPlayerMotBlendSet(lbl_1_bss_388, 0xB4, 0xF); + BoardModelRotGet(lbl_1_bss_30[15], &sp34); + + for (i = 0; i < 0xF; i++) { + sp34.y -= lbl_1_rodata_418; + BoardModelRotSetV(lbl_1_bss_30[15], &sp34); + HuPrcVSleep(); + } + + sp34.y = lbl_1_rodata_41C; + BoardModelRotSetV(lbl_1_bss_30[15], &sp34); + BoardCameraMotionWait(); + lbl_1_bss_384 = HuAudFXPlay(0x41D); + var_r28 = -0x1FFF; + var_f29 = lbl_1_rodata_410; + for (i = 0; i < 0x3C; i++) { + var_f29 -= lbl_1_rodata_420; + fn_1_E310(var_f29); + var_r28 = (s16) ((f32) (s16) var_r28 + lbl_1_rodata_424); + HuAudFXPitchSet(lbl_1_bss_384, var_r28); + HuPrcVSleep(); + } + + var_f29 = lbl_1_rodata_428; + HuAudFXPitchSet(lbl_1_bss_384, 0); + BoardModelMotionStart(lbl_1_bss_30[15], 2, 0x40000001); + BoardModelPosGet(lbl_1_bss_30[15], &sp34); + + for (i = 0; i < 0x1E; i++) { + sp34.z += lbl_1_rodata_42C; + BoardModelPosSetV(lbl_1_bss_30[15], &sp34); + fn_1_E310(var_f29); + HuPrcVSleep(); + } + BoardModelMotionStart(lbl_1_bss_30[15], 1, 0x40000001); + while (var_r29) { + fn_1_E310(var_f29); + HuPrcVSleep(); + var_r29 -= 1; + } + BoardModelMotionStart(lbl_1_bss_30[15], 3, 0x40000001); + BoardModelMotionSpeedSet(lbl_1_bss_30[15], lbl_1_rodata_430); + + for (i = 0; i < 0xA; i++) { + sp34.z -= lbl_1_rodata_434; + BoardModelPosSetV(lbl_1_bss_30[15], &sp34); + fn_1_E310(var_f29); + HuPrcVSleep(); + } + BoardModelMotionStart(lbl_1_bss_30[15], 1, 0x40000001); + BoardModelMotionSpeedSet(lbl_1_bss_30[15], lbl_1_rodata_438); + HuAudFXPlay(0x41F); + HuAudFXPlay(0x42D); + omVibrate(lbl_1_bss_388, 0xC, 6, 6); + var_f31 = lbl_1_rodata_410; + var_f27 = lbl_1_rodata_43C; + sp1C.x = lbl_1_rodata_410; + sp1C.z = lbl_1_rodata_440; + + // Roulette motion and ball ? + while(TRUE) { + sp1C.y = var_f27 - (lbl_1_rodata_444 * (lbl_1_rodata_448 * (var_f31 * var_f31))); + var_f31 += lbl_1_rodata_438; + BoardModelPosGet(lbl_1_bss_30[6], &sp28); + PSVECAdd(&sp28, &sp1C, &sp28); + var_f28 = (sp28.x - spC.point.x) * (sp28.x - spC.point.x) + ((sp28.z - spC.point.z) * (sp28.z - spC.point.z)); + if (var_f28 > lbl_1_rodata_410) { + var_f30 = __frsqrte(var_f28); + var_f30 = lbl_1_rodata_450 * var_f30 * (lbl_1_rodata_458 - ((f64) var_f28 * (var_f30 * var_f30))); + var_f30 = lbl_1_rodata_450 * var_f30 * (lbl_1_rodata_458 - ((f64) var_f28 * (var_f30 * var_f30))); + var_f30 = (lbl_1_rodata_450 * var_f30 * (lbl_1_rodata_458 - (var_f28 * (var_f30 * var_f30)))); + spC.unk00 = (var_f28 * var_f30); + var_f26 = spC.unk00; + } else { + var_f26 = var_f28; + } + + var_f25 = var_f26; + if (var_f25 >= lbl_1_rodata_460) { + if (sp28.y <= (lbl_1_rodata_464 + spC.point.y)) { + PSVECSubtract(&sp28, &spC.point, (Vec* ) &sp1C); + PSVECNormalize((Vec* ) &sp1C, (Vec* ) &sp1C); + sp1C.y = lbl_1_rodata_410; + PSVECScale((Vec* ) &sp1C, (Vec* ) &sp1C, lbl_1_rodata_468); + PSVECAdd((Vec* ) &sp1C, &spC.point, (Vec* ) &sp1C); + sp28.x = sp1C.x; + sp28.z = sp1C.z; + sp1C.x = lbl_1_rodata_46C; + sp1C.z = lbl_1_rodata_470; + } + } + + if (sp28.y < spC.point.y) { + sp28.y = spC.point.y; + if (var_r27 >= 3) { + break; + } + //var_f31 = (lbl_1_rodata_474 * (lbl_1_rodata_418 * (s32) (u8) frand())); + var_f27 = lbl_1_rodata_418 + (lbl_1_rodata_474 * (lbl_1_rodata_418 * (s32) (u8) frand())); + var_f31 = lbl_1_rodata_438; + var_r27 += 1; + //var_f31 = (lbl_1_rodata_474 * (lbl_1_rodata_47C * (s32) (u8) frand())); + sp1C.x = lbl_1_rodata_478 + (lbl_1_rodata_474 * (lbl_1_rodata_47C * (s32) (u8) frand())); + sp1C.z = lbl_1_rodata_478 + (lbl_1_rodata_474 * (lbl_1_rodata_47C * (s32) (u8) frand())); + HuAudFXPlay(0x41E); + } + + BoardModelPosSetV(lbl_1_bss_30[6], (Vec* ) &sp28); + fn_1_E310(var_f29); + HuPrcVSleep(); + } + + HuAudFXPlay(0x41E); + PSVECSubtract(&sp28, &spC.point, (Vec* ) &sp1C); + PSVECNormalize((Vec* ) &sp1C, (Vec* ) &sp1C); + var_f31 = (f32) (lbl_1_rodata_480 * (atan2((f64) -sp1C.z, (f64) sp1C.x) / lbl_1_rodata_488)); + BoardModelRotGet(lbl_1_bss_30[4], &sp34); + var_f31 = var_f31 - sp34.y; + if (var_f31 < lbl_1_rodata_410) { + var_f31 += lbl_1_rodata_490; + } + var_r30 = (s32) (var_f31 / lbl_1_rodata_494); + if (fmod(var_f31, lbl_1_rodata_498) > lbl_1_rodata_4A0) { + var_r30 += 1; + } + if (var_r30 >= 0x10) { + var_r30 -= 0x10; + } + sp1C.y = lbl_1_rodata_410; + + while(TRUE) { + fn_1_E310(var_f29); + BoardModelRotGet(lbl_1_bss_30[4], &sp34); + var_f31 = (lbl_1_rodata_494 * var_r30) + sp34.y; // TODO: Update rodata for asm change + sp1C.x= cos((lbl_1_rodata_488 * var_f31) / lbl_1_rodata_480); + sp1C.z = -sin((lbl_1_rodata_488 * var_f31) / lbl_1_rodata_480); + PSVECScale(&sp1C, &sp1C, lbl_1_rodata_468); + PSVECAdd(&sp1C, &spC.point, &sp1C); + sp28.x = sp1C.x; + sp28.z = sp1C.z; + BoardModelPosSetV(lbl_1_bss_30[6], &sp28); + if (sp34.y >= lbl_1_rodata_4A8 && + sp34.y < lbl_1_rodata_4AC) { + break; + } + HuPrcVSleep(); + } + + for (i = 0; i < 0x3C; i++) { + var_f29 += lbl_1_rodata_420; + fn_1_E310(var_f29); + BoardModelRotGet(lbl_1_bss_30[4], &sp34); + var_f31 = (lbl_1_rodata_494 * (f32) var_r30) + sp34.y; // TODO: Update rodata for asm change + sp1C.x = (f32) cos((lbl_1_rodata_488 * (f64) var_f31) / lbl_1_rodata_480); + sp1C.z = (f32) -sin((lbl_1_rodata_488 * (f64) var_f31) / lbl_1_rodata_480); + PSVECScale(&sp1C, &sp1C, lbl_1_rodata_468); + PSVECAdd((Vec* ) &sp1C, &spC.point, (Vec* ) &sp1C); + sp28.x = sp1C.x; + sp28.z = sp1C.z; + BoardModelPosSetV(lbl_1_bss_30[6], (Vec* ) &sp28); + var_r28 = var_r28 + lbl_1_rodata_4B0; // TODO: Weird extra rodata + HuAudFXPitchSet(lbl_1_bss_384, var_r28); + HuPrcVSleep(); + } + BoardModelRotYSet(lbl_1_bss_30[4], lbl_1_rodata_410); + HuAudFXStop(lbl_1_bss_384); + return lbl_1_data_4D0[var_r30]; +} + +// Place player on space post roulette? +void fn_1_CD04(s32 arg0) { + Vec sp24; + Vec sp18; + Vec spC; + + f32 temp_f30; + f32 temp_f29; + f32 var_f31; + + s16 var_r25; + u32 var_r26; + s32 var_r27; + s32 var_r29; + s32 var_r28; + s32 var_r30; + BoardSpace* temp_r31; + + if (arg0 < 0) { + fn_1_D3AC(); + arg0 = fn_1_D8C4(); + } + temp_r31 = BoardSpaceGet(0, BoardSpaceFlagSearch(0, 0x800)); + + for (var_r28 = 0; var_r28 < temp_r31->link_cnt; var_r28++) { + var_r29 = temp_r31->link[var_r28]; + var_r26 = ( (BoardSpaceFlagGet(0, var_r29) & 0xE) >> 1U); + if ( var_r26 == (arg0 + 2)) { + break; + } + } + BoardSpacePosGet(0, var_r29, &sp24); + BoardModelAttrReset(lbl_1_bss_30[5], 0x40000002); + HuAudFXPlay(0x420); + if (BoardPlayerSizeGet(lbl_1_bss_388) == 2) { + while (BoardModelMotionTimeGet(lbl_1_bss_30[5]) < lbl_1_rodata_4C0) { + HuPrcVSleep(); + } + BoardPlayerScaleGet(lbl_1_bss_388, &spC); + + while (BoardModelMotionTimeGet(lbl_1_bss_30[5]) < lbl_1_rodata_4C4) { + spC.x -= lbl_1_rodata_448; + spC.y -= lbl_1_rodata_448; + //temp_f1 = spC.z; + spC.z = spC.z - lbl_1_rodata_448; + BoardPlayerScaleSetV(lbl_1_bss_388, &spC); + HuPrcVSleep(); + } + + spC.x = spC.y = spC.z = lbl_1_rodata_4C8; + BoardPlayerScaleSetV(lbl_1_bss_388, &spC); + } + + while (BoardModelMotionTimeGet(lbl_1_bss_30[5]) < lbl_1_rodata_4C4) { + HuPrcVSleep(); + } + if (GWPlayer[lbl_1_bss_388].bowser_suit) { + BoardModelVisibilitySet(BoardBowserSuitModelGet(), 0); + BoardModelVisibilitySet(BoardBowserSuitPlayerModelGet(), 0); + } else { + BoardModelVisibilitySet(BoardPlayerModelGet(lbl_1_bss_388), 0); + } + HuAudFXPlay(0x421); + omVibrate(lbl_1_bss_388, 0xC, 4, 2); + + while (BoardModelMotionTimeGet(lbl_1_bss_30[5]) < lbl_1_rodata_4CC) { + HuPrcVSleep(); + } + + BoardModelPosGet(lbl_1_bss_30[5], &sp18); + temp_f30 = (f32) ((lbl_1_rodata_480 * (atan2(sp24.x - sp18.x, sp24.z - sp18.z) / lbl_1_rodata_488)) / lbl_1_rodata_4D0); + + while (BoardModelMotionTimeGet(lbl_1_bss_30[5]) < lbl_1_rodata_408) { + BoardModelRotYSet(lbl_1_bss_30[5], temp_f30 + BoardModelRotYGet(lbl_1_bss_30[5])); + HuPrcVSleep(); + } + BoardModelRotYSet(lbl_1_bss_30[5], (f32) (lbl_1_rodata_480 * (atan2(sp24.x - sp18.x, sp24.z - sp18.z) / lbl_1_rodata_488))); + omVibrate(lbl_1_bss_388, 0xC, 4, 2); + if (GWPlayer[lbl_1_bss_388].bowser_suit) { + + BoardModelVisibilitySet(BoardBowserSuitModelGet(),1); + BoardModelVisibilitySet(BoardBowserSuitPlayerModelGet(),1); + } else { + BoardModelVisibilitySet(BoardPlayerModelGet(lbl_1_bss_388), 1); + } + GWPlayer[lbl_1_bss_388].space_curr =(s16) var_r29; + BoardPlayerPosSetV(lbl_1_bss_388, &sp24); + temp_r31 = BoardSpaceGet(0, var_r29); + + for ( var_r30 = 0; var_r30 < (s32) temp_r31->link_cnt; var_r30++) { + if (BoardSpaceTypeGet(0, temp_r31->link[var_r30])) { + break; + } + } + + if (var_r30 != (s32) temp_r31->link_cnt) { + BoardSpacePosGet(0, temp_r31->link[var_r30], &sp18); + BoardPlayerRotYSet(lbl_1_bss_388, (f32) (lbl_1_rodata_480 * (atan2(sp18.x - sp24.x, sp18.z - sp24.z) / lbl_1_rodata_488))); + } + if (BoardPlayerSizeGet(lbl_1_bss_388) == 2) { + var_f31 = spC.x; + + while (var_f31 < lbl_1_rodata_4DC) { + var_f31 += lbl_1_rodata_4D8; + if (var_f31 > lbl_1_rodata_4DC) { + var_f31 = lbl_1_rodata_4DC; + } + spC.z = var_f31; + spC.y = var_f31; + spC.x = var_f31; + BoardPlayerScaleSetV(lbl_1_bss_388, &spC); + HuPrcVSleep(); + } + } + HuAudFXPlay(0x42A); + while (BoardModelMotionTimeGet(lbl_1_bss_30[5]) < BoardModelMotionMaxTimeGet(lbl_1_bss_30[5])) { + HuPrcVSleep(); + } + HuPrcCreate(&fn_1_DF48, 0x2004, 0x1000, 0); +} + +/* Rotate (yaw) of model 4 */ +void fn_1_E310(f32 degrees) { + Point3d spC; + lbl_1_bss_380 += degrees; + if (lbl_1_bss_380 >= lbl_1_rodata_490) { + lbl_1_bss_380 -= lbl_1_rodata_490; + } + if (lbl_1_bss_380 < lbl_1_rodata_410) { + lbl_1_bss_380 += lbl_1_rodata_490; + } + BoardModelRotGet(lbl_1_bss_30[4], &spC); + spC.y = lbl_1_bss_380; + BoardModelRotSetV(lbl_1_bss_30[4], &spC); +}