diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/factories/naudio/v0/SequenceFactory.cpp | 31 | ||||
| -rw-r--r-- | src/factories/naudio/v0/SequenceFactory.h | 5 |
2 files changed, 35 insertions, 1 deletions
diff --git a/src/factories/naudio/v0/SequenceFactory.cpp b/src/factories/naudio/v0/SequenceFactory.cpp index ddd2335..81866c7 100644 --- a/src/factories/naudio/v0/SequenceFactory.cpp +++ b/src/factories/naudio/v0/SequenceFactory.cpp @@ -1,4 +1,6 @@ #include "SequenceFactory.h" +#include "Companion.h" +#include <tinyxml2.h> ExportResult SequenceBinaryExporter::Export(std::ostream &write, std::shared_ptr<IParsedData> raw, std::string& entryName, YAML::Node &node, std::string* replacement ) { auto writer = LUS::BinaryWriter(); @@ -20,12 +22,39 @@ ExportResult SequenceModdingExporter::Export(std::ostream &write, std::shared_pt auto writer = LUS::BinaryWriter(); const auto sequence = std::static_pointer_cast<SequenceData>(raw); *replacement += ".m64"; - writer.Write(reinterpret_cast<char*>(sequence->mBuffer.data()), sequence->mSize); writer.Finish(write); return std::nullopt; } +ExportResult SequenceXMLExporter::Export(std::ostream &write, std::shared_ptr<IParsedData> raw, std::string& entryName, YAML::Node &node, std::string* replacement ) { + const auto sequence = std::static_pointer_cast<SequenceData>(raw); + + auto path = fs::path(*replacement); + tinyxml2::XMLDocument seq; + tinyxml2::XMLElement* root = seq.NewElement("Sequence"); + root->SetAttribute("ID", sequence->mId); + root->SetAttribute("Path", (path.string() + "_data.m64").c_str()); + tinyxml2::XMLElement* banks = seq.NewElement("Banks"); + for (auto& bank : sequence->mBanks) { + tinyxml2::XMLElement* entry = banks->InsertNewChildElement("Entry"); + entry->SetAttribute("Path", bank.c_str()); + banks->InsertEndChild(entry); + } + root->InsertEndChild(banks); + seq.InsertEndChild(root); + + tinyxml2::XMLPrinter printer; + seq.Accept(&printer); + write.write(printer.CStr(), printer.CStrSize() - 1); + + auto data = (char*) sequence->mBuffer.data(); + std::vector<char> m64(data, data + sequence->mBuffer.size()); + Companion::Instance->RegisterCompanionFile(path.filename().string() + "_data.m64", m64); + + return std::nullopt; +} + std::optional<std::shared_ptr<IParsedData>> SequenceFactory::parse(std::vector<uint8_t>& buffer, YAML::Node& data) { auto id = data["id"].as<uint32_t>(); auto size = data["size"].as<size_t>(); diff --git a/src/factories/naudio/v0/SequenceFactory.h b/src/factories/naudio/v0/SequenceFactory.h index 9361401..3c706d0 100644 --- a/src/factories/naudio/v0/SequenceFactory.h +++ b/src/factories/naudio/v0/SequenceFactory.h @@ -23,6 +23,10 @@ class SequenceModdingExporter : public BaseExporter { ExportResult Export(std::ostream& write, std::shared_ptr<IParsedData> data, std::string& entryName, YAML::Node& node, std::string* replacement) override; }; +class SequenceXMLExporter : public BaseExporter { + ExportResult Export(std::ostream& write, std::shared_ptr<IParsedData> data, std::string& entryName, YAML::Node& node, std::string* replacement) override; +}; + class SequenceFactory : public BaseFactory { public: std::optional<std::shared_ptr<IParsedData>> parse(std::vector<uint8_t>& buffer, YAML::Node& data) override; @@ -32,6 +36,7 @@ public: return { REGISTER(Modding, SequenceModdingExporter) REGISTER(Binary, SequenceBinaryExporter) + REGISTER(XML, SequenceXMLExporter) }; } |
