diff options
author | Bendegúz Nagy | 2016-08-18 21:00:03 +0200 |
---|---|---|
committer | Bendegúz Nagy | 2016-08-26 23:02:22 +0200 |
commit | cefc231968412af089b6957173f9162b9852e94e (patch) | |
tree | fb888d10eaa9d99f8fb8079b076d84e41a79378b | |
parent | c01293162cfd47e553fc8aad864abec56a3b463e (diff) | |
download | scummvm-rg350-cefc231968412af089b6957173f9162b9852e94e.tar.gz scummvm-rg350-cefc231968412af089b6957173f9162b9852e94e.tar.bz2 scummvm-rg350-cefc231968412af089b6957173f9162b9852e94e.zip |
DM: Make ScummVM's save dialog open up when saving
-rw-r--r-- | engines/dm/dm.h | 3 | ||||
-rw-r--r-- | engines/dm/eventman.cpp | 2 | ||||
-rw-r--r-- | engines/dm/loadsave.cpp | 172 |
3 files changed, 101 insertions, 76 deletions
diff --git a/engines/dm/dm.h b/engines/dm/dm.h index d72bc63219..2e3144bbaf 100644 --- a/engines/dm/dm.h +++ b/engines/dm/dm.h @@ -213,6 +213,7 @@ class DMEngine : public Engine { void initArrays(); Common::String getSavefileName(uint16 slot); void writeSaveGameHeader(Common::OutSaveFile *out, const Common::String &saveName); + void writeCompleteSaveFile(int16 slot, Common::String &desc, int16 saveAndPlayChoice); void f439_drawEntrance(); // @ F0439_STARTEND_DrawEntrance public: explicit DMEngine(OSystem *syst, const ADGameDescription *gameDesc); @@ -227,7 +228,7 @@ public: int16 M0_indexToOrdinal(int16 val); // @ M00_INDEX_TO_ORDINAL void f19_displayErrorAndStop(int16 errorIndex); // @ F0019_MAIN_DisplayErrorAndStop virtual Common::Error run(); // @ main - void f433_processCommand140_saveGame(uint16 slot, const Common::String desc); // @ F0433_STARTEND_ProcessCommand140_SaveGame_CPSCDF + void f433_processCommand140_saveGame(); // @ F0433_STARTEND_ProcessCommand140_SaveGame_CPSCDF LoadgameResponse f435_loadgame(int16 slot); // @ F0435_STARTEND_LoadGame_CPSF void f441_processEntrance(); // @ F0441_STARTEND_ProcessEntrance void f444_endGame(bool doNotDrawCreditsOnly); // @ F0444_STARTEND_Endgame diff --git a/engines/dm/eventman.cpp b/engines/dm/eventman.cpp index 0f7c120f17..9f0b387bff 100644 --- a/engines/dm/eventman.cpp +++ b/engines/dm/eventman.cpp @@ -781,7 +781,7 @@ void EventManager::f380_processCommandQueue() { if (cmdType == k140_CommandSaveGame) { if ((_vm->_championMan->_g305_partyChampionCount > 0) && !_vm->_championMan->_g299_candidateChampionOrdinal) - _vm->f433_processCommand140_saveGame(1, "Nice save:)"); + _vm->f433_processCommand140_saveGame(); return; } diff --git a/engines/dm/loadsave.cpp b/engines/dm/loadsave.cpp index c5082d273c..4d24daf162 100644 --- a/engines/dm/loadsave.cpp +++ b/engines/dm/loadsave.cpp @@ -37,6 +37,8 @@ #include "eventman.h" #include "projexpl.h" #include "dialog.h" +#include <gui/saveload.h> +#include <common/translation.h> namespace DM { @@ -179,54 +181,124 @@ LoadgameResponse DMEngine::f435_loadgame(int16 slot) { } -void DMEngine::f433_processCommand140_saveGame(uint16 slot, const Common::String desc) { - char *message = nullptr; - +void DMEngine::f433_processCommand140_saveGame() { _menuMan->f456_drawDisabledMenu(); _eventMan->f78_showMouse(); switch (getGameLanguage()) { // localized default: case Common::EN_ANY: - _dialog->f427_dialogDraw(message, nullptr, "SAVE AND PLAY", "SAVE AND QUIT", "CANCEL", nullptr, false, false, false); + _dialog->f427_dialogDraw(nullptr, nullptr, "SAVE AND PLAY", "SAVE AND QUIT", "CANCEL", nullptr, false, false, false); break; case Common::DE_DEU: - _dialog->f427_dialogDraw(message, nullptr, "SICHERN/SPIEL", "SICHERN/ENDEN", "WIDERRUFEN", nullptr, false, false, false); + _dialog->f427_dialogDraw(nullptr, nullptr, "SICHERN/SPIEL", "SICHERN/ENDEN", "WIDERRUFEN", nullptr, false, false, false); break; case Common::FR_FRA: - _dialog->f427_dialogDraw(message, nullptr, "GARDER/JOUER", "GARDER/SORTIR", "ANNULLER", nullptr, false, false, false); + _dialog->f427_dialogDraw(nullptr, nullptr, "GARDER/JOUER", "GARDER/SORTIR", "ANNULLER", nullptr, false, false, false); break; } - int16 saveAndPlayChoice = _dialog->f424_dialogGetChoice(3, k0_DIALOG_SET_VIEWPORT, 0, k0_DIALOG_CHOICE_NONE); - switch (getGameLanguage()) { // localized - default: - case Common::EN_ANY: - _dialog->f427_dialogDraw(nullptr, "SAVING GAME . . .", nullptr, nullptr, nullptr, nullptr, false, false, false); - break; - case Common::DE_DEU: - _dialog->f427_dialogDraw(nullptr, "SPIEL WIRD GESICHERT . . .", nullptr, nullptr, nullptr, nullptr, false, false, false); - break; - case Common::FR_FRA: - _dialog->f427_dialogDraw(nullptr, "UN MOMENT A SAUVEGARDER DU JEU...", nullptr, nullptr, nullptr, nullptr, false, false, false); - break; + enum SaveAndPlayChoice { + kSaveAndPlay = 1, + kSaveAndQuit = 2, + kCancel = 3 + }; + + SaveAndPlayChoice saveAndPlayChoice = (SaveAndPlayChoice)_dialog->f424_dialogGetChoice(3, k0_DIALOG_SET_VIEWPORT, 0, k0_DIALOG_CHOICE_NONE); + + if (saveAndPlayChoice == kSaveAndQuit || saveAndPlayChoice == kSaveAndPlay) { + GUI::SaveLoadChooser *dialog = new GUI::SaveLoadChooser(_("Save game:"), _("Save"), true); + int16 saveSlot = dialog->runModalWithCurrentTarget(); + Common::String saveDescription = dialog->getResultString(); + if (saveDescription.empty()) + saveDescription = "Nice save ^^"; + delete dialog; + + if (saveSlot >= 0) { + switch (getGameLanguage()) { // localized + default: + case Common::EN_ANY: + _dialog->f427_dialogDraw(nullptr, "SAVING GAME . . .", nullptr, nullptr, nullptr, nullptr, false, false, false); + break; + case Common::DE_DEU: + _dialog->f427_dialogDraw(nullptr, "SPIEL WIRD GESICHERT . . .", nullptr, nullptr, nullptr, nullptr, false, false, false); + break; + case Common::FR_FRA: + _dialog->f427_dialogDraw(nullptr, "UN MOMENT A SAUVEGARDER DU JEU...", nullptr, nullptr, nullptr, nullptr, false, false, false); + break; + } + + uint16 champHandObjWeight = 0; + if (!_championMan->_g415_leaderEmptyHanded) { + champHandObjWeight = _dungeonMan->f140_getObjectWeight(_championMan->_g414_leaderHandObject); + _championMan->_gK71_champions[_championMan->_g411_leaderIndex]._load -= champHandObjWeight; + } + + writeCompleteSaveFile(saveSlot, saveDescription, saveAndPlayChoice); + + if (!_championMan->_g415_leaderEmptyHanded) { + _championMan->_gK71_champions[_championMan->_g411_leaderIndex]._load += champHandObjWeight; + } + } else + saveAndPlayChoice = kCancel; } - uint16 champHandObjWeight = 0; - if (!_championMan->_g415_leaderEmptyHanded) { - champHandObjWeight = _dungeonMan->f140_getObjectWeight(_championMan->_g414_leaderHandObject); - _championMan->_gK71_champions[_championMan->_g411_leaderIndex]._load -= champHandObjWeight; + + if (saveAndPlayChoice == kSaveAndQuit) { + _eventMan->f77_hideMouse(); + f444_endGame(false); } + _g524_restartGameAllowed = true; + _menuMan->f457_drawEnabledMenus(); + _eventMan->f77_hideMouse(); +} + +Common::String DMEngine::getSavefileName(uint16 slot) { + return Common::String::format("%s.%03u", _targetName.c_str(), slot); +} + +#define SAVEGAME_ID MKTAG('D', 'M', 'D', 'M') +#define SAVEGAME_VERSION 1 - Common::String savefileName = getSavefileName(slot); +void DMEngine::writeSaveGameHeader(Common::OutSaveFile* out, const Common::String& saveName) { + out->writeUint32BE(SAVEGAME_ID); + + // Write version + out->writeByte(SAVEGAME_VERSION); + + // Write savegame name + out->writeString(saveName); + out->writeByte(0); + + // Save the game thumbnail + if (_saveThumbnail) { + out->write(_saveThumbnail->getData(), _saveThumbnail->size()); + } else + Graphics::saveThumbnail(*out); + + // Creation date/time + TimeDate curTime; + _system->getTimeAndDate(curTime); + + uint32 saveDate = ((curTime.tm_mday & 0xFF) << 24) | (((curTime.tm_mon + 1) & 0xFF) << 16) | ((curTime.tm_year + 1900) & 0xFFFF); + uint16 saveTime = ((curTime.tm_hour & 0xFF) << 8) | ((curTime.tm_min) & 0xFF); + uint32 playTime = getTotalPlayTime() / 1000; + + out->writeUint32BE(saveDate); + out->writeUint16BE(saveTime); + out->writeUint32BE(playTime); +} + +void DMEngine::writeCompleteSaveFile(int16 saveSlot, Common::String& saveDescription, int16 saveAndPlayChoice) { + Common::String savefileName = getSavefileName(saveSlot); Common::SaveFileManager *saveFileManager = _system->getSavefileManager(); Common::OutSaveFile *file = saveFileManager->openForSaving(savefileName); if (!file) return; // TODO: silent fail - writeSaveGameHeader(file, desc); + writeSaveGameHeader(file, saveDescription); file->writeSint16BE(_g528_saveFormat); file->writeSint16BE(saveAndPlayChoice); @@ -282,7 +354,7 @@ void DMEngine::f433_processCommand140_saveGame(uint16 slot, const Common::String file->writeUint16BE(header._thingCounts[i]); } - // save _g277_dungeonMaps + // save _g277_dungeonMaps for (uint16 i = 0; i < _dungeonMan->_g278_dungeonFileHeader._mapCount; ++i) { Map &map = _dungeonMan->_g277_dungeonMaps[i]; uint16 tmp; @@ -307,7 +379,7 @@ void DMEngine::f433_processCommand140_saveGame(uint16 slot, const Common::String file->writeUint16BE(tmp); } -// save _g280_dungeonColumnsCumulativeSquareThingCount + // save _g280_dungeonColumnsCumulativeSquareThingCount for (uint16 i = 0; i < _dungeonMan->_g282_dungeonColumCount; ++i) file->writeUint16BE(_dungeonMan->_g280_dungeonColumnsCumulativeSquareThingCount[i]); @@ -331,56 +403,8 @@ void DMEngine::f433_processCommand140_saveGame(uint16 slot, const Common::String file->flush(); file->finalize(); delete file; - - if (!saveAndPlayChoice) { - _eventMan->f77_hideMouse(); - f444_endGame(false); - } - if (!_championMan->_g415_leaderEmptyHanded) { - _championMan->_gK71_champions[_championMan->_g411_leaderIndex]._load += champHandObjWeight; - } - _g524_restartGameAllowed = true; - _menuMan->f457_drawEnabledMenus(); - _eventMan->f77_hideMouse(); -} - -Common::String DMEngine::getSavefileName(uint16 slot) { - return Common::String::format("%s.%03u", _targetName.c_str(), slot); -} - -#define SAVEGAME_ID MKTAG('D', 'M', 'D', 'M') -#define SAVEGAME_VERSION 1 - -void DMEngine::writeSaveGameHeader(Common::OutSaveFile* out, const Common::String& saveName) { - out->writeUint32BE(SAVEGAME_ID); - - // Write version - out->writeByte(SAVEGAME_VERSION); - - // Write savegame name - out->writeString(saveName); - out->writeByte(0); - - // Save the game thumbnail - if (_saveThumbnail) { - out->write(_saveThumbnail->getData(), _saveThumbnail->size()); - } else - Graphics::saveThumbnail(*out); - - // Creation date/time - TimeDate curTime; - _system->getTimeAndDate(curTime); - - uint32 saveDate = ((curTime.tm_mday & 0xFF) << 24) | (((curTime.tm_mon + 1) & 0xFF) << 16) | ((curTime.tm_year + 1900) & 0xFFFF); - uint16 saveTime = ((curTime.tm_hour & 0xFF) << 8) | ((curTime.tm_min) & 0xFF); - uint32 playTime = getTotalPlayTime() / 1000; - - out->writeUint32BE(saveDate); - out->writeUint16BE(saveTime); - out->writeUint32BE(playTime); } - bool readSaveGameHeader(Common::InSaveFile* in, SaveGameHeader* header) { uint32 id = in->readUint32BE(); |