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.
|
/// \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 MWState::Character *getCurrentCharacter() = 0;
|
||||||
|
|
||||||
virtual CharacterIterator characterBegin() = 0;
|
virtual CharacterIterator characterBegin() = 0;
|
||||||
|
|
|
@ -8,6 +8,8 @@
|
||||||
#include "../mwbase/dialoguemanager.hpp"
|
#include "../mwbase/dialoguemanager.hpp"
|
||||||
#include "../mwbase/statemanager.hpp"
|
#include "../mwbase/statemanager.hpp"
|
||||||
|
|
||||||
|
#include "../mwstate/character.hpp"
|
||||||
|
|
||||||
#include "savegamedialog.hpp"
|
#include "savegamedialog.hpp"
|
||||||
|
|
||||||
namespace MWGui
|
namespace MWGui
|
||||||
|
@ -55,13 +57,22 @@ namespace MWGui
|
||||||
|
|
||||||
else if (sender == mButtons["loadgame"])
|
else if (sender == mButtons["loadgame"])
|
||||||
{
|
{
|
||||||
MWGui::SaveGameDialog* dialog = new MWGui::SaveGameDialog();
|
// for testing purpose, pick the first slot of the first character:
|
||||||
dialog->setLoadOrSave(true);
|
const MWState::Character& character =
|
||||||
dialog->setVisible(true);
|
*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"])
|
else if (sender == mButtons["savegame"])
|
||||||
{
|
{
|
||||||
|
// for testing purpose, save into a new slot:
|
||||||
MWBase::Environment::get().getStateManager()->saveGame (0);
|
MWBase::Environment::get().getStateManager()->saveGame (0);
|
||||||
|
|
||||||
// MWGui::SaveGameDialog* dialog = new MWGui::SaveGameDialog();
|
// MWGui::SaveGameDialog* dialog = new MWGui::SaveGameDialog();
|
||||||
// dialog->setLoadOrSave(false);
|
// dialog->setLoadOrSave(false);
|
||||||
// dialog->setVisible(true);
|
// dialog->setVisible(true);
|
||||||
|
@ -88,8 +99,9 @@ namespace MWGui
|
||||||
|
|
||||||
buttons.push_back("newgame");
|
buttons.push_back("newgame");
|
||||||
|
|
||||||
/// \todo hide, if no saved game is available
|
if (MWBase::Environment::get().getStateManager()->characterBegin()!=
|
||||||
buttons.push_back("loadgame");
|
MWBase::Environment::get().getStateManager()->characterEnd())
|
||||||
|
buttons.push_back("loadgame");
|
||||||
|
|
||||||
if (state==MWBase::StateManager::State_Running)
|
if (state==MWBase::StateManager::State_Running)
|
||||||
buttons.push_back("savegame");
|
buttons.push_back("savegame");
|
||||||
|
|
|
@ -9,6 +9,9 @@
|
||||||
|
|
||||||
#include <boost/filesystem.hpp>
|
#include <boost/filesystem.hpp>
|
||||||
|
|
||||||
|
#include <components/esm/esmreader.hpp>
|
||||||
|
#include <components/esm/defs.hpp>
|
||||||
|
|
||||||
bool MWState::operator< (const Slot& left, const Slot& right)
|
bool MWState::operator< (const Slot& left, const Slot& right)
|
||||||
{
|
{
|
||||||
return left.mTimeStamp<right.mTimeStamp;
|
return left.mTimeStamp<right.mTimeStamp;
|
||||||
|
@ -21,7 +24,15 @@ void MWState::Character::addSlot (const boost::filesystem::path& path)
|
||||||
slot.mPath = path;
|
slot.mPath = path;
|
||||||
slot.mTimeStamp = boost::filesystem::last_write_time (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);
|
mSlots.push_back (slot);
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,6 +56,16 @@ void MWState::CharacterManager::createCharacter()
|
||||||
mCurrent = &mCharacters.back();
|
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()
|
void MWState::CharacterManager::clearCurrentCharacter()
|
||||||
{
|
{
|
||||||
mCurrent = 0;
|
mCurrent = 0;
|
||||||
|
|
|
@ -32,6 +32,8 @@ namespace MWState
|
||||||
void createCharacter();
|
void createCharacter();
|
||||||
///< Create new character within saved game management
|
///< Create new character within saved game management
|
||||||
|
|
||||||
|
void setCurrentCharacter (const Character *character);
|
||||||
|
|
||||||
void clearCurrentCharacter();
|
void clearCurrentCharacter();
|
||||||
|
|
||||||
std::vector<Character>::const_iterator begin() const;
|
std::vector<Character>::const_iterator begin() const;
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#include "statemanagerimp.hpp"
|
#include "statemanagerimp.hpp"
|
||||||
|
|
||||||
#include <components/esm/esmwriter.hpp>
|
#include <components/esm/esmwriter.hpp>
|
||||||
|
#include <components/esm/esmreader.hpp>
|
||||||
|
|
||||||
#include "../mwbase/environment.hpp"
|
#include "../mwbase/environment.hpp"
|
||||||
#include "../mwbase/world.hpp"
|
#include "../mwbase/world.hpp"
|
||||||
|
@ -94,6 +95,27 @@ void MWState::StateManager::saveGame (const Slot *slot)
|
||||||
writer.close();
|
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()
|
MWState::Character *MWState::StateManager::getCurrentCharacter()
|
||||||
{
|
{
|
||||||
return mCharacterManager.getCurrentCharacter();
|
return mCharacterManager.getCurrentCharacter();
|
||||||
|
|
|
@ -37,6 +37,11 @@ namespace MWState
|
||||||
///
|
///
|
||||||
/// \note Slot must belong to the current character.
|
/// \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 Character *getCurrentCharacter();
|
||||||
|
|
||||||
virtual CharacterIterator characterBegin();
|
virtual CharacterIterator characterBegin();
|
||||||
|
|
Loading…
Reference in a new issue