rodecomp/Source/File/ResourcePath.cpp
ragnarok-clanker a47d20f8be Reconstruct readable C++ and organize cohesive source subsystems
Administrative source import: native x86 compilation passed for 423 authored units. Source placement and submission states are migrated separately; this commit does not imply peer acceptance.

Previous head: 35d2a8cb36
Payload SHA256: 592f016d2730c5593bb653aa054c1e5f76a6df72c8f5a09e66f74876e2e33dee
2026-10-25 07:42:41 +00:00

55 lines
1.4 KiB
C++

#include "Archive/PakRegistry.h"
#include "File/ResourcePath.h"
// OFFSET: 0x0057BC20
// FUNCTION: fn_02596
std::string MakeResourcePath(std::string filename) {
std::string path = "data\\";
path.append(filename);
std::size_t colon = path.find(':');
if (colon != std::string::npos && colon >= 1) {
path = path.substr(colon - 1);
}
std::size_t duplicate;
while ((duplicate = path.find("//")) != std::string::npos) {
path.replace(duplicate, 2, "/", 1);
}
return path;
}
// OFFSET: 0x0057BB50
// FUNCTION: fn_02595
bool ResourceExists(const char* filename, int looseOnly) {
std::string path = MakeResourcePath(std::string(filename));
return g_pakRegistry.Exists(path.c_str(), static_cast<char>(looseOnly) != 0);
}
// OFFSET: 0x00AE9EE0
// FUNCTION: fn_18113
void* ReadLooseResource(const char* filename, std::uint32_t* size) {
HANDLE file = CreateFileA(filename, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
if (file == INVALID_HANDLE_VALUE) {
return nullptr;
}
LARGE_INTEGER fileSize;
GetFileSizeEx(file, &fileSize);
*size = fileSize.LowPart;
void* data = VirtualAlloc(nullptr, *size, MEM_COMMIT, PAGE_READWRITE);
if (!data) {
VirtualFree(nullptr, 0, MEM_RELEASE);
CloseHandle(file);
return nullptr;
}
DWORD read;
ReadFile(file, data, *size, &read, nullptr);
CloseHandle(file);
return data;
}