summaryrefslogtreecommitdiff
path: root/src/factories/naudio/v1/SequenceFactory.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/factories/naudio/v1/SequenceFactory.cpp')
-rw-r--r--src/factories/naudio/v1/SequenceFactory.cpp38
1 files changed, 36 insertions, 2 deletions
diff --git a/src/factories/naudio/v1/SequenceFactory.cpp b/src/factories/naudio/v1/SequenceFactory.cpp
index 6b34be3..a1ac0d9 100644
--- a/src/factories/naudio/v1/SequenceFactory.cpp
+++ b/src/factories/naudio/v1/SequenceFactory.cpp
@@ -60,11 +60,45 @@ ExportResult NSequenceBinaryExporter::Export(std::ostream& write, std::shared_pt
std::string& entryName, YAML::Node& node, std::string* replacement) {
auto writer = LUS::BinaryWriter();
auto data = std::static_pointer_cast<RawBuffer>(raw)->mBuffer;
+ auto offset = GetSafeNode<uint32_t>(node, "offset");
+
+ WriteHeader(writer, Torch::ResourceType::Sequence, 2);
- // Its the same shit as a blob
- WriteHeader(writer, Torch::ResourceType::Blob, 0);
+ // seqDataSize + raw bytes (matches Shipwright V2 binary layout)
writer.Write((uint32_t)data.size());
writer.Write((char*)data.data(), data.size());
+
+ // Sequence metadata from the audio table entry
+ uint8_t medium = 0;
+ uint8_t cachePolicy = 0;
+ uint8_t seqNumber = 0;
+
+ auto& seqTable = AudioContext::tables[AudioTableType::SEQ_TABLE];
+ auto it = seqTable.entries.find(offset - seqTable.offset);
+ if (it != seqTable.entries.end()) {
+ medium = (uint8_t)it->second.medium;
+ cachePolicy = (uint8_t)it->second.cachePolicy;
+ }
+
+ // Derive seqNumber from the entry's position in the table
+ uint32_t idx = 0;
+ for (auto& [entryOffset, entry] : seqTable.entries) {
+ if (entryOffset == (offset - seqTable.offset)) break;
+ idx++;
+ }
+ seqNumber = (uint8_t)idx;
+
+ writer.Write(seqNumber);
+ writer.Write(medium);
+ writer.Write(cachePolicy);
+
+ // numFonts and fonts[] — SF64 uses a separate gSeqFontTable blob at runtime,
+ // so we write numFonts=0 here; the font loading path reads from that blob.
+ writer.Write((uint32_t)0);
+ for (int i = 0; i < 16; i++) {
+ writer.Write((uint8_t)0);
+ }
+
writer.Finish(write);
return std::nullopt;
}