#ifndef D_SC_GAME_H #define D_SC_GAME_H #include "common.h" #include "d/a/d_a_base.h" #include "d/d_dylink.h" #include "d/d_fader.h" #include "d/d_scene.h" #include "d/d_camera.h" #include "egg/gfx/eggScreen.h" #include "f/f_profile_name.h" #include "m/m2d.h" #include "m/m_angle.h" #include "m/m_vec.h" #include "s/s_FPhase.h" #include "s/s_State.hpp" #include "sized_string.h" #include "toBeSorted/arc_managers/layout_arc_manager.h" class ScGameScreen : public m2d::Base_c { public: ScGameScreen(u8 priority) { setPriority(priority); } private: /* 0x10 */ EGG::Screen mScreen; }; class ScGameScreenTargeting : public ScGameScreen { public: ScGameScreenTargeting(u8 priority) : ScGameScreen(priority), mLetterboxAmount(0.0f) {} private: f32 mLetterboxAmount; }; struct SpawnInfo { SpawnInfo() { reset(); } SpawnInfo(const SpawnInfo &other) { *this = other; } SpawnInfo &operator=(const SpawnInfo &other) { setData( other.stageName, other.room, other.layer, other.entrance, other.night, other.trial, other.transitionType, other.transitionFadeFrames & 0xFF, other.unk ); return *this; } void reset() { setData("", 0, 0, 0, 0, 0, 0, 0xf, 0xff); } /* 0x00 */ SizedString<32> stageName; /* 0x20 */ u16 transitionFadeFrames; /* 0x22 */ u8 room; /* 0x23 */ u8 layer; /* 0x24 */ u8 entrance; /* 0x25 */ u8 night; /* 0x26 */ u8 trial; /* 0x27 */ u8 transitionType; /* 0x28 */ s8 unk; enum DayNight { DAY, NIGHT, RETAIN_TOD, }; enum Trial { NO_TRIAL, TRIAL, RETAIN_TRIAL, }; DayNight getTimeOfDay() { return (DayNight)night; } Trial getTrial() { return (Trial)trial; } bool isNight() { return getTimeOfDay() == NIGHT; } void setData( const char *i_stageName, u8 i_roomid, u8 i_layer, u8 i_entrance, s32 i_night, s32 i_trial, u8 i_transitionType, u16 i_fadeFrames, s8 i_field0x28 ); }; struct SpawnInfoExt : public SpawnInfo { /* 0x2C */ mVec3_c mType0Pos; /* 0x38 */ s16 mType0RotY; void setSpawnData(const char *i_stageName, u8 i_roomid, u8 i_layer, u8 i_entrance, const mVec3_c &pos, mAng rot); }; struct LinkReloadInfo { LinkReloadInfo() : mType0CsFlag(0) {} void set(u8 roomid, const mVec3_c &pos, mAng rot, u32 linkParams); /* 0x00 */ mVec3_c mPosition; /* 0x0C */ mAng mRotY; /* 0x0E */ u8 mRoomId; /* 0x0F */ u8 mType0CsFlag; /* 0x10 */ u32 mLinkParams; }; class dScGame_c : public dScene_c { public: dScGame_c(); virtual ~dScGame_c() { sInstance = nullptr; } virtual int create() override; virtual int doDelete() override; virtual int execute() override; virtual int draw() override; virtual void deleteReady() override; void triggerExit(s32 room, u8 exitIndex, s32 forcedNight = 2, s32 forcedTrial = 2); // void triggerEntrance(const char *stageName, u8 room, ); const LinkReloadInfo &getLinkReloadInfo() const; static void copySpawnNextToCurrent(); STATE_VIRTUAL_FUNC_DECLARE(dScGame_c, Stanby); // sic STATE_VIRTUAL_FUNC_DECLARE(dScGame_c, Action); static bool isCurrentStage(const char *stageName); static bool isStageSkyloftLayer20(); static bool isInCredits(); static bool isStateLayerWithSeekerStoneHintMenu(); static SpawnInfo currentSpawnInfo; static SpawnInfo nextSpawnInfo; static dScGame_c *sInstance; static dScGame_c *GetInstance() { return sInstance; } bool setReloadTrigger(fProfile::PROFILE_NAME_e reloadTrigger); void setRespawnInfo(const mVec3_c &linkPos, const mAng3_c &linkRot, bool unk); void setSpawnInfo(u8 roomid, const mVec3_c &pos, mAng rot); void clearSpawnInfo(); const SpawnInfoExt &getSpawnInfo() const; static void resetUpdateFrameCount() { sUpdateFrameCount = 0; } bool savePromptFlag() const { return mSavePromptFlag; } void setSavePromptFlag(bool val) { mSavePromptFlag = val; } u8 getType0CsFlag() const { return mReloadInfo.mType0CsFlag; } void setType0CsFlag(u8 flag) { mReloadInfo.mType0CsFlag = flag; } u8 getType0PosFlag() const { return mType0PosFlag; } void setType0PosFlag(u8 flag) { mType0PosFlag = flag; } static u8 getReloaderType() { return sReloaderType; } static void setReloaderType(u8 type) { sReloaderType = type; } static dCamera_c *getCamera(s32 idx); static void setCamera(s32 idx, dCamera_c *); bool isFaderSettled() const { return mFader.isSettled(); } protected: static u32 sUpdateFrameCount; static u8 sCurrentLayer; static u8 sReloaderType; static bool sCopyFileBToCurrentAfterRespawn; static bool sDoSomethingWithFileAOnTransition; static bool sPreventClearingSomeFlag; static void someGfxThingCallback(); void somethingWithScreen(); bool attemptDelete(); static void actuallyTriggerEntrance( const char *stageName, u8 roomid, u8 layer, u8 entrance, int forcedNight, int forcedTrial, u8 transitionType, u16 transitionFadeFrames, s8 field0x28 ); void setFadeInType(u8 transitionType) { mFader.setFadeInType(transitionType); } void setFadeOutType(u8 transitionType) { mFader.setFadeOutType(transitionType); } void setFaderFrames(u16 transitionFadeFrames) { mFader.setFrames(transitionFadeFrames, transitionFadeFrames); } void setBeedleShopState(u8 state) { mBeedleShopState = state; } void resetLinkState() { mInitialSpeedAfterLoadZone = 0.0f; mStaminaAmount = -1; mItemToUseOnReload = -1; mActionIndex = -1; } sFPhaseBase::sFPhaseState cb1(); sFPhaseBase::sFPhaseState cb2(); sFPhaseBase::sFPhaseState cb3(); static sFPhase::phaseCallback sCallbacks[]; /* 0x068 */ sFPhase mPhases; /* 0x07C */ STATE_MGR_DECLARE(dScGame_c); /* 0x0B8 */ dDynamicModuleControl mRelCtrl; /* 0x0C4 */ LayoutArcControl mLayoutCtrl; /* 0x0D0 */ dFader_c mFader; /* 0x0F8 */ ScGameScreenTargeting mScreen1; /* 0x194 */ ScGameScreen mScreen2; /* 0x228 */ UNKWORD field_0x228; /* 0x22C */ u8 _0x22C[0x230 - 0x22C]; /* 0x230 */ dAcRefBase_c mStageMgrRef; /* 0x23C */ u16 mReloadTrigger; /* 0x23E */ u16 field_0x23E; /* 0x240 */ SpawnInfoExt mSpawnInfo; /* 0x27C */ LinkReloadInfo mReloadInfo; /* 0x290 */ f32 mInitialSpeedAfterLoadZone; /* 0x294 */ s32 mStaminaAmount; /* 0x298 */ s8 mItemToUseOnReload; /* 0x299 */ s8 mBeedleShopState; /* 0x29A */ u16 mActionIndex; /* 0x29C */ s32 mLastAreaType; /* 0x2A0 */ u8 mType0PosFlag; /* 0x2A1 */ u8 field_0x2A1; /* 0x2A2 */ bool mSavePromptFlag; /* 0x2A3 */ bool mPreventSaveRespawnInfo; }; #endif