From 6a9cc3b1e0675768d15ab43da5468eabd20c3179 Mon Sep 17 00:00:00 2001 From: Arnaud BoutonnĂ© Date: Tue, 15 Sep 2009 12:15:22 +0000 Subject: - Implement _pattern variable - Add oPlaytoons_putPixel and Playtoons specific spriteOperation (using _pattern) svn-id: r44103 --- dists/msvc8/gob.vcproj | 1 + dists/msvc9/gob.vcproj | 2 + engines/gob/draw.cpp | 2 + engines/gob/draw.h | 9 + engines/gob/draw_playtoons.cpp | 407 ++++++++++++++++++++++++++++++++++++++++ engines/gob/draw_v2.cpp | 3 +- engines/gob/gob.cpp | 2 +- engines/gob/hotspots.cpp | 70 ++++++- engines/gob/hotspots.h | 7 +- engines/gob/inter.h | 1 + engines/gob/inter_playtoons.cpp | 32 ++-- engines/gob/inter_v6.cpp | 7 +- engines/gob/module.mk | 1 + 13 files changed, 516 insertions(+), 28 deletions(-) create mode 100644 engines/gob/draw_playtoons.cpp diff --git a/dists/msvc8/gob.vcproj b/dists/msvc8/gob.vcproj index 85f5e4bb86..cd96cadbd0 100644 --- a/dists/msvc8/gob.vcproj +++ b/dists/msvc8/gob.vcproj @@ -71,6 +71,7 @@ + diff --git a/dists/msvc9/gob.vcproj b/dists/msvc9/gob.vcproj index 70932ee04d..833441ef5c 100644 --- a/dists/msvc9/gob.vcproj +++ b/dists/msvc9/gob.vcproj @@ -41,6 +41,7 @@ + @@ -72,6 +73,7 @@ + diff --git a/engines/gob/draw.cpp b/engines/gob/draw.cpp index 46f75f67aa..38d82e0825 100644 --- a/engines/gob/draw.cpp +++ b/engines/gob/draw.cpp @@ -126,6 +126,8 @@ Draw::Draw(GobEngine *vm) : _vm(vm) { _needAdjust = 2; _scrollOffsetX = 0; _scrollOffsetY = 0; + + _pattern = 0; } Draw::~Draw() { diff --git a/engines/gob/draw.h b/engines/gob/draw.h index c23501d62a..ef8149d514 100644 --- a/engines/gob/draw.h +++ b/engines/gob/draw.h @@ -138,6 +138,8 @@ public: int16 _scrollOffsetY; int16 _scrollOffsetX; + int16 _pattern; + void invalidateRect(int16 left, int16 top, int16 right, int16 bottom); void blitInvalidated(); void setPalette(); @@ -228,6 +230,13 @@ public: 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 diff --git a/engines/gob/draw_playtoons.cpp b/engines/gob/draw_playtoons.cpp new file mode 100644 index 0000000000..9f2747d4e7 --- /dev/null +++ b/engines/gob/draw_playtoons.cpp @@ -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 diff --git a/engines/gob/draw_v2.cpp b/engines/gob/draw_v2.cpp index 486b12b022..d83e90a414 100644 --- a/engines/gob/draw_v2.cpp +++ b/engines/gob/draw_v2.cpp @@ -217,6 +217,7 @@ void Draw_v2::printTotText(int16 id) { size = textItem->getSize(); dataPtr = textItem->getData(); ptr = dataPtr; + _pattern = 0; bool isSubtitle = (ptr[1] & 0x80) != 0; @@ -919,4 +920,4 @@ void Draw_v2::spriteOperation(int16 operation) { } } -} // End of namespace Gob +} // End of namespace Gob \ No newline at end of file diff --git a/engines/gob/gob.cpp b/engines/gob/gob.cpp index 987ea693ca..774b25dc48 100644 --- a/engines/gob/gob.cpp +++ b/engines/gob/gob.cpp @@ -463,7 +463,7 @@ bool GobEngine::initGameParts() { _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); diff --git a/engines/gob/hotspots.cpp b/engines/gob/hotspots.cpp index 20445afcd0..b9f5e4b2ca 100644 --- a/engines/gob/hotspots.cpp +++ b/engines/gob/hotspots.cpp @@ -1565,14 +1565,60 @@ int16 Hotspots::findCursor(uint16 x, uint16 y) const { 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::updateAllTexts(const InputDesc *inputs) const { } } +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 diff --git a/engines/gob/hotspots.h b/engines/gob/hotspots.h index 707a912ed5..29f4d40b7b 100644 --- a/engines/gob/hotspots.h +++ b/engines/gob/hotspots.h @@ -101,8 +101,9 @@ public: /** 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 { @@ -268,6 +269,8 @@ private: /** 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 diff --git a/engines/gob/inter.h b/engines/gob/inter.h index fbeca765e2..772dd9c46d 100644 --- a/engines/gob/inter.h +++ b/engines/gob/inter.h @@ -559,6 +559,7 @@ protected: bool oPlaytoons_printText(OpFuncParams ¶ms); bool oPlaytoons_F_1B(OpFuncParams ¶ms); + bool oPlaytoons_putPixel(OpFuncParams ¶ms); bool oPlaytoons_freeSprite(OpFuncParams ¶ms); bool oPlaytoons_checkData(OpFuncParams ¶ms); bool oPlaytoons_readData(OpFuncParams ¶ms); diff --git a/engines/gob/inter_playtoons.cpp b/engines/gob/inter_playtoons.cpp index 156ba285fb..a5747d9574 100644 --- a/engines/gob/inter_playtoons.cpp +++ b/engines/gob/inter_playtoons.cpp @@ -87,6 +87,7 @@ void Inter_Playtoons::setupOpcodesFunc() { 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_printText(OpFuncParams ¶ms) { } bool Inter_Playtoons::oPlaytoons_F_1B(OpFuncParams ¶ms) { - 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 ¶ms) { + _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); + + //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); - 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); return false; } diff --git a/engines/gob/inter_v6.cpp b/engines/gob/inter_v6.cpp index bfa45258fa..c75b3cae9d 100644 --- a/engines/gob/inter_v6.cpp +++ b/engines/gob/inter_v6.cpp @@ -410,10 +410,11 @@ bool Inter_v6::o6_fillRect(OpFuncParams ¶ms) { _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; diff --git a/engines/gob/module.mk b/engines/gob/module.mk index 5b26cb97d4..e9bf353305 100644 --- a/engines/gob/module.mk +++ b/engines/gob/module.mk @@ -8,6 +8,7 @@ MODULE_OBJS := \ draw_v2.o \ draw_bargon.o \ draw_fascin.o \ + draw_playtoons.o \ driver_vga.o \ expression.o \ game.o \ -- cgit v1.2.3