Merge remote-tracking branch 'scrawl/cmdline-savegame'

openmw-35
Marc Zinnschlag 10 years ago
commit e830998739

@ -472,9 +472,13 @@ void OMW::Engine::go()
// Play some good 'ol tunes // Play some good 'ol tunes
MWBase::Environment::get().getSoundManager()->playPlaylist(std::string("Explore")); MWBase::Environment::get().getSoundManager()->playPlaylist(std::string("Explore"));
// start in main menu if (!mSaveGameFile.empty())
if (!mSkipMenu) {
MWBase::Environment::get().getStateManager()->loadGame(mSaveGameFile);
}
else if (!mSkipMenu)
{ {
// start in main menu
MWBase::Environment::get().getWindowManager()->pushGuiMode (MWGui::GM_MainMenu); MWBase::Environment::get().getWindowManager()->pushGuiMode (MWGui::GM_MainMenu);
try try
{ {
@ -622,3 +626,8 @@ void OMW::Engine::enableFontExport(bool exportFonts)
{ {
mExportFonts = exportFonts; mExportFonts = exportFonts;
} }
void OMW::Engine::setSaveGameFile(const std::string &savegame)
{
mSaveGameFile = savegame;
}

@ -83,6 +83,7 @@ namespace OMW
bool mScriptConsoleMode; bool mScriptConsoleMode;
std::string mStartupScript; std::string mStartupScript;
int mActivationDistanceOverride; int mActivationDistanceOverride;
std::string mSaveGameFile;
// Grab mouse? // Grab mouse?
bool mGrab; bool mGrab;
@ -204,6 +205,9 @@ namespace OMW
void enableFontExport(bool exportFonts); void enableFontExport(bool exportFonts);
/// Set the save game file to load after initialising the engine.
void setSaveGameFile(const std::string& savegame);
private: private:
Files::ConfigurationManager& mCfgMgr; Files::ConfigurationManager& mCfgMgr;
}; };

@ -152,6 +152,9 @@ bool parseOptions (int argc, char** argv, OMW::Engine& engine, Files::Configurat
("script-blacklist-use", bpo::value<bool>()->implicit_value(true) ("script-blacklist-use", bpo::value<bool>()->implicit_value(true)
->default_value(true), "enable script blacklisting") ->default_value(true), "enable script blacklisting")
("load-savegame", bpo::value<std::string>()->default_value(""),
"load a save game file on game startup")
("skip-menu", bpo::value<bool>()->implicit_value(true) ("skip-menu", bpo::value<bool>()->implicit_value(true)
->default_value(false), "skip main menu on game startup") ->default_value(false), "skip main menu on game startup")
@ -274,6 +277,7 @@ bool parseOptions (int argc, char** argv, OMW::Engine& engine, Files::Configurat
engine.setWarningsMode (variables["script-warn"].as<int>()); engine.setWarningsMode (variables["script-warn"].as<int>());
engine.setScriptBlacklist (variables["script-blacklist"].as<StringsVector>()); engine.setScriptBlacklist (variables["script-blacklist"].as<StringsVector>());
engine.setScriptBlacklistUse (variables["script-blacklist-use"].as<bool>()); engine.setScriptBlacklistUse (variables["script-blacklist-use"].as<bool>());
engine.setSaveGameFile (variables["load-savegame"].as<std::string>());
// other settings // other settings
engine.setSoundUsage(!variables["no-sound"].as<bool>()); engine.setSoundUsage(!variables["no-sound"].as<bool>());

@ -62,10 +62,13 @@ namespace MWBase
/// ///
/// \note Slot must belong to the current character. /// \note Slot must belong to the current character.
virtual void loadGame (const MWState::Character *character, const MWState::Slot *slot) = 0; virtual void loadGame (const std::string& filepath) = 0;
///< Load a saved game file from \a slot. ///< Load a saved game directly from the given file path. This will search the CharacterManager
/// /// for a Character containing this save file, and set this Character current if one was found.
/// \note \a slot must belong to \a character. /// Otherwise, a new Character will be created.
virtual void loadGame (const MWState::Character *character, const std::string& filepath) = 0;
///< Load a saved game file belonging to the given character.
///Simple saver, writes over the file if already existing ///Simple saver, writes over the file if already existing
/** Used for quick save and autosave **/ /** Used for quick save and autosave **/

@ -246,7 +246,7 @@ namespace MWGui
else else
{ {
assert (mCurrentCharacter && mCurrentSlot); assert (mCurrentCharacter && mCurrentSlot);
MWBase::Environment::get().getStateManager()->loadGame (mCurrentCharacter, mCurrentSlot); MWBase::Environment::get().getStateManager()->loadGame (mCurrentCharacter, mCurrentSlot->mPath.string());
} }
} }

@ -190,3 +190,8 @@ ESM::SavedGame MWState::Character::getSignature() const
return slot.mProfile; return slot.mProfile;
} }
const boost::filesystem::path& MWState::Character::getPath() const
{
return mPath;
}

@ -54,12 +54,12 @@ namespace MWState
/// \attention The \a slot pointer will be invalidated by this call. /// \attention The \a slot pointer will be invalidated by this call.
SlotIterator begin() const; SlotIterator begin() const;
///< First slot is the most recent. Other slots follow in descending order of save date. ///< Any call to createSlot and updateSlot can invalidate the returned iterator.
///
/// Any call to createSlot and updateSlot can invalidate the returned iterator.
SlotIterator end() const; SlotIterator end() const;
const boost::filesystem::path& getPath() const;
ESM::SavedGame getSignature() const; ESM::SavedGame getSignature() const;
///< Return signature information for this character. ///< Return signature information for this character.
/// ///

@ -291,16 +291,47 @@ void MWState::StateManager::quickSave (std::string name)
saveGame(name, slot); saveGame(name, slot);
} }
void MWState::StateManager::loadGame (const Character *character, const Slot *slot) void MWState::StateManager::loadGame(const std::string& filepath)
{
for (CharacterIterator it = mCharacterManager.begin(); it != mCharacterManager.end(); ++it)
{
const MWState::Character& character = *it;
for (MWState::Character::SlotIterator slotIt = character.begin(); slotIt != character.end(); ++slotIt)
{
const MWState::Slot& slot = *slotIt;
if (slot.mPath == boost::filesystem::path(filepath))
{
loadGame(&character, slot.mPath.string());
return;
}
}
}
// have to peek into the save file to get the player name
ESM::ESMReader reader;
reader.open (filepath);
if (reader.getFormat()>ESM::Header::CurrentFormat)
return; // format is too new -> ignore
if (reader.getRecName()!=ESM::REC_SAVE)
return; // invalid save file -> ignore
reader.getRecHeader();
ESM::SavedGame profile;
profile.load (reader);
reader.close();
MWState::Character* character = mCharacterManager.getCurrentCharacter(true, profile.mPlayerName);
loadGame(character, filepath);
mTimePlayed = profile.mTimePlayed;
}
void MWState::StateManager::loadGame (const Character *character, const std::string& filepath)
{ {
try try
{ {
cleanup(); cleanup();
mTimePlayed = slot->mProfile.mTimePlayed;
ESM::ESMReader reader; ESM::ESMReader reader;
reader.open (slot->mPath.string()); reader.open (filepath);
std::map<int, int> contentFileMap = buildContentFileIndexMap (reader); std::map<int, int> contentFileMap = buildContentFileIndexMap (reader);
@ -319,9 +350,11 @@ void MWState::StateManager::loadGame (const Character *character, const Slot *sl
switch (n.val) switch (n.val)
{ {
case ESM::REC_SAVE: case ESM::REC_SAVE:
{
// don't need to read that here ESM::SavedGame profile;
reader.skipRecord(); profile.load(reader);
mTimePlayed = profile.mTimePlayed;
}
break; break;
case ESM::REC_JOUR: case ESM::REC_JOUR:
@ -391,7 +424,7 @@ void MWState::StateManager::loadGame (const Character *character, const Slot *sl
mState = State_Running; mState = State_Running;
Settings::Manager::setString ("character", "Saves", Settings::Manager::setString ("character", "Saves",
slot->mPath.parent_path().filename().string()); character->getPath().filename().string());
MWBase::Environment::get().getWindowManager()->setNewGame(false); MWBase::Environment::get().getWindowManager()->setNewGame(false);
MWBase::Environment::get().getWorld()->setupPlayer(); MWBase::Environment::get().getWorld()->setupPlayer();
@ -431,7 +464,7 @@ void MWState::StateManager::quickLoad()
{ {
if (Character* mCurrentCharacter = getCurrentCharacter (false)) if (Character* mCurrentCharacter = getCurrentCharacter (false))
if (const MWState::Slot* slot = &*mCurrentCharacter->begin()) //Get newest save if (const MWState::Slot* slot = &*mCurrentCharacter->begin()) //Get newest save
loadGame (mCurrentCharacter, slot); loadGame (mCurrentCharacter, slot->mPath.string());
} }
void MWState::StateManager::deleteGame(const MWState::Character *character, const MWState::Slot *slot) void MWState::StateManager::deleteGame(const MWState::Character *character, const MWState::Slot *slot)
@ -472,7 +505,7 @@ void MWState::StateManager::update (float duration)
//Load last saved game for current character //Load last saved game for current character
MWState::Slot lastSave = *curCharacter->begin(); MWState::Slot lastSave = *curCharacter->begin();
loadGame(curCharacter, &lastSave); loadGame(curCharacter, lastSave.mPath.string());
} }
else if(iButton==1) else if(iButton==1)
{ {

@ -61,10 +61,13 @@ namespace MWState
/** Used for quickload **/ /** Used for quickload **/
virtual void quickLoad(); virtual void quickLoad();
virtual void loadGame (const Character *character, const Slot *slot); virtual void loadGame (const std::string& filepath);
///< Load a saved game file from \a slot. ///< Load a saved game directly from the given file path. This will search the CharacterManager
/// /// for a Character containing this save file, and set this Character current if one was found.
/// \note \a slot must belong to \a character. /// Otherwise, a new Character will be created.
virtual void loadGame (const Character *character, const std::string &filepath);
///< Load a saved game file belonging to the given character.
virtual Character *getCurrentCharacter (bool create = true); virtual Character *getCurrentCharacter (bool create = true);
///< \param create Create a new character, if there is no current character. ///< \param create Create a new character, if there is no current character.

Loading…
Cancel
Save