[Scummvm-cvs-logs] SF.net SVN: scummvm: [23346] scummvm/trunk/engines/gob

drmccoy at users.sourceforge.net drmccoy at users.sourceforge.net
Thu Jun 29 14:56:09 CEST 2006


Revision: 23346
Author:   drmccoy
Date:     2006-06-29 05:55:57 -0700 (Thu, 29 Jun 2006)
ViewCVS:  http://svn.sourceforge.net/scummvm/?rev=23346&view=rev

Log Message:
-----------
- Renamed a few mult-variables to something more fitting
- Fixed a small mistake, making the entering animation work
- Correcting Game_v2::playTot() so that the loading screen is shown
- Updated most of the collisions stuff, the objects names hint stuff works now

Modified Paths:
--------------
    scummvm/trunk/engines/gob/game.cpp
    scummvm/trunk/engines/gob/game.h
    scummvm/trunk/engines/gob/game_v1.cpp
    scummvm/trunk/engines/gob/game_v2.cpp
    scummvm/trunk/engines/gob/inter.cpp
    scummvm/trunk/engines/gob/inter.h
    scummvm/trunk/engines/gob/inter_v2.cpp
    scummvm/trunk/engines/gob/mult.h
    scummvm/trunk/engines/gob/mult_v2.cpp
Modified: scummvm/trunk/engines/gob/game.cpp
===================================================================
--- scummvm/trunk/engines/gob/game.cpp	2006-06-29 12:32:37 UTC (rev 23345)
+++ scummvm/trunk/engines/gob/game.cpp	2006-06-29 12:55:57 UTC (rev 23346)
@@ -250,65 +250,6 @@
 	}
 }
 
-int16 Game::checkMousePoint(int16 all, int16 *resId, int16 *resIndex) {
-	Collision *ptr;
-	int16 i;
-
-	if (resId != 0)
-		*resId = 0;
-
-	*resIndex = 0;
-
-	ptr = _collisionAreas;
-	for (i = 0; ptr->left != -1; ptr++, i++) {
-		if (all) {
-			if ((ptr->flags & 0xf) > 1)
-				continue;
-
-			if ((ptr->flags & 0xff00) != 0)
-				continue;
-
-			if (_vm->_global->_inter_mouseX < ptr->left
-			    || _vm->_global->_inter_mouseX > ptr->right
-			    || _vm->_global->_inter_mouseY < ptr->top
-			    || _vm->_global->_inter_mouseY > ptr->bottom)
-				continue;
-
-			if (resId != 0)
-				*resId = ptr->id;
-
-			*resIndex = i;
-			return ptr->key;
-		} else {
-			if ((ptr->flags & 0xff00) != 0)
-				continue;
-
-			if ((ptr->flags & 0xf) != 1 && (ptr->flags & 0xf) != 2)
-				continue;
-
-			if ((ptr->flags & 0xf0) >> 4 != _mouseButtons - 1
-			    && (ptr->flags & 0xf0) >> 4 != 2)
-				continue;
-
-			if (_vm->_global->_inter_mouseX < ptr->left
-			    || _vm->_global->_inter_mouseX > ptr->right
-			    || _vm->_global->_inter_mouseY < ptr->top
-			    || _vm->_global->_inter_mouseY > ptr->bottom)
-				continue;
-
-			if (resId != 0)
-				*resId = ptr->id;
-			*resIndex = i;
-			return ptr->key;
-		}
-	}
-
-	if (_mouseButtons != 1 && all == 0)
-		return 0x11b;
-
-	return 0;
-}
-
 void Game::capturePush(int16 left, int16 top, int16 width, int16 height) {
 	int16 right;
 
@@ -654,169 +595,6 @@
 	}
 }
 
-int16 Game::multiEdit(int16 time, int16 index, int16 *pCurPos, InputDesc * inpDesc) {
-	Collision *collArea;
-	int16 descInd;
-	int16 key;
-	int16 found = -1;
-	int16 i;
-
-	descInd = 0;
-	for (i = 0; i < 250; i++) {
-		collArea = &_collisionAreas[i];
-
-		if (collArea->left == -1)
-			continue;
-
-		if ((collArea->id & 0x8000) == 0)
-			continue;
-
-		if ((collArea->flags & 0x0f) < 3)
-			continue;
-
-		if ((collArea->flags & 0x0f) > 10)
-			continue;
-
-		strcpy(_tempStr, _vm->_global->_inter_variables + collArea->key);
-
-		_vm->_draw->_destSpriteX = collArea->left;
-		_vm->_draw->_destSpriteY = collArea->top;
-		_vm->_draw->_spriteRight = collArea->right - collArea->left + 1;
-		_vm->_draw->_spriteBottom = collArea->bottom - collArea->top + 1;
-
-		_vm->_draw->_destSurface = 21;
-
-		_vm->_draw->_backColor = inpDesc[descInd].backColor;
-		_vm->_draw->_frontColor = inpDesc[descInd].frontColor;
-		_vm->_draw->_textToPrint = _tempStr;
-		_vm->_draw->_transparency = 1;
-		_vm->_draw->_fontIndex = inpDesc[descInd].fontIndex;
-		_vm->_draw->spriteOperation(DRAW_FILLRECT);
-		_vm->_draw->_destSpriteY +=
-		    ((collArea->bottom - collArea->top + 1) - 8) / 2;
-
-		_vm->_draw->spriteOperation(DRAW_PRINTTEXT);
-		descInd++;
-	}
-
-	for (i = 0; i < 40; i++) {
-		WRITE_VAR_OFFSET(i * 4 + 0x44, 0);
-	}
-
-	while (1) {
-		descInd = 0;
-
-		for (i = 0; i < 250; i++) {
-			collArea = &_collisionAreas[i];
-
-			if (collArea->left == -1)
-				continue;
-
-			if ((collArea->id & 0x8000) == 0)
-				continue;
-
-			if ((collArea->flags & 0x0f) < 3)
-				continue;
-
-			if ((collArea->flags & 0x0f) > 10)
-				continue;
-
-			if (descInd == *pCurPos) {
-				found = i;
-				break;
-			}
-
-			descInd++;
-		}
-
-		assert(found != -1);
-
-		collArea = &_collisionAreas[found];
-
-		key = inputArea(collArea->left, collArea->top,
-		    collArea->right - collArea->left + 1,
-		    collArea->bottom - collArea->top + 1,
-		    inpDesc[*pCurPos].backColor, inpDesc[*pCurPos].frontColor,
-		    _vm->_global->_inter_variables + collArea->key,
-		    inpDesc[*pCurPos].fontIndex, collArea->flags, &time);
-
-		if (_vm->_inter->_terminate)
-			return 0;
-
-		switch (key) {
-		case 0:
-			if (_activeCollResId == 0)
-				return 0;
-
-			if ((_collisionAreas[_activeCollIndex].
-				flags & 0x0f) < 3)
-				return 0;
-
-			if ((_collisionAreas[_activeCollIndex].
-				flags & 0x0f) > 10)
-				return 0;
-
-			*pCurPos = 0;
-			for (i = 0; i < 250; i++) {
-				collArea = &_collisionAreas[i];
-
-				if (collArea->left == -1)
-					continue;
-
-				if ((collArea->id & 0x8000) == 0)
-					continue;
-
-				if ((collArea->flags & 0x0f) < 3)
-					continue;
-
-				if ((collArea->flags & 0x0f) > 10)
-					continue;
-
-				if (i == _activeCollIndex)
-					break;
-
-				pCurPos[0]++;
-			}
-			break;
-
-		case 0x3b00:
-		case 0x3c00:
-		case 0x3d00:
-		case 0x3e00:
-		case 0x3f00:
-		case 0x4000:
-		case 0x4100:
-		case 0x4200:
-		case 0x4300:
-		case 0x4400:
-			return key;
-
-		case 0x1c0d:
-
-			if (index == 1)
-				return key;
-
-			if (*pCurPos == index - 1) {
-				*pCurPos = 0;
-				break;
-			}
-
-			pCurPos[0]++;
-			break;
-
-		case 0x5000:
-			if (index - 1 > *pCurPos)
-				pCurPos[0]++;
-			break;
-
-		case 0x4800:
-			if (*pCurPos > 0)
-				pCurPos[0]--;
-			break;
-		}
-	}
-}
-
 int16 Game::adjustKey(int16 key) {
 	if (key <= 0x60 || key >= 0x7b)
 		return key;
@@ -824,522 +602,6 @@
 	return key - 0x20;
 }
 
-void Game::collisionsBlock(void) {
-	InputDesc descArray[20];
-	int16 array[250];
-	char count;
-	int16 collResId;
-	char *startIP;
-	int16 curCmd;
-	int16 cmd;
-	int16 cmdHigh;
-	int16 key;
-	int16 flags;
-	int16 left;
-	int16 top;
-	int16 width;
-	int16 height;
-	int16 var_22;
-	int16 index;
-	int16 curEditIndex;
-	int16 deltaTime;
-	int16 descIndex2;
-	int16 stackPos2;
-	int16 descIndex;
-	int16 timeVal;
-	char *str;
-	int16 savedCollStackSize;
-	int16 i;
-	int16 counter;
-	int16 var_24;
-	int16 var_26;
-	int16 _collStackPos;
-	Collision *collPtr;
-	int16 timeKey;
-	char *savedIP;
-
-	if (_shouldPushColls)
-		pushCollisions(1);
-
-	collResId = -1;
-	_vm->_global->_inter_execPtr++;
-	count = *_vm->_global->_inter_execPtr++;
-	_handleMouse = _vm->_global->_inter_execPtr[0];
-	deltaTime = 1000 * (byte)_vm->_global->_inter_execPtr[1];
-	descIndex2 = (byte)_vm->_global->_inter_execPtr[2];
-	stackPos2 = (byte)_vm->_global->_inter_execPtr[3];
-	descIndex = (byte)_vm->_global->_inter_execPtr[4];
-
-	if (stackPos2 != 0 || descIndex != 0)
-		deltaTime /= 100;
-
-	timeVal = deltaTime;
-	_vm->_global->_inter_execPtr += 6;
-
-	startIP = _vm->_global->_inter_execPtr;
-	WRITE_VAR(16, 0);
-	var_22 = 0;
-	index = 0;
-	curEditIndex = 0;
-
-	for (curCmd = 0; curCmd < count; curCmd++) {
-		array[curCmd] = 0;
-		cmd = *_vm->_global->_inter_execPtr++;
-
-		if ((cmd & 0x40) != 0) {
-			cmd -= 0x40;
-			cmdHigh = (byte)*_vm->_global->_inter_execPtr;
-			_vm->_global->_inter_execPtr++;
-			cmdHigh <<= 8;
-		} else {
-			cmdHigh = 0;
-		}
-
-		if ((cmd & 0x80) != 0) {
-			left = _vm->_parse->parseValExpr();
-			top = _vm->_parse->parseValExpr();
-			width = _vm->_parse->parseValExpr();
-			height = _vm->_parse->parseValExpr();
-		} else {
-			left = _vm->_inter->load16();
-			top = _vm->_inter->load16();
-			width = _vm->_inter->load16();
-			height = _vm->_inter->load16();
-		}
-		cmd &= 0x7f;
-
-		debugC(1, DEBUG_COLLISIONS, "collisionsBlock(%d)", cmd);
-
-		switch (cmd) {
-		case 3:
-		case 4:
-		case 5:
-		case 6:
-		case 7:
-		case 8:
-		case 9:
-		case 10:
-
-			_vm->_util->waitKey();
-			var_22 = 1;
-			key = _vm->_parse->parseVarIndex();
-			descArray[index].fontIndex = _vm->_inter->load16();
-			descArray[index].backColor = *_vm->_global->_inter_execPtr++;
-			descArray[index].frontColor = *_vm->_global->_inter_execPtr++;
-
-			if (cmd < 5 || cmd > 8) {
-				descArray[index].ptr = 0;
-			} else {
-				descArray[index].ptr = _vm->_global->_inter_execPtr + 2;
-				_vm->_global->_inter_execPtr += _vm->_inter->load16();
-			}
-
-			if (left == -1)
-				break;
-
-			if ((cmd & 1) == 0) {
-				addNewCollision(curCmd + 0x8000, left,
-				    top,
-				    left +
-				    width *
-				    _vm->_draw->_fonts[descArray[index].fontIndex]->
-				    itemWidth - 1, top + height - 1, cmd, key,
-				    0,
-				    _vm->_global->_inter_execPtr - (char *)_totFileData);
-
-				_vm->_global->_inter_execPtr += 2;
-				_vm->_global->_inter_execPtr += READ_LE_UINT16(_vm->_global->_inter_execPtr);
-			} else {
-				addNewCollision(curCmd + 0x8000, left,
-				    top,
-				    left +
-				    width *
-				    _vm->_draw->_fonts[descArray[index].fontIndex]->
-				    itemWidth - 1, top + height - 1, cmd, key,
-				    0, 0);
-			}
-			index++;
-			break;
-
-		case 21:
-			key = _vm->_inter->load16();
-			array[curCmd] = _vm->_inter->load16();
-			flags = _vm->_inter->load16() & 3;
-
-			addNewCollision(curCmd + 0x8000, left, top,
-			    left + width - 1,
-			    top + height - 1,
-			    (flags << 4) + cmdHigh + 2, key,
-			    _vm->_global->_inter_execPtr - (char *)_totFileData, 0);
-
-			_vm->_global->_inter_execPtr += 2;
-			_vm->_global->_inter_execPtr += READ_LE_UINT16(_vm->_global->_inter_execPtr);
-			break;
-
-		case 20:
-			collResId = curCmd;
-			// Fall through to case 2
-
-		case 2:
-			key = _vm->_inter->load16();
-			array[curCmd] = _vm->_inter->load16();
-			flags = _vm->_inter->load16() & 3;
-
-			addNewCollision(curCmd + 0x8000, left, top,
-			    left + width - 1,
-			    top + height - 1,
-			    (flags << 4) + cmdHigh + 2, key, 0,
-			    _vm->_global->_inter_execPtr - (char *)_totFileData);
-
-			_vm->_global->_inter_execPtr += 2;
-			_vm->_global->_inter_execPtr += READ_LE_UINT16(_vm->_global->_inter_execPtr);
-			break;
-
-		case 0:
-			_vm->_global->_inter_execPtr += 6;
-			startIP = _vm->_global->_inter_execPtr;
-			_vm->_global->_inter_execPtr += 2;
-			_vm->_global->_inter_execPtr += READ_LE_UINT16(_vm->_global->_inter_execPtr);
-			key = curCmd + 0xA000;
-
-			addNewCollision(curCmd + 0x8000, left, top,
-			    left + width - 1,
-			    top + height - 1,
-			    cmd + cmdHigh, key,
-			    startIP - (char *)_totFileData,
-			    _vm->_global->_inter_execPtr - (char *)_totFileData);
-
-			_vm->_global->_inter_execPtr += 2;
-			_vm->_global->_inter_execPtr += READ_LE_UINT16(_vm->_global->_inter_execPtr);
-			break;
-
-		case 1:
-			key = _vm->_inter->load16();
-			array[curCmd] = _vm->_inter->load16();
-			flags = _vm->_inter->load16() & 3;
-
-			startIP = _vm->_global->_inter_execPtr;
-			_vm->_global->_inter_execPtr += 2;
-			_vm->_global->_inter_execPtr += READ_LE_UINT16(_vm->_global->_inter_execPtr);
-			if (key == 0)
-				key = curCmd + 0xa000;
-
-			addNewCollision(curCmd + 0x8000, left, top,
-			    left + width - 1,
-			    top + height - 1,
-			    (flags << 4) + cmd + cmdHigh, key,
-			    startIP - (char *)_totFileData,
-			    _vm->_global->_inter_execPtr - (char *)_totFileData);
-
-			_vm->_global->_inter_execPtr += 2;
-			_vm->_global->_inter_execPtr += READ_LE_UINT16(_vm->_global->_inter_execPtr);
-			break;
-		}
-	}
-
-	_forceHandleMouse = 0;
-	_vm->_util->waitKey();
-
-	do {
-		if (var_22 != 0) {
-			key =
-			    multiEdit(deltaTime, index, &curEditIndex,
-			    descArray);
-
-			if (key == 0x1c0d) {
-				for (i = 0; i < 250; i++) {
-					if (_collisionAreas[i].left == -1)
-						continue;
-
-					if ((_collisionAreas[i].id & 0x8000) == 0)
-						continue;
-
-					if ((_collisionAreas[i].flags & 1) != 0)
-						continue;
-
-					if ((_collisionAreas[i].flags & 0x0f) <= 2)
-						continue;
-
-					collResId = _collisionAreas[i].id;
-					_activeCollResId = collResId;
-					collResId &= 0x7fff;
-					_activeCollIndex = i;
-					break;
-				}
-				break;
-			}
-		} else {
-			key =
-			    checkCollisions(_handleMouse, -deltaTime,
-			    &_activeCollResId, &_activeCollIndex);
-		}
-
-		if ((key & 0xff) >= ' ' && (key & 0xff) <= 0xff &&
-		    (key >> 8) > 1 && (key >> 8) < 12) {
-			key = '0' + (((key >> 8) - 1) % 10) + (key & 0xff00);
-		}
-
-		if (_activeCollResId == 0) {
-			if (key != 0) {
-				for (i = 0; i < 250; i++) {
-					if (_collisionAreas[i].left == -1)
-						continue;
-
-					if ((_collisionAreas[i].
-						id & 0x8000) == 0)
-						continue;
-
-					if (_collisionAreas[i].key == key
-					    || _collisionAreas[i].key ==
-					    0x7fff) {
-
-						_activeCollResId =
-						    _collisionAreas[i].id;
-						_activeCollIndex = i;
-						break;
-					}
-				}
-
-				if (_activeCollResId == 0) {
-					for (i = 0; i < 250; i++) {
-						if (_collisionAreas[i].left == -1)
-							continue;
-
-						if ((_collisionAreas[i].id & 0x8000) == 0)
-							continue;
-
-						if ((_collisionAreas[i].key & 0xff00) != 0)
-							continue;
-
-						if (_collisionAreas[i].key == 0)
-							continue;
-
-						if (adjustKey(key & 0xff) == adjustKey(_collisionAreas[i].key) || _collisionAreas[i].key == 0x7fff) {
-							_activeCollResId = _collisionAreas[i].id;
-							_activeCollIndex = i;
-							break;
-						}
-					}
-				}
-			} else {
-
-				if (deltaTime != 0 && VAR(16) == 0) {
-					if (stackPos2 != 0) {
-						_collStackPos = 0;
-						collPtr = _collisionAreas;
-
-						for (i = 0, collPtr = _collisionAreas; collPtr->left != -1; i++, collPtr++) {
-							if ((collPtr->id & 0x8000) == 0)
-								continue;
-
-							_collStackPos++;
-							if (_collStackPos != stackPos2)
-								continue;
-
-							_activeCollResId = collPtr->id;
-							_activeCollIndex = i;
-							WRITE_VAR(2, _vm->_global->_inter_mouseX);
-							WRITE_VAR(3, _vm->_global->_inter_mouseY);
-							WRITE_VAR(4, _mouseButtons);
-							WRITE_VAR(16, array[(uint16)_activeCollResId & ~0x8000]);
-
-							if (collPtr->funcLeave != 0) {
-								timeKey = _vm->_util->getTimeKey();
-								savedIP = _vm->_global->_inter_execPtr;
-								_vm->_global->_inter_execPtr = (char *)_totFileData + collPtr->funcLeave;
-								_shouldPushColls = 1;
-								savedCollStackSize = _collStackSize;
-								_vm->_inter->funcBlock(0);
-
-								if (savedCollStackSize != _collStackSize)
-									popCollisions();
-
-								_shouldPushColls = 0;
-								_vm->_global->_inter_execPtr = savedIP;
-								deltaTime = timeVal - (_vm->_util->getTimeKey() - timeKey);
-
-								if (deltaTime < 2)
-									deltaTime = 2;
-							}
-
-							if (VAR(16) == 0)
-								_activeCollResId = 0;
-							break;
-						}
-					} else {
-						if (descIndex != 0) {
-							counter = 0;
-							for (i = 0; i < 250; i++) {
-								if (_collisionAreas[i].left == -1)
-									continue;
-
-								if ((_collisionAreas[i].id & 0x8000) == 0)
-									continue;
-
-								counter++;
-								if (counter != descIndex)
-									continue;
-
-								_activeCollResId = _collisionAreas[i].id;
-								_activeCollIndex = i;
-								break;
-							}
-						} else {
-							for (i = 0; i < 250; i++) {
-								if (_collisionAreas[i].left == -1)
-									continue;
-
-								if ((_collisionAreas[i].id & 0x8000) == 0)
-									continue;
-
-								_activeCollResId = _collisionAreas[i].id;
-								_activeCollIndex = i;
-								break;
-							}
-						}
-					}
-				} else {
-					if (descIndex2 != 0) {
-						counter = 0;
-						for (i = 0; i < 250; i++) {
-							if (_collisionAreas[i].left == -1)
-								continue;
-
-							if ((_collisionAreas[i].id & 0x8000) == 0)
-								continue;
-
-							counter++;
-							if (counter != descIndex2)
-								continue;
-
-							_activeCollResId = _collisionAreas[i].id;
-							_activeCollIndex = i;
-							break;
-						}
-					}
-				}
-			}
-		}
-
-		if (_activeCollResId == 0)
-			continue;
-
-		if (_collisionAreas[_activeCollIndex].funcLeave != 0)
-			continue;
-
-		WRITE_VAR(2, _vm->_global->_inter_mouseX);
-		WRITE_VAR(3, _vm->_global->_inter_mouseY);
-		WRITE_VAR(4, _mouseButtons);
-		WRITE_VAR(16, array[(uint16)_activeCollResId & ~0x8000]);
-
-		if (_collisionAreas[_activeCollIndex].funcEnter != 0) {
-			savedIP = _vm->_global->_inter_execPtr;
-			_vm->_global->_inter_execPtr = (char *)_totFileData +
-			    _collisionAreas[_activeCollIndex].
-			    funcEnter;
-
-			_shouldPushColls = 1;
-
-			_collStackPos = _collStackSize;
-			_vm->_inter->funcBlock(0);
-			if (_collStackPos != _collStackSize)
-				popCollisions();
-			_shouldPushColls = 0;
-			_vm->_global->_inter_execPtr = savedIP;
-		}
-
-		WRITE_VAR(16, 0);
-		_activeCollResId = 0;
-	}
-	while (_activeCollResId == 0 && !_vm->_inter->_terminate && !_vm->_quitRequested);
-
-	if (((uint16)_activeCollResId & ~0x8000) == collResId) {
-		_collStackPos = 0;
-		var_24 = 0;
-		var_26 = 1;
-		for (i = 0; i < 250; i++) {
-			if (_collisionAreas[i].left == -1)
-				continue;
-
-			if ((_collisionAreas[i].id & 0x8000) == 0)
-				continue;
-
-			if ((_collisionAreas[i].flags & 0x0f) < 3)
-				continue;
-
-			if ((_collisionAreas[i].flags & 0x0f) > 10)
-				continue;
-
-			if ((_collisionAreas[i].flags & 0x0f) > 8) {
-				char *ptr;
-				strcpy(_tempStr,
-				    _vm->_global->_inter_variables + _collisionAreas[i].key);
-				while ((ptr = strchr(_tempStr, ' ')) != 0) {
-					_vm->_util->cutFromStr(_tempStr, (ptr - _tempStr), 1);
-					ptr = strchr(_tempStr, ' ');
-				}
-				strcpy(_vm->_global->_inter_variables + _collisionAreas[i].key, _tempStr);
-			}
-
-			if ((_collisionAreas[i].flags & 0x0f) >= 5 &&
-			    (_collisionAreas[i].flags & 0x0f) <= 8) {
-				str = descArray[var_24].ptr;
-
-				strcpy(_tempStr, _vm->_global->_inter_variables + _collisionAreas[i].key);
-
-				if ((_collisionAreas[i].flags & 0x0f) < 7)
-					_vm->_util->prepareStr(_tempStr);
-
-				int16 pos = 0;
-				do {
-					strcpy(_collStr, str);
-					pos += strlen(str) + 1;
-
-					str += strlen(str) + 1;
-
-					if ((_collisionAreas[i].flags & 0x0f) < 7)
-						_vm->_util->prepareStr(_collStr);
-
-					if (strcmp(_tempStr, _collStr) == 0) {
-						VAR(17)++;
-						WRITE_VAR(17 + var_26, 1);
-						break;
-					}
-				} while (READ_LE_UINT16(descArray[var_24].ptr - 2) > pos);
-				_collStackPos++;
-			} else {
-				VAR(17 + var_26) = 2;
-			}
-			var_24++;
-			var_26++;
-		}
-
-		if (_collStackPos != (int16)VAR(17))
-			WRITE_VAR(17, 0);
-		else
-			WRITE_VAR(17, 1);
-	}
-
-	savedIP = 0;
-	if (!_vm->_inter->_terminate) {
-		savedIP = (char *)_totFileData +
-		    _collisionAreas[_activeCollIndex].funcLeave;
-
-		WRITE_VAR(2, _vm->_global->_inter_mouseX);
-		WRITE_VAR(3, _vm->_global->_inter_mouseY);
-		WRITE_VAR(4, _mouseButtons);
-
-		if (VAR(16) == 0) {
-			WRITE_VAR(16, array[(uint16)_activeCollResId & ~0x8000]);
-		}
-	}
-
-	for (curCmd = 0; curCmd < count; curCmd++) {
-		freeCollision(curCmd + 0x8000);
-	}
-	_vm->_global->_inter_execPtr = savedIP;
-}
-
 void Game::loadTotFile(char *path) {
 	int16 handle;
 
@@ -1408,7 +670,7 @@
 void Game::start(void) {
 	_collisionAreas = new Collision[250];
 	prepareStart();
-	playTot(0);
+	playTot(-2);
 
 	delete[] _collisionAreas;
 
@@ -1634,7 +896,7 @@
 		top = _vm->_parse->parseValExpr();
 		width = _vm->_parse->parseValExpr();
 		height = _vm->_parse->parseValExpr();
-		if ((_vm->_draw->_renderFlags != 8) && (left != -1)) {
+		if ((_vm->_draw->_renderFlags & 8) && (left != -1)) {
 			left += _vm->_draw->_backDeltaX;
 			top += _vm->_draw->_backDeltaY;
 		}
@@ -1680,12 +942,12 @@
 
 	collId = _collisionAreas[index].id & 0xF000;
 
-	if ((collId == 0xA000) || (collId == 0x9000))
+	if ((collId != 0xA000) && (collId != 0x9000))
 		WRITE_VAR(17, collId);
 	else if (enter == 0)
-		WRITE_VAR(17, -(collId & 0x0FFF));
+		WRITE_VAR(17, _collisionAreas[index].id & 0x0FFF);
 	else
-		WRITE_VAR(17, collId & 0x0FFF);
+		WRITE_VAR(17, -(_collisionAreas[index].id & 0x0FFF));
 	
 	if (enter != 0) {
 		if (_collisionAreas[index].funcEnter != 0)

Modified: scummvm/trunk/engines/gob/game.h
===================================================================
--- scummvm/trunk/engines/gob/game.h	2006-06-29 12:32:37 UTC (rev 23345)
+++ scummvm/trunk/engines/gob/game.h	2006-06-29 12:55:57 UTC (rev 23346)
@@ -195,10 +195,7 @@
 	void loadSound(int16 slot, char *dataPtr);
 	int16 inputArea(int16 xPos, int16 yPos, int16 width, int16 height, int16 backColor,
 			int16 frontColor, char *str, int16 fontIndex, char inpType, int16 *pTotTime);
-	int16 multiEdit(int16 time, int16 index, int16 *pCurPos,
-					InputDesc * inpDesc);
 	int16 adjustKey(int16 key);
-	void collisionsBlock(void);
 	void loadTotFile(char *path);
 	void loadExtTable(void);
 	void loadImFile(void);
@@ -224,6 +221,9 @@
 	virtual void clearCollisions(void) = 0;
 	virtual void addNewCollision(int16 id, int16 left, int16 top, int16 right,
 			int16 bottom, int16 flags, int16 key, int16 funcEnter, int16 funcLeave) = 0;
+	virtual void collisionsBlock(void) = 0;
+	virtual int16 multiEdit(int16 time, int16 index, int16 *pCurPos,
+					InputDesc *inpDesc, int16 *collResId, int16 *collIndex) = 0;
 	virtual int16 checkKeys(int16 *pMousex, int16 *pMouseY, int16 *pButtons,
 					char handleMouse) = 0;
 	virtual int16 checkCollisions(char handleMouse, int16 deltaTime, int16 *pResId,
@@ -269,7 +269,6 @@
 
 	GobEngine *_vm;
 		
-	int16 checkMousePoint(int16 all, int16 *resId, int16 *resIndex);
 	void setCollisions(void);
 	void collSub(int16 offset);
 	void collAreaSub(int16 index, int8 enter);
@@ -277,6 +276,7 @@
 
 	virtual void pushCollisions(char all) = 0;
 	virtual void popCollisions(void) = 0;
+	virtual int16 checkMousePoint(int16 all, int16 *resId, int16 *resIndex) = 0;
 };
 
 class Game_v1 : public Game {
@@ -285,6 +285,9 @@
 	virtual void clearCollisions(void);
 	virtual void addNewCollision(int16 id, int16 left, int16 top, int16 right,
 			int16 bottom, int16 flags, int16 key, int16 funcEnter, int16 funcLeave);
+	virtual void collisionsBlock(void);
+	virtual int16 multiEdit(int16 time, int16 index, int16 *pCurPos,
+					InputDesc *inpDesc, int16 *collResId, int16 *collIndex);
 	virtual int16 checkKeys(int16 *pMousex, int16 *pMouseY, int16 *pButtons,
 					char handleMouse);
 	virtual int16 checkCollisions(char handleMouse, int16 deltaTime, int16 *pResId,
@@ -297,6 +300,7 @@
 protected:
 	virtual void pushCollisions(char all);
 	virtual void popCollisions(void);
+	virtual int16 checkMousePoint(int16 all, int16 *resId, int16 *resIndex);
 };
 
 class Game_v2 : public Game_v1 {
@@ -305,6 +309,9 @@
 	virtual void clearCollisions(void);
 	virtual void addNewCollision(int16 id, int16 left, int16 top, int16 right,
 			int16 bottom, int16 flags, int16 key, int16 funcEnter, int16 funcLeave);
+	virtual void collisionsBlock(void);
+	virtual int16 multiEdit(int16 time, int16 index, int16 *pCurPos,
+					InputDesc *inpDesc, int16 *collResId, int16 *collIndex);
 	virtual int16 checkKeys(int16 *pMousex, int16 *pMouseY, int16 *pButtons,
 					char handleMouse);
 	virtual int16 checkCollisions(char handleMouse, int16 deltaTime, int16 *pResId,
@@ -325,6 +332,7 @@
 
 	virtual void pushCollisions(char all);
 	virtual void popCollisions(void);
+	virtual int16 checkMousePoint(int16 all, int16 *resId, int16 *resIndex);
 };
 
 }				// End of namespace Gob

Modified: scummvm/trunk/engines/gob/game_v1.cpp
===================================================================
--- scummvm/trunk/engines/gob/game_v1.cpp	2006-06-29 12:32:37 UTC (rev 23345)
+++ scummvm/trunk/engines/gob/game_v1.cpp	2006-06-29 12:55:57 UTC (rev 23346)
@@ -59,6 +59,9 @@
 	char *savedIP;
 	int16 i;
 
+	if (skipPlay < 0)
+		skipPlay = 0;
+
 	oldNestLevel = _vm->_inter->_nestLevel;
 	oldBreakFrom = _vm->_inter->_breakFromLevel;
 	oldCaptureCounter = _vm->_scenery->_pCaptureCounter;
@@ -83,7 +86,7 @@
 			else
 				_vm->_cdrom->stopPlaying();
 			_vm->_draw->animateCursor(4);
-			_vm->_inter->initControlVars();
+			_vm->_inter->initControlVars(1);
 			_vm->_mult->initAll();
 			_vm->_mult->zeroMultData();
 
@@ -627,4 +630,743 @@
 	_startTimeKey = _vm->_util->getTimeKey();
 }
 
+void Game_v1::collisionsBlock(void) {
+	InputDesc descArray[20];
+	int16 array[250];
+	char count;
+	int16 collResId;
+	char *startIP;
+	int16 curCmd;
+	int16 cmd;
+	int16 cmdHigh;
+	int16 key;
+	int16 flags;
+	int16 left;
+	int16 top;
+	int16 width;
+	int16 height;
+	int16 var_22;
+	int16 index;
+	int16 curEditIndex;
+	int16 deltaTime;
+	int16 descIndex2;
+	int16 stackPos2;
+	int16 descIndex;
+	int16 timeVal;
+	char *str;
+	int16 savedCollStackSize;
+	int16 i;
+	int16 counter;
+	int16 var_24;
+	int16 var_26;
+	int16 _collStackPos;
+	Collision *collPtr;
+	int16 timeKey;
+	char *savedIP;
+
+	if (_shouldPushColls)
+		pushCollisions(1);
+
+	collResId = -1;
+	_vm->_global->_inter_execPtr++;
+	count = *_vm->_global->_inter_execPtr++;
+	_handleMouse = _vm->_global->_inter_execPtr[0];
+	deltaTime = 1000 * (byte)_vm->_global->_inter_execPtr[1];
+	descIndex2 = (byte)_vm->_global->_inter_execPtr[2];
+	stackPos2 = (byte)_vm->_global->_inter_execPtr[3];
+	descIndex = (byte)_vm->_global->_inter_execPtr[4];
+
+	if (stackPos2 != 0 || descIndex != 0)
+		deltaTime /= 100;
+
+	timeVal = deltaTime;
+	_vm->_global->_inter_execPtr += 6;
+
+	startIP = _vm->_global->_inter_execPtr;
+	WRITE_VAR(16, 0);
+	var_22 = 0;
+	index = 0;
+	curEditIndex = 0;
+
+	for (curCmd = 0; curCmd < count; curCmd++) {
+		array[curCmd] = 0;
+		cmd = *_vm->_global->_inter_execPtr++;
+
+		if ((cmd & 0x40) != 0) {
+			cmd -= 0x40;
+			cmdHigh = (byte)*_vm->_global->_inter_execPtr;
+			_vm->_global->_inter_execPtr++;
+			cmdHigh <<= 8;
+		} else {
+			cmdHigh = 0;
+		}
+
+		if ((cmd & 0x80) != 0) {
+			left = _vm->_parse->parseValExpr();
+			top = _vm->_parse->parseValExpr();
+			width = _vm->_parse->parseValExpr();
+			height = _vm->_parse->parseValExpr();
+		} else {
+			left = _vm->_inter->load16();
+			top = _vm->_inter->load16();
+			width = _vm->_inter->load16();
+			height = _vm->_inter->load16();
+		}
+		cmd &= 0x7f;
+
+		debugC(1, DEBUG_COLLISIONS, "collisionsBlock(%d)", cmd);
+
+		switch (cmd) {
+		case 3:
+		case 4:
+		case 5:
+		case 6:
+		case 7:
+		case 8:
+		case 9:
+		case 10:
+
+			_vm->_util->waitKey();
+			var_22 = 1;
+			key = _vm->_parse->parseVarIndex();
+			descArray[index].fontIndex = _vm->_inter->load16();
+			descArray[index].backColor = *_vm->_global->_inter_execPtr++;
+			descArray[index].frontColor = *_vm->_global->_inter_execPtr++;
+
+			if (cmd < 5 || cmd > 8) {
+				descArray[index].ptr = 0;
+			} else {
+				descArray[index].ptr = _vm->_global->_inter_execPtr + 2;
+				_vm->_global->_inter_execPtr += _vm->_inter->load16();
+			}
+
+			if (left == -1)
+				break;
+
+			if ((cmd & 1) == 0) {
+				addNewCollision(curCmd + 0x8000, left,
+				    top,
+				    left +
+				    width *
+				    _vm->_draw->_fonts[descArray[index].fontIndex]->
+				    itemWidth - 1, top + height - 1, cmd, key,
+				    0,
+				    _vm->_global->_inter_execPtr - (char *)_totFileData);
+
+				_vm->_global->_inter_execPtr += 2;
+				_vm->_global->_inter_execPtr += READ_LE_UINT16(_vm->_global->_inter_execPtr);
+			} else {
+				addNewCollision(curCmd + 0x8000, left,
+				    top,
+				    left +
+				    width *
+				    _vm->_draw->_fonts[descArray[index].fontIndex]->
+				    itemWidth - 1, top + height - 1, cmd, key,
+				    0, 0);
+			}
+			index++;
+			break;
+
+		case 21:
+			key = _vm->_inter->load16();
+			array[curCmd] = _vm->_inter->load16();
+			flags = _vm->_inter->load16() & 3;
+
+			addNewCollision(curCmd + 0x8000, left, top,
+			    left + width - 1,
+			    top + height - 1,
+			    (flags << 4) + cmdHigh + 2, key,
+			    _vm->_global->_inter_execPtr - (char *)_totFileData, 0);
+
+			_vm->_global->_inter_execPtr += 2;
+			_vm->_global->_inter_execPtr += READ_LE_UINT16(_vm->_global->_inter_execPtr);
+			break;
+
+		case 20:
+			collResId = curCmd;
+			// Fall through to case 2
+
+		case 2:
+			key = _vm->_inter->load16();
+			array[curCmd] = _vm->_inter->load16();
+			flags = _vm->_inter->load16() & 3;
+
+			addNewCollision(curCmd + 0x8000, left, top,
+			    left + width - 1,
+			    top + height - 1,
+			    (flags << 4) + cmdHigh + 2, key, 0,
+			    _vm->_global->_inter_execPtr - (char *)_totFileData);
+
+			_vm->_global->_inter_execPtr += 2;
+			_vm->_global->_inter_execPtr += READ_LE_UINT16(_vm->_global->_inter_execPtr);
+			break;
+
+		case 0:
+			_vm->_global->_inter_execPtr += 6;
+			startIP = _vm->_global->_inter_execPtr;
+			_vm->_global->_inter_execPtr += 2;
+			_vm->_global->_inter_execPtr += READ_LE_UINT16(_vm->_global->_inter_execPtr);
+			key = curCmd + 0xA000;
+
+			addNewCollision(curCmd + 0x8000, left, top,
+			    left + width - 1,
+			    top + height - 1,
+			    cmd + cmdHigh, key,
+			    startIP - (char *)_totFileData,
+			    _vm->_global->_inter_execPtr - (char *)_totFileData);
+
+			_vm->_global->_inter_execPtr += 2;
+			_vm->_global->_inter_execPtr += READ_LE_UINT16(_vm->_global->_inter_execPtr);
+			break;
+
+		case 1:
+			key = _vm->_inter->load16();
+			array[curCmd] = _vm->_inter->load16();
+			flags = _vm->_inter->load16() & 3;
+
+			startIP = _vm->_global->_inter_execPtr;
+			_vm->_global->_inter_execPtr += 2;
+			_vm->_global->_inter_execPtr += READ_LE_UINT16(_vm->_global->_inter_execPtr);
+			if (key == 0)
+				key = curCmd + 0xa000;
+
+			addNewCollision(curCmd + 0x8000, left, top,
+			    left + width - 1,
+			    top + height - 1,
+			    (flags << 4) + cmd + cmdHigh, key,
+			    startIP - (char *)_totFileData,
+			    _vm->_global->_inter_execPtr - (char *)_totFileData);
+
+			_vm->_global->_inter_execPtr += 2;
+			_vm->_global->_inter_execPtr += READ_LE_UINT16(_vm->_global->_inter_execPtr);
+			break;
+		}
+	}
+
+	_forceHandleMouse = 0;
+	_vm->_util->waitKey();
+
+	do {
+		if (var_22 != 0) {
+			key =
+			    multiEdit(deltaTime, index, &curEditIndex,
+			    descArray, 0, 0);
+
+			if (key == 0x1c0d) {
+				for (i = 0; i < 250; i++) {
+					if (_collisionAreas[i].left == -1)
+						continue;
+
+					if ((_collisionAreas[i].id & 0x8000) == 0)
+						continue;
+
+					if ((_collisionAreas[i].flags & 1) != 0)
+						continue;
+
+					if ((_collisionAreas[i].flags & 0x0f) <= 2)
+						continue;
+
+					collResId = _collisionAreas[i].id;
+					_activeCollResId = collResId;
+					collResId &= 0x7fff;
+					_activeCollIndex = i;
+					break;
+				}
+				break;
+			}
+		} else {
+			key =
+			    checkCollisions(_handleMouse, -deltaTime,
+			    &_activeCollResId, &_activeCollIndex);
+		}
+
+		if ((key & 0xff) >= ' ' && (key & 0xff) <= 0xff &&
+		    (key >> 8) > 1 && (key >> 8) < 12) {
+			key = '0' + (((key >> 8) - 1) % 10) + (key & 0xff00);
+		}
+
+		if (_activeCollResId == 0) {
+			if (key != 0) {
+				for (i = 0; i < 250; i++) {
+					if (_collisionAreas[i].left == -1)
+						continue;
+
+					if ((_collisionAreas[i].
+						id & 0x8000) == 0)
+						continue;
+
+					if (_collisionAreas[i].key == key
+					    || _collisionAreas[i].key ==
+					    0x7fff) {
+
+						_activeCollResId =
+						    _collisionAreas[i].id;
+						_activeCollIndex = i;
+						break;
+					}
+				}
+
+				if (_activeCollResId == 0) {
+					for (i = 0; i < 250; i++) {
+						if (_collisionAreas[i].left == -1)
+							continue;
+
+						if ((_collisionAreas[i].id & 0x8000) == 0)
+							continue;
+
+						if ((_collisionAreas[i].key & 0xff00) != 0)
+							continue;
+
+						if (_collisionAreas[i].key == 0)
+							continue;
+
+						if (adjustKey(key & 0xff) == adjustKey(_collisionAreas[i].key) || _collisionAreas[i].key == 0x7fff) {
+							_activeCollResId = _collisionAreas[i].id;
+							_activeCollIndex = i;
+							break;
+						}
+					}
+				}
+			} else {
+
+				if (deltaTime != 0 && VAR(16) == 0) {
+					if (stackPos2 != 0) {
+						_collStackPos = 0;
+						collPtr = _collisionAreas;
+
+						for (i = 0, collPtr = _collisionAreas; collPtr->left != -1; i++, collPtr++) {
+							if ((collPtr->id & 0x8000) == 0)
+								continue;
+
+							_collStackPos++;
+							if (_collStackPos != stackPos2)
+								continue;
+
+							_activeCollResId = collPtr->id;
+							_activeCollIndex = i;
+							WRITE_VAR(2, _vm->_global->_inter_mouseX);
+							WRITE_VAR(3, _vm->_global->_inter_mouseY);
+							WRITE_VAR(4, _mouseButtons);
+							WRITE_VAR(16, array[(uint16)_activeCollResId & ~0x8000]);
+
+							if (collPtr->funcLeave != 0) {
+								timeKey = _vm->_util->getTimeKey();
+								savedIP = _vm->_global->_inter_execPtr;
+								_vm->_global->_inter_execPtr = (char *)_totFileData + collPtr->funcLeave;
+								_shouldPushColls = 1;
+								savedCollStackSize = _collStackSize;
+								_vm->_inter->funcBlock(0);
+
+								if (savedCollStackSize != _collStackSize)
+									popCollisions();
+
+								_shouldPushColls = 0;
+								_vm->_global->_inter_execPtr = savedIP;
+								deltaTime = timeVal - (_vm->_util->getTimeKey() - timeKey);
+
+								if (deltaTime < 2)
+									deltaTime = 2;
+							}
+
+							if (VAR(16) == 0)
+								_activeCollResId = 0;
+							break;
+						}
+					} else {
+						if (descIndex != 0) {
+							counter = 0;
+							for (i = 0; i < 250; i++) {
+								if (_collisionAreas[i].left == -1)
+									continue;
+
+								if ((_collisionAreas[i].id & 0x8000) == 0)
+									continue;
+
+								counter++;
+								if (counter != descIndex)
+									continue;
+
+								_activeCollResId = _collisionAreas[i].id;
+								_activeCollIndex = i;
+								break;
+							}
+						} else {
+							for (i = 0; i < 250; i++) {
+								if (_collisionAreas[i].left == -1)
+									continue;
+
+								if ((_collisionAreas[i].id & 0x8000) == 0)
+									continue;
+
+								_activeCollResId = _collisionAreas[i].id;
+								_activeCollIndex = i;
+								break;
+							}
+						}
+					}
+				} else {
+					if (descIndex2 != 0) {
+						counter = 0;
+						for (i = 0; i < 250; i++) {
+							if (_collisionAreas[i].left == -1)
+								continue;
+
+							if ((_collisionAreas[i].id & 0x8000) == 0)
+								continue;
+
+							counter++;
+							if (counter != descIndex2)
+								continue;
+
+							_activeCollResId = _collisionAreas[i].id;
+							_activeCollIndex = i;
+							break;
+						}
+					}
+				}
+			}
+		}
+
+		if (_activeCollResId == 0)
+			continue;
+
+		if (_collisionAreas[_activeCollIndex].funcLeave != 0)
+			continue;
+
+		WRITE_VAR(2, _vm->_global->_inter_mouseX);
+		WRITE_VAR(3, _vm->_global->_inter_mouseY);
+		WRITE_VAR(4, _mouseButtons);
+		WRITE_VAR(16, array[(uint16)_activeCollResId & ~0x8000]);
+
+		if (_collisionAreas[_activeCollIndex].funcEnter != 0) {
+			savedIP = _vm->_global->_inter_execPtr;
+			_vm->_global->_inter_execPtr = (char *)_totFileData +
+			    _collisionAreas[_activeCollIndex].
+			    funcEnter;
+
+			_shouldPushColls = 1;
+
+			_collStackPos = _collStackSize;
+			_vm->_inter->funcBlock(0);
+			if (_collStackPos != _collStackSize)
+				popCollisions();
+			_shouldPushColls = 0;
+			_vm->_global->_inter_execPtr = savedIP;
+		}
+
+		WRITE_VAR(16, 0);
+		_activeCollResId = 0;
+	}
+	while (_activeCollResId == 0 && !_vm->_inter->_terminate && !_vm->_quitRequested);
+
+	if (((uint16)_activeCollResId & ~0x8000) == collResId) {
+		_collStackPos = 0;
+		var_24 = 0;
+		var_26 = 1;
+		for (i = 0; i < 250; i++) {
+			if (_collisionAreas[i].left == -1)
+				continue;
+
+			if ((_collisionAreas[i].id & 0x8000) == 0)
+				continue;
+
+			if ((_collisionAreas[i].flags & 0x0f) < 3)
+				continue;
+
+			if ((_collisionAreas[i].flags & 0x0f) > 10)
+				continue;
+
+			if ((_collisionAreas[i].flags & 0x0f) > 8) {
+				char *ptr;
+				strcpy(_tempStr,
+				    _vm->_global->_inter_variables + _collisionAreas[i].key);
+				while ((ptr = strchr(_tempStr, ' ')) != 0) {
+					_vm->_util->cutFromStr(_tempStr, (ptr - _tempStr), 1);
+					ptr = strchr(_tempStr, ' ');
+				}
+				strcpy(_vm->_global->_inter_variables + _collisionAreas[i].key, _tempStr);
+			}
+
+			if ((_collisionAreas[i].flags & 0x0f) >= 5 &&
+			    (_collisionAreas[i].flags & 0x0f) <= 8) {
+				str = descArray[var_24].ptr;
+
+				strcpy(_tempStr, _vm->_global->_inter_variables + _collisionAreas[i].key);
+
+				if ((_collisionAreas[i].flags & 0x0f) < 7)
+					_vm->_util->prepareStr(_tempStr);
+
+				int16 pos = 0;
+				do {
+					strcpy(_collStr, str);
+					pos += strlen(str) + 1;
+
+					str += strlen(str) + 1;
+
+					if ((_collisionAreas[i].flags & 0x0f) < 7)
+						_vm->_util->prepareStr(_collStr);
+
+					if (strcmp(_tempStr, _collStr) == 0) {
+						VAR(17)++;
+						WRITE_VAR(17 + var_26, 1);
+						break;
+					}
+				} while (READ_LE_UINT16(descArray[var_24].ptr - 2) > pos);
+				_collStackPos++;
+			} else {
+				VAR(17 + var_26) = 2;
+			}
+			var_24++;
+			var_26++;
+		}
+
+		if (_collStackPos != (int16)VAR(17))
+			WRITE_VAR(17, 0);
+		else
+			WRITE_VAR(17, 1);
+	}
+
+	savedIP = 0;
+	if (!_vm->_inter->_terminate) {
+		savedIP = (char *)_totFileData +
+		    _collisionAreas[_activeCollIndex].funcLeave;
+
+		WRITE_VAR(2, _vm->_global->_inter_mouseX);
+		WRITE_VAR(3, _vm->_global->_inter_mouseY);
+		WRITE_VAR(4, _mouseButtons);
+
+		if (VAR(16) == 0) {
+			WRITE_VAR(16, array[(uint16)_activeCollResId & ~0x8000]);
+		}
+	}
+
+	for (curCmd = 0; curCmd < count; curCmd++) {
+		freeCollision(curCmd + 0x8000);
+	}
+	_vm->_global->_inter_execPtr = savedIP;
+}
+
+int16 Game_v1::multiEdit(int16 time, int16 index, int16 *pCurPos, InputDesc * inpDesc,
+		int16 *collResId, int16 *collIndex) {
+	Collision *collArea;
+	int16 descInd;
+	int16 key;
+	int16 found = -1;
+	int16 i;
+
+	descInd = 0;
+	for (i = 0; i < 250; i++) {
+		collArea = &_collisionAreas[i];
+
+		if (collArea->left == -1)
+			continue;
+
+		if ((collArea->id & 0x8000) == 0)
+			continue;
+
+		if ((collArea->flags & 0x0f) < 3)
+			continue;
+
+		if ((collArea->flags & 0x0f) > 10)
+			continue;
+
+		strcpy(_tempStr, _vm->_global->_inter_variables + collArea->key);
+
+		_vm->_draw->_destSpriteX = collArea->left;
+		_vm->_draw->_destSpriteY = collArea->top;
+		_vm->_draw->_spriteRight = collArea->right - collArea->left + 1;
+		_vm->_draw->_spriteBottom = collArea->bottom - collArea->top + 1;
+
+		_vm->_draw->_destSurface = 21;
+
+		_vm->_draw->_backColor = inpDesc[descInd].backColor;
+		_vm->_draw->_frontColor = inpDesc[descInd].frontColor;
+		_vm->_draw->_textToPrint = _tempStr;
+		_vm->_draw->_transparency = 1;
+		_vm->_draw->_fontIndex = inpDesc[descInd].fontIndex;
+		_vm->_draw->spriteOperation(DRAW_FILLRECT);
+		_vm->_draw->_destSpriteY +=
+		    ((collArea->bottom - collArea->top + 1) - 8) / 2;
+
+		_vm->_draw->spriteOperation(DRAW_PRINTTEXT);
+		descInd++;
+	}
+
+	for (i = 0; i < 40; i++) {
+		WRITE_VAR_OFFSET(i * 4 + 0x44, 0);
+	}
+
+	while (1) {
+		descInd = 0;
+
+		for (i = 0; i < 250; i++) {
+			collArea = &_collisionAreas[i];
+
+			if (collArea->left == -1)
+				continue;
+
+			if ((collArea->id & 0x8000) == 0)
+				continue;
+
+			if ((collArea->flags & 0x0f) < 3)
+				continue;
+
+			if ((collArea->flags & 0x0f) > 10)
+				continue;
+
+			if (descInd == *pCurPos) {
+				found = i;
+				break;
+			}
+
+			descInd++;
+		}
+
+		assert(found != -1);
+
+		collArea = &_collisionAreas[found];
+
+		key = inputArea(collArea->left, collArea->top,
+		    collArea->right - collArea->left + 1,
+		    collArea->bottom - collArea->top + 1,
+		    inpDesc[*pCurPos].backColor, inpDesc[*pCurPos].frontColor,
+		    _vm->_global->_inter_variables + collArea->key,
+		    inpDesc[*pCurPos].fontIndex, collArea->flags, &time);
+
+		if (_vm->_inter->_terminate)
+			return 0;
+
+		switch (key) {
+		case 0:
+			if (_activeCollResId == 0)
+				return 0;
+
+			if ((_collisionAreas[_activeCollIndex].
+				flags & 0x0f) < 3)
+				return 0;
+
+			if ((_collisionAreas[_activeCollIndex].
+				flags & 0x0f) > 10)
+				return 0;
+
+			*pCurPos = 0;
+			for (i = 0; i < 250; i++) {
+				collArea = &_collisionAreas[i];
+
+				if (collArea->left == -1)
+					continue;
+
+				if ((collArea->id & 0x8000) == 0)
+					continue;
+
+				if ((collArea->flags & 0x0f) < 3)
+					continue;
+
+				if ((collArea->flags & 0x0f) > 10)
+					continue;
+
+				if (i == _activeCollIndex)
+					break;
+
+				pCurPos[0]++;
+			}
+			break;
+
+		case 0x3b00:
+		case 0x3c00:
+		case 0x3d00:
+		case 0x3e00:
+		case 0x3f00:
+		case 0x4000:
+		case 0x4100:
+		case 0x4200:
+		case 0x4300:
+		case 0x4400:
+			return key;
+
+		case 0x1c0d:
+
+			if (index == 1)
+				return key;
+
+			if (*pCurPos == index - 1) {
+				*pCurPos = 0;
+				break;
+			}
+
+			pCurPos[0]++;
+			break;
+
+		case 0x5000:
+			if (index - 1 > *pCurPos)
+				pCurPos[0]++;
+			break;
+
+		case 0x4800:
+			if (*pCurPos > 0)
+				pCurPos[0]--;
+			break;
+		}
+	}
+}
+
+int16 Game_v1::checkMousePoint(int16 all, int16 *resId, int16 *resIndex) {
+	Collision *ptr;
+	int16 i;
+
+	if (resId != 0)
+		*resId = 0;
+
+	*resIndex = 0;
+
+	ptr = _collisionAreas;
+	for (i = 0; ptr->left != -1; ptr++, i++) {
+		if (all) {
+			if ((ptr->flags & 0xf) > 1)
+				continue;
+
+			if ((ptr->flags & 0xff00) != 0)
+				continue;
+
+			if (_vm->_global->_inter_mouseX < ptr->left
+			    || _vm->_global->_inter_mouseX > ptr->right
+			    || _vm->_global->_inter_mouseY < ptr->top
+			    || _vm->_global->_inter_mouseY > ptr->bottom)
+				continue;
+
+			if (resId != 0)
+				*resId = ptr->id;
+
+			*resIndex = i;
+			return ptr->key;
+		} else {
+			if ((ptr->flags & 0xff00) != 0)
+				continue;
+
+			if ((ptr->flags & 0xf) != 1 && (ptr->flags & 0xf) != 2)
+				continue;
+
+			if ((ptr->flags & 0xf0) >> 4 != _mouseButtons - 1
+			    && (ptr->flags & 0xf0) >> 4 != 2)
+				continue;
+
+			if (_vm->_global->_inter_mouseX < ptr->left
+			    || _vm->_global->_inter_mouseX > ptr->right
+			    || _vm->_global->_inter_mouseY < ptr->top
+			    || _vm->_global->_inter_mouseY > ptr->bottom)
+				continue;
+
+			if (resId != 0)
+				*resId = ptr->id;
+			*resIndex = i;
+			return ptr->key;
+		}
+	}
+
+	if (_mouseButtons != 1 && all == 0)
+		return 0x11b;
+
+	return 0;
+}
+
 } // End of namespace Gob

Modified: scummvm/trunk/engines/gob/game_v2.cpp
===================================================================
--- scummvm/trunk/engines/gob/game_v2.cpp	2006-06-29 12:32:37 UTC (rev 23345)
+++ scummvm/trunk/engines/gob/game_v2.cpp	2006-06-29 12:55:57 UTC (rev 23346)
@@ -68,31 +68,36 @@
 	_vm->_scenery->_pCaptureCounter = &_captureCounter;
 	strcpy(savedTotName, _curTotFile);
 
-	if (skipPlay == 0) {
+	if (skipPlay <= 0) {
 		while (!_vm->_quitRequested) {
-			for (i = 0; i < 4; i++) {
-				_vm->_draw->_fontToSprite[i].sprite = -1;
-				_vm->_draw->_fontToSprite[i].base = -1;
-				_vm->_draw->_fontToSprite[i].width = -1;
-				_vm->_draw->_fontToSprite[i].height = -1;
-			}
-
+			_vm->_draw->animateCursor(4);
 			if (_vm->_features & GF_MAC)
 				_vm->_music->stopPlay();
 			else
 				_vm->_cdrom->stopPlaying();
-			_vm->_draw->animateCursor(4);
-			_vm->_inter->initControlVars();
-			_vm->_mult->initAll();
-			_vm->_mult->zeroMultData();
 
-			for (i = 0; i < 20; i++)
-				_vm->_draw->_spritesArray[i] = 0;
+			if (skipPlay != -1) {
+				_vm->_inter->initControlVars(1);
 
-			_vm->_draw->_spritesArray[20] = _vm->_draw->_frontSurface;
-			_vm->_draw->_spritesArray[21] = _vm->_draw->_backSurface;
-			_vm->_draw->_cursorSpritesBack = _vm->_draw->_cursorSprites;
+				for (i = 0; i < 4; i++) {
+					_vm->_draw->_fontToSprite[i].sprite = -1;
+					_vm->_draw->_fontToSprite[i].base = -1;
+					_vm->_draw->_fontToSprite[i].width = -1;
+					_vm->_draw->_fontToSprite[i].height = -1;
+				}
 
+				_vm->_mult->initAll();
+				_vm->_mult->zeroMultData();
+
+				for (i = 0; i < 20; i++)
+					_vm->_draw->_spritesArray[i] = 0;
+
+				_vm->_draw->_spritesArray[20] = _vm->_draw->_frontSurface;
+				_vm->_draw->_spritesArray[21] = _vm->_draw->_backSurface;
+				_vm->_draw->_cursorSpritesBack = _vm->_draw->_cursorSprites;
+			} else
+				_vm->_inter->initControlVars(0);
+
 			for (i = 0; i < 20; i++)
 				_soundSamples[i] = 0;
 
@@ -113,6 +118,9 @@
 				break;
 			}
 
+			if (skipPlay == -2)
+				skipPlay = 0;
+
 			strcpy(_curImaFile, _curTotFile);
 			strcpy(_curExtFile, _curTotFile);
 
@@ -226,20 +234,25 @@
 			for (i = 0; i < *_vm->_scenery->_pCaptureCounter; i++)
 				capturePop(0);
 
-			_vm->_mult->checkFreeMult();
-			_vm->_mult->freeAll();
+/*			_vm->_mult->checkFreeMult();
+			_vm->_mult->freeAll();*/
 
-			for (i = 0; i < 20; i++) {
-				if (_vm->_draw->_spritesArray[i] != 0)
-					_vm->_video->freeSurfDesc(_vm->_draw->_spritesArray[i]);
-				_vm->_draw->_spritesArray[i] = 0;
+			if (skipPlay != -1) {
+				_vm->_goblin->freeObjects();
+
+				for (i = 0; i < 20; i++) {
+					if (_vm->_draw->_spritesArray[i] != 0)
+						_vm->_video->freeSurfDesc(_vm->_draw->_spritesArray[i]);
+					_vm->_draw->_spritesArray[i] = 0;
+				}
+				_vm->_snd->stopSound(0);
+
+				for (i = 0; i < 60; i++)
+					if ((_soundTypes[i] & 8) == 0)
+						freeSoundSlot(i);
 			}
-			_vm->_snd->stopSound(0);
 
-			for (i = 0; i < 60; i++)
-				if ((_soundTypes[i] & 8) == 0)
-					freeSoundSlot(i);
-
+			closeImd();
 			if (_totToLoad[0] == 0)
 				break;
 
@@ -277,7 +290,7 @@
 	debugC(5, DEBUG_COLLISIONS, "flags = %x, key = %x", flags, key);
 	debugC(5, DEBUG_COLLISIONS, "funcEnter = %d, funcLeave = %d", funcEnter, funcLeave);
 
-	for (i = 0; i < 250; i++) {
+	for (i = 0; i < 150; i++) {
 		if ((_collisionAreas[i].left != -1) && (_collisionAreas[i].id != id))
 			continue;
 
@@ -365,8 +378,8 @@
 		else
 			_vm->_mult->_frameStart = 0;
 
-		_vm->_mult->playMult(_vm->_mult->_frameStart + VAR(57), _vm->_mult->_frameStart + VAR(57), 1,
-		    handleMouse);
+		_vm->_mult->playMult(_vm->_mult->_frameStart + VAR(57),
+				_vm->_mult->_frameStart + VAR(57), 1, handleMouse);
 	}
 
 	if (_vm->_inter->_soundEndTimeKey != 0
@@ -405,11 +418,8 @@
 
 	resIndex = 0;
 
-	if (_vm->_draw->_cursorIndex == -1 && handleMouse != 0
-	    && _lastCollKey == 0) {
-		_lastCollKey =
-		    checkMousePoint(1, &_lastCollId,
-		    &_lastCollAreaIndex);
+	if ((_vm->_draw->_cursorIndex == -1) && (handleMouse != 0) && (_lastCollKey == 0)) {
+		_lastCollKey = checkMousePoint(1, &_lastCollId, &_lastCollAreaIndex);
 
 		if ((_lastCollKey != 0) && (_lastCollId & 0x8000))
 			collAreaSub(_lastCollAreaIndex, 1);
@@ -427,31 +437,12 @@
 		}
 
 		if (_vm->_draw->_noInvalidated == 0) {
-			if (handleMouse)
+			if (handleMouse != 0)
 				_vm->_draw->animateCursor(-1);
 			else
 				_vm->_draw->blitInvalidated();
 		}
 
-		// NOTE: the original asm does the below checkKeys call
-		// _before_ this check. However, that can cause keypresses to get lost
-		// since there's a return statement in this check.
-		// Additionally, I added a 'deltaTime == -1' check there, since
-		// when this function is called with deltaTime == -1 in inputArea,
-		// and the return value is then discarded.
-		if (deltaTime < 0) {
-			uint32 curtime = _vm->_util->getTimeKey();
-			if (deltaTime == -1 || curtime + deltaTime > timeKey) {
-				if (pResId != 0)
-					*pResId = 0;
-
-				if (pResIndex != 0)
-					*pResIndex = 0;
-
-				return 0;
-			}
-		}
-
 		key = checkKeys(&_vm->_global->_inter_mouseX, &_vm->_global->_inter_mouseY,
 							 &_mouseButtons, handleMouse);
 
@@ -534,14 +525,14 @@
 			}
 		}
 
-		if (handleMouse == 0 && _mouseButtons != 0) {
+		if ((handleMouse == 0) && (_mouseButtons != 0)) {
 			_vm->_util->waitMouseRelease(0);
 			key = 3;
 		}
 
 		if (key != 0) {
 
-			if (handleMouse == 1)
+			if (handleMouse & 1)
 				_vm->_draw->blitCursor();
 
 			if (pResId != 0)
@@ -560,75 +551,72 @@
 
 		if (handleMouse != 0) {
 			if (_mouseButtons != 0) {
-				oldIndex = 0;
-
-				_vm->_draw->animateCursor(2);
-				if (deltaTime <= 0) {
-					if (handleMouse == 1)
-						_vm->_util->waitMouseRelease(1);
-				} else if (deltaTime > 0) {
+				if (deltaTime > 0) {
+					_vm->_draw->animateCursor(2);
 					_vm->_util->delay(deltaTime);
-				}
+				} else if (handleMouse & 1)
+					_vm->_util->waitMouseRelease(1);
+				_vm->_draw->animateCursor(-1);
 
-				_vm->_draw->animateCursor(-1);
 				if (pResId != 0)
 					*pResId = 0;
 
 				key = checkMousePoint(0, pResId, &resIndex);
-
 				if (pResIndex != 0)
 					*pResIndex = resIndex;
 
-				if (key != 0 || (pResId != 0 && *pResId != 0)) {
-					if (handleMouse == 1 && (deltaTime <= 0
-						|| _mouseButtons == 0))
+				if ((key != 0) || ((pResId != 0) && (*pResId != 0))) {
+					if ((handleMouse & 1) && ((deltaTime <= 0) || (_mouseButtons == 0)))
 						_vm->_draw->blitCursor();
 
-					if ((_lastCollKey != 0) && (key = _lastCollKey))
-							collAreaSub(_lastCollAreaIndex, 0);
+					if ((_lastCollKey != 0) && (key != _lastCollKey))
+						collAreaSub(_lastCollAreaIndex, 0);
 
 					_lastCollKey = 0;
 					return key;
 				}
 
 				if (handleMouse & 4)
-					return key;
+					return 0;
 
 				if (_lastCollKey != 0)
 					collAreaSub(_lastCollAreaIndex, 0);
 
-				_lastCollKey =
-				    checkMousePoint(1, &_lastCollId,
-				    &_lastCollAreaIndex);
-
-				if (_lastCollKey != 0)
+				_lastCollKey = checkMousePoint(1, &_lastCollId, &_lastCollAreaIndex);
+				if ((_lastCollKey != 0) && (_lastCollId & 0x8000))
 					collAreaSub(_lastCollAreaIndex, 1);
+			} else if ((_vm->_global->_inter_mouseX != _vm->_draw->_cursorX) ||
+					(_vm->_global->_inter_mouseY != _vm->_draw->_cursorY)) {
 
-				// loc_189D3
-				if (handleMouse != 0 &&
-				    (_vm->_global->_inter_mouseX != _vm->_draw->_cursorX
-					|| _vm->_global->_inter_mouseY != _vm->_draw->_cursorY)) {
-					oldIndex = _lastCollAreaIndex;
-					oldId = _lastCollId;
+				oldIndex = _lastCollAreaIndex;
+				oldId = _lastCollId;
+				key = checkMousePoint(1, &_lastCollId, &_lastCollAreaIndex);
 
-					key =
-					    checkMousePoint(1,
-					    &_lastCollId,
-					    &_lastCollAreaIndex);
+				if (key != _lastCollKey) {
+					if ((_lastCollKey != 0) && (oldId & 0x8000))
+						collAreaSub(oldIndex, 0);
 
-					if (key != _lastCollKey) {
-						if (_lastCollKey != 0)
-							collAreaSub(_lastCollAreaIndex, 0);
+					_lastCollKey = key;
 
-						_lastCollKey = key;
-
-						if (_lastCollKey != 0)
-							collAreaSub(_lastCollAreaIndex, 1);
-					}
+					if ((key != 0) && (_lastCollId & 0x8000))
+						collAreaSub(_lastCollAreaIndex, 1);
 				}
 			}
 		}
 
+		if ((deltaTime < 0) && (key == 0) && (_mouseButtons == 0)) {
+			uint32 curtime = _vm->_util->getTimeKey();
+			if ((curtime + deltaTime) > timeKey) {
+				if (pResId != 0)
+					*pResId = 0;
+
+				if (pResIndex != 0)
+					*pResIndex = 0;
+
+				return 0;
+			}
+		}
+
 		if (handleMouse != 0)
 			_vm->_draw->animateCursor(-1);
 
@@ -685,4 +673,761 @@
 	_startTimeKey = _vm->_util->getTimeKey();
 }
 
+void Game_v2::collisionsBlock(void) {
+	InputDesc descArray[20];
+	int16 array[250];
+	char count;
+	int16 collResId;
+	char *startIP;
+	int16 curCmd;
+	int16 cmd;
+	int16 cmdHigh;
+	int16 key;
+	int16 flags;
+	int16 left;
+	int16 top;
+	int16 width;
+	int16 height;
+	int16 var_1C;
+	int16 index;
+	int16 curEditIndex;
+	int16 deltaTime;
+	int16 stackPos2;
+	int16 descIndex;
+	int16 timeVal;
+	int16 offsetIP;
+	char *str;
+	int16 i;
+	int16 counter;
+	int16 var_24;
+	int16 var_26;
+	int16 _collStackPos;
+	Collision *collPtr;
+	Collision *collArea;
+	int16 timeKey;
+	char *savedIP;
+
+	if (_shouldPushColls)
+		pushCollisions(0);
+
+	collArea = _collisionAreas;
+	while (collArea->left != -1)
+		collArea++;
+
+	_shouldPushColls = 0;
+	collResId = -1;
+
+	_vm->_global->_inter_execPtr++;
+	count = *_vm->_global->_inter_execPtr++;
+
+	_handleMouse = _vm->_global->_inter_execPtr[0];
+	deltaTime = 1000 * (byte)_vm->_global->_inter_execPtr[1];
+	stackPos2 = (byte)_vm->_global->_inter_execPtr[3];
+	descIndex = (byte)_vm->_global->_inter_execPtr[4];
+
+	if ((stackPos2 != 0) || (descIndex != 0))
+		deltaTime /= 100;
+
+	timeVal = deltaTime;
+	_vm->_global->_inter_execPtr += 6;
+
+	startIP = _vm->_global->_inter_execPtr;
+	WRITE_VAR(16, 0);
+
+	var_1C = 0;
+	index = 0;
+	curEditIndex = 0;
+
+	for (curCmd = 0; curCmd < count; curCmd++) {
+		array[curCmd] = 0;
+		cmd = *_vm->_global->_inter_execPtr++;
+
+		if ((cmd & 0x40) != 0) {
+			cmd -= 0x40;
+			cmdHigh = (byte)*_vm->_global->_inter_execPtr;
+			_vm->_global->_inter_execPtr++;
+			cmdHigh <<= 8;
+		} else
+			cmdHigh = 0;
+
+		if ((cmd & 0x80) != 0) {
+			offsetIP = _vm->_global->_inter_execPtr - (char *) _totFileData;
+			left = _vm->_parse->parseValExpr();
+			top = _vm->_parse->parseValExpr();
+			width = _vm->_parse->parseValExpr();
+			height = _vm->_parse->parseValExpr();
+		} else {
+			offsetIP = 0;
+			left = _vm->_inter->load16();
+			top = _vm->_inter->load16();
+			width = _vm->_inter->load16();
+			height = _vm->_inter->load16();
+		}
+
+		if ((_vm->_draw->_renderFlags & 8) && (left != -1)) {
+			left += _vm->_draw->_backDeltaX;
+			top += _vm->_draw->_backDeltaY;
+		}
+
+		if (left != -1) {
+			_vm->_draw->adjustCoords(0, &left, &top);
+			if (((cmd & 0x3F) < 20) && ((cmd & 0x3F) >= 3)) {
+				if (_vm->_draw->_word_2E8E2 != 2)
+					height &= 0xFFFE;
+				_vm->_draw->adjustCoords(0, 0, &width);
+			} else
+				_vm->_draw->adjustCoords(0, &height, &width);
+		}
+
+		cmd &= 0x7f;
+		debugC(1, DEBUG_COLLISIONS, "collisionsBlock(%d)", cmd);
+
+		switch(cmd) {
+		case 0:
+			_vm->_global->_inter_execPtr += 6;
+			startIP = _vm->_global->_inter_execPtr;
+			_vm->_global->_inter_execPtr += 2;
+			_vm->_global->_inter_execPtr += READ_LE_UINT16(_vm->_global->_inter_execPtr);
+			key = curCmd + 0xA000;
+
+			addNewCollision(curCmd + 0x8000, left, top, left + width - 1, top + height - 1,
+					cmd + cmdHigh, key, startIP - (char *)_totFileData,
+					_vm->_global->_inter_execPtr - (char *)_totFileData);
+
+			_vm->_global->_inter_execPtr += 2;
+			_vm->_global->_inter_execPtr += READ_LE_UINT16(_vm->_global->_inter_execPtr);
+
+			if (key <= 150)
+				_collisionAreas[key].field_12 = offsetIP;
+			break;
+
+		case 1:
+			key = _vm->_inter->load16();
+			array[curCmd] = _vm->_inter->load16();
+			flags = _vm->_inter->load16();
+
+			startIP = _vm->_global->_inter_execPtr;
+			_vm->_global->_inter_execPtr += 2;
+			_vm->_global->_inter_execPtr += READ_LE_UINT16(_vm->_global->_inter_execPtr);
+			if (key == 0)
+				key = curCmd + 0xa000;
+
+			addNewCollision(curCmd + 0x8000, left, top, left + width - 1, top + height - 1,
+					(flags << 4) + cmd + cmdHigh, key, startIP - (char *)_totFileData,
+					_vm->_global->_inter_execPtr - (char *)_totFileData);
+
+			_vm->_global->_inter_execPtr += 2;
+			_vm->_global->_inter_execPtr += READ_LE_UINT16(_vm->_global->_inter_execPtr);
+
+			if (key <= 150)
+				_collisionAreas[key].field_12 = offsetIP;
+			break;
+
+		case 3:
+		case 4:
+		case 5:
+		case 6:
+		case 7:
+		case 8:
+		case 9:
+		case 10:
+			_vm->_util->waitKey();
+			var_1C = 1;
+			key = _vm->_parse->parseVarIndex();
+			descArray[index].fontIndex = _vm->_inter->load16();
+			descArray[index].backColor = *_vm->_global->_inter_execPtr++;
+			descArray[index].frontColor = *_vm->_global->_inter_execPtr++;
+
+			if ((cmd >= 5) && (cmd <= 8)) {
+				descArray[index].ptr = _vm->_global->_inter_execPtr + 2;
+				_vm->_global->_inter_execPtr += _vm->_inter->load16();;
+			} else
+				descArray[index].ptr = 0;
+
+			if (left == -1) {
+				if ((cmd & 1) == 0) {
+					_vm->_global->_inter_execPtr += 2;
+					_vm->_global->_inter_execPtr += READ_LE_UINT16(_vm->_global->_inter_execPtr);
+				}
+				break;
+			}
+
+			if ((cmd & 1) == 0) {
+				addNewCollision(curCmd + 0x8000, left, top,
+						left + width * _vm->_draw->_fonts[descArray[index].fontIndex]-> itemWidth - 1,
+						top + height - 1, cmd, key, 0,
+						_vm->_global->_inter_execPtr - (char *)_totFileData);
+
+				_vm->_global->_inter_execPtr += 2;
+				_vm->_global->_inter_execPtr += READ_LE_UINT16(_vm->_global->_inter_execPtr);
+			} else
+				addNewCollision(curCmd + 0x8000, left, top,
+						left + width * _vm->_draw->_fonts[descArray[index].fontIndex]-> itemWidth - 1,
+						top + height - 1, cmd, key, 0, 0);
+
+			index++;
+			break;
+
+		case 11:
+			_vm->_global->_inter_execPtr += 6;
+			for (i = 0; i < 150; i++) {
+				if ((_collisionAreas[i].id & 0xF000) == 0xE000) {
+					_collisionAreas[i].id &= 0xBFFF;
+					_collisionAreas[i].funcEnter = _vm->_global->_inter_execPtr - (char *) _totFileData;
+					_collisionAreas[i].funcLeave = _vm->_global->_inter_execPtr - (char *) _totFileData;
+				}
+			}
+			_vm->_global->_inter_execPtr += 2;
+			_vm->_global->_inter_execPtr += READ_LE_UINT16(_vm->_global->_inter_execPtr);
+			break;
+
+		case 12:
+			_vm->_global->_inter_execPtr += 6;
+			for (i = 0; i < 150; i++) {
+				if ((_collisionAreas[i].id & 0xF000) == 0xD000) {
+					_collisionAreas[i].id &= 0xBFFF;
+					_collisionAreas[i].funcEnter = _vm->_global->_inter_execPtr - (char *) _totFileData;
+					_collisionAreas[i].funcLeave = _vm->_global->_inter_execPtr - (char *) _totFileData;
+				}
+			}
+			_vm->_global->_inter_execPtr += 2;
+			_vm->_global->_inter_execPtr += READ_LE_UINT16(_vm->_global->_inter_execPtr);
+			break;
+
+		case 20:
+			collResId = curCmd;
+			// Fall through to case 2
+
+		case 2:
+			key = _vm->_inter->load16();
+			array[curCmd] = _vm->_inter->load16();
+			flags = _vm->_inter->load16();
+
+			addNewCollision(curCmd + 0x8000, left, top, left + width - 1, top + height - 1,
+					(flags << 4) + cmdHigh + 2, key, 0,
+					_vm->_global->_inter_execPtr - (char *)_totFileData);
+
+			_vm->_global->_inter_execPtr += 2;
+			_vm->_global->_inter_execPtr += READ_LE_UINT16(_vm->_global->_inter_execPtr);
+
+			if (key <= 150)
+				_collisionAreas[key].field_12 = offsetIP;
+			break;
+
+		case 21:
+			key = _vm->_inter->load16();
+			array[curCmd] = _vm->_inter->load16();
+			flags = _vm->_inter->load16() & 3;
+
+			addNewCollision(curCmd + 0x8000, left, top, left + width - 1, top + height - 1,
+					(flags << 4) + cmdHigh + 2, key,
+					_vm->_global->_inter_execPtr - (char *)_totFileData, 0);
+
+			_vm->_global->_inter_execPtr += 2;
+			_vm->_global->_inter_execPtr += READ_LE_UINT16(_vm->_global->_inter_execPtr);
+
+			if (key <= 150)
+				_collisionAreas[key].field_12 = offsetIP;
+			break;
+		}
+	}
+
+	_forceHandleMouse = 0;
+	_vm->_util->waitKey();
+
+	do {
+		if (var_1C != 0) {
+			key = multiEdit(deltaTime, index, &curEditIndex, descArray,
+					&_activeCollResId, &_activeCollIndex);
+
+			WRITE_VAR(55, curEditIndex);
+			if (key == 0x1c0d) {
+				for (i = 0; i < 150; i++) {
+					if (_collisionAreas[i].left == -1)
+						continue;
+
+					if ((_collisionAreas[i].id & 0xC000) != 0x8000)
+						continue;
+
+					if ((_collisionAreas[i].flags & 1) != 0)
+						continue;
+
+					if ((_collisionAreas[i].flags & 0x0f) <= 2)
+						continue;
+
+					_activeCollResId = _collisionAreas[i].id;
+					collResId = _collisionAreas[i].id & 0x7fff;
+					_activeCollIndex = i;
+					break;
+				}
+				break;
+			}
+		} else
+			key = checkCollisions(_handleMouse, -deltaTime, &_activeCollResId, &_activeCollIndex);
+
+		if ((key & 0xff) >= ' ' && (key & 0xff) <= 0xff &&
+		    (key >> 8) > 1 && (key >> 8) < 12) {
+			key = '0' + (((key >> 8) - 1) % 10) + (key & 0xff00);
+		}
+
+		if (_activeCollResId == 0) {
+			if (key != 0) {
+				for (i = 0; i < 150; i++) {
+					if (_collisionAreas[i].left == -1)
+						continue;
+
+					if ((_collisionAreas[i].id & 0xC000) != 0x8000)
+						continue;
+
+					if ((_collisionAreas[i].key == key) || (_collisionAreas[i].key == 0x7fff)) {
+						_activeCollResId = _collisionAreas[i].id;
+						_activeCollIndex = i;
+						break;
+					}
+				}
+
+				if (_activeCollResId == 0) {
+					for (i = 0; i < 150; i++) {
+						if (_collisionAreas[i].left == -1)
+							continue;
+
+						if ((_collisionAreas[i].id & 0xC000) != 0x8000)
+							continue;
+
+						if ((_collisionAreas[i].key & 0xff00) != 0)
+							continue;
+
+						if (_collisionAreas[i].key == 0)
+							continue;
+
+						if ((adjustKey(key & 0xff) == adjustKey(_collisionAreas[i].key)) ||
+								(_collisionAreas[i].key == 0x7fff)) {
+							_activeCollResId = _collisionAreas[i].id;
+							_activeCollIndex = i;
+							break;
+						}
+					}
+				}
+			} else if (deltaTime != 0) {
+				if (stackPos2 != 0) {
+					_collStackPos = 0;
+					collPtr = _collisionAreas;
+
+					for (i = 0, collPtr = _collisionAreas; collPtr->left != -1; i++, collPtr++) {
+						if ((collPtr->id & 0xF000) != 0x8000)
+							continue;
+
+						_collStackPos++;
+						if (_collStackPos != stackPos2)
+							continue;
+
+						_activeCollResId = collPtr->id;
+						_activeCollIndex = i;
+						_vm->_inter->storeMouse();
+						if (VAR(16) != 0)
+							break;
+
+						if ((_activeCollResId & 0xF000) == 0x8000)
+							WRITE_VAR(16, array[_activeCollResId & 0xFFF]);
+						else
+							WRITE_VAR(16, _activeCollResId & 0xFFF);
+
+						if (collPtr->funcLeave != 0) {
+							timeKey = _vm->_util->getTimeKey();
+							collSub(collPtr->funcLeave);
+							_vm->_inter->animPalette();
+
+							deltaTime = timeVal - (_vm->_util->getTimeKey() - timeKey);
+
+							if (deltaTime < 2)
+								deltaTime = 2;
+						}
+
+						if (VAR(16) == 0)
+							_activeCollResId = 0;
+						break;
+					}
+				} else {
+					if (descIndex != 0) {
+
+						counter = 0;
+						for (i = 0, collPtr = collArea; collPtr->left != -1; i++, collPtr++) {
+							if ((collPtr->id & 0xF000) == 0x8000)
+								if (++counter == descIndex) {
+									_activeCollResId = collPtr->id;
+									_activeCollIndex = i;
+									break;
+								}
+						}
+
+					} else {
+
+						for (i = 0, collPtr = _collisionAreas; collPtr->left != -1; i++, collPtr++) {
+							if ((collPtr->id & 0xF000) == 0x8000) {
+								_activeCollResId = collPtr->id;
+								_activeCollIndex = i;
+								break;
+							}
+						}
+						if ((_lastCollKey != 0) && (_collisionAreas[_lastCollAreaIndex].funcLeave != 0))
+							collSub(_collisionAreas[_lastCollAreaIndex].funcLeave);
+						_lastCollKey = 0;
+					}
+
+				}
+			}
+		}
+
+		if ((_activeCollResId == 0) || (_collisionAreas[_activeCollIndex].funcLeave != 0))
+			continue;
+
+		_vm->_inter->storeMouse();
+		if ((_activeCollResId & 0xF000) == 0x8000)
+			WRITE_VAR(16, array[_activeCollResId & 0xFFF]);
+		else
+			WRITE_VAR(16, _activeCollResId & 0xFFF);
+
+		if (_collisionAreas[_activeCollIndex].funcEnter != 0)
+			collSub(_collisionAreas[_activeCollIndex].funcEnter);
+
+		WRITE_VAR(16, 0);
+		_activeCollResId = 0;
+	}
+	while (_activeCollResId == 0 && !_vm->_inter->_terminate && !_vm->_quitRequested);
+
+	if ((_activeCollResId & 0xFFF) == collResId) {
+		_collStackPos = 0;
+		var_24 = 0;
+		var_26 = 1;
+		for (i = 0; i < 150; i++) {
+			if (_collisionAreas[i].left == -1)
+				continue;
+
+			if ((_collisionAreas[i].id & 0xC000) == 0x8000)
+				continue;
+
+			if ((_collisionAreas[i].flags & 0x0f) < 3)
+				continue;
+
+			if ((_collisionAreas[i].flags & 0x0f) > 10)
+				continue;
+
+			if ((_collisionAreas[i].flags & 0x0f) > 8) {
+				char *ptr;
+				strcpy(_tempStr,
+				    _vm->_global->_inter_variables + _collisionAreas[i].key);
+				while ((ptr = strchr(_tempStr, ' ')) != 0) {
+					_vm->_util->cutFromStr(_tempStr, (ptr - _tempStr), 1);
+					ptr = strchr(_tempStr, ' ');
+				}
+				strcpy(_vm->_global->_inter_variables + _collisionAreas[i].key, _tempStr);
+				if (_vm->_language == 2) { // loc_16080
+					warning("GOB2 Stub! Game_v2::collisionsBlock(), language == 2");
+				}
+			}
+
+			if ((_collisionAreas[i].flags & 0x0f) >= 5 &&
+			    (_collisionAreas[i].flags & 0x0f) <= 8) {
+				str = descArray[var_24].ptr;
+
+				strcpy(_tempStr, _vm->_global->_inter_variables + _collisionAreas[i].key);
+
+				if ((_collisionAreas[i].flags & 0x0f) < 7)
+					_vm->_util->prepareStr(_tempStr);
+
+				int16 pos = 0;
+				do {
+					strcpy(_collStr, str);
+					pos += strlen(str) + 1;
+
+					str += strlen(str) + 1;
+
+					if ((_collisionAreas[i].flags & 0x0f) < 7)
+						_vm->_util->prepareStr(_collStr);
+
+					if (strcmp(_tempStr, _collStr) == 0) {
+						VAR(17)++;
+						WRITE_VAR(17 + var_26, 1);
+						break;
+					}
+				} while (READ_LE_UINT16(descArray[var_24].ptr - 2) > pos);
+				_collStackPos++;
+			} else {
+				VAR(17 + var_26) = 2;
+			}
+			var_24++;
+			var_26++;
+		}
+
+		if (_collStackPos != (int16)VAR(17))
+			WRITE_VAR(17, 0);
+		else
+			WRITE_VAR(17, 1);
+	}
+
+	if (_handleMouse == 1)
+		_vm->_draw->blitCursor();
+
+	savedIP = 0;
+	if (!_vm->_inter->_terminate) {
+		savedIP = (char *)_totFileData + _collisionAreas[_activeCollIndex].funcLeave;
+
+		_vm->_inter->storeMouse();
+		if ((_activeCollResId & 0xF000) == 0x8000)
+			WRITE_VAR(16, array[_activeCollResId & 0xFFF]);
+		else
+			WRITE_VAR(16, _activeCollResId & 0xFFF);
+	}
+
+	for (curCmd = 0; curCmd < count; curCmd++)
+		freeCollision(curCmd + 0x8000);
+
+	for (i = 0; i < 150; i++) {
+		if (((_collisionAreas[i].id & 0xF000) == 0xA000) ||
+				((_collisionAreas[i].id & 0xF000) == 0x9000))
+			_collisionAreas[i].id |= 0x4000;
+	}
+
+	_vm->_global->_inter_execPtr = savedIP;
+}
+
+int16 Game_v2::multiEdit(int16 time, int16 index, int16 *pCurPos, InputDesc * inpDesc,
+		int16 *collResId, int16 *collIndex) {
+	Collision *collArea;
+	int16 descInd;
+	int16 key;
+	int16 found = -1;
+	int16 i;
+	void *fontExtraBak;
+	int16 w2E8E2Bak;
+
+	descInd = 0;
+	for (i = 0; i < 150; i++) {
+		collArea = &_collisionAreas[i];
+
+		if (collArea->left == -1)
+			continue;
+
+		if ((collArea->id & 0xC000) == 0x8000)
+			continue;
+
+		if ((collArea->flags & 0x0f) < 3)
+			continue;
+
+		if ((collArea->flags & 0x0f) > 10)
+			continue;
+
+		strcpy(_tempStr, _vm->_global->_inter_variables + collArea->key);
+
+		_vm->_draw->_destSpriteX = collArea->left;
+		_vm->_draw->_destSpriteY = collArea->top;
+		_vm->_draw->_spriteRight = collArea->right - collArea->left + 1;
+		_vm->_draw->_spriteBottom = collArea->bottom - collArea->top + 1;
+
+		_vm->_draw->_destSurface = 21;
+
+		_vm->_draw->_backColor = inpDesc[descInd].backColor;
+		_vm->_draw->_frontColor = inpDesc[descInd].frontColor;
+		_vm->_draw->_textToPrint = _tempStr;
+		_vm->_draw->_transparency = 1;
+		_vm->_draw->_fontIndex = inpDesc[descInd].fontIndex;
+
+		fontExtraBak = _vm->_draw->_fonts[_vm->_draw->_fontIndex]->extraData;
+		w2E8E2Bak = _vm->_draw->_word_2E8E2;
+		_vm->_draw->_word_2E8E2 = 2;
+		_vm->_draw->_fonts[_vm->_draw->_fontIndex]->extraData = 0;
+
+		_vm->_draw->spriteOperation(DRAW_FILLRECT | 0x10);
+
+		_vm->_draw->_destSpriteY += ((collArea->bottom - collArea->top + 1) -
+				_vm->_draw->_fonts[_vm->_draw->_fontIndex]->itemHeight) / 2;
+
+		_vm->_draw->spriteOperation(DRAW_PRINTTEXT | 0x10);
+
+		_vm->_draw->_word_2E8E2 = w2E8E2Bak;
+		_vm->_draw->_fonts[_vm->_draw->_fontIndex]->extraData = fontExtraBak;
+
+		descInd++;
+	}
+
+	for (i = 0; i < 40; i++) {
+		WRITE_VAR_OFFSET(i * 4 + 0x44, 0);
+	}
+
+	while (1) {
+		descInd = 0;
+
+		for (i = 0; i < 150; i++) {
+			collArea = &_collisionAreas[i];
+
+			if (collArea->left == -1)
+				continue;
+
+			if ((collArea->id & 0xC000) == 0x8000)
+				continue;
+
+			if ((collArea->flags & 0x0f) < 3)
+				continue;
+
+			if ((collArea->flags & 0x0f) > 10)
+				continue;
+
+			if (descInd == *pCurPos) {
+				found = i;
+				break;
+			}
+
+			descInd++;
+		}
+
+		assert(found != -1);
+
+		collArea = &_collisionAreas[found];
+
+		key = inputArea(collArea->left, collArea->top,
+		    collArea->right - collArea->left + 1,
+		    collArea->bottom - collArea->top + 1,
+		    inpDesc[*pCurPos].backColor, inpDesc[*pCurPos].frontColor,
+		    _vm->_global->_inter_variables + collArea->key,
+		    inpDesc[*pCurPos].fontIndex, collArea->flags, &time);
+
+		if (_vm->_inter->_terminate)
+			return 0;
+
+		switch (key) {
+		case 0:
+			if (*collResId == 0)
+				return 0;
+
+			if ((_collisionAreas[*collIndex].flags & 0x0f) < 3)
+				return 0;
+
+			if ((_collisionAreas[*collIndex].flags & 0x0f) > 10)
+				return 0;
+
+			*pCurPos = 0;
+			for (i = 0; i < 150; i++) {
+				collArea = &_collisionAreas[i];
+
+				if (collArea->left == -1)
+					continue;
+
+				if ((collArea->id & 0xC000) == 0x8000)
+					continue;
+
+				if ((collArea->flags & 0x0f) < 3)
+					continue;
+
+				if ((collArea->flags & 0x0f) > 10)
+					continue;
+
+				if (i == *collIndex)
+					break;
+
+				pCurPos[0]++;
+			}
+			break;
+
+		case 0x3b00:
+		case 0x3c00:
+		case 0x3d00:
+		case 0x3e00:
+		case 0x3f00:
+		case 0x4000:
+		case 0x4100:
+		case 0x4200:
+		case 0x4300:
+		case 0x4400:
+			return key;
+
+		case 0x1c0d:
+
+			if (index == 1)
+				return key;
+
+			if (*pCurPos == index - 1) {
+				*pCurPos = 0;
+				break;
+			}
+
+			pCurPos[0]++;
+			break;
+
+		case 0x5000:
+			if (index - 1 > *pCurPos)
+				pCurPos[0]++;
+			break;
+
+		case 0x4800:
+			if (*pCurPos > 0)
+				pCurPos[0]--;
+			break;
+		}
+	}
+}
+
+int16 Game_v2::checkMousePoint(int16 all, int16 *resId, int16 *resIndex) {
+	Collision *ptr;
+	int16 i;
+
+	if (resId != 0)
+		*resId = 0;
+
+	*resIndex = 0;
+
+	ptr = _collisionAreas;
+	for (i = 0; ptr->left != -1; ptr++, i++) {
+		if (ptr->id & 0x4000)
+			continue;
+
+		if (all) {
+			if ((ptr->flags & 0xf) > 1)
+				continue;
+
+			if ((ptr->flags & 0xf00) != 0)
+				continue;
+
+			if (_vm->_global->_inter_mouseX < ptr->left
+			    || _vm->_global->_inter_mouseX > ptr->right
+			    || _vm->_global->_inter_mouseY < ptr->top
+			    || _vm->_global->_inter_mouseY > ptr->bottom)
+				continue;
+
+			if (resId != 0)
+				*resId = ptr->id;
+
+			*resIndex = i;
+			return ptr->key;
+		} else {
+			if ((ptr->flags & 0xf00) != 0)
+				continue;
+
+			if ((ptr->flags & 0xf) < 1)
+				continue;
+
+			if ((ptr->flags & 0xf0) >> 4 != _mouseButtons - 1
+			    && (ptr->flags & 0xf0) >> 4 != 2)
+				continue;
+
+			if (_vm->_global->_inter_mouseX < ptr->left
+			    || _vm->_global->_inter_mouseX > ptr->right
+			    || _vm->_global->_inter_mouseY < ptr->top
+			    || _vm->_global->_inter_mouseY > ptr->bottom)
+				continue;
+
+			if (resId != 0)
+				*resId = ptr->id;
+			*resIndex = i;
+			if (((ptr->flags & 0xf) == 1) || ((ptr->flags & 0xf) == 2))
+				return ptr->key;
+			return 0;
+		}
+	}
+
+	if (_mouseButtons != 1 && all == 0)
+		return 0x11b;
+
+	return 0;
+}
+
 } // End of namespace Gob

Modified: scummvm/trunk/engines/gob/inter.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter.cpp	2006-06-29 12:32:37 UTC (rev 23345)
+++ scummvm/trunk/engines/gob/inter.cpp	2006-06-29 12:55:57 UTC (rev 23346)
@@ -279,7 +279,9 @@
 		_terminate = true;
 }
 
-void Inter::initControlVars(void) {
+void Inter::initControlVars(char full) {
+	int i;
+
 	*_nestLevel = 0;
 	*_breakFromLevel = -1;
 
@@ -287,8 +289,12 @@
 
 	_breakFlag = false;
 	_terminate = false;
-	_animPalDir[0] = 0;
-	_soundEndTimeKey = 0;
+
+	if (full == 1) {
+		for (i = 0; i < 8; i++)
+			_animPalDir[i] = 0;
+		_soundEndTimeKey = 0;
+	}
 }
 
 void Inter::renewTimeInVars(void) {

Modified: scummvm/trunk/engines/gob/inter.h
===================================================================
--- scummvm/trunk/engines/gob/inter.h	2006-06-29 12:32:37 UTC (rev 23345)
+++ scummvm/trunk/engines/gob/inter.h	2006-06-29 12:55:57 UTC (rev 23346)
@@ -57,7 +57,7 @@
 	void storeKey(int16 key);
 	void checkSwitchTable(char **ppExec);
 	void callSub(int16 retFlag);
-	void initControlVars(void);
+	void initControlVars(char full);
 	void renewTimeInVars(void);
 	void manipulateMap(int16 xPos, int16 yPos, int16 item);
 	virtual int16 loadSound(int16 slot) = 0;
@@ -317,6 +317,7 @@
 	void o2_stub0x80(void);
 	void o2_stub0x82(void);
 	void o2_stub0x85(void);
+	bool o2_checkData(char &cmdCount, int16 &counter, int16 &retFlag);
 	bool o2_stopSound(char &cmdCount, int16 &counter, int16 &retFlag);
 	bool o2_createSprite(char &cmdCount, int16 &counter, int16 &retFlag);
 	bool o2_animPalInit(char &cmdCount, int16 &counter, int16 &retFlag);

Modified: scummvm/trunk/engines/gob/inter_v2.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_v2.cpp	2006-06-29 12:32:37 UTC (rev 23345)
+++ scummvm/trunk/engines/gob/inter_v2.cpp	2006-06-29 12:55:57 UTC (rev 23346)
@@ -526,7 +526,7 @@
 		OPCODE(o1_waitEndPlay),
 		OPCODE(o1_playComposition),
 		OPCODE(o1_getFreeMem),
-		OPCODE(o1_checkData),
+		OPCODE(o2_checkData),
 		/* 40 */
 		{NULL, ""},
 		OPCODE(o1_prepareStr),
@@ -1180,6 +1180,23 @@
 	}
 }
 
+bool Inter_v2::o2_checkData(char &cmdCount, int16 &counter, int16 &retFlag) {
+	int16 handle;
+	int16 varOff;
+
+	evalExpr(0);
+	varOff = _vm->_parse->parseVarIndex();
+	handle = _vm->_dataio->openData(_vm->_global->_inter_resStr);
+
+	WRITE_VAR_OFFSET(varOff, handle);
+	if (handle >= 0) {
+		_vm->_dataio->closeData(handle);
+		WRITE_VAR(16, (uint32) _vm->_dataio->getDataSize(_vm->_global->_inter_resStr));
+	} else
+		WRITE_VAR(16, (uint32) -1);
+	return false;
+}
+
 bool Inter_v2::o2_stopSound(char &cmdCount, int16 &counter, int16 &retFlag) {
 	_vm->_snd->stopSound(_vm->_parse->parseValExpr());
 	_soundEndTimeKey = 0;

Modified: scummvm/trunk/engines/gob/mult.h
===================================================================
--- scummvm/trunk/engines/gob/mult.h	2006-06-29 12:32:37 UTC (rev 23345)
+++ scummvm/trunk/engines/gob/mult.h	2006-06-29 12:55:57 UTC (rev 23346)
@@ -310,7 +310,10 @@
 		int16 animIndices[10];
 		int16 animLoaded[10];
 		int16 animKeysFrames[4];
-		int16 someKeysFrames[4];
+		int16 animKeysStartFrames[4];
+		int16 animKeysStopFrames[4];
+		int16 animKeysIndices[4][4];
+		int8 animDirection;
 
 		int16 textKeysCount;
 		Mult_TextKey *textKeys;
@@ -323,13 +326,11 @@
 		int16 frameRate;      
 
 		Video::Color fadePal[5][16];
-		int16 field_124[4][4]; // Not sure here either
-		int16 palAnimIndices[4]; // Not sure here either
+		int16 field_124[4][4];
+		int16 palAnimIndices[4]; // Not sure here
+		// TODO: Use this one instead of _frameStart
 		int16 frameStart;
 
-		int8 field_156;
-		int16 field_157[4];
-		int16 field_15F[4][4];
 		int16 field_17F[4][4];
 
 		int16 someKeysCount[4];

Modified: scummvm/trunk/engines/gob/mult_v2.cpp
===================================================================
--- scummvm/trunk/engines/gob/mult_v2.cpp	2006-06-29 12:32:37 UTC (rev 23345)
+++ scummvm/trunk/engines/gob/mult_v2.cpp	2006-06-29 12:55:57 UTC (rev 23346)
@@ -45,6 +45,7 @@
 
 	_renderData2 = 0;
 	_multData2 = 0;
+	_frameStart = 0; // Temporarily to sync _frameStart and _multData2->frameStart
 	for (i = 0; i < 8; i++) _multDatas[i] = 0;
 }
 
@@ -76,6 +77,7 @@
 	index = (resId & 0x8000) ? *_vm->_global->_inter_execPtr++ : 0;
 
 	_multData2 = new Mult_Data;
+	_frameStart = 0; // Temporarily to sync _frameStart and _multData2->frameStart
 	memset(_multData2, 0, sizeof(Mult_Data));
 
 	_multDatas[index] = _multData2;
@@ -90,6 +92,7 @@
 
 	_multData2->sndSlotsCount = 0;
 	_multData2->frameStart = 0;
+	_frameStart = 0;
 
 	extData = _vm->_game->loadExtData(resId, 0, 0);
 	Common::MemoryReadStream data((byte *) extData, 4294967295U);
@@ -137,7 +140,7 @@
 		_multData2->someKeysIndices[i] = -1;
 
 		for (j = 0; j < 4; j++) {
-			_multData2->field_15F[i][j] = 0;
+			_multData2->animKeysIndices[i][j] = 0;
 			_multData2->field_17F[i][j] = 0;
 		}
 
@@ -242,7 +245,7 @@
 		if (_vm->_game->_totFileData[0x29] >= 51) {
 			size = data.readSint16LE();
 			_multData2->somepointer10 = new char[size * 20];
-//			data.read(_multData2->somepointer09 /*???*/, size * 20);
+			// According to the original asm, these bytes are written into _multData2->somepointer09!
 			data.read(_multData2->somepointer10, size * 20);
 			size = _vm->_inter->load16();
 			if (size > 0) {
@@ -277,6 +280,7 @@
 
 	debugC(4, DEBUG_GAMEFLOW, "Switching to mult %d", multindex);
 	_multData2 = _multDatas[multindex];
+	_frameStart = _multData2->frameStart; // Temporarily to sync _frameStart and _multData2->frameStart
 }
 
 void Mult_v2::multSub(uint16 multindex) {
@@ -295,6 +299,7 @@
 
 	debugC(4, DEBUG_GAMEFLOW, "Sub mult %d", multindex);
 	_multData2 = _multDatas[multindex];
+	_frameStart = _multData2->frameStart; // Temporarily to sync _frameStart and _multData2->frameStart
 
 	if (_multData2 == 0) {
 		_vm->_parse->parseValExpr();
@@ -315,9 +320,9 @@
 
 	if (flags & 0x400) {
 		flags = 0x400;
-		_multData2->field_156 = -1;
+		_multData2->animDirection = -1;
 	} else {
-		_multData2->field_156 = 1;
+		_multData2->animDirection = 1;
 		flags &= 0x7F;
 	}
 
@@ -327,7 +332,7 @@
 	}
 	expr = _vm->_parse->parseValExpr();
 	_multData2->animKeysFrames[index] = expr;
-	_multData2->someKeysFrames[index] = expr;
+	_multData2->animKeysStartFrames[index] = expr;
 	
 	WRITE_VAR(18 + index, expr);
 	if (expr == -1) {
@@ -337,22 +342,22 @@
 					_objects[_multData2->field_124[index][i]].pAnimData->animType =
 						_objects[_multData2->field_124[index][i]].pAnimData->field_17;
 	} else {
-		if (_multData2->field_156 == 1) {
-			_multData2->field_157[index] = 32000;
+		if (_multData2->animDirection == 1) {
+			_multData2->animKeysStopFrames[index] = 32000;
 			for (i = 0; i < _multData2->textKeysCount; i++) {
 				textFrame = _multData2->textKeys[i].frame;
-				if ((textFrame > _multData2->someKeysFrames[index]) &&
-						(textFrame < _multData2->field_157[index])) {
-					_multData2->field_157[index] = textFrame;
+				if ((textFrame > _multData2->animKeysStartFrames[index]) &&
+						(textFrame < _multData2->animKeysStopFrames[index])) {
+					_multData2->animKeysStopFrames[index] = textFrame;
 				}
 			}
 		} else {
-			_multData2->field_157[index] = 0;
+			_multData2->animKeysStopFrames[index] = 0;
 			for (i = 0; i < _multData2->textKeysCount; i++) {
 				textFrame = _multData2->textKeys[i].frame;
-				if ((textFrame < _multData2->someKeysFrames[index]) &&
-						(textFrame > _multData2->field_157[index])) {
-					_multData2->field_157[index] = textFrame;
+				if ((textFrame < _multData2->animKeysStartFrames[index]) &&
+						(textFrame > _multData2->animKeysStopFrames[index])) {
+					_multData2->animKeysStopFrames[index] = textFrame;
 				}
 			}
 		}
@@ -365,27 +370,27 @@
 		}
 
 		for (i = 0; i < 4; i++) {
-			_multData2->field_15F[index][i] = 0;
+			_multData2->animKeysIndices[index][i] = 0;
 			for (j = 0; j < _multData2->animKeysCount[i]; j++) {
-				if (_multData2->animKeys[i][j].frame >= _multData2->someKeysFrames[index])
-					_multData2->field_15F[index][i] = j;
+				if (_multData2->animKeys[i][j].frame == _multData2->animKeysStartFrames[index])
+					_multData2->animKeysIndices[index][i] = j;
 			}
 		}
 
-		if (_multData2->field_156 == -1) { // loc_60CF
+		if (_multData2->animDirection == -1) { // loc_60CF
 			warning("Mult_v2::multSub(), someKeys and someKeysIndices");
 		}
 
 		for (i = 0; i < 4; i++) {
 			_multData2->field_17F[index][i] = 0;
 			for (j = 0; j < _multData2->someKeysCount[i]; j++) {
-				if (_multData2->field_156 == 1) {
-					if (_multData2->someKeys[i][j].frame >= _multData2->someKeysFrames[index]) {
+				if (_multData2->animDirection == 1) {
+					if (_multData2->someKeys[i][j].frame >= _multData2->animKeysStartFrames[index]) {
 						_multData2->field_17F[index][i] = j;
 						break;
 					}
 				} else {
-					if (_multData2->someKeys[i][j].frame >= _multData2->field_157[index]) {
+					if (_multData2->someKeys[i][j].frame >= _multData2->animKeysStopFrames[index]) {
 						_multData2->field_17F[index][i] = j;
 						break;
 					}
@@ -431,8 +436,6 @@
 				delete[] _objects;
 			if (_orderArray)
 				delete[] _orderArray;
-/*			if (_renderData)
-				delete[] _renderData;*/
 			if (_renderData2)
 				delete[] _renderData2;
 
@@ -441,8 +444,6 @@
 
 			_orderArray = new int8[_objCount];
 			memset(_orderArray, 0, _objCount * sizeof(int8));
-/*			_renderData = new int16[9 * _objCount];
-			memset(_renderData, 0, _objCount * 9 * sizeof(int16));*/
 			_renderData2 = new Mult_Object*[_objCount];
 			memset(_renderData2, 0, _objCount * sizeof(Mult_Object*));
 
@@ -580,7 +581,7 @@
 
 		WRITE_VAR(57, (uint32)-1);
 	} else {
-		WRITE_VAR(57, _frame - 1 - _frameStart);
+		WRITE_VAR(57, _frame - 1 - _multData2->frameStart);
 	}
 }
 
@@ -696,6 +697,7 @@
 			*pStop = 0;
 		} else if (cmd == 1) {
 			*pStopNoClear = 1;
+			_multData2->frameStart = 0;
 			_frameStart = 0;
 		} else if (cmd == 3) {
 			*pStop = 0;
@@ -900,14 +902,14 @@
 
 	for (i = 0; i < 4; i++) {
 		if (_multData2->field_124[index][i] != -1) {
-			for (j = _multData2->field_15F[index][i]; j < _multData2->animKeysCount[i]; j++) {
+			for (j = _multData2->animKeysIndices[index][i]; j < _multData2->animKeysCount[i]; j++) {
 				if ((i >= 4) || (j >= _multData2->animKeysCount[i]))
 					continue;
 				animKey = &_multData2->animKeys[i][j];
 				if (animKey->frame == frame) {
 					animObj = &_objects[_multData2->field_124[index][i]];
 					if (animKey->layer > -1) {
-						_multData2->field_15F[index][i] = j;
+						_multData2->animKeysIndices[index][i] = j;
 						(*animObj->pPosX) = animKey->posX;
 						(*animObj->pPosY) = animKey->posY;
 						animObj->pAnimData->frame = 0;
@@ -947,9 +949,9 @@
 						_multData2->someKeysIndices[1] = -1;
 						_multData2->someKeysIndices[2] = -1;
 						_multData2->someKeysIndices[3] = -1;
-						if ((_multData2->field_156 == 1) || (someKey2->field_2 == 1))
+						if ((_multData2->animDirection == 1) || (someKey2->field_2 == 1))
 							_multData2->someKeysIndices[i] = j;
-						else if (_multData2->field_157[index] == frame)
+						else if (_multData2->animKeysStopFrames[index] == frame)
 							_multData2->someKeysIndices[i] = -1;
 						else
 							_multData2->someKeysIndices[i] = j - 1;
@@ -962,7 +964,7 @@
 		if (_multData2->someKeysIndices[i] != -1) {
 /*
 			int arg3 = frame - _multData2->someKeys[i][_multData2->someKeysIndices[i]].field_0;
-			int arg2 =  _multData2->field_156;
+			int arg2 =  _multData2->animDirection;
 			if ((arg2 != 1) && (--arg3 > 0))
 			arg3 = 0;
 			int arg1 = _multData2->someKeys[i][_multData2->someKeysIndices[i]];
@@ -976,7 +978,7 @@
 	doSoundAnim(0, frame);
 	WRITE_VAR(22, frame);
 
-	if (_multData2->field_157[index] == frame) {
+	if (_multData2->animKeysStopFrames[index] == frame) {
 		_multData2->someKeysIndices[0] = -1;
 		_multData2->someKeysIndices[1] = -1;
 		_multData2->someKeysIndices[2] = -1;
@@ -986,7 +988,7 @@
 			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 if(_multData2->field_156 == 1)
+	} else if(_multData2->animDirection == 1)
 		frame++;
 	else
 		frame--;
@@ -1004,6 +1006,7 @@
 	for (i = 0; i < 8; i++)
 		if (_multDatas[i] != 0) {
 			_multData2 = _multDatas[i];
+			_frameStart = _multData2->frameStart; // Temporarily to sync _frameStart and _multData2->frameStart
 			for (j = 0; j < 4; j++)
 				sub_62DD(j);
 		}
@@ -1404,6 +1407,7 @@
 
 	delete _multData2;
 	_multData2 = 0;
+	_frameStart = 0; // Temporarily to sync _frameStart and _multData2->frameStart
 }
 
 } // End of namespace Gob


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.





More information about the Scummvm-git-logs mailing list