aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregory Montoir2008-12-07 14:22:05 +0000
committerGregory Montoir2008-12-07 14:22:05 +0000
commitc3fa73a0101df27c2d118d0494b42483461476dc (patch)
treed04917a724c42c91b1dbfe2d3dda542ca283bd48
parent62d2955d9b6457f007f203424bbdd43ddcec8aff (diff)
downloadscummvm-rg350-c3fa73a0101df27c2d118d0494b42483461476dc.tar.gz
scummvm-rg350-c3fa73a0101df27c2d118d0494b42483461476dc.tar.bz2
scummvm-rg350-c3fa73a0101df27c2d118d0494b42483461476dc.zip
added dirty screen rects redraw
svn-id: r35274
-rw-r--r--engines/tucker/locations.cpp60
-rw-r--r--engines/tucker/resource.cpp1
-rw-r--r--engines/tucker/sequences.cpp44
-rw-r--r--engines/tucker/tucker.cpp126
-rw-r--r--engines/tucker/tucker.h23
5 files changed, 168 insertions, 86 deletions
diff --git a/engines/tucker/locations.cpp b/engines/tucker/locations.cpp
index 988f0da9a3..b0bd3f1f48 100644
--- a/engines/tucker/locations.cpp
+++ b/engines/tucker/locations.cpp
@@ -94,6 +94,7 @@ void TuckerEngine::execData3PreUpdate_locationNum1Helper2() {
yPos = 0;
}
_locationBackgroundGfxBuf[yPos * 640 + xPos] = 100;
+ addDirtyRect(xPos, yPos, 1, 1);
}
}
@@ -194,6 +195,7 @@ void TuckerEngine::execData3PreUpdate_locationNum2() {
for (int j = 0; j < 2; ++j) {
const int offset = (_updateLocationYPosTable2[i] + j) * 640 + _updateLocationXPosTable2[i];
_locationBackgroundGfxBuf[offset] = 142 + j * 2;
+ addDirtyRect(offset % 640, offset / 640, 1, 1);
}
_updateLocationYPosTable2[i] += 2;
if (_updateLocationYPosTable2[i] > _updateLocationYMaxTable[i]) {
@@ -538,40 +540,42 @@ void TuckerEngine::execData3PreUpdate_locationNum6Helper1() {
x2 = 15 - _flagsTable[27];
}
for (int i = 0; i < x1; ++i) {
- execData3PreUpdate_locationNum6Helper2(_locationBackgroundGfxBuf + 13125 + i * 8, _data3GfxBuf + _dataTable[238].sourceOffset);
- execData3PreUpdate_locationNum6Helper2(_locationBackgroundGfxBuf + 13245 - i * 8, _data3GfxBuf + _dataTable[238].sourceOffset);
+ execData3PreUpdate_locationNum6Helper2(13125 + i * 8, _data3GfxBuf + _dataTable[238].sourceOffset);
+ execData3PreUpdate_locationNum6Helper2(13245 - i * 8, _data3GfxBuf + _dataTable[238].sourceOffset);
}
for (int i = 0; i < x2; ++i) {
- execData3PreUpdate_locationNum6Helper3(_locationBackgroundGfxBuf + 13125 + x1 * 8 + i * 4, _data3GfxBuf + _dataTable[238].sourceOffset);
- execData3PreUpdate_locationNum6Helper3(_locationBackgroundGfxBuf + 13249 - x1 * 8 - i * 4, _data3GfxBuf + _dataTable[238].sourceOffset);
+ execData3PreUpdate_locationNum6Helper3(13125 + x1 * 8 + i * 4, _data3GfxBuf + _dataTable[238].sourceOffset);
+ execData3PreUpdate_locationNum6Helper3(13249 - x1 * 8 - i * 4, _data3GfxBuf + _dataTable[238].sourceOffset);
}
}
-void TuckerEngine::execData3PreUpdate_locationNum6Helper2(uint8 *dst, const uint8 *src) {
+void TuckerEngine::execData3PreUpdate_locationNum6Helper2(int dstOffset, const uint8 *src) {
for (int j = 0; j < 46; ++j) {
- memcpy(dst + j * 640, src + j * 8, 8);
+ memcpy(_locationBackgroundGfxBuf + dstOffset + j * 640, src + j * 8, 8);
}
for (int j = 46; j < 51; ++j) {
for (int i = 0; i < 8; ++i) {
- const int offset = j * 640 + i;
- uint8 color = dst[offset];
+ const int offset = dstOffset + j * 640 + i;
+ uint8 color = _locationBackgroundGfxBuf[offset];
if (color < 224) {
- dst[offset] = src[j * 8 + i];
+ _locationBackgroundGfxBuf[offset] = src[j * 8 + i];
}
}
}
+ addDirtyRect(dstOffset % 640, dstOffset / 640, 8, 51);
}
-void TuckerEngine::execData3PreUpdate_locationNum6Helper3(uint8 *dst, const uint8 *src) {
+void TuckerEngine::execData3PreUpdate_locationNum6Helper3(int dstOffset, const uint8 *src) {
for (int j = 0; j < 51; ++j) {
for (int i = 0; i < 4; ++i) {
- const int offset = j * 640 + i;
- uint8 color = dst[offset];
+ const int offset = dstOffset + j * 640 + i;
+ uint8 color = _locationBackgroundGfxBuf[offset];
if (color < 224) {
- dst[offset] = src[j * 8 + i * 2];
+ _locationBackgroundGfxBuf[offset] = src[j * 8 + i * 2];
}
}
}
+ addDirtyRect(dstOffset % 640, dstOffset / 640, 4, 51);
}
void TuckerEngine::updateSprite_locationNum7_0(int i) {
@@ -645,16 +649,17 @@ void TuckerEngine::execData3PostUpdate_locationNum8() {
}
if (_updateLocationYPosTable2[0] > 0) {
const int offset = _updateLocationYPosTable2[0] * 640 + _updateLocationXPosTable2[0];
- _locationBackgroundGfxBuf[offset] = 142;
- _locationBackgroundGfxBuf[offset + 0x27F] = 143;
- _locationBackgroundGfxBuf[offset + 0x280] = 143;
- _locationBackgroundGfxBuf[offset + 0x281] = 144;
- _locationBackgroundGfxBuf[offset + 0x4FF] = 144;
- _locationBackgroundGfxBuf[offset + 0x500] = 144;
- _locationBackgroundGfxBuf[offset + 0x501] = 145;
- _locationBackgroundGfxBuf[offset + 0x77F] = 147;
- _locationBackgroundGfxBuf[offset + 0x780] = 143;
- _locationBackgroundGfxBuf[offset + 0x781] = 147;
+ _locationBackgroundGfxBuf[offset] = 142;
+ _locationBackgroundGfxBuf[offset + 640 - 1] = 143;
+ _locationBackgroundGfxBuf[offset + 640] = 143;
+ _locationBackgroundGfxBuf[offset + 640 + 1] = 144;
+ _locationBackgroundGfxBuf[offset + 640 * 2 - 1] = 144;
+ _locationBackgroundGfxBuf[offset + 640 * 2] = 144;
+ _locationBackgroundGfxBuf[offset + 640 * 2 + 1] = 145;
+ _locationBackgroundGfxBuf[offset + 640 * 3 - 1] = 147;
+ _locationBackgroundGfxBuf[offset + 640 * 3] = 143;
+ _locationBackgroundGfxBuf[offset + 640 * 3 + 1] = 147;
+ addDirtyRect(_updateLocationXPosTable2[0] - 1, _updateLocationYPosTable2[0], 3, 4);
_updateLocationYPosTable2[0] += 2;
if (_updateLocationYPosTable2[0] > 120) {
_updateLocationYPosTable2[0] = 0;
@@ -1005,6 +1010,7 @@ void TuckerEngine::execData3PreUpdate_locationNum14() {
const int h = _dataTable[num].ySize;
const int dstOffset = (_updateLocationYPosTable2[i] / 16 - h / 2) * 640 + (_updateLocationXPosTable2[i] - w / 2);
Graphics::decodeRLE_248(_locationBackgroundGfxBuf + dstOffset, _data3GfxBuf + _dataTable[num].sourceOffset, w, h, 0, 0, false);
+ addDirtyRect(dstOffset % 640, dstOffset / 640, w, h);
}
}
}
@@ -3020,16 +3026,16 @@ void TuckerEngine::execData3PreUpdate_locationNum70() {
setCursorType(2);
int pos = getPositionForLine(22, _infoBarBuf);
int offset = (_flagsTable[143] == 0) ? 57688 : 46168;
- drawStringAlt(_locationBackgroundGfxBuf + offset, color, &_infoBarBuf[pos]);
+ drawStringAlt(offset, color, &_infoBarBuf[pos]);
Graphics::drawStringChar(_locationBackgroundGfxBuf + offset + 5760, 62, 640, color, _charsetGfxBuf);
if (_flagsTable[143] != 0) {
pos = getPositionForLine(_flagsTable[143] * 2 + 23, _infoBarBuf);
- drawStringAlt(_locationBackgroundGfxBuf + offset + 11520, color, &_infoBarBuf[pos]);
+ drawStringAlt(offset + 11520, color, &_infoBarBuf[pos]);
pos = getPositionForLine(_flagsTable[143] * 2 + 24, _infoBarBuf);
- drawStringAlt(_locationBackgroundGfxBuf + offset + 17280, color, &_infoBarBuf[pos]);
+ drawStringAlt(offset + 17280, color, &_infoBarBuf[pos]);
}
execData3PreUpdate_locationNum70Helper();
- drawStringAlt(_locationBackgroundGfxBuf + offset + 5768, color, _updateLocation70String, _updateLocation70StringLen);
+ drawStringAlt(offset + 5768, color, _updateLocation70String, _updateLocation70StringLen);
}
void TuckerEngine::execData3PreUpdate_locationNum70Helper() {
diff --git a/engines/tucker/resource.cpp b/engines/tucker/resource.cpp
index 74e5f6d286..f816ee3d2c 100644
--- a/engines/tucker/resource.cpp
+++ b/engines/tucker/resource.cpp
@@ -445,6 +445,7 @@ void TuckerEngine::loadLoc() {
copyLocBitmap(0, 0);
Graphics::copyFrom640(_locationBackgroundGfxBuf + 320, _quadBackgroundGfxBuf + 134400, 320, 140);
}
+ _fullRedrawCounter = 2;
}
void TuckerEngine::loadObj() {
diff --git a/engines/tucker/sequences.cpp b/engines/tucker/sequences.cpp
index 0ef0bab018..67a0d82775 100644
--- a/engines/tucker/sequences.cpp
+++ b/engines/tucker/sequences.cpp
@@ -86,12 +86,12 @@ void TuckerEngine::handleCreditsSequence() {
Graphics::copyTo640(_locationBackgroundGfxBuf, _quadBackgroundGfxBuf, 320, 320, 200);
} else {
Graphics::copyTo640(_locationBackgroundGfxBuf, imgBuf + imgNum * 64000, 320, 320, 200);
- drawString2(5, 48, counter2 * 6);
- drawString2(5, 60, counter2 * 6 + 1);
- drawString2(5, 80, counter2 * 6 + 2);
- drawString2(5, 92, counter2 * 6 + 3);
- drawString2(5, 140, counter2 * 6 + 4);
- drawString2(5, 116, counter2 * 6 + 5);
+ drawCreditsString(5, 48, counter2 * 6);
+ drawCreditsString(5, 60, counter2 * 6 + 1);
+ drawCreditsString(5, 80, counter2 * 6 + 2);
+ drawCreditsString(5, 92, counter2 * 6 + 3);
+ drawCreditsString(5, 140, counter2 * 6 + 4);
+ drawCreditsString(5, 116, counter2 * 6 + 5);
++counter1;
if (counter1 < 20) {
fadePaletteColor(191, kFadePaletteStep);
@@ -106,6 +106,7 @@ void TuckerEngine::handleCreditsSequence() {
counter2 = 0;
}
}
+ _fullRedrawCounter = 2;
++counter3;
if (counter3 == 2) {
counter3 = 0;
@@ -114,7 +115,7 @@ void TuckerEngine::handleCreditsSequence() {
for (int i = 0; i < _spritesCount; ++i) {
drawSprite(i);
}
- copyToVGA(_locationBackgroundGfxBuf);
+ redrawScreen(0);
waitForTimer(3);
_timerCounter1 = 0;
counter4 = _timerCounter2 / 3;
@@ -163,7 +164,7 @@ void TuckerEngine::handleCreditsSequence() {
fadeInPalette();
--_fadePaletteCounter;
}
- copyToVGA(_locationBackgroundGfxBuf);
+ redrawScreen(0);
waitForTimer(2);
} while (_fadePaletteCounter > 0);
}
@@ -175,7 +176,8 @@ void TuckerEngine::handleCongratulationsSequence() {
strcpy(_fileToLoad, "congrat.pcx");
loadImage(_loadTempBuf, 1);
Graphics::copyTo640(_locationBackgroundGfxBuf, _loadTempBuf, 320, 320, 200);
- copyToVGA(_locationBackgroundGfxBuf);
+ _fullRedrawCounter = 2;
+ redrawScreen(0);
while (!_quitGame && _timerCounter2 < 450) {
while (_fadePaletteCounter < 14) {
++_fadePaletteCounter;
@@ -242,9 +244,10 @@ void TuckerEngine::handleNewPartSequence() {
++_fadePaletteCounter;
}
Graphics::copyTo640(_locationBackgroundGfxBuf, _quadBackgroundGfxBuf, 320, 320, 200);
+ _fullRedrawCounter = 2;
updateSprites();
drawSprite(0);
- copyToVGA(_locationBackgroundGfxBuf);
+ redrawScreen(0);
waitForTimer(3);
if (_inputKeys[kInputKeyEscape]) {
_inputKeys[kInputKeyEscape] = false;
@@ -258,9 +261,10 @@ void TuckerEngine::handleNewPartSequence() {
--_fadePaletteCounter;
}
Graphics::copyTo640(_locationBackgroundGfxBuf, _quadBackgroundGfxBuf, 320, 320, 200);
+ _fullRedrawCounter = 2;
updateSprites();
drawSprite(0);
- copyToVGA(_locationBackgroundGfxBuf);
+ redrawScreen(0);
waitForTimer(3);
} while (_fadePaletteCounter > 0);
_locationNum = currentLocation;
@@ -291,7 +295,8 @@ void TuckerEngine::handleMeanwhileSequence() {
++_fadePaletteCounter;
}
Graphics::copyTo640(_locationBackgroundGfxBuf, _quadBackgroundGfxBuf + 89600, 320, 320, 200);
- copyToVGA(_locationBackgroundGfxBuf);
+ _fullRedrawCounter = 2;
+ redrawScreen(0);
waitForTimer(3);
++i;
}
@@ -301,7 +306,8 @@ void TuckerEngine::handleMeanwhileSequence() {
--_fadePaletteCounter;
}
Graphics::copyTo640(_locationBackgroundGfxBuf, _quadBackgroundGfxBuf + 89600, 320, 320, 200);
- copyToVGA(_locationBackgroundGfxBuf);
+ _fullRedrawCounter = 2;
+ redrawScreen(0);
waitForTimer(3);
} while (_fadePaletteCounter > 0);
memcpy(_currentPalette, backupPalette, 256 * 3);
@@ -334,6 +340,7 @@ void TuckerEngine::handleMapSequence() {
waitForTimer(2);
updateMouseState();
Graphics::copyTo640(_locationBackgroundGfxBuf + _scrollOffset, _quadBackgroundGfxBuf + 89600, 320, 320, 200);
+ _fullRedrawCounter = 2;
if (_flagsTable[7] > 0 && _mousePosX > 30 && _mousePosX < 86 && _mousePosY > 36 && _mousePosY < 86) {
textNum = 13;
_nextLocationNum = (_partNum == 1) ? 3 : 65;
@@ -385,7 +392,7 @@ void TuckerEngine::handleMapSequence() {
if (textNum > 0) {
drawSpeechText(_scrollOffset + _mousePosX + 8, _mousePosY - 10, _infoBarBuf, textNum, 96);
}
- copyToVGA(_locationBackgroundGfxBuf + _scrollOffset);
+ redrawScreen(_scrollOffset);
if (_fadePaletteCounter < 14) {
fadeOutPalette();
++_fadePaletteCounter;
@@ -396,7 +403,7 @@ void TuckerEngine::handleMapSequence() {
}
while (_fadePaletteCounter > 0) {
fadeInPalette();
- copyToVGA(_locationBackgroundGfxBuf + _scrollOffset);
+ redrawScreen(_scrollOffset);
--_fadePaletteCounter;
}
_mouseClick = 1;
@@ -444,7 +451,7 @@ int TuckerEngine::handleSpecialObjectSelectionSequence() {
}
while (_fadePaletteCounter > 0) {
fadeInPalette();
- copyToVGA(_locationBackgroundGfxBuf + _scrollOffset);
+ redrawScreen(_scrollOffset);
--_fadePaletteCounter;
}
_mouseClick = 1;
@@ -454,6 +461,7 @@ int TuckerEngine::handleSpecialObjectSelectionSequence() {
waitForTimer(2);
updateMouseState();
Graphics::copyTo640(_locationBackgroundGfxBuf + _scrollOffset, _quadBackgroundGfxBuf, 320, 320, 200);
+ _fullRedrawCounter = 2;
if (_fadePaletteCounter < 14) {
fadeOutPalette();
++_fadePaletteCounter;
@@ -470,11 +478,11 @@ int TuckerEngine::handleSpecialObjectSelectionSequence() {
}
}
}
- copyToVGA(_locationBackgroundGfxBuf + _scrollOffset);
+ redrawScreen(_scrollOffset);
if (_leftMouseButtonPressed && _mouseClick != 1) {
while (_fadePaletteCounter > 0) {
fadeInPalette();
- copyToVGA(_locationBackgroundGfxBuf + _scrollOffset);
+ redrawScreen(_scrollOffset);
--_fadePaletteCounter;
}
_mouseClick = 1;
diff --git a/engines/tucker/tucker.cpp b/engines/tucker/tucker.cpp
index 097ffdf158..5c65d83d1a 100644
--- a/engines/tucker/tucker.cpp
+++ b/engines/tucker/tucker.cpp
@@ -303,6 +303,8 @@ void TuckerEngine::restart() {
_currentGfxBackground = 0;
_fadePaletteCounter = 0;
memset(&_currentPalette, 0, sizeof(_currentPalette));
+ _fullRedrawCounter = 0;
+ _dirtyRectsPrevCount = _dirtyRectsCount = 0;
_updateLocationFadePaletteCounter = 0;
_updateLocationCounter = 10;
@@ -480,8 +482,12 @@ void TuckerEngine::mainLoop() {
if (_syncCounter != 0) {
continue;
}
- Graphics::copyTo640(_locationBackgroundGfxBuf + _scrollOffset, _currentGfxBackground + _scrollOffset, 320 - _scrollOffset, 320, _locationHeight);
- Graphics::copyTo640(_locationBackgroundGfxBuf + 320, _currentGfxBackground + 44800, _scrollOffset, 320, _locationHeight);
+ if (_scrollOffset < 320) {
+ Graphics::copyTo640(_locationBackgroundGfxBuf + _scrollOffset, _currentGfxBackground + _scrollOffset, 320 - _scrollOffset, 320, _locationHeight);
+ }
+ if (_scrollOffset > 0) {
+ Graphics::copyTo640(_locationBackgroundGfxBuf + 320, _currentGfxBackground + 44800, _scrollOffset, 320, _locationHeight);
+ }
drawData3();
execData3PreUpdate();
for (int i = 0; i < _spritesCount; ++i) {
@@ -511,7 +517,7 @@ void TuckerEngine::mainLoop() {
setSoundVolumeDistance();
}
updateCharSpeechSound();
- copyToVGA(_locationBackgroundGfxBuf + _scrollOffset);
+ redrawScreen(_scrollOffset);
startCharacterSounds();
for (int num = 0; num < 2; ++num) {
if (_miscSoundFxDelayCounter[num] > 0) {
@@ -1384,7 +1390,7 @@ void TuckerEngine::switchPanelType() {
void TuckerEngine::redrawPanelOverBackground() {
const uint8 *src = _itemsGfxBuf;
- uint8 *dst = _locationBackgroundGfxBuf + 89600 + _scrollOffset;
+ uint8 *dst = _locationBackgroundGfxBuf + 640 * 140 + _scrollOffset;
for (int y = 0; y < 10; ++y) {
memcpy(dst, src, 320);
src += 320;
@@ -1411,6 +1417,7 @@ void TuckerEngine::redrawPanelOverBackground() {
if (_conversationOptionsCount > 0) {
drawConversationTexts();
}
+ addDirtyRect(0, 140, 320, 60);
}
void TuckerEngine::drawConversationTexts() {
@@ -1435,6 +1442,7 @@ void TuckerEngine::drawConversationTexts() {
}
void TuckerEngine::updateScreenScrolling() {
+ int scrollPrevOffset = _scrollOffset;
if (_locationWidthTable[_locationNum] != 2) {
_scrollOffset = 0;
} else if (_validInstructionId == 1) {
@@ -1455,6 +1463,9 @@ void TuckerEngine::updateScreenScrolling() {
_scrollOffset = 320;
}
}
+ if (scrollPrevOffset != _scrollOffset) {
+ _fullRedrawCounter = 2;
+ }
}
void TuckerEngine::updateGameHints() {
@@ -1523,9 +1534,10 @@ void TuckerEngine::updateSoundsTypes3_4() {
void TuckerEngine::drawData3() {
for (int i = 0; i < _locationAnimationsCount; ++i) {
int num = _locationAnimationsTable[i].graphicNum;
- const int offset = _dataTable[num].yDest * 640 + _dataTable[num].xDest;
+ const Data *d = &_dataTable[num];
if (_locationAnimationsTable[i].drawFlag != 0) {
- Graphics::decodeRLE(_locationBackgroundGfxBuf + offset, _data3GfxBuf + _dataTable[num].sourceOffset, _dataTable[num].xSize, _dataTable[num].ySize);
+ Graphics::decodeRLE(_locationBackgroundGfxBuf + d->yDest * 640 + d->xDest, _data3GfxBuf + d->sourceOffset, d->xSize, d->ySize);
+ addDirtyRect(d->xDest, d->yDest, d->xSize, d->ySize);
}
}
}
@@ -1688,6 +1700,7 @@ void TuckerEngine::drawBackgroundSprites() {
}
int offset = _backgroundSprOffset + srcY * 640 + srcX;
Graphics::decodeRLE_248(_locationBackgroundGfxBuf + offset, _backgroundSpriteDataPtr + frameOffset + 12, srcW, srcH, 0, _locationHeightTable[_locationNum], false);
+ addDirtyRect(offset % 640, offset / 640, srcW, srcH);
}
}
@@ -1701,6 +1714,7 @@ void TuckerEngine::drawCurrentSprite() {
}
Graphics::decodeRLE_248(_locationBackgroundGfxBuf + offset, _spritesGfxBuf + chr->sourceOffset, chr->xSize, chr->ySize,
chr->yOffset, _locationHeightTable[_locationNum], _mirroredDrawing != 0);
+ addDirtyRect(offset % 640, offset / 640, chr->xSize, chr->ySize);
if (_currentSpriteAnimationLength > 1) {
SpriteFrame *chr2 = &_spriteFramesTable[_currentSpriteAnimationFrame2];
offset = (_yPosCurrent + _mainSpritesBaseOffset - 54 + chr2->yOffset) * 640 + _xPosCurrent;
@@ -1711,6 +1725,7 @@ void TuckerEngine::drawCurrentSprite() {
}
Graphics::decodeRLE_248(_locationBackgroundGfxBuf + offset, _spritesGfxBuf + chr2->sourceOffset, chr2->xSize, chr2->ySize,
chr2->yOffset, _locationHeightTable[_locationNum], _mirroredDrawing != 0);
+ addDirtyRect(offset % 640, offset / 640, chr2->xSize, chr2->ySize);
}
}
@@ -1853,6 +1868,7 @@ void TuckerEngine::drawSprite(int num) {
Graphics::decodeRLE_248(dstPtr, srcPtr, srcW, srcH, 0, s->yMaxBackground, s->flipX != 0);
break;
}
+ addDirtyRect(dstOffset % 640, dstOffset / 640 + srcY, srcW, srcH);
}
}
@@ -1863,7 +1879,7 @@ void TuckerEngine::clearItemsGfx() {
void TuckerEngine::drawPausedInfoBar() {
int len = getStringWidth(36, _infoBarBuf);
int x = 159 - len / 2;
- drawString(_itemsGfxBuf + 326 + x, 36, _infoBarBuf);
+ drawItemString(326 + x, 36, _infoBarBuf);
}
const uint8 *TuckerEngine::getStringBuf(int type) const {
@@ -1917,15 +1933,15 @@ void TuckerEngine::drawInfoString() {
}
const int xPos = 159 - infoStringWidth / 2;
if (verbPreposition == 0 || (_actionObj2Num == 0 && _actionObj2Type == 0)) {
- drawString(_itemsGfxBuf + xPos, _actionVerb + 1, infoStrBuf);
+ drawItemString(xPos, _actionVerb + 1, infoStrBuf);
if (_actionObj1Num > 0 || _actionObj1Type > 0) {
- drawString(_itemsGfxBuf + xPos + 4 + verbWidth, _actionObj1Num + 1, obj1StrBuf);
+ drawItemString(xPos + 4 + verbWidth, _actionObj1Num + 1, obj1StrBuf);
}
}
if (verbPreposition > 0) {
- drawString(_itemsGfxBuf + xPos + 4 + verbWidth + object1NameWidth, verbPreposition, infoStrBuf);
+ drawItemString(xPos + 4 + verbWidth + object1NameWidth, verbPreposition, infoStrBuf);
if (_actionObj2Num > 0 || _actionObj2Type > 0) {
- drawString(_itemsGfxBuf + xPos + 4 + verbWidth + object1NameWidth + verbPrepositionWidth, _actionObj2Num + 1, obj2StrBuf);
+ drawItemString(xPos + 4 + verbWidth + object1NameWidth + verbPrepositionWidth, _actionObj2Num + 1, obj2StrBuf);
}
}
}
@@ -1933,7 +1949,7 @@ void TuckerEngine::drawInfoString() {
void TuckerEngine::drawGameHintString() {
const int len = getStringWidth(_gameHintsStringNum + 29, _infoBarBuf);
const int x = 159 - len / 2;
- drawString(_itemsGfxBuf + 326 + x, _gameHintsStringNum + 29, _infoBarBuf);
+ drawItemString(326 + x, _gameHintsStringNum + 29, _infoBarBuf);
}
void TuckerEngine::updateCharacterAnimation() {
@@ -2314,7 +2330,7 @@ void TuckerEngine::handleMap() {
}
for (int i = 0; i < 14; ++i) {
fadeInPalette();
- copyToVGA(_locationBackgroundGfxBuf + _scrollOffset);
+ redrawScreen(_scrollOffset);
_fadePaletteCounter = 34;
}
_nextLocationNum = _selectedObject.locationObject_locationNum;
@@ -2819,29 +2835,32 @@ void TuckerEngine::drawStringInteger(int num, int x, int y, int digits) {
Graphics::drawStringChar(_locationBackgroundGfxBuf + offset, numStr[i], 640, 102, _charsetGfxBuf);
offset += 8;
}
+ addDirtyRect(x, y, Graphics::_charset.charW * 3, Graphics::_charset.charH);
}
-void TuckerEngine::drawStringAlt(uint8 *dst, int color, const uint8 *str, int strLen) {
+void TuckerEngine::drawStringAlt(int offset, int color, const uint8 *str, int strLen) {
+ int startOffset = offset;
int pos = 0;
while (pos != strLen && str[pos] != '\n') {
const uint8 chr = str[pos];
- Graphics::drawStringChar(dst, chr, 640, color, _charsetGfxBuf);
- dst += _charWidthTable[chr];
+ Graphics::drawStringChar(_locationBackgroundGfxBuf + offset, chr, 640, color, _charsetGfxBuf);
+ offset += _charWidthTable[chr];
++pos;
}
+ addDirtyRect(startOffset % 640, startOffset / 640, (offset - startOffset) % 640, Graphics::_charset.charH);
}
-void TuckerEngine::drawString(uint8 *dst, int num, const uint8 *str) {
+void TuckerEngine::drawItemString(int offset, int num, const uint8 *str) {
int count = getPositionForLine(num, str);
while (str[count] != '\n') {
const uint8 chr = str[count];
- Graphics::drawStringChar(dst, chr, 320, 1, _charsetGfxBuf);
- dst += _charWidthTable[chr];
+ Graphics::drawStringChar(_itemsGfxBuf + offset, chr, 320, 1, _charsetGfxBuf);
+ offset += _charWidthTable[chr];
++count;
}
}
-void TuckerEngine::drawString2(int x, int y, int num) {
+void TuckerEngine::drawCreditsString(int x, int y, int num) {
uint8 *dst = _locationBackgroundGfxBuf + y * 640 + x;
int pos = getPositionForLine(num, _ptTextBuf);
while (_ptTextBuf[pos] != '\n') {
@@ -2925,11 +2944,6 @@ int TuckerEngine::getPositionForLine(int num, const uint8 *ptr) {
return i;
}
-void TuckerEngine::copyToVGA(const uint8 *src) {
- _system->copyRectToScreen(src, 640, 0, 0, 320, 200);
- _system->updateScreen();
-}
-
void TuckerEngine::findActionKey(int count) {
_backgroundSpriteCurrentFrame = 0;
_characterAnimationIndex = 0;
@@ -3754,15 +3768,14 @@ void TuckerEngine::drawSpeechText(int xStart, int y, const uint8 *dataPtr, int n
} else if (dstOffset > _scrollOffset + 320 - lines[i].w) {
dstOffset = _scrollOffset + 320 - lines[i].w;
}
- uint8 *dst;
- if (_conversationOptionsCount) {
+ if (_conversationOptionsCount != 0) {
dstOffset = xStart + _scrollOffset;
- dst = (i * 10 + y) * 640 + _locationBackgroundGfxBuf + dstOffset;
+ dstOffset += (i * 10 + y) * 640;
_panelItemWidth = count;
} else {
- dst = (y - (count - i) * 10) * 640 + _locationBackgroundGfxBuf + dstOffset;
+ dstOffset += (y - (count - i) * 10) * 640;
}
- drawSpeechTextLine(dataPtr, lines[i].offset, lines[i].count, dst, color);
+ drawSpeechTextLine(dataPtr, lines[i].offset, lines[i].count, dstOffset, color);
}
}
@@ -3789,13 +3802,60 @@ int TuckerEngine::splitSpeechTextLines(const uint8 *dataPtr, int pos, int x, int
return ret;
}
-void TuckerEngine::drawSpeechTextLine(const uint8 *dataPtr, int pos, int count, uint8 *dst, uint8 color) {
+void TuckerEngine::drawSpeechTextLine(const uint8 *dataPtr, int pos, int count, int dstOffset, uint8 color) {
+ int startOffset = dstOffset;
while (count > 0 && dataPtr[pos] != '\n') {
- Graphics::drawStringChar(dst, dataPtr[pos], 640, color, _charsetGfxBuf);
- dst += _charWidthTable[dataPtr[pos]];
+ Graphics::drawStringChar(_locationBackgroundGfxBuf + dstOffset, dataPtr[pos], 640, color, _charsetGfxBuf);
+ dstOffset += _charWidthTable[dataPtr[pos]];
++pos;
--count;
}
+ addDirtyRect(startOffset % 640, startOffset / 640, (dstOffset - startOffset) % 640, Graphics::_charset.charH);
+}
+
+void TuckerEngine::redrawScreen(int offset) {
+ debug(3, "redrawScreen() _fullRedrawCounter %d offset %d _dirtyRectsCount %d", _fullRedrawCounter, offset, _dirtyRectsCount);
+ assert(offset <= kScreenWidth);
+ if (_fullRedrawCounter > 0) {
+ --_fullRedrawCounter;
+ _system->copyRectToScreen(_locationBackgroundGfxBuf + offset, kScreenPitch, 0, 0, kScreenWidth, kScreenHeight);
+ } else {
+ const int xClip = offset % kScreenPitch;
+ const int yClip = offset / kScreenPitch;
+ Common::Rect clipRect(xClip, yClip, xClip + kScreenWidth, yClip + kScreenHeight);
+ for (int i = 0; i < _dirtyRectsPrevCount; ++i) {
+ redrawScreenRect(clipRect, _dirtyRectsTable[1][i]);
+ }
+ for (int i = 0; i < _dirtyRectsCount; ++i) {
+ redrawScreenRect(clipRect, _dirtyRectsTable[0][i]);
+ }
+ _dirtyRectsPrevCount = _dirtyRectsCount;
+ for (int i = 0; i < _dirtyRectsCount; ++i) {
+ _dirtyRectsTable[1][i] = _dirtyRectsTable[0][i];
+ }
+ }
+ _dirtyRectsCount = 0;
+ _system->updateScreen();
+}
+
+void TuckerEngine::redrawScreenRect(const Common::Rect &clip, const Common::Rect &dirty) {
+ if (dirty.intersects(clip)) {
+ Common::Rect r(dirty);
+ r.clip(clip);
+ const uint8 *src = _locationBackgroundGfxBuf + r.top * 640 + r.left;
+ r.translate(-clip.left, -clip.top);
+ _system->copyRectToScreen(src, 640, r.left, r.top, r.right - r.left, r.bottom - r.top);
+ }
+}
+
+void TuckerEngine::addDirtyRect(int x, int y, int w, int h) {
+ if (_dirtyRectsCount >= kMaxDirtyRects) {
+ _fullRedrawCounter = 2;
+ _dirtyRectsCount = 0;
+ } else {
+ _dirtyRectsTable[0][_dirtyRectsCount] = Common::Rect(x, y, x + w, y + h);
+ ++_dirtyRectsCount;
+ }
}
} // namespace Tucker
diff --git a/engines/tucker/tucker.h b/engines/tucker/tucker.h
index 67084c9dd3..8d759de237 100644
--- a/engines/tucker/tucker.h
+++ b/engines/tucker/tucker.h
@@ -173,6 +173,7 @@ struct LocationMusic {
enum {
kScreenWidth = 320,
kScreenHeight = 200,
+ kScreenPitch = 640,
kFadePaletteStep = 5,
kStartupLocation = 1,
kDefaultCharSpeechSoundCounter = 1,
@@ -224,7 +225,8 @@ public:
kSprC02TableSize = 40,
kDataTableSize = 500,
kSpeechHistoryTableSize = 5,
- kMaxCharacters = 8
+ kMaxCharacters = 8,
+ kMaxDirtyRects = 16
};
TuckerEngine(OSystem *system, Common::Language language, bool isDemo);
@@ -305,15 +307,14 @@ protected:
void updateSprites();
void updateSprite(int i);
void drawStringInteger(int num, int x, int y, int digits);
- void drawStringAlt(uint8 *dst, int color, const uint8 *str, int strLen = -1);
- void drawString(uint8 *dst, int num, const uint8 *str);
- void drawString2(int x, int y, int num);
+ void drawStringAlt(int offset, int color, const uint8 *str, int strLen = -1);
+ void drawItemString(int offset, int num, const uint8 *str);
+ void drawCreditsString(int x, int y, int num);
void updateCharSpeechSound();
void updateItemsGfxColors(int bit0, int bit7);
int testLocationMask(int x, int y);
int getStringWidth(int num, const uint8 *ptr);
int getPositionForLine(int num, const uint8 *ptr);
- void copyToVGA(const uint8 *src);
void findActionKey(int count);
int parseTableInstruction();
void moveUpInventoryObjects();
@@ -331,7 +332,10 @@ protected:
void playSpeechForAction(int i);
void drawSpeechText(int xStart, int y, const uint8 *dataPtr, int num, int color);
int splitSpeechTextLines(const uint8 *dataPtr, int pos, int x, int &lineCharsCount, int &lineWidth);
- void drawSpeechTextLine(const uint8 *dataPtr, int pos, int count, uint8 *dst, uint8 color);
+ void drawSpeechTextLine(const uint8 *dataPtr, int pos, int count, int dstOffset, uint8 color);
+ void redrawScreen(int offset);
+ void redrawScreenRect(const Common::Rect &clip, const Common::Rect &dirty);
+ void addDirtyRect(int x, int y, int w, int h);
void execData3PreUpdate_locationNum1();
void execData3PreUpdate_locationNum1Helper1();
@@ -354,8 +358,8 @@ protected:
void updateSprite_locationNum6_2(int i);
void execData3PreUpdate_locationNum6();
void execData3PreUpdate_locationNum6Helper1();
- void execData3PreUpdate_locationNum6Helper2(uint8 *dst, const uint8 *src);
- void execData3PreUpdate_locationNum6Helper3(uint8 *dst, const uint8 *src);
+ void execData3PreUpdate_locationNum6Helper2(int dstOffset, const uint8 *src);
+ void execData3PreUpdate_locationNum6Helper3(int dstOffset, const uint8 *src);
void updateSprite_locationNum7_0(int i);
void updateSprite_locationNum7_1(int i);
void updateSprite_locationNum8_0(int i);
@@ -792,6 +796,9 @@ protected:
uint8 *_currentGfxBackground;
int _fadePaletteCounter;
uint8 _currentPalette[768];
+ int _fullRedrawCounter;
+ int _dirtyRectsPrevCount, _dirtyRectsCount;
+ Common::Rect _dirtyRectsTable[2][kMaxDirtyRects];
int _updateLocationFadePaletteCounter;
int _updateLocationCounter;