aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
Diffstat (limited to 'engines')
-rw-r--r--engines/dialogs.cpp51
-rw-r--r--engines/dialogs.h4
-rw-r--r--engines/engine.cpp20
-rw-r--r--engines/engine.h39
-rw-r--r--engines/igor/igor.h4
-rw-r--r--engines/igor/saveload.cpp8
-rw-r--r--engines/metaengine.h12
-rw-r--r--engines/queen/queen.cpp4
-rw-r--r--engines/queen/queen.h2
-rw-r--r--engines/saga/detection.cpp26
-rw-r--r--engines/saga/saga.cpp8
-rw-r--r--engines/saga/saga.h3
-rw-r--r--engines/touche/menu.cpp2
-rw-r--r--engines/touche/saveload.cpp4
-rw-r--r--engines/touche/touche.h2
15 files changed, 174 insertions, 15 deletions
diff --git a/engines/dialogs.cpp b/engines/dialogs.cpp
index 97c55d4a1f..d0eac1d2e7 100644
--- a/engines/dialogs.cpp
+++ b/engines/dialogs.cpp
@@ -33,6 +33,7 @@
#include "gui/about.h"
#include "gui/newgui.h"
+#include "gui/launcher.h"
#include "gui/ListWidget.h"
#include "gui/theme.h"
@@ -96,8 +97,15 @@ MainMenuDialog::MainMenuDialog(Engine *engine)
new GUI::ButtonWidget(this, "GlobalMenu.Resume", "Resume", kPlayCmd, 'P');
-// new GUI::ButtonWidget(this, "globalmain_load", "Load", kLoadCmd, 'L');
-// new GUI::ButtonWidget(this, "globalmain_save", "Save", kSaveCmd, 'S');
+ _loadButton = new GUI::ButtonWidget(this, "GlobalMenu.Load", "Load", kLoadCmd, 'L');
+ // TODO: setEnabled -> setVisible
+ _loadButton->setEnabled(_engine->hasFeature(Engine::kSupportsListSaves) &&
+ _engine->hasFeature(Engine::kSupportsLoadingDuringRuntime));
+
+ _saveButton = new GUI::ButtonWidget(this, "GlobalMenu.Save", "Save", kSaveCmd, 'S');
+ // TODO: setEnabled -> setVisible
+ _saveButton->setEnabled(_engine->hasFeature(Engine::kSupportsListSaves) &&
+ _engine->hasFeature(Engine::kSupportsSavingDuringRuntime));
new GUI::ButtonWidget(this, "GlobalMenu.Options", "Options", kOptionsCmd, 'O');
@@ -111,11 +119,14 @@ MainMenuDialog::MainMenuDialog(Engine *engine)
_aboutDialog = new GUI::AboutDialog();
_optionsDialog = new ConfigDialog();
+ _loadDialog = new GUI::SaveLoadChooser("Load game:", "Load");
}
MainMenuDialog::~MainMenuDialog() {
delete _aboutDialog;
delete _optionsDialog;
+ delete _loadDialog;
+ //delete _saveDialog;
}
void MainMenuDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) {
@@ -123,6 +134,39 @@ void MainMenuDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 dat
case kPlayCmd:
close();
break;
+ case kLoadCmd:
+ {
+ String gameId = ConfMan.get("gameid");
+
+ const EnginePlugin *plugin = 0;
+ EngineMan.findGame(gameId, &plugin);
+
+ int slot = _loadDialog->runModal(plugin, ConfMan.getActiveDomainName());
+
+ if (slot >= 0) {
+ _engine->loadGameState(slot);
+ close();
+ }
+
+ }
+ break;
+ case kSaveCmd:
+ /*
+ String gameId = ConfMan.get("gameid");
+
+ const EnginePlugin *plugin = 0;
+ EngineMan.findGame(gameId, &plugin);
+
+ int slot = _saveDialog->runModal(plugin, ConfMan.getActiveDomainName());
+
+ if (slot >= 0) {
+ _engine->saveGameState(slot);
+ close();
+ }
+
+ }
+ */
+ break;
case kOptionsCmd:
_optionsDialog->runModal();
break;
@@ -149,6 +193,9 @@ void MainMenuDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 dat
}
void MainMenuDialog::reflowLayout() {
+ _loadButton->setEnabled(_engine->canLoadGameStateCurrently());
+ _saveButton->setEnabled(_engine->canSaveGameStateCurrently());
+
#ifndef DISABLE_FANCY_THEMES
if (g_gui.xmlEval()->getVar("Globals.ShowGlobalMenuLogo", 0) == 1 && g_gui.theme()->supportsImages()) {
if (!_logo)
diff --git a/engines/dialogs.h b/engines/dialogs.h
index 66ea13b8f1..d38abeb3cf 100644
--- a/engines/dialogs.h
+++ b/engines/dialogs.h
@@ -27,6 +27,7 @@
#include "common/str.h"
#include "gui/dialog.h"
+#include "gui/launcher.h"
#include "gui/options.h"
#include "gui/widget.h"
@@ -56,8 +57,11 @@ protected:
GUI::GraphicsWidget *_logo;
GUI::ButtonWidget *_rtlButton;
+ GUI::ButtonWidget *_loadButton;
+ GUI::ButtonWidget *_saveButton;
GUI::Dialog *_aboutDialog;
GUI::Dialog *_optionsDialog;
+ GUI::SaveLoadChooser *_loadDialog;
};
diff --git a/engines/engine.cpp b/engines/engine.cpp
index d5d5498384..4bbe2d069f 100644
--- a/engines/engine.cpp
+++ b/engines/engine.cpp
@@ -255,6 +255,26 @@ void Engine::syncSoundSettings() {
_mixer->setVolumeForSoundType(Audio::Mixer::kSpeechSoundType, soundVolumeSpeech);
}
+int Engine::loadGameState(int slot) {
+ // Do nothing by default
+ return 0;
+}
+
+bool Engine::canLoadGameStateCurrently() {
+ // Do not allow loading by default
+ return false;
+}
+
+int Engine::saveGameState(int slot) {
+ // Do nothing by default
+ return 0;
+}
+
+bool Engine::canSaveGameStateCurrently() {
+ // Do not allow saving by default
+ return false;
+}
+
void Engine::quitGame() {
Common::Event event;
diff --git a/engines/engine.h b/engines/engine.h
index 69caafac49..90eea859ef 100644
--- a/engines/engine.h
+++ b/engines/engine.h
@@ -125,6 +125,26 @@ public:
*/
virtual void syncSoundSettings();
+ /**
+ * Load a game state
+ */
+ virtual int loadGameState(int slot);
+
+ /**
+ * Indicates whether a game state can be loaded
+ */
+ virtual bool canLoadGameStateCurrently();
+
+ /**
+ * Save a game state
+ */
+ virtual int saveGameState(int slot);
+
+ /**
+ * Indicates whether a game state can be saved
+ */
+ virtual bool canSaveGameStateCurrently();
+
protected:
/**
@@ -182,7 +202,24 @@ public:
/**
* 'Return to launcher' feature is supported, i.e., EVENT_RTL is handled.
*/
- kSupportsRTL
+ kSupportsRTL = 0,
+
+ /**
+ * Listing all Save States for a given target is supported, i.e.,
+ * the listSaves() method is implemented.
+ * Used for --list-saves support, as well as the GMM load dialog.
+ */
+ kSupportsListSaves = 1,
+
+ /**
+ * Loading from the in-game common ScummVM options dialog is supported
+ */
+ kSupportsLoadingDuringRuntime = 8,
+
+ /**
+ * Saving from the in-game common ScummVM options dialog is supported
+ */
+ kSupportsSavingDuringRuntime = 9
};
/**
diff --git a/engines/igor/igor.h b/engines/igor/igor.h
index 99155c5d43..418a7ad6b4 100644
--- a/engines/igor/igor.h
+++ b/engines/igor/igor.h
@@ -427,8 +427,8 @@ protected:
void dialogueReplyToQuestion(int x, int y, int r, int g, int b, int reply = 0);
void saveOrLoadGameState(TypeSerializer &typeSerializer);
- void loadGameState(int slot);
- void saveGameState(int slot);
+ int loadGameState(int slot);
+ int saveGameState(int slot);
void generateGameStateFileName(int num, char *dst, int len) const;
MidiPlayer *_midiPlayer;
diff --git a/engines/igor/saveload.cpp b/engines/igor/saveload.cpp
index 96bacdf1ac..a87ecc0ba5 100644
--- a/engines/igor/saveload.cpp
+++ b/engines/igor/saveload.cpp
@@ -156,7 +156,7 @@ void IgorEngine::saveOrLoadGameState(TypeSerializer &typeSerializer) {
}
}
-void IgorEngine::loadGameState(int slot) {
+int IgorEngine::loadGameState(int slot) {
char name[64];
generateGameStateFileName(slot, name, 63);
Common::InSaveFile *isf = _saveFileMan->openForLoading(name);
@@ -175,9 +175,11 @@ void IgorEngine::loadGameState(int slot) {
}
debug(0, "Loaded state, current part %d", _currentPart);
}
+
+ return 0; // TODO: return success/failure
}
-void IgorEngine::saveGameState(int slot) {
+int IgorEngine::saveGameState(int slot) {
char name[64];
generateGameStateFileName(slot, name, 63);
Common::OutSaveFile *osf = _saveFileMan->openForSaving(name);
@@ -187,6 +189,8 @@ void IgorEngine::saveGameState(int slot) {
saveOrLoadGameState(ts);
delete osf;
}
+
+ return 0; // TODO: return success/failure
}
void IgorEngine::generateGameStateFileName(int num, char *dst, int len) const {
diff --git a/engines/metaengine.h b/engines/metaengine.h
index 077d5696b8..938764fdb9 100644
--- a/engines/metaengine.h
+++ b/engines/metaengine.h
@@ -183,7 +183,17 @@ public:
* the game till the save.
* This flag may only be set when 'kSavesSupportMetaInfo' is set.
*/
- kSavesSupportPlayTime
+ kSavesSupportPlayTime,
+
+ /**
+ *Features loading from the Common ScummVM options dialog in-game
+ */
+ kSupportsLoadingDuringRuntime,
+
+ /**
+ *Features saving from the Common ScummVM options dialog in-game
+ */
+ kSupportsSavingDuringRuntime
};
/**
diff --git a/engines/queen/queen.cpp b/engines/queen/queen.cpp
index 40e7aa8b05..9fc30e0d62 100644
--- a/engines/queen/queen.cpp
+++ b/engines/queen/queen.cpp
@@ -351,7 +351,7 @@ void QueenEngine::saveGameState(int slot, const char *desc) {
}
}
-void QueenEngine::loadGameState(int slot) {
+int QueenEngine::loadGameState(int slot) {
debug(3, "Loading game from slot %d", slot);
GameStateHeader header;
Common::InSaveFile *file = readGameStateHeader(slot, &header);
@@ -374,6 +374,8 @@ void QueenEngine::loadGameState(int slot) {
delete[] saveData;
delete file;
}
+
+ return 0; // TODO: return success/failure
}
Common::InSaveFile *QueenEngine::readGameStateHeader(int slot, GameStateHeader *gsh) {
diff --git a/engines/queen/queen.h b/engines/queen/queen.h
index 66931e037d..01d6340abb 100644
--- a/engines/queen/queen.h
+++ b/engines/queen/queen.h
@@ -108,7 +108,7 @@ public:
bool canLoadOrSave() const;
void saveGameState(int slot, const char *desc);
- void loadGameState(int slot);
+ int loadGameState(int slot);
void makeGameStateName(int slot, char *buf) const;
int getGameStateSlot(const char *filename) const;
void findGameStateDescriptions(char descriptions[100][32]);
diff --git a/engines/saga/detection.cpp b/engines/saga/detection.cpp
index eecff5f511..e26cf48dcb 100644
--- a/engines/saga/detection.cpp
+++ b/engines/saga/detection.cpp
@@ -33,7 +33,9 @@
#include "common/advancedDetector.h"
#include "common/system.h"
+#include "saga/animation.h"
#include "saga/displayinfo.h"
+#include "saga/events.h"
#include "saga/rscfile.h"
#include "saga/interface.h"
#include "saga/scene.h"
@@ -157,7 +159,9 @@ bool SagaMetaEngine::hasFeature(MetaEngineFeature f) const {
(f == kSupportsRTL) ||
(f == kSupportsListSaves) ||
(f == kSupportsLoadingDuringStartup) ||
- (f == kSupportsDeleteSave);
+ (f == kSupportsDeleteSave) ||
+ (f == kSupportsLoadingDuringRuntime) ||
+ (f == kSupportsSavingDuringRuntime);
}
bool SagaMetaEngine::createInstance(OSystem *syst, Engine **engine, const Common::ADGameDescription *desc) const {
@@ -237,4 +241,24 @@ int SagaEngine::getDisplayHeight() const {
return di.logicalHeight;
}
+int SagaEngine::loadGameState(int slot) {
+ // Init the current chapter to 8 (character selection) for IHNM
+ if (getGameType() == GType_IHNM)
+ _scene->changeScene(-2, 0, kTransitionFade, 8);
+
+ // First scene sets up palette
+ _scene->changeScene(getStartSceneNumber(), 0, kTransitionNoFade);
+ _events->handleEvents(0); // Process immediate events
+
+ if (getGameType() != GType_IHNM)
+ _interface->setMode(kPanelMain);
+ else
+ _interface->setMode(kPanelChapterSelection);
+
+ load(calcSaveFileName((uint)slot));
+ syncSoundSettings();
+
+ return 0; // TODO: return success/failure
+}
+
} // End of namespace Saga
diff --git a/engines/saga/saga.cpp b/engines/saga/saga.cpp
index 7904e60d1c..4ee81269d2 100644
--- a/engines/saga/saga.cpp
+++ b/engines/saga/saga.cpp
@@ -532,4 +532,12 @@ void SagaEngine::syncSoundSettings() {
_sound->setVolume();
}
+bool SagaEngine::canLoadGameStateCurrently() {
+ return !this->_scene->isInIntro();
+}
+
+bool SagaEngine::canSaveGameStateCurrently() {
+ return !this->_scene->isInIntro();
+}
+
} // End of namespace Saga
diff --git a/engines/saga/saga.h b/engines/saga/saga.h
index 2be74e1766..5417217065 100644
--- a/engines/saga/saga.h
+++ b/engines/saga/saga.h
@@ -650,6 +650,9 @@ public:
const Common::Rect &getDisplayClip() const { return _displayClip;}
int getDisplayWidth() const;
int getDisplayHeight() const;
+ int loadGameState(int slot);
+ bool canLoadGameStateCurrently();
+ bool canSaveGameStateCurrently();
const GameDisplayInfo &getDisplayInfo();
const char *getTextString(int textStringId);
diff --git a/engines/touche/menu.cpp b/engines/touche/menu.cpp
index 9da76dadde..2d7af18da3 100644
--- a/engines/touche/menu.cpp
+++ b/engines/touche/menu.cpp
@@ -331,7 +331,7 @@ void ToucheEngine::handleMenuAction(void *menu, int actionId) {
break;
case kActionPerformSaveLoad:
if (menuData->mode == kMenuLoadStateMode) {
- if (loadGameState(_saveLoadCurrentSlot)) {
+ if (loadGameState(_saveLoadCurrentSlot) == 0) {
menuData->quit = true;
}
} else if (menuData->mode == kMenuSaveStateMode) {
diff --git a/engines/touche/saveload.cpp b/engines/touche/saveload.cpp
index fedd40eb76..011e739c35 100644
--- a/engines/touche/saveload.cpp
+++ b/engines/touche/saveload.cpp
@@ -340,7 +340,7 @@ bool ToucheEngine::saveGameState(int num, const char *description) {
return saveOk;
}
-bool ToucheEngine::loadGameState(int num) {
+int ToucheEngine::loadGameState(int num) {
bool loadOk = false;
char gameStateFileName[64];
generateGameStateFileName(num, gameStateFileName, 63);
@@ -360,7 +360,7 @@ bool ToucheEngine::loadGameState(int num) {
}
delete f;
}
- return loadOk;
+ return loadOk ? 0 : 1;
}
void ToucheEngine::readGameStateDescription(int num, char *description, int len) {
diff --git a/engines/touche/touche.h b/engines/touche/touche.h
index f341769422..707eedbb38 100644
--- a/engines/touche/touche.h
+++ b/engines/touche/touche.h
@@ -496,7 +496,7 @@ protected:
void saveGameStateData(Common::WriteStream *stream);
void loadGameStateData(Common::ReadStream *stream);
bool saveGameState(int num, const char *description);
- bool loadGameState(int num);
+ int loadGameState(int num);
void readGameStateDescription(int num, char *description, int len);
void generateGameStateFileName(int num, char *dst, int len, bool prefixOnly = false) const;
int getGameStateFileSlot(const char *filename) const;