summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKiritoDv <kiritodev01@gmail.com>2023-09-22 16:10:29 -0600
committerKiritoDv <kiritodev01@gmail.com>2023-09-22 16:10:29 -0600
commit2508fc777677dde9ac7f5d7e23e8c4d5dfdd185c (patch)
treef10da6a52760b20af285c7f12b528df76e6efd3e /src
parent484f6f7bbbb8e30cff5a589e8d75ea3220cf90c3 (diff)
Added text extraction support, missing jp offsets, and renamed anim to sanim
Diffstat (limited to 'src')
-rw-r--r--src/Companion.cpp8
-rw-r--r--src/factories/RawFactory.h3
-rw-r--r--src/factories/ResourceType.h9
-rw-r--r--src/factories/TextureFactory.cpp1
-rw-r--r--src/factories/sm64/SAnimFactory.cpp (renamed from src/factories/AnimFactory.cpp)4
-rw-r--r--src/factories/sm64/SAnimFactory.h9
-rw-r--r--src/factories/sm64/SDialogFactory.cpp65
-rw-r--r--src/factories/sm64/SDialogFactory.h9
-rw-r--r--src/factories/sm64/STextFactory.cpp28
-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