diff --git a/include/d/d_meter2.h b/include/d/d_meter2.h index 4246d9249d..b3bde323ae 100644 --- a/include/d/d_meter2.h +++ b/include/d/d_meter2.h @@ -100,6 +100,11 @@ public: bool isShowFlag(int i_no) { return field_0x1e6 & (1 << i_no); } void onShowFlag(int i_no) { field_0x1e6 |= (1 << i_no); } +#if TARGET_PC + void presentAnims(); + void presentMap(); +#endif + /* 0x0FC */ int field_0xfc; /* 0x100 */ JKRExpHeap* mpHeap; /* 0x104 */ JKRExpHeap* mpSubHeap; @@ -299,6 +304,16 @@ public: /* 0x460 */ u8 field_0x460[0x4bc - 0x460]; /* 0x4BC */ u8 field_0x4bc; /* 0x4BC */ u8 field_0x4bd; + +#if TARGET_PC + struct { + f32 vesselX, vesselY, vesselScale, vesselAlpha; + f32 buttonAX[2], buttonAY[2]; + f32 buttonBX[2], buttonBY[2]; + f32 crossX, crossY; + bool ready; + } mPresentationTargets; +#endif }; #endif /* D_METER_D_METER2_H */ diff --git a/include/d/d_meter2_draw.h b/include/d/d_meter2_draw.h index c9dc8217e9..927d71d63c 100644 --- a/include/d/d_meter2_draw.h +++ b/include/d/d_meter2_draw.h @@ -11,6 +11,7 @@ class JKRExpHeap; class JKRHeap; class dKantera_icon_c; +IF_DUSK(class dMeterMap_c); class dMeter2Draw_c : public dDlst_base_c { public: @@ -46,7 +47,8 @@ public: void playPikariBpkAnimation(f32); void playOxygenBpkAnimation(J2DAnmColor*); void drawPikari(f32, f32, f32*, f32, JUtility::TColor, JUtility::TColor, - JUtility::TColor, JUtility::TColor, f32, u8); + JUtility::TColor, JUtility::TColor, f32, u8 + IF_DUSK_ARG(f32 elapsedFrames = -1.0f)); void drawPikari(CPaneMgr*, f32*, f32, JUtility::TColor, JUtility::TColor, JUtility::TColor, JUtility::TColor, f32, u8); void drawPikariHakusha(f32, f32, f32, f32, JUtility::TColor, JUtility::TColor, @@ -59,11 +61,11 @@ public: void drawKanteraScreen(u8); void drawMagic(s16, s16, f32, f32); void setAlphaMagicChange(bool); - void drawKantera(s32, s32, f32, f32); + void drawKantera(s32, DUSK_IF_ELSE(f32, s32), f32, f32); void setAlphaKanteraChange(bool); void setAlphaKanteraAnimeMin(); void setAlphaKanteraAnimeMax(); - void drawOxygen(s32, s32, f32, f32); + void drawOxygen(s32, DUSK_IF_ELSE(f32, s32), f32, f32); void setAlphaOxygenChange(bool); void setAlphaOxygenAnimeMin(); void setAlphaOxygenAnimeMax(); @@ -134,7 +136,11 @@ public: J2DScreen* getMainScreenPtr() { return mpScreen; } bool isEmphasisC() { return field_0x766 == 7 ? true : false; } +#if TARGET_PC + f32 getMeterGaugeAlphaRate(u8 i_no); +#else f32 getMeterGaugeAlphaRate(u8 i_no) { return mMeterAlphaRate[i_no]; } +#endif bool isEmphasisA() { return field_0x761 == 7 ? true : false; } bool isEmphasisB() { return field_0x762 == 7 ? true : false; } bool isEmphasisBin() { return field_0x763 == 7 ? true : false; } @@ -152,6 +158,27 @@ public: constexpr f32 getButtonZAlpha() const { return mButtonZAlpha; } + + void beginExecution(); + void endExecution(); + bool isExecuting() const { return mExecuting; } + void setExecuting(bool executing) { mExecuting = executing; } + + void publishKantera(s32 now, s32 max); + void publishOxygen(s32 now, s32 max); + + void present(); + void presentVessel(f32 i_posX, f32 i_posY, f32 i_scale); + void presentButtonA(f32 i_posX, f32 i_posY, f32 i_textPosX, f32 i_textPosY, f32 i_scale); + void presentButtonB(f32 i_posX, f32 i_posY, f32 i_textPosX, f32 i_textPosY, f32 i_scale); + void presentMapAlpha(dMeterMap_c* map); + + void showLightDrop(bool show, bool get_path = false); + void showCross(bool show); + void showMap(bool show); + + bool lightDropRowUsed() const; + void resetRows(); #endif /* 0x004 */ item_params mItemParams[4]; @@ -284,7 +311,7 @@ public: /* 0x742 */ s16 field_0x742[3]; /* 0x748 */ u8 field_0x748[0xC]; /* 0x756 */ u16 field_0x754; - /* 0x756 */ s16 field_0x756; + /* 0x756 */ DUSK_IF_ELSE(f32, s16) field_0x756; /* 0x758 */ u8 field_0x758; /* 0x759 */ u8 field_0x759; /* 0x75A */ u8 field_0x75a; @@ -363,6 +390,9 @@ public: /* 0x858 */ GXColor mButtonZTextColor; /* 0x85C */ GXColor mButtonXYTextColor; /* 0x860 */ u8 field_0x860[2]; +#if TARGET_PC + bool mExecuting; +#endif }; #endif /* D_METER_D_METER2_DRAW_H */ diff --git a/src/d/d_meter2.cpp b/src/d/d_meter2.cpp index a90124ebb6..80dd19c7b1 100644 --- a/src/d/d_meter2.cpp +++ b/src/d/d_meter2.cpp @@ -36,9 +36,12 @@ f32 dGetUserHudScale() { } } // namespace + +#include "d_meter2_vdt.inc" #endif int dMeter2_c::_create() { + IF_DUSK(mPresentationTargets = {}); stage_stag_info_class* stag_info = dComIfGp_getStageStagInfo(); if (dStage_stagInfo_GetUpButton(stag_info) == 1) { mpHeap = fopMsgM_createExpHeap(HEAP_SIZE(0x5A400, 0xA0000), NULL); @@ -256,10 +259,19 @@ int dMeter2_c::_create() { mpHeap->getTotalFreeSize(); field_0x11c = NULL; mDoExt_setCurrentHeap(heap); + + IF_DUSK(base.draw_interp_frame = true); + return cPhs_COMPLEATE_e; } int dMeter2_c::_execute() { +#if TARGET_PC + if (mpMeterDraw != NULL) { + mpMeterDraw->beginExecution(); + } +#endif + JKRHeap* heap = mDoExt_setCurrentHeap(mpHeap); if (!dComIfGs_isCollectMirror(0) @@ -321,6 +333,13 @@ int dMeter2_c::_execute() { dComIfGp_setBottleStatus(0, 0); dComIfGp_setCStickStatus(0, 0, 0); +#if TARGET_PC + if (mpMeterDraw != NULL) { + mPresentationTargets.ready = true; + mpMeterDraw->endExecution(); + } +#endif + mDoExt_setCurrentHeap(heap); return 1; } @@ -820,11 +839,12 @@ void dMeter2_c::moveKantera() { } if (draw_kantera == true) { - mpMeterDraw->drawKantera(mMaxOil, mNowOil, x_pos, y_pos); + IF_NOT_DUSK(mpMeterDraw->drawKantera(mMaxOil, mNowOil, x_pos, y_pos)); } alphaAnimeKantera(); dComIfGp_setItemNowOil(mNowOil); + IF_DUSK(mpMeterDraw->publishKantera(mNowOil, mMaxOil)); } void dMeter2_c::moveOxygen() { @@ -941,11 +961,12 @@ void dMeter2_c::moveOxygen() { } if (draw_oxygen == true) { - mpMeterDraw->drawOxygen(mMaxOxygen, mNowOxygen, x_pos, y_pos); + IF_NOT_DUSK(mpMeterDraw->drawOxygen(mMaxOxygen, mNowOxygen, x_pos, y_pos)); } alphaAnimeOxygen(); dComIfGp_setNowOxygen(mNowOxygen); + IF_DUSK(mpMeterDraw->publishOxygen(mNowOxygen, mMaxOxygen)); } void dMeter2_c::moveLightDrop() { @@ -1002,6 +1023,12 @@ void dMeter2_c::moveLightDrop() { alpha = g_drawHIO.mLightDrop.mVesselAlpha[0]; } +#if TARGET_PC + mPresentationTargets.vesselX = pos_x; + mPresentationTargets.vesselY = pos_y; + mPresentationTargets.vesselScale = scale; + mPresentationTargets.vesselAlpha = alpha; +#else if (mVesselPosX != pos_x) { cLib_addCalc2(&mVesselPosX, pos_x, 1.0f, 10.0f); draw_lightdrop = true; @@ -1033,6 +1060,7 @@ void dMeter2_c::moveLightDrop() { mVesselAlpha = alpha; } } +#endif if (draw_lightdrop == true) { mpMeterDraw->drawLightDrop(mLightDropNum, mNeedLightDropNum, mVesselPosX, mVesselPosY, @@ -1384,6 +1412,12 @@ void dMeter2_c::moveButtonA() { var_f31 = 1.0f; } +#if TARGET_PC + for (int i = 0; i < 2; i++) { + mPresentationTargets.buttonAX[i] = pos_x[i]; + mPresentationTargets.buttonAY[i] = pos_y[i]; + } +#else for (int i = 0; i < 2; i++) { if (mButtonATalkPosX[i] != pos_x[i]) { cLib_addCalc2(&mButtonATalkPosX[i], pos_x[i], 1.0f, 10.0f); @@ -1409,6 +1443,7 @@ void dMeter2_c::moveButtonA() { field_0x144 = var_f31; } } +#endif if (field_0x200 != dMsgObject_isTalkNowCheck()) { field_0x200 = dMsgObject_isTalkNowCheck(); @@ -1589,6 +1624,12 @@ void dMeter2_c::moveButtonB() { draw_buttonB = true; } +#if TARGET_PC + for (int i = 0; i < 2; i++) { + mPresentationTargets.buttonBX[i] = pos_x[i]; + mPresentationTargets.buttonBY[i] = pos_y[i]; + } +#else for (int i = 0; i < 2; i++) { if (field_0x148[i] != pos_x[i]) { cLib_addCalc2(&field_0x148[i], pos_x[i], 1.0f, 10.0f); @@ -1614,6 +1655,7 @@ void dMeter2_c::moveButtonB() { field_0x158 = var_f31; } } +#endif if (g_drawHIO.mItemScaleAdjustON && field_0x4bc != g_drawHIO.mItemScalePercent) { field_0x4bc = g_drawHIO.mItemScalePercent; @@ -2199,6 +2241,10 @@ void dMeter2_c::moveButtonCross() { temp_f30 = mButtonCrossOFFPosX + (((f32)field_0x1b4 / (f32)g_drawHIO.mButtonCrossMoveFrame) * (mButtonCrossONPosX - mButtonCrossOFFPosX)); +#if TARGET_PC + mPresentationTargets.crossX = temp_f30; + mPresentationTargets.crossY = var_f31; +#else if (field_0x15c != var_f31) { cLib_addCalc2(&field_0x15c, var_f31, 0.5f, 50.0f); if ((f32)fabs(field_0x15c - var_f31) < 0.5f) { @@ -2206,6 +2252,7 @@ void dMeter2_c::moveButtonCross() { } draw_cross = true; } +#endif if (draw_cross == true) { mpMeterDraw->drawButtonCross(temp_f30, field_0x15c); @@ -2850,7 +2897,15 @@ void dMeter2_c::alphaAnimeLightDrop() { if (!isShowLightDrop()) { mpMeterDraw->setAlphaLightDropAnimeMin(); } else { +#if TARGET_PC + const bool dropGetPath = + dMeter2Info_getLightDropGetFlag(dComIfGp_getStartStageDarkArea()) > 1 && + dMeter2Info_getLightDropGetFlag(dComIfGp_getStartStageDarkArea()) != 0xFF; + + mpMeterDraw->showLightDrop(true, dropGetPath); +#else mpMeterDraw->setAlphaLightDropAnimeMax(); +#endif } mpMeterDraw->setAlphaLightDropChange(false); @@ -2994,36 +3049,34 @@ void dMeter2_c::alphaAnimeButtonCross() { { mpMeterDraw->setAlphaButtonCrossAnimeMin(); - if ((!dComIfGp_event_chkEventFlag(0x40) || dMeter2Info_isGameStatus(2) || - (mStatus & 0x100)) && - field_0x190 > 0) - { - field_0x190--; + if ((!dComIfGp_event_chkEventFlag(0x40) || dMeter2Info_isGameStatus(2) || (mStatus & 0x100)) IF_NOT_DUSK(&& field_0x190 > 0)) { + DUSK_IF_ELSE(mpMeterDraw->showMap(false), field_0x190--); } } else if (dMeter2Info_isSub2DStatus(1) || dMeter2Info_isFloatingMessageVisible()) { mpMeterDraw->setAlphaButtonCrossAnimeMin(); +#if TARGET_PC + mpMeterDraw->showMap(true); +#else if (field_0x190 < 5) { field_0x190++; } +#endif } else { #if TARGET_PC - if (dusk::getSettings().game.enableTouchControls) { - mpMeterDraw->setAlphaButtonCrossAnimeMin(); - } else { - mpMeterDraw->setAlphaButtonCrossAnimeMax(); - } + mpMeterDraw->showCross(!dusk::getSettings().game.enableTouchControls); + mpMeterDraw->showMap(true); #else mpMeterDraw->setAlphaButtonCrossAnimeMax(); -#endif if (field_0x190 < 5) { field_0x190++; } +#endif } if (mpMap != NULL) { - mpMap->setMapAlpha((field_0x190 * 255.0f) / 5.0f); + IF_NOT_DUSK(mpMap->setMapAlpha((field_0x190 * 255.0f) / 5.0f)); } } diff --git a/src/d/d_meter2_draw.cpp b/src/d/d_meter2_draw.cpp index 742fe6762d..9771e030c4 100644 --- a/src/d/d_meter2_draw.cpp +++ b/src/d/d_meter2_draw.cpp @@ -23,14 +23,23 @@ #include #if TARGET_PC +#include "dusk/game_clock.h" #include "dusk/interp/frame_interpolation.h" +#include "dusk/interp/user_interface.h" #include "dusk/settings.h" #include "dusk/ui/icon_provider.hpp" #include "dusk/version.hpp" +#include "d/d_meter2.h" + #include namespace { +f32 s_button_a_scale = 1.0f; +f32 s_button_a_text_scale = 1.0f; +int s_button_b_kind; +f32 s_button_b_scale = 1.0f; +f32 s_button_b_text_scale = 1.0f; // Reads the user HUD scale setting, clamped to a safe range. f32 dGetUserHudScale() { @@ -56,12 +65,14 @@ void dAnchorHudScale(CPaneMgr* i_pane, HudCorner i_corner, f32* io_x, f32* io_y, *io_x += dirX * i_pane->getInitSizeX() * half * i_pull; *io_y += dirY * i_pane->getInitSizeY() * half; } - } // namespace + +#include "d_meter2_draw_vdt.inc" #endif dMeter2Draw_c::dMeter2Draw_c(JKRExpHeap* mp_heap) { #if TARGET_PC + setExecuting(false); // correct hio data here because we can't do runtime disc checks in sinit data constructors if (dusk::version::isRegionJpn()) { g_drawHIO.mButtonATextSpacing = -2.0f; @@ -607,6 +618,7 @@ void dMeter2Draw_c::init() { initButton(); initButtonCross(); field_0x772 = 0; + IF_DUSK(resetRows()); } void dMeter2Draw_c::exec(u32 i_status) { @@ -691,6 +703,15 @@ void dMeter2Draw_c::exec(u32 i_status) { } void dMeter2Draw_c::draw() { +#if TARGET_PC + if (dusk::game_clock::is_presentation_frame()) { + advance_fade_rows(); + if (dMeter2_c* meter = dMeter2Info_getMeterClass()) { + meter->presentAnims(); + } + } +#endif + J2DGrafContext* graf_ctx = dComIfGp_getCurrentGrafPort(); graf_ctx->setup2D(); @@ -707,16 +728,12 @@ void dMeter2Draw_c::draw() { drawKanteraScreen(1); drawKanteraScreen(2); -#if TARGET_PC - if (!touchControlsEnabled) { -#endif + IF_DUSK_BLOCK(!touchControlsEnabled) for (int i = 0; i < 2; i++) { if (mpItemXY[i] != NULL) { for (int j = 0; j < 3; j++) { f32 temp_f30 = mItemParams[i].num_scale * 16.0f; -#if TARGET_PC - temp_f30 *= dGetUserHudScale(); -#endif + IF_DUSK(temp_f30 *= dGetUserHudScale()); Vec vtx0 = mpItemXY[i]->getPanePtr()->getGlbVtx(0); Vec vtx3 = mpItemXY[i]->getPanePtr()->getGlbVtx(3); @@ -758,9 +775,7 @@ void dMeter2Draw_c::draw() { } } } -#if TARGET_PC - } -#endif + IF_DUSK_BLOCK_END if (mpLightDropParent->getAlphaRate() != 0.0f) { f32 var_f28 = g_drawHIO.mLightDrop.mPikariScaleNormal; @@ -769,24 +784,22 @@ void dMeter2Draw_c::draw() { if (field_0x756 >= 0) { var_f29 = g_drawHIO.mLightDrop.mDropPikariAnimSpeed_Completed; int temp_r5_2 = g_drawHIO.mLightDrop.mPikariInterval * 15; - IF_DUSK(var_f28 = g_drawHIO.mLightDrop.mPikariScaleComplete); // FRAME INTERP NOTE: Set even if not advancing - IF_DUSK_BLOCK(dusk::interp::get_ui_tick_pending()) if (field_0x756 <= temp_r5_2) { - int temp_r4 = (field_0x756 % g_drawHIO.mLightDrop.mPikariInterval); - int temp_r3_5 = field_0x756 / g_drawHIO.mLightDrop.mPikariInterval; + int temp_r4 = (IF_DUSK((int))field_0x756 % g_drawHIO.mLightDrop.mPikariInterval); + int temp_r3_5 = IF_DUSK((int))field_0x756 / g_drawHIO.mLightDrop.mPikariInterval; if (temp_r4 == 0 && field_0x62c[temp_r3_5] == 0.0f) { field_0x62c[temp_r3_5] = 18.0f; } var_f28 = g_drawHIO.mLightDrop.mPikariScaleComplete; - field_0x756++; + DUSK_IF_ELSE(field_0x756 += dusk::game_clock::original_frames(), field_0x756++); } else { int temp_r5_3 = temp_r5_2 + 1; - if (field_0x756 == temp_r5_3) { + if (field_0x756 DUSK_IF_ELSE(< temp_r5_3 + 1, == temp_r5_3)) { if (field_0x62c[15] == 0.0f) { - field_0x756++; + DUSK_IF_ELSE(field_0x756 += dusk::game_clock::original_frames(), field_0x756++); } var_f28 = g_drawHIO.mLightDrop.mPikariScaleComplete; } else if (field_0x756 >= g_drawHIO.mLightDrop.field_0x54 + temp_r5_3) { @@ -797,10 +810,9 @@ void dMeter2Draw_c::draw() { field_0x756 = -1; } else { - field_0x756++; + DUSK_IF_ELSE(field_0x756 += dusk::game_clock::original_frames(), field_0x756++); } } - IF_DUSK_BLOCK_END } for (int i = 0; i < 16; i++) { @@ -984,8 +996,7 @@ void dMeter2Draw_c::initMagic() { g_drawHIO.mMagicMeterPosY + offsetY); setAlphaMagicChange(true); - drawKantera(dComIfGs_getMaxOil(), dComIfGs_getOil(), g_drawHIO.mLanternMeterPosX + offsetX, - g_drawHIO.mNoMagicPosY + (g_drawHIO.mLanternMeterPosY + offsetY)); + IF_NOT_DUSK(drawKantera(dComIfGs_getMaxOil(), dComIfGs_getOil(), g_drawHIO.mLanternMeterPosX + offsetX, g_drawHIO.mNoMagicPosY + (g_drawHIO.mLanternMeterPosY + offsetY))); setAlphaKanteraChange(true); } @@ -1465,7 +1476,7 @@ void dMeter2Draw_c::drawPikari(CPaneMgr* i_pane, f32* i_framep, f32 i_scale, void dMeter2Draw_c::drawPikari(f32 i_posX, f32 i_posY, f32* i_framep, f32 i_scale, JUtility::TColor i_moyaBlack, JUtility::TColor i_moyaWhite, JUtility::TColor i_moyabsBlack, JUtility::TColor i_moyabsWhite, - f32 param_8, u8 param_9) { + f32 param_8, u8 param_9 IF_DUSK_ARG(f32 elapsedFrames)) { f32 var_f31 = 28.0f; if (param_9 == 4) { @@ -1490,7 +1501,30 @@ void dMeter2Draw_c::drawPikari(f32 i_posX, f32 i_posY, f32* i_framep, f32 i_scal if (param_9 != 3 && param_9 != 4 && param_9 != 5 && dMsgObject_isTalkNowCheck()) { *i_framep = 0.0f; } else { - IF_DUSK_BLOCK(dusk::interp::get_ui_tick_pending()) +#if TARGET_PC + const f32 previous = *i_framep; + const f32 frames = elapsedFrames >= 0.0f ? elapsedFrames : dusk::game_clock::original_frames(); + const f32 next = previous + param_8 * frames; + const bool looping = param_9 == 1 || param_9 == 2 || param_9 == 3; + *i_framep = next > var_f31 ? (looping ? 18.0f : 0.0f) : next; + + if (previous <= 18.0f && next > 18.0f) { + switch (param_9) { + case 1: + mDoAud_seStart(Z2SE_NAVI_BLINK, NULL, 0, 0); + break; + case 2: + mDoAud_seStart(Z2SE_SY_ITEM_COMBINE_ICON, NULL, 0, 0); + break; + case 3: + if (i_framep == &field_0x738) { + mDoAud_seStart(Z2SE_SY_HINT_BUTTON_BLINK, NULL, 0, 0); + dMeter2Info_set2DVibration(); + } + break; + } + } +#else *i_framep += param_8; if (*i_framep > var_f31) { if (param_9 == 1 || param_9 == 2 || param_9 == 3) { @@ -1505,7 +1539,7 @@ void dMeter2Draw_c::drawPikari(f32 i_posX, f32 i_posY, f32* i_framep, f32 i_scal } else if (*i_framep == 18.0f && param_9 == 2) { mDoAud_seStart(Z2SE_SY_ITEM_COMBINE_ICON, NULL, 0, 0); } - IF_DUSK_BLOCK_END +#endif playPikariBckAnimation(*i_framep); playPikariBpkAnimation(*i_framep); @@ -1651,6 +1685,7 @@ void dMeter2Draw_c::drawLife(s16 i_maxLife, s16 i_life, f32 i_posX, f32 i_posY) } void dMeter2Draw_c::setAlphaLifeChange(bool param_0) { + IF_DUSK_BLOCK(!isExecuting()) bool var_r31 = false; bool var_r30 = false; bool var_r29 = false; @@ -1696,20 +1731,29 @@ void dMeter2Draw_c::setAlphaLifeChange(bool param_0) { if (var_r31 || var_r28 || param_0) { mpBigHeart->setAlphaRate(mBigHeartAlpha * mLifeParentAlpha); } + IF_DUSK_BLOCK_END } void dMeter2Draw_c::setAlphaLifeAnimeMin() { +#if TARGET_PC + write_fade_row(this, kFadeRowLife, false); +#else if (mpLifeParent->getAlphaRate() != 0.0f) { mpLifeParent->setAlphaRate(g_drawHIO.mParentAlpha); setAlphaAnimeMin(mpLifeParent, 5); } +#endif } void dMeter2Draw_c::setAlphaLifeAnimeMax() { +#if TARGET_PC + write_fade_row(this, kFadeRowLife, true); +#else if (mpLifeParent->getAlphaRate() != g_drawHIO.mParentAlpha) { mpLifeParent->setAlphaRate(g_drawHIO.mParentAlpha); setAlphaAnimeMax(mpLifeParent, 5); } +#endif } void dMeter2Draw_c::drawKanteraScreen(u8 i_meterType) { @@ -1835,7 +1879,7 @@ static f32 dummyLiteralOrder() { return 5.0f; } -void dMeter2Draw_c::drawKantera(s32 i_max, s32 i_oil, f32 i_posX, f32 i_posY) { +void dMeter2Draw_c::drawKantera(s32 i_max, DUSK_IF_ELSE(f32, s32) i_oil, f32 i_posX, f32 i_posY) { f32 var_f6 = mpMagicFrameR->getInitPosX() - mpMagicFrameL->getInitPosX(); f32 var_f7 = 0.0f; f32 var_f4 = 0.0f; @@ -1858,6 +1902,7 @@ void dMeter2Draw_c::drawKantera(s32 i_max, s32 i_oil, f32 i_posX, f32 i_posY) { } void dMeter2Draw_c::setAlphaKanteraChange(bool i_forceSet) { + IF_DUSK_BLOCK(!isExecuting()) bool meter_parent_alpha_set = false; bool meter_alpha_set = false; bool meter_frame_alpha_set = false; @@ -1885,9 +1930,13 @@ void dMeter2Draw_c::setAlphaKanteraChange(bool i_forceSet) { mpMagicFrameL->setAlphaRate(mLanternMeterFrameAlpha * field_0x7b0); mpMagicFrameR->setAlphaRate(mLanternMeterFrameAlpha * field_0x7b0); } + IF_DUSK_BLOCK_END } void dMeter2Draw_c::setAlphaKanteraAnimeMin() { +#if TARGET_PC + write_fade_row(this, kFadeRowKantera, false); +#else if (field_0x742[1] <= 0) { mMeterAlphaRate[1] = 0.0f; } else { @@ -1898,9 +1947,13 @@ void dMeter2Draw_c::setAlphaKanteraAnimeMin() { mMeterAlphaRate[1] = (field_0x742[1] / 5.0f) * g_drawHIO.mParentAlpha; } +#endif } void dMeter2Draw_c::setAlphaKanteraAnimeMax() { +#if TARGET_PC + write_fade_row(this, kFadeRowKantera, true); +#else if (field_0x742[1] >= 5) { mMeterAlphaRate[1] = g_drawHIO.mParentAlpha; } else { @@ -1911,9 +1964,10 @@ void dMeter2Draw_c::setAlphaKanteraAnimeMax() { mMeterAlphaRate[1] = (field_0x742[1] / 5.0f) * g_drawHIO.mParentAlpha; } +#endif } -void dMeter2Draw_c::drawOxygen(s32 i_max, s32 i_oxygen, f32 i_posX, f32 i_posY) { +void dMeter2Draw_c::drawOxygen(s32 i_max, DUSK_IF_ELSE(f32, s32) i_oxygen, f32 i_posX, f32 i_posY) { f32 var_f6 = mpMagicFrameR->getInitPosX() - mpMagicFrameL->getInitPosX(); f32 var_f7 = 0.0f; f32 var_f4 = 0.0f; @@ -1936,6 +1990,7 @@ void dMeter2Draw_c::drawOxygen(s32 i_max, s32 i_oxygen, f32 i_posX, f32 i_posY) } void dMeter2Draw_c::setAlphaOxygenChange(bool i_forceSet) { + IF_DUSK_BLOCK(!isExecuting()) bool meter_parent_alpha_set = false; bool meter_alpha_set = false; bool meter_frame_alpha_set = false; @@ -1963,9 +2018,13 @@ void dMeter2Draw_c::setAlphaOxygenChange(bool i_forceSet) { mpMagicFrameL->setAlphaRate(mOxygenMeterFrameAlpha * field_0x7bc); mpMagicFrameR->setAlphaRate(mOxygenMeterFrameAlpha * field_0x7bc); } + IF_DUSK_BLOCK_END } void dMeter2Draw_c::setAlphaOxygenAnimeMin() { +#if TARGET_PC + write_fade_row(this, kFadeRowOxygen, false); +#else if (field_0x742[2] <= 0) { mMeterAlphaRate[2] = 0.0f; } else { @@ -1976,9 +2035,13 @@ void dMeter2Draw_c::setAlphaOxygenAnimeMin() { mMeterAlphaRate[2] = (field_0x742[2] / 5.0f) * g_drawHIO.mParentAlpha; } +#endif } void dMeter2Draw_c::setAlphaOxygenAnimeMax() { +#if TARGET_PC + write_fade_row(this, kFadeRowOxygen, true); +#else if (field_0x742[2] >= 5) { mMeterAlphaRate[2] = g_drawHIO.mParentAlpha; } else { @@ -1989,6 +2052,7 @@ void dMeter2Draw_c::setAlphaOxygenAnimeMax() { mMeterAlphaRate[2] = (field_0x742[2] / 5.0f) * g_drawHIO.mParentAlpha; } +#endif } void dMeter2Draw_c::drawLightDrop(u8 i_num, u8 i_needNum, f32 i_posX, f32 i_posY, f32 i_vesselScale, @@ -2037,23 +2101,14 @@ void dMeter2Draw_c::drawLightDrop(u8 i_num, u8 i_needNum, f32 i_posX, f32 i_posY } } + IF_DUSK_BLOCK(!isExecuting()) field_0x6fc = param_5; mLightDropVesselScale = i_vesselScale; -#if TARGET_PC - const f32 lightDropUserScale = dGetUserHudScale(); - const f32 lightDropScale = mLightDropVesselScale * field_0x6f8 * lightDropUserScale; - mpLightDropParent->scale(lightDropScale, lightDropScale); - - f32 lightDropPosX = i_posX; - f32 lightDropPosY = i_posY; - dAnchorHudScale(mpLightDropParent, HudCorner::TopRight, &lightDropPosX, &lightDropPosY); - mpLightDropParent->paneTrans(lightDropPosX, lightDropPosY); -#else - mpLightDropParent->scale(mLightDropVesselScale * field_0x6f8, - mLightDropVesselScale * field_0x6f8); - + mpLightDropParent->scale(mLightDropVesselScale * field_0x6f8 IF_DUSK(* dGetUserHudScale()), + mLightDropVesselScale * field_0x6f8 IF_DUSK(* dGetUserHudScale())); + IF_DUSK(dAnchorHudScale(mpLightDropParent, HudCorner::TopRight, &i_posX, &i_posY)); mpLightDropParent->paneTrans(i_posX, i_posY); -#endif + IF_DUSK_BLOCK_END } void dMeter2Draw_c::setAlphaLightDropChange(bool unused) {} @@ -2075,6 +2130,9 @@ f32 dMeter2Draw_c::getNowLightDropRateCalc() { } void dMeter2Draw_c::setAlphaLightDropAnimeMin() { +#if TARGET_PC + showLightDrop(false); +#else if (mpLightDropParent->getAlphaRate() != 0.0f) { mpLightDropParent->setAlphaRate(g_drawHIO.mParentAlpha * field_0x6fc); setAlphaAnimeMin(mpLightDropParent, 5); @@ -2094,14 +2152,20 @@ void dMeter2Draw_c::setAlphaLightDropAnimeMin() { } } } +#endif } void dMeter2Draw_c::setAlphaLightDropAnimeMax() { +#if TARGET_PC + const bool dropGetPath = dMeter2Info_getLightDropGetFlag(dComIfGp_getStartStageDarkArea()) > 1 && + dMeter2Info_getLightDropGetFlag(dComIfGp_getStartStageDarkArea()) != 0xFF; + + showLightDrop(true, dropGetPath); +#else f32 temp_f31 = g_drawHIO.mParentAlpha * field_0x6fc; if (dMeter2Info_getLightDropGetFlag(dComIfGp_getStartStageDarkArea()) > 1 && - dMeter2Info_getLightDropGetFlag(dComIfGp_getStartStageDarkArea()) != 0xFF) - { + dMeter2Info_getLightDropGetFlag(dComIfGp_getStartStageDarkArea()) != 0xFF) { if (mpLightDropParent->getAlphaTimer() == 0) { Z2GetAudioMgr()->seStart(Z2SE_SY_LIGHT_POT_EQUIP, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); @@ -2126,13 +2190,8 @@ void dMeter2Draw_c::setAlphaLightDropAnimeMax() { field_0x6f8 = 1.0f; } -#if TARGET_PC - const f32 dropAnimScale = mLightDropVesselScale * field_0x6f8 * dGetUserHudScale(); - mpLightDropParent->scale(dropAnimScale, dropAnimScale); -#else mpLightDropParent->scale(mLightDropVesselScale * field_0x6f8, - mLightDropVesselScale * field_0x6f8); -#endif + mLightDropVesselScale * field_0x6f8); if (g_drawHIO.mLightDrop.mDropGetScaleAnimFrameNum == mpLightDropParent->getAlphaTimer()) { dMeter2Info_setLightDropGetFlag(dComIfGp_getStartStageDarkArea(), 0xFF); @@ -2164,6 +2223,7 @@ void dMeter2Draw_c::setAlphaLightDropAnimeMax() { mpSIParts[i][2]->setAlphaRate(mpSIParent[1]->getAlphaRate() * 0.3f); } } +#endif } void dMeter2Draw_c::drawRupee(s16 i_rupeeNum) { @@ -2238,6 +2298,7 @@ void dMeter2Draw_c::drawRupee(s16 i_rupeeNum) { } void dMeter2Draw_c::setAlphaRupeeChange(bool param_0) { + IF_DUSK_BLOCK(!isExecuting()) bool set_parent = false; bool set_rupeekey = false; bool set_rupee = false; @@ -2290,9 +2351,13 @@ void dMeter2Draw_c::setAlphaRupeeChange(bool param_0) { } } } + IF_DUSK_BLOCK_END } void dMeter2Draw_c::setAlphaRupeeAnimeMin() { +#if TARGET_PC + write_fade_row(this, kFadeRowRupee, false); +#else f32 alphas[3]; alphas[0] = g_drawHIO.mRupeeAlpha * (g_drawHIO.mParentAlpha * g_drawHIO.mRupeeKeyAlpha); alphas[1] = g_drawHIO.mRupeeFrameAlpha * (g_drawHIO.mParentAlpha * g_drawHIO.mRupeeKeyAlpha); @@ -2304,9 +2369,13 @@ void dMeter2Draw_c::setAlphaRupeeAnimeMin() { setAlphaAnimeMin(mpRupeeParent[i], 5); } } +#endif } void dMeter2Draw_c::setAlphaRupeeAnimeMax() { +#if TARGET_PC + write_fade_row(this, kFadeRowRupee, true); +#else f32 alphas[3]; alphas[0] = g_drawHIO.mRupeeAlpha * (g_drawHIO.mParentAlpha * g_drawHIO.mRupeeKeyAlpha); alphas[1] = g_drawHIO.mRupeeFrameAlpha * (g_drawHIO.mParentAlpha * g_drawHIO.mRupeeKeyAlpha); @@ -2318,6 +2387,7 @@ void dMeter2Draw_c::setAlphaRupeeAnimeMax() { setAlphaAnimeMax(mpRupeeParent[i], 5); } } +#endif } void dMeter2Draw_c::drawKey(s16 i_keyNum) { @@ -2352,6 +2422,7 @@ void dMeter2Draw_c::drawKey(s16 i_keyNum) { } void dMeter2Draw_c::setAlphaKeyChange(bool param_0) { + IF_DUSK_BLOCK(!isExecuting()) bool set_parent = false; bool set_rupeekey = false; bool set_key = false; @@ -2386,24 +2457,33 @@ void dMeter2Draw_c::setAlphaKeyChange(bool param_0) { mpKeyTexture[i]->setAlphaRate(field_0x7e0 * (field_0x7e4 * (mKeyNumAlpha * mKeyAlpha))); } } + IF_DUSK_BLOCK_END } void dMeter2Draw_c::setAlphaKeyAnimeMin() { +#if TARGET_PC + write_fade_row(this, kFadeRowKey, false); +#else f32 alpha = g_drawHIO.mKeyAlpha * (g_drawHIO.mParentAlpha * g_drawHIO.mRupeeKeyAlpha); if (mpKeyParent->getAlphaRate() != 0.0f) { mpKeyParent->setAlphaRate(alpha); setAlphaAnimeMin(mpKeyParent, 5); } +#endif } void dMeter2Draw_c::setAlphaKeyAnimeMax() { +#if TARGET_PC + write_fade_row(this, kFadeRowKey, true); +#else f32 alpha = g_drawHIO.mKeyAlpha * (g_drawHIO.mParentAlpha * g_drawHIO.mRupeeKeyAlpha); if (mpKeyParent->getAlphaRate() != alpha) { mpKeyParent->setAlphaRate(alpha); setAlphaAnimeMax(mpKeyParent, 5); } +#endif } void dMeter2Draw_c::drawButtonA(u8 i_action, f32 i_posX, f32 i_posY, f32 i_textPosX, f32 i_textPosY, @@ -2463,11 +2543,16 @@ void dMeter2Draw_c::drawButtonA(u8 i_action, f32 i_posX, f32 i_posY, f32 i_textP } } +#if TARGET_PC + s_button_a_scale = var_f31; + s_button_a_text_scale = var_f30; +#else mpButtonA->scale(var_f31 * i_scale, var_f31 * i_scale); mpButtonA->paneTrans(i_posX, i_posY); mpTextA->scale(var_f30 * i_scale, var_f30 * i_scale); mpTextA->paneTrans(g_drawHIO.mButtonATextPosX + i_textPosX, g_drawHIO.mButtonATextPosY + i_textPosY IF_DUSK(+ (dusk::version::isLessThanWiiJpn() ? 6.0f : 0.0f))); +#endif } void dMeter2Draw_c::drawButtonB(u8 i_action, bool param_1, f32 i_posX, f32 i_posY, f32 i_textPosX, @@ -2554,9 +2639,15 @@ void dMeter2Draw_c::drawButtonB(u8 i_action, bool param_1, f32 i_posX, f32 i_pos mpScreen->search(MULTI_CHAR('item_b_n'))->hide(); } +#if TARGET_PC + s_button_b_kind = var_r31; + s_button_b_scale = var_f31; + s_button_b_text_scale = var_f30; +#endif mpItemB->getPanePtr()->rotate(mpItemB->getSizeX() * 0.5f, mpItemB->getSizeY() * 0.5f, ROTATE_Z, g_drawHIO.mButtonBItemRotation[var_r31]); +#if !TARGET_PC field_0x730 = var_f31 * i_scale; mpButtonB->scale(field_0x730 * field_0x734, field_0x730 * field_0x734); mpButtonB->paneTrans(g_drawHIO.mButtonBPosX + i_posX, g_drawHIO.mButtonBPosY + i_posY); @@ -2573,6 +2664,7 @@ void dMeter2Draw_c::drawButtonB(u8 i_action, bool param_1, f32 i_posX, f32 i_pos mpTextB->scale(var_f30 * i_scale, var_f30 * i_scale); mpTextB->paneTrans(g_drawHIO.mButtonBFontPosX + i_textPosX, g_drawHIO.mButtonBFontPosY + i_textPosY); +#endif } void dMeter2Draw_c::drawButtonR(u8 unused0, u8 i_action, bool unused1, bool unused2) { @@ -2824,27 +2916,20 @@ f32 dMeter2Draw_c::getButtonCrossParentInitTransY() { } void dMeter2Draw_c::drawButtonCross(f32 i_posX, f32 i_posY) { -#if TARGET_PC - const f32 buttonCrossUserScale = dGetUserHudScale(); - const f32 buttonCrossScale = g_drawHIO.mButtonCrossScale * buttonCrossUserScale; - mpButtonCrossParent->scale(buttonCrossScale, buttonCrossScale); -#else - mpButtonCrossParent->scale(g_drawHIO.mButtonCrossScale, g_drawHIO.mButtonCrossScale); -#endif + IF_DUSK_BLOCK(!isExecuting()) + mpButtonCrossParent->scale(g_drawHIO.mButtonCrossScale IF_DUSK(* dGetUserHudScale()), + g_drawHIO.mButtonCrossScale IF_DUSK(* dGetUserHudScale())); mpTextI->scale(g_drawHIO.mButtonCrossTextScale, g_drawHIO.mButtonCrossTextScale); mpTextM->scale(g_drawHIO.mButtonCrossTextScale, g_drawHIO.mButtonCrossTextScale); - -#if TARGET_PC - f32 buttonCrossPosX = i_posX; - f32 buttonCrossPosY = i_posY; - dAnchorHudScale(mpButtonCrossParent, HudCorner::BottomLeft, &buttonCrossPosX, &buttonCrossPosY); - mpButtonCrossParent->paneTrans(buttonCrossPosX, buttonCrossPosY); -#else + IF_DUSK(dAnchorHudScale(mpButtonCrossParent, HudCorner::BottomLeft, &i_posX, &i_posY)); mpButtonCrossParent->paneTrans(i_posX, i_posY); -#endif + IF_DUSK_BLOCK_END } void dMeter2Draw_c::setAlphaButtonCrossAnimeMin() { +#if TARGET_PC + showCross(false); +#else if (mpButtonCrossParent->getAlphaRate() != 0.0f) { mpButtonCrossParent->setAlphaRate(g_drawHIO.mParentAlpha); setAlphaAnimeMin(mpButtonCrossParent, 5); @@ -2852,6 +2937,7 @@ void dMeter2Draw_c::setAlphaButtonCrossAnimeMin() { setAlphaButtonCrossItemAnimeMin(); setAlphaButtonCrossMapAnimeMin(); +#endif } void dMeter2Draw_c::setAlphaButtonCrossAnimeMax() { @@ -2930,6 +3016,7 @@ void dMeter2Draw_c::setAlphaButtonCrossMapAnimeMax() { } void dMeter2Draw_c::setAlphaButtonChange(bool param_0) { + IF_DUSK_BLOCK(!isExecuting()) bool set_parent = false; bool set_buttonA = false; bool set_buttonB = false; @@ -3125,9 +3212,13 @@ void dMeter2Draw_c::setAlphaButtonChange(bool param_0) { static_cast(mpXYText[4][1]->getPanePtr()) ->setFontColor(g_drawHIO.mButtonXYTextColor, g_drawHIO.mButtonXYTextColor); } + IF_DUSK_BLOCK_END } void dMeter2Draw_c::setAlphaButtonAnimeMin() { +#if TARGET_PC + write_fade_row(this, kFadeRowButtonParent, false); +#else if (mpButtonParent->getAlphaRate() != 0.0f) { mpButtonParent->setAlphaRate(g_drawHIO.mParentAlpha * g_drawHIO.mMainHUDButtonsAlpha); setAlphaAnimeMin(mpButtonParent, 5); @@ -3136,9 +3227,13 @@ void dMeter2Draw_c::setAlphaButtonAnimeMin() { mpUzu->setAlphaRate(mButtonBaseAlpha * mpButtonParent->getAlphaRate()); } } +#endif } void dMeter2Draw_c::setAlphaButtonAnimeMax() { +#if TARGET_PC + write_fade_row(this, kFadeRowButtonParent, true); +#else if (g_drawHIO.mParentAlpha * g_drawHIO.mMainHUDButtonsAlpha != mpButtonParent->getAlphaRate()) { mpButtonParent->setAlphaRate(g_drawHIO.mParentAlpha * g_drawHIO.mMainHUDButtonsAlpha); setAlphaAnimeMax(mpButtonParent, 5); @@ -3153,9 +3248,13 @@ void dMeter2Draw_c::setAlphaButtonAnimeMax() { dMeter2Info_setLightDropGetFlag(dComIfGp_getStartStageDarkArea(), 2); } } +#endif } void dMeter2Draw_c::setAlphaButtonAAnimeMin() { +#if TARGET_PC + write_fade_row(this, kFadeRowButtonA, false); +#else if (mpButtonA->getAlphaRate() != 0.0f) { mpButtonA->setAlphaRate(g_drawHIO.mButtonAAlpha * (g_drawHIO.mParentAlpha * g_drawHIO.mMainHUDButtonsAlpha)); @@ -3168,9 +3267,13 @@ void dMeter2Draw_c::setAlphaButtonAAnimeMin() { setAlphaAnimeMin(mpAText[i], 5); } } +#endif } void dMeter2Draw_c::setAlphaButtonAAnimeMax() { +#if TARGET_PC + write_fade_row(this, kFadeRowButtonA, true); +#else if (g_drawHIO.mButtonAAlpha * (g_drawHIO.mParentAlpha * g_drawHIO.mMainHUDButtonsAlpha) != mpButtonA->getAlphaRate()) { @@ -3185,9 +3288,13 @@ void dMeter2Draw_c::setAlphaButtonAAnimeMax() { setAlphaAnimeMax(mpAText[i], 5); } } +#endif } void dMeter2Draw_c::setAlphaButtonBAnimeMin() { +#if TARGET_PC + write_fade_row(this, kFadeRowButtonB, false); +#else if (mpButtonB->getAlphaRate() != 0.0f) { mpButtonB->setAlphaRate(g_drawHIO.mButtonBAlpha * (g_drawHIO.mParentAlpha * g_drawHIO.mMainHUDButtonsAlpha)); @@ -3209,9 +3316,13 @@ void dMeter2Draw_c::setAlphaButtonBAnimeMin() { setAlphaAnimeMin(mpBText[i], 5); } } +#endif } void dMeter2Draw_c::setAlphaButtonBAnimeMax() { +#if TARGET_PC + write_fade_row(this, kFadeRowButtonB, true); +#else if (mpButtonB->getAlphaRate() != g_drawHIO.mButtonBAlpha * (g_drawHIO.mParentAlpha * g_drawHIO.mMainHUDButtonsAlpha)) { @@ -3235,83 +3346,116 @@ void dMeter2Draw_c::setAlphaButtonBAnimeMax() { setAlphaAnimeMax(mpBText[i], 5); } } +#endif } void dMeter2Draw_c::setButtonIconAAlpha(u8 unused0, u32 unused1, bool unused2) { - if (mpButtonA->isVisible()) { - u8 alpha = g_drawHIO.mButtonAAlpha * - (g_drawHIO.mParentAlpha * g_drawHIO.mMainHUDButtonsAlpha) * - (f32)mpButtonA->getInitAlpha(); - f32 alpha_rate = mpButtonParent->getAlphaRate(); + if (DUSK_IF_ELSE(isExecuting() ? mpButtonA->isVisible() : s_follow_a.live, mpButtonA->isVisible())) { +#if TARGET_PC + if (isExecuting()) { + follow_button_a(true, !dMeter2Info_isUseButton(1) && !dComIfGp_isDoSetFlag(4), !dMeter2Info_isUseButton(1)); + } else +#endif + { + u8 alpha = g_drawHIO.mButtonAAlpha * + (g_drawHIO.mParentAlpha * g_drawHIO.mMainHUDButtonsAlpha) * + (f32)mpButtonA->getInitAlpha(); + f32 alpha_rate = DUSK_IF_ELSE(button_parent_rate(this), mpButtonParent->getAlphaRate()); - if (!dMeter2Info_isUseButton(1) && !dComIfGp_isDoSetFlag(4)) { - alpha = g_drawHIO.mButtonXYBaseDimAlpha; - } - - mpButtonA->setAlpha(alpha * alpha_rate); - - for (int i = 0; i < 5; i++) { - u8 alpha = mpAText[i]->getInitAlpha(); - if (!dMeter2Info_isUseButton(1)) { - alpha = (f32)alpha * ((f32)g_drawHIO.field_0x42c / 255.0f); + if (DUSK_IF_ELSE(s_follow_a.dim, !dMeter2Info_isUseButton(1) && !dComIfGp_isDoSetFlag(4))) { + alpha = g_drawHIO.mButtonXYBaseDimAlpha; } - mpAText[i]->setAlpha(alpha * alpha_rate); + mpButtonA->setAlpha(alpha * alpha_rate); + + for (int i = 0; i < 5; i++) { + u8 alpha = mpAText[i]->getInitAlpha(); + if (DUSK_IF_ELSE(s_follow_a.dim_txt, !dMeter2Info_isUseButton(1))) { + alpha = (f32)alpha * ((f32)g_drawHIO.field_0x42c / 255.0f); + } + + mpAText[i]->setAlpha(alpha * alpha_rate); + } } +#if TARGET_PC + } else { + if (isExecuting()) { + follow_button_a(false, false, false); + } +#endif } } void dMeter2Draw_c::setButtonIconBAlpha(u8 unused0, u32 unused1, bool param_2) { - if (mpItemB->isVisible() || mpLightB->isVisible() || mpButtonB->isVisible()) { - f32 temp_f30 = - g_drawHIO.mButtonBAlpha * (g_drawHIO.mParentAlpha * g_drawHIO.mMainHUDButtonsAlpha); + if (DUSK_IF_ELSE(isExecuting() ? (mpItemB->isVisible() || mpLightB->isVisible() || mpButtonB->isVisible()) + : s_follow_b.live, mpItemB->isVisible() || mpLightB->isVisible() || mpButtonB->isVisible())) + { +#if TARGET_PC + if (isExecuting()) { + follow_button_b(true, !(dMeter2Info_isUseButton(2) & 1) && !dMeter2Info_isSub2DStatus(1), !dMeter2Info_isUseButton(2) && !dMeter2Info_isSub2DStatus(1), param_2, mpItemB->isVisible()); + } else +#endif + { + f32 temp_f30 = + g_drawHIO.mButtonBAlpha * (g_drawHIO.mParentAlpha * g_drawHIO.mMainHUDButtonsAlpha); - f32 var_f2; - if (mpItemB->isVisible()) { - var_f2 = mItemBBaseAlpha[0]; - } else { - var_f2 = mItemBBaseAlpha[1]; - } - - u8 var_r25 = mpItemB->getInitAlpha(); - u8 var_r26 = var_f2 * (temp_f30 * (f32)mpLightB->getInitAlpha()); - u8 var_r27 = temp_f30 * (f32)mpButtonB->getInitAlpha(); - f32 temp_f31 = mpButtonParent->getAlphaRate(); - - if (!(dMeter2Info_isUseButton(2) & 1) && !dMeter2Info_isSub2DStatus(1)) { - var_r25 = g_drawHIO.mButtonXYItemDimAlpha; - var_r26 = g_drawHIO.mButtonXYItemDimAlpha; - var_r27 = g_drawHIO.mButtonXYBaseDimAlpha; - } - - if (!param_2) { - var_r26 = 0; - } - - mpItemB->setAlpha(var_r25 * temp_f31); - mpLightB->setAlpha(var_r26 * temp_f31); - mpButtonB->setAlpha(var_r27 * temp_f31); - - for (int i = 0; i < 5; i++) { - u8 alpha = mpBText[i]->getInitAlpha(); - if (!dMeter2Info_isUseButton(2) && !dMeter2Info_isSub2DStatus(1)) { - alpha = (f32)alpha * ((f32)g_drawHIO.field_0x42c / 255.0f); + f32 var_f2; + if (DUSK_IF_ELSE(s_follow_b.item_visible, mpItemB->isVisible())) { + var_f2 = mItemBBaseAlpha[0]; + } else { + var_f2 = mItemBBaseAlpha[1]; } - mpBText[i]->setAlpha(alpha * temp_f31); + u8 var_r25 = mpItemB->getInitAlpha(); + u8 var_r26 = var_f2 * (temp_f30 * (f32)mpLightB->getInitAlpha()); + u8 var_r27 = temp_f30 * (f32)mpButtonB->getInitAlpha(); + f32 temp_f31 = DUSK_IF_ELSE(button_parent_rate(this), mpButtonParent->getAlphaRate()); + + if (DUSK_IF_ELSE(s_follow_b.dim, !(dMeter2Info_isUseButton(2) & 1) && !dMeter2Info_isSub2DStatus(1))) { + var_r25 = g_drawHIO.mButtonXYItemDimAlpha; + var_r26 = g_drawHIO.mButtonXYItemDimAlpha; + var_r27 = g_drawHIO.mButtonXYBaseDimAlpha; + } + + if (!DUSK_IF_ELSE(s_follow_b.light_on, param_2)) { + var_r26 = 0; + } + + mpItemB->setAlpha(var_r25 * temp_f31); + mpLightB->setAlpha(var_r26 * temp_f31); + mpButtonB->setAlpha(var_r27 * temp_f31); + + for (int i = 0; i < 5; i++) { + u8 alpha = mpBText[i]->getInitAlpha(); + if (DUSK_IF_ELSE(s_follow_b.dim_txt, !dMeter2Info_isUseButton(2) && !dMeter2Info_isSub2DStatus(1))) { + alpha = (f32)alpha * ((f32)g_drawHIO.field_0x42c / 255.0f); + } + + mpBText[i]->setAlpha(alpha * temp_f31); + } } +#if TARGET_PC + } else { + if (isExecuting()) { + follow_button_b(false, false, false, false, false); + } +#endif } } void dMeter2Draw_c::setButtonIconMidonaAlpha(u32 param_0) { +#if TARGET_PC + bool midona_live = false; + bool midona_hold = false; + f32 midona_z_target = 0.0f; +#endif mpButtonMidona->scale(g_drawHIO.mMidnaIconScale, g_drawHIO.mMidnaIconScale); mpButtonMidona->paneTrans(g_drawHIO.mMidnaIconPosX, g_drawHIO.mMidnaIconPosY); if (mpButtonMidona->isVisible()) { - f32 temp_f30 = - g_drawHIO.mMidnaIconAlpha * (g_drawHIO.mParentAlpha * g_drawHIO.mMainHUDButtonsAlpha); + IF_NOT_DUSK(f32 temp_f30 = g_drawHIO.mMidnaIconAlpha * (g_drawHIO.mParentAlpha * g_drawHIO.mMainHUDButtonsAlpha)); f32 var_f29 = (f32)mpButtonMidona->getInitAlpha() / 255.0f; - f32 temp_f31 = mpButtonParent->getAlphaRate(); + f32 temp_f31 = DUSK_IF_ELSE(fade_row_factor(s_fade_rows[kFadeRowButtonParent]), mpButtonParent->getAlphaRate()); bool var_r31 = 1; if (getCanoeFishing() || @@ -3333,12 +3477,14 @@ void dMeter2Draw_c::setButtonIconMidonaAlpha(u32 param_0) { field_0x738 = 18.0f; } +#if !TARGET_PC if (field_0x738 == 18.0f) { mDoAud_seStart(Z2SE_SY_HINT_BUTTON_BLINK, NULL, 0, 0); dMeter2Info_set2DVibration(); } +#endif - mButtonZAlpha = var_f29; + IF_NOT_DUSK(mButtonZAlpha = var_f29); var_r31 = 0; } @@ -3347,6 +3493,7 @@ void dMeter2Draw_c::setButtonIconMidonaAlpha(u32 param_0) { field_0x738 = 0.0f; } +#if !TARGET_PC if (mButtonZAlpha != var_f29) { cLib_addCalc2(&mButtonZAlpha, var_f29, 0.4f, 0.5f); @@ -3354,24 +3501,34 @@ void dMeter2Draw_c::setButtonIconMidonaAlpha(u32 param_0) { mButtonZAlpha = var_f29; } } +#endif } +#if TARGET_PC + midona_live = true; + midona_hold = var_r31 == 0; + midona_z_target = var_f29; +#else mpButtonMidona->setAlpha(temp_f30 * (255.0f * mButtonZAlpha * temp_f31)); +#endif } else { - mButtonZAlpha = 0.0f; + IF_NOT_DUSK(mButtonZAlpha = 0.0f); } f32 var_f29_2 = (g_drawHIO.mButtonZAlpha * (g_drawHIO.mParentAlpha * g_drawHIO.mMainHUDButtonsAlpha) * (f32)mpButtonXY[2]->getInitAlpha()) / 255.0f; - f32 temp_f30_2 = mpButtonParent->getAlphaRate(); + IF_NOT_DUSK(f32 temp_f30_2 = mpButtonParent->getAlphaRate()); if (param_0 & 0x1000000) { var_f29_2 = 0.0f; } else if (!dMeter2Info_isUseButton(0x800)) { var_f29_2 = (f32)g_drawHIO.mButtonXYBaseDimAlpha / 255.0f; } +#if TARGET_PC + chase_midona(midona_live, midona_hold, midona_z_target, var_f29_2); +#else if (field_0x724 != var_f29_2) { cLib_addCalc2(&field_0x724, var_f29_2, 0.4f, 0.5f); @@ -3381,91 +3538,102 @@ void dMeter2Draw_c::setButtonIconMidonaAlpha(u32 param_0) { } mpButtonXY[2]->setAlpha(255.0f * field_0x724 * temp_f30_2); - -#if TARGET_PC - dusk::ui::update_midna_icon_texture(mpButtonMidona != NULL ? mpButtonMidona->getPanePtr() : NULL); #endif + + IF_DUSK(dusk::ui::update_midna_icon_texture(mpButtonMidona != NULL ? mpButtonMidona->getPanePtr() : NULL)); } void dMeter2Draw_c::setButtonIconAlpha(int i_no, u8 unused0, u32 unused1, bool unused2) { JUT_ASSERT(0, i_no < SELECT_MAX_e); - if (mpItemXY[i_no]->isVisible() || mpLightXY[i_no]->isVisible() || - mpButtonXY[i_no]->isVisible()) - { - f32 var_f30 = 1.0f; + if (DUSK_IF_ELSE(isExecuting() ? (mpItemXY[i_no]->isVisible() || mpLightXY[i_no]->isVisible() || mpButtonXY[i_no]->isVisible()) + : s_follow_xy[i_no].live, mpItemXY[i_no]->isVisible() || mpLightXY[i_no]->isVisible() || mpButtonXY[i_no]->isVisible())) { +#if TARGET_PC + if (isExecuting()) { + follow_button_xy(i_no, true, !dMeter2Info_isUseButton(i_no == 0 ? 4 : 8), getFishingType() != 0, mpItemXY[i_no]->isVisible()); + } else +#endif + { + f32 var_f30 = 1.0f; - int var_r26 = 1; - if (mpItemXY[i_no]->isVisible()) { - var_r26 = 0; - } + int var_r26 = 1; + if (DUSK_IF_ELSE(s_follow_xy[i_no].item_visible, mpItemXY[i_no]->isVisible())) { + var_r26 = 0; + } - f32 var_f2; - if (i_no == 0) { - var_f2 = - g_drawHIO.mButtonXAlpha * (g_drawHIO.mParentAlpha * g_drawHIO.mMainHUDButtonsAlpha); - var_f30 = g_drawHIO.mButtonXItemBaseAlpha[var_r26]; - } else if (i_no == 1) { - var_f2 = - g_drawHIO.mButtonYAlpha * (g_drawHIO.mParentAlpha * g_drawHIO.mMainHUDButtonsAlpha); - var_f30 = g_drawHIO.mButtonYItemBaseAlpha[var_r26]; - } else { - var_f2 = - g_drawHIO.mButtonZAlpha * (g_drawHIO.mParentAlpha * g_drawHIO.mMainHUDButtonsAlpha); - } + f32 var_f2; + if (i_no == 0) { + var_f2 = + g_drawHIO.mButtonXAlpha * (g_drawHIO.mParentAlpha * g_drawHIO.mMainHUDButtonsAlpha); + var_f30 = g_drawHIO.mButtonXItemBaseAlpha[var_r26]; + } else if (i_no == 1) { + var_f2 = + g_drawHIO.mButtonYAlpha * (g_drawHIO.mParentAlpha * g_drawHIO.mMainHUDButtonsAlpha); + var_f30 = g_drawHIO.mButtonYItemBaseAlpha[var_r26]; + } else { + var_f2 = + g_drawHIO.mButtonZAlpha * (g_drawHIO.mParentAlpha * g_drawHIO.mMainHUDButtonsAlpha); + } - u8 var_r28 = mpItemXY[i_no]->getInitAlpha(); - u8 var_r27 = var_f30 * (var_f2 * (f32)mpLightXY[i_no]->getInitAlpha()); - u8 var_r26_2 = var_f2 * (f32)mpButtonXY[i_no]->getInitAlpha(); - f32 temp_f31 = mpButtonParent->getAlphaRate(); + u8 var_r28 = mpItemXY[i_no]->getInitAlpha(); + u8 var_r27 = var_f30 * (var_f2 * (f32)mpLightXY[i_no]->getInitAlpha()); + u8 var_r26_2 = var_f2 * (f32)mpButtonXY[i_no]->getInitAlpha(); + f32 temp_f31 = DUSK_IF_ELSE(button_parent_rate(this), mpButtonParent->getAlphaRate()); - if (i_no == 0) { - if (!dMeter2Info_isUseButton(4)) { - if (getFishingType()) { - var_r28 = 0; - } else { - var_r28 = g_drawHIO.mButtonXYItemDimAlpha; + if (i_no == 0) { + if (DUSK_IF_ELSE(s_follow_xy[i_no].dim, !dMeter2Info_isUseButton(4))) { + if (DUSK_IF_ELSE(s_follow_xy[i_no].fishing, getFishingType())) { + var_r28 = 0; + } else { + var_r28 = g_drawHIO.mButtonXYItemDimAlpha; + } + + var_r27 = g_drawHIO.mButtonXYItemDimAlpha; + var_r26_2 = g_drawHIO.mButtonXYBaseDimAlpha; + } + } else if (i_no == 1) { + if (DUSK_IF_ELSE(s_follow_xy[i_no].dim, !dMeter2Info_isUseButton(8))) { + if (DUSK_IF_ELSE(s_follow_xy[i_no].fishing, getFishingType())) { + var_r28 = 0; + } else { + var_r28 = g_drawHIO.mButtonXYItemDimAlpha; + } + + var_r27 = g_drawHIO.mButtonXYItemDimAlpha; + var_r26_2 = g_drawHIO.mButtonXYBaseDimAlpha; + } + } + + mpItemXY[i_no]->setAlpha((f32)var_r28 * temp_f31); + mpLightXY[i_no]->setAlpha((f32)var_r27 * temp_f31); + mpButtonXY[i_no]->setAlpha((f32)var_r26_2 * temp_f31); + + int var_r26_3 = 1; + if (i_no == 0) { + if (DUSK_IF_ELSE(s_follow_xy[i_no].dim, !dMeter2Info_isUseButton(4))) { + var_r26_3 = 0; + } + } else if (i_no == 1) { + if (DUSK_IF_ELSE(s_follow_xy[i_no].dim, !dMeter2Info_isUseButton(8))) { + var_r26_3 = 0; + } + } + + for (int i = 0; i < 5; i++) { + u8 var_r0 = mpXYText[i][i_no]->getInitAlpha(); + if (!var_r26_3) { + var_r0 = (f32)var_r0 * (g_drawHIO.field_0x42c / 255.0f); } - var_r27 = g_drawHIO.mButtonXYItemDimAlpha; - var_r26_2 = g_drawHIO.mButtonXYBaseDimAlpha; - } - } else if (i_no == 1) { - if (!dMeter2Info_isUseButton(8)) { - if (getFishingType()) { - var_r28 = 0; - } else { - var_r28 = g_drawHIO.mButtonXYItemDimAlpha; - } - - var_r27 = g_drawHIO.mButtonXYItemDimAlpha; - var_r26_2 = g_drawHIO.mButtonXYBaseDimAlpha; + mpXYText[i][i_no]->setAlpha((f32)var_r0 * temp_f31); } } - - mpItemXY[i_no]->setAlpha((f32)var_r28 * temp_f31); - mpLightXY[i_no]->setAlpha((f32)var_r27 * temp_f31); - mpButtonXY[i_no]->setAlpha((f32)var_r26_2 * temp_f31); - - int var_r26_3 = 1; - if (i_no == 0) { - if (!dMeter2Info_isUseButton(4)) { - var_r26_3 = 0; - } - } else if (i_no == 1) { - if (!dMeter2Info_isUseButton(8)) { - var_r26_3 = 0; - } - } - - for (int i = 0; i < 5; i++) { - u8 var_r0 = mpXYText[i][i_no]->getInitAlpha(); - if (!var_r26_3) { - var_r0 = (f32)var_r0 * (g_drawHIO.field_0x42c / 255.0f); - } - - mpXYText[i][i_no]->setAlpha((f32)var_r0 * temp_f31); +#if TARGET_PC + } else { + if (isExecuting()) { + follow_button_xy(i_no, false, false, false, false); } +#endif } } @@ -3630,6 +3798,24 @@ void dMeter2Draw_c::changeTextureItemXY(int i_no, u8 i_itemNo) { } void dMeter2Draw_c::setAlphaAnimeMin(CPaneMgrAlpha* i_pane, s16 i_min) { +#if TARGET_PC + if (i_pane == NULL) { + return; + } + if (i_min <= 0) { + i_pane->alphaAnimeStart(0.0f); + i_pane->setAlphaRate(0.0f); + return; + } + const f32 alphaRate = i_pane->getAlphaRate(); + f32 alphaTimer = i_pane->getAlphaTimer(); + if (alphaTimer > i_min) { + alphaTimer = i_min; + } + dusk::vdt::advance_toward_frame(alphaTimer, 0.0f, 1.0f); + i_pane->alphaAnimeStart(alphaTimer); + i_pane->setAlphaRate(alphaRate * dusk::vdt::clamped_fraction(alphaTimer, i_min)); +#else f32 alpha_rate = i_pane->getAlphaRate(); s16 alpha_timer = i_pane->getAlphaTimer(); if (alpha_timer > i_min) { @@ -3649,9 +3835,23 @@ void dMeter2Draw_c::setAlphaAnimeMin(CPaneMgrAlpha* i_pane, s16 i_min) { i_pane->alphaAnimeStart(alpha_timer); i_pane->setAlphaRate(alpha_rate * ((f32)alpha_timer / (f32)i_min)); } +#endif } void dMeter2Draw_c::setAlphaAnimeMax(CPaneMgrAlpha* i_pane, s16 i_max) { +#if TARGET_PC + if (i_pane == NULL) { + return; + } + if (i_max <= 0) { + return; + } + const f32 alphaRate = i_pane->getAlphaRate(); + f32 alphaTimer = i_pane->getAlphaTimer(); + dusk::vdt::advance_toward_frame(alphaTimer, i_max, 1.0f); + i_pane->alphaAnimeStart(alphaTimer); + i_pane->setAlphaRate(alphaRate * dusk::vdt::clamped_fraction(alphaTimer, i_max)); +#else f32 alpha_rate = i_pane->getAlphaRate(); s16 alpha_timer = i_pane->getAlphaTimer(); @@ -3668,6 +3868,7 @@ void dMeter2Draw_c::setAlphaAnimeMax(CPaneMgrAlpha* i_pane, s16 i_max) { i_pane->alphaAnimeStart(alpha_timer); i_pane->setAlphaRate(alpha_rate * ((f32)alpha_timer / (f32)i_max)); } +#endif } void dMeter2Draw_c::setItemNum(u8 i_button, u8 i_num, u8 i_max) { @@ -3765,7 +3966,7 @@ void dMeter2Draw_c::drawKanteraMeter(u8 i_button, f32 i_alphaRate) { } u8 dMeter2Draw_c::isButtonVisible() { - return (mpButtonParent->getAlphaRate() == 0.0f) ^ 1; + return (DUSK_IF_ELSE(fade_row_factor(s_fade_rows[kFadeRowButtonParent]), mpButtonParent->getAlphaRate()) == 0.0f) ^ 1; } void dMeter2Draw_c::setItemParamX(u8 i_itemNo) { @@ -4191,7 +4392,7 @@ bool dMeter2Draw_c::isBButtonShow(bool param_0) { } s16 dMeter2Draw_c::getButtonTimer() { - return mpButtonParent->getAlphaTimer(); + return DUSK_IF_ELSE((s16)s_fade_rows[kFadeRowButtonParent].timer, mpButtonParent->getAlphaTimer()); } // unused diff --git a/src/d/d_meter2_draw_vdt.inc b/src/d/d_meter2_draw_vdt.inc new file mode 100644 index 0000000000..2e8bb1e8d1 --- /dev/null +++ b/src/d/d_meter2_draw_vdt.inc @@ -0,0 +1,581 @@ +#include "dusk/game_clock.h" +#include "dusk/interp/frame_interpolation.h" +#include "dusk/interp/user_interface.h" + +#include "d/d_com_inf_game.h" +#include "d/d_meter2_info.h" +#include "d/d_meter_HIO.h" +#include "d/d_meter_map.h" +#include "d/d_pane_class.h" + +namespace { + +struct FadeRow { + bool used; + bool show; + bool follow; + bool got_free; + bool got_follow; + f32 timer; + f32 duration; + f32 full; +}; + +struct FollowA { + bool live; + bool dim; + bool dim_txt; +}; + +struct FollowB { + bool live; + bool dim; + bool dim_txt; + bool light_on; + bool item_visible; +}; + +struct FollowXY { + bool live; + bool dim; + bool fishing; + bool item_visible; +}; + +struct MidonaChase { + bool used; + bool live; + bool hold; + f32 z_target; + f32 xy_target; +}; + +struct GaugeFill { + bool used; + s32 prev; + s32 now; + s32 max; +}; + +enum FadeRowId { + kFadeRowLife, + kFadeRowKantera, + kFadeRowOxygen, + kFadeRowLightDrop, + kFadeRowRupee, + kFadeRowKey, + kFadeRowButtonParent, + kFadeRowButtonA, + kFadeRowButtonB, + kFadeRowCross, + kFadeRowCrossItem, + kFadeRowCrossMap, + kFadeRowMap, + kFadeRowCount +}; + +FadeRow s_fade_rows[kFadeRowCount]; +FollowA s_follow_a; +FollowB s_follow_b; +FollowXY s_follow_xy[2]; +MidonaChase s_midona; +GaugeFill s_kantera_fill; +GaugeFill s_oxygen_fill; +bool s_light_drop_get; + +f32 fade_row_factor(FadeRow const& r) { + if (r.duration <= 0.0f) { + return r.show ? 1.0f : 0.0f; + } + return dusk::vdt::clamped_fraction(r.timer, r.duration); +} + +void publish_fade_row(FadeRow& c, bool show, f32 duration, f32 full) { + c.used = true; + c.duration = duration > 0.0f ? duration : 1.0f; + if (c.timer > c.duration) { + c.timer = c.duration; + } + c.full = full; + c.show = show; + c.got_free = true; +} + +void publish_follow_row(FadeRow& c) { + c.used = true; + c.got_follow = true; +} + +f32 button_parent_rate(dMeter2Draw_c* d) { + if (s_fade_rows[kFadeRowButtonParent].used) { + return s_fade_rows[kFadeRowButtonParent].full * fade_row_factor(s_fade_rows[kFadeRowButtonParent]); + } + if (d->mpButtonParent != NULL) { + return d->mpButtonParent->getAlphaRate(); + } + return 0.0f; +} + +void reset_follow_intent(FadeRow& r) { + r.got_free = false; + r.got_follow = false; +} + +void resolve_follow_row(FadeRow& r, FadeRow const& parent) { + if (r.got_follow) { + r.follow = true; + } else if (r.follow && r.got_free) { + r.follow = false; + r.timer = fade_row_factor(parent) * r.duration; + } +} + +void step_fade_row(FadeRow& c) { + if (c.used && !c.follow && (c.show ? c.timer < c.duration : c.timer > 0.0f)) { + dusk::vdt::advance_toward_frame(c.timer, c.show ? c.duration : 0.0f, 1.0f); + } +} + +f32 const kFadeDuration = 5.0f; + +f32 fade_full(dMeter2Draw_c* d, FadeRowId id) { + f32 const parent = g_drawHIO.mParentAlpha; + f32 const buttons = parent * g_drawHIO.mMainHUDButtonsAlpha; + f32 const rupee_key = parent * g_drawHIO.mRupeeKeyAlpha; + switch (id) { + case kFadeRowLife: + case kFadeRowKantera: + case kFadeRowOxygen: + case kFadeRowCross: + return parent; + case kFadeRowLightDrop: + return parent * d->field_0x6fc; + case kFadeRowRupee: + return g_drawHIO.mRupeeAlpha * rupee_key; + case kFadeRowKey: + return g_drawHIO.mKeyAlpha * rupee_key; + case kFadeRowButtonParent: + return buttons; + case kFadeRowButtonA: + return g_drawHIO.mButtonAAlpha * buttons; + case kFadeRowButtonB: + return g_drawHIO.mButtonBAlpha * buttons; + case kFadeRowCrossItem: + return parent * g_drawHIO.mButtonCrossITEMAlpha; + case kFadeRowCrossMap: + return parent * g_drawHIO.mButtonCrossMAPAlpha; + case kFadeRowMap: + return 1.0f; + default: + return 0.0f; + } +} + +void apply_parent_rate(CPaneMgrAlpha* pane, FadeRow const& row) { + if (!row.used || pane == NULL || pane->getPanePtr() == NULL) { + return; + } + const f32 rate = row.full * fade_row_factor(row); + if (pane->getAlphaRate() != rate) { + pane->setAlphaRate(rate); + } +} + +void apply_meter_rate(dMeter2Draw_c* d, int index, FadeRow const& row) { + if (!row.used) { + return; + } + d->mMeterAlphaRate[index] = row.full * fade_row_factor(row); +} + +void apply_cross_text(CPaneMgr* text, CPaneMgr** juji, FadeRow const& row) { + if (!row.used) { + return; + } + const f32 factor = fade_row_factor(row); + if (text != NULL) { + text->setAlphaRate(row.full * factor); + } + const f32 juji_rate = g_drawHIO.mParentAlpha * factor; + for (int i = 0; i < 5; i++) { + if (juji[i] != NULL) { + juji[i]->setAlphaRate(juji_rate); + } + } +} + +void apply_light_drop(dMeter2Draw_c* d) { + if (!s_fade_rows[kFadeRowLightDrop].used || d->mpLightDropParent == NULL) { + return; + } + + const f32 parent_rate = s_fade_rows[kFadeRowLightDrop].full * + fade_row_factor(s_fade_rows[kFadeRowLightDrop]); + if (d->mpLightDropParent->getAlphaRate() != parent_rate) { + d->mpLightDropParent->setAlphaRate(parent_rate); + } + + f32 si_parent_rate[2]; + for (int i = 0; i < 2; i++) { + si_parent_rate[i] = g_drawHIO.mLightDrop.mVesselAlpha[i + 2] * parent_rate; + if (d->mpSIParent[i] != NULL) { + d->mpSIParent[i]->setAlphaRate(si_parent_rate[i]); + } + } + + if (s_light_drop_get && s_fade_rows[kFadeRowLightDrop].show) { + if (g_drawHIO.mLightDrop.mDropGetScaleAnimFrameNum > 1) { + const f32 duration = g_drawHIO.mLightDrop.mDropGetScaleAnimFrameNum; + const f32 remainder = duration - s_fade_rows[kFadeRowLightDrop].timer; + const f32 scale = g_drawHIO.mLightDrop.mDropGetScale - 1.0f; + d->field_0x6f8 = 1.0f + (scale * remainder) / (duration - 1.0f); + } else { + d->field_0x6f8 = 1.0f; + } + } + + const int drop_num = dComIfGs_getLightDropNum(dComIfGp_getStartStageDarkArea()); + const f32 si1 = si_parent_rate[1]; + for (int i = 0; i < 16; i++) { + const f32 rate = i < drop_num ? si1 : si1 * 0.3f; + if (d->mpSIParts[i][1] != NULL) { + d->mpSIParts[i][1]->setAlphaRate(rate); + } + if (d->mpSIParts[i][2] != NULL) { + d->mpSIParts[i][2]->setAlphaRate(rate); + } + } +} + +void apply_rupee(dMeter2Draw_c* d) { + if (!s_fade_rows[kFadeRowRupee].used) { + return; + } + + const f32 factor = fade_row_factor(s_fade_rows[kFadeRowRupee]); + const f32 parent_rate[3] = { + s_fade_rows[kFadeRowRupee].full * factor, + g_drawHIO.mRupeeFrameAlpha * (g_drawHIO.mParentAlpha * g_drawHIO.mRupeeKeyAlpha) * factor, + g_drawHIO.mRupeeFrameAlpha * (g_drawHIO.mParentAlpha * g_drawHIO.mRupeeKeyAlpha) * factor, + }; + + for (int i = 0; i < 3; i++) { + if (d->mpRupeeParent[i] != NULL && d->mpRupeeParent[i]->getAlphaRate() != parent_rate[i]) { + d->mpRupeeParent[i]->setAlphaRate(parent_rate[i]); + } + } +} + +void apply_button_parent(dMeter2Draw_c* d) { + if (!s_fade_rows[kFadeRowButtonParent].used || d->mpButtonParent == NULL) { + return; + } + + apply_parent_rate(d->mpButtonParent, s_fade_rows[kFadeRowButtonParent]); + const f32 parent_rate = s_fade_rows[kFadeRowButtonParent].full * + fade_row_factor(s_fade_rows[kFadeRowButtonParent]); + if (d->mpUzu != NULL) { + d->mpUzu->setAlphaRate(d->mButtonBaseAlpha * parent_rate); + } +} + +void apply_button_a(dMeter2Draw_c* d) { + if (!s_fade_rows[kFadeRowButtonA].used || d->mpButtonA == NULL) { + return; + } + + if (s_fade_rows[kFadeRowButtonA].follow) { + d->setButtonIconAAlpha(0, 0, false); + return; + } + + const f32 factor = fade_row_factor(s_fade_rows[kFadeRowButtonA]); + d->mpButtonA->setAlphaRate(s_fade_rows[kFadeRowButtonA].full * factor); + const f32 text_rate = (g_drawHIO.mParentAlpha * g_drawHIO.mMainHUDButtonsAlpha) * factor; + for (int i = 0; i < 5; i++) { + if (d->mpAText[i] != NULL) { + d->mpAText[i]->setAlphaRate(text_rate); + } + } +} + +void apply_button_b(dMeter2Draw_c* d) { + if (!s_fade_rows[kFadeRowButtonB].used || d->mpButtonB == NULL) { + return; + } + + if (s_fade_rows[kFadeRowButtonB].follow) { + d->setButtonIconBAlpha(0, 0, false); + return; + } + + const f32 factor = fade_row_factor(s_fade_rows[kFadeRowButtonB]); + const f32 button_rate = s_fade_rows[kFadeRowButtonB].full * factor; + const f32 text_rate = (g_drawHIO.mParentAlpha * g_drawHIO.mMainHUDButtonsAlpha) * factor; + d->mpButtonB->setAlphaRate(button_rate); + if (d->mpLightB != NULL) { + d->mpLightB->setAlphaRate(button_rate); + } + if (d->mpItemB != NULL) { + d->mpItemB->setAlphaRate(text_rate); + } + for (int i = 0; i < 5; i++) { + if (d->mpBText[i] != NULL) { + d->mpBText[i]->setAlphaRate(text_rate); + } + } +} + +void advance_fade_rows() { + for (int i = 0; i < kFadeRowCount; i++) { + step_fade_row(s_fade_rows[i]); + } +} + +void write_fade_row(dMeter2Draw_c* d, FadeRowId id, bool show) { + if (id >= kFadeRowCount) { + return; + } + publish_fade_row(s_fade_rows[id], show, kFadeDuration, fade_full(d, id)); + if (id == kFadeRowButtonParent && show) { + if (fade_row_factor(s_fade_rows[kFadeRowButtonParent]) >= 1.0f) { + if (dMeter2Info_getLightDropGetFlag(dComIfGp_getStartStageDarkArea()) == 1) { + dMeter2Info_setLightDropGetFlag(dComIfGp_getStartStageDarkArea(), 2); + } + } + } +} + +void follow_button_a(bool live, bool dim, bool dim_txt) { + s_follow_a = {live, dim, dim_txt}; + if (live) { + publish_follow_row(s_fade_rows[kFadeRowButtonA]); + } +} + +void follow_button_b(bool live, bool dim, bool dim_txt, bool light_on, bool item_visible) { + s_follow_b = {live, dim, dim_txt, light_on, item_visible}; + if (live) { + publish_follow_row(s_fade_rows[kFadeRowButtonB]); + } +} + +void follow_button_xy(int i_no, bool live, bool dim, bool fishing, bool item_visible) { + if (i_no < 0 || i_no > 1) { + return; + } + s_follow_xy[i_no] = {live, dim, fishing, item_visible}; +} + +void chase_midona(bool live, bool hold, f32 z_target, f32 xy_target) { + s_midona = {true, live, hold, z_target, xy_target}; +} + +void seed_gauge(GaugeFill& g, s32 now) { + g.prev = now; +} + +void publish_gauge(GaugeFill& g, s32 now, s32 max) { + g.used = true; + g.now = now; + g.max = max; +} + +f32 gauge_draw(GaugeFill const& g) { + const f32 step = dusk::interp::get_interpolation_step(); + return (f32)g.prev + ((f32)g.now - (f32)g.prev) * step; +} +} // namespace + +f32 dMeter2Draw_c::getMeterGaugeAlphaRate(u8 i_no) { + if (i_no == 1) { + return fade_row_factor(s_fade_rows[kFadeRowKantera]) * g_drawHIO.mParentAlpha; + } + if (i_no == 2) { + return fade_row_factor(s_fade_rows[kFadeRowOxygen]) * g_drawHIO.mParentAlpha; + } + return mMeterAlphaRate[i_no]; +} + +void dMeter2Draw_c::beginExecution() { + mExecuting = true; + reset_follow_intent(s_fade_rows[kFadeRowButtonA]); + reset_follow_intent(s_fade_rows[kFadeRowButtonB]); + seed_gauge(s_kantera_fill, dComIfGp_getItemNowOil()); + seed_gauge(s_oxygen_fill, dComIfGp_getNowOxygen()); +} + +void dMeter2Draw_c::endExecution() { + resolve_follow_row(s_fade_rows[kFadeRowButtonA], s_fade_rows[kFadeRowButtonParent]); + resolve_follow_row(s_fade_rows[kFadeRowButtonB], s_fade_rows[kFadeRowButtonParent]); + mExecuting = false; +} + +void dMeter2Draw_c::publishKantera(s32 now, s32 max) { + publish_gauge(s_kantera_fill, now, max); +} + +void dMeter2Draw_c::publishOxygen(s32 now, s32 max) { + publish_gauge(s_oxygen_fill, now, max); +} + +void dMeter2Draw_c::present() { + apply_parent_rate(this->mpLifeParent, s_fade_rows[kFadeRowLife]); + if (s_fade_rows[kFadeRowLife].used) { + this->setAlphaLifeChange(false); + } + + apply_meter_rate(this, 1, s_fade_rows[kFadeRowKantera]); + if (s_fade_rows[kFadeRowKantera].used) { + this->setAlphaKanteraChange(true); + } + if (s_kantera_fill.used) { + drawKantera(s_kantera_fill.max, gauge_draw(s_kantera_fill), + g_drawHIO.mLanternMeterPosX, g_drawHIO.mLanternMeterPosY); + } + + apply_meter_rate(this, 2, s_fade_rows[kFadeRowOxygen]); + if (s_fade_rows[kFadeRowOxygen].used) { + this->setAlphaOxygenChange(false); + } + if (s_oxygen_fill.used) { + drawOxygen(s_oxygen_fill.max, gauge_draw(s_oxygen_fill), + g_drawHIO.mOxygenMeterPosX, g_drawHIO.mOxygenMeterPosY); + } + + apply_light_drop(this); + if (s_fade_rows[kFadeRowLightDrop].used) { + this->setAlphaLightDropChange(false); + } + + apply_rupee(this); + if (s_fade_rows[kFadeRowRupee].used) { + this->setAlphaRupeeChange(false); + } + + apply_parent_rate(this->mpKeyParent, s_fade_rows[kFadeRowKey]); + if (s_fade_rows[kFadeRowKey].used) { + this->setAlphaKeyChange(false); + } + + apply_button_parent(this); + apply_button_a(this); + apply_button_b(this); + setButtonIconAlpha(0, 0, 0, false); + setButtonIconAlpha(1, 0, 0, false); + if (s_fade_rows[kFadeRowButtonParent].used) { + this->setAlphaButtonChange(false); + } + + apply_parent_rate(this->mpButtonCrossParent, s_fade_rows[kFadeRowCross]); + apply_cross_text(this->mpTextI, this->mpJujiI, s_fade_rows[kFadeRowCrossItem]); + apply_cross_text(this->mpTextM, this->mpJujiM, s_fade_rows[kFadeRowCrossMap]); + + if (!s_midona.used || this->mpButtonMidona == NULL) { + return; + } + + const f32 parent_rate = button_parent_rate(this); + if (s_midona.live) { + if (s_midona.hold) { + this->mButtonZAlpha = s_midona.z_target; + } else { + dusk::vdt::present_addCalc2(&this->mButtonZAlpha, s_midona.z_target, 0.4f, 0.5f, 0.1f); + } + const f32 full = g_drawHIO.mMidnaIconAlpha * (g_drawHIO.mParentAlpha * g_drawHIO.mMainHUDButtonsAlpha); + this->mpButtonMidona->setAlpha((u8)(full * (255.0f * this->mButtonZAlpha * parent_rate))); + } else { + this->mButtonZAlpha = 0.0f; + } + dusk::vdt::present_addCalc2(&this->field_0x724, s_midona.xy_target, 0.4f, 0.5f, 0.1f); + this->mpButtonXY[2]->setAlpha((u8)(255.0f * this->field_0x724 * parent_rate)); +} + +void dMeter2Draw_c::presentVessel(f32 i_posX, f32 i_posY, f32 i_scale) { + mLightDropVesselScale = i_scale; + const f32 lightDropScale = mLightDropVesselScale * field_0x6f8 * dGetUserHudScale(); + mpLightDropParent->scale(lightDropScale, lightDropScale); + dAnchorHudScale(mpLightDropParent, HudCorner::TopRight, &i_posX, &i_posY); + mpLightDropParent->paneTrans(i_posX, i_posY); +} + +void dMeter2Draw_c::presentButtonA(f32 i_posX, f32 i_posY, f32 i_textPosX, f32 i_textPosY, f32 i_scale) { + mpButtonA->scale(s_button_a_scale * i_scale, s_button_a_scale * i_scale); + mpButtonA->paneTrans(i_posX, i_posY); + mpTextA->scale(s_button_a_text_scale * i_scale, s_button_a_text_scale * i_scale); + mpTextA->paneTrans(g_drawHIO.mButtonATextPosX + i_textPosX, + g_drawHIO.mButtonATextPosY + i_textPosY + (dusk::version::isLessThanWiiJpn() ? 6.0f : 0.0f)); +} + +void dMeter2Draw_c::presentButtonB(f32 i_posX, f32 i_posY, f32 i_textPosX, f32 i_textPosY, f32 i_scale) { + const int kind = s_button_b_kind; + field_0x730 = s_button_b_scale * i_scale; + mpButtonB->scale(field_0x730 * field_0x734, field_0x730 * field_0x734); + mpButtonB->paneTrans(g_drawHIO.mButtonBPosX + i_posX, g_drawHIO.mButtonBPosY + i_posY); + + field_0x728 = g_drawHIO.mButtonBItemScale[kind] * i_scale; + mpItemB->scale(field_0x728 * field_0x734, field_0x728 * field_0x734); + mpItemB->paneTrans(field_0x6dc + (g_drawHIO.mButtonBItemPosX[kind] + i_posX), field_0x6e0 + (g_drawHIO.mButtonBItemPosY[kind] + i_posY)); + + field_0x72c = g_drawHIO.mItemBBaseScale[0] * i_scale; + mpLightB->scale(field_0x72c * field_0x734, field_0x72c * field_0x734); + mpLightB->paneTrans(g_drawHIO.mItemBBasePosX[0] + i_posX, g_drawHIO.mItemBBasePosY[0] + i_posY); + + mpTextB->scale(s_button_b_text_scale * i_scale, s_button_b_text_scale * i_scale); + mpTextB->paneTrans(g_drawHIO.mButtonBFontPosX + i_textPosX, + g_drawHIO.mButtonBFontPosY + i_textPosY + (dusk::version::isLessThanWiiJpn() ? 4.0f : 0.0f)); +} + +void dMeter2Draw_c::presentMapAlpha(dMeterMap_c* map) { + if (map == NULL) { + return; + } + if (!s_fade_rows[kFadeRowMap].used) { + map->setMapAlpha(0); + return; + } + map->setMapAlpha((u8)(fade_row_factor(s_fade_rows[kFadeRowMap]) * 255.0f)); +} + +void dMeter2Draw_c::showLightDrop(bool show, bool get_path) { + if (show && get_path) { + if (s_fade_rows[kFadeRowLightDrop].timer <= 0.0f) { + Z2GetAudioMgr()->seStart(Z2SE_SY_LIGHT_POT_EQUIP, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); + } + if (fade_row_factor(s_fade_rows[kFadeRowLightDrop]) >= 1.0f) { + dMeter2Info_setLightDropGetFlag(dComIfGp_getStartStageDarkArea(), 0xFF); + } + } + const f32 duration = get_path ? (f32)g_drawHIO.mLightDrop.mDropGetScaleAnimFrameNum : kFadeDuration; + publish_fade_row(s_fade_rows[kFadeRowLightDrop], show, duration, fade_full(this, kFadeRowLightDrop)); + s_light_drop_get = get_path; +} + +void dMeter2Draw_c::showCross(bool show) { + write_fade_row(this, kFadeRowCross, show); + write_fade_row(this, kFadeRowCrossItem, show && dMeter2Info_isItemOpenCheck()); + write_fade_row(this, kFadeRowCrossMap, show && dMeter2Info_isMapOpenCheck()); +} + +void dMeter2Draw_c::showMap(bool show) { + write_fade_row(this, kFadeRowMap, show); +} + +bool dMeter2Draw_c::lightDropRowUsed() const { + return s_fade_rows[kFadeRowLightDrop].used; +} + +void dMeter2Draw_c::resetRows() { + mExecuting = false; + for (int i = 0; i < kFadeRowCount; i++) { + s_fade_rows[i] = FadeRow{}; + } + s_follow_a = FollowA{}; + s_follow_b = FollowB{}; + s_follow_xy[0] = FollowXY{}; + s_follow_xy[1] = FollowXY{}; + s_midona = MidonaChase{}; + s_kantera_fill = GaugeFill{}; + s_oxygen_fill = GaugeFill{}; + s_light_drop_get = false; +} diff --git a/src/d/d_meter2_vdt.inc b/src/d/d_meter2_vdt.inc new file mode 100644 index 0000000000..17f6452335 --- /dev/null +++ b/src/d/d_meter2_vdt.inc @@ -0,0 +1,40 @@ +#include "dusk/interp/user_interface.h" + +#include "d/d_meter_map.h" + +void dMeter2_c::presentAnims() { + if (mpMeterDraw != NULL) { + mpMeterDraw->present(); + + if (!mPresentationTargets.ready) { + return; + } + + if (mpMeterDraw->lightDropRowUsed()) { + dusk::vdt::present_addCalc2(&mVesselPosX, mPresentationTargets.vesselX, 1.0f, 10.0f, 0.1f); + dusk::vdt::present_addCalc2(&mVesselPosY, mPresentationTargets.vesselY, 1.0f, 10.0f, 0.1f); + dusk::vdt::present_addCalc2(&mVesselScale, mPresentationTargets.vesselScale, 0.2f, 1.0f, 0.1f); + dusk::vdt::present_addCalc2(&mVesselAlpha, mPresentationTargets.vesselAlpha, 0.2f, 1.0f, 0.1f); + mpMeterDraw->field_0x6fc = mVesselAlpha; + mpMeterDraw->presentVessel(mVesselPosX, mVesselPosY, mVesselScale); + } + + for (int i = 0; i < 2; i++) { + dusk::vdt::present_addCalc2(&mButtonATalkPosX[i], mPresentationTargets.buttonAX[i], 1.0f, 10.0f, 0.1f); + dusk::vdt::present_addCalc2(&mButtonATalkPosY[i], mPresentationTargets.buttonAY[i], 1.0f, 10.0f, 0.1f); + dusk::vdt::present_addCalc2(&field_0x148[i], mPresentationTargets.buttonBX[i], 1.0f, 10.0f, 0.1f); + dusk::vdt::present_addCalc2(&field_0x150[i], mPresentationTargets.buttonBY[i], 1.0f, 10.0f, 0.1f); + } + dusk::vdt::present_addCalc2(&field_0x15c, mPresentationTargets.crossY, 0.5f, 50.0f, 0.5f); + mpMeterDraw->presentButtonA(mButtonATalkPosX[0], mButtonATalkPosY[0], mButtonATalkPosX[1], mButtonATalkPosY[1], 1.0f); + mpMeterDraw->presentButtonB(field_0x148[0], field_0x150[0], field_0x148[1], field_0x150[1], 1.0f); + mpMeterDraw->drawButtonCross(mPresentationTargets.crossX, field_0x15c); + } +} + +void dMeter2_c::presentMap() { + if (mpMeterDraw == NULL || mpMap == NULL) { + return; + } + mpMeterDraw->presentMapAlpha(mpMap); +} diff --git a/src/d/d_meter_map.cpp b/src/d/d_meter_map.cpp index 110d35b3cb..e5fef0783e 100644 --- a/src/d/d_meter_map.cpp +++ b/src/d/d_meter_map.cpp @@ -20,9 +20,12 @@ #if TARGET_PC #include "dusk/action_bindings.h" +#include "dusk/game_clock.h" #include "dusk/interp/user_interface.h" #include "dusk/settings.h" +#include "d/d_meter2.h" + #include "JSystem/JUtility/JUTPalette.h" #include @@ -633,6 +636,13 @@ void dMeterMap_c::_draw() { } void dMeterMap_c::draw() { +#if TARGET_PC + if (dusk::game_clock::is_presentation_frame()) { + if (dMeter2_c* meter = dMeter2Info_getMeterClass()) { + meter->presentMap(); + } + } +#endif if ( #if DEBUG !g_meter_mapHIO.mMapDisplayProhibited &&