diff --git a/configure.py b/configure.py index ca087f34..058947fd 100644 --- a/configure.py +++ b/configure.py @@ -380,7 +380,7 @@ config.libs = [ Object(Matching, "game/board/basic_space.c"), Object(Matching, "game/board/warp.c"), Object(Matching, "game/board/char_wheel.c"), - Object(NonMatching, "game/board/mushroom.c"), + Object(Matching, "game/board/mushroom.c"), Object(Matching, "game/board/star.c"), Object(Matching, "game/board/roll.c"), Object(Matching, "game/board/ui.c"), diff --git a/src/game/board/mushroom.c b/src/game/board/mushroom.c index 225a05d3..251e720a 100644 --- a/src/game/board/mushroom.c +++ b/src/game/board/mushroom.c @@ -2,11 +2,31 @@ #include "game/gamework_data.h" #include "game/board/item.h" #include "game/object.h" +#include "game/board/main.h" +#include "game/board/player.h" +#include "game/board/ui.h" +#include "game/board/model.h" -void KillMushroom(); -void MushroomMain(); -extern Process* boardMainProc; -extern Process* mushroomProc; +#include "game/objsub.h" + +#include "math.h" + +extern s32 boardTutorialData[4]; + + +static void KillMushroom(); +static void MushroomMain(); +static void KillItemMdl(void); +static void MarkKillBox(void); +static void InitBox(s32 arg0); + +static const float boxOfs[2] = {-150.0f, 150.0f}; +static omObjData *boxObj[2] = {}; +static s16 itemMdl = -1; +static s8 itemResult; +static u8 pickerChoice; +static omObjData* itemGiveObj; +static Process* mushroomProc; void BoardMushroomExec(s32 arg0) { omVibrate(arg0, 0xC, 6, 6); @@ -20,16 +40,40 @@ void BoardMushroomExec(s32 arg0) { GWPlayer[arg0].color = 3; } -extern s32 boardTutorialData[4]; -void MushroomMain(void) { - Point3d sp14[2]; - Point3d sp8; +typedef struct { + struct { + u8 unk00_field0 : 1; + u8 unk00_field1 : 1; + u8 unk00_field2 : 3; + u8 unk00_field5 : 2; + u8 unk00_field7 : 1; + }; + char unk01[1]; + s16 unk_02; + s16 unk_04; + s16 unk_06; + f32 unk_08; +} boxObjWork; + +static void SetBoxHide(s32 arg0); +static void SetBoxCenter(s32 arg0); +static void SetBoxShow(s32 arg0); +static void WaitBoxOpen(s32 arg0); +static void WaitBoxCenter(s32 arg0); +static s32 CheckBox(void); +static void StartItemGive(s32 arg0); +static void ShowItemMdl(void); +static void WaitItemGive(void); + +static void MushroomMain(void) { + Vec sp14[2]; + Vec sp8; s32 temp_r0; s32 temp_r0_2; s32 var_r30; s32 curPlayer; - s32 var_r29; + s8 var_r29; boxObjWork* box; s32 var_r27; s32 var_r26; @@ -80,7 +124,7 @@ void MushroomMain(void) { if (GWPlayer[curPlayer].com != 0) { BoardRand(); var_r26 = 0; //inline? - var_r29 = (s8)var_r26; + var_r29 = var_r26; if (_CheckFlag(0x1000BU) != 0) { var_r29 = 0; } @@ -121,7 +165,7 @@ void MushroomMain(void) { var_r27 = 0x50002; } - BoardPlayerMotionShiftSet(curPlayer, 0xC, lbl_801D581C, 4.0f, 0); + BoardPlayerMotionShiftSet(curPlayer, 0xC, 0.0f, 4.0f, 0); HuPrcSleep(4); BoardWinCreate(0, var_r27, -1); BoardWinWait(); @@ -143,25 +187,6 @@ void MushroomMain(void) { HuPrcEnd(); } -void KillItemMdl(void); -void MarkKillBox(void); -extern omObjData* itemGiveObj; -extern s32 mushroomProc; - -void KillMushroom(void) { - ItemGiveWork2* temp_r31; - - MarkKillBox(); - - if (itemGiveObj) { - temp_r31 = OM_GET_WORK_PTR(itemGiveObj, ItemGiveWork2); - temp_r31->unk00_field0 = 1; - } - - KillItemMdl(); - mushroomProc = 0; -} - typedef struct { struct { u8 unk00_field0 : 1; @@ -177,20 +202,19 @@ typedef struct { f32 unk_08; } ItemGiveWork2; -typedef struct { - struct { - u8 unk00_field0 : 1; - u8 unk00_field1 : 1; - u8 unk00_field2 : 3; - u8 unk00_field5 : 2; - u8 unk00_field7 : 1; - }; - char unk01[1]; - s16 unk_02; - s16 unk_04; - s16 unk_06; - f32 unk_08; -} boxObjWork; +static void KillMushroom(void) { + ItemGiveWork2* temp_r31; + + MarkKillBox(); + + if (itemGiveObj) { + temp_r31 = OM_GET_WORK_PTR(itemGiveObj, ItemGiveWork2); + temp_r31->unk00_field0 = 1; + } + + KillItemMdl(); + mushroomProc = NULL; +} typedef struct { struct { @@ -204,15 +228,13 @@ typedef struct { f32 unk_08; } itemObjWork; -void BoardModelPosSet(s16, f32, f32, f32); -void BoardModelRotSet(s16, f32, f32, f32); -void CenterBox(ItemGiveWork2*, omObjData*); -void ExitBox(ItemGiveWork2* arg0, omObjData* arg1); -void HideBox(ItemGiveWork2*, omObjData*); -void ShowBox(ItemGiveWork2*, omObjData*); -omObjData* boxObj[2]; +static void CenterBox(ItemGiveWork2*, omObjData*); +static void ExitBox(ItemGiveWork2* arg0, omObjData* arg1); +static void HideBox(ItemGiveWork2*, omObjData*); +static void ShowBox(ItemGiveWork2*, omObjData*); -void BoxMain(omObjData* arg0) { + +static void BoxMain(omObjData* arg0) { s32 temp_r0; ItemGiveWork2* temp_r30; @@ -242,55 +264,47 @@ void BoxMain(omObjData* arg0) { BoardModelRotSet(temp_r30->unk_02, arg0->rot.x, arg0->rot.y, arg0->rot.z); } -extern f32 lbl_801D5828; -extern f32 lbl_801D582C; -extern f64 lbl_801D5830; -extern f64 lbl_801D5838; -extern f64 lbl_801D5840; -extern f32 lbl_801D5848; - -void ShowBox(ItemGiveWork2* arg0, omObjData* arg1) { - Point3d sp8; +static void ShowBox(ItemGiveWork2* arg0, omObjData* arg1) { + Vec sp8; BoardPlayerPosGet(arg0->unk00_field5, &sp8); - sp8.y += lbl_801D5828; + sp8.y += 300.0f; - if (arg0->unk_08 >= lbl_801D582C) { - arg0->unk_08 = lbl_801D582C; + if (arg0->unk_08 >= 90.0f) { + arg0->unk_08 = 90.0f; arg0->unk00_field7 = 1; arg0->unk00_field2 = 1; } OSs16tof32(&arg0->unk_06, &arg1->rot.y); - arg1->trans.y = (sp8.y + (lbl_801D5830 * cos((lbl_801D5838 * (f64) arg0->unk_08) / lbl_801D5840))); - arg0->unk_08 += lbl_801D5848; + arg1->trans.y = (sp8.y + (700.0f * cos((M_PI * (f64) arg0->unk_08) / 180.0))); + arg0->unk_08 += 1.5f; arg0->unk_06 += 30; } -extern f32 lbl_801D581C; -void ExitBox(ItemGiveWork2* arg0, omObjData* arg1) { - Point3d spC; +static void ExitBox(ItemGiveWork2* arg0, omObjData* arg1) { + Vec spC; s16 sp8; f32 temp; sp8 = (arg0->unk_06 % 360); OSs16tof32(&sp8, &temp); BoardPlayerPosGet(arg0->unk00_field5, &spC); - spC.y += lbl_801D5828; + spC.y += 300.0f; - if (arg0->unk_08 <= lbl_801D581C) { - arg0->unk_08 = lbl_801D581C; + if (arg0->unk_08 <= 0.0f) { + arg0->unk_08 = 0.0f; arg0->unk00_field2 = 1; } - arg1->trans.y = spC.y + (lbl_801D5830 * cos((lbl_801D5838 * arg0->unk_08) / lbl_801D5840)); - arg1->rot.y = sin((lbl_801D5838 * temp) / lbl_801D5840); - arg0->unk_08 -= lbl_801D5848; + arg1->trans.y = spC.y + (700.0f * cos((M_PI * arg0->unk_08) / 180.0)); + arg1->rot.y = sin((M_PI * temp) / 180.0); + arg0->unk_08 -= 1.5f; arg0->unk_06 -= 30; } -void HideBox(ItemGiveWork2* arg0, omObjData* arg1) { +static void HideBox(ItemGiveWork2* arg0, omObjData* arg1) { arg0->unk_04 -= 4; if (arg0->unk_04 < 0) { @@ -301,23 +315,20 @@ void HideBox(ItemGiveWork2* arg0, omObjData* arg1) { BoardModelAlphaSet(arg0->unk_02, arg0->unk_04); } -extern f32 lbl_801D584C; -extern f32 lbl_801D5850; - -void CenterBox(ItemGiveWork2* arg0, omObjData* arg1) { - Point3d sp20; - Point3d sp14; - Point3d sp8; +static void CenterBox(ItemGiveWork2* arg0, omObjData* arg1) { + Vec sp20; + Vec sp14; + Vec sp8; sp14.x = arg1->trans.x; sp14.y = arg1->trans.y; sp14.z = arg1->trans.z; BoardPlayerPosGet(arg0->unk00_field5, &sp20); PSVECSubtract(&sp20, &sp14, &sp8); - PSVECScale(&sp8, &sp8, lbl_801D584C); + PSVECScale(&sp8, &sp8, 0.2f); PSVECAdd(&sp8, &sp14, &sp14); - if (BoardVecMaxDistXZCheck(&sp20, &sp14, lbl_801D5850) != 0) { + if (BoardVecMaxDistXZCheck(&sp20, &sp14, 3.0f) != 0) { arg1->trans.x = sp20.x; arg1->trans.z = sp20.z; arg0->unk00_field2 = 1; @@ -327,8 +338,8 @@ void CenterBox(ItemGiveWork2* arg0, omObjData* arg1) { arg1->trans.z = sp14.z; } -void InitBox(s32 arg0) { - Point3d sp10; +static void InitBox(s32 arg0) { + Vec sp10; s32 sp8[2] = {0x0007006D, 0x0007006E}; s32 var_r29; s32 var_r28; @@ -347,28 +358,28 @@ void InitBox(s32 arg0) { temp_r31->unk00_field1 = i; temp_r31->unk00_field2 = 0; temp_r31->unk_06 = 0; - temp_r31->unk_08 = lbl_801D581C; + temp_r31->unk_08 = 0.0f; temp_r31->unk_04 = 0xFF; boxObj[i]->trans.x = sp10.x + boxOfs[i]; - boxObj[i]->trans.y = lbl_801D585C + sp10.y; + boxObj[i]->trans.y = 700.0f + sp10.y; boxObj[i]->trans.z = sp10.z; - boxObj[i]->rot.x = lbl_801D581C; - boxObj[i]->rot.y = lbl_801D5860; - boxObj[i]->rot.z = lbl_801D581C; + boxObj[i]->rot.x = 0.0f; + boxObj[i]->rot.y = 180.0f; + boxObj[i]->rot.z = 0.0f; temp_r31->unk_02 = BoardModelCreate(0x70005, NULL, 0); BoardModelPosSet(temp_r31->unk_02, boxObj[i]->trans.x, boxObj[i]->trans.y, boxObj[i]->trans.z); - BoardModelMotionSpeedSet(temp_r31->unk_02, lbl_801D581C); + BoardModelMotionSpeedSet(temp_r31->unk_02, 0.0f); BoardModelLayerSet(temp_r31->unk_02, 2U); } HuAudFXPlay(0x340); - if (BoardRandFloat() < lbl_801D5864) { + if (BoardRandFloat() < 0.5f) { var_r28 = 0; } else { var_r28 = 1; } itemResult = (s8) var_r28; - if (BoardRandFloat() < lbl_801D5864) { + if (BoardRandFloat() < 0.5f) { var_r27 = 0; } else { var_r27 = 1; @@ -384,14 +395,14 @@ void InitBox(s32 arg0) { itemMdl = BoardModelCreate(sp8[itemResult], NULL, 0); BoardModelVisibilitySet(itemMdl, 0); temp_r31 = OM_GET_WORK_PTR(boxObj[var_r29], boxObjWork); - BoardModelScaleSet(temp_r31->unk_02, lbl_801D5848, lbl_801D5848, lbl_801D5848); + BoardModelScaleSet(temp_r31->unk_02, 1.5f, 1.5f, 1.5f); } -void MarkKillBox(void) { +static void MarkKillBox(void) { s32 i; boxObjWork* temp_r30; - for (i = 0; i < ARRAY_COUNT(boxObj); i++) { + for (i = 0; i < 2; i++) { if (boxObj[i]) { temp_r30 = OM_GET_WORK_PTR(boxObj[i], boxObjWork); temp_r30->unk00_field0 = 1; @@ -399,37 +410,35 @@ void MarkKillBox(void) { } } -void SetBoxHide(s32 arg0) { +static void SetBoxHide(s32 arg0) { boxObjWork* temp_r31 = OM_GET_WORK_PTR(boxObj[arg0], boxObjWork); temp_r31->unk00_field2 = 3; } -void SetBoxCenter(s32 arg0) { +static void SetBoxCenter(s32 arg0) { boxObjWork* temp_r31 = OM_GET_WORK_PTR(boxObj[arg0], boxObjWork); temp_r31->unk00_field2 = 4; HuAudFXPlay(0x341); } -void SetBoxShow(s32 arg0) { +static void SetBoxShow(s32 arg0) { boxObjWork* temp_r31 = OM_GET_WORK_PTR(boxObj[arg0], boxObjWork); temp_r31->unk00_field2 = 2; } -extern f32 lbl_801D5868; - -void WaitBoxOpen(s32 arg0) { +static void WaitBoxOpen(s32 arg0) { boxObjWork* temp_r31 = OM_GET_WORK_PTR(boxObj[arg0], boxObjWork); - BoardModelMotionSpeedSet(temp_r31->unk_02, lbl_801D5868); + BoardModelMotionSpeedSet(temp_r31->unk_02, 2.0f); do { HuPrcVSleep(); } while (BoardModelMotionEndCheck(temp_r31->unk_02) == 0); } -void WaitBoxCenter(s32 arg0) { +static void WaitBoxCenter(s32 arg0) { boxObjWork* temp_r31 = OM_GET_WORK_PTR(boxObj[arg0], boxObjWork); while (temp_r31->unk00_field2 != 1) { @@ -437,11 +446,11 @@ void WaitBoxCenter(s32 arg0) { } } -s32 CheckBox(void) { +static s32 CheckBox(void) { s32 i; boxObjWork* box; - for (i = 0; i < ARRAY_COUNT(boxObj); i++) { + for (i = 0; i < 2; i++) { box = OM_GET_WORK_PTR(boxObj[i], boxObjWork); if (box->unk00_field7 == 0) { return 0; @@ -450,20 +459,10 @@ s32 CheckBox(void) { return 1; } -extern f32 lbl_801D5860; -extern s32 lbl_801D586C; -extern s32 lbl_801D5870; -extern f32 lbl_801D5874; -extern f32 lbl_801D5878; -extern f32 lbl_801D587C; -extern f32 lbl_801D5880; -extern f32 lbl_801D5884; -extern s8 itemResult; - -void DoItemGive(omObjData* arg0) { - Point3d sp28; - Point3d sp1C; - Point3d sp10; +static void DoItemGive(omObjData* arg0) { + Vec sp28; + Vec sp1C; + Vec sp10; s32 sp8[2] = {0, 1}; itemObjWork* temp_r31; @@ -479,15 +478,15 @@ void DoItemGive(omObjData* arg0) { BoardModelPosGet(itemMdl, &sp28); BoardModelRotGet(itemMdl, &sp1C); BoardPlayerPosGet(temp_r31->unk00_field1, &sp10); - sp10.y += lbl_801D5860; + sp10.y += 180.0f; switch (temp_r31->unk00_field2) { case 2: if (temp_r31->unk_02 < 12) { - temp_r31->unk_04 += lbl_801D5874; + temp_r31->unk_04 += 1.47f; sp28.y += temp_r31->unk_04; } else if (temp_r31->unk_02 <= 24) { - BoardModelRotSet(itemMdl, lbl_801D5878 * temp_r31->unk_02, lbl_801D581C, lbl_801D581C); + BoardModelRotSet(itemMdl, 30.0f * temp_r31->unk_02, 0.0f, 0.0f); } else if (temp_r31->unk_02 > 36) { temp_r31->unk00_field2 = 0; return; @@ -495,10 +494,10 @@ void DoItemGive(omObjData* arg0) { temp_r31->unk_02++; break; case 0: - temp_r31->unk_04 += lbl_801D587C; + temp_r31->unk_04 += -1.47f; - if (temp_r31->unk_08 > lbl_801D5880) { - temp_r31->unk_08 -= lbl_801D5884; + if (temp_r31->unk_08 > 0.001f) { + temp_r31->unk_08 -= 0.005f; } sp28.y += temp_r31->unk_04; @@ -519,14 +518,8 @@ void DoItemGive(omObjData* arg0) { BoardModelScaleSet(itemMdl, temp_r31->unk_08, temp_r31->unk_08, temp_r31->unk_08); } -extern Process *boardObjMan; -void DoItemGive(omObjData*); -extern s16 itemMdl; -extern f32 lbl_801D5890; -extern u8 pickerChoice; - -void StartItemGive(s32 arg0) { - Point3d spC; +static void StartItemGive(s32 arg0) { + Vec spC; itemObjWork* temp_r31; boxObjWork* box; @@ -537,28 +530,28 @@ void StartItemGive(s32 arg0) { temp_r31->unk00_field1 = arg0; temp_r31->unk00_field2 = 1; temp_r31->unk_02 = 0; - temp_r31->unk_04 = lbl_801D581C; - temp_r31->unk_08 = lbl_801D5890; + temp_r31->unk_04 = 0.0f; + temp_r31->unk_08 = 1.0f; box = OM_GET_WORK_PTR(boxObj[pickerChoice], boxObjWork); BoardModelPosGet(box->unk_02, &spC); BoardModelPosSetV(itemMdl, &spC); } -void KillItemMdl(void) { +static void KillItemMdl(void) { if (itemMdl != -1) { BoardModelKill(itemMdl); itemMdl = -1; } } -void ShowItemMdl(void) { +static void ShowItemMdl(void) { itemObjWork* temp_r31 = OM_GET_WORK_PTR(itemGiveObj, itemObjWork); temp_r31->unk00_field2 = 2; BoardModelVisibilitySet(itemMdl, 1); } -void WaitItemGive(void) { +static void WaitItemGive(void) { itemObjWork* temp_r31 = OM_GET_WORK_PTR(itemGiveObj, itemObjWork); while (temp_r31->unk00_field2 != 1) {