From 6fe65dc719f69c3a3cd3a90426e148972716037f Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 21 Apr 2015 03:48:21 -0500 Subject: SHERLOCK: Beginnins of SaveManager class --- engines/sherlock/saveload.cpp | 183 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 183 insertions(+) create mode 100644 engines/sherlock/saveload.cpp (limited to 'engines/sherlock/saveload.cpp') diff --git a/engines/sherlock/saveload.cpp b/engines/sherlock/saveload.cpp new file mode 100644 index 0000000000..54995e056a --- /dev/null +++ b/engines/sherlock/saveload.cpp @@ -0,0 +1,183 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "sherlock/saveload.h" +#include "sherlock/graphics.h" +#include "sherlock/sherlock.h" +#include "common/system.h" +#include "graphics/scaler.h" +#include "graphics/thumbnail.h" + +namespace Sherlock { + +SaveManager::SaveManager(SherlockEngine *vm, const Common::String &target) : + _vm(vm), _target(target) { + _saveThumb = nullptr; +} + +SaveManager::~SaveManager() { + if (_saveThumb) { + _saveThumb->free(); + delete _saveThumb; + } +} + +/** + * Shows the in-game dialog interface for loading and saving games + */ +void SaveManager::show() { + createSavegameList(); + + // TODO +} + +/** + * Build up a savegame list, with empty slots given an explicit Empty message + */ +void SaveManager::createSavegameList() { + _savegames.clear(); + for (int idx = 0; idx < NUM_SAVEGAME_SLOTS; ++idx) + _savegames.push_back("-EMPTY"); + + SaveStateList saveList = getSavegameList(_target); + for (uint idx = 0; idx < saveList.size(); ++idx) + _savegames[saveList[idx].getSaveSlot()] = saveList[idx].getDescription(); +} + +/** + * Load a list of savegames + */ +SaveStateList SaveManager::getSavegameList(const Common::String &target) { + Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); + Common::StringArray filenames; + Common::String saveDesc; + Common::String pattern = Common::String::format("%s.0??", target.c_str()); + SherlockSavegameHeader header; + + filenames = saveFileMan->listSavefiles(pattern); + sort(filenames.begin(), filenames.end()); // Sort to get the files in numerical order + + SaveStateList saveList; + for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { + const char *ext = strrchr(file->c_str(), '.'); + int slot = ext ? atoi(ext + 1) : -1; + + if (slot >= 0 && slot < NUM_SAVEGAME_SLOTS) { + Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(*file); + + if (in) { + readSavegameHeader(in, header); + saveList.push_back(SaveStateDescriptor(slot, header._saveName)); + + header._thumbnail->free(); + delete header._thumbnail; + delete in; + } + } + } + + return saveList; +} + +const char *const SAVEGAME_STR = "SHLK"; +#define SAVEGAME_STR_SIZE 4 + +bool SaveManager::readSavegameHeader(Common::InSaveFile *in, SherlockSavegameHeader &header) { + char saveIdentBuffer[SAVEGAME_STR_SIZE + 1]; + header._thumbnail = nullptr; + + // Validate the header Id + in->read(saveIdentBuffer, SAVEGAME_STR_SIZE + 1); + if (strncmp(saveIdentBuffer, SAVEGAME_STR, SAVEGAME_STR_SIZE)) + return false; + + header._version = in->readByte(); + if (header._version > SHERLOCK_SAVEGAME_VERSION) + return false; + + // Read in the string + header._saveName.clear(); + char ch; + while ((ch = (char)in->readByte()) != '\0') header._saveName += ch; + + // Get the thumbnail + header._thumbnail = Graphics::loadThumbnail(*in); + if (!header._thumbnail) + return false; + + // Read in save date/time + header._year = in->readSint16LE(); + header._month = in->readSint16LE(); + header._day = in->readSint16LE(); + header._hour = in->readSint16LE(); + header._minute = in->readSint16LE(); + header._totalFrames = in->readUint32LE(); + + return true; +} + +void SaveManager::writeSavegameHeader(Common::OutSaveFile *out, SherlockSavegameHeader &header) { + // Write out a savegame header + out->write(SAVEGAME_STR, SAVEGAME_STR_SIZE + 1); + + out->writeByte(SHERLOCK_SAVEGAME_VERSION); + + // Write savegame name + out->write(header._saveName.c_str(), header._saveName.size()); + out->writeByte('\0'); + + // Handle the thumbnail. If there's already one set by the game, create one + if (!_saveThumb) + createThumbnail(); + Graphics::saveThumbnail(*out, *_saveThumb); + + _saveThumb->free(); + delete _saveThumb; + _saveThumb = nullptr; + + // Write out the save date/time + TimeDate td; + g_system->getTimeAndDate(td); + out->writeSint16LE(td.tm_year + 1900); + out->writeSint16LE(td.tm_mon + 1); + out->writeSint16LE(td.tm_mday); + out->writeSint16LE(td.tm_hour); + out->writeSint16LE(td.tm_min); + out->writeUint32LE(_vm->_events->getFrameCounter()); +} + +/** + * Creates a thumbnail for the current on-screen contents + */ +void SaveManager::createThumbnail() { + if (_saveThumb) { + _saveThumb->free(); + delete _saveThumb; + } + + uint8 thumbPalette[PALETTE_SIZE]; + _vm->_screen->getPalette(thumbPalette); + _saveThumb = new Graphics::Surface(); + ::createThumbnail(_saveThumb, (const byte *)_vm->_screen->getPixels(), SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT, thumbPalette); +} + +} // End of namespace Sherlock -- cgit v1.2.3 From 31860163709b12a38856fc017a217eb5e32610a7 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 21 Apr 2015 18:25:06 -0500 Subject: SHERLOCK: Implemented save game dialog event handling --- engines/sherlock/saveload.cpp | 185 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 181 insertions(+), 4 deletions(-) (limited to 'engines/sherlock/saveload.cpp') diff --git a/engines/sherlock/saveload.cpp b/engines/sherlock/saveload.cpp index 54995e056a..78c86c836e 100644 --- a/engines/sherlock/saveload.cpp +++ b/engines/sherlock/saveload.cpp @@ -29,9 +29,21 @@ namespace Sherlock { +const int ENV_POINTS[6][3] = { + { 41, 80, 61 }, // Exit + { 81, 120, 101 }, // Load + { 121, 160, 141 }, // Save + { 161, 200, 181 }, // Up + { 201, 240, 221 }, // Down + { 241, 280, 261 } // Quit +}; + +/*----------------------------------------------------------------*/ + SaveManager::SaveManager(SherlockEngine *vm, const Common::String &target) : _vm(vm), _target(target) { _saveThumb = nullptr; + _envMode = SAVEMODE_NONE; } SaveManager::~SaveManager() { @@ -44,23 +56,80 @@ SaveManager::~SaveManager() { /** * Shows the in-game dialog interface for loading and saving games */ -void SaveManager::show() { +void SaveManager::drawInterface() { + Screen &screen = *_vm->_screen; + UserInterface &ui = *_vm->_ui; + + // Create a list of savegame slots createSavegameList(); - // TODO + screen._backBuffer1.fillRect(Common::Rect(0, CONTROLS_Y, SHERLOCK_SCREEN_WIDTH, CONTROLS_Y + 10), BORDER_COLOR); + screen._backBuffer1.fillRect(Common::Rect(0, CONTROLS_Y + 10, 2, SHERLOCK_SCREEN_HEIGHT), BORDER_COLOR); + screen._backBuffer1.fillRect(Common::Rect(318, CONTROLS_Y + 10, SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT), BORDER_COLOR); + screen._backBuffer1.fillRect(Common::Rect(0, 199, SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT), BORDER_COLOR); + screen._backBuffer1.fillRect(Common::Rect(2, CONTROLS_Y + 10, SHERLOCK_SCREEN_WIDTH - 2, SHERLOCK_SCREEN_HEIGHT - 2), INV_BACKGROUND); + + screen.makeButton(Common::Rect(ENV_POINTS[0][0], CONTROLS_Y, ENV_POINTS[0][1], CONTROLS_Y + 10), + ENV_POINTS[0][2] - screen.stringWidth("Exit") / 2, "Exit"); + screen.makeButton(Common::Rect(ENV_POINTS[1][0], CONTROLS_Y, ENV_POINTS[1][1], CONTROLS_Y + 10), + ENV_POINTS[1][2] - screen.stringWidth("Load") / 2, "Load"); + screen.makeButton(Common::Rect(ENV_POINTS[2][0], CONTROLS_Y, ENV_POINTS[2][1], CONTROLS_Y + 10), + ENV_POINTS[2][2] - screen.stringWidth("Save") / 2, "Save"); + screen.makeButton(Common::Rect(ENV_POINTS[3][0], CONTROLS_Y, ENV_POINTS[3][1], CONTROLS_Y + 10), + ENV_POINTS[3][2] - screen.stringWidth("Up") / 2, "Up"); + screen.makeButton(Common::Rect(ENV_POINTS[4][0], CONTROLS_Y, ENV_POINTS[4][1], CONTROLS_Y + 10), + ENV_POINTS[4][2] - screen.stringWidth("Down") / 2, "Down"); + screen.makeButton(Common::Rect(ENV_POINTS[5][0], CONTROLS_Y, ENV_POINTS[5][1], CONTROLS_Y + 10), + ENV_POINTS[5][2] - screen.stringWidth("Quit") / 2, "Quit"); + + if (!_savegameIndex) + screen.buttonPrint(Common::Point(ENV_POINTS[3][2], CONTROLS_Y), COMMAND_NULL, 0, "Up"); + + if (_savegameIndex == MAX_SAVEGAME_SLOTS - 5) + screen.buttonPrint(Common::Point(ENV_POINTS[4][2], CONTROLS_Y), COMMAND_NULL, 0, "Down"); + + for (int idx = _savegameIndex; idx < _savegameIndex + 5; ++idx) + { + screen.gPrint(Common::Point(6, CONTROLS_Y + 11 + (idx - _savegameIndex) * 10), + INV_FOREGROUND, "%d.", idx + 1); + screen.gPrint(Common::Point(24, CONTROLS_Y + 11 + (idx - _savegameIndex) * 10), + INV_FOREGROUND, "%s", _savegames[idx]); + } + + if (!ui._windowStyle) { + screen.slamRect(Common::Rect(0, CONTROLS_Y, SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT)); + } else { + ui.summonWindow(); + } + + _envMode = SAVEMODE_NONE; } /** * Build up a savegame list, with empty slots given an explicit Empty message */ void SaveManager::createSavegameList() { + Screen &screen = *_vm->_screen; + _savegames.clear(); - for (int idx = 0; idx < NUM_SAVEGAME_SLOTS; ++idx) + for (int idx = 0; idx < MAX_SAVEGAME_SLOTS; ++idx) _savegames.push_back("-EMPTY"); SaveStateList saveList = getSavegameList(_target); for (uint idx = 0; idx < saveList.size(); ++idx) _savegames[saveList[idx].getSaveSlot()] = saveList[idx].getDescription(); + + // Ensure the names will fit on the screen + for (uint idx = 0; idx < _savegames.size(); ++idx) { + int width = screen.stringWidth(_savegames[idx]) + 24; + if (width > 308) { + // It won't fit in, so remove characters until it does + do { + width -= screen.charWidth(_savegames[idx].lastChar()); + _savegames[idx].deleteLastChar(); + } while (width > 300); + } + } } /** @@ -81,7 +150,7 @@ SaveStateList SaveManager::getSavegameList(const Common::String &target) { const char *ext = strrchr(file->c_str(), '.'); int slot = ext ? atoi(ext + 1) : -1; - if (slot >= 0 && slot < NUM_SAVEGAME_SLOTS) { + if (slot >= 0 && slot < MAX_SAVEGAME_SLOTS) { Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(*file); if (in) { @@ -101,6 +170,9 @@ SaveStateList SaveManager::getSavegameList(const Common::String &target) { const char *const SAVEGAME_STR = "SHLK"; #define SAVEGAME_STR_SIZE 4 +/** + * Read in the header information for a savegame + */ bool SaveManager::readSavegameHeader(Common::InSaveFile *in, SherlockSavegameHeader &header) { char saveIdentBuffer[SAVEGAME_STR_SIZE + 1]; header._thumbnail = nullptr; @@ -135,6 +207,9 @@ bool SaveManager::readSavegameHeader(Common::InSaveFile *in, SherlockSavegameHea return true; } +/** + * Write out the header information for a savegame + */ void SaveManager::writeSavegameHeader(Common::OutSaveFile *out, SherlockSavegameHeader &header) { // Write out a savegame header out->write(SAVEGAME_STR, SAVEGAME_STR_SIZE + 1); @@ -180,4 +255,106 @@ void SaveManager::createThumbnail() { ::createThumbnail(_saveThumb, (const byte *)_vm->_screen->getPixels(), SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT, thumbPalette); } +/** + * Return the index of the button the mouse is over, if any + */ +int SaveManager::getHighlightedButton() const { + Common::Point pt = _vm->_events->mousePos(); + + for (int idx = 0; idx < 6; ++idx) { + if (pt.x > ENV_POINTS[idx][0] && pt.x < ENV_POINTS[idx][1] && pt.y > CONTROLS_Y + && pt.y < (CONTROLS_Y + 10)) + return idx; + } + + return -1; +} + +/** + * Handle highlighting buttons + */ +void SaveManager::highlightButtons(int btnIndex) { + Screen &screen = *_vm->_screen; + byte color = (btnIndex == 0) ? COMMAND_HIGHLIGHTED : COMMAND_FOREGROUND; + + screen.buttonPrint(Common::Point(ENV_POINTS[0][2], CONTROLS_Y), color, 1, "Exit"); + + if ((btnIndex == 1) || ((_envMode == 1) && (btnIndex != 2))) + screen.buttonPrint(Common::Point(ENV_POINTS[1][2], CONTROLS_Y), COMMAND_HIGHLIGHTED, true, "Load"); + else + screen.buttonPrint(Common::Point(ENV_POINTS[1][2], CONTROLS_Y), COMMAND_FOREGROUND, true, "Load"); + + if ((btnIndex == 2) || ((_envMode == 2) && (btnIndex != 1))) + screen.buttonPrint(Common::Point(ENV_POINTS[2][2], CONTROLS_Y), COMMAND_HIGHLIGHTED, true, "Save"); + else + screen.buttonPrint(Common::Point(ENV_POINTS[2][2], CONTROLS_Y), COMMAND_FOREGROUND, true, "Save"); + + if (btnIndex == 3 && _savegameIndex) + screen.buttonPrint(Common::Point(ENV_POINTS[3][2], CONTROLS_Y), COMMAND_HIGHLIGHTED, true, "Up"); + else + if (_savegameIndex) + screen.buttonPrint(Common::Point(ENV_POINTS[3][2], CONTROLS_Y), COMMAND_FOREGROUND, true, "Up"); + + if ((btnIndex == 4) && (_savegameIndex < MAX_SAVEGAME_SLOTS - 5)) + screen.buttonPrint(Common::Point(ENV_POINTS[4][2], CONTROLS_Y), COMMAND_HIGHLIGHTED, true, "Down"); + else if (_savegameIndex < (MAX_SAVEGAME_SLOTS - 5)) + screen.buttonPrint(Common::Point(ENV_POINTS[4][2], CONTROLS_Y), COMMAND_FOREGROUND, true, "Down"); + + color = (btnIndex == 5) ? COMMAND_HIGHLIGHTED : COMMAND_FOREGROUND; + screen.buttonPrint(Common::Point(ENV_POINTS[5][2], CONTROLS_Y), color, 1, "Quit"); +} + +/** + * Load the game in the specified slot + */ +void SaveManager::loadGame(int slot) { + // TODO +} + +/** + * Save the game in the specified slot with the given name + */ +void SaveManager::saveGame(int slot, const Common::String &name) { + // TODO +} + +/** + * Make sure that the selected savegame is on-screen + */ +bool SaveManager::checkGameOnScreen(int slot) { + Screen &screen = *_vm->_screen; + + // Check if it's already on-screen + if (slot != -1 && (slot < _savegameIndex || slot >= (_savegameIndex + 5))) { + _savegameIndex = slot; + + screen._backBuffer1.fillRect(Common::Rect(3, CONTROLS_Y + 11, SHERLOCK_SCREEN_WIDTH - 2, + SHERLOCK_SCREEN_HEIGHT - 1), INV_BACKGROUND); + + for (int idx = _savegameIndex; idx < (_savegameIndex + 5); ++idx) { + screen.gPrint(Common::Point(6, CONTROLS_Y + 11 + (idx - _savegameIndex) * 10), + INV_FOREGROUND, "%d.", idx + 1); + screen.gPrint(Common::Point(24, CONTROLS_Y + 11 + (idx - _savegameIndex) * 10), + INV_FOREGROUND, "%s", _savegames[idx].c_str()); + } + + screen.slamRect(Common::Rect(3, CONTROLS_Y + 11, 318, SHERLOCK_SCREEN_HEIGHT)); + + byte color = !_savegameIndex ? COMMAND_NULL : COMMAND_FOREGROUND; + screen.buttonPrint(Common::Point(ENV_POINTS[3][2], CONTROLS_Y), color, 1, "Up"); + + color = (_savegameIndex == (MAX_SAVEGAME_SLOTS - 5)) ? COMMAND_NULL : COMMAND_FOREGROUND; + screen.buttonPrint(Common::Point(ENV_POINTS[4][2], CONTROLS_Y), color, 1, "Down"); + + return true; + } + + return false; +} + +bool SaveManager::getFilename(int slot) { + // TODO + return false; +} + } // End of namespace Sherlock -- cgit v1.2.3 From 0984405a0dbe718522117507d7c75dc619c586a8 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 21 Apr 2015 22:51:03 -0500 Subject: SHERLOCK: Implement savegame synchronization --- engines/sherlock/saveload.cpp | 71 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 69 insertions(+), 2 deletions(-) (limited to 'engines/sherlock/saveload.cpp') diff --git a/engines/sherlock/saveload.cpp b/engines/sherlock/saveload.cpp index 78c86c836e..0cdf1d228f 100644 --- a/engines/sherlock/saveload.cpp +++ b/engines/sherlock/saveload.cpp @@ -44,6 +44,7 @@ SaveManager::SaveManager(SherlockEngine *vm, const Common::String &target) : _vm(vm), _target(target) { _saveThumb = nullptr; _envMode = SAVEMODE_NONE; + _justLoaded = false; } SaveManager::~SaveManager() { @@ -308,14 +309,80 @@ void SaveManager::highlightButtons(int btnIndex) { * Load the game in the specified slot */ void SaveManager::loadGame(int slot) { - // TODO + Common::InSaveFile *saveFile = g_system->getSavefileManager()->openForLoading( + generateSaveName(slot)); + Common::Serializer s(saveFile, nullptr); + + // Load the savaegame header + SherlockSavegameHeader header; + if (!readSavegameHeader(saveFile, header)) + error("Invalid savegame"); + + if (header._thumbnail) { + header._thumbnail->free(); + delete header._thumbnail; + } + + // Synchronize the savegame data + synchronize(s); + + delete saveFile; } /** * Save the game in the specified slot with the given name */ void SaveManager::saveGame(int slot, const Common::String &name) { - // TODO + Common::OutSaveFile *out = g_system->getSavefileManager()->openForSaving( + generateSaveName(slot)); + + SherlockSavegameHeader header; + header._saveName = name; + writeSavegameHeader(out, header); + + Common::Serializer s(nullptr, out); + synchronize(s); + + out->finalize(); + delete out; +} + +/** + * Support method that generates a savegame name + * @param slot Slot number + */ +Common::String SaveManager::generateSaveName(int slot) { + return Common::String::format("%s.%03d", _target.c_str(), slot); +} + +/** + * Synchronize the data for a savegame + */ +void SaveManager::synchronize(Common::Serializer &s) { + Journal &journal = *_vm->_journal; + People &people = *_vm->_people; + Scene &scene = *_vm->_scene; + Screen &screen = *_vm->_screen; + Talk &talk = *_vm->_talk; + + int oldFont = screen.fontNumber(); + + journal.synchronize(s); + people.synchronize(s); + scene.synchronize(s); + screen.synchronize(s); + talk.synchronize(s); + _vm->synchronize(s); + + if (screen.fontNumber() != oldFont) + journal.resetPosition(); + /* + char room_flags[MAX_ROOMS * 9]; + + */ + + _vm->_loadingSavedGame = true; + _justLoaded = true; } /** -- cgit v1.2.3 From e08520cca94f33cb69ee8058cb08e400e5443016 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 22 Apr 2015 02:32:25 -0500 Subject: SHERLOCK: Fix Files saves listing and save name entry --- engines/sherlock/saveload.cpp | 96 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 92 insertions(+), 4 deletions(-) (limited to 'engines/sherlock/saveload.cpp') diff --git a/engines/sherlock/saveload.cpp b/engines/sherlock/saveload.cpp index 0cdf1d228f..57a4a65b21 100644 --- a/engines/sherlock/saveload.cpp +++ b/engines/sherlock/saveload.cpp @@ -45,6 +45,7 @@ SaveManager::SaveManager(SherlockEngine *vm, const Common::String &target) : _saveThumb = nullptr; _envMode = SAVEMODE_NONE; _justLoaded = false; + _savegameIndex = 0; } SaveManager::~SaveManager() { @@ -94,7 +95,7 @@ void SaveManager::drawInterface() { screen.gPrint(Common::Point(6, CONTROLS_Y + 11 + (idx - _savegameIndex) * 10), INV_FOREGROUND, "%d.", idx + 1); screen.gPrint(Common::Point(24, CONTROLS_Y + 11 + (idx - _savegameIndex) * 10), - INV_FOREGROUND, "%s", _savegames[idx]); + INV_FOREGROUND, "%s", _savegames[idx].c_str()); } if (!ui._windowStyle) { @@ -114,7 +115,7 @@ void SaveManager::createSavegameList() { _savegames.clear(); for (int idx = 0; idx < MAX_SAVEGAME_SLOTS; ++idx) - _savegames.push_back("-EMPTY"); + _savegames.push_back("-EMPTY-"); SaveStateList saveList = getSavegameList(_target); for (uint idx = 0; idx < saveList.size(); ++idx) @@ -420,8 +421,95 @@ bool SaveManager::checkGameOnScreen(int slot) { } bool SaveManager::getFilename(int slot) { - // TODO - return false; + Events &events = *_vm->_events; + Scene &scene = *_vm->_scene; + Screen &screen = *_vm->_screen; + Talk &talk = *_vm->_talk; + int xp, yp; + bool flag = false; + + screen.buttonPrint(Common::Point(ENV_POINTS[0][2], CONTROLS_Y), COMMAND_NULL, true, "Exit"); + screen.buttonPrint(Common::Point(ENV_POINTS[1][2], CONTROLS_Y), COMMAND_NULL, true, "Load"); + screen.buttonPrint(Common::Point(ENV_POINTS[2][2], CONTROLS_Y), COMMAND_NULL, true, "Save"); + screen.buttonPrint(Common::Point(ENV_POINTS[3][2], CONTROLS_Y), COMMAND_NULL, true, "Up"); + screen.buttonPrint(Common::Point(ENV_POINTS[4][2], CONTROLS_Y), COMMAND_NULL, true, "Down"); + screen.buttonPrint(Common::Point(ENV_POINTS[5][2], CONTROLS_Y), COMMAND_NULL, true, "Quit"); + + Common::String saveName = _savegames[slot]; + if (scumm_stricmp(saveName.c_str(), "-EMPTY-") == 0) { + // It's an empty slot, so start off with an empty save name + saveName = ""; + + yp = CONTROLS_Y + 12 + (slot - _savegameIndex) * 10; + screen.vgaBar(Common::Rect(24, yp, 85, yp + 9), INV_BACKGROUND); + } + + screen.print(Common::Point(6, CONTROLS_Y + 12 + (slot - _savegameIndex) * 10), TALK_FOREGROUND, "%d.", slot + 1); + screen.print(Common::Point(24, CONTROLS_Y + 12 + (slot - _savegameIndex) * 10), TALK_FOREGROUND, "%s", saveName.c_str()); + xp = 24 + screen.stringWidth(saveName); + yp = CONTROLS_Y + 12 + (slot - _savegameIndex) * 10; + + int done = 0; + do { + while (!_vm->shouldQuit() && !events.kbHit()) { + scene.doBgAnim(); + + if (talk._talkToAbort) + return false; + + // Allow event processing + events.pollEventsAndWait(); + events.setButtonState(); + + flag = !flag; + if (flag) + screen.vgaBar(Common::Rect(xp, yp - 1, xp + 8, yp + 9), INV_FOREGROUND); + else + screen.vgaBar(Common::Rect(xp, yp - 1, xp + 8, yp + 9), INV_BACKGROUND); + } + if (_vm->shouldQuit()) + return false; + + // Get the next keypress + Common::KeyState keyState = events.getKey(); + + if (keyState.keycode == Common::KEYCODE_BACKSPACE && saveName.size() > 0) { + // Delete character of save name + screen.vgaBar(Common::Rect(xp - screen.charWidth(saveName.lastChar()), yp - 1, + xp + 8, yp + 9), INV_BACKGROUND); + xp -= screen.charWidth(saveName.lastChar()); + screen.vgaBar(Common::Rect(xp, yp - 1, xp + 8, yp + 9), INV_FOREGROUND); + saveName.deleteLastChar(); + } + + if (keyState.keycode == Common::KEYCODE_RETURN) + done = 1; + + if (keyState.keycode == Common::KEYCODE_ESCAPE) { + screen.vgaBar(Common::Rect(xp, yp - 1, xp + 8, yp + 9), INV_BACKGROUND); + done = -1; + } + + if (keyState.keycode >= ' ' && keyState.keycode <= 'z' && saveName.size() < 50 + && (xp + screen.charWidth(keyState.keycode)) < 308) { + screen.vgaBar(Common::Rect(xp, yp - 1, xp + 8, yp + 9), INV_BACKGROUND); + screen.print(Common::Point(xp, yp), TALK_FOREGROUND, "%c", (char)keyState.keycode); + xp += screen.charWidth((char)keyState.keycode); + screen.vgaBar(Common::Rect(xp, yp - 1, xp + 8, yp + 9), INV_FOREGROUND); + saveName += (char)keyState.keycode; + } + } while (!done); + + if (done == 1) { + // Enter key perssed + _savegames[slot] = saveName; + } else { + done = 0; + _envMode = SAVEMODE_NONE; + highlightButtons(-1); + } + + return done == 1; } } // End of namespace Sherlock -- cgit v1.2.3 From 27938653a5cd05856da88142f52de44f30e26eef Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 22 Apr 2015 04:44:55 -0500 Subject: SHERLOCK: Further fixes for entering savegame names --- engines/sherlock/saveload.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) (limited to 'engines/sherlock/saveload.cpp') diff --git a/engines/sherlock/saveload.cpp b/engines/sherlock/saveload.cpp index 57a4a65b21..cd7627a768 100644 --- a/engines/sherlock/saveload.cpp +++ b/engines/sherlock/saveload.cpp @@ -118,8 +118,11 @@ void SaveManager::createSavegameList() { _savegames.push_back("-EMPTY-"); SaveStateList saveList = getSavegameList(_target); - for (uint idx = 0; idx < saveList.size(); ++idx) - _savegames[saveList[idx].getSaveSlot()] = saveList[idx].getDescription(); + for (uint idx = 0; idx < saveList.size(); ++idx) { + int slot = saveList[idx].getSaveSlot() - 1; + if (slot >= 0 && slot < MAX_SAVEGAME_SLOTS) + _savegames[slot] = saveList[idx].getDescription(); + } // Ensure the names will fit on the screen for (uint idx = 0; idx < _savegames.size(); ++idx) { @@ -312,6 +315,9 @@ void SaveManager::highlightButtons(int btnIndex) { void SaveManager::loadGame(int slot) { Common::InSaveFile *saveFile = g_system->getSavefileManager()->openForLoading( generateSaveName(slot)); + if (!saveFile) + return; + Common::Serializer s(saveFile, nullptr); // Load the savaegame header @@ -492,11 +498,13 @@ bool SaveManager::getFilename(int slot) { if (keyState.keycode >= ' ' && keyState.keycode <= 'z' && saveName.size() < 50 && (xp + screen.charWidth(keyState.keycode)) < 308) { + char c = (char)keyState.ascii; + screen.vgaBar(Common::Rect(xp, yp - 1, xp + 8, yp + 9), INV_BACKGROUND); - screen.print(Common::Point(xp, yp), TALK_FOREGROUND, "%c", (char)keyState.keycode); - xp += screen.charWidth((char)keyState.keycode); + screen.print(Common::Point(xp, yp), TALK_FOREGROUND, "%c", c); + xp += screen.charWidth(c); screen.vgaBar(Common::Rect(xp, yp - 1, xp + 8, yp + 9), INV_FOREGROUND); - saveName += (char)keyState.keycode; + saveName += c; } } while (!done); -- cgit v1.2.3 From 8b0e8cd505eebf199aa9888ce65012f1574b1233 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 22 Apr 2015 06:25:04 -0500 Subject: SHERLOCK: Hook up savegames to launcher --- engines/sherlock/saveload.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'engines/sherlock/saveload.cpp') diff --git a/engines/sherlock/saveload.cpp b/engines/sherlock/saveload.cpp index cd7627a768..207eff1ab4 100644 --- a/engines/sherlock/saveload.cpp +++ b/engines/sherlock/saveload.cpp @@ -318,8 +318,6 @@ void SaveManager::loadGame(int slot) { if (!saveFile) return; - Common::Serializer s(saveFile, nullptr); - // Load the savaegame header SherlockSavegameHeader header; if (!readSavegameHeader(saveFile, header)) @@ -331,6 +329,7 @@ void SaveManager::loadGame(int slot) { } // Synchronize the savegame data + Common::Serializer s(saveFile, nullptr); synchronize(s); delete saveFile; @@ -347,6 +346,7 @@ void SaveManager::saveGame(int slot, const Common::String &name) { header._saveName = name; writeSavegameHeader(out, header); + // Synchronize the savegame data Common::Serializer s(nullptr, out); synchronize(s); -- cgit v1.2.3 From acf0b01ad80acb54992a36c0123f3c951e2200e3 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 22 Apr 2015 07:08:01 -0500 Subject: SHERLOCK: Hook up saving and loading via GMM --- engines/sherlock/saveload.cpp | 4 ---- 1 file changed, 4 deletions(-) (limited to 'engines/sherlock/saveload.cpp') diff --git a/engines/sherlock/saveload.cpp b/engines/sherlock/saveload.cpp index 207eff1ab4..7610c42d8c 100644 --- a/engines/sherlock/saveload.cpp +++ b/engines/sherlock/saveload.cpp @@ -383,10 +383,6 @@ void SaveManager::synchronize(Common::Serializer &s) { if (screen.fontNumber() != oldFont) journal.resetPosition(); - /* - char room_flags[MAX_ROOMS * 9]; - - */ _vm->_loadingSavedGame = true; _justLoaded = true; -- cgit v1.2.3 From 2379824e32fd0cb49e3f2b6c997cb6070f0b0393 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 25 Apr 2015 04:42:15 -0500 Subject: SHERLOCK: Fix saving and display of inventory items --- engines/sherlock/saveload.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'engines/sherlock/saveload.cpp') diff --git a/engines/sherlock/saveload.cpp b/engines/sherlock/saveload.cpp index 7610c42d8c..a694e21b28 100644 --- a/engines/sherlock/saveload.cpp +++ b/engines/sherlock/saveload.cpp @@ -366,6 +366,7 @@ Common::String SaveManager::generateSaveName(int slot) { * Synchronize the data for a savegame */ void SaveManager::synchronize(Common::Serializer &s) { + Inventory &inv = *_vm->_inventory; Journal &journal = *_vm->_journal; People &people = *_vm->_people; Scene &scene = *_vm->_scene; @@ -374,6 +375,7 @@ void SaveManager::synchronize(Common::Serializer &s) { int oldFont = screen.fontNumber(); + inv.synchronize(s); journal.synchronize(s); people.synchronize(s); scene.synchronize(s); -- cgit v1.2.3 From 65eb390ead25c54b1e3c547f3e189a7ccb73becb Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 26 Apr 2015 18:29:20 -0500 Subject: SHERLOCK: Cleanup and moving of map variables into Map class --- engines/sherlock/saveload.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'engines/sherlock/saveload.cpp') diff --git a/engines/sherlock/saveload.cpp b/engines/sherlock/saveload.cpp index a694e21b28..86a4e8417a 100644 --- a/engines/sherlock/saveload.cpp +++ b/engines/sherlock/saveload.cpp @@ -368,6 +368,7 @@ Common::String SaveManager::generateSaveName(int slot) { void SaveManager::synchronize(Common::Serializer &s) { Inventory &inv = *_vm->_inventory; Journal &journal = *_vm->_journal; + Map &map = *_vm->_map; People &people = *_vm->_people; Scene &scene = *_vm->_scene; Screen &screen = *_vm->_screen; @@ -378,6 +379,7 @@ void SaveManager::synchronize(Common::Serializer &s) { inv.synchronize(s); journal.synchronize(s); people.synchronize(s); + map.synchronize(s); scene.synchronize(s); screen.synchronize(s); talk.synchronize(s); -- cgit v1.2.3 From f97e550d8631bc1821da1c126ae545db15769c9c Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 2 May 2015 17:48:07 -1000 Subject: SHERLOCK: Don't mark leaving scene as visited during savegame loads --- engines/sherlock/saveload.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'engines/sherlock/saveload.cpp') diff --git a/engines/sherlock/saveload.cpp b/engines/sherlock/saveload.cpp index 86a4e8417a..71e21618ae 100644 --- a/engines/sherlock/saveload.cpp +++ b/engines/sherlock/saveload.cpp @@ -388,7 +388,6 @@ void SaveManager::synchronize(Common::Serializer &s) { if (screen.fontNumber() != oldFont) journal.resetPosition(); - _vm->_loadingSavedGame = true; _justLoaded = true; } -- cgit v1.2.3 From d9e93f8e015ce27a95090e854494c4b3f7d1c0d4 Mon Sep 17 00:00:00 2001 From: Strangerke Date: Thu, 7 May 2015 19:33:44 +0200 Subject: SHERLOCK: some code formatting --- engines/sherlock/saveload.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'engines/sherlock/saveload.cpp') diff --git a/engines/sherlock/saveload.cpp b/engines/sherlock/saveload.cpp index 71e21618ae..61fe9f30bf 100644 --- a/engines/sherlock/saveload.cpp +++ b/engines/sherlock/saveload.cpp @@ -40,7 +40,7 @@ const int ENV_POINTS[6][3] = { /*----------------------------------------------------------------*/ -SaveManager::SaveManager(SherlockEngine *vm, const Common::String &target) : +SaveManager::SaveManager(SherlockEngine *vm, const Common::String &target) : _vm(vm), _target(target) { _saveThumb = nullptr; _envMode = SAVEMODE_NONE; @@ -71,7 +71,7 @@ void SaveManager::drawInterface() { screen._backBuffer1.fillRect(Common::Rect(0, 199, SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT), BORDER_COLOR); screen._backBuffer1.fillRect(Common::Rect(2, CONTROLS_Y + 10, SHERLOCK_SCREEN_WIDTH - 2, SHERLOCK_SCREEN_HEIGHT - 2), INV_BACKGROUND); - screen.makeButton(Common::Rect(ENV_POINTS[0][0], CONTROLS_Y, ENV_POINTS[0][1], CONTROLS_Y + 10), + screen.makeButton(Common::Rect(ENV_POINTS[0][0], CONTROLS_Y, ENV_POINTS[0][1], CONTROLS_Y + 10), ENV_POINTS[0][2] - screen.stringWidth("Exit") / 2, "Exit"); screen.makeButton(Common::Rect(ENV_POINTS[1][0], CONTROLS_Y, ENV_POINTS[1][1], CONTROLS_Y + 10), ENV_POINTS[1][2] - screen.stringWidth("Load") / 2, "Load"); @@ -92,9 +92,9 @@ void SaveManager::drawInterface() { for (int idx = _savegameIndex; idx < _savegameIndex + 5; ++idx) { - screen.gPrint(Common::Point(6, CONTROLS_Y + 11 + (idx - _savegameIndex) * 10), + screen.gPrint(Common::Point(6, CONTROLS_Y + 11 + (idx - _savegameIndex) * 10), INV_FOREGROUND, "%d.", idx + 1); - screen.gPrint(Common::Point(24, CONTROLS_Y + 11 + (idx - _savegameIndex) * 10), + screen.gPrint(Common::Point(24, CONTROLS_Y + 11 + (idx - _savegameIndex) * 10), INV_FOREGROUND, "%s", _savegames[idx].c_str()); } @@ -317,7 +317,7 @@ void SaveManager::loadGame(int slot) { generateSaveName(slot)); if (!saveFile) return; - + // Load the savaegame header SherlockSavegameHeader header; if (!readSavegameHeader(saveFile, header)) @@ -405,12 +405,12 @@ bool SaveManager::checkGameOnScreen(int slot) { SHERLOCK_SCREEN_HEIGHT - 1), INV_BACKGROUND); for (int idx = _savegameIndex; idx < (_savegameIndex + 5); ++idx) { - screen.gPrint(Common::Point(6, CONTROLS_Y + 11 + (idx - _savegameIndex) * 10), + screen.gPrint(Common::Point(6, CONTROLS_Y + 11 + (idx - _savegameIndex) * 10), INV_FOREGROUND, "%d.", idx + 1); screen.gPrint(Common::Point(24, CONTROLS_Y + 11 + (idx - _savegameIndex) * 10), INV_FOREGROUND, "%s", _savegames[idx].c_str()); } - + screen.slamRect(Common::Rect(3, CONTROLS_Y + 11, 318, SHERLOCK_SCREEN_HEIGHT)); byte color = !_savegameIndex ? COMMAND_NULL : COMMAND_FOREGROUND; @@ -432,7 +432,7 @@ bool SaveManager::getFilename(int slot) { Talk &talk = *_vm->_talk; int xp, yp; bool flag = false; - + screen.buttonPrint(Common::Point(ENV_POINTS[0][2], CONTROLS_Y), COMMAND_NULL, true, "Exit"); screen.buttonPrint(Common::Point(ENV_POINTS[1][2], CONTROLS_Y), COMMAND_NULL, true, "Load"); screen.buttonPrint(Common::Point(ENV_POINTS[2][2], CONTROLS_Y), COMMAND_NULL, true, "Save"); @@ -480,7 +480,7 @@ bool SaveManager::getFilename(int slot) { if (keyState.keycode == Common::KEYCODE_BACKSPACE && saveName.size() > 0) { // Delete character of save name - screen.vgaBar(Common::Rect(xp - screen.charWidth(saveName.lastChar()), yp - 1, + screen.vgaBar(Common::Rect(xp - screen.charWidth(saveName.lastChar()), yp - 1, xp + 8, yp + 9), INV_BACKGROUND); xp -= screen.charWidth(saveName.lastChar()); screen.vgaBar(Common::Rect(xp, yp - 1, xp + 8, yp + 9), INV_FOREGROUND); -- cgit v1.2.3 From 902b79116552b0605668f130e0695e4798ef87d5 Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Sat, 9 May 2015 18:04:13 +0200 Subject: SHERLOCK: Make copyright headers consistent --- engines/sherlock/saveload.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'engines/sherlock/saveload.cpp') diff --git a/engines/sherlock/saveload.cpp b/engines/sherlock/saveload.cpp index 61fe9f30bf..a78b89b00c 100644 --- a/engines/sherlock/saveload.cpp +++ b/engines/sherlock/saveload.cpp @@ -8,12 +8,12 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -- cgit v1.2.3 From 24b93a14be56725d65983082592029ee6d24f3c1 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 13 May 2015 20:05:19 -0400 Subject: SHERLOCK: Renamed graphics.cpp to surface.cpp --- engines/sherlock/saveload.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'engines/sherlock/saveload.cpp') diff --git a/engines/sherlock/saveload.cpp b/engines/sherlock/saveload.cpp index a78b89b00c..b9ac3e79d6 100644 --- a/engines/sherlock/saveload.cpp +++ b/engines/sherlock/saveload.cpp @@ -21,7 +21,7 @@ */ #include "sherlock/saveload.h" -#include "sherlock/graphics.h" +#include "sherlock/surface.h" #include "sherlock/sherlock.h" #include "common/system.h" #include "graphics/scaler.h" -- cgit v1.2.3 From 5e351b6bf3988b33a6af952331039083c3b2aff8 Mon Sep 17 00:00:00 2001 From: sirlemonhead Date: Sun, 17 May 2015 20:41:42 +0100 Subject: SHERLOCK: Replace scumm_stricmp() with equalsIgnoreCase() --- engines/sherlock/saveload.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'engines/sherlock/saveload.cpp') diff --git a/engines/sherlock/saveload.cpp b/engines/sherlock/saveload.cpp index b9ac3e79d6..0ac25a2f1a 100644 --- a/engines/sherlock/saveload.cpp +++ b/engines/sherlock/saveload.cpp @@ -441,7 +441,7 @@ bool SaveManager::getFilename(int slot) { screen.buttonPrint(Common::Point(ENV_POINTS[5][2], CONTROLS_Y), COMMAND_NULL, true, "Quit"); Common::String saveName = _savegames[slot]; - if (scumm_stricmp(saveName.c_str(), "-EMPTY-") == 0) { + if (saveName.equalsIgnoreCase("-EMPTY-")) { // It's an empty slot, so start off with an empty save name saveName = ""; -- cgit v1.2.3 From 8d426ca46435426c925007b08c933fdccdd75fa8 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 18 May 2015 20:43:26 -0400 Subject: SHERLOCK: Added more of the game options to the Engine tab --- engines/sherlock/saveload.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'engines/sherlock/saveload.cpp') diff --git a/engines/sherlock/saveload.cpp b/engines/sherlock/saveload.cpp index 0ac25a2f1a..6fb1dcc448 100644 --- a/engines/sherlock/saveload.cpp +++ b/engines/sherlock/saveload.cpp @@ -98,7 +98,7 @@ void SaveManager::drawInterface() { INV_FOREGROUND, "%s", _savegames[idx].c_str()); } - if (!ui._windowStyle) { + if (!ui._slideWindows) { screen.slamRect(Common::Rect(0, CONTROLS_Y, SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT)); } else { ui.summonWindow(); -- cgit v1.2.3 From 1df183ffcb08a69ed414afd69284a0596fee4e82 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 19 May 2015 07:37:55 -0400 Subject: SHERLOCK: Move method comments from cpp to headers --- engines/sherlock/saveload.cpp | 40 ---------------------------------------- 1 file changed, 40 deletions(-) (limited to 'engines/sherlock/saveload.cpp') diff --git a/engines/sherlock/saveload.cpp b/engines/sherlock/saveload.cpp index 6fb1dcc448..bec832aa05 100644 --- a/engines/sherlock/saveload.cpp +++ b/engines/sherlock/saveload.cpp @@ -55,9 +55,6 @@ SaveManager::~SaveManager() { } } -/** - * Shows the in-game dialog interface for loading and saving games - */ void SaveManager::drawInterface() { Screen &screen = *_vm->_screen; UserInterface &ui = *_vm->_ui; @@ -107,9 +104,6 @@ void SaveManager::drawInterface() { _envMode = SAVEMODE_NONE; } -/** - * Build up a savegame list, with empty slots given an explicit Empty message - */ void SaveManager::createSavegameList() { Screen &screen = *_vm->_screen; @@ -137,9 +131,6 @@ void SaveManager::createSavegameList() { } } -/** - * Load a list of savegames - */ SaveStateList SaveManager::getSavegameList(const Common::String &target) { Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); Common::StringArray filenames; @@ -175,9 +166,6 @@ SaveStateList SaveManager::getSavegameList(const Common::String &target) { const char *const SAVEGAME_STR = "SHLK"; #define SAVEGAME_STR_SIZE 4 -/** - * Read in the header information for a savegame - */ bool SaveManager::readSavegameHeader(Common::InSaveFile *in, SherlockSavegameHeader &header) { char saveIdentBuffer[SAVEGAME_STR_SIZE + 1]; header._thumbnail = nullptr; @@ -212,9 +200,6 @@ bool SaveManager::readSavegameHeader(Common::InSaveFile *in, SherlockSavegameHea return true; } -/** - * Write out the header information for a savegame - */ void SaveManager::writeSavegameHeader(Common::OutSaveFile *out, SherlockSavegameHeader &header) { // Write out a savegame header out->write(SAVEGAME_STR, SAVEGAME_STR_SIZE + 1); @@ -245,9 +230,6 @@ void SaveManager::writeSavegameHeader(Common::OutSaveFile *out, SherlockSavegame out->writeUint32LE(_vm->_events->getFrameCounter()); } -/** - * Creates a thumbnail for the current on-screen contents - */ void SaveManager::createThumbnail() { if (_saveThumb) { _saveThumb->free(); @@ -260,9 +242,6 @@ void SaveManager::createThumbnail() { ::createThumbnail(_saveThumb, (const byte *)_vm->_screen->getPixels(), SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT, thumbPalette); } -/** - * Return the index of the button the mouse is over, if any - */ int SaveManager::getHighlightedButton() const { Common::Point pt = _vm->_events->mousePos(); @@ -275,9 +254,6 @@ int SaveManager::getHighlightedButton() const { return -1; } -/** - * Handle highlighting buttons - */ void SaveManager::highlightButtons(int btnIndex) { Screen &screen = *_vm->_screen; byte color = (btnIndex == 0) ? COMMAND_HIGHLIGHTED : COMMAND_FOREGROUND; @@ -309,9 +285,6 @@ void SaveManager::highlightButtons(int btnIndex) { screen.buttonPrint(Common::Point(ENV_POINTS[5][2], CONTROLS_Y), color, 1, "Quit"); } -/** - * Load the game in the specified slot - */ void SaveManager::loadGame(int slot) { Common::InSaveFile *saveFile = g_system->getSavefileManager()->openForLoading( generateSaveName(slot)); @@ -335,9 +308,6 @@ void SaveManager::loadGame(int slot) { delete saveFile; } -/** - * Save the game in the specified slot with the given name - */ void SaveManager::saveGame(int slot, const Common::String &name) { Common::OutSaveFile *out = g_system->getSavefileManager()->openForSaving( generateSaveName(slot)); @@ -354,17 +324,10 @@ void SaveManager::saveGame(int slot, const Common::String &name) { delete out; } -/** - * Support method that generates a savegame name - * @param slot Slot number - */ Common::String SaveManager::generateSaveName(int slot) { return Common::String::format("%s.%03d", _target.c_str(), slot); } -/** - * Synchronize the data for a savegame - */ void SaveManager::synchronize(Common::Serializer &s) { Inventory &inv = *_vm->_inventory; Journal &journal = *_vm->_journal; @@ -391,9 +354,6 @@ void SaveManager::synchronize(Common::Serializer &s) { _justLoaded = true; } -/** - * Make sure that the selected savegame is on-screen - */ bool SaveManager::checkGameOnScreen(int slot) { Screen &screen = *_vm->_screen; -- cgit v1.2.3 From dac49ddab496b9e5ca0f6589ea7b5ad906faa464 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 19 May 2015 07:53:45 -0400 Subject: SHERLOCK: Syntactic fix and define for SaveManager --- engines/sherlock/saveload.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'engines/sherlock/saveload.cpp') diff --git a/engines/sherlock/saveload.cpp b/engines/sherlock/saveload.cpp index bec832aa05..053c52c4e5 100644 --- a/engines/sherlock/saveload.cpp +++ b/engines/sherlock/saveload.cpp @@ -38,6 +38,10 @@ const int ENV_POINTS[6][3] = { { 241, 280, 261 } // Quit }; +const char *const SAVEGAME_STR = "SHLK"; +#define SAVEGAME_STR_SIZE 4 +#define ONSCREEN_FILES_COUNT 5 + /*----------------------------------------------------------------*/ SaveManager::SaveManager(SherlockEngine *vm, const Common::String &target) : @@ -84,11 +88,10 @@ void SaveManager::drawInterface() { if (!_savegameIndex) screen.buttonPrint(Common::Point(ENV_POINTS[3][2], CONTROLS_Y), COMMAND_NULL, 0, "Up"); - if (_savegameIndex == MAX_SAVEGAME_SLOTS - 5) + if (_savegameIndex == MAX_SAVEGAME_SLOTS - ONSCREEN_FILES_COUNT) screen.buttonPrint(Common::Point(ENV_POINTS[4][2], CONTROLS_Y), COMMAND_NULL, 0, "Down"); - for (int idx = _savegameIndex; idx < _savegameIndex + 5; ++idx) - { + for (int idx = _savegameIndex; idx < _savegameIndex + ONSCREEN_FILES_COUNT; ++idx) { screen.gPrint(Common::Point(6, CONTROLS_Y + 11 + (idx - _savegameIndex) * 10), INV_FOREGROUND, "%d.", idx + 1); screen.gPrint(Common::Point(24, CONTROLS_Y + 11 + (idx - _savegameIndex) * 10), @@ -163,9 +166,6 @@ SaveStateList SaveManager::getSavegameList(const Common::String &target) { return saveList; } -const char *const SAVEGAME_STR = "SHLK"; -#define SAVEGAME_STR_SIZE 4 - bool SaveManager::readSavegameHeader(Common::InSaveFile *in, SherlockSavegameHeader &header) { char saveIdentBuffer[SAVEGAME_STR_SIZE + 1]; header._thumbnail = nullptr; -- cgit v1.2.3 From fa35249a240d7bdfe5f5b7eb9ae073126d5080c4 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 19 May 2015 08:01:06 -0400 Subject: SHERLOCK: More syntactic fixes --- engines/sherlock/saveload.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'engines/sherlock/saveload.cpp') diff --git a/engines/sherlock/saveload.cpp b/engines/sherlock/saveload.cpp index 053c52c4e5..63d3142262 100644 --- a/engines/sherlock/saveload.cpp +++ b/engines/sherlock/saveload.cpp @@ -385,7 +385,7 @@ bool SaveManager::checkGameOnScreen(int slot) { return false; } -bool SaveManager::getFilename(int slot) { +bool SaveManager::promptForFilename(int slot) { Events &events = *_vm->_events; Scene &scene = *_vm->_scene; Screen &screen = *_vm->_screen; @@ -455,8 +455,8 @@ bool SaveManager::getFilename(int slot) { done = -1; } - if (keyState.keycode >= ' ' && keyState.keycode <= 'z' && saveName.size() < 50 - && (xp + screen.charWidth(keyState.keycode)) < 308) { + if (keyState.ascii >= ' ' && keyState.ascii <= 'z' && saveName.size() < 50 + && (xp + screen.charWidth(keyState.ascii)) < 308) { char c = (char)keyState.ascii; screen.vgaBar(Common::Rect(xp, yp - 1, xp + 8, yp + 9), INV_BACKGROUND); -- cgit v1.2.3 From 06b39671e30ecd39585f2f7312af53abb9d27d1c Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 19 May 2015 09:17:04 -0400 Subject: SHERLOCK: Further cleanup for SaveManager --- engines/sherlock/saveload.cpp | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) (limited to 'engines/sherlock/saveload.cpp') diff --git a/engines/sherlock/saveload.cpp b/engines/sherlock/saveload.cpp index 63d3142262..5033a3b16d 100644 --- a/engines/sherlock/saveload.cpp +++ b/engines/sherlock/saveload.cpp @@ -38,7 +38,8 @@ const int ENV_POINTS[6][3] = { { 241, 280, 261 } // Quit }; -const char *const SAVEGAME_STR = "SHLK"; +static const char *const EMPTY_SAVEGAME_SLOT = "-EMPTY-"; +static const char *const SAVEGAME_STR = "SHLK"; #define SAVEGAME_STR_SIZE 4 #define ONSCREEN_FILES_COUNT 5 @@ -112,7 +113,7 @@ void SaveManager::createSavegameList() { _savegames.clear(); for (int idx = 0; idx < MAX_SAVEGAME_SLOTS; ++idx) - _savegames.push_back("-EMPTY-"); + _savegames.push_back(EMPTY_SAVEGAME_SLOT); SaveStateList saveList = getSavegameList(_target); for (uint idx = 0; idx < saveList.size(); ++idx) { @@ -401,7 +402,7 @@ bool SaveManager::promptForFilename(int slot) { screen.buttonPrint(Common::Point(ENV_POINTS[5][2], CONTROLS_Y), COMMAND_NULL, true, "Quit"); Common::String saveName = _savegames[slot]; - if (saveName.equalsIgnoreCase("-EMPTY-")) { + if (saveName.equalsIgnoreCase(EMPTY_SAVEGAME_SLOT)) { // It's an empty slot, so start off with an empty save name saveName = ""; @@ -445,17 +446,15 @@ bool SaveManager::promptForFilename(int slot) { xp -= screen.charWidth(saveName.lastChar()); screen.vgaBar(Common::Rect(xp, yp - 1, xp + 8, yp + 9), INV_FOREGROUND); saveName.deleteLastChar(); - } - - if (keyState.keycode == Common::KEYCODE_RETURN) + + } else if (keyState.keycode == Common::KEYCODE_RETURN && saveName.compareToIgnoreCase(EMPTY_SAVEGAME_SLOT)) { done = 1; - if (keyState.keycode == Common::KEYCODE_ESCAPE) { + } else if (keyState.keycode == Common::KEYCODE_ESCAPE) { screen.vgaBar(Common::Rect(xp, yp - 1, xp + 8, yp + 9), INV_BACKGROUND); done = -1; - } - - if (keyState.ascii >= ' ' && keyState.ascii <= 'z' && saveName.size() < 50 + + } else if (keyState.ascii >= ' ' && keyState.ascii <= 'z' && saveName.size() < 50 && (xp + screen.charWidth(keyState.ascii)) < 308) { char c = (char)keyState.ascii; -- cgit v1.2.3 From 033241eb434ff4916c140885a6cda84a593406d5 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 19 May 2015 09:19:42 -0400 Subject: SHERLOCK: Corrected incorrect method name in SaveManager --- engines/sherlock/saveload.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'engines/sherlock/saveload.cpp') diff --git a/engines/sherlock/saveload.cpp b/engines/sherlock/saveload.cpp index 5033a3b16d..3c8f3e4f60 100644 --- a/engines/sherlock/saveload.cpp +++ b/engines/sherlock/saveload.cpp @@ -386,7 +386,7 @@ bool SaveManager::checkGameOnScreen(int slot) { return false; } -bool SaveManager::promptForFilename(int slot) { +bool SaveManager::promptForDescription(int slot) { Events &events = *_vm->_events; Scene &scene = *_vm->_scene; Screen &screen = *_vm->_screen; -- cgit v1.2.3 From 6f9693102f99843501822f27431d839777fb43d5 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 19 May 2015 09:35:53 -0400 Subject: SHERLOCK: Further minor cleanups --- engines/sherlock/saveload.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'engines/sherlock/saveload.cpp') diff --git a/engines/sherlock/saveload.cpp b/engines/sherlock/saveload.cpp index 3c8f3e4f60..9848f8160f 100644 --- a/engines/sherlock/saveload.cpp +++ b/engines/sherlock/saveload.cpp @@ -41,7 +41,6 @@ const int ENV_POINTS[6][3] = { static const char *const EMPTY_SAVEGAME_SLOT = "-EMPTY-"; static const char *const SAVEGAME_STR = "SHLK"; #define SAVEGAME_STR_SIZE 4 -#define ONSCREEN_FILES_COUNT 5 /*----------------------------------------------------------------*/ -- cgit v1.2.3 From 456e0c584f2497b82b6be5f531f655b9681a11b8 Mon Sep 17 00:00:00 2001 From: Strangerke Date: Tue, 19 May 2015 20:07:24 +0200 Subject: SHERLOCK: Use a bit more MenuMode and SaveMode --- engines/sherlock/saveload.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'engines/sherlock/saveload.cpp') diff --git a/engines/sherlock/saveload.cpp b/engines/sherlock/saveload.cpp index 9848f8160f..c13d6dd9ee 100644 --- a/engines/sherlock/saveload.cpp +++ b/engines/sherlock/saveload.cpp @@ -260,12 +260,12 @@ void SaveManager::highlightButtons(int btnIndex) { screen.buttonPrint(Common::Point(ENV_POINTS[0][2], CONTROLS_Y), color, 1, "Exit"); - if ((btnIndex == 1) || ((_envMode == 1) && (btnIndex != 2))) + if ((btnIndex == 1) || ((_envMode == SAVEMODE_LOAD) && (btnIndex != 2))) screen.buttonPrint(Common::Point(ENV_POINTS[1][2], CONTROLS_Y), COMMAND_HIGHLIGHTED, true, "Load"); else screen.buttonPrint(Common::Point(ENV_POINTS[1][2], CONTROLS_Y), COMMAND_FOREGROUND, true, "Load"); - if ((btnIndex == 2) || ((_envMode == 2) && (btnIndex != 1))) + if ((btnIndex == 2) || ((_envMode == SAVEMODE_SAVE) && (btnIndex != 1))) screen.buttonPrint(Common::Point(ENV_POINTS[2][2], CONTROLS_Y), COMMAND_HIGHLIGHTED, true, "Save"); else screen.buttonPrint(Common::Point(ENV_POINTS[2][2], CONTROLS_Y), COMMAND_FOREGROUND, true, "Save"); -- cgit v1.2.3 From 46e85f389f4fb9f3d956c42e77345f79701d7a93 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 20 May 2015 21:15:33 -0400 Subject: SHERLOCK: Go to save mode when clicking empty save slot --- engines/sherlock/saveload.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'engines/sherlock/saveload.cpp') diff --git a/engines/sherlock/saveload.cpp b/engines/sherlock/saveload.cpp index c13d6dd9ee..077df7494f 100644 --- a/engines/sherlock/saveload.cpp +++ b/engines/sherlock/saveload.cpp @@ -401,7 +401,7 @@ bool SaveManager::promptForDescription(int slot) { screen.buttonPrint(Common::Point(ENV_POINTS[5][2], CONTROLS_Y), COMMAND_NULL, true, "Quit"); Common::String saveName = _savegames[slot]; - if (saveName.equalsIgnoreCase(EMPTY_SAVEGAME_SLOT)) { + if (isSlotEmpty(slot)) { // It's an empty slot, so start off with an empty save name saveName = ""; @@ -477,4 +477,8 @@ bool SaveManager::promptForDescription(int slot) { return done == 1; } +bool SaveManager::isSlotEmpty(int slot) const { + return _savegames[slot].equalsIgnoreCase(EMPTY_SAVEGAME_SLOT); +} + } // End of namespace Sherlock -- cgit v1.2.3 From feff241ef7bd4552d44d1e3fa7b3e16f259ca749 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 20 May 2015 21:18:49 -0400 Subject: SHERLOCK: Replace another ONSCREEN_FILES_COUNT value --- engines/sherlock/saveload.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'engines/sherlock/saveload.cpp') diff --git a/engines/sherlock/saveload.cpp b/engines/sherlock/saveload.cpp index 077df7494f..ddf4917a34 100644 --- a/engines/sherlock/saveload.cpp +++ b/engines/sherlock/saveload.cpp @@ -358,7 +358,7 @@ bool SaveManager::checkGameOnScreen(int slot) { Screen &screen = *_vm->_screen; // Check if it's already on-screen - if (slot != -1 && (slot < _savegameIndex || slot >= (_savegameIndex + 5))) { + if (slot != -1 && (slot < _savegameIndex || slot >= (_savegameIndex + ONSCREEN_FILES_COUNT))) { _savegameIndex = slot; screen._backBuffer1.fillRect(Common::Rect(3, CONTROLS_Y + 11, SHERLOCK_SCREEN_WIDTH - 2, -- cgit v1.2.3 From af2a1a33514ae101d1df52e6a978296ed0bef68b Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 7 Jun 2015 19:18:14 -0400 Subject: SHERLOCK: Refactoring, cleanup, and fixes for savegame code --- engines/sherlock/saveload.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) (limited to 'engines/sherlock/saveload.cpp') diff --git a/engines/sherlock/saveload.cpp b/engines/sherlock/saveload.cpp index ddf4917a34..c0f1bf1da1 100644 --- a/engines/sherlock/saveload.cpp +++ b/engines/sherlock/saveload.cpp @@ -153,7 +153,9 @@ SaveStateList SaveManager::getSavegameList(const Common::String &target) { Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(*file); if (in) { - readSavegameHeader(in, header); + if (!readSavegameHeader(in, header)) + continue; + saveList.push_back(SaveStateDescriptor(slot, header._saveName)); header._thumbnail->free(); @@ -176,7 +178,7 @@ bool SaveManager::readSavegameHeader(Common::InSaveFile *in, SherlockSavegameHea return false; header._version = in->readByte(); - if (header._version > SHERLOCK_SAVEGAME_VERSION) + if (header._version < MINIMUM_SAVEGAME_VERSION || header._version > CURRENT_SAVEGAME_VERSION) return false; // Read in the string @@ -204,7 +206,7 @@ void SaveManager::writeSavegameHeader(Common::OutSaveFile *out, SherlockSavegame // Write out a savegame header out->write(SAVEGAME_STR, SAVEGAME_STR_SIZE + 1); - out->writeByte(SHERLOCK_SAVEGAME_VERSION); + out->writeByte(CURRENT_SAVEGAME_VERSION); // Write savegame name out->write(header._saveName.c_str(), header._saveName.size()); @@ -302,7 +304,8 @@ void SaveManager::loadGame(int slot) { } // Synchronize the savegame data - Common::Serializer s(saveFile, nullptr); + Serializer s(saveFile, nullptr); + s.setSaveVersion(header._version); synchronize(s); delete saveFile; @@ -317,7 +320,8 @@ void SaveManager::saveGame(int slot, const Common::String &name) { writeSavegameHeader(out, header); // Synchronize the savegame data - Common::Serializer s(nullptr, out); + Serializer s(nullptr, out); + s.setSaveVersion(CURRENT_SAVEGAME_VERSION); synchronize(s); out->finalize(); @@ -328,7 +332,7 @@ Common::String SaveManager::generateSaveName(int slot) { return Common::String::format("%s.%03d", _target.c_str(), slot); } -void SaveManager::synchronize(Common::Serializer &s) { +void SaveManager::synchronize(Serializer &s) { Inventory &inv = *_vm->_inventory; Journal &journal = *_vm->_journal; Map &map = *_vm->_map; -- cgit v1.2.3 From fc8177cdd3fd2470fe353b83daed6dd033e7b159 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 14 Jun 2015 23:24:38 +0200 Subject: SHERLOCK: 3DO: don't get palette for saving game makes it possible to save in the 3DO version --- engines/sherlock/saveload.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'engines/sherlock/saveload.cpp') diff --git a/engines/sherlock/saveload.cpp b/engines/sherlock/saveload.cpp index c0f1bf1da1..f00920577c 100644 --- a/engines/sherlock/saveload.cpp +++ b/engines/sherlock/saveload.cpp @@ -238,10 +238,15 @@ void SaveManager::createThumbnail() { delete _saveThumb; } - uint8 thumbPalette[PALETTE_SIZE]; - _vm->_screen->getPalette(thumbPalette); _saveThumb = new Graphics::Surface(); - ::createThumbnail(_saveThumb, (const byte *)_vm->_screen->getPixels(), SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT, thumbPalette); + + if (_vm->getPlatform() != Common::kPlatform3DO) { + uint8 thumbPalette[PALETTE_SIZE]; + _vm->_screen->getPalette(thumbPalette); + ::createThumbnail(_saveThumb, (const byte *)_vm->_screen->getPixels(), SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT, thumbPalette); + } else { + ::createThumbnailFromScreen(_saveThumb); + } } int SaveManager::getHighlightedButton() const { -- cgit v1.2.3 From 7e6539f400f0607e35b269dfb9e33459dc2e85cf Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 16 Jun 2015 10:02:32 +0300 Subject: SHERLOCK: Use IS_3DO in more places --- engines/sherlock/saveload.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'engines/sherlock/saveload.cpp') diff --git a/engines/sherlock/saveload.cpp b/engines/sherlock/saveload.cpp index f00920577c..c863f8c4ee 100644 --- a/engines/sherlock/saveload.cpp +++ b/engines/sherlock/saveload.cpp @@ -240,7 +240,7 @@ void SaveManager::createThumbnail() { _saveThumb = new Graphics::Surface(); - if (_vm->getPlatform() != Common::kPlatform3DO) { + if (!IS_3DO) { uint8 thumbPalette[PALETTE_SIZE]; _vm->_screen->getPalette(thumbPalette); ::createThumbnail(_saveThumb, (const byte *)_vm->_screen->getPixels(), SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT, thumbPalette); -- cgit v1.2.3 From 92ac962718b07e9b82199d39bb5ce970717da57d Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 25 Jun 2015 20:42:02 -0400 Subject: SHERLOCK: RT: Further split-off of Scalpel-specific code --- engines/sherlock/saveload.cpp | 233 ++---------------------------------------- 1 file changed, 9 insertions(+), 224 deletions(-) (limited to 'engines/sherlock/saveload.cpp') diff --git a/engines/sherlock/saveload.cpp b/engines/sherlock/saveload.cpp index c863f8c4ee..fae8196dc1 100644 --- a/engines/sherlock/saveload.cpp +++ b/engines/sherlock/saveload.cpp @@ -23,27 +23,26 @@ #include "sherlock/saveload.h" #include "sherlock/surface.h" #include "sherlock/sherlock.h" +#include "sherlock/scalpel/scalpel_saveload.h" #include "common/system.h" #include "graphics/scaler.h" #include "graphics/thumbnail.h" namespace Sherlock { -const int ENV_POINTS[6][3] = { - { 41, 80, 61 }, // Exit - { 81, 120, 101 }, // Load - { 121, 160, 141 }, // Save - { 161, 200, 181 }, // Up - { 201, 240, 221 }, // Down - { 241, 280, 261 } // Quit -}; - -static const char *const EMPTY_SAVEGAME_SLOT = "-EMPTY-"; +const char *const EMPTY_SAVEGAME_SLOT = "-EMPTY-"; static const char *const SAVEGAME_STR = "SHLK"; #define SAVEGAME_STR_SIZE 4 /*----------------------------------------------------------------*/ +SaveManager *SaveManager::init(SherlockEngine *vm, const Common::String &target) { + if (vm->getGameID() == GType_SerratedScalpel) + return new Scalpel::ScalpelSaveManager(vm, target); + else + return new SaveManager(vm, target); +} + SaveManager::SaveManager(SherlockEngine *vm, const Common::String &target) : _vm(vm), _target(target) { _saveThumb = nullptr; @@ -59,54 +58,6 @@ SaveManager::~SaveManager() { } } -void SaveManager::drawInterface() { - Screen &screen = *_vm->_screen; - UserInterface &ui = *_vm->_ui; - - // Create a list of savegame slots - createSavegameList(); - - screen._backBuffer1.fillRect(Common::Rect(0, CONTROLS_Y, SHERLOCK_SCREEN_WIDTH, CONTROLS_Y + 10), BORDER_COLOR); - screen._backBuffer1.fillRect(Common::Rect(0, CONTROLS_Y + 10, 2, SHERLOCK_SCREEN_HEIGHT), BORDER_COLOR); - screen._backBuffer1.fillRect(Common::Rect(318, CONTROLS_Y + 10, SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT), BORDER_COLOR); - screen._backBuffer1.fillRect(Common::Rect(0, 199, SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT), BORDER_COLOR); - screen._backBuffer1.fillRect(Common::Rect(2, CONTROLS_Y + 10, SHERLOCK_SCREEN_WIDTH - 2, SHERLOCK_SCREEN_HEIGHT - 2), INV_BACKGROUND); - - screen.makeButton(Common::Rect(ENV_POINTS[0][0], CONTROLS_Y, ENV_POINTS[0][1], CONTROLS_Y + 10), - ENV_POINTS[0][2] - screen.stringWidth("Exit") / 2, "Exit"); - screen.makeButton(Common::Rect(ENV_POINTS[1][0], CONTROLS_Y, ENV_POINTS[1][1], CONTROLS_Y + 10), - ENV_POINTS[1][2] - screen.stringWidth("Load") / 2, "Load"); - screen.makeButton(Common::Rect(ENV_POINTS[2][0], CONTROLS_Y, ENV_POINTS[2][1], CONTROLS_Y + 10), - ENV_POINTS[2][2] - screen.stringWidth("Save") / 2, "Save"); - screen.makeButton(Common::Rect(ENV_POINTS[3][0], CONTROLS_Y, ENV_POINTS[3][1], CONTROLS_Y + 10), - ENV_POINTS[3][2] - screen.stringWidth("Up") / 2, "Up"); - screen.makeButton(Common::Rect(ENV_POINTS[4][0], CONTROLS_Y, ENV_POINTS[4][1], CONTROLS_Y + 10), - ENV_POINTS[4][2] - screen.stringWidth("Down") / 2, "Down"); - screen.makeButton(Common::Rect(ENV_POINTS[5][0], CONTROLS_Y, ENV_POINTS[5][1], CONTROLS_Y + 10), - ENV_POINTS[5][2] - screen.stringWidth("Quit") / 2, "Quit"); - - if (!_savegameIndex) - screen.buttonPrint(Common::Point(ENV_POINTS[3][2], CONTROLS_Y), COMMAND_NULL, 0, "Up"); - - if (_savegameIndex == MAX_SAVEGAME_SLOTS - ONSCREEN_FILES_COUNT) - screen.buttonPrint(Common::Point(ENV_POINTS[4][2], CONTROLS_Y), COMMAND_NULL, 0, "Down"); - - for (int idx = _savegameIndex; idx < _savegameIndex + ONSCREEN_FILES_COUNT; ++idx) { - screen.gPrint(Common::Point(6, CONTROLS_Y + 11 + (idx - _savegameIndex) * 10), - INV_FOREGROUND, "%d.", idx + 1); - screen.gPrint(Common::Point(24, CONTROLS_Y + 11 + (idx - _savegameIndex) * 10), - INV_FOREGROUND, "%s", _savegames[idx].c_str()); - } - - if (!ui._slideWindows) { - screen.slamRect(Common::Rect(0, CONTROLS_Y, SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT)); - } else { - ui.summonWindow(); - } - - _envMode = SAVEMODE_NONE; -} - void SaveManager::createSavegameList() { Screen &screen = *_vm->_screen; @@ -249,49 +200,6 @@ void SaveManager::createThumbnail() { } } -int SaveManager::getHighlightedButton() const { - Common::Point pt = _vm->_events->mousePos(); - - for (int idx = 0; idx < 6; ++idx) { - if (pt.x > ENV_POINTS[idx][0] && pt.x < ENV_POINTS[idx][1] && pt.y > CONTROLS_Y - && pt.y < (CONTROLS_Y + 10)) - return idx; - } - - return -1; -} - -void SaveManager::highlightButtons(int btnIndex) { - Screen &screen = *_vm->_screen; - byte color = (btnIndex == 0) ? COMMAND_HIGHLIGHTED : COMMAND_FOREGROUND; - - screen.buttonPrint(Common::Point(ENV_POINTS[0][2], CONTROLS_Y), color, 1, "Exit"); - - if ((btnIndex == 1) || ((_envMode == SAVEMODE_LOAD) && (btnIndex != 2))) - screen.buttonPrint(Common::Point(ENV_POINTS[1][2], CONTROLS_Y), COMMAND_HIGHLIGHTED, true, "Load"); - else - screen.buttonPrint(Common::Point(ENV_POINTS[1][2], CONTROLS_Y), COMMAND_FOREGROUND, true, "Load"); - - if ((btnIndex == 2) || ((_envMode == SAVEMODE_SAVE) && (btnIndex != 1))) - screen.buttonPrint(Common::Point(ENV_POINTS[2][2], CONTROLS_Y), COMMAND_HIGHLIGHTED, true, "Save"); - else - screen.buttonPrint(Common::Point(ENV_POINTS[2][2], CONTROLS_Y), COMMAND_FOREGROUND, true, "Save"); - - if (btnIndex == 3 && _savegameIndex) - screen.buttonPrint(Common::Point(ENV_POINTS[3][2], CONTROLS_Y), COMMAND_HIGHLIGHTED, true, "Up"); - else - if (_savegameIndex) - screen.buttonPrint(Common::Point(ENV_POINTS[3][2], CONTROLS_Y), COMMAND_FOREGROUND, true, "Up"); - - if ((btnIndex == 4) && (_savegameIndex < MAX_SAVEGAME_SLOTS - 5)) - screen.buttonPrint(Common::Point(ENV_POINTS[4][2], CONTROLS_Y), COMMAND_HIGHLIGHTED, true, "Down"); - else if (_savegameIndex < (MAX_SAVEGAME_SLOTS - 5)) - screen.buttonPrint(Common::Point(ENV_POINTS[4][2], CONTROLS_Y), COMMAND_FOREGROUND, true, "Down"); - - color = (btnIndex == 5) ? COMMAND_HIGHLIGHTED : COMMAND_FOREGROUND; - screen.buttonPrint(Common::Point(ENV_POINTS[5][2], CONTROLS_Y), color, 1, "Quit"); -} - void SaveManager::loadGame(int slot) { Common::InSaveFile *saveFile = g_system->getSavefileManager()->openForLoading( generateSaveName(slot)); @@ -363,129 +271,6 @@ void SaveManager::synchronize(Serializer &s) { _justLoaded = true; } -bool SaveManager::checkGameOnScreen(int slot) { - Screen &screen = *_vm->_screen; - - // Check if it's already on-screen - if (slot != -1 && (slot < _savegameIndex || slot >= (_savegameIndex + ONSCREEN_FILES_COUNT))) { - _savegameIndex = slot; - - screen._backBuffer1.fillRect(Common::Rect(3, CONTROLS_Y + 11, SHERLOCK_SCREEN_WIDTH - 2, - SHERLOCK_SCREEN_HEIGHT - 1), INV_BACKGROUND); - - for (int idx = _savegameIndex; idx < (_savegameIndex + 5); ++idx) { - screen.gPrint(Common::Point(6, CONTROLS_Y + 11 + (idx - _savegameIndex) * 10), - INV_FOREGROUND, "%d.", idx + 1); - screen.gPrint(Common::Point(24, CONTROLS_Y + 11 + (idx - _savegameIndex) * 10), - INV_FOREGROUND, "%s", _savegames[idx].c_str()); - } - - screen.slamRect(Common::Rect(3, CONTROLS_Y + 11, 318, SHERLOCK_SCREEN_HEIGHT)); - - byte color = !_savegameIndex ? COMMAND_NULL : COMMAND_FOREGROUND; - screen.buttonPrint(Common::Point(ENV_POINTS[3][2], CONTROLS_Y), color, 1, "Up"); - - color = (_savegameIndex == (MAX_SAVEGAME_SLOTS - 5)) ? COMMAND_NULL : COMMAND_FOREGROUND; - screen.buttonPrint(Common::Point(ENV_POINTS[4][2], CONTROLS_Y), color, 1, "Down"); - - return true; - } - - return false; -} - -bool SaveManager::promptForDescription(int slot) { - Events &events = *_vm->_events; - Scene &scene = *_vm->_scene; - Screen &screen = *_vm->_screen; - Talk &talk = *_vm->_talk; - int xp, yp; - bool flag = false; - - screen.buttonPrint(Common::Point(ENV_POINTS[0][2], CONTROLS_Y), COMMAND_NULL, true, "Exit"); - screen.buttonPrint(Common::Point(ENV_POINTS[1][2], CONTROLS_Y), COMMAND_NULL, true, "Load"); - screen.buttonPrint(Common::Point(ENV_POINTS[2][2], CONTROLS_Y), COMMAND_NULL, true, "Save"); - screen.buttonPrint(Common::Point(ENV_POINTS[3][2], CONTROLS_Y), COMMAND_NULL, true, "Up"); - screen.buttonPrint(Common::Point(ENV_POINTS[4][2], CONTROLS_Y), COMMAND_NULL, true, "Down"); - screen.buttonPrint(Common::Point(ENV_POINTS[5][2], CONTROLS_Y), COMMAND_NULL, true, "Quit"); - - Common::String saveName = _savegames[slot]; - if (isSlotEmpty(slot)) { - // It's an empty slot, so start off with an empty save name - saveName = ""; - - yp = CONTROLS_Y + 12 + (slot - _savegameIndex) * 10; - screen.vgaBar(Common::Rect(24, yp, 85, yp + 9), INV_BACKGROUND); - } - - screen.print(Common::Point(6, CONTROLS_Y + 12 + (slot - _savegameIndex) * 10), TALK_FOREGROUND, "%d.", slot + 1); - screen.print(Common::Point(24, CONTROLS_Y + 12 + (slot - _savegameIndex) * 10), TALK_FOREGROUND, "%s", saveName.c_str()); - xp = 24 + screen.stringWidth(saveName); - yp = CONTROLS_Y + 12 + (slot - _savegameIndex) * 10; - - int done = 0; - do { - while (!_vm->shouldQuit() && !events.kbHit()) { - scene.doBgAnim(); - - if (talk._talkToAbort) - return false; - - // Allow event processing - events.pollEventsAndWait(); - events.setButtonState(); - - flag = !flag; - if (flag) - screen.vgaBar(Common::Rect(xp, yp - 1, xp + 8, yp + 9), INV_FOREGROUND); - else - screen.vgaBar(Common::Rect(xp, yp - 1, xp + 8, yp + 9), INV_BACKGROUND); - } - if (_vm->shouldQuit()) - return false; - - // Get the next keypress - Common::KeyState keyState = events.getKey(); - - if (keyState.keycode == Common::KEYCODE_BACKSPACE && saveName.size() > 0) { - // Delete character of save name - screen.vgaBar(Common::Rect(xp - screen.charWidth(saveName.lastChar()), yp - 1, - xp + 8, yp + 9), INV_BACKGROUND); - xp -= screen.charWidth(saveName.lastChar()); - screen.vgaBar(Common::Rect(xp, yp - 1, xp + 8, yp + 9), INV_FOREGROUND); - saveName.deleteLastChar(); - - } else if (keyState.keycode == Common::KEYCODE_RETURN && saveName.compareToIgnoreCase(EMPTY_SAVEGAME_SLOT)) { - done = 1; - - } else if (keyState.keycode == Common::KEYCODE_ESCAPE) { - screen.vgaBar(Common::Rect(xp, yp - 1, xp + 8, yp + 9), INV_BACKGROUND); - done = -1; - - } else if (keyState.ascii >= ' ' && keyState.ascii <= 'z' && saveName.size() < 50 - && (xp + screen.charWidth(keyState.ascii)) < 308) { - char c = (char)keyState.ascii; - - screen.vgaBar(Common::Rect(xp, yp - 1, xp + 8, yp + 9), INV_BACKGROUND); - screen.print(Common::Point(xp, yp), TALK_FOREGROUND, "%c", c); - xp += screen.charWidth(c); - screen.vgaBar(Common::Rect(xp, yp - 1, xp + 8, yp + 9), INV_FOREGROUND); - saveName += c; - } - } while (!done); - - if (done == 1) { - // Enter key perssed - _savegames[slot] = saveName; - } else { - done = 0; - _envMode = SAVEMODE_NONE; - highlightButtons(-1); - } - - return done == 1; -} - bool SaveManager::isSlotEmpty(int slot) const { return _savegames[slot].equalsIgnoreCase(EMPTY_SAVEGAME_SLOT); } -- cgit v1.2.3