aboutsummaryrefslogtreecommitdiff
path: root/engines/sherlock/saveload.cpp
diff options
context:
space:
mode:
authorPaul Gilbert2015-06-25 20:42:02 -0400
committerPaul Gilbert2015-06-25 20:42:02 -0400
commit92ac962718b07e9b82199d39bb5ce970717da57d (patch)
tree88e8833f5ef8d100c32cda7a0c5cd18051a2308a /engines/sherlock/saveload.cpp
parent66fb4b828ba841b47b3e0cd4e15e00107744f691 (diff)
downloadscummvm-rg350-92ac962718b07e9b82199d39bb5ce970717da57d.tar.gz
scummvm-rg350-92ac962718b07e9b82199d39bb5ce970717da57d.tar.bz2
scummvm-rg350-92ac962718b07e9b82199d39bb5ce970717da57d.zip
SHERLOCK: RT: Further split-off of Scalpel-specific code
Diffstat (limited to 'engines/sherlock/saveload.cpp')
-rw-r--r--engines/sherlock/saveload.cpp233
1 files changed, 9 insertions, 224 deletions
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);
}