diff --git a/config/GMPE01_00/symbols.txt b/config/GMPE01_00/symbols.txt index fef6092a..3232dbad 100644 --- a/config/GMPE01_00/symbols.txt +++ b/config/GMPE01_00/symbols.txt @@ -1484,8 +1484,8 @@ fn_8007F6BC = .text:0x8007F6BC; // type:function size:0xA4 fn_8007F760 = .text:0x8007F760; // type:function size:0xFC fn_8007F85C = .text:0x8007F85C; // type:function size:0x38 fn_8007F894 = .text:0x8007F894; // type:function size:0x2BC -fn_8007FB50 = .text:0x8007FB50; // type:function size:0x184 -fn_8007FCD4 = .text:0x8007FCD4; // type:function size:0x19C +BoardEventLandBlue = .text:0x8007FB50; // type:function size:0x184 +BoardEventLandRed = .text:0x8007FCD4; // type:function size:0x19C fn_8007FE70 = .text:0x8007FE70; // type:function size:0x1E8 fn_80080058 = .text:0x80080058; // type:function size:0x6C fn_800800C4 = .text:0x800800C4; // type:function size:0x60 diff --git a/configure.py b/configure.py index 2a5a05e5..7099d2cd 100644 --- a/configure.py +++ b/configure.py @@ -369,7 +369,7 @@ config.libs = [ Object(NonMatching, "game/board/space.c"), Object(NonMatching, "game/board/shop.c"), Object(NonMatching, "game/board/lottery.c"), - Object(NonMatching, "game/board/basic_space.c"), + Object(Matching, "game/board/basic_space.c"), Object(NonMatching, "game/board/warp.c"), Object(NonMatching, "game/board/char_roulette.c"), Object(NonMatching, "game/board/mushroom_space.c"), diff --git a/include/dolphin/os/OSFastCast.h b/include/dolphin/os/OSFastCast.h index d1ea7f4e..24000a4c 100644 --- a/include/dolphin/os/OSFastCast.h +++ b/include/dolphin/os/OSFastCast.h @@ -75,6 +75,18 @@ static inline u8 __OSf32tou8(register f32 inF) static inline void OSf32tou8(f32 *f, u8 *out) { *out = __OSf32tou8(*f); } +static inline float __OSu16tof32(register const u16* arg) { + register float ret; + + asm { + psq_l ret, 0(arg), 1, 3 + } + + return ret; +} + +static inline void OSu16tof32(const u16* in, float* out) { *out = __OSu16tof32(in); } + #ifdef __cplusplus } #endif diff --git a/include/game/board/basic_space.h b/include/game/board/basic_space.h new file mode 100644 index 00000000..6b0f306c --- /dev/null +++ b/include/game/board/basic_space.h @@ -0,0 +1,39 @@ +#include "common.h" +#include "math.h" +#include "game/process.h" +#include "game/audio.h" +#include "game/object.h" + +extern Process *boardObjMan; + +typedef struct bit_copy { + struct { + u8 hide : 1; + u8 field08_bit1 : 1; + u8 field08_bit2 : 1; + u8 field08_bit3 : 3; + u8 field08_bit6 : 1; + u8 field08_bit7 : 1; + }; + s8 unk_01; + s8 unk_02; + s8 unk_03; + u16 unk_04; + u16 unk_06; + s16 unk_08; + s16 unk_0A; + s16 unk_0C; + s16 unk_0E; +} bitcopy; + +void BoardEventLandBlue(s32); +void BoardEventLandRed(s32); +s8 fn_8007FE70(Point3d*, s8); +s32 fn_80080058(s32); +void fn_800800C4(s32); +void fn_80080124(bitcopy*, Vec*); +void fn_80080360(omObjData*); +void fn_800804F8(omObjData*, bitcopy*); +void fn_800806B0(omObjData*, bitcopy*); +void fn_8008094C(omObjData*, bitcopy*); +void fn_80080AF4(omObjData*, bitcopy*); \ No newline at end of file diff --git a/src/game/board/basic_space.c b/src/game/board/basic_space.c new file mode 100644 index 00000000..bda049d8 --- /dev/null +++ b/src/game/board/basic_space.c @@ -0,0 +1,411 @@ +#include "game/board/basic_space.h" + +void BoardTutorialHookExec(s16, s32); +void BoardCameraViewSet(s32); +void omVibrate(s16, s16, s16, s16); +void BoardPlayerPosGet(s32, Vec*); +s32 BoardModelPosGet(s16, Vec*); +void BoardPlayerMotionEndWait(s32); +void BoardPlayerMotionShiftSet(s32, s32, f32, f32, s32); +void BoardPlayerCoinsAdd(s32, s32); +void BoardRotateDiceNumbers(s32); +void BoardCameraAnimBlendSet(s32, s16, s16); +s32 BoardPlayerAnimBlendCheck(s32); + +omObjData *lbl_8013A1F0[4] = { + (omObjData *)NULL, + (omObjData *)NULL, + (omObjData *)NULL, + (omObjData *)NULL +}; + +s32 lbl_8013A200[10] = { + 0x7000C, 0x7000D, + 0x7000E, 0x7000F, + 0x70010, 0x70011, + 0x70012, 0x70013, + 0x70014, 0x70015 +}; + +void BoardEventLandBlue(s32 arg0) { + Point3d sp8; + f32 temp_f1; + s32 var_r29; + s8 temp_r28; + s32 var_r30; + + BoardCameraViewSet(2); + BoardPlayerAnimBlendSet(arg0, 0, 0xF); + while (BoardPlayerAnimBlendCheck(arg0) == 0) { + HuPrcVSleep(); + } + if (_CheckFlag(0x1000BU) != 0) { + BoardCameraMotionWait(); + BoardTutorialHookExec(0xA, 0); + } + var_r30 = 3; + if (GWSystem.last5_effect == 1) { + var_r30 *= 2; + } + BoardPlayerPosGet(arg0, &sp8); + sp8.y += 250.0f; + temp_r28 = fn_8007FE70(&sp8, var_r30); + HuAudFXPlay(0x347); + BoardCameraMotionWait(); + BoardPlayerMotionShiftSet(arg0, 0xC, 0.0f, 4.0f, 0); + + for (var_r29 = 0; var_r29 < var_r30; var_r29++) { + BoardPlayerCoinsAdd(arg0, 1); + HuAudFXPlay(7); + HuPrcSleep(6); + } + HuAudFXPlay(0xF); + while (fn_80080058(temp_r28) == 0) { + HuPrcVSleep(); + } + GWPlayer[arg0].color = 1; + BoardPlayerMotionEndWait(arg0); + BoardRotateDiceNumbers(arg0); +} + +void BoardEventLandRed(s32 arg0) { + Point3d sp8; + s32 var_r29; + s8 temp_r28; + s32 var_r30; + void* temp_r3; + + BoardCameraViewSet(2); + omVibrate(arg0, 0xC, 6, 6); + BoardPlayerAnimBlendSet(arg0, 0, 0xF); + while (BoardPlayerAnimBlendCheck(arg0) == 0) { + HuPrcVSleep(); + } + if (_CheckFlag(0x1000BU) != 0) { + BoardCameraMotionWait(); + BoardTutorialHookExec(0xB, 0); + } + var_r30 = 3; + if (GWSystem.last5_effect == 1) { + var_r30 *= 2; + } + BoardPlayerPosGet(arg0, &sp8); + sp8.y += 250.0f; + temp_r28 = fn_8007FE70(&sp8, -var_r30); + HuAudFXPlay(0x348); + BoardCameraMotionWait(); + BoardPlayerMotionShiftSet(arg0, 0xD, 0.0f, 4.0f, 0); + for (var_r29 = 0; var_r29 < var_r30; var_r29++) { + BoardPlayerCoinsAdd(arg0, -1); + HuAudFXPlay(14); + HuPrcSleep(6); + } + HuAudFXPlay(0xF); + + while (fn_80080058(temp_r28) == 0) { + HuPrcVSleep(); + } + GWPlayer[arg0].color = 2; + BoardPlayerMotionEndWait(arg0); + BoardRotateDiceNumbers(arg0); +} + +s8 fn_8007FE70(Point3d* arg0, s8 arg1) { + omObjData* var_r30 = NULL; + bitcopy* temp_r31; + s8 var_r27; + s8 var_r29; + + for (var_r29 = 0; var_r29 < 4; var_r29++) { + if (lbl_8013A1F0[var_r29] == 0) { + break; + } + } + if (var_r29 == 4) { + return -1; + } + + var_r30 = omAddObjEx(boardObjMan, 0x10A, 0, 0, -1, &fn_80080360); + lbl_8013A1F0[var_r29] = var_r30; + temp_r31 = (bitcopy *) var_r30->work; + temp_r31->hide = 0; + temp_r31->field08_bit2 = 0; + if (arg1 < 0) { + var_r27 = 1; + } else { + var_r27 = 0; + } + temp_r31->field08_bit1 = var_r27; + temp_r31->field08_bit3 = 0; + temp_r31->unk_02 = __abs(arg1) / 10; + temp_r31->unk_03 = __abs(arg1) % 10; + temp_r31->unk_01 = (s8) (var_r29 + 1); + temp_r31->unk_04 = 0; + temp_r31->unk_06 = 0; + fn_80080124(temp_r31, arg0); + var_r30->trans.x = arg0->x; + var_r30->trans.y = arg0->y; + var_r30->trans.z = arg0->z; + var_r30->rot.x = 0.0f; + var_r30->rot.y = 0.01f; + temp_r31->field08_bit2 = 1; + return temp_r31->unk_01; +} + +s32 fn_80080058(s32 arg0) { + int *sp8; + + if ((arg0 <= 0) || (arg0 > 4)) { + return arg0; + } + if (lbl_8013A1F0[arg0 - 1] != 0) { + sp8 = lbl_8013A1F0[arg0 - 1]->work; + return 0; + } + return 1; +} + +void fn_800800C4(s32 arg0) { + bitcopy* temp_r4; + + if ((arg0 <= 0) || (arg0 > 4)) { + return; + } + if (lbl_8013A1F0[arg0 - 1] != 0) { + ((bitcopy*) lbl_8013A1F0[arg0 - 1]->work)->hide = 1; + } +} + +const s32 lbl_801D56B0[2] = {0x70016, 0x70017}; + +void fn_80080124(bitcopy* arg0, Vec* arg1) { + f32 var_f31; + + if (arg0->field08_bit1 != 0) { + var_f31 = 2.5f; + } else { + var_f31 = 1.5f; + } + arg0->unk_08 = BoardModelCreate(lbl_801D56B0[arg0->field08_bit1], NULL, 0); + arg0->unk_0A = BoardModelCreate(lbl_8013A200[arg0->unk_02], NULL, 0); + arg0->unk_0C = BoardModelCreate(lbl_8013A200[arg0->unk_03], NULL, 0); + arg0->unk_0E = BoardModelCreate(0x7000A, NULL, 0); + BoardModelPosSetV(arg0->unk_08, arg1); + BoardModelPosSetV(arg0->unk_0A, arg1); + BoardModelPosSetV(arg0->unk_0C, arg1); + BoardModelPosSetV(arg0->unk_0E, arg1); + BoardModelMotionStart(arg0->unk_08, 0, 0); + BoardModelMotionStart(arg0->unk_0A, 0, 0); + BoardModelMotionStart(arg0->unk_0C, 0, 0); + BoardModelMotionTimeSet(arg0->unk_08, var_f31); + BoardModelMotionTimeSet(arg0->unk_0A, var_f31); + BoardModelMotionTimeSet(arg0->unk_0C, var_f31); + BoardModelMotionSpeedSet(arg0->unk_08, 0.0f); + BoardModelMotionSpeedSet(arg0->unk_0A, 0.0f); + BoardModelMotionSpeedSet(arg0->unk_0C, 0.0f); + BoardModelScaleSet(arg0->unk_08, 0.001, 0.001, 0.001); + BoardModelScaleSet(arg0->unk_0A, 0.001, 0.001, 0.001); + BoardModelScaleSet(arg0->unk_0C, 0.001, 0.001, 0.001); + BoardModelScaleSet(arg0->unk_0E, 0.001, 0.001, 0.001); + BoardModelLayerSet(arg0->unk_08, 1); + BoardModelLayerSet(arg0->unk_0A, 1); + BoardModelLayerSet(arg0->unk_0C, 1); + BoardModelLayerSet(arg0->unk_0E, 1); + if (arg0->unk_02 == 0) { + BoardModelVisibilitySet(arg0->unk_0A, 0); + } +} + +void fn_80080360(omObjData* arg0) { + s32 temp_r0; + bitcopy* temp_r31; + + temp_r31 = (bitcopy*) arg0->work; + if ((temp_r31->hide != 0) || (BoardIsKill() != 0)) { + if (temp_r31->unk_0E != -1) { + BoardModelKill(temp_r31->unk_0E); + temp_r31->unk_0E = -1; + } + if (temp_r31->unk_08 != -1) { + BoardModelKill(temp_r31->unk_08); + temp_r31->unk_08 = -1; + } + if (temp_r31->unk_0A != -1) { + BoardModelKill(temp_r31->unk_0A); + temp_r31->unk_0A = -1; + } + if (temp_r31->unk_0C != -1) { + BoardModelKill(temp_r31->unk_0C); + temp_r31->unk_0C = -1; + } + lbl_8013A1F0[temp_r31->unk_01 - 1] = 0; + omDelObjEx(HuPrcCurrentGet(), arg0); + return; + } + if (temp_r31->field08_bit2 != 0) { + if (temp_r31->unk_04 != 0) { + temp_r31->unk_04 -= 1; + return; + } + + switch (temp_r31->field08_bit3) { + case 0: + fn_800804F8(arg0, temp_r31); + return; + case 1: + fn_800806B0(arg0, temp_r31); + return; + case 3: + fn_8008094C(arg0, temp_r31); + return; + case 4: + fn_80080AF4(arg0, temp_r31); + break; + } + } +} + +void fn_800804F8(omObjData* arg0, bitcopy* arg1) { + f32 temp_f31; + f32 temp_f30; + f32 temp_f29; + f32 temp_f28; + + OSu16tof32(&arg1->unk_06, &temp_f29); + temp_f29 = sin(M_PI * temp_f29 / 180.0); + temp_f30 = temp_f29; + arg0->rot.x = 405.0f * temp_f29; + BoardModelScaleSet(arg1->unk_0E, temp_f30, temp_f30, temp_f30); + BoardModelPosSet(arg1->unk_0E, arg0->trans.x, arg0->trans.y, arg0->trans.z); + BoardModelRotYSet(arg1->unk_0E, arg0->rot.x); + if (arg1->unk_06 < 0x5A) { + arg1->unk_06 += 6; + return; + } + + arg1->field08_bit3 = 1; + arg1->unk_06 = 0; + BoardModelScaleSet(arg1->unk_08, temp_f30, temp_f30, temp_f30); + BoardModelPosSet(arg1->unk_08, arg0->trans.x, arg0->trans.y, arg0->trans.z); + BoardModelRotYSet(arg1->unk_08, arg0->rot.x); + BoardModelScaleSet(arg1->unk_0C, temp_f30, temp_f30, temp_f30); + BoardModelPosSet(arg1->unk_0C, arg0->trans.x, arg0->trans.y, arg0->trans.z); + BoardModelRotYSet(arg1->unk_0C, arg0->rot.x); + BoardModelScaleSet(arg1->unk_0A, temp_f30, temp_f30, temp_f30); + BoardModelPosSet(arg1->unk_0A, arg0->trans.x, arg0->trans.y, arg0->trans.z); + BoardModelRotYSet(arg1->unk_0A, arg0->rot.x); +} + +void fn_800806B0(omObjData* arg0, bitcopy* arg1) { + f32 temp_f28; + f32 temp_f30; + f32 var_f29; + f32 var_f27; + f32 var_f26; + f32 var_f25; + f32 var_f24; + + OSu16tof32(&arg1->unk_06, &temp_f30); + + if (arg1->unk_02 != 0) { + var_f29 = 140.0f; + } else { + var_f29 = 105.0f; + } + temp_f28 = (200.0 * sin((M_PI * (2.0f * temp_f30)) / 180.0)); + temp_f30 = sin((M_PI * temp_f30) / 180.0); + arg0->rot.x = 45.0f + (315.0f * temp_f30); + if (arg1->unk_02 != 0) { + var_f27 = arg0->trans.x + (temp_f30 * -var_f29); + var_f24 = arg0->trans.x + ((temp_f30 * -var_f29) / 3.0f); + var_f26 = arg0->trans.x + (temp_f30 * var_f29); + var_f25 = arg0->trans.x + ((temp_f30 * var_f29) / 3.0f); + } else { + var_f24 = arg0->trans.x; + var_f25 = arg0->trans.x; + var_f26 = arg0->trans.x + (temp_f30 * var_f29); + var_f27 = arg0->trans.x + (temp_f30 * -var_f29); + } + BoardModelPosSet(arg1->unk_0E, var_f27, arg0->trans.y + temp_f28, arg0->trans.z); + BoardModelPosSet(arg1->unk_08, var_f24, arg0->trans.y + temp_f28, arg0->trans.z); + BoardModelPosSet(arg1->unk_0C, var_f26, arg0->trans.y + temp_f28, arg0->trans.z); + BoardModelPosSet(arg1->unk_0A, var_f25, arg0->trans.y + temp_f28, arg0->trans.z); + BoardModelRotYSet(arg1->unk_0E, arg0->rot.x); + BoardModelRotYSet(arg1->unk_08, arg0->rot.x); + BoardModelRotYSet(arg1->unk_0C, arg0->rot.x); + BoardModelRotYSet(arg1->unk_0A, arg0->rot.x); + if (arg1->unk_06 < 0x5A) { + arg1->unk_06 += 6; + return; + } + arg0->trans.y += temp_f28; + arg1->field08_bit3 = 3; + arg1->unk_06 = 0; +} + +void fn_8008094C(omObjData* arg0, bitcopy* arg1) { + Vec sp8; + f32 temp_f29; + f32 var_f30; + + OSu16tof32(&arg1->unk_06, &temp_f29); + temp_f29 = (f32) sin((M_PI * temp_f29) / 180.0); + if (arg1->field08_bit1 != 0) { + var_f30 = (-50.0f * temp_f29) + arg0->trans.y; + } else { + var_f30 = (50.0f * temp_f29) + arg0->trans.y; + } + BoardModelPosGet(arg1->unk_0E, &sp8); + BoardModelPosSet(arg1->unk_0E, sp8.x, var_f30, sp8.z); + BoardModelPosGet(arg1->unk_08, &sp8); + BoardModelPosSet(arg1->unk_08, sp8.x, var_f30, sp8.z); + BoardModelPosGet(arg1->unk_0C, &sp8); + BoardModelPosSet(arg1->unk_0C, sp8.x, var_f30, sp8.z); + BoardModelPosGet(arg1->unk_0A, &sp8); + BoardModelPosSet(arg1->unk_0A, sp8.x, var_f30, sp8.z); + if (arg1->unk_06 < 0x5A) { + arg1->unk_06 += 6; + return; + } + arg1->field08_bit3 = 4; + arg1->unk_06 = 0; + arg1->unk_04 = 0x12; + arg0->scale.x = 1.0f; + arg0->scale.y = 1.0f; +} + +void fn_80080AF4(omObjData* arg0, bitcopy* arg1) { + const u16 sp8 = ((arg1->unk_06 * 2) % 180); + f32 temp_f31; + + OSu16tof32(&sp8, &temp_f31); + if (sp8 <= 90.0f) { + arg0->scale.x = 0.5 * cos((M_PI * temp_f31) / 180.0); + arg0->scale.y = 2.5 * sin((M_PI * temp_f31) / 180.0); + } else { + arg0->scale.x = 2.5 * sin((M_PI * temp_f31) / 180.0); + arg0->scale.y = 0.5 * cos((M_PI * temp_f31) / 180.0); + } + if (0.0f == arg0->scale.x) { + arg0->scale.x = 0.0001f; + } + if (0.0f == arg0->scale.y) { + arg0->scale.y = 0.0001f; + } + BoardModelScaleSet(arg1->unk_0E, arg0->scale.x, arg0->scale.y, 1.0f); + BoardModelScaleSet(arg1->unk_08, arg0->scale.x, arg0->scale.y, 1.0f); + BoardModelScaleSet(arg1->unk_0C, arg0->scale.x, arg0->scale.y, 1.0f); + BoardModelScaleSet(arg1->unk_0A, arg0->scale.x, arg0->scale.y, 1.0f); + if (arg1->unk_06 < 0x5A) { + arg1->unk_06 += 3; + if (arg1->unk_06 > 0x5A) { + arg1->unk_06 = 0x5A; + } + } else { + BoardModelVisibilitySet(arg1->unk_08, 0); + BoardModelVisibilitySet(arg1->unk_0A, 0); + BoardModelVisibilitySet(arg1->unk_0C, 0); + BoardModelVisibilitySet(arg1->unk_0E, 0); + arg1->hide = 1; + } +}