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
*/
void Screen::restorePal(Common::SeekableReadStream *f) {
void Screen::restorePal(Common::ReadStream *f) {
debugC(1, kDebugDisplay, "restorePal()");
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 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();

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]);
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;
}

View file

@ -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);

View file

@ -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;
}

View file

@ -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;
}
@ -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;
}

View file

@ -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));
}
}
}

View file

@ -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;

View file

@ -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);
}
}
}

View file

@ -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; }

View file

@ -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));
}
}
}

View file

@ -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();

View file

@ -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);
}
}

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 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

View file

@ -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);
}
}

View file

@ -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);

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) {
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++) {
}
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);
}

View file

@ -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

View file

@ -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();
_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();
if (varnt == _vm->_gameVariant)
_actListArr[i] = (act *) malloc(sizeof(act) * (numSubElem + 1));
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);
}
}
}
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);
if (varnt == _vm->_gameVariant) {
_screenActsSize = numElem;
_screenActs = (uint16 **)malloc(sizeof(uint16 *) * numElem);
for (int i = 0; i < numElem; i++) {
uint16 numSubElem = in.readUint16BE();
if (numSubElem == 0) {
wrkScreenActs[i] = 0;
_screenActs[i] = 0;
} else {
wrkScreenActs[i] = (uint16 *)malloc(sizeof(uint16) * numSubElem);
_screenActs[i] = (uint16 *)malloc(sizeof(uint16) * numSubElem);
for (int j = 0; j < numSubElem; j++)
wrkScreenActs[i][j] = in.readUint16BE();
_screenActs[i][j] = in.readUint16BE();
}
}
if (varnt == _vm->_gameVariant) {
_screenActsSize = numElem;
_screenActs = wrkScreenActs;
} 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));
}
}
}
}

View file

@ -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);

View file

@ -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();