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

strangerke at users.sourceforge.net strangerke at users.sourceforge.net
Sat Aug 21 20:16:04 CEST 2010


Revision: 52267
          http://scummvm.svn.sourceforge.net/scummvm/?rev=52267&view=rev
Author:   strangerke
Date:     2010-08-21 18:16:04 +0000 (Sat, 21 Aug 2010)

Log Message:
-----------
GOB: Clean up of Fascination code
Move Fascination specific function to appropriate classes, plus some style modifications

Modified Paths:
--------------
    scummvm/trunk/engines/gob/draw.cpp
    scummvm/trunk/engines/gob/draw.h
    scummvm/trunk/engines/gob/draw_fascin.cpp
    scummvm/trunk/engines/gob/game.cpp
    scummvm/trunk/engines/gob/hotspots.cpp
    scummvm/trunk/engines/gob/init_fascin.cpp
    scummvm/trunk/engines/gob/inter.cpp
    scummvm/trunk/engines/gob/sound/sound.cpp

Modified: scummvm/trunk/engines/gob/draw.cpp
===================================================================
--- scummvm/trunk/engines/gob/draw.cpp	2010-08-21 17:49:59 UTC (rev 52266)
+++ scummvm/trunk/engines/gob/draw.cpp	2010-08-21 18:16:04 UTC (rev 52267)
@@ -530,774 +530,6 @@
 	return;
 }
 
-void Draw::activeWin(int16 id) {
-	bool found = false;
-	int16 t[10], t2[10];
-	int nextId = -1;
-	int oldId  = -1;
-	SurfaceDescPtr tempSrf;
-	SurfaceDescPtr oldSrf[10];
-
-	if (_fascinWin[id].id == -1)
-		return;
-
-	blitInvalidated();
-
-	for (int i = 0; i < 10; i++) {
-		t[i]  = -1;
-		t2[i] = -1;
-		oldSrf[i].reset();
-	}
-
-	for (int i = 0; i < 10; i++)
-		if ((i != id) && (_fascinWin[i].id > _fascinWin[id].id) && (winOverlap(i, id))) {
-			t[_fascinWin[i].id] = i;
-			found = true;
-		}
-
-	if (found) {
-		for (int i = 9; i >= 0; i--) {
-			if (t[i] != -1) {
-				if (nextId != -1)
-					_vm->_video->drawSprite(*_backSurface, *_fascinWin[nextId].savedSurface,
-											_fascinWin[t[i]].left, _fascinWin[t[i]].top,
-											_fascinWin[t[i]].left + _fascinWin[t[i]].width  - 1,
-											_fascinWin[t[i]].top  + _fascinWin[t[i]].height - 1,
-											_fascinWin[t[i]].left & 7, 0, 0);
-				t2[i] = nextId;
-				restoreWin(t[i]);
-				nextId = t[i];
-			}
-		}
-
-		oldId = nextId;
-		_vm->_video->drawSprite(*_backSurface, *_fascinWin[nextId].savedSurface,
-								 _fascinWin[id].left, _fascinWin[id].top,
-								 _fascinWin[id].left + _fascinWin[id].width  - 1,
-								 _fascinWin[id].top  + _fascinWin[id].height - 1,
-								 _fascinWin[id].left & 7, 0, 0);
-		restoreWin(id);
-		nextId = id;
-
-		for (int i = 0; i < 10; i++) {
-			if (t[i] != -1) {
-				_vm->_video->drawSprite(*_backSurface, *_fascinWin[nextId].savedSurface,
-										_fascinWin[t[i]].left, _fascinWin[t[i]].top,
-										_fascinWin[t[i]].left + _fascinWin[t[i]].width  - 1,
-										_fascinWin[t[i]].top  + _fascinWin[t[i]].height - 1,
-										_fascinWin[t[i]].left & 7, 0, 0);
-				oldSrf[t[i]] = _fascinWin[nextId].savedSurface;
-				if (t2[i] != -1)
-					_vm->_video->drawSprite(*_fascinWin[t2[i]].savedSurface, *_backSurface,
-											 _fascinWin[t[i]].left & 7, 0,
-											(_fascinWin[t[i]].left & 7) + _fascinWin[t[i]].width - 1,
-											 _fascinWin[t[i]].height - 1, _fascinWin[t[i]].left,
-											 _fascinWin[t[i]].top, 0);
-				else {
-					// Shift skipped as always set to zero (?)
-					_vm->_video->drawSprite(*_frontSurface, *_backSurface,
-											 _fascinWin[t[i]].left, _fascinWin[t[i]].top,
-											 _fascinWin[t[i]].left + _fascinWin[t[i]].width  - 1,
-											 _fascinWin[t[i]].top  + _fascinWin[t[i]].height - 1,
-											 _fascinWin[t[i]].left, _fascinWin[t[i]].top, 0);
-				}
-				invalidateRect(_fascinWin[t[i]].left, _fascinWin[t[i]].top,
-							_fascinWin[t[i]].left + _fascinWin[t[i]].width  - 1,
-							_fascinWin[t[i]].top  + _fascinWin[t[i]].height - 1);
-				nextId = t2[i];
-			}
-		}
-
-		tempSrf = _vm->_video->initSurfDesc(_vm->_global->_videoMode, _winMaxWidth + 7, _winMaxHeight, 0);
-		_vm->_video->drawSprite(*_backSurface, *tempSrf,
-								 _fascinWin[id].left, _fascinWin[id].top,
-								 _fascinWin[id].left + _fascinWin[id].width  - 1,
-								 _fascinWin[id].top  + _fascinWin[id].height - 1,
-								 _fascinWin[id].left & 7, 0, 0);
-		_vm->_video->drawSprite(*_fascinWin[oldId].savedSurface, *_backSurface,
-								 _fascinWin[id].left & 7, 0,
-								(_fascinWin[id].left & 7) + _fascinWin[id].width - 1,
-								 _fascinWin[id].height - 1,
-								 _fascinWin[id].left, _fascinWin[id].top, 0);
-
-		_fascinWin[oldId].savedSurface.reset();
-		_fascinWin[oldId].savedSurface = tempSrf;
-		oldSrf[id] = _fascinWin[oldId].savedSurface;
-
-		invalidateRect(_fascinWin[id].left, _fascinWin[id].top,
-					_fascinWin[id].left + _fascinWin[id].width  - 1,
-					_fascinWin[id].top  + _fascinWin[id].height - 1);
-		nextId = id;
-
-		for (int j = 0; j < 10; j++) {
-			if (oldSrf[j]!=0)
-				_fascinWin[j].savedSurface = oldSrf[j];
-		}
-	}
-
-	for (int i = 0; i < 10; i++) {
-		if ((i != id) && (_fascinWin[i].id > _fascinWin[id].id))
-			_fascinWin[i].id--;
-	}
-
-	_fascinWin[id].id = _winCount - 1;
-}
-
-bool Draw::winOverlap(int16 idWin1, int16 idWin2) {
-	if ((_fascinWin[idWin1].left + _fascinWin[idWin1].width  <= _fascinWin[idWin2].left) ||
-		(_fascinWin[idWin2].left + _fascinWin[idWin2].width  <= _fascinWin[idWin1].left) ||
-		(_fascinWin[idWin1].top  + _fascinWin[idWin1].height <= _fascinWin[idWin2].top ) ||
-		(_fascinWin[idWin2].top  + _fascinWin[idWin2].height <= _fascinWin[idWin1].top ))
-		return false;
-
-	return true;
-}
-
-void Draw::closeWin(int16 i) {
-	if (_fascinWin[i].id == -1)
-		return;
-
-	WRITE_VAR((_winVarArrayStatus / 4) + i, VAR((_winVarArrayStatus / 4) + i) | 1);
-	restoreWin(i);
-	_fascinWin[i].id = -1;
-	_fascinWin[i].savedSurface.reset();
-	_winCount--;
-}
-
-void Draw::closeAllWin() {
-	for (int i = 0; i < 10; i++){
-		activeWin(i);
-		closeWin(i);
-	}
-}
-
-int16 Draw::openWin(int16 id) {
-	if (_fascinWin[id].id != -1)
-		return 0;
-
-	_fascinWin[id].id = _winCount++;
-	_fascinWin[id].left   = VAR((_winVarArrayLeft   / 4) + id);
-	_fascinWin[id].top    = VAR((_winVarArrayTop    / 4) + id);
-	_fascinWin[id].width  = VAR((_winVarArrayWidth  / 4) + id);
-	_fascinWin[id].height = VAR((_winVarArrayHeight / 4) + id);
-
-	_fascinWin[id].savedSurface = _vm->_video->initSurfDesc(_vm->_global->_videoMode, _winMaxWidth + 7, _winMaxHeight, 0);
-
-	saveWin(id);
-	WRITE_VAR((_winVarArrayStatus / 4) + id, VAR((_winVarArrayStatus / 4) + id) & 0xFFFFFFFE);
-
-	return 1;
-}
-
-void Draw::restoreWin(int16 i) {
-	_vm->_video->drawSprite(*_fascinWin[i].savedSurface, *_backSurface,
-							 _fascinWin[i].left & 7, 0,
-							(_fascinWin[i].left & 7) + _fascinWin[i].width - 1, _fascinWin[i].height - 1,
-							 _fascinWin[i].left, _fascinWin[i].top, 0);
-	invalidateRect(_fascinWin[i].left, _fascinWin[i].top,
-				_fascinWin[i].left + _fascinWin[i].width  - 1,
-				_fascinWin[i].top  + _fascinWin[i].height - 1);
-}
-
-void Draw::saveWin(int16 id) {
-	_vm->_video->drawSprite(*_backSurface, *_fascinWin[id].savedSurface,
-							_fascinWin[id].left,  _fascinWin[id].top,
-							_fascinWin[id].left + _fascinWin[id].width  - 1,
-							_fascinWin[id].top  + _fascinWin[id].height - 1,
-							_fascinWin[id].left & 7, 0, 0);
-}
-
-void Draw::winMove(int16 id) {
-	int oldLeft = _fascinWin[id].left;
-	int oldTop  = _fascinWin[id].top;
-
-	restoreWin(id);
-
-	_fascinWin[id].left = _vm->_global->_inter_mouseX;
-	_fascinWin[id].top  = _vm->_global->_inter_mouseY;
-
-	WRITE_VAR((_winVarArrayLeft / 4) + id, _fascinWin[id].left);
-	WRITE_VAR((_winVarArrayTop  / 4) + id, _fascinWin[id].top);
-
-	saveWin(id);
-
-	// Shift skipped as always set to zero (?)
-	_vm->_video->drawSprite(*_frontSurface, *_backSurface,
-							oldLeft, oldTop,
-							oldLeft + _fascinWin[id].width  - 1,
-							oldTop  + _fascinWin[id].height - 1,
-							_fascinWin[id].left, _fascinWin[id].top, 0);
-	invalidateRect(_fascinWin[id].left, _fascinWin[id].top,
-				   _fascinWin[id].left + _fascinWin[id].width  - 1,
-				   _fascinWin[id].top  + _fascinWin[id].height - 1);
-}
-
-void Draw::winTrace(int16 left, int16 top, int16 width, int16 height) {
-  int16 right, bottom;
- 
-  right  = left + width  - 1;
-  bottom = top  + height - 1;
- 
- 
-  for(int32 x = left; x < right; x++ ) {
-    _frontSurface->getVidMem()[_frontSurface->getWidth() * top + x] = (128 + _frontSurface->getVidMem()[_frontSurface->getWidth() * top + x]) & 0xff;
-    _frontSurface->getVidMem()[_frontSurface->getWidth() * bottom + x] = (128 + _frontSurface->getVidMem()[_frontSurface->getWidth() * bottom + x]) & 0xff;
-  }
- 
-  for(int32 y = top; y < bottom; y++ ) {
-    _frontSurface->getVidMem()[_frontSurface->getWidth() * y + left] = (128 + _frontSurface->getVidMem()[_frontSurface->getWidth() * y + left]) & 0xff;
-    _frontSurface->getVidMem()[_frontSurface->getWidth() * y + right] = (128 + _frontSurface->getVidMem()[_frontSurface->getWidth() * y + right]) & 0xff;
-  }
- 
-  _vm->_video->dirtyRectsAll();
-  _vm->_video->retrace(true);
-}
-
-void Draw::handleWinBorder(int16 id) {
-	int16 minX = 0;
-	int16 maxX = 320;
-	int16 minY = 0;
-	int16 maxY = 200;
-
-	if (VAR((_winVarArrayStatus / 4) + id) & 8)
-		minX = (int16)(VAR((_winVarArrayLimitsX / 4) + id) >> 16L);
-	if (VAR((_winVarArrayStatus / 4) + id) & 16)
-		maxX = (int16)(VAR((_winVarArrayLimitsX / 4) + id) & 0xFFFFL);
-	if (VAR((_winVarArrayStatus / 4) + id) & 32)
-		minY = (int16)(VAR((_winVarArrayLimitsY / 4) + id) >> 16L);
-	if (VAR((_winVarArrayStatus / 4) + id) & 64)
-		maxY = (int16)(VAR((_winVarArrayLimitsY / 4) + id) & 0xFFFFL);
-
-	_vm->_global->_inter_mouseX = _fascinWin[id].left;
-	_vm->_global->_inter_mouseY = _fascinWin[id].top;
-
-	if (_vm->_global->_mousePresent)
-		_vm->_util->setMousePos(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY);
-
-	winTrace(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY, _fascinWin[id].width, _fascinWin[id].height);
-	_cursorX = _vm->_global->_inter_mouseX;
-	_cursorY = _vm->_global->_inter_mouseY;
-
-	do {
-		_vm->_game->checkKeys(&_vm->_global->_inter_mouseX, &_vm->_global->_inter_mouseY, &_vm->_game->_mouseButtons, 1);
-
-		if (_vm->_global->_inter_mouseX != _cursorX || _vm->_global->_inter_mouseY != _cursorY) {
-			if (_vm->_global->_inter_mouseX < minX) {
-				_vm->_global->_inter_mouseX = minX;
-				if (_vm->_global->_mousePresent)
-					_vm->_util->setMousePos(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY);
-			}
-
-			if (_vm->_global->_inter_mouseY < minY) {
-				_vm->_global->_inter_mouseY = minY;
-				if (_vm->_global->_mousePresent)
-					_vm->_util->setMousePos(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY);
-			}
-
-			if (_vm->_global->_inter_mouseX + _fascinWin[id].width > maxX) {
-				_vm->_global->_inter_mouseX = maxX - _fascinWin[id].width;
-				if (_vm->_global->_mousePresent)
-					_vm->_util->setMousePos(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY);
-			}
-
-			if (_vm->_global->_inter_mouseY + _fascinWin[id].height > maxY) {
-				_vm->_global->_inter_mouseY = maxY - _fascinWin[id].height;
-				if (_vm->_global->_mousePresent)
-					_vm->_util->setMousePos(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY);
-			}
-
-			winTrace(_cursorX, _cursorY, _fascinWin[id].width, _fascinWin[id].height);
-			winTrace(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY, _fascinWin[id].width, _fascinWin[id].height);
-			_cursorX = _vm->_global->_inter_mouseX;
-			_cursorY = _vm->_global->_inter_mouseY;
-		}
-	} while (_vm->_game->_mouseButtons);
-	winTrace(_cursorX, _cursorY, _fascinWin[id].width, _fascinWin[id].height);
-	_cursorX = _vm->_global->_inter_mouseX;
-	_cursorY = _vm->_global->_inter_mouseY;
-}
-
-int16 Draw::handleCurWin() {
-	int8 matchNum = 0;
-	int16 bestMatch = -1;
-
-	if ((_vm->_game->_mouseButtons != 1) || ((_renderFlags & 128) == 0))
-		return 0;
-
-	for (int i = 0; i < 10; i++)
-		if (_fascinWin[i].id != -1) {
-			if ((_vm->_global->_inter_mouseX >= _fascinWin[i].left) &&
-			    (_vm->_global->_inter_mouseX <  _fascinWin[i].left + _fascinWin[i].width) &&
-			    (_vm->_global->_inter_mouseY >= _fascinWin[i].top) &&
-			    (_vm->_global->_inter_mouseY <  _fascinWin[i].top  + _fascinWin[i].height)) {
-
-				if (_fascinWin[i].id == _winCount - 1) {
-					if ((_vm->_global->_inter_mouseX < _fascinWin[i].left + 12) &&
-					    (_vm->_global->_inter_mouseY < _fascinWin[i].top  + 12) &&
-					    (VAR(_winVarArrayStatus / 4 + i) & 2)) {
-
-						blitCursor();
-						activeWin(i);
-						closeWin(i);
-						_vm->_util->waitMouseRelease(1);
-						return i;
-					}
-
-					if ((_vm->_global->_inter_mouseX >= _fascinWin[i].left + _fascinWin[i].width - 12) &&
-					    (_vm->_global->_inter_mouseY <  _fascinWin[i].top  + 12) &&
-					    (VAR(_winVarArrayStatus / 4 + i) & 4) &&
-					    (_vm->_global->_mousePresent) &&
-					    (_vm->_global->_videoMode != 0x07)) {
-
-						blitCursor();
-						handleWinBorder(i);
-						winMove(i);
-						_vm->_global->_inter_mouseX = _fascinWin[i].left + _fascinWin[i].width - 11;
-						_vm->_util->setMousePos(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY);
-						return -i;
-					}
-
-					return 0;
-
-				} else
-					if (_fascinWin[i].id > bestMatch) {
-						bestMatch = _fascinWin[i].id;
-						matchNum = i;
-					}
-			}
-		}
-	if (bestMatch != -1) {
-		blitCursor();
-		activeWin(matchNum);
-	}
-
-	return 0;
-}
-
-void Draw::winDecomp(int16 x, int16 y, SurfaceDescPtr destPtr) {
-	Resource *resource;
-	resource = _vm->_game->_resources->getResource((uint16) _spriteLeft,
-	                                               &_spriteRight, &_spriteBottom);
-
-	if (!resource)
-		return;
-
-	_vm->_video->drawPackedSprite(resource->getData(),
-			_spriteRight, _spriteBottom, x, y, _transparency, *destPtr);
-
-	delete resource;
-	return;
-}
-
-void Draw::winDraw(int16 fct) {
-	int16 left;
-	int16 top;
-	int16 width;
-	int16 height;
-
-	bool found = false;
-	int len;
-	Resource *resource;
-	int table[10];
-	SurfaceDescPtr tempSrf;
-
-	if (_destSurface == kBackSurface) {
-
-		if (_vm->_global->_curWinId) {
-			if (_fascinWin[_vm->_global->_curWinId].id == -1)
-				return;
-
-			else {
-				_destSpriteX += _fascinWin[_vm->_global->_curWinId].left;
-				_destSpriteY += _fascinWin[_vm->_global->_curWinId].top;
-				if (fct == 3 || (fct >= 7 && fct <= 9)) {
-					_spriteRight  += _fascinWin[_vm->_global->_curWinId].left;
-					_spriteBottom += _fascinWin[_vm->_global->_curWinId].top;
-				}
-			}
-		}
-
-		left = _destSpriteX;
-		top  = _destSpriteY;
-
-	} else {
-		if (_vm->_global->_curWinId) {
-			if (_fascinWin[_vm->_global->_curWinId].id == -1)
-				return;
-			else {
-				_spriteLeft += _fascinWin[_vm->_global->_curWinId].left;
-				_spriteTop  += _fascinWin[_vm->_global->_curWinId].top;
-			}
-		}
-
-		left = _spriteLeft;
-		top  = _spriteTop;
-	}
-
-	for (int i = 0; i < 10; i++)
-		table[i] = 0;
-
-	switch (fct) {
-	case DRAW_BLITSURF:    // 0 - move
-	case DRAW_FILLRECT:    // 2 - fill rectangle
-		width  = left + _spriteRight  - 1;
-		height = top  + _spriteBottom - 1;
-		break;
-
-	case DRAW_PUTPIXEL:    // 1 - put a pixel
-		width  = _destSpriteX;
-		height = _destSpriteY;
-		break;
-
-	case DRAW_DRAWLINE:    // 3 - draw line
-	case DRAW_DRAWBAR:     // 7 - draw border
-	case DRAW_CLEARRECT:   // 8 - clear rectangle
-	case DRAW_FILLRECTABS: // 9 - fill rectangle, with other coordinates
-		width  = _spriteRight;
-		height = _spriteBottom;
-		break;
-
-	case DRAW_INVALIDATE:  // 4 - Draw a circle
-		left   = _destSpriteX - _spriteRight;
-		top    = _destSpriteY - _spriteRight;
-		width  = _destSpriteX + _spriteRight;
-		height = _destSpriteY + _spriteBottom;
-		break;
-
-	case DRAW_LOADSPRITE:  // 5 - Uncompress and load a sprite
-		// TODO: check the implementation, currently dirty cut and paste of DRAW_SPRITE code
-		resource = _vm->_game->_resources->getResource((_spriteLeft & 0x3FFF),
-				&_spriteRight, &_spriteBottom);
-
-		if (!resource) {
-			width  = 0;
-			height = 0;
-			break;
-		}
-
-		_vm->_video->drawPackedSprite(resource->getData(),
-				_spriteRight, _spriteBottom, _destSpriteX, _destSpriteY,
-				_transparency, *_spritesArray[_destSurface]);
-
-		dirtiedRect(_destSurface, _destSpriteX, _destSpriteY,
-				_destSpriteX + _spriteRight - 1, _destSpriteY + _spriteBottom - 1);
-
-		delete resource;
-
-		width  = _destSpriteX + _spriteRight  - 1;
-		height = _destSpriteY + _spriteBottom - 1;
-		break;
-
-	case DRAW_PRINTTEXT:  // 6 - Display string
-		width  = _destSpriteX - 1 + strlen(_textToPrint) * _fonts[_fontIndex]->getCharWidth();
-		height = _destSpriteY - 1 + _fonts[_fontIndex]->getCharHeight();
-		break;
-
-	case DRAW_DRAWLETTER: // 10 - Display a character
-		if (_fontToSprite[_fontIndex].sprite == -1) {
-			width  = _destSpriteX - 1 + _fonts[_fontIndex]->getCharWidth();
-			height = _destSpriteY - 1 + _fonts[_fontIndex]->getCharHeight();
-		} else {
-			width  = _destSpriteX + _fontToSprite[_fontIndex].width  - 1;
-			height = _destSpriteY + _fontToSprite[_fontIndex].height - 1;
-		}
-		break;
-
-	default:
-//		width  = 0;
-//		height = 0;
-		error("winDraw - Unexpected fct value %d", fct);
-		break;
-	}
-
-	for (int i = 0; i < 10; i++)
-		if ((i != _vm->_global->_curWinId) && (_fascinWin[i].id != -1))
-			if (!_vm->_global->_curWinId || _fascinWin[i].id>_fascinWin[_vm->_global->_curWinId].id)
-				if ((_fascinWin[i].left + _fascinWin[i].width  > left) && (width  >= _fascinWin[i].left) &&
-				    (_fascinWin[i].top  + _fascinWin[i].height > top ) && (height >= _fascinWin[i].top)) {
-					found = true;
-					table[_fascinWin[i].id] = i;
-				}
-
-	if ((_sourceSurface == kBackSurface) && (fct == 0)) {
-		_vm->_video->drawSprite(*_spritesArray[_sourceSurface], *_spritesArray[_destSurface],
-								_spriteLeft, _spriteTop, _spriteLeft + _spriteRight - 1,
-								_spriteTop + _spriteBottom - 1, _destSpriteX, _destSpriteY, _transparency);
-		if (!found)
-			return;
-
-		int j = 0;
-		if (_vm->_global->_curWinId != 0)
-			j = _fascinWin[_vm->_global->_curWinId].id + 1;
-
-		for (int i = 9; i >= j; i--) {
-			if (table[i])
-				_vm->_video->drawSprite(*_fascinWin[table[i]].savedSurface, *_spritesArray[_destSurface],
-										 _fascinWin[table[i]].left & 7, 0,
-										(_fascinWin[table[i]].left & 7) + _fascinWin[table[i]].width - 1,
-										 _fascinWin[table[i]].height - 1, _fascinWin[table[i]].left - _spriteLeft + _destSpriteX,
-										 _fascinWin[table[i]].top - _spriteTop + _destSpriteY, 0);
-		}
-		return;
-	}
-
-	if (found) {
-		tempSrf = _vm->_video->initSurfDesc(_vm->_global->_videoMode, width - left + 1, height - top + 1, 0);
-		_vm->_video->drawSprite(*_backSurface, *tempSrf, left, top, width, height, 0, 0, 0);
-
-		int max = 0;
-		if (_vm->_global->_curWinId != 0)
-			max = _fascinWin[_vm->_global->_curWinId].id + 1;
-
-		for (int i = 9; i >= max; i--) {
-			if (table[i])
-				_vm->_video->drawSprite(*_fascinWin[table[i]].savedSurface, *tempSrf,
-										 _fascinWin[table[i]].left & 7, 0,
-										(_fascinWin[table[i]].left & 7) + _fascinWin[table[i]].width - 1,
-										 _fascinWin[table[i]].height - 1,
-										 _fascinWin[table[i]].left  - left,
-										 _fascinWin[table[i]].top   - top , 0);
-		}
-
-		invalidateRect(left, top, width, height);
-
-		switch (fct) {
-		case DRAW_BLITSURF:    // 0 - move
-			_vm->_video->drawSprite(*_spritesArray[_sourceSurface], *tempSrf,
-									_spriteLeft, _spriteTop, _spriteLeft + _spriteRight - 1,
-									_spriteTop + _spriteBottom - 1, 0, 0, _transparency);
-			break;
-
-		case DRAW_PUTPIXEL:    // 1 - put a pixel
-			_vm->_video->putPixel(0, 0, _frontColor, *tempSrf);
-			break;
-
-		case DRAW_FILLRECT:    // 2 - fill rectangle
-			_vm->_video->fillRect(*tempSrf, 0, 0, _spriteRight - 1, _spriteBottom - 1, _backColor);
-			break;
-
-		case DRAW_DRAWLINE:    // 3 - draw line
-			_vm->_video->drawLine(*tempSrf, 0, 0, _spriteRight - _destSpriteX, _spriteBottom - _destSpriteY, _frontColor);
-			break;
-
-		case DRAW_INVALIDATE:  // 4 - Draw a circle
-			_vm->_video->drawCircle(*tempSrf, _spriteRight, _spriteRight, _spriteRight, _frontColor);
-			break;
-
-		case DRAW_LOADSPRITE:  // 5 - Uncompress and load a sprite
-			winDecomp(0, 0, tempSrf);
-			break;
-
-		case DRAW_PRINTTEXT:   // 6 - Display string
-			len = strlen(_textToPrint);
-			for (int j = 0; j < len; j++)
-				_vm->_video->drawLetter(_textToPrint[j], j * _fonts[_fontIndex]->getCharWidth(), 0,
-										*_fonts[_fontIndex], _transparency, _frontColor, _backColor, *tempSrf);
-			_destSpriteX += len * _fonts[_fontIndex]->getCharWidth();
-			break;
-
-		case DRAW_DRAWBAR:     // 7 - draw border
-			_vm->_video->drawLine(*tempSrf, 0, _spriteBottom - _destSpriteY, _spriteRight - _destSpriteX, _spriteBottom - _destSpriteY, _frontColor);
-			_vm->_video->drawLine(*tempSrf, 0, 0, 0, _spriteBottom - _destSpriteY, _frontColor);
-			_vm->_video->drawLine(*tempSrf, _spriteRight - _destSpriteX, 0, _spriteRight - _destSpriteX, _spriteBottom - _destSpriteY, _frontColor);
-			_vm->_video->drawLine(*tempSrf, 0, 0, _spriteRight - _destSpriteX, 0, _frontColor);
-			break;
-
-		case DRAW_CLEARRECT:   // 8 - clear rectangle
-			if (_backColor < 16)
-				_vm->_video->fillRect(*tempSrf, 0, 0, _spriteRight - _destSpriteX, _spriteBottom - _destSpriteY, _backColor);
-			break;
-
-		case DRAW_FILLRECTABS: // 9 - fill rectangle, with other coordinates
-			_vm->_video->fillRect(*tempSrf, 0, 0, _spriteRight - _destSpriteX, _spriteBottom - _destSpriteY, _backColor);
-			break;
-
-		case DRAW_DRAWLETTER:  // 10 - Display a character
-			if (_fontToSprite[_fontIndex].sprite == -1) {
-
-				if (_letterToPrint)
-					_vm->_video->drawLetter(_letterToPrint, 0, 0, *_fonts[_fontIndex], _transparency, _frontColor, _backColor, *tempSrf);
-			} else {
-				int xx, yy, nn;
-				nn = _spritesArray[_fontToSprite[_fontIndex].sprite]->getWidth() / _fontToSprite[_fontIndex].width;
-				yy = ((_letterToPrint - _fontToSprite[_fontIndex].base) / nn) * _fontToSprite[_fontIndex].height;
-				xx = ((_letterToPrint - _fontToSprite[_fontIndex].base) % nn) * _fontToSprite[_fontIndex].width;
-				_vm->_video->drawSprite(*_spritesArray[_fontToSprite[_fontIndex].sprite], *tempSrf,
-										 xx, yy, xx + _fontToSprite[_fontIndex].width - 1,
-										 yy + _fontToSprite[_fontIndex].height - 1, 0, 0, _transparency);
-			}
-			break;
-
-		default:
-			error("winDraw - Unexpected fct value %d", fct);
-			break;
-		}
-
-		int i = 0;
-		if (_vm->_global->_curWinId != 0)
-			i = _fascinWin[_vm->_global->_curWinId].id + 1;
-
-		for (; i < 10; i++) {
-			if (table[i]) {
-				int k = table[i];
-				_vm->_video->drawSprite(*tempSrf, *_fascinWin[k].savedSurface,
-										0, 0, width - left, height - top,
-										left - _fascinWin[k].left + (_fascinWin[k].left & 7),
-										top  - _fascinWin[k].top, 0);
-				// Shift skipped as always set to zero (?)
-				_vm->_video->drawSprite(*_frontSurface, *tempSrf,
-										MAX(left  , _fascinWin[k].left),
-										MAX(top   , _fascinWin[k].top),
-										MIN(width , (int16) (_fascinWin[k].left + _fascinWin[k].width  - 1)),
-										MIN(height, (int16) (_fascinWin[k].top  + _fascinWin[k].height - 1)),
-										MAX(left  , _fascinWin[k].left) - left,
-										MAX(top   , _fascinWin[k].top)  - top, 0);
-				if (_cursorIndex != -1)
-					_vm->_video->drawSprite(*_cursorSpritesBack, *tempSrf,
-											0, 0, _cursorWidth - 1, _cursorHeight - 1,
-											_cursorX - left, _cursorY - top, 0);
-				for (int j = 9; j > i; j--) {
-					if (table[j] && winOverlap(k, table[j])) {
-						int l = table[j];
-						_vm->_video->drawSprite(*_fascinWin[l].savedSurface, *tempSrf,
-												MAX(_fascinWin[l].left, _fascinWin[k].left)
-												  - _fascinWin[l].left + (_fascinWin[l].left & 7),
-												MAX(_fascinWin[l].top , _fascinWin[k].top ) - _fascinWin[l].top,
-												MIN(_fascinWin[l].left + _fascinWin[l].width  - 1, _fascinWin[k].left + _fascinWin[k].width - 1)
-												  - _fascinWin[l].left + (_fascinWin[l].left & 7),
-												MIN(_fascinWin[l].top  + _fascinWin[l].height - 1, _fascinWin[k].top  + _fascinWin[k].height - 1)
-												  - _fascinWin[l].top,
-												MAX(_fascinWin[l].left, _fascinWin[k].left) - left,
-												MAX(_fascinWin[l].top , _fascinWin[k].top ) - top, 0);
-					}
-				}
-			}
-		}
-		_vm->_video->drawSprite(*tempSrf, *_backSurface, 0, 0, width - left, height - top, left, top, 0);
-		tempSrf.reset();
-	} else {
-		invalidateRect(left, top, width, height);
-		switch (fct) {
-		case DRAW_BLITSURF:    // 0 - move
-			_vm->_video->drawSprite(*_spritesArray[_sourceSurface], *_backSurface,
-									 _spriteLeft, _spriteTop,
-									 _spriteLeft + _spriteRight  - 1,
-									 _spriteTop  + _spriteBottom - 1,
-									 _destSpriteX, _destSpriteY, _transparency);
-			break;
-		case DRAW_PUTPIXEL:    // 1 - put a pixel
-			_vm->_video->putPixel(_destSpriteX, _destSpriteY, _frontColor, *_backSurface);
-			break;
-
-		case DRAW_FILLRECT:    // 2 - fill rectangle
-			_vm->_video->fillRect(*_backSurface, _destSpriteX, _destSpriteY, _destSpriteX + _spriteRight - 1, _destSpriteY + _spriteBottom - 1, _backColor);
-			break;
-
-		case DRAW_DRAWLINE:    // 3 - draw line
-			_vm->_video->drawLine(*_backSurface, _destSpriteX, _destSpriteY, _spriteRight, _spriteBottom, _frontColor);
-			break;
-
-		case DRAW_INVALIDATE:  // 4 - Draw a circle
-			_vm->_video->drawCircle(*_backSurface, _spriteRight, _spriteRight, _spriteRight, _frontColor);
-			break;
-
-		case DRAW_LOADSPRITE:  // 5 - Uncompress and load a sprite
-			winDecomp(_destSpriteX, _destSpriteY, _backSurface);
-			break;
-
-		case DRAW_PRINTTEXT:   // 6 - Display string
-			len = strlen(_textToPrint);
-			for (int j = 0; j < len; j++)
-				_vm->_video->drawLetter(_textToPrint[j], _destSpriteX + j * _fonts[_fontIndex]->getCharWidth(),
-										_destSpriteY, *_fonts[_fontIndex], _transparency, _frontColor, _backColor, *_backSurface);
-				_destSpriteX += len * _fonts[_fontIndex]->getCharWidth();
-			break;
-
-		case DRAW_DRAWBAR:     // 7 - draw border
-			_vm->_video->drawLine(*_backSurface, _destSpriteX, _spriteBottom, _spriteRight, _spriteBottom, _frontColor);
-			_vm->_video->drawLine(*_backSurface, _destSpriteX, _destSpriteY,  _destSpriteX, _spriteBottom, _frontColor);
-			_vm->_video->drawLine(*_backSurface, _spriteRight, _destSpriteY,  _spriteRight, _spriteBottom, _frontColor);
-			_vm->_video->drawLine(*_backSurface, _destSpriteX, _destSpriteY,  _spriteRight, _destSpriteY,  _frontColor);
-			break;
-
-		case DRAW_CLEARRECT:   // 8 - clear rectangle
-		if (_backColor < 16)
-				_vm->_video->fillRect(*_backSurface, _destSpriteX, _destSpriteY, _spriteRight, _spriteBottom, _backColor);
-			break;
-
-		case DRAW_FILLRECTABS: // 9 - fill rectangle, with other coordinates
-			_vm->_video->fillRect(*_backSurface, _destSpriteX, _destSpriteY, _spriteRight, _spriteBottom, _backColor);
-			break;
-
-		case DRAW_DRAWLETTER:  // 10 - Display a character
-			if (_fontToSprite[_fontIndex].sprite == -1) {
-				if (_letterToPrint)
-					_vm->_video->drawLetter(_letterToPrint, _destSpriteX, _destSpriteY, *_fonts[_fontIndex], _transparency,
-											_frontColor, _backColor, *_spritesArray[_destSurface]);
-			} else {
-				int xx, yy, nn;
-				nn = _spritesArray[_fontToSprite[_fontIndex].sprite]->getWidth() / _fontToSprite[_fontIndex].width;
-				yy = ((_letterToPrint - _fontToSprite[_fontIndex].base) / nn) * _fontToSprite[_fontIndex].height;
-				xx = ((_letterToPrint - _fontToSprite[_fontIndex].base) % nn) * _fontToSprite[_fontIndex].width;
-				_vm->_video->drawSprite(*_spritesArray[_fontToSprite[_fontIndex].sprite], *_spritesArray[_destSurface],
-										xx, yy,
-										xx + _fontToSprite[_fontIndex].width  - 1,
-										yy + _fontToSprite[_fontIndex].height - 1,
-										_destSpriteX, _destSpriteY, _transparency);
-			}
-			break;
-
-		default:
-			error("winDraw - Unexpected fct value");
-			break;
-		}
-	}
-
-	if (_renderFlags & 16) {
-		if (_sourceSurface == kBackSurface) {
-			_spriteLeft -= _backDeltaX;
-			_spriteTop -= _backDeltaY;
-		}
-		if (_destSurface == kBackSurface) {
-			_destSpriteX -= _backDeltaX;
-			_destSpriteY -= _backDeltaY;
-		}
-	}
-
-	if (_vm->_global->_curWinId) {
-		_destSpriteX -= _fascinWin[_vm->_global->_curWinId].left;
-		_destSpriteY -= _fascinWin[_vm->_global->_curWinId].top;
-	}
-}
-
-int16 Draw::isOverWin(int16 &dx, int16 &dy) {
-	int16 bestMatch = -1;
-
-	if ((_renderFlags & 128) == 0)
-		return -1;
-
-	for (int i = 0; i < 10; i++)
-		if (_fascinWin[i].id != -1) {
-			if ((_vm->_global->_inter_mouseX >= _fascinWin[i].left) &&
-			    (_vm->_global->_inter_mouseX <  _fascinWin[i].left + _fascinWin[i].width) &&
-			    (_vm->_global->_inter_mouseY >= _fascinWin[i].top) &&
-			    (_vm->_global->_inter_mouseY <  _fascinWin[i].top  + _fascinWin[i].height)) {
-
-				if (_fascinWin[i].id == _winCount - 1) {
-					dx = _fascinWin[i].left;
-					dy = _fascinWin[i].top;
-					return(i);
-				} else
-					if (_fascinWin[i].id > bestMatch)
-						bestMatch = _fascinWin[i].id;
-			}
-		}
-
-	if (bestMatch != -1)
-		return(0);
-	else
-		return(-1);
-}
 int32 Draw::getSpriteRectSize(int16 index) {
 	if (!_spritesArray[index])
 		return 0;

Modified: scummvm/trunk/engines/gob/draw.h
===================================================================
--- scummvm/trunk/engines/gob/draw.h	2010-08-21 17:49:59 UTC (rev 52266)
+++ scummvm/trunk/engines/gob/draw.h	2010-08-21 18:16:04 UTC (rev 52267)
@@ -192,21 +192,6 @@
 			int16 bottom, const char *str, int16 fontIndex, int16 color);
 	void oPlaytoons_sub_F_1B( uint16 id, int16 left, int16 top, int16 right, int16 bottom, char *paramStr, int16 var3, int16 var4, int16 shortId);
 
-	int16 openWin(int16 id);
-	int16 handleCurWin();
-	bool winOverlap(int16 idWin1, int16 idWin2);
-	void winDecomp(int16 x, int16 y, SurfaceDescPtr destPtr);
-	void activeWin(int16 id);
-	void closeWin(int16 id);
-	void closeAllWin();
-	void restoreWin(int16 i);
-	void saveWin(int16 id);
-	void winMove(int16 id);
-	void handleWinBorder(int16 id);
-	void winDraw(int16 fct);
-	void winTrace(int16 left, int16 top, int16 width, int16 height);
-	int16 isOverWin(int16 &dx, int16 &dy);
-
 	int32 getSpriteRectSize(int16 index);
 	void forceBlit(bool backwards = false);
 
@@ -223,6 +208,15 @@
 	virtual void printTotText(int16 id) = 0;
 	virtual void spriteOperation(int16 operation) = 0;
 
+	virtual int16 openWin(int16 id) { return 0; }
+	virtual void closeWin(int16 id) {}
+	virtual int16 handleCurWin() { return 0; }
+	virtual int16 getWinFromCoord(int16 &dx, int16 &dy) { return -1; }
+	virtual void moveWin(int16 id) {}
+	virtual bool overlapWin(int16 idWin1, int16 idWin2) { return false; }
+	virtual void closeAllWin() {}
+	virtual void activeWin(int16 id) {}
+
 	Draw(GobEngine *vm);
 	virtual ~Draw();
 
@@ -272,6 +266,23 @@
 	Draw_Fascination(GobEngine *vm);
 	virtual ~Draw_Fascination() {}
 	virtual void spriteOperation(int16 operation);
+
+	void decompWin(int16 x, int16 y, SurfaceDescPtr destPtr);
+	void drawWin(int16 fct);
+	void saveWin(int16 id);
+	void restoreWin(int16 id);
+	void handleWinBorder(int16 id);
+	void drawWinTrace(int16 left, int16 top, int16 width, int16 height);
+
+	virtual int16 openWin(int16 id);
+	virtual void closeWin(int16 id);
+	virtual int16 getWinFromCoord(int16 &dx, int16 &dy);
+	virtual int16 handleCurWin();
+	virtual void activeWin(int16 id);
+	virtual void moveWin(int16 id);
+	virtual bool overlapWin(int16 idWin1, int16 idWin2);
+	virtual void closeAllWin();
+
 };
 
 class Draw_Playtoons: public Draw_v2 {

Modified: scummvm/trunk/engines/gob/draw_fascin.cpp
===================================================================
--- scummvm/trunk/engines/gob/draw_fascin.cpp	2010-08-21 17:49:59 UTC (rev 52266)
+++ scummvm/trunk/engines/gob/draw_fascin.cpp	2010-08-21 18:16:04 UTC (rev 52267)
@@ -28,6 +28,8 @@
 
 #include "gob/draw.h"
 #include "gob/game.h"
+#include "gob/global.h"
+#include "gob/inter.h"
 #include "gob/resources.h"
 
 namespace Gob {
@@ -71,7 +73,7 @@
 
 	if (_renderFlags & 0x20) {
 		if (_destSurface == kBackSurface || (operation == 0 && _sourceSurface == kBackSurface)) {
-			winDraw(operation);
+			drawWin(operation);
 			return;
 		}
 	}
@@ -352,4 +354,777 @@
 	}
 }
 
+void Draw_Fascination::drawWin(int16 fct) {
+	int16 left;
+	int16 top;
+	int16 width;
+	int16 height;
+
+	bool found = false;
+	int len;
+	Resource *resource;
+	int table[10];
+	SurfaceDescPtr tempSrf;
+
+	if (_destSurface == kBackSurface) {
+
+		if (_vm->_global->_curWinId) {
+			if (_fascinWin[_vm->_global->_curWinId].id == -1)
+				return;
+
+			else {
+				_destSpriteX += _fascinWin[_vm->_global->_curWinId].left;
+				_destSpriteY += _fascinWin[_vm->_global->_curWinId].top;
+				if (fct == 3 || (fct >= 7 && fct <= 9)) {
+					_spriteRight  += _fascinWin[_vm->_global->_curWinId].left;
+					_spriteBottom += _fascinWin[_vm->_global->_curWinId].top;
+				}
+			}
+		}
+
+		left = _destSpriteX;
+		top  = _destSpriteY;
+
+	} else {
+		if (_vm->_global->_curWinId) {
+			if (_fascinWin[_vm->_global->_curWinId].id == -1)
+				return;
+			else {
+				_spriteLeft += _fascinWin[_vm->_global->_curWinId].left;
+				_spriteTop  += _fascinWin[_vm->_global->_curWinId].top;
+			}
+		}
+
+		left = _spriteLeft;
+		top  = _spriteTop;
+	}
+
+	for (int i = 0; i < 10; i++)
+		table[i] = 0;
+
+	switch (fct) {
+	case DRAW_BLITSURF:    // 0 - move
+	case DRAW_FILLRECT:    // 2 - fill rectangle
+		width  = left + _spriteRight  - 1;
+		height = top  + _spriteBottom - 1;
+		break;
+
+	case DRAW_PUTPIXEL:    // 1 - put a pixel
+		width  = _destSpriteX;
+		height = _destSpriteY;
+		break;
+
+	case DRAW_DRAWLINE:    // 3 - draw line
+	case DRAW_DRAWBAR:     // 7 - draw border
+	case DRAW_CLEARRECT:   // 8 - clear rectangle
+	case DRAW_FILLRECTABS: // 9 - fill rectangle, with other coordinates
+		width  = _spriteRight;
+		height = _spriteBottom;
+		break;
+
+	case DRAW_INVALIDATE:  // 4 - Draw a circle
+		left   = _destSpriteX - _spriteRight;
+		top    = _destSpriteY - _spriteRight;
+		width  = _destSpriteX + _spriteRight;
+		height = _destSpriteY + _spriteBottom;
+		break;
+
+	case DRAW_LOADSPRITE:  // 5 - Uncompress and load a sprite
+		// TODO: check the implementation, currently dirty cut and paste of DRAW_SPRITE code
+		resource = _vm->_game->_resources->getResource((_spriteLeft & 0x3FFF),
+				&_spriteRight, &_spriteBottom);
+
+		if (!resource) {
+			width  = 0;
+			height = 0;
+			break;
+		}
+
+		_vm->_video->drawPackedSprite(resource->getData(),
+				_spriteRight, _spriteBottom, _destSpriteX, _destSpriteY,
+				_transparency, *_spritesArray[_destSurface]);
+
+		dirtiedRect(_destSurface, _destSpriteX, _destSpriteY,
+				_destSpriteX + _spriteRight - 1, _destSpriteY + _spriteBottom - 1);
+
+		delete resource;
+
+		width  = _destSpriteX + _spriteRight  - 1;
+		height = _destSpriteY + _spriteBottom - 1;
+		break;
+
+	case DRAW_PRINTTEXT:  // 6 - Display string
+		width  = _destSpriteX - 1 + strlen(_textToPrint) * _fonts[_fontIndex]->getCharWidth();
+		height = _destSpriteY - 1 + _fonts[_fontIndex]->getCharHeight();
+		break;
+
+	case DRAW_DRAWLETTER: // 10 - Display a character
+		if (_fontToSprite[_fontIndex].sprite == -1) {
+			width  = _destSpriteX - 1 + _fonts[_fontIndex]->getCharWidth();
+			height = _destSpriteY - 1 + _fonts[_fontIndex]->getCharHeight();
+		} else {
+			width  = _destSpriteX + _fontToSprite[_fontIndex].width  - 1;
+			height = _destSpriteY + _fontToSprite[_fontIndex].height - 1;
+		}
+		break;
+
+	default:
+		error("winDraw - Unexpected fct value %d", fct);
+		break;
+	}
+
+	for (int i = 0; i < 10; i++) {
+		if ((i != _vm->_global->_curWinId) && (_fascinWin[i].id != -1)) {
+			if (!_vm->_global->_curWinId || _fascinWin[i].id>_fascinWin[_vm->_global->_curWinId].id) {
+				if ((_fascinWin[i].left + _fascinWin[i].width  > left) && (width  >= _fascinWin[i].left) &&
+				    (_fascinWin[i].top  + _fascinWin[i].height > top ) && (height >= _fascinWin[i].top)) {
+					found = true;
+					table[_fascinWin[i].id] = i;
+				}
+			}
+		}
+	}
+
+	if ((_sourceSurface == kBackSurface) && (fct == 0)) {
+		_vm->_video->drawSprite(*_spritesArray[_sourceSurface], *_spritesArray[_destSurface],
+								_spriteLeft, _spriteTop, _spriteLeft + _spriteRight - 1,
+								_spriteTop + _spriteBottom - 1, _destSpriteX, _destSpriteY, _transparency);
+		if (!found)
+			return;
+
+		int j = 0;
+		if (_vm->_global->_curWinId != 0)
+			j = _fascinWin[_vm->_global->_curWinId].id + 1;
+
+		for (int i = 9; i >= j; i--) {
+			if (table[i])
+				_vm->_video->drawSprite(*_fascinWin[table[i]].savedSurface, *_spritesArray[_destSurface],
+										 _fascinWin[table[i]].left & 7, 0,
+										(_fascinWin[table[i]].left & 7) + _fascinWin[table[i]].width - 1,
+										 _fascinWin[table[i]].height - 1, _fascinWin[table[i]].left - _spriteLeft + _destSpriteX,
+										 _fascinWin[table[i]].top - _spriteTop + _destSpriteY, 0);
+		}
+		return;
+	}
+
+	if (found) {
+		tempSrf = _vm->_video->initSurfDesc(_vm->_global->_videoMode, width - left + 1, height - top + 1, 0);
+		_vm->_video->drawSprite(*_backSurface, *tempSrf, left, top, width, height, 0, 0, 0);
+
+		int max = 0;
+		if (_vm->_global->_curWinId != 0)
+			max = _fascinWin[_vm->_global->_curWinId].id + 1;
+
+		for (int i = 9; i >= max; i--) {
+			if (table[i])
+				_vm->_video->drawSprite(*_fascinWin[table[i]].savedSurface, *tempSrf,
+										 _fascinWin[table[i]].left & 7, 0,
+										(_fascinWin[table[i]].left & 7) + _fascinWin[table[i]].width - 1,
+										 _fascinWin[table[i]].height - 1,
+										 _fascinWin[table[i]].left  - left,
+										 _fascinWin[table[i]].top   - top , 0);
+		}
+
+		invalidateRect(left, top, width, height);
+
+		switch (fct) {
+		case DRAW_BLITSURF:    // 0 - move
+			_vm->_video->drawSprite(*_spritesArray[_sourceSurface], *tempSrf,
+									_spriteLeft, _spriteTop, _spriteLeft + _spriteRight - 1,
+									_spriteTop + _spriteBottom - 1, 0, 0, _transparency);
+			break;
+
+		case DRAW_PUTPIXEL:    // 1 - put a pixel
+			_vm->_video->putPixel(0, 0, _frontColor, *tempSrf);
+			break;
+
+		case DRAW_FILLRECT:    // 2 - fill rectangle
+			_vm->_video->fillRect(*tempSrf, 0, 0, _spriteRight - 1, _spriteBottom - 1, _backColor);
+			break;
+
+		case DRAW_DRAWLINE:    // 3 - draw line
+			_vm->_video->drawLine(*tempSrf, 0, 0, _spriteRight - _destSpriteX, _spriteBottom - _destSpriteY, _frontColor);
+			break;
+
+		case DRAW_INVALIDATE:  // 4 - Draw a circle
+			_vm->_video->drawCircle(*tempSrf, _spriteRight, _spriteRight, _spriteRight, _frontColor);
+			break;
+
+		case DRAW_LOADSPRITE:  // 5 - Uncompress and load a sprite
+			decompWin(0, 0, tempSrf);
+			break;
+
+		case DRAW_PRINTTEXT:   // 6 - Display string
+			len = strlen(_textToPrint);
+			for (int j = 0; j < len; j++)
+				_vm->_video->drawLetter(_textToPrint[j], j * _fonts[_fontIndex]->getCharWidth(), 0,
+										*_fonts[_fontIndex], _transparency, _frontColor, _backColor, *tempSrf);
+			_destSpriteX += len * _fonts[_fontIndex]->getCharWidth();
+			break;
+
+		case DRAW_DRAWBAR:     // 7 - draw border
+			_vm->_video->drawLine(*tempSrf, 0, _spriteBottom - _destSpriteY, _spriteRight - _destSpriteX, _spriteBottom - _destSpriteY, _frontColor);
+			_vm->_video->drawLine(*tempSrf, 0, 0, 0, _spriteBottom - _destSpriteY, _frontColor);
+			_vm->_video->drawLine(*tempSrf, _spriteRight - _destSpriteX, 0, _spriteRight - _destSpriteX, _spriteBottom - _destSpriteY, _frontColor);
+			_vm->_video->drawLine(*tempSrf, 0, 0, _spriteRight - _destSpriteX, 0, _frontColor);
+			break;
+
+		case DRAW_CLEARRECT:   // 8 - clear rectangle
+			if (_backColor < 16)
+				_vm->_video->fillRect(*tempSrf, 0, 0, _spriteRight - _destSpriteX, _spriteBottom - _destSpriteY, _backColor);
+			break;
+
+		case DRAW_FILLRECTABS: // 9 - fill rectangle, with other coordinates
+			_vm->_video->fillRect(*tempSrf, 0, 0, _spriteRight - _destSpriteX, _spriteBottom - _destSpriteY, _backColor);
+			break;
+
+		case DRAW_DRAWLETTER:  // 10 - Display a character
+			if (_fontToSprite[_fontIndex].sprite == -1) {
+
+				if (_letterToPrint)
+					_vm->_video->drawLetter(_letterToPrint, 0, 0, *_fonts[_fontIndex], _transparency, _frontColor, _backColor, *tempSrf);
+			} else {
+				int xx, yy, nn;
+				nn = _spritesArray[_fontToSprite[_fontIndex].sprite]->getWidth() / _fontToSprite[_fontIndex].width;
+				yy = ((_letterToPrint - _fontToSprite[_fontIndex].base) / nn) * _fontToSprite[_fontIndex].height;
+				xx = ((_letterToPrint - _fontToSprite[_fontIndex].base) % nn) * _fontToSprite[_fontIndex].width;
+				_vm->_video->drawSprite(*_spritesArray[_fontToSprite[_fontIndex].sprite], *tempSrf,
+										 xx, yy, xx + _fontToSprite[_fontIndex].width - 1,
+										 yy + _fontToSprite[_fontIndex].height - 1, 0, 0, _transparency);
+			}
+			break;
+
+		default:
+			error("winDraw - Unexpected fct value %d", fct);
+			break;
+		}
+
+		int i = 0;
+		if (_vm->_global->_curWinId != 0)
+			i = _fascinWin[_vm->_global->_curWinId].id + 1;
+
+		for (; i < 10; i++) {
+			if (table[i]) {
+				int k = table[i];
+				_vm->_video->drawSprite(*tempSrf, *_fascinWin[k].savedSurface,
+										0, 0, width - left, height - top,
+										left - _fascinWin[k].left + (_fascinWin[k].left & 7),
+										top  - _fascinWin[k].top, 0);
+				// Shift skipped as always set to zero (?)
+				_vm->_video->drawSprite(*_frontSurface, *tempSrf,
+										MAX(left  , _fascinWin[k].left),
+										MAX(top   , _fascinWin[k].top),
+										MIN(width , (int16) (_fascinWin[k].left + _fascinWin[k].width  - 1)),
+										MIN(height, (int16) (_fascinWin[k].top  + _fascinWin[k].height - 1)),
+										MAX(left  , _fascinWin[k].left) - left,
+										MAX(top   , _fascinWin[k].top)  - top, 0);
+				if (_cursorIndex != -1)
+					_vm->_video->drawSprite(*_cursorSpritesBack, *tempSrf,
+											0, 0, _cursorWidth - 1, _cursorHeight - 1,
+											_cursorX - left, _cursorY - top, 0);
+				for (int j = 9; j > i; j--) {
+					if (table[j] && overlapWin(k, table[j])) {
+						int l = table[j];
+						_vm->_video->drawSprite(*_fascinWin[l].savedSurface, *tempSrf,
+												MAX(_fascinWin[l].left, _fascinWin[k].left)
+												  - _fascinWin[l].left + (_fascinWin[l].left & 7),
+												MAX(_fascinWin[l].top , _fascinWin[k].top ) - _fascinWin[l].top,
+												MIN(_fascinWin[l].left + _fascinWin[l].width  - 1, _fascinWin[k].left + _fascinWin[k].width - 1)
+												  - _fascinWin[l].left + (_fascinWin[l].left & 7),
+												MIN(_fascinWin[l].top  + _fascinWin[l].height - 1, _fascinWin[k].top  + _fascinWin[k].height - 1)
+												  - _fascinWin[l].top,
+												MAX(_fascinWin[l].left, _fascinWin[k].left) - left,
+												MAX(_fascinWin[l].top , _fascinWin[k].top ) - top, 0);
+					}
+				}
+			}
+		}
+		_vm->_video->drawSprite(*tempSrf, *_backSurface, 0, 0, width - left, height - top, left, top, 0);
+		tempSrf.reset();
+	} else {
+		invalidateRect(left, top, width, height);
+		switch (fct) {
+		case DRAW_BLITSURF:    // 0 - move
+			_vm->_video->drawSprite(*_spritesArray[_sourceSurface], *_backSurface,
+									 _spriteLeft, _spriteTop,
+									 _spriteLeft + _spriteRight  - 1,
+									 _spriteTop  + _spriteBottom - 1,
+									 _destSpriteX, _destSpriteY, _transparency);
+			break;
+		case DRAW_PUTPIXEL:    // 1 - put a pixel
+			_vm->_video->putPixel(_destSpriteX, _destSpriteY, _frontColor, *_backSurface);
+			break;
+
+		case DRAW_FILLRECT:    // 2 - fill rectangle
+			_vm->_video->fillRect(*_backSurface, _destSpriteX, _destSpriteY, _destSpriteX + _spriteRight - 1, _destSpriteY + _spriteBottom - 1, _backColor);
+			break;
+
+		case DRAW_DRAWLINE:    // 3 - draw line
+			_vm->_video->drawLine(*_backSurface, _destSpriteX, _destSpriteY, _spriteRight, _spriteBottom, _frontColor);
+			break;
+
+		case DRAW_INVALIDATE:  // 4 - Draw a circle
+			_vm->_video->drawCircle(*_backSurface, _spriteRight, _spriteRight, _spriteRight, _frontColor);
+			break;
+
+		case DRAW_LOADSPRITE:  // 5 - Uncompress and load a sprite
+			decompWin(_destSpriteX, _destSpriteY, _backSurface);
+			break;
+
+		case DRAW_PRINTTEXT:   // 6 - Display string
+			len = strlen(_textToPrint);
+			for (int j = 0; j < len; j++)
+				_vm->_video->drawLetter(_textToPrint[j], _destSpriteX + j * _fonts[_fontIndex]->getCharWidth(),
+										_destSpriteY, *_fonts[_fontIndex], _transparency, _frontColor, _backColor, *_backSurface);
+			_destSpriteX += len * _fonts[_fontIndex]->getCharWidth();
+			break;
+
+		case DRAW_DRAWBAR:     // 7 - draw border
+			_vm->_video->drawLine(*_backSurface, _destSpriteX, _spriteBottom, _spriteRight, _spriteBottom, _frontColor);
+			_vm->_video->drawLine(*_backSurface, _destSpriteX, _destSpriteY,  _destSpriteX, _spriteBottom, _frontColor);
+			_vm->_video->drawLine(*_backSurface, _spriteRight, _destSpriteY,  _spriteRight, _spriteBottom, _frontColor);
+			_vm->_video->drawLine(*_backSurface, _destSpriteX, _destSpriteY,  _spriteRight, _destSpriteY,  _frontColor);
+			break;
+
+		case DRAW_CLEARRECT:   // 8 - clear rectangle
+		if (_backColor < 16)
+				_vm->_video->fillRect(*_backSurface, _destSpriteX, _destSpriteY, _spriteRight, _spriteBottom, _backColor);
+			break;
+
+		case DRAW_FILLRECTABS: // 9 - fill rectangle, with other coordinates
+			_vm->_video->fillRect(*_backSurface, _destSpriteX, _destSpriteY, _spriteRight, _spriteBottom, _backColor);
+			break;
+
+		case DRAW_DRAWLETTER:  // 10 - Display a character
+			if (_fontToSprite[_fontIndex].sprite == -1) {
+				if (_letterToPrint)
+					_vm->_video->drawLetter(_letterToPrint, _destSpriteX, _destSpriteY, *_fonts[_fontIndex], _transparency,
+											_frontColor, _backColor, *_spritesArray[_destSurface]);
+			} else {
+				int xx, yy, nn;
+				nn = _spritesArray[_fontToSprite[_fontIndex].sprite]->getWidth() / _fontToSprite[_fontIndex].width;
+				yy = ((_letterToPrint - _fontToSprite[_fontIndex].base) / nn) * _fontToSprite[_fontIndex].height;
+				xx = ((_letterToPrint - _fontToSprite[_fontIndex].base) % nn) * _fontToSprite[_fontIndex].width;
+				_vm->_video->drawSprite(*_spritesArray[_fontToSprite[_fontIndex].sprite], *_spritesArray[_destSurface],
+										xx, yy,
+										xx + _fontToSprite[_fontIndex].width  - 1,
+										yy + _fontToSprite[_fontIndex].height - 1,
+										_destSpriteX, _destSpriteY, _transparency);
+			}
+			break;
+
+		default:
+			error("winDraw - Unexpected fct value");
+			break;
+		}
+	}
+
+	if (_renderFlags & 16) {
+		if (_sourceSurface == kBackSurface) {
+			_spriteLeft -= _backDeltaX;
+			_spriteTop -= _backDeltaY;
+		}
+		if (_destSurface == kBackSurface) {
+			_destSpriteX -= _backDeltaX;
+			_destSpriteY -= _backDeltaY;
+		}
+	}
+
+	if (_vm->_global->_curWinId) {
+		_destSpriteX -= _fascinWin[_vm->_global->_curWinId].left;
+		_destSpriteY -= _fascinWin[_vm->_global->_curWinId].top;
+	}
+}
+
+void Draw_Fascination::decompWin(int16 x, int16 y, SurfaceDescPtr destPtr) {
+	Resource *resource;
+	resource = _vm->_game->_resources->getResource((uint16) _spriteLeft,
+	                                               &_spriteRight, &_spriteBottom);
+
+	if (!resource)
+		return;
+
+	_vm->_video->drawPackedSprite(resource->getData(),
+			_spriteRight, _spriteBottom, x, y, _transparency, *destPtr);
+
+	delete resource;
+	return;
+}
+
+int16 Draw_Fascination::openWin(int16 id) {
+	if (_fascinWin[id].id != -1)
+		return 0;
+
+	_fascinWin[id].id = _winCount++;
+	_fascinWin[id].left   = VAR((_winVarArrayLeft   / 4) + id);
+	_fascinWin[id].top    = VAR((_winVarArrayTop    / 4) + id);
+	_fascinWin[id].width  = VAR((_winVarArrayWidth  / 4) + id);
+	_fascinWin[id].height = VAR((_winVarArrayHeight / 4) + id);
+
+	_fascinWin[id].savedSurface = _vm->_video->initSurfDesc(_vm->_global->_videoMode, _winMaxWidth + 7, _winMaxHeight, 0);
+
+	saveWin(id);
+	WRITE_VAR((_winVarArrayStatus / 4) + id, VAR((_winVarArrayStatus / 4) + id) & 0xFFFFFFFE);
+
+	return 1;
+}
+
+int16 Draw_Fascination::getWinFromCoord(int16 &dx, int16 &dy) {
+	int16 bestMatch = -1;
+
+	if ((_renderFlags & 128) == 0)
+		return -1;
+
+	for (int i = 0; i < 10; i++) {
+		if (_fascinWin[i].id != -1) {
+			if ((_vm->_global->_inter_mouseX >= _fascinWin[i].left) &&
+			    (_vm->_global->_inter_mouseX <  _fascinWin[i].left + _fascinWin[i].width) &&
+			    (_vm->_global->_inter_mouseY >= _fascinWin[i].top) &&
+			    (_vm->_global->_inter_mouseY <  _fascinWin[i].top  + _fascinWin[i].height)) {
+
+				if (_fascinWin[i].id == _winCount - 1) {
+					dx = _fascinWin[i].left;
+					dy = _fascinWin[i].top;
+					return(i);
+				} else {
+					if (_fascinWin[i].id > bestMatch)
+						bestMatch = _fascinWin[i].id;
+				}
+			}
+		}
+	}
+
+	if (bestMatch != -1)
+		return(0);
+	else
+		return(-1);
+}
+
+void Draw_Fascination::closeWin(int16 id) {
+	if (_fascinWin[id].id == -1)
+		return;
+
+	WRITE_VAR((_winVarArrayStatus / 4) + id, VAR((_winVarArrayStatus / 4) + id) | 1);
+	restoreWin(id);
+	_fascinWin[id].id = -1;
+	_fascinWin[id].savedSurface.reset();
+	_winCount--;
+}
+
+int16 Draw_Fascination::handleCurWin() {
+	int8 matchNum = 0;
+	int16 bestMatch = -1;
+
+	if ((_vm->_game->_mouseButtons != 1) || ((_renderFlags & 128) == 0))
+		return 0;
+
+	for (int i = 0; i < 10; i++) {
+		if (_fascinWin[i].id != -1) {
+			if ((_vm->_global->_inter_mouseX >= _fascinWin[i].left) &&
+			    (_vm->_global->_inter_mouseX <  _fascinWin[i].left + _fascinWin[i].width) &&
+			    (_vm->_global->_inter_mouseY >= _fascinWin[i].top) &&
+			    (_vm->_global->_inter_mouseY <  _fascinWin[i].top  + _fascinWin[i].height)) {
+
+				if (_fascinWin[i].id == _winCount - 1) {
+					if ((_vm->_global->_inter_mouseX < _fascinWin[i].left + 12) &&
+					    (_vm->_global->_inter_mouseY < _fascinWin[i].top  + 12) &&
+					    (VAR(_winVarArrayStatus / 4 + i) & 2)) {
+
+						blitCursor();
+						activeWin(i);
+						closeWin(i);
+						_vm->_util->waitMouseRelease(1);
+						return i;
+					}
+
+					if ((_vm->_global->_inter_mouseX >= _fascinWin[i].left + _fascinWin[i].width - 12) &&
+					    (_vm->_global->_inter_mouseY <  _fascinWin[i].top  + 12) &&
+					    (VAR(_winVarArrayStatus / 4 + i) & 4) &&
+					    (_vm->_global->_mousePresent) &&
+					    (_vm->_global->_videoMode != 0x07)) {
+
+						blitCursor();
+						handleWinBorder(i);
+						moveWin(i);
+						_vm->_global->_inter_mouseX = _fascinWin[i].left + _fascinWin[i].width - 11;
+						_vm->_util->setMousePos(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY);
+						return -i;
+					}
+					return 0;
+				} else {
+					if (_fascinWin[i].id > bestMatch) {
+						bestMatch = _fascinWin[i].id;
+						matchNum = i;
+					}
+				}
+			}
+		}
+	}
+
+	if (bestMatch != -1) {
+		blitCursor();
+		activeWin(matchNum);
+	}
+
+	return 0;
+}
+
+void Draw_Fascination::moveWin(int16 id) {
+	int oldLeft = _fascinWin[id].left;
+	int oldTop  = _fascinWin[id].top;
+
+	restoreWin(id);
+
+	_fascinWin[id].left = _vm->_global->_inter_mouseX;
+	_fascinWin[id].top  = _vm->_global->_inter_mouseY;
+
+	WRITE_VAR((_winVarArrayLeft / 4) + id, _fascinWin[id].left);
+	WRITE_VAR((_winVarArrayTop  / 4) + id, _fascinWin[id].top);
+
+	saveWin(id);
+
+	// Shift skipped as always set to zero (?)
+	_vm->_video->drawSprite(*_frontSurface, *_backSurface,
+							oldLeft, oldTop,
+							oldLeft + _fascinWin[id].width  - 1,
+							oldTop  + _fascinWin[id].height - 1,
+							_fascinWin[id].left, _fascinWin[id].top, 0);
+	invalidateRect(_fascinWin[id].left, _fascinWin[id].top,
+				   _fascinWin[id].left + _fascinWin[id].width  - 1,
+				   _fascinWin[id].top  + _fascinWin[id].height - 1);
+}
+
+bool Draw_Fascination::overlapWin(int16 idWin1, int16 idWin2) {
+	if ((_fascinWin[idWin1].left + _fascinWin[idWin1].width  <= _fascinWin[idWin2].left) ||
+		(_fascinWin[idWin2].left + _fascinWin[idWin2].width  <= _fascinWin[idWin1].left) ||
+		(_fascinWin[idWin1].top  + _fascinWin[idWin1].height <= _fascinWin[idWin2].top ) ||
+		(_fascinWin[idWin2].top  + _fascinWin[idWin2].height <= _fascinWin[idWin1].top ))
+		return false;
+
+	return true;
+}
+
+void Draw_Fascination::activeWin(int16 id) {
+	bool found = false;
+	int16 t[10], t2[10];
+	int nextId = -1;
+	int oldId  = -1;
+	SurfaceDescPtr tempSrf;
+	SurfaceDescPtr oldSrf[10];
+
+	if (_fascinWin[id].id == -1)
+		return;
+
+	blitInvalidated();
+
+	for (int i = 0; i < 10; i++) {
+		t[i]  = -1;
+		t2[i] = -1;
+		oldSrf[i].reset();
+	}
+
+	for (int i = 0; i < 10; i++) {
+		if ((i != id) && (_fascinWin[i].id > _fascinWin[id].id) && (overlapWin(i, id))) {
+			t[_fascinWin[i].id] = i;
+			found = true;
+		}
+	}
+
+	if (found) {
+		for (int i = 9; i >= 0; i--) {
+			if (t[i] != -1) {
+				if (nextId != -1)
+					_vm->_video->drawSprite(*_backSurface, *_fascinWin[nextId].savedSurface,
+											_fascinWin[t[i]].left, _fascinWin[t[i]].top,
+											_fascinWin[t[i]].left + _fascinWin[t[i]].width  - 1,
+											_fascinWin[t[i]].top  + _fascinWin[t[i]].height - 1,
+											_fascinWin[t[i]].left & 7, 0, 0);
+				t2[i] = nextId;
+				restoreWin(t[i]);
+				nextId = t[i];
+			}
+		}
+
+		oldId = nextId;
+		_vm->_video->drawSprite(*_backSurface, *_fascinWin[nextId].savedSurface,
+								 _fascinWin[id].left, _fascinWin[id].top,
+								 _fascinWin[id].left + _fascinWin[id].width  - 1,
+								 _fascinWin[id].top  + _fascinWin[id].height - 1,
+								 _fascinWin[id].left & 7, 0, 0);
+		restoreWin(id);
+		nextId = id;
+
+		for (int i = 0; i < 10; i++) {
+			if (t[i] != -1) {
+				_vm->_video->drawSprite(*_backSurface, *_fascinWin[nextId].savedSurface,
+										_fascinWin[t[i]].left, _fascinWin[t[i]].top,
+										_fascinWin[t[i]].left + _fascinWin[t[i]].width  - 1,
+										_fascinWin[t[i]].top  + _fascinWin[t[i]].height - 1,
+										_fascinWin[t[i]].left & 7, 0, 0);
+				oldSrf[t[i]] = _fascinWin[nextId].savedSurface;
+				if (t2[i] != -1)
+					_vm->_video->drawSprite(*_fascinWin[t2[i]].savedSurface, *_backSurface,
+											 _fascinWin[t[i]].left & 7, 0,
+											(_fascinWin[t[i]].left & 7) + _fascinWin[t[i]].width - 1,
+											 _fascinWin[t[i]].height - 1, _fascinWin[t[i]].left,
+											 _fascinWin[t[i]].top, 0);
+				else {
+					// Shift skipped as always set to zero (?)
+					_vm->_video->drawSprite(*_frontSurface, *_backSurface,
+											 _fascinWin[t[i]].left, _fascinWin[t[i]].top,
+											 _fascinWin[t[i]].left + _fascinWin[t[i]].width  - 1,
+											 _fascinWin[t[i]].top  + _fascinWin[t[i]].height - 1,
+											 _fascinWin[t[i]].left, _fascinWin[t[i]].top, 0);
+				}
+				invalidateRect(_fascinWin[t[i]].left, _fascinWin[t[i]].top,
+							_fascinWin[t[i]].left + _fascinWin[t[i]].width  - 1,
+							_fascinWin[t[i]].top  + _fascinWin[t[i]].height - 1);
+				nextId = t2[i];
+			}
+		}
+
+		tempSrf = _vm->_video->initSurfDesc(_vm->_global->_videoMode, _winMaxWidth + 7, _winMaxHeight, 0);
+		_vm->_video->drawSprite(*_backSurface, *tempSrf,
+								 _fascinWin[id].left, _fascinWin[id].top,
+								 _fascinWin[id].left + _fascinWin[id].width  - 1,
+								 _fascinWin[id].top  + _fascinWin[id].height - 1,
+								 _fascinWin[id].left & 7, 0, 0);
+		_vm->_video->drawSprite(*_fascinWin[oldId].savedSurface, *_backSurface,
+								 _fascinWin[id].left & 7, 0,
+								(_fascinWin[id].left & 7) + _fascinWin[id].width - 1,
+								 _fascinWin[id].height - 1,
+								 _fascinWin[id].left, _fascinWin[id].top, 0);
+
+		_fascinWin[oldId].savedSurface.reset();
+		_fascinWin[oldId].savedSurface = tempSrf;
+		oldSrf[id] = _fascinWin[oldId].savedSurface;
+
+		invalidateRect(_fascinWin[id].left, _fascinWin[id].top,
+					_fascinWin[id].left + _fascinWin[id].width  - 1,
+					_fascinWin[id].top  + _fascinWin[id].height - 1);
+		nextId = id;
+
+		for (int j = 0; j < 10; j++) {
+			if (oldSrf[j] != 0)
+				_fascinWin[j].savedSurface = oldSrf[j];
+		}
+	}
+
+	for (int i = 0; i < 10; i++) {
+		if ((i != id) && (_fascinWin[i].id > _fascinWin[id].id))
+			_fascinWin[i].id--;
+	}
+
+	_fascinWin[id].id = _winCount - 1;
+}
+
+void Draw_Fascination::closeAllWin() {
+	for (int i = 0; i < 10; i++) {
+		activeWin(i);
+		closeWin(i);
+	}
+}
+
+void Draw_Fascination::saveWin(int16 id) {
+	_vm->_video->drawSprite(*_backSurface, *_fascinWin[id].savedSurface,
+							_fascinWin[id].left,  _fascinWin[id].top,
+							_fascinWin[id].left + _fascinWin[id].width  - 1,
+							_fascinWin[id].top  + _fascinWin[id].height - 1,
+							_fascinWin[id].left & 7, 0, 0);
+}
+
+void Draw_Fascination::restoreWin(int16 id) {
+	_vm->_video->drawSprite(*_fascinWin[id].savedSurface, *_backSurface,
+							 _fascinWin[id].left & 7, 0,
+							(_fascinWin[id].left & 7) + _fascinWin[id].width - 1, _fascinWin[id].height - 1,
+							 _fascinWin[id].left, _fascinWin[id].top, 0);
+	invalidateRect(_fascinWin[id].left, _fascinWin[id].top,
+				_fascinWin[id].left + _fascinWin[id].width  - 1,
+				_fascinWin[id].top  + _fascinWin[id].height - 1);
+}
+
+void Draw_Fascination::drawWinTrace(int16 left, int16 top, int16 width, int16 height) {
+	int16 right, bottom;
+
+	right  = left + width  - 1;
+	bottom = top  + height - 1;
+
+	for (int32 x = left; x < right; x++) {
+		_frontSurface->getVidMem()[_frontSurface->getWidth() * top + x] = (128 + _frontSurface->getVidMem()[_frontSurface->getWidth() * top + x]) & 0xff;
+		_frontSurface->getVidMem()[_frontSurface->getWidth() * bottom + x] = (128 + _frontSurface->getVidMem()[_frontSurface->getWidth() * bottom + x]) & 0xff;
+	}
+
+	for (int32 y = top; y < bottom; y++) {
+		_frontSurface->getVidMem()[_frontSurface->getWidth() * y + left] = (128 + _frontSurface->getVidMem()[_frontSurface->getWidth() * y + left]) & 0xff;
+		_frontSurface->getVidMem()[_frontSurface->getWidth() * y + right] = (128 + _frontSurface->getVidMem()[_frontSurface->getWidth() * y + right]) & 0xff;
+	}
+
+	_vm->_video->dirtyRectsAll();
+	_vm->_video->retrace(true);
+}
+
+void Draw_Fascination::handleWinBorder(int16 id) {
+	int16 minX = 0;
+	int16 maxX = 320;
+	int16 minY = 0;
+	int16 maxY = 200;
+
+	if (VAR((_winVarArrayStatus / 4) + id) & 8)
+		minX = (int16)(VAR((_winVarArrayLimitsX / 4) + id) >> 16L);
+	if (VAR((_winVarArrayStatus / 4) + id) & 16)
+		maxX = (int16)(VAR((_winVarArrayLimitsX / 4) + id) & 0xFFFFL);
+	if (VAR((_winVarArrayStatus / 4) + id) & 32)
+		minY = (int16)(VAR((_winVarArrayLimitsY / 4) + id) >> 16L);
+	if (VAR((_winVarArrayStatus / 4) + id) & 64)
+		maxY = (int16)(VAR((_winVarArrayLimitsY / 4) + id) & 0xFFFFL);
+
+	_vm->_global->_inter_mouseX = _fascinWin[id].left;
+	_vm->_global->_inter_mouseY = _fascinWin[id].top;
+
+	if (_vm->_global->_mousePresent)
+		_vm->_util->setMousePos(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY);
+
+	drawWinTrace(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY, _fascinWin[id].width, _fascinWin[id].height);
+	_cursorX = _vm->_global->_inter_mouseX;
+	_cursorY = _vm->_global->_inter_mouseY;
+
+	do {
+		_vm->_game->checkKeys(&_vm->_global->_inter_mouseX, &_vm->_global->_inter_mouseY, &_vm->_game->_mouseButtons, 1);
+
+		if (_vm->_global->_inter_mouseX != _cursorX || _vm->_global->_inter_mouseY != _cursorY) {
+			if (_vm->_global->_inter_mouseX < minX) {
+				_vm->_global->_inter_mouseX = minX;
+				if (_vm->_global->_mousePresent)
+					_vm->_util->setMousePos(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY);
+			}
+
+			if (_vm->_global->_inter_mouseY < minY) {
+				_vm->_global->_inter_mouseY = minY;
+				if (_vm->_global->_mousePresent)
+					_vm->_util->setMousePos(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY);
+			}
+
+			if (_vm->_global->_inter_mouseX + _fascinWin[id].width > maxX) {
+				_vm->_global->_inter_mouseX = maxX - _fascinWin[id].width;
+				if (_vm->_global->_mousePresent)
+					_vm->_util->setMousePos(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY);
+			}
+
+			if (_vm->_global->_inter_mouseY + _fascinWin[id].height > maxY) {
+				_vm->_global->_inter_mouseY = maxY - _fascinWin[id].height;
+				if (_vm->_global->_mousePresent)
+					_vm->_util->setMousePos(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY);
+			}
+
+			drawWinTrace(_cursorX, _cursorY, _fascinWin[id].width, _fascinWin[id].height);
+			drawWinTrace(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY, _fascinWin[id].width, _fascinWin[id].height);
+			_cursorX = _vm->_global->_inter_mouseX;
+			_cursorY = _vm->_global->_inter_mouseY;
+		}
+	} while (_vm->_game->_mouseButtons);
+	drawWinTrace(_cursorX, _cursorY, _fascinWin[id].width, _fascinWin[id].height);
+	_cursorX = _vm->_global->_inter_mouseX;
+	_cursorY = _vm->_global->_inter_mouseY;
+}
+
 } // End of namespace Gob

Modified: scummvm/trunk/engines/gob/game.cpp
===================================================================
--- scummvm/trunk/engines/gob/game.cpp	2010-08-21 17:49:59 UTC (rev 52266)
+++ scummvm/trunk/engines/gob/game.cpp	2010-08-21 18:16:04 UTC (rev 52267)
@@ -215,7 +215,7 @@
 
 	_vm->_draw->initScreen();
 	_vm->_video->fillRect(*_vm->_draw->_frontSurface, 0, 0,
-			_vm->_video->_surfWidth - 1, _vm->_video->_surfHeight - 1, 1);
+	_vm->_video->_surfWidth - 1, _vm->_video->_surfHeight - 1, 1);
 
 	_vm->_util->setMousePos(152, 92);
 	_vm->_draw->_cursorX = _vm->_global->_inter_mouseX = 152;
@@ -352,8 +352,8 @@
 				}
 			}
 
-			if (_vm->getGameType() == kGameTypeFascination)
-				_vm->_draw->closeAllWin();
+			_vm->_draw->closeAllWin();
+
 			if (_totToLoad[0] == 0)
 				break;
 

Modified: scummvm/trunk/engines/gob/hotspots.cpp
===================================================================
--- scummvm/trunk/engines/gob/hotspots.cpp	2010-08-21 17:49:59 UTC (rev 52266)
+++ scummvm/trunk/engines/gob/hotspots.cpp	2010-08-21 18:16:04 UTC (rev 52267)
@@ -431,9 +431,10 @@
 	// Find the end of the filled hotspot space
 	int i;
 	Hotspot *destPtr = _hotspots;
-	for (i = 0; i < kHotspotCount; i++, destPtr++)
+	for (i = 0; i < kHotspotCount; i++, destPtr++) {
 		if (destPtr->isEnd())
 			break;
+	}
 
 	if (((uint32) (kHotspotCount - i)) < backup.size)
 		error("Hotspots::pop(): Not enough free space in the current Hotspot "
@@ -525,12 +526,12 @@
 int16 Hotspots::curWindow(int16 &dx, int16 &dy) const {
 	if ((_vm->_draw->_renderFlags & 0x80)==0)
 		return(0);
-	for (int i = 0; i < 10; i++)
-		if (_vm->_draw->_fascinWin[i].id != -1)
+	for (int i = 0; i < 10; i++) {
+		if (_vm->_draw->_fascinWin[i].id != -1) {
 			if (_vm->_global->_inter_mouseX >= _vm->_draw->_fascinWin[i].left &&
 				_vm->_global->_inter_mouseX < _vm->_draw->_fascinWin[i].left + _vm->_draw->_fascinWin[i].width &&
 				_vm->_global->_inter_mouseY >= _vm->_draw->_fascinWin[i].top &&
-				_vm->_global->_inter_mouseY < _vm->_draw->_fascinWin[i].top + _vm->_draw->_fascinWin[i].height)
+				_vm->_global->_inter_mouseY < _vm->_draw->_fascinWin[i].top + _vm->_draw->_fascinWin[i].height) {
 				if (_vm->_draw->_fascinWin[i].id == _vm->_draw->_winCount-1) {
 					dx = _vm->_draw->_fascinWin[i].left;
 					dy = _vm->_draw->_fascinWin[i].top;
@@ -546,6 +547,9 @@
 						return(6);
 					return(-i);
 				}
+			}
+		}
+	}
 	return(0);
 }
 
@@ -555,11 +559,8 @@
 
 	int16 dx = 0;
 	int16 dy = 0;
-	int16 winId = -1;
+	int16 winId = _vm->_draw->getWinFromCoord(dx, dy);
 
-	if (_vm->getGameType() == kGameTypeFascination)
-		winId = _vm->_draw->isOverWin(dx, dy);
-
 	if (winId < 0) {
 		winId = 0;
 		dx = 0;
@@ -753,11 +754,8 @@
 
 			if (_vm->_game->_mouseButtons != kMouseButtonsNone) {
 				// Mouse button pressed
-				int i;
-				if (_vm->getGameType() == kGameTypeFascination)
-					i = _vm->_draw->handleCurWin();
-				else
-					i = 0;
+				int i = _vm->_draw->handleCurWin();
+
 				if (!i) {
 					_vm->_draw->animateCursor(2);
 					if (delay > 0) {
@@ -1242,7 +1240,7 @@
 			_vm->_video->drawLine(*_vm->_draw->_spritesArray[_vm->_draw->_destSurface], left, top, left, top + height - 1, 0);
 			_vm->_video->drawLine(*_vm->_draw->_spritesArray[_vm->_draw->_destSurface], left, top, left + width - 1, top, 0);
 			_vm->_video->drawLine(*_vm->_draw->_spritesArray[_vm->_draw->_destSurface], left, top + height - 1, left + width - 1, top + height - 1, 0);
-		} else
+		} else {
 			if ((_vm->_draw->_fascinWin[windowNum].id != -1) && (_vm->_draw->_fascinWin[windowNum].id == _vm->_draw->_winCount - 1)) {
 				left += _vm->_draw->_fascinWin[windowNum].left;
 				top  += _vm->_draw->_fascinWin[windowNum].top;
@@ -1253,6 +1251,7 @@
 				left -= _vm->_draw->_fascinWin[windowNum].left;
 				top  -= _vm->_draw->_fascinWin[windowNum].top;
 			}
+		}
 	}
 	type &= 0x7F;
 
@@ -1721,9 +1720,9 @@
 //	var_4 += unk_var;
 
 	for (int i = 0; i < kHotspotCount; i++) {
-		if (_hotspots[i].isEnd()) {
+		if (_hotspots[i].isEnd())
 			return;
-		}
+
 		if ((_hotspots[i].id == 0xD000 + shortId) || (_hotspots[i].id == 0xB000 + shortId) ||
 			(_hotspots[i].id == 0x4000 + shortId)) {
 			longId = _hotspots[i].id;
@@ -1744,7 +1743,6 @@
 				right -= 2;
 				bottom -= 2;
 			}
-//			oPlaytoons_sub_F_1B(0x8000 + var2, left, top, right, bottom, _vm->_game->_script->getResultStr(), var3, var4, shortId);
 			_vm->_draw->oPlaytoons_sub_F_1B(0x8000+ var2, left, top, right, bottom, _vm->_game->_script->getResultStr(), fontIndex, var4, shortId);
 			return;
 		}
@@ -2052,7 +2050,6 @@
 			cleanFloatString(spot);
 
 		if ((spot.getType() >= kTypeInput2NoLeave) && (spot.getType() <= kTypeInput3Leave)) {
-
 			// Look if we find a match between the wanted and the typed string
 			checkStringMatch(spot, inputs[inputIndex], inputPos);
 			strInputCount++;

Modified: scummvm/trunk/engines/gob/init_fascin.cpp
===================================================================
--- scummvm/trunk/engines/gob/init_fascin.cpp	2010-08-21 17:49:59 UTC (rev 52266)
+++ scummvm/trunk/engines/gob/init_fascin.cpp	2010-08-21 18:16:04 UTC (rev 52267)
@@ -41,14 +41,15 @@
 void Init_Fascination::updateConfig() {
 // In Fascination, some empty texts are present and used to clean up the text area.
 // Using _doSubtitles does the trick.
-// The first obvious example is in the hotel hall: 'Use ...' is displayed at the same
-// place than the character dialogs.
+// The first obvious example is in the hotel hall: 'Use ...' is displayed at
+// the same place than the character dialogs.
 	_vm->_global->_doSubtitles = true;
 }
 
 void Init_Fascination::initGame() {
-	// HACK - Suppress ADLIB_FLAG as the MDY/TBR player is not working. suppress the honker too,
-	// as the script checks in the intro for it's presence to play or not some noices.
+// HACK - Suppress ADLIB_FLAG as the MDY/TBR player is not working. suppress
+// the PC Speaker too, as the script checks in the intro for it's presence
+// to play or not some noices.
 	_vm->_global->_soundFlags = MIDI_FLAG | BLASTER_FLAG;
 
 	Init::initGame();

Modified: scummvm/trunk/engines/gob/inter.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter.cpp	2010-08-21 17:49:59 UTC (rev 52266)
+++ scummvm/trunk/engines/gob/inter.cpp	2010-08-21 18:16:04 UTC (rev 52267)
@@ -292,7 +292,7 @@
 
 		// WORKAROUND:
 		// The Amiga and Atari ST versions of Fascination don't add a delay after
-		// showing images between some levels, probably using the loading time int account. 
+		// showing images between some levels, probably using the loading time int account.
 		// We manually add it here.
 		if ((_vm->getGameType() == kGameTypeFascination) &&
 		    ((_vm->getPlatform() == Common::kPlatformAmiga)||

Modified: scummvm/trunk/engines/gob/sound/sound.cpp
===================================================================
--- scummvm/trunk/engines/gob/sound/sound.cpp	2010-08-21 17:49:59 UTC (rev 52266)
+++ scummvm/trunk/engines/gob/sound/sound.cpp	2010-08-21 18:16:04 UTC (rev 52267)
@@ -610,11 +610,13 @@
 void Sound::cdPlay(const char *trackName) {
 	if (!_cdrom)
 		return;
+	debugC(1, kDebugSound, "CDROM: Playing track \"%s\"", trackName);
 
-	debugC(1, kDebugSound, "CDROM: Playing track \"%s\"", trackName);
-	if ((_vm->getGameType() == kGameTypeFascination) && !scumm_stricmp(trackName, "boscle")) {
+// WORKAROUND - In Fascination CD, in the storage room, a track has the wrong
+// name in the scripts, and therefore doesn't play. This fixes the problem.
+	if ((_vm->getGameType() == kGameTypeFascination) && !scumm_stricmp(trackName, "boscle"))
 		_cdrom->startTrack("bosscle");
-	} else
+	else
 		_cdrom->startTrack(trackName);
 }
 


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