forked from mirror/openmw-tes3mp
load saved game record
This commit is contained in:
parent
5ba56a5ea5
commit
c165894869
7 changed files with 73 additions and 6 deletions
|
@ -57,6 +57,11 @@ namespace MWBase
|
|||
///
|
||||
/// \note Slot must belong to the current character.
|
||||
|
||||
virtual void loadGame (const MWState::Character *character, const MWState::Slot *slot) = 0;
|
||||
///< Load a saved game file from \a slot.
|
||||
///
|
||||
/// \note \a slot must belong to \a character.
|
||||
|
||||
virtual MWState::Character *getCurrentCharacter() = 0;
|
||||
|
||||
virtual CharacterIterator characterBegin() = 0;
|
||||
|
|
|
@ -8,6 +8,8 @@
|
|||
#include "../mwbase/dialoguemanager.hpp"
|
||||
#include "../mwbase/statemanager.hpp"
|
||||
|
||||
#include "../mwstate/character.hpp"
|
||||
|
||||
#include "savegamedialog.hpp"
|
||||
|
||||
namespace MWGui
|
||||
|
@ -55,13 +57,22 @@ namespace MWGui
|
|||
|
||||
else if (sender == mButtons["loadgame"])
|
||||
{
|
||||
MWGui::SaveGameDialog* dialog = new MWGui::SaveGameDialog();
|
||||
dialog->setLoadOrSave(true);
|
||||
dialog->setVisible(true);
|
||||
// for testing purpose, pick the first slot of the first character:
|
||||
const MWState::Character& character =
|
||||
*MWBase::Environment::get().getStateManager()->characterBegin();
|
||||
const MWState::Slot& slot = *character.begin();
|
||||
|
||||
MWBase::Environment::get().getStateManager()->loadGame (&character, &slot);
|
||||
|
||||
// MWGui::SaveGameDialog* dialog = new MWGui::SaveGameDialog();
|
||||
// dialog->setLoadOrSave(true);
|
||||
// dialog->setVisible(true);
|
||||
}
|
||||
else if (sender == mButtons["savegame"])
|
||||
{
|
||||
// for testing purpose, save into a new slot:
|
||||
MWBase::Environment::get().getStateManager()->saveGame (0);
|
||||
|
||||
// MWGui::SaveGameDialog* dialog = new MWGui::SaveGameDialog();
|
||||
// dialog->setLoadOrSave(false);
|
||||
// dialog->setVisible(true);
|
||||
|
@ -88,8 +99,9 @@ namespace MWGui
|
|||
|
||||
buttons.push_back("newgame");
|
||||
|
||||
/// \todo hide, if no saved game is available
|
||||
buttons.push_back("loadgame");
|
||||
if (MWBase::Environment::get().getStateManager()->characterBegin()!=
|
||||
MWBase::Environment::get().getStateManager()->characterEnd())
|
||||
buttons.push_back("loadgame");
|
||||
|
||||
if (state==MWBase::StateManager::State_Running)
|
||||
buttons.push_back("savegame");
|
||||
|
|
|
@ -9,6 +9,9 @@
|
|||
|
||||
#include <boost/filesystem.hpp>
|
||||
|
||||
#include <components/esm/esmreader.hpp>
|
||||
#include <components/esm/defs.hpp>
|
||||
|
||||
bool MWState::operator< (const Slot& left, const Slot& right)
|
||||
{
|
||||
return left.mTimeStamp<right.mTimeStamp;
|
||||
|
@ -21,7 +24,15 @@ void MWState::Character::addSlot (const boost::filesystem::path& path)
|
|||
slot.mPath = path;
|
||||
slot.mTimeStamp = boost::filesystem::last_write_time (path);
|
||||
|
||||
/// \todo load profile
|
||||
ESM::ESMReader reader;
|
||||
reader.open (slot.mPath.string());
|
||||
|
||||
if (reader.getRecName()!=ESM::REC_SAVE)
|
||||
return; // invalid save file -> ignore
|
||||
|
||||
reader.getRecHeader();
|
||||
|
||||
slot.mProfile.load (reader);
|
||||
|
||||
mSlots.push_back (slot);
|
||||
}
|
||||
|
|
|
@ -56,6 +56,16 @@ void MWState::CharacterManager::createCharacter()
|
|||
mCurrent = &mCharacters.back();
|
||||
}
|
||||
|
||||
void MWState::CharacterManager::setCurrentCharacter (const Character *character)
|
||||
{
|
||||
int index = character - &mCharacters[0];
|
||||
|
||||
if (index<0 || index>=static_cast<int> (mCharacters.size()))
|
||||
throw std::logic_error ("invalid character");
|
||||
|
||||
mCurrent = &mCharacters[index];
|
||||
}
|
||||
|
||||
void MWState::CharacterManager::clearCurrentCharacter()
|
||||
{
|
||||
mCurrent = 0;
|
||||
|
|
|
@ -32,6 +32,8 @@ namespace MWState
|
|||
void createCharacter();
|
||||
///< Create new character within saved game management
|
||||
|
||||
void setCurrentCharacter (const Character *character);
|
||||
|
||||
void clearCurrentCharacter();
|
||||
|
||||
std::vector<Character>::const_iterator begin() const;
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
#include "statemanagerimp.hpp"
|
||||
|
||||
#include <components/esm/esmwriter.hpp>
|
||||
#include <components/esm/esmreader.hpp>
|
||||
|
||||
#include "../mwbase/environment.hpp"
|
||||
#include "../mwbase/world.hpp"
|
||||
|
@ -94,6 +95,27 @@ void MWState::StateManager::saveGame (const Slot *slot)
|
|||
writer.close();
|
||||
}
|
||||
|
||||
void MWState::StateManager::loadGame (const Character *character, const Slot *slot)
|
||||
{
|
||||
if (mState!=State_NoGame)
|
||||
{
|
||||
MWBase::Environment::get().getDialogueManager()->clear();
|
||||
MWBase::Environment::get().getJournal()->clear();
|
||||
mState = State_NoGame;
|
||||
mCharacterManager.clearCurrentCharacter();
|
||||
}
|
||||
|
||||
ESM::ESMReader reader;
|
||||
reader.open (slot->mPath.string());
|
||||
|
||||
reader.getRecName(); // don't need to read that here
|
||||
reader.getRecHeader();
|
||||
|
||||
/// \todo read saved game data
|
||||
|
||||
mState = State_Running;
|
||||
}
|
||||
|
||||
MWState::Character *MWState::StateManager::getCurrentCharacter()
|
||||
{
|
||||
return mCharacterManager.getCurrentCharacter();
|
||||
|
|
|
@ -37,6 +37,11 @@ namespace MWState
|
|||
///
|
||||
/// \note Slot must belong to the current character.
|
||||
|
||||
virtual void loadGame (const Character *character, const Slot *slot);
|
||||
///< Load a saved game file from \a slot.
|
||||
///
|
||||
/// \note \a slot must belong to \a character.
|
||||
|
||||
virtual Character *getCurrentCharacter();
|
||||
|
||||
virtual CharacterIterator characterBegin();
|
||||
|
|
Loading…
Reference in a new issue