diff options
author | Sven Hesse | 2009-08-24 22:37:09 +0000 |
---|---|---|
committer | Sven Hesse | 2009-08-24 22:37:09 +0000 |
commit | 081fa85b140b3175f035a74a4fcced59539fea1d (patch) | |
tree | 6f877c49ee4ba55ab3c5fa0f53251dabf08e18bb /engines/gob/inter_v1.cpp | |
parent | cb202830267b52db4032abccf8e8f9af7c6dd245 (diff) | |
download | scummvm-rg350-081fa85b140b3175f035a74a4fcced59539fea1d.tar.gz scummvm-rg350-081fa85b140b3175f035a74a4fcced59539fea1d.tar.bz2 scummvm-rg350-081fa85b140b3175f035a74a4fcced59539fea1d.zip |
Playtoons uses a variable space that exceeds 32767 bytes. Changing a few variables to unsigned makes the construction mode not crash anymore (though it now hangs in a loop)
svn-id: r43713
Diffstat (limited to 'engines/gob/inter_v1.cpp')
-rw-r--r-- | engines/gob/inter_v1.cpp | 42 |
1 files changed, 28 insertions, 14 deletions
diff --git a/engines/gob/inter_v1.cpp b/engines/gob/inter_v1.cpp index 446d86643d..d3bd11ab75 100644 --- a/engines/gob/inter_v1.cpp +++ b/engines/gob/inter_v1.cpp @@ -306,8 +306,8 @@ void Inter_v1::o1_initCursor() { int16 height; int16 count; - _vm->_draw->_cursorHotspotXVar = _vm->_game->_script->readVarIndex() / 4; - _vm->_draw->_cursorHotspotYVar = _vm->_game->_script->readVarIndex() / 4; + _vm->_draw->_cursorHotspotXVar = ((uint16) _vm->_game->_script->readVarIndex()) / 4; + _vm->_draw->_cursorHotspotYVar = ((uint16) _vm->_game->_script->readVarIndex()) / 4; width = _vm->_game->_script->readInt16(); if (width < 16) @@ -561,18 +561,32 @@ void Inter_v1::o1_getObjAnimSize() { _vm->_game->_script->evalExpr(&objIndex); - Mult::Mult_AnimData &animData = *(_vm->_mult->_objects[objIndex].pAnimData); - if (animData.isStatic == 0) - _vm->_scenery->updateAnim(animData.layer, animData.frame, - animData.animation, 0, *(_vm->_mult->_objects[objIndex].pPosX), - *(_vm->_mult->_objects[objIndex].pPosY), 0); - - _vm->_scenery->_toRedrawLeft = MAX(_vm->_scenery->_toRedrawLeft, (int16) 0); - _vm->_scenery->_toRedrawTop = MAX(_vm->_scenery->_toRedrawTop, (int16) 0); - WRITE_VAR_OFFSET(_vm->_game->_script->readVarIndex(), _vm->_scenery->_toRedrawLeft); - WRITE_VAR_OFFSET(_vm->_game->_script->readVarIndex(), _vm->_scenery->_toRedrawTop); - WRITE_VAR_OFFSET(_vm->_game->_script->readVarIndex(), _vm->_scenery->_toRedrawRight); - WRITE_VAR_OFFSET(_vm->_game->_script->readVarIndex(), _vm->_scenery->_toRedrawBottom); + uint16 varLeft = _vm->_game->_script->readVarIndex(); + uint16 varTop = _vm->_game->_script->readVarIndex(); + uint16 varRight = _vm->_game->_script->readVarIndex(); + uint16 varBottom = _vm->_game->_script->readVarIndex(); + + if ((objIndex < 0) || (objIndex >= _vm->_mult->_objCount)) { + warning("o1_getObjAnimSize(): objIndex = %d (%d)", objIndex, _vm->_mult->_objCount); + _vm->_scenery->_toRedrawLeft = 0; + _vm->_scenery->_toRedrawTop = 0; + _vm->_scenery->_toRedrawRight = 0; + _vm->_scenery->_toRedrawBottom = 0; + } else { + Mult::Mult_AnimData &animData = *(_vm->_mult->_objects[objIndex].pAnimData); + if (animData.isStatic == 0) + _vm->_scenery->updateAnim(animData.layer, animData.frame, + animData.animation, 0, *(_vm->_mult->_objects[objIndex].pPosX), + *(_vm->_mult->_objects[objIndex].pPosY), 0); + + _vm->_scenery->_toRedrawLeft = MAX<int16>(_vm->_scenery->_toRedrawLeft, 0); + _vm->_scenery->_toRedrawTop = MAX<int16>(_vm->_scenery->_toRedrawTop , 0); + } + + WRITE_VAR_OFFSET(varLeft , _vm->_scenery->_toRedrawLeft); + WRITE_VAR_OFFSET(varTop , _vm->_scenery->_toRedrawTop); + WRITE_VAR_OFFSET(varRight , _vm->_scenery->_toRedrawRight); + WRITE_VAR_OFFSET(varBottom, _vm->_scenery->_toRedrawBottom); } void Inter_v1::o1_loadStatic() { |