HUGO: Avoid duplicated code in functions related to HUGO.DAT

This commit is contained in:
strangerke 2011-02-18 08:11:55 +01:00
parent 41a5fc8476
commit 399b59a583
21 changed files with 495 additions and 796 deletions

View file

@ -194,7 +194,7 @@ void Screen::savePal(Common::WriteStream *f) const {
/** /**
* Restore the current palette from a savegame * Restore the current palette from a savegame
*/ */
void Screen::restorePal(Common::SeekableReadStream *f) { void Screen::restorePal(Common::ReadStream *f) {
debugC(1, kDebugDisplay, "restorePal()"); debugC(1, kDebugDisplay, "restorePal()");
byte pal[4]; byte pal[4];

View file

@ -73,7 +73,7 @@ public:
void moveImage(image_pt srcImage, const int16 x1, const int16 y1, const int16 dx, int16 dy, const int16 width1, image_pt dstImage, const int16 x2, const int16 y2, const int16 width2); void moveImage(image_pt srcImage, const int16 x1, const int16 y1, const int16 dx, int16 dy, const int16 width1, image_pt dstImage, const int16 x2, const int16 y2, const int16 width2);
void remapPal(uint16 oldIndex, uint16 newIndex); void remapPal(uint16 oldIndex, uint16 newIndex);
void resetInventoryObjId(); void resetInventoryObjId();
void restorePal(Common::SeekableReadStream *f); void restorePal(Common::ReadStream *f);
void savePal(Common::WriteStream *f) const; void savePal(Common::WriteStream *f) const;
void setBackgroundColor(const uint16 color); void setBackgroundColor(const uint16 color);
void setCursorPal(); void setCursorPal();

View file

@ -63,8 +63,7 @@ void FileManager_v1d::readOverlay(const int screenNum, image_pt image, const ovl
Common::String buf = Common::String(_vm->_text->getScreenNames(screenNum)) + Common::String(ovl_ext[overlayType]); Common::String buf = Common::String(_vm->_text->getScreenNames(screenNum)) + Common::String(ovl_ext[overlayType]);
if (!Common::File::exists(buf)) { if (!Common::File::exists(buf)) {
for (int i = 0; i < kOvlSize; i++) memset(image, 0, sizeof(image));
image[i] = 0;
warning("File not found: %s", buf.c_str()); warning("File not found: %s", buf.c_str());
return; return;
} }

View file

@ -81,8 +81,7 @@ void FileManager_v1w::readOverlay(const int screenNum, image_pt image, ovl_t ove
break; break;
} }
if (i == 0) { if (i == 0) {
for (int idx = 0; idx < kOvlSize; idx++) memset(image, 0, sizeof(image));
image[idx] = 0;
return; return;
} }
_sceneryArchive1.read(tmpImage, kOvlSize); _sceneryArchive1.read(tmpImage, kOvlSize);

View file

@ -137,8 +137,7 @@ void FileManager_v2d::readOverlay(const int screenNum, image_pt image, ovl_t ove
break; break;
} }
if (i == 0) { if (i == 0) {
for (int idx = 0; idx < kOvlSize; idx++) memset(image, 0, sizeof(image));
image[idx] = 0;
return; return;
} }

View file

@ -144,8 +144,7 @@ void FileManager_v3d::readOverlay(const int screenNum, image_pt image, ovl_t ove
break; break;
} }
if (i == 0) { if (i == 0) {
for (int idx = 0; idx < kOvlSize; idx++) memset(image, 0, sizeof(image));
image[idx] = 0;
return; return;
} }
@ -158,7 +157,7 @@ void FileManager_v3d::readOverlay(const int screenNum, image_pt image, ovl_t ove
else if (data >= 0) { // Copy next data+1 literally else if (data >= 0) { // Copy next data+1 literally
for (i = 0; i <= (byte)data; i++, k++) for (i = 0; i <= (byte)data; i++, k++)
*tmpImage++ = _sceneryArchive1.readByte(); *tmpImage++ = _sceneryArchive1.readByte();
} else { // Repeat next byte -data+1 times } else { // Repeat next byte -data+1 times
int16 j = _sceneryArchive1.readByte(); int16 j = _sceneryArchive1.readByte();
for (i = 0; i < (byte)(-data + 1); i++, k++) for (i = 0; i < (byte)(-data + 1); i++, k++)
@ -184,8 +183,7 @@ void FileManager_v3d::readOverlay(const int screenNum, image_pt image, ovl_t ove
break; break;
} }
if (i == 0) { if (i == 0) {
for (int idx = 0; idx < kOvlSize; idx++) memset(image, 0, sizeof(image));
image[idx] = 0;
return; return;
} }

View file

@ -399,8 +399,7 @@ bool HugoEngine::loadHugoDat() {
numElem = in.readUint16BE(); numElem = in.readUint16BE();
if (varnt == _gameVariant) { if (varnt == _gameVariant) {
_screenStates = (byte *)malloc(sizeof(byte) * numElem); _screenStates = (byte *)malloc(sizeof(byte) * numElem);
for (int i = 0; i < numElem; i++) memset(_screenStates, 0, sizeof(_screenStates));
_screenStates[i] = 0;
} }
} }
@ -426,7 +425,7 @@ bool HugoEngine::loadHugoDat() {
return true; return true;
} }
uint16 **HugoEngine::loadLongArray(Common::ReadStream &in) { uint16 **HugoEngine::loadLongArray(Common::SeekableReadStream &in) {
uint16 **resArray = 0; uint16 **resArray = 0;
for (int varnt = 0; varnt < _numVariant; varnt++) { for (int varnt = 0; varnt < _numVariant; varnt++) {
@ -443,8 +442,7 @@ uint16 **HugoEngine::loadLongArray(Common::ReadStream &in) {
resRow[j] = in.readUint16BE(); resRow[j] = in.readUint16BE();
resArray[i] = resRow; resArray[i] = resRow;
} else { } else {
for (int j = 0; j < numElems; j++) in.skip(numElems * sizeof(uint16));
in.readUint16BE();
} }
} }
} }

View file

@ -323,7 +323,7 @@ public:
const char *getCopyrightString() const { return "Copyright 1989-1997 David P Gray, All Rights Reserved."; } const char *getCopyrightString() const { return "Copyright 1989-1997 David P Gray, All Rights Reserved."; }
Common::String getSavegameFilename(int slot); Common::String getSavegameFilename(int slot);
uint16 **loadLongArray(Common::ReadStream &in); uint16 **loadLongArray(Common::SeekableReadStream &in);
FileManager *_file; FileManager *_file;
Scheduler *_scheduler; Scheduler *_scheduler;

View file

@ -51,7 +51,7 @@ IntroHandler::~IntroHandler() {
/** /**
* Read _introX and _introY from hugo.dat * Read _introX and _introY from hugo.dat
*/ */
void IntroHandler::loadIntroData(Common::ReadStream &in) { void IntroHandler::loadIntroData(Common::SeekableReadStream &in) {
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) { for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
int numRows = in.readUint16BE(); int numRows = in.readUint16BE();
if (varnt == _vm->_gameVariant) { if (varnt == _vm->_gameVariant) {
@ -63,10 +63,7 @@ void IntroHandler::loadIntroData(Common::ReadStream &in) {
_introY[i] = in.readByte(); _introY[i] = in.readByte();
} }
} else { } else {
for (int i = 0; i < numRows; i++) { in.skip(numRows * 2);
in.readByte();
in.readByte();
}
} }
} }
} }

View file

@ -55,7 +55,7 @@ public:
virtual bool introPlay() = 0; virtual bool introPlay() = 0;
void freeIntroData(); void freeIntroData();
void loadIntroData(Common::ReadStream &in); void loadIntroData(Common::SeekableReadStream &in);
byte getIntroSize() const { return _introXSize; } byte getIntroSize() const { return _introXSize; }

View file

@ -57,7 +57,7 @@ InventoryHandler::InventoryHandler(HugoEngine *vm) : _vm(vm), _invent(0) {
/** /**
* Read _invent from Hugo.dat * Read _invent from Hugo.dat
*/ */
void InventoryHandler::loadInvent(Common::ReadStream &in) { void InventoryHandler::loadInvent(Common::SeekableReadStream &in) {
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) { for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
int16 numElem = in.readUint16BE(); int16 numElem = in.readUint16BE();
if (varnt == _vm->_gameVariant) { if (varnt == _vm->_gameVariant) {
@ -66,8 +66,7 @@ void InventoryHandler::loadInvent(Common::ReadStream &in) {
for (int i = 0; i < numElem; i++) for (int i = 0; i < numElem; i++)
_invent[i] = in.readSint16BE(); _invent[i] = in.readSint16BE();
} else { } else {
for (int i = 0; i < numElem; i++) in.skip(numElem * sizeof(int16));
in.readSint16BE();
} }
} }
} }

View file

@ -51,7 +51,7 @@ public:
istate_t getInventoryState() const { return _inventoryState; } istate_t getInventoryState() const { return _inventoryState; }
int16 findIconId(int16 objId); int16 findIconId(int16 objId);
void loadInvent(Common::ReadStream &in); void loadInvent(Common::SeekableReadStream &in);
int16 processInventory(const invact_t action, ...); int16 processInventory(const invact_t action, ...);
void runInventory(); void runInventory();

View file

@ -293,31 +293,31 @@ void MouseHandler::mouseHandler() {
resetRightButton(); resetRightButton();
} }
void MouseHandler::readHotspot(Common::ReadStream &in, hotspot_t &hotspot) {
hotspot.screenIndex = in.readSint16BE();
hotspot.x1 = in.readSint16BE();
hotspot.y1 = in.readSint16BE();
hotspot.x2 = in.readSint16BE();
hotspot.y2 = in.readSint16BE();
hotspot.actIndex = in.readUint16BE();
hotspot.viewx = in.readSint16BE();
hotspot.viewy = in.readSint16BE();
hotspot.direction = in.readSint16BE();
}
/** /**
* Load hotspots data from hugo.dat * Load hotspots data from hugo.dat
*/ */
void MouseHandler::loadHotspots(Common::ReadStream &in) { void MouseHandler::loadHotspots(Common::ReadStream &in) {
// Read _hotspots hotspot_t *wrkHotspots = 0;
hotspot_t tmp;
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) { for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
int numRows = in.readUint16BE(); int numRows = in.readUint16BE();
hotspot_t *wrkHotspots = (hotspot_t *)malloc(sizeof(hotspot_t) * numRows);
for (int i = 0; i < numRows; i++) {
wrkHotspots[i].screenIndex = in.readSint16BE();
wrkHotspots[i].x1 = in.readSint16BE();
wrkHotspots[i].y1 = in.readSint16BE();
wrkHotspots[i].x2 = in.readSint16BE();
wrkHotspots[i].y2 = in.readSint16BE();
wrkHotspots[i].actIndex = in.readUint16BE();
wrkHotspots[i].viewx = in.readSint16BE();
wrkHotspots[i].viewy = in.readSint16BE();
wrkHotspots[i].direction = in.readSint16BE();
}
if (varnt == _vm->_gameVariant) if (varnt == _vm->_gameVariant)
_hotspots = wrkHotspots; _hotspots = wrkHotspots = (hotspot_t *)malloc(sizeof(hotspot_t) * numRows);
else
free(wrkHotspots); for (int i = 0; i < numRows; i++)
readHotspot(in, (varnt == _vm->_gameVariant) ? wrkHotspots[i] : tmp);
} }
} }

View file

@ -83,6 +83,7 @@ private:
void cursorText(const char *buffer, const int16 cx, const int16 cy, const uif_t fontId, const int16 color); void cursorText(const char *buffer, const int16 cx, const int16 cy, const uif_t fontId, const int16 color);
void processRightClick(const int16 objId, const int16 cx, const int16 cy); void processRightClick(const int16 objId, const int16 cx, const int16 cy);
void processLeftClick(const int16 objId, const int16 cx, const int16 cy); void processLeftClick(const int16 objId, const int16 cx, const int16 cy);
void readHotspot(Common::ReadStream &in, hotspot_t &hotspot);
}; };
} // End of namespace Hugo } // End of namespace Hugo

View file

@ -368,141 +368,114 @@ bool ObjectHandler::findObjectSpace(object_t *obj, int16 *destx, int16 *desty) {
return foundFl; return foundFl;
} }
void ObjectHandler::readUse(Common::ReadStream &in, uses_t &curUse) {
curUse.objId = in.readSint16BE();
curUse.dataIndex = in.readUint16BE();
uint16 numSubElem = in.readUint16BE();
curUse.targets = (target_t *)malloc(sizeof(target_t) * numSubElem);
for (int j = 0; j < numSubElem; j++) {
curUse.targets[j].nounIndex = in.readUint16BE();
curUse.targets[j].verbIndex = in.readUint16BE();
}
}
/** /**
* Load _uses from Hugo.dat * Load _uses from Hugo.dat
*/ */
void ObjectHandler::loadObjectUses(Common::ReadStream &in) { void ObjectHandler::loadObjectUses(Common::ReadStream &in) {
uses_t tmpUse;
//Read _uses //Read _uses
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) { for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
tmpUse.targets = 0;
uint16 numElem = in.readUint16BE(); uint16 numElem = in.readUint16BE();
uses_t *wrkUses = (uses_t *)malloc(sizeof(uses_t) * numElem);
for (int i = 0; i < numElem; i++) {
wrkUses[i].objId = in.readSint16BE();
wrkUses[i].dataIndex = in.readUint16BE();
uint16 numSubElem = in.readUint16BE();
wrkUses[i].targets = (target_t *)malloc(sizeof(target_t) * numSubElem);
for (int j = 0; j < numSubElem; j++) {
wrkUses[i].targets[j].nounIndex = in.readUint16BE();
wrkUses[i].targets[j].verbIndex = in.readUint16BE();
}
}
if (varnt == _vm->_gameVariant) { if (varnt == _vm->_gameVariant) {
_usesSize = numElem; _usesSize = numElem;
_uses = wrkUses; _uses = (uses_t *)malloc(sizeof(uses_t) * numElem);
} else {
for (int i = 0; i < numElem; i++)
free(wrkUses[i].targets);
free(wrkUses);
} }
for (int i = 0; i < numElem; i++)
readUse(in, (varnt == _vm->_gameVariant) ? _uses[i] : tmpUse);
if (tmpUse.targets)
free(tmpUse.targets);
} }
} }
void ObjectHandler::readObject(Common::ReadStream &in, object_t &curObject) {
curObject.nounIndex = in.readUint16BE();
curObject.dataIndex = in.readUint16BE();
uint16 numSubElem = in.readUint16BE();
if (numSubElem == 0)
curObject.stateDataIndex = 0;
else
curObject.stateDataIndex = (uint16 *)malloc(sizeof(uint16) * numSubElem);
for (int j = 0; j < numSubElem; j++)
curObject.stateDataIndex[j] = in.readUint16BE();
curObject.pathType = (path_t) in.readSint16BE();
curObject.vxPath = in.readSint16BE();
curObject.vyPath = in.readSint16BE();
curObject.actIndex = in.readUint16BE();
curObject.seqNumb = in.readByte();
curObject.currImagePtr = 0;
if (curObject.seqNumb == 0) {
curObject.seqList[0].imageNbr = 0;
curObject.seqList[0].seqPtr = 0;
}
for (int j = 0; j < curObject.seqNumb; j++) {
curObject.seqList[j].imageNbr = in.readUint16BE();
curObject.seqList[j].seqPtr = 0;
}
curObject.cycling = (cycle_t)in.readByte();
curObject.cycleNumb = in.readByte();
curObject.frameInterval = in.readByte();
curObject.frameTimer = in.readByte();
curObject.radius = in.readByte();
curObject.screenIndex = in.readByte();
curObject.x = in.readSint16BE();
curObject.y = in.readSint16BE();
curObject.oldx = in.readSint16BE();
curObject.oldy = in.readSint16BE();
curObject.vx = in.readByte();
curObject.vy = in.readByte();
curObject.objValue = in.readByte();
curObject.genericCmd = in.readSint16BE();
curObject.cmdIndex = in.readUint16BE();
curObject.carriedFl = (in.readByte() != 0);
curObject.state = in.readByte();
curObject.verbOnlyFl = (in.readByte() != 0);
curObject.priority = in.readByte();
curObject.viewx = in.readSint16BE();
curObject.viewy = in.readSint16BE();
curObject.direction = in.readSint16BE();
curObject.curSeqNum = in.readByte();
curObject.curImageNum = in.readByte();
curObject.oldvx = in.readByte();
curObject.oldvy = in.readByte();
}
/** /**
* Load ObjectArr from Hugo.dat * Load ObjectArr from Hugo.dat
*/ */
void ObjectHandler::loadObjectArr(Common::ReadStream &in) { void ObjectHandler::loadObjectArr(Common::ReadStream &in) {
debugC(6, kDebugObject, "loadObject(&in)"); debugC(6, kDebugObject, "loadObject(&in)");
object_t tmpObject;
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) { for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
uint16 numElem = in.readUint16BE(); uint16 numElem = in.readUint16BE();
tmpObject.stateDataIndex = 0;
if (varnt == _vm->_gameVariant) { if (varnt == _vm->_gameVariant) {
_objCount = numElem; _objCount = numElem;
_objects = (object_t *)malloc(sizeof(object_t) * numElem); _objects = (object_t *)malloc(sizeof(object_t) * numElem);
for (int i = 0; i < numElem; i++) {
_objects[i].nounIndex = in.readUint16BE();
_objects[i].dataIndex = in.readUint16BE();
uint16 numSubElem = in.readUint16BE();
if (numSubElem == 0)
_objects[i].stateDataIndex = 0;
else
_objects[i].stateDataIndex = (uint16 *)malloc(sizeof(uint16) * numSubElem);
for (int j = 0; j < numSubElem; j++)
_objects[i].stateDataIndex[j] = in.readUint16BE();
_objects[i].pathType = (path_t) in.readSint16BE();
_objects[i].vxPath = in.readSint16BE();
_objects[i].vyPath = in.readSint16BE();
_objects[i].actIndex = in.readUint16BE();
_objects[i].seqNumb = in.readByte();
_objects[i].currImagePtr = 0;
if (_objects[i].seqNumb == 0) {
_objects[i].seqList[0].imageNbr = 0;
_objects[i].seqList[0].seqPtr = 0;
}
for (int j = 0; j < _objects[i].seqNumb; j++) {
_objects[i].seqList[j].imageNbr = in.readUint16BE();
_objects[i].seqList[j].seqPtr = 0;
}
_objects[i].cycling = (cycle_t)in.readByte();
_objects[i].cycleNumb = in.readByte();
_objects[i].frameInterval = in.readByte();
_objects[i].frameTimer = in.readByte();
_objects[i].radius = in.readByte();
_objects[i].screenIndex = in.readByte();
_objects[i].x = in.readSint16BE();
_objects[i].y = in.readSint16BE();
_objects[i].oldx = in.readSint16BE();
_objects[i].oldy = in.readSint16BE();
_objects[i].vx = in.readByte();
_objects[i].vy = in.readByte();
_objects[i].objValue = in.readByte();
_objects[i].genericCmd = in.readSint16BE();
_objects[i].cmdIndex = in.readUint16BE();
_objects[i].carriedFl = (in.readByte() != 0);
_objects[i].state = in.readByte();
_objects[i].verbOnlyFl = (in.readByte() != 0);
_objects[i].priority = in.readByte();
_objects[i].viewx = in.readSint16BE();
_objects[i].viewy = in.readSint16BE();
_objects[i].direction = in.readSint16BE();
_objects[i].curSeqNum = in.readByte();
_objects[i].curImageNum = in.readByte();
_objects[i].oldvx = in.readByte();
_objects[i].oldvy = in.readByte();
}
} else {
for (int i = 0; i < numElem; i++) {
in.readUint16BE();
in.readUint16BE();
uint16 numSubElem = in.readUint16BE();
for (int j = 0; j < numSubElem; j++)
in.readUint16BE();
in.readSint16BE();
in.readSint16BE();
in.readSint16BE();
in.readUint16BE();
numSubElem = in.readByte();
for (int j = 0; j < numSubElem; j++)
in.readUint16BE();
in.readByte();
in.readByte();
in.readByte();
in.readByte();
in.readByte();
in.readByte();
in.readSint16BE();
in.readSint16BE();
in.readSint16BE();
in.readSint16BE();
in.readByte();
in.readByte();
in.readByte();
in.readSint16BE();
in.readUint16BE();
in.readByte();
in.readByte();
in.readByte();
in.readByte();
in.readSint16BE();
in.readSint16BE();
in.readUint16BE();
in.readByte();
in.readByte();
in.readByte();
in.readByte();
}
} }
for (int i = 0; i < numElem; i++)
readObject(in, (varnt == _vm->_gameVariant) ? _objects[i] : tmpObject);
if (tmpObject.stateDataIndex)
free(tmpObject.stateDataIndex);
} }
} }

View file

@ -78,6 +78,8 @@ public:
void loadNumObj(Common::ReadStream &in); void loadNumObj(Common::ReadStream &in);
void lookObject(object_t *obj); void lookObject(object_t *obj);
void readObjectImages(); void readObjectImages();
void readObject(Common::ReadStream &in, object_t &curObject);
void readUse(Common::ReadStream &in, uses_t &curUse);
void restoreAllSeq(); void restoreAllSeq();
void restoreObjects(Common::SeekableReadStream *in); void restoreObjects(Common::SeekableReadStream *in);
void saveObjects(Common::WriteStream *out); void saveObjects(Common::WriteStream *out);

View file

@ -65,75 +65,72 @@ Parser::~Parser() {
} }
/** /**
* Read _cmdList from Hugo.dat * Read a cmd structure from Hugo.dat
*/
void Parser::readCmd(Common::ReadStream &in, cmd &curCmd) {
curCmd.verbIndex = in.readUint16BE();
curCmd.reqIndex = in.readUint16BE();
curCmd.textDataNoCarryIndex = in.readUint16BE();
curCmd.reqState = in.readByte();
curCmd.newState = in.readByte();
curCmd.textDataWrongIndex = in.readUint16BE();
curCmd.textDataDoneIndex = in.readUint16BE();
curCmd.actIndex = in.readUint16BE();
}
/**
* Load _cmdList from Hugo.dat
*/ */
void Parser::loadCmdList(Common::ReadStream &in) { void Parser::loadCmdList(Common::ReadStream &in) {
cmd tmpCmd;
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) { for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
uint16 numElem = in.readUint16BE(); uint16 numElem = in.readUint16BE();
if (varnt == _vm->_gameVariant) { if (varnt == _vm->_gameVariant) {
_cmdListSize = numElem; _cmdListSize = numElem;
_cmdList = (cmd **)malloc(sizeof(cmd *) * _cmdListSize); _cmdList = (cmd **)malloc(sizeof(cmd *) * _cmdListSize);
for (int i = 0; i < _cmdListSize; i++) { }
uint16 numSubElem = in.readUint16BE();
for (int16 i = 0; i < numElem; i++) {
uint16 numSubElem = in.readUint16BE();
if (varnt == _vm->_gameVariant)
_cmdList[i] = (cmd *)malloc(sizeof(cmd) * numSubElem); _cmdList[i] = (cmd *)malloc(sizeof(cmd) * numSubElem);
for (int j = 0; j < numSubElem; j++) { for (int16 j = 0; j < numSubElem; j++)
_cmdList[i][j].verbIndex = in.readUint16BE(); readCmd(in, (varnt == _vm->_gameVariant) ? _cmdList[i][j] : tmpCmd);
_cmdList[i][j].reqIndex = in.readUint16BE();
_cmdList[i][j].textDataNoCarryIndex = in.readUint16BE();
_cmdList[i][j].reqState = in.readByte();
_cmdList[i][j].newState = in.readByte();
_cmdList[i][j].textDataWrongIndex = in.readUint16BE();
_cmdList[i][j].textDataDoneIndex = in.readUint16BE();
_cmdList[i][j].actIndex = in.readUint16BE();
}
}
} else {
for (int i = 0; i < numElem; i++) {
uint16 numSubElem = in.readUint16BE();
for (int j = 0; j < numSubElem; j++) {
in.readUint16BE();
in.readUint16BE();
in.readUint16BE();
in.readByte();
in.readByte();
in.readUint16BE();
in.readUint16BE();
in.readUint16BE();
}
}
} }
} }
} }
void Parser::readBG(Common::ReadStream &in, background_t &curBG) {
curBG.verbIndex = in.readUint16BE();
curBG.nounIndex = in.readUint16BE();
curBG.commentIndex = in.readSint16BE();
curBG.matchFl = (in.readByte() != 0);
curBG.roomState = in.readByte();
curBG.bonusIndex = in.readByte();
}
/** /**
* Read _backgrounObjects from Hugo.dat * Read _backgrounObjects from Hugo.dat
*/ */
void Parser::loadBackgroundObjects(Common::ReadStream &in) { void Parser::loadBackgroundObjects(Common::ReadStream &in) {
background_t tmpBG;
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) { for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
uint16 numElem = in.readUint16BE(); uint16 numElem = in.readUint16BE();
background_t **wrkBackgroundObjects = (background_t **)malloc(sizeof(background_t *) * numElem); if (varnt == _vm->_gameVariant) {
_backgroundObjectsSize = numElem;
_backgroundObjects = (background_t **)malloc(sizeof(background_t *) * numElem);
}
for (int i = 0; i < numElem; i++) { for (int i = 0; i < numElem; i++) {
uint16 numSubElem = in.readUint16BE(); uint16 numSubElem = in.readUint16BE();
wrkBackgroundObjects[i] = (background_t *)malloc(sizeof(background_t) * numSubElem); if (varnt == _vm->_gameVariant)
for (int j = 0; j < numSubElem; j++) { _backgroundObjects[i] = (background_t *)malloc(sizeof(background_t) * numSubElem);
wrkBackgroundObjects[i][j].verbIndex = in.readUint16BE();
wrkBackgroundObjects[i][j].nounIndex = in.readUint16BE();
wrkBackgroundObjects[i][j].commentIndex = in.readSint16BE();
wrkBackgroundObjects[i][j].matchFl = (in.readByte() != 0);
wrkBackgroundObjects[i][j].roomState = in.readByte();
wrkBackgroundObjects[i][j].bonusIndex = in.readByte();
}
}
if (varnt == _vm->_gameVariant) { for (int j = 0; j < numSubElem; j++)
_backgroundObjectsSize = numElem; readBG(in, (varnt == _vm->_gameVariant) ? _backgroundObjects[i][j] : tmpBG);
_backgroundObjects = wrkBackgroundObjects;
} else {
for (int i = 0; i < numElem; i++)
free(wrkBackgroundObjects[i]);
free(wrkBackgroundObjects);
} }
} }
} }
@ -142,27 +139,21 @@ void Parser::loadBackgroundObjects(Common::ReadStream &in) {
* Read _catchallList from Hugo.dat * Read _catchallList from Hugo.dat
*/ */
void Parser::loadCatchallList(Common::ReadStream &in) { void Parser::loadCatchallList(Common::ReadStream &in) {
background_t *wrkCatchallList = 0;
background_t tmpBG;
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) { for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
uint16 numElem = in.readUint16BE(); uint16 numElem = in.readUint16BE();
background_t *wrkCatchallList = (background_t *)malloc(sizeof(background_t) * numElem);
for (int i = 0; i < numElem; i++) {
wrkCatchallList[i].verbIndex = in.readUint16BE();
wrkCatchallList[i].nounIndex = in.readUint16BE();
wrkCatchallList[i].commentIndex = in.readSint16BE();
wrkCatchallList[i].matchFl = (in.readByte() != 0);
wrkCatchallList[i].roomState = in.readByte();
wrkCatchallList[i].bonusIndex = in.readByte();
}
if (varnt == _vm->_gameVariant) if (varnt == _vm->_gameVariant)
_catchallList = wrkCatchallList; _catchallList = wrkCatchallList = (background_t *)malloc(sizeof(background_t) * numElem);
else
free(wrkCatchallList); for (int i = 0; i < numElem; i++)
readBG(in, (varnt == _vm->_gameVariant) ? wrkCatchallList[i] : tmpBG);
} }
} }
void Parser::loadArrayReqs(Common::ReadStream &in) { void Parser::loadArrayReqs(Common::SeekableReadStream &in) {
_arrayReqs = _vm->loadLongArray(in); _arrayReqs = _vm->loadLongArray(in);
} }

View file

@ -55,7 +55,7 @@ public:
void command(const char *format, ...); void command(const char *format, ...);
void freeParser(); void freeParser();
void keyHandler(Common::Event event); void keyHandler(Common::Event event);
void loadArrayReqs(Common::ReadStream &in); void loadArrayReqs(Common::SeekableReadStream &in);
void loadBackgroundObjects(Common::ReadStream &in); void loadBackgroundObjects(Common::ReadStream &in);
void loadCatchallList(Common::ReadStream &in); void loadCatchallList(Common::ReadStream &in);
void loadCmdList(Common::ReadStream &in); void loadCmdList(Common::ReadStream &in);
@ -82,6 +82,8 @@ protected:
const char *findNoun() const; const char *findNoun() const;
const char *findVerb() const; const char *findVerb() const;
void readBG(Common::ReadStream &in, background_t &curBG);
void readCmd(Common::ReadStream &in, cmd &curCmd);
void showDosInventory() const; void showDosInventory() const;
bool _checkDoubleF1Fl; // Flag used to display user help or instructions bool _checkDoubleF1Fl; // Flag used to display user help or instructions

View file

@ -253,7 +253,7 @@ void Scheduler::loadAlNewscrIndex(Common::ReadStream &in) {
/** /**
* Load Points from Hugo.dat * Load Points from Hugo.dat
*/ */
void Scheduler::loadPoints(Common::ReadStream &in) { void Scheduler::loadPoints(Common::SeekableReadStream &in) {
debugC(6, kDebugSchedule, "loadPoints(&in)"); debugC(6, kDebugSchedule, "loadPoints(&in)");
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) { for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
@ -266,610 +266,350 @@ void Scheduler::loadPoints(Common::ReadStream &in) {
_points[i].scoredFl = false; _points[i].scoredFl = false;
} }
} else { } else {
for (int i = 0; i < numElem; i++) in.skip(numElem);
in.readByte();
} }
} }
} }
void Scheduler::readAct(Common::ReadStream &in, act &curAct) {
uint16 numSubAct;
curAct.a0.actType = (action_t) in.readByte();
switch (curAct.a0.actType) {
case ANULL: // -1
break;
case ASCHEDULE: // 0
curAct.a0.timer = in.readSint16BE();
curAct.a0.actIndex = in.readUint16BE();
break;
case START_OBJ: // 1
curAct.a1.timer = in.readSint16BE();
curAct.a1.objIndex = in.readSint16BE();
curAct.a1.cycleNumb = in.readSint16BE();
curAct.a1.cycle = (cycle_t) in.readByte();
break;
case INIT_OBJXY: // 2
curAct.a2.timer = in.readSint16BE();
curAct.a2.objIndex = in.readSint16BE();
curAct.a2.x = in.readSint16BE();
curAct.a2.y = in.readSint16BE();
break;
case PROMPT: // 3
curAct.a3.timer = in.readSint16BE();
curAct.a3.promptIndex = in.readSint16BE();
numSubAct = in.readUint16BE();
curAct.a3.responsePtr = (int *) malloc(sizeof(int) * numSubAct);
for (int k = 0; k < numSubAct; k++)
curAct.a3.responsePtr[k] = in.readSint16BE();
curAct.a3.actPassIndex = in.readUint16BE();
curAct.a3.actFailIndex = in.readUint16BE();
curAct.a3.encodedFl = (in.readByte() == 1) ? true : false;
break;
case BKGD_COLOR: // 4
curAct.a4.timer = in.readSint16BE();
curAct.a4.newBackgroundColor = in.readUint32BE();
break;
case INIT_OBJVXY: // 5
curAct.a5.timer = in.readSint16BE();
curAct.a5.objIndex = in.readSint16BE();
curAct.a5.vx = in.readSint16BE();
curAct.a5.vy = in.readSint16BE();
break;
case INIT_CARRY: // 6
curAct.a6.timer = in.readSint16BE();
curAct.a6.objIndex = in.readSint16BE();
curAct.a6.carriedFl = (in.readByte() == 1) ? true : false;
break;
case INIT_HF_COORD: // 7
curAct.a7.timer = in.readSint16BE();
curAct.a7.objIndex = in.readSint16BE();
break;
case NEW_SCREEN: // 8
curAct.a8.timer = in.readSint16BE();
curAct.a8.screenIndex = in.readSint16BE();
break;
case INIT_OBJSTATE: // 9
curAct.a9.timer = in.readSint16BE();
curAct.a9.objIndex = in.readSint16BE();
curAct.a9.newState = in.readByte();
break;
case INIT_PATH: // 10
curAct.a10.timer = in.readSint16BE();
curAct.a10.objIndex = in.readSint16BE();
curAct.a10.newPathType = in.readSint16BE();
curAct.a10.vxPath = in.readByte();
curAct.a10.vyPath = in.readByte();
break;
case COND_R: // 11
curAct.a11.timer = in.readSint16BE();
curAct.a11.objIndex = in.readSint16BE();
curAct.a11.stateReq = in.readByte();
curAct.a11.actPassIndex = in.readUint16BE();
curAct.a11.actFailIndex = in.readUint16BE();
break;
case TEXT: // 12
curAct.a12.timer = in.readSint16BE();
curAct.a12.stringIndex = in.readSint16BE();
break;
case SWAP_IMAGES: // 13
curAct.a13.timer = in.readSint16BE();
curAct.a13.objIndex1 = in.readSint16BE();
curAct.a13.objIndex2 = in.readSint16BE();
break;
case COND_SCR: // 14
curAct.a14.timer = in.readSint16BE();
curAct.a14.objIndex = in.readSint16BE();
curAct.a14.screenReq = in.readSint16BE();
curAct.a14.actPassIndex = in.readUint16BE();
curAct.a14.actFailIndex = in.readUint16BE();
break;
case AUTOPILOT: // 15
curAct.a15.timer = in.readSint16BE();
curAct.a15.objIndex1 = in.readSint16BE();
curAct.a15.objIndex2 = in.readSint16BE();
curAct.a15.dx = in.readByte();
curAct.a15.dy = in.readByte();
break;
case INIT_OBJ_SEQ: // 16
curAct.a16.timer = in.readSint16BE();
curAct.a16.objIndex = in.readSint16BE();
curAct.a16.seqIndex = in.readSint16BE();
break;
case SET_STATE_BITS: // 17
curAct.a17.timer = in.readSint16BE();
curAct.a17.objIndex = in.readSint16BE();
curAct.a17.stateMask = in.readSint16BE();
break;
case CLEAR_STATE_BITS: // 18
curAct.a18.timer = in.readSint16BE();
curAct.a18.objIndex = in.readSint16BE();
curAct.a18.stateMask = in.readSint16BE();
break;
case TEST_STATE_BITS: // 19
curAct.a19.timer = in.readSint16BE();
curAct.a19.objIndex = in.readSint16BE();
curAct.a19.stateMask = in.readSint16BE();
curAct.a19.actPassIndex = in.readUint16BE();
curAct.a19.actFailIndex = in.readUint16BE();
break;
case DEL_EVENTS: // 20
curAct.a20.timer = in.readSint16BE();
curAct.a20.actTypeDel = (action_t) in.readByte();
break;
case GAMEOVER: // 21
curAct.a21.timer = in.readSint16BE();
break;
case INIT_HH_COORD: // 22
curAct.a22.timer = in.readSint16BE();
curAct.a22.objIndex = in.readSint16BE();
break;
case EXIT: // 23
curAct.a23.timer = in.readSint16BE();
break;
case BONUS: // 24
curAct.a24.timer = in.readSint16BE();
curAct.a24.pointIndex = in.readSint16BE();
break;
case COND_BOX: // 25
curAct.a25.timer = in.readSint16BE();
curAct.a25.objIndex = in.readSint16BE();
curAct.a25.x1 = in.readSint16BE();
curAct.a25.y1 = in.readSint16BE();
curAct.a25.x2 = in.readSint16BE();
curAct.a25.y2 = in.readSint16BE();
curAct.a25.actPassIndex = in.readUint16BE();
curAct.a25.actFailIndex = in.readUint16BE();
break;
case SOUND: // 26
curAct.a26.timer = in.readSint16BE();
curAct.a26.soundIndex = in.readSint16BE();
break;
case ADD_SCORE: // 27
curAct.a27.timer = in.readSint16BE();
curAct.a27.objIndex = in.readSint16BE();
break;
case SUB_SCORE: // 28
curAct.a28.timer = in.readSint16BE();
curAct.a28.objIndex = in.readSint16BE();
break;
case COND_CARRY: // 29
curAct.a29.timer = in.readSint16BE();
curAct.a29.objIndex = in.readSint16BE();
curAct.a29.actPassIndex = in.readUint16BE();
curAct.a29.actFailIndex = in.readUint16BE();
break;
case INIT_MAZE: // 30
curAct.a30.timer = in.readSint16BE();
curAct.a30.mazeSize = in.readByte();
curAct.a30.x1 = in.readSint16BE();
curAct.a30.y1 = in.readSint16BE();
curAct.a30.x2 = in.readSint16BE();
curAct.a30.y2 = in.readSint16BE();
curAct.a30.x3 = in.readSint16BE();
curAct.a30.x4 = in.readSint16BE();
curAct.a30.firstScreenIndex = in.readByte();
break;
case EXIT_MAZE: // 31
curAct.a31.timer = in.readSint16BE();
break;
case INIT_PRIORITY: // 32
curAct.a32.timer = in.readSint16BE();
curAct.a32.objIndex = in.readSint16BE();
curAct.a32.priority = in.readByte();
break;
case INIT_SCREEN: // 33
curAct.a33.timer = in.readSint16BE();
curAct.a33.objIndex = in.readSint16BE();
curAct.a33.screenIndex = in.readSint16BE();
break;
case AGSCHEDULE: // 34
curAct.a34.timer = in.readSint16BE();
curAct.a34.actIndex = in.readUint16BE();
break;
case REMAPPAL: // 35
curAct.a35.timer = in.readSint16BE();
curAct.a35.oldColorIndex = in.readSint16BE();
curAct.a35.newColorIndex = in.readSint16BE();
break;
case COND_NOUN: // 36
curAct.a36.timer = in.readSint16BE();
curAct.a36.nounIndex = in.readUint16BE();
curAct.a36.actPassIndex = in.readUint16BE();
curAct.a36.actFailIndex = in.readUint16BE();
break;
case SCREEN_STATE: // 37
curAct.a37.timer = in.readSint16BE();
curAct.a37.screenIndex = in.readSint16BE();
curAct.a37.newState = in.readByte();
break;
case INIT_LIPS: // 38
curAct.a38.timer = in.readSint16BE();
curAct.a38.lipsObjIndex = in.readSint16BE();
curAct.a38.objIndex = in.readSint16BE();
curAct.a38.dxLips = in.readByte();
curAct.a38.dyLips = in.readByte();
break;
case INIT_STORY_MODE: // 39
curAct.a39.timer = in.readSint16BE();
curAct.a39.storyModeFl = (in.readByte() == 1);
break;
case WARN: // 40
curAct.a40.timer = in.readSint16BE();
curAct.a40.stringIndex = in.readSint16BE();
break;
case COND_BONUS: // 41
curAct.a41.timer = in.readSint16BE();
curAct.a41.BonusIndex = in.readSint16BE();
curAct.a41.actPassIndex = in.readUint16BE();
curAct.a41.actFailIndex = in.readUint16BE();
break;
case TEXT_TAKE: // 42
curAct.a42.timer = in.readSint16BE();
curAct.a42.objIndex = in.readSint16BE();
break;
case YESNO: // 43
curAct.a43.timer = in.readSint16BE();
curAct.a43.promptIndex = in.readSint16BE();
curAct.a43.actYesIndex = in.readUint16BE();
curAct.a43.actNoIndex = in.readUint16BE();
break;
case STOP_ROUTE: // 44
curAct.a44.timer = in.readSint16BE();
break;
case COND_ROUTE: // 45
curAct.a45.timer = in.readSint16BE();
curAct.a45.routeIndex = in.readSint16BE();
curAct.a45.actPassIndex = in.readUint16BE();
curAct.a45.actFailIndex = in.readUint16BE();
break;
case INIT_JUMPEXIT: // 46
curAct.a46.timer = in.readSint16BE();
curAct.a46.jumpExitFl = (in.readByte() == 1);
break;
case INIT_VIEW: // 47
curAct.a47.timer = in.readSint16BE();
curAct.a47.objIndex = in.readSint16BE();
curAct.a47.viewx = in.readSint16BE();
curAct.a47.viewy = in.readSint16BE();
curAct.a47.direction = in.readSint16BE();
break;
case INIT_OBJ_FRAME: // 48
curAct.a48.timer = in.readSint16BE();
curAct.a48.objIndex = in.readSint16BE();
curAct.a48.seqIndex = in.readSint16BE();
curAct.a48.frameIndex = in.readSint16BE();
break;
case OLD_SONG: //49
curAct.a49.timer = in.readSint16BE();
curAct.a49.songIndex = in.readUint16BE();
break;
default:
error("Engine - Unknown action type encountered: %d", curAct.a0.actType);
}
}
/** /**
* Load actListArr from Hugo.dat * Load actListArr from Hugo.dat
*/ */
void Scheduler::loadActListArr(Common::ReadStream &in) { void Scheduler::loadActListArr(Common::ReadStream &in) {
debugC(6, kDebugSchedule, "loadActListArr(&in)"); debugC(6, kDebugSchedule, "loadActListArr(&in)");
int numElem, numSubElem, numSubAct; act tmpAct;
int numElem, numSubElem;
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) { for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
numElem = in.readUint16BE(); numElem = in.readUint16BE();
if (varnt == _vm->_gameVariant) { if (varnt == _vm->_gameVariant) {
_actListArrSize = numElem; _actListArrSize = numElem;
_actListArr = (act **)malloc(sizeof(act *) * _actListArrSize); _actListArr = (act **)malloc(sizeof(act *) * _actListArrSize);
for (int i = 0; i < _actListArrSize; i++) { }
numSubElem = in.readUint16BE();
for (int i = 0; i < numElem; i++) {
numSubElem = in.readUint16BE();
if (varnt == _vm->_gameVariant)
_actListArr[i] = (act *) malloc(sizeof(act) * (numSubElem + 1)); _actListArr[i] = (act *) malloc(sizeof(act) * (numSubElem + 1));
for (int j = 0; j < numSubElem; j++) { for (int j = 0; j < numSubElem; j++) {
_actListArr[i][j].a0.actType = (action_t) in.readByte(); if (varnt == _vm->_gameVariant) {
switch (_actListArr[i][j].a0.actType) { readAct(in, _actListArr[i][j]);
case ANULL: // -1 } else {
break; readAct(in, tmpAct);
case ASCHEDULE: // 0 if (tmpAct.a0.actType == PROMPT)
_actListArr[i][j].a0.timer = in.readSint16BE(); free(tmpAct.a3.responsePtr);
_actListArr[i][j].a0.actIndex = in.readUint16BE();
break;
case START_OBJ: // 1
_actListArr[i][j].a1.timer = in.readSint16BE();
_actListArr[i][j].a1.objIndex = in.readSint16BE();
_actListArr[i][j].a1.cycleNumb = in.readSint16BE();
_actListArr[i][j].a1.cycle = (cycle_t) in.readByte();
break;
case INIT_OBJXY: // 2
_actListArr[i][j].a2.timer = in.readSint16BE();
_actListArr[i][j].a2.objIndex = in.readSint16BE();
_actListArr[i][j].a2.x = in.readSint16BE();
_actListArr[i][j].a2.y = in.readSint16BE();
break;
case PROMPT: // 3
_actListArr[i][j].a3.timer = in.readSint16BE();
_actListArr[i][j].a3.promptIndex = in.readSint16BE();
numSubAct = in.readUint16BE();
_actListArr[i][j].a3.responsePtr = (int *) malloc(sizeof(int) * numSubAct);
for (int k = 0; k < numSubAct; k++)
_actListArr[i][j].a3.responsePtr[k] = in.readSint16BE();
_actListArr[i][j].a3.actPassIndex = in.readUint16BE();
_actListArr[i][j].a3.actFailIndex = in.readUint16BE();
_actListArr[i][j].a3.encodedFl = (in.readByte() == 1) ? true : false;
break;
case BKGD_COLOR: // 4
_actListArr[i][j].a4.timer = in.readSint16BE();
_actListArr[i][j].a4.newBackgroundColor = in.readUint32BE();
break;
case INIT_OBJVXY: // 5
_actListArr[i][j].a5.timer = in.readSint16BE();
_actListArr[i][j].a5.objIndex = in.readSint16BE();
_actListArr[i][j].a5.vx = in.readSint16BE();
_actListArr[i][j].a5.vy = in.readSint16BE();
break;
case INIT_CARRY: // 6
_actListArr[i][j].a6.timer = in.readSint16BE();
_actListArr[i][j].a6.objIndex = in.readSint16BE();
_actListArr[i][j].a6.carriedFl = (in.readByte() == 1) ? true : false;
break;
case INIT_HF_COORD: // 7
_actListArr[i][j].a7.timer = in.readSint16BE();
_actListArr[i][j].a7.objIndex = in.readSint16BE();
break;
case NEW_SCREEN: // 8
_actListArr[i][j].a8.timer = in.readSint16BE();
_actListArr[i][j].a8.screenIndex = in.readSint16BE();
break;
case INIT_OBJSTATE: // 9
_actListArr[i][j].a9.timer = in.readSint16BE();
_actListArr[i][j].a9.objIndex = in.readSint16BE();
_actListArr[i][j].a9.newState = in.readByte();
break;
case INIT_PATH: // 10
_actListArr[i][j].a10.timer = in.readSint16BE();
_actListArr[i][j].a10.objIndex = in.readSint16BE();
_actListArr[i][j].a10.newPathType = in.readSint16BE();
_actListArr[i][j].a10.vxPath = in.readByte();
_actListArr[i][j].a10.vyPath = in.readByte();
break;
case COND_R: // 11
_actListArr[i][j].a11.timer = in.readSint16BE();
_actListArr[i][j].a11.objIndex = in.readSint16BE();
_actListArr[i][j].a11.stateReq = in.readByte();
_actListArr[i][j].a11.actPassIndex = in.readUint16BE();
_actListArr[i][j].a11.actFailIndex = in.readUint16BE();
break;
case TEXT: // 12
_actListArr[i][j].a12.timer = in.readSint16BE();
_actListArr[i][j].a12.stringIndex = in.readSint16BE();
break;
case SWAP_IMAGES: // 13
_actListArr[i][j].a13.timer = in.readSint16BE();
_actListArr[i][j].a13.objIndex1 = in.readSint16BE();
_actListArr[i][j].a13.objIndex2 = in.readSint16BE();
break;
case COND_SCR: // 14
_actListArr[i][j].a14.timer = in.readSint16BE();
_actListArr[i][j].a14.objIndex = in.readSint16BE();
_actListArr[i][j].a14.screenReq = in.readSint16BE();
_actListArr[i][j].a14.actPassIndex = in.readUint16BE();
_actListArr[i][j].a14.actFailIndex = in.readUint16BE();
break;
case AUTOPILOT: // 15
_actListArr[i][j].a15.timer = in.readSint16BE();
_actListArr[i][j].a15.objIndex1 = in.readSint16BE();
_actListArr[i][j].a15.objIndex2 = in.readSint16BE();
_actListArr[i][j].a15.dx = in.readByte();
_actListArr[i][j].a15.dy = in.readByte();
break;
case INIT_OBJ_SEQ: // 16
_actListArr[i][j].a16.timer = in.readSint16BE();
_actListArr[i][j].a16.objIndex = in.readSint16BE();
_actListArr[i][j].a16.seqIndex = in.readSint16BE();
break;
case SET_STATE_BITS: // 17
_actListArr[i][j].a17.timer = in.readSint16BE();
_actListArr[i][j].a17.objIndex = in.readSint16BE();
_actListArr[i][j].a17.stateMask = in.readSint16BE();
break;
case CLEAR_STATE_BITS: // 18
_actListArr[i][j].a18.timer = in.readSint16BE();
_actListArr[i][j].a18.objIndex = in.readSint16BE();
_actListArr[i][j].a18.stateMask = in.readSint16BE();
break;
case TEST_STATE_BITS: // 19
_actListArr[i][j].a19.timer = in.readSint16BE();
_actListArr[i][j].a19.objIndex = in.readSint16BE();
_actListArr[i][j].a19.stateMask = in.readSint16BE();
_actListArr[i][j].a19.actPassIndex = in.readUint16BE();
_actListArr[i][j].a19.actFailIndex = in.readUint16BE();
break;
case DEL_EVENTS: // 20
_actListArr[i][j].a20.timer = in.readSint16BE();
_actListArr[i][j].a20.actTypeDel = (action_t) in.readByte();
break;
case GAMEOVER: // 21
_actListArr[i][j].a21.timer = in.readSint16BE();
break;
case INIT_HH_COORD: // 22
_actListArr[i][j].a22.timer = in.readSint16BE();
_actListArr[i][j].a22.objIndex = in.readSint16BE();
break;
case EXIT: // 23
_actListArr[i][j].a23.timer = in.readSint16BE();
break;
case BONUS: // 24
_actListArr[i][j].a24.timer = in.readSint16BE();
_actListArr[i][j].a24.pointIndex = in.readSint16BE();
break;
case COND_BOX: // 25
_actListArr[i][j].a25.timer = in.readSint16BE();
_actListArr[i][j].a25.objIndex = in.readSint16BE();
_actListArr[i][j].a25.x1 = in.readSint16BE();
_actListArr[i][j].a25.y1 = in.readSint16BE();
_actListArr[i][j].a25.x2 = in.readSint16BE();
_actListArr[i][j].a25.y2 = in.readSint16BE();
_actListArr[i][j].a25.actPassIndex = in.readUint16BE();
_actListArr[i][j].a25.actFailIndex = in.readUint16BE();
break;
case SOUND: // 26
_actListArr[i][j].a26.timer = in.readSint16BE();
_actListArr[i][j].a26.soundIndex = in.readSint16BE();
break;
case ADD_SCORE: // 27
_actListArr[i][j].a27.timer = in.readSint16BE();
_actListArr[i][j].a27.objIndex = in.readSint16BE();
break;
case SUB_SCORE: // 28
_actListArr[i][j].a28.timer = in.readSint16BE();
_actListArr[i][j].a28.objIndex = in.readSint16BE();
break;
case COND_CARRY: // 29
_actListArr[i][j].a29.timer = in.readSint16BE();
_actListArr[i][j].a29.objIndex = in.readSint16BE();
_actListArr[i][j].a29.actPassIndex = in.readUint16BE();
_actListArr[i][j].a29.actFailIndex = in.readUint16BE();
break;
case INIT_MAZE: // 30
_actListArr[i][j].a30.timer = in.readSint16BE();
_actListArr[i][j].a30.mazeSize = in.readByte();
_actListArr[i][j].a30.x1 = in.readSint16BE();
_actListArr[i][j].a30.y1 = in.readSint16BE();
_actListArr[i][j].a30.x2 = in.readSint16BE();
_actListArr[i][j].a30.y2 = in.readSint16BE();
_actListArr[i][j].a30.x3 = in.readSint16BE();
_actListArr[i][j].a30.x4 = in.readSint16BE();
_actListArr[i][j].a30.firstScreenIndex = in.readByte();
break;
case EXIT_MAZE: // 31
_actListArr[i][j].a31.timer = in.readSint16BE();
break;
case INIT_PRIORITY: // 32
_actListArr[i][j].a32.timer = in.readSint16BE();
_actListArr[i][j].a32.objIndex = in.readSint16BE();
_actListArr[i][j].a32.priority = in.readByte();
break;
case INIT_SCREEN: // 33
_actListArr[i][j].a33.timer = in.readSint16BE();
_actListArr[i][j].a33.objIndex = in.readSint16BE();
_actListArr[i][j].a33.screenIndex = in.readSint16BE();
break;
case AGSCHEDULE: // 34
_actListArr[i][j].a34.timer = in.readSint16BE();
_actListArr[i][j].a34.actIndex = in.readUint16BE();
break;
case REMAPPAL: // 35
_actListArr[i][j].a35.timer = in.readSint16BE();
_actListArr[i][j].a35.oldColorIndex = in.readSint16BE();
_actListArr[i][j].a35.newColorIndex = in.readSint16BE();
break;
case COND_NOUN: // 36
_actListArr[i][j].a36.timer = in.readSint16BE();
_actListArr[i][j].a36.nounIndex = in.readUint16BE();
_actListArr[i][j].a36.actPassIndex = in.readUint16BE();
_actListArr[i][j].a36.actFailIndex = in.readUint16BE();
break;
case SCREEN_STATE: // 37
_actListArr[i][j].a37.timer = in.readSint16BE();
_actListArr[i][j].a37.screenIndex = in.readSint16BE();
_actListArr[i][j].a37.newState = in.readByte();
break;
case INIT_LIPS: // 38
_actListArr[i][j].a38.timer = in.readSint16BE();
_actListArr[i][j].a38.lipsObjIndex = in.readSint16BE();
_actListArr[i][j].a38.objIndex = in.readSint16BE();
_actListArr[i][j].a38.dxLips = in.readByte();
_actListArr[i][j].a38.dyLips = in.readByte();
break;
case INIT_STORY_MODE: // 39
_actListArr[i][j].a39.timer = in.readSint16BE();
_actListArr[i][j].a39.storyModeFl = (in.readByte() == 1);
break;
case WARN: // 40
_actListArr[i][j].a40.timer = in.readSint16BE();
_actListArr[i][j].a40.stringIndex = in.readSint16BE();
break;
case COND_BONUS: // 41
_actListArr[i][j].a41.timer = in.readSint16BE();
_actListArr[i][j].a41.BonusIndex = in.readSint16BE();
_actListArr[i][j].a41.actPassIndex = in.readUint16BE();
_actListArr[i][j].a41.actFailIndex = in.readUint16BE();
break;
case TEXT_TAKE: // 42
_actListArr[i][j].a42.timer = in.readSint16BE();
_actListArr[i][j].a42.objIndex = in.readSint16BE();
break;
case YESNO: // 43
_actListArr[i][j].a43.timer = in.readSint16BE();
_actListArr[i][j].a43.promptIndex = in.readSint16BE();
_actListArr[i][j].a43.actYesIndex = in.readUint16BE();
_actListArr[i][j].a43.actNoIndex = in.readUint16BE();
break;
case STOP_ROUTE: // 44
_actListArr[i][j].a44.timer = in.readSint16BE();
break;
case COND_ROUTE: // 45
_actListArr[i][j].a45.timer = in.readSint16BE();
_actListArr[i][j].a45.routeIndex = in.readSint16BE();
_actListArr[i][j].a45.actPassIndex = in.readUint16BE();
_actListArr[i][j].a45.actFailIndex = in.readUint16BE();
break;
case INIT_JUMPEXIT: // 46
_actListArr[i][j].a46.timer = in.readSint16BE();
_actListArr[i][j].a46.jumpExitFl = (in.readByte() == 1);
break;
case INIT_VIEW: // 47
_actListArr[i][j].a47.timer = in.readSint16BE();
_actListArr[i][j].a47.objIndex = in.readSint16BE();
_actListArr[i][j].a47.viewx = in.readSint16BE();
_actListArr[i][j].a47.viewy = in.readSint16BE();
_actListArr[i][j].a47.direction = in.readSint16BE();
break;
case INIT_OBJ_FRAME: // 48
_actListArr[i][j].a48.timer = in.readSint16BE();
_actListArr[i][j].a48.objIndex = in.readSint16BE();
_actListArr[i][j].a48.seqIndex = in.readSint16BE();
_actListArr[i][j].a48.frameIndex = in.readSint16BE();
break;
case OLD_SONG: //49
_actListArr[i][j].a49.timer = in.readSint16BE();
_actListArr[i][j].a49.songIndex = in.readUint16BE();
break;
default:
error("Engine - Unknown action type encountered: %d", _actListArr[i][j].a0.actType);
}
} }
}
if (varnt == _vm->_gameVariant)
_actListArr[i][numSubElem].a0.actType = ANULL; _actListArr[i][numSubElem].a0.actType = ANULL;
}
} else {
for (int i = 0; i < numElem; i++) {
numSubElem = in.readUint16BE();
for (int j = 0; j < numSubElem; j++) {
numSubAct = in.readByte();
switch (numSubAct) {
case ANULL: // -1
break;
case ASCHEDULE: // 0
in.readSint16BE();
in.readUint16BE();
break;
case START_OBJ: // 1
in.readSint16BE();
in.readSint16BE();
in.readSint16BE();
in.readByte();
break;
case INIT_OBJXY: // 2
in.readSint16BE();
in.readSint16BE();
in.readSint16BE();
in.readSint16BE();
break;
case PROMPT: // 3
in.readSint16BE();
in.readSint16BE();
numSubAct = in.readUint16BE();
for (int k = 0; k < numSubAct; k++)
in.readSint16BE();
in.readUint16BE();
in.readUint16BE();
in.readByte();
break;
case BKGD_COLOR: // 4
in.readSint16BE();
in.readUint32BE();
break;
case INIT_OBJVXY: // 5
in.readSint16BE();
in.readSint16BE();
in.readSint16BE();
in.readSint16BE();
break;
case INIT_CARRY: // 6
in.readSint16BE();
in.readSint16BE();
in.readByte();
break;
case INIT_HF_COORD: // 7
in.readSint16BE();
in.readSint16BE();
break;
case NEW_SCREEN: // 8
in.readSint16BE();
in.readSint16BE();
break;
case INIT_OBJSTATE: // 9
in.readSint16BE();
in.readSint16BE();
in.readByte();
break;
case INIT_PATH: // 10
in.readSint16BE();
in.readSint16BE();
in.readSint16BE();
in.readByte();
in.readByte();
break;
case COND_R: // 11
in.readSint16BE();
in.readSint16BE();
in.readByte();
in.readUint16BE();
in.readUint16BE();
break;
case TEXT: // 12
in.readSint16BE();
in.readSint16BE();
break;
case SWAP_IMAGES: // 13
in.readSint16BE();
in.readSint16BE();
in.readSint16BE();
break;
case COND_SCR: // 14
in.readSint16BE();
in.readSint16BE();
in.readSint16BE();
in.readUint16BE();
in.readUint16BE();
break;
case AUTOPILOT: // 15
in.readSint16BE();
in.readSint16BE();
in.readSint16BE();
in.readByte();
in.readByte();
break;
case INIT_OBJ_SEQ: // 16
in.readSint16BE();
in.readSint16BE();
in.readSint16BE();
break;
case SET_STATE_BITS: // 17
in.readSint16BE();
in.readSint16BE();
in.readSint16BE();
break;
case CLEAR_STATE_BITS: // 18
in.readSint16BE();
in.readSint16BE();
in.readSint16BE();
break;
case TEST_STATE_BITS: // 19
in.readSint16BE();
in.readSint16BE();
in.readSint16BE();
in.readUint16BE();
in.readUint16BE();
break;
case DEL_EVENTS: // 20
in.readSint16BE();
in.readByte();
break;
case GAMEOVER: // 21
in.readSint16BE();
break;
case INIT_HH_COORD: // 22
in.readSint16BE();
in.readSint16BE();
break;
case EXIT: // 23
in.readSint16BE();
break;
case BONUS: // 24
in.readSint16BE();
in.readSint16BE();
break;
case COND_BOX: // 25
in.readSint16BE();
in.readSint16BE();
in.readSint16BE();
in.readSint16BE();
in.readSint16BE();
in.readSint16BE();
in.readUint16BE();
in.readUint16BE();
break;
case SOUND: // 26
in.readSint16BE();
in.readSint16BE();
break;
case ADD_SCORE: // 27
in.readSint16BE();
in.readSint16BE();
break;
case SUB_SCORE: // 28
in.readSint16BE();
in.readSint16BE();
break;
case COND_CARRY: // 29
in.readSint16BE();
in.readSint16BE();
in.readUint16BE();
in.readUint16BE();
break;
case INIT_MAZE: // 30
in.readSint16BE();
in.readByte();
in.readSint16BE();
in.readSint16BE();
in.readSint16BE();
in.readSint16BE();
in.readSint16BE();
in.readSint16BE();
in.readByte();
break;
case EXIT_MAZE: // 31
in.readSint16BE();
break;
case INIT_PRIORITY: // 32
in.readSint16BE();
in.readSint16BE();
in.readByte();
break;
case INIT_SCREEN: // 33
in.readSint16BE();
in.readSint16BE();
in.readSint16BE();
break;
case AGSCHEDULE: // 34
in.readSint16BE();
in.readUint16BE();
break;
case REMAPPAL: // 35
in.readSint16BE();
in.readSint16BE();
in.readSint16BE();
break;
case COND_NOUN: // 36
in.readSint16BE();
in.readUint16BE();
in.readUint16BE();
in.readUint16BE();
break;
case SCREEN_STATE: // 37
in.readSint16BE();
in.readSint16BE();
in.readByte();
break;
case INIT_LIPS: // 38
in.readSint16BE();
in.readSint16BE();
in.readSint16BE();
in.readByte();
in.readByte();
break;
case INIT_STORY_MODE: // 39
in.readSint16BE();
in.readByte();
break;
case WARN: // 40
in.readSint16BE();
in.readSint16BE();
break;
case COND_BONUS: // 41
in.readSint16BE();
in.readSint16BE();
in.readUint16BE();
in.readUint16BE();
break;
case TEXT_TAKE: // 42
in.readSint16BE();
in.readSint16BE();
break;
case YESNO: // 43
in.readSint16BE();
in.readSint16BE();
in.readUint16BE();
in.readUint16BE();
break;
case STOP_ROUTE: // 44
in.readSint16BE();
break;
case COND_ROUTE: // 45
in.readSint16BE();
in.readSint16BE();
in.readUint16BE();
in.readUint16BE();
break;
case INIT_JUMPEXIT: // 46
in.readSint16BE();
in.readByte();
break;
case INIT_VIEW: // 47
in.readSint16BE();
in.readSint16BE();
in.readSint16BE();
in.readSint16BE();
in.readSint16BE();
break;
case INIT_OBJ_FRAME: // 48
in.readSint16BE();
in.readSint16BE();
in.readSint16BE();
in.readSint16BE();
break;
case OLD_SONG: //49
in.readSint16BE();
in.readUint16BE();
break;
default:
error("Engine - Unknown action type encountered %d - variante %d pos %d.%d", numSubAct, varnt, i, j);
}
}
}
} }
} }
} }
/** /**
* Read _screenActs * Read _screenActs
*/ */
void Scheduler::loadScreenAct(Common::ReadStream &in) { void Scheduler::loadScreenAct(Common::SeekableReadStream &in) {
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) { for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
uint16 numElem = in.readUint16BE(); uint16 numElem = in.readUint16BE();
uint16 **wrkScreenActs = (uint16 **)malloc(sizeof(uint16 *) * numElem);
for (int i = 0; i < numElem; i++) {
uint16 numSubElem = in.readUint16BE();
if (numSubElem == 0) {
wrkScreenActs[i] = 0;
} else {
wrkScreenActs[i] = (uint16 *)malloc(sizeof(uint16) * numSubElem);
for (int j = 0; j < numSubElem; j++)
wrkScreenActs[i][j] = in.readUint16BE();
}
}
if (varnt == _vm->_gameVariant) { if (varnt == _vm->_gameVariant) {
_screenActsSize = numElem; _screenActsSize = numElem;
_screenActs = wrkScreenActs; _screenActs = (uint16 **)malloc(sizeof(uint16 *) * numElem);
for (int i = 0; i < numElem; i++) {
uint16 numSubElem = in.readUint16BE();
if (numSubElem == 0) {
_screenActs[i] = 0;
} else {
_screenActs[i] = (uint16 *)malloc(sizeof(uint16) * numSubElem);
for (int j = 0; j < numSubElem; j++)
_screenActs[i][j] = in.readUint16BE();
}
}
} else { } else {
for (int i = 0; i < numElem; i++) for (int i = 0; i < numElem; i++) {
free(wrkScreenActs[i]); uint16 numSubElem = in.readUint16BE();
free(wrkScreenActs); in.skip(numSubElem * sizeof(uint16));
}
} }
} }
} }

View file

@ -466,11 +466,12 @@ public:
void insertActionList(const uint16 actIndex); void insertActionList(const uint16 actIndex);
void loadActListArr(Common::ReadStream &in); void loadActListArr(Common::ReadStream &in);
void loadAlNewscrIndex(Common::ReadStream &in); void loadAlNewscrIndex(Common::ReadStream &in);
void loadPoints(Common::ReadStream &in); void loadPoints(Common::SeekableReadStream &in);
void loadScreenAct(Common::ReadStream &in); void loadScreenAct(Common::SeekableReadStream &in);
void newScreen(const int screenIndex); void newScreen(const int screenIndex);
void processBonus(const int bonusIndex); void processBonus(const int bonusIndex);
void processMaze(const int x1, const int x2, const int y1, const int y2); void processMaze(const int x1, const int x2, const int y1, const int y2);
void readAct(Common::ReadStream &in, act &curAct);
void restoreSchedulerData(Common::ReadStream *in); void restoreSchedulerData(Common::ReadStream *in);
void restoreScreen(const int screenIndex); void restoreScreen(const int screenIndex);
void saveSchedulerData(Common::WriteStream *out); void saveSchedulerData(Common::WriteStream *out);

View file

@ -42,8 +42,8 @@ public:
const char *getTextParser(int parserIndex) const { return _textParser[parserIndex]; } const char *getTextParser(int parserIndex) const { return _textParser[parserIndex]; }
const char *getTextUtil(int utilIndex) const { return _textUtil[utilIndex]; } const char *getTextUtil(int utilIndex) const { return _textUtil[utilIndex]; }
const char *getVerb(int idx1, int idx2) const { return _arrayVerbs[idx1][idx2]; } const char *getVerb(int idx1, int idx2) const { return _arrayVerbs[idx1][idx2]; }
char **getNounArray(int idx1) { return _arrayNouns[idx1]; } char **getNounArray(int idx1) const { return _arrayNouns[idx1]; }
char **getVerbArray(int idx1) { return _arrayVerbs[idx1]; } char **getVerbArray(int idx1) const { return _arrayVerbs[idx1]; }
void loadAllTexts(Common::ReadStream &in); void loadAllTexts(Common::ReadStream &in);
void freeAllTexts(); void freeAllTexts();