diff --git a/Source/Contents/ActorNameCache.cpp b/Source/Contents/ActorNameCache.cpp new file mode 100644 index 00000000..9bee7e08 --- /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 19383465..6424b226 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 05404e75..f831b03c 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,