aboutsummaryrefslogtreecommitdiff
path: root/kyra
diff options
context:
space:
mode:
Diffstat (limited to 'kyra')
-rw-r--r--kyra/animator.h38
-rw-r--r--kyra/kyra.cpp197
-rw-r--r--kyra/kyra.h21
-rw-r--r--kyra/module.mk3
-rw-r--r--kyra/saveload.cpp277
-rw-r--r--kyra/staticres.cpp2
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));
}
}