Skip to content

Commit

Permalink
XEEN: Implement autosave support
Browse files Browse the repository at this point in the history
  • Loading branch information
dreammaster committed Aug 18, 2019
1 parent 1f38a82 commit 73a4f22
Show file tree
Hide file tree
Showing 6 changed files with 47 additions and 8 deletions.
9 changes: 8 additions & 1 deletion engines/xeen/events.cpp
Expand Up @@ -32,7 +32,7 @@
namespace Xeen {

EventsManager::EventsManager(XeenEngine *vm) : _vm(vm), _playTime(0), _gameCounter(0),
_frameCounter(0), _priorFrameCounterTime(0), _priorScreenRefreshTime(0),
_frameCounter(0), _priorFrameCounterTime(0), _priorScreenRefreshTime(0), _lastAutosaveTime(0),
_mousePressed(false), _sprites("mouse.icn") {
Common::fill(&_gameCounters[0], &_gameCounters[6], 0);
}
Expand Down Expand Up @@ -69,12 +69,19 @@ void EventsManager::pollEvents() {
_priorScreenRefreshTime = timer;
g_vm->_screen->update();
}

if (timer >= (_priorFrameCounterTime + GAME_FRAME_TIME)) {
// Time to build up next game frame
_priorFrameCounterTime = timer;
nextFrame();
}

// Handle auto saves
if (!_lastAutosaveTime)
_lastAutosaveTime = timer;
g_vm->autoSaveCheck(_lastAutosaveTime);

// Event handling
Common::Event event;
while (g_system->getEventManager()->pollEvent(event)) {
switch (event.type) {
Expand Down
1 change: 1 addition & 0 deletions engines/xeen/events.h
Expand Up @@ -63,6 +63,7 @@ class EventsManager {
uint32 _frameCounter;
uint32 _priorFrameCounterTime;
uint32 _priorScreenRefreshTime;
int _lastAutosaveTime;
uint32 _gameCounter;
uint32 _gameCounters[6];
uint32 _playTime;
Expand Down
7 changes: 6 additions & 1 deletion engines/xeen/saves.cpp
Expand Up @@ -263,7 +263,7 @@ bool SavesManager::loadGame() {
delete dialog;

if (slotNum != -1) {
loadGameState(slotNum);
(void)loadGameState(slotNum);
g_vm->_interface->drawParty(true);
}

Expand Down Expand Up @@ -291,4 +291,9 @@ bool SavesManager::saveGame() {
}
}

void SavesManager::doAutosave() {
if (saveGameState(kAutoSaveSlot, _("Autosave")).getCode() != Common::kNoError)
g_vm->GUIError(_("Failed to autosave"));
}

} // End of namespace Xeen
9 changes: 9 additions & 0 deletions engines/xeen/saves.h
Expand Up @@ -32,6 +32,10 @@

namespace Xeen {

enum {
kAutoSaveSlot = 0
};

struct XeenSavegameHeader {
uint8 _version;
Common::String _saveName;
Expand Down Expand Up @@ -82,6 +86,11 @@ class SavesManager {
*/
Common::Error saveGameState(int slot, const Common::String &desc);

/**
* Does an autosave
*/
void doAutosave();

/**
* Sets up a new game
*/
Expand Down
14 changes: 13 additions & 1 deletion engines/xeen/xeen.cpp
Expand Up @@ -266,7 +266,7 @@ void XeenEngine::gameLoop() {
// Load any pending savegame
int saveSlot = _loadSaveSlot;
_loadSaveSlot = -1;
_saves->loadGameState(saveSlot);
(void)_saves->loadGameState(saveSlot);
_interface->drawParty(true);
}

Expand Down Expand Up @@ -322,4 +322,16 @@ void XeenEngine::saveSettings() {
ConfMan.flushToDisk();
}

void XeenEngine::GUIError(const Common::String &msg) {
GUIErrorMessage(msg);
}

void XeenEngine::autoSaveCheck(int &lastSaveTime) {
if (shouldPerformAutoSave(lastSaveTime) && canSaveGameStateCurrently() &&
(_map && !(_map->mazeData()._mazeFlags & RESTRICTION_SAVE))) {
_saves->doAutosave();
lastSaveTime = g_system->getMillis();
}
}

} // End of namespace Xeen
15 changes: 10 additions & 5 deletions engines/xeen/xeen.h
Expand Up @@ -149,11 +149,6 @@ class XeenEngine : public Engine {
* Plays the actual game
*/
void play();

/**
* Shows a please wait dialog
*/
void pleaseWait();
protected:
int _loadSaveSlot;
protected:
Expand Down Expand Up @@ -275,6 +270,16 @@ class XeenEngine : public Engine {
* Saves engine settings
*/
void saveSettings();

/**
* Show an error message in a GUI dialog
*/
void GUIError(const Common::String &msg);

/**
* Checks if an auto save should be done, and if so, takes care of it
*/
void autoSaveCheck(int &lastSaveTime);
};

extern XeenEngine *g_vm;
Expand Down

0 comments on commit 73a4f22

Please sign in to comment.