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:
parent
c3258abb9f
commit
c6b30f7758
9 changed files with 49 additions and 47 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue