diff options
author | Arnaud Boutonné | 2009-09-29 22:43:30 +0000 |
---|---|---|
committer | Arnaud Boutonné | 2009-09-29 22:43:30 +0000 |
commit | ff70b554eace73fafb0165fb0dc16da91f377ce4 (patch) | |
tree | 0bbbb0bc899e7b5f07433f681c556690faf94769 /engines/gob/draw_fascin.cpp | |
parent | c85736913140a8c65aed7060a4ae2cc4a64bee70 (diff) | |
download | scummvm-rg350-ff70b554eace73fafb0165fb0dc16da91f377ce4.tar.gz scummvm-rg350-ff70b554eace73fafb0165fb0dc16da91f377ce4.tar.bz2 scummvm-rg350-ff70b554eace73fafb0165fb0dc16da91f377ce4.zip |
Playtoons - implement some functions related to hotspot texts
Fascination - initial version of several 'Fascination Window' functions, proper naming of most of fascination OPCODEDRAW and OPCODEGOB functions
svn-id: r44472
Diffstat (limited to 'engines/gob/draw_fascin.cpp')
-rw-r--r-- | engines/gob/draw_fascin.cpp | 227 |
1 files changed, 218 insertions, 9 deletions
diff --git a/engines/gob/draw_fascin.cpp b/engines/gob/draw_fascin.cpp index 58bf486bc1..6a44cdc7f0 100644 --- a/engines/gob/draw_fascin.cpp +++ b/engines/gob/draw_fascin.cpp @@ -23,22 +23,231 @@ * */ -#include "gob/gob.h" +//#include "common/endian.h" +//#include "graphics/cursorman.h" + #include "gob/draw.h" -#include "gob/global.h" -#include "gob/video.h" +#include "gob/game.h" +#include "gob/resources.h" namespace Gob { -Draw_Fascin::Draw_Fascin(GobEngine *vm) : Draw_v2(vm) { +Draw_Fascination::Draw_Fascination(GobEngine *vm) : Draw_v1(vm) { } -void Draw_Fascin::initScreen(void) { - _vm->_global->_videoMode = 0x14; - _vm->_video->_surfWidth = 640; - _vm->_video->initPrimary(_vm->_global->_videoMode); +void Draw_Fascination::spriteOperation(int16 operation) { + int16 len; + int16 x, y; + int16 perLine; + Resource *resource; + + operation &= 0x0F; + + if (_sourceSurface >= 100) + _sourceSurface -= 80; + if (_destSurface >= 100) + _destSurface -= 80; + + if (_renderFlags & RENDERFLAG_USEDELTAS) { + if (_sourceSurface == 21) { + _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; + } + } + } + + if (_renderFlags & 0x20) { + if (_destSurface == 21 || (operation == 0 && _sourceSurface == 21)) { + winDraw(operation); + return; + } + } + + Font *font = 0; + switch (operation) { + case DRAW_BLITSURF: + _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: + _vm->_video->putPixel(_destSpriteX, _destSpriteY, + _frontColor, *_spritesArray[_destSurface]); + + dirtiedRect(_destSurface, _destSpriteX, _destSpriteY, _destSpriteX, _destSpriteY); + break; + + case DRAW_FILLRECT: + _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; + + case DRAW_DRAWLINE: + _vm->_video->drawLine(*_spritesArray[_destSurface], + _destSpriteX, _destSpriteY, + _spriteRight, _spriteBottom, _frontColor); + + dirtiedRect(_destSurface, _destSpriteX, _destSpriteY, _spriteRight, _spriteBottom); + break; + + case DRAW_INVALIDATE: + 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: + font = _fonts[_fontIndex]; + if (!font) { + warning("Trying to print \"%s\" with undefined font %d", _textToPrint, _fontIndex); + break; + } + + len = strlen(_textToPrint); + dirtiedRect(_destSurface, _destSpriteX, _destSpriteY, + _destSpriteX + len * font->getCharWidth() - 1, + _destSpriteY + font->getCharHeight() - 1); + + for (int i = 0; i < len; i++) { + _vm->_video->drawLetter(_textToPrint[i], + _destSpriteX, _destSpriteY, + *font, _transparency, + _frontColor, _backColor, + *_spritesArray[_destSurface]); + + _destSpriteX += font->getCharWidth(); + } + break; + + case DRAW_DRAWBAR: + _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) { + _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; + + case DRAW_DRAWLETTER: + font = _fonts[_fontIndex]; + if (!font) { + warning("Trying to print \'%c\' with undefined font %d", _letterToPrint, _fontIndex); + break; + } + + if (_fontToSprite[_fontIndex].sprite == -1) { + dirtiedRect(_destSurface, _destSpriteX, _destSpriteY, + _destSpriteX + font->getCharWidth() - 1, + _destSpriteY + font->getCharHeight() - 1); + _vm->_video->drawLetter(_letterToPrint, + _destSpriteX, _destSpriteY, + *font, _transparency, + _frontColor, _backColor, + *_spritesArray[_destSurface]); + break; + } + + perLine = + _spritesArray[(int16)_fontToSprite[_fontIndex].sprite]->getWidth() / + _fontToSprite[_fontIndex].width; + + y = (_letterToPrint - _fontToSprite[_fontIndex].base) / perLine * + _fontToSprite[_fontIndex].height; + + x = (_letterToPrint - _fontToSprite[_fontIndex].base) % perLine * + _fontToSprite[_fontIndex].width; + + dirtiedRect(_destSurface, _destSpriteX, _destSpriteY, + _destSpriteX + _fontToSprite[_fontIndex].width, + _destSpriteY + _fontToSprite[_fontIndex].height); + + _vm->_video->drawSprite(*_spritesArray[(int16)_fontToSprite[_fontIndex].sprite], + *_spritesArray[_destSurface], x, y, + x + _fontToSprite[_fontIndex].width, + y + _fontToSprite[_fontIndex].height, + _destSpriteX, _destSpriteY, _transparency); + + break; + } + + if (_renderFlags & RENDERFLAG_USEDELTAS) { + if (_sourceSurface == 21) { + _spriteLeft -= _backDeltaX; + _spriteTop -= _backDeltaY; + } - Draw_v2::initScreen(); + if (_destSurface == 21) { + _destSpriteX -= _backDeltaX; + _destSpriteY -= _backDeltaY; + } + } } } // End of namespace Gob |