diff options
Diffstat (limited to 'engines/gob')
28 files changed, 601 insertions, 448 deletions
diff --git a/engines/gob/dataio.cpp b/engines/gob/dataio.cpp index 8ae11b8755..bcf566d134 100644 --- a/engines/gob/dataio.cpp +++ b/engines/gob/dataio.cpp @@ -202,7 +202,7 @@ const Common::File *DataIO::file_getHandle(int16 handle) const {  	return &_filesHandles[handle];  } -int16 DataIO::file_open(const char *path, Common::File::AccessMode mode) { +int16 DataIO::file_open(const char *path) {  	int16 i;  	for (i = 0; i < MAX_FILES; i++) { @@ -212,7 +212,7 @@ int16 DataIO::file_open(const char *path, Common::File::AccessMode mode) {  	if (i == MAX_FILES)  		return -1; -	file_getHandle(i)->open(path, mode); +	file_getHandle(i)->open(path);  	if (file_getHandle(i)->isOpen())  		return i; @@ -467,17 +467,14 @@ void DataIO::closeData(int16 handle) {  		file_getHandle(handle)->close();  } -int16 DataIO::openData(const char *path, Common::File::AccessMode mode) { +int16 DataIO::openData(const char *path) {  	int16 handle; -	if (mode != Common::File::kFileReadMode) -		return file_open(path, mode); -  	handle = getChunk(path);  	if (handle >= 0)  		return handle; -	return file_open(path, mode); +	return file_open(path);  }  DataStream *DataIO::openAsStream(int16 handle, bool dispose) { diff --git a/engines/gob/dataio.h b/engines/gob/dataio.h index a990dbeda5..4b4c79d1eb 100644 --- a/engines/gob/dataio.h +++ b/engines/gob/dataio.h @@ -79,8 +79,7 @@ public:  	void closeDataFile(bool itk = 0);  	byte *getUnpackedData(const char *name);  	void closeData(int16 handle); -	int16 openData(const char *path, -			Common::File::AccessMode mode = Common::File::kFileReadMode); +	int16 openData(const char *path);  	DataStream *openAsStream(int16 handle, bool dispose = false);  	int32 getDataSize(const char *name); @@ -104,8 +103,7 @@ protected:  	class GobEngine *_vm; -	int16 file_open(const char *path, -			Common::File::AccessMode mode = Common::File::kFileReadMode); +	int16 file_open(const char *path);  	Common::File *file_getHandle(int16 handle);  	const Common::File *file_getHandle(int16 handle) const; diff --git a/engines/gob/detection.cpp b/engines/gob/detection.cpp index 8351f2ecfb..63a0f8f45b 100644 --- a/engines/gob/detection.cpp +++ b/engines/gob/detection.cpp @@ -277,6 +277,19 @@ static const GOBGameDescription gameDescriptions[] = {  		kFeaturesNone,  		"intro"  	}, +	{ // Supplied by raina in the forums +		{ +			"gob1", +			"", +			AD_ENTRY1s("intro.stk", "6d837c6380d8f4d984c9f6cc0026df4f", 192712), +			EN_ANY, +			kPlatformMacintosh, +			Common::ADGF_NO_FLAGS +		}, +		kGameTypeGob1, +		kFeaturesNone, +		"intro" +	},  	{ // Supplied by paul66 in bug report #1652352  		{  			"gob1", diff --git a/engines/gob/driver_vga.cpp b/engines/gob/driver_vga.cpp index f68ce47783..2d3a10b570 100644 --- a/engines/gob/driver_vga.cpp +++ b/engines/gob/driver_vga.cpp @@ -112,7 +112,7 @@ void VGAVideoDriver::drawSprite(SurfaceDesc *source, SurfaceDesc *dest,  	if ((width < 1) || (height < 1))  		return; -	byte *srcPos = source->getVidMem() + (top * source->getWidth()) + left; +	const byte *srcPos = source->getVidMem() + (top * source->getWidth()) + left;  	byte *destPos = dest->getVidMem() + (y * dest->getWidth()) + x;  	uint32 size = width * height; diff --git a/engines/gob/gob.cpp b/engines/gob/gob.cpp index a3fe0ebbe2..34443251d8 100644 --- a/engines/gob/gob.cpp +++ b/engines/gob/gob.cpp @@ -147,6 +147,15 @@ void GobEngine::validateVideoMode(int16 videoMode) {  		error("Video mode 0x%X is not supported!", videoMode);  } +Endianness GobEngine::getEndianness() const { +	if ((_vm->getPlatform() == Common::kPlatformAmiga) || +	    (_vm->getPlatform() == Common::kPlatformMacintosh) || +	    (_vm->getPlatform() == Common::kPlatformAtariST)) +		return kEndiannessBE; + +	return kEndiannessLE; +} +  Common::Platform GobEngine::getPlatform() const {  	return _platform;  } diff --git a/engines/gob/gob.h b/engines/gob/gob.h index ae2b53bc31..041658baea 100644 --- a/engines/gob/gob.h +++ b/engines/gob/gob.h @@ -79,6 +79,11 @@ class SaveLoad;  #define VAR(var)                    READ_VAR_UINT32(var) +enum Endianness { +	kEndiannessLE, +	kEndiannessBE +}; +  enum GameType {  	kGameTypeNone = 0,  	kGameTypeGob1, @@ -230,6 +235,7 @@ public:  	void validateLanguage();  	void validateVideoMode(int16 videoMode); +	Endianness getEndianness() const;  	Common::Platform getPlatform() const;  	GameType getGameType() const;  	bool isCD() const; diff --git a/engines/gob/goblin.cpp b/engines/gob/goblin.cpp index e7aed0790e..5add0b9cea 100644 --- a/engines/gob/goblin.cpp +++ b/engines/gob/goblin.cpp @@ -78,58 +78,6 @@ Goblin::Goblin(GobEngine *vm) : _vm(vm) {  	_pressedMapY = 0;  	_pathExistence = 0; -	_some0ValPtr = 0; - -	_gobRetVarPtr = 0; -	_curGobVarPtr = 0; -	_curGobXPosVarPtr = 0; -	_curGobYPosVarPtr = 0; -	_itemInPocketVarPtr = 0; - -	_curGobStateVarPtr = 0; -	_curGobFrameVarPtr = 0; -	_curGobMultStateVarPtr = 0; -	_curGobNextStateVarPtr = 0; -	_curGobScrXVarPtr = 0; -	_curGobScrYVarPtr = 0; -	_curGobLeftVarPtr = 0; -	_curGobTopVarPtr = 0; -	_curGobRightVarPtr = 0; -	_curGobBottomVarPtr = 0; -	_curGobDoAnimVarPtr = 0; -	_curGobOrderVarPtr = 0; -	_curGobNoTickVarPtr = 0; -	_curGobTypeVarPtr = 0; -	_curGobMaxTickVarPtr = 0; -	_curGobTickVarPtr = 0; -	_curGobActStartStateVarPtr = 0; -	_curGobLookDirVarPtr = 0; -	_curGobPickableVarPtr = 0; -	_curGobRelaxVarPtr = 0; -	_curGobMaxFrameVarPtr = 0; - -	_destItemStateVarPtr = 0; -	_destItemFrameVarPtr = 0; -	_destItemMultStateVarPtr = 0; -	_destItemNextStateVarPtr = 0; -	_destItemScrXVarPtr = 0; -	_destItemScrYVarPtr = 0; -	_destItemLeftVarPtr = 0; -	_destItemTopVarPtr = 0; -	_destItemRightVarPtr = 0; -	_destItemBottomVarPtr = 0; -	_destItemDoAnimVarPtr = 0; -	_destItemOrderVarPtr = 0; -	_destItemNoTickVarPtr = 0; -	_destItemTypeVarPtr = 0; -	_destItemMaxTickVarPtr = 0; -	_destItemTickVarPtr = 0; -	_destItemActStartStVarPtr = 0; -	_destItemLookDirVarPtr = 0; -	_destItemPickableVarPtr = 0; -	_destItemRelaxVarPtr = 0; -	_destItemMaxFrameVarPtr = 0; -  	_destItemType = 0;  	_destItemState = 0;  	for (int i = 0; i < 20; i++) { @@ -690,7 +638,7 @@ void Goblin::switchGoblin(int16 index) {  	_gobDestY = tmp;  	_vm->_map->_curGoblinY = tmp; -	*_curGobVarPtr = _currentGoblin; +	_curGobVarPtr = (uint32) _currentGoblin;  	_pathExistence = 0;  	_readyToAct = 0;  } @@ -1250,172 +1198,172 @@ void Goblin::loadObjects(const char *source) {  void Goblin::saveGobDataToVars(int16 xPos, int16 yPos, int16 someVal) {  	Gob_Object *obj; -	*_some0ValPtr = someVal; -	*_curGobXPosVarPtr = xPos; -	*_curGobYPosVarPtr = yPos; -	*_itemInPocketVarPtr = _itemIndInPocket; +	_some0ValPtr = (uint32) someVal; +	_curGobXPosVarPtr = (uint32) xPos; +	_curGobYPosVarPtr = (uint32) yPos; +	_itemInPocketVarPtr = (uint32) _itemIndInPocket;  	obj = _goblins[_currentGoblin]; -	*_curGobStateVarPtr = obj->state; -	*_curGobFrameVarPtr = obj->curFrame; -	*_curGobMultStateVarPtr = obj->multState; -	*_curGobNextStateVarPtr = obj->nextState; -	*_curGobScrXVarPtr = obj->xPos; -	*_curGobScrYVarPtr = obj->yPos; -	*_curGobLeftVarPtr = obj->left; -	*_curGobTopVarPtr = obj->top; -	*_curGobRightVarPtr = obj->right; -	*_curGobBottomVarPtr = obj->bottom; -	*_curGobDoAnimVarPtr = obj->doAnim; -	*_curGobOrderVarPtr = obj->order; -	*_curGobNoTickVarPtr = obj->noTick; -	*_curGobTypeVarPtr = obj->type; -	*_curGobMaxTickVarPtr = obj->maxTick; -	*_curGobTickVarPtr = obj->tick; -	*_curGobActStartStateVarPtr = obj->actionStartState; -	*_curGobLookDirVarPtr = obj->curLookDir; -	*_curGobPickableVarPtr = obj->pickable; -	*_curGobRelaxVarPtr = obj->relaxTime; -	*_curGobMaxFrameVarPtr = getObjMaxFrame(obj); +	_curGobStateVarPtr = (uint32) obj->state; +	_curGobFrameVarPtr = (uint32) obj->curFrame; +	_curGobMultStateVarPtr = (uint32) obj->multState; +	_curGobNextStateVarPtr = (uint32) obj->nextState; +	_curGobScrXVarPtr = (uint32) obj->xPos; +	_curGobScrYVarPtr = (uint32) obj->yPos; +	_curGobLeftVarPtr = (uint32) obj->left; +	_curGobTopVarPtr = (uint32) obj->top; +	_curGobRightVarPtr = (uint32) obj->right; +	_curGobBottomVarPtr = (uint32) obj->bottom; +	_curGobDoAnimVarPtr = (uint32) obj->doAnim; +	_curGobOrderVarPtr = (uint32) obj->order; +	_curGobNoTickVarPtr = (uint32) obj->noTick; +	_curGobTypeVarPtr = (uint32) obj->type; +	_curGobMaxTickVarPtr = (uint32) obj->maxTick; +	_curGobTickVarPtr = (uint32) obj->tick; +	_curGobActStartStateVarPtr = (uint32) obj->actionStartState; +	_curGobLookDirVarPtr = (uint32) obj->curLookDir; +	_curGobPickableVarPtr = (uint32) obj->pickable; +	_curGobRelaxVarPtr = (uint32) obj->relaxTime; +	_curGobMaxFrameVarPtr = (uint32) getObjMaxFrame(obj);  	if (_actDestItemDesc == 0)  		return;  	obj = _actDestItemDesc; -	*_destItemStateVarPtr = obj->state; -	*_destItemFrameVarPtr = obj->curFrame; -	*_destItemMultStateVarPtr = obj->multState; -	*_destItemNextStateVarPtr = obj->nextState; -	*_destItemScrXVarPtr = obj->xPos; -	*_destItemScrYVarPtr = obj->yPos; -	*_destItemLeftVarPtr = obj->left; -	*_destItemTopVarPtr = obj->top; -	*_destItemRightVarPtr = obj->right; -	*_destItemBottomVarPtr = obj->bottom; -	*_destItemDoAnimVarPtr = obj->doAnim; -	*_destItemOrderVarPtr = obj->order; -	*_destItemNoTickVarPtr = obj->noTick; -	*_destItemTypeVarPtr = obj->type; -	*_destItemMaxTickVarPtr = obj->maxTick; -	*_destItemTickVarPtr = obj->tick; -	*_destItemActStartStVarPtr = obj->actionStartState; -	*_destItemLookDirVarPtr = obj->curLookDir; -	*_destItemPickableVarPtr = obj->pickable; -	*_destItemRelaxVarPtr = obj->relaxTime; -	*_destItemMaxFrameVarPtr = getObjMaxFrame(obj); +	_destItemStateVarPtr = (uint32) obj->state; +	_destItemFrameVarPtr = (uint32) obj->curFrame; +	_destItemMultStateVarPtr = (uint32) obj->multState; +	_destItemNextStateVarPtr = (uint32) obj->nextState; +	_destItemScrXVarPtr = (uint32) obj->xPos; +	_destItemScrYVarPtr = (uint32) obj->yPos; +	_destItemLeftVarPtr = (uint32) obj->left; +	_destItemTopVarPtr = (uint32) obj->top; +	_destItemRightVarPtr = (uint32) obj->right; +	_destItemBottomVarPtr = (uint32) obj->bottom; +	_destItemDoAnimVarPtr = (uint32) obj->doAnim; +	_destItemOrderVarPtr = (uint32) obj->order; +	_destItemNoTickVarPtr = (uint32) obj->noTick; +	_destItemTypeVarPtr = (uint32) obj->type; +	_destItemMaxTickVarPtr = (uint32) obj->maxTick; +	_destItemTickVarPtr = (uint32) obj->tick; +	_destItemActStartStVarPtr = (uint32) obj->actionStartState; +	_destItemLookDirVarPtr = (uint32) obj->curLookDir; +	_destItemPickableVarPtr = (uint32) obj->pickable; +	_destItemRelaxVarPtr = (uint32) obj->relaxTime; +	_destItemMaxFrameVarPtr = (uint32) getObjMaxFrame(obj);  	_destItemState = obj->state;  	_destItemType = obj->type;  }  void Goblin::initVarPointers(void) { -	_gobRetVarPtr = (int32 *)VAR_ADDRESS(59); -	_curGobStateVarPtr = (int32 *)VAR_ADDRESS(60); -	_curGobFrameVarPtr = (int32 *)VAR_ADDRESS(61); -	_curGobMultStateVarPtr = (int32 *)VAR_ADDRESS(62); -	_curGobNextStateVarPtr = (int32 *)VAR_ADDRESS(63); -	_curGobScrXVarPtr = (int32 *)VAR_ADDRESS(64); -	_curGobScrYVarPtr = (int32 *)VAR_ADDRESS(65); -	_curGobLeftVarPtr = (int32 *)VAR_ADDRESS(66); -	_curGobTopVarPtr = (int32 *)VAR_ADDRESS(67); -	_curGobRightVarPtr = (int32 *)VAR_ADDRESS(68); -	_curGobBottomVarPtr = (int32 *)VAR_ADDRESS(69); -	_curGobDoAnimVarPtr = (int32 *)VAR_ADDRESS(70); -	_curGobOrderVarPtr = (int32 *)VAR_ADDRESS(71); -	_curGobNoTickVarPtr = (int32 *)VAR_ADDRESS(72); -	_curGobTypeVarPtr = (int32 *)VAR_ADDRESS(73); -	_curGobMaxTickVarPtr = (int32 *)VAR_ADDRESS(74); -	_curGobTickVarPtr = (int32 *)VAR_ADDRESS(75); -	_curGobActStartStateVarPtr = (int32 *)VAR_ADDRESS(76); -	_curGobLookDirVarPtr = (int32 *)VAR_ADDRESS(77); -	_curGobPickableVarPtr = (int32 *)VAR_ADDRESS(80); -	_curGobRelaxVarPtr = (int32 *)VAR_ADDRESS(81); -	_destItemStateVarPtr = (int32 *)VAR_ADDRESS(82); -	_destItemFrameVarPtr = (int32 *)VAR_ADDRESS(83); -	_destItemMultStateVarPtr = (int32 *)VAR_ADDRESS(84); -	_destItemNextStateVarPtr = (int32 *)VAR_ADDRESS(85); -	_destItemScrXVarPtr = (int32 *)VAR_ADDRESS(86); -	_destItemScrYVarPtr = (int32 *)VAR_ADDRESS(87); -	_destItemLeftVarPtr = (int32 *)VAR_ADDRESS(88); -	_destItemTopVarPtr = (int32 *)VAR_ADDRESS(89); -	_destItemRightVarPtr = (int32 *)VAR_ADDRESS(90); -	_destItemBottomVarPtr = (int32 *)VAR_ADDRESS(91); -	_destItemDoAnimVarPtr = (int32 *)VAR_ADDRESS(92); -	_destItemOrderVarPtr = (int32 *)VAR_ADDRESS(93); -	_destItemNoTickVarPtr = (int32 *)VAR_ADDRESS(94); -	_destItemTypeVarPtr = (int32 *)VAR_ADDRESS(95); -	_destItemMaxTickVarPtr = (int32 *)VAR_ADDRESS(96); -	_destItemTickVarPtr = (int32 *)VAR_ADDRESS(97); -	_destItemActStartStVarPtr = (int32 *)VAR_ADDRESS(98); -	_destItemLookDirVarPtr = (int32 *)VAR_ADDRESS(99); -	_destItemPickableVarPtr = (int32 *)VAR_ADDRESS(102); -	_destItemRelaxVarPtr = (int32 *)VAR_ADDRESS(103); -	_destItemMaxFrameVarPtr = (int32 *)VAR_ADDRESS(105); -	_curGobVarPtr = (int32 *)VAR_ADDRESS(106); -	_some0ValPtr = (int32 *)VAR_ADDRESS(107); -	_curGobXPosVarPtr = (int32 *)VAR_ADDRESS(108); -	_curGobYPosVarPtr = (int32 *)VAR_ADDRESS(109); -	_curGobMaxFrameVarPtr = (int32 *)VAR_ADDRESS(110); - -	_itemInPocketVarPtr = (int32 *)VAR_ADDRESS(114); - -	*_itemInPocketVarPtr = -2; +	_gobRetVarPtr.set(*_vm->_inter->_variables, 236); +	_curGobStateVarPtr.set(*_vm->_inter->_variables, 240); +	_curGobFrameVarPtr.set(*_vm->_inter->_variables, 244); +	_curGobMultStateVarPtr.set(*_vm->_inter->_variables, 248); +	_curGobNextStateVarPtr.set(*_vm->_inter->_variables, 252); +	_curGobScrXVarPtr.set(*_vm->_inter->_variables, 256); +	_curGobScrYVarPtr.set(*_vm->_inter->_variables, 260); +	_curGobLeftVarPtr.set(*_vm->_inter->_variables, 264); +	_curGobTopVarPtr.set(*_vm->_inter->_variables, 268); +	_curGobRightVarPtr.set(*_vm->_inter->_variables, 272); +	_curGobBottomVarPtr.set(*_vm->_inter->_variables, 276); +	_curGobDoAnimVarPtr.set(*_vm->_inter->_variables, 280); +	_curGobOrderVarPtr.set(*_vm->_inter->_variables, 284); +	_curGobNoTickVarPtr.set(*_vm->_inter->_variables, 288); +	_curGobTypeVarPtr.set(*_vm->_inter->_variables, 292); +	_curGobMaxTickVarPtr.set(*_vm->_inter->_variables, 296); +	_curGobTickVarPtr.set(*_vm->_inter->_variables, 300); +	_curGobActStartStateVarPtr.set(*_vm->_inter->_variables, 304); +	_curGobLookDirVarPtr.set(*_vm->_inter->_variables, 308); +	_curGobPickableVarPtr.set(*_vm->_inter->_variables, 320); +	_curGobRelaxVarPtr.set(*_vm->_inter->_variables, 324); +	_destItemStateVarPtr.set(*_vm->_inter->_variables, 328); +	_destItemFrameVarPtr.set(*_vm->_inter->_variables, 332); +	_destItemMultStateVarPtr.set(*_vm->_inter->_variables, 336); +	_destItemNextStateVarPtr.set(*_vm->_inter->_variables, 340); +	_destItemScrXVarPtr.set(*_vm->_inter->_variables, 344); +	_destItemScrYVarPtr.set(*_vm->_inter->_variables, 348); +	_destItemLeftVarPtr.set(*_vm->_inter->_variables, 352); +	_destItemTopVarPtr.set(*_vm->_inter->_variables, 356); +	_destItemRightVarPtr.set(*_vm->_inter->_variables, 360); +	_destItemBottomVarPtr.set(*_vm->_inter->_variables, 364); +	_destItemDoAnimVarPtr.set(*_vm->_inter->_variables, 368); +	_destItemOrderVarPtr.set(*_vm->_inter->_variables, 372); +	_destItemNoTickVarPtr.set(*_vm->_inter->_variables, 376); +	_destItemTypeVarPtr.set(*_vm->_inter->_variables, 380); +	_destItemMaxTickVarPtr.set(*_vm->_inter->_variables, 384); +	_destItemTickVarPtr.set(*_vm->_inter->_variables, 388); +	_destItemActStartStVarPtr.set(*_vm->_inter->_variables, 392); +	_destItemLookDirVarPtr.set(*_vm->_inter->_variables, 396); +	_destItemPickableVarPtr.set(*_vm->_inter->_variables, 408); +	_destItemRelaxVarPtr.set(*_vm->_inter->_variables, 412); +	_destItemMaxFrameVarPtr.set(*_vm->_inter->_variables, 420); +	_curGobVarPtr.set(*_vm->_inter->_variables, 424); +	_some0ValPtr.set(*_vm->_inter->_variables, 428); +	_curGobXPosVarPtr.set(*_vm->_inter->_variables, 432); +	_curGobYPosVarPtr.set(*_vm->_inter->_variables, 436); +	_curGobMaxFrameVarPtr.set(*_vm->_inter->_variables, 440); + +	_itemInPocketVarPtr.set(*_vm->_inter->_variables, 456); + +	_itemInPocketVarPtr = (uint32) -2;  }  void Goblin::loadGobDataFromVars(void) {  	Gob_Object *obj; -	_itemIndInPocket = *_itemInPocketVarPtr; +	_itemIndInPocket = (int32) _itemInPocketVarPtr;  	obj = _goblins[_currentGoblin]; -	obj->state = *_curGobStateVarPtr; -	obj->curFrame = *_curGobFrameVarPtr; -	obj->multState = *_curGobMultStateVarPtr; -	obj->nextState = *_curGobNextStateVarPtr; -	obj->xPos = *_curGobScrXVarPtr; -	obj->yPos = *_curGobScrYVarPtr; -	obj->left = *_curGobLeftVarPtr; -	obj->top = *_curGobTopVarPtr; -	obj->right = *_curGobRightVarPtr; -	obj->bottom = *_curGobBottomVarPtr; -	obj->doAnim = *_curGobDoAnimVarPtr; -	obj->order = *_curGobOrderVarPtr; -	obj->noTick = *_curGobNoTickVarPtr; -	obj->type = *_curGobTypeVarPtr; -	obj->maxTick = *_curGobMaxTickVarPtr; -	obj->tick = *_curGobTickVarPtr; -	obj->actionStartState = *_curGobActStartStateVarPtr; -	obj->curLookDir = *_curGobLookDirVarPtr; -	obj->pickable = *_curGobPickableVarPtr; -	obj->relaxTime = *_curGobRelaxVarPtr; +	obj->state = (int32) _curGobStateVarPtr; +	obj->curFrame = (int32) _curGobFrameVarPtr; +	obj->multState = (int32) _curGobMultStateVarPtr; +	obj->nextState = (int32) _curGobNextStateVarPtr; +	obj->xPos = (int32) _curGobScrXVarPtr; +	obj->yPos = (int32) _curGobScrYVarPtr; +	obj->left = (int32) _curGobLeftVarPtr; +	obj->top = (int32) _curGobTopVarPtr; +	obj->right = (int32) _curGobRightVarPtr; +	obj->bottom = (int32) _curGobBottomVarPtr; +	obj->doAnim = (int32) _curGobDoAnimVarPtr; +	obj->order = (int32) _curGobOrderVarPtr; +	obj->noTick = (int32) _curGobNoTickVarPtr; +	obj->type = (int32) _curGobTypeVarPtr; +	obj->maxTick = (int32) _curGobMaxTickVarPtr; +	obj->tick = (int32) _curGobTickVarPtr; +	obj->actionStartState = (int32) _curGobActStartStateVarPtr; +	obj->curLookDir = (int32) _curGobLookDirVarPtr; +	obj->pickable = (int32) _curGobPickableVarPtr; +	obj->relaxTime = (int32) _curGobRelaxVarPtr;  	if (_actDestItemDesc == 0)  		return;  	obj = _actDestItemDesc; -	obj->state = *_destItemStateVarPtr; -	obj->curFrame = *_destItemFrameVarPtr; -	obj->multState = *_destItemMultStateVarPtr; -	obj->nextState = *_destItemNextStateVarPtr; -	obj->xPos = *_destItemScrXVarPtr; -	obj->yPos = *_destItemScrYVarPtr; -	obj->left = *_destItemLeftVarPtr; -	obj->top = *_destItemTopVarPtr; -	obj->right = *_destItemRightVarPtr; -	obj->bottom = *_destItemBottomVarPtr; -	obj->doAnim = *_destItemDoAnimVarPtr; -	obj->order = *_destItemOrderVarPtr; -	obj->noTick = *_destItemNoTickVarPtr; -	obj->type = *_destItemTypeVarPtr; -	obj->maxTick = *_destItemMaxTickVarPtr; -	obj->tick = *_destItemTickVarPtr; -	obj->actionStartState = *_destItemActStartStVarPtr; -	obj->curLookDir = *_destItemLookDirVarPtr; -	obj->pickable = *_destItemPickableVarPtr; -	obj->relaxTime = *_destItemRelaxVarPtr; +	obj->state = (int32) _destItemStateVarPtr; +	obj->curFrame = (int32) _destItemFrameVarPtr; +	obj->multState = (int32) _destItemMultStateVarPtr; +	obj->nextState = (int32) _destItemNextStateVarPtr; +	obj->xPos = (int32) _destItemScrXVarPtr; +	obj->yPos = (int32) _destItemScrYVarPtr; +	obj->left = (int32) _destItemLeftVarPtr; +	obj->top = (int32) _destItemTopVarPtr; +	obj->right = (int32) _destItemRightVarPtr; +	obj->bottom = (int32) _destItemBottomVarPtr; +	obj->doAnim = (int32) _destItemDoAnimVarPtr; +	obj->order = (int32) _destItemOrderVarPtr; +	obj->noTick = (int32) _destItemNoTickVarPtr; +	obj->type = (int32) _destItemTypeVarPtr; +	obj->maxTick = (int32) _destItemMaxTickVarPtr; +	obj->tick = (int32) _destItemTickVarPtr; +	obj->actionStartState = (int32) _destItemActStartStVarPtr; +	obj->curLookDir = (int32) _destItemLookDirVarPtr; +	obj->pickable = (int32) _destItemPickableVarPtr; +	obj->relaxTime = (int32) _destItemRelaxVarPtr;  	if (obj->type != _destItemType)  		obj->toRedraw = 1; diff --git a/engines/gob/goblin.h b/engines/gob/goblin.h index 3fd8a9f93b..2100bcbdac 100644 --- a/engines/gob/goblin.h +++ b/engines/gob/goblin.h @@ -28,6 +28,7 @@  #include "gob/util.h"  #include "gob/mult.h" +#include "gob/variables.h"  #include "gob/sound/sounddesc.h"  namespace Gob { @@ -115,57 +116,57 @@ public:  	char _pathExistence;  	// Pointers to interpreter variables -	int32 *_some0ValPtr; - -	int32 *_gobRetVarPtr; -	int32 *_curGobVarPtr; -	int32 *_curGobXPosVarPtr; -	int32 *_curGobYPosVarPtr; -	int32 *_itemInPocketVarPtr; - -	int32 *_curGobStateVarPtr; -	int32 *_curGobFrameVarPtr; -	int32 *_curGobMultStateVarPtr; -	int32 *_curGobNextStateVarPtr; -	int32 *_curGobScrXVarPtr; -	int32 *_curGobScrYVarPtr; -	int32 *_curGobLeftVarPtr; -	int32 *_curGobTopVarPtr; -	int32 *_curGobRightVarPtr; -	int32 *_curGobBottomVarPtr; -	int32 *_curGobDoAnimVarPtr; -	int32 *_curGobOrderVarPtr; -	int32 *_curGobNoTickVarPtr; -	int32 *_curGobTypeVarPtr; -	int32 *_curGobMaxTickVarPtr; -	int32 *_curGobTickVarPtr; -	int32 *_curGobActStartStateVarPtr; -	int32 *_curGobLookDirVarPtr; -	int32 *_curGobPickableVarPtr; -	int32 *_curGobRelaxVarPtr; -	int32 *_curGobMaxFrameVarPtr; - -	int32 *_destItemStateVarPtr; -	int32 *_destItemFrameVarPtr; -	int32 *_destItemMultStateVarPtr; -	int32 *_destItemNextStateVarPtr; -	int32 *_destItemScrXVarPtr; -	int32 *_destItemScrYVarPtr; -	int32 *_destItemLeftVarPtr; -	int32 *_destItemTopVarPtr; -	int32 *_destItemRightVarPtr; -	int32 *_destItemBottomVarPtr; -	int32 *_destItemDoAnimVarPtr; -	int32 *_destItemOrderVarPtr; -	int32 *_destItemNoTickVarPtr; -	int32 *_destItemTypeVarPtr; -	int32 *_destItemMaxTickVarPtr; -	int32 *_destItemTickVarPtr; -	int32 *_destItemActStartStVarPtr; -	int32 *_destItemLookDirVarPtr; -	int32 *_destItemPickableVarPtr; -	int32 *_destItemRelaxVarPtr; -	int32 *_destItemMaxFrameVarPtr; +	VariableReference _some0ValPtr; + +	VariableReference _gobRetVarPtr; +	VariableReference _curGobVarPtr; +	VariableReference _curGobXPosVarPtr; +	VariableReference _curGobYPosVarPtr; +	VariableReference _itemInPocketVarPtr; + +	VariableReference _curGobStateVarPtr; +	VariableReference _curGobFrameVarPtr; +	VariableReference _curGobMultStateVarPtr; +	VariableReference _curGobNextStateVarPtr; +	VariableReference _curGobScrXVarPtr; +	VariableReference _curGobScrYVarPtr; +	VariableReference _curGobLeftVarPtr; +	VariableReference _curGobTopVarPtr; +	VariableReference _curGobRightVarPtr; +	VariableReference _curGobBottomVarPtr; +	VariableReference _curGobDoAnimVarPtr; +	VariableReference _curGobOrderVarPtr; +	VariableReference _curGobNoTickVarPtr; +	VariableReference _curGobTypeVarPtr; +	VariableReference _curGobMaxTickVarPtr; +	VariableReference _curGobTickVarPtr; +	VariableReference _curGobActStartStateVarPtr; +	VariableReference _curGobLookDirVarPtr; +	VariableReference _curGobPickableVarPtr; +	VariableReference _curGobRelaxVarPtr; +	VariableReference _curGobMaxFrameVarPtr; + +	VariableReference _destItemStateVarPtr; +	VariableReference _destItemFrameVarPtr; +	VariableReference _destItemMultStateVarPtr; +	VariableReference _destItemNextStateVarPtr; +	VariableReference _destItemScrXVarPtr; +	VariableReference _destItemScrYVarPtr; +	VariableReference _destItemLeftVarPtr; +	VariableReference _destItemTopVarPtr; +	VariableReference _destItemRightVarPtr; +	VariableReference _destItemBottomVarPtr; +	VariableReference _destItemDoAnimVarPtr; +	VariableReference _destItemOrderVarPtr; +	VariableReference _destItemNoTickVarPtr; +	VariableReference _destItemTypeVarPtr; +	VariableReference _destItemMaxTickVarPtr; +	VariableReference _destItemTickVarPtr; +	VariableReference _destItemActStartStVarPtr; +	VariableReference _destItemLookDirVarPtr; +	VariableReference _destItemPickableVarPtr; +	VariableReference _destItemRelaxVarPtr; +	VariableReference _destItemMaxFrameVarPtr;  	int16 _destItemType;  	int16 _destItemState; diff --git a/engines/gob/goblin_v2.cpp b/engines/gob/goblin_v2.cpp index 9144e35070..d763aeb01c 100644 --- a/engines/gob/goblin_v2.cpp +++ b/engines/gob/goblin_v2.cpp @@ -88,7 +88,7 @@ void Goblin_v2::placeObject(Gob_Object *objDesc, char animated,  				(_vm->_scenery->_animBottom - _vm->_scenery->_animTop) - (y + 1) / 2;  		*obj->pPosX = x * _vm->_map->_tilesWidth;  	} else { -		if (obj->goblinStates[state] != 0) { +		if ((obj->goblinStates != 0) && (obj->goblinStates[state] != 0)) {  			layer = obj->goblinStates[state][0].layer;  			animation = obj->goblinStates[state][0].animation;  			objAnim->state = state; diff --git a/engines/gob/inter.cpp b/engines/gob/inter.cpp index 9c39653a1d..02e7f99cbd 100644 --- a/engines/gob/inter.cpp +++ b/engines/gob/inter.cpp @@ -212,25 +212,35 @@ void Inter::funcBlock(int16 retFlag) {  			break;  		// WORKAROUND: -		// The EGA version of gob1 doesn't add a delay after showing +		// The EGA and Mac versions of gob1 doesn't add a delay after showing  		// images between levels. We manually add it here. -		if ((_vm->getGameType() == kGameTypeGob1) && _vm->isEGA()) { +		if ((_vm->getGameType() == kGameTypeGob1) && +		   (_vm->isEGA() || (_vm->getPlatform() == Common::kPlatformMacintosh))) { +  			int addr = _vm->_global->_inter_execPtr-_vm->_game->_totFileData; -			if ((startaddr == 0x18B4 && addr == 0x1A7F && // Zombie + +			if ((startaddr == 0x18B4 && addr == 0x1A7F && // Zombie, EGA +				 !strncmp(_vm->_game->_curTotFile, "avt005.tot", 10)) || +			  (startaddr == 0x188D && addr == 0x1A58 && // Zombie, Mac  				 !strncmp(_vm->_game->_curTotFile, "avt005.tot", 10)) ||  				(startaddr == 0x1299 && addr == 0x139A && // Dungeon  				 !strncmp(_vm->_game->_curTotFile, "avt006.tot", 10)) || -				(startaddr == 0x11C0 && addr == 0x12C9 && // Cauldron +				(startaddr == 0x11C0 && addr == 0x12C9 && // Cauldron, EGA +				 !strncmp(_vm->_game->_curTotFile, "avt012.tot", 10)) || +				(startaddr == 0x11C8 && addr == 0x1341 && // Cauldron, Mac  				 !strncmp(_vm->_game->_curTotFile, "avt012.tot", 10)) ||  				(startaddr == 0x09F2 && addr == 0x0AF3 && // Statue  				 !strncmp(_vm->_game->_curTotFile, "avt016.tot", 10)) ||  				(startaddr == 0x0B92 && addr == 0x0C93 && // Castle  				 !strncmp(_vm->_game->_curTotFile, "avt019.tot", 10)) || -				(startaddr == 0x17D9 && addr == 0x18DA && // Finale +				(startaddr == 0x17D9 && addr == 0x18DA && // Finale, EGA +				 !strncmp(_vm->_game->_curTotFile, "avt022.tot", 10)) || +				(startaddr == 0x17E9 && addr == 0x19A8 && // Finale, Mac  				 !strncmp(_vm->_game->_curTotFile, "avt022.tot", 10))) {  				_vm->_util->longDelay(5000);  			} +  		} // End of workaround  		cmd = *_vm->_global->_inter_execPtr; @@ -286,9 +296,7 @@ void Inter::callSub(int16 retFlag) {  }  void Inter::allocateVars(uint32 count) { -	if ((_vm->getPlatform() == Common::kPlatformAmiga) || -	    (_vm->getPlatform() == Common::kPlatformMacintosh) || -	    (_vm->getPlatform() == Common::kPlatformAtariST)) +	if (_vm->getEndianness() == kEndiannessBE)  		_variables = new VariablesBE(count * 4);  	else  		_variables = new VariablesLE(count * 4); diff --git a/engines/gob/inter.h b/engines/gob/inter.h index 60b3974d6d..b684be6c07 100644 --- a/engines/gob/inter.h +++ b/engines/gob/inter.h @@ -79,7 +79,7 @@ protected:  	};  	struct OpGobParams {  		int16 extraData; -		int32 *retVarPtr; +		VariableReference retVarPtr;  		Goblin::Gob_Object *objDesc;  	}; diff --git a/engines/gob/inter_v1.cpp b/engines/gob/inter_v1.cpp index e2b8d65112..865d188a2e 100644 --- a/engines/gob/inter_v1.cpp +++ b/engines/gob/inter_v1.cpp @@ -912,12 +912,21 @@ void Inter_v1::o1_initMult() {  	animDataVar = _vm->_parse->parseVarIndex();  	if (_vm->_mult->_objects && (oldObjCount != _vm->_mult->_objCount)) { +  		warning("Initializing new objects without having "  				"cleaned up the old ones at first"); + +		for (int i = 0; i < _vm->_mult->_objCount; i++) { +			delete _vm->_mult->_objects[i].pPosX; +			delete _vm->_mult->_objects[i].pPosY; +		} +  		delete[] _vm->_mult->_objects;  		delete[] _vm->_mult->_renderData; +  		_vm->_mult->_objects = 0;  		_vm->_mult->_renderObjs = 0; +  	}  	if (_vm->_mult->_objects == 0) { @@ -933,8 +942,8 @@ void Inter_v1::o1_initMult() {  			uint32 offPosY = i * 4 + (posYVar / 4) * 4;  			uint32 offAnim = animDataVar + i * 4 * _vm->_global->_inter_animDataSize; -			_vm->_mult->_objects[i].pPosX = (int32 *) _variables->getAddressOff32(offPosX); -			_vm->_mult->_objects[i].pPosY = (int32 *) _variables->getAddressOff32(offPosY); +			_vm->_mult->_objects[i].pPosX = new VariableReference(*_vm->_inter->_variables, offPosX); +			_vm->_mult->_objects[i].pPosY = new VariableReference(*_vm->_inter->_variables, offPosY);  			_vm->_mult->_objects[i].pAnimData =  				(Mult::Mult_AnimData *) _variables->getAddressOff8(offAnim, @@ -1774,7 +1783,7 @@ bool Inter_v1::o1_goblinFunc(OpFuncParams ¶ms) {  	gobParams.extraData = 0;  	gobParams.objDesc = 0; -	gobParams.retVarPtr = (int32 *) VAR_ADDRESS(59); +	gobParams.retVarPtr.set(*_vm->_inter->_variables, 236);  	cmd = load16();  	_vm->_global->_inter_execPtr += 2; @@ -2268,49 +2277,49 @@ bool Inter_v1::o1_manageDataFile(OpFuncParams ¶ms) {  void Inter_v1::o1_setState(OpGobParams ¶ms) {  	params.objDesc->state = params.extraData;  	if (params.objDesc == _vm->_goblin->_actDestItemDesc) -		*_vm->_goblin->_destItemStateVarPtr = params.extraData; +		_vm->_goblin->_destItemStateVarPtr = (uint32) params.extraData;  }  void Inter_v1::o1_setCurFrame(OpGobParams ¶ms) {  	params.objDesc->curFrame = params.extraData;  	if (params.objDesc == _vm->_goblin->_actDestItemDesc) -		*_vm->_goblin->_destItemFrameVarPtr = params.extraData; +		_vm->_goblin->_destItemFrameVarPtr = (uint32) params.extraData;  }  void Inter_v1::o1_setNextState(OpGobParams ¶ms) {  	params.objDesc->nextState = params.extraData;  	if (params.objDesc == _vm->_goblin->_actDestItemDesc) -		*_vm->_goblin->_destItemNextStateVarPtr = params.extraData; +		_vm->_goblin->_destItemNextStateVarPtr = (uint32) params.extraData;  }  void Inter_v1::o1_setMultState(OpGobParams ¶ms) {  	params.objDesc->multState = params.extraData;  	if (params.objDesc == _vm->_goblin->_actDestItemDesc) -		*_vm->_goblin->_destItemMultStateVarPtr = params.extraData; +		_vm->_goblin->_destItemMultStateVarPtr = (uint32) params.extraData;  }  void Inter_v1::o1_setOrder(OpGobParams ¶ms) {  	params.objDesc->order = params.extraData;  	if (params.objDesc == _vm->_goblin->_actDestItemDesc) -		*_vm->_goblin->_destItemOrderVarPtr = params.extraData; +		_vm->_goblin->_destItemOrderVarPtr = (uint32) params.extraData;  }  void Inter_v1::o1_setActionStartState(OpGobParams ¶ms) {  	params.objDesc->actionStartState = params.extraData;  	if (params.objDesc == _vm->_goblin->_actDestItemDesc) -		*_vm->_goblin->_destItemActStartStVarPtr = params.extraData; +		_vm->_goblin->_destItemActStartStVarPtr = (uint32) params.extraData;  }  void Inter_v1::o1_setCurLookDir(OpGobParams ¶ms) {  	params.objDesc->curLookDir = params.extraData;  	if (params.objDesc == _vm->_goblin->_actDestItemDesc) -		*_vm->_goblin->_destItemLookDirVarPtr = params.extraData; +		_vm->_goblin->_destItemLookDirVarPtr = (uint32) params.extraData;  }  void Inter_v1::o1_setType(OpGobParams ¶ms) {  	params.objDesc->type = params.extraData;  	if (params.objDesc == _vm->_goblin->_actDestItemDesc) -		*_vm->_goblin->_destItemTypeVarPtr = params.extraData; +		_vm->_goblin->_destItemTypeVarPtr = (uint32) params.extraData;  	if (params.extraData == 0)  		params.objDesc->toRedraw = 1; @@ -2319,107 +2328,107 @@ void Inter_v1::o1_setType(OpGobParams ¶ms) {  void Inter_v1::o1_setNoTick(OpGobParams ¶ms) {  	params.objDesc->noTick = params.extraData;  	if (params.objDesc == _vm->_goblin->_actDestItemDesc) -		*_vm->_goblin->_destItemNoTickVarPtr = params.extraData; +		_vm->_goblin->_destItemNoTickVarPtr = (uint32) params.extraData;  }  void Inter_v1::o1_setPickable(OpGobParams ¶ms) {  	params.objDesc->pickable = params.extraData;  	if (params.objDesc == _vm->_goblin->_actDestItemDesc) -		*_vm->_goblin->_destItemPickableVarPtr = params.extraData; +		_vm->_goblin->_destItemPickableVarPtr = (uint32) params.extraData;  }  void Inter_v1::o1_setXPos(OpGobParams ¶ms) {  	params.objDesc->xPos = params.extraData;  	if (params.objDesc == _vm->_goblin->_actDestItemDesc) -		*_vm->_goblin->_destItemScrXVarPtr = params.extraData; +		_vm->_goblin->_destItemScrXVarPtr = (uint32) params.extraData;  }  void Inter_v1::o1_setYPos(OpGobParams ¶ms) {  	params.objDesc->yPos = params.extraData;  	if (params.objDesc == _vm->_goblin->_actDestItemDesc) -		*_vm->_goblin->_destItemScrYVarPtr = params.extraData; +		_vm->_goblin->_destItemScrYVarPtr = (uint32) params.extraData;  }  void Inter_v1::o1_setDoAnim(OpGobParams ¶ms) {  	params.objDesc->doAnim = params.extraData;  	if (params.objDesc == _vm->_goblin->_actDestItemDesc) -		*_vm->_goblin->_destItemDoAnimVarPtr = params.extraData; +		_vm->_goblin->_destItemDoAnimVarPtr = (uint32) params.extraData;  }  void Inter_v1::o1_setRelaxTime(OpGobParams ¶ms) {  	params.objDesc->relaxTime = params.extraData;  	if (params.objDesc == _vm->_goblin->_actDestItemDesc) -		*_vm->_goblin->_destItemRelaxVarPtr = params.extraData; +		_vm->_goblin->_destItemRelaxVarPtr = (uint32) params.extraData;  }  void Inter_v1::o1_setMaxTick(OpGobParams ¶ms) {  	params.objDesc->maxTick = params.extraData;  	if (params.objDesc == _vm->_goblin->_actDestItemDesc) -		*_vm->_goblin->_destItemMaxTickVarPtr = params.extraData; +		_vm->_goblin->_destItemMaxTickVarPtr = (uint32) params.extraData;  }  void Inter_v1::o1_getState(OpGobParams ¶ms) { -	*params.retVarPtr = params.objDesc->state; +	params.retVarPtr = (uint32) params.objDesc->state;  }  void Inter_v1::o1_getCurFrame(OpGobParams ¶ms) { -	*params.retVarPtr = params.objDesc->curFrame; +	params.retVarPtr = (uint32) params.objDesc->curFrame;  }  void Inter_v1::o1_getNextState(OpGobParams ¶ms) { -	*params.retVarPtr = params.objDesc->nextState; +	params.retVarPtr = (uint32) params.objDesc->nextState;  }  void Inter_v1::o1_getMultState(OpGobParams ¶ms) { -	*params.retVarPtr = params.objDesc->multState; +	params.retVarPtr = (uint32) params.objDesc->multState;  }  void Inter_v1::o1_getOrder(OpGobParams ¶ms) { -	*params.retVarPtr = params.objDesc->order; +	params.retVarPtr = (uint32) params.objDesc->order;  }  void Inter_v1::o1_getActionStartState(OpGobParams ¶ms) { -	*params.retVarPtr = params.objDesc->actionStartState; +	params.retVarPtr = (uint32) params.objDesc->actionStartState;  }  void Inter_v1::o1_getCurLookDir(OpGobParams ¶ms) { -	*params.retVarPtr = params.objDesc->curLookDir; +	params.retVarPtr = (uint32) params.objDesc->curLookDir;  }  void Inter_v1::o1_getType(OpGobParams ¶ms) { -	*params.retVarPtr = params.objDesc->type; +	params.retVarPtr = (uint32) params.objDesc->type;  }  void Inter_v1::o1_getNoTick(OpGobParams ¶ms) { -	*params.retVarPtr = params.objDesc->noTick; +	params.retVarPtr = (uint32) params.objDesc->noTick;  }  void Inter_v1::o1_getPickable(OpGobParams ¶ms) { -	*params.retVarPtr = params.objDesc->pickable; +	params.retVarPtr = (uint32) params.objDesc->pickable;  }  void Inter_v1::o1_getObjMaxFrame(OpGobParams ¶ms) { -	*params.retVarPtr = _vm->_goblin->getObjMaxFrame(params.objDesc); +	params.retVarPtr = (uint32) _vm->_goblin->getObjMaxFrame(params.objDesc);  }  void Inter_v1::o1_getXPos(OpGobParams ¶ms) { -	*params.retVarPtr = params.objDesc->xPos; +	params.retVarPtr = (uint32) params.objDesc->xPos;  }  void Inter_v1::o1_getYPos(OpGobParams ¶ms) { -	*params.retVarPtr = params.objDesc->yPos; +	params.retVarPtr = (uint32) params.objDesc->yPos;  }  void Inter_v1::o1_getDoAnim(OpGobParams ¶ms) { -	*params.retVarPtr = params.objDesc->doAnim; +	params.retVarPtr = (uint32) params.objDesc->doAnim;  }  void Inter_v1::o1_getRelaxTime(OpGobParams ¶ms) { -	*params.retVarPtr = params.objDesc->relaxTime; +	params.retVarPtr = (uint32) params.objDesc->relaxTime;  }  void Inter_v1::o1_getMaxTick(OpGobParams ¶ms) { -	*params.retVarPtr = params.objDesc->maxTick; +	params.retVarPtr = (uint32) params.objDesc->maxTick;  }  void Inter_v1::o1_manipulateMap(OpGobParams ¶ms) { @@ -2435,9 +2444,9 @@ void Inter_v1::o1_getItem(OpGobParams ¶ms) {  	int16 yPos = load16();  	if ((_vm->_map->_itemsMap[yPos][xPos] & 0xFF00) != 0) -		*params.retVarPtr = (_vm->_map->_itemsMap[yPos][xPos] & 0xFF00) >> 8; +		params.retVarPtr = (uint32) ((_vm->_map->_itemsMap[yPos][xPos] & 0xFF00) >> 8);  	else -		*params.retVarPtr = _vm->_map->_itemsMap[yPos][xPos]; +		params.retVarPtr = (uint32) _vm->_map->_itemsMap[yPos][xPos];  }  void Inter_v1::o1_manipulateMapIndirect(OpGobParams ¶ms) { @@ -2460,9 +2469,9 @@ void Inter_v1::o1_getItemIndirect(OpGobParams ¶ms) {  	yPos = VAR(yPos);  	if ((_vm->_map->_itemsMap[yPos][xPos] & 0xFF00) != 0) -		*params.retVarPtr = (_vm->_map->_itemsMap[yPos][xPos] & 0xFF00) >> 8; +		params.retVarPtr = (uint32) ((_vm->_map->_itemsMap[yPos][xPos] & 0xFF00) >> 8);  	else -		*params.retVarPtr = _vm->_map->_itemsMap[yPos][xPos]; +		params.retVarPtr = (uint32) _vm->_map->_itemsMap[yPos][xPos];  }  void Inter_v1::o1_setPassMap(OpGobParams ¶ms) { @@ -2500,11 +2509,11 @@ void Inter_v1::o1_setGoblinPosH(OpGobParams ¶ms) {  	params.objDesc->curFrame = 0;  	params.objDesc->state = 21;  	if (_vm->_goblin->_currentGoblin == item) { -		*_vm->_goblin->_curGobScrXVarPtr = params.objDesc->xPos; -		*_vm->_goblin->_curGobScrYVarPtr = params.objDesc->yPos; +		_vm->_goblin->_curGobScrXVarPtr = (uint32) params.objDesc->xPos; +		_vm->_goblin->_curGobScrYVarPtr = (uint32) params.objDesc->yPos; -		*_vm->_goblin->_curGobFrameVarPtr = 0; -		*_vm->_goblin->_curGobStateVarPtr = 18; +		_vm->_goblin->_curGobFrameVarPtr = 0; +		_vm->_goblin->_curGobStateVarPtr = 18;  		_vm->_goblin->_pressedMapX = _vm->_goblin->_gobPositions[item].x;  		_vm->_goblin->_pressedMapY = _vm->_goblin->_gobPositions[item].y;  	} @@ -2512,12 +2521,12 @@ void Inter_v1::o1_setGoblinPosH(OpGobParams ¶ms) {  void Inter_v1::o1_getGoblinPosXH(OpGobParams ¶ms) {  	int16 item = load16(); -	*params.retVarPtr = _vm->_goblin->_gobPositions[item].x >> 1; +	params.retVarPtr = (uint32) (_vm->_goblin->_gobPositions[item].x >> 1);  }  void Inter_v1::o1_getGoblinPosYH(OpGobParams ¶ms) {  	int16 item = load16(); -	*params.retVarPtr = _vm->_goblin->_gobPositions[item].y >> 1; +	params.retVarPtr = (uint32) (_vm->_goblin->_gobPositions[item].y >> 1);  }  void Inter_v1::o1_setGoblinMultState(OpGobParams ¶ms) { @@ -2539,14 +2548,14 @@ void Inter_v1::o1_setGoblinMultState(OpGobParams ¶ms) {  		params.objDesc->xPos = animLayer->posX;  		params.objDesc->yPos = animLayer->posY; -		*_vm->_goblin->_curGobScrXVarPtr = params.objDesc->xPos; -		*_vm->_goblin->_curGobScrYVarPtr = params.objDesc->yPos; -		*_vm->_goblin->_curGobFrameVarPtr = 0; -		*_vm->_goblin->_curGobStateVarPtr = params.objDesc->state; -		*_vm->_goblin->_curGobNextStateVarPtr = params.objDesc->nextState; -		*_vm->_goblin->_curGobMultStateVarPtr = params.objDesc->multState; -		*_vm->_goblin->_curGobMaxFrameVarPtr = -				_vm->_goblin->getObjMaxFrame(params.objDesc); +		_vm->_goblin->_curGobScrXVarPtr = (uint32) params.objDesc->xPos; +		_vm->_goblin->_curGobScrYVarPtr = (uint32) params.objDesc->yPos; +		_vm->_goblin->_curGobFrameVarPtr = 0; +		_vm->_goblin->_curGobStateVarPtr = (uint32) params.objDesc->state; +		_vm->_goblin->_curGobNextStateVarPtr = (uint32) params.objDesc->nextState; +		_vm->_goblin->_curGobMultStateVarPtr = (uint32) params.objDesc->multState; +		_vm->_goblin->_curGobMaxFrameVarPtr = +				(uint32) _vm->_goblin->getObjMaxFrame(params.objDesc);  		_vm->_goblin->_noPick = 1;  		return;  	} @@ -2573,12 +2582,12 @@ void Inter_v1::o1_setGoblinMultState(OpGobParams ¶ms) {  	_vm->_goblin->_pressedMapY = yPos;  	_vm->_map->_curGoblinY = yPos; -	*_vm->_goblin->_curGobScrXVarPtr = params.objDesc->xPos; -	*_vm->_goblin->_curGobScrYVarPtr = params.objDesc->yPos; -	*_vm->_goblin->_curGobFrameVarPtr = 0; -	*_vm->_goblin->_curGobStateVarPtr = 21; -	*_vm->_goblin->_curGobNextStateVarPtr = 21; -	*_vm->_goblin->_curGobMultStateVarPtr = -1; +	_vm->_goblin->_curGobScrXVarPtr = (uint32) params.objDesc->xPos; +	_vm->_goblin->_curGobScrYVarPtr = (uint32) params.objDesc->yPos; +	_vm->_goblin->_curGobFrameVarPtr = 0; +	_vm->_goblin->_curGobStateVarPtr = 21; +	_vm->_goblin->_curGobNextStateVarPtr = 21; +	_vm->_goblin->_curGobMultStateVarPtr = (uint32) -1;  	_vm->_goblin->_noPick = 0;  } @@ -2598,11 +2607,11 @@ void Inter_v1::o1_setItemIndInPocket(OpGobParams ¶ms) {  }  void Inter_v1::o1_getItemIdInPocket(OpGobParams ¶ms) { -	*params.retVarPtr = _vm->_goblin->_itemIdInPocket; +	params.retVarPtr = (uint32) _vm->_goblin->_itemIdInPocket;  }  void Inter_v1::o1_getItemIndInPocket(OpGobParams ¶ms) { -	*params.retVarPtr = _vm->_goblin->_itemIndInPocket; +	params.retVarPtr = (uint32) _vm->_goblin->_itemIndInPocket;  }  void Inter_v1::o1_setGoblinPos(OpGobParams ¶ms) { @@ -2632,10 +2641,10 @@ void Inter_v1::o1_setGoblinPos(OpGobParams ¶ms) {  	params.objDesc->state = 21;  	if (_vm->_goblin->_currentGoblin == item) { -		*_vm->_goblin->_curGobScrXVarPtr = params.objDesc->xPos; -		*_vm->_goblin->_curGobScrYVarPtr = params.objDesc->yPos; -		*_vm->_goblin->_curGobFrameVarPtr = 0; -		*_vm->_goblin->_curGobStateVarPtr = 18; +		_vm->_goblin->_curGobScrXVarPtr = (uint32) params.objDesc->xPos; +		_vm->_goblin->_curGobScrYVarPtr = (uint32) params.objDesc->yPos; +		_vm->_goblin->_curGobFrameVarPtr = 0; +		_vm->_goblin->_curGobStateVarPtr = 18;  		_vm->_goblin->_pressedMapX = _vm->_goblin->_gobPositions[item].x;  		_vm->_goblin->_pressedMapY = _vm->_goblin->_gobPositions[item].y; @@ -2659,11 +2668,11 @@ void Inter_v1::o1_setGoblinState(OpGobParams ¶ms) {  	params.objDesc->yPos = animLayer->posY;  	if (item == _vm->_goblin->_currentGoblin) { -		*_vm->_goblin->_curGobScrXVarPtr = params.objDesc->xPos; -		*_vm->_goblin->_curGobScrYVarPtr = params.objDesc->yPos; -		*_vm->_goblin->_curGobFrameVarPtr = 0; -		*_vm->_goblin->_curGobStateVarPtr = params.objDesc->state; -		*_vm->_goblin->_curGobMultStateVarPtr = params.objDesc->multState; +		_vm->_goblin->_curGobScrXVarPtr = (uint32) params.objDesc->xPos; +		_vm->_goblin->_curGobScrYVarPtr = (uint32) params.objDesc->yPos; +		_vm->_goblin->_curGobFrameVarPtr = 0; +		_vm->_goblin->_curGobStateVarPtr = (uint32) params.objDesc->state; +		_vm->_goblin->_curGobMultStateVarPtr = (uint32) params.objDesc->multState;  	}  } @@ -2686,13 +2695,13 @@ void Inter_v1::o1_setGoblinStateRedraw(OpGobParams ¶ms) {  	params.objDesc->toRedraw = 1;  	params.objDesc->type = 0;  	if (params.objDesc == _vm->_goblin->_actDestItemDesc) { -		*_vm->_goblin->_destItemScrXVarPtr = params.objDesc->xPos; -		*_vm->_goblin->_destItemScrYVarPtr = params.objDesc->yPos; +		_vm->_goblin->_destItemScrXVarPtr = (uint32) params.objDesc->xPos; +		_vm->_goblin->_destItemScrYVarPtr = (uint32) params.objDesc->yPos; -		*_vm->_goblin->_destItemStateVarPtr = params.objDesc->state; -		*_vm->_goblin->_destItemNextStateVarPtr = -1; -		*_vm->_goblin->_destItemMultStateVarPtr = -1; -		*_vm->_goblin->_destItemFrameVarPtr = 0; +		_vm->_goblin->_destItemStateVarPtr = (uint32) params.objDesc->state; +		_vm->_goblin->_destItemNextStateVarPtr = (uint32) -1; +		_vm->_goblin->_destItemMultStateVarPtr = (uint32) -1; +		_vm->_goblin->_destItemFrameVarPtr = 0;  	}  } @@ -2712,12 +2721,12 @@ void Inter_v1::o1_decRelaxTime(OpGobParams ¶ms) {  void Inter_v1::o1_getGoblinPosX(OpGobParams ¶ms) {  	int16 item = load16(); -	*params.retVarPtr = _vm->_goblin->_gobPositions[item].x; +	params.retVarPtr = (uint32) _vm->_goblin->_gobPositions[item].x;  }  void Inter_v1::o1_getGoblinPosY(OpGobParams ¶ms) {  	int16 item = load16(); -	*params.retVarPtr = _vm->_goblin->_gobPositions[item].y; +	params.retVarPtr = (uint32) _vm->_goblin->_gobPositions[item].y;  }  void Inter_v1::o1_clearPathExistence(OpGobParams ¶ms) { @@ -2741,9 +2750,9 @@ void Inter_v1::o1_getObjectIntersect(OpGobParams ¶ms) {  	params.objDesc = _vm->_goblin->_objects[params.extraData];  	if (_vm->_goblin->objIntersected(params.objDesc,  				_vm->_goblin->_goblins[item])) -		*params.retVarPtr = 1; +		params.retVarPtr = 1;  	else -		*params.retVarPtr = 0; +		params.retVarPtr = 0;  }  void Inter_v1::o1_getGoblinIntersect(OpGobParams ¶ms) { @@ -2753,9 +2762,9 @@ void Inter_v1::o1_getGoblinIntersect(OpGobParams ¶ms) {  	params.objDesc = _vm->_goblin->_goblins[params.extraData];  	if (_vm->_goblin->objIntersected(params.objDesc,  				_vm->_goblin->_goblins[item])) -		*params.retVarPtr = 1; +		params.retVarPtr = 1;  	else -		*params.retVarPtr = 0; +		params.retVarPtr = 0;  }  void Inter_v1::o1_setItemPos(OpGobParams ¶ms) { @@ -2886,7 +2895,7 @@ void Inter_v1::o1_initGoblin(OpGobParams ¶ms) {  		_vm->_map->_destY = _vm->_goblin->_gobPositions[0].y;  		_vm->_goblin->_gobDestY = _vm->_goblin->_gobPositions[0].y; -		*_vm->_goblin->_curGobVarPtr = 0; +		_vm->_goblin->_curGobVarPtr = 0;  		_vm->_goblin->_pathExistence = 0;  		_vm->_goblin->_readyToAct = 0;  	} diff --git a/engines/gob/inter_v2.cpp b/engines/gob/inter_v2.cpp index d8c33fcce6..2f1d2ec0be 100644 --- a/engines/gob/inter_v2.cpp +++ b/engines/gob/inter_v2.cpp @@ -880,9 +880,15 @@ void Inter_v2::o2_initMult() {  		_vm->_mult->clearObjectVideos(); +		for (int i = 0; i < _vm->_mult->_objCount; i++) { +			delete _vm->_mult->_objects[i].pPosX; +			delete _vm->_mult->_objects[i].pPosY; +		} +  		delete[] _vm->_mult->_objects;  		delete[] _vm->_mult->_renderObjs;  		delete[] _vm->_mult->_orderArray; +  		_vm->_mult->_objects = 0;  		_vm->_mult->_renderObjs = 0;  		_vm->_mult->_orderArray = 0; @@ -907,8 +913,8 @@ void Inter_v2::o2_initMult() {  			uint32 offPosY = i * 4 + (posYVar / 4) * 4;  			uint32 offAnim = animDataVar + i * 4 * _vm->_global->_inter_animDataSize; -			_vm->_mult->_objects[i].pPosX = (int32 *) _variables->getAddressOff32(offPosX); -			_vm->_mult->_objects[i].pPosY = (int32 *) _variables->getAddressOff32(offPosY); +			_vm->_mult->_objects[i].pPosX = new VariableReference(*_vm->_inter->_variables, offPosX); +			_vm->_mult->_objects[i].pPosY = new VariableReference(*_vm->_inter->_variables, offPosY);  			_vm->_mult->_objects[i].pAnimData =  				(Mult::Mult_AnimData *) _variables->getAddressOff8(offAnim, @@ -1046,7 +1052,7 @@ void Inter_v2::o2_loadMultObject() {  	} else if ((objAnim.animType != 100) && (objAnim.animType != 101)) { -		if ((*(obj.pPosX) == -1234) && (*(obj.pPosY) == -4321)) { +		if ((((int32) *(obj.pPosX)) == -1234) && (((int32) *(obj.pPosY)) == -4321)) {  			if (obj.videoSlot > 0)  				_vm->_vidPlayer->slotClose(obj.videoSlot - 1); diff --git a/engines/gob/mult.cpp b/engines/gob/mult.cpp index 3d6a7942f9..b9373d48b3 100644 --- a/engines/gob/mult.cpp +++ b/engines/gob/mult.cpp @@ -93,12 +93,18 @@ Mult::Mult(GobEngine *vm) : _vm(vm) {  }  Mult::~Mult() { +	if (_objects) +		for (int i = 0; i < _objCount; i++) { +			delete _objects[i].pPosX; +			delete _objects[i].pPosY; +		} +  	delete[] _objects;  	delete[] _orderArray;  	delete[] _renderData;  	delete[] _renderObjs; -	delete[] _animArrayX; -	delete[] _animArrayY; +	delete _animArrayX; +	delete _animArrayY;  	delete[] _animArrayData;  	delete _multData;  } @@ -123,6 +129,12 @@ void Mult::freeAll(void) {  void Mult::freeMult() {  	clearObjectVideos(); +	if (_objects) +		for (int i = 0; i < _objCount; i++) { +			delete _objects[i].pPosX; +			delete _objects[i].pPosY; +		} +  	delete[] _objects;  	delete[] _renderData;  	delete[] _renderObjs; @@ -203,11 +215,17 @@ void Mult::playMult(int16 startFrame, int16 endFrame, char checkEscape,  		if (_animDataAllocated) {  			clearObjectVideos(); +			if (_objects) +				for (int i = 0; i < _objCount; i++) { +					delete _objects[i].pPosX; +					delete _objects[i].pPosY; +				} +  			delete[] _objects;  			delete[] _renderData;  			delete[] _renderObjs; -			delete[] _animArrayX; -			delete[] _animArrayY; +			delete _animArrayX; +			delete _animArrayY;  			delete[] _animArrayData;  			delete[] _orderArray; diff --git a/engines/gob/mult.h b/engines/gob/mult.h index aaf2e2826c..3bb3af17b3 100644 --- a/engines/gob/mult.h +++ b/engines/gob/mult.h @@ -27,6 +27,7 @@  #define GOB_MULT_H  #include "gob/video.h" +#include "gob/variables.h"  namespace Gob { @@ -77,8 +78,8 @@ public:  	} PACKED_STRUCT;  	struct Mult_Object { -		int32 *pPosX; -		int32 *pPosY; +		VariableReference *pPosX; +		VariableReference *pPosY;  		Mult_AnimData *pAnimData;  		int16 tick;  		int16 lastLeft; @@ -267,8 +268,8 @@ protected:  	bool _doPalSubst; -	int32 *_animArrayX; -	int32 *_animArrayY; +	Variables *_animArrayX; +	Variables *_animArrayY;  	Mult_AnimData *_animArrayData;  	int16 _palKeyIndex; diff --git a/engines/gob/mult_v1.cpp b/engines/gob/mult_v1.cpp index 22683437e7..a369e7d297 100644 --- a/engines/gob/mult_v1.cpp +++ b/engines/gob/mult_v1.cpp @@ -216,10 +216,16 @@ void Mult_v1::freeMultKeys() {  	if (_animDataAllocated) {  		clearObjectVideos(); +		if (_objects) +			for (int i = 0; i < _objCount; i++) { +				delete _objects[i].pPosX; +				delete _objects[i].pPosY; +			} +  		delete[] _objects;  		delete[] _renderData; -		delete[] _animArrayX; -		delete[] _animArrayY; +		delete _animArrayX; +		delete _animArrayY;  		delete[] _animArrayData;  		_objects = 0; @@ -263,6 +269,14 @@ void Mult_v1::playMultInit() {  	_oldPalette = _vm->_global->_pPaletteDesc->vgaPal;  	if (!_animSurf) { +		if (_objects) +			for (int i = 0; i < _objCount; i++) { +				delete _objects[i].pPosX; +				delete _objects[i].pPosY; +			} + +		delete[] _objects; +  		_vm->_util->setFrameRate(_multData->frameRate);  		_animTop = 0;  		_animLeft = 0; @@ -270,30 +284,27 @@ void Mult_v1::playMultInit() {  		_animHeight = 200;  		_objCount = 4; -		delete[] _objects;  		delete[] _renderData; -		delete[] _animArrayX; -		delete[] _animArrayY; +		delete _animArrayX; +		delete _animArrayY;  		delete[] _animArrayData;  		_objects = new Mult_Object[_objCount];  		_renderData = new int16[9 * _objCount]; -		_animArrayX = new int32[_objCount]; -		_animArrayY = new int32[_objCount]; +		_animArrayX = new VariablesLE(_objCount * 4); +		_animArrayY = new VariablesLE(_objCount * 4);  		_animArrayData = new Mult_AnimData[_objCount];  		memset(_objects, 0, _objCount * sizeof(Mult_Object));  		memset(_renderData, 0, _objCount * 9 * sizeof(int16)); -		memset(_animArrayX, 0, _objCount * sizeof(int32)); -		memset(_animArrayY, 0, _objCount * sizeof(int32));  		memset(_animArrayData, 0, _objCount * sizeof(Mult_AnimData));  		for (_counter = 0; _counter < _objCount; _counter++) {  			Mult_Object &multObj = _objects[_counter];  			Mult_AnimData &animData = _animArrayData[_counter]; -			multObj.pPosX = (int32 *) &_animArrayX[_counter]; -			multObj.pPosY = (int32 *) &_animArrayY[_counter]; +			multObj.pPosX = new VariableReference(*_animArrayX, _counter * 4); +			multObj.pPosY = new VariableReference(*_animArrayY, _counter * 4);  			multObj.pAnimData = &animData;  			animData.isStatic = 1; diff --git a/engines/gob/mult_v2.cpp b/engines/gob/mult_v2.cpp index 3a83ac1867..20a81174e5 100644 --- a/engines/gob/mult_v2.cpp +++ b/engines/gob/mult_v2.cpp @@ -329,8 +329,8 @@ void Mult_v2::freeMultKeys() {  	if (_animDataAllocated) {  		freeMult(); -		delete[] _animArrayX; -		delete[] _animArrayY; +		delete _animArrayX; +		delete _animArrayY;  		delete[] _animArrayData;  		_animArrayX = 0; @@ -510,6 +510,13 @@ void Mult_v2::playMultInit() {  	if (!_animSurf) {  		int16 width, height; +		for (int i = 0; i < _objCount; i++) { +			delete _objects[i].pPosX; +			delete _objects[i].pPosY; +		} + +		delete[] _objects; +	  		_vm->_util->setFrameRate(_multData->frameRate);  		_animTop = 0;  		_animLeft = 0; @@ -517,33 +524,30 @@ void Mult_v2::playMultInit() {  		_animHeight = _vm->_video->_surfHeight;  		_objCount = 4; -		delete[] _objects;  		delete[] _orderArray;  		delete[] _renderObjs; -		delete[] _animArrayX; -		delete[] _animArrayY; +		delete _animArrayX; +		delete _animArrayY;  		delete[] _animArrayData;  		_objects = new Mult_Object[_objCount];  		_orderArray = new int8[_objCount];  		_renderObjs = new Mult_Object*[_objCount]; -		_animArrayX = new int32[_objCount]; -		_animArrayY = new int32[_objCount]; +		_animArrayX = new VariablesLE(_objCount * 4); +		_animArrayY = new VariablesLE(_objCount * 4);  		_animArrayData = new Mult_AnimData[_objCount];  		memset(_objects, 0, _objCount * sizeof(Mult_Object));  		memset(_orderArray, 0, _objCount * sizeof(int8));  		memset(_renderObjs, 0, _objCount * sizeof(Mult_Object *)); -		memset(_animArrayX, 0, _objCount * sizeof(int32)); -		memset(_animArrayY, 0, _objCount * sizeof(int32));  		memset(_animArrayData, 0, _objCount * sizeof(Mult_AnimData));  		for (_counter = 0; _counter < _objCount; _counter++) {  			Mult_Object &multObj = _objects[_counter];  			Mult_AnimData &animData = _animArrayData[_counter]; -			multObj.pPosX = (int32 *) &_animArrayX[_counter]; -			multObj.pPosY = (int32 *) &_animArrayY[_counter]; +			multObj.pPosX = new VariableReference(*_animArrayX, _counter * 4); +			multObj.pPosY = new VariableReference(*_animArrayY, _counter * 4);  			multObj.pAnimData = &animData;  			animData.isStatic = 1; diff --git a/engines/gob/saveload.cpp b/engines/gob/saveload.cpp index 2788716858..fa9f8ea7a9 100644 --- a/engines/gob/saveload.cpp +++ b/engines/gob/saveload.cpp @@ -153,7 +153,7 @@ bool TempSprite::fromBuffer(const byte *buffer, int32 size, bool palette) {  } -PlainSave::PlainSave() { +PlainSave::PlainSave(Endianness endianness) : _endianness(endianness) {  }  PlainSave::~PlainSave() { @@ -230,7 +230,8 @@ bool PlainSave::save(int16 dataVar, int32 size, int32 offset, const char *name,  	}  	bool retVal; -	retVal = SaveLoad::saveDataEndian(*out, dataVar, size, variables, variableSizes); +	retVal = SaveLoad::saveDataEndian(*out, dataVar, size, +			variables, variableSizes, _endianness);  	out->finalize();  	if (out->ioFailed()) { @@ -258,13 +259,14 @@ bool PlainSave::load(int16 dataVar, int32 size, int32 offset, const char *name,  		return false;  	} -	bool retVal = SaveLoad::loadDataEndian(*in, dataVar, size, variables, variableSizes); +	bool retVal = SaveLoad::loadDataEndian(*in, dataVar, size, +			variables, variableSizes, _endianness);  	delete in;  	return retVal;  } -StagedSave::StagedSave() { +StagedSave::StagedSave(Endianness endianness) : _endianness(endianness) {  	_mode = kModeNone;  	_name = 0;  	_loaded = false; @@ -487,7 +489,7 @@ bool StagedSave::write() const {  		} else  			result = SaveLoad::saveDataEndian(*out, 0, _stages[i].size, -					_stages[i].bufVar, _stages[i].bufVarSizes); +					_stages[i].bufVar, _stages[i].bufVarSizes, _endianness);  	}  	if (result) { @@ -533,7 +535,7 @@ bool StagedSave::read() {  			_stages[i].bufVarSizes = new byte[_stages[i].size];  			result = SaveLoad::loadDataEndian(*in, 0, _stages[i].size, -					_stages[i].bufVar, _stages[i].bufVarSizes); +					_stages[i].bufVar, _stages[i].bufVarSizes, _endianness);  		}  	} @@ -734,12 +736,14 @@ void SaveLoad::buildIndex(byte *buffer, char *name, int n, int32 size, int32 off  	}  } -bool SaveLoad::fromEndian(byte *buf, const byte *sizes, uint32 count) { +bool SaveLoad::fromEndian(byte *buf, const byte *sizes, uint32 count, Endianness endianness) { +	bool LE = (endianness == kEndiannessLE); +  	while (count-- > 0) {  		if (*sizes == 3) -			*((uint32 *) buf) = READ_LE_UINT32(buf); +			*((uint32 *) buf) = LE ? READ_LE_UINT32(buf) : READ_BE_UINT32(buf);  		else if (*sizes == 1) -			*((uint16 *) buf) = READ_LE_UINT16(buf); +			*((uint16 *) buf) = LE ? READ_LE_UINT16(buf) : READ_BE_UINT16(buf);  		else if (*sizes != 0) {  			warning("SaveLoad::fromEndian(): Corrupted variables sizes");  			return false; @@ -753,12 +757,19 @@ bool SaveLoad::fromEndian(byte *buf, const byte *sizes, uint32 count) {  	return true;  } -bool SaveLoad::toEndian(byte *buf, const byte *sizes, uint32 count) { +bool SaveLoad::toEndian(byte *buf, const byte *sizes, uint32 count, Endianness endianness) {  	while (count-- > 0) { -		if (*sizes == 3) -			WRITE_LE_UINT32(buf, *((uint32 *) buf)); -		else if (*sizes == 1) -			WRITE_LE_UINT16(buf, *((uint16 *) buf)); +		if (*sizes == 3) { +			if (endianness == kEndiannessLE) +				WRITE_LE_UINT32(buf, *((uint32 *) buf)); +			else +				WRITE_BE_UINT32(buf, *((uint32 *) buf)); +		} else if (*sizes == 1) { +			if (endianness == kEndiannessLE) +				WRITE_LE_UINT16(buf, *((uint16 *) buf)); +			else +				WRITE_BE_UINT16(buf, *((uint16 *) buf)); +		}  		else if (*sizes != 0) {  			warning("SaveLoad::toEndian(): Corrupted variables sizes");  			return false; @@ -811,7 +822,8 @@ uint32 SaveLoad::write(Common::WriteStream &out,  }  bool SaveLoad::loadDataEndian(Common::ReadStream &in, -		int16 dataVar, uint32 size, byte *variables, byte *variableSizes) { +		int16 dataVar, uint32 size, +		byte *variables, byte *variableSizes, Endianness endianness) {  	bool retVal = false; @@ -821,7 +833,7 @@ bool SaveLoad::loadDataEndian(Common::ReadStream &in,  	assert(varBuf && sizeBuf);  	if (read(in, varBuf, sizeBuf, size) == size) { -		if (fromEndian(varBuf, sizeBuf, size)) { +		if (fromEndian(varBuf, sizeBuf, size, endianness)) {  			memcpy(variables + dataVar, varBuf, size);  			memcpy(variableSizes + dataVar, sizeBuf, size);  			retVal = true; @@ -835,7 +847,8 @@ bool SaveLoad::loadDataEndian(Common::ReadStream &in,  }  bool SaveLoad::saveDataEndian(Common::WriteStream &out, -		int16 dataVar, uint32 size, const byte *variables, const byte *variableSizes) { +		int16 dataVar, uint32 size, +		const byte *variables, const byte *variableSizes, Endianness endianness) {  	bool retVal = false; @@ -847,7 +860,7 @@ bool SaveLoad::saveDataEndian(Common::WriteStream &out,  	memcpy(varBuf, variables + dataVar, size);  	memcpy(sizeBuf, variableSizes + dataVar, size); -	if (toEndian(varBuf, sizeBuf, size)) +	if (toEndian(varBuf, sizeBuf, size, endianness))  		if (write(out, varBuf, sizeBuf, size) == size)  			retVal = true; diff --git a/engines/gob/saveload.h b/engines/gob/saveload.h index 29f7ee2594..52c3a9b260 100644 --- a/engines/gob/saveload.h +++ b/engines/gob/saveload.h @@ -65,7 +65,7 @@ private:  class PlainSave {  public: -	PlainSave(); +	PlainSave(Endianness endianness);  	~PlainSave();  	bool save(int16 dataVar, int32 size, int32 offset, const char *name, @@ -77,11 +77,14 @@ public:  			const byte *variables, const byte *variableSizes) const;  	bool load(int16 dataVar, int32 size, int32 offset, const char *name,  			byte *variables, byte *variableSizes) const; + +private: +	Endianness _endianness;  };  class StagedSave {  public: -	StagedSave(); +	StagedSave(Endianness endianness);  	~StagedSave();  	void addStage(int32 size, bool endianed = true); @@ -114,6 +117,8 @@ private:  		kModeLoad  	}; +	Endianness _endianness; +  	Common::Array<Stage> _stages;  	enum Mode _mode;  	char *_name; @@ -178,17 +183,19 @@ public:  	static const char *stripPath(const char *fileName); -	static bool fromEndian(byte *buf, const byte *sizes, uint32 count); -	static bool toEndian(byte *buf, const byte *sizes, uint32 count); +	static bool fromEndian(byte *buf, const byte *sizes, uint32 count, Endianness endianness); +	static bool toEndian(byte *buf, const byte *sizes, uint32 count, Endianness endianness);  	static uint32 read(Common::ReadStream &in,  			byte *buf, byte *sizes, uint32 count);  	static uint32 write(Common::WriteStream &out,  			const byte *buf, const byte *sizes, uint32 count);  	static bool loadDataEndian(Common::ReadStream &in, -			int16 dataVar, uint32 size, byte *variables, byte *variableSizes); +			int16 dataVar, uint32 size, +			byte *variables, byte *variableSizes, Endianness endianness);  	static bool saveDataEndian(Common::WriteStream &out, -			int16 dataVar, uint32 size, const byte *variables, const byte *variableSizes); +			int16 dataVar, uint32 size, +			const byte *variables, const byte *variableSizes, Endianness endianness);  protected:  	GobEngine *_vm; @@ -228,8 +235,8 @@ protected:  	int32 _varSize;  	TempSprite _tmpSprite; -	PlainSave _notes; -	StagedSave _save; +	PlainSave *_notes; +	StagedSave *_save;  	byte _indexBuffer[600];  	bool _hasIndex; @@ -306,8 +313,8 @@ protected:  	TempSprite _screenshot;  	TempSprite _tmpSprite; -	PlainSave _notes; -	StagedSave _save; +	PlainSave *_notes; +	StagedSave *_save;  	byte _propBuffer[1000];  	byte _indexBuffer[1200]; @@ -370,7 +377,7 @@ protected:  	int32 _varSize; -	StagedSave _save; +	StagedSave *_save;  	byte _propBuffer[1000];  	byte _indexBuffer[1200]; diff --git a/engines/gob/saveload_v2.cpp b/engines/gob/saveload_v2.cpp index a92fe8cf01..fc11950368 100644 --- a/engines/gob/saveload_v2.cpp +++ b/engines/gob/saveload_v2.cpp @@ -45,6 +45,9 @@ SaveLoad_v2::SaveFile SaveLoad_v2::_saveFiles[] = {  SaveLoad_v2::SaveLoad_v2(GobEngine *vm, const char *targetName) :  		SaveLoad(vm, targetName) { +	_notes = new PlainSave(_vm->getEndianness()); +	_save = new StagedSave(_vm->getEndianness()); +  	_saveFiles[0].destName = new char[strlen(targetName) + 5];  	_saveFiles[1].destName = _saveFiles[0].destName;  	_saveFiles[2].destName = 0; @@ -58,6 +61,9 @@ SaveLoad_v2::SaveLoad_v2(GobEngine *vm, const char *targetName) :  }  SaveLoad_v2::~SaveLoad_v2() { +	delete _notes; +	delete _save; +  	delete[] _saveFiles[0].destName;  	delete[] _saveFiles[3].destName;  } @@ -227,7 +233,7 @@ bool SaveLoad_v2::loadGame(SaveFile &saveFile,  			return false;  		} -		if (!_save.load(dataVar, size, 40, saveFile.destName, _vm->_inter->_variables)) +		if (!_save->load(dataVar, size, 40, saveFile.destName, _vm->_inter->_variables))  			return false;  	} @@ -268,7 +274,7 @@ bool SaveLoad_v2::loadNotes(SaveFile &saveFile,  	debugC(2, kDebugSaveLoad, "Loading the notes"); -	return _notes.load(dataVar, size, offset, saveFile.destName, _vm->_inter->_variables); +	return _notes->load(dataVar, size, offset, saveFile.destName, _vm->_inter->_variables);  }  bool SaveLoad_v2::saveGame(SaveFile &saveFile, @@ -313,10 +319,10 @@ bool SaveLoad_v2::saveGame(SaveFile &saveFile,  		byte sizes[40];  		memset(sizes, 0, 40); -		if(!_save.save(0, 40, 0, saveFile.destName, _indexBuffer + (slot * 40), sizes)) +		if(!_save->save(0, 40, 0, saveFile.destName, _indexBuffer + (slot * 40), sizes))  			return false; -		if (!_save.save(dataVar, size, 40, saveFile.destName, _vm->_inter->_variables)) +		if (!_save->save(dataVar, size, 40, saveFile.destName, _vm->_inter->_variables))  			return false;  	} @@ -350,7 +356,7 @@ bool SaveLoad_v2::saveNotes(SaveFile &saveFile,  	debugC(2, kDebugSaveLoad, "Saving the notes"); -	return _notes.save(dataVar, size, offset, saveFile.destName, _vm->_inter->_variables); +	return _notes->save(dataVar, size, offset, saveFile.destName, _vm->_inter->_variables);  	return false;  } @@ -360,8 +366,8 @@ void SaveLoad_v2::assertInited() {  	_varSize = READ_LE_UINT32(_vm->_game->_totFileData + 0x2C) * 4; -	_save.addStage(40); -	_save.addStage(_varSize); +	_save->addStage(40); +	_save->addStage(_varSize);  }  } // End of namespace Gob diff --git a/engines/gob/saveload_v3.cpp b/engines/gob/saveload_v3.cpp index 67879db3d1..dab5fd9385 100644 --- a/engines/gob/saveload_v3.cpp +++ b/engines/gob/saveload_v3.cpp @@ -48,6 +48,9 @@ SaveLoad_v3::SaveLoad_v3(GobEngine *vm, const char *targetName,  		uint32 screenshotSize, int32 indexOffset, int32 screenshotOffset) :  	SaveLoad(vm, targetName) { +	_notes = new PlainSave(_vm->getEndianness()); +	_save = new StagedSave(_vm->getEndianness()); +  	_screenshotSize = screenshotSize;  	_indexOffset = indexOffset;  	_screenshotOffset = screenshotOffset; @@ -71,6 +74,9 @@ SaveLoad_v3::SaveLoad_v3(GobEngine *vm, const char *targetName,  }  SaveLoad_v3::~SaveLoad_v3() { +	delete _notes; +	delete _save; +  	delete[] _saveFiles[0].destName;  	delete[] _saveFiles[3].destName;  } @@ -243,7 +249,7 @@ int32 SaveLoad_v3::getSizeNotes(SaveFile &saveFile) {  int32 SaveLoad_v3::getSizeScreenshot(SaveFile &saveFile) {  	if (!_useScreenshots) {  		_useScreenshots = true; -		_save.addStage(_screenshotSize, false); +		_save->addStage(_screenshotSize, false);  	}  	Common::SaveFileManager *saveMan = g_system->getSavefileManager(); @@ -312,7 +318,7 @@ bool SaveLoad_v3::loadGame(SaveFile &saveFile,  			return false;  		} -		if (!_save.load(dataVar, size, 540, saveFile.destName, _vm->_inter->_variables)) +		if (!_save->load(dataVar, size, 540, saveFile.destName, _vm->_inter->_variables))  			return false;  	} @@ -353,7 +359,7 @@ bool SaveLoad_v3::loadNotes(SaveFile &saveFile,  	debugC(2, kDebugSaveLoad, "Loading the notes"); -	return _notes.load(dataVar, size, offset, saveFile.destName, _vm->_inter->_variables); +	return _notes->load(dataVar, size, offset, saveFile.destName, _vm->_inter->_variables);  }  bool SaveLoad_v3::loadScreenshot(SaveFile &saveFile, @@ -363,7 +369,7 @@ bool SaveLoad_v3::loadScreenshot(SaveFile &saveFile,  	if (!_useScreenshots) {  		_useScreenshots = true; -		_save.addStage(_screenshotSize, false); +		_save->addStage(_screenshotSize, false);  	}  	if (offset == _indexOffset) { @@ -395,7 +401,7 @@ bool SaveLoad_v3::loadScreenshot(SaveFile &saveFile,  		byte *buffer = new byte[_screenshotSize]; -		if (!_save.load(0, _screenshotSize, _varSize + 540, saveFile.destName, buffer, 0)) { +		if (!_save->load(0, _screenshotSize, _varSize + 540, saveFile.destName, buffer, 0)) {  			delete[] buffer;  			return false;  		} @@ -483,13 +489,13 @@ bool SaveLoad_v3::saveGame(SaveFile &saveFile,  		_hasIndex = false; -		if(!_save.save(0, 500, 0, saveFile.destName, _propBuffer, _propBuffer + 500)) +		if(!_save->save(0, 500, 0, saveFile.destName, _propBuffer, _propBuffer + 500))  			return false; -		if(!_save.save(0, 40, 500, saveFile.destName, _indexBuffer + (saveFile.slot * 40), 0)) +		if(!_save->save(0, 40, 500, saveFile.destName, _indexBuffer + (saveFile.slot * 40), 0))  			return false; -		if (!_save.save(dataVar, size, 540, saveFile.destName, _vm->_inter->_variables)) +		if (!_save->save(dataVar, size, 540, saveFile.destName, _vm->_inter->_variables))  			return false;  	} @@ -523,7 +529,7 @@ bool SaveLoad_v3::saveNotes(SaveFile &saveFile,  	debugC(2, kDebugSaveLoad, "Saving the notes"); -	return _notes.save(dataVar, size - 160, offset, saveFile.destName, _vm->_inter->_variables); +	return _notes->save(dataVar, size - 160, offset, saveFile.destName, _vm->_inter->_variables);  	return false;  } @@ -534,7 +540,7 @@ bool SaveLoad_v3::saveScreenshot(SaveFile &saveFile,  	if (!_useScreenshots) {  		_useScreenshots = true; -		_save.addStage(_screenshotSize, false); +		_save->addStage(_screenshotSize, false);  	}  	if (offset >= _screenshotOffset) { @@ -571,7 +577,7 @@ bool SaveLoad_v3::saveScreenshot(SaveFile &saveFile,  			return false;  		} -		if (!_save.save(0, _screenshotSize, _varSize + 540, saveFile.destName, buffer, 0)) { +		if (!_save->save(0, _screenshotSize, _varSize + 540, saveFile.destName, buffer, 0)) {  			delete[] buffer;  			return false;  		} @@ -588,9 +594,9 @@ void SaveLoad_v3::assertInited() {  	_varSize = READ_LE_UINT32(_vm->_game->_totFileData + 0x2C) * 4; -	_save.addStage(500); -	_save.addStage(40, false); -	_save.addStage(_varSize); +	_save->addStage(500); +	_save->addStage(40, false); +	_save->addStage(_varSize);  }  void SaveLoad_v3::buildScreenshotIndex(byte *buffer, char *name, int n) { diff --git a/engines/gob/saveload_v4.cpp b/engines/gob/saveload_v4.cpp index a6548dd82d..0bd3dc03e6 100644 --- a/engines/gob/saveload_v4.cpp +++ b/engines/gob/saveload_v4.cpp @@ -50,6 +50,8 @@ SaveLoad_v4::SaveFile SaveLoad_v4::_saveFiles[] = {  SaveLoad_v4::SaveLoad_v4(GobEngine *vm, const char *targetName) :  	SaveLoad(vm, targetName) { +	_save = new StagedSave(_vm->getEndianness()); +  	_firstSizeGame = true;  	_saveFiles[0].destName = 0; @@ -76,6 +78,8 @@ SaveLoad_v4::SaveLoad_v4(GobEngine *vm, const char *targetName) :  }  SaveLoad_v4::~SaveLoad_v4() { +	delete _save; +  	delete[] _screenProps;  	delete[] _saveFiles[1].destName;  } @@ -297,7 +301,7 @@ bool SaveLoad_v4::loadGame(SaveFile &saveFile,  			return false;  		} -		if (!_save.load(dataVar, size, 540, saveFile.destName, _vm->_inter->_variables)) +		if (!_save->load(dataVar, size, 540, saveFile.destName, _vm->_inter->_variables))  			return false;  	} @@ -314,7 +318,7 @@ bool SaveLoad_v4::loadGameScreenProps(SaveFile &saveFile,  	setCurrentSlot(saveFile.destName, saveFile.sourceName[4] - '0'); -	if (!_save.load(0, 256000, _varSize + 540, saveFile.destName, +	if (!_save->load(0, 256000, _varSize + 540, saveFile.destName,  	                _screenProps, _screenProps + 256000))  		return false; @@ -393,13 +397,13 @@ bool SaveLoad_v4::saveGame(SaveFile &saveFile,  		_hasIndex = false; -		if(!_save.save(0, 500, 0, saveFile.destName, _propBuffer, _propBuffer + 500)) +		if(!_save->save(0, 500, 0, saveFile.destName, _propBuffer, _propBuffer + 500))  			return false; -		if(!_save.save(0, 40, 500, saveFile.destName, _indexBuffer + (slot * 40), 0)) +		if(!_save->save(0, 40, 500, saveFile.destName, _indexBuffer + (slot * 40), 0))  			return false; -		if (!_save.save(dataVar, size, 540, saveFile.destName, _vm->_inter->_variables)) +		if (!_save->save(dataVar, size, 540, saveFile.destName, _vm->_inter->_variables))  			return false;  	} @@ -417,7 +421,7 @@ bool SaveLoad_v4::saveGameScreenProps(SaveFile &saveFile,  	setCurrentSlot(saveFile.destName, saveFile.sourceName[4] - '0'); -	if (!_save.save(0, 256000, _varSize + 540, saveFile.destName, +	if (!_save->save(0, 256000, _varSize + 540, saveFile.destName,  	                _screenProps, _screenProps + 256000))  		return false; @@ -430,10 +434,10 @@ void SaveLoad_v4::assertInited() {  	_varSize = READ_LE_UINT32(_vm->_game->_totFileData + 0x2C) * 4; -	_save.addStage(500); -	_save.addStage(40, false); -	_save.addStage(_varSize); -	_save.addStage(256000); +	_save->addStage(500); +	_save->addStage(40, false); +	_save->addStage(_varSize); +	_save->addStage(256000);  }  } // End of namespace Gob diff --git a/engines/gob/scenery.cpp b/engines/gob/scenery.cpp index 6b52cdbbd6..33e540ace4 100644 --- a/engines/gob/scenery.cpp +++ b/engines/gob/scenery.cpp @@ -595,7 +595,7 @@ void Scenery::updateAnim(int16 layer, int16 frame, int16 animation, int16 flags,  	int16 destX;  	int16 destY; -	if (animation < 0) { +	if ((_vm->getGameType() == kGameTypeWoodruff) && (animation < 0)) {  		// Object video  		if (flags & 1) { // Do capture @@ -736,6 +736,8 @@ void Scenery::updateAnim(int16 layer, int16 frame, int16 animation, int16 flags,  		return;  	} +	if ((animation < 0) || (animation >= 10)) +		return;  	if ((_animPictCount[animation] == 0) || (layer < 0))  		return;  	if (layer >= _animations[animation].layersCount) diff --git a/engines/gob/sound/sound.h b/engines/gob/sound/sound.h index b59510e4bb..07b5a737db 100644 --- a/engines/gob/sound/sound.h +++ b/engines/gob/sound/sound.h @@ -144,4 +144,4 @@ private:  } // End of namespace Gob -#endif // GOB_SOUND_H +#endif // GOB_SOUND_SOUND_H diff --git a/engines/gob/sound/soundmixer.h b/engines/gob/sound/soundmixer.h index 5789885a99..3e8e6b5c1b 100644 --- a/engines/gob/sound/soundmixer.h +++ b/engines/gob/sound/soundmixer.h @@ -37,7 +37,7 @@ namespace Gob {  class SoundMixer : public Audio::AudioStream {  public: -	SoundMixer(Audio::Mixer &mixer, Audio::Mixer::SoundType type = Audio::Mixer::kPlainSoundType); +	SoundMixer(Audio::Mixer &mixer, Audio::Mixer::SoundType type);  	~SoundMixer();  	virtual void play(SoundDesc &sndDesc, int16 repCount, diff --git a/engines/gob/variables.cpp b/engines/gob/variables.cpp index 0eea2f6547..805aaeb839 100644 --- a/engines/gob/variables.cpp +++ b/engines/gob/variables.cpp @@ -308,4 +308,62 @@ uint32 VariablesBE::read32(const byte *buf) const {  	return READ_BE_UINT32(buf);  } +VariableReference::VariableReference() { +	_vars = 0; +	_offset = 0; +} + +VariableReference::VariableReference(Variables &vars, uint32 offset, Variables::Type type) { +	set(vars, offset, type); +} + +VariableReference::~VariableReference() { +} + +void VariableReference::set(Variables &vars, uint32 offset, Variables::Type type) { +	_vars = &vars; +	_offset = offset; +	_type = type; +} + +VariableReference &VariableReference::operator=(uint32 value) { +	if (_vars) { +		switch (_type) { +			case Variables::kVariableType8: +				_vars->writeOff8(_offset, (uint8) value); +				break; +			case Variables::kVariableType16: +				_vars->writeOff16(_offset, (uint16) value); +				break; +			case Variables::kVariableType32: +				_vars->writeOff32(_offset, value); +				break; +		} +	} +	return *this; +} + +VariableReference::operator uint32() { +	if (_vars) { +		switch (_type) { +			case Variables::kVariableType8: +				return (uint32) _vars->readOff8(_offset); +			case Variables::kVariableType16: +				return (uint32) _vars->readOff16(_offset); +			case Variables::kVariableType32: +				return _vars->readOff32(_offset); +		} +	} + +	return 0; +} + +VariableReference &VariableReference::operator+=(uint32 value) { +	return (*this = (*this + value)); +} + +VariableReference &VariableReference::operator*=(uint32 value) { +	return (*this = (*this * value)); +} +  } // End of namespace Gob diff --git a/engines/gob/variables.h b/engines/gob/variables.h index 5989ed38ee..32f160a6bd 100644 --- a/engines/gob/variables.h +++ b/engines/gob/variables.h @@ -30,6 +30,12 @@ namespace Gob {  class Variables {  public: +	enum Type { +		kVariableType8, +		kVariableType16, +		kVariableType32 +	}; +  	Variables(uint32 size);  	virtual ~Variables(); @@ -142,6 +148,26 @@ protected:  	uint32 read32(const byte *buf) const;  }; +class VariableReference { +	public: +		VariableReference(); +		VariableReference(Variables &vars, uint32 offset, +				Variables::Type type = Variables::kVariableType32); +		~VariableReference(); + +		void set(Variables &vars, uint32 offset, Variables::Type type = Variables::kVariableType32); + +		VariableReference &operator=(uint32 value); +		VariableReference &operator+=(uint32 value); +		VariableReference &operator*=(uint32 value); +		operator uint32(); + +	private: +		Variables *_vars; +		uint32 _offset; +		Variables::Type _type; +}; +  } // End of namespace Gob  #endif // GOB_VARIABLES_H diff --git a/engines/gob/videoplayer.cpp b/engines/gob/videoplayer.cpp index 909d39a63b..aa47e6cf84 100644 --- a/engines/gob/videoplayer.cpp +++ b/engines/gob/videoplayer.cpp @@ -588,12 +588,14 @@ bool VideoPlayer::doPlay(int16 frame, int16 breakKey,  }  void VideoPlayer::copyPalette(CoktelVideo &video, int16 palStart, int16 palEnd) { -	if ((palStart != -1) && (palEnd != -1)) -		memcpy(((char *) (_vm->_global->_pPaletteDesc->vgaPal)) + palStart * 3, -				video.getPalette() + palStart * 3, -				(palEnd - palStart + 1) * 3); -	else -		memcpy((char *) _vm->_global->_pPaletteDesc->vgaPal, video.getPalette(), 768); +	if (palStart < 0) +		palStart = 0; +	if (palEnd < 0) +		palEnd = 255; + +	memcpy(((char *) (_vm->_global->_pPaletteDesc->vgaPal)) + palStart * 3, +			video.getPalette() + palStart * 3, +			(palEnd - palStart + 1) * 3);  }  void VideoPlayer::writeVideoInfo(const char *videoFile, int16 varX, int16 varY,  | 
