diff options
author | Vicent Marti | 2008-06-14 14:44:29 +0000 |
---|---|---|
committer | Vicent Marti | 2008-06-14 14:44:29 +0000 |
commit | d0b27cf9c66b9281899acf826cb205e19dcb7260 (patch) | |
tree | 74e813b1d1f081f35f41ca7a95da5d048951b9e7 /engines/drascula/saveload.cpp | |
parent | d51a0cab3fe494698f001d81d5d86cea7cd0395b (diff) | |
parent | 91d3ea31359950b59ee46af8355cc0f5790257e5 (diff) | |
download | scummvm-rg350-d0b27cf9c66b9281899acf826cb205e19dcb7260.tar.gz scummvm-rg350-d0b27cf9c66b9281899acf826cb205e19dcb7260.tar.bz2 scummvm-rg350-d0b27cf9c66b9281899acf826cb205e19dcb7260.zip |
Merged trunk into the GUI branch.
Fixed MSVS9 project files.
svn-id: r32702
Diffstat (limited to 'engines/drascula/saveload.cpp')
-rw-r--r-- | engines/drascula/saveload.cpp | 255 |
1 files changed, 255 insertions, 0 deletions
diff --git a/engines/drascula/saveload.cpp b/engines/drascula/saveload.cpp new file mode 100644 index 0000000000..de82899462 --- /dev/null +++ b/engines/drascula/saveload.cpp @@ -0,0 +1,255 @@ +/* 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. + * + * $URL$ + * $Id$ + * + */ + +#include "drascula/drascula.h" + +namespace Drascula { + +bool DrasculaEngine::saveLoadScreen() { + char names[10][23]; + char file[50]; + char fileEpa[50]; + int n, n2, num_sav = 0, y = 27; + Common::InSaveFile *sav; + + clearRoom(); + + snprintf(fileEpa, 50, "%s.epa", _targetName.c_str()); + if (!(sav = _saveFileMan->openForLoading(fileEpa))) { + Common::OutSaveFile *epa; + if (!(epa = _saveFileMan->openForSaving(fileEpa))) + error("Can't open %s file", fileEpa); + for (n = 0; n < NUM_SAVES; n++) + epa->writeString("*\n"); + epa->finalize(); + delete epa; + if (!(sav = _saveFileMan->openForLoading(fileEpa))) { + error("Can't open %s file", fileEpa); + } + } + for (n = 0; n < NUM_SAVES; n++) + sav->readLine(names[n], 23); + delete sav; + + loadPic("savescr.alg", bgSurface, HALF_PAL); + + color_abc(kColorLightGreen); + + select[0] = 0; + + for (;;) { + y = 27; + copyBackground(0, 0, 0, 0, 320, 200, bgSurface, screenSurface); + for (n = 0; n < NUM_SAVES; n++) { + print_abc(names[n], 116, y); + y = y + 9; + } + print_abc(select, 117, 15); + setCursorTable(); + updateScreen(); + y = 27; + + updateEvents(); + + if (leftMouseButton == 1) { + delay(50); + for (n = 0; n < NUM_SAVES; n++) { + if (mouseX > 115 && mouseY > y + (9 * n) && mouseX < 115 + 175 && mouseY < y + 10 + (9 * n)) { + strcpy(select, names[n]); + + if (strcmp(select, "*")) + selectionMade = 1; + else { + enterName(); + strcpy(names[n], select); + if (selectionMade == 1) { + snprintf(file, 50, "%s%02d", _targetName.c_str(), n + 1); + saveGame(file); + Common::OutSaveFile *tsav; + if (!(tsav = _saveFileMan->openForSaving(fileEpa))) { + error("Can't open %s file", fileEpa); + } + for (n = 0; n < NUM_SAVES; n++) { + tsav->writeString(names[n]); + tsav->writeString("\n"); + } + tsav->finalize(); + delete tsav; + } + } + + print_abc(select, 117, 15); + y = 27; + for (n2 = 0; n2 < NUM_SAVES; n2++) { + print_abc(names[n2], 116, y); + y = y + 9; + } + if (selectionMade == 1) { + snprintf(file, 50, "%s%02d", _targetName.c_str(), n + 1); + } + num_sav = n; + } + } + + if (mouseX > 117 && mouseY > 15 && mouseX < 295 && mouseY < 24 && selectionMade == 1) { + enterName(); + strcpy(names[num_sav], select); + print_abc(select, 117, 15); + y = 27; + for (n2 = 0; n2 < NUM_SAVES; n2++) { + print_abc(names[n2], 116, y); + y = y + 9; + } + + if (selectionMade == 1) { + snprintf(file, 50, "%s%02d", _targetName.c_str(), n + 1); + saveGame(file); + Common::OutSaveFile *tsav; + if (!(tsav = _saveFileMan->openForSaving(fileEpa))) { + error("Can't open %s file", fileEpa); + } + for (n = 0; n < NUM_SAVES; n++) { + tsav->writeString(names[n]); + tsav->writeString("\n"); + } + tsav->finalize(); + delete tsav; + } + } + + if (mouseX > 125 && mouseY > 123 && mouseX < 199 && mouseY < 149 && selectionMade == 1) { + if (!loadGame(file)) + return false; + break; + } else if (mouseX > 208 && mouseY > 123 && mouseX < 282 && mouseY < 149 && selectionMade == 1) { + saveGame(file); + Common::OutSaveFile *tsav; + if (!(tsav = _saveFileMan->openForSaving(fileEpa))) { + error("Can't open %s file", fileEpa); + } + for (n = 0; n < NUM_SAVES; n++) { + tsav->writeString(names[n]); + tsav->writeString("\n"); + } + tsav->finalize(); + delete tsav; + } else if (mouseX > 168 && mouseY > 154 && mouseX < 242 && mouseY < 180) + break; + else if (selectionMade == 0) { + print_abc("Please select a slot", 117, 15); + } + updateScreen(); + delay(200); + } + y = 26; + + delay(5); + } + + clearRoom(); + loadPic(roomNumber, bgSurface, HALF_PAL); + selectionMade = 0; + + return true; +} + +bool DrasculaEngine::loadGame(const char *gameName) { + int l, savedChapter, roomNum = 0; + Common::InSaveFile *sav; + + previousMusic = roomMusic; + menuScreen = 0; + if (currentChapter != 1) + clearRoom(); + + if (!(sav = _saveFileMan->openForLoading(gameName))) { + error("missing savegame file"); + } + + savedChapter = sav->readSint32LE(); + if (savedChapter != currentChapter) { + strcpy(saveName, gameName); + currentChapter = savedChapter - 1; + hay_que_load = 1; + return false; + } + sav->read(currentData, 20); + curX = sav->readSint32LE(); + curY = sav->readSint32LE(); + trackProtagonist = sav->readSint32LE(); + + for (l = 1; l < 43; l++) { + inventoryObjects[l] = sav->readSint32LE(); + } + + for (l = 0; l < NUM_FLAGS; l++) { + flags[l] = sav->readSint32LE(); + } + + takeObject = sav->readSint32LE(); + pickedObject = sav->readSint32LE(); + hay_que_load = 0; + sscanf(currentData, "%d.ald", &roomNum); + enterRoom(roomNum); + withoutVerb(); + + return true; +} + +void DrasculaEngine::saveGame(char gameName[]) { + Common::OutSaveFile *out; + int l; + + if (!(out = _saveFileMan->openForSaving(gameName))) { + error("Unable to open the file"); + } + out->writeSint32LE(currentChapter); + out->write(currentData, 20); + out->writeSint32LE(curX); + out->writeSint32LE(curY); + out->writeSint32LE(trackProtagonist); + + for (l = 1; l < 43; l++) { + out->writeSint32LE(inventoryObjects[l]); + } + + for (l = 0; l < NUM_FLAGS; l++) { + out->writeSint32LE(flags[l]); + } + + out->writeSint32LE(takeObject); + out->writeSint32LE(pickedObject); + + out->finalize(); + if (out->ioFailed()) + warning("Can't write file '%s'. (Disk full?)", gameName); + + delete out; + + playSound(99); + finishSound(); +} + +} // End of namespace Drascula |