mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-10-31 03:56:39 +00:00 
			
		
		
		
	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,7 +99,8 @@ namespace MWGui | ||||||
| 
 | 
 | ||||||
|         buttons.push_back("newgame"); |         buttons.push_back("newgame"); | ||||||
| 
 | 
 | ||||||
|         /// \todo hide, if no saved game is available
 |         if (MWBase::Environment::get().getStateManager()->characterBegin()!= | ||||||
|  |             MWBase::Environment::get().getStateManager()->characterEnd()) | ||||||
|             buttons.push_back("loadgame"); |             buttons.push_back("loadgame"); | ||||||
| 
 | 
 | ||||||
|         if (state==MWBase::StateManager::State_Running) |         if (state==MWBase::StateManager::State_Running) | ||||||
|  |  | ||||||
|  | @ -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