#pragma once #include #include namespace FZX { typedef std::variant SeqArg; enum class SeqArgType { U8, S16, CS16 }; enum class SequenceState { player, channel, layer, data, envelope }; struct SeqLabelInfo { uint32_t pos; SequenceState state; uint32_t channel; uint32_t layer; bool largeNotes; SeqLabelInfo(uint32_t pos, SequenceState state, uint32_t channel, uint32_t layer, bool largeNotes) : pos(pos), state(state), channel(channel), layer(layer), largeNotes(largeNotes) {} }; struct SeqCommand { uint8_t cmd; uint32_t pos; SequenceState state; int32_t channel; int32_t layer; uint32_t size; std::vector args; bool operator<(const SeqCommand& command) const { return pos < command.pos; } }; class SequenceData : public IParsedData { public: std::vector mCmds; std::unordered_set mLabels; bool mHasFooter; SequenceData(std::vector cmds, std::unordered_set labels, bool hasFooter) : mCmds(std::move(cmds)), mLabels(std::move(labels)), mHasFooter(hasFooter) {} }; class SequenceHeaderExporter : public BaseExporter { ExportResult Export(std::ostream& write, std::shared_ptr data, std::string& entryName, YAML::Node& node, std::string* replacement) override; }; class SequenceBinaryExporter : public BaseExporter { ExportResult Export(std::ostream& write, std::shared_ptr data, std::string& entryName, YAML::Node& node, std::string* replacement) override; }; class SequenceCodeExporter : public BaseExporter { ExportResult Export(std::ostream& write, std::shared_ptr data, std::string& entryName, YAML::Node& node, std::string* replacement) override; }; class SequenceFactory : public BaseFactory { public: std::optional> parse(std::vector& buffer, YAML::Node& data) override; inline std::unordered_map> GetExporters() override { return { REGISTER(Code, SequenceCodeExporter) REGISTER(Header, SequenceHeaderExporter) REGISTER(Binary, SequenceBinaryExporter) }; } }; }