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).
This commit is contained in:
ragnarok-clanker 2026-10-29 22:46:14 +00:00
commit d9503eb561
2 changed files with 156 additions and 8 deletions

View file

@ -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 <lua.h>
@ -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<unsigned int>(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<unsigned int>(luaL_checknumber(state, 1));
const unsigned int item = static_cast<unsigned int>(luaL_checknumber(state, 2));
const unsigned int count = static_cast<unsigned int>(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<unsigned int>(luaL_checknumber(state, 1));
const int index = static_cast<int>(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<unsigned int>(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<int>(luaL_checknumber(state, 8));
info.unknown_00B0 = static_cast<int>(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) {

View file

@ -6,14 +6,32 @@
#include <set>
#include <string>
#include <string_view>
#include <utility>
#include <vector>
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<std::string> 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<std::pair<unsigned int, unsigned int>> 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<std::string> 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<unsigned int, RenewQuestOngoingInfo> m_ongoingQuests;
/* 000C */ std::map<unsigned int, RenewQuestRecommendedInfo> 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);