[Scummvm-cvs-logs] SF.net SVN: scummvm: [33014] scummvm/trunk/engines/gob

drmccoy at users.sourceforge.net drmccoy at users.sourceforge.net
Sat Jul 12 17:21:39 CEST 2008


Revision: 33014
          http://scummvm.svn.sourceforge.net/scummvm/?rev=33014&view=rev
Author:   drmccoy
Date:     2008-07-12 08:21:38 -0700 (Sat, 12 Jul 2008)

Log Message:
-----------
Changed tricky variable access from pointers to a new class that minds endianess.
This should fix a few regressions with BE games on LE systems and vice versa that I introduced when I changed how variables are stored (which was necessary to get Woodruff work on BE systems).

Modified Paths:
--------------
    scummvm/trunk/engines/gob/goblin.cpp
    scummvm/trunk/engines/gob/goblin.h
    scummvm/trunk/engines/gob/inter.h
    scummvm/trunk/engines/gob/inter_v1.cpp
    scummvm/trunk/engines/gob/inter_v2.cpp
    scummvm/trunk/engines/gob/mult.cpp
    scummvm/trunk/engines/gob/mult.h
    scummvm/trunk/engines/gob/mult_v1.cpp
    scummvm/trunk/engines/gob/mult_v2.cpp
    scummvm/trunk/engines/gob/sound/sound.h
    scummvm/trunk/engines/gob/variables.cpp
    scummvm/trunk/engines/gob/variables.h

Modified: scummvm/trunk/engines/gob/goblin.cpp
===================================================================
--- scummvm/trunk/engines/gob/goblin.cpp	2008-07-12 14:54:14 UTC (rev 33013)
+++ scummvm/trunk/engines/gob/goblin.cpp	2008-07-12 15:21:38 UTC (rev 33014)
@@ -78,58 +78,6 @@
 	_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 @@
 	_gobDestY = tmp;
 	_vm->_map->_curGoblinY = tmp;
 
-	*_curGobVarPtr = _currentGoblin;
+	_curGobVarPtr = (uint32) _currentGoblin;
 	_pathExistence = 0;
 	_readyToAct = 0;
 }
@@ -1250,172 +1198,172 @@
 
 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);
+	_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 = (int32 *)VAR_ADDRESS(114);
+	_itemInPocketVarPtr.set(*_vm->_inter->_variables, 456);
 
-	*_itemInPocketVarPtr = -2;
+	_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;

Modified: scummvm/trunk/engines/gob/goblin.h
===================================================================
--- scummvm/trunk/engines/gob/goblin.h	2008-07-12 14:54:14 UTC (rev 33013)
+++ scummvm/trunk/engines/gob/goblin.h	2008-07-12 15:21:38 UTC (rev 33014)
@@ -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 @@
 	char _pathExistence;
 
 	// Pointers to interpreter variables
-	int32 *_some0ValPtr;
+	VariableReference _some0ValPtr;
 
-	int32 *_gobRetVarPtr;
-	int32 *_curGobVarPtr;
-	int32 *_curGobXPosVarPtr;
-	int32 *_curGobYPosVarPtr;
-	int32 *_itemInPocketVarPtr;
+	VariableReference _gobRetVarPtr;
+	VariableReference _curGobVarPtr;
+	VariableReference _curGobXPosVarPtr;
+	VariableReference _curGobYPosVarPtr;
+	VariableReference _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;
+	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;
 
-	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 _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;

Modified: scummvm/trunk/engines/gob/inter.h
===================================================================
--- scummvm/trunk/engines/gob/inter.h	2008-07-12 14:54:14 UTC (rev 33013)
+++ scummvm/trunk/engines/gob/inter.h	2008-07-12 15:21:38 UTC (rev 33014)
@@ -79,7 +79,7 @@
 	};
 	struct OpGobParams {
 		int16 extraData;
-		int32 *retVarPtr;
+		VariableReference retVarPtr;
 		Goblin::Gob_Object *objDesc;
 	};
 

Modified: scummvm/trunk/engines/gob/inter_v1.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_v1.cpp	2008-07-12 14:54:14 UTC (rev 33013)
+++ scummvm/trunk/engines/gob/inter_v1.cpp	2008-07-12 15:21:38 UTC (rev 33014)
@@ -912,12 +912,21 @@
 	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 @@
 			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 @@
 
 	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 @@
 void Inter_v1::o1_setState(OpGobParams &params) {
 	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 &params) {
 	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 &params) {
 	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 &params) {
 	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 &params) {
 	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 &params) {
 	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 &params) {
 	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 &params) {
 	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_setNoTick(OpGobParams &params) {
 	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 &params) {
 	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 &params) {
 	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 &params) {
 	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 &params) {
 	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 &params) {
 	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 &params) {
 	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 &params) {
-	*params.retVarPtr = params.objDesc->state;
+	params.retVarPtr = (uint32) params.objDesc->state;
 }
 
 void Inter_v1::o1_getCurFrame(OpGobParams &params) {
-	*params.retVarPtr = params.objDesc->curFrame;
+	params.retVarPtr = (uint32) params.objDesc->curFrame;
 }
 
 void Inter_v1::o1_getNextState(OpGobParams &params) {
-	*params.retVarPtr = params.objDesc->nextState;
+	params.retVarPtr = (uint32) params.objDesc->nextState;
 }
 
 void Inter_v1::o1_getMultState(OpGobParams &params) {
-	*params.retVarPtr = params.objDesc->multState;
+	params.retVarPtr = (uint32) params.objDesc->multState;
 }
 
 void Inter_v1::o1_getOrder(OpGobParams &params) {
-	*params.retVarPtr = params.objDesc->order;
+	params.retVarPtr = (uint32) params.objDesc->order;
 }
 
 void Inter_v1::o1_getActionStartState(OpGobParams &params) {
-	*params.retVarPtr = params.objDesc->actionStartState;
+	params.retVarPtr = (uint32) params.objDesc->actionStartState;
 }
 
 void Inter_v1::o1_getCurLookDir(OpGobParams &params) {
-	*params.retVarPtr = params.objDesc->curLookDir;
+	params.retVarPtr = (uint32) params.objDesc->curLookDir;
 }
 
 void Inter_v1::o1_getType(OpGobParams &params) {
-	*params.retVarPtr = params.objDesc->type;
+	params.retVarPtr = (uint32) params.objDesc->type;
 }
 
 void Inter_v1::o1_getNoTick(OpGobParams &params) {
-	*params.retVarPtr = params.objDesc->noTick;
+	params.retVarPtr = (uint32) params.objDesc->noTick;
 }
 
 void Inter_v1::o1_getPickable(OpGobParams &params) {
-	*params.retVarPtr = params.objDesc->pickable;
+	params.retVarPtr = (uint32) params.objDesc->pickable;
 }
 
 void Inter_v1::o1_getObjMaxFrame(OpGobParams &params) {
-	*params.retVarPtr = _vm->_goblin->getObjMaxFrame(params.objDesc);
+	params.retVarPtr = (uint32) _vm->_goblin->getObjMaxFrame(params.objDesc);
 }
 
 void Inter_v1::o1_getXPos(OpGobParams &params) {
-	*params.retVarPtr = params.objDesc->xPos;
+	params.retVarPtr = (uint32) params.objDesc->xPos;
 }
 
 void Inter_v1::o1_getYPos(OpGobParams &params) {
-	*params.retVarPtr = params.objDesc->yPos;
+	params.retVarPtr = (uint32) params.objDesc->yPos;
 }
 
 void Inter_v1::o1_getDoAnim(OpGobParams &params) {
-	*params.retVarPtr = params.objDesc->doAnim;
+	params.retVarPtr = (uint32) params.objDesc->doAnim;
 }
 
 void Inter_v1::o1_getRelaxTime(OpGobParams &params) {
-	*params.retVarPtr = params.objDesc->relaxTime;
+	params.retVarPtr = (uint32) params.objDesc->relaxTime;
 }
 
 void Inter_v1::o1_getMaxTick(OpGobParams &params) {
-	*params.retVarPtr = params.objDesc->maxTick;
+	params.retVarPtr = (uint32) params.objDesc->maxTick;
 }
 
 void Inter_v1::o1_manipulateMap(OpGobParams &params) {
@@ -2435,9 +2444,9 @@
 	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 &params) {
@@ -2460,9 +2469,9 @@
 	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 &params) {
@@ -2500,11 +2509,11 @@
 	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_getGoblinPosXH(OpGobParams &params) {
 	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 &params) {
 	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 &params) {
@@ -2539,14 +2548,14 @@
 		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 @@
 	_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_getItemIdInPocket(OpGobParams &params) {
-	*params.retVarPtr = _vm->_goblin->_itemIdInPocket;
+	params.retVarPtr = (uint32) _vm->_goblin->_itemIdInPocket;
 }
 
 void Inter_v1::o1_getItemIndInPocket(OpGobParams &params) {
-	*params.retVarPtr = _vm->_goblin->_itemIndInPocket;
+	params.retVarPtr = (uint32) _vm->_goblin->_itemIndInPocket;
 }
 
 void Inter_v1::o1_setGoblinPos(OpGobParams &params) {
@@ -2632,10 +2641,10 @@
 	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 @@
 	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 @@
 	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_getGoblinPosX(OpGobParams &params) {
 	int16 item = load16();
-	*params.retVarPtr = _vm->_goblin->_gobPositions[item].x;
+	params.retVarPtr = (uint32) _vm->_goblin->_gobPositions[item].x;
 }
 
 void Inter_v1::o1_getGoblinPosY(OpGobParams &params) {
 	int16 item = load16();
-	*params.retVarPtr = _vm->_goblin->_gobPositions[item].y;
+	params.retVarPtr = (uint32) _vm->_goblin->_gobPositions[item].y;
 }
 
 void Inter_v1::o1_clearPathExistence(OpGobParams &params) {
@@ -2741,9 +2750,9 @@
 	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 &params) {
@@ -2753,9 +2762,9 @@
 	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 &params) {
@@ -2886,7 +2895,7 @@
 		_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;
 	}

Modified: scummvm/trunk/engines/gob/inter_v2.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_v2.cpp	2008-07-12 14:54:14 UTC (rev 33013)
+++ scummvm/trunk/engines/gob/inter_v2.cpp	2008-07-12 15:21:38 UTC (rev 33014)
@@ -880,9 +880,15 @@
 
 		_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 @@
 			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 @@
 
 	} 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);

Modified: scummvm/trunk/engines/gob/mult.cpp
===================================================================
--- scummvm/trunk/engines/gob/mult.cpp	2008-07-12 14:54:14 UTC (rev 33013)
+++ scummvm/trunk/engines/gob/mult.cpp	2008-07-12 15:21:38 UTC (rev 33014)
@@ -93,12 +93,18 @@
 }
 
 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::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 @@
 		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;
 

Modified: scummvm/trunk/engines/gob/mult.h
===================================================================
--- scummvm/trunk/engines/gob/mult.h	2008-07-12 14:54:14 UTC (rev 33013)
+++ scummvm/trunk/engines/gob/mult.h	2008-07-12 15:21:38 UTC (rev 33014)
@@ -27,6 +27,7 @@
 #define GOB_MULT_H
 
 #include "gob/video.h"
+#include "gob/variables.h"
 
 namespace Gob {
 
@@ -77,8 +78,8 @@
 	} PACKED_STRUCT;
 
 	struct Mult_Object {
-		int32 *pPosX;
-		int32 *pPosY;
+		VariableReference *pPosX;
+		VariableReference *pPosY;
 		Mult_AnimData *pAnimData;
 		int16 tick;
 		int16 lastLeft;
@@ -267,8 +268,8 @@
 
 	bool _doPalSubst;
 
-	int32 *_animArrayX;
-	int32 *_animArrayY;
+	Variables *_animArrayX;
+	Variables *_animArrayY;
 	Mult_AnimData *_animArrayData;
 
 	int16 _palKeyIndex;

Modified: scummvm/trunk/engines/gob/mult_v1.cpp
===================================================================
--- scummvm/trunk/engines/gob/mult_v1.cpp	2008-07-12 14:54:14 UTC (rev 33013)
+++ scummvm/trunk/engines/gob/mult_v1.cpp	2008-07-12 15:21:38 UTC (rev 33014)
@@ -216,10 +216,16 @@
 	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 @@
 	_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 @@
 		_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;

Modified: scummvm/trunk/engines/gob/mult_v2.cpp
===================================================================
--- scummvm/trunk/engines/gob/mult_v2.cpp	2008-07-12 14:54:14 UTC (rev 33013)
+++ scummvm/trunk/engines/gob/mult_v2.cpp	2008-07-12 15:21:38 UTC (rev 33014)
@@ -329,8 +329,8 @@
 	if (_animDataAllocated) {
 		freeMult();
 
-		delete[] _animArrayX;
-		delete[] _animArrayY;
+		delete _animArrayX;
+		delete _animArrayY;
 		delete[] _animArrayData;
 
 		_animArrayX = 0;
@@ -510,6 +510,13 @@
 	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 @@
 		_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;

Modified: scummvm/trunk/engines/gob/sound/sound.h
===================================================================
--- scummvm/trunk/engines/gob/sound/sound.h	2008-07-12 14:54:14 UTC (rev 33013)
+++ scummvm/trunk/engines/gob/sound/sound.h	2008-07-12 15:21:38 UTC (rev 33014)
@@ -144,4 +144,4 @@
 
 } // End of namespace Gob
 
-#endif // GOB_SOUND_H
+#endif // GOB_SOUND_SOUND_H

Modified: scummvm/trunk/engines/gob/variables.cpp
===================================================================
--- scummvm/trunk/engines/gob/variables.cpp	2008-07-12 14:54:14 UTC (rev 33013)
+++ scummvm/trunk/engines/gob/variables.cpp	2008-07-12 15:21:38 UTC (rev 33014)
@@ -308,4 +308,62 @@
 	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

Modified: scummvm/trunk/engines/gob/variables.h
===================================================================
--- scummvm/trunk/engines/gob/variables.h	2008-07-12 14:54:14 UTC (rev 33013)
+++ scummvm/trunk/engines/gob/variables.h	2008-07-12 15:21:38 UTC (rev 33014)
@@ -30,6 +30,12 @@
 
 class Variables {
 public:
+	enum Type {
+		kVariableType8,
+		kVariableType16,
+		kVariableType32
+	};
+
 	Variables(uint32 size);
 	virtual ~Variables();
 
@@ -142,6 +148,26 @@
 	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


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list