summaryrefslogtreecommitdiff
path: root/src/factories/sf64/ScriptFactory.cpp
diff options
context:
space:
mode:
authorinspectredc <inspectredc@gmail.com>2024-04-04 22:29:55 +0100
committerLywx <kiritodev01@gmail.com>2024-04-04 16:00:59 -0600
commit53eec1f33a761a2dac032c94bfd9856c00014747 (patch)
treece93d16522ffffe524ee43c6fe29b14487b2a807 /src/factories/sf64/ScriptFactory.cpp
parent378575792b9f0eeddae6e9fa53e1412d129a89a5 (diff)
exporters
Diffstat (limited to 'src/factories/sf64/ScriptFactory.cpp')
-rw-r--r--src/factories/sf64/ScriptFactory.cpp50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/factories/sf64/ScriptFactory.cpp b/src/factories/sf64/ScriptFactory.cpp
index 190cee0..d44a103 100644
--- a/src/factories/sf64/ScriptFactory.cpp
+++ b/src/factories/sf64/ScriptFactory.cpp
@@ -5,6 +5,8 @@
#include "utils/Decompressor.h"
#include "utils/TorchUtils.h"
+#include "storm/SWrapper.h"
+
SF64::ScriptData::ScriptData(std::vector<uint32_t> ptrs, std::vector<uint16_t> cmds, std::map<uint32_t, int> sizeMap, uint32_t ptrsStart, uint32_t cmdsStart): mPtrs(ptrs), mCmds(cmds), mSizeMap(sizeMap), mPtrsStart(ptrsStart), mCmdsStart(cmdsStart) {
}
@@ -138,6 +140,54 @@ ExportResult SF64::ScriptCodeExporter::Export(std::ostream &write, std::shared_p
}
ExportResult SF64::ScriptBinaryExporter::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);
+ auto scriptWriter = LUS::BinaryWriter();
+ auto script = std::static_pointer_cast<SF64::ScriptData>(raw);
+ auto sortedPtrs = script->mPtrs;
+ std::sort(sortedPtrs.begin(), sortedPtrs.end());
+ uint32_t ptrCount = 0;
+ uint32_t cmdIndex = 0;
+ std::unordered_map<uint32_t, uint64_t> ptrMap;
+
+ // Export Commands and Populate Hashes Map
+ for (auto ptr : sortedPtrs) {
+ auto wrapper = Companion::Instance->GetCurrentWrapper();
+ std::ostringstream stream;
+ stream.str("");
+ stream.clear();
+
+ auto cmdWriter = LUS::BinaryWriter();
+ WriteHeader(cmdWriter, LUS::ResourceType::ScriptCmd, 0);
+
+ auto cmdCount = script->mSizeMap.at(ptr) / 2;
+ cmdWriter.Write((uint32_t) cmdCount);
+
+ // Writing in pairs for readability
+ for (uint32_t i = 0; i < cmdCount; ++i) {
+ cmdWriter.Write(script->mCmds.at(cmdIndex++));
+ cmdWriter.Write(script->mCmds.at(cmdIndex++));
+ }
+
+ cmdWriter.Finish(stream);
+
+ auto data = stream.str();
+ wrapper->CreateFile(entryName + "_cmd_" + std::to_string(ptrCount), std::vector(data.begin(), data.end()));
+
+ std::ostringstream cmdName;
+ cmdName << symbol << "_cmd_" << std::dec << ptrCount;
+ ptrMap[ptr] = CRC64(cmdName.str().c_str());
+ ptrCount++;
+ }
+
+ // Export Script
+ WriteHeader(scriptWriter, LUS::ResourceType::Script, 0);
+ scriptWriter.Write((uint32_t) script->mPtrs.size());
+ for (auto &ptr : script->mPtrs) {
+ scriptWriter.Write(ptrMap.at(ptr));
+ }
+
+ scriptWriter.Finish(write);
+
return std::nullopt;
}