summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLéo Lam <leo@leolam.fr>2021-05-01 22:14:23 +0200
committerLéo Lam <leo@leolam.fr>2021-05-02 01:29:52 +0200
commite5e2427c8bf997469c5f99bdb95cf8e75d844ebc (patch)
tree2dcf003da0139cc7619cd2c0f23e309d4da49d28 /src
parent461967e278f5d3973fc50cfd1a3c96b07ef362fe (diff)
ksys/world: Start adding TimeMgr
Diffstat (limited to 'src')
-rw-r--r--src/KingSystem/World/worldTimeMgr.cpp60
-rw-r--r--src/KingSystem/World/worldTimeMgr.h126
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);