summaryrefslogtreecommitdiff
path: root/src/factories/mk64/SpawnData.cpp
diff options
context:
space:
mode:
author= <=>2024-03-06 11:46:19 -0700
committerLywx <kiritodev01@gmail.com>2024-03-09 07:39:51 -0600
commita2d735c5281862fdc6ece2288694ca2af743c7af (patch)
tree0b47f82d606d9f48aa74c915ee440ed4565f2a03 /src/factories/mk64/SpawnData.cpp
parentf06ed7388df76f09d8fbda765acea5d2923553d4 (diff)
Add mk64 factories
Diffstat (limited to 'src/factories/mk64/SpawnData.cpp')
-rw-r--r--src/factories/mk64/SpawnData.cpp90
1 files changed, 90 insertions, 0 deletions
diff --git a/src/factories/mk64/SpawnData.cpp b/src/factories/mk64/SpawnData.cpp
new file mode 100644
index 0000000..401c8ff
--- /dev/null
+++ b/src/factories/mk64/SpawnData.cpp
@@ -0,0 +1,90 @@
+#include "SpawnData.h"
+
+#include "Companion.h"
+#include "utils/Decompressor.h"
+
+#define NUM(x) std::dec << std::setfill(' ') << std::setw(6) << x
+#define COL(c) "0x" << std::hex << std::setw(2) << std::setfill('0') << c
+
+void MK64::SpawnDataHeaderExporter::Export(std::ostream &write, std::shared_ptr<IParsedData> raw, std::string& entryName, YAML::Node &node, std::string* replacement) {
+ const auto symbol = GetSafeNode(node, "symbol", entryName);
+
+ if(Companion::Instance->IsOTRMode()){
+ write << "static const char " << symbol << "[] = \"__OTR__" << (*replacement) << "\";\n\n";
+ return;
+ }
+
+ write << "extern ActorSpawnData " << symbol << "[];\n";
+}
+
+void MK64::SpawnDataCodeExporter::Export(std::ostream &write, std::shared_ptr<IParsedData> raw, std::string& entryName, YAML::Node &node, std::string* replacement ) {
+ auto spawns = std::static_pointer_cast<SpawnDataData>(raw)->mSpawns;
+ const auto symbol = GetSafeNode(node, "symbol", entryName);
+ const auto offset = GetSafeNode<uint32_t>(node, "offset");
+
+ if (Companion::Instance->IsDebug()) {
+ write << "// 0x" << std::hex << std::uppercase << offset << "\n";
+ }
+
+ write << "ActorSpawnData " << symbol << "[] = {\n";
+
+ for (int i = 0; i < spawns.size(); i++) {
+ auto x = spawns[i].x;
+ auto y = spawns[i].y;
+ auto z = spawns[i].z;
+
+ auto id = spawns[i].id;
+
+ if(i <= spawns.size() - 1) {
+ write << fourSpaceTab;
+ }
+
+ // { x, y, z, id },
+ write << "{" << NUM(x) << ", " << NUM(y) << ", " << NUM(z) << ", " << NUM(id) << " },\n";
+ }
+
+ if (Companion::Instance->IsDebug()) {
+ write << fourSpaceTab << "// 0x" << std::hex << std::uppercase << (offset + (sizeof(MK64::ActorSpawnData) * spawns.size())) << "\n";
+ }
+
+ write << "};\n\n";
+}
+
+void MK64::SpawnDataBinaryExporter::Export(std::ostream &write, std::shared_ptr<IParsedData> raw, std::string& entryName, YAML::Node &node, std::string* replacement ) {
+ auto spawns = std::static_pointer_cast<SpawnDataData>(raw)->mSpawns;
+ auto writer = LUS::BinaryWriter();
+
+ WriteHeader(writer, LUS::ResourceType::SpawnData, 0);
+ writer.Write((uint32_t) spawns.size());
+ for(auto s : spawns) {
+ writer.Write(s.x);
+ writer.Write(s.y);
+ writer.Write(s.z);
+ writer.Write(s.id);
+ }
+
+ writer.Finish(write);
+}
+
+std::optional<std::shared_ptr<IParsedData>> MK64::SpawnDataFactory::parse(std::vector<uint8_t>& buffer, YAML::Node& node) {
+ auto count = GetSafeNode<size_t>(node, "count");
+
+ auto [_, segment] = Decompressor::AutoDecode(node, buffer);
+ LUS::BinaryReader reader(segment.data, count * sizeof(MK64::ActorSpawnData));
+
+ reader.SetEndianness(LUS::Endianness::Big);
+ std::vector<MK64::ActorSpawnData> spawns;
+
+ for(size_t i = 0; i < count; i++) {
+ auto x = reader.ReadInt16();
+ auto y = reader.ReadInt16();
+ auto z = reader.ReadInt16();
+ auto id = reader.ReadUInt16();
+
+ spawns.push_back(MK64::ActorSpawnData({
+ x, y, z, id
+ }));
+ }
+
+ return std::make_shared<SpawnDataData>(spawns);
+} \ No newline at end of file