[Scummvm-cvs-logs] SF.net SVN: scummvm:[44103] scummvm/trunk

strangerke at users.sourceforge.net strangerke at users.sourceforge.net
Tue Sep 15 14:15:23 CEST 2009


Revision: 44103
          http://scummvm.svn.sourceforge.net/scummvm/?rev=44103&view=rev
Author:   strangerke
Date:     2009-09-15 12:15:22 +0000 (Tue, 15 Sep 2009)

Log Message:
-----------
- Implement _pattern variable
- Add oPlaytoons_putPixel and Playtoons specific spriteOperation (using _pattern)

Modified Paths:
--------------
    scummvm/trunk/dists/msvc8/gob.vcproj
    scummvm/trunk/dists/msvc9/gob.vcproj
    scummvm/trunk/engines/gob/draw.cpp
    scummvm/trunk/engines/gob/draw.h
    scummvm/trunk/engines/gob/draw_v2.cpp
    scummvm/trunk/engines/gob/gob.cpp
    scummvm/trunk/engines/gob/hotspots.cpp
    scummvm/trunk/engines/gob/hotspots.h
    scummvm/trunk/engines/gob/inter.h
    scummvm/trunk/engines/gob/inter_playtoons.cpp
    scummvm/trunk/engines/gob/inter_v6.cpp
    scummvm/trunk/engines/gob/module.mk

Added Paths:
-----------
    scummvm/trunk/engines/gob/draw_playtoons.cpp

Modified: scummvm/trunk/dists/msvc8/gob.vcproj
===================================================================
--- scummvm/trunk/dists/msvc8/gob.vcproj	2009-09-15 10:36:50 UTC (rev 44102)
+++ scummvm/trunk/dists/msvc8/gob.vcproj	2009-09-15 12:15:22 UTC (rev 44103)
@@ -71,6 +71,7 @@
 		<File RelativePath="..\..\engines\gob\draw.h" />
 		<File RelativePath="..\..\engines\gob\draw_bargon.cpp" />
 		<File RelativePath="..\..\engines\gob\draw_fascin.cpp" />
+		<File RelativePath="..\..\engines\gob\draw_playtoons.cpp" />
 		<File RelativePath="..\..\engines\gob\draw_v1.cpp" />
 		<File RelativePath="..\..\engines\gob\draw_v2.cpp" />
 		<File RelativePath="..\..\engines\gob\driver_vga.cpp" />

Modified: scummvm/trunk/dists/msvc9/gob.vcproj
===================================================================
--- scummvm/trunk/dists/msvc9/gob.vcproj	2009-09-15 10:36:50 UTC (rev 44102)
+++ scummvm/trunk/dists/msvc9/gob.vcproj	2009-09-15 12:15:22 UTC (rev 44103)
@@ -41,6 +41,7 @@
 			<File RelativePath="..\..\engines\gob\save\saveload_v3.cpp" />
 			<File RelativePath="..\..\engines\gob\save\saveload_v4.cpp" />
 			<File RelativePath="..\..\engines\gob\save\saveload_v6.cpp" />
+			<File RelativePath="..\..\engines\gob\save\saveload_fascination.cpp" />
 			<File RelativePath="..\..\engines\gob\save\saveload_playtoons.cpp" />
 		</Filter>
 		<Filter Name="sound">
@@ -72,6 +73,7 @@
 		<File RelativePath="..\..\engines\gob\draw.h" />
 		<File RelativePath="..\..\engines\gob\draw_bargon.cpp" />
 		<File RelativePath="..\..\engines\gob\draw_fascin.cpp" />
+		<File RelativePath="..\..\engines\gob\draw_playtoons.cpp" />
 		<File RelativePath="..\..\engines\gob\draw_v1.cpp" />
 		<File RelativePath="..\..\engines\gob\draw_v2.cpp" />
 		<File RelativePath="..\..\engines\gob\driver_vga.cpp" />

Modified: scummvm/trunk/engines/gob/draw.cpp
===================================================================
--- scummvm/trunk/engines/gob/draw.cpp	2009-09-15 10:36:50 UTC (rev 44102)
+++ scummvm/trunk/engines/gob/draw.cpp	2009-09-15 12:15:22 UTC (rev 44103)
@@ -126,6 +126,8 @@
 	_needAdjust = 2;
 	_scrollOffsetX = 0;
 	_scrollOffsetY = 0;
+
+	_pattern = 0;
 }
 
 Draw::~Draw() {

Modified: scummvm/trunk/engines/gob/draw.h
===================================================================
--- scummvm/trunk/engines/gob/draw.h	2009-09-15 10:36:50 UTC (rev 44102)
+++ scummvm/trunk/engines/gob/draw.h	2009-09-15 12:15:22 UTC (rev 44103)
@@ -138,6 +138,8 @@
 	int16 _scrollOffsetY;
 	int16 _scrollOffsetX;
 
+	int16 _pattern;
+
 	void invalidateRect(int16 left, int16 top, int16 right, int16 bottom);
 	void blitInvalidated();
 	void setPalette();
@@ -228,6 +230,13 @@
 	virtual ~Draw_Fascin() {}
 };
 
+class Draw_Playtoons: public Draw_v2 {
+public:
+	Draw_Playtoons(GobEngine *vm);
+	virtual ~Draw_Playtoons() {}
+	virtual void spriteOperation(int16 operation);
+};
+	
 // Draw operations
 
 #define DRAW_BLITSURF	0

Added: scummvm/trunk/engines/gob/draw_playtoons.cpp
===================================================================
--- scummvm/trunk/engines/gob/draw_playtoons.cpp	                        (rev 0)
+++ scummvm/trunk/engines/gob/draw_playtoons.cpp	2009-09-15 12:15:22 UTC (rev 44103)
@@ -0,0 +1,407 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#include "common/endian.h"
+#include "graphics/cursorman.h"
+
+#include "gob/draw.h"
+#include "gob/game.h"
+#include "gob/resources.h"
+
+namespace Gob {
+
+Draw_Playtoons::Draw_Playtoons(GobEngine *vm) : Draw_v2(vm) {
+}
+
+void Draw_Playtoons::spriteOperation(int16 operation) {
+	int16 len;
+	int16 x, y;
+	SurfaceDescPtr sourceSurf, destSurf;
+	bool deltaVeto;
+	int16 left;
+	int16 ratio;
+	Resource *resource;
+
+	deltaVeto = (operation & 0x10) != 0;
+	operation &= 0x0F;
+
+	if (_sourceSurface >= 100)
+		_sourceSurface -= 80;
+	if (_destSurface >= 100)
+		_destSurface -= 80;
+
+	if ((_renderFlags & RENDERFLAG_USEDELTAS) && !deltaVeto) {
+		if ((_sourceSurface == 21) && (operation != DRAW_LOADSPRITE)) {
+			_spriteLeft += _backDeltaX;
+			_spriteTop += _backDeltaY;
+		}
+
+		if (_destSurface == 21) {
+			_destSpriteX += _backDeltaX;
+			_destSpriteY += _backDeltaY;
+			if ((operation == DRAW_DRAWLINE) ||
+			   ((operation >= DRAW_DRAWBAR) && (operation <= DRAW_FILLRECTABS))) {
+				_spriteRight += _backDeltaX;
+				_spriteBottom += _backDeltaY;
+			}
+		}
+	}
+
+	int16 spriteLeft = _spriteLeft;
+	int16 spriteTop = _spriteTop;
+	int16 spriteRight = _spriteRight;
+	int16 spriteBottom = _spriteBottom;
+	int16 destSpriteX = _destSpriteX;
+	int16 destSpriteY = _destSpriteY;
+	int16 destSurface = _destSurface;
+	int16 sourceSurface = _sourceSurface;
+
+	if (_vm->_video->_splitSurf && ((_destSurface == 20) || (_destSurface == 21))) {
+		if ((_destSpriteY >= _vm->_video->_splitStart)) {
+			_destSpriteY -= _vm->_video->_splitStart;
+			if ((operation == DRAW_DRAWLINE) ||
+				 ((operation >= DRAW_DRAWBAR) && (operation <= DRAW_FILLRECTABS)))
+				_spriteBottom -= _vm->_video->_splitStart;
+
+			_destSurface += 4;
+		}
+
+		if ((_spriteTop >= _vm->_video->_splitStart) && (operation == DRAW_BLITSURF)) {
+			_spriteTop -= _vm->_video->_splitStart;
+			if (_destSurface < 24)
+				_destSurface += 4;
+		}
+
+	}
+
+	adjustCoords(0, &_destSpriteX, &_destSpriteY);
+	if ((operation != DRAW_LOADSPRITE) && (_needAdjust != 2)) {
+		adjustCoords(0, &_spriteRight, &_spriteBottom);
+		adjustCoords(0, &_spriteLeft, &_spriteTop);
+
+		if (operation == DRAW_DRAWLINE) {
+			if ((_spriteRight == _destSpriteX) || (_spriteBottom == _destSpriteY)) {
+				operation = DRAW_FILLRECTABS;
+				_backColor = _frontColor;
+			}
+		} else if (operation == DRAW_DRAWLETTER)
+			operation = DRAW_BLITSURF;
+
+		if (operation == DRAW_DRAWLINE) {
+			if (_spriteBottom < _destSpriteY) {
+				SWAP(_spriteBottom, _destSpriteY);
+				SWAP(_spriteRight, _destSpriteX);
+			}
+		} else if ((operation == DRAW_LOADSPRITE) ||
+		           (operation > DRAW_PRINTTEXT)) {
+			if (_spriteBottom < _destSpriteY)
+				SWAP(_spriteBottom, _destSpriteY);
+			if (_spriteRight < _destSpriteX)
+				SWAP(_spriteRight, _destSpriteX);
+			_spriteRight++;
+			_spriteBottom++;
+		}
+	}
+
+	sourceSurf = _spritesArray[_sourceSurface];
+	destSurf = _spritesArray[_destSurface];
+
+	if (!destSurf) {
+		warning("Can't do operation %d on surface %d: nonexistent", operation, _destSurface);
+		return;
+	}
+
+	switch (operation) {
+	case DRAW_BLITSURF:
+	case DRAW_DRAWLETTER:
+		if (!sourceSurf || !destSurf)
+			break;
+
+		_vm->_video->drawSprite(*_spritesArray[_sourceSurface],
+				*_spritesArray[_destSurface],
+				_spriteLeft, spriteTop,
+				_spriteLeft + _spriteRight - 1,
+				_spriteTop + _spriteBottom - 1,
+				_destSpriteX, _destSpriteY, _transparency);
+
+		dirtiedRect(_destSurface, _destSpriteX, _destSpriteY,
+				_destSpriteX + _spriteRight - 1, _destSpriteY + _spriteBottom - 1);
+		break;
+
+	case DRAW_PUTPIXEL:
+		switch(_pattern & 0xFF) {
+		case -1:
+		case 1:
+		case 2:
+		case 3:
+			warning("oPlaytoons_spriteOperation: operation DRAW_PUTPIWEL, pattern %d", _pattern & 0xFF);
+			break;
+		default: 
+			_vm->_video->putPixel(_destSpriteX, _destSpriteY, _frontColor, *_spritesArray[_destSurface]);
+			break;
+		}
+		dirtiedRect(_destSurface, _destSpriteX - (_pattern / 2),
+			                      _destSpriteY - (_pattern / 2), 
+								  _destSpriteX + (_pattern + 1) / 2, 
+								  _destSpriteY + (_pattern + 1) / 2);
+		break;
+	case DRAW_FILLRECT:
+		switch(_pattern & 0xFF) {
+		case 1:
+		case 2:
+		case 3:
+		case 4:
+			warning("oPlaytoons_spriteOperation: operation DRAW_FILLRECT, pattern %d", _pattern & 0xFF);
+			break;
+		case 0: 
+			_vm->_video->fillRect(*_spritesArray[_destSurface], destSpriteX,
+					_destSpriteY, _destSpriteX + _spriteRight - 1,
+					_destSpriteY + _spriteBottom - 1, _backColor);
+
+			dirtiedRect(_destSurface, _destSpriteX, _destSpriteY,
+					_destSpriteX + _spriteRight - 1, _destSpriteY + _spriteBottom - 1);
+			break;
+		default: 
+			warning("oPlaytoons_spriteOperation: operation DRAW_FILLRECT, unexpected pattern %d", _pattern & 0xFF);
+			break;
+		}
+		break;
+
+	case DRAW_DRAWLINE:
+		if ((_needAdjust != 2) || (_needAdjust < 10)) {
+			warning ("oPlaytoons_spriteOperation: operation DRAW_DRAWLINE, draw multiple lines");
+				_vm->_video->drawLine(*_spritesArray[_destSurface],
+					_destSpriteX, _destSpriteY,
+					_spriteRight, _spriteBottom, _frontColor);
+				_vm->_video->drawLine(*_spritesArray[_destSurface],
+					_destSpriteX + 1, _destSpriteY,
+					_spriteRight + 1, _spriteBottom, _frontColor);
+				_vm->_video->drawLine(*_spritesArray[_destSurface],
+					_destSpriteX, _destSpriteY + 1,
+					_spriteRight, _spriteBottom + 1, _frontColor);
+				_vm->_video->drawLine(*_spritesArray[_destSurface],
+					_destSpriteX + 1, _destSpriteY + 1,
+					_spriteRight + 1, _spriteBottom + 1, _frontColor);
+		} else {
+			switch(_pattern & 0xFF) {
+			case 0: 
+				_vm->_video->drawLine(*_spritesArray[_destSurface],
+					_destSpriteX, _destSpriteY,
+					_spriteRight, _spriteBottom, _frontColor);
+
+				break;
+			default: 
+				warning("oPlaytoons_spriteOperation: operation DRAW_DRAWLINE, draw %d lines", (_pattern & 0xFF) * (_pattern & 0xFF));
+				for (int16 i = 0; i <= _pattern ; i++)
+					for (int16 j = 0; j <= _pattern ; j++)
+						_vm->_video->drawLine(*_spritesArray[_destSurface], 
+								_destSpriteX  - (_pattern / 2) + i,
+								_destSpriteY  - (_pattern / 2) + j,
+								_spriteRight  - (_pattern / 2) + i,
+								_spriteBottom - (_pattern / 2) + j,
+								_frontColor);
+				break;
+			}
+		}
+		dirtiedRect(_destSurface, MIN(_destSpriteX, _spriteRight)  - _pattern, 
+								  MIN(_destSpriteY, _spriteBottom) - _pattern, 
+								  MAX(_destSpriteX, _spriteRight)  + _pattern + 1, 
+								  MAX(_destSpriteY, _spriteBottom) + _pattern + 1);
+		break;
+
+	case DRAW_INVALIDATE:
+		if ((_pattern & 0xFF) != 0)			
+			warning("oPlaytoons_spriteOperation: operation DRAW_INVALIDATE, pattern %d", _pattern & 0xFF);
+
+		_vm->_video->drawCircle(*_spritesArray[_destSurface], _destSpriteX,
+				_destSpriteY, _spriteRight, _frontColor);
+
+		dirtiedRect(_destSurface, _destSpriteX - _spriteRight, _destSpriteY - _spriteBottom,
+				_destSpriteX + _spriteRight, _destSpriteY + _spriteBottom);
+		break;
+
+	case DRAW_LOADSPRITE:
+		resource = _vm->_game->_resources->getResource((uint16) _spriteLeft,
+			                                             &_spriteRight, &_spriteBottom);
+
+		if (!resource)
+			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;
+		break;
+
+	case DRAW_PRINTTEXT:
+		len = strlen(_textToPrint);
+		left = _destSpriteX;
+
+		if ((_fontIndex >= 4) || (_fontToSprite[_fontIndex].sprite == -1)) {
+			Font *font = _fonts[_fontIndex];
+			if (!font) {
+				warning("Trying to print \"%s\" with undefined font %d", _textToPrint, _fontIndex);
+				break;
+			}
+
+			if (font->isMonospaced()) {
+				if (((int8) _textToPrint[0]) == -1) {
+					_vm->validateLanguage();
+
+					byte *dataBuf = _vm->_game->_resources->getTexts() + _textToPrint[1] + 1;
+					len = *dataBuf++;
+					for (int i = 0; i < len; i++, dataBuf += 2) {
+						_vm->_video->drawLetter(READ_LE_UINT16(dataBuf), _destSpriteX,
+								_destSpriteY, *font, _transparency, _frontColor,
+								_backColor, *_spritesArray[_destSurface]);
+					}
+				} else {
+					drawString(_textToPrint, _destSpriteX, _destSpriteY, _frontColor,
+							_backColor, _transparency, *_spritesArray[_destSurface], *font);
+					_destSpriteX += len * font->getCharWidth();
+				}
+			} else {
+				for (int i = 0; i < len; i++) {
+					_vm->_video->drawLetter(_textToPrint[i], _destSpriteX,
+							_destSpriteY, *font, _transparency,
+							_frontColor, _backColor, *_spritesArray[_destSurface]);
+					_destSpriteX += font->getCharWidth(_textToPrint[i]);
+				}
+			}
+
+		} else {
+			sourceSurf = _spritesArray[_fontToSprite[_fontIndex].sprite];
+			ratio = ((sourceSurf == _frontSurface) || (sourceSurf == _backSurface)) ?
+				320 : sourceSurf->getWidth();
+			ratio /= _fontToSprite[_fontIndex].width;
+			for (int i = 0; i < len; i++) {
+				y = ((_textToPrint[i] - _fontToSprite[_fontIndex].base) / ratio)
+					* _fontToSprite[_fontIndex].height;
+				x = ((_textToPrint[i] - _fontToSprite[_fontIndex].base) % ratio)
+					* _fontToSprite[_fontIndex].width;
+				_vm->_video->drawSprite(*_spritesArray[_fontToSprite[_fontIndex].sprite],
+						*_spritesArray[_destSurface], x, y,
+						x + _fontToSprite[_fontIndex].width - 1,
+						y + _fontToSprite[_fontIndex].height - 1,
+						_destSpriteX, _destSpriteY, _transparency);
+				_destSpriteX += _fontToSprite[_fontIndex].width;
+			}
+		}
+
+		dirtiedRect(_destSurface, left, _destSpriteY,
+				_destSpriteX - 1, _destSpriteY + _fonts[_fontIndex]->getCharHeight() - 1);
+		break;
+
+	case DRAW_DRAWBAR:
+		if (_needAdjust != 2) {
+			_vm->_video->fillRect(*_spritesArray[_destSurface],
+					_destSpriteX, _spriteBottom - 1,
+					_spriteRight, _spriteBottom, _frontColor);
+
+			_vm->_video->fillRect(*_spritesArray[_destSurface],
+					_destSpriteX, _destSpriteY,
+					_destSpriteX + 1, _spriteBottom, _frontColor);
+
+			_vm->_video->fillRect(*_spritesArray[_destSurface],
+					_spriteRight - 1, _destSpriteY,
+					_spriteRight, _spriteBottom, _frontColor);
+
+			_vm->_video->fillRect(*_spritesArray[_destSurface],
+					_destSpriteX, _destSpriteY,
+					_spriteRight, _destSpriteY + 1, _frontColor);
+		} else {
+			_vm->_video->drawLine(*_spritesArray[_destSurface],
+					_destSpriteX, _spriteBottom,
+					_spriteRight, _spriteBottom, _frontColor);
+
+			_vm->_video->drawLine(*_spritesArray[_destSurface],
+					_destSpriteX, _destSpriteY,
+					_destSpriteX, _spriteBottom, _frontColor);
+
+			_vm->_video->drawLine(*_spritesArray[_destSurface],
+					_spriteRight, _destSpriteY,
+					_spriteRight, _spriteBottom, _frontColor);
+
+			_vm->_video->drawLine(*_spritesArray[_destSurface],
+					_destSpriteX, _destSpriteY,
+					_spriteRight, _destSpriteY, _frontColor);
+		}
+
+		dirtiedRect(_destSurface, _destSpriteX, _destSpriteY, _spriteRight, _spriteBottom);
+		break;
+
+	case DRAW_CLEARRECT:
+		if ((_backColor != 16) && (_backColor != 144)) {
+			_vm->_video->fillRect(*_spritesArray[_destSurface],
+			    _destSpriteX, _destSpriteY,
+			    _spriteRight, _spriteBottom,
+			    _backColor);
+		}
+
+		dirtiedRect(_destSurface, _destSpriteX, _destSpriteY, _spriteRight, _spriteBottom);
+		break;
+
+	case DRAW_FILLRECTABS:
+		_vm->_video->fillRect(*_spritesArray[_destSurface],
+		    _destSpriteX, _destSpriteY,
+		    _spriteRight, _spriteBottom, _backColor);
+
+		dirtiedRect(_destSurface, _destSpriteX, _destSpriteY, _spriteRight, _spriteBottom);
+		break;
+	}
+
+	_spriteLeft = spriteLeft;
+	_spriteTop = spriteTop;
+	_spriteRight = spriteRight;
+	_spriteBottom = spriteBottom;
+	_destSpriteX = destSpriteX;
+	_destSpriteY = destSpriteY;
+	_destSurface = destSurface;
+	_sourceSurface = sourceSurface;
+
+	if (operation == DRAW_PRINTTEXT) {
+		len = _fonts[_fontIndex]->getCharWidth();
+		adjustCoords(1, &len, 0);
+		_destSpriteX += len * strlen(_textToPrint);
+	}
+
+	if ((_renderFlags & RENDERFLAG_USEDELTAS) && !deltaVeto) {
+		if (_sourceSurface == 21) {
+			_spriteLeft -= _backDeltaX;
+			_spriteTop -= _backDeltaY;
+		}
+
+		if (_destSurface == 21) {
+			_destSpriteX -= _backDeltaX;
+			_destSpriteY -= _backDeltaY;
+		}
+	}
+}
+
+} // End of namespace Gob


Property changes on: scummvm/trunk/engines/gob/draw_playtoons.cpp
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:keywords
   + Date Rev Author URL Id
Added: svn:eol-style
   + native

Modified: scummvm/trunk/engines/gob/draw_v2.cpp
===================================================================
--- scummvm/trunk/engines/gob/draw_v2.cpp	2009-09-15 10:36:50 UTC (rev 44102)
+++ scummvm/trunk/engines/gob/draw_v2.cpp	2009-09-15 12:15:22 UTC (rev 44103)
@@ -217,6 +217,7 @@
 	size    = textItem->getSize();
 	dataPtr = textItem->getData();
 	ptr     = dataPtr;
+	_pattern = 0;
 
 	bool isSubtitle = (ptr[1] & 0x80) != 0;
 
@@ -919,4 +920,4 @@
 	}
 }
 
-} // End of namespace Gob
+} // End of namespace Gob
\ No newline at end of file

Modified: scummvm/trunk/engines/gob/gob.cpp
===================================================================
--- scummvm/trunk/engines/gob/gob.cpp	2009-09-15 10:36:50 UTC (rev 44102)
+++ scummvm/trunk/engines/gob/gob.cpp	2009-09-15 12:15:22 UTC (rev 44103)
@@ -463,7 +463,7 @@
 		_video    = new Video_v6(this);
 		_inter    = new Inter_Playtoons(this);
 		_mult     = new Mult_v2(this);
-		_draw     = new Draw_v2(this);
+		_draw     = new Draw_Playtoons(this);
 		_map      = new Map_v2(this);
 		_goblin   = new Goblin_v4(this);
 		_scenery  = new Scenery_v2(this);

Modified: scummvm/trunk/engines/gob/hotspots.cpp
===================================================================
--- scummvm/trunk/engines/gob/hotspots.cpp	2009-09-15 10:36:50 UTC (rev 44102)
+++ scummvm/trunk/engines/gob/hotspots.cpp	2009-09-15 12:15:22 UTC (rev 44103)
@@ -1565,14 +1565,60 @@
 	return cursor;
 }
 
-bool Hotspots::searchHotspot(int16 shortId) const {
+void Hotspots::oPlaytoons_F_1B(void) {
+	int16 shortId;
+	int16 longId;
+	int16 var2;
+	int16 var3;
+	int16 var4;
+
+	uint16 left;
+	uint16 top;
+	uint16 right;
+	uint16 bottom;
+
+	shortId = _vm->_game->_script->readValExpr();
+	var2 = _vm->_game->_script->readValExpr();
+
+	_vm->_game->_script->evalExpr(0);
+
+	var3 = _vm->_game->_script->readValExpr();
+	var4 = _vm->_game->_script->readValExpr();
+
+//  this variable is always set to 0 in Playtoons
+//	var_4 += unk_var; 
+
 	for (int i = 0; i < kHotspotCount; i++) {
-		if (_hotspots[i].isEnd())
-			return false;
-		if ((_hotspots[i].id == 0xD000 + shortId) || (_hotspots[i].id == 0xB000 + shortId) || (_hotspots[i].id == 0x4000 + shortId))
-			return true;
+		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;
+			warning("oPlaytoons_F_1B not fully handled");
+			warning("shortId %d, var2 %d var3 %d var4 %d", shortId, var2, var3, var4);
+			
+			left = _hotspots[i].left;
+			top = _hotspots[i].top;
+			right = _hotspots[i].right;
+			bottom = _hotspots[i].bottom;
+
+			left += 2;
+			top += 2;
+			right -= 2;
+			bottom -= 2;
+			if ((_vm->_draw->_needAdjust != 2) && (_vm->_draw->_needAdjust != 10)) {
+				left += 2;
+				top += 2;
+				right -= 2;
+				bottom -= 2;
+			}
+			oPlaytoons_sub_F_1B(0x8000 + var2, left, top, right, bottom, _vm->_game->_script->getResultStr(), var3, var4, shortId);
+			return;
+		}
 	}
-	return false;
+	warning("shortId not found %d", shortId);
+	return;
 }
 
 uint16 Hotspots::inputToHotspot(uint16 input) const {
@@ -1985,4 +2031,16 @@
 	}
 }
 
+void Hotspots::oPlaytoons_sub_F_1B( uint16 id, int16 left, int16 top, int16 right, int16 bottom, char *paramStr, int16 var3, int16 var4, int16 shortId)
+{
+	char tmpStr[128];
+
+	strcpy( tmpStr, paramStr);
+	_vm->_draw->adjustCoords(1, &left, &right);
+	_vm->_draw->adjustCoords(1, &top,  &bottom);
+
+	warning("oPlaytoons_sub_F_1B display string %s", paramStr);
+	return;
+}
+
 } // End of namespace Gob

Modified: scummvm/trunk/engines/gob/hotspots.h
===================================================================
--- scummvm/trunk/engines/gob/hotspots.h	2009-09-15 10:36:50 UTC (rev 44102)
+++ scummvm/trunk/engines/gob/hotspots.h	2009-09-15 12:15:22 UTC (rev 44103)
@@ -101,9 +101,10 @@
 	/** Return the cursor found in the hotspot to the coordinates. */
 	int16 findCursor(uint16 x, uint16 y) const;
 
-	/** Check the existance of a hotspot based on its short Id */
-	bool searchHotspot(int16 shortId) const;
+	/** implementation of oPlaytoons_F_1B code*/
+	void oPlaytoons_F_1B();
 
+
 private:
 	struct Hotspot {
 		uint16  id;
@@ -268,6 +269,8 @@
 
 	/** Go through all inputs we manage and redraw their texts. */
 	void updateAllTexts(const InputDesc *inputs) const;
+
+	void oPlaytoons_sub_F_1B( uint16 id, int16 left, int16 top, int16 right, int16 bottom, char *str, int16 var3, int16 var4, int16 shortId);
 };
 
 } // End of namespace Gob

Modified: scummvm/trunk/engines/gob/inter.h
===================================================================
--- scummvm/trunk/engines/gob/inter.h	2009-09-15 10:36:50 UTC (rev 44102)
+++ scummvm/trunk/engines/gob/inter.h	2009-09-15 12:15:22 UTC (rev 44103)
@@ -559,6 +559,7 @@
 
 	bool oPlaytoons_printText(OpFuncParams &params);
 	bool oPlaytoons_F_1B(OpFuncParams &params);
+	bool oPlaytoons_putPixel(OpFuncParams &params);
 	bool oPlaytoons_freeSprite(OpFuncParams &params);
 	bool oPlaytoons_checkData(OpFuncParams &params);
 	bool oPlaytoons_readData(OpFuncParams &params);

Modified: scummvm/trunk/engines/gob/inter_playtoons.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_playtoons.cpp	2009-09-15 10:36:50 UTC (rev 44102)
+++ scummvm/trunk/engines/gob/inter_playtoons.cpp	2009-09-15 12:15:22 UTC (rev 44103)
@@ -87,6 +87,7 @@
 	CLEAROPCODEFUNC(0x3D);
 	OPCODEFUNC(0x0B, oPlaytoons_printText);
 	OPCODEFUNC(0x1B, oPlaytoons_F_1B);
+	OPCODEFUNC(0x24, oPlaytoons_putPixel);
 	OPCODEFUNC(0x27, oPlaytoons_freeSprite);
 	OPCODEFUNC(0x3F, oPlaytoons_checkData);
 	OPCODEFUNC(0x4D, oPlaytoons_readData);
@@ -182,25 +183,26 @@
 }
 
 bool Inter_Playtoons::oPlaytoons_F_1B(OpFuncParams &params) {
-	int16 shortId;
-	int16 var2;
-	int16 var3;
-	int16 var4;
+	_vm->_game->_hotspots->oPlaytoons_F_1B();
+	return false;
+}
 
-	shortId = _vm->_game->_script->readValExpr();
-	var2 = _vm->_game->_script->readValExpr();
+bool Inter_Playtoons::oPlaytoons_putPixel(OpFuncParams &params) {
+	_vm->_draw->_destSurface = _vm->_game->_script->readInt16();
 
-	_vm->_game->_script->evalExpr(0);
+	_vm->_draw->_destSpriteX = _vm->_game->_script->readValExpr();
+	_vm->_draw->_destSpriteY = _vm->_game->_script->readValExpr();
 
-	var3 = _vm->_game->_script->readValExpr();
-	var4 = _vm->_game->_script->readValExpr();
+//	_expression->printExpr(99);
+	_vm->_game->_script->readExpr(99, false);
 
-	if (_vm->_game->_hotspots->searchHotspot(shortId)) {
-		warning("oPlaytoons_F_1B not fully handled");
-		warning("shortId %d, var2 %d var3 %d var4 %d", shortId, var2, var3, var4);
-	}
-	else
-		warning("shortId not found %d", shortId);
+	//unk_var is always set to 0 in Playtoons
+	_vm->_draw->_frontColor = _vm->_game->_script->getResultInt() & 0xFFFF; // + unk_var;
+
+	_vm->_draw->_pattern = _vm->_game->_script->getResultInt()>>16;
+
+	_vm->_draw->spriteOperation(DRAW_PUTPIXEL);
+
 	return false;
 }
 

Modified: scummvm/trunk/engines/gob/inter_v6.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_v6.cpp	2009-09-15 10:36:50 UTC (rev 44102)
+++ scummvm/trunk/engines/gob/inter_v6.cpp	2009-09-15 12:15:22 UTC (rev 44103)
@@ -410,10 +410,11 @@
 	_vm->_game->_script->evalExpr(0);
 
 	_vm->_draw->_backColor = _vm->_game->_script->getResultInt() & 0xFFFF;
-	uint16 extraVar = _vm->_game->_script->getResultInt() >> 16;
+	
+	_vm->_draw->_pattern = _vm->_game->_script->getResultInt() >> 16;
 
-	if (extraVar != 0)
-		warning("Urban Stub: o6_fillRect(), extraVar = %d", extraVar);
+	if (_vm->_draw->_pattern != 0)
+		warning("Urban Stub: o6_fillRect(), _pattern = %d", _vm->_draw->_pattern);
 
 	if (_vm->_draw->_spriteRight < 0) {
 		_vm->_draw->_destSpriteX += _vm->_draw->_spriteRight - 1;

Modified: scummvm/trunk/engines/gob/module.mk
===================================================================
--- scummvm/trunk/engines/gob/module.mk	2009-09-15 10:36:50 UTC (rev 44102)
+++ scummvm/trunk/engines/gob/module.mk	2009-09-15 12:15:22 UTC (rev 44103)
@@ -8,6 +8,7 @@
 	draw_v2.o \
 	draw_bargon.o \
 	draw_fascin.o \
+	draw_playtoons.o \
 	driver_vga.o \
 	expression.o \
 	game.o \


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