From d9503eb561dc4fffcb1d978f8143fc5f48d2047e Mon Sep 17 00:00:00 2001 From: ragnarok-clanker Date: Thu, 29 Oct 2026 22:46:14 +0000 Subject: [PATCH] Decompile 10 functions in Source/Contents/RenewQuestMgr.cpp, Source/Contents/RenewQuestMgr.h Batch #3552 by Yommy: 0 byte-identical, 10 confirmed by peer review. - fn_05417 RenewQuestOngoingInfo::RenewQuestOngoingInfo: logic confirmed by peer review - fn_05420 RenewQuestInfo::RenewQuestInfo: logic confirmed by peer review - fn_05421 RenewQuestRecommendedInfo::RenewQuestRecommendedInfo: logic confirmed by peer review - fn_05443 CRenewQuestMgr::GetOngoingQuest: logic confirmed by peer review - fn_05445 CRenewQuestMgr::GetRecommendedQuest: logic confirmed by peer review - fn_05452 CRenewQuestMgr::AddRecommendedQuest: logic confirmed by peer review - fn_05493 CRenewQuestMgr::L_AddOngoingDescription: logic confirmed by peer review - fn_05494 CRenewQuestMgr::L_AddOngoingRewardInfo: logic confirmed by peer review - fn_05495 CRenewQuestMgr::L_AddRecommendedQuestInfo: logic confirmed by peer review - fn_05496 CRenewQuestMgr::L_InsertRecommendedQuestInfo: logic confirmed by peer review Peer-reviewed-by: eAthena, meitogi, superintelligence Accepted without human review: peers confirmed the logic ("same" ahead by at least 3, with 70% of the votes). --- Source/Contents/RenewQuestMgr.cpp | 116 ++++++++++++++++++++++++++++++ Source/Contents/RenewQuestMgr.h | 48 ++++++++++--- 2 files changed, 156 insertions(+), 8 deletions(-) diff --git a/Source/Contents/RenewQuestMgr.cpp b/Source/Contents/RenewQuestMgr.cpp index 664b8468..1a325d32 100644 --- a/Source/Contents/RenewQuestMgr.cpp +++ b/Source/Contents/RenewQuestMgr.cpp @@ -2,6 +2,7 @@ #include "Contents/MessageTable.h" #include "Network/Connection/Connection.h" #include "Network/Packets/PacketId.h" +#include "Utility/Text/TextEscapes.h" extern "C" { #include @@ -58,6 +59,38 @@ static_assert(sizeof(PACKET_CZ_QUEST_STATUS_REQ_BUFFER) == 0x800); // GLOBAL: gl_24837 CRenewQuestMgr* g_renewQuestMgr; +// OFFSET: 0x00676110 +// FUNCTION: fn_05417 +RenewQuestOngoingInfo::RenewQuestOngoingInfo() : m_simpleView(true), unknown_01B8(""), unknown_01D0("") { + this->m_descriptions.clear(); + this->m_rewards.clear(); + for (int index = 0; index < 3; ++index) { + this->m_huntUnknown00D4[index] = 31999; + this->m_huntUnknown01AC[index] = -1; + this->m_huntUnknown01B2[index] = -1; + } + + for (int index = 0; index < 3; ++index) { + for (int offset = 0; offset < 0x33; ++offset) { + this->m_huntName[index][offset] = 0; + } + } +} + +// OFFSET: 0x006765C0 +// FUNCTION: fn_05420 +RenewQuestInfo::RenewQuestInfo() + : m_state(1), m_title(""), m_icon(""), m_iconTooltip(""), unknown_004C(""), unknown_0064(""), unknown_007C(""), unknown_0094(""), + unknown_00AC(0), unknown_00B0(0) {} + +// OFFSET: 0x00676770 +// FUNCTION: fn_05421 +RenewQuestRecommendedInfo::RenewQuestRecommendedInfo() : unknown_00B4("") { + for (int index = 0; index < 3; ++index) { + this->m_descriptions[index].clear(); + } +} + // OFFSET: 0x00675990 // FUNCTION: fn_05414 CRenewQuestMgr::CRenewQuestMgr() : m_initialized(false) { @@ -141,6 +174,19 @@ std::string CRenewQuestMgr::GetIconTooltip(std::string_view icon) { return found == this->m_iconTooltips.end() ? std::string("QUEST") : found->second; } +// OFFSET: 0x00679920 +// FUNCTION: fn_05443 +const RenewQuestOngoingInfo& CRenewQuestMgr::GetOngoingQuest(unsigned int id) { + const auto found = this->m_ongoingQuests.find(id); + if (found != this->m_ongoingQuests.end()) { + return found->second; + } + + // GLOBAL: gl_24857 + static RenewQuestOngoingInfo empty; + return empty; +} + // OFFSET: 0x00679A00 // FUNCTION: fn_05444 RenewQuestOngoingInfo* CRenewQuestMgr::FindOngoingQuest(unsigned int id) { @@ -152,6 +198,19 @@ RenewQuestOngoingInfo* CRenewQuestMgr::FindOngoingQuest(unsigned int id) { return nullptr; } +// OFFSET: 0x00679AF0 +// FUNCTION: fn_05445 +const RenewQuestRecommendedInfo& CRenewQuestMgr::GetRecommendedQuest(unsigned int id) { + const auto found = this->m_recommendedQuests.find(id); + if (found != this->m_recommendedQuests.end()) { + return found->second; + } + + // GLOBAL: gl_24858 + static RenewQuestRecommendedInfo empty; + return empty; +} + // OFFSET: 0x00679BD0 // FUNCTION: fn_05446 RenewQuestRecommendedInfo* CRenewQuestMgr::FindRecommendedQuest(unsigned int id) { @@ -221,6 +280,13 @@ void CRenewQuestMgr::AddNewQuest(unsigned int id) { } } +// OFFSET: 0x0067ACE0 +// FUNCTION: fn_05452 +void CRenewQuestMgr::AddRecommendedQuest(unsigned int id, const RenewQuestRecommendedInfo& info) { + this->m_recommendedQuests.erase(id); + this->m_recommendedQuests.insert(std::make_pair(id, info)); +} + // OFFSET: 0x0067AEB0 // FUNCTION: fn_05453 bool CRenewQuestMgr::IsNewQuest(unsigned int id) { @@ -348,6 +414,56 @@ void CRenewQuestMgr::SetParameter(int key, int value) { } } +// OFFSET: 0x0067E370 +// FUNCTION: fn_05493 +int CRenewQuestMgr::L_AddOngoingDescription(lua_State* state) { + const unsigned int id = static_cast(luaL_checknumber(state, 1)); + std::string description = luaL_checkstring(state, 2); + DecodeTextEscapes(description); + g_renewQuestMgr->m_ongoingQuests[id].m_descriptions.push_back(description); + return 0; +} + +// OFFSET: 0x0067E4C0 +// FUNCTION: fn_05494 +int CRenewQuestMgr::L_AddOngoingRewardInfo(lua_State* state) { + const unsigned int id = static_cast(luaL_checknumber(state, 1)); + const unsigned int item = static_cast(luaL_checknumber(state, 2)); + const unsigned int count = static_cast(luaL_checknumber(state, 3)); + g_renewQuestMgr->m_ongoingQuests[id].m_rewards.push_back(std::make_pair(item, count)); + return 0; +} + +// OFFSET: 0x0067E570 +// FUNCTION: fn_05495 +int CRenewQuestMgr::L_AddRecommendedQuestInfo(lua_State* state) { + const unsigned int id = static_cast(luaL_checknumber(state, 1)); + const int index = static_cast(luaL_checknumber(state, 2)); + std::string description = luaL_checkstring(state, 3); + DecodeTextEscapes(description); + g_renewQuestMgr->m_recommendedQuests[id].m_descriptions[index].push_back(description); + return 0; +} + +// OFFSET: 0x0067E770 +// FUNCTION: fn_05496 +int CRenewQuestMgr::L_InsertRecommendedQuestInfo(lua_State* state) { + RenewQuestRecommendedInfo info; + const unsigned int id = static_cast(luaL_checknumber(state, 1)); + info.m_active = true; + info.m_title = luaL_checkstring(state, 2); + info.m_icon = luaL_checkstring(state, 3); + info.unknown_004C = luaL_checkstring(state, 4); + info.unknown_00B4 = luaL_checkstring(state, 5); + info.unknown_007C = luaL_checkstring(state, 6); + info.unknown_0094 = luaL_checkstring(state, 7); + info.unknown_00AC = static_cast(luaL_checknumber(state, 8)); + info.unknown_00B0 = static_cast(luaL_checknumber(state, 9)); + info.m_iconTooltip = g_renewQuestMgr->GetIconTooltip(info.m_icon); + g_renewQuestMgr->AddRecommendedQuest(id, info); + return 0; +} + // OFFSET: 0x0067E9F0 // FUNCTION: fn_05497 int CRenewQuestMgr::L_SetRecommendedQuestActive(lua_State* state) { diff --git a/Source/Contents/RenewQuestMgr.h b/Source/Contents/RenewQuestMgr.h index 1307a7e1..58739629 100644 --- a/Source/Contents/RenewQuestMgr.h +++ b/Source/Contents/RenewQuestMgr.h @@ -6,14 +6,32 @@ #include #include #include +#include +#include struct lua_State; -struct RenewQuestOngoingInfo { - /* 0000 */ unsigned char m_state; - /* 0001 */ unsigned char unknown_0001[0xB3]; +struct RenewQuestInfo { + union { + /* 0000 */ unsigned char m_state; + /* 0000 */ bool m_active; + }; + /* 0004 */ std::string m_title; + /* 001C */ std::string m_icon; + /* 0034 */ std::string m_iconTooltip; + /* 004C */ std::string unknown_004C; + /* 0064 */ std::string unknown_0064; + /* 007C */ std::string unknown_007C; + /* 0094 */ std::string unknown_0094; + /* 00AC */ int unknown_00AC; + /* 00B0 */ int unknown_00B0; + + RenewQuestInfo(); +}; + +struct RenewQuestOngoingInfo : RenewQuestInfo { /* 00B4 */ bool m_simpleView; - /* 00B5 */ unsigned char unknown_00B5[0xF]; + /* 00B8 */ std::vector m_descriptions; /* 00C4 */ short m_year; /* 00C6 */ short m_month; /* 00C8 */ short m_day; @@ -30,14 +48,20 @@ struct RenewQuestOngoingInfo { /* 01A0 */ int m_huntUnknown01A0[3]; /* 01AC */ short m_huntUnknown01AC[3]; /* 01B2 */ short m_huntUnknown01B2[3]; - /* 01B8 */ unsigned char unknown_01B8[0x48]; + /* 01B8 */ std::string unknown_01B8; + /* 01D0 */ std::string unknown_01D0; + /* 01E8 */ std::vector> m_rewards; + /* 01F8 */ __int64 unknown_01F8; + RenewQuestOngoingInfo(); std::string GetDateString() const; }; -struct RenewQuestRecommendedInfo { - /* 0000 */ bool m_active; - /* 0001 */ unsigned char unknown_0001[0xEF]; +struct RenewQuestRecommendedInfo : RenewQuestInfo { + /* 00B4 */ std::string unknown_00B4; + /* 00CC */ std::vector m_descriptions[3]; + + RenewQuestRecommendedInfo(); }; struct RenewQuestFilter { @@ -52,6 +76,10 @@ public: static int L_AddQuestFilterInfo(lua_State* state); static int L_AddQuestIconTooltip(lua_State* state); static int L_SetRecommendedQuestActive(lua_State* state); + static int L_AddOngoingDescription(lua_State* state); + static int L_AddOngoingRewardInfo(lua_State* state); + static int L_AddRecommendedQuestInfo(lua_State* state); + static int L_InsertRecommendedQuestInfo(lua_State* state); /* 0004 */ std::map m_ongoingQuests; /* 000C */ std::map m_recommendedQuests; @@ -70,11 +98,14 @@ public: void AddIconTooltip(std::string_view icon, std::string_view tooltip); std::string GetFilterName(int filter); std::string GetIconTooltip(std::string_view icon); + const RenewQuestOngoingInfo& GetOngoingQuest(unsigned int id); RenewQuestOngoingInfo* FindOngoingQuest(unsigned int id); + const RenewQuestRecommendedInfo& GetRecommendedQuest(unsigned int id); RenewQuestRecommendedInfo* FindRecommendedQuest(unsigned int id); void WriteOngoingQuests(char* buffer); int GetOngoingQuestsSize(); void AddNewQuest(unsigned int id); + void AddRecommendedQuest(unsigned int id, const RenewQuestRecommendedInfo& info); bool IsNewQuest(unsigned int id); bool IsInFilter(int filter, std::string_view icon); void SendQuestStatusRequest(); @@ -85,6 +116,7 @@ public: }; #if defined(_WIN32) && !defined(_WIN64) +static_assert(sizeof(RenewQuestInfo) == 0xB4); static_assert(sizeof(RenewQuestOngoingInfo) == 0x200); static_assert(sizeof(RenewQuestRecommendedInfo) == 0xF0); static_assert(sizeof(RenewQuestFilter) == 0x20);