#include "Contents/AdventureGuideMgr.h" #include "Client/Session.h" #include #include #include // GLOBAL: gl_24502 CAdventureGuideMgr* g_adventureGuideMgr; using AdventureGuideEntryTable = std::map>; using AdventureGuideContentsTable = std::map>; // OFFSET: 0x0065F680 // FUNCTION: fn_05189 static std::optional FindMapped(AdventureGuideEntryTable& map, const int& key) { auto it = map.find(key); if (it == map.end()) { return std::nullopt; } return &it->second; } // OFFSET: 0x0065F6D0 // FUNCTION: fn_05190 static std::optional FindMapped(AdventureGuideContentsTable& map, const int& key) { auto it = map.find(key); if (it == map.end()) { return std::nullopt; } return &it->second; } // OFFSET: 0x00660F70 // FUNCTION: fn_05222 CAdventureGuideMgr::CAdventureGuideMgr() : m_initialized(true) { } // OFFSET: 0x006629D0 // FUNCTION: fn_05227 CAdventureGuideMgr::~CAdventureGuideMgr() { } // OFFSET: 0x00663680 // FUNCTION: fn_05235 void CAdventureGuideMgr::Destroy() { if (g_adventureGuideMgr) { delete g_adventureGuideMgr; g_adventureGuideMgr = nullptr; } } // OFFSET: 0x00663890 // FUNCTION: fn_05237 void CAdventureGuideMgr::GetEpisodeList(std::list& out) { out.clear(); for (const AdventureGuideEpisode& episode : m_episodes) { if (episode.order <= g_session.m_level && g_session.m_level <= episode.unknown_001C) { out.push_back(episode); } } } // OFFSET: 0x006639D0 // FUNCTION: fn_05238 void CAdventureGuideMgr::GetContentsList(std::list>& out, int type, int id) { out.clear(); std::map>* table; switch (type) { case 1: table = &unknown_003C; break; case 3: table = &unknown_0044; break; case 4: table = &unknown_004C; break; default: return; } std::optional*> contents = FindMapped(*table, id); if (!contents) { return; } std::copy_if((*contents)->begin(), (*contents)->end(), std::back_inserter(out), [](const std::pair& entry) { return entry.second.unknown_0004 <= g_session.m_level && g_session.m_level <= entry.second.unknown_0008; }); out.sort([](const std::pair& lhs, const std::pair& rhs) { return lhs.second.unknown_0004 < rhs.second.unknown_0004; }); } // OFFSET: 0x006636A0 // FUNCTION: fn_05236 void CAdventureGuideMgr::GetEntryList(std::list>& out, int type, int id) { out.clear(); std::map>* table; switch (type) { case 5: table = &unknown_0054; break; case 6: table = &unknown_005C; break; default: return; } std::optional*> entries = FindMapped(*table, id); if (!entries) { return; } std::copy((*entries)->begin(), (*entries)->end(), std::back_inserter(out)); out.sort([](const std::pair& lhs, const std::pair& rhs) { return lhs.second.unknown_0004 < rhs.second.unknown_0004; }); }