diff options
author | Gregory Montoir | 2004-01-12 13:40:02 +0000 |
---|---|---|
committer | Gregory Montoir | 2004-01-12 13:40:02 +0000 |
commit | 95de2117a20da3b9828a385b4a6713e4d9524aa8 (patch) | |
tree | 6b13647be7a0340bc5c7227208a2880d890666e5 /queen/logic.cpp | |
parent | a685422a138c99af7f95f8deaf787425af356f9b (diff) | |
download | scummvm-rg350-95de2117a20da3b9828a385b4a6713e4d9524aa8.tar.gz scummvm-rg350-95de2117a20da3b9828a385b4a6713e4d9524aa8.tar.bz2 scummvm-rg350-95de2117a20da3b9828a385b4a6713e4d9524aa8.zip |
New save/load code, this *breaks* compatiblity with the previous
savefile format. Use the 'qsc' tool to convert your old files
(http://0x.7fc1.org/fotaq/qsc.[cpp|exe]).
svn-id: r12339
Diffstat (limited to 'queen/logic.cpp')
-rw-r--r-- | queen/logic.cpp | 141 |
1 files changed, 40 insertions, 101 deletions
diff --git a/queen/logic.cpp b/queen/logic.cpp index 64b25fc29f..03a6c1de9f 100644 --- a/queen/logic.cpp +++ b/queen/logic.cpp @@ -1335,35 +1335,15 @@ void Logic::update() { } -bool Logic::gameSave(uint16 slot, const char *desc) { - if (!desc) //no description entered - return false; - - debug(3, "Saving game to slot %d", slot); - - int i, j; - char *buf = new char[32]; - memcpy(buf, desc, strlen(desc) < 32 ? strlen(desc) : 32); - for (i = strlen(desc); i < 32; i++) - buf[i] = '\0'; - byte *saveData = new byte[SAVEGAME_SIZE]; - byte *ptr = saveData; - memcpy(ptr, buf, 32); ptr += 32; - delete[] buf; - - WRITE_BE_UINT16(ptr, _vm->talkSpeed()); ptr += 2; - WRITE_BE_UINT16(ptr, 0 /*_settings.musicVolume*/); ptr += 2; - WRITE_BE_UINT16(ptr, _vm->sound()->sfxOn() ? 1 : 0); ptr += 2; - WRITE_BE_UINT16(ptr, _vm->sound()->speechOn() ? 1 : 0); ptr += 2; - WRITE_BE_UINT16(ptr, _vm->sound()->musicOn() ? 1 : 0); ptr += 2; - WRITE_BE_UINT16(ptr, _vm->subtitles() ? 1 : 0); ptr += 2; - +void Logic::saveState(byte *&ptr) { + uint16 i; for (i = 0; i < 4; i++) { WRITE_BE_UINT16(ptr, _inventoryItem[i]); ptr += 2; } - + WRITE_BE_UINT16(ptr, _vm->graphics()->bob(0)->x); ptr += 2; WRITE_BE_UINT16(ptr, _vm->graphics()->bob(0)->y); ptr += 2; + WRITE_BE_UINT16(ptr, _currentRoom); ptr += 2; for (i = 1; i <= _numObjects; i++) @@ -1373,61 +1353,26 @@ bool Logic::gameSave(uint16 slot, const char *desc) { _itemData[i].writeToBE(ptr); for (i = 0; i < GAME_STATE_COUNT; i++) { - WRITE_BE_UINT16(ptr, gameState(i)); ptr += 2; + WRITE_BE_UINT16(ptr, _gameState[i]); ptr += 2; } - - for (i = 1; i <= _numRooms; i++) - for (j = 1; j <= _vm->grid()->areaMax(i); j++) - _vm->grid()->area(i, j)->writeToBE(ptr); - + for (i = 0; i < TALK_SELECTED_COUNT; i++) - _talkSelected[i].writeToBE(ptr); + _talkSelected[i].writeToBE(ptr); for (i = 1; i <= _numWalkOffs; i++) _walkOffData[i].writeToBE(ptr); WRITE_BE_UINT16(ptr, _joe.facing); ptr += 2; - WRITE_BE_UINT16(ptr, _vm->bam()->_flag); ptr += 2; - WRITE_BE_UINT16(ptr, _vm->sound()->lastOverride()); ptr += 2; - - //TODO: lastmerge, lastalter, altmrgpri - for (i = 0; i < 3; i++) { - WRITE_BE_UINT16(ptr, 0); ptr += 2; - } - // TOADD: - // Logic::_puzzleAttemptCount - // Logic::_objectDescription - if ((ptr - saveData) != SAVEGAME_SIZE) { - delete[] saveData; - return false; - } - - bool result = _vm->resource()->writeSave(slot, saveData, SAVEGAME_SIZE); - delete[] saveData; - - return result; + // V1 + WRITE_BE_UINT16(ptr, _puzzleAttemptCount); ptr += 2; + for (i = 1; i <= _numObjDesc; i++) + _objectDescription[i].writeToBE(ptr); } -bool Logic::gameLoad(uint16 slot) { - int i, j; - byte *saveData = new byte[SAVEGAME_SIZE]; - byte *ptr = saveData; - if (!_vm->resource()->readSave(slot, saveData)) { - warning("Couldn't load savegame from slot %d", slot); - delete[] saveData; - return false; - } - - debug(3, "Loading game from slot %d", slot); - ptr += 32; //skip description - /*_talkSpeed = (int16)READ_BE_UINT16(ptr);*/ ptr += 2; - /*_settings.musicVolume = (int16)READ_BE_UINT16(ptr);*/ ptr += 2; - _vm->sound()->sfxToggle(READ_BE_UINT16(ptr) != 0); ptr += 2; - _vm->sound()->speechToggle(READ_BE_UINT16(ptr) != 0); ptr += 2; - _vm->sound()->musicToggle(READ_BE_UINT16(ptr) != 0); ptr += 2; - _vm->subtitles(READ_BE_UINT16(ptr) != 0); ptr += 2; +void Logic::loadState(uint32 ver, byte *&ptr) { + uint16 i; for (i = 0; i < 4; i++) { _inventoryItem[i] = (int16)READ_BE_UINT16(ptr); ptr += 2; } @@ -1435,8 +1380,8 @@ bool Logic::gameLoad(uint16 slot) { _joe.x = (int16)READ_BE_UINT16(ptr); ptr += 2; _joe.y = (int16)READ_BE_UINT16(ptr); ptr += 2; - currentRoom(READ_BE_UINT16(ptr)); ptr += 2; - + _currentRoom = READ_BE_UINT16(ptr); ptr += 2; + for (i = 1; i <= _numObjects; i++) _objectData[i].readFromBE(ptr); @@ -1444,64 +1389,58 @@ bool Logic::gameLoad(uint16 slot) { _itemData[i].readFromBE(ptr); for (i = 0; i < GAME_STATE_COUNT; i++) { - gameState(i, (int16)READ_BE_UINT16(ptr)); ptr += 2; + _gameState[i] = (int16)READ_BE_UINT16(ptr); ptr += 2; } - for (i = 1; i <= _numRooms; i++) - for (j = 1; j <= _vm->grid()->areaMax(i); j++) - _vm->grid()->area(i, j)->readFromBE(ptr); - for (i = 0; i < TALK_SELECTED_COUNT; i++) _talkSelected[i].readFromBE(ptr); for (i = 1; i <= _numWalkOffs; i++) _walkOffData[i].readFromBE(ptr); - joeFacing(READ_BE_UINT16(ptr)); ptr += 2; - _vm->bam()->_flag = READ_BE_UINT16(ptr); ptr += 2; - _vm->sound()->playSong((int16)READ_BE_UINT16(ptr)); ptr += 2; - - //TODO: lastmerge, lastalter, altmrgpri - for (i = 0; i < 3; i++) { - READ_BE_UINT16(ptr); ptr += 2; - } + _joe.facing = READ_BE_UINT16(ptr); ptr += 2; - if ((ptr - saveData) != SAVEGAME_SIZE) { - delete[] saveData; - return false; + if (ver >= 1) { + _puzzleAttemptCount = READ_BE_UINT16(ptr); ptr += 2; + + for (i = 1; i <= _numObjDesc; i++) + _objectDescription[i].readFromBE(ptr); } - +} + +void Logic::setupRestoredGame() { if (_vm->bam()->_flag != BamScene::F_STOP) { _vm->bam()->prepareAnimation(); } - joeCutFacing(joeFacing()); - joeFace(); - - //OLDX = _joe.x; - //OLDY = _joe.y; - _oldRoom = 0; - newRoom(_currentRoom); - _entryObj = 0; + _vm->sound()->playSong(_vm->sound()->lastOverride()); switch (gameState(VAR_DRESSING_MODE)) { case 0: - joeUseClothes(false); + _vm->display()->palSetJoeNormal(); + loadJoeBanks("Joe_A.BBK", "Joe_B.BBK"); break; case 1: - joeUseUnderwear(); + _vm->display()->palSetJoeNormal(); + loadJoeBanks("JoeU_A.BBK", "JoeU_B.BBK"); break; case 2: - joeUseDress(false); + _vm->display()->palSetJoeDress(); + loadJoeBanks("JoeD_A.BBK", "JoeD_B.BBK"); break; } - inventoryRefresh(); + _joe.cutFacing = _joe.facing; + joeFace(); - delete[] saveData; - return true; + _oldRoom = 0; + _newRoom = _currentRoom; + _entryObj = 0; + + inventoryRefresh(); } + void Logic::sceneStart() { debug(6, "[Logic::sceneStart] _scene = %i", _scene); _scene++; |