diff --git a/include/d/d_file_sel_warning.h b/include/d/d_file_sel_warning.h index c8740b5f74..b4a3790688 100644 --- a/include/d/d_file_sel_warning.h +++ b/include/d/d_file_sel_warning.h @@ -35,6 +35,9 @@ public: void drawSelf(); void setText(u32); void setFontColor(JUtility::TColor, JUtility::TColor); +#if TARGET_PC + void presentAnims(); +#endif virtual ~dFile_warning_c(); @@ -47,7 +50,7 @@ public: /* 0x1C */ CPaneMgr* mpRootPane; /* 0x20 */ J2DTextBox* field_0x20; /* 0x24 */ J2DAnmTransform* field_0x24; - /* 0x28 */ int field_0x28; + /* 0x28 */ DUSK_IF_ELSE(f32, int) field_0x28; /* 0x2C */ int field_0x2c; /* 0x30 */ u8 field_0x30[4]; /* 0x34 */ f32 field_0x34; diff --git a/include/d/d_file_select.h b/include/d/d_file_select.h index dd4d5a3aae..c68f68db5d 100644 --- a/include/d/d_file_select.h +++ b/include/d/d_file_select.h @@ -385,7 +385,7 @@ public: void menuCursorShow(); void yesnoWakuAlpahAnmInit(u8, u8, u8, u8); bool yesnoWakuAlpahAnm(u8); - #if TARGET_PC +#if TARGET_PC void fileSelectWide(); bool pointerDataSelect(); bool pointerMenuSelect(); @@ -398,7 +398,10 @@ public: modoruTxtDispAnmInit(0); mDataSelProc = DATASELPROC_NAME_TO_DATA_SELECT_MOVE; } - #endif + void presentLayoutAnims(); + void presentAnims(); + void presentNameInputFade(); +#endif void _draw(); void errorMoveAnmInitSet(int, int); bool errorMoveAnm(); @@ -523,7 +526,7 @@ public: /* 0x00A0 */ s32 field_0x00a0; /* 0x00A4 */ CPaneMgr* mBaseMovePane; /* 0x00A8 */ u8 field_0x00a8[0xb0-0xa8]; - /* 0x00B0 */ s32 mBaseMoveAnmFrame; + /* 0x00B0 */ DUSK_IF_ELSE(f32, s32) mBaseMoveAnmFrame; /* 0x00B4 */ s32 mBaseMoveAnmFrameMax; /* 0x00B8 */ u8 field_0x00b8; /* 0x00B9 */ u8 field_0x00b9; @@ -532,26 +535,26 @@ public: /* 0x00BC */ CPaneMgr* mSelFilePanes[3]; /* 0x00C8 */ f32 field_0x00c8[3]; /* 0x00D4 */ f32 field_0x00d4[3]; - /* 0x00E0 */ s32 field_0x00e0[3]; + /* 0x00E0 */ DUSK_IF_ELSE(f32, s32) field_0x00e0[3]; /* 0x00EC */ s32 field_0x00ec; /* 0x00F0 */ CPaneMgr* mYnSelPane[2]; - /* 0x00F8 */ s32 field_0x00f8[2]; - /* 0x0100 */ s32 field_0x0100; + /* 0x00F8 */ DUSK_IF_ELSE(f32, s32) field_0x00f8[2]; + /* 0x0100 */ DUSK_IF_ELSE(f32, s32) field_0x0100; /* 0x0104 */ s32 field_0x0104; /* 0x0108 */ bool field_0x0108; /* 0x0109 */ bool field_0x0109; /* 0x010A */ u8 field_0x10a[2]; /* 0x010C */ J2DPane* mBaseSubPane; - /* 0x0110 */ int field_0x0110; + /* 0x0110 */ DUSK_IF_ELSE(f32, int) field_0x0110; /* 0x0114 */ int field_0x0114; /* 0x0118 */ J2DPane* m3mMenuPane; /* 0x011C */ J2DPane* mNameBasePane; - /* 0x0120 */ int field_0x0120; + /* 0x0120 */ DUSK_IF_ELSE(f32, int) field_0x0120; /* 0x0124 */ int field_0x0124; /* 0x0128 */ bool field_0x0128; /* 0x0129 */ u8 field_0x0129[0x012C - 0x0129]; /* 0x012C */ J2DPane* mErrorMsgPane; - /* 0x0130 */ int field_0x0130; + /* 0x0130 */ DUSK_IF_ELSE(f32, int) field_0x0130; /* 0x0134 */ int field_0x0134; /* 0x0138 */ CPaneMgrAlpha* mErrorMsgTxtPane[2]; /* 0x0140 */ TEXT_SPAN mErrorMsgStringPtr[2]; @@ -578,24 +581,24 @@ public: /* 0x01BE */ u8 field_0x01be[2]; /* 0x01C0 */ CPaneMgr* mYnSelTxtPane[2]; /* 0x01C8 */ J2DAnmColor* mFileSelBpk; - /* 0x01CC */ s32 mSelFileBpkFrame; + /* 0x01CC */ DUSK_IF_ELSE(f32, s32) mSelFileBpkFrame; /* 0x01D0 */ J2DAnmTextureSRTKey* mFileSel05Btk; - /* 0x01D4 */ s32 mSelFileBtk05Frame; + /* 0x01D4 */ DUSK_IF_ELSE(f32, s32) mSelFileBtk05Frame; /* 0x01D8 */ J2DAnmColor* mSelFileBookBpk; - /* 0x01DC */ s32 mSelFileBookBpkFrame; + /* 0x01DC */ DUSK_IF_ELSE(f32, s32) mSelFileBookBpkFrame; /* 0x01E0 */ J2DAnmTextureSRTKey* mSelFileBookBtk; - /* 0x01E4 */ s32 mSelFileBookBtkFrame; + /* 0x01E4 */ DUSK_IF_ELSE(f32, s32) mSelFileBookBtkFrame; /* 0x01E8 */ J2DAnmTevRegKey* mSelFileBookBrk; - /* 0x01EC */ s32 mSelFileBookBrkFrame; + /* 0x01EC */ DUSK_IF_ELSE(f32, s32) mSelFileBookBrkFrame; /* 0x01F0 */ J2DAnmTextureSRTKey* mDtEffBtk; - /* 0x01F4 */ s32 mDtEffBtkFrame; + /* 0x01F4 */ DUSK_IF_ELSE(f32, s32) mDtEffBtkFrame; /* 0x01F8 */ J2DAnmTextureSRTKey* mCpEffBtk; - /* 0x01FC */ s32 mCpEffBtkFrame; + /* 0x01FC */ DUSK_IF_ELSE(f32, s32) mCpEffBtkFrame; /* 0x0200 */ J2DAnmTevRegKey* mCpDtEffBrk; - /* 0x0204 */ s32 mCpDtEffBrkFrame; + /* 0x0204 */ DUSK_IF_ELSE(f32, s32) mCpDtEffBrkFrame; /* 0x0208 */ u8 field_0x0208; /* 0x0209 */ u8 field_0x0209; - /* 0x020A */ u8 mFadeTimer; + /* 0x020A */ DUSK_IF_ELSE(f32, u8) mFadeTimer; /* 0x020B */ u8 field_0x020b; /* 0x020C */ CPaneMgrAlpha* mHeaderTxtPane[2]; /* 0x0214 */ TEXT_SPAN mHeaderStringPtr[2]; @@ -648,7 +651,7 @@ public: /* 0x02A0 */ J2DAnmTransform* mCpSelBck2; /* 0x02A4 */ CPaneMgr* mCpSelPane[3]; /* 0x02B0 */ u8 field_0x02b0[0x2b4-0x2b0]; - /* 0x02B4 */ int field_0x02b4[3]; + /* 0x02B4 */ DUSK_IF_ELSE(f32, int) field_0x02b4[3]; /* 0x02C0 */ CPaneMgr* mCpSelPane_moyo[2]; /* 0x02C8 */ CPaneMgr* mCpSelPane_gold[2]; /* 0x02D0 */ CPaneMgr* mCpSelPane_gold2[2]; @@ -658,30 +661,30 @@ public: /* 0x02E4 */ u8 field_0x02e4[2]; /* 0x02E4 */ u8 field_0x02e6[0x2e8-0x2e6]; /* 0x02E8 */ J2DAnmColor* mCpSelBpk; - /* 0x02EC */ s32 mCpSelBpkFrame; + /* 0x02EC */ DUSK_IF_ELSE(f32, s32) mCpSelBpkFrame; /* 0x02F0 */ J2DAnmTextureSRTKey* mCpSel03Btk; - /* 0x02F4 */ s32 mCpSel03BtkFrame; + /* 0x02F4 */ DUSK_IF_ELSE(f32, s32) mCpSel03BtkFrame; /* 0x02F8 */ J2DAnmColor* mCpSelBookBpk; - /* 0x02FC */ s32 mCpSelBookBpkFrame; + /* 0x02FC */ DUSK_IF_ELSE(f32, s32) mCpSelBookBpkFrame; /* 0x0300 */ J2DAnmTextureSRTKey* mCpSelBookBtk; - /* 0x0304 */ s32 mCpSelBookBtkFrame; + /* 0x0304 */ DUSK_IF_ELSE(f32, s32) mCpSelBookBtkFrame; /* 0x0308 */ J2DAnmTevRegKey* mCpSelBookBrk; - /* 0x030C */ s32 mCpSelBookBrkFrame; + /* 0x030C */ DUSK_IF_ELSE(f32, s32) mCpSelBookBrkFrame; /* 0x0310 */ J2DAnmTransform* mYnSelBck; /* 0x0314 */ J2DAnmTransform* mYnSelBck2; /* 0x0318 */ J2DAnmColor* mYnSelBpk; - /* 0x031C */ s32 mYnSelBpkFrame; + /* 0x031C */ DUSK_IF_ELSE(f32, s32) mYnSelBpkFrame; /* 0x0320 */ J2DAnmTextureSRTKey* mYnSelBtk; - /* 0x0324 */ s32 mYnSelBtkFrame; + /* 0x0324 */ DUSK_IF_ELSE(f32, s32) mYnSelBtkFrame; /* 0x0328 */ J2DAnmTransform* m3mBck; /* 0x032C */ J2DAnmTransform* m3mBck2; /* 0x0330 */ J2DAnmColor* m3mBpk; - /* 0x0334 */ s32 m3mBpkFrame; + /* 0x0334 */ DUSK_IF_ELSE(f32, s32) m3mBpkFrame; /* 0x0338 */ J2DAnmTextureSRTKey* m3mBtk; - /* 0x033C */ s32 m3mBtkFrame; + /* 0x033C */ DUSK_IF_ELSE(f32, s32) m3mBtkFrame; /* 0x0340 */ CPaneMgr* m3mSelPane[3]; - /* 0x034C */ s32 field_0x034c[3]; - /* 0x0358 */ int field_0x0358; + /* 0x034C */ DUSK_IF_ELSE(f32, s32) field_0x034c[3]; + /* 0x0358 */ DUSK_IF_ELSE(f32, int) field_0x0358; /* 0x035C */ int field_0x035c; /* 0x0360 */ bool field_0x0360; /* 0x0361 */ u8 field_0x0361[3]; @@ -694,7 +697,7 @@ public: /* 0x0390 */ u8 field_0x0391[3]; /* 0x0394 */ CPaneMgr* m3mSelTextPane[3]; /* 0x03A0 */ J2DAnmTextureSRTKey* mSelDtBtk; - /* 0x03A4 */ s32 mSelDtBtkFrame; + /* 0x03A4 */ DUSK_IF_ELSE(f32, s32) mSelDtBtkFrame; /* 0x03A8 */ CPaneMgr* mSelDtPane_mset; /* 0x03AC */ s16 mWaitTimer; /* 0x03AE */ u8 field_0x03AE[0x03B0 - 0x03AE]; @@ -720,6 +723,7 @@ public: dDlst_FileSelFade_c mFadeDlst; bool mGameModeSaveStartBuildUi = true; GameModeNewSaveState mGameModeNewSaveState = GAME_MODE_STATE_PENDING; + bool mNameMoveRequested = false; #endif }; diff --git a/include/d/d_menu_collect.h b/include/d/d_menu_collect.h index d2a4028b2e..0a7dcbf0d3 100644 --- a/include/d/d_menu_collect.h +++ b/include/d/d_menu_collect.h @@ -194,6 +194,9 @@ public: /* 0x25F */ u8 field_0x25f; /* 0x260 */ u8 field_0x260; /* 0x261 */ u8 field_0x261; +#if TARGET_PC + f32 mBackAlpha = 0.0f; +#endif }; class dMenu_Collect3D_c { diff --git a/include/d/d_menu_dmap.h b/include/d/d_menu_dmap.h index 039b42aab2..7af8c750bd 100644 --- a/include/d/d_menu_dmap.h +++ b/include/d/d_menu_dmap.h @@ -91,10 +91,6 @@ public: void calcCursor(); void drawCursor(); - #if TARGET_PC - void dMapBgWide(); - #endif - void setDPDFloorSelCurPos(s8 i_pos) { field_0xdd6 = i_pos; } f32 getMapWidth() { return mMapWidth; } @@ -108,7 +104,7 @@ public: } #if TARGET_PC - void resetScrollArrowMask() { field_0xdda = 0; } + void dMapBgWide(); #endif /* 0xC98 */ JKRExpHeap* mpHeap; @@ -174,16 +170,15 @@ public: /* 0xDCC */ f32 field_0xdcc; /* 0xDD0 */ u8 field_0xdd0; /* 0xDD1 */ u8 field_0xdd1; - /* 0xDD2 */ u8 field_0xdd2; + /* 0xDD2 */ DUSK_IF_ELSE(f32, u8) field_0xdd2; /* 0xDD3 */ u8 field_0xdd3; /* 0xDD4 */ s8 field_0xdd4; /* 0xDD5 */ u8 field_0xdd5; /* 0xDD6 */ s8 field_0xdd6; - /* 0xDD7 */ u8 field_0xdd7; + /* 0xDD7 */ DUSK_IF_ELSE(f32, u8) field_0xdd7; /* 0xDD8 */ u8 field_0xdd8; /* 0xDD9 */ u8 field_0xdd9; /* 0xDDA */ u8 field_0xdda; - #if TARGET_PC J2DTextBox* mpPoeCountPane; J2DPicture* mpPoeCountIcon; @@ -210,6 +205,11 @@ public: void mapControl(); bool isOpen(); bool isClose(); +#if TARGET_PC + void presentAnims(); + void presentLayoutAnims(); + void presentMapView(); +#endif void _draw(); void itemInfo_init_proc(); void itemInfo_proc(); diff --git a/include/d/d_menu_dmap_map.h b/include/d/d_menu_dmap_map.h index 3f3eb37a0f..6b16730360 100644 --- a/include/d/d_menu_dmap_map.h +++ b/include/d/d_menu_dmap_map.h @@ -191,10 +191,10 @@ public: /* 0xEE */ s8 field_0xee; /* 0xEF */ u8 field_0xef; /* 0xF0 */ u8 field_0xf0; - /* 0xF1 */ u8 field_0xf1; - /* 0xF2 */ u8 field_0xf2; - /* 0xF3 */ u8 field_0xf3; - /* 0xF4 */ s8 field_0xf4; + /* 0xF1 */ DUSK_IF_ELSE(f32, u8) field_0xf1; + /* 0xF2 */ DUSK_IF_ELSE(f32, u8) field_0xf2; + /* 0xF3 */ DUSK_IF_ELSE(f32, u8) field_0xf3; + /* 0xF4 */ DUSK_IF_ELSE(f32, s8) field_0xf4; /* 0xF5 */ u8 field_0xf5; /* 0xF6 */ u8 field_0xf6; /* 0xF7 */ s8 field_0xf7; diff --git a/include/d/d_menu_fmap.h b/include/d/d_menu_fmap.h index 3104d7e76b..81a735da33 100644 --- a/include/d/d_menu_fmap.h +++ b/include/d/d_menu_fmap.h @@ -112,12 +112,17 @@ public: class dMenu_Fmap_c { public: typedef void (dMenu_Fmap_c::*process)(); - + dMenu_Fmap_c(JKRExpHeap*, STControl*, CSTControl*, u8, u8, u8, f32, f32, u8); void _create(); void _delete(); void _move(); void _draw(); +#if TARGET_PC + void presentAnims(); + void presentZoomView(); + f32 getRenderZoomLevel() const; +#endif u8 getNextStatus(u8*); bool isSync(); void all_map_init(); @@ -266,7 +271,7 @@ public: /* 0x1B */ PROC_HOWL_DEMO1, /* 0x1C */ PROC_HOWL_DEMO2, /* 0x1D */ PROC_HOWL_DEMO3, - }; + }; static DUSK_GAME_DATA dMenu_Fmap_c* MyClass; diff --git a/include/d/d_menu_fmap2D.h b/include/d/d_menu_fmap2D.h index 3c37c3da74..be638899bd 100644 --- a/include/d/d_menu_fmap2D.h +++ b/include/d/d_menu_fmap2D.h @@ -156,9 +156,6 @@ public: void setRegionCursor(u8 i_value) { mRegionCursor = i_value; } void setMapDrawFlag(bool i_flag) { mMapDrawFlag = i_flag; } void resetDrug() { field_0x1238 = 0; } -#if TARGET_PC - void resetScrollArrowMask() { field_0x122d = 0; } -#endif void offArrowDrawFlag() { mArrowDrawFlag = false; } void onArrowDrawFlag() { mArrowDrawFlag = true; } @@ -288,8 +285,8 @@ public: /* 0x120C */ JUtility::TColor field_0x120c; /* 0x1210 */ float field_0x1210; /* 0x1214 */ float field_0x1214; - /* 0x1218 */ s16 field_0x1218; - /* 0x121A */ s16 field_0x121a; + /* 0x1218 */ DUSK_IF_ELSE(f32, s16) field_0x1218; + /* 0x121A */ DUSK_IF_ELSE(f32, s16) field_0x121a; /* 0x121C */ u8 mRegionTextureReadNum[8]; /* 0x1224 */ u8 mSpotNum; /* 0x1225 */ u8 mStageDataNum; diff --git a/include/d/d_menu_fmap_map.h b/include/d/d_menu_fmap_map.h index b0d1063d18..b92cceec76 100644 --- a/include/d/d_menu_fmap_map.h +++ b/include/d/d_menu_fmap_map.h @@ -172,6 +172,10 @@ public: ~dMenu_FmapMap_c(); void _create(u16, u16, u16, u16, void*); void _delete(); +#if TARGET_PC + void presentAnims(); + void presentRendering(dMenu_Fmap_world_data_c*, int, f32, f32, f32, f32); +#endif void draw(); void rendering(line_class const*); int getLineWidth(int); @@ -224,9 +228,15 @@ public: /* 0xDC */ int mStageCursor; /* 0xE0 */ int mLastStageCursor; /* 0xE4 */ u8 mRegionCursor; - /* 0xE5 */ u8 mFlashTimer; + /* 0xE5 */ DUSK_IF_ELSE(f32, u8) mFlashTimer; /* 0xE8 */ u8* mp_roomList; /* 0xEC */ int m_roomListNumber; +#if TARGET_PC + f32 mFlashFrame = 0.0f; + f32 mPaletteFrame[2] = {}; + bool mResetFlashFrame = true; + bool mPaletteFrameInitialized = false; +#endif static dMenu_FmapMap_c* mMySelfPointer; }; diff --git a/include/d/d_menu_letter.h b/include/d/d_menu_letter.h index 8e112f04d2..f714205853 100644 --- a/include/d/d_menu_letter.h +++ b/include/d/d_menu_letter.h @@ -57,6 +57,7 @@ public: #if TARGET_PC bool pointerWait(); + void presentAnims(); #endif virtual void draw() { _draw(); } @@ -109,7 +110,7 @@ public: /* 0x360 */ f32 field_0x360; /* 0x364 */ f32 field_0x364; /* 0x368 */ s16 field_0x368; - /* 0x36A */ s16 field_0x36a; + /* 0x36A */ DUSK_IF_ELSE(f32, s16) field_0x36a; /* 0x36C */ u8 mStatus; /* 0x36D */ u8 mProcess; /* 0x36E */ u8 mIndex; diff --git a/include/d/d_menu_map_common.h b/include/d/d_menu_map_common.h index 55de3d0f6c..87ffa25136 100644 --- a/include/d/d_menu_map_common.h +++ b/include/d/d_menu_map_common.h @@ -123,8 +123,8 @@ public: /* 0x06C */ u32 _6c; /* 0x070 */ IconInfo_s mIconInfo[128]; /* 0xC70 */ u16 mIconNum; - /* 0xC72 */ s16 mBlinkTimer; - /* 0xC74 */ s16 mLightDropFlashTimer; + /* 0xC72 */ DUSK_IF_ELSE(f32, s16) mBlinkTimer; + /* 0xC74 */ DUSK_IF_ELSE(f32, s16) mLightDropFlashTimer; /* 0xC76 */ u16 _c76; /* 0xC78 */ f32 mBlinkAlpha; /* 0xC7C */ f32 _c7c; diff --git a/include/d/d_menu_option.h b/include/d/d_menu_option.h index ff4b84f5e3..8ccacf6490 100644 --- a/include/d/d_menu_option.h +++ b/include/d/d_menu_option.h @@ -96,6 +96,8 @@ public: bool dpdMenuMove(); #if TARGET_PC bool pointerConfirmSelect(); + void presentLayoutAnims(); + void presentAnims(); #endif void paneResize(u64); void initialize(); @@ -190,11 +192,11 @@ public: /* 0x3B4 */ f32 field_0x3b4; /* 0x3B8 */ JUtility::TColor field_0x3b8; /* 0x3BC */ JUtility::TColor field_0x3bc; - /* 0x3C0 */ int field_0x3c0; - /* 0x3C4 */ int field_0x3c4; - /* 0x3C8 */ int field_0x3c8[4]; + /* 0x3C0 */ DUSK_IF_ELSE(f32, int) field_0x3c0; + /* 0x3C4 */ DUSK_IF_ELSE(f32, int) field_0x3c4; + /* 0x3C8 */ DUSK_IF_ELSE(f32, int) field_0x3c8[4]; /* 0x3D8 */ s16 mFrame; - /* 0x3DA */ s16 field_0x3da; + /* 0x3DA */ DUSK_IF_ELSE(f32, s16) field_0x3da; /* 0x3DC */ u16 field_0x3dc; /* 0x3DE */ u16 field_0x3de; /* 0x3E0 */ u8 field_0x3e0; diff --git a/include/d/d_menu_ring.h b/include/d/d_menu_ring.h index fa4f97496f..735121df96 100644 --- a/include/d/d_menu_ring.h +++ b/include/d/d_menu_ring.h @@ -27,6 +27,9 @@ public: void _delete(); void _move(); void _draw(); +#if TARGET_PC + void advanceSelectItem(); +#endif void setKanteraPos(f32, f32); bool isOpen(); bool isMoveEnd(); @@ -166,7 +169,7 @@ public: /* 0x67E */ s16 field_0x67e; /* 0x680 */ s16 mCursorSpeed; /* 0x682 */ s16 field_0x682; - /* 0x684 */ s16 field_0x684; + /* 0x684 */ DUSK_IF_ELSE(f32, s16) field_0x684; /* 0x686 */ s16 field_0x686[4]; /* 0x68E */ s16 field_0x68e; /* 0x690 */ u8 mItemSlots[MAX_ITEM_SLOTS]; @@ -207,16 +210,6 @@ public: /* 0x6D2 */ u8 field_0x6d2; /* 0x6D3 */ u8 field_0x6d3; #if TARGET_PC - f32 mSelectItemSlideElapsed[4]; - f32 mCursorInterpPrevX; - f32 mCursorInterpPrevY; - f32 mCursorInterpCurrX; - f32 mCursorInterpCurrY; - s16 mCursorInterpPrevAngle; - s16 mCursorInterpCurrAngle; - bool mCursorInterpPrevAngular; - bool mCursorInterpCurrAngular; - bool mCursorInterpInit; bool mPointerTouchPressHoveredCurrent; #endif }; diff --git a/include/d/d_menu_save.h b/include/d/d_menu_save.h index a237bbb849..b12322ba8c 100644 --- a/include/d/d_menu_save.h +++ b/include/d/d_menu_save.h @@ -263,11 +263,12 @@ public: void setInitSaveData(); void _draw(); - #if TARGET_PC +#if TARGET_PC void menuSaveWide(); bool pointerSaveSelect(); bool pointerYesNoSelect(bool errorSelect, u8 errParam = 0, u8 soundParam = 0); - #endif + void presentLayoutAnims(); +#endif void _draw2(); @@ -293,16 +294,16 @@ public: /* 0x0054 */ u8 mSelectedFile; /* 0x0055 */ u8 mLastSelFile; /* 0x0058 */ CPaneMgr* mpSelectMoveBase; - /* 0x005C */ int mDataBaseMoveAnmFrame; + /* 0x005C */ DUSK_IF_ELSE(f32, int) mDataBaseMoveAnmFrame; /* 0x0060 */ int mDataBaseMoveFrameMax; /* 0x0064 */ u8 field_0x64; /* 0x0065 */ u8 field_0x65; /* 0x0068 */ CPaneMgr* mpSelData[3]; - /* 0x0074 */ int field_0x74[3]; + /* 0x0074 */ DUSK_IF_ELSE(f32, int) field_0x74[3]; /* 0x0080 */ int field_0x80; /* 0x0084 */ CPaneMgr* mpNoYes[2]; - /* 0x008C */ int field_0x8c[2]; - /* 0x0094 */ int mYesNoMoveAnmFrame; + /* 0x008C */ DUSK_IF_ELSE(f32, int) field_0x8c[2]; + /* 0x0094 */ DUSK_IF_ELSE(f32, int) mYesNoMoveAnmFrame; /* 0x0098 */ int mYesNoMoveAnmMax; /* 0x009C */ u8 field_0x9c; /* 0x009D */ u8 field_0x9d; @@ -310,7 +311,7 @@ public: /* 0x00A0 */ J2DPane* field_0xa0; /* 0x00A4 */ u8 field_0xa4[0x10]; /* 0x00B4 */ J2DPane* field_0xb4; - /* 0x00B8 */ int field_0xb8; + /* 0x00B8 */ DUSK_IF_ELSE(f32, int) field_0xb8; /* 0x00BC */ int field_0xbc; /* 0x00C0 */ CPaneMgrAlpha* mpErrTxtPane[2]; /* 0x00C8 */ TEXT_SPAN mpErrTxt[2]; @@ -334,15 +335,15 @@ public: /* 0x0134 */ u8 mNoYesWakuAnmTimer[2]; /* 0x0138 */ CPaneMgr* mpNoYesTxt[2]; /* 0x0140 */ J2DAnmColor* mpFileWakuAnm; - /* 0x0144 */ int mFileWakuAnmFrame; + /* 0x0144 */ DUSK_IF_ELSE(f32, int) mFileWakuAnmFrame; /* 0x0148 */ J2DAnmTextureSRTKey* mpFileWakuRotAnm; - /* 0x014C */ int mFileWakuRotAnmFrame; + /* 0x014C */ DUSK_IF_ELSE(f32, int) mFileWakuRotAnmFrame; /* 0x0150 */ J2DAnmColor* field_0x150; - /* 0x0154 */ int field_0x154; + /* 0x0154 */ DUSK_IF_ELSE(f32, int) field_0x154; /* 0x0158 */ J2DAnmTextureSRTKey* field_0x158; - /* 0x015C */ int field_0x15c; + /* 0x015C */ DUSK_IF_ELSE(f32, int) field_0x15c; /* 0x0160 */ J2DAnmTevRegKey* field_0x160; - /* 0x0164 */ int field_0x164; + /* 0x0164 */ DUSK_IF_ELSE(f32, int) field_0x164; /* 0x0168 */ CPaneMgrAlpha* mpHeaderTxtPane[2]; /* 0x0170 */ TEXT_SPAN mpHeaderTxt[2]; /* 0x0178 */ u8 mHeaderTxtType; // 0: Select Menu 1: YesNo Menu @@ -394,6 +395,9 @@ public: /* 0x21A1 */ u8 field_0x21a1; /* 0x21A2 */ u8 field_0x21a2; /* 0x21A3 */ u8 field_0x21a3; +#if TARGET_PC + u8 mYesNoSelAnmCol; +#endif }; #endif /* D_MENU_D_MENU_SAVE_H */ diff --git a/include/d/d_menu_skill.h b/include/d/d_menu_skill.h index 2c2dc445d1..bd5e16e879 100644 --- a/include/d/d_menu_skill.h +++ b/include/d/d_menu_skill.h @@ -51,6 +51,7 @@ public: #if TARGET_PC bool pointerWait(); + void presentAnims(); #endif virtual void draw() { _draw(); } @@ -90,7 +91,7 @@ public: /* 0x1F4 */ f32 mBarScale[2]; /* 0x1FC */ u32 mStringID; /* 0x200 */ s16 mFrame; - /* 0x202 */ s16 mProcFrame; + /* 0x202 */ DUSK_IF_ELSE(f32, s16) mProcFrame; /* 0x204 */ u8 mStatus; /* 0x205 */ u8 mProcess; /* 0x206 */ u8 mIndex; diff --git a/include/d/d_name.h b/include/d/d_name.h index de084defb3..95779b576a 100644 --- a/include/d/d_name.h +++ b/include/d/d_name.h @@ -111,9 +111,9 @@ public: void menuCursorMove2(); void selectCursorPosSet(int); - #if TARGET_PC +#if TARGET_PC void nameWide(); - #endif +#endif void _draw(); void screenSet(); @@ -135,9 +135,9 @@ public: /* 0x00C */ dDlst_NameIN_c nameIn; /* 0x020 */ dSelect_cursor_c* mSelIcon; /* 0x024 */ J2DAnmColorKey* mCursorColorKey; - /* 0x028 */ int mCurColAnmF; + /* 0x028 */ DUSK_IF_ELSE(f32, int) mCurColAnmF; /* 0x02C */ J2DAnmTextureSRTKey* mCursorTexKey; - /* 0x030 */ int mCurTexAnmF; + /* 0x030 */ DUSK_IF_ELSE(f32, int) mCurTexAnmF; /* 0x034 */ CPaneMgrAlpha* mNameCursor[8]; /* 0x054 */ TEXT_SPAN mNameText[8]; /* 0x074 */ CPaneMgr* mMojiIcon[65]; diff --git a/src/d/d_file_sel_warning.cpp b/src/d/d_file_sel_warning.cpp index 97b667bb45..b76998c038 100644 --- a/src/d/d_file_sel_warning.cpp +++ b/src/d/d_file_sel_warning.cpp @@ -13,6 +13,7 @@ #include "d/d_pane_class.h" #if TARGET_PC +#include "dusk/interp/user_interface.h" #include "dusk/version.hpp" #endif @@ -61,6 +62,10 @@ void dFile_warning_c::screenSet() { mFileWarn.Scr->setAnimation(field_0x24); field_0x24->setFrame(2849.0f); mFileWarn.Scr->animation(); +#if TARGET_PC + field_0x28 = 2849; + field_0x2c = 2849; +#endif mFileWarn.mFont = mDoExt_getMesgFont(); mpRootPane = JKR_NEW CPaneMgr(mFileWarn.Scr, MULTI_CHAR('Nm_02'), 0, NULL); @@ -116,6 +121,7 @@ bool dFile_warning_c::baseMoveAnm() { bool rt; if (field_0x28 != field_0x2c) { +#if !TARGET_PC if (field_0x28 < field_0x2c) { field_0x28 += 2; @@ -132,6 +138,7 @@ bool dFile_warning_c::baseMoveAnm() { field_0x24->setFrame(field_0x28); mFileWarn.Scr->animation(); +#endif rt = false; } @@ -149,6 +156,19 @@ bool dFile_warning_c::baseMoveAnm() { return rt; } +#if TARGET_PC +void dFile_warning_c::presentAnims() { + if (field_0x28 == field_0x2c) { + return; + } + dusk::vdt::present_toward(field_0x28, (f32)field_0x2c, field_0x24); + mFileWarn.Scr->animation(); + if (mPosY != 0.0f) { + mpRootPane->translate(mpRootPane->getTranslateX(), mPosY - field_0x34); + } +} +#endif + void dFile_warning_c::openInit() { field_0x28 = 2849; field_0x2c = 2859; diff --git a/src/d/d_file_select.cpp b/src/d/d_file_select.cpp index ed73d5f9cf..9a2a7d194b 100644 --- a/src/d/d_file_select.cpp +++ b/src/d/d_file_select.cpp @@ -24,7 +24,9 @@ #include #if TARGET_PC +#include "dusk/game_clock.h" #include "dusk/game_mode.hpp" +#include "dusk/interp/user_interface.h" #include "dusk/menu_pointer.h" #include "dusk/mods/svc/save.hpp" #include "dusk/utilities.hpp" @@ -357,6 +359,8 @@ static DataSelProcFunc DataSelProc[] = { }; void dFile_select_c::_move() { + IF_DUSK(mNameMoveRequested = false); + #if DEBUG if (g_fsHIO.title_mesg_check) { titleMsgCheck(); @@ -393,6 +397,7 @@ void dFile_select_c::_move() { (this->*DataSelProc[mDataSelProc])(); +#if !TARGET_PC selFileWakuAnm(); bookIconAnm(); dataDelEffAnm(); @@ -408,6 +413,7 @@ void dFile_select_c::_move() { copyBookIconAnm(); mCpSel.Scr->animation(); } +#endif mpFileWarning->_move(); mpFileSelect3d->_move(); @@ -477,6 +483,15 @@ void dFile_select_c::errorMsgCheck() { #endif void dFile_select_c::selFileWakuAnm() { +#if TARGET_PC + dusk::vdt::present_looping(mSelFileBpkFrame, mFileSelBpk, 2.0f); + dusk::vdt::present_looping(mSelFileBtk05Frame, mFileSel05Btk, 2.0f); + dusk::vdt::present_looping(mYnSelBpkFrame, mYnSelBpk, 2.0f); + dusk::vdt::present_looping(mYnSelBtkFrame, mYnSelBtk, 2.0f); + dusk::vdt::present_looping(m3mBpkFrame, m3mBpk, 2.0f); + dusk::vdt::present_looping(m3mBtkFrame, m3mBtk, 2.0f); + dusk::vdt::present_looping(mSelDtBtkFrame, mSelDtBtk, 2.0f); +#else mSelFileBpkFrame += 2; if (mSelFileBpkFrame >= mFileSelBpk->getFrameMax()) mSelFileBpkFrame -= mFileSelBpk->getFrameMax(); @@ -511,9 +526,15 @@ void dFile_select_c::selFileWakuAnm() { if (mSelDtBtkFrame >= mSelDtBtk->getFrameMax()) mSelDtBtkFrame -= mSelDtBtk->getFrameMax(); mSelDtBtk->setFrame(mSelDtBtkFrame); +#endif } void dFile_select_c::bookIconAnm() { +#if TARGET_PC + dusk::vdt::present_looping(mSelFileBookBpkFrame, mSelFileBookBpk, 2.0f); + dusk::vdt::present_looping(mSelFileBookBtkFrame, mSelFileBookBtk, 2.0f); + dusk::vdt::present_looping(mSelFileBookBrkFrame, mSelFileBookBrk, 2.0f); +#else mSelFileBookBpkFrame += 2; if (mSelFileBookBpkFrame >= mSelFileBookBpk->getFrameMax()) mSelFileBookBpkFrame -= mSelFileBookBpk->getFrameMax(); @@ -528,9 +549,14 @@ void dFile_select_c::bookIconAnm() { if (mSelFileBookBrkFrame >= mSelFileBookBrk->getFrameMax()) mSelFileBookBrkFrame -= mSelFileBookBrk->getFrameMax(); mSelFileBookBrk->setFrame(mSelFileBookBrkFrame); +#endif } void dFile_select_c::selCopyFileWakuAnm() { +#if TARGET_PC + dusk::vdt::present_looping(mCpSelBpkFrame, mCpSelBpk, 2.0f); + dusk::vdt::present_looping(mCpSel03BtkFrame, mCpSel03Btk, 2.0f); +#else mCpSelBpkFrame += 2; if (mCpSelBpkFrame >= mCpSelBpk->getFrameMax()) mCpSelBpkFrame -= mCpSelBpk->getFrameMax(); @@ -540,9 +566,15 @@ void dFile_select_c::selCopyFileWakuAnm() { if (mCpSel03BtkFrame >= mCpSel03Btk->getFrameMax()) mCpSel03BtkFrame -= mCpSel03Btk->getFrameMax(); mCpSel03Btk->setFrame(mCpSel03BtkFrame); +#endif } void dFile_select_c::copyBookIconAnm() { +#if TARGET_PC + dusk::vdt::present_looping(mCpSelBookBpkFrame, mCpSelBookBpk, 2.0f); + dusk::vdt::present_looping(mCpSelBookBtkFrame, mCpSelBookBtk, 2.0f); + dusk::vdt::present_looping(mCpSelBookBrkFrame, mCpSelBookBrk, 2.0f); +#else mCpSelBookBpkFrame += 2; if (mCpSelBookBpkFrame >= mCpSelBookBpk->getFrameMax()) mCpSelBookBpkFrame -= mCpSelBookBpk->getFrameMax(); @@ -557,10 +589,15 @@ void dFile_select_c::copyBookIconAnm() { if (mCpSelBookBrkFrame >= mCpSelBookBrk->getFrameMax()) mCpSelBookBrkFrame -= mCpSelBookBrk->getFrameMax(); mCpSelBookBrk->setFrame(mCpSelBookBrkFrame); +#endif } void dFile_select_c::dataDelEffAnm() { if (field_0x0208 != 0) { +#if TARGET_PC + dusk::vdt::present_looping(mCpDtEffBrkFrame, mCpDtEffBrk, 2.0f); + dusk::vdt::present_looping(mDtEffBtkFrame, mDtEffBtk, 2.0f); +#else mCpDtEffBrkFrame += 2; if (mCpDtEffBrkFrame >= mCpDtEffBrk->getFrameMax()) mCpDtEffBrkFrame -= mCpDtEffBrk->getFrameMax(); @@ -570,11 +607,16 @@ void dFile_select_c::dataDelEffAnm() { if (mDtEffBtkFrame >= mDtEffBtk->getFrameMax()) mDtEffBtkFrame -= mDtEffBtk->getFrameMax(); mDtEffBtk->setFrame(mDtEffBtkFrame); +#endif } } void dFile_select_c::dataCopyEffAnm() { if (field_0x0209 != 0) { +#if TARGET_PC + dusk::vdt::present_looping(mCpDtEffBrkFrame, mCpDtEffBrk, 2.0f); + dusk::vdt::present_looping(mCpEffBtkFrame, mCpEffBtk, 2.0f); +#else mCpDtEffBrkFrame += 2; if (mCpDtEffBrkFrame >= mCpDtEffBrk->getFrameMax()) mCpDtEffBrkFrame -= mCpDtEffBrk->getFrameMax(); @@ -584,6 +626,7 @@ void dFile_select_c::dataCopyEffAnm() { if (mCpEffBtkFrame >= mCpEffBtk->getFrameMax()) mCpEffBtkFrame -= mCpEffBtk->getFrameMax(); mCpEffBtk->setFrame(mCpEffBtkFrame); +#endif } } @@ -602,6 +645,7 @@ void dFile_select_c::selectDataBaseMoveAnmInitSet(int i_frame, int i_frameMax) { bool dFile_select_c::selectDataBaseMoveAnm() { bool ret; if (mBaseMoveAnmFrame != mBaseMoveAnmFrameMax) { +#if !TARGET_PC if (mBaseMoveAnmFrame < mBaseMoveAnmFrameMax) { mBaseMoveAnmFrame += 2; if (mBaseMoveAnmFrame > mBaseMoveAnmFrameMax) @@ -614,6 +658,7 @@ bool dFile_select_c::selectDataBaseMoveAnm() { mBaseMoveAnm->setFrame(mBaseMoveAnmFrame); mBaseMovePane->getPanePtr()->animationTransform(); +#endif ret = false; } else { if (mBaseMoveAnmFrame == 33) { @@ -753,6 +798,7 @@ void dFile_select_c::dataSelectInit() { isKetteiTxtDisp = ketteiTxtDispAnm(); if (field_0x00e0[mSelectNum] != SelEndFrameTbl[mSelectNum]) { +#if !TARGET_PC field_0x00e0[mSelectNum] += 2; if (field_0x00e0[mSelectNum] > SelEndFrameTbl[mSelectNum]) @@ -760,6 +806,7 @@ void dFile_select_c::dataSelectInit() { mBaseMoveAnm->setFrame(field_0x00e0[mSelectNum]); mSelFilePanes[mSelectNum]->getPanePtr()->animationTransform(); +#endif check = false; } } @@ -1058,6 +1105,7 @@ bool dFile_select_c::selectDataMoveAnm() { bool ret; if (field_0x00e0[mSelectNum] != field_0x00ec) { +#if !TARGET_PC if (field_0x00e0[mSelectNum] < field_0x00ec) { field_0x00e0[mSelectNum] += 2; @@ -1077,6 +1125,7 @@ bool dFile_select_c::selectDataMoveAnm() { mSelFilePanes[i]->getPanePtr()->animationTransform(); } mBaseSubPane->animationTransform(); +#endif } if (field_0x00e0[mSelectNum] == field_0x00ec) { @@ -1133,6 +1182,7 @@ void dFile_select_c::dataSelectMoveAnime() { iVar6 = selectWakuAlpahAnm(mLastSelectNum); if (field_0x00e0[mLastSelectNum] != SelStartFrameTbl[mLastSelectNum]) { +#if !TARGET_PC field_0x00e0[mLastSelectNum] -= 2; if (field_0x00e0[mLastSelectNum] < SelStartFrameTbl[mLastSelectNum]) @@ -1140,6 +1190,7 @@ void dFile_select_c::dataSelectMoveAnime() { field_0x0088->setFrame(field_0x00e0[mLastSelectNum]); mSelFilePanes[mLastSelectNum]->getPanePtr()->animationTransform(); +#endif bVar1 = false; } } @@ -1151,6 +1202,7 @@ void dFile_select_c::dataSelectMoveAnime() { iVar5 = mSelFilePane_Book_l[mSelectNum]->alphaAnime(g_fsHIO.base_effect_appear_frames, 0, 0xff, 1); if (field_0x00e0[mSelectNum] != SelEndFrameTbl[mSelectNum]) { +#if !TARGET_PC field_0x00e0[mSelectNum] += 2; if (field_0x00e0[mSelectNum] > SelEndFrameTbl[mSelectNum]) @@ -1158,6 +1210,7 @@ void dFile_select_c::dataSelectMoveAnime() { mBaseMoveAnm->setFrame(field_0x00e0[mSelectNum]); mSelFilePanes[mSelectNum]->getPanePtr()->animationTransform(); +#endif bVar2 = false; } } @@ -1488,6 +1541,7 @@ bool dFile_select_c::menuMoveAnm() { bool ret; if (field_0x0358 != field_0x035c) { +#if !TARGET_PC if (field_0x0358 < field_0x035c) { field_0x0358 += 2; @@ -1502,6 +1556,7 @@ bool dFile_select_c::menuMoveAnm() { m3mBck->setFrame(field_0x0358); m3mMenuPane->animationTransform(); +#endif ret = false; } else { m3mMenuPane->setAnimation((J2DAnmTransform*)NULL); @@ -1561,6 +1616,7 @@ void dFile_select_c::menuSelectMoveAnm() { if (mSelectMenuNum != 0xFF && field_0x034c[mSelectMenuNum] != MenuSelStartFrameTbl[mSelectMenuNum]) { +#if !TARGET_PC if (field_0x034c[mSelectMenuNum] > MenuSelStartFrameTbl[mSelectMenuNum]) { field_0x034c[mSelectMenuNum] -= 2; @@ -1575,6 +1631,7 @@ void dFile_select_c::menuSelectMoveAnm() { m3mBck->setFrame(field_0x034c[mSelectMenuNum]); m3mSelPane[mSelectMenuNum]->getPanePtr()->animationTransform(); +#endif tmp1 = false; } @@ -1583,6 +1640,7 @@ void dFile_select_c::menuSelectMoveAnm() { if (mLastSelectMenuNum != 0xFF) { if (field_0x034c[mLastSelectMenuNum] != MenuSelEndFrameTbl[mLastSelectMenuNum]) { +#if !TARGET_PC if (field_0x034c[mLastSelectMenuNum] < MenuSelEndFrameTbl[mLastSelectMenuNum]) { field_0x034c[mLastSelectMenuNum] += 2; @@ -1597,6 +1655,7 @@ void dFile_select_c::menuSelectMoveAnm() { } m3mBck2->setFrame(field_0x034c[mLastSelectMenuNum]); m3mSelPane[mLastSelectMenuNum]->getPanePtr()->animationTransform(); +#endif tmp2 = false; } @@ -1718,14 +1777,14 @@ void dFile_select_c::nameToDataSelectMove() { } void dFile_select_c::nameInputFade() { - mFadeTimer--; + IF_NOT_DUSK(mFadeTimer--); - #if PLATFORM_GCN +#if !TARGET_PC && PLATFORM_GCN u8 alpha = (1.0f - (mFadeTimer / 15.0f)) * 255.0f; mpFadePict->setAlpha(alpha); - #endif +#endif - if (mFadeTimer == 0) { + if (mFadeTimer DUSK_IF_ELSE(<=, ==) 0) { char name[32]; headerTxtSet(900, 1, 1); dMeter2Info_getString(899, name, NULL); @@ -1746,14 +1805,14 @@ void dFile_select_c::nameInputFade() { void dFile_select_c::nameInput2Move() { if (!mDoRst::isReset()) { - mFadeTimer--; + IF_NOT_DUSK(mFadeTimer--); - #if PLATFORM_GCN +#if !TARGET_PC && PLATFORM_GCN u8 alpha = (mFadeTimer / 15.0f) * 255.0f; mpFadePict->setAlpha(alpha); - #endif +#endif - if (mFadeTimer == 0) { + if (mFadeTimer DUSK_IF_ELSE(<=, ==) 0) { mpName->showIcon(); mDataSelProc = DATASELPROC_NAME_INPUT2; } @@ -1805,14 +1864,14 @@ void dFile_select_c::nameInput2() { } void dFile_select_c::backNameInputMove0() { - mFadeTimer--; + IF_NOT_DUSK(mFadeTimer--); - #if PLATFORM_GCN +#if !TARGET_PC && PLATFORM_GCN u8 alpha = (1.0f - (mFadeTimer / 15.0f)) * 255.0f; mpFadePict->setAlpha(alpha); - #endif +#endif - if (mFadeTimer == 0) { + if (mFadeTimer DUSK_IF_ELSE(<=, ==) 0) { headerTxtSet(901, 1, 1); mpName->setNextNameStr(dComIfGs_getPlayerName()); mpName->initial(); @@ -1831,14 +1890,14 @@ void dFile_select_c::backNameInputMove0() { void dFile_select_c::backNameInputMove() { if (!mDoRst::isReset()) { - mFadeTimer--; + IF_NOT_DUSK(mFadeTimer--); - #if PLATFORM_GCN +#if !TARGET_PC && PLATFORM_GCN u8 alpha = (mFadeTimer / 15.0f) * 255.0f; mpFadePict->setAlpha(alpha); - #endif +#endif - if (mFadeTimer == 0) { + if (mFadeTimer DUSK_IF_ELSE(<=, ==) 0) { modoruTxtChange(1); mDataSelProc = DATASELPROC_NAME_INPUT_WAIT; } @@ -2084,12 +2143,14 @@ void dFile_select_c::copyDataToSelectMoveAnm() { iVar7 = mCpSelPane_book[field_0x026c]->alphaAnime(g_fsHIO.base_effect_appear_frames, 0xff, 0, 1); iVar6 = copySelectWakuAlpahAnm(field_0x026c); if (field_0x02b4[field_0x026c] != 109) { +#if !TARGET_PC field_0x02b4[field_0x026c] += 2; if (field_0x02b4[field_0x026c] > 109) { field_0x02b4[field_0x026c] = 109; } mCpSelBck2->setFrame(field_0x02b4[field_0x026c]); mCpSelPane[field_0x026c]->getPanePtr()->animationTransform(); +#endif bVar1 = false; } } @@ -2099,12 +2160,14 @@ void dFile_select_c::copyDataToSelectMoveAnm() { if (field_0x026b != 0xff) { iVar5 = mCpSelPane_book[field_0x026b]->alphaAnime(g_fsHIO.base_effect_appear_frames, 0, 0xff, 1); if (field_0x02b4[field_0x026b] != 99) { +#if !TARGET_PC field_0x02b4[field_0x026b] -= 2; if (field_0x02b4[field_0x026b] < 99) { field_0x02b4[field_0x026b] = 99; } mCpSelBck->setFrame(field_0x02b4[field_0x026b]); mCpSelPane[field_0x026b]->getPanePtr()->animationTransform(); +#endif bVar2 = false; } } @@ -2259,6 +2322,7 @@ void dFile_select_c::yesnoMenuMoveAnmInitSet(int param_1, int param_2) { bool dFile_select_c::yesnoMenuMoveAnm() { bool rv; if (field_0x0100 != field_0x0104) { +#if !TARGET_PC if (field_0x0100 < field_0x0104) { field_0x0100 += 2; if (field_0x0100 > field_0x0104) { @@ -2274,6 +2338,7 @@ bool dFile_select_c::yesnoMenuMoveAnm() { mYnSelBck3->setFrame(field_0x0100); mYnSelPane[0]->getPanePtr()->animationTransform(); mYnSelPane[1]->getPanePtr()->animationTransform(); +#endif rv = false; } else { mYnSelPane[0]->getPanePtr()->setAnimation((J2DAnmTransform*)NULL); @@ -2337,6 +2402,7 @@ bool dFile_select_c::yesnoSelectMoveAnm() { bool bVar1 = true; if (field_0x0269 != 0xff && field_0x00f8[field_0x0269] != YnSelStartFrameTbl[field_0x0269]) { +#if !TARGET_PC if (field_0x00f8[field_0x0269] < YnSelStartFrameTbl[field_0x0269]) { field_0x00f8[field_0x0269] += 2; if (field_0x00f8[field_0x0269] > YnSelStartFrameTbl[field_0x0269]) { @@ -2351,11 +2417,13 @@ bool dFile_select_c::yesnoSelectMoveAnm() { mYnSelBck->setFrame(field_0x00f8[field_0x0269]); mYnSelPane[field_0x0269]->getPanePtr()->animationTransform(); +#endif bVar1 = false; } bool bVar2 = true; if (field_0x0268 != 0xff && field_0x00f8[field_0x0268] != YnSelEndFrameTbl[field_0x0268]) { +#if !TARGET_PC if (field_0x00f8[field_0x0268] < YnSelEndFrameTbl[field_0x0268]) { field_0x00f8[field_0x0268] += 2; if (field_0x00f8[field_0x0268] > YnSelEndFrameTbl[field_0x0268]) { @@ -2370,6 +2438,7 @@ bool dFile_select_c::yesnoSelectMoveAnm() { mYnSelBck2->setFrame(field_0x00f8[field_0x0268]); mYnSelPane[field_0x0268]->getPanePtr()->animationTransform(); +#endif bVar2 = false; } @@ -3577,9 +3646,7 @@ void dFile_select_c::screenSet() { timg, NULL); mpFadePict->setBlackWhite(black, white); mpFadePict->setAlpha(0); -#ifdef TARGET_PC - mFadeDlst.mpPict = mpFadePict; -#endif + IF_DUSK(mFadeDlst.mpPict = mpFadePict); #endif } @@ -3782,6 +3849,10 @@ void dFile_select_c::screenSet3Menu() { m3mMenuPane = m3mSel.Scr3m->search(MULTI_CHAR('wmenu_n')); m3mMenuPane->setAnimation(m3mBck); +#if TARGET_PC + field_0x0358 = 799; + field_0x035c = 799; +#endif m3mBck->setFrame(799.0f); m3mMenuPane->animationTransform(); @@ -4396,14 +4467,157 @@ void dFile_select_c::fileSelectWide() { break; } } + +void dFile_select_c::presentLayoutAnims() { + dusk::vdt::present_toward(mBaseMoveAnmFrame, (f32)mBaseMoveAnmFrameMax, mBaseMoveAnm, + mBaseMovePane != NULL ? mBaseMovePane->getPanePtr() : NULL); + + if (mBaseSubPane != NULL && mBaseSubPane->mTransform == mBaseMoveAnm && mSelectNum != 0xFF) { + dusk::vdt::present_toward(field_0x00e0[mSelectNum], (f32)field_0x00ec, mBaseMoveAnm); + for (int i = 0; i < 3; i++) { + J2DPane* pane = mSelFilePanes[i]->getPanePtr(); + if (pane != NULL && pane->mTransform != NULL) { + pane->animationTransform(); + } + } + mBaseSubPane->animationTransform(); + } else { + for (int i = 0; i < 3; i++) { + J2DPane* pane = mSelFilePanes[i]->getPanePtr(); + dusk::vdt::present_selected(field_0x00e0[i], pane, mBaseMoveAnm, (f32)SelEndFrameTbl[i], + field_0x0088, (f32)SelStartFrameTbl[i]); + } + } + + dusk::vdt::present_toward(field_0x0358, (f32)field_0x035c, m3mBck, m3mMenuPane); + + for (int i = 0; i < 3; i++) { + J2DPane* pane = m3mSelPane[i]->getPanePtr(); + dusk::vdt::present_selected(field_0x034c[i], pane, m3mBck, (f32)MenuSelStartFrameTbl[i], + m3mBck2, (f32)MenuSelEndFrameTbl[i]); + } + + if (field_0x0100 != field_0x0104) { + dusk::vdt::present_shared(field_0x0100, (f32)field_0x0104, mYnSelBck3, + {mYnSelPane[0]->getPanePtr(), mYnSelPane[1]->getPanePtr()}); + } + + for (int i = 0; i < 2; i++) { + J2DPane* pane = mYnSelPane[i]->getPanePtr(); + dusk::vdt::present_selected(field_0x00f8[i], pane, mYnSelBck, (f32)YnSelStartFrameTbl[i], + mYnSelBck2, (f32)YnSelEndFrameTbl[i]); + } + + for (int i = 0; i < 2; i++) { + if (mCpSelPane[i] == NULL) { + continue; + } + J2DPane* pane = mCpSelPane[i]->getPanePtr(); + dusk::vdt::present_selected(field_0x02b4[i], pane, mCpSelBck, 99.0f, mCpSelBck2, 109.0f); + } + + dusk::vdt::present_toward(field_0x0130, (f32)field_0x0134, field_0x0090, mErrorMsgPane); + + if (mBaseSubPane != NULL && mBaseSubPane->mTransform == field_0x009c) { + dusk::vdt::present_toward(field_0x0110, (f32)field_0x0114, field_0x009c, mBaseSubPane); + } + + if (mNameMoveRequested) { + dusk::vdt::present_toward(field_0x0120, (f32)field_0x0124, field_0x0094, mNameBasePane); + } +} + +void dFile_select_c::presentNameInputFade() { + bool fadeOut; + switch (mDataSelProc) { + case DATASELPROC_NAME_INPUT_FADE: + case DATASELPROC_BACK_NAME_INPUT_MOVE0: + fadeOut = true; + break; + case DATASELPROC_NAME_INPUT2_MOVE: + case DATASELPROC_BACK_NAME_INPUT_MOVE: + if (mDoRst::isReset()) { + return; + } + fadeOut = false; + break; + default: + return; + } + + mFadeTimer -= dusk::game_clock::original_frames(); + if (mFadeTimer < 0.0f) { + mFadeTimer = 0.0f; + } + + f32 t = mFadeTimer / 15.0f; + u8 alpha = fadeOut ? (1.0f - t) * 255.0f : t * 255.0f; + mpFadePict->setAlpha(alpha); +} + +void dFile_select_c::presentAnims() { + if (mpFileWarning != NULL) { + mpFileWarning->presentAnims(); + } + + presentNameInputFade(); + selFileWakuAnm(); + bookIconAnm(); + dataDelEffAnm(); + dataCopyEffAnm(); + fileSel.Scr->animation(); + mYnSel.ScrYn->animation(); + m3mSel.Scr3m->animation(); + mSelDt.ScrDt->animation(); + if (mCpSel.isShow) { + selCopyFileWakuAnm(); + copyBookIconAnm(); + mCpSel.Scr->animation(); + } + presentLayoutAnims(); + for (int i = 0; i < 3; ++i) { + mSelFilePanes[i]->presentAnime(); + mDeleteEfPane[i]->presentAlphaAnime(); + mCopyEfPane[i]->presentAlphaAnime(); + mSelFileMoyoPane[i]->presentAnime(); + mSelFileGoldPane[i]->presentAnime(); + mSelFileGold2Pane[i]->presentAnime(); + mSelFilePane_Book_l[i]->presentAnime(); + mFileInfoDatBasePane[i]->presentAlphaAnime(); + mFileInfoNoDatBasePane[i]->presentAlphaAnime(); + m3mSelPane_mo[i]->presentAnime(); + m3mSelPane_g[i]->presentAnime(); + m3mSelPane_gr[i]->presentAnime(); + m3mSelTextPane[i]->presentAnime(); + } + for (int i = 0; i < 2; ++i) { + mErrorMsgTxtPane[i]->presentAlphaAnime(); + mYnSelPane_m[i]->presentAlphaAnime(); + mYnSelPane_g[i]->presentAlphaAnime(); + mYnSelPane_gr[i]->presentAlphaAnime(); + mYnSelTxtPane[i]->presentAnime(); + mHeaderTxtPane[i]->presentAlphaAnime(); + mCpSelPane_moyo[i]->presentAnime(); + mCpSelPane_gold[i]->presentAnime(); + mCpSelPane_gold2[i]->presentAnime(); + mCpSelPane_book[i]->presentAnime(); + } + mBbtnPane->presentAlphaAnime(); + mAbtnPane->presentAlphaAnime(); + mModoruTxtPane->presentAlphaAnime(); + mKetteiTxtPane->presentAlphaAnime(); + fileSelectWide(); +} #endif void dFile_select_c::_draw() { - #if TARGET_PC - fileSelectWide(); - #endif - if (!mHasDrawn) { +#if TARGET_PC + if (dusk::game_clock::is_presentation_frame()) { + presentAnims(); + } +#endif + dComIfGd_set2DOpa(&fileSel); for (int i = 0; i < 3; i++) { @@ -4505,6 +4719,7 @@ void dFile_select_c::errorMoveAnmInitSet(int param_1, int param_2) { bool dFile_select_c::errorMoveAnm() { bool ret; if (field_0x0130 != field_0x0134) { +#if !TARGET_PC if (field_0x0130 < field_0x0134) { field_0x0130 += 2; @@ -4519,6 +4734,7 @@ bool dFile_select_c::errorMoveAnm() { field_0x0090->setFrame(field_0x0130); mErrorMsgPane->animationTransform(); +#endif ret = false; } else { mErrorMsgPane->setAnimation((J2DAnmTransform*)NULL); @@ -5797,6 +6013,7 @@ bool dFile_select_c::fileInfoScaleAnm() { bool ret; if (field_0x0110 != field_0x0114) { +#if !TARGET_PC if (field_0x0110 < field_0x0114) { field_0x0110 += 2; @@ -5811,6 +6028,7 @@ bool dFile_select_c::fileInfoScaleAnm() { field_0x009c->setFrame(field_0x0110); mBaseSubPane->animationTransform(); +#endif ret = false; } @@ -5823,6 +6041,13 @@ bool dFile_select_c::fileInfoScaleAnm() { } void dFile_select_c::nameMoveAnmInitSet(int param_1, int param_2) { +#if TARGET_PC + f32 startFrame = param_1; + if (mNameBasePane->mTransform == field_0x0094 && field_0x0124 == param_1) { + startFrame = field_0x0120; + } + mNameMoveRequested = false; +#endif if (param_1 == 3359) { field_0x0128 = true; } @@ -5830,15 +6055,17 @@ void dFile_select_c::nameMoveAnmInitSet(int param_1, int param_2) { mpName->hideIcon(); } mNameBasePane->setAnimation(field_0x0094); - field_0x0120 = param_1; + field_0x0120 = DUSK_IF_ELSE(startFrame, param_1); field_0x0124 = param_2; field_0x0094->setFrame(field_0x0120); mNameBasePane->animationTransform(); } bool dFile_select_c::nameMoveAnm() { + IF_DUSK(mNameMoveRequested = true); bool ret; if (field_0x0120 != field_0x0124) { +#if !TARGET_PC if (field_0x0120 < field_0x0124) { field_0x0120 += 2; @@ -5854,6 +6081,7 @@ bool dFile_select_c::nameMoveAnm() { } field_0x0094->setFrame(field_0x0120); mNameBasePane->animationTransform(); +#endif ret = false; } else { mNameBasePane->setAnimation((J2DAnmTransform*)0); @@ -5987,6 +6215,7 @@ void dFile_select3D_c::_move() { } void dFile_select3D_c::draw() { + IF_DUSK_BLOCK(dusk::game_clock::is_sim_frame()) if (mpModel) { dComIfGd_setListItem3D(); g_env_light.settingTevStruct(13, &field_0x03a4, &mTevstr); @@ -5995,6 +6224,7 @@ void dFile_select3D_c::draw() { mDoExt_modelUpdateDL(mpModel); dComIfGd_setList(); } + IF_DUSK_BLOCK_END } void dFile_select3D_c::setJ3D(char const* param_0, char const* param_1, char const* param_2) { diff --git a/src/d/d_gameover.cpp b/src/d/d_gameover.cpp index ac85b5d2b4..2dfd843f6f 100644 --- a/src/d/d_gameover.cpp +++ b/src/d/d_gameover.cpp @@ -15,6 +15,7 @@ #include #if TARGET_PC +#include "dusk/game_clock.h" #include "helpers/gx_helper.h" #endif @@ -192,6 +193,9 @@ int dGameover_c::_create() { } (this->*init_process[mProc])(); + + IF_DUSK(base.draw_interp_frame = true); + return cPhs_COMPLEATE_e; return phase; @@ -335,9 +339,11 @@ void dGameover_c::deleteWait_init() {} void dGameover_c::deleteWait_proc() {} int dGameover_c::_draw() { + IF_DUSK_BLOCK(dusk::game_clock::is_sim_frame() && (mIsDemoSave && mProc >= PROC_DISP_WAIT)) if (dgo_capture_c != NULL && dComIfGp_isPauseFlag()) { dComIfGd_set2DOpa(dgo_capture_c); } + IF_DUSK_BLOCK_END if (mIsDemoSave && mProc >= PROC_DISP_WAIT) { if (dgo_screen_c != NULL) { diff --git a/src/d/d_menu_collect.cpp b/src/d/d_menu_collect.cpp index 32c0a360c2..fefb1d5703 100644 --- a/src/d/d_menu_collect.cpp +++ b/src/d/d_menu_collect.cpp @@ -38,6 +38,8 @@ #include "m_Do/m_Do_mtx.h" #if TARGET_PC +#include "dusk/game_clock.h" +#include "dusk/interp/user_interface.h" #include "dusk/menu_pointer.h" #include "dusk/utilities.hpp" #endif @@ -999,10 +1001,14 @@ void dMenu_Collect2D_c::animationSet() { void dMenu_Collect2D_c::btkAnimeLoop0(J2DAnmTextureSRTKey* i_SRTKey) { if (i_SRTKey != NULL) { +#if TARGET_PC + dusk::vdt::advance_looping_frame(mFrame, 1.0f, i_SRTKey->getFrameMax()); +#else mFrame++; if (mFrame >= i_SRTKey->getFrameMax()) { mFrame -= i_SRTKey->getFrameMax(); } +#endif i_SRTKey->setFrame(mFrame); } else { mFrame = 0.0f; @@ -1016,6 +1022,11 @@ void dMenu_Collect2D_c::btkAnimeLoop0(J2DAnmTextureSRTKey* i_SRTKey) { } void dMenu_Collect2D_c::setBackAlpha() { +#if TARGET_PC + const f32 target = mProcess >= 1 && mProcess <= 18 ? 1.0f : 0.0f; + dusk::vdt::advance_toward_frame(mBackAlpha, target, 0.2f); + mpBlackTex->setAlpha(mBackAlpha * 150.0f); +#else f32 alpha = mpBlackTex->getAlpha() / 150.0f; switch (mProcess) { @@ -1056,6 +1067,7 @@ void dMenu_Collect2D_c::setBackAlpha() { } mpBlackTex->setAlpha(alpha * 150.0f); +#endif } // Not sure if this works without gotos @@ -2435,17 +2447,22 @@ void dMenu_Collect2D_c::_move() { if (mProcess != last_process) { (this->*init[mProcess])(); } +#if !TARGET_PC btkAnimeLoop0(mpAnmKey); mpScreen->animation(); setBackAlpha(); +#endif setHIO(false); } void dMenu_Collect2D_c::_draw() { - #if TARGET_PC +#if TARGET_PC + btkAnimeLoop0(mpAnmKey); + mpScreen->animation(); + setBackAlpha(); menuCollectWide(); - #endif +#endif J2DGrafContext* grafPort = dComIfGp_getCurrentGrafPort(); grafPort->setup2D(); @@ -3157,6 +3174,8 @@ void dMenu_Collect_c::_move() { void dMenu_Collect_c::draw() { dComIfGd_set2DOpa(mpCollect2D); + IF_DUSK_BLOCK(dusk::game_clock::is_sim_frame()) mpCollect3D->draw(); + IF_DUSK_BLOCK_END mpCollect2D->drawTop(); } diff --git a/src/d/d_menu_dmap.cpp b/src/d/d_menu_dmap.cpp index f8514e3817..119352d3d7 100644 --- a/src/d/d_menu_dmap.cpp +++ b/src/d/d_menu_dmap.cpp @@ -26,7 +26,10 @@ #include #if TARGET_PC +#include "dusk/game_clock.h" #include "dusk/interp/frame_interpolation.h" +#include "dusk/interp/menus.h" +#include "dusk/interp/user_interface.h" #include "dusk/settings.h" #include "dusk/version.hpp" #include "helpers/string.hpp" @@ -240,12 +243,14 @@ void dMenu_DmapBg_c::mapScreenInit() { void dMenu_DmapBg_c::mapScreenAnime() { if (0.0f == field_0xd94 && 0.0f == field_0xd98) { for (int i = 0; i < 1; i++) { +#if !TARGET_PC field_0xdc8[i] += 0.4f; if (field_0xdc8[i] >= field_0xd28[i]->getFrameMax()) { field_0xdc8[i] -= field_0xd28[i]->getFrameMax(); } field_0xd28[i]->setFrame(field_0xdc8[i]); mMapScreen[i]->animation(); +#endif } } } @@ -277,7 +282,9 @@ bool dMenu_DmapBg_c::iconScaleAnm() { return true; } - f32 dVar7 = fopMsgM_valueIncrease(field_0xdd1, field_0xdd2, 4); + IF_DUSK(dusk::vdt::advance_toward_frame(field_0xdd2, field_0xdd1, 1.0f)); + f32 dVar7 = DUSK_IF_ELSE(dusk::vdt::present_sine_ease(field_0xdd1, field_0xdd2), + fopMsgM_valueIncrease(field_0xdd1, field_0xdd2, 4)); f32 dVar8; f32 dVar1; if (field_0xdac > field_0xdb0) { @@ -291,7 +298,7 @@ bool dMenu_DmapBg_c::iconScaleAnm() { iconScale(1, dVar7, dVar8, dVar1); - field_0xdd2++; + IF_NOT_DUSK(field_0xdd2++); if (field_0xdd2 >= field_0xdd1) { rv = true; } @@ -923,8 +930,8 @@ void dMenu_DmapBg_c::addGoldFrameAlphaRate() { rate = 1.0f; setGoldAnimation(true); } else { - field_0xdd7++; - if (field_0xdd7 == g_fmapHIO.mDisplayFrameNum) { + DUSK_IF_ELSE(field_0xdd7 += dusk::game_clock::original_frames(), field_0xdd7++); + if (field_0xdd7 DUSK_IF_ELSE(>=, ==) g_fmapHIO.mDisplayFrameNum) { setGoldAnimation(true); } rate = (f32)(field_0xdd7 * field_0xdd7) / (f32)(g_fmapHIO.mDisplayFrameNum * g_fmapHIO.mDisplayFrameNum); @@ -1217,7 +1224,7 @@ void dMenu_DmapBg_c::update() { } if (mpBackTexture != NULL && field_0xdbc < 255.0f) { - field_0xdbc += 25.5f; + field_0xdbc += 25.5f IF_DUSK(* dusk::game_clock::original_frames()); if (field_0xdbc > 255.0f) { field_0xdbc = 255.0f; } @@ -1647,6 +1654,7 @@ void dMenu_Dmap_c::getIconPos(s8 i_floorNo, f32 param_2) { } dMenu_Dmap_c::~dMenu_Dmap_c() { + IF_DUSK(dusk::interp::erase_owned_samples(this)); s32 iVar2 = field_0xe8->getTotalFreeSize(); s32 iVar4 = field_0xe8->getTotalFreeSize(); @@ -2008,7 +2016,7 @@ void dMenu_Dmap_c::_move() { var_f31 = 0.70588237f; } - cLib_addCalc2(&field_0x110, var_f31, 0.4f, 0.5f); + DUSK_IF_ELSE(dusk::vdt::present_addCalc2, cLib_addCalc2)(&field_0x110, var_f31, 0.4f, 0.5f IF_DUSK_ARG(0.1f)); mpDrawBg->mpBlack->setAlphaRate(field_0x110); } @@ -2024,9 +2032,10 @@ void dMenu_Dmap_c::_move() { setMapTexture(); mapBgAnime(); mpDrawBg->calcCursor(); - mpDrawBg->addGoldFrameAlphaRate(); + IF_NOT_DUSK(mpDrawBg->addGoldFrameAlphaRate()); mDoExt_setCurrentHeap(prev_heap); + IF_DUSK(dusk::interp::capture_menu_values(this, field_0x104, field_0x108, field_0x10c)); } void dMenu_Dmap_c::setMapTexture() { @@ -2035,13 +2044,13 @@ void dMenu_Dmap_c::setMapTexture() { } void dMenu_Dmap_c::mapBgAnime() { - mpDrawBg->mapScreenAnime(); + IF_NOT_DUSK(mpDrawBg->mapScreenAnime()); } void dMenu_Dmap_c::mapControl() { u8 temp_r27 = field_0x17e; if (m_process == 0 || field_0x183 == 0) { - mMapCtrl->move(); + IF_NOT_DUSK(mMapCtrl->move()); getIconPos(mMapCtrl->getDispFloorNo(), mMapCtrl->getMapBlendPer()); getIconPos(mMapCtrl->getDispFloor2No(), 1.0f - mMapCtrl->getMapBlendPer()); @@ -2067,6 +2076,7 @@ void dMenu_Dmap_c::mapControl() { if (stick_value >= sp28 && field_0x181 != 2) { var_r28 = true; +#if !TARGET_PC f32 var_f31 = mMapCtrl->getStageMapSizeX(); if (var_f31 < mMapCtrl->getStageMapSizeZ()) { var_f31 = mMapCtrl->getStageMapSizeZ(); @@ -2084,9 +2094,10 @@ void dMenu_Dmap_c::mapControl() { f32 sp14 = temp_f28 * cM_scos(stick_angle); mMapCtrl->setPlusZoomCenterX(IF_DUSK(dusk::getSettings().game.enableMirrorMode ? -sp18 :) sp18); mMapCtrl->setPlusZoomCenterZ(sp14); +#endif } - mMapCtrl->move(); + IF_NOT_DUSK(mMapCtrl->move()); getIconPos(mMapCtrl->getDispFloorNo(), mMapCtrl->getMapBlendPer()); getIconPos(mMapCtrl->getDispFloor2No(), 1.0f - mMapCtrl->getMapBlendPer()); @@ -2186,6 +2197,7 @@ bool dMenu_Dmap_c::isOpen() { mpDrawBg->setAllAlphaRate(field_0x10c, var_r27); mpDrawBg->setGoldFrameAlphaRate(0.0f); + IF_DUSK(dusk::interp::capture_menu_values(this, field_0x104, field_0x108, field_0x10c)); return var_r28; } @@ -2225,14 +2237,159 @@ bool dMenu_Dmap_c::isClose() { field_0x10c = temp_f31; mpDrawBg->setAllAlphaRate(field_0x10c, var_r29); mpDrawBg->decGoldFrameAlphaRate(); + IF_DUSK(dusk::interp::capture_menu_values(this, field_0x104, field_0x108, field_0x10c)); return var_r30; } -void dMenu_Dmap_c::_draw() { - if (mMapCtrl != NULL) { - mMapCtrl->draw(); +#if TARGET_PC +void dMenu_Dmap_c::presentAnims() { + if (mMapCtrl == NULL || mpDrawBg == NULL) { + return; + } + for (int i = 0; i < 8; ++i) { + mSelFloor[i]->presentAnime(); + } + for (int i = 0; i < 3; ++i) { + field_0x88[i]->presentAnime(); + } + + if (field_0x10c == 1.0f) { + mpDrawBg->addGoldFrameAlphaRate(); + + if (0.0f == mpDrawBg->field_0xd94 && 0.0f == mpDrawBg->field_0xd98) { + for (int i = 0; i < 1; i++) { + dusk::vdt::present_looping(mpDrawBg->field_0xdc8[i], mpDrawBg->field_0xd28[i], + 0.4f); + mpDrawBg->mMapScreen[i]->animation(); + } + } + mpDrawBg->clearIconInfo(); + presentMapView(); + if (field_0x17e == 1 || field_0x17e == 2) { + mpDrawBg->iconScaleAnm(); + } + } + + presentLayoutAnims(); +} + +void dMenu_Dmap_c::presentLayoutAnims() { + mpDrawBg->setAllTrans(field_0x104, field_0x108); + + if (mpDrawBg->mpBackTexture != NULL) { + f32 var_f31 = 100.0f * mpDrawBg->field_0xd88; + f32 sp24 = mpDrawBg->field_0xd80 / var_f31; + f32 sp20 = mpDrawBg->field_0xd84 / var_f31; + + const ResTIMG* back_timg = mpDrawBg->mpBackTexture->getTexture(0)->getTexInfo(); + field_0x13c = mMapCtrl->getPixelStageSizeX(); + field_0x140 = mMapCtrl->getPixelStageSizeZ(); + field_0x134 = mMapCtrl->getPixelCenterX(); + field_0x138 = mMapCtrl->getPixelCenterZ(); + + f32 temp_f30; + f32 var_f29; + f32 var_f27; + if (field_0x13c > field_0x140) { + temp_f30 = back_timg->width * var_f31; + var_f29 = mMapCtrl->getStageMapSizeX(); + var_f27 = field_0x13c * (temp_f30 / var_f29); + } else { + temp_f30 = back_timg->height * var_f31; + var_f29 = mMapCtrl->getStageMapSizeZ(); + var_f27 = field_0x140 * (temp_f30 / var_f29); + } + + f32 sp1C[2]; + sp1C[0] = var_f27; + sp1C[1] = var_f27; + + f32 sp14[2]; + sp14[0] = -(field_0x134 + (100.0f * (sp24 * mMapCtrl->getPixelPerCm()))); + sp14[1] = -(field_0x138 + 100.0f * (sp20 * mMapCtrl->getPixelPerCm())); + + CPaneMgr sp70; + //!@bug It's unclear what this is supposed to be, but a stack pointer being converted to a bool is probably not intended. + u8 sp40[0x30]; + Vec sp34 = sp70.getGlobalVtxCenter(mpDrawBg->getMapPane(), (bool)sp40, 0); + mpDrawBg->mpBackTexture->move(sp14[0] + (sp34.x - (sp1C[0] / 2)), + sp14[1] + (sp34.y - (sp1C[1] / 2))); + mpDrawBg->mpBackTexture->resize(sp1C[0], sp1C[1]); + } +} + +void dMenu_Dmap_c::presentMapView() { + const bool can_stick_scroll = m_process != 0 && field_0x183 != 0 && mMapCtrl->isEndZoomIn(); + f32 disp_center_x = mMapCtrl->getDispCenterX(); + f32 disp_center_z = mMapCtrl->getDispCenterZ(); + bool scrolled = false; + if (can_stick_scroll) { + f32 sp28 = g_fmapHIO.mScrollSpeedSlowBound < g_fmapHIO.mScrollSpeedFastBound ? + g_fmapHIO.mScrollSpeedSlowBound : + g_fmapHIO.mScrollSpeedFastBound; + f32 sp24 = g_fmapHIO.mScrollSpeedSlowBound > g_fmapHIO.mScrollSpeedFastBound ? + g_fmapHIO.mScrollSpeedSlowBound : + g_fmapHIO.mScrollSpeedFastBound; + f32 stick_value = mpCStick->getValueStick(); + s16 stick_angle = mpCStick->getAngleStick(); + if (stick_value >= sp28 && field_0x181 != 2) { + scrolled = true; + f32 var_f31 = mMapCtrl->getStageMapSizeX(); + if (var_f31 < mMapCtrl->getStageMapSizeZ()) { + var_f31 = mMapCtrl->getStageMapSizeZ(); + } + f32 var_f29 = stick_value < sp24 ? g_fmapHIO.mScrollSpeedDungeonMapSlow : + g_fmapHIO.mScrollSpeedDungeonMapFast; + f32 temp_f28 = (var_f29 / 100.0f) * var_f31 * dusk::game_clock::original_frames(); + f32 sp18 = temp_f28 * cM_ssin(stick_angle); + f32 sp14 = temp_f28 * cM_scos(stick_angle); + mMapCtrl->setPlusZoomCenterX(dusk::getSettings().game.enableMirrorMode ? -sp18 : sp18); + mMapCtrl->setPlusZoomCenterZ(sp14); + } + } + mMapCtrl->move(); + if (can_stick_scroll) { + if (scrolled && (disp_center_x != mMapCtrl->getDispCenterX() || + disp_center_z != mMapCtrl->getDispCenterZ())) + { + Z2GetAudioMgr()->seStartLevel(Z2SE_SY_MAP_SCROLL, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); + } + if (mpDrawBg->mpMeterHaihai != NULL && isMapMoveState() && + (getCMessageNum() == 0x37B || getCMessageNum() == 0x569)) + { + mpDrawBg->field_0xdda = 0; + if (mMapCtrl->getDispCenterX() > mMapCtrl->getZoomCenterMinX()) { + mpDrawBg->field_0xdda |= 1; + } + if (mMapCtrl->getDispCenterX() < mMapCtrl->getZoomCenterMaxX()) { + mpDrawBg->field_0xdda |= 4; + } + if (mMapCtrl->getDispCenterZ() > mMapCtrl->getZoomCenterMinZ()) { + mpDrawBg->field_0xdda |= 8; + } + if (mMapCtrl->getDispCenterZ() < mMapCtrl->getZoomCenterMaxZ()) { + mpDrawBg->field_0xdda |= 2; + } + mpDrawBg->mpMeterHaihai->_execute(0); + } + } + getIconPos(mMapCtrl->getDispFloorNo(), mMapCtrl->getMapBlendPer()); + getIconPos(mMapCtrl->getDispFloor2No(), 1.0f - mMapCtrl->getMapBlendPer()); +} +#endif + +void dMenu_Dmap_c::_draw() { + IF_DUSK(dusk::interp::ScopedMenuValues pose(this, field_0x104, field_0x108, field_0x10c)); + if (mMapCtrl != NULL) { + IF_NOT_DUSK(mMapCtrl->draw()); if (mpDrawBg != NULL) { +#if TARGET_PC + if (dusk::game_clock::is_presentation_frame()) { + presentAnims(); + mpDrawBg->setAllAlphaRate(field_0x10c, false); + } +#else mpDrawBg->setAllTrans(field_0x104, field_0x108); if (mpDrawBg->mpBackTexture != NULL) { @@ -2284,7 +2441,13 @@ void dMenu_Dmap_c::_draw() { } dComIfGd_set2DOpa(mpDrawBg); +#endif } + +#if TARGET_PC + mMapCtrl->draw(); + dComIfGd_set2DOpa(mpDrawBg); +#endif } } @@ -2759,7 +2922,7 @@ void dMenu_Dmap_c::zoomIn_init_proc() { void dMenu_Dmap_c::zoomIn_proc() { bool temp_r30 = mMapCtrl->isEndZoomIn(); - bool temp_r29 = mpDrawBg->iconScaleAnm(); + bool temp_r29 = DUSK_IF_ELSE(mpDrawBg->field_0xdd2 >= mpDrawBg->field_0xdd1, mpDrawBg->iconScaleAnm()); bool temp_r28 = true; if (temp_r30 == true && temp_r29 == true && temp_r28 == true) { @@ -2775,7 +2938,7 @@ void dMenu_Dmap_c::zoomIn_proc() { void dMenu_Dmap_c::zoomOut_init_proc() { #if TARGET_PC if (dusk::interp::is_enabled()) { - mpDrawBg->resetScrollArrowMask(); + mpDrawBg->field_0xdda = 0; } #endif Z2GetAudioMgr()->seStart(Z2SE_SY_MAP_ZOOMOUT, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); @@ -2793,7 +2956,7 @@ void dMenu_Dmap_c::zoomOut_init_proc() { void dMenu_Dmap_c::zoomOut_proc() { bool temp_r30 = mMapCtrl->isEndZoomOut(); - bool temp_r29 = mpDrawBg->iconScaleAnm(); + bool temp_r29 = DUSK_IF_ELSE(mpDrawBg->field_0xdd2 >= mpDrawBg->field_0xdd1, mpDrawBg->iconScaleAnm()); bool temp_r28 = true; if (temp_r30 == true && temp_r29 == true && temp_r28 == true) { diff --git a/src/d/d_menu_dmap_map.cpp b/src/d/d_menu_dmap_map.cpp index b0be1dbf4b..3abb6c13c1 100644 --- a/src/d/d_menu_dmap_map.cpp +++ b/src/d/d_menu_dmap_map.cpp @@ -13,7 +13,7 @@ #include "m_Do/m_Do_graphic.h" #if TARGET_PC -#include +#include "dusk/interp/user_interface.h" #endif struct dMdm_HIO_prm_res_dst_s { @@ -462,7 +462,7 @@ void dMenu_StageMapCtrl_c::setPlusNowStayFloorNo(s8 param_0, u8 param_1) { } void dMenu_StageMapCtrl_c::moveFloor() { - if ((field_0xf3 == 0) && (field_0xf1 == 0)) { + if ((field_0xf3 DUSK_IF_ELSE(<= , ==) 0) && (field_0xf1 DUSK_IF_ELSE(<= , ==) 0)) { if (field_0xea != 0) { field_0xf3 = field_0xf0; field_0x90 = 0.0f; @@ -489,7 +489,7 @@ void dMenu_StageMapCtrl_c::moveFloor() { field_0xea = 0; } - } else if (field_0xf1 != 0 && field_0xea != 0) { + } else if (field_0xf1 DUSK_IF_ELSE(>, !=) 0 && field_0xea != 0) { if (field_0xea > 0) { if (field_0xe7 < field_0xed) { if ((field_0xe7 == std::floor(field_0xc4) && field_0xe8 == field_0xe7 + field_0xea) || field_0x90 > 0.5f) { @@ -521,22 +521,22 @@ void dMenu_StageMapCtrl_c::moveFloor() { field_0xeb = field_0xe7; } - if (field_0xf1 != 0) { + if (field_0xf1 DUSK_IF_ELSE(>, !=) 0) { f32 temp_f31 = (f32)(field_0xf0 - field_0xf3) / (f32)field_0xf0; field_0xeb = getFloorNo(field_0xc4); field_0xec = getFloorNo(field_0xc0); field_0x90 = getBlendPer(temp_f31 - std::floor(temp_f31)); - field_0xf1--; - if (field_0xf1 == 0) { + DUSK_IF_ELSE(dusk::vdt::advance_toward_frame(field_0xf1, 0.0f, 1.0f), field_0xf1--); + if (field_0xf1 DUSK_IF_ELSE(<=, ==) 0) { field_0xe8 = field_0xe7; } } - if (field_0xf3 != 0) { - field_0xf3--; - if (field_0xf3 != 0 && field_0xf1 != 0) { + if (field_0xf3 DUSK_IF_ELSE(>, !=) 0) { + DUSK_IF_ELSE(dusk::vdt::advance_toward_frame(field_0xf3, 0.0f, 1.0f), field_0xf3--); + if (field_0xf3 DUSK_IF_ELSE(>, !=) 0 && field_0xf1 DUSK_IF_ELSE(>, !=) 0) { f32 temp_f30 = (f32)(field_0xf0 - field_0xf3) / (f32)field_0xf0; field_0xeb = getFloorNo(field_0xc4); field_0xec = getFloorNo(field_0xc0); @@ -805,12 +805,14 @@ void dMenu_StageMapCtrl_c::zoomCalcSet(f32 param_0) { } void dMenu_StageMapCtrl_c::zoomIn_proc() { - f32 temp_f1 = fopMsgM_valueIncrease(field_0xf2, field_0xf2 - field_0xf4, 4); + IF_DUSK(dusk::vdt::advance_toward_frame(field_0xf4, 0.0f, 1.0f)); + f32 temp_f1 = DUSK_IF_ELSE(dusk::vdt::present_sine_ease(field_0xf2, field_0xf2 - field_0xf4), + fopMsgM_valueIncrease(field_0xf2, field_0xf2 - field_0xf4, 4)); field_0xd8 = temp_f1; zoomCalcSet(temp_f1); - field_0xf4--; - if (field_0xf4 < 0) { + IF_NOT_DUSK(field_0xf4--); + if (field_0xf4 DUSK_IF_ELSE(<=, <) 0) { field_0xf5 = 2; } } @@ -844,7 +846,7 @@ void dMenu_StageMapCtrl_c::zoomWait_init_proc() { } bool dMenu_DmapMapCtrl_c::isEnableZoomMove() const { - return field_0xf3 == 0 && (!getDisableZoomMoveFlgX() || !getDisableZoomMoveFlgZ()); + return field_0xf3 DUSK_IF_ELSE(<=, ==) 0 && (!getDisableZoomMoveFlgX() || !getDisableZoomMoveFlgZ()); } void dMenu_StageMapCtrl_c::zoomWait_proc() { @@ -888,12 +890,14 @@ void dMenu_StageMapCtrl_c::zoomOut_init_proc() { } void dMenu_StageMapCtrl_c::zoomOut_proc() { - f32 temp_f1 = fopMsgM_valueIncrease(field_0xf2, field_0xf2 - field_0xf4, 4); + IF_DUSK(dusk::vdt::advance_toward_frame(field_0xf4, 0.0f, 1.0f)); + f32 temp_f1 = DUSK_IF_ELSE(dusk::vdt::present_sine_ease(field_0xf2, field_0xf2 - field_0xf4), + fopMsgM_valueIncrease(field_0xf2, field_0xf2 - field_0xf4, 4)); zoomCalcSet(1.0f - temp_f1); field_0xd8 = 1.0f - temp_f1; - field_0xf4--; - if (field_0xf4 < 0) { + IF_NOT_DUSK(field_0xf4--); + if (field_0xf4 DUSK_IF_ELSE(<=, <) 0) { field_0xf5 = 0; } } @@ -991,7 +995,7 @@ void dMenu_StageMapCtrl_c::_delete() { bool dMenu_StageMapCtrl_c::isEnableZoomIn() { bool var_r30 = 0; - if (field_0xf3 == 0 && dStage_roomControl_c::getFileList2(field_0xe6) != NULL) { + if (field_0xf3 DUSK_IF_ELSE(<=, ==) 0 && dStage_roomControl_c::getFileList2(field_0xe6) != NULL) { var_r30 = 1; } @@ -999,7 +1003,7 @@ bool dMenu_StageMapCtrl_c::isEnableZoomIn() { } bool dMenu_StageMapCtrl_c::isEnableZoomOut() { - return field_0xf3 == 0; + return field_0xf3 DUSK_IF_ELSE(<=, ==) 0; } void dMenu_StageMapCtrl_c::setPlusZoomCenterX(f32 param_0) { diff --git a/src/d/d_menu_fmap.cpp b/src/d/d_menu_fmap.cpp index 57c329a61f..2dd1ba72f7 100644 --- a/src/d/d_menu_fmap.cpp +++ b/src/d/d_menu_fmap.cpp @@ -24,7 +24,10 @@ #include "d/actor/d_a_midna.h" #if TARGET_PC +#include "dusk/game_clock.h" #include "dusk/interp/frame_interpolation.h" +#include "dusk/interp/menus.h" +#include "dusk/interp/user_interface.h" #include "dusk/memory.h" #include "dusk/version.hpp" #include "helpers/string.hpp" @@ -276,6 +279,7 @@ dMenu_Fmap_c::dMenu_Fmap_c(JKRExpHeap* i_heap, STControl* i_stick, CSTControl* i } dMenu_Fmap_c::~dMenu_Fmap_c() { + IF_DUSK(dusk::interp::erase_owned_samples(this)); mpHeap->getTotalFreeSize(); if (mpFieldDat != NULL) { mpHeap->free(mpFieldDat); @@ -500,22 +504,25 @@ void dMenu_Fmap_c::_move() { mpDraw2DBack->clearIconInfo(); (this->*move_process[mProcess])(); - - mpDraw2DTop->_execute(); + + IF_NOT_DUSK(mpDraw2DTop->_execute()); mpDraw2DBack->setBaseBackAlpha(g_fmHIO.mBaseBackAlpha); - mpDraw2DBack->btkAnimeLoop(g_fmHIO.mBackAnimeStep); + IF_NOT_DUSK(mpDraw2DBack->btkAnimeLoop(g_fmHIO.mBackAnimeStep)); mpDraw2DTop->setMoyaAlpha(g_fmHIO.mMoyaAlpha); - mpDraw2DTop->btkAnimeLoop(g_fmHIO.mTopAnimeStep); + IF_NOT_DUSK(mpDraw2DTop->btkAnimeLoop(g_fmHIO.mTopAnimeStep)); if (mProcess != process) { (this->*init_process[mProcess])(); + IF_DUSK(dusk::interp::erase_owned_samples(this)); } +#if !TARGET_PC if (mProcess == PROC_PORTAL_WARP_FORBID) { mpDraw2DBack->calcBackAlpha(true); } else { mpDraw2DBack->calcBackAlpha(false); } +#endif mpDraw2DBack->setAllTrans(mTransX, mTransY); mpDraw2DTop->setAllTrans(mTransX, mTransY); @@ -524,6 +531,7 @@ void dMenu_Fmap_c::_move() { drawDebugStage(); } +#if !TARGET_PC if (mSpotTextureFadeAlpha != 1.0f) { cLib_addCalc2(&mSpotTextureFadeAlpha, 1.0f, 0.4f, 0.5f); if (fabsf(mSpotTextureFadeAlpha - 1.0f) < 0.1f) { @@ -531,6 +539,7 @@ void dMenu_Fmap_c::_move() { } mpDraw2DBack->setSpotTextureFadeAlpha(mSpotTextureFadeAlpha); } +#endif #if TARGET_PC u8 region = mpDraw2DBack->getSelectRegion(); @@ -540,18 +549,41 @@ void dMenu_Fmap_c::_move() { mpDraw2DTop->mSelectRegionNo = 0xFF; } + dusk::interp::capture_menu_values(this, mTransX, mTransY, mAlphaRatio, field_0x1ec, mZoomLevel); #endif } void dMenu_Fmap_c::_draw() { + IF_DUSK(dusk::interp::ScopedMenuValues pose(this, mTransX, mTransY, mAlphaRatio, field_0x1ec)); if (mpDraw2DBack != NULL && mpDraw2DTop != NULL) { +#if TARGET_PC + if (dusk::game_clock::is_presentation_frame()) { + presentAnims(); + presentZoomView(); + mpDraw2DBack->setAllTrans(mTransX, mTransY); + mpDraw2DTop->setAllTrans(mTransX, mTransY); + mpDraw2DBack->setAllAlphaRate(mAlphaRatio, false); + mpDraw2DTop->setAllAlphaRate(mAlphaRatio, false); + mpDraw2DTop->setMoyaAlpha(g_fmHIO.mMoyaAlpha); + if (field_0x305) { + mpMenuFmapMap->presentRendering(mpWorldData, mStartStageNo, + mpDraw2DBack->getRenderingPosX(), + mpDraw2DBack->getRenderingPosZ(), + mpDraw2DBack->getRenderingScale(), + mpDraw2DBack->getMapZoomRate()); + } + mpDraw2DBack->clearIconInfo(); + } +#endif if (field_0x305) { + IF_DUSK_BLOCK(dusk::game_clock::is_sim_frame()) mpMenuFmapMap->setRendering(mpWorldData, mStartStageNo, mpDraw2DBack->getRenderingPosX(), mpDraw2DBack->getRenderingPosZ(), mpDraw2DBack->getRenderingScale(), mpDraw2DBack->getMapZoomRate()); mpDraw2DBack->setStageInfo(mSpotNum, mpMenuFmapMap); + IF_DUSK_BLOCK_END drawIcon(field_0x1ec, false); if (mProcess == PROC_ZOOM_REGION_TO_SPOT || mProcess == PROC_ZOOM_SPOT_TO_REGION || mProcess == PROC_YAMIBOSS_DEMO4 || mProcess == PROC_LIGHT_DEMO1 @@ -563,7 +595,7 @@ void dMenu_Fmap_c::_draw() { } else { drawPortalIcon(); if (mProcess == PROC_ZOOM_ALL_TO_REGION || mProcess == PROC_ZOOM_REGION_TO_ALL) { - f32 scale = 1.0f - (f32)mZoomLevel / 10.0f; + f32 scale = 1.0f - DUSK_IF_ELSE(getRenderZoomLevel(), (f32)mZoomLevel) / 10.0f; mpDraw2DBack->iconScale(0, scale, scale, 1.0f - scale); } } @@ -574,6 +606,66 @@ void dMenu_Fmap_c::_draw() { } } +#if TARGET_PC +void dMenu_Fmap_c::presentAnims() { + if (mAlphaRatio == 1.0f) { + if (mProcess == PROC_ALL_MAP) { + mpDraw2DBack->allmap_move2(mpStick); + } else if (mProcess == PROC_REGION_MAP) { + mpDraw2DBack->regionMapMove(mpStick); + } else if (mProcess == PROC_SPOT_MAP) { + mpDraw2DBack->stageMapMove(mpStick, 1, true); + } else if (mProcess == PROC_PORTAL_WARP_MAP || mProcess == PROC_PORTAL_DEMO5) { + mpDraw2DBack->regionMapMove(mpStick); + } + + mpDraw2DTop->_execute(); + mpDraw2DBack->calcBackAlpha(mProcess == PROC_PORTAL_WARP_FORBID); + if (mSpotTextureFadeAlpha != 1.0f) { + dusk::vdt::present_addCalc2(&mSpotTextureFadeAlpha, 1.0f, 0.4f, 0.5f, 0.1f); + mpDraw2DBack->setSpotTextureFadeAlpha(mSpotTextureFadeAlpha); + } + } + if (mpDraw2DBack != NULL && mpDraw2DTop != NULL) { + mpDraw2DBack->btkAnimeLoop(g_fmHIO.mBackAnimeStep); + mpDraw2DTop->btkAnimeLoop(g_fmHIO.mTopAnimeStep); + mpDraw2DTop->setMoyaAlpha(g_fmHIO.mMoyaAlpha); + } +} + +void dMenu_Fmap_c::presentZoomView() { + const f32 zoomLevel = getRenderZoomLevel(); + switch (mProcess) { + case PROC_ZOOM_ALL_TO_REGION: + case PROC_ZOOM_REGION_TO_ALL: + case PROC_PORTAL_DEMO1: + case PROC_PORTAL_DEMO3: + mpDraw2DBack->zoomMapCalc(std::clamp(zoomLevel / 10.0f, 0.0f, 1.0f)); + break; + case PROC_TABLE_DEMO1: + if (zoomLevel > 0) { + mpDraw2DBack->zoomMapCalc(zoomLevel / 10.0f); + } + break; + case PROC_ZOOM_REGION_TO_SPOT: + case PROC_ZOOM_SPOT_TO_REGION: + case PROC_YAMIBOSS_DEMO4: + mpDraw2DBack->zoomMapCalc2(field_0x1ec); + break; + case PROC_TABLE_DEMO2: + case PROC_HOWL_DEMO1: + if (zoomLevel > 0) { + mpDraw2DBack->zoomMapCalc2(field_0x1ec); + } + break; + } +} + +f32 dMenu_Fmap_c::getRenderZoomLevel() const { + return dusk::interp::get(this).values.read(4, (f32)mZoomLevel); +} +#endif + u8 dMenu_Fmap_c::getNextStatus(u8* param_0) { u8 ret = 8; *param_0 = 0; @@ -774,9 +866,9 @@ void dMenu_Fmap_c::all_map_proc() { } } else { u8 region1 = mpDraw2DBack->getSelectRegion(); - mpDraw2DBack->allmap_move2(mpStick); + IF_NOT_DUSK(mpDraw2DBack->allmap_move2(mpStick)); u8 region2 = mpDraw2DBack->getSelectRegion(); - if (region1 != region2 || mResetAreaName) { + if (DUSK_IF_ELSE(region_change, region1 != region2) || mResetAreaName) { mResetAreaName = false; if (mpDraw2DBack->getSelectRegion() != 0xff && mpDraw2DBack->isShowRegion(mpDraw2DBack->getSelectRegion())) @@ -932,7 +1024,7 @@ void dMenu_Fmap_c::region_map_proc() { if (g_fmapHIO.mDisplayReferenceArea) { mpDraw2DBack->zoomMapCalc(1.0f); } - mpDraw2DBack->regionMapMove(mpStick); + IF_NOT_DUSK(mpDraw2DBack->regionMapMove(mpStick)); int stage_no, room_no; f32 pos_x = mpDraw2DBack->getArrowPos2DX() - mDoGph_gInf_c::getMinXF() @@ -1151,9 +1243,8 @@ void dMenu_Fmap_c::zoom_spot_to_region_init() { mZoomLevel = 10; field_0x1ec = 1.0f; #if TARGET_PC - // Frame interp note: field_0x122d used to be set every draw, causing flickering. Do it here instead. if (dusk::interp::is_enabled()) { - mpDraw2DBack->resetScrollArrowMask(); + mpDraw2DBack->field_0x122d = 0; } #endif Z2GetAudioMgr()->seStart(Z2SE_SY_MAP_ZOOMOUT, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); @@ -1215,7 +1306,7 @@ void dMenu_Fmap_c::spot_map_proc() { } else if (dMw_A_TRIGGER() && !dMeter2Info_isTouchKeyCheck(0xc) && dMeter2Info_getMeterClass()->getMeterDrawPtr()->getInsideObjCheck() != 1) { - mpDraw2DBack->stageMapMove(mpStick, 1, true); + IF_NOT_DUSK(mpDraw2DBack->stageMapMove(mpStick, 1, true)); } else if (dMw_Z_TRIGGER() && mpDraw2DTop->isWarpAccept()) { #if TARGET_PC || VERSION >= VERSION_GCN_JPN IF_DUSK_BLOCK(dusk::version::isRegionJpn()) @@ -1264,7 +1355,7 @@ void dMenu_Fmap_c::spot_map_proc() { mpDraw2DBack->zoomMapCalc2(field_0x1ec); } - mpDraw2DBack->stageMapMove(mpStick, 1, true); + IF_NOT_DUSK(mpDraw2DBack->stageMapMove(mpStick, 1, true)); int stage_no, room_no; f32 pos_x = mpDraw2DBack->getMapAreaGlobalCenterPosX() - mDoGph_gInf_c::getMinXF() @@ -1758,6 +1849,10 @@ bool dMenu_Fmap_c::isOpen() { mpDraw2DTop->setAllAlphaRate(mAlphaRatio, init); mpDraw2DBack->setSpotTextureFadeAlpha(mSpotTextureFadeAlpha); +#if TARGET_PC + mpDraw2DTop->setMoyaAlpha(g_fmHIO.mMoyaAlpha); + dusk::interp::capture_menu_values(this, mTransX, mTransY, mAlphaRatio, field_0x1ec, mZoomLevel); +#endif return ret; } @@ -1799,6 +1894,10 @@ bool dMenu_Fmap_c::isClose() { mpDraw2DTop->setAllTrans(mTransX, mTransY); mpDraw2DTop->setAllAlphaRate(mAlphaRatio, bVar2); +#if TARGET_PC + mpDraw2DTop->setMoyaAlpha(g_fmHIO.mMoyaAlpha); + dusk::interp::capture_menu_values(this, mTransX, mTransY, mAlphaRatio, field_0x1ec, mZoomLevel); +#endif return ret; } @@ -2475,7 +2574,7 @@ void dMenu_Fmap_c::setAreaNameZero() { } void dMenu_Fmap_c::portalWarpMapMove(STControl* i_stick) { - mpDraw2DBack->regionMapMove(i_stick); + IF_NOT_DUSK(mpDraw2DBack->regionMapMove(i_stick)); dMenu_Fmap_portal_data_c* portal_dat = mpPortalDat; dMenu_Fmap_portal_data_c::data* portals = portal_dat->mData; f32 arrow_x = mpDraw2DBack->getArrowPos2DX(); diff --git a/src/d/d_menu_fmap2D.cpp b/src/d/d_menu_fmap2D.cpp index 58db87ee68..2c87c13cf3 100644 --- a/src/d/d_menu_fmap2D.cpp +++ b/src/d/d_menu_fmap2D.cpp @@ -20,7 +20,9 @@ #include #if TARGET_PC +#include "dusk/game_clock.h" #include "dusk/interp/frame_interpolation.h" +#include "dusk/interp/user_interface.h" #include "dusk/ui/touch_controls.hpp" #include "dusk/version.hpp" @@ -358,10 +360,8 @@ void dMenu_Fmap2DBack_c::draw() { scrollAreaDraw(); } - IF_DUSK_BLOCK(dusk::interp::get_ui_tick_pending()) blinkMove(30); moveLightDropAnime(); - IF_DUSK_BLOCK_END setCenterPosX(field_0x11dc, 1); drawIcon(mTransX, mTransZ, mAlphaRate, field_0xfa8 * mSpotTextureFadeAlpha); @@ -396,13 +396,11 @@ void dMenu_Fmap2DBack_c::draw() { (mArrowPos3DZ + control_ypos + fVar3) - fVar5, &mArrowPos2DX, &mArrowPos2DY); - IF_DUSK_BLOCK(dusk::interp::get_ui_tick_pending()) - field_0x11e0 -= g_fmapHIO.mCursorSpeed; + field_0x11e0 -= g_fmapHIO.mCursorSpeed IF_DUSK(* dusk::game_clock::original_frames()); if (field_0x11e0 < 0.0f) { field_0x11e0 += 360.0f; } - IF_DUSK_BLOCK_END mpPointParent->getPanePtr()->rotate(mpPointParent->getSizeX() / 2.0f, mpPointParent->getSizeY() / 2.0f, ROTATE_Z, @@ -1017,8 +1015,8 @@ void dMenu_Fmap2DBack_c::allmap_move2(STControl* param_0) { } f32 speed = (sp24 / 100.0f) * zoomRate; - f32 delta_y = speed * cM_ssin(angle); - f32 delta_x = speed * cM_scos(angle); + f32 delta_y = speed * cM_ssin(angle) IF_DUSK(* dusk::game_clock::original_frames()); + f32 delta_x = speed * cM_scos(angle) IF_DUSK(* dusk::game_clock::original_frames()); #ifdef TARGET_PC if (dusk::getSettings().game.enableMirrorMode) { @@ -1862,7 +1860,10 @@ void dMenu_Fmap2DBack_c::calcBlink() { t * (g_fmapHIO.mMapBlink[i + 1].mUnselectedRegion.mBlinkSpeed - g_fmapHIO.mMapBlink[i].mUnselectedRegion.mBlinkSpeed); - IF_DUSK_BLOCK(dusk::interp::get_ui_tick_pending()) +#if TARGET_PC + dusk::vdt::advance_looping_frame(field_0x1218, 1.0f, selected_blink_speed); + dusk::vdt::advance_looping_frame(field_0x121a, 1.0f, unselected_blink_speed); +#else field_0x1218++; if (field_0x1218 >= selected_blink_speed) { field_0x1218 = 0; @@ -1872,7 +1873,7 @@ void dMenu_Fmap2DBack_c::calcBlink() { if (field_0x121a >= unselected_blink_speed) { field_0x121a = 0; } - IF_DUSK_BLOCK_END +#endif f32 t_selected = 0.0f; f32 t_unselected = 0.0f; @@ -1898,6 +1899,9 @@ void dMenu_Fmap2DBack_c::calcBlink() { } void dMenu_Fmap2DBack_c::calcBackAlpha(bool param_0) { +#if TARGET_PC + dusk::vdt::present_addCalc2(&mBackAlpha, param_0 ? 1.0f : 0.0f, 0.4f, 0.5f, 0.1f); +#else if (param_0) { if (mBackAlpha != 1.0f) { cLib_addCalc2(&mBackAlpha, 1.0f, 0.4f, 0.5f); @@ -1913,14 +1917,19 @@ void dMenu_Fmap2DBack_c::calcBackAlpha(bool param_0) { } } } +#endif } void dMenu_Fmap2DBack_c::btkAnimeLoop(f32 i_step) { if (mpBaseAnm) { +#if TARGET_PC + dusk::vdt::advance_looping_frame(mAnmFrame, i_step, mpBaseAnm->getFrameMax()); +#else mAnmFrame += i_step; if (mAnmFrame >= mpBaseAnm->getFrameMax()) { mAnmFrame -= mpBaseAnm->getFrameMax(); } +#endif mpBaseAnm->setFrame(mAnmFrame); } else { mAnmFrame = 0.0f; @@ -1964,8 +1973,8 @@ void dMenu_Fmap2DBack_c::regionMapMove(STControl* i_stick) { base_speed = g_fmapHIO.mScrollSpeedRegionFast; } f32 speed = base_speed / 100.0f * local_78; - f32 speed_y = speed * cM_ssin(angle); - f32 speed_x = speed * cM_scos(angle); + f32 speed_y = speed * cM_ssin(angle) IF_DUSK(* dusk::game_clock::original_frames()); + f32 speed_x = speed * cM_scos(angle) IF_DUSK(* dusk::game_clock::original_frames()); control_xpos += IF_DUSK(dusk::getSettings().game.enableMirrorMode ? -speed_y :) speed_y; control_ypos += speed_x; } @@ -2034,8 +2043,8 @@ void dMenu_Fmap2DBack_c::stageMapMove(STControl* i_stick, u8 param_1, bool param base_speed = g_fmapHIO.mScrollSpeedRegionZoomFast; } f32 speed = base_speed / 100.0f * local_78; - f32 speed_x = speed * cM_ssin(angle); - f32 speed_z = speed * cM_scos(angle); + f32 speed_x = speed * cM_ssin(angle) IF_DUSK(* dusk::game_clock::original_frames()); + f32 speed_z = speed * cM_scos(angle) IF_DUSK(* dusk::game_clock::original_frames()); mStageTransX += IF_DUSK(dusk::getSettings().game.enableMirrorMode ? -speed_x :) speed_x; mStageTransZ += speed_z; } else if (!param_2) { @@ -2841,10 +2850,14 @@ void dMenu_Fmap2DTop_c::draw() { void dMenu_Fmap2DTop_c::btkAnimeLoop(J2DAnmTextureSRTKey* i_anm, f32 i_delta) { if (i_anm) { +#if TARGET_PC + dusk::vdt::advance_looping_frame(mAnmFrame, i_delta, i_anm->getFrameMax()); +#else mAnmFrame += i_delta; if (mAnmFrame >= i_anm->getFrameMax()) { mAnmFrame -= i_anm->getFrameMax(); } +#endif i_anm->setFrame(mAnmFrame); } else { mAnmFrame = 0.0f; @@ -3103,9 +3116,9 @@ void dMenu_Fmap2DTop_c::setArrowAlphaRatio(u8 i_mask, f32 i_rate) { } void dMenu_Fmap2DTop_c::setAlphaAnimeMin(CPaneMgrAlpha* i_pane) { - s16 timer = i_pane->getAlphaTimer(); + DUSK_IF_ELSE(f32, s16) timer = i_pane->getAlphaTimer(); if (timer > 0 || i_pane->getAlphaRate() != 0.0f) { - timer--; + DUSK_IF_ELSE(timer -= dusk::game_clock::original_frames(), timer--); if (timer < 0) { timer = 0; } @@ -3115,12 +3128,24 @@ void dMenu_Fmap2DTop_c::setAlphaAnimeMin(CPaneMgrAlpha* i_pane) { } void dMenu_Fmap2DTop_c::setAlphaAnimeMid(CPaneMgrAlpha* i_pane) { - s16 timer = i_pane->getAlphaTimer(); + DUSK_IF_ELSE(f32, s16) timer = i_pane->getAlphaTimer(); if (timer != 3 || i_pane->getAlphaRate() != 0.25f) { if (timer > 3) { - timer--; +#if TARGET_PC + timer -= dusk::game_clock::original_frames(); + if (timer < 3) { + timer = 3; + } +#endif + IF_NOT_DUSK(timer--); } else if (timer < 3) { - timer++; +#if TARGET_PC + timer += dusk::game_clock::original_frames(); + if (timer > 3) { + timer = 3; + } +#endif + IF_NOT_DUSK(timer++); } i_pane->alphaAnimeStart(timer); i_pane->setAlphaRate(timer / 6.0f * 0.5f); @@ -3128,9 +3153,9 @@ void dMenu_Fmap2DTop_c::setAlphaAnimeMid(CPaneMgrAlpha* i_pane) { } void dMenu_Fmap2DTop_c::setAlphaAnimeMax(CPaneMgrAlpha* i_pane) { - s16 timer = i_pane->getAlphaTimer(); + DUSK_IF_ELSE(f32, s16) timer = i_pane->getAlphaTimer(); if (timer < 5 || i_pane->getAlphaRate() != 1.0f) { - timer++; + DUSK_IF_ELSE(timer += dusk::game_clock::original_frames(), timer++); if (timer > 5) { timer = 5; } diff --git a/src/d/d_menu_fmap_map.cpp b/src/d/d_menu_fmap_map.cpp index 8a3c34fbde..c1e96bc56a 100644 --- a/src/d/d_menu_fmap_map.cpp +++ b/src/d/d_menu_fmap_map.cpp @@ -11,7 +11,7 @@ #include #if TARGET_PC -#include +#include "dusk/interp/user_interface.h" #endif static u8 twoValueLineInterpolation(u8 i_value1, u8 i_value2, f32 i_param) { @@ -481,6 +481,10 @@ dMenu_FmapMap_c::~dMenu_FmapMap_c() { } void dMenu_FmapMap_c::_create(u16 i_texWidth, u16 i_texHeight, u16 param_2, u16 param_3, void* i_res) { +#if TARGET_PC + mResetFlashFrame = true; + mPaletteFrameInitialized = false; +#endif m_res = (dMfm_prm_res_s*)i_res; m_palette = m_res->palette_data; field_0xcc = 0x6c; @@ -508,10 +512,55 @@ void dMenu_FmapMap_c::_delete() { DUSK_GAME_DATA const dMfm_HIO_prm_res_src_s dMfm_HIO_prm_res_src_s::m_other = {30}; +#if TARGET_PC +void dMenu_FmapMap_c::presentAnims() { + const f32 duration = dMfm_HIO_prm_res_src_s::m_other.mFlashDuration; + if (mResetFlashFrame) { + mFlashFrame = 0.0f; + mResetFlashFrame = false; + } else { + dusk::vdt::advance_looping_frame(mFlashFrame, 1.0f, duration + 1.0f); + } + mFlashTimer = std::max(0.0f, duration - mFlashFrame); + + const int periods[] = {m_res->field_0x168, m_res->field_0x16a}; + for (int i = 0; i < 2; ++i) { + if (periods[i] <= 0) { + mPaletteFrame[i] = 0.0f; + } else if (!mPaletteFrameInitialized) { + mPaletteFrame[i] = g_Counter.mCounter0 % periods[i]; + } else { + dusk::vdt::advance_looping_frame(mPaletteFrame[i], 1.0f, periods[i]); + } + } + mPaletteFrameInitialized = true; +} + +void dMenu_FmapMap_c::presentRendering(dMenu_Fmap_world_data_c* i_worldData, int i_startStageNo, + f32 i_posX, f32 i_posY, f32 i_scale, f32 i_zoomRate) +{ + mZoomRate = i_zoomRate; + mpWorldData = i_worldData; + mStartStageNo = i_startStageNo; + mPosX = i_posX; + mPosZ = i_posY; + mCmPerTexel = i_scale; + field_0x8 = mCmPerTexel * field_0x20 * mDoGph_gInf_c::getScale(); + field_0xc = mCmPerTexel * field_0x22; +} +#endif + void dMenu_FmapMap_c::draw() { { int unused; } f32 f30 = 0.0f; +#if TARGET_PC + presentAnims(); + const f32 half = dMfm_HIO_prm_res_src_s::m_other.mFlashDuration / 2; + if (half > 0.0f) { + f30 = std::clamp(std::fabs(mFlashTimer - half) / half, 0.0f, 1.0f); + } +#else if (mFlashTimer < dMfm_HIO_prm_res_src_s::m_other.mFlashDuration / 2) { f30 = (int)(dMfm_HIO_prm_res_src_s::m_other.mFlashDuration / 2 - mFlashTimer) / @@ -521,16 +570,19 @@ void dMenu_FmapMap_c::draw() { (int)(mFlashTimer - dMfm_HIO_prm_res_src_s::m_other.mFlashDuration / 2) / (f32)(int)(dMfm_HIO_prm_res_src_s::m_other.mFlashDuration / 2); } +#endif setPointColor(1.0f - f30); GXColor color; f32 f31; - f31 = getRateWithFrameCount(m_res->field_0x168); + f31 = DUSK_IF_ELSE(dusk::vdt::clamped_fraction(mPaletteFrame[0], m_res->field_0x168), + getRateWithFrameCount(m_res->field_0x168)); f31 = cM_ssin(f31 * 0x10000 - 0x8000) * 0.5f + 0.5f; twoColorLineInterporation(m_res->field_0xd8, m_res->field_0xdc, f31, color); setFmapPaletteColor(PALETTE_19, color); - f31 = getRateWithFrameCount(m_res->field_0x16a); + f31 = DUSK_IF_ELSE(dusk::vdt::clamped_fraction(mPaletteFrame[1], m_res->field_0x16a), + getRateWithFrameCount(m_res->field_0x16a)); f31 = cM_ssin(f31 * 0x10000 - 0x8000) * 0.5f + 0.5f; twoColorLineInterporation(m_res->field_0xe0, m_res->field_0xe4, f31, color); setFmapPaletteColor(PALETTE_1A, color); @@ -681,15 +733,18 @@ void dMenu_FmapMap_c::setRendering(dMenu_Fmap_world_data_c* i_worldData, int i_s f32 i_posX, f32 i_posY, f32 i_scale, f32 i_zoomRate) { mZoomRate = i_zoomRate; if (mFlash != mLastFlash || mStageCursor != mLastStageCursor) { + IF_DUSK(mResetFlashFrame = true); mFlashTimer = dMfm_HIO_prm_res_src_s::m_other.mFlashDuration; mLastFlash = mFlash; mLastStageCursor = mStageCursor; } else { +#if !TARGET_PC if (mFlashTimer != 0) { mFlashTimer--; } else { mFlashTimer = dMfm_HIO_prm_res_src_s::m_other.mFlashDuration; } +#endif } entry(i_worldData, i_startStageNo, i_posX, i_posY, i_scale); } diff --git a/src/d/d_menu_insect.cpp b/src/d/d_menu_insect.cpp index 684dd1235c..828e39384d 100644 --- a/src/d/d_menu_insect.cpp +++ b/src/d/d_menu_insect.cpp @@ -23,6 +23,7 @@ #include #if TARGET_PC +#include "dusk/game_clock.h" #include "dusk/menu_pointer.h" #include "dusk/version.hpp" #endif @@ -164,6 +165,11 @@ void dMenu_Insect_c::_move() { void dMenu_Insect_c::_draw() { if (mpArchive != NULL) { +#if TARGET_PC + if (dusk::game_clock::is_presentation_frame()) { + mpExpParent->presentAnime(); + } +#endif J2DGrafContext* grafPort = dComIfGp_getCurrentGrafPort(); mpBlackTex->setAlpha(0xff); @@ -193,6 +199,7 @@ void dMenu_Insect_c::_draw() { // operations applied which cannot easily be reverse engineered mpSelect_c->translate(g_drawHIO.mInsectListScreen.mConfirmOptionPosX_4x3 + 486.0f, g_drawHIO.mInsectListScreen.mConfirmOptionPosY_4x3 + 209.0f); + IF_DUSK(mpSelect_c->presentAnims()); mpSelect_c->draw(0.0f, 0.0f); mpIconScreen->draw(0.0f, 0.0f, grafPort); } diff --git a/src/d/d_menu_item_explain.cpp b/src/d/d_menu_item_explain.cpp index e6134e6c8b..0ca70af9e7 100644 --- a/src/d/d_menu_item_explain.cpp +++ b/src/d/d_menu_item_explain.cpp @@ -26,6 +26,7 @@ #include "d/d_msg_scrn_arrow.h" #if TARGET_PC +#include "dusk/game_clock.h" #include "dusk/version.hpp" #endif @@ -355,6 +356,7 @@ void dMenu_ItemExplain_c::draw(J2DOrthoGraph* i_graph) { // were likely either chosen by hand or had multiple arithmetic // operations applied which cannot easily be reverse engineered mpSelect_c->translate(486.0f, 209.0f); + IF_DUSK(mpSelect_c->presentAnims()); mpSelect_c->draw(0.0f, 0.0f); } if (mpArrow != NULL) { @@ -443,7 +445,7 @@ void dMenu_ItemExplain_c::open_init() { } void dMenu_ItemExplain_c::open_proc() { - mAlphaRatio += 2.0f; + mAlphaRatio += 2.0f IF_DUSK(* dusk::game_clock::original_frames()); if (mAlphaRatio >= 201.0f) { mAlphaRatio = 201.0f; mStatus = 2; diff --git a/src/d/d_menu_letter.cpp b/src/d/d_menu_letter.cpp index a1349e9fe5..55a240abac 100644 --- a/src/d/d_menu_letter.cpp +++ b/src/d/d_menu_letter.cpp @@ -17,8 +17,9 @@ #include "d/d_msg_scrn_arrow.h" #include "d/d_lib.h" -#ifdef TARGET_PC +#if TARGET_PC #include "dusk/achievements.h" +#include "dusk/interp/user_interface.h" #include "dusk/menu_pointer.h" #include "dusk/ui/touch_controls.hpp" #include "dusk/version.hpp" @@ -29,9 +30,7 @@ static void enable_turn_page_controls(bool enabled) { dusk::ui::set_control_override(dusk::ui::Control::L, controlOverride); dusk::ui::set_control_override(dusk::ui::Control::R, controlOverride); } -#endif -#if TARGET_PC #define D_MENU_LETTER_LINE_MAX (dusk::version::isRegionJpn() ? 9 : 12) #elif VERSION == VERSION_GCN_JPN #define D_MENU_LETTER_LINE_MAX 9 @@ -226,6 +225,7 @@ void dMenu_Letter_c::_draw() { if (mpArchive == NULL) { return; } + IF_DUSK(presentAnims()); J2DGrafContext* grafContext = dComIfGp_getCurrentGrafPort(); u8 prevAlpha = mpBlackTex->getAlpha(); mpBlackTex->setAlpha(0xff); @@ -531,7 +531,7 @@ void dMenu_Letter_c::slide_right_init() { } void dMenu_Letter_c::slide_right_move() { - cLib_addCalc2(&field_0x358, 0.0f, 0.5f, 50.0f); + IF_NOT_DUSK(cLib_addCalc2(&field_0x358, 0.0f, 0.5f, 50.0f)); if (fabsf(field_0x358) < 0.1f) { field_0x358 = 0.0f; mProcess = 0; @@ -552,7 +552,7 @@ void dMenu_Letter_c::slide_left_init() { } void dMenu_Letter_c::slide_left_move() { - cLib_addCalc2(&field_0x358, 0.0f, 0.5f, 50.0f); + IF_NOT_DUSK(cLib_addCalc2(&field_0x358, 0.0f, 0.5f, 50.0f)); if (fabsf(field_0x358) < 0.1f) { field_0x358 = 0.0f; mProcess = 0; @@ -607,7 +607,7 @@ void dMenu_Letter_c::read_open_init() { void dMenu_Letter_c::read_open_move() { s16 openLetterFrame = g_drawHIO.mLetterSelectScreen.mOpenFrame[dMeter_drawLetterHIO_c::LETTER_FRAME]; - field_0x36a++; + IF_NOT_DUSK(field_0x36a++); if (field_0x36a >= openLetterFrame) { mProcess = 4; for (int i = 0; i < 2; i++) { @@ -695,7 +695,7 @@ void dMenu_Letter_c::read_next_fadeout_init() { void dMenu_Letter_c::read_next_fadeout_move() { s16 closeWindowFrame = g_drawHIO.mLetterSelectScreen.mCloseFrame[dMeter_drawLetterHIO_c::WINDOW_FRAME]; - field_0x36a--; + IF_NOT_DUSK(field_0x36a--); if (field_0x36a <= 0) { mProcess = 6; for (int i = 0; i < 2; i++) { @@ -744,7 +744,7 @@ void dMenu_Letter_c::read_next_fadein_init() { void dMenu_Letter_c::read_next_fadein_move() { s16 openLetterFrame = g_drawHIO.mLetterSelectScreen.mOpenFrame[dMeter_drawLetterHIO_c::LETTER_FRAME]; - field_0x36a++; + IF_NOT_DUSK(field_0x36a++); if (field_0x36a >= openLetterFrame) { mProcess = 4; for (int i = 0; i < 2; i++) { @@ -773,7 +773,7 @@ void dMenu_Letter_c::read_close_init() { void dMenu_Letter_c::read_close_move() { s16 closeLetterFrame = g_drawHIO.mLetterSelectScreen.mCloseFrame[dMeter_drawLetterHIO_c::LETTER_FRAME]; - field_0x36a--; + IF_NOT_DUSK(field_0x36a--); if (field_0x36a <= 0) { mProcess = 0; for (int i = 0; i < 2; i++) { @@ -792,6 +792,41 @@ void dMenu_Letter_c::read_close_move() { } } +#if TARGET_PC +void dMenu_Letter_c::presentAnims() { + if (mProcess == 1 || mProcess == 2) { + dusk::vdt::present_addCalc2(&field_0x358, 0.0f, 0.5f, 50.0f, 0.1f); + return; + } + + const auto& hio = g_drawHIO.mLetterSelectScreen; + const bool opening = mProcess == 3 || mProcess == 6; + const bool page = mProcess == 5 || mProcess == 6; + if (!opening && mProcess != 5 && mProcess != 7) { + return; + } + const f32 duration = opening ? hio.mOpenFrame[dMeter_drawLetterHIO_c::LETTER_FRAME] : + hio.mCloseFrame[page ? dMeter_drawLetterHIO_c::WINDOW_FRAME : dMeter_drawLetterHIO_c::LETTER_FRAME]; + dusk::vdt::advance_toward_frame(field_0x36a, opening ? duration : 0.0f, 1.0f); + const f32 alpha = duration <= 0.0f ? (opening ? 1.0f : 0.0f) : + dusk::vdt::clamped_fraction(field_0x36a, duration); + for (int i = 0; i < 2; i++) { + if (page) { + field_0x2ec[i]->setAlphaRate(alpha); + if (field_0x2f4[i] != NULL) { + field_0x2f4[i]->setAlphaRate(alpha); + } + } else { + mpTextParent[i]->scale(hio.mLetterWindowScale * alpha, hio.mLetterWindowScale * alpha); + mpTextParent[i]->setAlphaRate(alpha); + } + } + if (!page) { + mpBlackTex->setAlpha(hio.mWindowBGAlpha * alpha); + } +} +#endif + void dMenu_Letter_c::screenSetMenu() { static const u64 tag_sub0[6] = { MULTI_CHAR('menu_t0s'), MULTI_CHAR('menu_t1s'), MULTI_CHAR('menu_t2s'), MULTI_CHAR('menu_t3s'), MULTI_CHAR('menu_t4s'), MULTI_CHAR('menu_t5s'), diff --git a/src/d/d_menu_map_common.cpp b/src/d/d_menu_map_common.cpp index c18f5825ff..c4c1485826 100644 --- a/src/d/d_menu_map_common.cpp +++ b/src/d/d_menu_map_common.cpp @@ -6,6 +6,10 @@ #include "d/d_select_cursor.h" #include "global.h" +#if TARGET_PC +#include "dusk/interp/user_interface.h" +#endif + struct map_icon_size_t { f32 size_x; f32 size_y; @@ -584,10 +588,16 @@ void dMenuMapCommon_c::setBlendRatio(u8 i_iconNo, f32 param_2, f32 param_3) { } void dMenuMapCommon_c::blinkMove(s16 param_1) { +#if TARGET_PC + f32 phase = mBlinkTimer + 15.0f; + dusk::vdt::advance_looping_frame(phase, 1.0f, std::max(0, (int)param_1) + 15.0f); + mBlinkTimer = phase - 15.0f; +#else mBlinkTimer++; if (mBlinkTimer >= param_1) { S16_SUB(mBlinkTimer, param_1 + 15); } +#endif if (mBlinkTimer < 0) { mBlinkAlpha = 1.0f; @@ -610,10 +620,20 @@ void dMenuMapCommon_c::moveLightDropAnime() { u8 flash_start_alpha = g_fmapHIO.mMapIconHIO.mLightDropFlashStartAlphaOut[bVar6]; u8 flash_end_alpha = g_fmapHIO.mMapIconHIO.mLightDropFlashEndAlphaOut[bVar6]; +#if TARGET_PC + if (flash_frame_num <= 0) { + mLightDropFlashTimer = 0.0f; + _c80 = flash_start_alpha; + _c7c = flash_start_scale; + return; + } + dusk::vdt::advance_looping_frame(mLightDropFlashTimer, 1.0f, flash_frame_num); +#else mLightDropFlashTimer++; if (mLightDropFlashTimer >= flash_frame_num) { mLightDropFlashTimer -= flash_frame_num; } +#endif f32 fVar7; if (mLightDropFlashTimer <= flash_frame_num / 2.0f) { diff --git a/src/d/d_menu_option.cpp b/src/d/d_menu_option.cpp index 6790684e7b..fa10149e08 100644 --- a/src/d/d_menu_option.cpp +++ b/src/d/d_menu_option.cpp @@ -27,6 +27,8 @@ #include "JSystem/JAudio2/JASDriverIF.h" #if TARGET_PC +#include "dusk/game_clock.h" +#include "dusk/interp/user_interface.h" #include "dusk/menu_pointer.h" #include "dusk/ui/touch_controls.hpp" #include "dusk/version.hpp" @@ -568,7 +570,7 @@ skip: } (this->*process[OPTION_PROC(field_0x3ef)])(); - mpSelectScreen->animation(); + IF_NOT_DUSK(mpSelectScreen->animation()); if (oldValue != field_0x3ef) { (this->*init[OPTION_PROC(field_0x3ef)])(); } @@ -578,6 +580,11 @@ skip: void dMenu_Option_c::_draw() { if (mpArchive != NULL) { +#if TARGET_PC + if (dusk::game_clock::is_presentation_frame()) { + presentAnims(); + } +#endif J2DGrafContext* ctx = dComIfGp_getCurrentGrafPort(); #if (PLATFORM_WII || PLATFORM_SHIELD) if (mpCalibration != NULL && field_0x3f4 != 5 && field_0x3f4 != 0 && field_0x3f4 != 4) { @@ -667,6 +674,10 @@ bool dMenu_Option_c::checkRightTrigger() { } void dMenu_Option_c::setAnimation() { +#if TARGET_PC + dusk::vdt::present_looping(field_0x3c0, field_0x2c, 2.0f); + dusk::vdt::present_looping(field_0x3c4, field_0x30, 2.0f); +#else s16 frameMax; field_0x3c0 += 2; @@ -682,6 +693,7 @@ void dMenu_Option_c::setAnimation() { field_0x3c4 = field_0x3c4 - frameMax; } field_0x30->setFrame(field_0x3c4); +#endif } bool dMenu_Option_c::_open() { @@ -1014,6 +1026,7 @@ void dMenu_Option_c::change_init() { } void dMenu_Option_c::change_move() { +#if !TARGET_PC f32 x = 0.0f; if (field_0x3da > 0) { @@ -1022,15 +1035,16 @@ void dMenu_Option_c::change_move() { field_0x3da++; } u8 index; +#endif switch (OPTION_PROC(field_0x3f5)) { case PROC_ATTEN_e: - index = field_0x3f5; + IF_NOT_DUSK(index = field_0x3f5); if (field_0x3da == 0) { setAttenString(); } break; case PROC_RUBY_e: - index = field_0x3f5; + IF_NOT_DUSK(index = field_0x3f5); if (field_0x3da == 0) { IF_DUSK_BLOCK(dusk::version::isRegionJpn()) setRubyString(); @@ -1038,18 +1052,19 @@ void dMenu_Option_c::change_move() { } break; case PROC_VIB_e: - index = field_0x3f5; + IF_NOT_DUSK(index = field_0x3f5); if (field_0x3da == 0) { setVibString(); } break; case PROC_SOUND_e: - index = field_0x3f5; + IF_NOT_DUSK(index = field_0x3f5); if (field_0x3da == 0) { setSoundString(); } break; } +#if !TARGET_PC if (field_0x3da > 0) { f32 initPosX = (5 - field_0x3da) / 5.0f; if (mpMenuText[index][3] != NULL) { @@ -1069,6 +1084,7 @@ void dMenu_Option_c::change_move() { mpMenuText[index][i]->paneTrans(x + field_0x3b4, 0.0f); } } +#endif if (field_0x3da == 0) { for (int i = 0; i < 6; i++) { for (int j = 2; j < 6; j++) { @@ -1102,18 +1118,20 @@ void dMenu_Option_c::confirm_open_move() { u32 status = mpWarning->getStatus(); bool yesNoMenuMove = yesnoMenuMoveAnm(); +#if !TARGET_PC if (field_0x374 != 1.0f) { cLib_addCalc2(&field_0x374, 1.0f, 0.4f, 0.5f); if (fabsf(field_0x374 - 1.0f) < 0.1f) { field_0x374 = 1.0f; } } +#endif if (status == 1 && yesNoMenuMove == 1 && field_0x374 == 1.0f) { yesnoCursorShow(); field_0x3ef = OPTION_SELECT(PROC_CONFIRM_MOVE_MOVE_e); } mpWarning->_move(); - setAnimation(); + IF_NOT_DUSK(setAnimation()); } void dMenu_Option_c::confirm_move_init() { @@ -1143,13 +1161,11 @@ void dMenu_Option_c::confirm_move_move() { field_0x3ef = OPTION_SELECT(PROC_CONFIRM_CLOSE_MOVE_e); dMeter2Info_set2DVibrationM(); mpWarning->_move(); - setAnimation(); return; } yesnoSelectAnmSet(); field_0x3ef = OPTION_SELECT(PROC_CONFIRM_SELECT_MOVE_e); mpWarning->_move(); - setAnimation(); return; } if (clicked) { @@ -1157,7 +1173,6 @@ void dMenu_Option_c::confirm_move_move() { field_0x3ef = OPTION_SELECT(PROC_CONFIRM_CLOSE_MOVE_e); dMeter2Info_set2DVibrationM(); mpWarning->_move(); - setAnimation(); return; } } @@ -1192,7 +1207,7 @@ void dMenu_Option_c::confirm_move_move() { } } mpWarning->_move(); - setAnimation(); + IF_NOT_DUSK(setAnimation()); } void dMenu_Option_c::confirm_select_init() { @@ -1225,14 +1240,13 @@ void dMenu_Option_c::confirm_select_move() { field_0x3ef = OPTION_SELECT(PROC_CONFIRM_CLOSE_MOVE_e); dMeter2Info_set2DVibrationM(); mpWarning->_move(); - setAnimation(); return; } #endif field_0x3ef = OPTION_SELECT(PROC_CONFIRM_MOVE_MOVE_e); } mpWarning->_move(); - setAnimation(); + IF_NOT_DUSK(setAnimation()); } void dMenu_Option_c::confirm_close_init() { @@ -1247,12 +1261,14 @@ void dMenu_Option_c::confirm_close_init() { void dMenu_Option_c::confirm_close_move() { u32 status = mpWarning->getStatus(); yesnoMenuMoveAnm(); +#if !TARGET_PC if (field_0x374 != 0.0f) { cLib_addCalc2(&field_0x374, 0.0f, 0.4f, 0.5); if (fabsf(field_0x374) < 0.1f) { field_0x374 = 0.0f; } } +#endif if (status == 1 && status == 1 && field_0x374 == 0.0f) { if (field_0x3f7 == 1) { if (field_0x3f9 == 1) { @@ -1290,7 +1306,7 @@ void dMenu_Option_c::confirm_close_move() { } } mpWarning->_move(); - setAnimation(); + IF_NOT_DUSK(setAnimation()); } void dMenu_Option_c::tv_open1_move() { @@ -2660,6 +2676,7 @@ void dMenu_Option_c::yesnoMenuMoveAnmInitSet(int param_0, int param_1) { bool dMenu_Option_c::yesnoMenuMoveAnm() { bool ret; if (field_0x3c8[2] != field_0x3c8[3]) { +#if !TARGET_PC if (field_0x3c8[2] < field_0x3c8[3]) { field_0x3c8[2] += 2; if (field_0x3c8[2] > field_0x3c8[3]) { @@ -2674,6 +2691,7 @@ bool dMenu_Option_c::yesnoMenuMoveAnm() { field_0x20->setFrame(field_0x3c8[2]); mpYesNoSelBase_c[0]->getPanePtr()->animationTransform(); mpYesNoSelBase_c[1]->getPanePtr()->animationTransform(); +#endif ret = 0; } if (field_0x3c8[2] == field_0x3c8[3]) { @@ -2698,6 +2716,101 @@ static s32 OptYnSelStartFrameTbl[2] = {1251, 1236}; static s32 OptYnSelEndFrameTbl[2] = {1236, 1251}; +#if TARGET_PC +void dMenu_Option_c::presentAnims() { + if (field_0x3da != 0.0f) { + dusk::vdt::advance_toward_frame(field_0x3da, 0.0f, 1.0f); + const u8 index = field_0x3f5; + if (field_0x3da == 0.0f) { + switch (OPTION_PROC(field_0x3f5)) { + case PROC_ATTEN_e: + setAttenString(); + break; + case PROC_RUBY_e: + IF_DUSK_BLOCK(dusk::version::isRegionJpn()) + setRubyString(); + IF_DUSK_BLOCK_END + break; + case PROC_VIB_e: + setVibString(); + break; + case PROC_SOUND_e: + setSoundString(); + break; + } + for (int i = 0; i < 6; i++) { + for (int j = 2; j < 6; j++) { + if (mpMenuText[i][j] != NULL) { + mpMenuText[i][j]->hide(); + } + } + } + for (int i = 0; i < 2; i++) { + if (mpMenuText[index][i] != NULL) { + mpMenuText[index][i]->show(); + mpMenuText[index][i]->paneTrans(field_0x3b4, 0.0f); + } + } + } else { + f32 x = 0.0f; + if (field_0x3da > 0) { + f32 initPosX = (5 - field_0x3da) / 5.0f; + if (mpMenuText[index][3] != NULL) { + x = mpMenuText[index][3]->getInitPosX() - mpMenuText[index][0]->getInitPosX(); + } + x *= initPosX; + } else if (field_0x3da < 0) { + f32 initPosX = (field_0x3da + 5) / 5.0f; + if (mpMenuText[index][5] != NULL) { + x = mpMenuText[index][5]->getInitPosX() - mpMenuText[index][0]->getInitPosX(); + } + x *= initPosX; + } + for (int i = 0; i < 6; i++) { + if (mpMenuText[index][i] != NULL) { + mpMenuText[index][i]->show(); + mpMenuText[index][i]->paneTrans(x + field_0x3b4, 0.0f); + } + } + } + } + setAnimation(); + if (OPTION_PROC(field_0x3ef) == PROC_CONFIRM_OPEN_MOVE_e) { + dusk::vdt::present_addCalc2(&field_0x374, 1.0f, 0.4f, 0.5f, 0.1f); + } else if (OPTION_PROC(field_0x3ef) == PROC_CONFIRM_CLOSE_MOVE_e) { + dusk::vdt::present_addCalc2(&field_0x374, 0.0f, 0.4f, 0.5f, 0.1f); + } + if (mpSelectScreen != NULL) { + mpSelectScreen->animation(); + } + presentLayoutAnims(); + for (int i = 0; i < 2; ++i) { + mpYesNoTxt_c[i]->presentAnime(); + mpYesNoCurWaku_c[i]->presentAnime(); + mpYesNoCurWakuG0_c[i]->presentAnime(); + mpYesNoCurWakuG1_c[i]->presentAnime(); + } +} + +void dMenu_Option_c::presentLayoutAnims() { + if (mpWarning != NULL) { + mpWarning->presentAnims(); + } + + if (field_0x3c8[2] != field_0x3c8[3]) { + dusk::vdt::present_shared(field_0x3c8[2], field_0x3c8[3], field_0x20, + {mpYesNoSelBase_c[0] != NULL ? mpYesNoSelBase_c[0]->getPanePtr() : NULL, + mpYesNoSelBase_c[1] != NULL ? mpYesNoSelBase_c[1]->getPanePtr() : NULL}); + } + + for (int i = 0; i < 2; i++) { + J2DPane* pane = mpYesNoSelBase_c[i] != NULL ? mpYesNoSelBase_c[i]->getPanePtr() : NULL; + dusk::vdt::present_selected(field_0x3c8[i], pane, field_0x24, (f32)OptYnSelStartFrameTbl[i], + field_0x28, (f32)OptYnSelEndFrameTbl[i]); + } +} +#endif + u8 dMenu_Option_c::yesnoSelectMoveAnm() { u8 ret = 0; bool bVar1; @@ -2705,6 +2818,7 @@ u8 dMenu_Option_c::yesnoSelectMoveAnm() { if (field_0x3fa != 0xff) { if (field_0x3c8[field_0x3fa] != OptYnSelStartFrameTbl[field_0x3fa]) { +#if !TARGET_PC if (field_0x3c8[field_0x3fa] < OptYnSelStartFrameTbl[field_0x3fa]) { field_0x3c8[field_0x3fa] += 2; if (field_0x3c8[field_0x3fa] > OptYnSelStartFrameTbl[field_0x3fa]) { @@ -2718,6 +2832,7 @@ u8 dMenu_Option_c::yesnoSelectMoveAnm() { } field_0x24->setFrame(field_0x3c8[field_0x3fa]); mpYesNoSelBase_c[field_0x3fa]->getPanePtr()->animationTransform(); +#endif } if (field_0x3c8[field_0x3fa] == OptYnSelStartFrameTbl[field_0x3fa]) { bVar1 = true; @@ -2729,6 +2844,7 @@ u8 dMenu_Option_c::yesnoSelectMoveAnm() { } if (field_0x3f9 != 0xff) { if (field_0x3c8[field_0x3f9] != OptYnSelEndFrameTbl[field_0x3f9]) { +#if !TARGET_PC if (field_0x3c8[field_0x3f9] < OptYnSelEndFrameTbl[field_0x3f9]) { field_0x3c8[field_0x3f9] += 2; if (field_0x3c8[field_0x3f9] > OptYnSelEndFrameTbl[field_0x3f9]) { @@ -2742,6 +2858,7 @@ u8 dMenu_Option_c::yesnoSelectMoveAnm() { } field_0x28->setFrame(field_0x3c8[field_0x3f9]); mpYesNoSelBase_c[field_0x3f9]->getPanePtr()->animationTransform(); +#endif } if (field_0x3c8[field_0x3f9] == OptYnSelEndFrameTbl[field_0x3f9]) { bVar2 = true; diff --git a/src/d/d_menu_ring.cpp b/src/d/d_menu_ring.cpp index 73832f8918..f1161af804 100644 --- a/src/d/d_menu_ring.cpp +++ b/src/d/d_menu_ring.cpp @@ -30,8 +30,8 @@ #include #if TARGET_PC -#include "dusk/game_clock.h" -#include "dusk/interp/frame_interpolation.h" +#include "dusk/interp/menus.h" +#include "dusk/interp/user_interface.h" #include "dusk/menu_pointer.h" #include "dusk/settings.h" #include "dusk/ui/touch_controls.hpp" @@ -190,23 +190,9 @@ dMenu_Ring_c::dMenu_Ring_c(JKRExpHeap* i_heap, STControl* i_stick, CSTControl* i field_0x682 = 0xc000; break; } -#if TARGET_PC - mCursorInterpPrevX = 0.0f; - mCursorInterpPrevY = 0.0f; - mCursorInterpCurrX = 0.0f; - mCursorInterpCurrY = 0.0f; - mCursorInterpPrevAngle = 0; - mCursorInterpCurrAngle = 0; - mCursorInterpPrevAngular = false; - mCursorInterpCurrAngular = false; - mCursorInterpInit = false; - mPointerTouchPressHoveredCurrent = false; -#endif + IF_DUSK(mPointerTouchPressHoveredCurrent = false); for (int i = 0; i < 4; i++) { field_0x674[i] = 0; -#if TARGET_PC - mSelectItemSlideElapsed[i] = 0.0f; -#endif field_0x518[i] = 0.0f; field_0x528[i] = 0.0f; field_0x538[i] = 0.0f; @@ -567,6 +553,7 @@ dMenu_Ring_c::dMenu_Ring_c(JKRExpHeap* i_heap, STControl* i_stick, CSTControl* i } dMenu_Ring_c::~dMenu_Ring_c() { + IF_DUSK(dusk::interp::erase_owned_samples(this)); mpHeap->getTotalFreeSize(); dMeter2Info_setItemExplainWindowStatus(0); for (int i = 0; i < 4; i++) { @@ -701,9 +688,17 @@ void dMenu_Ring_c::_move() { mRingCursorScale = g_ringHIO.mCursorScale; mpDrawCursor->setScale(g_ringHIO.mCursorScale); } + IF_DUSK(dusk::interp::capture_menu_values(this, mCenterPosX, mCenterPosY, mAlphaRate, + field_0x674[0], field_0x674[1], field_0x674[2], field_0x674[3])); } void dMenu_Ring_c::_draw() { +#if TARGET_PC + dusk::interp::ScopedMenuValues pose(this, mCenterPosX, mCenterPosY, mAlphaRate); + if (mDrawFlag == 0) { + dusk::vdt::advance_looping_frame(field_0x684, 1.0f, g_ringHIO.mItemAlphaFlashDuration); + } +#endif J2DGrafContext* grafPort = dComIfGp_getCurrentGrafPort(); grafPort->setup2D(); if (mDrawFlag == 0) { @@ -756,71 +751,7 @@ void dMenu_Ring_c::_draw() { } else { drawSelectItem(); drawItem2(); -#if TARGET_PC - f32 simX = 0.0f; - f32 simY = 0.0f; - bool restoreSimPos = false; - if (dusk::interp::is_enabled() && mAlphaRate >= 1.0f) { - simX = mpDrawCursor->getPositionX(); - simY = mpDrawCursor->getPositionY(); - - const bool isAngular = (mStatus == STATUS_MOVE) && !mDirectSelectActive; - - if (dusk::interp::get_ui_tick_pending()) { - mCursorInterpPrevX = mCursorInterpCurrX; - mCursorInterpPrevY = mCursorInterpCurrY; - mCursorInterpPrevAngle = mCursorInterpCurrAngle; - mCursorInterpPrevAngular = mCursorInterpCurrAngular; - - mCursorInterpCurrX = simX; - mCursorInterpCurrY = simY; - mCursorInterpCurrAngle = field_0x66e; - mCursorInterpCurrAngular = isAngular; - - // reset prev = curr for first render pass or - // when angle modes prev/curr differ - // to prevent arrival jitter - if (!mCursorInterpInit || - mCursorInterpPrevAngular != mCursorInterpCurrAngular) { - mCursorInterpPrevX = mCursorInterpCurrX; - mCursorInterpPrevY = mCursorInterpCurrY; - mCursorInterpPrevAngle = mCursorInterpCurrAngle; - mCursorInterpPrevAngular = mCursorInterpCurrAngular; - mCursorInterpInit = true; - } - } - if (mCursorInterpInit) { - const f32 step = dusk::interp::get_interpolation_step(); - if (mCursorInterpPrevAngular && mCursorInterpCurrAngular) { - const s16 delta = mCursorInterpCurrAngle - mCursorInterpPrevAngle; - const s16 lerpedAngle = mCursorInterpPrevAngle + (s16)(delta * step); - - // yoinked from stick_move_proc() - const f32 x = g_ringHIO.mItemRingPosX + FB_WIDTH_BASE / 2 + - mRingRadiusH * cM_ssin(lerpedAngle); - const f32 y = g_ringHIO.mItemRingPosY + FB_HEIGHT_BASE / 2 + - mRingRadiusV * cM_scos(lerpedAngle); - mpDrawCursor->setPos(x, y); - } else { - mpDrawCursor->setPos( - mCursorInterpPrevX + (mCursorInterpCurrX - mCursorInterpPrevX) * step, - mCursorInterpPrevY + (mCursorInterpCurrY - mCursorInterpPrevY) * step - ); - } - restoreSimPos = true; - } - } else { - mCursorInterpInit = false; - } -#endif mpDrawCursor->draw(); -#if TARGET_PC - // prevents offsetting at destination on the next frame - // since stick_wait_proc doesn't call setPos and we clobbered mPositionX/Y - if (restoreSimPos) { - mpDrawCursor->setPos(simX, simY); - } -#endif mpItemExplain->trans(mCenterPosX, mCenterPosY); mpItemExplain->draw((J2DOrthoGraph*)grafPort); drawFlag0(); @@ -851,7 +782,7 @@ bool dMenu_Ring_c::isOpen() { mCenterPosX = (1.0f - mAlphaRate) * -FB_WIDTH_BASE; mCenterPosY = 0.0f; } - if (mOpenCloseFrames >= g_ringHIO.mOpenFrames) { + if (mOpenCloseFrames >= g_ringHIO.mOpenFrames) { // Opening is finished, set to g_ringHIO.mCloseFrames as a // preparation for when the player closes the item wheel mOpenCloseFrames = g_ringHIO.mCloseFrames; @@ -868,6 +799,8 @@ bool dMenu_Ring_c::isOpen() { mpDrawCursor->setParam(1.0f, 1.0f, 0.1f, 0.6f, 0.5f); } + IF_DUSK(dusk::interp::capture_menu_values(this, mCenterPosX, mCenterPosY, mAlphaRate, + field_0x674[0], field_0x674[1], field_0x674[2], field_0x674[3])); return opened; } @@ -931,6 +864,8 @@ bool dMenu_Ring_c::isClose() { mpDrawCursor->setParam(1.0f, 1.0f, 0.1f, 0.6f, 0.5f); } + IF_DUSK(dusk::interp::capture_menu_values(this, mCenterPosX, mCenterPosY, mAlphaRate, + field_0x674[0], field_0x674[1], field_0x674[2], field_0x674[3])); return closed; } @@ -1223,9 +1158,6 @@ void dMenu_Ring_c::setJumpItem(bool i_useVibrationM) { field_0x6b8[0] != dComIfGs_getMixItemIndex(0)) { field_0x674[0] = 1; -#if TARGET_PC - mSelectItemSlideElapsed[0] = 0.0f; -#endif } } else if (field_0x6b3 == 1) { field_0x538[0] = g_ringHIO.mUnselectItemScale; @@ -1234,9 +1166,6 @@ void dMenu_Ring_c::setJumpItem(bool i_useVibrationM) { field_0x6b8[1] != dComIfGs_getMixItemIndex(1)) { field_0x674[1] = 1; -#if TARGET_PC - mSelectItemSlideElapsed[1] = 0.0f; -#endif } } if (field_0x674[0] == 1) { @@ -1460,10 +1389,12 @@ void dMenu_Ring_c::setMixItem() { } void dMenu_Ring_c::drawItem() { +#if !TARGET_PC field_0x684++; if (field_0x684 >= g_ringHIO.mItemAlphaFlashDuration) { field_0x684 = 0; } +#endif s32 halfFlashDuration = g_ringHIO.mItemAlphaFlashDuration / 2; f32 fVar16; if (field_0x684 < halfFlashDuration) { @@ -1804,18 +1735,25 @@ void dMenu_Ring_c::setSelectItem(int i_idx, u8 i_itemNo) { mpSelectItemTexBuf[i_idx][field_0x6be[i_idx]][0]->height / 48.0f * texScale; } +#if TARGET_PC +void dMenu_Ring_c::advanceSelectItem() { + mpDrawCursor->setPos(mpDrawCursor->getPositionX(), mpDrawCursor->getPositionY()); + for (int i = 0; i < 4; ++i) { + if (field_0x674[i] >= 10) { + setSelectItemForce(i); + } else if (field_0x674[i] != 0) { + ++field_0x674[i]; + } + } + dusk::interp::capture_menu_values(this, mCenterPosX, mCenterPosY, mAlphaRate, field_0x674[0], + field_0x674[1], field_0x674[2], field_0x674[3]); +} +#endif + void dMenu_Ring_c::drawSelectItem() { for (int i = 0; i < 4; i++) { if (field_0x674[i] != 0) { -#if TARGET_PC - mSelectItemSlideElapsed[i] += dusk::game_clock::consume_interval(this); - const f32 u = std::min(mSelectItemSlideElapsed[i] / (dusk::game_clock::kSimPeriod * 10.0f), 1.0f); - if (u >= 1.0f) { - setSelectItemForce(i); - } else { -#else - if (field_0x674[i] < 10) { -#endif + if (DUSK_IF_ELSE(true, field_0x674[i] < 10)) { #if TARGET_PC f32 initSizeX; f32 initSizeY; @@ -1852,7 +1790,9 @@ void dMenu_Ring_c::drawSelectItem() { #endif #if TARGET_PC - f32 fVar14 = 0.1f + 0.8f * u; + const auto& samples = dusk::interp::get(this).values; + const f32 frame = field_0x674[i] == 1 ? 1.0f : samples.read(3 + i, (f32)field_0x674[i]); + f32 fVar14 = std::clamp(frame, 1.0f, 9.0f) / 10.0f; #else f32 fVar14 = field_0x674[i] / 10.0f; #endif @@ -1891,9 +1831,6 @@ void dMenu_Ring_c::setSelectItemForce(int i_idx) { if (field_0x674[i_idx] != 0) { dComIfGs_setSelectItemIndex(i_idx, field_0x6b4[i_idx]); field_0x674[i_idx] = 0; -#if TARGET_PC - mSelectItemSlideElapsed[i_idx] = 0.0f; -#endif } } else if (field_0x674[i_idx] != 0) { for (int i = 0; i < 2; i++) { @@ -1901,9 +1838,6 @@ void dMenu_Ring_c::setSelectItemForce(int i_idx) { dComIfGs_setSelectItemIndex(i, field_0x6b4[i]); } field_0x674[i_idx] = 0; -#if TARGET_PC - mSelectItemSlideElapsed[i_idx] = 0.0f; -#endif } } diff --git a/src/d/d_menu_save.cpp b/src/d/d_menu_save.cpp index a2b1a5dd2c..1fec2ec552 100644 --- a/src/d/d_menu_save.cpp +++ b/src/d/d_menu_save.cpp @@ -22,7 +22,8 @@ #include "m_Do/m_Do_graphic.h" #if TARGET_PC -#include "dusk/interp/frame_interpolation.h" +#include "dusk/game_clock.h" +#include "dusk/interp/user_interface.h" #include "dusk/menu_pointer.h" #include "dusk/mods/svc/save.hpp" #include "dusk/settings.h" @@ -102,6 +103,8 @@ dMenu_save_c::dMenu_save_c() { } mpSelectMoveBase = NULL; + IF_DUSK(mYesNoSelAnmCol = 0); + for (int i = 0; i < 2; i++) { mpNoYes[i] = NULL; mNoYesBase[i] = NULL; @@ -809,9 +812,7 @@ void dMenu_save_c::_move() { } (this->*MenuSaveProc[mMenuProc])(); -#if !TARGET_PC - saveSelAnm(); -#endif + IF_NOT_DUSK(saveSelAnm()); if (mWarning != NULL) { mWarning->_move(); @@ -828,7 +829,10 @@ void dMenu_save_c::saveSelAnm() { } void dMenu_save_c::selFileWakuAnm() { - IF_DUSK_BLOCK(dusk::interp::get_ui_tick_pending()) +#if TARGET_PC + dusk::vdt::present_looping(mFileWakuAnmFrame, mpFileWakuAnm, 2.0f); + dusk::vdt::present_looping(mFileWakuRotAnmFrame, mpFileWakuRotAnm, 2.0f); +#else mFileWakuAnmFrame += 2; if (mFileWakuAnmFrame >= mpFileWakuAnm->getFrameMax()) { mFileWakuAnmFrame -= mpFileWakuAnm->getFrameMax(); @@ -838,13 +842,17 @@ void dMenu_save_c::selFileWakuAnm() { if (mFileWakuRotAnmFrame >= mpFileWakuRotAnm->getFrameMax()) { mFileWakuRotAnmFrame -= mpFileWakuRotAnm->getFrameMax(); } - IF_DUSK_BLOCK_END mpFileWakuAnm->setFrame(mFileWakuAnmFrame); mpFileWakuRotAnm->setFrame(mFileWakuRotAnmFrame); +#endif } void dMenu_save_c::bookIconAnm() { - IF_DUSK_BLOCK(dusk::interp::get_ui_tick_pending()) +#if TARGET_PC + dusk::vdt::present_looping(field_0x154, field_0x150, 2.0f); + dusk::vdt::present_looping(field_0x15c, field_0x158, 2.0f); + dusk::vdt::present_looping(field_0x164, field_0x160, 2.0f); +#else field_0x154 += 2; if (field_0x154 >= field_0x150->getFrameMax()) { field_0x154 -= field_0x150->getFrameMax(); @@ -859,10 +867,10 @@ void dMenu_save_c::bookIconAnm() { if (field_0x164 >= field_0x160->getFrameMax()) { field_0x164 -= field_0x160->getFrameMax(); } - IF_DUSK_BLOCK_END field_0x150->setFrame(field_0x154); field_0x158->setFrame(field_0x15c); field_0x160->setFrame(field_0x164); +#endif } void dMenu_save_c::memCardWatch() { @@ -1836,6 +1844,7 @@ void dMenu_save_c::openSaveSelect3() { var_r29 = ketteiTxtDispAnm(); if (field_0x74[mSelectedFile] != SelEndFrameTbl[mSelectedFile]) { +#if !TARGET_PC field_0x74[mSelectedFile] += 2; if (field_0x74[mSelectedFile] > SelEndFrameTbl[mSelectedFile]) { @@ -1844,6 +1853,7 @@ void dMenu_save_c::openSaveSelect3() { field_0x40->setFrame(field_0x74[mSelectedFile]); mpSelData[mSelectedFile]->getPanePtr()->animationTransform(); +#endif var_r28 = false; } } @@ -2051,6 +2061,7 @@ void dMenu_save_c::saveSelectMoveAnime() { selWakuAnmComplete = selectWakuAlpahAnm(mLastSelFile); if (field_0x74[mLastSelFile] != SelStartFrameTbl[mLastSelFile]) { +#if !TARGET_PC field_0x74[mLastSelFile] -= 2; if (field_0x74[mLastSelFile] < SelStartFrameTbl[mLastSelFile]) { @@ -2059,6 +2070,7 @@ void dMenu_save_c::saveSelectMoveAnime() { field_0x44->setFrame(field_0x74[mLastSelFile]); mpSelData[mLastSelFile]->getPanePtr()->animationTransform(); +#endif var_r29 = false; } } @@ -2069,6 +2081,7 @@ void dMenu_save_c::saveSelectMoveAnime() { var_r28 = mpBookWaku[mSelectedFile]->alphaAnime(g_msHIO.mEffectDispFrames, 0, 0xFF, 1); if (field_0x74[mSelectedFile] != SelEndFrameTbl[mSelectedFile]) { +#if !TARGET_PC field_0x74[mSelectedFile] += 2; if (field_0x74[mSelectedFile] > SelEndFrameTbl[mSelectedFile]) { @@ -2077,6 +2090,7 @@ void dMenu_save_c::saveSelectMoveAnime() { field_0x40->setFrame(field_0x74[mSelectedFile]); mpSelData[mSelectedFile]->getPanePtr()->animationTransform(); +#endif var_r27 = false; } } @@ -2191,6 +2205,8 @@ void dMenu_save_c::saveMoveDisp2() { } void dMenu_save_c::yesnoSelectAnmSet(u8 param_0) { + IF_DUSK(mYesNoSelAnmCol = param_0); + if (mYesNoPrevCursor != 0xFF) { yesnoWakuAlpahAnmInit(mYesNoPrevCursor, 255, 0, g_msHIO.mSelectFrames); mpNoYes[mYesNoPrevCursor]->getPanePtr()->setAnimation(field_0x40); @@ -2528,6 +2544,7 @@ void dMenu_save_c::selectDataBaseMoveAnmInitSet(int param_0, int param_1) { bool dMenu_save_c::selectDataBaseMoveAnm() { if (mDataBaseMoveAnmFrame != mDataBaseMoveFrameMax) { +#if !TARGET_PC if (mDataBaseMoveAnmFrame < mDataBaseMoveFrameMax) { mDataBaseMoveAnmFrame += 2; @@ -2544,6 +2561,7 @@ bool dMenu_save_c::selectDataBaseMoveAnm() { field_0x40->setFrame(mDataBaseMoveAnmFrame); mpSelectMoveBase->getPanePtr()->animationTransform(); +#endif return false; } else { #if TARGET_PC @@ -2607,6 +2625,7 @@ void dMenu_save_c::selectDataMoveAnmInitSet(int param_0, int param_1) { bool dMenu_save_c::selectDataMoveAnm() { if (field_0x74[mSelectedFile] != field_0x80) { +#if !TARGET_PC if (field_0x74[mSelectedFile] < field_0x80) { field_0x74[mSelectedFile] += 2; @@ -2625,6 +2644,7 @@ bool dMenu_save_c::selectDataMoveAnm() { for (int i = 0; i < 3; i++) { mpSelData[i]->getPanePtr()->animationTransform(); } +#endif return false; } else { @@ -2662,6 +2682,7 @@ void dMenu_save_c::yesnoMenuMoveAnmInitSet(int anmFrame, int frameMax, u8 param_ bool dMenu_save_c::yesnoMenuMoveAnm() { if (mYesNoMoveAnmFrame != mYesNoMoveAnmMax) { +#if !TARGET_PC if (mYesNoMoveAnmFrame < mYesNoMoveAnmMax) { mYesNoMoveAnmFrame += 2; @@ -2679,6 +2700,7 @@ bool dMenu_save_c::yesnoMenuMoveAnm() { field_0x48->setFrame(mYesNoMoveAnmFrame); mpNoYes[0]->getPanePtr()->animationTransform(); mpNoYes[1]->getPanePtr()->animationTransform(); +#endif return false; } else { mpNoYes[0]->getPanePtr()->setAnimation((J2DAnmTransformKey*)NULL); @@ -2713,6 +2735,7 @@ bool dMenu_save_c::yesnoSelectMoveAnm(u8 param_0) { bool var_r30 = true; if (mYesNoPrevCursor != 0xFF) { if (field_0x8c[mYesNoPrevCursor] != YnSelStartFrameTbl[mYesNoPrevCursor][param_0]) { +#if !TARGET_PC if (field_0x8c[mYesNoPrevCursor] < YnSelStartFrameTbl[mYesNoPrevCursor][param_0]) { field_0x8c[mYesNoPrevCursor] += 2; @@ -2729,6 +2752,7 @@ bool dMenu_save_c::yesnoSelectMoveAnm(u8 param_0) { field_0x40->setFrame(field_0x8c[mYesNoPrevCursor]); mpNoYes[mYesNoPrevCursor]->getPanePtr()->animationTransform(); +#endif var_r30 = false; } } @@ -2736,6 +2760,7 @@ bool dMenu_save_c::yesnoSelectMoveAnm(u8 param_0) { bool var_r7 = true; if (mYesNoCursor != 0xFF) { if (field_0x8c[mYesNoCursor] != YnSelEndFrameTbl[mYesNoCursor][param_0]) { +#if !TARGET_PC if (field_0x8c[mYesNoCursor] < YnSelEndFrameTbl[mYesNoCursor][param_0]) { field_0x8c[mYesNoCursor] += 2; @@ -2752,6 +2777,7 @@ bool dMenu_save_c::yesnoSelectMoveAnm(u8 param_0) { field_0x44->setFrame(field_0x8c[mYesNoCursor]); mpNoYes[mYesNoCursor]->getPanePtr()->animationTransform(); +#endif var_r7 = false; } } @@ -2798,6 +2824,7 @@ void dMenu_save_c::errorMoveAnmInitSet(int param_0, int param_1) { bool dMenu_save_c::errorMoveAnm() { if (field_0xb8 != field_0xbc) { +#if !TARGET_PC if (field_0xb8 < field_0xbc) { field_0xb8 += 2; @@ -2814,6 +2841,7 @@ bool dMenu_save_c::errorMoveAnm() { field_0x4c->setFrame(field_0xb8); field_0xb4->animationTransform(); +#endif return 0; } else { field_0x4c->setFrame(field_0xbc); @@ -3072,22 +3100,85 @@ void dMenu_save_c::menuSaveWide() { } #endif } + +void dMenu_save_c::presentLayoutAnims() { + if (mWarning != NULL) { + mWarning->presentAnims(); + } + + dusk::vdt::present_toward(mDataBaseMoveAnmFrame, (f32)mDataBaseMoveFrameMax, field_0x40, mpSelectMoveBase != NULL ? mpSelectMoveBase->getPanePtr() : NULL); + + bool sharedSel = true; + for (int i = 0; i < 3; i++) { + J2DPane* pane = mpSelData[i] != NULL ? mpSelData[i]->getPanePtr() : NULL; + if (pane == NULL || pane->mTransform != field_0x40) { + sharedSel = false; + break; + } + } + if (sharedSel && mSelectedFile != 0xFF) { + dusk::vdt::present_toward(field_0x74[mSelectedFile], (f32)field_0x80, field_0x40); + for (int i = 0; i < 3; i++) { + mpSelData[i]->getPanePtr()->animationTransform(); + } + } else { + for (int i = 0; i < 3; i++) { + J2DPane* pane = mpSelData[i] != NULL ? mpSelData[i]->getPanePtr() : NULL; + dusk::vdt::present_selected(field_0x74[i], pane, field_0x40, (f32)SelEndFrameTbl[i], + field_0x44, (f32)SelStartFrameTbl[i]); + } + } + + if (mYesNoMoveAnmFrame != mYesNoMoveAnmMax) { + dusk::vdt::present_shared(mYesNoMoveAnmFrame, (f32)mYesNoMoveAnmMax, field_0x48, + {mpNoYes[0] != NULL ? mpNoYes[0]->getPanePtr() : NULL, + mpNoYes[1] != NULL ? mpNoYes[1]->getPanePtr() : NULL}); + } + + for (int i = 0; i < 2; i++) { + J2DPane* pane = mpNoYes[i] != NULL ? mpNoYes[i]->getPanePtr() : NULL; + dusk::vdt::present_selected(field_0x8c[i], pane, field_0x40, (f32)YnSelStartFrameTbl[i][mYesNoSelAnmCol], + field_0x44, (f32)YnSelEndFrameTbl[i][mYesNoSelAnmCol]); + } + + dusk::vdt::present_toward(field_0xb8, (f32)field_0xbc, field_0x4c, field_0xb4); + + for (int i = 0; i < 3; ++i) { + mpBookWaku[i]->presentAnime(); + mpSelWakuMoyo[i]->presentAnime(); + mpSelWakuGold[i]->presentAnime(); + mpSelWakuGold2[i]->presentAnime(); + } + for (int i = 0; i < 2; ++i) { + mNoYesBase[i]->presentAnime(); + mNoYesGold[i]->presentAnime(); + mNoYesGold2[i]->presentAnime(); + mpNoYesTxt[i]->presentAnime(); + mpErrTxtPane[i]->presentAlphaAnime(); + mpHeaderTxtPane[i]->presentAlphaAnime(); + } + mpBBtnIcon->presentAlphaAnime(); + mpABtnIcon->presentAlphaAnime(); + mpBackTxt->presentAlphaAnime(); + mpConfirmTxt->presentAlphaAnime(); +} #endif void dMenu_save_c::_draw2() { - if (field_0x21a1 == 0) { #if TARGET_PC + if (mDisplayMenu && dusk::game_clock::is_presentation_frame()) { saveSelAnm(); + presentLayoutAnims(); + menuSaveWide(); + } #endif + + if (field_0x21a1 == 0) { if (mpScrnExplain != NULL) { dComIfGd_set2DOpa(&mMenuSaveExplain); } if (mDisplayMenu) { - #if TARGET_PC - menuSaveWide(); - #endif - dComIfGd_set2DOpa(&mSaveSel); for (int i = 0; i < 3; i++) { diff --git a/src/d/d_menu_skill.cpp b/src/d/d_menu_skill.cpp index 90d4a3f92b..fddfa61b51 100644 --- a/src/d/d_menu_skill.cpp +++ b/src/d/d_menu_skill.cpp @@ -21,6 +21,7 @@ #include "dusk/version.hpp" #if TARGET_PC +#include "dusk/interp/user_interface.h" #include "dusk/menu_pointer.h" #endif @@ -146,6 +147,7 @@ void dMenu_Skill_c::_move() { void dMenu_Skill_c::_draw() { if (mpArchive != NULL) { + IF_DUSK(presentAnims()); J2DGrafContext* context = dComIfGp_getCurrentGrafPort(); u8 alpha = mpBlackTex->mAlpha; mpBlackTex->setAlpha(0xff); @@ -362,7 +364,7 @@ void dMenu_Skill_c::read_open_init() { void dMenu_Skill_c::read_open_move() { s16 openSkillDescFrame = g_drawHIO.mSkillListScreen.mOpenFrame[dMeter_drawSkillHIO_c::SKILL_DESC]; - mProcFrame++; + IF_NOT_DUSK(mProcFrame++); if (mProcFrame >= openSkillDescFrame) { mProcess = PROC_OPEN_MOVE; mpTextParent->setAlphaRate(1.0f); @@ -402,7 +404,7 @@ void dMenu_Skill_c::read_close_init() { void dMenu_Skill_c::read_close_move() { s16 closeSkillDescFrame = g_drawHIO.mSkillListScreen.mCloseFrame[dMeter_drawSkillHIO_c::SKILL_DESC]; - mProcFrame--; + IF_NOT_DUSK(mProcFrame--); if (mProcFrame <= 0) { mProcess = PROC_CLOSE_MOVE; mpTextParent->setAlphaRate(0.0f); @@ -414,6 +416,26 @@ void dMenu_Skill_c::read_close_move() { } } +#if TARGET_PC +void dMenu_Skill_c::presentAnims() { + const auto& hio = g_drawHIO.mSkillListScreen; + f32 duration; + if (mProcess == PROC_WAIT_MOVE) { + duration = hio.mOpenFrame[dMeter_drawSkillHIO_c::SKILL_DESC]; + dusk::vdt::advance_toward_frame(mProcFrame, duration, 1.0f); + } else if (mProcess == PROC_MOVE_MOVE) { + duration = hio.mCloseFrame[dMeter_drawSkillHIO_c::SKILL_DESC]; + dusk::vdt::advance_toward_frame(mProcFrame, 0.0f, 1.0f); + } else { + return; + } + const f32 alpha = duration <= 0.0f ? (mProcess == PROC_WAIT_MOVE ? 1.0f : 0.0f) : + dusk::vdt::clamped_fraction(mProcFrame, duration); + mpTextParent->setAlphaRate(alpha); + mpBlackTex->setAlpha(hio.mWindowBGalpha * alpha); +} +#endif + void dMenu_Skill_c::screenSetMenu() { static const u64 tag_sub0[7] = { MULTI_CHAR('menu_t0s'), MULTI_CHAR('menu_t1s'), MULTI_CHAR('menu_t2s'), MULTI_CHAR('menu_t3s'), MULTI_CHAR('menu_t4s'), MULTI_CHAR('menu_t5s'), MULTI_CHAR('menu_t51'), diff --git a/src/d/d_menu_window.cpp b/src/d/d_menu_window.cpp index 80f374cf46..aee078fb1c 100644 --- a/src/d/d_menu_window.cpp +++ b/src/d/d_menu_window.cpp @@ -1589,10 +1589,18 @@ int dMw_c::_create() { field_0x144 = 3; dMeter2Info_setWindowStatus(0); + + IF_DUSK(base.draw_interp_frame = true); + return cPhs_COMPLEATE_e; } int dMw_c::_execute() { +#if TARGET_PC + if (mpMenuRing != NULL) { + mpMenuRing->advanceSelectItem(); + } +#endif if (field_0x151 != 0) { field_0x151--; } diff --git a/src/d/d_name.cpp b/src/d/d_name.cpp index 89506e8078..c41d90ed37 100644 --- a/src/d/d_name.cpp +++ b/src/d/d_name.cpp @@ -12,6 +12,8 @@ #include "f_op/f_op_msg_mng.h" #if TARGET_PC +#include "dusk/game_clock.h" +#include "dusk/interp/user_interface.h" #include "dusk/utilities.hpp" #include "dusk/version.hpp" @@ -431,7 +433,7 @@ void dName_c::_move() { } #endif - cursorAnm(); + IF_NOT_DUSK(cursorAnm()); } int dName_c::nameCheck() { @@ -476,6 +478,10 @@ void dName_c::playNameSet(int nameLength) { } void dName_c::cursorAnm() { +#if TARGET_PC + dusk::vdt::present_looping(mCurColAnmF, mCursorColorKey, 2.0f); + dusk::vdt::present_looping(mCurTexAnmF, mCursorTexKey, 2.0f); +#else mCurColAnmF += 2; if (mCurColAnmF >= mCursorColorKey->getFrameMax()) { mCurColAnmF -= mCursorColorKey->getFrameMax(); @@ -487,6 +493,7 @@ void dName_c::cursorAnm() { mCurTexAnmF -= mCursorTexKey->getFrameMax(); } mCursorTexKey->setFrame(mCurTexAnmF); +#endif nameIn.NameInScr->animation(); } @@ -1615,9 +1622,20 @@ void dName_c::nameWide() { #endif void dName_c::_draw() { - #if TARGET_PC - nameWide(); - #endif +#if TARGET_PC + if (dusk::game_clock::is_presentation_frame()) { + for (int i = 0; i < 65; ++i) { + mMojiIcon[i]->presentAnime(); + } + for (int i = 0; i < 4; ++i) { + if (mMenuIcon[i] != NULL) { + mMenuIcon[i]->presentAnime(); + } + } + cursorAnm(); + nameWide(); + } +#endif dComIfGd_set2DOpa(&nameIn); dComIfGd_set2DOpa(mSelIcon); diff --git a/src/d/d_s_name.cpp b/src/d/d_s_name.cpp index 7faabde76b..12caa544c1 100644 --- a/src/d/d_s_name.cpp +++ b/src/d/d_s_name.cpp @@ -19,6 +19,7 @@ #if TARGET_PC #include "dusk/autosave.h" +#include "dusk/game_clock.h" #include "dusk/game_mode.hpp" #include "dusk/imgui/ImGuiConsole.hpp" #include "dusk/memory.h" @@ -147,6 +148,8 @@ s32 dScnName_c::create() { #endif dComIfGp_getVibration().Init(); + + IF_DUSK(base.draw_interp_frame = true); } return phase_state; } @@ -243,7 +246,9 @@ s32 dScnName_c::execute() { } s32 dScnName_c::draw() { + IF_DUSK_BLOCK(dusk::game_clock::is_sim_frame()) dComIfGp_getVibration().Run(); + IF_DUSK_BLOCK_END switch (mDrawProc) { case 0: diff --git a/src/d/d_select_icon.cpp b/src/d/d_select_icon.cpp index e55beaf54c..895146c986 100644 --- a/src/d/d_select_icon.cpp +++ b/src/d/d_select_icon.cpp @@ -4,14 +4,17 @@ #include "JSystem/J2DGraph/J2DAnimation.h" #if TARGET_PC -#include "dusk/interp/frame_interpolation.h" +#include "dusk/interp/user_interface.h" #endif dSi_HIO_c::dSi_HIO_c() {} void dSelect_icon_c::animation() { if (field_0x10->getAlpha() != 0) { - IF_DUSK_BLOCK(dusk::interp::get_ui_tick_pending()) +#if TARGET_PC + dusk::vdt::present_looping(field_0x20, field_0x1c, field_0x2c); + dusk::vdt::present_looping(field_0x28, field_0x24, field_0x2c); +#else field_0x20 += field_0x2c; if (field_0x20 >= field_0x1c->getFrameMax()) { field_0x20 = 0.0f; @@ -22,10 +25,8 @@ void dSelect_icon_c::animation() { if (field_0x28 >= field_0x24->getFrameMax()) { field_0x28 = 0.0f; } - IF_DUSK_BLOCK_END - IF_DUSK(field_0x1c->setFrame(field_0x20)); // FRAME INTERP NOTE: Set even if not advancing - field_0x24->setFrame(field_0x28); +#endif field_0x8->animation(); field_0x10->paneScale(field_0x14, field_0x14); } diff --git a/src/dusk/interp/lerp.h b/src/dusk/interp/lerp.h index c0820f2439..8581458ec5 100644 --- a/src/dusk/interp/lerp.h +++ b/src/dusk/interp/lerp.h @@ -25,6 +25,10 @@ inline f32 lerp(f32 lhs, f32 rhs, float step) { return lhs + (rhs - lhs) * step; } +inline void lerp(f32& out, const f32& lhs, const f32& rhs, float step) { + out = lerp(lhs, rhs, step); +} + inline u8 lerp(u8 lhs, u8 rhs, float step) { return static_cast(std::lround(lerp(static_cast(lhs), static_cast(rhs), step))); } diff --git a/src/dusk/interp/menus.h b/src/dusk/interp/menus.h new file mode 100644 index 0000000000..108d9937ee --- /dev/null +++ b/src/dusk/interp/menus.h @@ -0,0 +1,53 @@ +#pragma once + +#include "samples.h" + +#include + +namespace dusk::interp { + +struct MenuValues { + Samples values; +}; + +template +void capture_menu_values(const void* owner, Values... values) { + if (!should_capture()) { + return; + } + + const f32 pose[] = {static_cast(values)...}; + get(owner).values.capture(pose, sizeof...(Values)); +} + +template +class ScopedMenuValues { +public: + template + ScopedMenuValues(const void* owner, Values&... values) : mValues{&values...}, mSaved{values...} { + if (is_enabled() && is_presentation_active()) { + const auto& samples = get(owner).values; + for (size_t i = 0; i < Count; ++i) { + *mValues[i] = samples.read(i, mSaved[i]); + } + } + } + + ~ScopedMenuValues() { + for (size_t i = 0; i < Count; ++i) { + *mValues[i] = mSaved[i]; + } + } + + ScopedMenuValues(const ScopedMenuValues&) = delete; + ScopedMenuValues& operator=(const ScopedMenuValues&) = delete; + +private: + std::array mValues; + std::array mSaved; +}; + +template +ScopedMenuValues(const void*, Values&...) -> ScopedMenuValues; + +} // namespace dusk::interp diff --git a/src/dusk/interp/user_interface.h b/src/dusk/interp/user_interface.h index 8e86fda556..30ddbf2034 100644 --- a/src/dusk/interp/user_interface.h +++ b/src/dusk/interp/user_interface.h @@ -3,15 +3,25 @@ #include "dusk/game_clock.h" #include "JSystem/J2DGraph/J2DAnimation.h" +#include "JSystem/J2DGraph/J2DPane.h" #include "SSystem/SComponent/c_lib.h" +#include "SSystem/SComponent/c_math.h" #include #include #include +#include namespace dusk::vdt { +inline f32 clamped_fraction(f32 timer, f32 duration) { + if (duration <= 0.0f) { + return 1.0f; + } + return std::clamp(timer / duration, 0.0f, 1.0f); +} + inline void advance_looping_frame(f32& frame, f32 speed, f32 max) { if (max <= 0.0f) { return; @@ -62,6 +72,50 @@ inline void present_looping(f32& frame, J2DAnmBase* anm, f32 speed) { anm->setFrame(frame); } +inline void present_toward(f32& frame, f32 target, J2DAnmTransform* anm, J2DPane* pane = nullptr) { + if (anm == nullptr) { + return; + } + if (pane != nullptr && pane->mTransform != anm) { + return; + } + advance_toward_frame(frame, target, 2.0f); + anm->setFrame(frame); + if (pane != nullptr) { + pane->animationTransform(); + } +} + +inline void present_selected(f32& frame, J2DPane* pane, J2DAnmTransform* first, f32 firstTarget, + J2DAnmTransform* second, f32 secondTarget) +{ + if (pane != nullptr) { + if (pane->mTransform == first) { + present_toward(frame, firstTarget, first, pane); + } else if (pane->mTransform == second) { + present_toward(frame, secondTarget, second, pane); + } + } +} + +inline void present_shared(f32& frame, f32 target, J2DAnmTransform* anm, + std::initializer_list panes) +{ + if (frame == target) { + return; + } + bool advanced = false; + for (J2DPane* pane : panes) { + if (pane != nullptr && pane->mTransform == anm) { + if (!advanced) { + present_toward(frame, target, anm); + advanced = true; + } + pane->animationTransform(); + } + } +} + inline void present_addCalc(f32* value, f32 target, f32 scale, f32 maxStep, f32 minStep) { const f32 frames = game_clock::original_frames(); if (*value == target || frames <= 0.0f) { @@ -83,6 +137,16 @@ inline void present_addCalc2(f32* value, f32 target, f32 scale, f32 maxStep, f32 } } +inline f32 present_sine_ease(f32 max, f32 value) { + if (max <= 0.0f) { + return 1.0f; + } + value = std::clamp(value, 0.0f, max); + f32 rate = value / max; + rate = cM_ssin((int)(0.5f * (32768.0f * rate))); + return rate * rate; +} + inline bool present_chase(f32* value, f32 target, f32 scale, f32 maxStep, f32 snap) { if (*value == target) { return false;