diff options
Diffstat (limited to 'engines')
-rw-r--r-- | engines/dialogs.cpp | 51 | ||||
-rw-r--r-- | engines/dialogs.h | 4 | ||||
-rw-r--r-- | engines/engine.cpp | 20 | ||||
-rw-r--r-- | engines/engine.h | 39 | ||||
-rw-r--r-- | engines/igor/igor.h | 4 | ||||
-rw-r--r-- | engines/igor/saveload.cpp | 8 | ||||
-rw-r--r-- | engines/metaengine.h | 12 | ||||
-rw-r--r-- | engines/queen/queen.cpp | 4 | ||||
-rw-r--r-- | engines/queen/queen.h | 2 | ||||
-rw-r--r-- | engines/saga/detection.cpp | 26 | ||||
-rw-r--r-- | engines/saga/saga.cpp | 8 | ||||
-rw-r--r-- | engines/saga/saga.h | 3 | ||||
-rw-r--r-- | engines/touche/menu.cpp | 2 | ||||
-rw-r--r-- | engines/touche/saveload.cpp | 4 | ||||
-rw-r--r-- | engines/touche/touche.h | 2 |
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; |