mirror of
https://github.com/izzy2lost/Torch.git
synced 2026-07-06 00:18:35 -07:00
185 lines
8.0 KiB
C++
185 lines
8.0 KiB
C++
#include <iostream>
|
|
#include "CLI11.hpp"
|
|
#include "Companion.h"
|
|
|
|
#if defined(STANDALONE) && !defined(__EMSCRIPTEN__)
|
|
|
|
Companion* Companion::Instance;
|
|
|
|
int main(int argc, char *argv[]) {
|
|
CLI::App app{"Torch - [T]orch is [O]ur [R]esource [C]onversion [H]elper\n\
|
|
* It extracts from a baserom and generates code or an otr.\n\
|
|
* It can also generate an otr from a folder of assets.\n"
|
|
};
|
|
std::string mode;
|
|
std::string filename;
|
|
std::string target;
|
|
std::string folder;
|
|
std::string archive;
|
|
ArchiveType otrMode = ArchiveType::None;
|
|
bool otrModeSelected = false;
|
|
bool xmlMode = false;
|
|
bool debug = false;
|
|
std::string srcdir;
|
|
std::string destdir;
|
|
|
|
app.require_subcommand();
|
|
|
|
/* Generate an OTR */
|
|
const auto otr = app.add_subcommand("otr", "OTR - Generates an otr\n");
|
|
|
|
otr->add_option("<baserom.z64>", filename, "")->required()->check(CLI::ExistingFile);
|
|
otr->add_flag("-v,--verbose", debug, "Verbose Debug Mode");
|
|
otr->add_option("-s,--srcdir", srcdir, "Set source directory to locate config.yml and asset metadata for processing")->check(CLI::ExistingDirectory);
|
|
otr->add_option("-d,--destdir", destdir, "Set destination directory for export");
|
|
|
|
otr->parse_complete_callback([&] {
|
|
const auto instance = Companion::Instance = new Companion(filename, ArchiveType::OTR, debug, srcdir, destdir);
|
|
instance->Init(ExportType::Binary);
|
|
});
|
|
|
|
/* Generate an O2R */
|
|
const auto o2r = app.add_subcommand("o2r", "O2R - Generates an o2r\n");
|
|
|
|
o2r->add_option("<baserom.z64>", filename, "")->required()->check(CLI::ExistingFile);
|
|
o2r->add_flag("-v,--verbose", debug, "Verbose Debug Mode");
|
|
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->parse_complete_callback([&] {
|
|
const auto instance = Companion::Instance = new Companion(filename, ArchiveType::O2R, debug, srcdir, destdir);
|
|
instance->Init(ExportType::Binary);
|
|
});
|
|
|
|
/* Generate C code */
|
|
const auto code = app.add_subcommand("code", "Code - Generates C code\n");
|
|
|
|
code->add_option("<baserom.z64>", filename, "")->required()->check(CLI::ExistingFile);
|
|
code->add_flag("-v,--verbose", debug, "Verbose Debug Mode; adds offsets to C code");
|
|
code->add_option("-s,--srcdir", srcdir, "Set source directory to locate config.yml and asset metadata for processing")->check(CLI::ExistingDirectory);
|
|
code->add_option("-d,--destdir", destdir, "Set destination directory to place C code to");
|
|
|
|
code->parse_complete_callback([&]() {
|
|
const auto instance = Companion::Instance = new Companion(filename, ArchiveType::None, debug, srcdir, destdir);
|
|
instance->Init(ExportType::Code);
|
|
});
|
|
|
|
/* Generate a binary */
|
|
const auto binary = app.add_subcommand("binary", "Binary - Generates a binary\n");
|
|
|
|
binary->add_option("<baserom.z64>", filename, "")->required()->check(CLI::ExistingFile);
|
|
binary->add_option("-s,--srcdir", srcdir, "Set source directory to locate config.yml and asset metadata for processing")->check(CLI::ExistingDirectory);
|
|
binary->add_option("-d,--destdir", destdir, "Set destination directory to place binary to");
|
|
|
|
binary->parse_complete_callback([&] {
|
|
const auto instance = Companion::Instance = new Companion(filename, ArchiveType::None, debug, srcdir, destdir);
|
|
instance->Init(ExportType::Binary);
|
|
});
|
|
|
|
/* Generate headers */
|
|
const auto header = app.add_subcommand("header", "Header - Generates headers only\n");
|
|
|
|
header->add_option("<baserom.z64>", filename, "")->required()->check(CLI::ExistingFile);
|
|
header->add_flag("-o,--otr", otrModeSelected, "OTR/O2R Mode");
|
|
header->add_option("-s,--srcdir", srcdir, "Set source directory to locate config.yml and asset metadata for processing")->check(CLI::ExistingDirectory);
|
|
header->add_option("-d,--destdir", destdir, "Set destination directory to place headers to");
|
|
|
|
header->parse_complete_callback([&] {
|
|
if (otrModeSelected) {
|
|
otrMode = ArchiveType::OTR;
|
|
} else {
|
|
otrMode = ArchiveType::None;
|
|
}
|
|
|
|
const auto instance = Companion::Instance = new Companion(filename, otrMode, debug, srcdir, destdir);
|
|
instance->Init(ExportType::Header);
|
|
});
|
|
|
|
/* Pack an archive from a folder */
|
|
const auto pack = app.add_subcommand("pack", "Pack - Packs an archive from a folder\n");
|
|
|
|
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->parse_complete_callback([&] {
|
|
if (archive == "otr") {
|
|
otrMode = ArchiveType::OTR;
|
|
} else if (archive == "o2r") {
|
|
otrMode = ArchiveType::O2R;
|
|
} else {
|
|
std::cout << "Invalid archive type" << std::endl;
|
|
}
|
|
|
|
if (!folder.empty()) {
|
|
Companion::Pack(folder, target, otrMode);
|
|
} else {
|
|
std::cout << "The folder is empty" << std::endl;
|
|
}
|
|
});
|
|
|
|
/* Generate modding files */
|
|
const auto modding_root = app.add_subcommand("modding", "Modding - Generates modding files like png\n");
|
|
const auto modding_import = modding_root->add_subcommand("import", "Import - Import modified files to generate C code\n");
|
|
const auto modding_export = modding_root->add_subcommand("export", "Export - Export modified files to a folder\n");
|
|
|
|
modding_import->add_option("mode", mode, "code, otr, o2r or header")->required();
|
|
modding_import->add_option("<baserom.z64>", filename, "")->required()->check(CLI::ExistingFile);
|
|
modding_import->add_flag("-v,--verbose", debug, "Verbose Debug Mode");
|
|
modding_import->add_option("-s,--srcdir", srcdir, "Set source directory to locate config.yml and asset metadata for processing, including modified files")->check(CLI::ExistingDirectory);
|
|
modding_import->add_option("-d,--destdir", destdir, "Set destination directory to place for generating C code");
|
|
|
|
modding_import->parse_complete_callback([&] {
|
|
ArchiveType otrMode;
|
|
|
|
if (mode == "otr") {
|
|
otrMode = ArchiveType::OTR;
|
|
} else if (mode == "o2r") {
|
|
otrMode = ArchiveType::O2R;
|
|
} else {
|
|
otrMode = ArchiveType::None;
|
|
}
|
|
|
|
const auto instance = Companion::Instance = new Companion(filename, otrMode, debug, true, srcdir, destdir);
|
|
if (mode == "code") {
|
|
instance->Init(ExportType::Code);
|
|
} else if (mode == "otr" || mode == "o2r") {
|
|
instance->Init(ExportType::Binary);
|
|
} else if (mode == "header") {
|
|
instance->Init(ExportType::Header);
|
|
} else {
|
|
std::cout << "Invalid mode" << std::endl;
|
|
}
|
|
});
|
|
|
|
modding_export->add_flag("-x,--xml", xmlMode, "XML Mode");
|
|
modding_export->add_option("<baserom.z64>", filename, "")->required()->check(CLI::ExistingFile);
|
|
modding_export->add_option("-s,--srcdir", srcdir, "Set source directory to locate config.yml and asset metadata for processing, including modified files")->check(CLI::ExistingDirectory);
|
|
modding_export->add_option("-d,--destdir", destdir, "Set destination directory to place for generating modified files");
|
|
|
|
modding_export->parse_complete_callback([&] {
|
|
const auto instance = Companion::Instance = new Companion(filename, ArchiveType::None, debug, srcdir, destdir);
|
|
if (xmlMode) {
|
|
instance->Init(ExportType::XML);
|
|
} else {
|
|
instance->Init(ExportType::Modding);
|
|
}
|
|
});
|
|
|
|
try {
|
|
app.parse(argc, argv);
|
|
} catch (const CLI::ParseError &e) {
|
|
std::cout << app.help() << std::endl;
|
|
return app.exit(e);
|
|
}
|
|
|
|
// No arguments --> display help.
|
|
if (argc == 1) {
|
|
std::cout << app.help() << std::endl;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
#endif
|