diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 76d4859d..2ba8f635 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -1497,7 +1497,7 @@ 0x00000071000541d0,ActorObserverBase::m6,8, 0x00000071000541d8,sub_71000541D8,372,_ZN5uking6action26CollaboShootingStarAreaTag33checkDerivedRuntimeTypeInfoStaticEPKN4sead15RuntimeTypeInfo9InterfaceE 0x000000710005434c,_ZNK4sead15RuntimeTypeInfo6DeriveIN5uking6action13AreaTagActionEE9isDerivedEPKNS0_9InterfaceE,140,_ZNK4sead15RuntimeTypeInfo6DeriveIN5uking6action13AreaTagActionEE9isDerivedEPKNS0_9InterfaceE -0x00000071000543d8,sub_71000543D8,140, +0x00000071000543d8,sub_71000543D8,140,_ZNK4sead15RuntimeTypeInfo6DeriveIN4ksys5world3JobEE9isDerivedEPKNS0_9InterfaceE 0x0000007100054464,AI_Action_CreateDragonChallengeXLink::ctor,52,_ZN5uking6action26CreateDragonChallengeXLinkC1ERKN4ksys3act2ai10ActionBase7InitArgE 0x0000007100054498,_ZN5uking6action26CreateDragonChallengeXLinkD1Ev,20,_ZN5uking6action26CreateDragonChallengeXLinkD1Ev 0x00000071000544ac,_ZN5uking6action26CreateDragonChallengeXLinkD0Ev,52,_ZN5uking6action26CreateDragonChallengeXLinkD0Ev @@ -89357,14 +89357,14 @@ 0x00000071010e5fc4,wm::TempMgr::rtti1,204, 0x00000071010e6090,wm::TempMgr::rtti2,92, 0x00000071010e60ec,wm::TempMgr::getType,8, -0x00000071010e60f4,wm::TimeMgr::ctor,228, -0x00000071010e61d8,wm::TimeMgr::init,36, -0x00000071010e61fc,wm::TimeMgr::resetForStageUnload,124, +0x00000071010e60f4,wm::TimeMgr::ctor,228,_ZN4ksys5world7TimeMgrC1Ev +0x00000071010e61d8,wm::TimeMgr::init,36,_ZN4ksys5world7TimeMgr5init_EPN4sead4HeapE +0x00000071010e61fc,wm::TimeMgr::resetForStageUnload,124,_ZN4ksys5world7TimeMgr19resetForStageUnloadEv 0x00000071010e6278,wm::TimeMgr::loadInfo,388, 0x00000071010e63fc,wm::TimeMgr::loadFlags,1632, -0x00000071010e6a5c,wm::TimeMgr::dtor,172, -0x00000071010e6b08,sub_71010E6B08,132, -0x00000071010e6b8c,wm::TimeMgr::dtorDelete,180, +0x00000071010e6a5c,wm::TimeMgr::dtor,172,_ZN4ksys5world7TimeMgrD1Ev +0x00000071010e6b08,sub_71010E6B08,132,_ZN4sead13DelegateEventIN4ksys5world7TimeMgr11NewDayEventEED2Ev +0x00000071010e6b8c,wm::TimeMgr::dtorDelete,180,_ZN4ksys5world7TimeMgrD0Ev 0x00000071010e6c40,wm::TimeMgr::callBloodMoonDemo,104, 0x00000071010e6ca8,wm::TimeMgr::isBloodyMoonProhibited,364, 0x00000071010e6e14,wm::TimeMgr::isBloodyMoonProhibitionFlagSet,120, @@ -89373,9 +89373,9 @@ 0x00000071010e7260,nullsub_4540,4, 0x00000071010e7264,wm::TimeMgr::calc,2676, 0x00000071010e7cd8,wm::TimeMgr::AnimalMasterFlags::calc,772, -0x00000071010e7fdc,wm::TimeMgr::m7_null,4, -0x00000071010e7fe0,wm::TimeMgr::m8_null,4, -0x00000071010e7fe4,wm::TimeMgr::setNewTime,16, +0x00000071010e7fdc,wm::TimeMgr::m7_null,4,_ZN4ksys5world7TimeMgr10calcType1_Ev +0x00000071010e7fe0,wm::TimeMgr::m8_null,4,_ZN4ksys5world7TimeMgr10calcType2_Ev +0x00000071010e7fe4,wm::TimeMgr::setNewTime,16,_ZN4ksys5world7TimeMgr10setNewTimeEf 0x00000071010e7ff4,wm::TimeMgr::setTime,220, 0x00000071010e80d0,wm::TimeMgr::isBloodyDay,124, 0x00000071010e814c,wm::TimeMgr::getTime,72, @@ -89385,11 +89385,11 @@ 0x00000071010e82b0,wm::TimeMgr::bloodMoonTonight,188, 0x00000071010e836c,wm::getTimeOfDayTempMultiplier,176, 0x00000071010e841c,wm::TimeMgr::getField14F,8, -0x00000071010e8424,wm::TimeMgr::rtti1,204, -0x00000071010e84f0,wm::TimeMgr::rtti2,92, -0x00000071010e854c,wm::TimeMgr::getType,8, +0x00000071010e8424,wm::TimeMgr::rtti1,204,_ZNK4ksys5world7TimeMgr27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE +0x00000071010e84f0,wm::TimeMgr::rtti2,92,_ZNK4ksys5world7TimeMgr18getRuntimeTypeInfoEv +0x00000071010e854c,wm::TimeMgr::getType,8,_ZNK4ksys5world7TimeMgr7getTypeEv 0x00000071010e8554,j__ZdlPv_1202,4, -0x00000071010e8558,sub_71010E8558,148, +0x00000071010e8558,sub_71010E8558,148,_ZN4sead13DelegateEventIN4ksys5world7TimeMgr11NewDayEventEED0Ev 0x00000071010e85ec,wm::getWeatherMgr,56, 0x00000071010e8624,sub_71010E8624,12, 0x00000071010e8630,sub_71010E8630,12, 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 +#include +#include +#include +#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); - u8 _20[0x158 - 0x20]; +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; + + bool _20; + bool _21; + u16 _22; + bool _24; + TimeDivision mTimeDivision{}; + TimeDivision mTimeDivision2{}; + struct { + std::array _0; + int _4; + } _30[10]; + sead::DelegateEvent 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 mTimeUpdateMode{}; + bool mForceBloodyDay; + bool _14b; + sead::SizedEnum mMoonType; + bool mPlayedDemo103Or997{}; + bool mFindDungeonActivated{}; + bool _14f{}; + bool mWasBloodyDayAndDayPassed{}; + bool mResetGdtOnNextSceneUnloadForBloodMoon{}; + bool mWasBloodyDay{}; }; KSYS_CHECK_SIZE_NX150(TimeMgr, 0x158);