diff --git a/Source/Contents/Schedule/TimeScheduler.cpp b/Source/Contents/Schedule/TimeScheduler.cpp new file mode 100644 index 00000000..7eea560f --- /dev/null +++ b/Source/Contents/Schedule/TimeScheduler.cpp @@ -0,0 +1,119 @@ +#include "Contents/Schedule/TimeScheduler.h" +#include "Contents/Schedule/CheckGDISchedule.h" + +#include + +extern "C" long long _Xtime_get_ticks(); + +// INLINED +CTimeScheduler::CTimeScheduler() { + this->m_initialized = this->Init(); + this->m_unknown_000D = false; +} + +// INLINED +CTimeScheduler::~CTimeScheduler() { + for (CSchedule* schedule : this->m_schedules) { + if (schedule != nullptr) { + delete schedule; + } + } + this->m_schedules.clear(); + this->m_unknown_000D = false; +} + +// OFFSET: 0x00BA91E0 +// FUNCTION: fn_19733 +bool CTimeScheduler::Init() { + return true; +} + +// OFFSET: 0x00BA91F0 +// FUNCTION: fn_19734 +bool CTimeScheduler::Create() { + if (g_timeScheduler != nullptr) { + return false; + } + + CTimeScheduler* scheduler = new (std::nothrow) CTimeScheduler(); + g_timeScheduler = reinterpret_cast(scheduler); + if (scheduler != nullptr) { + if (scheduler->m_initialized) { + return true; + } + delete scheduler; + g_timeScheduler = nullptr; + } + return false; +} + +// OFFSET: 0x00BA9340 +// FUNCTION: fn_19735 +void CTimeScheduler::Destroy() { + if (g_timeScheduler != nullptr) { + delete reinterpret_cast(g_timeScheduler); + g_timeScheduler = nullptr; + } +} + +// OFFSET: 0x00BA9360 +// FUNCTION: fn_19736 +CSchedule* CTimeScheduler::FindSchedule(int serial) { + for (CSchedule* schedule : this->m_schedules) { + if (schedule->serial == serial) { + return schedule; + } + } + return nullptr; +} + +// OFFSET: 0x00BA94E0 +// FUNCTION: fn_19737 +CSchedule* CTimeScheduler::AddSchedule(CSchedule* schedule) { + if (schedule == nullptr) { + return nullptr; + } + schedule->timestamp = _Xtime_get_ticks(); + this->m_schedules.push_back(schedule); + return schedule; +} + +// OFFSET: 0x00BA9550 +// FUNCTION: fn_19738 +void CTimeScheduler::Process() { + if (this->m_unknown_000D) { + return; + } + + auto it = this->m_schedules.begin(); + while (it != this->m_schedules.end()) { + CSchedule* schedule = *it; + if (schedule == nullptr) { + ++it; + continue; + } + + if (schedule->active) { + uint64_t now = _Xtime_get_ticks(); + if (!schedule->unknown_0025) { + if (schedule->CheckTime(now)) { + schedule->Process(now); + } + } + ++it; + } else { + it = this->m_schedules.erase(it); + delete schedule; + } + } +} + +// OFFSET: 0x00BA95F0 +// FUNCTION: fn_19739 +void CTimeScheduler::sub_BA95F0(int value) { + for (CSchedule* schedule : this->m_schedules) { + if (schedule->unknown_002C == value) { + schedule->active = false; + } + } +} diff --git a/Source/Contents/Schedule/TimeScheduler.h b/Source/Contents/Schedule/TimeScheduler.h new file mode 100644 index 00000000..5af30507 --- /dev/null +++ b/Source/Contents/Schedule/TimeScheduler.h @@ -0,0 +1,37 @@ +#ifndef RAGNAROK_SOURCE_CONTENTS_SCHEDULE_TIMESCHEDULER_H +#define RAGNAROK_SOURCE_CONTENTS_SCHEDULE_TIMESCHEDULER_H + +#include "Contents/Schedule/Schedule.h" + +#include +#include +#include + +// VTABLE: vt_01790 +class CTimeScheduler { +public: + /* 0004 */ std::list m_schedules; + /* 000C */ bool m_initialized; + /* 000D */ bool m_unknown_000D; + + CTimeScheduler(); + virtual ~CTimeScheduler(); + + static bool Create(); + static void Destroy(); + + bool Init(); + CSchedule* FindSchedule(int serial); + CSchedule* AddSchedule(CSchedule* schedule); + void Process(); + void sub_BA95F0(int value); +}; + +#if defined(_WIN32) && !defined(_WIN64) +static_assert(sizeof(CTimeScheduler) == 0x10); +static_assert(offsetof(CTimeScheduler, m_schedules) == 0x04); +static_assert(offsetof(CTimeScheduler, m_initialized) == 0x0C); +static_assert(offsetof(CTimeScheduler, m_unknown_000D) == 0x0D); +#endif + +#endif diff --git a/data/compile.json b/data/compile.json index 51c2db72..2d0e80b8 100644 --- a/data/compile.json +++ b/data/compile.json @@ -559,6 +559,7 @@ "Source/Contents/Schedule/PartialShutDownSchedule.cpp": 4, "Source/Contents/Schedule/Schedule.cpp": 4, "Source/Contents/Schedule/ShutDownSchedule.cpp": 4, + "Source/Contents/Schedule/TimeScheduler.cpp": 4, "Source/Contents/ServerTimeManager.cpp": 4, "Source/Contents/ShowRankingScheduler.cpp": 4, "Source/Contents/SignBoard/SignBoard.cpp": 4,