aboutsummaryrefslogtreecommitdiff
path: root/gob/palanim.cpp
diff options
context:
space:
mode:
authorEugene Sandulenko2005-04-05 15:07:40 +0000
committerEugene Sandulenko2005-04-05 15:07:40 +0000
commit1758c5b211a39c29a193546348e7cc6e7bc2e8c9 (patch)
tree225d803c62c79d6a6d95ada0096e8832e9e65044 /gob/palanim.cpp
parentb399a052f1a60df4731aa15d330e1c0b759ed857 (diff)
downloadscummvm-rg350-1758c5b211a39c29a193546348e7cc6e7bc2e8c9.tar.gz
scummvm-rg350-1758c5b211a39c29a193546348e7cc6e7bc2e8c9.tar.bz2
scummvm-rg350-1758c5b211a39c29a193546348e7cc6e7bc2e8c9.zip
Initial checking of Gob engine
svn-id: r17388
Diffstat (limited to 'gob/palanim.cpp')
-rw-r--r--gob/palanim.cpp224
1 files changed, 224 insertions, 0 deletions
diff --git a/gob/palanim.cpp b/gob/palanim.cpp
new file mode 100644
index 0000000000..ad4a9f3e07
--- /dev/null
+++ b/gob/palanim.cpp
@@ -0,0 +1,224 @@
+/*
+** Gobliiins 1
+** Original game by CoktelVision
+**
+** Reverse engineered by Ivan Dubrov <WFrag@yandex.ru>
+**
+*/
+#include "gob/gob.h"
+#include "gob/video.h"
+#include "gob/util.h"
+#include "gob/global.h"
+#include "gob/palanim.h"
+#include "gob/debug.h"
+
+namespace Gob {
+
+int16 pal_fadeValue = 1;
+
+char pal_toFadeRed[256];
+char pal_toFadeGreen[256];
+char pal_toFadeBlue[256];
+
+char pal_fadeColor(char from, char to) {
+ if ((int16)from - pal_fadeValue > (int16)to)
+ return from - pal_fadeValue;
+ else if ((int16)from + pal_fadeValue < (int16)to)
+ return from + pal_fadeValue;
+ else
+ return to;
+}
+
+char pal_fadeStep(int16 oper) {
+ char newRed;
+ char newGreen;
+ char newBlue;
+ char stop;
+ int16 i;
+
+ if (colorCount != 256)
+ error("pal_fadeStep: Only 256 color mode is supported!");
+
+ if (oper == 0) {
+ stop = 1;
+ if (setAllPalette) {
+ if (inVM != 0)
+ error("pal_fade: inVM != 0 not supported.");
+
+ for (i = 0; i < 256; i++) {
+ newRed =
+ pal_fadeColor(redPalette[i],
+ pal_toFadeRed[i]);
+ newGreen =
+ pal_fadeColor(greenPalette[i],
+ pal_toFadeGreen[i]);
+ newBlue =
+ pal_fadeColor(bluePalette[i],
+ pal_toFadeBlue[i]);
+
+ if (redPalette[i] != newRed
+ || greenPalette[i] != newGreen
+ || bluePalette[i] != newBlue) {
+
+ vid_setPalElem(i, newRed, newGreen, newBlue, 0, 0x13);
+
+ redPalette[i] = newRed;
+ greenPalette[i] = newGreen;
+ bluePalette[i] = newBlue;
+ stop = 0;
+ }
+ }
+ } else {
+ for (i = 0; i < 16; i++) {
+
+ vid_setPalElem(i,
+ pal_fadeColor(redPalette[i],
+ pal_toFadeRed[i]),
+ pal_fadeColor(greenPalette[i],
+ pal_toFadeGreen[i]),
+ pal_fadeColor(bluePalette[i],
+ pal_toFadeBlue[i]), -1, videoMode);
+
+ if (redPalette[i] != pal_toFadeRed[i] ||
+ greenPalette[i] != pal_toFadeGreen[i] ||
+ bluePalette[i] != pal_toFadeBlue[i])
+ stop = 0;
+ }
+ }
+ return stop;
+ } else if (oper == 1) {
+ stop = 1;
+ for (i = 0; i < 16; i++) {
+ vid_setPalElem(i,
+ pal_fadeColor(redPalette[i], pal_toFadeRed[i]),
+ greenPalette[i], bluePalette[i], -1, videoMode);
+
+ if (redPalette[i] != pal_toFadeRed[i])
+ stop = 0;
+ }
+ return stop;
+ } else if (oper == 2) {
+ stop = 1;
+ for (i = 0; i < 16; i++) {
+ vid_setPalElem(i,
+ redPalette[i],
+ pal_fadeColor(greenPalette[i], pal_toFadeGreen[i]),
+ bluePalette[i], -1, videoMode);
+
+ if (greenPalette[i] != pal_toFadeGreen[i])
+ stop = 0;
+ }
+ return stop;
+ } else if (oper == 3) {
+ stop = 1;
+ for (i = 0; i < 16; i++) {
+ vid_setPalElem(i,
+ redPalette[i],
+ greenPalette[i],
+ pal_fadeColor(bluePalette[i], pal_toFadeBlue[i]),
+ -1, videoMode);
+
+ if (bluePalette[i] != pal_toFadeBlue[i])
+ stop = 0;
+ }
+ return stop;
+ }
+ return 1;
+}
+
+void pal_fade(PalDesc * palDesc, int16 fade, int16 allColors) {
+ char stop;
+ int16 i;
+
+ if (fade < 0)
+ pal_fadeValue = -fade;
+ else
+ pal_fadeValue = 2;
+
+ if (colorCount < 256) {
+ if (palDesc != 0)
+ vid_setFullPalette(palDesc);
+ return;
+ }
+
+ if (setAllPalette == 0) {
+ if (palDesc == 0) {
+ for (i = 0; i < 16; i++) {
+ pal_toFadeRed[i] = 0;
+ pal_toFadeGreen[i] = 0;
+ pal_toFadeBlue[i] = 0;
+ }
+ } else {
+ for (i = 0; i < 16; i++) {
+ pal_toFadeRed[i] = palDesc->vgaPal[i].red;
+ pal_toFadeGreen[i] = palDesc->vgaPal[i].green;
+ pal_toFadeBlue[i] = palDesc->vgaPal[i].blue;
+ }
+ }
+ } else {
+ if (inVM != 0)
+ error("pal_fade: inVM != 0 is not supported");
+
+ if (palDesc == 0) {
+ for (i = 0; i < 256; i++) {
+ pal_toFadeRed[i] = 0;
+ pal_toFadeGreen[i] = 0;
+ pal_toFadeBlue[i] = 0;
+ }
+ } else {
+ for (i = 0; i < 256; i++) {
+ pal_toFadeRed[i] = palDesc->vgaPal[i].red;
+ pal_toFadeGreen[i] = palDesc->vgaPal[i].green;
+ pal_toFadeBlue[i] = palDesc->vgaPal[i].blue;
+ }
+ }
+ }
+
+ if (allColors == 0) {
+
+ do {
+ if (tmpPalBuffer == 0)
+ vid_waitRetrace(videoMode);
+
+ stop = pal_fadeStep(0);
+
+ if (fade > 0)
+ util_delay(fade);
+ } while (stop == 0);
+
+ if (palDesc != 0)
+ vid_setFullPalette(palDesc);
+ else
+ util_clearPalette();
+ }
+
+ if (allColors == 1) {
+
+ do {
+ vid_waitRetrace(videoMode);
+ stop = pal_fadeStep(1);
+ } while (stop == 0);
+
+ do {
+ vid_waitRetrace(videoMode);
+ stop = pal_fadeStep(2);
+ } while (stop == 0);
+
+ do {
+ vid_waitRetrace(videoMode);
+ stop = pal_fadeStep(3);
+ } while (stop == 0);
+
+ if (palDesc != 0)
+ vid_setFullPalette(palDesc);
+ else
+ util_clearPalette();
+ }
+
+ if (tmpPalBuffer != 0) {
+ free((char *)tmpPalBuffer);
+ tmpPalBuffer = 0;
+ }
+}
+
+} // End of namespace Gob