Ticket #8925: common-load_v3.patch

File common-load_v3.patch, 22.2 KB (added by bluegr, 12 years ago)

Common save/load game dialog, version 3

  • engines/agi/detection.cpp

     
    21342134        return
    21352135                (f == kSupportsRTL) ||
    21362136                (f == kSupportsListSaves) ||
    2137                 (f == kSupportsDirectLoad) ||
     2137                (f == kSupportsLoadingDuringStartup) ||
    21382138                (f == kSupportsDeleteSave);
    21392139}
    21402140
  • engines/cine/detection.cpp

     
    541541        return
    542542                (f == kSupportsRTL) ||
    543543                (f == kSupportsListSaves) ||
    544                 (f == kSupportsDirectLoad);
     544                (f == kSupportsLoadingDuringStartup);
    545545}
    546546
    547547bool CineMetaEngine::createInstance(OSystem *syst, Engine **engine, const Common::ADGameDescription *desc) const {
  • engines/dialogs.cpp

     
    3434#include "gui/about.h"
    3535#include "gui/eval.h"
    3636#include "gui/newgui.h"
     37#include "gui/launcher.h"
    3738#include "gui/ListWidget.h"
    3839#include "gui/theme.h"
    3940
     
    9596               
    9697        new GUI::ButtonWidget(this, "globalmain_resume", "Resume", kPlayCmd, 'P');
    9798
    98 //      new GUI::ButtonWidget(this, "globalmain_load", "Load", kLoadCmd, 'L');
    99 //      new GUI::ButtonWidget(this, "globalmain_save", "Save", kSaveCmd, 'S');
     99        _loadButton = new GUI::ButtonWidget(this, "globalmain_load", "Load", kLoadCmd, 'L');
     100        _loadButton->setVisible(_engine->hasFeature(MetaEngine::kSupportsListSaves) &&
     101                                                        _engine->hasFeature(MetaEngine::kSupportsLoadingDuringRuntime));
    100102
     103        _saveButton = new GUI::ButtonWidget(this, "globalmain_save", "Save", kSaveCmd, 'S');
     104        _saveButton->setVisible(_engine->hasFeature(MetaEngine::kSupportsListSaves) &&
     105                                                        _engine->hasFeature(MetaEngine::kSupportsSavingDuringRuntime));
     106
    101107        new GUI::ButtonWidget(this, "globalmain_options", "Options", kOptionsCmd, 'O');
    102108
    103109        new GUI::ButtonWidget(this, "globalmain_about", "About", kAboutCmd, 'A');
     
    110116
    111117        _aboutDialog = new GUI::AboutDialog();
    112118        _optionsDialog = new ConfigDialog();
     119        _loadDialog = new GUI::SaveLoadChooser("Load game:", "Load");
    113120}
    114121
    115122MainMenuDialog::~MainMenuDialog() {
    116123        delete _aboutDialog;
    117124        delete _optionsDialog;
     125        delete _loadDialog;
     126        //delete _saveDialog;
    118127}
    119128
    120129void MainMenuDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) {
     
    122131        case kPlayCmd:
    123132                close();
    124133                break;
     134        case kLoadCmd:
     135                {
     136                String gameId = ConfMan.get("gameid");
     137
     138                const EnginePlugin *plugin = 0;
     139                EngineMan.findGame(gameId, &plugin);
     140
     141                int slot = _loadDialog->runModal(plugin, ConfMan.getActiveDomainName());
     142
     143                if (slot >= 0) {
     144                        _engine->loadGameState(slot);
     145                        close();
     146                }
     147
     148                }
     149                break;
     150        case kSaveCmd:
     151                /*
     152                String gameId = ConfMan.get("gameid");
     153
     154                const EnginePlugin *plugin = 0;
     155                EngineMan.findGame(gameId, &plugin);
     156
     157                int slot = _saveDialog->runModal(plugin, ConfMan.getActiveDomainName());
     158
     159                if (slot >= 0) {
     160                        _engine->saveGameState(slot);
     161                        close();
     162                }
     163
     164                }
     165                */
     166                break;
    125167        case kOptionsCmd:
    126168                _optionsDialog->runModal();
    127169                break;
     
    148190}
    149191
    150192void MainMenuDialog::reflowLayout() {
     193        _loadButton->setEnabled(_engine->canLoadGameStateCurrently());
     194        _saveButton->setEnabled(_engine->canSaveGameStateCurrently());
     195
    151196#ifndef DISABLE_FANCY_THEMES
    152197        if (g_gui.evaluator()->getVar("global_logo.visible") == 1 && g_gui.theme()->supportsImages()) {
    153198                if (!_logo)
  • engines/dialogs.h

     
    2727
    2828#include "common/str.h"
    2929#include "gui/dialog.h"
     30#include "gui/launcher.h"
    3031#include "gui/options.h"
    3132#include "gui/widget.h"
    3233
     
    5657
    5758        GUI::GraphicsWidget *_logo;
    5859        GUI::ButtonWidget       *_rtlButton;
     60        GUI::ButtonWidget       *_loadButton;
     61        GUI::ButtonWidget       *_saveButton;
    5962        GUI::Dialog             *_aboutDialog;
    6063        GUI::Dialog             *_optionsDialog;
     64        GUI::SaveLoadChooser    *_loadDialog;
    6165
    6266};
    6367
  • engines/engine.cpp

     
    243243        _mixer->setVolumeForSoundType(Audio::Mixer::kSpeechSoundType, soundVolumeSpeech);
    244244}
    245245
     246int Engine::loadGameState(int slot) {
     247        // Do nothing by default
     248        return 0;
     249}
     250
     251bool Engine::canLoadGameStateCurrently() {
     252        // Do not allow loading by default
     253        return false;
     254}
     255
     256int Engine::saveGameState(int slot) {
     257        // Do nothing by default
     258        return 0;
     259}
     260
     261bool Engine::canSaveGameStateCurrently() {
     262        // Do not allow saving by default
     263        return false;
     264}
     265
    246266void Engine::quitGame() {
    247267        Common::Event event;
    248268
  • engines/engine.h

     
    128128         */
    129129        virtual void syncSoundSettings();
    130130
     131        /**
     132         *Load a game state
     133         */
     134        virtual int loadGameState(int slot);
     135
     136        /**
     137         *Indicates whether a game state can be loaded
     138         */
     139        virtual bool canLoadGameStateCurrently();
     140
     141        /**
     142         *Save a game state
     143         */
     144        virtual int saveGameState(int slot);
     145
     146        /**
     147         *Indicates whether a game state can be saved
     148         */
     149        virtual bool canSaveGameStateCurrently();
     150
    131151protected:
    132152
    133153        /**
     
    185205         */
    186206        bool hasFeature(MetaEngine::MetaEngineFeature f);
    187207
    188 public:
    189 
    190208        /** On some systems, check if the game appears to be run from CD. */
    191209        void checkCD();
    192210
     
    196214         * Indicate whether an autosave should be performed.
    197215         */
    198216        bool shouldPerformAutoSave(int lastSaveTime);
    199 
    200217};
    201218
    202219extern Engine *g_engine;
  • engines/igor/igor.h

     
    427427        void dialogueReplyToQuestion(int x, int y, int r, int g, int b, int reply = 0);
    428428
    429429        void saveOrLoadGameState(TypeSerializer &typeSerializer);
    430         void loadGameState(int slot);
    431         void saveGameState(int slot);
     430        int loadGameState(int slot);
     431        int saveGameState(int slot);
    432432        void generateGameStateFileName(int num, char *dst, int len) const;
    433433
    434434        MidiPlayer *_midiPlayer;
  • engines/igor/saveload.cpp

     
    156156        }
    157157}
    158158
    159 void IgorEngine::loadGameState(int slot) {
     159int IgorEngine::loadGameState(int slot) {
    160160        char name[64];
    161161        generateGameStateFileName(slot, name, 63);
    162162        Common::InSaveFile *isf = _saveFileMan->openForLoading(name);
     
    175175                }
    176176                debug(0, "Loaded state, current part %d", _currentPart);
    177177        }
     178
     179        return 0;       // TODO: return success/failure
    178180}
    179181
    180 void IgorEngine::saveGameState(int slot) {
     182int IgorEngine::saveGameState(int slot) {
    181183        char name[64];
    182184        generateGameStateFileName(slot, name, 63);
    183185        Common::OutSaveFile *osf = _saveFileMan->openForSaving(name);
     
    187189                saveOrLoadGameState(ts);
    188190                delete osf;
    189191        }
     192
     193        return 0;       // TODO: return success/failure
    190194}
    191195
    192196void IgorEngine::generateGameStateFileName(int num, char *dst, int len) const {
  • engines/kyra/detection.cpp

     
    10751075        return
    10761076                (f == kSupportsRTL) ||
    10771077                (f == kSupportsListSaves) ||
    1078                 (f == kSupportsDirectLoad) ||
     1078                (f == kSupportsLoadingDuringStartup) ||
    10791079                (f == kSupportsDeleteSave) ||
    10801080                (f == kSavesSupportMetaInfo) ||
    10811081                (f == kSavesSupportThumbnail);
  • engines/lure/detection.cpp

     
    195195        return
    196196                (f == kSupportsRTL) ||
    197197                (f == kSupportsListSaves) ||
    198                 (f == kSupportsDirectLoad) ||
     198                (f == kSupportsLoadingDuringStartup) ||
    199199                (f == kSupportsDeleteSave);
    200200}
    201201
  • engines/metaengine.h

     
    148148                /**
    149149                 * Loading from the Launcher / command line (-x)
    150150                 */
    151                 kSupportsDirectLoad,
     151                kSupportsLoadingDuringStartup,
    152152
    153153                /**
    154154                 * Deleting Saves from the Launcher (i.e. implements the
     
    183183                 * the game till the save.
    184184                 * This flag may only be set when 'kSavesSupportMetaInfo' is set.
    185185                 */
    186                 kSavesSupportPlayTime
     186                kSavesSupportPlayTime,
     187               
     188                /**
     189                 *Features loading from the Common ScummVM options dialog in-game
     190                 */
     191                kSupportsLoadingDuringRuntime,
     192
     193                /**
     194                 *Features saving from the Common ScummVM options dialog in-game
     195                 */
     196                kSupportsSavingDuringRuntime   
    187197        };     
    188198
    189199        /**
  • engines/parallaction/detection.cpp

     
    253253        return
    254254                (f == kSupportsRTL) ||
    255255                (f == kSupportsListSaves) ||
    256                 (f == kSupportsDirectLoad) ||
     256                (f == kSupportsLoadingDuringStartup) ||
    257257                (f == kSupportsDeleteSave);
    258258}
    259259
  • engines/queen/queen.cpp

     
    8282        return
    8383                (f == kSupportsRTL) ||
    8484                (f == kSupportsListSaves) ||
    85                 (f == kSupportsDirectLoad) ||
     85                (f == kSupportsLoadingDuringStartup) ||
    8686                (f == kSupportsDeleteSave);
    8787}
    8888
     
    351351        }
    352352}
    353353
    354 void QueenEngine::loadGameState(int slot) {
     354int QueenEngine::loadGameState(int slot) {
    355355        debug(3, "Loading game from slot %d", slot);
    356356        GameStateHeader header;
    357357        Common::InSaveFile *file = readGameStateHeader(slot, &header);
     
    374374                delete[] saveData;
    375375                delete file;
    376376        }
     377
     378        return 0;       // TODO: return success/failure
    377379}
    378380
    379381Common::InSaveFile *QueenEngine::readGameStateHeader(int slot, GameStateHeader *gsh) {
  • engines/queen/queen.h

     
    108108
    109109        bool canLoadOrSave() const;
    110110        void saveGameState(int slot, const char *desc);
    111         void loadGameState(int slot);
     111        int loadGameState(int slot);
    112112        void makeGameStateName(int slot, char *buf) const;
    113113        int getGameStateSlot(const char *filename) const;
    114114        void findGameStateDescriptions(char descriptions[100][32]);
  • engines/saga/detection.cpp

     
    3232#include "common/config-manager.h"
    3333#include "common/advancedDetector.h"
    3434
     35#include "saga/animation.h"
    3536#include "saga/displayinfo.h"
     37#include "saga/events.h"
    3638#include "saga/rscfile.h"
    3739#include "saga/interface.h"
    3840#include "saga/scene.h"
     
    155157        return
    156158                (f == kSupportsRTL) ||
    157159                (f == kSupportsListSaves) ||
    158                 (f == kSupportsDirectLoad) ||
    159                 (f == kSupportsDeleteSave);
     160                (f == kSupportsLoadingDuringStartup) ||
     161                (f == kSupportsDeleteSave) ||
     162                (f == kSupportsLoadingDuringRuntime) ||
     163                (f == kSupportsSavingDuringRuntime);
    160164}
    161165
    162166bool SagaMetaEngine::createInstance(OSystem *syst, Engine **engine, const Common::ADGameDescription *desc) const {
     
    236240        return di.logicalHeight;
    237241}
    238242
     243int SagaEngine::loadGameState(int slot) {
     244        // Init the current chapter to 8 (character selection) for IHNM
     245        if (getGameType() == GType_IHNM)
     246                _scene->changeScene(-2, 0, kTransitionFade, 8);
     247
     248        // First scene sets up palette
     249        _scene->changeScene(getStartSceneNumber(), 0, kTransitionNoFade);
     250        _events->handleEvents(0); // Process immediate events
     251
     252        if (getGameType() != GType_IHNM)
     253                _interface->setMode(kPanelMain);
     254        else
     255                _interface->setMode(kPanelChapterSelection);
     256
     257        load(calcSaveFileName((uint)slot));
     258        syncSoundSettings();
     259
     260        return 0;       // TODO: return success/failure
     261}
     262
    239263} // End of namespace Saga
  • engines/saga/saga.cpp

     
    532532        _sound->setVolume();
    533533}
    534534
     535bool SagaEngine::canLoadGameStateCurrently() {
     536        return !this->_scene->isInIntro();
     537}
     538
     539bool SagaEngine::canSaveGameStateCurrently() {
     540        return !this->_scene->isInIntro();
     541}
     542
    535543} // End of namespace Saga
  • engines/saga/saga.h

     
    650650        const Common::Rect &getDisplayClip() const { return _displayClip;}
    651651        int getDisplayWidth() const;
    652652        int getDisplayHeight() const;
     653        int loadGameState(int slot);
     654        bool canLoadGameStateCurrently();
     655        bool canSaveGameStateCurrently();
    653656        const GameDisplayInfo &getDisplayInfo();
    654657
    655658        const char *getTextString(int textStringId);
  • engines/scumm/detection.cpp

     
    693693        return
    694694                (f == kSupportsRTL) ||
    695695                (f == kSupportsListSaves) ||
    696                 (f == kSupportsDirectLoad) ||
     696                (f == kSupportsLoadingDuringStartup) ||
    697697                (f == kSupportsDeleteSave) ||
    698698                (f == kSavesSupportMetaInfo) ||
    699699                (f == kSavesSupportThumbnail) ||
  • engines/sky/sky.cpp

     
    132132        return
    133133                (f == kSupportsRTL) ||
    134134                (f == kSupportsListSaves) ||
    135                 (f == kSupportsDirectLoad);
     135                (f == kSupportsLoadingDuringStartup);
    136136}
    137137
    138138GameList SkyMetaEngine::getSupportedGames() const {
  • engines/sword1/sword1.cpp

     
    108108        return
    109109                (f == kSupportsRTL) ||
    110110                (f == kSupportsListSaves) ||
    111                 (f == kSupportsDirectLoad);
     111                (f == kSupportsLoadingDuringStartup);
    112112}
    113113
    114114GameList SwordMetaEngine::getSupportedGames() const {
  • engines/sword2/sword2.cpp

     
    9494        return
    9595                (f == kSupportsRTL) ||
    9696                (f == kSupportsListSaves) ||
    97                 (f == kSupportsDirectLoad) ||
     97                (f == kSupportsLoadingDuringStartup) ||
    9898                (f == kSupportsDeleteSave);
    9999}
    100100
  • engines/touche/detection.cpp

     
    146146        return
    147147                (f == kSupportsRTL) ||
    148148                (f == kSupportsListSaves) ||
    149                 (f == kSupportsDirectLoad) ||
     149                (f == kSupportsLoadingDuringStartup) ||
    150150                (f == kSupportsDeleteSave);
    151151}
    152152
  • engines/touche/menu.cpp

     
    331331                break;
    332332        case kActionPerformSaveLoad:
    333333                if (menuData->mode == kMenuLoadStateMode) {
    334                         if (loadGameState(_saveLoadCurrentSlot)) {
     334                        if (loadGameState(_saveLoadCurrentSlot) == 0) {
    335335                                menuData->quit = true;
    336336                        }
    337337                } else if (menuData->mode == kMenuSaveStateMode) {
  • engines/touche/saveload.cpp

     
    340340        return saveOk;
    341341}
    342342
    343 bool ToucheEngine::loadGameState(int num) {
     343int ToucheEngine::loadGameState(int num) {
    344344        bool loadOk = false;
    345345        char gameStateFileName[64];
    346346        generateGameStateFileName(num, gameStateFileName, 63);
     
    360360                }
    361361                delete f;
    362362        }
    363         return loadOk;
     363        return loadOk ? 0 : 1;
    364364}
    365365
    366366void ToucheEngine::readGameStateDescription(int num, char *description, int len) {
  • engines/touche/touche.h

     
    496496        void saveGameStateData(Common::WriteStream *stream);
    497497        void loadGameStateData(Common::ReadStream *stream);
    498498        bool saveGameState(int num, const char *description);
    499         bool loadGameState(int num);
     499        int loadGameState(int num);
    500500        void readGameStateDescription(int num, char *description, int len);
    501501        void generateGameStateFileName(int num, char *dst, int len, bool prefixOnly = false) const;
    502502        int getGameStateFileSlot(const char *filename) const;
  • gui/launcher.cpp

     
    473473        }
    474474}
    475475
    476 class SaveLoadChooser : public GUI::Dialog {
    477         typedef Common::String String;
    478         typedef Common::StringList StringList;
    479 protected:
    480         GUI::ListWidget         *_list;
    481         GUI::ButtonWidget       *_chooseButton;
    482         GUI::ButtonWidget       *_deleteButton;
    483         GUI::GraphicsWidget     *_gfxWidget;
    484         GUI::ContainerWidget    *_container;
    485         GUI::StaticTextWidget   *_date;
    486         GUI::StaticTextWidget   *_time;
    487         GUI::StaticTextWidget   *_playtime;
    488 
    489         const EnginePlugin              *_plugin;
    490         bool                                    _delSupport;
    491         bool                                    _metaInfoSupport;
    492         bool                                    _thumbnailSupport;
    493         bool                                    _saveDateSupport;
    494         bool                                    _playTimeSupport;
    495         String                                  _target;
    496         SaveStateList                   _saveList;
    497 
    498         uint8 _fillR, _fillG, _fillB;
    499 
    500         void updateSaveList();
    501         void updateSelection(bool redraw);
    502 public:
    503         SaveLoadChooser(const String &title, const String &buttonLabel);
    504         ~SaveLoadChooser();
    505 
    506         virtual void handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data);
    507         void setList(const StringList& list);
    508         int runModal(const EnginePlugin *plugin, const String &target);
    509 
    510         virtual void reflowLayout();
    511 
    512         virtual void close();
    513 };
    514 
    515476SaveLoadChooser::SaveLoadChooser(const String &title, const String &buttonLabel)
    516477        : Dialog("scummsaveload"), _delSupport(0), _list(0), _chooseButton(0), _deleteButton(0), _gfxWidget(0)  {
    517478        _delSupport = _metaInfoSupport = _thumbnailSupport = _saveDateSupport = _playTimeSupport = false;
     
    11071068
    11081069        if (plugin) {
    11091070                if ((*plugin)->hasFeature(MetaEngine::kSupportsListSaves) &&
    1110                         (*plugin)->hasFeature(MetaEngine::kSupportsDirectLoad)) {
     1071                        (*plugin)->hasFeature(MetaEngine::kSupportsLoadingDuringStartup)) {
    11111072                        int slot = _loadDialog->runModal(plugin, target);
    11121073                        if (slot >= 0) {
    11131074                                ConfMan.setActiveDomain(_domains[item]);
  • gui/launcher.h

     
    2727
    2828#include "gui/dialog.h"
    2929#include "engines/game.h"
     30#include "engines/metaengine.h"
    3031#include "common/str.h"
    3132
    3233namespace GUI {
     
    7980        void selectGame(const String &name);
    8081};
    8182
     83class SaveLoadChooser : public GUI::Dialog {
     84        typedef Common::String String;
     85        typedef Common::StringList StringList;
     86protected:
     87        GUI::ListWidget         *_list;
     88        GUI::ButtonWidget       *_chooseButton;
     89        GUI::ButtonWidget       *_deleteButton;
     90        GUI::GraphicsWidget     *_gfxWidget;
     91        GUI::ContainerWidget    *_container;
     92        GUI::StaticTextWidget   *_date;
     93        GUI::StaticTextWidget   *_time;
     94        GUI::StaticTextWidget   *_playtime;
     95
     96        const EnginePlugin              *_plugin;
     97        bool                                    _delSupport;
     98        bool                                    _metaInfoSupport;
     99        bool                                    _thumbnailSupport;
     100        bool                                    _saveDateSupport;
     101        bool                                    _playTimeSupport;
     102        String                                  _target;
     103        SaveStateList                   _saveList;
     104
     105        uint8 _fillR, _fillG, _fillB;
     106
     107        void updateSaveList();
     108        void updateSelection(bool redraw);
     109public:
     110        SaveLoadChooser(const String &title, const String &buttonLabel);
     111        ~SaveLoadChooser();
     112
     113        virtual void handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data);
     114        void setList(const StringList& list);
     115        int runModal(const EnginePlugin *plugin, const String &target);
     116
     117        virtual void reflowLayout();
     118
     119        virtual void close();
     120};
     121
    82122} // End of namespace GUI
    83123
    84124#endif
  • gui/theme-config.cpp

     
    499499"globalmain_resume=globalmainHOffset gmY scummmainButtonWidth scummmainButtonHeight\n"
    500500"gmY=(gmY + scummmainButtonHeight + scummmainVAddOff)\n"
    501501"gmY=(gmY + scummmainVSpace)\n"
     502"globalmain_save=prev.x gmY prev.w prev.h\n"
     503"gmY=(gmY + scummmainButtonHeight + scummmainVAddOff)\n"
     504"globalmain_load=prev.x gmY prev.w prev.h\n"
     505"gmY=(gmY + scummmainButtonHeight + scummmainVAddOff)\n"
    502506"globalmain_options=prev.x gmY prev.w prev.h\n"
    503507"gmY=(gmY + scummmainButtonHeight + scummmainVAddOff)\n"
    504508"globalmain_about=prev.x gmY prev.w prev.h\n"
  • gui/themes/modern.ini

     
    273273globalmain_resume=globalmainHOffset gmY scummmainButtonWidth scummmainButtonHeight
    274274gmY=(gmY + scummmainButtonHeight + scummmainVAddOff)
    275275gmY=(gmY + scummmainVSpace)
     276globalmain_save=prev.x gmY prev.w prev.h
     277gmY=(gmY + scummmainButtonHeight + scummmainVAddOff)
     278globalmain_load=prev.x gmY prev.w prev.h
     279gmY=(gmY + scummmainButtonHeight + scummmainVAddOff)
    276280globalmain_options=prev.x gmY prev.w prev.h
    277281gmY=(gmY + scummmainButtonHeight + scummmainVAddOff)
    278282globalmain_about=prev.x gmY prev.w prev.h
  • gui/widget.h

     
    147147        int getHints() const            { return _hints; }
    148148
    149149        void setEnabled(bool e)         { if (e) setFlags(WIDGET_ENABLED); else clearFlags(WIDGET_ENABLED); }
     150        void setVisible(bool e)         { if (!e) setFlags(WIDGET_INVISIBLE); else clearFlags(WIDGET_INVISIBLE); }
    150151        bool isEnabled() const;
    151152        bool isVisible() const;
    152153