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).
This commit is contained in:
ragnarok-clanker 2026-11-10 15:59:52 +00:00
commit c6b30f7758
9 changed files with 49 additions and 47 deletions

View file

@ -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<sizeof(resourceNamesSource), 0x1F1D51274373C1FDULL> resourceNames(resourceNamesSource);
resources.aliases.Load(reinterpret_cast<int>(resourceNames.Text()));
resources.LoadAliases(reinterpret_cast<int>(resourceNames.Text()));
if (!InitApp(instance, showCommand)) {
return 1;

View file

@ -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);

View file

@ -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;

View file

@ -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;
}

View file

@ -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;

View file

@ -1,4 +1,5 @@
#include "Resource/ResourceAliases.h"
#include "Resource/ResourceMgr.h"
#include "File/File.h"
#include <cstdlib>
@ -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();
}

View file

@ -1,21 +1,8 @@
#ifndef RAGNAROK_SOURCE_RESOURCE_RESOURCEALIASES_H
#define RAGNAROK_SOURCE_RESOURCE_RESOURCEALIASES_H
#include <map>
#include <string>
struct ResourceAliases {
/* 0044 */ std::map<std::string, std::string> 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

View file

@ -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);

View file

@ -10,6 +10,17 @@
#include <vector>
#include <windows.h>
struct ResourceExtensionLess {
bool operator()(const char* left, const char* right) const {
while (*left == *right && *left != '\0') {
++left;
++right;
}
return static_cast<unsigned char>(*left) < static_cast<unsigned char>(*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<std::string, int> m_extensions;
std::vector<const char*> m_prefixes;
std::vector<CRes*> m_prototypes;
std::vector<std::map<const ResourceName*, CRes*, ResourceNameLess>> m_resources;
CRITICAL_SECTION m_lock;
std::vector<CRes*> m_transient;
std::uint32_t unknown_004C[17];
/* 0000 */ std::map<const char*, int, ResourceExtensionLess> m_extensions;
/* 0008 */ std::vector<const char*> m_prefixes;
/* 0014 */ std::vector<CRes*> m_prototypes;
/* 0020 */ std::vector<std::map<const ResourceName*, CRes*, ResourceNameLess>> m_resources;
/* 002C */ CRITICAL_SECTION m_lock;
/* 0044 */ std::map<std::string, std::string> m_aliases;
/* 004C */ std::uint32_t unknown_004C[17];
/* 0090 */ std::vector<CRes*> m_transient;
void EraseTransient(CRes* resource);
CRes* LoadNamed(const char* name);
ResourceMgr(const ResourceMgr&) = delete;