diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Companion.cpp | 31 | ||||
| -rw-r--r-- | src/Companion.h | 5 | ||||
| -rw-r--r-- | src/main.cpp | 7 |
3 files changed, 38 insertions, 5 deletions
diff --git a/src/Companion.cpp b/src/Companion.cpp index 2ef7cf2..be80ee5 100644 --- a/src/Companion.cpp +++ b/src/Companion.cpp @@ -1335,6 +1335,11 @@ void Companion::Process() { } } + if(!this->gVersion.empty()) { + auto data = this->ParseVersionString(this->gVersion); + wrapper->AddFile("assetVersion", data); + } + SPDLOG_CRITICAL("Writing version file"); wrapper->AddFile("version", vWriter.ToVector()); vWriter.Close(); @@ -1359,8 +1364,7 @@ void Companion::Process() { Instance = nullptr; } -void Companion::Pack(const std::string& folder, const std::string& output, const ArchiveType otrMode) { - +void Companion::Pack(const std::string& folder, const std::string& output, const ArchiveType otrMode, const std::string& version) { spdlog::set_level(spdlog::level::debug); spdlog::set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%l] %v"); @@ -1405,6 +1409,12 @@ void Companion::Pack(const std::string& folder, const std::string& output, const SPDLOG_CRITICAL("> Added {}", normalized); } + if(!version.empty()) { + SPDLOG_CRITICAL("Adding version file"); + auto data = this->ParseVersionString(version); + wrapper->AddFile("assetVersion", data); + } + auto end = duration_cast<milliseconds>(system_clock::now().time_since_epoch()); SPDLOG_CRITICAL("Done! Took {}ms", end.count() - start.count()); SPDLOG_CRITICAL("Exported to {}", output); @@ -1766,3 +1776,20 @@ std::optional<YAML::Node> Companion::AddAsset(YAML::Node asset) { return std::nullopt; } + +std::vector<char> Companion::ParseVersionString(const std::string& version) { + uint16_t major = 0; + uint16_t minor = 0; + uint16_t patch = 0; + + std::sscanf(version.c_str(), "%hu.%hu.%hu", &major, &minor, &patch); + + auto wv = LUS::BinaryWriter(); + wv.SetEndianness(Torch::Endianness::Big); + wv.Write(major); + wv.Write(minor); + wv.Write(patch); + wv.Close(); + + return wv.ToVector(); +}
\ No newline at end of file diff --git a/src/Companion.h b/src/Companion.h index 40a664e..bc65852 100644 --- a/src/Companion.h +++ b/src/Companion.h @@ -179,13 +179,14 @@ public: std::optional<Table> SearchTable(uint32_t addr); static std::string CalculateHash(const std::vector<uint8_t>& data); - static void Pack(const std::string& folder, const std::string& output, const ArchiveType otrMode); + static void Pack(const std::string& folder, const std::string& output, const ArchiveType otrMode, const std::string& version = ""); std::string NormalizeAsset(const std::string& name) const; std::string RelativePath(const std::string& path) const; std::string RelativePathToSrcDir(const std::string& path) const; std::string RelativePathToDestDir(const std::string& path) const; void RegisterCompanionFile(const std::string path, std::vector<char> data); void SetAdditionalFiles(const std::vector<std::string>& files) { this->gAdditionalFiles = files; } + void SetVersion(const std::string& version) { this->gVersion = version; } TorchConfig& GetConfig() { return this->gConfig; } BinaryWrapper* GetCurrentWrapper() { return this->gCurrentWrapper; } @@ -200,6 +201,7 @@ private: fs::path gCurrentDirectory; std::string gCurrentHash; std::string gAssetPath; + std::string gVersion; std::vector<uint8_t> gRomData; std::optional<std::filesystem::path> gRomPath; bool gNodeForceProcessing = false; @@ -246,4 +248,5 @@ private: void ProcessTables(YAML::Node& rom); void LoadYAMLRecursively(const std::string &dirPath, std::vector<YAML::Node> &result, bool skipRoot); std::optional<ParseResultData> ParseNode(YAML::Node& node, std::string& name); + std::vector<char> ParseVersionString(const std::string& version); }; diff --git a/src/main.cpp b/src/main.cpp index 4dba674..7edc3b8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -14,6 +14,7 @@ int main(int argc, char *argv[]) { std::string target; std::string folder; std::string archive; + std::string version; ArchiveType otrMode = ArchiveType::None; bool otrModeSelected = false; bool xmlMode = false; @@ -45,10 +46,12 @@ int main(int argc, char *argv[]) { o2r->add_option("-s,--srcdir", srcdir, "Set source directory to locate config.yml and asset metadata for processing")->check(CLI::ExistingDirectory); o2r->add_option("-d,--destdir", destdir, "Set destination directory for export"); o2r->add_option("-a,--additional-files", additionalFiles, "Additional files to include in the o2r archive (e.g., mods.toml)")->check(CLI::ExistingFile); + o2r->add_option("-vf,--version", version, "Version to set in the o2r archive"); o2r->parse_complete_callback([&] { const auto instance = Companion::Instance = new Companion(filename, ArchiveType::O2R, debug, srcdir, destdir); instance->SetAdditionalFiles(additionalFiles); + instance->SetVersion(version); instance->Init(ExportType::Binary); }); @@ -102,8 +105,8 @@ int main(int argc, char *argv[]) { pack->add_option("<folder>", folder, "Generate OTR from a directory of assets")->required()->check(CLI::ExistingDirectory); pack->add_option("<target>", target, "Archive output destination")->required(); pack->add_option("<archive-type>", archive, "Archive type: otr or o2r")->required(); + pack->add_option("-vf,--version", version, "Version to set in the o2r archive"); - pack->parse_complete_callback([&] { if (archive == "otr") { otrMode = ArchiveType::OTR; @@ -114,7 +117,7 @@ int main(int argc, char *argv[]) { } if (!folder.empty()) { - Companion::Pack(folder, target, otrMode); + Companion::Pack(folder, target, otrMode, version); } else { std::cout << "The folder is empty" << std::endl; } |
