From 9ad1ef7f7580efafce0b1baf8045c984d073f8d9 Mon Sep 17 00:00:00 2001 From: ragnarok-clanker Date: Wed, 28 Oct 2026 20:10:42 +0000 Subject: [PATCH] Decompile 2 functions in Source/Contents/ActorNameCache.cpp, Source/Contents/ActorNameCard.h Batch #1693 by eAthena: 0 byte-identical, 2 confirmed by peer review. - fn_03499 CActorNameCardHolder::Save: logic confirmed by peer review - fn_03506 CActorNameCardHolder::Load: logic confirmed by peer review Accepted without human review: peers confirmed the logic ("same" ahead by at least 3, with 70% of the votes). Adds to the build: Source/Contents/ActorNameCache.cpp --- Source/Contents/ActorNameCache.cpp | 107 +++++++++++++++++++++++++++++ Source/Contents/ActorNameCard.h | 3 + data/compile.json | 1 + 3 files changed, 111 insertions(+) create mode 100644 Source/Contents/ActorNameCache.cpp diff --git a/Source/Contents/ActorNameCache.cpp b/Source/Contents/ActorNameCache.cpp new file mode 100644 index 0000000..9bee7e0 --- /dev/null +++ b/Source/Contents/ActorNameCache.cpp @@ -0,0 +1,107 @@ +#include "Contents/ActorNameCard.h" + +#include + +// OFFSET: 0x005BFA60 +// FUNCTION: fn_03499 +std::size_t CActorNameCardHolder::Save(std::vector& output) { + if (this->cards.empty()) { + return 0; + } + + std::vector buffer(0x400); + std::size_t offset = 4; + *reinterpret_cast(&buffer[0]) = this->cards.size(); + + for (const auto& entry : this->cards) { + const CActorNameCard& card = entry.second; + const std::size_t needed = offset + card.name.size() + card.unknown_001C.size() + card.unknown_0034.size() + card.unknown_004C.size() + 0x14; + if (buffer.size() < needed) { + buffer.resize(needed + 1); + } + + *reinterpret_cast(&buffer[offset]) = entry.first; + + int length = static_cast(card.name.size()); + *reinterpret_cast(&buffer[offset + 4]) = length; + offset += 8; + if (length > 0) { + std::memcpy(&buffer[offset], card.name.c_str(), length); + offset += length; + } + + length = static_cast(card.unknown_001C.size()); + *reinterpret_cast(&buffer[offset]) = length; + offset += 4; + if (length > 0) { + std::memcpy(&buffer[offset], card.unknown_001C.c_str(), length); + offset += length; + } + + length = static_cast(card.unknown_0034.size()); + *reinterpret_cast(&buffer[offset]) = length; + offset += 4; + if (length > 0) { + std::memcpy(&buffer[offset], card.unknown_0034.c_str(), length); + offset += length; + } + + length = static_cast(card.unknown_004C.size()); + *reinterpret_cast(&buffer[offset]) = length; + offset += 4; + if (length > 0) { + std::memcpy(&buffer[offset], card.unknown_004C.c_str(), length); + offset += length; + } + } + + output.assign(buffer.begin(), buffer.begin() + offset); + return this->cards.size(); +} + +// OFFSET: 0x005C05B0 +// FUNCTION: fn_03506 +std::size_t CActorNameCardHolder::Load(const std::vector& input) { + if (input.empty()) { + return 0; + } + + this->cards.clear(); + const int count = *reinterpret_cast(input.data()); + std::string text; + std::size_t offset = 4; + for (int index = 0; index < count; ++index) { + const std::uint32_t id = *reinterpret_cast(&input[offset]); + this->cards[id].Reset(); + + int length = *reinterpret_cast(&input[offset + 4]); + offset += 8; + if (length > 0) { + this->cards[id].name.assign(&input[offset], length); + offset += length; + } + + length = *reinterpret_cast(&input[offset]); + offset += 4; + if (length > 0) { + this->cards[id].unknown_001C.assign(&input[offset], length); + offset += length; + } + + length = *reinterpret_cast(&input[offset]); + offset += 4; + if (length > 0) { + this->cards[id].unknown_0034.assign(&input[offset], length); + offset += length; + } + + length = *reinterpret_cast(&input[offset]); + offset += 4; + if (length > 0) { + this->cards[id].unknown_004C.assign(&input[offset], length); + offset += length; + } + } + + return this->cards.size(); +} diff --git a/Source/Contents/ActorNameCard.h b/Source/Contents/ActorNameCard.h index 1938346..6424b22 100644 --- a/Source/Contents/ActorNameCard.h +++ b/Source/Contents/ActorNameCard.h @@ -5,6 +5,7 @@ #include #include #include +#include class CActorNameCard { public: @@ -54,6 +55,8 @@ public: std::string Name(std::uint32_t id); void SetName(std::uint32_t id, std::string name); const CActorNameCard& Lookup(std::uint32_t id); + std::size_t Save(std::vector& output); + std::size_t Load(const std::vector& input); void Set(std::uint32_t id, std::string name, std::string value1, std::string value2, std::string value3, std::string value4, std::string value5, std::uint32_t value); std::uint32_t FindId(std::string name); diff --git a/data/compile.json b/data/compile.json index 05404e7..f831b03 100644 --- a/data/compile.json +++ b/data/compile.json @@ -269,6 +269,7 @@ "Source/Client/Session.cpp": 0, "Source/Contents/ActorGeometry.cpp": 4, "Source/Contents/ActorMovementRoute.cpp": 4, + "Source/Contents/ActorNameCache.cpp": 4, "Source/Contents/ActorNameCard.cpp": 4, "Source/Contents/ActorNameDirectory.cpp": 4, "Source/Contents/ActorNameRequests.cpp": 4,