aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTravis Howell2006-04-08 00:12:16 +0000
committerTravis Howell2006-04-08 00:12:16 +0000
commit9a7b16e4d3eeb60ce2ed58159adb40486210ec07 (patch)
treed12a733f7935f263fdd881b1fdd424e09ddab9f9
parent9e5950e7042d818508a3b91571d076a3bc35c258 (diff)
downloadscummvm-rg350-9a7b16e4d3eeb60ce2ed58159adb40486210ec07.tar.gz
scummvm-rg350-9a7b16e4d3eeb60ce2ed58159adb40486210ec07.tar.bz2
scummvm-rg350-9a7b16e4d3eeb60ce2ed58159adb40486210ec07.zip
Add initial support for vertical scrolling in FF
svn-id: r21675
-rw-r--r--engines/simon/simon.cpp62
-rw-r--r--engines/simon/simon.h3
-rw-r--r--engines/simon/vga.cpp57
3 files changed, 94 insertions, 28 deletions
diff --git a/engines/simon/simon.cpp b/engines/simon/simon.cpp
index 5583c4a15a..6334db9ba8 100644
--- a/engines/simon/simon.cpp
+++ b/engines/simon/simon.cpp
@@ -2689,34 +2689,54 @@ void SimonEngine::timer_vga_sprites() {
void SimonEngine::scrollEvent() {
byte *dst = getFrontBuf();
const byte *src;
- uint x;
+ uint x, y;;
- if (_scrollFlag < 0) {
- memmove(dst + 8, dst, _screenWidth * _scrollHeight - 8);
- } else {
- memmove(dst, dst + 8, _screenWidth * _scrollHeight - 8);
- }
+ if (_scrollXMax == 0) {
+ if (_scrollFlag < 0) {
+ memmove(dst + 8 * _screenWidth, dst, (_scrollHeight - 8) * _screenWidth);
+ } else {
+ memmove(dst, dst + 8 * _screenWidth, (_scrollHeight - 8) * _screenWidth);
+ }
- x = _scrollX;
- x -= (getGameType() == GType_FF) ? 8 : 1;
+ y = _scrollY - 8;
- if (_scrollFlag > 0) {
- dst += _screenWidth - 8;
- x += (getGameType() == GType_FF) ? 648 : 41;
- }
+ if (_scrollFlag > 0) {
+ dst += (_scrollHeight - 8) * _screenWidth;
+ y += 488;
+ }
- if (getGameType() == GType_FF)
- src = _scrollImage + x / 2;
- else
- src = _scrollImage + x * 4;
- decodeStripA(dst, src + readUint32Wrapper(src), _scrollHeight);
+ src = _scrollImage + y / 2;
+ decodeRow(dst, src + readUint32Wrapper(src), _scrollWidth);
- memcpy(_sdl_buf_attached, _sdl_buf, _screenWidth * _screenHeight);
- dx_copy_from_attached_to_3(_scrollHeight);
+ _scrollY += _scrollFlag;
+ vcWriteVar(250, _scrollY);
+ } else {
+ if (_scrollFlag < 0) {
+ memmove(dst + 8, dst, _screenWidth * _scrollHeight - 8);
+ } else {
+ memmove(dst, dst + 8, _screenWidth * _scrollHeight - 8);
+ }
+
+ x = _scrollX;
+ x -= (getGameType() == GType_FF) ? 8 : 1;
+
+ if (_scrollFlag > 0) {
+ dst += _screenWidth - 8;
+ x += (getGameType() == GType_FF) ? 648 : 41;
+ }
- _scrollX += _scrollFlag;
+ if (getGameType() == GType_FF)
+ src = _scrollImage + x / 2;
+ else
+ src = _scrollImage + x * 4;
+ decodeColumn(dst, src + readUint32Wrapper(src), _scrollHeight);
- vcWriteVar(251, _scrollX);
+ _scrollX += _scrollFlag;
+ vcWriteVar(251, _scrollX);
+ }
+
+ memcpy(_sdl_buf_attached, _sdl_buf, _screenWidth * _screenHeight);
+ memcpy(_sdl_buf_3, _sdl_buf_attached, _scrollHeight * _screenWidth);
_scrollFlag = 0;
}
diff --git a/engines/simon/simon.h b/engines/simon/simon.h
index 5e73412cd8..c494bc390a 100644
--- a/engines/simon/simon.h
+++ b/engines/simon/simon.h
@@ -1101,7 +1101,8 @@ protected:
void o_waitForMark(uint i);
void scrollEvent();
- void decodeStripA(byte *dst, const byte *src, int height);
+ void decodeColumn(byte *dst, const byte *src, int height);
+ void decodeRow(byte *dst, const byte *src, int width);
void scroll_timeout();
void hitarea_stuff_helper_2();
void fastFadeIn();
diff --git a/engines/simon/vga.cpp b/engines/simon/vga.cpp
index 27dbd3b4d4..02a9c8ea89 100644
--- a/engines/simon/vga.cpp
+++ b/engines/simon/vga.cpp
@@ -608,7 +608,7 @@ static uint16 _video_windows[128] = {
};
/* simon2 specific */
-void SimonEngine::decodeStripA(byte *dst, const byte *src, int height) {
+void SimonEngine::decodeColumn(byte *dst, const byte *src, int height) {
const uint pitch = _dxSurfacePitch;
int8 reps = (int8)0x80;
byte color;
@@ -652,6 +652,50 @@ void SimonEngine::decodeStripA(byte *dst, const byte *src, int height) {
}
}
+void SimonEngine::decodeRow(byte *dst, const byte *src, int width) {
+ const uint pitch = _dxSurfacePitch;
+ int8 reps = (int8)0x80;
+ byte color;
+ byte *dst_org = dst;
+ uint w = width, h = 8;
+
+ for (;;) {
+ reps = *src++;
+ if (reps >= 0) {
+ color = *src++;
+
+ do {
+ *dst++ = color;
+
+ /* reached right edge? */
+ if (--w == 0) {
+ /* reached bottom? */
+ if (--h == 0)
+ return;
+ dst_org += pitch;
+ dst = dst_org;
+ w = width;
+ }
+ } while (--reps >= 0);
+ } else {
+
+ do {
+ *dst++ = *src++;
+
+ /* reached right edge? */
+ if (--w == 0) {
+ /* reached bottom? */
+ if (--h == 0)
+ return;
+ dst_org += pitch;
+ dst = dst_org;
+ w = width;
+ }
+ } while (++reps != 0);
+ }
+ }
+}
+
void SimonEngine::vc10_draw() {
byte *p2;
uint width, height;
@@ -1281,7 +1325,7 @@ void SimonEngine::horizontalScroll(VC10_state *state) {
src = state->depack_src + _scrollX * 4;
for (w = 0; w < _screenWidth; w += 8) {
- decodeStripA(dst, src + readUint32Wrapper(src), state->height);
+ decodeColumn(dst, src + readUint32Wrapper(src), state->height);
dst += 8;
src += 4;
}
@@ -1309,8 +1353,8 @@ void SimonEngine::verticalScroll(VC10_state *state) {
src = state->depack_src + _scrollY / 2;
for (h = 0; h < _screenHeight; h += 8) {
- //decodeRow(dst, src + READ_LE_UINT32(src), state->width);
- dst += 8;
+ decodeRow(dst, src + READ_LE_UINT32(src), state->width);
+ dst += 8 * state->width;
src += 4;
}
}
@@ -1862,7 +1906,7 @@ void SimonEngine::vc48_setPathFinder() {
y = vsp->y;
vsp->y = y1;
- checkScrollY(y, y1);
+ checkScrollY(y1 - y, y1);
_variableArray[11] = readUint16Wrapper(p);
_variableArray[13] = pos;
@@ -2356,7 +2400,8 @@ void SimonEngine::vc77_setScaleYOffs() {
vsp->y += getScale(vsp->y, y);
_variableArray[var] = vsp->y;
- checkScrollY(y, vsp->y);
+ if (y != 0)
+ checkScrollY(y, vsp->y);
vsp->flags = kDFScaled;
}