aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/gob/draw.cpp85
-rw-r--r--engines/gob/draw.h3
-rw-r--r--engines/gob/gob.cpp3
-rw-r--r--engines/gob/inter.h2
-rw-r--r--engines/gob/inter_v1.cpp2
-rw-r--r--engines/gob/inter_v2.cpp4
-rw-r--r--engines/gob/inter_v3.cpp6
7 files changed, 101 insertions, 4 deletions
diff --git a/engines/gob/draw.cpp b/engines/gob/draw.cpp
index bc5b205bd1..acf4d5765b 100644
--- a/engines/gob/draw.cpp
+++ b/engines/gob/draw.cpp
@@ -33,6 +33,7 @@
#include "gob/game.h"
#include "gob/inter.h"
#include "gob/video.h"
+#include "gob/palanim.h"
namespace Gob {
@@ -411,4 +412,88 @@ void Draw::forceBlit(bool backwards) {
0, 0, 0);
}
+const int16 Draw::_wobbleTable[360] = {
+ 0x0000, 0x011D, 0x023B, 0x0359, 0x0476, 0x0593, 0x06B0, 0x07CC, 0x08E8,
+ 0x0A03, 0x0B1D, 0x0C36, 0x0D4E, 0x0E65, 0x0F7B, 0x1090, 0x11A4, 0x12B6,
+ 0x13C6, 0x14D6, 0x15E3, 0x16EF, 0x17F9, 0x1901, 0x1A07, 0x1B0C, 0x1C0E,
+ 0x1D0E, 0x1E0B, 0x1F07, 0x2000, 0x20F6, 0x21EA, 0x22DB, 0x23C9, 0x24B5,
+ 0x259E, 0x2684, 0x2766, 0x2846, 0x2923, 0x29FC, 0x2AD3, 0x2BA5, 0x2C75,
+ 0x2D41, 0x2E09, 0x2ECE, 0x2F8F, 0x304D, 0x3106, 0x31BC, 0x326E, 0x331C,
+ 0x33C6, 0x346C, 0x350E, 0x35AC, 0x3646, 0x36DB, 0x376C, 0x37F9, 0x3882,
+ 0x3906, 0x3985, 0x3A00, 0x3A77, 0x3AE9, 0x3B56, 0x3BBF, 0x3C23, 0x3C83,
+ 0x3CDE, 0x3D34, 0x3D85, 0x3DD1, 0x3E19, 0x3E5C, 0x3E99, 0x3ED2, 0x3F07,
+ 0x3F36, 0x3F60, 0x3F85, 0x3FA6, 0x3FC1, 0x3FD8, 0x3FE9, 0x3FF6, 0x3FFD,
+ 0x4000, 0x3FFD, 0x3FF6, 0x3FE9, 0x3FD8, 0x3FC1, 0x3FA6, 0x3F85, 0x3F60,
+ 0x3F36, 0x3F07, 0x3ED2, 0x3E99, 0x3E5C, 0x3E19, 0x3DD1, 0x3D85, 0x3D34,
+ 0x3CDE, 0x3C83, 0x3C23, 0x3BBF, 0x3B56, 0x3AE9, 0x3A77, 0x3A00, 0x3985,
+ 0x3906, 0x3882, 0x37F9, 0x376C, 0x36DB, 0x3646, 0x35AC, 0x350E, 0x346C,
+ 0x33C6, 0x331C, 0x326E, 0x31BC, 0x3106, 0x304D, 0x2F8F, 0x2ECE, 0x2E09,
+ 0x2D41, 0x2C75, 0x2BA5, 0x2AD3, 0x29FC, 0x2923, 0x2846, 0x2766, 0x2684,
+ 0x259E, 0x24B5, 0x23C9, 0x22DB, 0x21EA, 0x20F6, 0x1FFF, 0x1F07, 0x1E0B,
+ 0x1D0E, 0x1C0E, 0x1B0C, 0x1A07, 0x1901, 0x17F9, 0x16EF, 0x15E3, 0x14D6,
+ 0x13C6, 0x12B6, 0x11A4, 0x1090, 0x0F7B, 0x0E65, 0x0D4E, 0x0C36, 0x0B1D,
+ 0x0A03, 0x08E8, 0x07CC, 0x06B0, 0x0593, 0x0476, 0x0359, 0x023B, 0x011D
+ -0x0000, -0x011D, -0x023B, -0x0359, -0x0476, -0x0593, -0x06B0, -0x07CC, -0x08E8,
+ -0x0A03, -0x0B1D, -0x0C36, -0x0D4E, -0x0E65, -0x0F7B, -0x1090, -0x11A4, -0x12B6,
+ -0x13C6, -0x14D6, -0x15E3, -0x16EF, -0x17F9, -0x1901, -0x1A07, -0x1B0C, -0x1C0E,
+ -0x1D0E, -0x1E0B, -0x1F07, -0x2000, -0x20F6, -0x21EA, -0x22DB, -0x23C9, -0x24B5,
+ -0x259E, -0x2684, -0x2766, -0x2846, -0x2923, -0x29FC, -0x2AD3, -0x2BA5, -0x2C75,
+ -0x2D41, -0x2E09, -0x2ECE, -0x2F8F, -0x304D, -0x3106, -0x31BC, -0x326E, -0x331C,
+ -0x33C6, -0x346C, -0x350E, -0x35AC, -0x3646, -0x36DB, -0x376C, -0x37F9, -0x3882,
+ -0x3906, -0x3985, -0x3A00, -0x3A77, -0x3AE9, -0x3B56, -0x3BBF, -0x3C23, -0x3C83,
+ -0x3CDE, -0x3D34, -0x3D85, -0x3DD1, -0x3E19, -0x3E5C, -0x3E99, -0x3ED2, -0x3F07,
+ -0x3F36, -0x3F60, -0x3F85, -0x3FA6, -0x3FC1, -0x3FD8, -0x3FE9, -0x3FF6, -0x3FFD,
+ -0x4000, -0x3FFD, -0x3FF6, -0x3FE9, -0x3FD8, -0x3FC1, -0x3FA6, -0x3F85, -0x3F60,
+ -0x3F36, -0x3F07, -0x3ED2, -0x3E99, -0x3E5C, -0x3E19, -0x3DD1, -0x3D85, -0x3D34,
+ -0x3CDE, -0x3C83, -0x3C23, -0x3BBF, -0x3B56, -0x3AE9, -0x3A77, -0x3A00, -0x3985,
+ -0x3906, -0x3882, -0x37F9, -0x376C, -0x36DB, -0x3646, -0x35AC, -0x350E, -0x346C,
+ -0x33C6, -0x331C, -0x326E, -0x31BC, -0x3106, -0x304D, -0x2F8F, -0x2ECE, -0x2E09,
+ -0x2D41, -0x2C75, -0x2BA5, -0x2AD3, -0x29FC, -0x2923, -0x2846, -0x2766, -0x2684,
+ -0x259E, -0x24B5, -0x23C9, -0x22DB, -0x21EA, -0x20F6, -0x1FFF, -0x1F07, -0x1E0B,
+ -0x1D0E, -0x1C0E, -0x1B0C, -0x1A07, -0x1901, -0x17F9, -0x16EF, -0x15E3, -0x14D6,
+ -0x13C6, -0x12B6, -0x11A4, -0x1090, -0x0F7B, -0x0E65, -0x0D4E, -0x0C36, -0x0B1D,
+ -0x0A03, -0x08E8, -0x07CC, -0x06B0, -0x0593, -0x0476, -0x0359, -0x023B, -0x011D
+};
+
+void Draw::wobble(SurfaceDesc *surfDesc) {
+ int16 amplitude = 32;
+ uint16 curFrame = 0;
+ uint16 frameWobble = 0;
+ uint16 rowWobble = 0;
+ int8 *offsets = new int8[_vm->_height];
+
+ _vm->_palAnim->fade(_vm->_global->_pPaletteDesc, 0, -1);
+
+ while (amplitude > 0) {
+ rowWobble = frameWobble;
+ frameWobble = (frameWobble + 20) % 360;
+
+ for (uint16 y = 0; y < _vm->_height; y++) {
+ offsets[y] = amplitude +
+ ((_wobbleTable[rowWobble] * amplitude) / 0x4000);
+
+ rowWobble = (rowWobble + 20) % 360;
+ }
+
+ if (curFrame++ & 16)
+ amplitude--;
+
+ for (uint16 y = 0; y < _vm->_height; y++)
+ _vm->_video->drawSprite(surfDesc, _frontSurface,
+ 0, y, _vm->_width - 1, y, offsets[y], y, 0);
+
+ _vm->_palAnim->fadeStep(0);
+ _vm->_video->waitRetrace();
+ }
+
+ _vm->_video->drawSprite(surfDesc, _frontSurface,
+ 0, 0, _vm->_width - 1, _vm->_height - 1, 0, 0, 0);
+
+ _applyPal = false;
+ _invalidatedCount = 0;
+ _noInvalidated = true;
+
+ delete[] offsets;
+}
+
} // End of namespace Gob
diff --git a/engines/gob/draw.h b/engines/gob/draw.h
index 8108a18d12..4bf59856be 100644
--- a/engines/gob/draw.h
+++ b/engines/gob/draw.h
@@ -153,6 +153,9 @@ public:
int32 getSpriteRectSize(int16 index);
void forceBlit(bool backwards = false);
+ static const int16 _wobbleTable[360];
+ void wobble(SurfaceDesc *surfDesc);
+
virtual void initScreen() = 0;
virtual void closeScreen() = 0;
virtual void blitCursor() = 0;
diff --git a/engines/gob/gob.cpp b/engines/gob/gob.cpp
index 40a505364d..d9385b1b0f 100644
--- a/engines/gob/gob.cpp
+++ b/engines/gob/gob.cpp
@@ -136,7 +136,8 @@ void GobEngine::validateLanguage() {
}
void GobEngine::validateVideoMode(int16 videoMode) {
- if ((videoMode != 0x13) && (videoMode != 0x14) && (videoMode != 0x18))
+ if ((videoMode != 0x10) && (videoMode != 0x13) &&
+ (videoMode != 0x14) && (videoMode != 0x18))
error("Video mode 0x%X is not supported!", videoMode);
}
diff --git a/engines/gob/inter.h b/engines/gob/inter.h
index db56ad4cd9..a7317492ad 100644
--- a/engines/gob/inter.h
+++ b/engines/gob/inter.h
@@ -481,6 +481,8 @@ protected:
bool o3_checkData(OpFuncParams &params);
bool o3_readData(OpFuncParams &params);
bool o3_writeData(OpFuncParams &params);
+
+ void o3_wobble(OpGobParams &params);
};
class Inter_v4 : public Inter_v3 {
diff --git a/engines/gob/inter_v1.cpp b/engines/gob/inter_v1.cpp
index 5d74138db1..9f30d9dea2 100644
--- a/engines/gob/inter_v1.cpp
+++ b/engines/gob/inter_v1.cpp
@@ -1617,7 +1617,7 @@ bool Inter_v1::o1_palLoad(OpFuncParams &params) {
_vm->_global->_pPaletteDesc->unused1 = _vm->_draw->_unusedPalette1;
if (_vm->_global->_videoMode < 0x13) {
- _vm->_global->_pPaletteDesc->vgaPal = _vm->_draw->_vgaSmallPalette;
+ _vm->_global->_pPaletteDesc->vgaPal = _vm->_draw->_vgaPalette;
_vm->_palAnim->fade(_vm->_global->_pPaletteDesc, 0, 0);
return false;
}
diff --git a/engines/gob/inter_v2.cpp b/engines/gob/inter_v2.cpp
index 8cb8b706bd..476ebedddd 100644
--- a/engines/gob/inter_v2.cpp
+++ b/engines/gob/inter_v2.cpp
@@ -1375,10 +1375,12 @@ void Inter_v2::o2_initScreen() {
width = _vm->_parse->parseValExpr();
height = _vm->_parse->parseValExpr();
+ _vm->_global->_colorCount = (videoMode == 0x10) ? 16 : 256;
+
_vm->_global->_fakeVideoMode = videoMode;
// Some versions require this
- if ((videoMode == 0xD) || (videoMode == 0x10))
+ if ((videoMode == 0xD))// || (videoMode == 0x10))
videoMode = _vm->_mode;
if ((videoMode == _vm->_global->_videoMode) && (width == -1))
diff --git a/engines/gob/inter_v3.cpp b/engines/gob/inter_v3.cpp
index 701842a9d2..51413c839a 100644
--- a/engines/gob/inter_v3.cpp
+++ b/engines/gob/inter_v3.cpp
@@ -594,7 +594,7 @@ void Inter_v3::setupOpcodes() {
{NULL, ""},
{NULL, ""},
{NULL, ""},
- {NULL, ""},
+ OPCODE(o3_wobble),
/* 28 */
{NULL, ""},
{NULL, ""},
@@ -894,4 +894,8 @@ bool Inter_v3::o3_copySprite(OpFuncParams &params) {
return false;
}
+void Inter_v3::o3_wobble(OpGobParams &params) {
+ _vm->_draw->wobble(_vm->_draw->_backSurface);
+}
+
} // End of namespace Gob