From c6b30f775898f98926cd24af8378be4e8ca79999 Mon Sep 17 00:00:00 2001 From: ragnarok-clanker Date: Tue, 10 Nov 2026 15:59:52 +0000 Subject: [PATCH] Decompile 17 functions in Source/Resource/ResourceMgr.h, Source/Resource/ResourceAliases.h, ... Batch #16281 by kyoshi: 4 byte-identical, 13 confirmed by peer review. - fn_19603 CNavigationManager::MapCellToView: byte-identical - fn_18180 ResourceMgr::Resolve: logic confirmed by peer review - fn_18187 ResourceMgr::LoadAliases: logic confirmed by peer review - fn_18169 ResourceMgr::~ResourceMgr: logic confirmed by peer review (already on main) - fn_18173 ResourceMgr::FindType: byte-identical - fn_18176 ResourceMgr::Load: logic confirmed by peer review (already on main) - fn_18181 ResourceMgr::Exists: logic confirmed by peer review (already on main) - fn_18188 ResourceMgr::Register: logic confirmed by peer review (already on main) - fn_18189 ResourceMgr::UnloadAll: byte-identical (already on main) - fn_18190 ResourceMgr::Remove: logic confirmed by peer review (already on main) - fn_18191 ResourceMgr::ClearExpired: logic confirmed by peer review (already on main) - fn_18192 ResourceMgr::ClearUnused: logic confirmed by peer review (already on main) - fn_18193 ResourceMgr::ClearUnused: logic confirmed by peer review (already on main) - fn_18209 ResourceMgr::Instance: logic confirmed by peer review (already on main) - fn_18175 ResourceMgr::Load: logic confirmed by peer review (already on main) - fn_18182 ResourceMgr::Exists: logic confirmed by peer review (already on main) - fn_18186 ResourceMgr::UpdateTransient: byte-identical (already on main) Peer-reviewed-by: Yommy, youko Accepted without human review: peers confirmed the logic ("same" ahead by at least 3, with 70% of the votes). --- Source/Client/Application/Launcher.cpp | 2 +- Source/Contents/NavigationCandidates.cpp | 2 +- Source/Contents/NavigationRequest.cpp | 2 +- Source/Contents/NavigationRoute.cpp | 10 ++++---- Source/Contents/NavigationSource.cpp | 4 ++-- Source/Resource/ResourceAliases.cpp | 19 ++++++++------- Source/Resource/ResourceAliases.h | 13 ---------- Source/Resource/ResourceMgr.cpp | 14 +++++------ Source/Resource/ResourceMgr.h | 30 +++++++++++++++++------- 9 files changed, 49 insertions(+), 47 deletions(-) diff --git a/Source/Client/Application/Launcher.cpp b/Source/Client/Application/Launcher.cpp index 47c07e99b..aea4d5463 100644 --- a/Source/Client/Application/Launcher.cpp +++ b/Source/Client/Application/Launcher.cpp @@ -1655,7 +1655,7 @@ int WINAPI WinMain(HINSTANCE instance, HINSTANCE previous, LPSTR commandLine, in const std::array resourceNamesSource = {'\x8F', '\xA4', '\x00', '\x0D', '\x46', '\x3C', '\x78', '\x4B', '\x9C', '\xA3', '\x1F', '\x26', '\x09', '\x25', '\x65', '\x6B', '\xFD'}; thread_local EncryptedName resourceNames(resourceNamesSource); - resources.aliases.Load(reinterpret_cast(resourceNames.Text())); + resources.LoadAliases(reinterpret_cast(resourceNames.Text())); if (!InitApp(instance, showCommand)) { return 1; diff --git a/Source/Contents/NavigationCandidates.cpp b/Source/Contents/NavigationCandidates.cpp index 59ecdbbac..eaba8aecc 100644 --- a/Source/Contents/NavigationCandidates.cpp +++ b/Source/Contents/NavigationCandidates.cpp @@ -15,7 +15,7 @@ bool CNavigationManager::CollectStartLinks() { CNaviInfo* info = this->FindObject(g_session.m_navigationPlayerMap); if (info == nullptr) { - const std::string resolved = ResourceMgr::Instance().aliases.ResolveMapName(g_session.m_navigationPlayerMap); + const std::string resolved = ResourceMgr::Instance().ResolveMapName(g_session.m_navigationPlayerMap); info = this->FindObject(resolved.c_str()); if (info == nullptr) { g_windowMgr.Confirm(LookupMessage(MSI_NAVIGATION_RS_FAILSTARTDATA), 0, true, false, 0, "Message", 280, 120, 0); diff --git a/Source/Contents/NavigationRequest.cpp b/Source/Contents/NavigationRequest.cpp index 746cd39ed..cb7add2e6 100644 --- a/Source/Contents/NavigationRequest.cpp +++ b/Source/Contents/NavigationRequest.cpp @@ -173,7 +173,7 @@ int CNavigationManager::RequestRoute(int cellX, int cellY) { this->selectedNode = -1; CNaviInfo* info = this->FindObject(g_session.m_navigationPlayerMap); if (info == nullptr) { - const std::string resolved = ResourceMgr::Instance().aliases.ResolveMapName(g_session.m_navigationPlayerMap); + const std::string resolved = ResourceMgr::Instance().ResolveMapName(g_session.m_navigationPlayerMap); info = this->FindObject(resolved.c_str()); if (info == nullptr) { return -93; diff --git a/Source/Contents/NavigationRoute.cpp b/Source/Contents/NavigationRoute.cpp index a9be026f8..c831f416c 100644 --- a/Source/Contents/NavigationRoute.cpp +++ b/Source/Contents/NavigationRoute.cpp @@ -213,7 +213,7 @@ bool CNavigationManager::BuildRoute(int startX, int startY, int destX, int destY CNaviInfo* info = this->FindObject(g_session.m_navigationPlayerMap); if (info == nullptr) { - const std::string resolved = ResourceMgr::Instance().aliases.ResolveMapName(g_session.m_navigationPlayerMap); + const std::string resolved = ResourceMgr::Instance().ResolveMapName(g_session.m_navigationPlayerMap); info = this->FindObject(resolved.c_str()); if (info == nullptr) { return found; @@ -288,7 +288,7 @@ void CNavigationManager::RequestPrivateAirship(std::string mapName, int itemId) NaviCell* CNavigationManager::MapCellToView(NaviCell* out, const char* mapName, int cellX, int cellY, float size) { CNaviInfo* info = this->FindObject(mapName); if (info == nullptr) { - const std::string resolved = ResourceMgr::Instance().aliases.ResolveMapName(mapName); + const std::string resolved = ResourceMgr::Instance().ResolveMapName(mapName); info = this->FindObject(resolved.c_str()); } @@ -629,7 +629,7 @@ bool CNavigationManager::StartNavigation(std::string name, int type, unsigned ch CNaviInfo* info = this->FindObject(name.c_str()); if (!info) { - const std::string resolved = ResourceMgr::Instance().aliases.ResolveMapName(name.c_str()); + const std::string resolved = ResourceMgr::Instance().ResolveMapName(name.c_str()); info = this->FindObject(resolved.c_str()); if (!info) { return false; @@ -1633,7 +1633,7 @@ bool CNavigationManager::RouteToSavedTarget(int cellX, int cellY) { x = cellX; y = cellY; std::string name(info->GetName()); - name = ResourceMgr::Instance().aliases.ResolveMapName(name.c_str()); + name = ResourceMgr::Instance().ResolveMapName(name.c_str()); if (!this->pathFinder.LoadAttr(name) || !this->pathFinder.Walkable(cellX, cellY)) { return false; } @@ -1722,7 +1722,7 @@ __declspec(noinline) int CNavigationManager::Navigate(int cellX, int cellY) { bool sameMap = std::strcmp(info->GetName(), g_session.m_navigationPlayerMap) == 0; if (!sameMap) { - const std::string resolved = ResourceMgr::Instance().aliases.ResolveMapName(g_session.m_navigationPlayerMap); + const std::string resolved = ResourceMgr::Instance().ResolveMapName(g_session.m_navigationPlayerMap); sameMap = std::strcmp(info->GetName(), resolved.c_str()) == 0; } diff --git a/Source/Contents/NavigationSource.cpp b/Source/Contents/NavigationSource.cpp index 6c4d553ab..4105e80ac 100644 --- a/Source/Contents/NavigationSource.cpp +++ b/Source/Contents/NavigationSource.cpp @@ -90,7 +90,7 @@ bool CNavigationManager::IsCurrentTarget(const char* name) const { return true; } - const std::string resolved = ResourceMgr::Instance().aliases.ResolveMapName(name); + const std::string resolved = ResourceMgr::Instance().ResolveMapName(name); return std::strcmp(info->GetName(), resolved.c_str()) == 0; } @@ -619,7 +619,7 @@ void CNavigationManager::ClearCurrentObject() { int CNavigationManager::RouteFromPlayer() { CNaviInfo* info = this->FindObject(g_session.m_navigationPlayerMap); if (info == nullptr) { - const std::string resolved = ResourceMgr::Instance().aliases.ResolveMapName(g_session.m_navigationPlayerMap); + const std::string resolved = ResourceMgr::Instance().ResolveMapName(g_session.m_navigationPlayerMap); info = this->FindObject(resolved.c_str()); if (info == nullptr) { this->drawRoute = false; diff --git a/Source/Resource/ResourceAliases.cpp b/Source/Resource/ResourceAliases.cpp index 1a29b5fbd..f4ee1ac5f 100644 --- a/Source/Resource/ResourceAliases.cpp +++ b/Source/Resource/ResourceAliases.cpp @@ -1,4 +1,5 @@ #include "Resource/ResourceAliases.h" +#include "Resource/ResourceMgr.h" #include "File/File.h" #include @@ -6,9 +7,9 @@ // OFFSET: 0x00AEF500 // FUNCTION: fn_18180 -const char* ResourceAliases::Resolve(const char* name) const { - auto entry = this->names.find(name); - if (entry != this->names.end()) { +const char* ResourceMgr::Resolve(const char* name) const { + auto entry = this->m_aliases.find(name); + if (entry != this->m_aliases.end()) { return entry->second.c_str(); } @@ -16,8 +17,8 @@ const char* ResourceAliases::Resolve(const char* name) const { const std::size_t marker = key.rfind('@'); if (marker != std::string::npos && marker >= 4) { key.erase(marker - 4, 3); - entry = this->names.find(key); - if (entry != this->names.end()) { + entry = this->m_aliases.find(key); + if (entry != this->m_aliases.end()) { return entry->second.c_str(); } } @@ -37,7 +38,7 @@ std::string AddResourcePrefix(const char* name, const char* prefix) { // OFFSET: 0x00AEF3A0 // FUNCTION: fn_18179 -std::string ResourceAliases::ResolveMapName(const char* name) const { +std::string ResourceMgr::ResolveMapName(const char* name) const { std::string filename(name); filename += ".gat"; const char* resolved = this->Resolve(filename.c_str()); @@ -47,8 +48,8 @@ std::string ResourceAliases::ResolveMapName(const char* name) const { // OFFSET: 0x00AEFE50 // FUNCTION: fn_18187 -void ResourceAliases::Load(int) { - this->names.clear(); +void ResourceMgr::LoadAliases(int) { + this->m_aliases.clear(); CFile file; if (!file.Open("ResNameTable.txt", 0, true, false)) { return; @@ -73,7 +74,7 @@ void ResourceAliases::Load(int) { name = token; } else { replacement = token; - this->names.insert(std::make_pair(name, replacement)); + this->m_aliases.insert(std::make_pair(name, replacement)); name.clear(); replacement.clear(); } diff --git a/Source/Resource/ResourceAliases.h b/Source/Resource/ResourceAliases.h index f38ed0c85..daba834c9 100644 --- a/Source/Resource/ResourceAliases.h +++ b/Source/Resource/ResourceAliases.h @@ -1,21 +1,8 @@ #ifndef RAGNAROK_SOURCE_RESOURCE_RESOURCEALIASES_H #define RAGNAROK_SOURCE_RESOURCE_RESOURCEALIASES_H -#include #include -struct ResourceAliases { - /* 0044 */ std::map names; - - const char* Resolve(const char* name) const; - std::string ResolveMapName(const char* name) const; - void Load(int option); -}; - -#if defined(_WIN32) && !defined(_WIN64) -static_assert(sizeof(ResourceAliases) == 0x08); -#endif - std::string AddResourcePrefix(const char* name, const char* prefix); #endif diff --git a/Source/Resource/ResourceMgr.cpp b/Source/Resource/ResourceMgr.cpp index abe373a21..d792f6393 100644 --- a/Source/Resource/ResourceMgr.cpp +++ b/Source/Resource/ResourceMgr.cpp @@ -80,13 +80,13 @@ int ResourceMgr::FindType(const char* extension) const { } const auto entry = this->m_extensions.find(extension); - if (entry != this->m_extensions.end()) { - return entry->second; + if (entry == this->m_extensions.end()) { + char text[256]; + std::sprintf(text, "ResourceError : %s is Undefined Ext \n", extension); + return -1; } - char text[256]; - std::sprintf(text, "ResourceError : %s is Undefined Ext \n", extension); - return -1; + return entry->second; } // OFFSET: 0x00AEE6B0 @@ -151,7 +151,7 @@ __forceinline CRes* ResourceMgr::LoadNamed(const char* name) { return nullptr; } - resolved = AddResourcePrefix(this->aliases.Resolve(normalized), this->m_prefixes[type]); + resolved = AddResourcePrefix(this->Resolve(normalized), this->m_prefixes[type]); if (CRes* existing = this->Find(type, resolved.c_str())) { existing->lastUse = timeGetTime(); return existing; @@ -213,7 +213,7 @@ void ResourceMgr::Remove(CRes* resource) { } // INLINED -void ResourceMgr::EraseTransient(CRes* resource) { +__forceinline void ResourceMgr::EraseTransient(CRes* resource) { auto entry = std::find(this->m_transient.begin(), this->m_transient.end(), resource); if (entry != this->m_transient.end()) { this->m_transient.erase(entry); diff --git a/Source/Resource/ResourceMgr.h b/Source/Resource/ResourceMgr.h index bc8776eb7..3b1c75ce7 100644 --- a/Source/Resource/ResourceMgr.h +++ b/Source/Resource/ResourceMgr.h @@ -10,6 +10,17 @@ #include #include +struct ResourceExtensionLess { + bool operator()(const char* left, const char* right) const { + while (*left == *right && *left != '\0') { + ++left; + ++right; + } + + return static_cast(*left) < static_cast(*right); + } +}; + struct ResourceNameLess { bool operator()(const ResourceName* left, const ResourceName* right) const; }; @@ -32,16 +43,19 @@ public: void ClearUnused(); void ClearExpired(); void UpdateTransient(); - ResourceAliases aliases; + const char* Resolve(const char* name) const; + std::string ResolveMapName(const char* name) const; + void LoadAliases(int option); private: - std::map m_extensions; - std::vector m_prefixes; - std::vector m_prototypes; - std::vector> m_resources; - CRITICAL_SECTION m_lock; - std::vector m_transient; - std::uint32_t unknown_004C[17]; + /* 0000 */ std::map m_extensions; + /* 0008 */ std::vector m_prefixes; + /* 0014 */ std::vector m_prototypes; + /* 0020 */ std::vector> m_resources; + /* 002C */ CRITICAL_SECTION m_lock; + /* 0044 */ std::map m_aliases; + /* 004C */ std::uint32_t unknown_004C[17]; + /* 0090 */ std::vector m_transient; void EraseTransient(CRes* resource); CRes* LoadNamed(const char* name); ResourceMgr(const ResourceMgr&) = delete;