diff options
| author | KiritoDv <kiritodev01@gmail.com> | 2023-09-22 16:10:29 -0600 |
|---|---|---|
| committer | KiritoDv <kiritodev01@gmail.com> | 2023-09-22 16:10:29 -0600 |
| commit | 2508fc777677dde9ac7f5d7e23e8c4d5dfdd185c (patch) | |
| tree | f10da6a52760b20af285c7f12b528df76e6efd3e /src | |
| parent | 484f6f7bbbb8e30cff5a589e8d75ea3220cf90c3 (diff) | |
Added text extraction support, missing jp offsets, and renamed anim to sanim
Diffstat (limited to 'src')
| -rw-r--r-- | src/Companion.cpp | 8 | ||||
| -rw-r--r-- | src/factories/RawFactory.h | 3 | ||||
| -rw-r--r-- | src/factories/ResourceType.h | 9 | ||||
| -rw-r--r-- | src/factories/TextureFactory.cpp | 1 | ||||
| -rw-r--r-- | src/factories/sm64/SAnimFactory.cpp (renamed from src/factories/AnimFactory.cpp) | 4 | ||||
| -rw-r--r-- | src/factories/sm64/SAnimFactory.h | 9 | ||||
| -rw-r--r-- | src/factories/sm64/SDialogFactory.cpp | 65 | ||||
| -rw-r--r-- | src/factories/sm64/SDialogFactory.h | 9 | ||||
| -rw-r--r-- | src/factories/sm64/STextFactory.cpp | 28 | ||||
| -rw-r--r-- | src/factories/sm64/STextFactory.h (renamed from src/factories/AnimFactory.h) | 6 |
10 files changed, 129 insertions, 13 deletions
diff --git a/src/Companion.cpp b/src/Companion.cpp index 8582c40..fa557fa 100644 --- a/src/Companion.cpp +++ b/src/Companion.cpp @@ -10,7 +10,9 @@ #include "factories/SampleFactory.h" #include "factories/BankFactory.h" #include "factories/TextureFactory.h" -#include "factories/AnimFactory.h" +#include "factories/sm64/SAnimFactory.h" +#include "factories/sm64/STextFactory.h" +#include "factories/sm64/SDialogFactory.h" #include <fstream> #include <iostream> @@ -29,7 +31,9 @@ void Companion::Init() { this->RegisterFactory("BLOB", new BlobFactory()); // SM64 Specific - this->RegisterFactory("SM64:ANIM", new AnimFactory()); + this->RegisterFactory("SM64:DIALOG", new SDialogFactory()); + this->RegisterFactory("SM64:ANIM", new SAnimFactory()); + this->RegisterFactory("SM64:TEXT", new STextFactory()); // Debug this->RegisterFactory("MIO0", new MIO0Factory()); diff --git a/src/factories/RawFactory.h b/src/factories/RawFactory.h index 16a78ce..5019ad6 100644 --- a/src/factories/RawFactory.h +++ b/src/factories/RawFactory.h @@ -6,6 +6,9 @@ #include <binarytools/BinaryWriter.h> #include <yaml-cpp/yaml.h> + +#define SEGMENT_OFFSET(a) ((uint32_t)(a)&0x00FFFFFF) + #define WRITE_HEADER(type, version) this->WriteHeader(writer, type, version) #define WRITE_BHEADER(type, version) this->WriteHeader(writer, type, version, true) #define WRITE_U8(value) writer->Write((uint8_t) value) diff --git a/src/factories/ResourceType.h b/src/factories/ResourceType.h index 7dfac06..8c5879e 100644 --- a/src/factories/ResourceType.h +++ b/src/factories/ResourceType.h @@ -14,13 +14,12 @@ enum class ResourceType { Array = 0x4F415252, // OARR Blob = 0x4F424C42, // OBLB Texture = 0x4F544558, // OTEX - - // CubeOS - Demo = 0x44454D4F, // DEMO - Skybox = 0x534B5942, // SKYB - Anim = 0x414E494D, // ANIM Bank = 0x42414E4B, // BANK Sample = 0x41554643, // AIFC Sequence = 0x53455143, // SEQC + + // SM64 + Anim = 0x414E494D, // ANIM + SDialog = 0x53444C47, // SDLG }; } // namespace LUS diff --git a/src/factories/TextureFactory.cpp b/src/factories/TextureFactory.cpp index 12d8540..257ef20 100644 --- a/src/factories/TextureFactory.cpp +++ b/src/factories/TextureFactory.cpp @@ -1,6 +1,5 @@ #include "TextureFactory.h" -#include "Companion.h" #include "utils/MIODecoder.h" namespace fs = std::filesystem; diff --git a/src/factories/AnimFactory.cpp b/src/factories/sm64/SAnimFactory.cpp index 0e5d01b..3358e24 100644 --- a/src/factories/AnimFactory.cpp +++ b/src/factories/sm64/SAnimFactory.cpp @@ -1,4 +1,4 @@ -#include "AnimFactory.h" +#include "SAnimFactory.h" #include <iostream> #include <filesystem> @@ -63,7 +63,7 @@ void WriteAnimationValues(LUS::BinaryWriter* writer, YAML::Node& data, std::vect reader.Close(); } -bool AnimFactory::process(LUS::BinaryWriter* writer, YAML::Node& data, std::vector<uint8_t>& buffer) { +bool SAnimFactory::process(LUS::BinaryWriter* writer, YAML::Node& data, std::vector<uint8_t>& buffer) { WRITE_HEADER(LUS::ResourceType::Anim, 0); auto header = data["header"]; diff --git a/src/factories/sm64/SAnimFactory.h b/src/factories/sm64/SAnimFactory.h new file mode 100644 index 0000000..a5fa529 --- /dev/null +++ b/src/factories/sm64/SAnimFactory.h @@ -0,0 +1,9 @@ +#pragma once + +#include "factories/RawFactory.h" + +class SAnimFactory : public RawFactory { +public: + SAnimFactory() = default; + bool process(LUS::BinaryWriter* write, YAML::Node& data, std::vector<uint8_t>& buffer) override; +};
\ No newline at end of file diff --git a/src/factories/sm64/SDialogFactory.cpp b/src/factories/sm64/SDialogFactory.cpp new file mode 100644 index 0000000..ad6cca4 --- /dev/null +++ b/src/factories/sm64/SDialogFactory.cpp @@ -0,0 +1,65 @@ +#include <iostream> +#include "SDialogFactory.h" + +#include "utils/MIODecoder.h" +#include "binarytools/BinaryReader.h" + +namespace fs = std::filesystem; + +static size_t id = 0; + +bool SDialogFactory::process(LUS::BinaryWriter* writer, YAML::Node& data, std::vector<uint8_t>& buffer) { + + WRITE_HEADER(LUS::ResourceType::SDialog, 0); + + auto offset = data["offset"].as<size_t>(); + auto mio0 = data["mio0"].as<size_t>(); + + std::vector<uint8_t> text; + auto decoded = MIO0Decoder::Decode(buffer, offset); + auto bytes = (uint8_t*) decoded.data(); + LUS::BinaryReader reader(decoded.data(), decoded.size()); + reader.SetEndianness(LUS::Endianness::Big); + reader.Seek(mio0, LUS::SeekOffsetType::Start); + + auto unused = reader.ReadUInt32(); + auto linesPerBox = reader.ReadUByte(); + // Padding + reader.Read(1); + auto leftOffset = reader.ReadInt16(); + auto width = reader.ReadInt16(); + // Padding + reader.Read(2); + auto str = SEGMENT_OFFSET(reader.ReadInt32()); + + while(bytes[str] != 0xFF){ + auto c = bytes[str++]; + text.push_back(c); + } + text.push_back(0xFF); + + std::cout << "unused: " << unused << std::endl; + std::cout << "linesPerBox: " << (int) linesPerBox << std::endl; + std::cout << "leftOffset: " << leftOffset << std::endl; + std::cout << "width: " << width << std::endl; + std::cout << "size: " << text.size() << std::endl; + + WRITE_U32(unused); + WRITE_I8(linesPerBox); + WRITE_I16(leftOffset); + WRITE_I16(width); + + WRITE_U32(text.size()); + WRITE_ARRAY(text.data(), text.size()); + + if(id == 85){ + int bp = 0; + } + + id++; + return true; +} + +// seg2_dialog_table +// seg2_course_name_table +// seg2_act_name_table diff --git a/src/factories/sm64/SDialogFactory.h b/src/factories/sm64/SDialogFactory.h new file mode 100644 index 0000000..a1f58a9 --- /dev/null +++ b/src/factories/sm64/SDialogFactory.h @@ -0,0 +1,9 @@ +#pragma once + +#include "../RawFactory.h" + +class SDialogFactory : public RawFactory { +public: + SDialogFactory() = default; + bool process(LUS::BinaryWriter* write, YAML::Node& data, std::vector<uint8_t>& buffer) override; +};
\ No newline at end of file diff --git a/src/factories/sm64/STextFactory.cpp b/src/factories/sm64/STextFactory.cpp new file mode 100644 index 0000000..e6b27ee --- /dev/null +++ b/src/factories/sm64/STextFactory.cpp @@ -0,0 +1,28 @@ +#include "STextFactory.h" + +#include "utils/MIODecoder.h" + +namespace fs = std::filesystem; + +bool STextFactory::process(LUS::BinaryWriter* writer, YAML::Node& data, std::vector<uint8_t>& buffer) { + + WRITE_HEADER(LUS::ResourceType::Blob, 0); + + auto offset = data["offset"].as<size_t>(); + auto mio0 = data["mio0"].as<size_t>(); + + std::vector<uint8_t> text; + auto decoded = MIO0Decoder::Decode(buffer, offset); + auto bytes = (uint8_t*) decoded.data(); + + while(bytes[mio0] != 0xFF){ + auto c = bytes[mio0++]; + text.push_back(c); + } + text.push_back(0xFF); + + WRITE_U32(text.size()); + WRITE_ARRAY(text.data(), text.size()); + + return true; +} diff --git a/src/factories/AnimFactory.h b/src/factories/sm64/STextFactory.h index c1ca50d..7f9fe00 100644 --- a/src/factories/AnimFactory.h +++ b/src/factories/sm64/STextFactory.h @@ -1,9 +1,9 @@ #pragma once -#include "RawFactory.h" +#include "../RawFactory.h" -class AnimFactory : public RawFactory { +class STextFactory : public RawFactory { public: - AnimFactory() = default; + STextFactory() = default; bool process(LUS::BinaryWriter* write, YAML::Node& data, std::vector<uint8_t>& buffer) override; };
\ No newline at end of file |
