diff options
| author | Léo Lam <leo@leolam.fr> | 2021-05-01 22:14:23 +0200 |
|---|---|---|
| committer | Léo Lam <leo@leolam.fr> | 2021-05-02 01:29:52 +0200 |
| commit | e5e2427c8bf997469c5f99bdb95cf8e75d844ebc (patch) | |
| tree | 2dcf003da0139cc7619cd2c0f23e309d4da49d28 /src | |
| parent | 461967e278f5d3973fc50cfd1a3c96b07ef362fe (diff) | |
ksys/world: Start adding TimeMgr
Diffstat (limited to 'src')
| -rw-r--r-- | src/KingSystem/World/worldTimeMgr.cpp | 60 | ||||
| -rw-r--r-- | src/KingSystem/World/worldTimeMgr.h | 126 |
2 files changed, 185 insertions, 1 deletions
diff --git a/src/KingSystem/World/worldTimeMgr.cpp b/src/KingSystem/World/worldTimeMgr.cpp index e575aee1..b914772b 100644 --- a/src/KingSystem/World/worldTimeMgr.cpp +++ b/src/KingSystem/World/worldTimeMgr.cpp @@ -1 +1,61 @@ #include "KingSystem/World/worldTimeMgr.h" +#include "KingSystem/GameData/gdtManager.h" + +namespace ksys::world { + +static_assert(timeToFloat(0, 0) == 0); +static_assert(timeToFloat(5, 15) == 78.75); +static_assert(timeToFloat(12, 0) == 180); +static_assert(timeToFloat(24, 0) == 360); + +TimeMgr::TimeMgr() { + _20 = true; + _21 = true; + _22 = 0; + _24 = false; + mForceBloodyDay = false; + _14b = false; + _cc = {}; + mMoonType = MoonType::Unknown; +} + +void TimeMgr::init_(sead::Heap* heap) { + mTime = DefaultTime; + mTimeForAocFieldSkyEnv = DefaultTime; + mTimeStep = DefaultTimeStep; + mTimeUpdateMode = {}; + mBloodMoonTimer = 0.0; + mBloodyEndReserveTimer = 0; +} + +void TimeMgr::resetForStageUnload() { + mNewTime = -1.0; + mNeedToHandleNewDay = false; + mWasBloodyDay = false; + + for (auto& entry : _30) { + entry._0 = {}; + entry._4 = -1; + } + _30[9] = {}; + _30[9]._4 = -1; + + gdt::Manager::instance()->setBool(false, mAnimalMasterCtrl.appearance_flag); + mAnimalMasterCtrl.state = {}; + mAnimalMasterCtrl.appearance_hour = {}; + mAnimalMasterCtrl.valid_hour = {}; + mAnimalMasterCtrl.start_day_of_week = {}; +} + +TimeMgr::~TimeMgr() = default; + +void TimeMgr::calcType1_() {} + +void TimeMgr::calcType2_() {} + +void TimeMgr::setNewTime(float time) { + if (time >= 0.0) + mNewTime = time; +} + +} // namespace ksys::world diff --git a/src/KingSystem/World/worldTimeMgr.h b/src/KingSystem/World/worldTimeMgr.h index 5426802b..0f9eddd2 100644 --- a/src/KingSystem/World/worldTimeMgr.h +++ b/src/KingSystem/World/worldTimeMgr.h @@ -1,20 +1,144 @@ #pragma once +#include <array> +#include <prim/seadDelegateEventSlot.h> +#include <prim/seadEnum.h> +#include <prim/seadSizedEnum.h> +#include "KingSystem/GameData/gdtFlagHandle.h" #include "KingSystem/Utils/Types.h" #include "KingSystem/World/worldJob.h" namespace ksys::world { +enum class TimeDivision { + Morning_A, + Morning_B, + Noon_A, + Noon_B, + Evening_A, + Evening_B, + Night_A, + Night_B, +}; +SEAD_ENUM(TimeDivisionEnum, Morning_A,Morning_B,Noon_A,Noon_B,Evening_A,Evening_B,Night_A,Night_B) + +enum class MoonType { + Unknown = 0xff, +}; + +constexpr float timeToFloat(int h, int m) { + return float(h) * 15.0f + float(m) * (15.0f / 60.0f); +} + +constexpr float durationToFloat(int h, int m) { + return timeToFloat(h, m); +} + // TODO class TimeMgr : public Job { + SEAD_RTTI_OVERRIDE(TimeMgr, Job) public: + struct NewDayEvent { + virtual ~NewDayEvent() = default; + }; + TimeMgr(); + ~TimeMgr() override; JobType getType() const override { return JobType::Time; } void resetForStageUnload(); + void setNewTime(float time); + +protected: + void init_(sead::Heap* heap) override; + void calc_() override; + void calcType1_() override; + void calcType2_() override; + +private: + enum class TimeUpdateMode { + + }; + + struct AnimalMasterController { + enum class State { + + }; + + void calc(); + + gdt::FlagHandle appearance_flag = gdt::InvalidHandle; + gdt::FlagHandle existence_flag = gdt::InvalidHandle; + State state{}; + int appearance_hour{}; + int valid_hour{}; + u8 start_day_of_week{}; + }; + KSYS_CHECK_SIZE_NX150(AnimalMasterController, 0x18); + + static constexpr float DefaultTime = timeToFloat(5, 15); + static constexpr float DefaultTimeStep = durationToFloat(0, 1) / 30.0; - u8 _20[0x158 - 0x20]; + bool _20; + bool _21; + u16 _22; + bool _24; + TimeDivision mTimeDivision{}; + TimeDivision mTimeDivision2{}; + struct { + std::array<bool, 4> _0; + int _4; + } _30[10]; + sead::DelegateEvent<NewDayEvent> mNewDaySignal; + AnimalMasterController mAnimalMasterCtrl; + float mTime = DefaultTime; + float mTimeForAocFieldSkyEnv = DefaultTime; + float mNewTime = -1.0; + float mTimeStep = DefaultTimeStep; + float mBloodMoonTimer = 0.0; + float _cc; + float _d0 = 1.0; + gdt::FlagHandle mTimeFlag = gdt::InvalidHandle; + gdt::FlagHandle mNumberOfDaysFlag = gdt::InvalidHandle; + gdt::FlagHandle mTimeDivisionFlag = gdt::InvalidHandle; + gdt::FlagHandle mIsDaytimeFlag = gdt::InvalidHandle; + gdt::FlagHandle mIsNighttimeFlag = gdt::InvalidHandle; + gdt::FlagHandle mIsPlayedDemo103Flag = gdt::InvalidHandle; + gdt::FlagHandle mDemo997Flag = gdt::InvalidHandle; + gdt::FlagHandle mFindDungeonActivatedFlag = gdt::InvalidHandle; + gdt::FlagHandle mIsMorningAFlag = gdt::InvalidHandle; + gdt::FlagHandle mIsMorningBFlag = gdt::InvalidHandle; + gdt::FlagHandle mIsMoonAFlag = gdt::InvalidHandle; + gdt::FlagHandle mIsMoonBFlag = gdt::InvalidHandle; + gdt::FlagHandle mIsEveningAFlag = gdt::InvalidHandle; + gdt::FlagHandle mIsEveningBFlag = gdt::InvalidHandle; + gdt::FlagHandle mIsNightAFlag = gdt::InvalidHandle; + gdt::FlagHandle mIsNightBFlag = gdt::InvalidHandle; + gdt::FlagHandle mWaterRelicRainStopFlag = gdt::InvalidHandle; + gdt::FlagHandle mIsGetPlayerStole2Flag = gdt::InvalidHandle; + gdt::FlagHandle mBloodyDayFlag = gdt::InvalidHandle; + gdt::FlagHandle mBloodyMoonTimerFlag = gdt::InvalidHandle; + gdt::FlagHandle mBloodyEndReserveTimerFlag = gdt::InvalidHandle; + gdt::FlagHandle mIsInHyruleCastleAreaFlag = gdt::InvalidHandle; + gdt::FlagHandle mLastBossGanonBeastGenerateFlag = gdt::InvalidHandle; + gdt::FlagHandle mWindElectricBattleStartFlag = gdt::InvalidHandle; + gdt::FlagHandle mElectricRelicBattleFlag = gdt::InvalidHandle; + gdt::FlagHandle mWindRelicBattleTimeFlag = gdt::InvalidHandle; + int mNumberOfDays{}; + gdt::FlagHandle mBloodyMoonProhibitionFlag = gdt::InvalidHandle; + int mBloodyEndReserveTimer{}; + bool mNeedToHandleNewDay{}; + sead::SizedEnum<TimeUpdateMode, u8> mTimeUpdateMode{}; + bool mForceBloodyDay; + bool _14b; + sead::SizedEnum<MoonType, u8> mMoonType; + bool mPlayedDemo103Or997{}; + bool mFindDungeonActivated{}; + bool _14f{}; + bool mWasBloodyDayAndDayPassed{}; + bool mResetGdtOnNextSceneUnloadForBloodMoon{}; + bool mWasBloodyDay{}; }; KSYS_CHECK_SIZE_NX150(TimeMgr, 0x158); |
