From d291f672de4e40ce5fd1e3e972a14529bfe03e52 Mon Sep 17 00:00:00 2001 From: louist103 <35883445+louist103@users.noreply.github.com> Date: Tue, 9 Jan 2024 20:59:04 -0500 Subject: new config and new exporter --- CFG/Config.xml | 4 +- CFG/EnumData.xml | 718 +++++++++++++++++++++++++++++++++++++++ OTRExporter/CutsceneExporter.cpp | 52 ++- 3 files changed, 769 insertions(+), 5 deletions(-) create mode 100644 CFG/EnumData.xml diff --git a/CFG/Config.xml b/CFG/Config.xml index 02656c7..f43ba62 100644 --- a/CFG/Config.xml +++ b/CFG/Config.xml @@ -2,7 +2,7 @@ - + - + \ No newline at end of file diff --git a/CFG/EnumData.xml b/CFG/EnumData.xml new file mode 100644 index 0000000..2ade5b3 --- /dev/null +++ b/CFG/EnumData.xml @@ -0,0 +1,718 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OTRExporter/CutsceneExporter.cpp b/OTRExporter/CutsceneExporter.cpp index d4e9345..23d0162 100644 --- a/OTRExporter/CutsceneExporter.cpp +++ b/OTRExporter/CutsceneExporter.cpp @@ -425,6 +425,13 @@ typedef enum : uint16_t { /* 5 */ CS_TEXT_TYPE_ALL_NORMAL_MASKS } CutsceneTextType; +typedef enum : uint8_t { + /* 0 */ Header, + /* 1 */ CamPoint, + /* 2 */ CamMisc, + /* 3 */ Footer, +} CutsceneSplineType; + #define WRITE_CMD_PROLOG(cmd) \ writer->Write((uint32_t)cmd); \ writer->Write((uint32_t)cs->commands[i]->entries.size()); @@ -490,10 +497,49 @@ void OTRExporter_Cutscene::SaveMM(ZCutscene* cs, BinaryWriter* writer) { case CutsceneMM_CommandType::CS_CMD_CAMERA_SPLINE: { writer->Write((uint32_t)CutsceneMM_CommandType::CS_CMD_CAMERA_SPLINE); writer->Write((uint32_t)(cs->commands[i]->entries.size() * sizeof(uint32_t))); - for (const auto e : cs->commands[i]->entries) { - auto* cmd = (CutsceneSubCommandEntry_Camera*)e; - writer->Write(CMD_HH(cmd->base, cmd->startFrame)); + // monkaS + size_t j = 0; + for (;;) { + auto* header = dynamic_cast(cs->commands[i]->entries[j]); + + //Debugging check, can probably remove after testing + assert(header != nullptr); + uint32_t numEntries = header->numEntries; + writer->Write(CMD_HH(header->numEntries, header->unused0)); + writer->Write(CMD_HH(header->unused1, header->duration)); + + for (size_t k = 0; k < numEntries * 2; k++) { + auto* element = + dynamic_cast(cs->commands[i]->entries[++j]); + // Debugging check, can probably remove after testing + assert(element != nullptr); + writer->Write(CMD_BBH(element->interpType, element->weight, element->duration)); + writer->Write(CMD_HH(element->posX, element->posY)); + writer->Write(CMD_HH(element->posZ, element->relTo)); + } + for (size_t k = 0; k < numEntries; k++) { + auto* element = + dynamic_cast(cs->commands[i]->entries[++j]); + // Debugging check, can probably remove after testing + assert(element != nullptr); + writer->Write(CMD_HH(element->unused0, element->roll)); + writer->Write(CMD_HH(element->fov, element->unused1)); + } + + auto* header2 = dynamic_cast(cs->commands[i]->entries[++j]); + if (header2 != nullptr) { + if (header2->base == 0xFFFF) { + break; + } + } } + + // The footer exists as an error checking type and a way to output an empty macro. It holds no actual data. + auto* footer = dynamic_cast(cs->commands[i]->entries[j]); + assert(footer != nullptr); + writer->Write((uint16_t)0xFFFF); + writer->Write((uint16_t)0x0004); + //i += j; break; } case CutsceneMM_CommandType::CS_CMD_MISC: { -- cgit v1.2.3