From 399b59a583b0ac92941cfe7756712d80970e47ee Mon Sep 17 00:00:00 2001 From: strangerke Date: Fri, 18 Feb 2011 08:11:55 +0100 Subject: HUGO: Avoid duplicated code in functions related to HUGO.DAT --- engines/hugo/display.cpp | 2 +- engines/hugo/display.h | 2 +- engines/hugo/file_v1d.cpp | 3 +- engines/hugo/file_v1w.cpp | 3 +- engines/hugo/file_v2d.cpp | 3 +- engines/hugo/file_v3d.cpp | 8 +- engines/hugo/hugo.cpp | 8 +- engines/hugo/hugo.h | 2 +- engines/hugo/intro.cpp | 7 +- engines/hugo/intro.h | 2 +- engines/hugo/inventory.cpp | 5 +- engines/hugo/inventory.h | 2 +- engines/hugo/mouse.cpp | 36 +- engines/hugo/mouse.h | 1 + engines/hugo/object.cpp | 193 +++++----- engines/hugo/object.h | 2 + engines/hugo/parser.cpp | 111 +++--- engines/hugo/parser.h | 4 +- engines/hugo/schedule.cpp | 888 ++++++++++++++++----------------------------- engines/hugo/schedule.h | 5 +- engines/hugo/text.h | 4 +- 21 files changed, 495 insertions(+), 796 deletions(-) (limited to 'engines') diff --git a/engines/hugo/display.cpp b/engines/hugo/display.cpp index f2c4990f66..fffa5b207d 100644 --- a/engines/hugo/display.cpp +++ b/engines/hugo/display.cpp @@ -194,7 +194,7 @@ void Screen::savePal(Common::WriteStream *f) const { /** * Restore the current palette from a savegame */ -void Screen::restorePal(Common::SeekableReadStream *f) { +void Screen::restorePal(Common::ReadStream *f) { debugC(1, kDebugDisplay, "restorePal()"); byte pal[4]; diff --git a/engines/hugo/display.h b/engines/hugo/display.h index b5a3c763bc..8c504cead4 100644 --- a/engines/hugo/display.h +++ b/engines/hugo/display.h @@ -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 remapPal(uint16 oldIndex, uint16 newIndex); void resetInventoryObjId(); - void restorePal(Common::SeekableReadStream *f); + void restorePal(Common::ReadStream *f); void savePal(Common::WriteStream *f) const; void setBackgroundColor(const uint16 color); void setCursorPal(); diff --git a/engines/hugo/file_v1d.cpp b/engines/hugo/file_v1d.cpp index be23edb7b4..d8b3fa494f 100644 --- a/engines/hugo/file_v1d.cpp +++ b/engines/hugo/file_v1d.cpp @@ -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]); if (!Common::File::exists(buf)) { - for (int i = 0; i < kOvlSize; i++) - image[i] = 0; + memset(image, 0, sizeof(image)); warning("File not found: %s", buf.c_str()); return; } diff --git a/engines/hugo/file_v1w.cpp b/engines/hugo/file_v1w.cpp index b902e50f15..dbb093752a 100644 --- a/engines/hugo/file_v1w.cpp +++ b/engines/hugo/file_v1w.cpp @@ -81,8 +81,7 @@ void FileManager_v1w::readOverlay(const int screenNum, image_pt image, ovl_t ove break; } if (i == 0) { - for (int idx = 0; idx < kOvlSize; idx++) - image[idx] = 0; + memset(image, 0, sizeof(image)); return; } _sceneryArchive1.read(tmpImage, kOvlSize); diff --git a/engines/hugo/file_v2d.cpp b/engines/hugo/file_v2d.cpp index 9c66f6375f..ffadd17481 100644 --- a/engines/hugo/file_v2d.cpp +++ b/engines/hugo/file_v2d.cpp @@ -137,8 +137,7 @@ void FileManager_v2d::readOverlay(const int screenNum, image_pt image, ovl_t ove break; } if (i == 0) { - for (int idx = 0; idx < kOvlSize; idx++) - image[idx] = 0; + memset(image, 0, sizeof(image)); return; } diff --git a/engines/hugo/file_v3d.cpp b/engines/hugo/file_v3d.cpp index ec0d736bb9..2f3e5af3f0 100644 --- a/engines/hugo/file_v3d.cpp +++ b/engines/hugo/file_v3d.cpp @@ -144,8 +144,7 @@ void FileManager_v3d::readOverlay(const int screenNum, image_pt image, ovl_t ove break; } if (i == 0) { - for (int idx = 0; idx < kOvlSize; idx++) - image[idx] = 0; + memset(image, 0, sizeof(image)); 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 for (i = 0; i <= (byte)data; i++, k++) *tmpImage++ = _sceneryArchive1.readByte(); - } else { // Repeat next byte -data+1 times + } else { // Repeat next byte -data+1 times int16 j = _sceneryArchive1.readByte(); 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; } if (i == 0) { - for (int idx = 0; idx < kOvlSize; idx++) - image[idx] = 0; + memset(image, 0, sizeof(image)); return; } diff --git a/engines/hugo/hugo.cpp b/engines/hugo/hugo.cpp index 9f64db83ff..831fd36a9f 100644 --- a/engines/hugo/hugo.cpp +++ b/engines/hugo/hugo.cpp @@ -399,8 +399,7 @@ bool HugoEngine::loadHugoDat() { numElem = in.readUint16BE(); if (varnt == _gameVariant) { _screenStates = (byte *)malloc(sizeof(byte) * numElem); - for (int i = 0; i < numElem; i++) - _screenStates[i] = 0; + memset(_screenStates, 0, sizeof(_screenStates)); } } @@ -426,7 +425,7 @@ bool HugoEngine::loadHugoDat() { return true; } -uint16 **HugoEngine::loadLongArray(Common::ReadStream &in) { +uint16 **HugoEngine::loadLongArray(Common::SeekableReadStream &in) { uint16 **resArray = 0; for (int varnt = 0; varnt < _numVariant; varnt++) { @@ -443,8 +442,7 @@ uint16 **HugoEngine::loadLongArray(Common::ReadStream &in) { resRow[j] = in.readUint16BE(); resArray[i] = resRow; } else { - for (int j = 0; j < numElems; j++) - in.readUint16BE(); + in.skip(numElems * sizeof(uint16)); } } } diff --git a/engines/hugo/hugo.h b/engines/hugo/hugo.h index 7c12fcd2ee..848001c4ef 100644 --- a/engines/hugo/hugo.h +++ b/engines/hugo/hugo.h @@ -323,7 +323,7 @@ public: const char *getCopyrightString() const { return "Copyright 1989-1997 David P Gray, All Rights Reserved."; } Common::String getSavegameFilename(int slot); - uint16 **loadLongArray(Common::ReadStream &in); + uint16 **loadLongArray(Common::SeekableReadStream &in); FileManager *_file; Scheduler *_scheduler; diff --git a/engines/hugo/intro.cpp b/engines/hugo/intro.cpp index 4ee46f80b5..3a11baf620 100644 --- a/engines/hugo/intro.cpp +++ b/engines/hugo/intro.cpp @@ -51,7 +51,7 @@ IntroHandler::~IntroHandler() { /** * 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++) { int numRows = in.readUint16BE(); if (varnt == _vm->_gameVariant) { @@ -63,10 +63,7 @@ void IntroHandler::loadIntroData(Common::ReadStream &in) { _introY[i] = in.readByte(); } } else { - for (int i = 0; i < numRows; i++) { - in.readByte(); - in.readByte(); - } + in.skip(numRows * 2); } } } diff --git a/engines/hugo/intro.h b/engines/hugo/intro.h index 351352554e..c743475644 100644 --- a/engines/hugo/intro.h +++ b/engines/hugo/intro.h @@ -55,7 +55,7 @@ public: virtual bool introPlay() = 0; void freeIntroData(); - void loadIntroData(Common::ReadStream &in); + void loadIntroData(Common::SeekableReadStream &in); byte getIntroSize() const { return _introXSize; } diff --git a/engines/hugo/inventory.cpp b/engines/hugo/inventory.cpp index a45df7e077..7862805d8b 100644 --- a/engines/hugo/inventory.cpp +++ b/engines/hugo/inventory.cpp @@ -57,7 +57,7 @@ InventoryHandler::InventoryHandler(HugoEngine *vm) : _vm(vm), _invent(0) { /** * 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++) { int16 numElem = in.readUint16BE(); if (varnt == _vm->_gameVariant) { @@ -66,8 +66,7 @@ void InventoryHandler::loadInvent(Common::ReadStream &in) { for (int i = 0; i < numElem; i++) _invent[i] = in.readSint16BE(); } else { - for (int i = 0; i < numElem; i++) - in.readSint16BE(); + in.skip(numElem * sizeof(int16)); } } } diff --git a/engines/hugo/inventory.h b/engines/hugo/inventory.h index 8d60904c6f..7b1390a3ce 100644 --- a/engines/hugo/inventory.h +++ b/engines/hugo/inventory.h @@ -51,7 +51,7 @@ public: istate_t getInventoryState() const { return _inventoryState; } int16 findIconId(int16 objId); - void loadInvent(Common::ReadStream &in); + void loadInvent(Common::SeekableReadStream &in); int16 processInventory(const invact_t action, ...); void runInventory(); diff --git a/engines/hugo/mouse.cpp b/engines/hugo/mouse.cpp index 9bbc60f04b..3464fea869 100644 --- a/engines/hugo/mouse.cpp +++ b/engines/hugo/mouse.cpp @@ -293,31 +293,31 @@ void MouseHandler::mouseHandler() { 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 */ void MouseHandler::loadHotspots(Common::ReadStream &in) { - // Read _hotspots + hotspot_t *wrkHotspots = 0; + hotspot_t tmp; for (int varnt = 0; varnt < _vm->_numVariant; varnt++) { 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) - _hotspots = wrkHotspots; - else - free(wrkHotspots); + _hotspots = wrkHotspots = (hotspot_t *)malloc(sizeof(hotspot_t) * numRows); + + for (int i = 0; i < numRows; i++) + readHotspot(in, (varnt == _vm->_gameVariant) ? wrkHotspots[i] : tmp); } } diff --git a/engines/hugo/mouse.h b/engines/hugo/mouse.h index eae13b48fb..d43ca054dd 100644 --- a/engines/hugo/mouse.h +++ b/engines/hugo/mouse.h @@ -83,6 +83,7 @@ private: 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 processLeftClick(const int16 objId, const int16 cx, const int16 cy); + void readHotspot(Common::ReadStream &in, hotspot_t &hotspot); }; } // End of namespace Hugo diff --git a/engines/hugo/object.cpp b/engines/hugo/object.cpp index 786ea4762a..f9364a8781 100644 --- a/engines/hugo/object.cpp +++ b/engines/hugo/object.cpp @@ -368,141 +368,114 @@ bool ObjectHandler::findObjectSpace(object_t *obj, int16 *destx, int16 *desty) { 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 */ void ObjectHandler::loadObjectUses(Common::ReadStream &in) { + uses_t tmpUse; //Read _uses for (int varnt = 0; varnt < _vm->_numVariant; varnt++) { + tmpUse.targets = 0; 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) { _usesSize = numElem; - _uses = wrkUses; - } else { - for (int i = 0; i < numElem; i++) - free(wrkUses[i].targets); - free(wrkUses); + _uses = (uses_t *)malloc(sizeof(uses_t) * numElem); } + + 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 */ void ObjectHandler::loadObjectArr(Common::ReadStream &in) { debugC(6, kDebugObject, "loadObject(&in)"); + object_t tmpObject; for (int varnt = 0; varnt < _vm->_numVariant; varnt++) { uint16 numElem = in.readUint16BE(); + tmpObject.stateDataIndex = 0; if (varnt == _vm->_gameVariant) { _objCount = 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); } } diff --git a/engines/hugo/object.h b/engines/hugo/object.h index ef60e622f8..dc69411bfa 100644 --- a/engines/hugo/object.h +++ b/engines/hugo/object.h @@ -78,6 +78,8 @@ public: void loadNumObj(Common::ReadStream &in); void lookObject(object_t *obj); void readObjectImages(); + void readObject(Common::ReadStream &in, object_t &curObject); + void readUse(Common::ReadStream &in, uses_t &curUse); void restoreAllSeq(); void restoreObjects(Common::SeekableReadStream *in); void saveObjects(Common::WriteStream *out); diff --git a/engines/hugo/parser.cpp b/engines/hugo/parser.cpp index c7e252b012..2d5f6c99bb 100644 --- a/engines/hugo/parser.cpp +++ b/engines/hugo/parser.cpp @@ -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) { + cmd tmpCmd; for (int varnt = 0; varnt < _vm->_numVariant; varnt++) { uint16 numElem = in.readUint16BE(); if (varnt == _vm->_gameVariant) { _cmdListSize = numElem; _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); - for (int j = 0; j < numSubElem; j++) { - _cmdList[i][j].verbIndex = in.readUint16BE(); - _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(); - } - } + for (int16 j = 0; j < numSubElem; j++) + readCmd(in, (varnt == _vm->_gameVariant) ? _cmdList[i][j] : tmpCmd); } } } + +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 */ void Parser::loadBackgroundObjects(Common::ReadStream &in) { + background_t tmpBG; + for (int varnt = 0; varnt < _vm->_numVariant; varnt++) { 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++) { uint16 numSubElem = in.readUint16BE(); - wrkBackgroundObjects[i] = (background_t *)malloc(sizeof(background_t) * numSubElem); - for (int j = 0; j < numSubElem; j++) { - 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) + _backgroundObjects[i] = (background_t *)malloc(sizeof(background_t) * numSubElem); - if (varnt == _vm->_gameVariant) { - _backgroundObjectsSize = numElem; - _backgroundObjects = wrkBackgroundObjects; - } else { - for (int i = 0; i < numElem; i++) - free(wrkBackgroundObjects[i]); - free(wrkBackgroundObjects); + for (int j = 0; j < numSubElem; j++) + readBG(in, (varnt == _vm->_gameVariant) ? _backgroundObjects[i][j] : tmpBG); } } } @@ -142,27 +139,21 @@ void Parser::loadBackgroundObjects(Common::ReadStream &in) { * Read _catchallList from Hugo.dat */ void Parser::loadCatchallList(Common::ReadStream &in) { + background_t *wrkCatchallList = 0; + background_t tmpBG; + for (int varnt = 0; varnt < _vm->_numVariant; varnt++) { 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) - _catchallList = wrkCatchallList; - else - free(wrkCatchallList); + _catchallList = wrkCatchallList = (background_t *)malloc(sizeof(background_t) * numElem); + + 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); } diff --git a/engines/hugo/parser.h b/engines/hugo/parser.h index 5bc602fb9a..41b40f0527 100644 --- a/engines/hugo/parser.h +++ b/engines/hugo/parser.h @@ -55,7 +55,7 @@ public: void command(const char *format, ...); void freeParser(); void keyHandler(Common::Event event); - void loadArrayReqs(Common::ReadStream &in); + void loadArrayReqs(Common::SeekableReadStream &in); void loadBackgroundObjects(Common::ReadStream &in); void loadCatchallList(Common::ReadStream &in); void loadCmdList(Common::ReadStream &in); @@ -82,6 +82,8 @@ protected: const char *findNoun() const; const char *findVerb() const; + void readBG(Common::ReadStream &in, background_t &curBG); + void readCmd(Common::ReadStream &in, cmd &curCmd); void showDosInventory() const; bool _checkDoubleF1Fl; // Flag used to display user help or instructions diff --git a/engines/hugo/schedule.cpp b/engines/hugo/schedule.cpp index c5d1683a96..93b1a75a5b 100644 --- a/engines/hugo/schedule.cpp +++ b/engines/hugo/schedule.cpp @@ -253,7 +253,7 @@ void Scheduler::loadAlNewscrIndex(Common::ReadStream &in) { /** * Load Points from Hugo.dat */ -void Scheduler::loadPoints(Common::ReadStream &in) { +void Scheduler::loadPoints(Common::SeekableReadStream &in) { debugC(6, kDebugSchedule, "loadPoints(&in)"); for (int varnt = 0; varnt < _vm->_numVariant; varnt++) { @@ -266,610 +266,350 @@ void Scheduler::loadPoints(Common::ReadStream &in) { _points[i].scoredFl = false; } } else { - for (int i = 0; i < numElem; i++) - in.readByte(); + in.skip(numElem); } } } +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 */ void Scheduler::loadActListArr(Common::ReadStream &in) { debugC(6, kDebugSchedule, "loadActListArr(&in)"); - int numElem, numSubElem, numSubAct; + act tmpAct; + + int numElem, numSubElem; for (int varnt = 0; varnt < _vm->_numVariant; varnt++) { numElem = in.readUint16BE(); if (varnt == _vm->_gameVariant) { _actListArrSize = numElem; _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)); - for (int j = 0; j < numSubElem; j++) { - _actListArr[i][j].a0.actType = (action_t) in.readByte(); - switch (_actListArr[i][j].a0.actType) { - case ANULL: // -1 - break; - case ASCHEDULE: // 0 - _actListArr[i][j].a0.timer = in.readSint16BE(); - _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); - } - } - _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); - } + for (int j = 0; j < numSubElem; j++) { + if (varnt == _vm->_gameVariant) { + readAct(in, _actListArr[i][j]); + } else { + readAct(in, tmpAct); + if (tmpAct.a0.actType == PROMPT) + free(tmpAct.a3.responsePtr); } } + + if (varnt == _vm->_gameVariant) + _actListArr[i][numSubElem].a0.actType = ANULL; } } } + /** * Read _screenActs */ -void Scheduler::loadScreenAct(Common::ReadStream &in) { +void Scheduler::loadScreenAct(Common::SeekableReadStream &in) { for (int varnt = 0; varnt < _vm->_numVariant; varnt++) { 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) { _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 { - for (int i = 0; i < numElem; i++) - free(wrkScreenActs[i]); - free(wrkScreenActs); + for (int i = 0; i < numElem; i++) { + uint16 numSubElem = in.readUint16BE(); + in.skip(numSubElem * sizeof(uint16)); + } } } } diff --git a/engines/hugo/schedule.h b/engines/hugo/schedule.h index e2169a0aa9..c7a6003ddf 100644 --- a/engines/hugo/schedule.h +++ b/engines/hugo/schedule.h @@ -466,11 +466,12 @@ public: void insertActionList(const uint16 actIndex); void loadActListArr(Common::ReadStream &in); void loadAlNewscrIndex(Common::ReadStream &in); - void loadPoints(Common::ReadStream &in); - void loadScreenAct(Common::ReadStream &in); + void loadPoints(Common::SeekableReadStream &in); + void loadScreenAct(Common::SeekableReadStream &in); void newScreen(const int screenIndex); void processBonus(const int bonusIndex); 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 restoreScreen(const int screenIndex); void saveSchedulerData(Common::WriteStream *out); diff --git a/engines/hugo/text.h b/engines/hugo/text.h index cf728f6ad4..ec4001567d 100644 --- a/engines/hugo/text.h +++ b/engines/hugo/text.h @@ -42,8 +42,8 @@ public: const char *getTextParser(int parserIndex) const { return _textParser[parserIndex]; } const char *getTextUtil(int utilIndex) const { return _textUtil[utilIndex]; } const char *getVerb(int idx1, int idx2) const { return _arrayVerbs[idx1][idx2]; } - char **getNounArray(int idx1) { return _arrayNouns[idx1]; } - char **getVerbArray(int idx1) { return _arrayVerbs[idx1]; } + char **getNounArray(int idx1) const { return _arrayNouns[idx1]; } + char **getVerbArray(int idx1) const { return _arrayVerbs[idx1]; } void loadAllTexts(Common::ReadStream &in); void freeAllTexts(); -- cgit v1.2.3