aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/gob/goblin.cpp19
-rw-r--r--engines/gob/goblin_v1.cpp4
-rw-r--r--engines/gob/goblin_v2.cpp10
-rw-r--r--engines/gob/inter_v1.cpp14
-rw-r--r--engines/gob/inter_v2.cpp4
-rw-r--r--engines/gob/mult_v1.cpp6
-rw-r--r--engines/gob/mult_v2.cpp218
-rw-r--r--engines/gob/scenery.cpp48
-rw-r--r--engines/gob/scenery.h4
-rw-r--r--engines/gob/scenery_v1.cpp27
-rw-r--r--engines/gob/scenery_v2.cpp2
11 files changed, 173 insertions, 183 deletions
diff --git a/engines/gob/goblin.cpp b/engines/gob/goblin.cpp
index 84e5fc798f..15809a8dc3 100644
--- a/engines/gob/goblin.cpp
+++ b/engines/gob/goblin.cpp
@@ -498,7 +498,7 @@ void Goblin::animateObjects(void) {
layer = objDesc->stateMach[objDesc->state][0]->layer;
pLayer =
- _vm->_scenery->_animations[objDesc->animation].layers[layer];
+ &_vm->_scenery->_animations[objDesc->animation].layers[layer];
if (objDesc->curFrame < pLayer->framesCount)
continue;
@@ -547,8 +547,7 @@ int16 Goblin::getObjMaxFrame(Gob_Object * objDesc) {
int16 layer;
layer = objDesc->stateMach[objDesc->state][0]->layer;
- return _vm->_scenery->_animations[objDesc->animation].layers[layer]->framesCount -
- 1;
+ return _vm->_scenery->_animations[objDesc->animation].layers[layer].framesCount - 1;
}
int16 Goblin::objIntersected(Gob_Object *obj1, Gob_Object *obj2) {
@@ -609,7 +608,7 @@ void Goblin::showBoredom(int16 gobIndex) {
layer = gobDesc->stateMach[gobDesc->state][0]->layer;
frameCount =
- _vm->_scenery->_animations[gobDesc->animation].layers[layer]->framesCount;
+ _vm->_scenery->_animations[gobDesc->animation].layers[layer].framesCount;
state = gobDesc->state;
frame = gobDesc->curFrame;
@@ -1226,7 +1225,7 @@ int16 Goblin::doMove(Gob_Object *gobDesc, int16 cont, int16 action) {
layer = gobDesc->stateMach[gobDesc->state][0]->layer;
framesCount =
- _vm->_scenery->_animations[gobDesc->animation].layers[layer]->framesCount;
+ _vm->_scenery->_animations[gobDesc->animation].layers[layer].framesCount;
if (VAR(59) == 0 &&
gobDesc->state != 30 && gobDesc->state != 31) {
@@ -1977,7 +1976,7 @@ void Goblin::sub_195C7(int16 index, int16 state) {
animData->frame = 0;
animData->isPaused = 0;
animData->isStatic = 0;
- animData->newCycle = _vm->_scenery->_animations[animation].layers[layer]->framesCount;
+ animData->newCycle = _vm->_scenery->_animations[animation].layers[layer].framesCount;
_vm->_scenery->updateAnim(layer, 0, animation, 0, *obj->pPosX, *obj->pPosY, 1);
if (_vm->_map->_bigTiles) {
@@ -2004,7 +2003,7 @@ void Goblin::sub_11984(Mult::Mult_Object *obj) {
layer = obj->goblinStates[animData->state][0].layer;
animation = obj->goblinStates[animData->state][0].animation;
- framesCount = _vm->_scenery->_animations[animation].layers[layer]->framesCount;
+ framesCount = _vm->_scenery->_animations[animation].layers[layer].framesCount;
animData->newCycle = framesCount;
playSounds(obj);
@@ -2042,9 +2041,9 @@ void Goblin::sub_11984(Mult::Mult_Object *obj) {
animData->field_F = -1;
animData->animation = obj->goblinStates[animData->state][0].animation;
animData->layer = obj->goblinStates[animData->state][0].layer;
- *obj->pPosX += _vm->_scenery->_animations[animation].layers[layer]->animDeltaX;
- *obj->pPosY += _vm->_scenery->_animations[animation].layers[layer]->animDeltaY;
- animData->newCycle = _vm->_scenery->_animations[animation].layers[layer]->framesCount;
+ *obj->pPosX += _vm->_scenery->_animations[animation].layers[layer].animDeltaX;
+ *obj->pPosY += _vm->_scenery->_animations[animation].layers[layer].animDeltaY;
+ animData->newCycle = _vm->_scenery->_animations[animation].layers[layer].framesCount;
animData->isPaused = 0;
} else
animData->frame--;
diff --git a/engines/gob/goblin_v1.cpp b/engines/gob/goblin_v1.cpp
index 8417e409ee..4c46906a60 100644
--- a/engines/gob/goblin_v1.cpp
+++ b/engines/gob/goblin_v1.cpp
@@ -522,11 +522,11 @@ void Goblin_v1::moveAdvance(Mult::Mult_Object *obj, Gob_Object *gobDesc,
newX =
_vm->_scenery->_animations[gobDesc->animation].
- layers[_gobStateLayer]->animDeltaX + gobDesc->xPos;
+ layers[_gobStateLayer].animDeltaX + gobDesc->xPos;
newY =
_vm->_scenery->_animations[gobDesc->animation].
- layers[_gobStateLayer]->animDeltaY + gobDesc->yPos;
+ layers[_gobStateLayer].animDeltaY + gobDesc->yPos;
_gobStateLayer = nextLayer(gobDesc);
diff --git a/engines/gob/goblin_v2.cpp b/engines/gob/goblin_v2.cpp
index ab35e979dd..d52300a8d9 100644
--- a/engines/gob/goblin_v2.cpp
+++ b/engines/gob/goblin_v2.cpp
@@ -96,7 +96,7 @@ void Goblin_v2::placeObject(Gob_Object *objDesc, char animated,
objAnim->frame = 0;
objAnim->isPaused = 0;
objAnim->isStatic = 0;
- objAnim->newCycle = _vm->_scenery->_animations[animation].layers[layer]->framesCount;
+ objAnim->newCycle = _vm->_scenery->_animations[animation].layers[layer].framesCount;
_vm->_scenery->updateAnim(layer, 0, animation, 0, *obj->pPosX, *obj->pPosY, 0);
if (!_vm->_map->_bigTiles)
*obj->pPosY = (y + 1) * _vm->_map->_tilesHeight
@@ -139,7 +139,7 @@ void Goblin_v2::movePathFind(Mult::Mult_Object *obj, Gob_Object *gobDesc, int16
dir = 0;
animData = obj->pAnimData;
framesCount =
- _vm->_scenery->_animations[(int)animData->animation].layers[animData->layer]->framesCount;
+ _vm->_scenery->_animations[(int)animData->animation].layers[animData->layer].framesCount;
gobX = obj->goblinX;
gobY = obj->goblinY;
animData->order = gobY;
@@ -317,7 +317,7 @@ void Goblin_v2::moveAdvance(Mult::Mult_Object *obj, Gob_Object *gobDesc,
animData = obj->pAnimData;
framesCount =
- _vm->_scenery->_animations[(int)animData->animation].layers[animData->layer]->framesCount;
+ _vm->_scenery->_animations[(int)animData->animation].layers[animData->layer].framesCount;
if (animData->isPaused == 0)
animData->frame++;
@@ -388,9 +388,9 @@ void Goblin_v2::moveAdvance(Mult::Mult_Object *obj, Gob_Object *gobDesc,
animData->field_F = -1;
animData->state = animData->nextState;
*obj->pPosX +=
- _vm->_scenery->_animations[animData->animation].layers[animData->layer]->animDeltaX;
+ _vm->_scenery->_animations[animData->animation].layers[animData->layer].animDeltaX;
*obj->pPosY +=
- _vm->_scenery->_animations[animData->animation].layers[animData->layer]->animDeltaY;
+ _vm->_scenery->_animations[animData->animation].layers[animData->layer].animDeltaY;
animation = obj->goblinStates[animData->nextState][0].animation;
layer = obj->goblinStates[animData->nextState][0].layer;
animData->layer = layer;
diff --git a/engines/gob/inter_v1.cpp b/engines/gob/inter_v1.cpp
index b6862f29c2..7a3449f7f0 100644
--- a/engines/gob/inter_v1.cpp
+++ b/engines/gob/inter_v1.cpp
@@ -2317,11 +2317,9 @@ void Inter_v1::o1_setGoblinMultState(int16 &extraData, int32 *retVarPtr, Goblin:
layer = objDesc->stateMach[objDesc->state][0]->layer;
objDesc->xPos =
- _vm->_scenery->_animations[objDesc->animation].layers[layer]->
- posX;
+ _vm->_scenery->_animations[objDesc->animation].layers[layer].posX;
objDesc->yPos =
- _vm->_scenery->_animations[objDesc->animation].layers[layer]->
- posY;
+ _vm->_scenery->_animations[objDesc->animation].layers[layer].posY;
*_vm->_goblin->_curGobScrXVarPtr = objDesc->xPos;
*_vm->_goblin->_curGobScrYVarPtr = objDesc->yPos;
@@ -2415,9 +2413,9 @@ void Inter_v1::o1_setGoblinState(int16 &extraData, int32 *retVarPtr, Goblin::Gob
layer = objDesc->stateMach[objDesc->state][0]->layer;
objDesc->xPos =
- _vm->_scenery->_animations[objDesc->animation].layers[layer]->posX;
+ _vm->_scenery->_animations[objDesc->animation].layers[layer].posX;
objDesc->yPos =
- _vm->_scenery->_animations[objDesc->animation].layers[layer]->posY;
+ _vm->_scenery->_animations[objDesc->animation].layers[layer].posY;
if (item == _vm->_goblin->_currentGoblin) {
*_vm->_goblin->_curGobScrXVarPtr = objDesc->xPos;
@@ -2439,9 +2437,9 @@ void Inter_v1::o1_setGoblinStateRedraw(int16 &extraData, int32 *retVarPtr, Gobli
_vm->_goblin->nextLayer(objDesc);
layer = objDesc->stateMach[objDesc->state][0]->layer;
objDesc->xPos =
- _vm->_scenery->_animations[objDesc->animation].layers[layer]->posX;
+ _vm->_scenery->_animations[objDesc->animation].layers[layer].posX;
objDesc->yPos =
- _vm->_scenery->_animations[objDesc->animation].layers[layer]->posY;
+ _vm->_scenery->_animations[objDesc->animation].layers[layer].posY;
objDesc->toRedraw = 1;
objDesc->type = 0;
diff --git a/engines/gob/inter_v2.cpp b/engines/gob/inter_v2.cpp
index a7bceee98e..2e14691537 100644
--- a/engines/gob/inter_v2.cpp
+++ b/engines/gob/inter_v2.cpp
@@ -1172,8 +1172,8 @@ void Inter_v2::loadMult(void) {
objAnim->layer = obj->goblinStates[objAnim->state][0].layer;
objAnim->animation = animation;
if ((*obj->pPosX == 1000) && (*obj->pPosY == 1000)) {
- *obj->pPosX = _vm->_scenery->_animations[objAnim->animation].layers[objAnim->state]->posX;
- *obj->pPosY = _vm->_scenery->_animations[objAnim->animation].layers[objAnim->state]->posY;
+ *obj->pPosX = _vm->_scenery->_animations[objAnim->animation].layers[objAnim->state].posX;
+ *obj->pPosY = _vm->_scenery->_animations[objAnim->animation].layers[objAnim->state].posY;
}
_vm->_scenery->updateAnim(layer, 0, animation, 0, *obj->pPosX, *obj->pPosY, 0);
}
diff --git a/engines/gob/mult_v1.cpp b/engines/gob/mult_v1.cpp
index ef59283de3..d891f6a2c7 100644
--- a/engines/gob/mult_v1.cpp
+++ b/engines/gob/mult_v1.cpp
@@ -860,7 +860,7 @@ void Mult_v1::animate(void) {
} else {
pAnimData->frame++;
if (pAnimData->frame >=
- _vm->_scenery->_animations[(int)pAnimData->animation].layers[pAnimData->layer]->framesCount) {
+ _vm->_scenery->_animations[(int)pAnimData->animation].layers[pAnimData->layer].framesCount) {
switch (pAnimData->animType) {
case 0:
pAnimData->frame = 0;
@@ -871,11 +871,11 @@ void Mult_v1::animate(void) {
*(_objects[i].pPosX) =
*(_objects[i].pPosX) +
- _vm->_scenery->_animations[(int)pAnimData->animation].layers[pAnimData->layer]->animDeltaX;
+ _vm->_scenery->_animations[(int)pAnimData->animation].layers[pAnimData->layer].animDeltaX;
*(_objects[i].pPosY) =
*(_objects[i].pPosY) +
- _vm->_scenery->_animations[(int)pAnimData->animation].layers[pAnimData->layer]->animDeltaY;
+ _vm->_scenery->_animations[(int)pAnimData->animation].layers[pAnimData->layer].animDeltaY;
break;
case 2:
diff --git a/engines/gob/mult_v2.cpp b/engines/gob/mult_v2.cpp
index c2a41e55c6..b71f86b9af 100644
--- a/engines/gob/mult_v2.cpp
+++ b/engines/gob/mult_v2.cpp
@@ -77,16 +77,6 @@ void Mult_v2::loadMult(int16 resId) {
_multData2 = new Mult_Data;
memset(_multData2, 0, sizeof(Mult_Data));
- // ---.
- for (i = 0; i < 4; i++) {
- _multData2->field_157[i] = 0;
- for (j = 0; j < 4; j++) {
- _multData2->field_15F[i][j] = 0;
- _multData2->field_17F[i][j] = 0;
- }
- }
- // ---'
-
_multDatas[index] = _multData2;
for (i = 0; i < 10; i++) {
@@ -1012,37 +1002,21 @@ void Mult_v2::sub_62DD(int16 index) {
doSoundAnim(0, frame);
WRITE_VAR(22, frame);
- if (_multData2->field_156 == 1) { // loc_6809
- frame++;
- if (_multData2->field_157[index] == (frame-1)) {
- _multData2->someKeysIndices[0] = -1;
- _multData2->someKeysIndices[1] = -1;
- _multData2->someKeysIndices[2] = -1;
- _multData2->someKeysIndices[3] = -1;
- frame = -1;
- for (i = 0; i < 4; i++) {
- if ((_multData2->field_124[index][i] == -1) || (_multData2->field_124[index][i] == 1024))
- continue;
+ if (_multData2->field_157[index] == frame) {
+ _multData2->someKeysIndices[0] = -1;
+ _multData2->someKeysIndices[1] = -1;
+ _multData2->someKeysIndices[2] = -1;
+ _multData2->someKeysIndices[3] = -1;
+ frame = -1;
+ for (i = 0; i < 4; i++)
+ if ((_multData2->field_124[index][i] != -1) && (_multData2->field_124[index][i] != 1024))
_objects[_multData2->field_124[index][i]].pAnimData->animType =
_objects[_multData2->field_124[index][i]].pAnimData->field_17;
- }
- }
- } else { // loc_68F3
+ } else if(_multData2->field_156 == 1)
+ frame++;
+ else
frame--;
- if (_multData2->field_157[index] == (frame+1)) {
- _multData2->someKeysIndices[0] = -1;
- _multData2->someKeysIndices[1] = -1;
- _multData2->someKeysIndices[2] = -1;
- _multData2->someKeysIndices[3] = -1;
- frame = -1;
- for (i = 0; i < 4; i++) {
- if ((_multData2->field_124[index][i] == -1) || (_multData2->field_124[index][i] == 1024))
- continue;
- _objects[_multData2->field_124[index][i]].pAnimData->animType =
- _objects[_multData2->field_124[index][i]].pAnimData->field_17;
- }
- }
- }
+
// loc_6A06
_multData2->animKeysFrames[index] = frame;
WRITE_VAR(18 + index, frame);
@@ -1135,29 +1109,27 @@ void Mult_v2::animate(void) {
animObj1->someFlag = 0;
}
}
- } else {
- if (animData1->isStatic == 0) {
- if (animObj1->lastLeft == -1) {
- animObj1->someFlag = 1;
- _vm->_scenery->updateAnim(animData1->layer, animData1->frame,
- animData1->animation, 8, *animObj1->pPosX, *animObj1->pPosY, 0);
- animObj1->somethingLeft = _vm->_scenery->_toRedrawLeft;
- animObj1->somethingTop = _vm->_scenery->_toRedrawTop;
- animObj1->somethingRight = _vm->_scenery->_toRedrawRight;
- animObj1->somethingBottom = _vm->_scenery->_toRedrawBottom;
- } else {
- animObj1->somethingLeft = animObj1->lastLeft;
- animObj1->somethingTop = animObj1->lastTop;
- animObj1->somethingRight = animObj1->lastRight;
- animObj1->somethingBottom = animObj1->lastBottom;
- }
- } else if (animObj1->lastLeft != -1) {
+ } else if (animData1->isStatic == 0) {
+ if (animObj1->lastLeft == -1) {
animObj1->someFlag = 1;
+ _vm->_scenery->updateAnim(animData1->layer, animData1->frame,
+ animData1->animation, 8, *animObj1->pPosX, *animObj1->pPosY, 0);
+ animObj1->somethingLeft = _vm->_scenery->_toRedrawLeft;
+ animObj1->somethingTop = _vm->_scenery->_toRedrawTop;
+ animObj1->somethingRight = _vm->_scenery->_toRedrawRight;
+ animObj1->somethingBottom = _vm->_scenery->_toRedrawBottom;
+ } else {
animObj1->somethingLeft = animObj1->lastLeft;
animObj1->somethingTop = animObj1->lastTop;
animObj1->somethingRight = animObj1->lastRight;
animObj1->somethingBottom = animObj1->lastBottom;
}
+ } else if (animObj1->lastLeft != -1) {
+ animObj1->someFlag = 1;
+ animObj1->somethingLeft = animObj1->lastLeft;
+ animObj1->somethingTop = animObj1->lastTop;
+ animObj1->somethingRight = animObj1->lastRight;
+ animObj1->somethingBottom = animObj1->lastBottom;
}
animData1->somethingLayer = animData1->layer;
animData1->somethingFrame = animData1->frame;
@@ -1194,7 +1166,7 @@ void Mult_v2::animate(void) {
for (i = 0; i < numAnims; i++) {
animData1 = _renderData2[i]->pAnimData;
if (((animData1->isStatic == 0) || (_renderData2[i]->someFlag != 0))
- & (animData1->order == j))
+ && (animData1->order == j))
orderArray[orderArrayPos++] = i;
}
}
@@ -1216,62 +1188,57 @@ void Mult_v2::animate(void) {
for (i = 0; i < orderArrayPos; i++) {
animObj1 = _renderData2[orderArray[i]];
animData1 = animObj1->pAnimData;
- if (animObj1->someFlag == 0) {
- if (animData1->isStatic == 0) {
- for (j = 0; j < orderArrayPos; j++) {
- animObj2 = _renderData2[orderArray[j]];
- if ((animObj2->someFlag != 0) &&
- (animObj1->somethingRight >= animObj2->somethingLeft) &&
- (animObj2->somethingRight >= animObj1->somethingLeft) &&
- (animObj1->somethingBottom >= animObj2->somethingTop) &&
- (animObj2->somethingBottom >= animObj1->somethingTop))
- {
- _vm->_scenery->_toRedrawLeft = animObj2->somethingLeft;
- _vm->_scenery->_toRedrawRight = animObj2->somethingRight;
- _vm->_scenery->_toRedrawTop = animObj2->somethingTop;
- _vm->_scenery->_toRedrawBottom = animObj2->somethingBottom;
- _vm->_scenery->updateAnim(animData1->layer, animData1->frame,
- animData1->animation, 12, *animObj1->pPosX, *animObj1->pPosY, 1);
- _vm->_scenery->updateStatic(animObj1->pAnimData->order + 1);
- }
+ if ((animObj1->someFlag == 0) && (animData1->isStatic == 0)) {
+ for (j = 0; j < orderArrayPos; j++) {
+ animObj2 = _renderData2[orderArray[j]];
+ if ((animObj2->someFlag != 0) &&
+ (animObj1->somethingRight >= animObj2->somethingLeft) &&
+ (animObj2->somethingRight >= animObj1->somethingLeft) &&
+ (animObj1->somethingBottom >= animObj2->somethingTop) &&
+ (animObj2->somethingBottom >= animObj1->somethingTop))
+ {
+ _vm->_scenery->_toRedrawLeft = animObj2->somethingLeft;
+ _vm->_scenery->_toRedrawRight = animObj2->somethingRight;
+ _vm->_scenery->_toRedrawTop = animObj2->somethingTop;
+ _vm->_scenery->_toRedrawBottom = animObj2->somethingBottom;
+ _vm->_scenery->updateAnim(animData1->layer, animData1->frame,
+ animData1->animation, 12, *animObj1->pPosX, *animObj1->pPosY, 1);
+ _vm->_scenery->updateStatic(animObj1->pAnimData->order + 1);
}
}
- } else {
- if (animData1->isStatic == 0) {
- _vm->_scenery->updateAnim(animData1->layer, animData1->frame,
- animData1->animation, 10, *animObj1->pPosX, *animObj1->pPosY, 1);
- if (_vm->_scenery->_toRedrawLeft != -12345) {
- if (_vm->_global->_pressedKeys[0x36]) {
- warning("GOB2 Stub! word_2F3BF & word_2F3C1; someValueToAddToY & someValueToAddToX, respectively");
- // draws a rectangle around the region to redraw, why?
- _vm->_video->drawLine(_vm->_draw->_frontSurface,
- _vm->_scenery->_toRedrawLeft, _vm->_scenery->_toRedrawTop,
- _vm->_scenery->_toRedrawRight, _vm->_scenery->_toRedrawTop, 15);
- _vm->_video->drawLine(_vm->_draw->_frontSurface,
- _vm->_scenery->_toRedrawLeft, _vm->_scenery->_toRedrawBottom,
- _vm->_scenery->_toRedrawRight, _vm->_scenery->_toRedrawBottom, 15);
- _vm->_video->drawLine(_vm->_draw->_frontSurface,
- _vm->_scenery->_toRedrawLeft, _vm->_scenery->_toRedrawTop,
- _vm->_scenery->_toRedrawLeft, _vm->_scenery->_toRedrawBottom, 15);
- _vm->_video->drawLine(_vm->_draw->_frontSurface,
- _vm->_scenery->_toRedrawRight, _vm->_scenery->_toRedrawTop,
- _vm->_scenery->_toRedrawRight, _vm->_scenery->_toRedrawBottom, 15);
- }
- animObj1->lastLeft = _vm->_scenery->_toRedrawLeft;
- animObj1->lastRight = _vm->_scenery->_toRedrawRight;
- animObj1->lastTop = _vm->_scenery->_toRedrawTop;
- animObj1->lastBottom = _vm->_scenery->_toRedrawBottom;
- } else {
- animObj1->lastLeft = -1;
+ } else if (animData1->isStatic == 0) {
+ _vm->_scenery->updateAnim(animData1->layer, animData1->frame,
+ animData1->animation, 10, *animObj1->pPosX, *animObj1->pPosY, 1);
+ if (_vm->_scenery->_toRedrawLeft != -12345) {
+ if (_vm->_global->_pressedKeys[0x36]) {
+ warning("GOB2 Stub! word_2F3BF & word_2F3C1; someValueToAddToY & someValueToAddToX, respectively");
+ // draws a rectangle around the region to redraw, why?
+ _vm->_video->drawLine(_vm->_draw->_frontSurface,
+ _vm->_scenery->_toRedrawLeft, _vm->_scenery->_toRedrawTop,
+ _vm->_scenery->_toRedrawRight, _vm->_scenery->_toRedrawTop, 15);
+ _vm->_video->drawLine(_vm->_draw->_frontSurface,
+ _vm->_scenery->_toRedrawLeft, _vm->_scenery->_toRedrawBottom,
+ _vm->_scenery->_toRedrawRight, _vm->_scenery->_toRedrawBottom, 15);
+ _vm->_video->drawLine(_vm->_draw->_frontSurface,
+ _vm->_scenery->_toRedrawLeft, _vm->_scenery->_toRedrawTop,
+ _vm->_scenery->_toRedrawLeft, _vm->_scenery->_toRedrawBottom, 15);
+ _vm->_video->drawLine(_vm->_draw->_frontSurface,
+ _vm->_scenery->_toRedrawRight, _vm->_scenery->_toRedrawTop,
+ _vm->_scenery->_toRedrawRight, _vm->_scenery->_toRedrawBottom, 15);
}
- } else {
- _vm->_scenery->_toRedrawLeft = animObj1->somethingLeft;
- _vm->_scenery->_toRedrawRight = animObj1->somethingRight;
- _vm->_scenery->_toRedrawTop = animObj1->somethingTop;
- _vm->_scenery->_toRedrawBottom = animObj1->somethingBottom;
- }
- _vm->_scenery->updateStatic(animObj1->pAnimData->order + 1);
+ animObj1->lastLeft = _vm->_scenery->_toRedrawLeft;
+ animObj1->lastRight = _vm->_scenery->_toRedrawRight;
+ animObj1->lastTop = _vm->_scenery->_toRedrawTop;
+ animObj1->lastBottom = _vm->_scenery->_toRedrawBottom;
+ } else
+ animObj1->lastLeft = -1;
+ } else {
+ _vm->_scenery->_toRedrawLeft = animObj1->somethingLeft;
+ _vm->_scenery->_toRedrawRight = animObj1->somethingRight;
+ _vm->_scenery->_toRedrawTop = animObj1->somethingTop;
+ _vm->_scenery->_toRedrawBottom = animObj1->somethingBottom;
}
+ _vm->_scenery->updateStatic(animObj1->pAnimData->order + 1);
}
for (i = 0; i < numAnims; i++) {
@@ -1300,7 +1267,7 @@ void Mult_v2::animate(void) {
if (animData1->animType != 8)
animData1->frame++;
if (animData1->frame >=
- _vm->_scenery->_animations[(int)animData1->animation].layers[animData1->layer]->framesCount) {
+ _vm->_scenery->_animations[(int)animData1->animation].layers[animData1->layer].framesCount) {
switch (animData1->animType) {
case 0:
animData1->frame = 0;
@@ -1309,9 +1276,9 @@ void Mult_v2::animate(void) {
case 1:
animData1->frame = 0;
*(_objects[i].pPosX) +=
- _vm->_scenery->_animations[(int)animData1->animation].layers[animData1->layer]->animDeltaX;
+ _vm->_scenery->_animations[(int)animData1->animation].layers[animData1->layer].animDeltaX;
*(_objects[i].pPosY) +=
- _vm->_scenery->_animations[(int)animData1->animation].layers[animData1->layer]->animDeltaY;
+ _vm->_scenery->_animations[(int)animData1->animation].layers[animData1->layer].animDeltaY;
break;
case 2:
@@ -1352,27 +1319,24 @@ void Mult_v2::animate(void) {
for (i = 0; i < numAnims; i++) {
animObj1 = _renderData2[i];
animData1 = animObj1->pAnimData;
- if ((animData1->isStatic != 0) || (animObj1->lastLeft == -1))
- continue;
-
- for (j = 0; j < numAnims; j++) {
- if (i == j)
- continue;
- animObj2 = _renderData2[j];
- animData2 = animObj2->pAnimData;
- if ((animData2->isStatic != 0) || (animObj2->lastLeft == -1))
- continue;
- if ((animObj2->lastRight >= animObj1->lastLeft) &&
- (animObj2->lastLeft <= animObj1->lastRight) &&
- (animObj2->lastBottom >= animObj1->lastTop) &&
- (animObj2->lastTop <= animObj1->lastBottom))
- animData2->intersected = animIndices[i];
- }
+ if ((animData1->isStatic == 0) && (animObj1->lastLeft != -1))
+ for (j = 0; j < numAnims; j++) {
+ animObj2 = _renderData2[j];
+ animData2 = animObj2->pAnimData;
+ if ((i != j) && (animData2->isStatic == 0) && (animObj2->lastLeft != -1))
+ if ((animObj2->lastRight >= animObj1->lastLeft) &&
+ (animObj2->lastLeft <= animObj1->lastRight) &&
+ (animObj2->lastBottom >= animObj1->lastTop) &&
+ (animObj2->lastTop <= animObj1->lastBottom))
+ animData2->intersected = animIndices[i];
+ }
}
+
}
void Mult_v2::playSound(Snd::SoundDesc * soundDesc, int16 repCount, int16 freq,
int16 channel) {
+// warning("playSound, %d, %d, %d", repCount, freq, channel);
if (soundDesc->frequency >= 0) {
if (soundDesc->frequency == freq)
_vm->_snd->playSample(soundDesc, repCount, -channel);
diff --git a/engines/gob/scenery.cpp b/engines/gob/scenery.cpp
index 8ae63de033..f70259e284 100644
--- a/engines/gob/scenery.cpp
+++ b/engines/gob/scenery.cpp
@@ -374,8 +374,12 @@ int16 Scenery::loadAnim(char search) {
int16 picsCount;
int16 resId;
int16 i;
+ int16 j;
int16 sceneryIndex;
+ int16 framesCount;
char *dataPtr;
+ char *dataPtr2;
+ char *dataPtr3;
Animation *ptr;
int16 offset;
int16 pictDescId;
@@ -425,20 +429,41 @@ int16 Scenery::loadAnim(char search) {
ptr->layersCount = READ_LE_UINT16(dataPtr);
dataPtr += 2;
- ptr->layers = new AnimLayer*[ptr->layersCount];
+ ptr->layers = new AnimLayer[ptr->layersCount];
ptr->pieces = new PieceDesc*[picsCount];
ptr->piecesFromExt = new int8[picsCount];
for (i = 0; i < ptr->layersCount; i++) {
+// ptr->layers[i] = new AnimLayer;
offset = (int16)READ_LE_UINT16(&((int16 *)dataPtr)[i]);
- ptr->layers[i] = (AnimLayer *) (dataPtr + offset - 2);
-
- ptr->layers[i]->unknown0 = (int16)READ_LE_UINT16(&ptr->layers[i]->unknown0);
- ptr->layers[i]->posX = (int16)READ_LE_UINT16(&ptr->layers[i]->posX);
- ptr->layers[i]->posY = (int16)READ_LE_UINT16(&ptr->layers[i]->posY);
- ptr->layers[i]->animDeltaX = (int16)READ_LE_UINT16(&ptr->layers[i]->animDeltaX);
- ptr->layers[i]->animDeltaY = (int16)READ_LE_UINT16(&ptr->layers[i]->animDeltaY);
- ptr->layers[i]->framesCount = (int16)READ_LE_UINT16(&ptr->layers[i]->framesCount);
+ dataPtr2 = dataPtr + offset - 2;
+
+ ptr->layers[i].unknown0 = (int16)READ_LE_UINT16(dataPtr2);
+ ptr->layers[i].posX = (int16)READ_LE_UINT16(dataPtr2 + 2);
+ ptr->layers[i].posY = (int16)READ_LE_UINT16(dataPtr2 + 4);
+ ptr->layers[i].animDeltaX = (int16)READ_LE_UINT16(dataPtr2 + 6);
+ ptr->layers[i].animDeltaY = (int16)READ_LE_UINT16(dataPtr2 + 8);
+ ptr->layers[i].transp = (int8) *(dataPtr2 + 10);
+ ptr->layers[i].framesCount = (int16)READ_LE_UINT16(dataPtr2 + 11);
+ dataPtr2 += 13;
+
+ framesCount = 0;
+ dataPtr3 = dataPtr2;
+ for (j = 0; j < ptr->layers[i].framesCount; j++, framesCount++, dataPtr3 += 5) {
+ while(dataPtr3[4] == 1) {
+ framesCount++;
+ dataPtr3 += 5;
+ }
+ }
+
+ ptr->layers[i].frames = new AnimFramePiece[framesCount];
+ for (j = 0; j < framesCount; j++) {
+ ptr->layers[i].frames[j].pictIndex = *dataPtr2++;
+ ptr->layers[i].frames[j].pieceIndex = *dataPtr2++;
+ ptr->layers[i].frames[j].destX = *dataPtr2++;
+ ptr->layers[i].frames[j].destY = *dataPtr2++;
+ ptr->layers[i].frames[j].notFinal = *dataPtr2++;
+ }
}
for (i = 0; i < picsCount; i++) {
@@ -511,6 +536,9 @@ void Scenery::freeAnim(int16 animation) {
}
}
+
+ for (i = 0; i < _animations[animation].layersCount; i++)
+ delete[] _animations[animation].layers[i].frames;
delete[] _animations[animation].layers;
delete[] _animations[animation].pieces;
delete[] _animations[animation].piecesFromExt;
@@ -531,7 +559,7 @@ void Scenery::interStoreParams(void) {
_vm->_inter->evalExpr(&animation);
_vm->_inter->evalExpr(&layer);
- layerPtr = _animations[animation].layers[layer];
+ layerPtr = &_animations[animation].layers[layer];
var = _vm->_parse->parseVarIndex();
WRITE_VAR_OFFSET(var, layerPtr->animDeltaX);
diff --git a/engines/gob/scenery.h b/engines/gob/scenery.h
index 9e36556aef..8d80c7b800 100644
--- a/engines/gob/scenery.h
+++ b/engines/gob/scenery.h
@@ -68,7 +68,7 @@ public:
int16 animDeltaY;
int8 transp;
int16 framesCount;
- AnimFramePiece frames[1];
+ AnimFramePiece *frames;
} GCC_PACK;
#pragma END_PACK_STRUCTS
@@ -84,7 +84,7 @@ public:
struct Animation {
int16 layersCount;
- AnimLayer **layers;
+ AnimLayer *layers;
PieceDesc **pieces;
int8 *piecesFromExt;
char *dataPtr;
diff --git a/engines/gob/scenery_v1.cpp b/engines/gob/scenery_v1.cpp
index 7904f0e3c4..a46b0faaea 100644
--- a/engines/gob/scenery_v1.cpp
+++ b/engines/gob/scenery_v1.cpp
@@ -43,11 +43,12 @@ void Scenery_v1::updateAnim(int16 layer, int16 frame, int16 animation, int16 fla
int16 drawDeltaX, int16 drawDeltaY, char doDraw) {
AnimLayer *layerPtr;
PieceDesc **pictPtr;
- AnimFramePiece *framePtr;
uint16 pieceIndex;
uint16 pictIndex;
+ int16 curFrame;
+
int16 left;
int16 right;
int16 top;
@@ -65,7 +66,7 @@ void Scenery_v1::updateAnim(int16 layer, int16 frame, int16 animation, int16 fla
if (layer >= _animations[animation].layersCount)
return;
- layerPtr = _animations[animation].layers[layer];
+ layerPtr = &_animations[animation].layers[layer];
if (frame >= layerPtr->framesCount)
return;
@@ -85,11 +86,11 @@ void Scenery_v1::updateAnim(int16 layer, int16 frame, int16 animation, int16 fla
*_pCaptureCounter = *_pCaptureCounter + 1;
}
pictPtr = _animations[animation].pieces;
- framePtr = layerPtr->frames;
+ curFrame = 0;
- for (i = 0; i < frame; i++, framePtr++) {
- while (framePtr->notFinal == 1)
- framePtr++;
+ for (i = 0; i < frame; i++, curFrame++) {
+ while (layerPtr->frames[curFrame].notFinal == 1)
+ curFrame++;
}
if ((flags & 4) == 0) {
@@ -109,15 +110,15 @@ void Scenery_v1::updateAnim(int16 layer, int16 frame, int16 animation, int16 fla
transp = layerPtr->transp ? 3 : 0;
- framePtr--;
+ curFrame--;
do {
- framePtr++;
+ curFrame++;
- pieceIndex = framePtr->pieceIndex;
- pictIndex = framePtr->pictIndex;
+ pieceIndex = layerPtr->frames[curFrame].pieceIndex;
+ pictIndex = layerPtr->frames[curFrame].pictIndex;
- destX = framePtr->destX;
- destY = framePtr->destY;
+ destX = layerPtr->frames[curFrame].destX;
+ destY = layerPtr->frames[curFrame].destY;
highX = pictIndex & 0xc0;
highY = pictIndex & 0x30;
@@ -238,7 +239,7 @@ void Scenery_v1::updateAnim(int16 layer, int16 frame, int16 animation, int16 fla
(int16)(destY + bottom - top));
}
}
- } while (framePtr->notFinal == 1);
+ } while (layerPtr->frames[curFrame].notFinal == 1);
}
} // End of namespace Gob
diff --git a/engines/gob/scenery_v2.cpp b/engines/gob/scenery_v2.cpp
index 4c523522ed..6ceb5a88ae 100644
--- a/engines/gob/scenery_v2.cpp
+++ b/engines/gob/scenery_v2.cpp
@@ -67,7 +67,7 @@ void Scenery_v2::updateAnim(int16 layer, int16 frame, int16 animation, int16 fla
if (layer >= _animations[animation].layersCount)
return;
- layerPtr = _animations[animation].layers[layer];
+ layerPtr = &_animations[animation].layers[layer];
if (frame >= layerPtr->framesCount)
return;