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  | 
