From cdf5490d56f02001fe79230a59fed76c60d69db7 Mon Sep 17 00:00:00 2001 From: iwubcode Date: Wed, 6 May 2020 22:10:30 -0500 Subject: [PATCH] Core: Add support for specifying a command line option to boot the game into a save-state --- Source/Core/DolphinNoGUI/MainNoGUI.cpp | 19 +++++++++++++++++-- Source/Core/DolphinQt/Main.cpp | 21 +++++++++++++++++---- Source/Core/UICommon/CommandLineParse.cpp | 5 +++++ 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/Source/Core/DolphinNoGUI/MainNoGUI.cpp b/Source/Core/DolphinNoGUI/MainNoGUI.cpp index 1278d46c40..0bf4df23b8 100644 --- a/Source/Core/DolphinNoGUI/MainNoGUI.cpp +++ b/Source/Core/DolphinNoGUI/MainNoGUI.cpp @@ -156,13 +156,21 @@ int main(int argc, char* argv[]) optparse::Values& options = CommandLineParse::ParseArguments(parser.get(), argc, argv); std::vector args = parser->args(); + std::optional save_state_path; + if (options.is_set("save_state")) + { + save_state_path = static_cast(options.get("save_state")); + } + std::unique_ptr boot; + bool game_specified = false; if (options.is_set("exec")) { const std::list paths_list = options.all("exec"); const std::vector paths{std::make_move_iterator(std::begin(paths_list)), std::make_move_iterator(std::end(paths_list))}; - boot = BootParameters::GenerateFromFile(paths); + boot = BootParameters::GenerateFromFile(paths, save_state_path); + game_specified = true; } else if (options.is_set("nand_title")) { @@ -178,8 +186,9 @@ int main(int argc, char* argv[]) } else if (args.size()) { - boot = BootParameters::GenerateFromFile(args.front()); + boot = BootParameters::GenerateFromFile(args.front(), save_state_path); args.erase(args.begin()); + game_specified = true; } else { @@ -201,6 +210,12 @@ int main(int argc, char* argv[]) return 1; } + if (save_state_path && !game_specified) + { + fprintf(stderr, "A save state cannot be loaded without specifying a game to launch.\n"); + return 1; + } + Core::SetOnStateChangedCallback([](Core::State state) { if (state == Core::State::Uninitialized) s_platform->Stop(); diff --git a/Source/Core/DolphinQt/Main.cpp b/Source/Core/DolphinQt/Main.cpp index 48b2bc94c0..ac04ea8f1a 100644 --- a/Source/Core/DolphinQt/Main.cpp +++ b/Source/Core/DolphinQt/Main.cpp @@ -151,6 +151,12 @@ int main(int argc, char* argv[]) QObject::connect(QAbstractEventDispatcher::instance(), &QAbstractEventDispatcher::aboutToBlock, &app, &Core::HostDispatchJobs); + std::optional save_state_path; + if (options.is_set("save_state")) + { + save_state_path = static_cast(options.get("save_state")); + } + std::unique_ptr boot; bool game_specified = false; if (options.is_set("exec")) @@ -158,7 +164,7 @@ int main(int argc, char* argv[]) const std::list paths_list = options.all("exec"); const std::vector paths{std::make_move_iterator(std::begin(paths_list)), std::make_move_iterator(std::end(paths_list))}; - boot = BootParameters::GenerateFromFile(paths); + boot = BootParameters::GenerateFromFile(paths, save_state_path); game_specified = true; } else if (options.is_set("nand_title")) @@ -177,20 +183,27 @@ int main(int argc, char* argv[]) } else if (!args.empty()) { - boot = BootParameters::GenerateFromFile(args.front()); + boot = BootParameters::GenerateFromFile(args.front(), save_state_path); game_specified = true; } int retval; - if (Settings::Instance().IsBatchModeEnabled() && !game_specified) + if (save_state_path && !game_specified) + { + ModalMessageBox::critical( + nullptr, QObject::tr("Error"), + QObject::tr("A save state cannot be loaded without specifying a game to launch.")); + retval = 1; + } + else if (Settings::Instance().IsBatchModeEnabled() && !game_specified) { ModalMessageBox::critical( nullptr, QObject::tr("Error"), QObject::tr("Batch mode cannot be used without specifying a game to launch.")); retval = 1; } - else if (Settings::Instance().IsBatchModeEnabled() && !boot) + else if (!boot && (Settings::Instance().IsBatchModeEnabled() || save_state_path)) { // A game to launch was specified, but it was invalid. // An error has already been shown by code above, so exit without showing another error. diff --git a/Source/Core/UICommon/CommandLineParse.cpp b/Source/Core/UICommon/CommandLineParse.cpp index 8051393e4d..c89a5784f0 100644 --- a/Source/Core/UICommon/CommandLineParse.cpp +++ b/Source/Core/UICommon/CommandLineParse.cpp @@ -94,6 +94,11 @@ std::unique_ptr CreateParser(ParserOptions options) .metavar(".
.=") .type("string") .help("Set a configuration option"); + parser->add_option("-s", "--save_state") + .action("store") + .metavar("") + .type("string") + .help("Load the initial save state"); if (options == ParserOptions::IncludeGUIOptions) {