From 3400a0fab0660ad951377b86f8f7450b859573b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rasmus=20Br=C3=B6nneg=C3=A5rd?= <1162652+rasmusgo@users.noreply.github.com> Date: Wed, 2 Feb 2022 10:57:23 +0100 Subject: [PATCH 1/3] Add -loadgame argument to load game on start --- src/app/app.cpp | 28 +++++++++++++++++++++++++++- src/app/app.h | 4 ++++ src/level/robotmain.cpp | 11 +++++++++++ src/level/robotmain.h | 3 +++ 4 files changed, 45 insertions(+), 1 deletion(-) diff --git a/src/app/app.cpp b/src/app/app.cpp index 2d253aa3..bd37396b 100644 --- a/src/app/app.cpp +++ b/src/app/app.cpp @@ -246,6 +246,7 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[]) OPT_DEBUG, OPT_RUNSCENE, OPT_SCENETEST, + OPT_LOADGAME, OPT_LOGLEVEL, OPT_LANGDIR, OPT_DATADIR, @@ -264,6 +265,7 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[]) { "debug", required_argument, nullptr, OPT_DEBUG }, { "runscene", required_argument, nullptr, OPT_RUNSCENE }, { "scenetest", no_argument, nullptr, OPT_SCENETEST }, + { "loadgame", required_argument, nullptr, OPT_LOADGAME }, { "loglevel", required_argument, nullptr, OPT_LOGLEVEL }, { "langdir", required_argument, nullptr, OPT_LANGDIR }, { "datadir", required_argument, nullptr, OPT_DATADIR }, @@ -309,6 +311,7 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[]) GetLogger()->Message(" -debug modes enable debug modes (more info printed in logs; see code for reference of modes)\n"); GetLogger()->Message(" -runscene sceneNNN run given scene on start\n"); GetLogger()->Message(" -scenetest win every mission right after it's loaded\n"); + GetLogger()->Message(" -loadgame path load given game on start (path is /\n"); GetLogger()->Message(" -loglevel level set log level to level (one of: trace, debug, info, warn, error, none)\n"); GetLogger()->Message(" -langdir path set custom language directory path\n"); GetLogger()->Message(" environment variable: COLOBOT_LANG_DIR\n"); @@ -366,6 +369,22 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[]) m_sceneTest = true; break; } + case OPT_LOADGAME: + { + std::string playerAndPath = optarg; + size_t pos = playerAndPath.find_first_of("/"); + if (pos != std::string::npos && pos > 0 && pos+1 < playerAndPath.length()) // Split player name from path + { + m_loadGamePlayerName = playerAndPath.substr(0, pos); + m_loadGameDirName = playerAndPath.substr(pos+1, playerAndPath.length()-pos-1); + } + else + { + GetLogger()->Error("Invalid path: '%s'\n", optarg); + return PARSE_ARGS_FAIL; + } + break; + } case OPT_LOGLEVEL: { LogLevel logLevel; @@ -698,8 +717,15 @@ bool CApplication::Create() StartLoadingMusic(); - if (m_runSceneCategory == LevelCategory::Max) + if (!m_loadGameDirName.empty()) + { + m_controller->GetRobotMain()->SelectPlayer(m_loadGamePlayerName); + m_controller->GetRobotMain()->LoadGameFromDirName(m_loadGameDirName); + } + else if (m_runSceneCategory == LevelCategory::Max) + { m_controller->StartApp(); + } else { m_controller->GetRobotMain()->UpdateCustomLevelList(); // To load the userlevels diff --git a/src/app/app.h b/src/app/app.h index 45e41464..2efe34a1 100644 --- a/src/app/app.h +++ b/src/app/app.h @@ -405,6 +405,10 @@ protected: int m_runSceneRank; //@} + //! Game to load on startup + std::string m_loadGamePlayerName; + std::string m_loadGameDirName; + //! Scene test mode bool m_sceneTest; diff --git a/src/level/robotmain.cpp b/src/level/robotmain.cpp index 68ecee4f..a5cc4fdb 100644 --- a/src/level/robotmain.cpp +++ b/src/level/robotmain.cpp @@ -5839,6 +5839,17 @@ void CRobotMain::QuickLoad() m_playerProfile->LoadScene(dir); } +void CRobotMain::LoadGameFromDirName(const std::string& gameDir) +{ + std::string dir = m_playerProfile->GetSaveFile(gameDir); + if(!CResourceManager::Exists(dir)) + { + GetLogger()->Error("Save slot not found\n"); + return; + } + m_playerProfile->LoadScene(dir); +} + void CRobotMain::SetExitAfterMission(bool exit) { m_exitAfterMission = exit; diff --git a/src/level/robotmain.h b/src/level/robotmain.h index ceddcb78..a7f0206b 100644 --- a/src/level/robotmain.h +++ b/src/level/robotmain.h @@ -368,6 +368,9 @@ public: //! Enable mode where completing mission closes the game void SetExitAfterMission(bool exit); + //! Load saved game (used by command line argument) + void LoadGameFromDirName(const std::string& gameDir); + //! Returns true if player can interact with things manually bool CanPlayerInteract(); From 14e7cd0e520594bb18d412e73f6cfb9310468f67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rasmus=20Br=C3=B6nneg=C3=A5rd?= <1162652+rasmusgo@users.noreply.github.com> Date: Tue, 8 Feb 2022 14:17:11 +0100 Subject: [PATCH 2/3] Rename loadgame to loadsave --- src/app/app.cpp | 18 +++++++++--------- src/app/app.h | 4 ++-- src/level/robotmain.cpp | 2 +- src/level/robotmain.h | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/app/app.cpp b/src/app/app.cpp index bd37396b..bd83cffd 100644 --- a/src/app/app.cpp +++ b/src/app/app.cpp @@ -246,7 +246,7 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[]) OPT_DEBUG, OPT_RUNSCENE, OPT_SCENETEST, - OPT_LOADGAME, + OPT_LOADSAVE, OPT_LOGLEVEL, OPT_LANGDIR, OPT_DATADIR, @@ -265,7 +265,7 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[]) { "debug", required_argument, nullptr, OPT_DEBUG }, { "runscene", required_argument, nullptr, OPT_RUNSCENE }, { "scenetest", no_argument, nullptr, OPT_SCENETEST }, - { "loadgame", required_argument, nullptr, OPT_LOADGAME }, + { "loadsave", required_argument, nullptr, OPT_LOADSAVE }, { "loglevel", required_argument, nullptr, OPT_LOGLEVEL }, { "langdir", required_argument, nullptr, OPT_LANGDIR }, { "datadir", required_argument, nullptr, OPT_DATADIR }, @@ -311,7 +311,7 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[]) GetLogger()->Message(" -debug modes enable debug modes (more info printed in logs; see code for reference of modes)\n"); GetLogger()->Message(" -runscene sceneNNN run given scene on start\n"); GetLogger()->Message(" -scenetest win every mission right after it's loaded\n"); - GetLogger()->Message(" -loadgame path load given game on start (path is /\n"); + GetLogger()->Message(" -loadsave path load given saved game on start (path is /\n"); GetLogger()->Message(" -loglevel level set log level to level (one of: trace, debug, info, warn, error, none)\n"); GetLogger()->Message(" -langdir path set custom language directory path\n"); GetLogger()->Message(" environment variable: COLOBOT_LANG_DIR\n"); @@ -369,14 +369,14 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[]) m_sceneTest = true; break; } - case OPT_LOADGAME: + case OPT_LOADSAVE: { std::string playerAndPath = optarg; size_t pos = playerAndPath.find_first_of("/"); if (pos != std::string::npos && pos > 0 && pos+1 < playerAndPath.length()) // Split player name from path { - m_loadGamePlayerName = playerAndPath.substr(0, pos); - m_loadGameDirName = playerAndPath.substr(pos+1, playerAndPath.length()-pos-1); + m_loadSavePlayerName = playerAndPath.substr(0, pos); + m_loadSaveDirName = playerAndPath.substr(pos+1, playerAndPath.length()-pos-1); } else { @@ -717,10 +717,10 @@ bool CApplication::Create() StartLoadingMusic(); - if (!m_loadGameDirName.empty()) + if (!m_loadSaveDirName.empty()) { - m_controller->GetRobotMain()->SelectPlayer(m_loadGamePlayerName); - m_controller->GetRobotMain()->LoadGameFromDirName(m_loadGameDirName); + m_controller->GetRobotMain()->SelectPlayer(m_loadSavePlayerName); + m_controller->GetRobotMain()->LoadSaveFromDirName(m_loadSaveDirName); } else if (m_runSceneCategory == LevelCategory::Max) { diff --git a/src/app/app.h b/src/app/app.h index 2efe34a1..6868ea65 100644 --- a/src/app/app.h +++ b/src/app/app.h @@ -406,8 +406,8 @@ protected: //@} //! Game to load on startup - std::string m_loadGamePlayerName; - std::string m_loadGameDirName; + std::string m_loadSavePlayerName; + std::string m_loadSaveDirName; //! Scene test mode bool m_sceneTest; diff --git a/src/level/robotmain.cpp b/src/level/robotmain.cpp index a5cc4fdb..b829c80e 100644 --- a/src/level/robotmain.cpp +++ b/src/level/robotmain.cpp @@ -5839,7 +5839,7 @@ void CRobotMain::QuickLoad() m_playerProfile->LoadScene(dir); } -void CRobotMain::LoadGameFromDirName(const std::string& gameDir) +void CRobotMain::LoadSaveFromDirName(const std::string& gameDir) { std::string dir = m_playerProfile->GetSaveFile(gameDir); if(!CResourceManager::Exists(dir)) diff --git a/src/level/robotmain.h b/src/level/robotmain.h index a7f0206b..a90da679 100644 --- a/src/level/robotmain.h +++ b/src/level/robotmain.h @@ -369,7 +369,7 @@ public: void SetExitAfterMission(bool exit); //! Load saved game (used by command line argument) - void LoadGameFromDirName(const std::string& gameDir); + void LoadSaveFromDirName(const std::string& gameDir); //! Returns true if player can interact with things manually bool CanPlayerInteract(); From ee390bc27082d22ab5f66cc9cdc42b8b2ee66af9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rasmus=20Br=C3=B6nneg=C3=A5rd?= <1162652+rasmusgo@users.noreply.github.com> Date: Tue, 8 Feb 2022 20:02:56 +0100 Subject: [PATCH 3/3] LoadFinishedLevels if needed in LoadScene --- src/level/player_profile.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/level/player_profile.cpp b/src/level/player_profile.cpp index a88d052f..028d3e55 100644 --- a/src/level/player_profile.cpp +++ b/src/level/player_profile.cpp @@ -525,7 +525,7 @@ void CPlayerProfile::LoadScene(std::string dir) CLevelParserLine* line = levelParser.Get("Mission"); cat = GetLevelCategoryFromDir(line->GetParam("base")->AsString()); - if (dir == "../../crashsave") + if(!m_levelInfoLoaded[cat]) LoadFinishedLevels(cat); rank = line->GetParam("rank")->AsInt();