summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authoriwubcode <iwubcode@users.noreply.github.com>2020-05-06 22:10:30 -0500
committeriwubcode <iwubcode@users.noreply.github.com>2020-05-06 22:10:30 -0500
commitcdf5490d56f02001fe79230a59fed76c60d69db7 (patch)
tree8f03157f4c0a5ee74d30c0ca048c824e18c4cdb2 /Source/Core
parent74b2410d7e3feefe25cd49c16773ea48fc0e2579 (diff)
Core: Add support for specifying a command line option to boot the game into a save-state
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/DolphinNoGUI/MainNoGUI.cpp19
-rw-r--r--Source/Core/DolphinQt/Main.cpp21
-rw-r--r--Source/Core/UICommon/CommandLineParse.cpp5
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<std::string> args = parser->args();
+ std::optional<std::string> save_state_path;
+ if (options.is_set("save_state"))
+ {
+ save_state_path = static_cast<const char*>(options.get("save_state"));
+ }
+
std::unique_ptr<BootParameters> boot;
+ bool game_specified = false;
if (options.is_set("exec"))
{
const std::list<std::string> paths_list = options.all("exec");
const std::vector<std::string> 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<std::string> save_state_path;
+ if (options.is_set("save_state"))
+ {
+ save_state_path = static_cast<const char*>(options.get("save_state"));
+ }
+
std::unique_ptr<BootParameters> boot;
bool game_specified = false;
if (options.is_set("exec"))
@@ -158,7 +164,7 @@ int main(int argc, char* argv[])
const std::list<std::string> paths_list = options.all("exec");
const std::vector<std::string> 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<optparse::OptionParser> CreateParser(ParserOptions options)
.metavar("<System>.<Section>.<Key>=<Value>")
.type("string")
.help("Set a configuration option");
+ parser->add_option("-s", "--save_state")
+ .action("store")
+ .metavar("<file>")
+ .type("string")
+ .help("Load the initial save state");
if (options == ParserOptions::IncludeGUIOptions)
{