HUGO: Avoid duplicated code in functions related to HUGO.DAT
This commit is contained in:
parent
41a5fc8476
commit
399b59a583
21 changed files with 495 additions and 796 deletions
|
@ -194,7 +194,7 @@ void Screen::savePal(Common::WriteStream *f) const {
|
||||||
/**
|
/**
|
||||||
* Restore the current palette from a savegame
|
* Restore the current palette from a savegame
|
||||||
*/
|
*/
|
||||||
void Screen::restorePal(Common::SeekableReadStream *f) {
|
void Screen::restorePal(Common::ReadStream *f) {
|
||||||
debugC(1, kDebugDisplay, "restorePal()");
|
debugC(1, kDebugDisplay, "restorePal()");
|
||||||
|
|
||||||
byte pal[4];
|
byte pal[4];
|
||||||
|
|
|
@ -73,7 +73,7 @@ public:
|
||||||
void moveImage(image_pt srcImage, const int16 x1, const int16 y1, const int16 dx, int16 dy, const int16 width1, image_pt dstImage, const int16 x2, const int16 y2, const int16 width2);
|
void moveImage(image_pt srcImage, const int16 x1, const int16 y1, const int16 dx, int16 dy, const int16 width1, image_pt dstImage, const int16 x2, const int16 y2, const int16 width2);
|
||||||
void remapPal(uint16 oldIndex, uint16 newIndex);
|
void remapPal(uint16 oldIndex, uint16 newIndex);
|
||||||
void resetInventoryObjId();
|
void resetInventoryObjId();
|
||||||
void restorePal(Common::SeekableReadStream *f);
|
void restorePal(Common::ReadStream *f);
|
||||||
void savePal(Common::WriteStream *f) const;
|
void savePal(Common::WriteStream *f) const;
|
||||||
void setBackgroundColor(const uint16 color);
|
void setBackgroundColor(const uint16 color);
|
||||||
void setCursorPal();
|
void setCursorPal();
|
||||||
|
|
|
@ -63,8 +63,7 @@ void FileManager_v1d::readOverlay(const int screenNum, image_pt image, const ovl
|
||||||
Common::String buf = Common::String(_vm->_text->getScreenNames(screenNum)) + Common::String(ovl_ext[overlayType]);
|
Common::String buf = Common::String(_vm->_text->getScreenNames(screenNum)) + Common::String(ovl_ext[overlayType]);
|
||||||
|
|
||||||
if (!Common::File::exists(buf)) {
|
if (!Common::File::exists(buf)) {
|
||||||
for (int i = 0; i < kOvlSize; i++)
|
memset(image, 0, sizeof(image));
|
||||||
image[i] = 0;
|
|
||||||
warning("File not found: %s", buf.c_str());
|
warning("File not found: %s", buf.c_str());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -81,8 +81,7 @@ void FileManager_v1w::readOverlay(const int screenNum, image_pt image, ovl_t ove
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
for (int idx = 0; idx < kOvlSize; idx++)
|
memset(image, 0, sizeof(image));
|
||||||
image[idx] = 0;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
_sceneryArchive1.read(tmpImage, kOvlSize);
|
_sceneryArchive1.read(tmpImage, kOvlSize);
|
||||||
|
|
|
@ -137,8 +137,7 @@ void FileManager_v2d::readOverlay(const int screenNum, image_pt image, ovl_t ove
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
for (int idx = 0; idx < kOvlSize; idx++)
|
memset(image, 0, sizeof(image));
|
||||||
image[idx] = 0;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -144,8 +144,7 @@ void FileManager_v3d::readOverlay(const int screenNum, image_pt image, ovl_t ove
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
for (int idx = 0; idx < kOvlSize; idx++)
|
memset(image, 0, sizeof(image));
|
||||||
image[idx] = 0;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -158,7 +157,7 @@ void FileManager_v3d::readOverlay(const int screenNum, image_pt image, ovl_t ove
|
||||||
else if (data >= 0) { // Copy next data+1 literally
|
else if (data >= 0) { // Copy next data+1 literally
|
||||||
for (i = 0; i <= (byte)data; i++, k++)
|
for (i = 0; i <= (byte)data; i++, k++)
|
||||||
*tmpImage++ = _sceneryArchive1.readByte();
|
*tmpImage++ = _sceneryArchive1.readByte();
|
||||||
} else { // Repeat next byte -data+1 times
|
} else { // Repeat next byte -data+1 times
|
||||||
int16 j = _sceneryArchive1.readByte();
|
int16 j = _sceneryArchive1.readByte();
|
||||||
|
|
||||||
for (i = 0; i < (byte)(-data + 1); i++, k++)
|
for (i = 0; i < (byte)(-data + 1); i++, k++)
|
||||||
|
@ -184,8 +183,7 @@ void FileManager_v3d::readOverlay(const int screenNum, image_pt image, ovl_t ove
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
for (int idx = 0; idx < kOvlSize; idx++)
|
memset(image, 0, sizeof(image));
|
||||||
image[idx] = 0;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -399,8 +399,7 @@ bool HugoEngine::loadHugoDat() {
|
||||||
numElem = in.readUint16BE();
|
numElem = in.readUint16BE();
|
||||||
if (varnt == _gameVariant) {
|
if (varnt == _gameVariant) {
|
||||||
_screenStates = (byte *)malloc(sizeof(byte) * numElem);
|
_screenStates = (byte *)malloc(sizeof(byte) * numElem);
|
||||||
for (int i = 0; i < numElem; i++)
|
memset(_screenStates, 0, sizeof(_screenStates));
|
||||||
_screenStates[i] = 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -426,7 +425,7 @@ bool HugoEngine::loadHugoDat() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16 **HugoEngine::loadLongArray(Common::ReadStream &in) {
|
uint16 **HugoEngine::loadLongArray(Common::SeekableReadStream &in) {
|
||||||
uint16 **resArray = 0;
|
uint16 **resArray = 0;
|
||||||
|
|
||||||
for (int varnt = 0; varnt < _numVariant; varnt++) {
|
for (int varnt = 0; varnt < _numVariant; varnt++) {
|
||||||
|
@ -443,8 +442,7 @@ uint16 **HugoEngine::loadLongArray(Common::ReadStream &in) {
|
||||||
resRow[j] = in.readUint16BE();
|
resRow[j] = in.readUint16BE();
|
||||||
resArray[i] = resRow;
|
resArray[i] = resRow;
|
||||||
} else {
|
} else {
|
||||||
for (int j = 0; j < numElems; j++)
|
in.skip(numElems * sizeof(uint16));
|
||||||
in.readUint16BE();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -323,7 +323,7 @@ public:
|
||||||
const char *getCopyrightString() const { return "Copyright 1989-1997 David P Gray, All Rights Reserved."; }
|
const char *getCopyrightString() const { return "Copyright 1989-1997 David P Gray, All Rights Reserved."; }
|
||||||
|
|
||||||
Common::String getSavegameFilename(int slot);
|
Common::String getSavegameFilename(int slot);
|
||||||
uint16 **loadLongArray(Common::ReadStream &in);
|
uint16 **loadLongArray(Common::SeekableReadStream &in);
|
||||||
|
|
||||||
FileManager *_file;
|
FileManager *_file;
|
||||||
Scheduler *_scheduler;
|
Scheduler *_scheduler;
|
||||||
|
|
|
@ -51,7 +51,7 @@ IntroHandler::~IntroHandler() {
|
||||||
/**
|
/**
|
||||||
* Read _introX and _introY from hugo.dat
|
* Read _introX and _introY from hugo.dat
|
||||||
*/
|
*/
|
||||||
void IntroHandler::loadIntroData(Common::ReadStream &in) {
|
void IntroHandler::loadIntroData(Common::SeekableReadStream &in) {
|
||||||
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
|
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
|
||||||
int numRows = in.readUint16BE();
|
int numRows = in.readUint16BE();
|
||||||
if (varnt == _vm->_gameVariant) {
|
if (varnt == _vm->_gameVariant) {
|
||||||
|
@ -63,10 +63,7 @@ void IntroHandler::loadIntroData(Common::ReadStream &in) {
|
||||||
_introY[i] = in.readByte();
|
_introY[i] = in.readByte();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (int i = 0; i < numRows; i++) {
|
in.skip(numRows * 2);
|
||||||
in.readByte();
|
|
||||||
in.readByte();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,7 +55,7 @@ public:
|
||||||
virtual bool introPlay() = 0;
|
virtual bool introPlay() = 0;
|
||||||
|
|
||||||
void freeIntroData();
|
void freeIntroData();
|
||||||
void loadIntroData(Common::ReadStream &in);
|
void loadIntroData(Common::SeekableReadStream &in);
|
||||||
|
|
||||||
byte getIntroSize() const { return _introXSize; }
|
byte getIntroSize() const { return _introXSize; }
|
||||||
|
|
||||||
|
|
|
@ -57,7 +57,7 @@ InventoryHandler::InventoryHandler(HugoEngine *vm) : _vm(vm), _invent(0) {
|
||||||
/**
|
/**
|
||||||
* Read _invent from Hugo.dat
|
* Read _invent from Hugo.dat
|
||||||
*/
|
*/
|
||||||
void InventoryHandler::loadInvent(Common::ReadStream &in) {
|
void InventoryHandler::loadInvent(Common::SeekableReadStream &in) {
|
||||||
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
|
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
|
||||||
int16 numElem = in.readUint16BE();
|
int16 numElem = in.readUint16BE();
|
||||||
if (varnt == _vm->_gameVariant) {
|
if (varnt == _vm->_gameVariant) {
|
||||||
|
@ -66,8 +66,7 @@ void InventoryHandler::loadInvent(Common::ReadStream &in) {
|
||||||
for (int i = 0; i < numElem; i++)
|
for (int i = 0; i < numElem; i++)
|
||||||
_invent[i] = in.readSint16BE();
|
_invent[i] = in.readSint16BE();
|
||||||
} else {
|
} else {
|
||||||
for (int i = 0; i < numElem; i++)
|
in.skip(numElem * sizeof(int16));
|
||||||
in.readSint16BE();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,7 +51,7 @@ public:
|
||||||
istate_t getInventoryState() const { return _inventoryState; }
|
istate_t getInventoryState() const { return _inventoryState; }
|
||||||
|
|
||||||
int16 findIconId(int16 objId);
|
int16 findIconId(int16 objId);
|
||||||
void loadInvent(Common::ReadStream &in);
|
void loadInvent(Common::SeekableReadStream &in);
|
||||||
int16 processInventory(const invact_t action, ...);
|
int16 processInventory(const invact_t action, ...);
|
||||||
void runInventory();
|
void runInventory();
|
||||||
|
|
||||||
|
|
|
@ -293,31 +293,31 @@ void MouseHandler::mouseHandler() {
|
||||||
resetRightButton();
|
resetRightButton();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MouseHandler::readHotspot(Common::ReadStream &in, hotspot_t &hotspot) {
|
||||||
|
hotspot.screenIndex = in.readSint16BE();
|
||||||
|
hotspot.x1 = in.readSint16BE();
|
||||||
|
hotspot.y1 = in.readSint16BE();
|
||||||
|
hotspot.x2 = in.readSint16BE();
|
||||||
|
hotspot.y2 = in.readSint16BE();
|
||||||
|
hotspot.actIndex = in.readUint16BE();
|
||||||
|
hotspot.viewx = in.readSint16BE();
|
||||||
|
hotspot.viewy = in.readSint16BE();
|
||||||
|
hotspot.direction = in.readSint16BE();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Load hotspots data from hugo.dat
|
* Load hotspots data from hugo.dat
|
||||||
*/
|
*/
|
||||||
void MouseHandler::loadHotspots(Common::ReadStream &in) {
|
void MouseHandler::loadHotspots(Common::ReadStream &in) {
|
||||||
// Read _hotspots
|
hotspot_t *wrkHotspots = 0;
|
||||||
|
hotspot_t tmp;
|
||||||
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
|
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
|
||||||
int numRows = in.readUint16BE();
|
int numRows = in.readUint16BE();
|
||||||
hotspot_t *wrkHotspots = (hotspot_t *)malloc(sizeof(hotspot_t) * numRows);
|
|
||||||
|
|
||||||
for (int i = 0; i < numRows; i++) {
|
|
||||||
wrkHotspots[i].screenIndex = in.readSint16BE();
|
|
||||||
wrkHotspots[i].x1 = in.readSint16BE();
|
|
||||||
wrkHotspots[i].y1 = in.readSint16BE();
|
|
||||||
wrkHotspots[i].x2 = in.readSint16BE();
|
|
||||||
wrkHotspots[i].y2 = in.readSint16BE();
|
|
||||||
wrkHotspots[i].actIndex = in.readUint16BE();
|
|
||||||
wrkHotspots[i].viewx = in.readSint16BE();
|
|
||||||
wrkHotspots[i].viewy = in.readSint16BE();
|
|
||||||
wrkHotspots[i].direction = in.readSint16BE();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (varnt == _vm->_gameVariant)
|
if (varnt == _vm->_gameVariant)
|
||||||
_hotspots = wrkHotspots;
|
_hotspots = wrkHotspots = (hotspot_t *)malloc(sizeof(hotspot_t) * numRows);
|
||||||
else
|
|
||||||
free(wrkHotspots);
|
for (int i = 0; i < numRows; i++)
|
||||||
|
readHotspot(in, (varnt == _vm->_gameVariant) ? wrkHotspots[i] : tmp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -83,6 +83,7 @@ private:
|
||||||
void cursorText(const char *buffer, const int16 cx, const int16 cy, const uif_t fontId, const int16 color);
|
void cursorText(const char *buffer, const int16 cx, const int16 cy, const uif_t fontId, const int16 color);
|
||||||
void processRightClick(const int16 objId, const int16 cx, const int16 cy);
|
void processRightClick(const int16 objId, const int16 cx, const int16 cy);
|
||||||
void processLeftClick(const int16 objId, const int16 cx, const int16 cy);
|
void processLeftClick(const int16 objId, const int16 cx, const int16 cy);
|
||||||
|
void readHotspot(Common::ReadStream &in, hotspot_t &hotspot);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // End of namespace Hugo
|
} // End of namespace Hugo
|
||||||
|
|
|
@ -368,141 +368,114 @@ bool ObjectHandler::findObjectSpace(object_t *obj, int16 *destx, int16 *desty) {
|
||||||
return foundFl;
|
return foundFl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ObjectHandler::readUse(Common::ReadStream &in, uses_t &curUse) {
|
||||||
|
curUse.objId = in.readSint16BE();
|
||||||
|
curUse.dataIndex = in.readUint16BE();
|
||||||
|
uint16 numSubElem = in.readUint16BE();
|
||||||
|
curUse.targets = (target_t *)malloc(sizeof(target_t) * numSubElem);
|
||||||
|
for (int j = 0; j < numSubElem; j++) {
|
||||||
|
curUse.targets[j].nounIndex = in.readUint16BE();
|
||||||
|
curUse.targets[j].verbIndex = in.readUint16BE();
|
||||||
|
}
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Load _uses from Hugo.dat
|
* Load _uses from Hugo.dat
|
||||||
*/
|
*/
|
||||||
void ObjectHandler::loadObjectUses(Common::ReadStream &in) {
|
void ObjectHandler::loadObjectUses(Common::ReadStream &in) {
|
||||||
|
uses_t tmpUse;
|
||||||
//Read _uses
|
//Read _uses
|
||||||
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
|
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
|
||||||
|
tmpUse.targets = 0;
|
||||||
uint16 numElem = in.readUint16BE();
|
uint16 numElem = in.readUint16BE();
|
||||||
uses_t *wrkUses = (uses_t *)malloc(sizeof(uses_t) * numElem);
|
|
||||||
|
|
||||||
for (int i = 0; i < numElem; i++) {
|
|
||||||
wrkUses[i].objId = in.readSint16BE();
|
|
||||||
wrkUses[i].dataIndex = in.readUint16BE();
|
|
||||||
uint16 numSubElem = in.readUint16BE();
|
|
||||||
wrkUses[i].targets = (target_t *)malloc(sizeof(target_t) * numSubElem);
|
|
||||||
for (int j = 0; j < numSubElem; j++) {
|
|
||||||
wrkUses[i].targets[j].nounIndex = in.readUint16BE();
|
|
||||||
wrkUses[i].targets[j].verbIndex = in.readUint16BE();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (varnt == _vm->_gameVariant) {
|
if (varnt == _vm->_gameVariant) {
|
||||||
_usesSize = numElem;
|
_usesSize = numElem;
|
||||||
_uses = wrkUses;
|
_uses = (uses_t *)malloc(sizeof(uses_t) * numElem);
|
||||||
} else {
|
|
||||||
for (int i = 0; i < numElem; i++)
|
|
||||||
free(wrkUses[i].targets);
|
|
||||||
free(wrkUses);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < numElem; i++)
|
||||||
|
readUse(in, (varnt == _vm->_gameVariant) ? _uses[i] : tmpUse);
|
||||||
|
|
||||||
|
if (tmpUse.targets)
|
||||||
|
free(tmpUse.targets);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ObjectHandler::readObject(Common::ReadStream &in, object_t &curObject) {
|
||||||
|
curObject.nounIndex = in.readUint16BE();
|
||||||
|
curObject.dataIndex = in.readUint16BE();
|
||||||
|
uint16 numSubElem = in.readUint16BE();
|
||||||
|
|
||||||
|
if (numSubElem == 0)
|
||||||
|
curObject.stateDataIndex = 0;
|
||||||
|
else
|
||||||
|
curObject.stateDataIndex = (uint16 *)malloc(sizeof(uint16) * numSubElem);
|
||||||
|
for (int j = 0; j < numSubElem; j++)
|
||||||
|
curObject.stateDataIndex[j] = in.readUint16BE();
|
||||||
|
|
||||||
|
curObject.pathType = (path_t) in.readSint16BE();
|
||||||
|
curObject.vxPath = in.readSint16BE();
|
||||||
|
curObject.vyPath = in.readSint16BE();
|
||||||
|
curObject.actIndex = in.readUint16BE();
|
||||||
|
curObject.seqNumb = in.readByte();
|
||||||
|
curObject.currImagePtr = 0;
|
||||||
|
|
||||||
|
if (curObject.seqNumb == 0) {
|
||||||
|
curObject.seqList[0].imageNbr = 0;
|
||||||
|
curObject.seqList[0].seqPtr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int j = 0; j < curObject.seqNumb; j++) {
|
||||||
|
curObject.seqList[j].imageNbr = in.readUint16BE();
|
||||||
|
curObject.seqList[j].seqPtr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
curObject.cycling = (cycle_t)in.readByte();
|
||||||
|
curObject.cycleNumb = in.readByte();
|
||||||
|
curObject.frameInterval = in.readByte();
|
||||||
|
curObject.frameTimer = in.readByte();
|
||||||
|
curObject.radius = in.readByte();
|
||||||
|
curObject.screenIndex = in.readByte();
|
||||||
|
curObject.x = in.readSint16BE();
|
||||||
|
curObject.y = in.readSint16BE();
|
||||||
|
curObject.oldx = in.readSint16BE();
|
||||||
|
curObject.oldy = in.readSint16BE();
|
||||||
|
curObject.vx = in.readByte();
|
||||||
|
curObject.vy = in.readByte();
|
||||||
|
curObject.objValue = in.readByte();
|
||||||
|
curObject.genericCmd = in.readSint16BE();
|
||||||
|
curObject.cmdIndex = in.readUint16BE();
|
||||||
|
curObject.carriedFl = (in.readByte() != 0);
|
||||||
|
curObject.state = in.readByte();
|
||||||
|
curObject.verbOnlyFl = (in.readByte() != 0);
|
||||||
|
curObject.priority = in.readByte();
|
||||||
|
curObject.viewx = in.readSint16BE();
|
||||||
|
curObject.viewy = in.readSint16BE();
|
||||||
|
curObject.direction = in.readSint16BE();
|
||||||
|
curObject.curSeqNum = in.readByte();
|
||||||
|
curObject.curImageNum = in.readByte();
|
||||||
|
curObject.oldvx = in.readByte();
|
||||||
|
curObject.oldvy = in.readByte();
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Load ObjectArr from Hugo.dat
|
* Load ObjectArr from Hugo.dat
|
||||||
*/
|
*/
|
||||||
void ObjectHandler::loadObjectArr(Common::ReadStream &in) {
|
void ObjectHandler::loadObjectArr(Common::ReadStream &in) {
|
||||||
debugC(6, kDebugObject, "loadObject(&in)");
|
debugC(6, kDebugObject, "loadObject(&in)");
|
||||||
|
object_t tmpObject;
|
||||||
|
|
||||||
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
|
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
|
||||||
uint16 numElem = in.readUint16BE();
|
uint16 numElem = in.readUint16BE();
|
||||||
|
tmpObject.stateDataIndex = 0;
|
||||||
if (varnt == _vm->_gameVariant) {
|
if (varnt == _vm->_gameVariant) {
|
||||||
_objCount = numElem;
|
_objCount = numElem;
|
||||||
_objects = (object_t *)malloc(sizeof(object_t) * numElem);
|
_objects = (object_t *)malloc(sizeof(object_t) * numElem);
|
||||||
for (int i = 0; i < numElem; i++) {
|
|
||||||
_objects[i].nounIndex = in.readUint16BE();
|
|
||||||
_objects[i].dataIndex = in.readUint16BE();
|
|
||||||
uint16 numSubElem = in.readUint16BE();
|
|
||||||
if (numSubElem == 0)
|
|
||||||
_objects[i].stateDataIndex = 0;
|
|
||||||
else
|
|
||||||
_objects[i].stateDataIndex = (uint16 *)malloc(sizeof(uint16) * numSubElem);
|
|
||||||
for (int j = 0; j < numSubElem; j++)
|
|
||||||
_objects[i].stateDataIndex[j] = in.readUint16BE();
|
|
||||||
_objects[i].pathType = (path_t) in.readSint16BE();
|
|
||||||
_objects[i].vxPath = in.readSint16BE();
|
|
||||||
_objects[i].vyPath = in.readSint16BE();
|
|
||||||
_objects[i].actIndex = in.readUint16BE();
|
|
||||||
_objects[i].seqNumb = in.readByte();
|
|
||||||
_objects[i].currImagePtr = 0;
|
|
||||||
if (_objects[i].seqNumb == 0) {
|
|
||||||
_objects[i].seqList[0].imageNbr = 0;
|
|
||||||
_objects[i].seqList[0].seqPtr = 0;
|
|
||||||
}
|
|
||||||
for (int j = 0; j < _objects[i].seqNumb; j++) {
|
|
||||||
_objects[i].seqList[j].imageNbr = in.readUint16BE();
|
|
||||||
_objects[i].seqList[j].seqPtr = 0;
|
|
||||||
}
|
|
||||||
_objects[i].cycling = (cycle_t)in.readByte();
|
|
||||||
_objects[i].cycleNumb = in.readByte();
|
|
||||||
_objects[i].frameInterval = in.readByte();
|
|
||||||
_objects[i].frameTimer = in.readByte();
|
|
||||||
_objects[i].radius = in.readByte();
|
|
||||||
_objects[i].screenIndex = in.readByte();
|
|
||||||
_objects[i].x = in.readSint16BE();
|
|
||||||
_objects[i].y = in.readSint16BE();
|
|
||||||
_objects[i].oldx = in.readSint16BE();
|
|
||||||
_objects[i].oldy = in.readSint16BE();
|
|
||||||
_objects[i].vx = in.readByte();
|
|
||||||
_objects[i].vy = in.readByte();
|
|
||||||
_objects[i].objValue = in.readByte();
|
|
||||||
_objects[i].genericCmd = in.readSint16BE();
|
|
||||||
_objects[i].cmdIndex = in.readUint16BE();
|
|
||||||
_objects[i].carriedFl = (in.readByte() != 0);
|
|
||||||
_objects[i].state = in.readByte();
|
|
||||||
_objects[i].verbOnlyFl = (in.readByte() != 0);
|
|
||||||
_objects[i].priority = in.readByte();
|
|
||||||
_objects[i].viewx = in.readSint16BE();
|
|
||||||
_objects[i].viewy = in.readSint16BE();
|
|
||||||
_objects[i].direction = in.readSint16BE();
|
|
||||||
_objects[i].curSeqNum = in.readByte();
|
|
||||||
_objects[i].curImageNum = in.readByte();
|
|
||||||
_objects[i].oldvx = in.readByte();
|
|
||||||
_objects[i].oldvy = in.readByte();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (int i = 0; i < numElem; i++) {
|
|
||||||
in.readUint16BE();
|
|
||||||
in.readUint16BE();
|
|
||||||
uint16 numSubElem = in.readUint16BE();
|
|
||||||
for (int j = 0; j < numSubElem; j++)
|
|
||||||
in.readUint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readUint16BE();
|
|
||||||
numSubElem = in.readByte();
|
|
||||||
for (int j = 0; j < numSubElem; j++)
|
|
||||||
in.readUint16BE();
|
|
||||||
in.readByte();
|
|
||||||
in.readByte();
|
|
||||||
in.readByte();
|
|
||||||
in.readByte();
|
|
||||||
in.readByte();
|
|
||||||
in.readByte();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readByte();
|
|
||||||
in.readByte();
|
|
||||||
in.readByte();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readUint16BE();
|
|
||||||
in.readByte();
|
|
||||||
in.readByte();
|
|
||||||
in.readByte();
|
|
||||||
in.readByte();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readUint16BE();
|
|
||||||
in.readByte();
|
|
||||||
in.readByte();
|
|
||||||
in.readByte();
|
|
||||||
in.readByte();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < numElem; i++)
|
||||||
|
readObject(in, (varnt == _vm->_gameVariant) ? _objects[i] : tmpObject);
|
||||||
|
|
||||||
|
if (tmpObject.stateDataIndex)
|
||||||
|
free(tmpObject.stateDataIndex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -78,6 +78,8 @@ public:
|
||||||
void loadNumObj(Common::ReadStream &in);
|
void loadNumObj(Common::ReadStream &in);
|
||||||
void lookObject(object_t *obj);
|
void lookObject(object_t *obj);
|
||||||
void readObjectImages();
|
void readObjectImages();
|
||||||
|
void readObject(Common::ReadStream &in, object_t &curObject);
|
||||||
|
void readUse(Common::ReadStream &in, uses_t &curUse);
|
||||||
void restoreAllSeq();
|
void restoreAllSeq();
|
||||||
void restoreObjects(Common::SeekableReadStream *in);
|
void restoreObjects(Common::SeekableReadStream *in);
|
||||||
void saveObjects(Common::WriteStream *out);
|
void saveObjects(Common::WriteStream *out);
|
||||||
|
|
|
@ -65,75 +65,72 @@ Parser::~Parser() {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read _cmdList from Hugo.dat
|
* Read a cmd structure from Hugo.dat
|
||||||
|
*/
|
||||||
|
void Parser::readCmd(Common::ReadStream &in, cmd &curCmd) {
|
||||||
|
curCmd.verbIndex = in.readUint16BE();
|
||||||
|
curCmd.reqIndex = in.readUint16BE();
|
||||||
|
curCmd.textDataNoCarryIndex = in.readUint16BE();
|
||||||
|
curCmd.reqState = in.readByte();
|
||||||
|
curCmd.newState = in.readByte();
|
||||||
|
curCmd.textDataWrongIndex = in.readUint16BE();
|
||||||
|
curCmd.textDataDoneIndex = in.readUint16BE();
|
||||||
|
curCmd.actIndex = in.readUint16BE();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load _cmdList from Hugo.dat
|
||||||
*/
|
*/
|
||||||
void Parser::loadCmdList(Common::ReadStream &in) {
|
void Parser::loadCmdList(Common::ReadStream &in) {
|
||||||
|
cmd tmpCmd;
|
||||||
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
|
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
|
||||||
uint16 numElem = in.readUint16BE();
|
uint16 numElem = in.readUint16BE();
|
||||||
if (varnt == _vm->_gameVariant) {
|
if (varnt == _vm->_gameVariant) {
|
||||||
_cmdListSize = numElem;
|
_cmdListSize = numElem;
|
||||||
_cmdList = (cmd **)malloc(sizeof(cmd *) * _cmdListSize);
|
_cmdList = (cmd **)malloc(sizeof(cmd *) * _cmdListSize);
|
||||||
for (int i = 0; i < _cmdListSize; i++) {
|
}
|
||||||
uint16 numSubElem = in.readUint16BE();
|
|
||||||
|
for (int16 i = 0; i < numElem; i++) {
|
||||||
|
uint16 numSubElem = in.readUint16BE();
|
||||||
|
if (varnt == _vm->_gameVariant)
|
||||||
_cmdList[i] = (cmd *)malloc(sizeof(cmd) * numSubElem);
|
_cmdList[i] = (cmd *)malloc(sizeof(cmd) * numSubElem);
|
||||||
for (int j = 0; j < numSubElem; j++) {
|
for (int16 j = 0; j < numSubElem; j++)
|
||||||
_cmdList[i][j].verbIndex = in.readUint16BE();
|
readCmd(in, (varnt == _vm->_gameVariant) ? _cmdList[i][j] : tmpCmd);
|
||||||
_cmdList[i][j].reqIndex = in.readUint16BE();
|
|
||||||
_cmdList[i][j].textDataNoCarryIndex = in.readUint16BE();
|
|
||||||
_cmdList[i][j].reqState = in.readByte();
|
|
||||||
_cmdList[i][j].newState = in.readByte();
|
|
||||||
_cmdList[i][j].textDataWrongIndex = in.readUint16BE();
|
|
||||||
_cmdList[i][j].textDataDoneIndex = in.readUint16BE();
|
|
||||||
_cmdList[i][j].actIndex = in.readUint16BE();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (int i = 0; i < numElem; i++) {
|
|
||||||
uint16 numSubElem = in.readUint16BE();
|
|
||||||
for (int j = 0; j < numSubElem; j++) {
|
|
||||||
in.readUint16BE();
|
|
||||||
in.readUint16BE();
|
|
||||||
in.readUint16BE();
|
|
||||||
in.readByte();
|
|
||||||
in.readByte();
|
|
||||||
in.readUint16BE();
|
|
||||||
in.readUint16BE();
|
|
||||||
in.readUint16BE();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Parser::readBG(Common::ReadStream &in, background_t &curBG) {
|
||||||
|
curBG.verbIndex = in.readUint16BE();
|
||||||
|
curBG.nounIndex = in.readUint16BE();
|
||||||
|
curBG.commentIndex = in.readSint16BE();
|
||||||
|
curBG.matchFl = (in.readByte() != 0);
|
||||||
|
curBG.roomState = in.readByte();
|
||||||
|
curBG.bonusIndex = in.readByte();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read _backgrounObjects from Hugo.dat
|
* Read _backgrounObjects from Hugo.dat
|
||||||
*/
|
*/
|
||||||
void Parser::loadBackgroundObjects(Common::ReadStream &in) {
|
void Parser::loadBackgroundObjects(Common::ReadStream &in) {
|
||||||
|
background_t tmpBG;
|
||||||
|
|
||||||
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
|
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
|
||||||
uint16 numElem = in.readUint16BE();
|
uint16 numElem = in.readUint16BE();
|
||||||
|
|
||||||
background_t **wrkBackgroundObjects = (background_t **)malloc(sizeof(background_t *) * numElem);
|
if (varnt == _vm->_gameVariant) {
|
||||||
|
_backgroundObjectsSize = numElem;
|
||||||
|
_backgroundObjects = (background_t **)malloc(sizeof(background_t *) * numElem);
|
||||||
|
}
|
||||||
|
|
||||||
for (int i = 0; i < numElem; i++) {
|
for (int i = 0; i < numElem; i++) {
|
||||||
uint16 numSubElem = in.readUint16BE();
|
uint16 numSubElem = in.readUint16BE();
|
||||||
wrkBackgroundObjects[i] = (background_t *)malloc(sizeof(background_t) * numSubElem);
|
if (varnt == _vm->_gameVariant)
|
||||||
for (int j = 0; j < numSubElem; j++) {
|
_backgroundObjects[i] = (background_t *)malloc(sizeof(background_t) * numSubElem);
|
||||||
wrkBackgroundObjects[i][j].verbIndex = in.readUint16BE();
|
|
||||||
wrkBackgroundObjects[i][j].nounIndex = in.readUint16BE();
|
|
||||||
wrkBackgroundObjects[i][j].commentIndex = in.readSint16BE();
|
|
||||||
wrkBackgroundObjects[i][j].matchFl = (in.readByte() != 0);
|
|
||||||
wrkBackgroundObjects[i][j].roomState = in.readByte();
|
|
||||||
wrkBackgroundObjects[i][j].bonusIndex = in.readByte();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (varnt == _vm->_gameVariant) {
|
for (int j = 0; j < numSubElem; j++)
|
||||||
_backgroundObjectsSize = numElem;
|
readBG(in, (varnt == _vm->_gameVariant) ? _backgroundObjects[i][j] : tmpBG);
|
||||||
_backgroundObjects = wrkBackgroundObjects;
|
|
||||||
} else {
|
|
||||||
for (int i = 0; i < numElem; i++)
|
|
||||||
free(wrkBackgroundObjects[i]);
|
|
||||||
free(wrkBackgroundObjects);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -142,27 +139,21 @@ void Parser::loadBackgroundObjects(Common::ReadStream &in) {
|
||||||
* Read _catchallList from Hugo.dat
|
* Read _catchallList from Hugo.dat
|
||||||
*/
|
*/
|
||||||
void Parser::loadCatchallList(Common::ReadStream &in) {
|
void Parser::loadCatchallList(Common::ReadStream &in) {
|
||||||
|
background_t *wrkCatchallList = 0;
|
||||||
|
background_t tmpBG;
|
||||||
|
|
||||||
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
|
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
|
||||||
uint16 numElem = in.readUint16BE();
|
uint16 numElem = in.readUint16BE();
|
||||||
background_t *wrkCatchallList = (background_t *)malloc(sizeof(background_t) * numElem);
|
|
||||||
|
|
||||||
for (int i = 0; i < numElem; i++) {
|
|
||||||
wrkCatchallList[i].verbIndex = in.readUint16BE();
|
|
||||||
wrkCatchallList[i].nounIndex = in.readUint16BE();
|
|
||||||
wrkCatchallList[i].commentIndex = in.readSint16BE();
|
|
||||||
wrkCatchallList[i].matchFl = (in.readByte() != 0);
|
|
||||||
wrkCatchallList[i].roomState = in.readByte();
|
|
||||||
wrkCatchallList[i].bonusIndex = in.readByte();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (varnt == _vm->_gameVariant)
|
if (varnt == _vm->_gameVariant)
|
||||||
_catchallList = wrkCatchallList;
|
_catchallList = wrkCatchallList = (background_t *)malloc(sizeof(background_t) * numElem);
|
||||||
else
|
|
||||||
free(wrkCatchallList);
|
for (int i = 0; i < numElem; i++)
|
||||||
|
readBG(in, (varnt == _vm->_gameVariant) ? wrkCatchallList[i] : tmpBG);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Parser::loadArrayReqs(Common::ReadStream &in) {
|
void Parser::loadArrayReqs(Common::SeekableReadStream &in) {
|
||||||
_arrayReqs = _vm->loadLongArray(in);
|
_arrayReqs = _vm->loadLongArray(in);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -55,7 +55,7 @@ public:
|
||||||
void command(const char *format, ...);
|
void command(const char *format, ...);
|
||||||
void freeParser();
|
void freeParser();
|
||||||
void keyHandler(Common::Event event);
|
void keyHandler(Common::Event event);
|
||||||
void loadArrayReqs(Common::ReadStream &in);
|
void loadArrayReqs(Common::SeekableReadStream &in);
|
||||||
void loadBackgroundObjects(Common::ReadStream &in);
|
void loadBackgroundObjects(Common::ReadStream &in);
|
||||||
void loadCatchallList(Common::ReadStream &in);
|
void loadCatchallList(Common::ReadStream &in);
|
||||||
void loadCmdList(Common::ReadStream &in);
|
void loadCmdList(Common::ReadStream &in);
|
||||||
|
@ -82,6 +82,8 @@ protected:
|
||||||
|
|
||||||
const char *findNoun() const;
|
const char *findNoun() const;
|
||||||
const char *findVerb() const;
|
const char *findVerb() const;
|
||||||
|
void readBG(Common::ReadStream &in, background_t &curBG);
|
||||||
|
void readCmd(Common::ReadStream &in, cmd &curCmd);
|
||||||
void showDosInventory() const;
|
void showDosInventory() const;
|
||||||
|
|
||||||
bool _checkDoubleF1Fl; // Flag used to display user help or instructions
|
bool _checkDoubleF1Fl; // Flag used to display user help or instructions
|
||||||
|
|
|
@ -253,7 +253,7 @@ void Scheduler::loadAlNewscrIndex(Common::ReadStream &in) {
|
||||||
/**
|
/**
|
||||||
* Load Points from Hugo.dat
|
* Load Points from Hugo.dat
|
||||||
*/
|
*/
|
||||||
void Scheduler::loadPoints(Common::ReadStream &in) {
|
void Scheduler::loadPoints(Common::SeekableReadStream &in) {
|
||||||
debugC(6, kDebugSchedule, "loadPoints(&in)");
|
debugC(6, kDebugSchedule, "loadPoints(&in)");
|
||||||
|
|
||||||
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
|
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
|
||||||
|
@ -266,610 +266,350 @@ void Scheduler::loadPoints(Common::ReadStream &in) {
|
||||||
_points[i].scoredFl = false;
|
_points[i].scoredFl = false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (int i = 0; i < numElem; i++)
|
in.skip(numElem);
|
||||||
in.readByte();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Scheduler::readAct(Common::ReadStream &in, act &curAct) {
|
||||||
|
uint16 numSubAct;
|
||||||
|
|
||||||
|
curAct.a0.actType = (action_t) in.readByte();
|
||||||
|
switch (curAct.a0.actType) {
|
||||||
|
case ANULL: // -1
|
||||||
|
break;
|
||||||
|
case ASCHEDULE: // 0
|
||||||
|
curAct.a0.timer = in.readSint16BE();
|
||||||
|
curAct.a0.actIndex = in.readUint16BE();
|
||||||
|
break;
|
||||||
|
case START_OBJ: // 1
|
||||||
|
curAct.a1.timer = in.readSint16BE();
|
||||||
|
curAct.a1.objIndex = in.readSint16BE();
|
||||||
|
curAct.a1.cycleNumb = in.readSint16BE();
|
||||||
|
curAct.a1.cycle = (cycle_t) in.readByte();
|
||||||
|
break;
|
||||||
|
case INIT_OBJXY: // 2
|
||||||
|
curAct.a2.timer = in.readSint16BE();
|
||||||
|
curAct.a2.objIndex = in.readSint16BE();
|
||||||
|
curAct.a2.x = in.readSint16BE();
|
||||||
|
curAct.a2.y = in.readSint16BE();
|
||||||
|
break;
|
||||||
|
case PROMPT: // 3
|
||||||
|
curAct.a3.timer = in.readSint16BE();
|
||||||
|
curAct.a3.promptIndex = in.readSint16BE();
|
||||||
|
numSubAct = in.readUint16BE();
|
||||||
|
curAct.a3.responsePtr = (int *) malloc(sizeof(int) * numSubAct);
|
||||||
|
for (int k = 0; k < numSubAct; k++)
|
||||||
|
curAct.a3.responsePtr[k] = in.readSint16BE();
|
||||||
|
curAct.a3.actPassIndex = in.readUint16BE();
|
||||||
|
curAct.a3.actFailIndex = in.readUint16BE();
|
||||||
|
curAct.a3.encodedFl = (in.readByte() == 1) ? true : false;
|
||||||
|
break;
|
||||||
|
case BKGD_COLOR: // 4
|
||||||
|
curAct.a4.timer = in.readSint16BE();
|
||||||
|
curAct.a4.newBackgroundColor = in.readUint32BE();
|
||||||
|
break;
|
||||||
|
case INIT_OBJVXY: // 5
|
||||||
|
curAct.a5.timer = in.readSint16BE();
|
||||||
|
curAct.a5.objIndex = in.readSint16BE();
|
||||||
|
curAct.a5.vx = in.readSint16BE();
|
||||||
|
curAct.a5.vy = in.readSint16BE();
|
||||||
|
break;
|
||||||
|
case INIT_CARRY: // 6
|
||||||
|
curAct.a6.timer = in.readSint16BE();
|
||||||
|
curAct.a6.objIndex = in.readSint16BE();
|
||||||
|
curAct.a6.carriedFl = (in.readByte() == 1) ? true : false;
|
||||||
|
break;
|
||||||
|
case INIT_HF_COORD: // 7
|
||||||
|
curAct.a7.timer = in.readSint16BE();
|
||||||
|
curAct.a7.objIndex = in.readSint16BE();
|
||||||
|
break;
|
||||||
|
case NEW_SCREEN: // 8
|
||||||
|
curAct.a8.timer = in.readSint16BE();
|
||||||
|
curAct.a8.screenIndex = in.readSint16BE();
|
||||||
|
break;
|
||||||
|
case INIT_OBJSTATE: // 9
|
||||||
|
curAct.a9.timer = in.readSint16BE();
|
||||||
|
curAct.a9.objIndex = in.readSint16BE();
|
||||||
|
curAct.a9.newState = in.readByte();
|
||||||
|
break;
|
||||||
|
case INIT_PATH: // 10
|
||||||
|
curAct.a10.timer = in.readSint16BE();
|
||||||
|
curAct.a10.objIndex = in.readSint16BE();
|
||||||
|
curAct.a10.newPathType = in.readSint16BE();
|
||||||
|
curAct.a10.vxPath = in.readByte();
|
||||||
|
curAct.a10.vyPath = in.readByte();
|
||||||
|
break;
|
||||||
|
case COND_R: // 11
|
||||||
|
curAct.a11.timer = in.readSint16BE();
|
||||||
|
curAct.a11.objIndex = in.readSint16BE();
|
||||||
|
curAct.a11.stateReq = in.readByte();
|
||||||
|
curAct.a11.actPassIndex = in.readUint16BE();
|
||||||
|
curAct.a11.actFailIndex = in.readUint16BE();
|
||||||
|
break;
|
||||||
|
case TEXT: // 12
|
||||||
|
curAct.a12.timer = in.readSint16BE();
|
||||||
|
curAct.a12.stringIndex = in.readSint16BE();
|
||||||
|
break;
|
||||||
|
case SWAP_IMAGES: // 13
|
||||||
|
curAct.a13.timer = in.readSint16BE();
|
||||||
|
curAct.a13.objIndex1 = in.readSint16BE();
|
||||||
|
curAct.a13.objIndex2 = in.readSint16BE();
|
||||||
|
break;
|
||||||
|
case COND_SCR: // 14
|
||||||
|
curAct.a14.timer = in.readSint16BE();
|
||||||
|
curAct.a14.objIndex = in.readSint16BE();
|
||||||
|
curAct.a14.screenReq = in.readSint16BE();
|
||||||
|
curAct.a14.actPassIndex = in.readUint16BE();
|
||||||
|
curAct.a14.actFailIndex = in.readUint16BE();
|
||||||
|
break;
|
||||||
|
case AUTOPILOT: // 15
|
||||||
|
curAct.a15.timer = in.readSint16BE();
|
||||||
|
curAct.a15.objIndex1 = in.readSint16BE();
|
||||||
|
curAct.a15.objIndex2 = in.readSint16BE();
|
||||||
|
curAct.a15.dx = in.readByte();
|
||||||
|
curAct.a15.dy = in.readByte();
|
||||||
|
break;
|
||||||
|
case INIT_OBJ_SEQ: // 16
|
||||||
|
curAct.a16.timer = in.readSint16BE();
|
||||||
|
curAct.a16.objIndex = in.readSint16BE();
|
||||||
|
curAct.a16.seqIndex = in.readSint16BE();
|
||||||
|
break;
|
||||||
|
case SET_STATE_BITS: // 17
|
||||||
|
curAct.a17.timer = in.readSint16BE();
|
||||||
|
curAct.a17.objIndex = in.readSint16BE();
|
||||||
|
curAct.a17.stateMask = in.readSint16BE();
|
||||||
|
break;
|
||||||
|
case CLEAR_STATE_BITS: // 18
|
||||||
|
curAct.a18.timer = in.readSint16BE();
|
||||||
|
curAct.a18.objIndex = in.readSint16BE();
|
||||||
|
curAct.a18.stateMask = in.readSint16BE();
|
||||||
|
break;
|
||||||
|
case TEST_STATE_BITS: // 19
|
||||||
|
curAct.a19.timer = in.readSint16BE();
|
||||||
|
curAct.a19.objIndex = in.readSint16BE();
|
||||||
|
curAct.a19.stateMask = in.readSint16BE();
|
||||||
|
curAct.a19.actPassIndex = in.readUint16BE();
|
||||||
|
curAct.a19.actFailIndex = in.readUint16BE();
|
||||||
|
break;
|
||||||
|
case DEL_EVENTS: // 20
|
||||||
|
curAct.a20.timer = in.readSint16BE();
|
||||||
|
curAct.a20.actTypeDel = (action_t) in.readByte();
|
||||||
|
break;
|
||||||
|
case GAMEOVER: // 21
|
||||||
|
curAct.a21.timer = in.readSint16BE();
|
||||||
|
break;
|
||||||
|
case INIT_HH_COORD: // 22
|
||||||
|
curAct.a22.timer = in.readSint16BE();
|
||||||
|
curAct.a22.objIndex = in.readSint16BE();
|
||||||
|
break;
|
||||||
|
case EXIT: // 23
|
||||||
|
curAct.a23.timer = in.readSint16BE();
|
||||||
|
break;
|
||||||
|
case BONUS: // 24
|
||||||
|
curAct.a24.timer = in.readSint16BE();
|
||||||
|
curAct.a24.pointIndex = in.readSint16BE();
|
||||||
|
break;
|
||||||
|
case COND_BOX: // 25
|
||||||
|
curAct.a25.timer = in.readSint16BE();
|
||||||
|
curAct.a25.objIndex = in.readSint16BE();
|
||||||
|
curAct.a25.x1 = in.readSint16BE();
|
||||||
|
curAct.a25.y1 = in.readSint16BE();
|
||||||
|
curAct.a25.x2 = in.readSint16BE();
|
||||||
|
curAct.a25.y2 = in.readSint16BE();
|
||||||
|
curAct.a25.actPassIndex = in.readUint16BE();
|
||||||
|
curAct.a25.actFailIndex = in.readUint16BE();
|
||||||
|
break;
|
||||||
|
case SOUND: // 26
|
||||||
|
curAct.a26.timer = in.readSint16BE();
|
||||||
|
curAct.a26.soundIndex = in.readSint16BE();
|
||||||
|
break;
|
||||||
|
case ADD_SCORE: // 27
|
||||||
|
curAct.a27.timer = in.readSint16BE();
|
||||||
|
curAct.a27.objIndex = in.readSint16BE();
|
||||||
|
break;
|
||||||
|
case SUB_SCORE: // 28
|
||||||
|
curAct.a28.timer = in.readSint16BE();
|
||||||
|
curAct.a28.objIndex = in.readSint16BE();
|
||||||
|
break;
|
||||||
|
case COND_CARRY: // 29
|
||||||
|
curAct.a29.timer = in.readSint16BE();
|
||||||
|
curAct.a29.objIndex = in.readSint16BE();
|
||||||
|
curAct.a29.actPassIndex = in.readUint16BE();
|
||||||
|
curAct.a29.actFailIndex = in.readUint16BE();
|
||||||
|
break;
|
||||||
|
case INIT_MAZE: // 30
|
||||||
|
curAct.a30.timer = in.readSint16BE();
|
||||||
|
curAct.a30.mazeSize = in.readByte();
|
||||||
|
curAct.a30.x1 = in.readSint16BE();
|
||||||
|
curAct.a30.y1 = in.readSint16BE();
|
||||||
|
curAct.a30.x2 = in.readSint16BE();
|
||||||
|
curAct.a30.y2 = in.readSint16BE();
|
||||||
|
curAct.a30.x3 = in.readSint16BE();
|
||||||
|
curAct.a30.x4 = in.readSint16BE();
|
||||||
|
curAct.a30.firstScreenIndex = in.readByte();
|
||||||
|
break;
|
||||||
|
case EXIT_MAZE: // 31
|
||||||
|
curAct.a31.timer = in.readSint16BE();
|
||||||
|
break;
|
||||||
|
case INIT_PRIORITY: // 32
|
||||||
|
curAct.a32.timer = in.readSint16BE();
|
||||||
|
curAct.a32.objIndex = in.readSint16BE();
|
||||||
|
curAct.a32.priority = in.readByte();
|
||||||
|
break;
|
||||||
|
case INIT_SCREEN: // 33
|
||||||
|
curAct.a33.timer = in.readSint16BE();
|
||||||
|
curAct.a33.objIndex = in.readSint16BE();
|
||||||
|
curAct.a33.screenIndex = in.readSint16BE();
|
||||||
|
break;
|
||||||
|
case AGSCHEDULE: // 34
|
||||||
|
curAct.a34.timer = in.readSint16BE();
|
||||||
|
curAct.a34.actIndex = in.readUint16BE();
|
||||||
|
break;
|
||||||
|
case REMAPPAL: // 35
|
||||||
|
curAct.a35.timer = in.readSint16BE();
|
||||||
|
curAct.a35.oldColorIndex = in.readSint16BE();
|
||||||
|
curAct.a35.newColorIndex = in.readSint16BE();
|
||||||
|
break;
|
||||||
|
case COND_NOUN: // 36
|
||||||
|
curAct.a36.timer = in.readSint16BE();
|
||||||
|
curAct.a36.nounIndex = in.readUint16BE();
|
||||||
|
curAct.a36.actPassIndex = in.readUint16BE();
|
||||||
|
curAct.a36.actFailIndex = in.readUint16BE();
|
||||||
|
break;
|
||||||
|
case SCREEN_STATE: // 37
|
||||||
|
curAct.a37.timer = in.readSint16BE();
|
||||||
|
curAct.a37.screenIndex = in.readSint16BE();
|
||||||
|
curAct.a37.newState = in.readByte();
|
||||||
|
break;
|
||||||
|
case INIT_LIPS: // 38
|
||||||
|
curAct.a38.timer = in.readSint16BE();
|
||||||
|
curAct.a38.lipsObjIndex = in.readSint16BE();
|
||||||
|
curAct.a38.objIndex = in.readSint16BE();
|
||||||
|
curAct.a38.dxLips = in.readByte();
|
||||||
|
curAct.a38.dyLips = in.readByte();
|
||||||
|
break;
|
||||||
|
case INIT_STORY_MODE: // 39
|
||||||
|
curAct.a39.timer = in.readSint16BE();
|
||||||
|
curAct.a39.storyModeFl = (in.readByte() == 1);
|
||||||
|
break;
|
||||||
|
case WARN: // 40
|
||||||
|
curAct.a40.timer = in.readSint16BE();
|
||||||
|
curAct.a40.stringIndex = in.readSint16BE();
|
||||||
|
break;
|
||||||
|
case COND_BONUS: // 41
|
||||||
|
curAct.a41.timer = in.readSint16BE();
|
||||||
|
curAct.a41.BonusIndex = in.readSint16BE();
|
||||||
|
curAct.a41.actPassIndex = in.readUint16BE();
|
||||||
|
curAct.a41.actFailIndex = in.readUint16BE();
|
||||||
|
break;
|
||||||
|
case TEXT_TAKE: // 42
|
||||||
|
curAct.a42.timer = in.readSint16BE();
|
||||||
|
curAct.a42.objIndex = in.readSint16BE();
|
||||||
|
break;
|
||||||
|
case YESNO: // 43
|
||||||
|
curAct.a43.timer = in.readSint16BE();
|
||||||
|
curAct.a43.promptIndex = in.readSint16BE();
|
||||||
|
curAct.a43.actYesIndex = in.readUint16BE();
|
||||||
|
curAct.a43.actNoIndex = in.readUint16BE();
|
||||||
|
break;
|
||||||
|
case STOP_ROUTE: // 44
|
||||||
|
curAct.a44.timer = in.readSint16BE();
|
||||||
|
break;
|
||||||
|
case COND_ROUTE: // 45
|
||||||
|
curAct.a45.timer = in.readSint16BE();
|
||||||
|
curAct.a45.routeIndex = in.readSint16BE();
|
||||||
|
curAct.a45.actPassIndex = in.readUint16BE();
|
||||||
|
curAct.a45.actFailIndex = in.readUint16BE();
|
||||||
|
break;
|
||||||
|
case INIT_JUMPEXIT: // 46
|
||||||
|
curAct.a46.timer = in.readSint16BE();
|
||||||
|
curAct.a46.jumpExitFl = (in.readByte() == 1);
|
||||||
|
break;
|
||||||
|
case INIT_VIEW: // 47
|
||||||
|
curAct.a47.timer = in.readSint16BE();
|
||||||
|
curAct.a47.objIndex = in.readSint16BE();
|
||||||
|
curAct.a47.viewx = in.readSint16BE();
|
||||||
|
curAct.a47.viewy = in.readSint16BE();
|
||||||
|
curAct.a47.direction = in.readSint16BE();
|
||||||
|
break;
|
||||||
|
case INIT_OBJ_FRAME: // 48
|
||||||
|
curAct.a48.timer = in.readSint16BE();
|
||||||
|
curAct.a48.objIndex = in.readSint16BE();
|
||||||
|
curAct.a48.seqIndex = in.readSint16BE();
|
||||||
|
curAct.a48.frameIndex = in.readSint16BE();
|
||||||
|
break;
|
||||||
|
case OLD_SONG: //49
|
||||||
|
curAct.a49.timer = in.readSint16BE();
|
||||||
|
curAct.a49.songIndex = in.readUint16BE();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
error("Engine - Unknown action type encountered: %d", curAct.a0.actType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Load actListArr from Hugo.dat
|
* Load actListArr from Hugo.dat
|
||||||
*/
|
*/
|
||||||
void Scheduler::loadActListArr(Common::ReadStream &in) {
|
void Scheduler::loadActListArr(Common::ReadStream &in) {
|
||||||
debugC(6, kDebugSchedule, "loadActListArr(&in)");
|
debugC(6, kDebugSchedule, "loadActListArr(&in)");
|
||||||
|
|
||||||
int numElem, numSubElem, numSubAct;
|
act tmpAct;
|
||||||
|
|
||||||
|
int numElem, numSubElem;
|
||||||
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
|
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
|
||||||
numElem = in.readUint16BE();
|
numElem = in.readUint16BE();
|
||||||
if (varnt == _vm->_gameVariant) {
|
if (varnt == _vm->_gameVariant) {
|
||||||
_actListArrSize = numElem;
|
_actListArrSize = numElem;
|
||||||
_actListArr = (act **)malloc(sizeof(act *) * _actListArrSize);
|
_actListArr = (act **)malloc(sizeof(act *) * _actListArrSize);
|
||||||
for (int i = 0; i < _actListArrSize; i++) {
|
}
|
||||||
numSubElem = in.readUint16BE();
|
|
||||||
|
for (int i = 0; i < numElem; i++) {
|
||||||
|
numSubElem = in.readUint16BE();
|
||||||
|
if (varnt == _vm->_gameVariant)
|
||||||
_actListArr[i] = (act *) malloc(sizeof(act) * (numSubElem + 1));
|
_actListArr[i] = (act *) malloc(sizeof(act) * (numSubElem + 1));
|
||||||
for (int j = 0; j < numSubElem; j++) {
|
for (int j = 0; j < numSubElem; j++) {
|
||||||
_actListArr[i][j].a0.actType = (action_t) in.readByte();
|
if (varnt == _vm->_gameVariant) {
|
||||||
switch (_actListArr[i][j].a0.actType) {
|
readAct(in, _actListArr[i][j]);
|
||||||
case ANULL: // -1
|
} else {
|
||||||
break;
|
readAct(in, tmpAct);
|
||||||
case ASCHEDULE: // 0
|
if (tmpAct.a0.actType == PROMPT)
|
||||||
_actListArr[i][j].a0.timer = in.readSint16BE();
|
free(tmpAct.a3.responsePtr);
|
||||||
_actListArr[i][j].a0.actIndex = in.readUint16BE();
|
|
||||||
break;
|
|
||||||
case START_OBJ: // 1
|
|
||||||
_actListArr[i][j].a1.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a1.objIndex = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a1.cycleNumb = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a1.cycle = (cycle_t) in.readByte();
|
|
||||||
break;
|
|
||||||
case INIT_OBJXY: // 2
|
|
||||||
_actListArr[i][j].a2.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a2.objIndex = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a2.x = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a2.y = in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case PROMPT: // 3
|
|
||||||
_actListArr[i][j].a3.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a3.promptIndex = in.readSint16BE();
|
|
||||||
numSubAct = in.readUint16BE();
|
|
||||||
_actListArr[i][j].a3.responsePtr = (int *) malloc(sizeof(int) * numSubAct);
|
|
||||||
for (int k = 0; k < numSubAct; k++)
|
|
||||||
_actListArr[i][j].a3.responsePtr[k] = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a3.actPassIndex = in.readUint16BE();
|
|
||||||
_actListArr[i][j].a3.actFailIndex = in.readUint16BE();
|
|
||||||
_actListArr[i][j].a3.encodedFl = (in.readByte() == 1) ? true : false;
|
|
||||||
break;
|
|
||||||
case BKGD_COLOR: // 4
|
|
||||||
_actListArr[i][j].a4.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a4.newBackgroundColor = in.readUint32BE();
|
|
||||||
break;
|
|
||||||
case INIT_OBJVXY: // 5
|
|
||||||
_actListArr[i][j].a5.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a5.objIndex = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a5.vx = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a5.vy = in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case INIT_CARRY: // 6
|
|
||||||
_actListArr[i][j].a6.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a6.objIndex = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a6.carriedFl = (in.readByte() == 1) ? true : false;
|
|
||||||
break;
|
|
||||||
case INIT_HF_COORD: // 7
|
|
||||||
_actListArr[i][j].a7.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a7.objIndex = in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case NEW_SCREEN: // 8
|
|
||||||
_actListArr[i][j].a8.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a8.screenIndex = in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case INIT_OBJSTATE: // 9
|
|
||||||
_actListArr[i][j].a9.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a9.objIndex = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a9.newState = in.readByte();
|
|
||||||
break;
|
|
||||||
case INIT_PATH: // 10
|
|
||||||
_actListArr[i][j].a10.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a10.objIndex = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a10.newPathType = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a10.vxPath = in.readByte();
|
|
||||||
_actListArr[i][j].a10.vyPath = in.readByte();
|
|
||||||
break;
|
|
||||||
case COND_R: // 11
|
|
||||||
_actListArr[i][j].a11.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a11.objIndex = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a11.stateReq = in.readByte();
|
|
||||||
_actListArr[i][j].a11.actPassIndex = in.readUint16BE();
|
|
||||||
_actListArr[i][j].a11.actFailIndex = in.readUint16BE();
|
|
||||||
break;
|
|
||||||
case TEXT: // 12
|
|
||||||
_actListArr[i][j].a12.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a12.stringIndex = in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case SWAP_IMAGES: // 13
|
|
||||||
_actListArr[i][j].a13.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a13.objIndex1 = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a13.objIndex2 = in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case COND_SCR: // 14
|
|
||||||
_actListArr[i][j].a14.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a14.objIndex = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a14.screenReq = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a14.actPassIndex = in.readUint16BE();
|
|
||||||
_actListArr[i][j].a14.actFailIndex = in.readUint16BE();
|
|
||||||
break;
|
|
||||||
case AUTOPILOT: // 15
|
|
||||||
_actListArr[i][j].a15.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a15.objIndex1 = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a15.objIndex2 = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a15.dx = in.readByte();
|
|
||||||
_actListArr[i][j].a15.dy = in.readByte();
|
|
||||||
break;
|
|
||||||
case INIT_OBJ_SEQ: // 16
|
|
||||||
_actListArr[i][j].a16.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a16.objIndex = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a16.seqIndex = in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case SET_STATE_BITS: // 17
|
|
||||||
_actListArr[i][j].a17.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a17.objIndex = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a17.stateMask = in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case CLEAR_STATE_BITS: // 18
|
|
||||||
_actListArr[i][j].a18.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a18.objIndex = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a18.stateMask = in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case TEST_STATE_BITS: // 19
|
|
||||||
_actListArr[i][j].a19.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a19.objIndex = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a19.stateMask = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a19.actPassIndex = in.readUint16BE();
|
|
||||||
_actListArr[i][j].a19.actFailIndex = in.readUint16BE();
|
|
||||||
break;
|
|
||||||
case DEL_EVENTS: // 20
|
|
||||||
_actListArr[i][j].a20.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a20.actTypeDel = (action_t) in.readByte();
|
|
||||||
break;
|
|
||||||
case GAMEOVER: // 21
|
|
||||||
_actListArr[i][j].a21.timer = in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case INIT_HH_COORD: // 22
|
|
||||||
_actListArr[i][j].a22.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a22.objIndex = in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case EXIT: // 23
|
|
||||||
_actListArr[i][j].a23.timer = in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case BONUS: // 24
|
|
||||||
_actListArr[i][j].a24.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a24.pointIndex = in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case COND_BOX: // 25
|
|
||||||
_actListArr[i][j].a25.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a25.objIndex = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a25.x1 = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a25.y1 = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a25.x2 = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a25.y2 = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a25.actPassIndex = in.readUint16BE();
|
|
||||||
_actListArr[i][j].a25.actFailIndex = in.readUint16BE();
|
|
||||||
break;
|
|
||||||
case SOUND: // 26
|
|
||||||
_actListArr[i][j].a26.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a26.soundIndex = in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case ADD_SCORE: // 27
|
|
||||||
_actListArr[i][j].a27.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a27.objIndex = in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case SUB_SCORE: // 28
|
|
||||||
_actListArr[i][j].a28.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a28.objIndex = in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case COND_CARRY: // 29
|
|
||||||
_actListArr[i][j].a29.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a29.objIndex = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a29.actPassIndex = in.readUint16BE();
|
|
||||||
_actListArr[i][j].a29.actFailIndex = in.readUint16BE();
|
|
||||||
break;
|
|
||||||
case INIT_MAZE: // 30
|
|
||||||
_actListArr[i][j].a30.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a30.mazeSize = in.readByte();
|
|
||||||
_actListArr[i][j].a30.x1 = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a30.y1 = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a30.x2 = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a30.y2 = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a30.x3 = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a30.x4 = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a30.firstScreenIndex = in.readByte();
|
|
||||||
break;
|
|
||||||
case EXIT_MAZE: // 31
|
|
||||||
_actListArr[i][j].a31.timer = in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case INIT_PRIORITY: // 32
|
|
||||||
_actListArr[i][j].a32.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a32.objIndex = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a32.priority = in.readByte();
|
|
||||||
break;
|
|
||||||
case INIT_SCREEN: // 33
|
|
||||||
_actListArr[i][j].a33.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a33.objIndex = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a33.screenIndex = in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case AGSCHEDULE: // 34
|
|
||||||
_actListArr[i][j].a34.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a34.actIndex = in.readUint16BE();
|
|
||||||
break;
|
|
||||||
case REMAPPAL: // 35
|
|
||||||
_actListArr[i][j].a35.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a35.oldColorIndex = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a35.newColorIndex = in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case COND_NOUN: // 36
|
|
||||||
_actListArr[i][j].a36.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a36.nounIndex = in.readUint16BE();
|
|
||||||
_actListArr[i][j].a36.actPassIndex = in.readUint16BE();
|
|
||||||
_actListArr[i][j].a36.actFailIndex = in.readUint16BE();
|
|
||||||
break;
|
|
||||||
case SCREEN_STATE: // 37
|
|
||||||
_actListArr[i][j].a37.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a37.screenIndex = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a37.newState = in.readByte();
|
|
||||||
break;
|
|
||||||
case INIT_LIPS: // 38
|
|
||||||
_actListArr[i][j].a38.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a38.lipsObjIndex = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a38.objIndex = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a38.dxLips = in.readByte();
|
|
||||||
_actListArr[i][j].a38.dyLips = in.readByte();
|
|
||||||
break;
|
|
||||||
case INIT_STORY_MODE: // 39
|
|
||||||
_actListArr[i][j].a39.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a39.storyModeFl = (in.readByte() == 1);
|
|
||||||
break;
|
|
||||||
case WARN: // 40
|
|
||||||
_actListArr[i][j].a40.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a40.stringIndex = in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case COND_BONUS: // 41
|
|
||||||
_actListArr[i][j].a41.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a41.BonusIndex = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a41.actPassIndex = in.readUint16BE();
|
|
||||||
_actListArr[i][j].a41.actFailIndex = in.readUint16BE();
|
|
||||||
break;
|
|
||||||
case TEXT_TAKE: // 42
|
|
||||||
_actListArr[i][j].a42.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a42.objIndex = in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case YESNO: // 43
|
|
||||||
_actListArr[i][j].a43.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a43.promptIndex = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a43.actYesIndex = in.readUint16BE();
|
|
||||||
_actListArr[i][j].a43.actNoIndex = in.readUint16BE();
|
|
||||||
break;
|
|
||||||
case STOP_ROUTE: // 44
|
|
||||||
_actListArr[i][j].a44.timer = in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case COND_ROUTE: // 45
|
|
||||||
_actListArr[i][j].a45.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a45.routeIndex = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a45.actPassIndex = in.readUint16BE();
|
|
||||||
_actListArr[i][j].a45.actFailIndex = in.readUint16BE();
|
|
||||||
break;
|
|
||||||
case INIT_JUMPEXIT: // 46
|
|
||||||
_actListArr[i][j].a46.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a46.jumpExitFl = (in.readByte() == 1);
|
|
||||||
break;
|
|
||||||
case INIT_VIEW: // 47
|
|
||||||
_actListArr[i][j].a47.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a47.objIndex = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a47.viewx = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a47.viewy = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a47.direction = in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case INIT_OBJ_FRAME: // 48
|
|
||||||
_actListArr[i][j].a48.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a48.objIndex = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a48.seqIndex = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a48.frameIndex = in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case OLD_SONG: //49
|
|
||||||
_actListArr[i][j].a49.timer = in.readSint16BE();
|
|
||||||
_actListArr[i][j].a49.songIndex = in.readUint16BE();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
error("Engine - Unknown action type encountered: %d", _actListArr[i][j].a0.actType);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (varnt == _vm->_gameVariant)
|
||||||
_actListArr[i][numSubElem].a0.actType = ANULL;
|
_actListArr[i][numSubElem].a0.actType = ANULL;
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (int i = 0; i < numElem; i++) {
|
|
||||||
numSubElem = in.readUint16BE();
|
|
||||||
for (int j = 0; j < numSubElem; j++) {
|
|
||||||
numSubAct = in.readByte();
|
|
||||||
switch (numSubAct) {
|
|
||||||
case ANULL: // -1
|
|
||||||
break;
|
|
||||||
case ASCHEDULE: // 0
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readUint16BE();
|
|
||||||
break;
|
|
||||||
case START_OBJ: // 1
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readByte();
|
|
||||||
break;
|
|
||||||
case INIT_OBJXY: // 2
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case PROMPT: // 3
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
numSubAct = in.readUint16BE();
|
|
||||||
for (int k = 0; k < numSubAct; k++)
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readUint16BE();
|
|
||||||
in.readUint16BE();
|
|
||||||
in.readByte();
|
|
||||||
break;
|
|
||||||
case BKGD_COLOR: // 4
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readUint32BE();
|
|
||||||
break;
|
|
||||||
case INIT_OBJVXY: // 5
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case INIT_CARRY: // 6
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readByte();
|
|
||||||
break;
|
|
||||||
case INIT_HF_COORD: // 7
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case NEW_SCREEN: // 8
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case INIT_OBJSTATE: // 9
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readByte();
|
|
||||||
break;
|
|
||||||
case INIT_PATH: // 10
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readByte();
|
|
||||||
in.readByte();
|
|
||||||
break;
|
|
||||||
case COND_R: // 11
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readByte();
|
|
||||||
in.readUint16BE();
|
|
||||||
in.readUint16BE();
|
|
||||||
break;
|
|
||||||
case TEXT: // 12
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case SWAP_IMAGES: // 13
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case COND_SCR: // 14
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readUint16BE();
|
|
||||||
in.readUint16BE();
|
|
||||||
break;
|
|
||||||
case AUTOPILOT: // 15
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readByte();
|
|
||||||
in.readByte();
|
|
||||||
break;
|
|
||||||
case INIT_OBJ_SEQ: // 16
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case SET_STATE_BITS: // 17
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case CLEAR_STATE_BITS: // 18
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case TEST_STATE_BITS: // 19
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readUint16BE();
|
|
||||||
in.readUint16BE();
|
|
||||||
break;
|
|
||||||
case DEL_EVENTS: // 20
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readByte();
|
|
||||||
break;
|
|
||||||
case GAMEOVER: // 21
|
|
||||||
in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case INIT_HH_COORD: // 22
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case EXIT: // 23
|
|
||||||
in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case BONUS: // 24
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case COND_BOX: // 25
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readUint16BE();
|
|
||||||
in.readUint16BE();
|
|
||||||
break;
|
|
||||||
case SOUND: // 26
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case ADD_SCORE: // 27
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case SUB_SCORE: // 28
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case COND_CARRY: // 29
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readUint16BE();
|
|
||||||
in.readUint16BE();
|
|
||||||
break;
|
|
||||||
case INIT_MAZE: // 30
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readByte();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readByte();
|
|
||||||
break;
|
|
||||||
case EXIT_MAZE: // 31
|
|
||||||
in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case INIT_PRIORITY: // 32
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readByte();
|
|
||||||
break;
|
|
||||||
case INIT_SCREEN: // 33
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case AGSCHEDULE: // 34
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readUint16BE();
|
|
||||||
break;
|
|
||||||
case REMAPPAL: // 35
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case COND_NOUN: // 36
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readUint16BE();
|
|
||||||
in.readUint16BE();
|
|
||||||
in.readUint16BE();
|
|
||||||
break;
|
|
||||||
case SCREEN_STATE: // 37
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readByte();
|
|
||||||
break;
|
|
||||||
case INIT_LIPS: // 38
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readByte();
|
|
||||||
in.readByte();
|
|
||||||
break;
|
|
||||||
case INIT_STORY_MODE: // 39
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readByte();
|
|
||||||
break;
|
|
||||||
case WARN: // 40
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case COND_BONUS: // 41
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readUint16BE();
|
|
||||||
in.readUint16BE();
|
|
||||||
break;
|
|
||||||
case TEXT_TAKE: // 42
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case YESNO: // 43
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readUint16BE();
|
|
||||||
in.readUint16BE();
|
|
||||||
break;
|
|
||||||
case STOP_ROUTE: // 44
|
|
||||||
in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case COND_ROUTE: // 45
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readUint16BE();
|
|
||||||
in.readUint16BE();
|
|
||||||
break;
|
|
||||||
case INIT_JUMPEXIT: // 46
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readByte();
|
|
||||||
break;
|
|
||||||
case INIT_VIEW: // 47
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case INIT_OBJ_FRAME: // 48
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readSint16BE();
|
|
||||||
break;
|
|
||||||
case OLD_SONG: //49
|
|
||||||
in.readSint16BE();
|
|
||||||
in.readUint16BE();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
error("Engine - Unknown action type encountered %d - variante %d pos %d.%d", numSubAct, varnt, i, j);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read _screenActs
|
* Read _screenActs
|
||||||
*/
|
*/
|
||||||
void Scheduler::loadScreenAct(Common::ReadStream &in) {
|
void Scheduler::loadScreenAct(Common::SeekableReadStream &in) {
|
||||||
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
|
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
|
||||||
uint16 numElem = in.readUint16BE();
|
uint16 numElem = in.readUint16BE();
|
||||||
|
|
||||||
uint16 **wrkScreenActs = (uint16 **)malloc(sizeof(uint16 *) * numElem);
|
|
||||||
for (int i = 0; i < numElem; i++) {
|
|
||||||
uint16 numSubElem = in.readUint16BE();
|
|
||||||
if (numSubElem == 0) {
|
|
||||||
wrkScreenActs[i] = 0;
|
|
||||||
} else {
|
|
||||||
wrkScreenActs[i] = (uint16 *)malloc(sizeof(uint16) * numSubElem);
|
|
||||||
for (int j = 0; j < numSubElem; j++)
|
|
||||||
wrkScreenActs[i][j] = in.readUint16BE();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (varnt == _vm->_gameVariant) {
|
if (varnt == _vm->_gameVariant) {
|
||||||
_screenActsSize = numElem;
|
_screenActsSize = numElem;
|
||||||
_screenActs = wrkScreenActs;
|
_screenActs = (uint16 **)malloc(sizeof(uint16 *) * numElem);
|
||||||
|
for (int i = 0; i < numElem; i++) {
|
||||||
|
uint16 numSubElem = in.readUint16BE();
|
||||||
|
if (numSubElem == 0) {
|
||||||
|
_screenActs[i] = 0;
|
||||||
|
} else {
|
||||||
|
_screenActs[i] = (uint16 *)malloc(sizeof(uint16) * numSubElem);
|
||||||
|
for (int j = 0; j < numSubElem; j++)
|
||||||
|
_screenActs[i][j] = in.readUint16BE();
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
for (int i = 0; i < numElem; i++)
|
for (int i = 0; i < numElem; i++) {
|
||||||
free(wrkScreenActs[i]);
|
uint16 numSubElem = in.readUint16BE();
|
||||||
free(wrkScreenActs);
|
in.skip(numSubElem * sizeof(uint16));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -466,11 +466,12 @@ public:
|
||||||
void insertActionList(const uint16 actIndex);
|
void insertActionList(const uint16 actIndex);
|
||||||
void loadActListArr(Common::ReadStream &in);
|
void loadActListArr(Common::ReadStream &in);
|
||||||
void loadAlNewscrIndex(Common::ReadStream &in);
|
void loadAlNewscrIndex(Common::ReadStream &in);
|
||||||
void loadPoints(Common::ReadStream &in);
|
void loadPoints(Common::SeekableReadStream &in);
|
||||||
void loadScreenAct(Common::ReadStream &in);
|
void loadScreenAct(Common::SeekableReadStream &in);
|
||||||
void newScreen(const int screenIndex);
|
void newScreen(const int screenIndex);
|
||||||
void processBonus(const int bonusIndex);
|
void processBonus(const int bonusIndex);
|
||||||
void processMaze(const int x1, const int x2, const int y1, const int y2);
|
void processMaze(const int x1, const int x2, const int y1, const int y2);
|
||||||
|
void readAct(Common::ReadStream &in, act &curAct);
|
||||||
void restoreSchedulerData(Common::ReadStream *in);
|
void restoreSchedulerData(Common::ReadStream *in);
|
||||||
void restoreScreen(const int screenIndex);
|
void restoreScreen(const int screenIndex);
|
||||||
void saveSchedulerData(Common::WriteStream *out);
|
void saveSchedulerData(Common::WriteStream *out);
|
||||||
|
|
|
@ -42,8 +42,8 @@ public:
|
||||||
const char *getTextParser(int parserIndex) const { return _textParser[parserIndex]; }
|
const char *getTextParser(int parserIndex) const { return _textParser[parserIndex]; }
|
||||||
const char *getTextUtil(int utilIndex) const { return _textUtil[utilIndex]; }
|
const char *getTextUtil(int utilIndex) const { return _textUtil[utilIndex]; }
|
||||||
const char *getVerb(int idx1, int idx2) const { return _arrayVerbs[idx1][idx2]; }
|
const char *getVerb(int idx1, int idx2) const { return _arrayVerbs[idx1][idx2]; }
|
||||||
char **getNounArray(int idx1) { return _arrayNouns[idx1]; }
|
char **getNounArray(int idx1) const { return _arrayNouns[idx1]; }
|
||||||
char **getVerbArray(int idx1) { return _arrayVerbs[idx1]; }
|
char **getVerbArray(int idx1) const { return _arrayVerbs[idx1]; }
|
||||||
|
|
||||||
void loadAllTexts(Common::ReadStream &in);
|
void loadAllTexts(Common::ReadStream &in);
|
||||||
void freeAllTexts();
|
void freeAllTexts();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue