diff options
Diffstat (limited to 'engines')
-rw-r--r-- | engines/kyra/scene_v3.cpp | 2 | ||||
-rw-r--r-- | engines/kyra/screen.cpp | 21 | ||||
-rw-r--r-- | engines/kyra/screen.h | 3 |
3 files changed, 20 insertions, 6 deletions
diff --git a/engines/kyra/scene_v3.cpp b/engines/kyra/scene_v3.cpp index 822bf3c8cd..54fb02b4d1 100644 --- a/engines/kyra/scene_v3.cpp +++ b/engines/kyra/scene_v3.cpp @@ -358,7 +358,7 @@ void KyraEngine_v3::loadSceneMsc() { _maskPageMinY = minY; _maskPageMaxY = minY + height - 1; - _screen->setShapePages(3, 5); + _screen->setShapePages(5, 3, _maskPageMinY, _maskPageMaxY); musicUpdate(0); _screen->loadBitmap(filename, 5, 5, 0, true); diff --git a/engines/kyra/screen.cpp b/engines/kyra/screen.cpp index 9f0c58e4a6..a460a73456 100644 --- a/engines/kyra/screen.cpp +++ b/engines/kyra/screen.cpp @@ -1111,7 +1111,7 @@ void Screen::drawShape(uint8 pageNum, const uint8 *shapeData, int x, int y, int _dsTable = va_arg(args, uint8*); _dsTableLoopCount = va_arg(args, int); if (!_dsTableLoopCount) - flags &= 0xFFFFFEFF; + flags &= ~0x100; } if (flags & 0x1000) { @@ -1205,6 +1205,9 @@ void Screen::drawShape(uint8 pageNum, const uint8 *shapeData, int x, int y, int int ppc = (flags >> 8) & 0x3F; _dsPlot = dsPlotFunc[ppc]; + DsPlotFunc dsPlot2 = dsPlotFunc[ppc], dsPlot3 = dsPlotFunc[ppc]; + if (flags & 0x800) + dsPlot3 = dsPlotFunc[((flags >> 8) & 0xF7) & 0x3F]; if (!_dsPlot) { warning("Missing drawShape plotting method type %d", ppc); @@ -1212,6 +1215,7 @@ void Screen::drawShape(uint8 pageNum, const uint8 *shapeData, int x, int y, int return; } + int curY = y; const uint8 *src = shapeData; uint8 *dst = _dsDstPage = getPagePtr(pageNum); @@ -1257,7 +1261,7 @@ void Screen::drawShape(uint8 pageNum, const uint8 *shapeData, int x, int y, int uint16 frameSize = READ_LE_UINT16(src); src += 2; - int colorTableColors = ((_vm->gameFlags().gameID != GI_KYRA2) && (shapeFlags & 4)) ? *src++ : 16; + int colorTableColors = ((_vm->gameFlags().gameID != GI_KYRA1) && (shapeFlags & 4)) ? *src++ : 16; if (!(flags & 0x8000) && (shapeFlags & 1)) _dsTable2 = src; @@ -1370,6 +1374,12 @@ void Screen::drawShape(uint8 pageNum, const uint8 *shapeData, int x, int y, int uint8 *d = dst; while (shapeHeight--) { + ++curY; + + bool normalPlot = true; + if (flags & 0x800) + normalPlot = (curY > _maskMinY && curY < _maskMaxY); + while (!(scaleCounterV & 0xff00)) { scaleCounterV += _dsScaleH; if (!(scaleCounterV & 0xff00)) { @@ -1389,6 +1399,7 @@ void Screen::drawShape(uint8 pageNum, const uint8 *shapeData, int x, int y, int if (_dsTmpWidth) { cnt += shpWidthScaled1; if (cnt > 0) { + _dsPlot = normalPlot ? dsPlot2 : dsPlot3; (this->*_dsProcessLine)(d, s, cnt, scaleState); } cnt += _dsOffscreenRight; @@ -2360,10 +2371,12 @@ bool Screen::isMouseVisible() const { return _mouseLockCount == 0; } -void Screen::setShapePages(int page1, int page2) { - debugC(9, kDebugLevelScreen, "Screen::setShapePages(%d, %d)", page1, page2); +void Screen::setShapePages(int page1, int page2, int minY, int maxY) { + debugC(9, kDebugLevelScreen, "Screen::setShapePages(%d, %d)", page1, page2, minY, maxY); _shapePages[0] = _pagePtrs[page1]; _shapePages[1] = _pagePtrs[page2]; + _maskMinY = minY; + _maskMaxY = maxY; } void Screen::setMouseCursor(int x, int y, byte *shape) { diff --git a/engines/kyra/screen.h b/engines/kyra/screen.h index a0403e6c68..4ae66fbb64 100644 --- a/engines/kyra/screen.h +++ b/engines/kyra/screen.h @@ -200,7 +200,7 @@ public: void setAnimBlockPtr(int size); - void setShapePages(int page1, int page2); + void setShapePages(int page1, int page2, int minY = -1, int maxY = 321); byte getShapeFlag1(int x, int y); byte getShapeFlag2(int x, int y); @@ -216,6 +216,7 @@ public: int _curPage; uint8 *_currentPalette; uint8 *_shapePages[2]; + int _maskMinY, _maskMaxY; FontId _currentFont; bool _disableScreen; |