diff options
-rw-r--r-- | engines/gob/inter_playtoons.cpp | 42 |
1 files changed, 38 insertions, 4 deletions
diff --git a/engines/gob/inter_playtoons.cpp b/engines/gob/inter_playtoons.cpp index e262998e22..1d68a27f57 100644 --- a/engines/gob/inter_playtoons.cpp +++ b/engines/gob/inter_playtoons.cpp @@ -316,20 +316,54 @@ void Inter_Playtoons::oPlaytoons_readData(OpFuncParams ¶ms) { void Inter_Playtoons::oPlaytoons_getObjAnimSize() { int16 objIndex; uint16 readVar[4]; - uint8 i; + uint16 types[4]; Mult::Mult_AnimData animData; _vm->_game->_script->evalExpr(&objIndex); - for (i = 0; i < 4; i++) - readVar[i] = _vm->_game->_script->readVarIndex(); + for (int i = 0; i < 4; i++) + readVar[i] = _vm->_game->_script->readVarIndex(0, &types[0]); if (objIndex == -1) { warning("oPlaytoons_getObjAnimSize case -1 not implemented"); return; } + if (objIndex == -2) { - warning("oPlaytoons_getObjAnimSize case -2 not implemented"); + bool doBreak = false; + for (int i = 0; i < 3; i++) + storeValue(readVar[i], types[i], -1); + + for (int i = readValue(readVar[3], types[3]); i < _vm->_mult->_objCount; i++) { + if (_vm->_mult->_objects[i].pAnimData->isStatic != 0) + continue; + + byte *data = (byte *)_vm->_mult->_objects[i].pAnimData; + + for (int j = 1; j < 39; j += 2) { + int32 value1 = READ_VARO_UINT32(readVar[3] + j * 4); + int32 value2 = READ_VARO_UINT32(readVar[3] + (j + 1) * 4); + if (value1 == -1) { + doBreak = true; + break; + } + + if (value1 >= 0) { + if ((int8)data[value1] != value2) + break; + } else { + if ((int8)data[-value1] == value2) + break; + } + + } + + if (doBreak) { + storeValue(readVar[0], types[0], i); + break; + } + } + return; } |