From b29ecf3d22f0d4bfc0ae47c73572ae3d5b6d79eb Mon Sep 17 00:00:00 2001 From: ragnarok-clanker Date: Thu, 29 Oct 2026 17:23:00 +0000 Subject: [PATCH] Decompile 2 functions in Source/Contents/ShowRankingScheduler.cpp, Source/Contents/ShowRankingScheduler.h Batch #2495 by willerthal: 0 byte-identical, 2 confirmed by peer review. - fn_04735 CShowRankingScheduler::CShowRankingScheduler: logic confirmed by peer review - fn_04739 CShowRankingScheduler::Process: logic confirmed by peer review Peer-reviewed-by: bigodeira Reviewed-by: ragnarok-clanker --- Source/Contents/ShowRankingScheduler.cpp | 75 ++++++++++++++++++++++++ Source/Contents/ShowRankingScheduler.h | 3 + 2 files changed, 78 insertions(+) diff --git a/Source/Contents/ShowRankingScheduler.cpp b/Source/Contents/ShowRankingScheduler.cpp index 1f179d2d..05f9bc2d 100644 --- a/Source/Contents/ShowRankingScheduler.cpp +++ b/Source/Contents/ShowRankingScheduler.cpp @@ -1,8 +1,83 @@ #include "Contents/ShowRankingScheduler.h" +#include "Contents/MessageTable.h" +#include "Contents/PlayerNameDictionary.h" +#include "UI/Window/UIWindowMgr.h" + #include +#include #include #include +#include + +// GLOBAL: gl_24719 +int g_schedulerSerial; + +// GLOBAL: gl_24731 +std::string g_namelessName; + +// OFFSET: 0x00637550 +// FUNCTION: fn_04735 +CShowRankingScheduler::CShowRankingScheduler(const std::uint64_t& start, const std::uint64_t& end, int extra) { + ++g_schedulerSerial; + *reinterpret_cast(this->schedule + 4) = g_schedulerSerial; + *reinterpret_cast(this->schedule + 12) = start; + *reinterpret_cast(this->schedule + 20) = end; + *reinterpret_cast(this->schedule + 28) = extra; + *reinterpret_cast(this->schedule + 32) = 1; + *reinterpret_cast(this->schedule + 36) = 0; + *reinterpret_cast(this->schedule + 40) = 0; + this->unknown_0088 = 0; + this->unknown_008C = 0; + std::memset(this->rankingData, 0, sizeof(this->rankingData)); + if (this->rankingList.capacity() < 16) { + this->rankingList.reserve(16); + } +} + +// OFFSET: 0x00637C60 +// FUNCTION: fn_04739 +void CShowRankingScheduler::Process(const std::uint64_t& now) { + if (*reinterpret_cast(this->rankingData) != 0) { + const std::int64_t count = + static_cast((static_cast(this->unknown_008C) << 32) | this->unknown_0088); + if (count > 0) { + const std::uint64_t due = + static_cast(count) * 10000ull + *reinterpret_cast(this->schedule + 12); + if (static_cast(due) <= static_cast(now)) { + this->Show(); + } else { + bool complete = true; + const auto* ids = reinterpret_cast(this->rankingData + 4); + for (int index = 0; index < 10; ++index) { + const std::uint32_t id = ids[index]; + if (id == 0) { + continue; + } + std::string name; + for (std::uint32_t listed : this->rankingList) { + if (listed == id) { + name = g_namelessName; + break; + } + } + if (name.find(g_namelessName) == std::string::npos) { + name = LookupPlayerName(id); + if (name.empty()) { + complete = false; + } + } + } + if (!complete) { + g_windowMgr.SendNotice(1, reinterpret_cast(LookupMessage(3481)), 0xffff, 0, 0, 0); + return; + } + this->Show(); + } + } + } + this->schedule[32] = 0; +} // OFFSET: 0x006378D0 // FUNCTION: fn_04738 diff --git a/Source/Contents/ShowRankingScheduler.h b/Source/Contents/ShowRankingScheduler.h index 0e76c205..d3235b42 100644 --- a/Source/Contents/ShowRankingScheduler.h +++ b/Source/Contents/ShowRankingScheduler.h @@ -16,9 +16,12 @@ std::map RankingBoardStyles(); class CShowRankingScheduler { public: + CShowRankingScheduler(const std::uint64_t& start, const std::uint64_t& end, int extra); virtual ~CShowRankingScheduler() = default; const void* SetData(const void* data); + void Process(const std::uint64_t& now); + void Show(); /* 0004 */ std::uint8_t schedule[44]; /* 0030 */ std::uint8_t rankingData[88];