From 234b6ab7a4fc094ad763aafb0867a2dabb3e14ec Mon Sep 17 00:00:00 2001 From: KiritoDv Date: Wed, 4 Oct 2023 23:18:35 -0600 Subject: [PATCH] Added sm64 dictionary extraction --- assets/sm64/us/texts.yml | 71 +++++++++++++++++++++++ src/Companion.cpp | 2 + src/factories/ResourceType.h | 1 + src/factories/sm64/SDictionaryFactory.cpp | 35 +++++++++++ src/factories/sm64/SDictionaryFactory.h | 9 +++ 5 files changed, 118 insertions(+) create mode 100644 src/factories/sm64/SDictionaryFactory.cpp create mode 100644 src/factories/sm64/SDictionaryFactory.h diff --git a/assets/sm64/us/texts.yml b/assets/sm64/us/texts.yml index 3a9afdb..9c9311e 100644 --- a/assets/sm64/us/texts.yml +++ b/assets/sm64/us/texts.yml @@ -1170,3 +1170,74 @@ acts/act_60: type: SM64:TEXT offset: 1083968 mio0: 71976 +texts/global: + type: SM64:DICTIONARY + keys: + TEXT_ZERO: 8177343 + TEXT_COIN: 8155500 + TEXT_STAR: 8142922 + TEXT_COIN_X: 5057623 + TEXT_STAR_X: 5324116 + TEXT_VARIABLE_X: 8085611 + TEXT_UNFILLED_STAR: 8145264 + TEXT_NEW: 2458232 + TEXT_4DASHES: 2458548 + TEXT_MARIO: 2458588 + TEXT_SELECT_FILE: 2458244 + TEXT_CHECK_FILE: 2458280 + TEXT_COPY_FILE: 2458316 + TEXT_ERASE_FILE: 2458436 + TEXT_SOUND_SELECT: 2458520 + TEXT_FILE_MARIO_A: 2458200 + TEXT_FILE_MARIO_B: 2458208 + TEXT_FILE_MARIO_C: 2458216 + TEXT_FILE_MARIO_D: 2458224 + TEXT_SCORE: 2459246 + TEXT_COPY: 2458264 + TEXT_ERASE: 2458272 + TEXT_STEREO: 2458176 + TEXT_MONO: 2458184 + TEXT_HEADSET: 2458192 + TEXT_SAVED_DATA_EXISTS: 2458500 + TEXT_NO_SAVED_DATA_EXISTS: 2458456 + TEXT_RETURN: 2458132 + TEXT_CHECK_SCORE: 2458140 + TEXT_COPY_FILE_BUTTON: 2458316 + TEXT_ERASE_FILE_BUTTON: 2458436 + TEXT_HI_SCORE: 2458596 + TEXT_MY_SCORE: 2458608 + TEXT_SCORE_MARIO_A: 2458556 + TEXT_SCORE_MARIO_B: 2458564 + TEXT_SCORE_MARIO_C: 2458572 + TEXT_SCORE_MARIO_D: 2458580 + TEXT_COPY_IT_TO_WHERE: 2458328 + TEXT_COPYING_COMPLETED: 2458372 + TEXT_NO_FILE_TO_COPY_FROM: 2458412 + TEXT_SURE: 2458448 + TEXT_YES: 2458428 + TEXT_NO: 4539719 + TEXT_FILE_MARIO_A_JUST_ERASED: 2458480 + TEXT_COURSE: 968444 + TEXT_MYSCORE: 2459244 + TEXT_CONTINUE: 968479 + TEXT_EXIT_COURSE: 968336 + TEXT_CAMERA_ANGLE_R: 968348 + TEXT_LAKITU_MARIO: 968256 + TEXT_LAKITU_STOP: 968272 + TEXT_NORMAL_UPCLOSE: 968288 + TEXT_NORMAL_FIXED: 968308 + TEXT_CATCH: 968452 + TEXT_CLEAR: 968460 + TEXT_HUD_HI_SCORE: 2458596 + TEXT_SAVE_AND_CONTINUE: 968472 + TEXT_SAVE_AND_QUIT: 968488 + TEXT_CONTINUE_WITHOUT_SAVING: 968500 + TEXT_FILE_MARIO_EXCLAMATION: 968156 + TEXT_POWER_STARS_RESTORED: 967940 + TEXT_THANKS_TO_YOU: 967992 + TEXT_THANK_YOU_MARIO: 968024 + TEXT_SOMETHING_SPECIAL: 968044 + TEXT_LISTEN_EVERYBODY: 968088 + TEXT_LETS_HAVE_CAKE: 968108 + TEXT_FOR_MARIO: 968140 + TEXT_FILE_MARIO_QUESTION: 968156 diff --git a/src/Companion.cpp b/src/Companion.cpp index 41d5a65..88f8542 100644 --- a/src/Companion.cpp +++ b/src/Companion.cpp @@ -13,6 +13,7 @@ #include "factories/sm64/SAnimFactory.h" #include "factories/sm64/STextFactory.h" #include "factories/sm64/SDialogFactory.h" +#include "factories/sm64/SDictionaryFactory.h" #include "spdlog/spdlog.h" #include @@ -40,6 +41,7 @@ void Companion::Init() { this->RegisterFactory("SM64:DIALOG", new SDialogFactory()); this->RegisterFactory("SM64:ANIM", new SAnimFactory()); this->RegisterFactory("SM64:TEXT", new STextFactory()); + this->RegisterFactory("SM64:DICTIONARY", new SDictionaryFactory()); // Debug this->RegisterFactory("MIO0", new MIO0Factory()); diff --git a/src/factories/ResourceType.h b/src/factories/ResourceType.h index 8c5879e..fea9fc9 100644 --- a/src/factories/ResourceType.h +++ b/src/factories/ResourceType.h @@ -21,5 +21,6 @@ enum class ResourceType { // SM64 Anim = 0x414E494D, // ANIM SDialog = 0x53444C47, // SDLG + Dictionary = 0x44494354, // DICT }; } // namespace LUS diff --git a/src/factories/sm64/SDictionaryFactory.cpp b/src/factories/sm64/SDictionaryFactory.cpp new file mode 100644 index 0000000..e9d598f --- /dev/null +++ b/src/factories/sm64/SDictionaryFactory.cpp @@ -0,0 +1,35 @@ +#include "SDictionaryFactory.h" + +#include "utils/MIODecoder.h" + +namespace fs = std::filesystem; + +bool SDictionaryFactory::process(LUS::BinaryWriter* writer, YAML::Node& data, std::vector& buffer) { + + WRITE_HEADER(LUS::ResourceType::Dictionary, 0); + + auto entries = data["keys"].size(); + WRITE_U32(entries); + + // Iterate on yaml keys + for (auto it = data["keys"].begin(); it != data["keys"].end(); ++it) { + auto key = it->first.as(); + auto offset = it->second.as(); + + std::vector text; + auto bytes = (uint8_t*) buffer.data(); + + while(bytes[offset] != 0xFF){ + auto c = bytes[offset++]; + text.push_back(c); + } + + text.push_back(0xFF); + + writer->Write(key); + WRITE_U32(text.size()); + WRITE_ARRAY(text.data(), text.size()); + } + + return true; +} diff --git a/src/factories/sm64/SDictionaryFactory.h b/src/factories/sm64/SDictionaryFactory.h new file mode 100644 index 0000000..9dd5753 --- /dev/null +++ b/src/factories/sm64/SDictionaryFactory.h @@ -0,0 +1,9 @@ +#pragma once + +#include "../RawFactory.h" + +class SDictionaryFactory : public RawFactory { +public: + SDictionaryFactory() = default; + bool process(LUS::BinaryWriter* write, YAML::Node& data, std::vector& buffer) override; +}; \ No newline at end of file