diff options
Diffstat (limited to 'engines/parallaction/loadsave.cpp')
-rw-r--r-- | engines/parallaction/loadsave.cpp | 531 |
1 files changed, 531 insertions, 0 deletions
diff --git a/engines/parallaction/loadsave.cpp b/engines/parallaction/loadsave.cpp new file mode 100644 index 0000000000..2cfa7c388e --- /dev/null +++ b/engines/parallaction/loadsave.cpp @@ -0,0 +1,531 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2006 The ScummVM project + * + * 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 "parallaction/parallaction.h" +#include "parallaction/disk.h" +#include "parallaction/inventory.h" +#include "parallaction/graphics.h" +#include "parallaction/zone.h" + +#include "common/savefile.h" + +namespace Parallaction { + + +extern char _gameNames[][20]; + +void Parallaction::doLoadGame(uint16 _di) { + + _introSarcData3 = 200; + _introSarcData2 = 1; + + char filename[PATH_LEN]; + sprintf(filename, "game.%d", _di); + + Common::InSaveFile *f = _saveFileMan->openForLoading(filename); + if (!f) return; + + f->readLine(_vm->_characterName, 15); + f->readLine(_location, 15); + + strcat(_location, "."); + + char s[20]; + f->readLine(s, 15); + _firstPosition._x = atoi(s); + + f->readLine(s, 15); + _firstPosition._y = atoi(s); + + f->readLine(s, 15); + _score = atoi(s); + + f->readLine(s, 15); + _commandFlags = atoi(s); + + f->readLine(s, 15); + + _engineFlags |= kEngineQuit; + freeZones(_zones._next); + freeNodeList(_zones._next); + _zones._next = NULL; + _engineFlags &= ~kEngineQuit; + + _numLocations = atoi(s); + + uint16 _si; + for (_si = 0; _si < _numLocations; _si++) { + f->readLine(s, 20); + s[strlen(s)] = '\0'; + + strcpy(_locationNames[_si], s); + + f->readLine(s, 15); + _localFlags[_si] = atoi(s); + } + _locationNames[_si][0] = '\0'; + + for (_si = 0; _si < 30; _si++) { + f->readLine(s, 15); + _inventory[_si]._id = atoi(s); + + f->readLine(s, 15); + _inventory[_si]._index = atoi(s); + } + + delete f; + + _engineFlags &= ~kEngineMiniDonna; + if (!scumm_stricmp(_vm->_characterName, "donnatras")) { + _engineFlags |= kEngineMiniDonna; + strcpy(_vm->_characterName, "donna"); + } + if (!scumm_stricmp(_vm->_characterName, "minidonnatras")) { + _engineFlags |= kEngineMiniDonna; + strcpy(_vm->_characterName, "minidonna"); + } + + if (_vm->_characterName[0] == 'm') { + strcpy(filename, _vm->_characterName+4); + } else { + strcpy(filename, _vm->_characterName); + } + strcat(filename, ".tab"); + freeTable(_objectsNames); + initTable(filename, _objectsNames); + + refreshInventory(_vm->_characterName); + + parseLocation("common"); + closeArchive(); + + strcat(_location, _vm->_characterName); + _engineFlags |= kEngineChangeLocation; + + printf("game loaded: character %s, location %s\n", _vm->_characterName, _location); +// getch(); + + return; +} + + + + +// FIXME: implements this (select a file slot for load/save) +int16 selectSaveFile(uint16 arg_0) { + return 0; +} + + + +void Parallaction::loadGame() { + + bool marks[10]; + _saveFileMan->listSavefiles("game.", marks, 10); + + int16 _di = selectSaveFile( 0 ); + if (_di > 10) return; + + doLoadGame(_di); + + return; +} + +void Parallaction::doSaveGame(uint16 _di) { + + char path[PATH_LEN]; + sprintf(path, "game.%d", _di); + + Common::OutSaveFile *f = _saveFileMan->openForSaving(path); + + char s[30]; + + if (_engineFlags & kEngineMiniDonna) { + sprintf(s, "%stras\n", _vm->_characterName); + } else { + sprintf(s, "%s\n", _vm->_characterName); + } + f->writeString(s); + + sprintf(s, "%s\n", _saveData1); + f->writeString(s); + sprintf(s, "%d\n", _yourself._zone.pos._position._x); + f->writeString(s); + sprintf(s, "%d\n", _yourself._zone.pos._position._y); + f->writeString(s); + sprintf(s, "%d\n", _score); + f->writeString(s); + sprintf(s, "%uld\n", _commandFlags); + f->writeString(s); + + sprintf(s, "%d\n", _numLocations); + f->writeString(s); + for (uint16 _si = 0; _si < _numLocations; _si++) { + sprintf(s, "%s\n%uld\n", _locationNames[_si], _localFlags[_si]); + f->writeString(s); + } + + for (uint16 _si = 0; _si < 30; _si++) { + sprintf(s, "%uld\n%d\n", _inventory[_si]._id, _inventory[_si]._index); + f->writeString(s); + } + + delete f; + + refreshInventory(_vm->_characterName); + + return; + + +} + +// FIXME: only to be implemented for text mode selection +void textModeFunc1( char *) { + +} + + + +void Parallaction::saveGame() { + +// strcpy(v30, asc_1C91A); + + if (!scumm_stricmp(_location, "caveau")) return; + + bool marks[10]; + _saveFileMan->listSavefiles("game.", marks, 10); + + int16 _di = selectSaveFile( 1 ); + if (_di > 10) return; + + + printf("saving game %i...", _di); + doSaveGame(_di); + printf("done\n"); +// getch(); + + return; + + +} + +#if 0 +int16 selectSaveFile(uint16 arg_0) { + + REGISTERS pregs; + pregs._ax = (void*)(uint32)dos_videomode; + int86(0x10, &pregs); + +// window(0 ,0, 23, 79); + puts(" FILE NAME "); + + if (arg_0 != 0) { + printf("(Use \x18 \x19 \x10 to edit then press enter)\n\n"); + } else { + puts("\n"); + } + + uint16 _si; + for (_si = 0; _si < 11; _si++) { + printf(" %s \n", _gameNames[_si]); + } + + int16 _di = editSaveFileName(3, 13, 0, 12, 1, arg_0); + + pregs._ax = (void*)0x93; + int86(0x10, &pregs); + + set_vga_mode_x(0); + byte palette[PALETTE_SIZE]; + _vm->_graphics->getBlackPalette(palette); + _vm->_graphics->setPalette(palette); + + + _vm->_graphics->copyScreen(Graphics::kBit2, Graphics::kBitBack); + _vm->_graphics->copyScreen(Graphics::kBitBack, Graphics::kBitFront); + + if (arg_0 != 0) { + _vm->_graphics->setPalette(_palette); + } + + _vm->_graphics->swapBuffers(); + + return _si; +} + +int16 editSaveFileName(uint16 arg_0, uint16 arg_2, uint16 arg_4, uint16 arg_6, uint16 arg_8, uint16 arg_A) { + uint16 _di = arg_0; + uint16 _si = _di; + uint16 v4 = _di; + uint16 v1 = 0; + + do { + + set_cursor(_si, arg_4); + + while (v1 == 0) { + int16 v6 = get_kb(); + byte _al = v6 & 0xFF; + if (_al == 0) { + + _al = (v6 & 0xFF00) >> 8; + if (_al == 'H') { + if (_si<=_di) + _si = arg_2; + else + _si = _si - arg_8; + + v1 = 1; + } else + if (_al == 'M') { + + } else + if (_al == 'P') { + if (_si>=arg_2) + _si = _di; + else + _si = _si + arg_8; + + v1 = 1; + } + + if (_si != 0xD && arg_A != 0) { + + set_cursor(_si, arg_4+1); + v1 = 1; + textModeFunc1( _gameNames[(_si - _di)/arg_8] ); + + return (_si - _di)/arg_8 + 1; + + } + + } else + if (_al == 0xD) return (_si - _di)/arg_8 + 1; + } + + v1 = 0; + set_cursor(v4, arg_4); + v4 = _si; + + } while (true); + + return 0; + +} +#endif + +#if 0 +void loadGame() { + + uint16 v6 = 0; + uint16 v4 = 0; + uint16 v2 = 0; + uint16 _bx; + + FILE* stream = fopen("savegame", "r"); + if (stream) { + for (uint16 _si = 0; _si < 10; _si++) { + fgets(_gameNames[_si], 18, stream); + _bx = strlen(_gameNames[_si]) - 1; + _gameNames[_si][_bx] = '\0'; + } + fclose(stream); + } + + int16 _di = selectSaveFile( 0 ); + if (_di > 10) return; + + _introSarcData3 = 200; + _introSarcData2 = 1; + _moveSarcExaZones[0] = 0; + _moveSarcZones[0] = 0; + + char filename[PATH_LEN]; + sprintf(filename, "game.%d", _di); + stream = fopen(filename, "r"); + if (!stream) return; + + fgets(_vm->_characterName, 15, stream); + _vm->_characterName[strlen(_vm->_characterName)] = '\0'; + + fgets(_location, 15, stream); + _location[strlen(_location)] = '.'; + + char s[20]; + fgets(s, 15, stream); + _firstPosition._x = atoi(s); + + fgets(s, 15, stream); + _firstPosition._y = atoi(s); + + fgets(s, 15, stream); + _score = atoi(s); + + fgets(s, 15, stream); + _commandFlags = atoi(s); + + fgets(s, 15, stream); + + _engineFlags |= kEngineQuit; + freeZones(_zones._next); + freeNodeList(_zones._next); + _zones._next = NULL; + _engineFlags &= ~kEngineQuit; + + _numLocations = atoi(s); + + uint16 _si; + for (_si = 0; _si < _numLocations; _si++) { + fgets(s, 20, stream); + s[strlen(s)] = '\0'; + + strcpy(_locationNames[_si], s); + + fgets(s, 15, stream); + _localFlags[_si] = atoi(s); + } + _locationNames[_si] = '\0'; + + for (_si = 0; _si < 30; _si++) { + fgets(s, 15, stream); + _inventory[_si]._id = atoi(s); + + fgets(s, 15, stream); + _inventory[_si]._index = atoi(s); + } + + fclose(stream); + + _engineFlags &= ~kEngineMiniDonna; + if (!scumm_stricmp(_vm->_characterName, "donnatras")) { + _engineFlags |= kEngineMiniDonna; + strcpy(_vm->_characterName, "donna"); + } + if (!scumm_stricmp(_vm->_characterName, "minidonnatras")) { + _engineFlags |= kEngineMiniDonna; + strcpy(_vm->_characterName, "minidonna"); + } + + if (_vm->_characterName[0] == 'm') { + strcpy(filename, _vm->_characterName+4); + } else { + strcpy(filename, _vm->_characterName); + } + strcat(filename, ".tab"); + freeTable(_objectsNames); + initTable(filename, _objectsNames); + + refreshInventory(); + + parseLocation("common"); + closeArchive(); + + strcat(_location, _vm->_characterName); + _engineFlags |= kEngineChangeLocation; + + return; +} + + +int16 get_kb() { + + REGISTERS pregs; + pregs._ax = 0; + int86(0x16, &pregs); + + return (int16)(int32)pregs._ax; + +} + + +#endif + +#if 0 +void saveGame() { + +// strcpy(v30, asc_1C91A); + uint16 v8 = 0, v6 = 0; + int16 v4 = -1; + int16 v2 = 0; + + if (!scumm_stricmp(_location, "caveau")) return; + + FILE* stream = fopen("savegame", "r"); + if (stream) { + for (uint16 _si = 0; _si < 10; _si++) { + fgets(_gameNames[_si], 18, stream); + uint16 _bx = strlen(_gameNames[_si]) - 1; + _gameNames[_si][_bx] = '\0'; + } + fclose(stream); + } + + int16 _di = selectSaveFile( 1 ); + if (_di > 10) return; + + stream = fopen("savegame", "w"); + if (stream) { + for (uint16 _si = 0; _si < 10; _si++) { + fputs(_gameNames[_si], stream); + fputs("\n", stream); + } + fclose(stream); + } + + char path[PATH_LEN]; + sprintf(path, "game.%d", _di); + stream = fopen(path, "w"); + if (!stream) return; + + if (_engineFlags & kEngineMiniDonna) { + fprintf(stream, "%stras\n", _vm->_characterName); + } else { + fprintf(stream, "%s\n", _vm->_characterName); + } + + fprintf(stream, "%s\n", _saveData1); + fprintf(stream, "%d\n", _yourself._zone.pos._position._x); + fprintf(stream, "%d\n", _yourself._zone.pos._position._y); + fprintf(stream, "%d\n", _score); + fprintf(stream, "%ld\n", _commandFlags); + + fprintf(stream, "%d\n", _numLocations); + for (uint16 _si = 0; _si < _numLocations; _si++) { + fprintf(stream, "%s\n%ld\n", _locationNames[_si], _localFlags[_si]); + } + + for (uint16 _si = 0; _si < 30; _si++) { + fprintf(stream, "%ld\n%d\n", _inventory[_si]._id, _inventory[_si]._index); + } + + fclose(stream); + + refreshInventory(); + + return; +} +#endif + + + +} // namespace Parallaction |