#include "game/board/item.h" #include "game/audio.h" #include "game/board/audio.h" #include "game/board/boo.h" #include "game/board/char_wheel.h" #include "game/board/com.h" #include "game/board/main.h" #include "game/board/model.h" #include "game/board/player.h" #include "game/board/space.h" #include "game/board/star.h" #include "game/board/ui.h" #include "game/board/view.h" #include "game/board/window.h" #include "game/chrman.h" #include "game/data.h" #include "game/frand.h" #include "game/gamework.h" #include "game/gamework_data.h" #include "game/hsfanim.h" #include "game/hsfman.h" #include "game/objsub.h" #include "game/pad.h" #include "game/process.h" #include "game/sprite.h" #include "game/window.h" #include "game/wipe.h" #include "ext_math.h" typedef struct { /* 0x00 */ s16 unk00; /* 0x02 */ s16 unk02; /* 0x04 */ float unk04; /* 0x08 */ float unk08; /* 0x0C */ float unk0C; /* 0x10 */ Vec unk10; } UnkItemProcUserData; // Size unknown typedef struct { /* 0x00 */ s16 unk00; /* 0x02 */ s16 unk02; /* 0x04 */ float unk04; /* 0x08 */ float unk08; /* 0x0C */ char unk0C[4]; /* 0x10 */ float unk10; /* 0x14 */ float unk14; /* 0x18 */ float unk18; /* 0x1C */ s16 unk1C; } UnkItemShowProcStruct; // Size unknown typedef struct { /* 0x00 */ float unk00; /* 0x04 */ Vec unk04; /* 0x04 */ Vec unk10; } UnkGenieCameraStruct; // Size 0x1C static void ItemProcess(void); static void RestoreProcess(void); static void ItemDestroy(void); static void RestoreDestroy(void); static void ItemSizeShowAnim(void); static void ItemRotProc(void); static Process *ItemShowProc(UnkItemShowProcStruct *arg0, Vec *arg1); static s16 ItemGetTarget(void); static void ItemSizeSet(s32 arg0); static void ExecItemMini(void); static void ExecItemMega(void); static void ExecItemMiniSuper(void); static void ExecItemMegaSuper(void); static void ExecItemHammer(void); static void ExecItemPipe(void); static void ExecItemSwap(void); static void ExecItemSpark(void); static void ExecItemLight(void); static void ExecItemWhistle(void); static void ExecItemBowser(void); static void ExecItemBooBall(void); static void LampParticleUpdate(ModelData *model, ParticleData *particle, Mtx matrix); static void GenieParticleUpdate(ModelData *model, ParticleData *particle, Mtx matrix); static void GenieCameraProc(void); static void GenieCameraCalc(UnkGenieCameraStruct *arg0, s32 arg1, float arg2, Vec *arg3, Vec *arg4); static void GenieSceneExec(void); static void ExecItemGenie(void); static void ExecItemBagJump(void); static void ExecItemBagShow(void); static void ExecItemBag(void); static void RestoreItemNull(void); static void RestoreItemMini(void); static void RestoreItemMega(void); static void RestoreItemMiniSuper(void); static void RestoreItemMegaSuper(void); static void RestoreItemBowser(void); static Vec booBallScale; static Vec booBallPos; static Vec booCamUp; static Vec booCamTarget; static Vec booCamPos; static s16 itemBagItems[3]; static s8 currItemRestore; static s8 currItem; static s16 suitMdl; static s32 suitMot[2]; static s32 suitCommonMot[2]; static s16 booBallMdl; static float booBallAlpha; static char booCoinStr[8]; static float genieFov; static AnimData *genieParticleAnim; static s16 geniePlayerMot[3]; static Process *itemProc; s32 lbl_801D37A0[2] = { DATA_MAKE_NUM(DATADIR_BOARD, 117), -1 }; static void (*itemFuncTbl[])(void) = { ExecItemMini, ExecItemMega, ExecItemMiniSuper, ExecItemMegaSuper, ExecItemHammer, ExecItemPipe, ExecItemSwap, ExecItemSpark, ExecItemLight, ExecItemWhistle, ExecItemBowser, ExecItemBooBall, ExecItemGenie, ExecItemBag }; static void (*itemRestoreFuncTbl[])(void) = { RestoreItemMini, RestoreItemMega, RestoreItemMiniSuper, RestoreItemMegaSuper, RestoreItemNull, RestoreItemNull, RestoreItemNull, RestoreItemNull, RestoreItemNull, RestoreItemNull, RestoreItemBowser, RestoreItemNull, RestoreItemNull, RestoreItemNull }; static s32 itemMdlTbl[] = { DATA_MAKE_NUM(DATADIR_BOARD, 109), DATA_MAKE_NUM(DATADIR_BOARD, 110), DATA_MAKE_NUM(DATADIR_BOARD, 111), DATA_MAKE_NUM(DATADIR_BOARD, 112), DATA_MAKE_NUM(DATADIR_BOARD, 113), DATA_MAKE_NUM(DATADIR_BOARD, 114), DATA_MAKE_NUM(DATADIR_BOARD, 115), DATA_MAKE_NUM(DATADIR_BOARD, 116), DATA_MAKE_NUM(DATADIR_BOARD, 118), DATA_MAKE_NUM(DATADIR_BOARD, 119), DATA_MAKE_NUM(DATADIR_BOARD, 120), DATA_MAKE_NUM(DATADIR_BOARD, 121), DATA_MAKE_NUM(DATADIR_BOARD, 122), DATA_MAKE_NUM(DATADIR_BOARD, 123) }; static s32 forceMoveSfxTbl[] = { 0x38, 0x45, 0x42, 0x4D, 0x48, 0x3F }; static s32 callMotTbl[] = { DATA_MAKE_NUM(DATADIR_MARIOMOT, 82), DATA_MAKE_NUM(DATADIR_LUIGIMOT, 82), DATA_MAKE_NUM(DATADIR_PEACHMOT, 82), DATA_MAKE_NUM(DATADIR_YOSHIMOT, 82), DATA_MAKE_NUM(DATADIR_WARIOMOT, 82), DATA_MAKE_NUM(DATADIR_DONKEYMOT, 82), DATA_MAKE_NUM(DATADIR_DAISYMOT, 82), DATA_MAKE_NUM(DATADIR_WALUIGIMOT, 82) }; static char *callHookTbl[] = { "c000m01-itemhook-r", "c001m01-itemhook-r", "c002m01-itemhook-r", "c003m01-itemhook-r", "c004m01-itemhook-r", "c005m01-itemhook-r", "c006m01-itemhook-r", "c007m01-itemhook-r" }; static s32 callAttackMotTbl[] = { DATA_MAKE_NUM(DATADIR_W01, 31), DATA_MAKE_NUM(DATADIR_W02, 5), DATA_MAKE_NUM(DATADIR_W03, 29), DATA_MAKE_NUM(DATADIR_W04, 9), DATA_MAKE_NUM(DATADIR_W05, 7), DATA_MAKE_NUM(DATADIR_W06, 19) }; static s32 callAttackMotTbl2[] = { DATA_MAKE_NUM(DATADIR_W01, 32), DATA_MAKE_NUM(DATADIR_W02, 6), DATA_MAKE_NUM(DATADIR_W03, 30), DATA_MAKE_NUM(DATADIR_W04, 10), DATA_MAKE_NUM(DATADIR_W05, 8), DATA_MAKE_NUM(DATADIR_W06, 20) }; static s32 suitMotTbl[][2] = { { DATA_MAKE_NUM(DATADIR_BKOOPASUIT, 1), DATA_MAKE_NUM(DATADIR_BKOOPASUIT, 2) }, { DATA_MAKE_NUM(DATADIR_BKOOPASUIT, 4), DATA_MAKE_NUM(DATADIR_BKOOPASUIT, 5) }, { DATA_MAKE_NUM(DATADIR_BKOOPASUIT, 7), DATA_MAKE_NUM(DATADIR_BKOOPASUIT, 8) }, { DATA_MAKE_NUM(DATADIR_BKOOPASUIT, 10), DATA_MAKE_NUM(DATADIR_BKOOPASUIT, 11) }, { DATA_MAKE_NUM(DATADIR_BKOOPASUIT, 13), DATA_MAKE_NUM(DATADIR_BKOOPASUIT, 14) }, { DATA_MAKE_NUM(DATADIR_BKOOPASUIT, 16), DATA_MAKE_NUM(DATADIR_BKOOPASUIT, 17) }, { DATA_MAKE_NUM(DATADIR_BKOOPASUIT, 19), DATA_MAKE_NUM(DATADIR_BKOOPASUIT, 20) }, { DATA_MAKE_NUM(DATADIR_BKOOPASUIT, 22), DATA_MAKE_NUM(DATADIR_BKOOPASUIT, 23) } }; void BoardItemStart(s32 arg0, s32 arg1) { currItemRestore = arg0; currItem = arg1; suitMdl = -1; itemProc = HuPrcChildCreate(ItemProcess, 0x2004, 0x1000, 0, boardMainProc); HuPrcDestructorSet2(itemProc, ItemDestroy); } BOOL BoardItemDoneCheck(void) { if (itemProc) { return FALSE; } else { return TRUE; } } void BoardItemPlayerRestore(s32 arg0, s32 arg1) { currItemRestore = arg0; currItem = arg1; itemProc = HuPrcChildCreate(RestoreProcess, 0x2004, 0x1000, 0, boardMainProc); HuPrcDestructorSet2(itemProc, RestoreDestroy); } static void ItemProcess(void) { void (*temp_r31)(void) = itemFuncTbl[currItem]; HuPrcChildCreate(temp_r31, 0x2003, 0x1000, 0, HuPrcCurrentGet()); HuPrcChildWatch(); HuPrcEnd(); } static void RestoreProcess(void) { void (*temp_r31)(void) = itemRestoreFuncTbl[currItem]; HuPrcChildCreate(temp_r31, 0x2003, 0x1000, 0, HuPrcCurrentGet()); HuPrcChildWatch(); HuPrcEnd(); } static void ItemDestroy(void) { itemProc = NULL; } static void RestoreDestroy(void) { itemProc = NULL; } static void ItemSizeShowAnim(void) { Vec sp24; Vec sp18; Vec spC; float sp8; float var_f31; s32 i; sp8 = 1.0f; var_f31 = 180.0f; BoardPlayerPosGet(currItemRestore, &sp24); BoardPlayerRotGet(currItemRestore, &spC); sp24.y += 300.0f; sp18.x = sp18.y = sp18.z = 1.0f; BoardModelRotSetV(suitMdl, &spC); BoardModelPosSetV(suitMdl, &sp24); for (i = 0; i < 120; i++) { sp24.y += 3.0 * sind(var_f31); BoardModelPosSetV(suitMdl, &sp24); var_f31 += 9.0f; if (var_f31 >= 360.0f) { var_f31 -= 360.0f; } HuPrcVSleep(); } for (i = 0; i < 30; i++) { sp24.y -= 6.6666665f; sp18.x -= 0.03f; sp18.y -= 0.03f; sp18.z -= 0.03f; BoardModelScaleSetV(suitMdl, &sp18); BoardModelPosSetV(suitMdl, &sp24); HuPrcVSleep(); } BoardModelKill(suitMdl); } static void ItemRotProc(void) { Vec sp20; Vec sp14; Vec sp8; UnkItemProcUserData *temp_r31; temp_r31 = HuPrcCurrentGet()->user_data; BoardModelPosGet(temp_r31->unk02, &sp20); BoardModelRotGet(temp_r31->unk02, &sp8); temp_r31->unk0C = 0.0f; while (1) { if (temp_r31->unk00 == 0) { sp14 = sp20; sp14.y += temp_r31->unk04 * sind(temp_r31->unk0C); BoardModelPosSetV(temp_r31->unk02, &sp14); temp_r31->unk0C += temp_r31->unk08; if (temp_r31->unk0C >= 360.0f) { temp_r31->unk0C -= 360.0f; } VECAdd(&sp8, &temp_r31->unk10, &sp8); if (sp8.x < 0.0f) { sp8.x += 360.0f; } if (sp8.x >= 360.0f) { sp8.x -= 360.0f; } if (sp8.y < 0.0f) { sp8.y += 360.0f; } if (sp8.y >= 360.0f) { sp8.y -= 360.0f; } if (sp8.z < 0.0f) { sp8.z += 360.0f; } if (sp8.z >= 360.0f) { sp8.z -= 360.0f; } BoardModelRotSetV(temp_r31->unk02, &sp8); } HuPrcVSleep(); } } // TODO: needs the inline keyword to be inlined into ExecItemHammer, but adding it messes up sdata2. // sdata2 order should be: 1000.0f, 0.15f, then 20.0f. // With the inline keyword, it becomes 0.15f, 20.0f, then 1000.0f (workaround in BoardUiInlineFunc02 below). static inline void BoardUiInlineFunc01(Vec *arg0) { Vec sp30; Vec sp3C; Vec sp48; Vec sp54; float spC; float var_f31; s32 i; spC = 1.0f; BoardPlayerPosGet(currItemRestore, &sp30); BoardPlayerRotGet(currItemRestore, &sp48); sp3C = sp30; sp3C.y += 1000.0f; sp54.x = sp54.y = sp54.z = 1.0f; BoardModelRotSetV(suitMdl, &sp48); BoardModelPosSetV(suitMdl, &sp3C); while (1) { var_f31 = 0.15f * (sp3C.y - (sp30.y + 300.0f)); if (var_f31 > 20.0f) { var_f31 = 20.0f; } if (var_f31 < 1.0f) { var_f31 = 1.0f; } if (fabs(sp3C.y - (sp30.y + 300.0f)) < var_f31) { break; } sp3C.y -= var_f31; BoardModelPosSetV(suitMdl, &sp3C); VECAdd(&sp48, arg0, &sp48); for (i = 0; i < 3; i++) { if (((float *)&sp48)[i] < 0.0f) { ((float *)&sp48)[i] += 360.0f; } if (((float *)&sp48)[i] >= 360.0f) { ((float *)&sp48)[i] -= 360.0f; } } BoardModelRotSetV(suitMdl, &sp48); HuPrcVSleep(); } sp3C.y = sp30.y + 300.0f; BoardModelPosSetV(suitMdl, &sp3C); } static void BoardUiInlineFunc02(void) { Vec sp18; Vec sp24; float sp8; float var_f30; (void)1000.0f; // TODO: fix this. sp8 = 1.0f; BoardModelPosGet(suitMdl, &sp24); BoardPlayerPosGet(currItemRestore, &sp18); while (1) { var_f30 = 0.15f * (sp24.y - sp18.y - 300.0f); if (var_f30 > 20.0f) { var_f30 = 20.0f; } if (var_f30 < 1.0f) { var_f30 = 1.0f; } if (fabs(sp24.y - 1000.0f) <= var_f30) { break; } sp24.y += var_f30; BoardModelPosSetV(suitMdl, &sp24); HuPrcVSleep(); } sp24.y = 1000.0f; BoardModelPosSetV(suitMdl, &sp24); } static inline void BoardUiInlineFunc03(s32 arg0) { Vec sp8; Vec sp14; s32 space = GWPlayer[arg0].space_curr; BoardSpacePosGet(0, space, &sp14); BoardPlayerPosGet(arg0, &sp8); BoardPlayerPosLerpStart(arg0, &sp8, &sp14, 0x14); while (GWPlayer[arg0].moving) { HuPrcVSleep(); } BoardPlayerMotBlendSet(arg0, 0, 7); while (!BoardPlayerMotBlendCheck(arg0)) { HuPrcVSleep(); } BoardPlayerIdleSet(arg0); } static inline void BoardUiInlineFunc04(Process *arg0, s32 arg1) { UnkItemShowProcStruct *temp_r19 = arg0->user_data; temp_r19->unk00 = arg1; } static inline Process *BoardUiInlineFunc05(UnkItemShowProcStruct *arg0) { Process *temp_r27; temp_r27 = HuPrcCreate(ItemRotProc, 0x2004, 0x1000, 0); temp_r27->user_data = arg0; BoardUiInlineFunc04(temp_r27, 0); return temp_r27; } static Process *ItemShowProc(UnkItemShowProcStruct *arg0, Vec *arg1) { Vec sp20; Vec sp14; Vec sp8; Process *var_r29; var_r29 = NULL; BoardPlayerPosGet(currItemRestore, &sp20); BoardPlayerRotGet(currItemRestore, &sp14); sp20.y += 300.0f; if (currItem == 0xD) { sp20.y -= 50.0f; } if (arg1 == NULL) { sp8.x = sp8.y = sp8.z = 1.0f; } else { sp8 = *arg1; } if (suitMdl >= 0) { BoardModelLayerSet(suitMdl, 2); BoardModelRotSetV(suitMdl, &sp14); BoardModelPosSetV(suitMdl, &sp20); BoardModelScaleSetV(suitMdl, &sp8); BoardModelVisibilitySet(suitMdl, 0); } BoardCameraRotGet(&sp14); if (arg0 == NULL || arg0->unk1C != 0) { CharModelLayerSetAll(3); sp20.y += 35.0f; sp20.z += 50.0 * cosd(sp14.y); sp20.x += 50.0 * sind(sp14.y); CharModelEffectCreate(1, &sp20); HuPrcSleep(10); } if (suitMdl >= 0) { BoardModelVisibilitySet(suitMdl, 1); if (arg0 != NULL) { var_r29 = BoardUiInlineFunc05(arg0); } } HuPrcSleep(30); return var_r29; } static s16 ItemGetTarget(void) { s32 sp20[4]; s32 sp10[4]; float sp8[2]; s16 temp_r22; s16 temp_r29; s32 temp_r24; s32 var_r28; s32 temp_r21; s32 var_r27; u8 var_r26; s32 var_r25; s32 var_r30; s32 var_r31; s32 temp_r23; var_r28 = 0; var_r27 = 0; for (var_r31 = 0; var_r31 < 4; var_r31++) { if (var_r31 != currItemRestore) { sp20[var_r27++] = var_r31; HuWinInsertMesSizeGet(GWPlayerCfg[var_r31].character, var_r28); var_r28++; } } HuWinMesMaxSizeGet(1, sp8, MAKE_MESSID(18, 14)); temp_r29 = HuWinCreate(-10000.0f, -10000.0f, sp8[0], sp8[1], 0); if (!GWPlayer[currItemRestore].com) { winData[temp_r29].active_pad = (1 << GWPlayer[currItemRestore].port); } for (var_r31 = 0; var_r31 < var_r27; var_r31++) { HuWinInsertMesSet(temp_r29, GWPlayerCfg[sp20[var_r31]].character, var_r31); } HuWinMesSet(temp_r29, MAKE_MESSID(18, 14)); if (GWPlayer[currItemRestore].com) { var_r26 = 0xF; } else { var_r26 = 0; for (var_r31 = 0; var_r31 < 4; var_r31++) { if (var_r31 != currItemRestore) { var_r26 = (1 << GWPlayer[var_r31].port); } } } HuWinDisablePlayerSet(temp_r29, var_r26); if (GWPlayer[currItemRestore].com) { temp_r23 = GWPlayer[currItemRestore].port; temp_r21 = frandmod(3); temp_r24 = GWMessDelayGet(); for (var_r25 = 0; var_r25 < temp_r21; var_r25++) { for (var_r30 = 0; var_r30 < 4; var_r30++) { sp10[var_r30] = 0; } sp10[temp_r23] = 4; HuWinComKeyWait(sp10[0], sp10[1], sp10[2], sp10[3], temp_r24); } for (var_r30 = 0; var_r30 < 4; var_r30++) { sp10[var_r30] = 0; } sp10[temp_r23] = 0x100; HuWinComKeyWait(sp10[0], sp10[1], sp10[2], sp10[3], temp_r24); } HuWinAttrSet(temp_r29, 0x10); HuWinMesSpeedSet(temp_r29, 0); temp_r22 = sp20[HuWinChoiceGet(temp_r29, 0)]; HuWinKill(temp_r29); return temp_r22; } static void ItemSizeSet(s32 arg0) { float sp24[9]; float sp14[4]; float sp8[3] = { 1.0f, 0.3f, 2.5f }; float var_f31; float temp_f30; s16 temp_r28; s32 var_r27; s16 temp_r26; s32 i; s32 j; var_f31 = sp8[BoardPlayerSizeGet(currItemRestore)]; sp14[0] = var_f31; sp14[1] = var_f31 + (sp8[arg0] - var_f31) / 3.0f; sp14[2] = var_f31 + (sp8[arg0] - var_f31) / 1.5f; sp14[3] = sp8[arg0]; sp24[0] = sp14[1]; sp24[1] = sp14[0]; sp24[2] = sp14[1]; sp24[3] = sp14[2]; sp24[4] = sp14[1]; sp24[5] = sp14[2]; sp24[6] = sp14[3]; sp24[7] = sp14[2]; sp24[8] = sp14[3]; temp_r26 = BoardPlayerModelGet(currItemRestore); temp_r28 = BoardModelIDGet(temp_r26); Hu3DModelAttrSet(temp_r28, HU3D_MOTATTR_PAUSE); var_r27 = 0; for (i = 0; i < 9; i++) { temp_f30 = (sp24[var_r27++] - var_f31) / 10.0f; for (j = 0; j < 10; j++) { BoardPlayerScaleSet(currItemRestore, var_f31, var_f31, var_f31); var_f31 += temp_f30; HuPrcVSleep(); } } Hu3DModelAttrReset(temp_r28, HU3D_MOTATTR_PAUSE); BoardPlayerSizeSet(currItemRestore, arg0); } static void ExecItemMini(void) { suitMdl = BoardModelCreate(itemMdlTbl[currItem], NULL, 0); BoardModelLayerSet(suitMdl, 2); HuAudFXPlay(0x350); ItemShowProc(NULL, NULL); ItemSizeShowAnim(); HuAudFXPlay(0x314); omVibrate(currItemRestore, 90, 6, 6); HuAudFXPlay(0x313); ItemSizeSet(1); HuPrcSleep(60); HuPrcKill(NULL); while (1) { HuPrcVSleep(); } } static void ExecItemMega(void) { suitMdl = BoardModelCreate(itemMdlTbl[currItem], NULL, 0); BoardModelLayerSet(suitMdl, 2); HuAudFXPlay(0x350); ItemShowProc(NULL, NULL); ItemSizeShowAnim(); HuAudFXPlay(0x312); omVibrate(currItemRestore, 90, 4, 2); HuAudFXPlay(0x311); ItemSizeSet(2); HuPrcSleep(60); HuPrcKill(NULL); while (1) { HuPrcVSleep(); } } static void ExecItemMiniSuper(void) { suitMdl = BoardModelCreate(itemMdlTbl[currItem], NULL, 0); BoardModelLayerSet(suitMdl, 2); HuAudFXPlay(0x350); ItemShowProc(NULL, NULL); ItemSizeShowAnim(); HuAudFXPlay(0x314); omVibrate(currItemRestore, 90, 4, 2); HuAudFXPlay(0x313); ItemSizeSet(1); HuPrcSleep(60); HuPrcKill(NULL); while (1) { HuPrcVSleep(); } } static void ExecItemMegaSuper(void) { suitMdl = BoardModelCreate(itemMdlTbl[currItem], NULL, 0); BoardModelLayerSet(suitMdl, 2); HuAudFXPlay(0x350); ItemShowProc(NULL, NULL); ItemSizeShowAnim(); HuAudFXPlay(0x312); omVibrate(currItemRestore, 90, 0xC, 0); HuAudFXPlay(0x311); ItemSizeSet(2); HuPrcSleep(60); HuPrcKill(NULL); while (1) { HuPrcVSleep(); } } static void ExecItemHammer(void) { Vec sp6C; Vec sp60; float sp10[2]; s32 i; s16 temp_r28; s16 temp_r27; s16 var_r26; s16 var_r30; HuAudFXPlay(0x350); ItemShowProc(NULL, NULL); temp_r27 = ItemGetTarget(); suitMdl = BoardModelCreate(itemMdlTbl[currItem], NULL, 0); BoardModelLayerSet(suitMdl, 2); var_r30 = frandBool(); if (var_r30 != 0) { BoardModelMotionTimeSet(suitMdl, 1.5f); } else { BoardModelMotionTimeSet(suitMdl, 0.0f); } BoardModelAttrSet(suitMdl, 0x40000002); sp60.x = sp60.y = sp60.z = 2.0f; BoardModelScaleSetV(suitMdl, &sp60); sp6C.x = sp6C.y = sp6C.z = 0.0f; BoardUiInlineFunc01(&sp6C); HuWinMesMaxSizeGet(1, sp10, MAKE_MESSID(18, 17)); temp_r28 = HuWinCreate(-10000.0f, 320.0f, sp10[0], sp10[1], 0); HuWinMesSet(temp_r28, MAKE_MESSID(18, 17)); HuWinBGTPLvlSet(temp_r28, 0.0f); HuWinMesSpeedSet(temp_r28, 0); if (GWPlayer[currItemRestore].com) { var_r26 = frandmod(120) + 30; } for (i = 1; i <= 0x12C; i++) { if (i % 10 == 0) { HuAudFXPlay(0x315); var_r30 ^= 1; if (var_r30 != 0) { BoardModelMotionTimeSet(suitMdl, 1.5f); } else { BoardModelMotionTimeSet(suitMdl, 0.0f); } } if (GWPlayer[currItemRestore].com) { var_r26--; if (var_r26 == 0) { break; } } else { if (HuPadBtnDown[GWPlayerCfg[currItemRestore].pad_idx] & 0x100) { break; } } HuPrcVSleep(); } BoardModelAttrSet(suitMdl, 0x40000002); HuAudFXPlay(0x316); HuWinKill(temp_r28); omVibrate(temp_r27, 12, 6, 6); if (var_r30 != 0) { BoardPlayerAutoSizeSet(temp_r27, 2); } else { BoardPlayerAutoSizeSet(temp_r27, 1); } HuPrcSleep(30); BoardUiInlineFunc02(); BoardModelKill(suitMdl); HuPrcKill(NULL); while (1) { HuPrcVSleep(); } } static void ExecItemPipe(void) { Vec spE4[2]; Vec spCC[2]; Vec spB4[2]; Vec spA8; Vec sp9C; Vec sp90; Vec sp84; Vec sp78; Vec sp6C; Vec sp60; s32 sp58[2]; float sp50[2]; float sp48[2]; s16 sp30[2]; s16 sp2C[2]; float temp_f28; float var_f30; float var_f29; float var_f31; s16 temp_r26; s16 temp_r28; s32 temp_r25; s32 temp_r29; s32 temp_r19; s32 temp_r18; s16 var_r27; s32 var_r30; s32 var_r31; HuAudFXPlay(0x350); ItemShowProc(NULL, NULL); for (var_r31 = 0; var_r31 < 2; var_r31++) { sp30[var_r31] = BoardModelCreate(itemMdlTbl[currItem], NULL, 1); BoardModelLayerSet(sp30[var_r31], 2); sp9C.x = sp9C.z = 2.0f; sp9C.y = 0.0f; BoardModelScaleSetV(sp30[var_r31], &sp9C); BoardModelVisibilitySet(sp30[var_r31], 0); } BoardCharWheelInit(currItemRestore, 3); BoardCharWheelWait(); temp_r26 = BoardCharWheelResultGet(); sp2C[0] = currItemRestore; sp2C[1] = temp_r26; for (var_r31 = 0; var_r31 < 2; var_r31++) { sp58[var_r31] = GWPlayer[sp2C[var_r31]].space_curr; BoardSpacePosGet(0, sp58[var_r31], &spE4[var_r31]); BoardModelPosSetV(sp30[var_r31], &spE4[var_r31]); } if (sp58[0] == sp58[1]) { HuWinMesMaxSizeGet(1, sp48, MAKE_MESSID(18, 18)); temp_r28 = HuWinCreate(-10000.0f, -10000.0f, sp48[0], sp48[1], 0); HuWinMesSet(temp_r28, MAKE_MESSID(18, 18)); HuWinMesWait(temp_r28); HuPrcSleep(180); HuWinKill(temp_r28); } else { BoardUiInlineFunc03(sp2C[1]); HuAudFXPlay(0x318); for (var_r31 = 0; var_r31 < 2; var_r31++) { BoardModelVisibilitySet(sp30[var_r31], 1); BoardPlayerPosGet(sp2C[var_r31], &spCC[var_r31]); } for (var_r31 = 0; var_r31 < 60; var_r31++) { sp9C.y += 0.033333335f; for (var_r30 = 0; var_r30 < 2; var_r30++) { BoardModelScaleSetV(sp30[var_r30], &sp9C); spCC[var_r30].y += 3.3333333f; BoardPlayerPosSetV(sp2C[var_r30], &spCC[var_r30]); } HuPrcVSleep(); } sp9C.y = 2.0f; for (var_r31 = 0; var_r31 < 2; var_r31++) { BoardModelScaleSetV(sp30[var_r31], &sp9C); } HuPrcSleep(10); HuAudFXPlay(0x35A); omVibrate(sp2C[0], 0xC, 4, 2); var_f30 = 5.0f; sp50[0] = spCC[0].y; sp50[1] = spCC[1].y; var_f31 = 1.0f; while (1) { for (var_r31 = 0; var_r31 < 2; var_r31++) { spCC[var_r31].y -= var_f30; BoardPlayerPosSetV(sp2C[var_r31], &spCC[var_r31]); if (GWPlayer[sp2C[var_r31]].character == 5) { var_f31 -= 0.05f; if (var_f31 < 0.65f) { var_f31 = 0.65f; } sp90.x = sp90.y = sp90.z = var_f31; BoardPlayerScaleSetV(sp2C[var_r31], &sp90); } } var_f30 *= 1.08f; if (sp50[0] - spCC[0].y >= 300.0f && sp50[1] - spCC[1].y >= 300.0f) { break; } HuPrcVSleep(); } WipeColorSet(0, 0, 0); WipeCreate(WIPE_MODE_OUT, WIPE_TYPE_NORMAL, 30); while (WipeStatGet() != 0) { HuPrcVSleep(); } BoardCameraMoveSet(0); spA8 = spCC[0]; spCC[0] = spCC[1]; spCC[1] = spA8; var_r31 = sp58[0]; sp58[0] = sp58[1]; sp58[1] = var_r31; for (var_r31 = 0; var_r31 < 2; var_r31++) { GWPlayer[sp2C[var_r31]].space_curr = sp58[var_r31]; } for (var_r31 = 0; var_r31 < 2; var_r31++) { BoardPlayerMoveAwayStartCurr(sp58[var_r31], 1); BoardPlayerPosGet(sp2C[var_r31], &spE4[var_r31]); BoardPlayerPosSetV(sp2C[var_r31], &spCC[var_r31]); } HuPrcVSleep(); BoardCameraMoveSet(1); for (var_r31 = 0; var_r31 < 2; var_r31++) { BoardPlayerMotionStart(sp2C[var_r31], 4, 0); BoardPlayerVoiceEnableSet(sp2C[var_r31], 4, 0); BoardModelVisibilitySet(BoardPlayerModelGet(sp2C[var_r31]), 0); } WipeCreate(WIPE_MODE_IN, WIPE_TYPE_NORMAL, 30); while (WipeStatGet() != 0) { HuPrcVSleep(); } temp_f28 = 19.0f; var_f29 = 0.0f; for (var_r31 = 0; var_r31 < 2; var_r31++) { VECSubtract(&spE4[var_r31], &spCC[var_r31], &spB4[var_r31]); VECScale(&spB4[var_r31], &spB4[var_r31], 0.03f); BoardModelVisibilitySet(BoardPlayerModelGet(sp2C[var_r31]), 1); } HuAudPlayerVoicePlay(currItemRestore, 0x122); var_f31 = 0.65f; var_r27 = 5; while (1) { var_f30 = temp_f28 - 0.06666667f * (var_f29 * var_f29 * 0.25f); var_r30 = 0; for (var_r31 = 0; var_r31 < 2; var_r31++) { if (GWPlayer[sp2C[var_r31]].character == 5) { if (var_r27 != 0) { var_r27--; } else { var_f31 += 0.05f; if (var_f31 > 1.0f) { var_f31 = 1.0f; } sp90.x = sp90.y = sp90.z = var_f31; BoardPlayerScaleSetV(sp2C[var_r31], &sp90); } } spCC[var_r31].y += var_f30; if (fabs(spCC[var_r31].x - spE4[var_r31].x) <= fabs(spB4[var_r31].x)) { spCC[var_r31].x = spE4[var_r31].x; var_r30++; } else { spCC[var_r31].x += spB4[var_r31].x; } if (fabs(spCC[var_r31].z - spE4[var_r31].z) <= fabs(spB4[var_r31].z)) { spCC[var_r31].z = spE4[var_r31].z; var_r30++; } else { spCC[var_r31].z += spB4[var_r31].z; } if (spCC[var_r31].y < spE4[var_r31].y) { spCC[var_r31].y = spE4[var_r31].y; var_r30++; } BoardPlayerPosSetV(sp2C[var_r31], &spCC[var_r31]); } var_f29 += 1.0f; if (var_r30 == 6) { break; } HuPrcVSleep(); } BoardPlayerMotionShiftSet(sp2C[1], 6, 0.0f, 8.0f, HU3D_MOTATTR_LOOP); BoardModelVoiceEnableSet(BoardPlayerModelGet(sp2C[1]), 6, 0); CharModelLayerSetAll(2); BoardPlayerIdleSet(sp2C[0]); for (var_r31 = 0; var_r31 < 45; var_r31++) { sp9C.y -= 0.044444446f; for (var_r30 = 0; var_r30 < 2; var_r30++) { BoardModelScaleSetV(sp30[var_r30], &sp9C); } HuPrcVSleep(); } for (var_r31 = 0; var_r31 < 2; var_r31++) { BoardModelVisibilitySet(sp30[var_r31], 0); } BoardUiInlineFunc03(sp2C[0]); BoardWinCreate(2, MAKE_MESSID(18, 29), -1); BoardWinInsertMesSet(GWPlayerCfg[sp2C[0]].character, 0); BoardWinInsertMesSet(GWPlayerCfg[sp2C[1]].character, 1); BoardWinWait(); BoardWinKill(); BoardPlayerIdleSet(sp2C[1]); HuPrcSleep(8); BoardModelVoiceEnableSet(BoardPlayerModelGet(sp2C[1]), 6, 1); } BoardPlayerVoiceEnableSet(sp2C[0], 4, 1); BoardPlayerVoiceEnableSet(sp2C[1], 4, 1); for (var_r31 = 0; var_r31 < 2; var_r31++) { BoardModelKill(sp30[var_r31]); } HuPrcKill(NULL); while (1) { HuPrcVSleep(); } } static void ExecItemSwap(void) { Vec sp1A4[3]; Vec sp180[3]; Vec sp15C[3]; Vec sp138[3]; s32 spC0[6]; Vec spB4; Vec spA8; Vec sp9C; Vec sp90; Vec sp84; Vec sp78; Vec sp6C; Vec sp60; s16 sp54[6]; Vec sp48; Vec sp3C; float temp_f29; float var_f30; s16 temp_r29; s32 var_r23; s32 var_r22; s32 var_r28; s32 var_r27; s32 var_r26; s32 var_r30; s32 var_r31; s32 temp_r24; s8 var_r21; Mtx sp108; Mtx spD8; HuAudFXPlay(0x350); ItemShowProc(NULL, NULL); BoardCharWheelInit(currItemRestore, 3); BoardCharWheelWait(); temp_r24 = BoardCharWheelResultGet(); suitMdl = BoardModelCreate(itemMdlTbl[currItem], NULL, 0); BoardModelLayerSet(suitMdl, 7); BoardModelAttrSet(suitMdl, 0x400000); sp9C.x = sp9C.y = sp9C.z = 0.0f; sp9C.y = 45.0f; HuAudFXPlay(0x364); BoardUiInlineFunc01(&sp9C); BoardModelPosGet(suitMdl, &spB4); BoardPlayerRotGet(currItemRestore, &sp90); for (var_r27 = 0; var_r27 < 3; var_r27++) { if (((float *)&sp90)[var_r27] < 0.0f) { ((float *)&sp90)[var_r27] += 360.0f; } if (((float *)&sp90)[var_r27] >= 360.0f) { ((float *)&sp90)[var_r27] -= 360.0f; } } BoardModelRotGet(suitMdl, &spA8); while (1) { VECAdd(&spA8, &sp9C, &spA8); for (var_r26 = 0; var_r26 < 3; var_r26++) { if (((float *)&spA8)[var_r26] < 0.0f) { ((float *)&spA8)[var_r26] += 360.0f; } if (((float *)&spA8)[var_r26] >= 360.0f) { ((float *)&spA8)[var_r26] -= 360.0f; } } sp9C.y *= 0.94f; if (sp9C.y <= 6.0f) { sp9C.y = 6.0f; if (fabs(sp90.y - spA8.y) <= sp9C.y) { spA8.y = sp90.y; break; } } BoardModelRotSetV(suitMdl, &spA8); HuPrcVSleep(); } BoardModelRotSetV(suitMdl, &spA8); var_r23 = var_r22 = 0; for (var_r31 = 0; var_r31 < 3; var_r31++) { if (GWPlayer[currItemRestore].items[var_r31] != -1) { var_r23++; } if (GWPlayer[temp_r24].items[var_r31] != -1) { var_r22++; } } if (var_r23 >= var_r22) { var_r28 = var_r23 * 2; } else { var_r28 = var_r22 * 2; } BoardModelRotGet(suitMdl, &sp3C); Hu3DCameraSet(0, sp108); PSMTXInverse(sp108, spD8); Hu3DMtxRotGet(spD8, &sp48); sp3C.x = sp48.x; for (var_r31 = 0; var_r31 < var_r28 / 2; var_r31++) { temp_r29 = sp54[var_r31] = BoardModelCreate(itemMdlTbl[currItem], NULL, 1); BoardModelLayerSet(temp_r29, 6); BoardModelPassSet(temp_r29, 0); BoardModelRotSetV(temp_r29, &sp3C); BoardModelVisibilitySet(temp_r29, 0); BoardModelAttrSet(temp_r29, 0x400000); temp_r29 = sp54[var_r31 + 3] = BoardModelCreate(itemMdlTbl[currItem], NULL, 1); BoardModelLayerSet(temp_r29, 6); BoardModelPassSet(temp_r29, 0); BoardModelRotSetV(temp_r29, &sp3C); BoardModelVisibilitySet(temp_r29, 0); BoardModelAttrSet(temp_r29, 0x400000); } BoardItemGetDestPos(currItemRestore, &sp15C[0]); BoardItemGetDestPos(temp_r24, &sp138[0]); BoardModelPosGet(suitMdl, &sp90); VECSubtract(&sp90, &Hu3DCamera->pos, &sp90); temp_f29 = VECMag(&sp90); for (var_r31 = 0; var_r31 < 3; var_r31++) { sp15C[var_r31].z = temp_f29; sp138[var_r31].z = temp_f29; } for (var_r31 = 0; var_r31 < var_r28 / 2; var_r31++) { HuAudFXPlay(0x319); BoardModelVisibilitySet(sp54[var_r31], 1); BoardModelVisibilitySet(sp54[var_r31 + 3], 1); sp1A4[var_r31] = sp180[var_r31] = spB4; Hu3D2Dto3D(&sp15C[var_r31], 1, &sp84); Hu3D2Dto3D(&sp138[var_r31], 1, &sp78); VECSubtract(&sp84, &sp1A4[var_r31], &sp6C); VECScale(&sp6C, &sp6C, 0.033333335f); VECSubtract(&sp78, &sp180[var_r31], &sp60); VECScale(&sp60, &sp60, 0.033333335f); for (var_r30 = 0; var_r30 < 30; var_r30++) { BoardModelPosSetV(sp54[var_r31], &sp1A4[var_r31]); BoardModelPosSetV(sp54[var_r31 + 3], &sp180[var_r31]); VECAdd(&sp1A4[var_r31], &sp6C, &sp1A4[var_r31]); VECAdd(&sp180[var_r31], &sp60, &sp180[var_r31]); HuPrcVSleep(); } sp1A4[var_r31] = sp84; sp180[var_r31] = sp78; BoardModelPosSetV(sp54[var_r31], &sp1A4[var_r31]); BoardModelPosSetV(sp54[var_r31 + 3], &sp180[var_r31]); } omVibrate(currItemRestore, 180, 6, 6); omVibrate(temp_r24, 180, 6, 6); for (var_r31 = 0; var_r31 < 60; var_r31++) { for (var_r30 = 0; var_r30 < var_r28 / 2; var_r30++) { sp6C = sp1A4[var_r30]; sp6C.x += 3.0 * sind(frandmods(360)); sp6C.y += 3.0 * sind(frandmods(360)); BoardModelPosSetV(sp54[var_r30], &sp6C); sp6C = sp180[var_r30]; sp6C.x += 3.0 * sind(frandmods(360)); sp6C.y += 3.0 * sind(frandmods(360)); BoardModelPosSetV(sp54[var_r30 + 3], &sp6C); } HuPrcSleep(2); } for (var_r31 = 0; var_r31 < var_r28 / 2; var_r31++) { BoardModelPosSetV(sp54[var_r31], &sp1A4[var_r31]); BoardModelPosSetV(sp54[var_r31 + 3], &sp180[var_r31]); } for (var_r31 = 0; var_r31 < 3; var_r31++) { spC0[var_r31] = BoardPlayerItemRemove(currItemRestore, 0); spC0[var_r31 + 3] = BoardPlayerItemRemove(temp_r24, 0); } for (var_r31 = 0; var_r31 < 3; var_r31++) { if (spC0[var_r31 + 3] != -1) { BoardPlayerItemAdd(currItemRestore, spC0[var_r31 + 3]); } if (spC0[var_r31] != -1) { BoardPlayerItemAdd(temp_r24, spC0[var_r31]); } } for (var_r31 = (var_r28 / 2) - 1; var_r31 >= 0; var_r31--) { HuAudFXPlay(0x32C); VECSubtract(&spB4, &sp1A4[var_r31], &sp6C); VECScale(&sp6C, &sp6C, 0.033333335f); VECSubtract(&spB4, &sp180[var_r31], &sp60); VECScale(&sp60, &sp60, 0.033333335f); for (var_r30 = 0; var_r30 < 30; var_r30++) { BoardModelPosSetV(sp54[var_r31], &sp1A4[var_r31]); BoardModelPosSetV(sp54[var_r31 + 3], &sp180[var_r31]); VECAdd(&sp1A4[var_r31], &sp6C, &sp1A4[var_r31]); VECAdd(&sp180[var_r31], &sp60, &sp180[var_r31]); HuPrcVSleep(); } BoardModelVisibilitySet(sp54[var_r31], 0); BoardModelVisibilitySet(sp54[var_r31 + 3], 0); } sp9C.y = 0.6f; var_f30 = 255.0f; var_r21 = 0; while (1) { BoardModelRotSetV(suitMdl, &spA8); BoardModelAlphaSet(suitMdl, var_f30); VECAdd(&spA8, &sp9C, &spA8); sp9C.y *= 1.02f; if (sp9C.y >= 35.0f) { if (var_r21 == 0) { HuAudFXPlay(0x365); var_r21 = 1; } sp9C.y = 45.0f; var_f30 -= 5.6666665f; if (var_f30 <= 0.0f) { break; } } HuPrcVSleep(); } BoardModelKill(suitMdl); for (var_r31 = 0; var_r31 < var_r28 / 2; var_r31++) { BoardModelKill(sp54[var_r31]); BoardModelKill(sp54[var_r31 + 3]); } HuPrcKill(NULL); while (1) { HuPrcVSleep(); } } static void ExecItemSpark(void) { Vec sp68; Vec sp5C; Vec sp50; Vec sp44; Vec sp38; Vec sp2C; Vec sp20; float var_f31; float var_f30; s32 temp_r28; s16 temp_r30; s32 i; (void)106.0; temp_r30 = BoardModelCreate(DATA_MAKE_NUM(DATADIR_BOARD, 103), NULL, 0); BoardModelLayerSet(temp_r30, 3); BoardModelVisibilitySet(temp_r30, 0); HuAudFXPlay(0x350); suitMdl = BoardModelCreate(itemMdlTbl[currItem], lbl_801D37A0, 0); BoardModelLayerSet(suitMdl, 2); ItemShowProc(NULL, NULL); temp_r28 = GWPlayer[currItemRestore].space_curr; sp38.x = sp38.y = sp38.z = 1.0f; for (i = 0; i < 0x1E; i++) { sp38.x += 0.033333335f; sp38.y += 0.033333335f; sp38.z += 0.033333335f; BoardModelScaleSetV(suitMdl, &sp38); HuPrcVSleep(); } sp38.x = sp38.y = sp38.z = 2.0f; BoardModelScaleSetV(suitMdl, &sp38); HuAudFXPlay(0x31A); BoardPlayerPosGet(currItemRestore, &sp44); BoardSpaceCornerPosGet(temp_r28, 0, &sp50); BoardPlayerPosLerpStart(currItemRestore, &sp44, &sp50, 0x14); while (GWPlayer[currItemRestore].moving) { HuPrcVSleep(); } BoardPlayerMotBlendSet(currItemRestore, 0, 7); while (!BoardPlayerMotBlendCheck(currItemRestore)) { HuPrcVSleep(); } BoardPlayerIdleSet(currItemRestore); BoardSpacePosGet(0, temp_r28, &sp5C); BoardModelPosSetV(temp_r30, &sp5C); sp5C.y += 106.0f; BoardModelPosGet(suitMdl, &sp68); var_f30 = -3.0f; while (1) { sp68.y += var_f30; if (sp68.y <= sp5C.y) { break; } BoardModelPosSetV(suitMdl, &sp68); var_f30 *= 1.08f; HuPrcVSleep(); } sp68.y = sp5C.y; BoardModelPosSetV(suitMdl, &sp68); sp5C.y -= 106.0f; BoardSpaceRotGet(0, GWPlayer[currItemRestore].space_curr, &sp20); BoardModelRotSetV(suitMdl, &sp20); BoardModelPosGet(suitMdl, &sp2C); sp2C.z += 106.0 * sind(sp20.x); sp2C.x -= 106.0 * sind(sp20.z); BoardModelPosSetV(suitMdl, &sp2C); HuAudFXPlay(0x31B); BoardModelMotionStart(suitMdl, 1, 0); BoardModelMotionTimeSet(suitMdl, 0.0f); while (BoardModelMotionTimeGet(suitMdl) < BoardModelMotionMaxTimeGet(suitMdl)) { HuPrcVSleep(); } for (i = 0; i < 4; i++) { omVibrate(i, 12, 4, 2); } HuAudFXPlay(0x31C); BoardModelVisibilitySet(temp_r30, 1); BoardModelMotionTimeSet(temp_r30, 0.0f); while (BoardModelMotionTimeGet(temp_r30) < BoardModelMotionMaxTimeGet(temp_r30)) { HuPrcVSleep(); } var_f31 = 255.0f; for (i = 0; i < 45; i++) { var_f31 -= 5.6666665f; BoardModelAlphaSet(suitMdl, var_f31); HuPrcVSleep(); } BoardModelAlphaSet(suitMdl, 0); BoardUiInlineFunc03(currItemRestore); BoardModelKill(suitMdl); BoardModelKill(temp_r30); HuPrcKill(NULL); while (1) { HuPrcVSleep(); } } static void ExecItemLight(void) { s16 temp_r31; HuAudFXPlay(0x350); ItemShowProc(NULL, NULL); BoardWinCreateChoice(2, MAKE_MESSID(18, 15), -1, 0); BoardWinInsertMesSet(MAKE_MESSID(8, 8), 3); if (GWPlayer[currItemRestore].com) { BoardComKeySetRight(); } BoardWinWait(); temp_r31 = BoardWinChoiceGet(); BoardWinKill(); if (temp_r31 == -1 || temp_r31 == 0) { BoardPlayerItemAdd(boardItemUser, currItem); } HuPrcKill(NULL); while (1) { HuPrcVSleep(); } } static void ExecItemWhistle(void) { Vec spF0[4]; Vec spC0[4]; Vec spB4; Vec spA8; Vec sp9C; Vec sp90; Vec sp84; Vec sp78; float sp68[4]; float sp58[4]; float sp48[4]; float sp38[4]; float sp28[4]; s16 sp20[4]; s16 sp8; float var_f30; float var_f31; s32 temp_r23; char *temp_r22; s32 temp_r18; s16 temp_r17; s16 temp_r21; s16 temp_r20; s32 temp_r31; s16 temp_r28; s16 temp_r19; s32 var_r26; s16 var_r25; s16 var_r27; s32 var_r29; s32 var_r31; var_r31 = GWPlayerCfg[currItemRestore].character; temp_r23 = BoardPlayerMotionCreate(currItemRestore, callMotTbl[var_r31]); temp_r22 = callHookTbl[var_r31]; temp_r28 = BoardStarHostMdlGet(); BoardModelPosGet(temp_r28, &spB4); sp9C = spB4; temp_r19 = GWBoardGet(); temp_r21 = BoardModelMotionCreate(temp_r28, callAttackMotTbl[temp_r19]); temp_r20 = BoardModelMotionCreate(temp_r28, callAttackMotTbl2[temp_r19]); var_f31 = 0.003921569f * frand8() * 360.0f; spA8.x = spA8.y = spA8.z = 0.5f; for (var_r31 = 0; var_r31 < 4; var_r31++) { sp20[var_r31] = BoardModelCreate(DATA_MAKE_NUM(DATADIR_BGUEST, 39), NULL, 1); BoardModelLayerSet(sp20[var_r31], 2); temp_r17 = BoardModelMotionCreate(sp20[var_r31], DATA_MAKE_NUM(DATADIR_BGUEST, 40)); BoardModelMotionStart(sp20[var_r31], temp_r17, 0x40000001); sp28[var_r31] = 120.0f; spF0[var_r31].x = spB4.x + 120.0 * sind(var_f31); spF0[var_r31].y = 1000.0f + spB4.y + 100.0f * var_r31; spF0[var_r31].z = spB4.z + 120.0 * cosd(var_f31); spC0[var_r31].x = spC0[var_r31].z = 0.0f; spC0[var_r31].y = var_f31 + 90.0f; if (spC0[var_r31].y >= 360.0f) { spC0[var_r31].y -= 360.0f; } BoardModelRotSetV(sp20[var_r31], &spC0[var_r31]); BoardModelPosSetV(sp20[var_r31], &spF0[var_r31]); BoardModelScaleSetV(sp20[var_r31], &spA8); var_f31 += 90.0f; if (var_f31 >= 360.0f) { var_f31 -= 360.0f; } sp38[var_r31] = var_f31; BoardModelVisibilitySet(sp20[var_r31], 0); } HuAudFXPlay(0x350); suitMdl = BoardModelCreate(itemMdlTbl[currItem], NULL, 0); BoardModelLayerSet(suitMdl, 2); ItemShowProc(NULL, NULL); BoardModelPosGet(suitMdl, &sp90); BoardPlayerPosGet(currItemRestore, &sp84); sp84.y += 200.0f; sp84.z += 100.0f; VECSubtract(&sp84, &sp90, &sp78); VECScale(&sp78, &sp78, 0.03448276f); BoardPlayerMotionStart(currItemRestore, temp_r23, 0); BoardPlayerMotionTimeSet(currItemRestore, 1.0f); for (var_r31 = 0; var_r31 < 29; var_r31++) { sp90.y += sp78.y; sp90.z += sp78.z; BoardModelPosSetV(suitMdl, &sp90); HuPrcVSleep(); } while (BoardPlayerMotionTimeGet(currItemRestore) < 30.0f) { HuPrcVSleep(); } sp8 = BoardPlayerModelGet(currItemRestore); BoardModelPosSetV(suitMdl, &sp84); BoardModelHookSet(sp8, temp_r22, suitMdl); while (BoardPlayerMotionTimeGet(currItemRestore) < BoardPlayerMotionMaxTimeGet(currItemRestore)) { if (BoardPlayerMotionTimeGet(currItemRestore) == 95.0f || BoardPlayerMotionTimeGet(currItemRestore) == 185.0f || BoardPlayerMotionTimeGet(currItemRestore) == 275.0f) { HuAudFXPlay(0x31F); } HuPrcVSleep(); } WipeColorSet(0, 0, 0); WipeCreate(WIPE_MODE_OUT, WIPE_TYPE_NORMAL, 60); while (WipeStatGet() != 0) { HuPrcVSleep(); } BoardModelHookObjReset(sp8, temp_r22); BoardPlayerIdleSet(currItemRestore); BoardModelKill(suitMdl); BoardCameraMoveSet(0); temp_r18 = BoardSpaceStarGetCurr(); BoardCameraTargetSpaceSet(temp_r18); HuPrcVSleep(); BoardCameraMoveSet(1); for (var_r31 = 0; var_r31 < 4; var_r31++) { BoardModelVisibilitySet(sp20[var_r31], 1); } WipeCreate(WIPE_MODE_IN, WIPE_TYPE_NORMAL, 60); while (WipeStatGet() != 0) { HuPrcVSleep(); } HuAudFXPlay(0x320); for (var_r31 = 0; var_r31 < 4; var_r31++) { sp58[var_r31] = 0.0f; sp48[var_r31] = 1.0f; } var_r27 = 0; for (var_r25 = 0; var_r25 < 4;) { for (var_r31 = 0; var_r31 < 4; var_r31++) { if (sp48[var_r31] != -1.0f) { sp68[var_r31] = sp58[var_r31] - 0.06666667f * (sp48[var_r31] * sp48[var_r31] * 0.25f); if (sp68[var_r31] < -35.0f) { sp68[var_r31] = -35.0f; } if (sp68[var_r31] > 35.0f) { sp68[var_r31] = 35.0f; } sp48[var_r31] += 1.0f; spF0[var_r31].y += sp68[var_r31]; if (spF0[var_r31].y <= spB4.y) { if (var_r27 == 0) { var_r27 = 1; for (var_r29 = 0; var_r29 < 4; var_r29++) { omVibrate(var_r29, 12, 6, 6); } HuAudFXPlay(0x321); } spF0[var_r31].y = spB4.y; sp58[var_r31] = 0.16f * -sp68[var_r31]; if (fabs(sp58[var_r31]) <= 1.0) { sp48[var_r31] = -1.0f; var_r25++; } sp48[var_r31] = 1.0f; } BoardModelPosSetV(sp20[var_r31], &spF0[var_r31]); } } HuPrcVSleep(); } BoardModelMotionShiftSet(temp_r28, temp_r20, 0.0f, 5.0f, HU3D_MOTATTR_LOOP); HuAudFXPlay(0x322); for (var_r29 = 0; var_r29 < 180; var_r29++) { for (var_r31 = 0; var_r31 < 4; var_r31++) { sp38[var_r31] += 4.0f; if (sp38[var_r31] >= 360.0f) { sp38[var_r31] -= 360.0f; } spC0[var_r31].y = 90.0f + sp38[var_r31]; if (spC0[var_r31].y >= 360.0f) { spC0[var_r31].y -= 360.0f; } spF0[var_r31].x = spB4.x + 120.0 * sind(sp38[var_r31]); spF0[var_r31].z = spB4.z + 120.0 * cosd(sp38[var_r31]); BoardModelPosSetV(sp20[var_r31], &spF0[var_r31]); BoardModelRotSetV(sp20[var_r31], &spC0[var_r31]); } HuPrcVSleep(); } for (var_r29 = 0; var_r29 < 20; var_r29++) { for (var_r31 = 0; var_r31 < 4; var_r31++) { spC0[var_r31].y += 4.5f; BoardModelRotSetV(sp20[var_r31], &spC0[var_r31]); } HuPrcVSleep(); } HuPrcSleep(30); var_f30 = 35.0f; var_r26 = 0; for (var_r31 = 0; var_r31 < 4; var_r31++) { sp58[var_r31] = 8.0f; sp48[var_r31] = 1.0f; } var_r27 = 0; while (1) { for (var_r31 = 0; var_r31 < 4; var_r31++) { if (sp48[var_r31] != -1.0f) { sp28[var_r31] -= 1.7f; sp68[var_r31] = sp58[var_r31] - 0.083333336f * (sp48[var_r31] * sp48[var_r31] * 0.25f); sp48[var_r31] += 1.0f; spF0[var_r31].y += sp68[var_r31]; if (spF0[var_r31].y <= spB4.y) { spF0[var_r31].y = spB4.y; sp48[var_r31] = -1.0f; } spF0[var_r31].x = spB4.x + sp28[var_r31] * sind(sp38[var_r31]); spF0[var_r31].z = spB4.z + sp28[var_r31] * cosd(sp38[var_r31]); BoardModelPosSetV(sp20[var_r31], &spF0[var_r31]); } } if (sp28[0] < 100.0f) { if (var_r27 == 0) { var_r27 = 1; BoardModelMotionShiftSet(temp_r28, temp_r21, 0.0f, 3.0f, HU3D_MOTATTR_LOOP); HuAudFXPlay(forceMoveSfxTbl[GWBoardGet()]); } sp9C.y += var_f30; BoardModelPosSetV(temp_r28, &sp9C); var_f30 *= 0.945f; if (sp9C.y >= 500.0f && var_r26 == 0) { WipeCreate(WIPE_MODE_OUT, WIPE_TYPE_NORMAL, 45); BoardAudSeqFadeOut(0, 1000); var_r26 = 1; } } if (var_r26 != 0 && WipeStatGet() == 0) { break; } HuPrcVSleep(); } BoardPlayerMotionKill(currItemRestore, temp_r23); for (var_r31 = 0; var_r31 < 4; var_r31++) { BoardModelKill(sp20[var_r31]); } BoardModelMotionKill(temp_r28, temp_r21); BoardModelMotionKill(temp_r28, temp_r20); BoardStarShowNext(currItemRestore); HuPrcKill(NULL); while (1) { HuPrcVSleep(); } } static void ExecItemBowser(void) { Vec sp2C; Vec sp20; Vec sp14; Vec sp8; float var_f31; s16 temp_r31; s32 var_r29; s32 i; BoardBowserSuitInit(currItemRestore); suitMdl = BoardBowserSuitModelGet(); temp_r31 = BoardBowserSuitPlayerModelGet(); suitMot[0] = BoardModelMotionCreate(suitMdl, DATA_MAKE_NUM(DATADIR_BKOOPASUIT, 28)); suitMot[1] = BoardModelMotionCreate(suitMdl, DATA_MAKE_NUM(DATADIR_BKOOPASUIT, 29)); suitCommonMot[0] = BoardModelMotionCreate(temp_r31, suitMotTbl[GWPlayer[currItemRestore].character][0]); suitCommonMot[1] = BoardModelMotionCreate(temp_r31, suitMotTbl[GWPlayer[currItemRestore].character][1]); BoardModelVisibilitySet(temp_r31, 0); HuAudFXPlay(0x350); sp20.x = sp20.y = sp20.z = 0.3f; ItemShowProc(NULL, &sp20); for (i = 0; i < 30; i++) { sp20.x += 0.023333333f; sp20.y += 0.023333333f; sp20.z += 0.023333333f; BoardModelScaleSetV(suitMdl, &sp20); HuPrcVSleep(); } sp20.x = sp20.y = sp20.z = 1.0f; BoardModelScaleSetV(suitMdl, &sp20); HuAudFXPlay(0x325); var_r29 = GWPlayer[currItemRestore].space_curr; BoardSpacePosGet(0, var_r29, &sp14); BoardModelPosGet(suitMdl, &sp2C); var_f31 = -4.0f; sp8.x = sp8.y = sp8.z = 1.0f; while (1) { sp2C.y += var_f31; if (sp2C.y <= sp14.y + 100.0f) { sp8.y = (sp2C.y - sp14.y) / 100.0f; BoardPlayerScaleSetV(currItemRestore, &sp8); } if (sp2C.y <= sp14.y) { break; } BoardModelPosSetV(suitMdl, &sp2C); var_f31 *= 1.09f; HuPrcVSleep(); } sp2C.y = sp14.y; BoardModelPosSetV(suitMdl, &sp2C); BoardModelVisibilitySet(BoardPlayerModelGet(currItemRestore), 0); omVibrate(currItemRestore, 0xC, 4, 2); HuAudFXPlay(0x326); BoardModelVisibilitySet(temp_r31, 1); BoardModelHookSet(suitMdl, "itemhook_head", temp_r31); BoardModelMotionShiftSet(suitMdl, suitMot[1], 0.0f, 5.0f, HU3D_MOTATTR_NONE); BoardModelMotionShiftSet(temp_r31, suitCommonMot[1], 0.0f, 5.0f, HU3D_MOTATTR_NONE); while (!BoardModelMotionEndCheck(suitMdl)) { HuPrcVSleep(); } BoardModelMotionShiftSet(suitMdl, suitMot[0], 0.0f, 5.0f, HU3D_MOTATTR_NONE); BoardModelMotionShiftSet(temp_r31, suitCommonMot[0], 0.0f, 5.0f, HU3D_MOTATTR_NONE); HuPrcSleep(0x28); HuAudPlayerVoicePlay(currItemRestore, 0x129); omVibrate(currItemRestore, 12, 4, 2); HuPrcSleep(60); BoardModelMotionShiftSet(suitMdl, 0, 0.0f, 5.0f, HU3D_MOTATTR_LOOP); HuPrcKill(NULL); while (1) { HuPrcVSleep(); } } static s32 booMotTbl[3] = { DATA_MAKE_NUM(DATADIR_BGUEST, 24), DATA_MAKE_NUM(DATADIR_BGUEST, 22), -1 }; static inline void ExecItemBooBallInlineFunc01(s32 speed) { Vec sp20; s32 var_r20; sp20 = booBallPos; booBallScale.x = booBallScale.y = booBallScale.z = 1.0f; booBallAlpha = 255.0f; BoardModelPosSetV(booBallMdl, &booBallPos); BoardModelScaleSetV(booBallMdl, &booBallScale); BoardModelAlphaSet(booBallMdl, booBallAlpha); BoardModelVisibilitySet(booBallMdl, 1); for (var_r20 = 0; var_r20 < speed; var_r20++) { booBallAlpha -= (255.0f / speed); if (booBallAlpha < 0.0f) { booBallAlpha = 0.0f; } booBallScale.x -= (1.0f / speed); booBallScale.y -= (1.0f / speed); booBallScale.z -= (1.0f / speed); booBallPos.y -= (20.0f / speed); BoardModelAlphaSet(booBallMdl, booBallAlpha); BoardModelScaleSetV(booBallMdl, &booBallScale); BoardModelPosSetV(booBallMdl, &booBallPos); HuPrcVSleep(); } booBallScale.x = booBallScale.y = booBallScale.z = 0.0f; booBallAlpha = 0.0f; BoardModelScaleSetV(booBallMdl, &booBallScale); BoardModelAlphaSet(booBallMdl, booBallAlpha); } static inline void ExecItemBooBallInlineFunc02(s32 speed) { Vec sp20; s32 var_r20; sp20 = booBallPos; booBallScale.x = booBallScale.y = booBallScale.z = 0.0f; booBallAlpha = 0.0f; BoardModelPosSetV(booBallMdl, &booBallPos); BoardModelScaleSetV(booBallMdl, &booBallScale); BoardModelAlphaSet(booBallMdl, booBallAlpha); BoardModelVisibilitySet(booBallMdl, 1); for (var_r20 = 0; var_r20 < speed; var_r20++) { booBallAlpha += (255.0f / speed); if (booBallAlpha > 255.0f) { booBallAlpha = 255.0f; } booBallScale.x += (1.0f / speed); booBallScale.y += (1.0f / speed); booBallScale.z += (1.0f / speed); booBallPos.y += (20.0f / speed); BoardModelAlphaSet(booBallMdl, booBallAlpha); BoardModelScaleSetV(booBallMdl, &booBallScale); BoardModelPosSetV(booBallMdl, &booBallPos); HuPrcVSleep(); } booBallPos.y = sp20.y + 20.0f; booBallScale.x = booBallScale.y = booBallScale.z = 1.0f; booBallAlpha = 255.0f; BoardModelPosSetV(booBallMdl, &booBallPos); BoardModelScaleSetV(booBallMdl, &booBallScale); BoardModelAlphaSet(booBallMdl, booBallAlpha); } static void ExecItemBooBall(void) { UnkItemShowProcStruct spA0; UnkItemShowProcStruct sp80; Vec sp74; Vec sp68; Process *temp_r17; Process *sp1C; s16 spC; s16 spA; s32 sp18; s32 var_r26; s32 var_r28; s32 var_r29; s32 var_r30; s32 var_r31; BoardAudSeqPause(0, 1, 1000); suitMdl = BoardBooCreate(currItemRestore, &sp74); booBallMdl = BoardModelCreate(DATA_MAKE_NUM(DATADIR_BGUEST, 18), booMotTbl, 0); BoardModelMotionStart(booBallMdl, 1, 0x40000001); BoardModelLayerSet(booBallMdl, 2); BoardModelAttrSet(booBallMdl, 2); BoardModelVisibilitySet(booBallMdl, 0); spA0.unk02 = suitMdl; spA0.unk04 = 4.0f; spA0.unk08 = 3.0f; spA0.unk10 = spA0.unk14 = spA0.unk18 = 0.0f; spA0.unk1C = 1; HuAudFXPlay(0x350); temp_r17 = ItemShowProc(&spA0, NULL); BoardModelPosGet(suitMdl, &booBallPos); ExecItemBooBallInlineFunc02(60); sp80.unk02 = booBallMdl; sp80.unk04 = 4.0f; sp80.unk08 = 4.0f; sp80.unk10 = sp80.unk14 = sp80.unk18 = 0.0f; sp80.unk1C = 1; sp1C = BoardUiInlineFunc05(&sp80); BoardMusStart(1, 1, 0x7F, 0); HuAudFXPlay(0x4C); BoardWinCreate(2, MAKE_MESSID(18, 21), 3); BoardWinWait(); BoardWinKill(); if (BoardPlayerCoinsGet(currItemRestore) < 5) { BoardWinCreate(2, MAKE_MESSID(18, 22), 3); BoardWinWait(); BoardWinKill(); } else { var_r28 = 0; for (var_r31 = 0; var_r31 < 4; var_r31++) { if (var_r31 != currItemRestore) { var_r28 += GWStarsGet(var_r31); } } var_r26 = 0; for (var_r31 = 0; var_r31 < 4; var_r31++) { if (var_r31 != currItemRestore) { var_r26 += BoardPlayerCoinsGet(var_r31); } } do { BoardWinCreateChoice(4, MAKE_MESSID(18, 24), 3, 0); BoardWinAttrSet(0x10); if (BoardPlayerCoinsGet(currItemRestore) < 50 || var_r28 == 0) { BoardWinChoiceDisable(1); } if (var_r26 == 0) { BoardWinChoiceDisable(0); } if (GWPlayer[currItemRestore].com) { if (var_r28 != 0 && BoardPlayerCoinsGet(currItemRestore) >= 50) { BoardComKeySetDown(); } else { BoardComKeySetUp(); } } BoardWinWait(); BoardWinKill(); var_r29 = BoardWinChoiceGet(); switch (var_r29) { case 0: for (var_r31 = 0; var_r31 < 5; var_r31++) { BoardPlayerCoinsAdd(currItemRestore, -1); HuAudFXPlay(0xE); HuPrcSleep(6); } HuAudFXPlay(0xF); BoardBooStealTypeSet(0); BoardStatusShowSetAll(0); HuAudFXPlay(0x34F); ExecItemBooBallInlineFunc01(30); sp68.x = 0.0f; sp68.y = 0.0f; sp68.z = 0.0f; BoardCameraMotionStartEx(suitMdl, NULL, &sp68, 325.0f, -1.0f, 21); BoardBooStealMain(); BoardCameraViewSet(2); BoardCameraMotionWait(); ExecItemBooBallInlineFunc02(30); var_r29 = BoardBooStealValueGet(&spC, &spA); if (var_r29 == 0) { var_r30 = MAKE_MESSID(7, 11); } else if (spA == 0) { var_r30 = MAKE_MESSID(7, 9); } else if (spA >= 1 && spA <= 3) { var_r30 = MAKE_MESSID(7, 8); } else if (spA >= 4 && spA <= 6) { var_r30 = MAKE_MESSID(7, 7); } else if (spA >= 7 && spA <= 8) { var_r30 = MAKE_MESSID(7, 6); } else { var_r30 = MAKE_MESSID(7, 5); } sprintf(booCoinStr, "%d", spC); HuAudFXPlay(0x4C); BoardWinCreate(2, var_r30, 3); BoardWinInsertMesSet(MAKE_MESSID_PTR(booCoinStr), 0); BoardWinWait(); BoardWinKill(); BoardStatusShowSetAll(1); if (var_r29 != 0) { BoardPlayerMotionShiftSet(currItemRestore, 7, 0.0f, 8.0f, HU3D_MOTATTR_NONE); HuPrcSleep(30); for (var_r31 = 0; var_r31 < spC; var_r31++) { BoardPlayerCoinsAdd(currItemRestore, 1); HuAudFXPlay(7); HuPrcVSleep(); } BoardPlayerMotionEndWait(currItemRestore); HuPrcSleep(10); BoardPlayerMotionShiftSet(currItemRestore, 1, 0.0f, 8.0f, HU3D_MOTATTR_LOOP); } break; case 1: for (var_r31 = 0; var_r31 < 50; var_r31++) { BoardPlayerCoinsAdd(currItemRestore, -1); HuAudFXPlay(0xE); HuPrcSleep(1); } HuAudFXPlay(0xF); BoardBooStealTypeSet(1); BoardStatusShowSetAll(0); ExecItemBooBallInlineFunc01(30); sp68.x = 0.0f; sp68.y = 0.0f; sp68.z = 0.0f; BoardCameraMotionStartEx(suitMdl, NULL, &sp68, 325.0f, -1.0f, 21); BoardBooStealMain(); var_r29 = BoardBooStealLightCheck(); BoardCameraViewSet(2); BoardCameraMotionWait(); ExecItemBooBallInlineFunc02(30); if (var_r29 != 0) { var_r30 = MAKE_MESSID(7, 10); } else { var_r30 = MAKE_MESSID(7, 11); } HuAudFXPlay(0x4C); BoardWinCreate(2, var_r30, 3); BoardWinWait(); BoardWinKill(); BoardStatusShowSetAll(1); BoardAudSeqFadeOut(1, 1000); HuPrcSleep(23); if (var_r29 != 0) { BoardPlayerVoiceEnableSet(currItemRestore, 7, 0); sp18 = HuAudSStreamPlay(6); BoardPlayerMotionShiftSet(currItemRestore, 7, 0.0f, 8.0f, HU3D_MOTATTR_NONE); HuAudFXPlay(boardStarSndTbl[GWPlayer[currItemRestore].character]); BoardPlayerStarsAdd(currItemRestore, 1); HuAudFXPlay(8); HuPrcVSleep(); BoardPlayerMotionEndWait(currItemRestore); BoardPlayerVoiceEnableSet(currItemRestore, 7, 1); while (msmStreamGetStatus(sp18) != 0) { HuPrcVSleep(); } } BoardPlayerMotionShiftSet(currItemRestore, 1, 0.0f, 8.0f, HU3D_MOTATTR_LOOP); break; case 3: BoardViewMapExec(currItemRestore); break; case 2: case -1: HuAudFXPlay(0x4C); BoardWinCreate(2, MAKE_MESSID(18, 23), 3); BoardWinWait(); BoardWinKill(); break; } } while (var_r29 == 3); } BoardAudSeqFadeOut(1, 1000); HuPrcKill(sp1C); BoardModelPosGet(booBallMdl, &booBallPos); HuAudFXPlay(0x34F); ExecItemBooBallInlineFunc01(60); HuPrcKill(temp_r17); BoardAudSeqPause(0, 0, 1000); CharModelLayerSetAll(3); BoardModelPosGet(suitMdl, &sp74); CharModelEffectCreate(1, &sp74); HuAudFXPlay(0x351); HuPrcSleep(10); BoardModelKill(suitMdl); BoardModelKill(booBallMdl); HuPrcSleep(15); HuPrcKill(NULL); while (1) { HuPrcVSleep(); } } static void ForceConsts(void) { (void)-0.5f; (void)40.0f; (void)125.0f; } static void LampParticleUpdate(ModelData *model, ParticleData *particle, Mtx matrix) { HsfanimStruct01 *var_r31; Vec spC; float sp8; float temp_f31; float temp_f30; s32 i; s32 j; if (particle->unk_34 == 0) { var_r31 = particle->unk_48; for (i = 0; i < particle->unk_30; i++, var_r31++) { var_r31->unk2C = 0.0f; var_r31->unk40.a = 0; } particle->unk_04.x = 0.0f; particle->unk_00 = 0; } if (particle->unk_00 == 0) { particle->unk_00 = 2; BoardModelRotGet(suitMdl, &spC); for (i = 0; i < 2; i++) { var_r31 = particle->unk_48; for (j = 0; j < particle->unk_30; j++, var_r31++) { if (var_r31->unk2C == 0.0f) { break; } } if (j != particle->unk_30) { var_r31->unk34.x = 60.0 * sind(spC.y - 90.0f); var_r31->unk34.y = 30.0f; var_r31->unk34.z = 60.0 * cosd(spC.y - 90.0f); sp8 = 12.0f; var_r31->unk08.x = 12.0 * cosd(i * 110.0f + 35.0f); var_r31->unk08.y = 12.0 * sind(i * 110.0f + 35.0f); var_r31->unk08.z = 3.0f + frand8() * 5.0f * 0.003921569f; var_r31->unk14.y = 255.0f; var_r31->unk2C = 25.0f; temp_f30 = 175.0f + frand8() * 0x50 * 0.003921569f; var_r31->unk40.r = var_r31->unk40.g = var_r31->unk40.b = temp_f30; var_r31->unk00_s16 = 0; } } } else { particle->unk_00--; } var_r31 = particle->unk_48; for (i = 0; i < particle->unk_30; i++, var_r31++) { if (var_r31->unk2C != 0.0f) { if (var_r31->unk00_s16 == 0) { VECAdd(&var_r31->unk34, &var_r31->unk08, &var_r31->unk34); VECScale(&var_r31->unk08, &var_r31->unk08, 0.95f); var_r31->unk2C += 8.0f; var_r31->unk14.y -= 2.8333333f; if (var_r31->unk14.y <= 120.0f) { var_r31->unk14.y = 200.0f; temp_f31 = frand8() * 180.0f * 0.003921569f; var_r31->unk08.x = 6.0 * cosd(temp_f31); var_r31->unk08.y = -4.0f; var_r31->unk08.z = 6.0 * sind(temp_f31); var_r31->unk00_s16 = 1; } var_r31->unk40.a = var_r31->unk14.y; } else { VECAdd(&var_r31->unk34, &var_r31->unk08, &var_r31->unk34); var_r31->unk2C += 0.2f; var_r31->unk14.y -= 1.8214285f; if (var_r31->unk14.y <= 55.0f) { var_r31->unk14.y = 0.0f; var_r31->unk2C = 0.0f; } var_r31->unk40.a = var_r31->unk14.y; } } } } static void GenieParticleUpdate(ModelData *model, ParticleData *particle, Mtx matrix) { HsfanimStruct01 *var_r31; float temp_f31; float temp_f30; s32 var_r28; s32 i; if (particle->unk_34 == 0) { var_r31 = particle->unk_48; for (i = 0; i < particle->unk_30; i++, var_r31++) { var_r31->unk34.x = -50.0f + frand8() * 100.0f * 0.003921569f; var_r31->unk34.y = -50.0f + frand8() * 100.0f * 0.003921569f; var_r31->unk34.z = -10.0f + frand8() * 20.0f * 0.003921569f; temp_f31 = 0.5f + frand8() * 3.0f * 0.003921569f; var_r31->unk08.x = temp_f31 * cosd(i * 110.0f + 35.0f); var_r31->unk08.y = temp_f31 * sind(i * 110.0f + 35.0f); var_r31->unk08.z = 0.0f; var_r31->unk14.y = 255.0f; temp_f30 = 125.0f + frand8() * 100 * 0.003921569f; var_r31->unk40.r = var_r31->unk40.g = var_r31->unk40.b = temp_f30; var_r31->unk00 = 0; var_r31->unk2C = 80.0f + frand8() * 60.0f * 0.003921569f; } } var_r31 = particle->unk_48; var_r28 = 0; for (i = 0; i < particle->unk_30; i++, var_r31++) { if (var_r31->unk2C != 0.0f) { var_r28++; VECAdd(&var_r31->unk34, &var_r31->unk08, &var_r31->unk34); VECScale(&var_r31->unk08, &var_r31->unk08, 0.995f); var_r31->unk2C -= 0.2f; var_r31->unk14.y -= 1.59375f; if (var_r31->unk14.y <= 20.0f) { var_r31->unk14.y = 0.0f; var_r31->unk2C = 0.0f; } var_r31->unk40.a = var_r31->unk14.y; } } if (var_r28 == 0) { particle->unk_02 = 0; } } static Vec shadowPos = { 0.0f, 4500.0f, 500.0f }; static Vec shadowTarget = { 0.0f, 0.9f, -0.1f }; static Vec shadowUp = { 0.0f, 0.0f, 500.0f }; static void GenieCameraProcInlineFunc(void) { Hu3DShadowPosSet(&shadowPos, &shadowTarget, &shadowUp); } static void GenieCameraProc(void) { while (1) { Hu3DCameraPerspectiveSet(2, genieFov, 10.0f, 20000.0f, 1.2f); Hu3DCameraPosSetV(2, &booCamPos, &booCamTarget, &booCamUp); Hu3DShadowData.unk_08.x = genieFov; C_MTXLightPerspective(Hu3DShadowData.unk_68, Hu3DShadowData.unk_08.x, 1.2f, 0.5f, -0.5f, 0.5f, 0.5f); GenieCameraProcInlineFunc(); Hu3DShadowTPLvlSet(0.8f); HuPrcVSleep(); } } static void GenieCameraCalc(UnkGenieCameraStruct *arg0, s32 arg1, float arg2, Vec *arg3, Vec *arg4) { Vec spC = { 0.0f, 0.0f, 0.0f }; float temp_f31 = arg2 * arg2; float sp8 = temp_f31 * arg2; Vec *temp_r31; Vec *temp_r30; Vec *temp_r29; Vec *temp_r28; Vec *temp_r27; Vec *temp_r26; Vec *temp_r25; Vec *temp_r24; if (arg1 == 0) { temp_r31 = &arg0[arg1].unk04; temp_r29 = &arg0[arg1 + 1].unk04; temp_r28 = &arg0[arg1 + 2].unk04; temp_r30 = &arg0[arg1].unk10; temp_r27 = &arg0[arg1 + 1].unk10; temp_r26 = &arg0[arg1 + 2].unk10; arg3->x = 0.5f * ((temp_r31->x - temp_r29->x * 2.0f + temp_r28->x) * temp_f31 + (temp_r31->x * -3.0f + temp_r29->x * 4.0f - temp_r28->x) * arg2 + temp_r31->x * 2.0f); arg3->y = 0.5f * ((temp_r31->y - temp_r29->y * 2.0f + temp_r28->y) * temp_f31 + (temp_r31->y * -3.0f + temp_r29->y * 4.0f - temp_r28->y) * arg2 + temp_r31->y * 2.0f); arg3->z = 0.5f * ((temp_r31->z - temp_r29->z * 2.0f + temp_r28->z) * temp_f31 + (temp_r31->z * -3.0f + temp_r29->z * 4.0f - temp_r28->z) * arg2 + temp_r31->z * 2.0f); arg4->x = 0.5f * ((temp_r30->x - temp_r27->x * 2.0f + temp_r26->x) * temp_f31 + (temp_r30->x * -3.0f + temp_r27->x * 4.0f - temp_r26->x) * arg2 + temp_r30->x * 2.0f); arg4->y = 0.5f * ((temp_r30->y - temp_r27->y * 2.0f + temp_r26->y) * temp_f31 + (temp_r30->y * -3.0f + temp_r27->y * 4.0f - temp_r26->y) * arg2 + temp_r30->y * 2.0f); arg4->z = 0.5f * ((temp_r30->z - temp_r27->z * 2.0f + temp_r26->z) * temp_f31 + (temp_r30->z * -3.0f + temp_r27->z * 4.0f - temp_r26->z) * arg2 + temp_r30->z * 2.0f); } else { temp_r31 = &arg0[arg1 - 1].unk04; temp_r29 = &arg0[arg1].unk04; temp_r28 = &arg0[arg1 + 1].unk04; temp_r25 = &arg0[arg1 + 2].unk04; temp_r30 = &arg0[arg1 - 1].unk10; temp_r27 = &arg0[arg1].unk10; temp_r26 = &arg0[arg1 + 1].unk10; temp_r24 = &arg0[arg1 + 2].unk10; arg3->x = 0.5f * ((-temp_r31->x + temp_r29->x * 3.0f - temp_r28->x * 3.0f + temp_r25->x) * temp_f31 * arg2 + (temp_r31->x * 2.0f - temp_r29->x * 5.0f + temp_r28->x * 4.0f - temp_r25->x) * temp_f31 + (-temp_r31->x + temp_r28->x) * arg2 + temp_r29->x * 2.0f); arg3->y = 0.5f * ((-temp_r31->y + temp_r29->y * 3.0f - temp_r28->y * 3.0f + temp_r25->y) * temp_f31 * arg2 + (temp_r31->y * 2.0f - temp_r29->y * 5.0f + temp_r28->y * 4.0f - temp_r25->y) * temp_f31 + (-temp_r31->y + temp_r28->y) * arg2 + temp_r29->y * 2.0f); arg3->z = 0.5f * ((-temp_r31->z + temp_r29->z * 3.0f - temp_r28->z * 3.0f + temp_r25->z) * temp_f31 * arg2 + (temp_r31->z * 2.0f - temp_r29->z * 5.0f + temp_r28->z * 4.0f - temp_r25->z) * temp_f31 + (-temp_r31->z + temp_r28->z) * arg2 + temp_r29->z * 2.0f); arg4->x = 0.5f * ((-temp_r30->x + temp_r27->x * 3.0f - temp_r26->x * 3.0f + temp_r24->x) * temp_f31 * arg2 + (temp_r30->x * 2.0f - temp_r27->x * 5.0f + temp_r26->x * 4.0f - temp_r24->x) * temp_f31 + (-temp_r30->x + temp_r26->x) * arg2 + temp_r27->x * 2.0f); arg4->y = 0.5f * ((-temp_r30->y + temp_r27->y * 3.0f - temp_r26->y * 3.0f + temp_r24->y) * temp_f31 * arg2 + (temp_r30->y * 2.0f - temp_r27->y * 5.0f + temp_r26->y * 4.0f - temp_r24->y) * temp_f31 + (-temp_r30->y + temp_r26->y) * arg2 + temp_r27->y * 2.0f); arg4->z = 0.5f * ((-temp_r30->z + temp_r27->z * 3.0f - temp_r26->z * 3.0f + temp_r24->z) * temp_f31 * arg2 + (temp_r30->z * 2.0f - temp_r27->z * 5.0f + temp_r26->z * 4.0f - temp_r24->z) * temp_f31 + (-temp_r30->z + temp_r26->z) * arg2 + temp_r27->z * 2.0f); } } static s32 armUpMotTbl[] = { DATA_MAKE_NUM(DATADIR_MARIOMOT, 92), DATA_MAKE_NUM(DATADIR_LUIGIMOT, 92), DATA_MAKE_NUM(DATADIR_PEACHMOT, 92), DATA_MAKE_NUM(DATADIR_YOSHIMOT, 92), DATA_MAKE_NUM(DATADIR_WARIOMOT, 92), DATA_MAKE_NUM(DATADIR_DONKEYMOT, 92), DATA_MAKE_NUM(DATADIR_DAISYMOT, 92), DATA_MAKE_NUM(DATADIR_WALUIGIMOT, 92) }; static s32 scareMotTbl[] = { DATA_MAKE_NUM(DATADIR_MARIOMOT, 28), DATA_MAKE_NUM(DATADIR_LUIGIMOT, 28), DATA_MAKE_NUM(DATADIR_PEACHMOT, 28), DATA_MAKE_NUM(DATADIR_YOSHIMOT, 28), DATA_MAKE_NUM(DATADIR_WARIOMOT, 28), DATA_MAKE_NUM(DATADIR_DONKEYMOT, 28), DATA_MAKE_NUM(DATADIR_DAISYMOT, 28), DATA_MAKE_NUM(DATADIR_WALUIGIMOT, 28) }; static s32 impactMotTbl[] = { DATA_MAKE_NUM(DATADIR_MARIOMOT, 94), DATA_MAKE_NUM(DATADIR_LUIGIMOT, 94), DATA_MAKE_NUM(DATADIR_PEACHMOT, 94), DATA_MAKE_NUM(DATADIR_YOSHIMOT, 94), DATA_MAKE_NUM(DATADIR_WARIOMOT, 94), DATA_MAKE_NUM(DATADIR_DONKEYMOT, 94), DATA_MAKE_NUM(DATADIR_DAISYMOT, 94), DATA_MAKE_NUM(DATADIR_WALUIGIMOT, 94) }; static UnkGenieCameraStruct cameraDataTbl[] = { 60.0f, { 0.0f, 100.0f, 950.0f }, { 0.0f, 100.0f, 600.0f }, 60.0f, { -353.0f, 100.0f, 662.5f }, { 0.0f, 100.0f, 600.0f }, 60.0f, { -500.0f, 100.0f, 375.0f }, { 0.0f, 100.0f, 600.0f }, 60.0f, { -353.0f, 100.0f, 87.5f }, { 0.0f, 100.0f, 600.0f }, 1.0f, { 0.0f, 100.0f, -200.0f }, { 0.0f, 100.0f, 600.0f }, 89.0f, { 0.0f, 100.0f, -200.0f }, { 0.0f, 100.0f, 600.0f }, 1.0f, { 0.0f, 100.0f, -200.0f }, { 0.0f, 100.0f, 600.0f }, 9.0f, { 0.0f, 100.0f, -200.0f }, { 0.0f, 100.0f, 600.0f }, 1.0f, { 0.0f, 100.0f, -200.0f }, { 0.0f, 500.0f, 600.0f }, 5.0f, { 0.0f, 100.0f, -200.0f }, { 0.0f, 500.0f, 600.0f }, 5.0f, { 0.0f, 100.0f, -200.0f }, { 0.0f, 500.0f, 600.0f } }; static s32 genieMotTbl[] = { DATA_MAKE_NUM(DATADIR_BOARD, 125), DATA_MAKE_NUM(DATADIR_BOARD, 126), DATA_MAKE_NUM(DATADIR_BOARD, 127), -1 }; static void GenieSceneExec(void) { GXColor sp1C = { 0xFF, 0xFF, 0xFF, 0xFF }; Vec sp50; Vec sp44; Vec sp38; Vec sp2C; Vec sp20; Process *temp_r21; float temp_f30; float var_f31; s16 temp_r25; s16 temp_r28; s16 temp_r24; s16 temp_r27; s16 var_r22; s16 temp_r20; s32 var_r26; s32 i; ParticleData *temp_r23; BoardModelHideSetAll(1); BoardSpaceHide(1); for (i = 0; i < 4; i++) { BoardStatusShowSet(i, 0); } BoardLightResetExec(); temp_r25 = BoardModelCreate(DATA_MAKE_NUM(DATADIR_BOARD, 128), NULL, 0); sp50.x = sp50.y = sp50.z = 0.0f; BoardModelPosSetV(temp_r25, &sp50); BoardModelCameraSet(temp_r25, 2); Hu3DModelAmbSet(BoardModelIDGet(temp_r25), 1.0f, 1.0f, 1.0f); temp_r24 = BoardModelCreate(DATA_MAKE_NUM(DATADIR_BOARD, 129), NULL, 0); BoardModelPosSetV(temp_r24, &sp50); BoardModelCameraSet(temp_r24, 2); Hu3DModelAmbSet(BoardModelIDGet(temp_r24), 1.0f, 1.0f, 1.0f); temp_r28 = BoardModelCreate(DATA_MAKE_NUM(DATADIR_BOARD, 124), genieMotTbl, 0); sp50.x = sp50.y = 0.0f; sp50.z = 600.0f; sp44.x = sp44.z = 0.0f; sp44.y = 180.0f; BoardModelPosSetV(temp_r28, &sp50); BoardModelRotSetV(temp_r28, &sp44); BoardModelCameraSet(temp_r28, 2); BoardModelAttrSet(temp_r28, 0x40000001); sp38.x = sp38.y = sp38.z = 0.0f; BoardPlayerCameraSet(currItemRestore, 2); BoardPlayerPosSetV(currItemRestore, &sp38); BoardModelVisibilitySet(BoardPlayerModelGet(currItemRestore), 1); VECSubtract(&shadowUp, &shadowPos, &sp2C); VECNormalize(&sp2C, &sp2C); temp_r20 = Hu3DGLightCreateV(&shadowPos, &sp2C, &sp1C); Hu3DShadowCreate(60.0f, 10.0f, 20000.0f); Hu3DModelShadowSet(BoardModelIDGet(BoardPlayerModelGet(currItemRestore))); Hu3DModelShadowSet(BoardModelIDGet(temp_r28)); Hu3DModelShadowMapSet(BoardModelIDGet(temp_r25)); Hu3DShadowSizeSet(0xF0); Hu3DCameraCreate(2); booCamPos.x = 0.0f; booCamPos.y = 100.0f; booCamPos.z = 950.0f; booCamTarget.x = booCamTarget.z = 0.0f; booCamTarget.y = 1.0f; booCamUp.x = 0.0f; booCamUp.y = 100.0f; booCamUp.z = 600.0f; genieFov = 15.0f; Hu3DShadowData.unk_08.x = genieFov; C_MTXLightPerspective(Hu3DShadowData.unk_68, Hu3DShadowData.unk_08.x, 1.2f, 0.5f, -0.5f, 0.5f, 0.5f); temp_r21 = HuPrcChildCreate(GenieCameraProc, 0x2005, 0x1000, 0, HuPrcCurrentGet()); Hu3DBGColorSet(0xFF, 0xFF, 0xFF); temp_r27 = Hu3DParticleCreate(genieParticleAnim, 0x32); Hu3DParticleHookSet(temp_r27, GenieParticleUpdate); Hu3DParticleBlendModeSet(temp_r27, 1); Hu3DParticleColSet(temp_r27, 0xFF, 0xFF, 0xFF); Hu3DParticleAnimModeSet(temp_r27, 0); Hu3DParticleAttrSet(temp_r27, 1); Hu3DModelLayerSet(temp_r27, 7); Hu3DModelPosSet(temp_r27, booCamPos.x, booCamPos.y, booCamPos.z - 175.0f); temp_r23 = Hu3DData[temp_r27].unk_120; temp_r23->unk_02 = 1; WipeCreate(WIPE_MODE_IN, WIPE_TYPE_NORMAL, 45); while (WipeStatGet() != 0) { HuPrcVSleep(); } BoardMusStart(1, 9, 0x7F, 0); while (temp_r23->unk_02 != 0) { HuPrcVSleep(); } HuPrcSleep(45); HuAudPlayerVoicePlay(currItemRestore, 0x128); BoardPlayerMotionStart(currItemRestore, geniePlayerMot[1], 0); BoardPlayerMotionEndWait(currItemRestore); HuPrcSleep(25); Hu3DModelKill(temp_r27); for (i = 0; i < 10; i++) { genieFov += 4.5f; HuPrcVSleep(); } genieFov = 60.0f; HuPrcSleep(90); var_f31 = 0.0f; var_r26 = 0; while (1) { GenieCameraCalc(&cameraDataTbl[0], var_r26, var_f31 / cameraDataTbl[var_r26].unk00, &booCamPos, &booCamUp); var_f31 += 1.0f; if (var_f31 >= cameraDataTbl[var_r26].unk00) { var_r26++; var_f31 = 0.0f; } if (var_r26 >= 8) { break; } HuPrcVSleep(); } GenieCameraCalc(&cameraDataTbl[0], var_r26, 1.0f, &booCamPos, &booCamUp); HuPrcSleep(150); BoardPlayerIdleSet(currItemRestore); sp2C = booCamPos; sp20 = booCamUp; booCamUp.x = sp38.x + (sp50.x - sp38.x) * 0.7f; booCamUp.y = sp38.y + 400.0f; booCamUp.z = sp38.z + (sp50.z - sp38.z) * 0.7f; booCamPos.x = booCamUp.x + sind(-100) * 1100.0; booCamPos.y = booCamUp.y + 950.0f; booCamPos.z = booCamUp.z + cosd(-100) * 1100.0; HuAudFXPlay(0x356); BoardWinCreate(2, MAKE_MESSID(18, 27), -1); BoardWinWait(); BoardWinKill(); booCamUp = sp20; booCamPos = sp2C; HuAudFXPlay(0x33E); HuAudFXPlay(0x367); BoardModelMotionStart(temp_r28, 1, 0); var_r22 = 0; while (BoardModelMotionTimeGet(temp_r28) <= 30.0f) { HuPrcVSleep(); } var_f31 = 0.0f; while (1) { temp_f30 = 40.0f - var_f31 * var_f31 * 0.25f * 0.0125f; if (temp_f30 <= 0.0f && var_r22 == 0) { var_r22 = 1; BoardModelMotionShiftSet(temp_r28, 3, 0.0f, 4.0f, HU3D_MOTATTR_NONE); } var_f31 += 1.0f; sp50.y += temp_f30; if (sp50.y <= 0.0f) { break; } BoardModelPosSetV(temp_r28, &sp50); booCamUp.y = sp50.y + 140.0f; HuPrcVSleep(); } HuAudFXPlay(0x368); sp50.y = 0.0f; BoardModelPosSetV(temp_r28, &sp50); booCamUp.y = sp38.y + 100.0f; BoardModelMotionStart(temp_r28, 2, 0); omVibrate(currItemRestore, 12, 0xC, 0); booCamUp.y = 500.0f; HuAudFXPlay(0x35B); HuAudFXPlay((GWPlayer[currItemRestore].character << 6) + 0x123); var_f31 = 0.0f; while (1) { temp_f30 = 60.0f - var_f31 * var_f31 * 0.25f * 0.009166667f; var_f31 += 1.0f; sp38.y += temp_f30; BoardPlayerPosSetV(currItemRestore, &sp38); if (booCamUp.y < 1100.0f) { booCamUp.y = sp38.y + 160.0f; } if (sp38.y >= 2800.0f) { break; } HuPrcVSleep(); } WipeCreate(WIPE_MODE_OUT, WIPE_TYPE_NORMAL, 45); BoardAudSeqFadeOut(1, 1000); while (WipeStatGet() != 0) { HuPrcVSleep(); } BoardModelKill(temp_r28); BoardModelKill(temp_r25); BoardModelKill(temp_r24); Hu3DCameraKill(2); Hu3DGLightKill(temp_r20); BoardModelHideSetAll(0); BoardSpaceHide(0); for (i = 0; i < 4; i++) { BoardStatusShowSet(i, 1); } HuPrcKill(temp_r21); BoardPlayerCameraSet(currItemRestore, 1); BoardLightSetExec(); HuAudFXPauseAll(0); } static void ExecItemGenie(void) { UnkItemShowProcStruct sp24; Vec sp18; Vec spC; ParticleData *sp8; Process *temp_r27; float var_f29; float var_f31; float var_f30; s16 temp_r31; s16 var_r26; s32 temp_r28; s32 temp_r25; s32 var_r30; suitMdl = BoardModelCreate(itemMdlTbl[currItem], NULL, 1); BoardModelLayerSet(suitMdl, 2); genieParticleAnim = HuSprAnimReadFile(DATA_MAKE_NUM(DATADIR_BOARD, 105)); HuSprAnimLock(genieParticleAnim); geniePlayerMot[0] = BoardPlayerMotionCreate(currItemRestore, armUpMotTbl[GWPlayer[currItemRestore].character]); geniePlayerMot[1] = BoardPlayerMotionCreate(currItemRestore, scareMotTbl[GWPlayer[currItemRestore].character]); geniePlayerMot[2] = BoardPlayerMotionCreate(currItemRestore, impactMotTbl[GWPlayer[currItemRestore].character]); sp24.unk02 = suitMdl; sp24.unk04 = 4.0f; sp24.unk08 = 3.0f; sp24.unk10 = sp24.unk14 = sp24.unk18 = 0.0f; sp24.unk14 = 4.0f; sp24.unk1C = 1; HuAudFXPlay(0x350); temp_r27 = ItemShowProc(&sp24, NULL); BoardCameraViewSet(3); HuAudFXPlay(0x323); var_r30 = 0; while (1) { if (var_r30 == 105) { BoardPlayerMotionStart(currItemRestore, geniePlayerMot[0], 0); } BoardModelRotGet(suitMdl, &spC); if (90.0f - spC.y <= sp24.unk14 && 90.0f - spC.y >= 0.0f && var_r30 >= 120) { break; } HuPrcVSleep(); var_r30++; } HuAudPlayerVoicePlay(currItemRestore, 0x125); temp_r25 = HuAudFXPlay(0x34D); temp_r31 = Hu3DParticleCreate(genieParticleAnim, 0x96); Hu3DParticleHookSet(temp_r31, LampParticleUpdate); Hu3DParticleBlendModeSet(temp_r31, 0); Hu3DParticleColSet(temp_r31, 0xFF, 0xFF, 0xFF); Hu3DParticleAnimModeSet(temp_r31, 0); Hu3DParticleAttrSet(temp_r31, 1); Hu3DModelLayerSet(temp_r31, 7); BoardModelPosGet(suitMdl, &spC); Hu3DModelPosSet(temp_r31, spC.x, spC.y, spC.z); sp8 = Hu3DData[temp_r31].unk_120; omVibrate(currItemRestore, 181, 6, 6); HuPrcSleep(135); BoardAudSeqPause(0, 1, 1000); HuAudFXStop(temp_r25); HuAudFXPauseAll(1); WipeColorSet(0xFF, 0xFF, 0xFF); WipeCreate(WIPE_MODE_OUT, WIPE_TYPE_NORMAL, 45); while (WipeStatGet() != 0) { HuPrcVSleep(); } Hu3DModelKill(temp_r31); BoardModelKill(suitMdl); HuPrcKill(temp_r27); BoardPlayerIdleSet(currItemRestore); GenieSceneExec(); BoardCameraMoveSet(0); BoardCameraViewSet(2); temp_r28 = BoardSpaceStarGetCurr(); BoardCameraTargetSpaceSet(temp_r28); GWPlayer[currItemRestore].space_curr = temp_r28; BoardSpacePosGet(0, temp_r28, &spC); sp18 = spC; spC.y += 1000.0f; BoardPlayerPosSetV(currItemRestore, &spC); BoardCameraMotionWait(); BoardCameraMoveSet(1); WipeCreate(WIPE_MODE_IN, WIPE_TYPE_NORMAL, 45); HuPrcSleep(15); BoardAudSeqPause(0, 0, 1000); while (WipeStatGet() != 0) { HuPrcVSleep(); } HuAudFXPlay(0x35E); CharModelEffectEnableSet(GWPlayer[currItemRestore].character, 0); BoardPlayerMotionStart(currItemRestore, 6, 0x40000001); var_f29 = 0.0f; var_f31 = 1.0f; var_r26 = 0; while (1) { var_f30 = var_f29 - var_f31 * var_f31 * 0.25f * 0.06666667f; if (var_f30 < -35.0f) { var_f30 = -35.0f; } if (var_f30 > 35.0f) { var_f30 = 35.0f; } var_f31 += 1.0f; spC.y += var_f30; if (spC.y <= sp18.y) { omVibrate(currItemRestore, 12, 6, 6); spC.y = sp18.y; var_f29 = -var_f30 * 0.2f; if (fabs(var_f29) <= 5.0) { var_f31 = -1.0f; break; } var_f31 = 1.0f; if (var_r26 == 0) { BoardPlayerMotionStart(currItemRestore, geniePlayerMot[2], 0); } } BoardPlayerPosSetV(currItemRestore, &spC); HuPrcVSleep(); } BoardPlayerIdleSet(currItemRestore); CharModelEffectEnableSet(GWPlayer[currItemRestore].character, 1); HuSprAnimKill(genieParticleAnim); BoardPlayerMotionKill(currItemRestore, geniePlayerMot[0]); BoardPlayerMotionKill(currItemRestore, geniePlayerMot[1]); BoardPlayerMotionKill(currItemRestore, geniePlayerMot[2]); HuPrcKill(NULL); while (1) { HuPrcVSleep(); } } void BoardItemBagItemSet(s16 *arg0) { s32 i; for (i = 0; i < 3; i++) { itemBagItems[i] = arg0[i]; } } static void ExecItemBagJump(void) { Vec sp20; Vec sp14; Vec sp8; float temp_f29; float var_f30; float var_f31; s16 temp_r31; temp_r31 = (s16)HuPrcCurrentGet()->user_data; BoardModelScaleGet(temp_r31, &sp20); BoardModelPosGet(temp_r31, &sp14); sp8 = sp14; sp8.y += 80.0f; var_f31 = 0.0f; var_f30 = 0.0f; HuAudFXPlay(0x310); while (1) { temp_f29 = 8.0f - var_f30 * var_f30 * 0.25f * 0.075f; var_f31 += 0.1f; if (var_f31 > 1.0f) { var_f31 = 1.0f; } sp20.x = sp20.y = sp20.z = var_f31; sp14.y += temp_f29; BoardModelPosSetV(temp_r31, &sp14); BoardModelScaleSetV(temp_r31, &sp20); var_f30 += 1.0f; if (temp_f29 < 0.0f) { break; } HuPrcVSleep(); } CharModelLayerSetAll(3); CharModelEffectCreate(1, &sp14); BoardModelVisibilitySet(temp_r31, 0); HuAudFXPlay(0x30D); HuPrcKill(NULL); while (1) { HuPrcVSleep(); } } static void ExecItemBagShow(void) { Vec sp14; Vec sp8; float var_f31; Process *temp_r31; UnkItemShowProcStruct *temp_r30; UnkItemShowProcStruct *temp_r29; temp_r31 = HuPrcCurrentGet()->user_data; temp_r30 = temp_r31->user_data; temp_r30->unk00 = 1; BoardModelPosGet(suitMdl, &sp14); var_f31 = 0.0f; while (1) { if (var_f31 >= 180.0f) { break; } sp8 = sp14; sp8.y += 15.0 * sind(var_f31); BoardModelPosSetV(suitMdl, &sp8); var_f31 += 36.0f; HuPrcVSleep(); } BoardModelPosSetV(suitMdl, &sp14); temp_r29 = temp_r31->user_data; temp_r29->unk00 = 0; HuPrcKill(NULL); while (1) { HuPrcVSleep(); } } static void ExecItemBag(void) { UnkItemShowProcStruct sp3C; Vec sp30; Vec sp24; Vec sp18; float temp_f31; float sp10[2]; s16 sp8[3]; s16 temp_r28; s16 temp_r27; s16 var_r26; s16 var_r30; s16 temp_r23; s16 i; u16 var_r25; Process *temp_r29; Process *temp_r24; for (i = 0; i < 3; i++) { if (itemBagItems[i] == -1) { itemBagItems[i] = rand8() % 13; } } temp_r23 = GWPlayer[currItemRestore].port; suitMdl = BoardModelCreate(itemMdlTbl[currItem], NULL, 1); BoardModelLayerSet(suitMdl, 2); BoardCameraRotGet(&sp18); BoardModelRotYSet(suitMdl, sp18.y); temp_r27 = var_r30 = 3 - BoardPlayerItemCount(currItemRestore); for (i = 0; i < temp_r27; i++) { sp8[i] = BoardModelCreate(itemMdlTbl[itemBagItems[i]], NULL, 1); if (itemBagItems[i] == 0xB) { BoardModelAttrSet(sp8[i], 0x40000001); } if (itemBagItems[i] == 5) { temp_f31 = -50.0f; Hu3DData[BoardModelIDGet(sp8[i])].unk_F0[1][3] = temp_f31; } BoardModelRotYSet(sp8[i], sp18.y); BoardModelLayerSet(sp8[i], 2); BoardModelVisibilitySet(sp8[i], 0); } sp3C.unk02 = suitMdl; sp3C.unk04 = 2.0f; sp3C.unk08 = 5.0f; sp3C.unk10 = sp3C.unk14 = sp3C.unk18 = 0.0f; sp3C.unk1C = 0; HuAudFXPlay(0x350); temp_r24 = ItemShowProc(&sp3C, NULL); HuWinMesMaxSizeGet(1, sp10, MAKE_MESSID(18, 20)); temp_r28 = HuWinCreate(-10000.0f, 320.0f, sp10[0], sp10[1], 0); HuWinMesSet(temp_r28, MAKE_MESSID(18, 20)); HuWinBGTPLvlSet(temp_r28, 0.0f); HuWinMesSpeedSet(temp_r28, 0); var_r26 = frandmod(40) + 30; var_r30 = 0; sp24.x = sp24.y = sp24.z = 0.0f; while (var_r30 < temp_r27) { if (GWPlayerCfg[currItemRestore].iscom == 1) { if (--var_r26 == 0) { var_r25 = 0x100; var_r26 = frandmod(40) + 30; } } else { var_r25 = HuPadBtnDown[temp_r23]; } if (!(var_r25 & 0x100)) { HuPrcVSleep(); } else { BoardPlayerDiceJumpStart(currItemRestore); while (!BoardPlayerDiceJumpCheck(currItemRestore)) { HuPrcVSleep(); } HuAudFXPlay(0x324); BoardModelPosGet(suitMdl, &sp30); BoardModelPosSetV(sp8[var_r30], &sp30); BoardModelScaleSetV(sp8[var_r30], &sp24); BoardModelVisibilitySet(sp8[var_r30], 1); temp_r29 = HuPrcChildCreate(ExecItemBagJump, 0x2004, 0x1000, 0, HuPrcCurrentGet()); temp_r29->user_data = (void *)sp8[var_r30]; temp_r29 = HuPrcChildCreate(ExecItemBagShow, 0x2004, 0x1000, 0, HuPrcCurrentGet()); temp_r29->user_data = temp_r24; while (GWPlayer[currItemRestore].jump) { HuPrcVSleep(); } HuPrcChildWatch(); BoardPlayerItemAdd(currItemRestore, itemBagItems[var_r30]); BoardPlayerMotionShiftSet(currItemRestore, 1, 0.0f, 10.0f, HU3D_MOTATTR_LOOP); HuPrcSleep(10); var_r30++; } } HuWinKill(temp_r28); BoardModelPosGet(suitMdl, &sp30); CharModelLayerSetAll(3); CharModelEffectCreate(1, &sp30); HuAudFXPlay(0x351); HuPrcSleep(10); HuPrcKill(temp_r24); BoardModelKill(suitMdl); for (i = 0; i < temp_r27; i++) { BoardModelKill(sp8[i]); } HuPrcSleep(30); HuPrcKill(NULL); while (1) { HuPrcVSleep(); } } static void RestoreItemNull(void) { HuPrcKill(NULL); while (1) { HuPrcVSleep(); } } static void RestoreItemMini(void) { HuAudFXPlay(0x311); ItemSizeSet(0); HuPrcKill(NULL); while (1) { HuPrcVSleep(); } } static void RestoreItemMega(void) { HuAudFXPlay(0x313); ItemSizeSet(0); HuPrcKill(NULL); while (1) { HuPrcVSleep(); } } static void RestoreItemMiniSuper(void) { HuAudFXPlay(0x311); ItemSizeSet(0); HuPrcKill(NULL); while (1) { HuPrcVSleep(); } } static void RestoreItemMegaSuper(void) { HuAudFXPlay(0x313); ItemSizeSet(0); HuPrcKill(NULL); while (1) { HuPrcVSleep(); } } static void RestoreItemBowser(void) { Vec sp20; Vec sp14; Vec sp8; s16 temp_r31; s16 temp_r29; s16 i; temp_r31 = BoardModelCreate(DATA_MAKE_NUM(DATADIR_BOARD, 99), NULL, 0); BoardModelVisibilitySet(temp_r31, 0); BoardModelLayerSet(temp_r31, 3); BoardPlayerPosGet(currItemRestore, &sp14); sp20.x = sp20.y = sp20.z = 0.0f; sp14.y += 100.0f; BoardModelPosSetV(temp_r31, &sp14); BoardModelScaleSetV(temp_r31, &sp20); BoardModelAttrSet(temp_r31, 0x40000001); BoardModelAttrSet(temp_r31, 0x400000); suitMdl = BoardBowserSuitModelGet(); temp_r29 = BoardBowserSuitPlayerModelGet(); BoardModelMotionShiftSet(suitMdl, suitMot[0], 0.0f, 5.0f, HU3D_MOTATTR_NONE); BoardModelMotionShiftSet(temp_r29, suitCommonMot[0], 0.0f, 5.0f, HU3D_MOTATTR_NONE); HuPrcSleep(40); HuAudPlayerVoicePlay(currItemRestore, 0x129); HuPrcSleep(20); HuAudFXPlay(0x32B); BoardModelVisibilitySet(temp_r31, 1); for (i = 0; i < 60; i++) { sp20.x += 0.15f; sp20.y += 0.15f; sp20.z += 0.15f; BoardModelScaleSetV(temp_r31, &sp20); HuPrcVSleep(); } sp20.x = sp20.y = sp20.z = 9.0f; BoardModelScaleSetV(temp_r31, &sp20); HuPrcSleep(60); HuAudFXPlay(0x313); BoardModelHookReset(suitMdl); BoardBowserSuitKill(currItemRestore); sp8.x = sp8.y = sp8.z = 1.0f; BoardPlayerScaleSetV(currItemRestore, &sp8); BoardModelVisibilitySet(BoardPlayerModelGet(currItemRestore), 1); for (i = 0; i < 60; i++) { sp20.x -= 0.15f; sp20.y -= 0.15f; sp20.z -= 0.15f; BoardModelScaleSetV(temp_r31, &sp20); HuPrcVSleep(); } BoardModelKill(temp_r31); HuPrcKill(NULL); while (1) { HuPrcVSleep(); } }