diff options
author | Johannes Schickel | 2006-01-03 23:41:52 +0000 |
---|---|---|
committer | Johannes Schickel | 2006-01-03 23:41:52 +0000 |
commit | 4b3af6b94fb994fd538430ca502dd4c7e51d0e51 (patch) | |
tree | ef624a5d71ee0ff18157ed1d7a01a70488c5d7b1 /kyra | |
parent | fd8ac69fc45fb346a931f61701e8aec04278159b (diff) | |
download | scummvm-rg350-4b3af6b94fb994fd538430ca502dd4c7e51d0e51.tar.gz scummvm-rg350-4b3af6b94fb994fd538430ca502dd4c7e51d0e51.tar.bz2 scummvm-rg350-4b3af6b94fb994fd538430ca502dd4c7e51d0e51.zip |
Fixed wrong formatting in animator.h
Reworked the savefiles and extracted the save/load code to saveload.cpp.
svn-id: r19900
Diffstat (limited to 'kyra')
-rw-r--r-- | kyra/animator.h | 38 | ||||
-rw-r--r-- | kyra/kyra.cpp | 197 | ||||
-rw-r--r-- | kyra/kyra.h | 21 | ||||
-rw-r--r-- | kyra/module.mk | 3 | ||||
-rw-r--r-- | kyra/saveload.cpp | 277 | ||||
-rw-r--r-- | kyra/staticres.cpp | 2 |
6 files changed, 333 insertions, 205 deletions
diff --git a/kyra/animator.h b/kyra/animator.h index 102914467c..019941cd6d 100644 --- a/kyra/animator.h +++ b/kyra/animator.h @@ -27,25 +27,25 @@ class KyraEngine; class Screen; struct AnimObject { - uint8 index; - uint32 active; - uint32 refreshFlag; - uint32 bkgdChangeFlag; - uint32 unk1; - uint32 flags; - int16 drawY; - uint8 *sceneAnimPtr; - int16 animFrameNumber; - uint8 *background; - uint16 rectSize; - int16 x1, y1; - int16 x2, y2; - uint16 width; - uint16 height; - uint16 width2; - uint16 height2; - AnimObject *nextAnimObject; - }; + uint8 index; + uint32 active; + uint32 refreshFlag; + uint32 bkgdChangeFlag; + uint32 unk1; + uint32 flags; + int16 drawY; + uint8 *sceneAnimPtr; + int16 animFrameNumber; + uint8 *background; + uint16 rectSize; + int16 x1, y1; + int16 x2, y2; + uint16 width; + uint16 height; + uint16 width2; + uint16 height2; + AnimObject *nextAnimObject; +}; class ScreenAnimator { public: diff --git a/kyra/kyra.cpp b/kyra/kyra.cpp index 2a5e8be8ae..970afc012a 100644 --- a/kyra/kyra.cpp +++ b/kyra/kyra.cpp @@ -398,6 +398,8 @@ int KyraEngine::init(GameDetector &detector) { memset(_specialPalettes, 0, sizeof(_specialPalettes)); _mousePressFlag = false; + + _targetName = detector._targetName; return 0; } @@ -523,7 +525,7 @@ void KyraEngine::startup() { _roomTable[i].itemsTable[item] = 0xFF; _roomTable[i].itemsXPos[item] = 0xFFFF; _roomTable[i].itemsYPos[item] = 0xFF; - _roomTable[i].unkField3[item] = 0; + _roomTable[i].needInit[item] = 0; } } loadCharacterShapes(); @@ -579,7 +581,7 @@ void KyraEngine::delay(uint32 amount, bool update) { _debugger->attach(); } else if (event.kbd.keycode >= '0' && event.kbd.keycode <= '9' && (event.kbd.flags == OSystem::KBD_CTRL || event.kbd.flags == OSystem::KBD_ALT)) { - sprintf(saveLoadSlot, "KYRA1.00%i", event.kbd.keycode - '0'); + sprintf(saveLoadSlot, "%s.00%d", _targetName.c_str(), event.kbd.keycode - '0'); if (event.kbd.flags == OSystem::KBD_CTRL) loadGame(saveLoadSlot); else @@ -1331,6 +1333,7 @@ void KyraEngine::seq_makeBrandonNormal() { delayWithTicks(10); _brandonInvFlag -= 0x10; } + _brandonInvFlag = 0; _brandonStatusBit &= 0xFF9F; _screen->showMouse(); } @@ -1716,27 +1719,27 @@ void KyraEngine::initMainButtonList() { } } -void KyraEngine::loadMainScreen() { +void KyraEngine::loadMainScreen(int page) { if ((_features & GF_ENGLISH) && (_features & GF_TALKIE)) - loadBitmap("MAIN_ENG.CPS", 3, 3, 0); + loadBitmap("MAIN_ENG.CPS", page, page, 0); else if(_features & GF_FRENCH) - loadBitmap("MAIN_FRE.CPS", 3, 3, 0); + loadBitmap("MAIN_FRE.CPS", page, page, 0); else if(_features & GF_GERMAN) - loadBitmap("MAIN_GER.CPS", 3, 3, 0); + loadBitmap("MAIN_GER.CPS", page, page, 0); else if ((_features & GF_ENGLISH) && (_features & GF_FLOPPY)) - loadBitmap("MAIN15.CPS", 3, 3, 0); + loadBitmap("MAIN15.CPS", page, page, 0); else if (_features & GF_SPANISH) - loadBitmap("MAIN_SPA.CPS", 3, 3, 0); + loadBitmap("MAIN_SPA.CPS", page, page, 0); else warning("no main graphics file found"); - uint8 *_page3 = _screen->getPagePtr(3); - uint8 *_page0 = _screen->getPagePtr(0); - memcpy(_page0, _page3, 320*200); + uint8 *_pageSrc = _screen->getPagePtr(page); + uint8 *_pageDst = _screen->getPagePtr(0); + memcpy(_pageDst, _pageSrc, 320*200); } void KyraEngine::setCharactersInDefaultScene() { - static uint32 defaultSceneTable[][4] = { + static const uint32 defaultSceneTable[][4] = { { 0xFFFF, 0x0004, 0x0003, 0xFFFF }, { 0xFFFF, 0x0022, 0xFFFF, 0x0000 }, { 0xFFFF, 0x001D, 0x0021, 0xFFFF }, @@ -1745,14 +1748,14 @@ void KyraEngine::setCharactersInDefaultScene() { for (int i = 1; i < 5; ++i) { Character *cur = &_characterList[i]; - cur->field_20 = 0; - uint32 *curTable = defaultSceneTable[i-1]; + //cur->field_20 = 0; + const uint32 *curTable = defaultSceneTable[i-1]; cur->sceneId = curTable[0]; if (cur->sceneId == _currentCharacter->sceneId) { - ++cur->field_20; - cur->sceneId = curTable[cur->field_20]; + //++cur->field_20; + cur->sceneId = curTable[1/*cur->field_20*/]; } - cur->field_23 = curTable[cur->field_20+1]; + //cur->field_23 = curTable[cur->field_20+1]; } } @@ -1765,7 +1768,7 @@ void KyraEngine::setCharacterDefaultFrame(int character) { edit->sceneId = 0xFFFF; edit->facing = 0; edit->currentAnimFrame = initFrameTable[character]; - edit->unk6 = 1; + // edit->unk6 = 1; } void KyraEngine::setCharactersPositions(int character) { @@ -3242,7 +3245,7 @@ void KyraEngine::setupSceneItems() { Room *currentRoom = &_roomTable[sceneId]; for (int i = 0; i < 12; ++i) { uint8 item = currentRoom->itemsTable[i]; - if (item == 0xFF || !currentRoom->unkField3[i]) { + if (item == 0xFF || !currentRoom->needInit[i]) { continue; } @@ -3269,7 +3272,7 @@ void KyraEngine::setupSceneItems() { break; } } else { - currentRoom->unkField3[i] = 0; + currentRoom->needInit[i] = 0; } } } @@ -3483,7 +3486,7 @@ void KyraEngine::addItemToRoom(uint16 sceneId, uint8 item, int itemIndex, int x, currentRoom->itemsTable[itemIndex] = item; currentRoom->itemsXPos[itemIndex] = x; currentRoom->itemsYPos[itemIndex] = y; - currentRoom->unkField3[itemIndex] = 1; + currentRoom->needInit[itemIndex] = 1; } int KyraEngine::checkNoDropRects(int x, int y) { @@ -5342,156 +5345,4 @@ void KyraEngine::runNpcScript(int func) { _scriptInterpreter->runScript(_npcScript); } } - -#pragma mark - -#pragma mark - Saving/loading -#pragma mark - - -void KyraEngine::loadGame(const char *fileName) { - debug(9, "loadGame('%s')", fileName); - Common::InSaveFile *in; - - if (!(in = _saveFileMan->openForLoading(fileName))) { - warning("Can't open file '%s', game not loaded", fileName); - return; - } - - if (in->readByte() != 1) { - warning("Savegame is not the right version"); - delete in; - return; - } - - char saveName[31]; - in->read(saveName, 31); - - for (int i = 0; i < 11; i++) { - _characterList[i].sceneId = in->readUint16BE(); - _characterList[i].height = in->readByte(); - _characterList[i].facing = in->readByte(); - _characterList[i].currentAnimFrame = in->readUint16BE(); - _characterList[i].unk6 = in->readUint32BE(); - in->read(_characterList[i].inventoryItems, 10); - _characterList[i].x1 = in->readSint16BE(); - _characterList[i].y1 = in->readSint16BE(); - _characterList[i].x2 = in->readSint16BE(); - _characterList[i].y1 = in->readSint16BE(); - _characterList[i].field_20 = in->readUint16BE(); - _characterList[i].field_23 = in->readUint16BE(); - } - - _marbleVaseItem = in->readSint16BE(); - _itemInHand = in->readByte(); - - for (int i = 0; i < 32; i++) { - _timers[i].countdown = in->readSint32BE(); - _timers[i].nextRun = in->readUint32BE(); - } - _timerNextRun = 0; - - in->read(_flagsTable, sizeof(_flagsTable)); - - for (int i = 0; i < _roomTableSize; ++i) { - for (int item = 0; item < 12; ++item) { - _roomTable[i].itemsTable[item] = 0xFF; - _roomTable[i].itemsXPos[item] = 0xFFFF; - _roomTable[i].itemsYPos[item] = 0xFF; - _roomTable[i].unkField3[item] = 0; - } - } - - uint16 sceneId; - uint8 itemCount; - - while (!in->eos()) { - sceneId = in->readUint16BE(); - if (sceneId == 0xffff) - break; - - itemCount = in->readByte(); - for (int i = 0; i < itemCount; i++) { - _roomTable[sceneId].itemsTable[i] = in->readByte(); - _roomTable[sceneId].itemsXPos[i] = in->readUint16BE(); - _roomTable[sceneId].itemsYPos[i] = in->readUint16BE(); - _roomTable[sceneId].unkField3[i] = in->readUint32BE(); - - } - } - - createMouseItem(_itemInHand); - enterNewScene(_currentCharacter->sceneId, _currentCharacter->facing, 0, 0, 1); - - if (in->ioFailed()) - error("Load failed."); - else - debug(1, "Loaded savegame '%s.'", saveName); - - delete in; -} - -void KyraEngine::saveGame(const char *fileName, const char *saveName) { - debug(9, "saveGame('%s', '%s')", fileName, saveName); - Common::OutSaveFile *out; - - if (!(out = _saveFileMan->openForSaving(fileName))) { - warning("Can't create file '%s', game not saved", fileName); - return; - } - - // Savegame version - out->writeByte(1); - out->write(saveName, 31); - - for (int i = 0; i < 11; i++) { - out->writeUint16BE(_characterList[i].sceneId); - out->writeByte(_characterList[i].height); - out->writeByte(_characterList[i].facing); - out->writeUint16BE(_characterList[i].currentAnimFrame); - out->writeUint32BE(_characterList[i].unk6); - out->write(_characterList[i].inventoryItems, 10); - out->writeSint16BE(_characterList[i].x1); - out->writeSint16BE(_characterList[i].y1); - out->writeSint16BE(_characterList[i].x2); - out->writeSint16BE(_characterList[i].y1); - out->writeUint16BE(_characterList[i].field_20); - out->writeUint16BE(_characterList[i].field_23); - } - - out->writeSint16BE(_marbleVaseItem); - out->writeByte(_itemInHand); - - for (int i = 0; i < 32; i++) { - out->writeSint32BE(_timers[i].countdown); - out->writeUint32BE(_timers[i].nextRun); - } - - out->write(_flagsTable, sizeof(_flagsTable)); - - uint8 itemCount; - for (int i = 0; i < _roomTableSize; i++) { - itemCount = countItemsInScene(i); - if (itemCount > 0) { - out->writeUint16BE(i); - out->writeByte(itemCount); - for (int a = 0; a < 12; a++) { - if (_roomTable[i].itemsTable[a] != 0xff) { - out->writeByte(_roomTable[i].itemsTable[a]); - out->writeUint16BE(_roomTable[i].itemsXPos[a]); - out->writeUint16BE(_roomTable[i].itemsYPos[a]); - out->writeUint32BE(_roomTable[i].unkField3[a]); - } - } - } - } - - out->flush(); - - // check for errors - if (out->ioFailed()) - warning("Can't write file '%s'. (Disk full?)", fileName); - else - debug(1, "Saved game '%s.'", saveName); - - delete out; -} } // End of namespace Kyra diff --git a/kyra/kyra.h b/kyra/kyra.h index 7b8fa555f2..839b1519c7 100644 --- a/kyra/kyra.h +++ b/kyra/kyra.h @@ -53,11 +53,8 @@ struct Character { uint8 height; uint8 facing; uint16 currentAnimFrame; - uint32 unk6; uint8 inventoryItems[10]; int16 x1, y1, x2, y2; - uint16 field_20; - uint16 field_23; }; struct Shape { @@ -75,7 +72,7 @@ struct Room { uint8 itemsTable[12]; uint16 itemsXPos[12]; uint8 itemsYPos[12]; - uint32 unkField3[12]; + uint8 needInit[12]; }; struct Rect { @@ -123,7 +120,7 @@ class TextDisplayer; class KyraEngine; struct Timer { - bool active; + uint8 active; int32 countdown; uint32 nextRun; void (KyraEngine::*func)(int timerNum); @@ -549,7 +546,7 @@ protected: void loadItems(); void loadButtonShapes(); void initMainButtonList(); - void loadMainScreen(); + void loadMainScreen(int page = 3); void setCharactersInDefaultScene(); void resetBrandonPosionFlags(); void initAnimStateList(); @@ -625,17 +622,17 @@ protected: int8 _crystalState[2]; uint16 _brandonStatusBit; - int _brandonStatusBit0x02Flag; - int _brandonStatusBit0x20Flag; + uint8 _brandonStatusBit0x02Flag; + uint8 _brandonStatusBit0x20Flag; uint8 _brandonPoisonFlagsGFX[256]; uint8 _deathHandler; - int _brandonInvFlag; - int8 _poisonDeathCounter; + int16 _brandonInvFlag; + uint8 _poisonDeathCounter; int _brandonPosX; int _brandonPosY; int _brandonScaleX; int _brandonScaleY; - int _brandonDrawFrame; + uint16 _brandonDrawFrame; uint16 _currentChatPartnerBackupFrame; uint16 _currentCharAnimFrame; @@ -671,6 +668,8 @@ protected: uint8 _configTalkspeed; + Common::String _targetName; + int _curMusicTheme; int _newMusicTheme; AudioStream *_currentVocFile; diff --git a/kyra/module.mk b/kyra/module.mk index 75568213eb..bf9a5aba49 100644 --- a/kyra/module.mk +++ b/kyra/module.mk @@ -15,7 +15,8 @@ MODULE_OBJS := \ kyra/animator.o \ kyra/gui.o \ kyra/text.o \ - kyra/timer.o + kyra/timer.o \ + kyra/saveload.o MODULE_DIRS += \ kyra diff --git a/kyra/saveload.cpp b/kyra/saveload.cpp new file mode 100644 index 0000000000..836bff4067 --- /dev/null +++ b/kyra/saveload.cpp @@ -0,0 +1,277 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2005 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. + * + * $Header$ + * + */ + +#include "kyra/kyra.h" +#include "kyra/animator.h" +#include "kyra/screen.h" + +#include "common/savefile.h" +#include "common/system.h" + +#define CURRENT_VERSION 1 + +namespace Kyra { +void KyraEngine::loadGame(const char *fileName) { + debug(9, "loadGame('%s')", fileName); + Common::InSaveFile *in; + + if (!(in = _saveFileMan->openForLoading(fileName))) { + warning("Can't open file '%s', game not loaded", fileName); + return; + } + + uint32 type = in->readUint32BE(); + if (type != MKID('KYRA')) + return; + uint32 version = in->readUint32BE(); + if (version < CURRENT_VERSION) { + warning("Savegame is not the right version (%d)", version); + delete in; + return; + } + + char saveName[31]; + in->read(saveName, 31); + + int brandonX = 0, brandonY = 0; + for (int i = 0; i < 11; i++) { + _characterList[i].sceneId = in->readUint16BE(); + _characterList[i].height = in->readByte(); + _characterList[i].facing = in->readByte(); + _characterList[i].currentAnimFrame = in->readUint16BE(); + //_characterList[i].unk6 = in->readUint32BE(); + in->read(_characterList[i].inventoryItems, 10); + _characterList[i].x1 = in->readSint16BE(); + _characterList[i].y1 = in->readSint16BE(); + _characterList[i].x2 = in->readSint16BE(); + _characterList[i].y2 = in->readSint16BE(); + if (i == 0) { + brandonX = _characterList[i].x1; + brandonY = _characterList[i].y1; + } + //_characterList[i].field_20 = in->readUint16BE(); + //_characterList[i].field_23 = in->readUint16BE(); + } + + _marbleVaseItem = in->readSint16BE(); + _itemInHand = in->readByte(); + + for (int i = 0; i < 4; ++i) { + _birthstoneGemTable[i] = in->readByte(); + } + for (int i = 0; i < 3; ++i) { + _idolGemsTable[i] = in->readByte(); + } + for (int i = 0; i < 3; ++i) { + _foyerItemTable[i] = in->readByte(); + } + _cauldronState = in->readByte(); + for (int i = 0; i < 2; ++i) { + _crystalState[i] = in->readByte(); + } + + _brandonStatusBit = in->readUint16BE(); + _brandonStatusBit0x02Flag = in->readByte(); + _brandonStatusBit0x20Flag = in->readByte(); + in->read(_brandonPoisonFlagsGFX, 256); + _brandonInvFlag = in->readSint16BE(); + _poisonDeathCounter = in->readByte(); + _brandonDrawFrame = in->readUint16BE(); + + for (int i = 0; i < 32; i++) { + _timers[i].active = in->readByte(); + _timers[i].countdown = in->readSint32BE(); + _timers[i].nextRun = in->readUint32BE(); + if (_timers[i].nextRun != 0) + _timers[i].nextRun += _system->getMillis(); + } + _timerNextRun = 0; + + uint32 flagsSize = in->readUint32BE(); + assert(flagsSize == sizeof(_flagsTable)); + in->read(_flagsTable, flagsSize); + + for (int i = 0; i < _roomTableSize; ++i) { + for (int item = 0; item < 12; ++item) { + _roomTable[i].itemsTable[item] = 0xFF; + _roomTable[i].itemsXPos[item] = 0xFFFF; + _roomTable[i].itemsYPos[item] = 0xFF; + _roomTable[i].needInit[item] = 0; + } + } + + uint16 sceneId = 0; + + while (true) { + sceneId = in->readUint16BE(); + if (sceneId == 0xFFFF) + break; + assert(sceneId < _roomTableSize); + _roomTable[sceneId].nameIndex = in->readByte(); + + for (int i = 0; i < 12; i++) { + _roomTable[sceneId].itemsTable[i] = in->readByte(); + _roomTable[sceneId].itemsXPos[i] = in->readUint16BE(); + _roomTable[sceneId].itemsYPos[i] = in->readUint16BE(); + _roomTable[sceneId].needInit[i] = in->readByte(); + } + } + + if (queryGameFlag(0x2D)) { + loadMainScreen(8); + loadBitmap("AMULET3.CPS", 10, 10, 0); + if (!queryGameFlag(0xF1)) { + for (int i = 0x55; i <= 0x5A; ++i) { + if (queryGameFlag(i)) { + seq_createAmuletJewel(i-0x55, 10, 1, 1); + } + } + } + _screen->copyRegion(0, 0, 0, 0, 320, 200, 10, 8); + uint8 *_pageSrc = _screen->getPagePtr(8); + uint8 *_pageDst = _screen->getPagePtr(0); + memcpy(_pageDst, _pageSrc, 320*200); + } else { + loadMainScreen(8); + } + + createMouseItem(_itemInHand); + setBrandonAnimSeqSize(5, 48); + _animator->_noDrawShapesFlag = 1; + enterNewScene(_currentCharacter->sceneId, _currentCharacter->facing, 0, 0, 1); + _animator->_noDrawShapesFlag = 0; + + _currentCharacter->x1 = brandonX; + _currentCharacter->y1 = brandonY; + animRefreshNPC(0); + _animator->restoreAllObjectBackgrounds(); + _animator->preserveAnyChangedBackgrounds(); + _animator->prepDrawAllObjects(); + _animator->copyChangedObjectsForward(0); + _screen->copyRegion(8, 8, 8, 8, 304, 128, 2, 0); + redrawInventory(0); + + _abortWalkFlag = true; + _abortWalkFlag2 = false; + _mousePressFlag = false; + _mouseX = brandonX; + _mouseY = brandonY; + _system->warpMouse(brandonX, brandonY); + + if (in->ioFailed()) + error("Load failed."); + else + debug(1, "Loaded savegame '%s.'", saveName); + + delete in; +} + +void KyraEngine::saveGame(const char *fileName, const char *saveName) { + debug(9, "saveGame('%s', '%s')", fileName, saveName); + Common::OutSaveFile *out; + + if (!(out = _saveFileMan->openForSaving(fileName))) { + warning("Can't create file '%s', game not saved", fileName); + return; + } + + // Savegame version + out->writeUint32BE(MKID('KYRA')); + out->writeUint32BE(CURRENT_VERSION); + out->write(saveName, 31); + + for (int i = 0; i < 11; i++) { + out->writeUint16BE(_characterList[i].sceneId); + out->writeByte(_characterList[i].height); + out->writeByte(_characterList[i].facing); + out->writeUint16BE(_characterList[i].currentAnimFrame); + //out->writeUint32BE(_characterList[i].unk6); + out->write(_characterList[i].inventoryItems, 10); + out->writeSint16BE(_characterList[i].x1); + out->writeSint16BE(_characterList[i].y1); + out->writeSint16BE(_characterList[i].x2); + out->writeSint16BE(_characterList[i].y2); + //out->writeUint16BE(_characterList[i].field_20); + //out->writeUint16BE(_characterList[i].field_23); + } + + out->writeSint16BE(_marbleVaseItem); + out->writeByte(_itemInHand); + + for (int i = 0; i < 4; ++i) { + out->writeByte(_birthstoneGemTable[i]); + } + for (int i = 0; i < 3; ++i) { + out->writeByte(_idolGemsTable[i]); + } + for (int i = 0; i < 3; ++i) { + out->writeByte(_foyerItemTable[i]); + } + out->writeByte(_cauldronState); + for (int i = 0; i < 2; ++i) { + out->writeByte(_crystalState[i]); + } + + out->writeUint16BE(_brandonStatusBit); + out->writeByte(_brandonStatusBit0x02Flag); + out->writeByte(_brandonStatusBit0x20Flag); + out->write(_brandonPoisonFlagsGFX, 256); + out->writeSint16BE(_brandonInvFlag); + out->writeByte(_poisonDeathCounter); + out->writeUint16BE(_brandonDrawFrame); + + for (int i = 0; i < 32; i++) { + out->writeByte(_timers[i].active); + out->writeSint32BE(_timers[i].countdown); + if (_system->getMillis() >= _timers[i].nextRun) { + out->writeUint32BE(0); + } else { + out->writeUint32BE(_timers[i].nextRun - _system->getMillis()); + } + } + + out->writeUint32BE(sizeof(_flagsTable)); + out->write(_flagsTable, sizeof(_flagsTable)); + + for (uint16 i = 0; i < _roomTableSize; i++) { + out->writeUint16BE(i); + out->writeByte(_roomTable[i].nameIndex); + for (int a = 0; a < 12; a++) { + out->writeByte(_roomTable[i].itemsTable[a]); + out->writeUint16BE(_roomTable[i].itemsXPos[a]); + out->writeUint16BE(_roomTable[i].itemsYPos[a]); + out->writeByte(_roomTable[i].needInit[a]); + } + } + // room table terminator + out->writeUint16BE(0xFFFF); + + out->flush(); + + // check for errors + if (out->ioFailed()) + warning("Can't write file '%s'. (Disk full?)", fileName); + else + debug(1, "Saved game '%s.'", saveName); + + delete out; +} +} // end of namespace Kyra diff --git a/kyra/staticres.cpp b/kyra/staticres.cpp index 626fffc230..791721cc75 100644 --- a/kyra/staticres.cpp +++ b/kyra/staticres.cpp @@ -409,7 +409,7 @@ void KyraEngine::res_loadRoomTable(const byte *src, Room **loadTo, int *size) { memset(&(*loadTo)[i].itemsTable[6], 0, sizeof(byte)*6); memset((*loadTo)[i].itemsXPos, 0, sizeof(uint16)*12); memset((*loadTo)[i].itemsYPos, 0, sizeof(uint8)*12); - memset((*loadTo)[i].unkField3, 0, sizeof((*loadTo)[i].unkField3)); + memset((*loadTo)[i].needInit, 0, sizeof((*loadTo)[i].needInit)); } } |