jak-project/decompiler/main.cpp
Tyler Wilding b4113dda67
decompiler: Cleanup duplication in extractor/decompiler and make it easier to enable streamed audio ripping from CLI (#3560)
This centralizes the code that both `extractor` and the decompiler
executes. In the past this code was partially-duplicated, meaning that
the `extractor` could only do _some_ operations and not others (ie.
could not extract the audio files).

I also simplified the process to enable audio streaming in the
configuration. This is to support a new feature in the launcher that
allows you to enable these options for the decompiler:


![image](https://github.com/open-goal/jak-project/assets/13153231/8e6c20a1-8b5b-46f0-bceb-7644f713989f)
2024-06-29 01:18:39 -04:00

108 lines
3.6 KiB
C++

#include <string>
#include "config.h"
#include "decompilation_process.h"
#include "common/log/log.h"
#include "common/util/FileUtil.h"
#include "common/util/set_util.h"
#include "common/util/term_util.h"
#include "common/util/unicode_util.h"
#include "third-party/CLI11.hpp"
int main(int argc, char** argv) {
ArgumentGuard u8_guard(argc, argv);
fs::path config_path;
fs::path in_folder;
fs::path out_folder;
std::string config_game_version = "";
std::string config_override = "{}";
CLI::App app{"OpenGOAL Decompiler"};
app.add_option("config-path", config_path,
"Path to the decompiler config .jsonc file. ie. "
"./decompiler/config/jak1/jak1_config.jsonc")
->required();
app.add_option("in-folder", in_folder,
"The path containing the iso_data folders. ie. ./iso_data/. Assumes the "
"'gameName' from the config as a sub-directory")
->required();
app.add_option("out-folder", out_folder,
"The path for where the decompiler should place it's outputs. Assumes the "
"'gameName' from the config as a sub-directory")
->required();
app.add_option("--version", config_game_version,
"The name of the game version to update the config with, ie. ntsc_v2")
->required();
app.add_option("--config-override", config_override,
"JSON provided will be merged with the specified config, use to override options");
define_common_cli_arguments(app);
app.validate_positionals();
CLI11_PARSE(app, argc, argv);
if (!file_util::setup_project_path(std::nullopt)) {
lg::error("Unable to setup project path");
return 1;
}
try {
lg::set_file("decompiler");
lg::set_file_level(lg::level::info);
lg::set_stdout_level(lg::level::info);
lg::set_flush_level(lg::level::info);
lg::initialize();
if (_cli_flag_disable_ansi) {
lg::disable_ansi_colors();
}
} catch (const std::exception& e) {
lg::error("Failed to setup logging: {}", e.what());
return 1;
}
decompiler::Config config;
try {
config = decompiler::read_config_file(config_path, config_game_version, config_override);
} catch (const std::exception& e) {
lg::error("Failed to parse config: {}", e.what());
return 1;
}
// these options imply read_spools
config.read_spools |= config.process_subtitle_text || config.process_subtitle_images;
// Check if any banned objects are also in the allowed objects list
// if so, throw an error as this can be a confusing situation
auto intersection = set_util::intersection(config.allowed_objects, config.banned_objects);
if (!intersection.empty()) {
lg::error("Aborting - There is an overlap between 'allowed_objects' and 'banned_objects'");
return 1;
}
in_folder = in_folder / config.game_name;
// Verify the in_folder is correct
if (!exists(in_folder)) {
lg::error("Aborting - 'in_folder' does not exist '{}'", in_folder.string());
return 1;
}
out_folder = out_folder / config.game_name;
file_util::create_dir_if_needed(out_folder);
file_util::create_dir_if_needed(out_folder / "assets");
// Warning message if expected ELF isn't found, user could be using bad assets / didn't extract
// the ISO properly
if (!config.expected_elf_name.empty() && !fs::exists(in_folder / config.expected_elf_name)) {
lg::error(
"WARNING - '{}' does not contain the expected ELF file '{}'. Was the ISO extracted "
"properly or is there a version mismatch?",
in_folder.string(), config.expected_elf_name);
}
// -- Begin the Decompilation!
return run_decompilation_process(config, in_folder, out_folder, false);
}