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

svn-id: r33014
This commit is contained in:
Sven Hesse 2008-07-12 15:21:38 +00:00
parent 7ddd961bf2
commit c1ec21d999
12 changed files with 436 additions and 354 deletions

View File

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

View File

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

View File

@ -79,7 +79,7 @@ protected:
};
struct OpGobParams {
int16 extraData;
int32 *retVarPtr;
VariableReference retVarPtr;
Goblin::Gob_Object *objDesc;
};

View File

@ -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 &params) {
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 &params) {
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_setType(OpGobParams &params) {
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 @@ void Inter_v1::o1_getItem(OpGobParams &params) {
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 @@ void Inter_v1::o1_getItemIndirect(OpGobParams &params) {
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 @@ void Inter_v1::o1_setGoblinPosH(OpGobParams &params) {
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 &params) {
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 @@ void Inter_v1::o1_setGoblinMultState(OpGobParams &params) {
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 &params) {
_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 &params) {
}
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 @@ void Inter_v1::o1_setGoblinPos(OpGobParams &params) {
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 &params) {
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 &params) {
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 &params) {
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 @@ void Inter_v1::o1_getObjectIntersect(OpGobParams &params) {
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 @@ void Inter_v1::o1_getGoblinIntersect(OpGobParams &params) {
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 @@ void Inter_v1::o1_initGoblin(OpGobParams &params) {
_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;
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -144,4 +144,4 @@ private:
} // End of namespace Gob
#endif // GOB_SOUND_H
#endif // GOB_SOUND_SOUND_H

View File

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

View File

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