summaryrefslogtreecommitdiff
path: root/tools/src/asset_processor/assets/frameobjlists.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/src/asset_processor/assets/frameobjlists.cpp')
-rw-r--r--tools/src/asset_processor/assets/frameobjlists.cpp80
1 files changed, 80 insertions, 0 deletions
diff --git a/tools/src/asset_processor/assets/frameobjlists.cpp b/tools/src/asset_processor/assets/frameobjlists.cpp
new file mode 100644
index 00000000..fa78fddd
--- /dev/null
+++ b/tools/src/asset_processor/assets/frameobjlists.cpp
@@ -0,0 +1,80 @@
+#include "frameobjlists.h"
+#include "reader.h"
+#include <algorithm>
+#include <fstream>
+#include <iostream>
+
+void FrameObjListsAsset::convertToHumanReadable(const std::vector<char>& baserom) {
+ Reader reader(baserom, this->start, this->size);
+
+ std::vector<int> first_level;
+ std::vector<int> second_level;
+
+ std::vector<std::string> lines;
+ lines.push_back("@ First level of offsets\n");
+
+ while (reader.cursor < this->size) {
+ if (std::find(first_level.begin(), first_level.end(), reader.cursor) != first_level.end()) {
+ // End of first level
+ break;
+ }
+
+ u32 pointer = reader.read_u32();
+ first_level.push_back(pointer);
+ lines.push_back(string_format("\t.4byte 0x%x\n", pointer));
+ }
+
+ lines.push_back("\n@ Second level of offsets\n");
+
+ while (reader.cursor < this->size) {
+ if (std::find(second_level.begin(), second_level.end(), reader.cursor) != second_level.end()) {
+ // End of second level
+ break;
+ }
+ u32 pointer = reader.read_u32();
+ second_level.push_back(pointer);
+ lines.push_back(string_format("\t.4byte 0x%x\n", pointer));
+ }
+
+ int max_second_level = *std::max_element(second_level.begin(), second_level.end());
+
+ while (reader.cursor < this->size) {
+ if (reader.cursor > max_second_level) {
+ break;
+ }
+ if (std::find(second_level.begin(), second_level.end(), reader.cursor) == second_level.end()) {
+ // Find nearest next value that is in the second level
+ int next = -1;
+ for (const auto& i : second_level) {
+ if (i > reader.cursor && (next == -1 || i < next)) {
+ next = i;
+ }
+ }
+ int diff = next - reader.cursor;
+ lines.push_back(string_format("@ Skipping %d bytes\n", diff));
+ for (int i = 0; i < diff; i++) {
+ u8 byte = reader.read_u8();
+ lines.push_back(string_format("\t.byte %d\n", byte));
+ }
+ }
+ u8 num_objects = reader.read_u8();
+ lines.push_back(string_format("\t.byte %d @ num_objs\n", num_objects));
+
+ for (int i = 0; i < num_objects; i++) {
+ s8 x_offset = reader.read_s8();
+ s8 y_offset = reader.read_s8();
+ u8 bitfield = reader.read_u8();
+ u16 bitfield2 = reader.read_u16();
+ lines.push_back(string_format("\tobj x=%d, y=%d", x_offset, y_offset));
+ lines.push_back(opt_param(", bitfield=0x%x", 0, bitfield));
+ lines.push_back(opt_param(", bitfield2=0x%x", 0, bitfield2));
+ lines.push_back("\n");
+ }
+ }
+
+ std::ofstream out(this->assetPath);
+ for (const auto& line : lines) {
+ out << line;
+ }
+ out.close();
+} \ No newline at end of file