int start(excmd::parser &parser, excmd::option_state &options) { // Print version if (options.has("version")) { // TODO: print git hash std::cout << "Decaf Emulator version 0.0.1" << std::endl; std::exit(0); } // Print help if (options.empty() || options.has("help")) { if (options.has("help-command")) { std::cout << parser.format_help("decaf", options.get<std::string>("help-command")) << std::endl; } else { std::cout << parser.format_help("decaf") << std::endl; } std::exit(0); } if (!options.has("play")) { return 0; } // First thing, load the config! config::load("cli_config.json"); // Allow command line options to override config if (options.has("jit-debug")) { decaf::config::jit::debug = true; } if (options.has("jit")) { decaf::config::jit::enabled = true; } if (options.has("log-no-stdout")) { config::log::to_stdout = true; } if (options.has("log-file")) { config::log::to_file = true; } if (options.has("log-async")) { config::log::async = true; } if (options.has("log-level")) { config::log::level = options.get<std::string>("log-level"); } if (options.has("sys-path")) { decaf::config::system::system_path = options.get<std::string>("sys-path"); } if (options.has("timeout_ms")) { config::system::timeout_ms = options.get<uint32_t>("timeout_ms"); } auto gamePath = options.get<std::string>("game directory"); auto logFile = getPathBasename(gamePath); auto logLevel = spdlog::level::info; std::vector<spdlog::sink_ptr> sinks; if (config::log::to_stdout) { sinks.push_back(spdlog::sinks::stdout_sink_st::instance()); } if (config::log::to_file) { sinks.push_back(std::make_shared<spdlog::sinks::daily_file_sink_st>(logFile, "txt", 23, 59, true)); } if (config::log::async) { spdlog::set_async_mode(1024); } for (int i = spdlog::level::trace; i <= spdlog::level::off; i++) { auto level = static_cast<spdlog::level::level_enum>(i); if (spdlog::level::to_str(level) == config::log::level) { logLevel = level; break; } } // Initialise libdecaf logger decaf::initialiseLogging(sinks, logLevel); // Initialise decaf-cli logger gCliLog = std::make_shared<spdlog::logger>("decaf-cli", begin(sinks), end(sinks)); gCliLog->set_level(logLevel); gCliLog->set_pattern("[%l] %v"); DecafCLI cli; return cli.run(gamePath); }
int start(excmd::parser &parser, excmd::option_state &options) { // Print version if (options.has("version")) { // TODO: print git hash std::cout << "Decaf Emulator version 0.0.1" << std::endl; std::exit(0); } // Print help if (options.empty() || options.has("help")) { if (options.has("help-command")) { std::cout << parser.format_help("decaf", options.get<std::string>("help-command")) << std::endl; } else { std::cout << parser.format_help("decaf") << std::endl; } std::exit(0); } if (!options.has("play")) { return 0; } // First thing, load the config! std::string configPath; if (options.has("config")) { configPath = options.get<std::string>("config"); } else { decaf::createConfigDirectory(); configPath = decaf::makeConfigPath("cli_config.json"); } config::load(configPath); // Allow command line options to override config if (options.has("jit-verify")) { decaf::config::jit::verify = true; } if (options.has("jit")) { decaf::config::jit::enabled = true; } if (options.has("log-no-stdout")) { config::log::to_stdout = true; } if (options.has("log-file")) { config::log::to_file = true; } if (options.has("log-async")) { decaf::config::log::async = true; } if (options.has("log-level")) { config::log::level = options.get<std::string>("log-level"); } if (options.has("region")) { const std::string region = options.get<std::string>("region"); if (region.compare("JAP") == 0) { decaf::config::system::region = coreinit::SCIRegion::JAP; } else if (region.compare("USA") == 0) { decaf::config::system::region = coreinit::SCIRegion::USA; } else if (region.compare("EUR") == 0) { decaf::config::system::region = coreinit::SCIRegion::EUR; } else { decaf_abort(fmt::format("Invalid region {}", region)); } } if (options.has("mlc-path")) { decaf::config::system::mlc_path = options.get<std::string>("mlc-path"); } if (options.has("time-scale")) { decaf::config::system::time_scale = options.get<double>("time-scale"); } if (options.has("timeout_ms")) { config::system::timeout_ms = options.get<uint32_t>("timeout_ms"); } auto gamePath = options.get<std::string>("game directory"); auto logFile = getPathBasename(gamePath); auto logLevel = spdlog::level::info; std::vector<spdlog::sink_ptr> sinks; if (config::log::to_stdout) { sinks.push_back(spdlog::sinks::stdout_sink_st::instance()); } if (config::log::to_file) { sinks.push_back(std::make_shared<spdlog::sinks::daily_file_sink_st>(logFile, "txt", 23, 59)); } if (decaf::config::log::async) { spdlog::set_async_mode(1024); } else { spdlog::set_sync_mode(); } for (int i = spdlog::level::trace; i <= spdlog::level::off; i++) { auto level = static_cast<spdlog::level::level_enum>(i); if (spdlog::level::to_str(level) == config::log::level) { logLevel = level; break; } } // Initialise libdecaf logger decaf::initialiseLogging(sinks, logLevel); // Initialise decaf-cli logger gCliLog = std::make_shared<spdlog::logger>("decaf-cli", begin(sinks), end(sinks)); gCliLog->set_level(logLevel); gCliLog->set_pattern("[%l] %v"); gCliLog->info("Loaded config from {}", configPath); gCliLog->info("Game path {}", gamePath); DecafCLI cli; return cli.run(gamePath); }