#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_384; extern s16 lbl_1_bss_388; extern s32 lbl_1_bss_38C; extern s16 lbl_1_bss_388; extern f32 lbl_1_bss_380; //Function Externs 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]; } /* 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); }