diff options
author | Eugene Sandulenko | 2005-04-05 15:07:40 +0000 |
---|---|---|
committer | Eugene Sandulenko | 2005-04-05 15:07:40 +0000 |
commit | 1758c5b211a39c29a193546348e7cc6e7bc2e8c9 (patch) | |
tree | 225d803c62c79d6a6d95ada0096e8832e9e65044 /gob/palanim.cpp | |
parent | b399a052f1a60df4731aa15d330e1c0b759ed857 (diff) | |
download | scummvm-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.cpp | 224 |
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 |