aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/gob/inter.h1
-rw-r--r--engines/gob/inter_playtoons.cpp28
-rw-r--r--engines/gob/inter_v2.cpp78
3 files changed, 66 insertions, 41 deletions
diff --git a/engines/gob/inter.h b/engines/gob/inter.h
index 47b1cd4210..1807dc3ad7 100644
--- a/engines/gob/inter.h
+++ b/engines/gob/inter.h
@@ -587,6 +587,7 @@ protected:
void oPlaytoons_checkData(OpFuncParams &params);
void oPlaytoons_readData(OpFuncParams &params);
+ void oPlaytoons_loadMultObject();
void oPlaytoons_getObjAnimSize();
void oPlaytoons_CD_20_23();
void oPlaytoons_CD_25();
diff --git a/engines/gob/inter_playtoons.cpp b/engines/gob/inter_playtoons.cpp
index 1d68a27f57..9903c16ec4 100644
--- a/engines/gob/inter_playtoons.cpp
+++ b/engines/gob/inter_playtoons.cpp
@@ -73,6 +73,7 @@ void Inter_Playtoons::setupOpcodesDraw() {
CLEAROPCODEDRAW(0x22);
CLEAROPCODEDRAW(0x24);
+ OPCODEDRAW(0x17, oPlaytoons_loadMultObject);
OPCODEDRAW(0x19, oPlaytoons_getObjAnimSize);
OPCODEDRAW(0x20, oPlaytoons_CD_20_23);
OPCODEDRAW(0x23, oPlaytoons_CD_20_23);
@@ -313,6 +314,33 @@ void Inter_Playtoons::oPlaytoons_readData(OpFuncParams &params) {
delete stream;
}
+void Inter_Playtoons::oPlaytoons_loadMultObject() {
+ assert(_vm->_mult->_objects);
+
+ uint16 objIndex = _vm->_game->_script->readValExpr();
+
+ debugC(4, kDebugGameFlow, "Loading mult object %d", objIndex);
+
+ Mult::Mult_Object &obj = _vm->_mult->_objects[objIndex];
+ Mult::Mult_AnimData &objAnim = *(obj.pAnimData);
+
+ *obj.pPosX = _vm->_game->_script->readValExpr();
+ *obj.pPosY = _vm->_game->_script->readValExpr();
+
+ byte *multData = (byte *) &objAnim;
+ for (int i = 0; i < 11; i++) {
+ if (_vm->_game->_script->peekByte() != 99)
+ multData[i] = _vm->_game->_script->readValExpr();
+ else
+ _vm->_game->_script->skip(1);
+ }
+
+ if (((int32)*obj.pPosX != -1234) || ((int32)*obj.pPosY == -4321))
+ return;
+
+ warning("Stub: oPlaytoons_loadMultObject: pPosX == -1234, pPosY == -4321");
+}
+
void Inter_Playtoons::oPlaytoons_getObjAnimSize() {
int16 objIndex;
uint16 readVar[4];
diff --git a/engines/gob/inter_v2.cpp b/engines/gob/inter_v2.cpp
index da8ffafbf4..bb27dd0888 100644
--- a/engines/gob/inter_v2.cpp
+++ b/engines/gob/inter_v2.cpp
@@ -397,21 +397,17 @@ void Inter_v2::o2_initMult() {
void Inter_v2::o2_loadMultObject() {
assert(_vm->_mult->_objects);
- int16 val;
- int16 objIndex;
- int16 animation;
- int16 layer;
- byte *multData;
-
- objIndex = _vm->_game->_script->readValExpr();
- val = _vm->_game->_script->readValExpr();
- *_vm->_mult->_objects[objIndex].pPosX = val;
- val = _vm->_game->_script->readValExpr();
- *_vm->_mult->_objects[objIndex].pPosY = val;
+ uint16 objIndex = _vm->_game->_script->readValExpr();
debugC(4, kDebugGameFlow, "Loading mult object %d", objIndex);
- multData = (byte *)_vm->_mult->_objects[objIndex].pAnimData;
+ Mult::Mult_Object &obj = _vm->_mult->_objects[objIndex];
+ Mult::Mult_AnimData &objAnim = *(obj.pAnimData);
+
+ *obj.pPosX = _vm->_game->_script->readValExpr();
+ *obj.pPosY = _vm->_game->_script->readValExpr();
+
+ byte *multData = (byte *) &objAnim;
for (int i = 0; i < 11; i++) {
if (_vm->_game->_script->peekByte() != 99)
multData[i] = _vm->_game->_script->readValExpr();
@@ -419,33 +415,32 @@ void Inter_v2::o2_loadMultObject() {
_vm->_game->_script->skip(1);
}
- Mult::Mult_Object &obj = _vm->_mult->_objects[objIndex];
- Mult::Mult_AnimData &objAnim = *(obj.pAnimData);
-
if ((objAnim.animType == 100) && (objIndex < _vm->_goblin->_gobsCount)) {
- val = *(obj.pPosX) % 256;
- obj.destX = val;
- obj.gobDestX = val;
- obj.goblinX = val;
+ uint8 posX = *(obj.pPosX) % 256;
+ obj.destX = posX;
+ obj.gobDestX = posX;
+ obj.goblinX = posX;
- val = *(obj.pPosY) % 256;
- obj.destY = val;
- obj.gobDestY = val;
- obj.goblinY = val;
+ uint8 posY = *(obj.pPosY) % 256;
+ obj.destY = posY;
+ obj.gobDestY = posY;
+ obj.goblinY = posY;
*(obj.pPosX) *= _vm->_map->getTilesWidth();
- layer = objAnim.layer;
- animation = obj.goblinStates[layer][0].animation;
- objAnim.framesLeft = objAnim.maxFrame;
- objAnim.nextState = -1;
- objAnim.newState = -1;
+ int16 layer = objAnim.layer;
+ int16 animation = obj.goblinStates[layer][0].animation;
+
+ objAnim.framesLeft = objAnim.maxFrame;
+ objAnim.nextState = -1;
+ objAnim.newState = -1;
objAnim.pathExistence = 0;
- objAnim.isBusy = 0;
- objAnim.state = layer;
- objAnim.layer = obj.goblinStates[objAnim.state][0].layer;
- objAnim.animation = animation;
+ objAnim.isBusy = 0;
+ objAnim.state = layer;
+ objAnim.layer = obj.goblinStates[objAnim.state][0].layer;
+ objAnim.animation = animation;
+
_vm->_scenery->updateAnim(layer, 0, animation, 0,
*(obj.pPosX), *(obj.pPosY), 0);
@@ -460,12 +455,13 @@ void Inter_v2::o2_loadMultObject() {
} else if ((objAnim.animType == 101) && (objIndex < _vm->_goblin->_gobsCount)) {
- layer = objAnim.layer;
- animation = obj.goblinStates[layer][0].animation;
+ int16 layer = objAnim.layer;
+ int16 animation = obj.goblinStates[layer][0].animation;
+
objAnim.nextState = -1;
- objAnim.newState = -1;
- objAnim.state = layer;
- objAnim.layer = obj.goblinStates[objAnim.state][0].layer;
+ objAnim.newState = -1;
+ objAnim.state = layer;
+ objAnim.layer = obj.goblinStates[objAnim.state][0].layer;
objAnim.animation = animation;
if ((*(obj.pPosX) == 1000) && (*(obj.pPosY) == 1000)) {
@@ -485,11 +481,11 @@ void Inter_v2::o2_loadMultObject() {
if (obj.videoSlot > 0)
_vm->_vidPlayer->closeVideo(obj.videoSlot - 1);
- obj.videoSlot = 0;
- obj.lastLeft = -1;
- obj.lastTop = -1;
+ obj.videoSlot = 0;
+ obj.lastLeft = -1;
+ obj.lastTop = -1;
obj.lastBottom = -1;
- obj.lastRight = -1;
+ obj.lastRight = -1;
}
}