From 55c10e0ec6f2d6ea7c58ec1e4b74e5552fda5ddc Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 3 Nov 2008 18:32:16 +0000 Subject: [PATCH] Patch #2122869: ALL: Common load dialog svn-id: r34883 --- engines/dialogs.cpp | 51 +++++++++++++++++- engines/dialogs.h | 4 ++ engines/engine.cpp | 20 +++++++ engines/engine.h | 39 +++++++++++++- engines/igor/igor.h | 4 +- engines/igor/saveload.cpp | 8 ++- engines/metaengine.h | 12 ++++- engines/queen/queen.cpp | 4 +- engines/queen/queen.h | 2 +- engines/saga/detection.cpp | 26 ++++++++- engines/saga/saga.cpp | 8 +++ engines/saga/saga.h | 3 ++ engines/touche/menu.cpp | 2 +- engines/touche/saveload.cpp | 4 +- engines/touche/touche.h | 2 +- gui/launcher.cpp | 39 -------------- gui/launcher.h | 40 ++++++++++++++ gui/object.h | 2 +- gui/themes/scummclassic.zip | Bin 43354 -> 43733 bytes gui/themes/scummclassic/classic_layout.stx | 9 ++++ .../scummclassic/classic_layout_320.stx | 9 ++++ gui/themes/scummmodern.zip | Bin 143656 -> 144052 bytes gui/themes/scummmodern/scummmodern_layout.stx | 9 ++++ .../scummmodern/scummmodern_layout_320.stx | 9 ++++ 24 files changed, 251 insertions(+), 55 deletions(-) diff --git a/engines/dialogs.cpp b/engines/dialogs.cpp index 97c55d4a1f9..d0eac1d2e72 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 66ea13b8f1f..d38abeb3cfa 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 d5d5498384e..4bbe2d069fd 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 69caafac497..90eea859ef7 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 99155c5d43e..418a7ad6b43 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 96bacdf1acc..a87ecc0ba57 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 077d5696b83..938764fdb9f 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 40e7aa8b05a..9fc30e0d626 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 66931e037d9..01d6340abb1 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 eecff5f5118..e26cf48dcbc 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 7904e60d1c7..4ee81269d2b 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 2be74e1766f..54172170655 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 9da76daddea..2d7af18da3d 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 fedd40eb76f..011e739c35e 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 f341769422e..707eedbb380 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; diff --git a/gui/launcher.cpp b/gui/launcher.cpp index 55489e20172..9a201fd9360 100644 --- a/gui/launcher.cpp +++ b/gui/launcher.cpp @@ -473,45 +473,6 @@ void EditGameDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 dat } } -class SaveLoadChooser : public GUI::Dialog { - typedef Common::String String; - typedef Common::StringList StringList; -protected: - GUI::ListWidget *_list; - GUI::ButtonWidget *_chooseButton; - GUI::ButtonWidget *_deleteButton; - GUI::GraphicsWidget *_gfxWidget; - GUI::ContainerWidget *_container; - GUI::StaticTextWidget *_date; - GUI::StaticTextWidget *_time; - GUI::StaticTextWidget *_playtime; - - const EnginePlugin *_plugin; - bool _delSupport; - bool _metaInfoSupport; - bool _thumbnailSupport; - bool _saveDateSupport; - bool _playTimeSupport; - String _target; - SaveStateList _saveList; - - uint8 _fillR, _fillG, _fillB; - - void updateSaveList(); - void updateSelection(bool redraw); -public: - SaveLoadChooser(const String &title, const String &buttonLabel); - ~SaveLoadChooser(); - - virtual void handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data); - void setList(const StringList& list); - int runModal(const EnginePlugin *plugin, const String &target); - - virtual void reflowLayout(); - - virtual void close(); -}; - SaveLoadChooser::SaveLoadChooser(const String &title, const String &buttonLabel) : Dialog("ScummSaveLoad"), _delSupport(0), _list(0), _chooseButton(0), _deleteButton(0), _gfxWidget(0) { _delSupport = _metaInfoSupport = _thumbnailSupport = _saveDateSupport = _playTimeSupport = false; diff --git a/gui/launcher.h b/gui/launcher.h index 1b2b0a354ef..7e04e865f97 100644 --- a/gui/launcher.h +++ b/gui/launcher.h @@ -27,6 +27,7 @@ #include "gui/dialog.h" #include "engines/game.h" +#include "engines/metaengine.h" #include "common/str.h" namespace GUI { @@ -79,6 +80,45 @@ protected: void selectGame(const String &name); }; +class SaveLoadChooser : public GUI::Dialog { + typedef Common::String String; + typedef Common::StringList StringList; +protected: + GUI::ListWidget *_list; + GUI::ButtonWidget *_chooseButton; + GUI::ButtonWidget *_deleteButton; + GUI::GraphicsWidget *_gfxWidget; + GUI::ContainerWidget *_container; + GUI::StaticTextWidget *_date; + GUI::StaticTextWidget *_time; + GUI::StaticTextWidget *_playtime; + + const EnginePlugin *_plugin; + bool _delSupport; + bool _metaInfoSupport; + bool _thumbnailSupport; + bool _saveDateSupport; + bool _playTimeSupport; + String _target; + SaveStateList _saveList; + + uint8 _fillR, _fillG, _fillB; + + void updateSaveList(); + void updateSelection(bool redraw); +public: + SaveLoadChooser(const String &title, const String &buttonLabel); + ~SaveLoadChooser(); + + virtual void handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data); + void setList(const StringList& list); + int runModal(const EnginePlugin *plugin, const String &target); + + virtual void reflowLayout(); + + virtual void close(); +}; + } // End of namespace GUI #endif diff --git a/gui/object.h b/gui/object.h index 01046bd668b..d188807a168 100644 --- a/gui/object.h +++ b/gui/object.h @@ -67,7 +67,7 @@ protected: Widget *_firstWidget; public: - GuiObject(int x, int y, int w, int h) : _x(x), _y(y), _w(w), _h(h), _name(""), _firstWidget(0) { } + GuiObject(int x, int y, int w, int h) : _x(x), _y(y), _w(w), _h(h), _firstWidget(0) { } GuiObject(const Common::String &name); ~GuiObject(); diff --git a/gui/themes/scummclassic.zip b/gui/themes/scummclassic.zip index 3ee5730303d8effdb9344d4186c51aec9dec8776..2d6dd7b1139c59bb2de5ec12d449ac6ceadca1aa 100644 GIT binary patch delta 387 zcmcb0iRtQ9CY}IqW)=|!5D=I?ktdi}V0w_{W%-ll%<>Ej%o}rVGEa`rh?=~NMODnu zT*1h|z(Uv1K-bVh!NAhW(8S8bc=JP+tx|k9dy_49PV^7XbY)=3blto}{x(Qo!sKVl zIQ1#2c<8bC*Uuf6qT?!6$X|x S%B4aaKG|iZ0NcrxAPE3Testad delta 372 zcmcb5mFd + + + + + + 0b{fjHZLnK0TrOKja8X34H1_DHzG#rLs&GtehYKvAJHB z$w`n&VEXjKdQ8Tku%7-?kI5X&FxF=>1v9esnXJK#mHJGUV8&B@sA6dYCQCJJ@d5)& z8ucp}!Lc;G(tt@?4O=k7z>-FXB~Z0H4VdJ>YSF_329`9MyoRd%W5A@umB7TnU}wO@ Hz`y_i=CZdV delta 676 zcmdn;lw-vs4xRvSW)=|!5SSY|ktc|`aDnH>L|tYOy?G*YG!K~ZoPA=UZSiyLSnY|=2FF(7~ zVY>c%#<1yCHH@^cDj zwqLw13=AMF33XlAYsQ;su4{YGsG^7Lx_DzF1EO5`fiX~TyMjEEmLSvI$mu=?Ova$l zpWbA^WDaKRF<>$UGrkxwS%VoyhD?@VMxG&5@e)HOOF@j7n*Pp^Nvs|vLIS)QnM9Z& zDFdV)J?vp%Nu$dWMo>KG<|2Cv + + + + + +