aboutsummaryrefslogtreecommitdiff
path: root/engines/agos
diff options
context:
space:
mode:
authorTravis Howell2007-05-20 04:47:12 +0000
committerTravis Howell2007-05-20 04:47:12 +0000
commitc80aa9409146079703d14f3882a72d4d53246445 (patch)
tree9781cef7bc676e23728d95475ce38e2d6db82df1 /engines/agos
parent4aa3ec63deae1dab4b04b7b7482472423e93119d (diff)
downloadscummvm-rg350-c80aa9409146079703d14f3882a72d4d53246445.tar.gz
scummvm-rg350-c80aa9409146079703d14f3882a72d4d53246445.tar.bz2
scummvm-rg350-c80aa9409146079703d14f3882a72d4d53246445.zip
Add dissolve code for Elvira 2 and Waxworks.
svn-id: r26881
Diffstat (limited to 'engines/agos')
-rw-r--r--engines/agos/vga_e2.cpp127
1 files changed, 118 insertions, 9 deletions
diff --git a/engines/agos/vga_e2.cpp b/engines/agos/vga_e2.cpp
index 05a7f9fc76..ee6afd09e6 100644
--- a/engines/agos/vga_e2.cpp
+++ b/engines/agos/vga_e2.cpp
@@ -190,18 +190,127 @@ void AGOSEngine::vc52_playSound() {
}
void AGOSEngine::vc53_dissolveIn() {
- // TODO
- uint num = vcReadNextWord();
- uint speed = vcReadNextWord();
- debug(0, "vc53_dissolveIn: stub (%d, %d)", num, speed);
+ uint16 num = vcReadNextWord();
+ uint16 speed = vcReadNextWord() + 1;
+
+ byte *src, *dst, *srcOffs, *srcOffs2, *dstOffs, *dstOffs2;
+ uint8 color = 0;
+
+ // Only uses Video Window 4
+ num = 4;
+
+ uint16 dissolveX = _videoWindows[num * 4 + 2] * 8;
+ uint16 dissolveY = (_videoWindows[num * 4 + 3] + 1) / 2;
+ uint16 dissolveCheck = dissolveY * dissolveX * 4;
+ uint16 dissolveDelay = dissolveCheck * 2 / speed;
+ uint16 dissolveCount = dissolveCheck * 2 / speed;
+
+ int16 xoffs = _videoWindows[num * 4 + 0] * 16;
+ int16 yoffs = _videoWindows[num * 4 + 1];
+ byte *dstPtr = getFrontBuf() + xoffs + yoffs * _screenWidth;
+
+ uint16 count = dissolveCheck * 2;
+ while (count--) {
+ yoffs = _rnd.getRandomNumber(dissolveY);
+ dst = dstPtr + yoffs * _screenWidth;
+ src = _window4BackScn + yoffs * 224;
+
+ xoffs = _rnd.getRandomNumber(dissolveX);
+ dst += xoffs;
+ src += xoffs;
+
+ *dst &= color;
+ *dst |= *src & 0xF;
+
+ dstOffs = dst;
+ srcOffs = src;
+
+ xoffs = dissolveX * 2 - 1 - (xoffs * 2);
+ dst += xoffs;
+ src += xoffs;
+
+ *dst &= color;
+ *dst |= *src & 0xF;
+
+ srcOffs2 = src;
+ dstOffs2 = dst;
+
+ yoffs = (dissolveY - 1) * 2 - (yoffs * 2);
+ src = srcOffs + yoffs * 224;
+ dst = dstOffs + yoffs * _screenWidth;
+
+ color = 0xF0;
+ *dst &= color;
+ *dst |= *src & 0xF;
+
+ dst = dstOffs2 + yoffs * _screenWidth;;
+ src = srcOffs2 + yoffs * 224;
+
+ *dst &= color;
+ *dst |= *src & 0xF;
+
+ dissolveCount--;
+ if (!dissolveCount) {
+ if (count >= dissolveCheck)
+ dissolveDelay++;
+
+ dissolveCount = dissolveDelay;
+ _system->copyRectToScreen(getFrontBuf(), _screenWidth, 0, 0, _screenWidth, _screenHeight);
+ _system->updateScreen();
+ delay(0);
+ }
+ }
}
void AGOSEngine::vc54_dissolveOut() {
- // TODO
- uint num = vcReadNextWord();
- uint color = vcReadNextWord();
- uint speed = vcReadNextWord();
- debug(0, "vc54_dissolveOut: stub (%d, %d, %d)", num, color, speed);
+ uint16 num = vcReadNextWord();
+ uint16 color = vcReadNextWord();
+ uint16 speed = vcReadNextWord() + 1;
+
+ byte *dst, *dstOffs;
+
+ uint16 dissolveX = _videoWindows[num * 4 + 2] * 8;
+ uint16 dissolveY = (_videoWindows[num * 4 + 3] + 1) / 2;
+ uint16 dissolveCheck = dissolveY * dissolveX * 4;
+ uint16 dissolveDelay = dissolveCheck * 2 / speed;
+ uint16 dissolveCount = dissolveCheck * 2 / speed;
+
+ int16 xoffs = _videoWindows[num * 4 + 0] * 16;
+ int16 yoffs = _videoWindows[num * 4 + 1];
+ byte *dstPtr = getFrontBuf() + xoffs + yoffs * _screenWidth;
+ color |= dstPtr[0] & 0xF0;
+
+ uint16 count = dissolveCheck * 2;
+ while (count--) {
+ yoffs = _rnd.getRandomNumber(dissolveY);
+ xoffs = _rnd.getRandomNumber(dissolveX);
+ dst = dstPtr + xoffs + yoffs * _screenWidth;
+ *dst = color;
+
+ dstOffs = dst;
+
+ xoffs = dissolveX * 2 - 1 - (xoffs * 2);
+ dst += xoffs;
+ *dst = color;
+
+ yoffs = (dissolveY - 1) * 2 - (yoffs * 2);
+ dst = dstOffs + yoffs * _screenWidth;
+ *dst = color;
+
+ dst += xoffs;
+ *dst = color;
+
+ dissolveCount--;
+ if (!dissolveCount) {
+ if (count >= dissolveCheck)
+ dissolveDelay++;
+
+ dissolveCount = dissolveDelay;
+ _system->copyRectToScreen(getFrontBuf(), _screenWidth, 0, 0, _screenWidth, _screenHeight);
+ _system->updateScreen();
+ delay(0);
+ }
+ }
}
void AGOSEngine::vc55_moveBox() {