diff options
author | johndoe123 | 2014-12-12 13:12:12 +0100 |
---|---|---|
committer | Eugene Sandulenko | 2018-07-20 06:43:33 +0000 |
commit | 9d98f92298c7e0c494b0ae6455a5f0183080db70 (patch) | |
tree | ef54e0d117025bfe315fc858e65b9460a1d31bec | |
parent | 36ec0fafdb186ad55a0d6c08e38b96ef84fa60a8 (diff) | |
download | scummvm-rg350-9d98f92298c7e0c494b0ae6455a5f0183080db70.tar.gz scummvm-rg350-9d98f92298c7e0c494b0ae6455a5f0183080db70.tar.bz2 scummvm-rg350-9d98f92298c7e0c494b0ae6455a5f0183080db70.zip |
ILLUSIONS: Add text drawing to BBDOU
-rw-r--r-- | engines/illusions/bbdou/bbdou_specialcode.cpp | 9 | ||||
-rw-r--r-- | engines/illusions/bbdou/bbdou_specialcode.h | 4 | ||||
-rw-r--r-- | engines/illusions/bbdou/illusions_bbdou.cpp | 3 | ||||
-rw-r--r-- | engines/illusions/duckman/illusions_duckman.cpp | 2 | ||||
-rw-r--r-- | engines/illusions/resources/fontresource.cpp | 6 | ||||
-rw-r--r-- | engines/illusions/resources/fontresource.h | 2 | ||||
-rw-r--r-- | engines/illusions/screen.cpp | 62 | ||||
-rw-r--r-- | engines/illusions/screen.h | 13 | ||||
-rw-r--r-- | engines/illusions/screentext.cpp | 32 | ||||
-rw-r--r-- | engines/illusions/threads/talkthread.cpp | 25 | ||||
-rw-r--r-- | engines/illusions/threads/talkthread_duckman.cpp | 2 |
11 files changed, 124 insertions, 36 deletions
diff --git a/engines/illusions/bbdou/bbdou_specialcode.cpp b/engines/illusions/bbdou/bbdou_specialcode.cpp index a7054841ac..a7dadc487c 100644 --- a/engines/illusions/bbdou/bbdou_specialcode.cpp +++ b/engines/illusions/bbdou/bbdou_specialcode.cpp @@ -50,7 +50,7 @@ static const Struct10 kStruct10s[] = { {0x1B000C, 0, 0, 0}, }; -CauseThread::CauseThread(IllusionsEngine_BBDOU *vm, uint32 threadId, uint32 callingThreadId, +CauseThread_BBDOU::CauseThread_BBDOU(IllusionsEngine_BBDOU *vm, uint32 threadId, uint32 callingThreadId, BbdouSpecialCode *bbdou, uint32 cursorObjectId, uint32 sceneId, uint32 verbId, uint32 objectId2, uint32 objectId) : Thread(vm, threadId, callingThreadId, 0), _bbdou(bbdou), _cursorObjectId(cursorObjectId), @@ -58,12 +58,12 @@ CauseThread::CauseThread(IllusionsEngine_BBDOU *vm, uint32 threadId, uint32 call _type = kTTSpecialThread; } -void CauseThread::onNotify() { +void CauseThread_BBDOU::onNotify() { _bbdou->_cursor->_data._causeThreadId1 = 0; terminate(); } -void CauseThread::onTerminated() { +void CauseThread_BBDOU::onTerminated() { _bbdou->_cursor->_data._causeThreadId1 = 0; _bbdou->_cursor->enable(_cursorObjectId); } @@ -260,7 +260,6 @@ void BbdouSpecialCode::spcRemoveInventoryItem(OpCall &opCall) { void BbdouSpecialCode::spcHasInventoryItem(OpCall &opCall) { ARG_UINT32(objectId); _vm->_stack->push(_inventory->hasInventoryItem(objectId) ? 1 : 0); -debug("_inventory->hasInventoryItem(%08X) = %d", objectId, _inventory->hasInventoryItem(objectId)); } void BbdouSpecialCode::spcCloseInventory(OpCall &opCall) { @@ -683,7 +682,7 @@ bool BbdouSpecialCode::runCause(Control *cursorControl, CursorData &cursorData, uint32 BbdouSpecialCode::startCauseThread(uint32 cursorObjectId, uint32 sceneId, uint32 verbId, uint32 objectId2, uint32 objectId) { uint32 tempThreadId = _vm->newTempThreadId(); debug(3, "Starting cause thread %08X...", tempThreadId); - CauseThread *causeThread = new CauseThread(_vm, tempThreadId, 0, this, + CauseThread_BBDOU *causeThread = new CauseThread_BBDOU(_vm, tempThreadId, 0, this, cursorObjectId, sceneId, verbId, objectId2, objectId); _vm->_threads->startThread(causeThread); causeThread->suspend(); diff --git a/engines/illusions/bbdou/bbdou_specialcode.h b/engines/illusions/bbdou/bbdou_specialcode.h index 037d4750ce..2462c2b172 100644 --- a/engines/illusions/bbdou/bbdou_specialcode.h +++ b/engines/illusions/bbdou/bbdou_specialcode.h @@ -47,9 +47,9 @@ struct Struct10 { uint32 _sequenceId3; }; -class CauseThread : public Thread { +class CauseThread_BBDOU : public Thread { public: - CauseThread(IllusionsEngine_BBDOU *vm, uint32 threadId, uint32 callingThreadId, + CauseThread_BBDOU(IllusionsEngine_BBDOU *vm, uint32 threadId, uint32 callingThreadId, BbdouSpecialCode *bbdou, uint32 cursorObjectId, uint32 sceneId, uint32 verbId, uint32 objectId2, uint32 objectId); virtual void onNotify(); diff --git a/engines/illusions/bbdou/illusions_bbdou.cpp b/engines/illusions/bbdou/illusions_bbdou.cpp index 112aa3f1d0..9aeb0808cf 100644 --- a/engines/illusions/bbdou/illusions_bbdou.cpp +++ b/engines/illusions/bbdou/illusions_bbdou.cpp @@ -216,6 +216,8 @@ Common::Error IllusionsEngine_BBDOU::run() { _updateFunctions = new UpdateFunctions(); _soundMan = new SoundMan(this); + _screen->setColorKey1(0xF81F); + initInput(); initUpdateFunctions(); @@ -286,6 +288,7 @@ bool IllusionsEngine_BBDOU::hasFeature(EngineFeature f) const { } void IllusionsEngine_BBDOU::initInput() { + // TODO Check if these are correct... _input->setInputEvent(kEventLeftClick, 0x01) .addMouseButton(MOUSE_LEFT_BUTTON) .addKey(Common::KEYCODE_RETURN); diff --git a/engines/illusions/duckman/illusions_duckman.cpp b/engines/illusions/duckman/illusions_duckman.cpp index b861d7328e..d30f17bd69 100644 --- a/engines/illusions/duckman/illusions_duckman.cpp +++ b/engines/illusions/duckman/illusions_duckman.cpp @@ -113,6 +113,8 @@ Common::Error IllusionsEngine_Duckman::run() { _dialogSys = new DuckmanDialogSystem(this); + _screen->setColorKey1(0); + initInput(); initUpdateFunctions(); diff --git a/engines/illusions/resources/fontresource.cpp b/engines/illusions/resources/fontresource.cpp index becc6cf58b..678e555686 100644 --- a/engines/illusions/resources/fontresource.cpp +++ b/engines/illusions/resources/fontresource.cpp @@ -92,7 +92,7 @@ void FontResource::load(Resource *resource) { Common::MemoryReadStream stream(data, dataSize, DisposeAfterUse::NO); _totalSize = stream.readUint32LE(); _charHeight = stream.readUint16LE(); - _field_6 = stream.readUint16LE(); + _defaultChar = stream.readUint16LE(); _colorIndex = stream.readUint16LE(); _lineIncr = stream.readUint16LE(); _widthC = stream.readUint16LE(); @@ -103,8 +103,8 @@ void FontResource::load(Resource *resource) { stream.seek(charRangesOffs + i * 8); _charRanges[i].load(data, stream); } - debug(2, "FontResource::load() _charHeight: %d; _field_6: %d; _colorIndex: %d; _lineIncr: %d; _widthC: %d; _charRangesCount: %d", - _charHeight, _field_6, _colorIndex, _lineIncr, _widthC, _charRangesCount); + debug(2, "FontResource::load() _charHeight: %d; _defaultChar: %d; _colorIndex: %d; _lineIncr: %d; _widthC: %d; _charRangesCount: %d", + _charHeight, _defaultChar, _colorIndex, _lineIncr, _widthC, _charRangesCount); } CharInfo *FontResource::getCharInfo(uint16 c) { diff --git a/engines/illusions/resources/fontresource.h b/engines/illusions/resources/fontresource.h index 8ea059fa37..579277c5f9 100644 --- a/engines/illusions/resources/fontresource.h +++ b/engines/illusions/resources/fontresource.h @@ -69,7 +69,7 @@ public: public: uint32 _totalSize; int16 _charHeight; - int16 _field_6; + int16 _defaultChar; int16 _colorIndex; int16 _lineIncr; int16 _widthC; diff --git a/engines/illusions/screen.cpp b/engines/illusions/screen.cpp index 955317bcc0..b9506f63d4 100644 --- a/engines/illusions/screen.cpp +++ b/engines/illusions/screen.cpp @@ -217,11 +217,10 @@ bool SpriteDrawQueue::calcItemRect(SpriteDrawQueueItem *item, Common::Rect &srcR // Screen Screen::Screen(IllusionsEngine *vm, int16 width, int16 height, int bpp) - : _vm(vm), _colorKey2(0) { + : _vm(vm), _colorKey1(0), _colorKey2(0) { _displayOn = true; _decompressQueue = new SpriteDecompressQueue(this); _drawQueue = new SpriteDrawQueue(this); - _colorKey1 = 0xF800 | 0x1F; if (bpp == 8) { initGraphics(width, height, false); } else { @@ -274,10 +273,6 @@ void Screen::setScreenOffset(Common::Point offsPt) { } } -uint16 Screen::getColorKey2() { - return _colorKey2; -} - void Screen::updateSprites() { _decompressQueue->decompressAll(); // NOTE Skipped doShiftBrightness and related as it seems to be unused @@ -475,11 +470,24 @@ void Screen::buildColorTransTbl() { } void Screen::drawText(FontResource *font, Graphics::Surface *surface, int16 x, int16 y, uint16 *text, uint count) { + switch (_backSurface->format.bytesPerPixel) { + case 1: + drawText8(font, surface, x, y, text, count); + break; + case 2: + drawText16(font, surface, x, y, text, count); + break; + default: + break; + } +} + +void Screen::drawText8(FontResource *font, Graphics::Surface *surface, int16 x, int16 y, uint16 *text, uint count) { for (uint i = 0; i < count; ++i) - x += font->_widthC + drawChar(font, surface, x, y, *text++); + x += font->_widthC + drawChar8(font, surface, x, y, *text++); } -int16 Screen::drawChar(FontResource *font, Graphics::Surface *surface, int16 x, int16 y, uint16 c) { +int16 Screen::drawChar8(FontResource *font, Graphics::Surface *surface, int16 x, int16 y, uint16 c) { const CharInfo *charInfo = font->getCharInfo(c); const int16 charWidth = charInfo->_width; byte *dst = (byte*)surface->getBasePtr(x, y); @@ -494,6 +502,27 @@ int16 Screen::drawChar(FontResource *font, Graphics::Surface *surface, int16 x, return charWidth; } +void Screen::drawText16(FontResource *font, Graphics::Surface *surface, int16 x, int16 y, uint16 *text, uint count) { + for (uint i = 0; i < count; ++i) + x += font->_widthC + drawChar16(font, surface, x, y, *text++); +} + +int16 Screen::drawChar16(FontResource *font, Graphics::Surface *surface, int16 x, int16 y, uint16 c) { + const CharInfo *charInfo = font->getCharInfo(c); + const int16 charWidth = charInfo->_width; + byte *pixels = charInfo->_pixels; + for (int16 yc = 0; yc < font->_charHeight; ++yc) { + byte *dst = (byte*)surface->getBasePtr(x, y + yc); + for (int16 xc = 0; xc < charWidth; ++xc) { + if (pixels[xc]) + WRITE_LE_UINT16(dst, convertFontColor(pixels[xc])); + dst += 2; + } + pixels += charWidth; + } + return charWidth; +} + void Screen::setSystemPalette(byte *palette) { g_system->getPaletteManager()->setPalette(palette, 0, 256); } @@ -843,4 +872,21 @@ void Screen::drawSurface21(Common::Rect &dstRect, Graphics::Surface *surface, Co } +uint16 Screen::convertFontColor(byte color) { + if (color) { + byte r, g, b; + if (color == 204) { + r = 50; + g = 50; + b = 180; + } else { + r = 256 - color; + g = 256 - color; + b = 256 - color; + } + return g_system->getScreenFormat().RGBToColor(r, g, b); + } + return _colorKey1; +} + } // End of namespace Illusions diff --git a/engines/illusions/screen.h b/engines/illusions/screen.h index 1eef207513..bdb7ea0258 100644 --- a/engines/illusions/screen.h +++ b/engines/illusions/screen.h @@ -122,7 +122,6 @@ public: bool isDisplayOn(); void setDisplayOn(bool isOn); void setScreenOffset(Common::Point offsPt); - uint16 getColorKey2(); void updateSprites(); void clearScreenOffsetAreas(); void decompressSprite(SpriteDecompressQueueItem *item); @@ -135,7 +134,9 @@ public: void updateFaderPalette(); void setFader(int newValue, int firstIndex, int lastIndex); void drawText(FontResource *font, Graphics::Surface *surface, int16 x, int16 y, uint16 *text, uint count); - int16 drawChar(FontResource *font, Graphics::Surface *surface, int16 x, int16 y, uint16 c); + uint16 getColorKey1() const { return _colorKey1; } + void setColorKey1(uint16 colorKey) { _colorKey1 = colorKey; } + uint16 getColorKey2() const { return _colorKey2; } int16 getScreenWidth() const { return _backSurface->w; } int16 getScreenHeight() const { return _backSurface->h; } public: @@ -161,6 +162,12 @@ public: void setSystemPalette(byte *palette); void buildColorTransTbl(); + void drawText8(FontResource *font, Graphics::Surface *surface, int16 x, int16 y, uint16 *text, uint count); + int16 drawChar8(FontResource *font, Graphics::Surface *surface, int16 x, int16 y, uint16 c); + + void drawText16(FontResource *font, Graphics::Surface *surface, int16 x, int16 y, uint16 *text, uint count); + int16 drawChar16(FontResource *font, Graphics::Surface *surface, int16 x, int16 y, uint16 c); + void decompressSprite8(SpriteDecompressQueueItem *item); void drawSurface8(Common::Rect &dstRect, Graphics::Surface *surface, Common::Rect &srcRect, int16 scale, uint32 flags); void drawSurface81(int16 destX, int16 destY, Graphics::Surface *surface, Common::Rect &srcRect); @@ -172,6 +179,8 @@ public: void drawSurface11(int16 destX, int16 destY, Graphics::Surface *surface, Common::Rect &srcRect); void drawSurface20(Common::Rect &dstRect, Graphics::Surface *surface, Common::Rect &srcRect, uint16 colorKey); void drawSurface21(Common::Rect &dstRect, Graphics::Surface *surface, Common::Rect &srcRect); + + uint16 convertFontColor(byte color); }; } // End of namespace Illusions diff --git a/engines/illusions/screentext.cpp b/engines/illusions/screentext.cpp index 018decba36..8c31705300 100644 --- a/engines/illusions/screentext.cpp +++ b/engines/illusions/screentext.cpp @@ -56,15 +56,28 @@ void ScreenText::updateTextInfoPosition(Common::Point position) { } void ScreenText::clipTextInfoPosition(Common::Point &position) { - // TODO Set min/max for BBDOU - if (position.x < 2) - position.x = 2; - else if (position.x + _dimensions._width > 318) - position.x = 318 - _dimensions._width; - if (position.y < 2) - position.y = 2; - else if (position.y + _dimensions._height > 198) - position.y = 198 - _dimensions._height; + // TODO Move values outside + if (_vm->getGameId() == kGameIdBBDOU) { + // BBDOU + if (position.x < 2) + position.x = 2; + else if (position.x + _dimensions._width > 638) + position.x = 638 - _dimensions._width; + if (position.y < 2) + position.y = 2; + else if (position.y + _dimensions._height > 478) + position.y = 478 - _dimensions._height; + } else { + // Duckman + if (position.x < 2) + position.x = 2; + else if (position.x + _dimensions._width > 318) + position.x = 318 - _dimensions._width; + if (position.y < 2) + position.y = 2; + else if (position.y + _dimensions._height > 198) + position.y = 198 - _dimensions._height; + } } bool ScreenText::refreshScreenText(FontResource *font, WidthHeight dimensions, Common::Point offsPt, @@ -72,6 +85,7 @@ bool ScreenText::refreshScreenText(FontResource *font, WidthHeight dimensions, C TextDrawer textDrawer; bool done = textDrawer.wrapText(font, text, &dimensions, offsPt, textFlags, outTextPtr); _surface = _vm->_screen->allocSurface(dimensions._width, dimensions._height); + _surface->fillRect(Common::Rect(0, 0, _surface->w, _surface->h), _vm->_screen->getColorKey1()); _dimensions = dimensions; textDrawer.drawText(_vm->_screen, _surface, color2, color1); return done; diff --git a/engines/illusions/threads/talkthread.cpp b/engines/illusions/threads/talkthread.cpp index 4fbb5a2393..7adf9e56bd 100644 --- a/engines/illusions/threads/talkthread.cpp +++ b/engines/illusions/threads/talkthread.cpp @@ -26,6 +26,7 @@ #include "illusions/dictionary.h" #include "illusions/input.h" #include "illusions/resources/talkresource.h" +#include "illusions/screentext.h" #include "illusions/sound.h" #include "illusions/time.h" @@ -159,7 +160,7 @@ int TalkThread::onUpdate() { if (!(_flags & 4) && !_vm->_soundMan->isVoicePlaying()) _flags |= 4; if (!(_flags & 8) && isTimerExpired(_textStartTime, _textEndTime)) { - // TODO _vm->removeText(); + _vm->_screenText->removeText(); if (_entryText && *_entryText) { refreshText(); _vm->_input->discardEvent(kEventSkip); @@ -180,7 +181,7 @@ int TalkThread::onUpdate() { } if (_objectId && _vm->_input->pollEvent(kEventSkip)) { if (!(_flags & 8)) { - // TODO _vm->removeText(); + _vm->_screenText->removeText(); if (_entryText && *_entryText) refreshText(); else @@ -224,7 +225,7 @@ int TalkThread::onUpdate() { _flags |= 2; } if (!(_flags & 8)) { - // TODO _vm->removeText(); + _vm->_screenText->removeText(); _flags |= 8; } if (!(_flags & 4)) { @@ -307,11 +308,10 @@ static char *debugW2I(byte *wstr) { } int TalkThread::insertText() { +/* int charCount = 100; - debug("%08X %08X [%s]", _threadId, _talkId, debugW2I(_currEntryText)); _entryText = 0; - // TODO _vm->getDimensions1(&dimensions); // TODO _vm->insertText(_currEntryText, _vm->_currFontId, dimensions, 0, 2, 0, 0, 0, 0, 0, 0, &outTextPtr); // TODO _vm->charCount = (char *)outTextPtr - (char *)text; @@ -319,6 +319,21 @@ int TalkThread::insertText() { // TODO _vm->getPoint1(&pt); // TODO _vm->updateTextInfoPosition(pt); return charCount >> 1; +*/ + debug("%08X %08X [%s]", _threadId, _talkId, debugW2I(_currEntryText)); + WidthHeight dimensions; + _vm->getDefaultTextDimensions(dimensions); + uint16 *outTextPtr; + _vm->_screenText->insertText((uint16*)_currEntryText, 0x120001, dimensions, + //Common::Point(0, 0), 2, 0, 0, _color.r, _color.g, _color.b, outTextPtr); + Common::Point(0, 0), 2, 0, 0, 0, 0, 0, outTextPtr); + _entryText = (byte*)outTextPtr; + Common::Point pt; + _vm->getDefaultTextPosition(pt); + _vm->_screenText->updateTextInfoPosition(pt); + //_vm->_screenText->updateTextInfoPosition(Common::Point(320, 200)); + int charCount = (_entryText - _currEntryText) / 2; + return charCount; } TalkEntry *TalkThread::getTalkResourceEntry(uint32 talkId) { diff --git a/engines/illusions/threads/talkthread_duckman.cpp b/engines/illusions/threads/talkthread_duckman.cpp index f47dd7d903..6d8224e990 100644 --- a/engines/illusions/threads/talkthread_duckman.cpp +++ b/engines/illusions/threads/talkthread_duckman.cpp @@ -289,7 +289,7 @@ int TalkThread_Duckman::insertText() { _vm->getDefaultTextDimensions(dimensions); uint16 *outTextPtr; _vm->_screenText->insertText((uint16*)_currEntryText, 0x120001, dimensions, - Common::Point(0, 0), 2, 0, 0, _color.r, _color.r, _color.r, outTextPtr); + Common::Point(0, 0), 2, 0, 0, _color.r, _color.g, _color.b, outTextPtr); _entryText = (byte*)outTextPtr; Common::Point pt; _vm->getDefaultTextPosition(pt); |