aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/graphics
diff options
context:
space:
mode:
authorMartin Kiewitz2010-06-20 18:20:05 +0000
committerMartin Kiewitz2010-06-20 18:20:05 +0000
commit3c6639eb86e8328af84c190878b09c331fe4c1ac (patch)
tree8731a58e4dc5635b37140bfe3564db8abd7f3b4e /engines/sci/graphics
parentff785325ad3527394cec06fbd9dc331854e97f30 (diff)
downloadscummvm-rg350-3c6639eb86e8328af84c190878b09c331fe4c1ac.tar.gz
scummvm-rg350-3c6639eb86e8328af84c190878b09c331fe4c1ac.tar.bz2
scummvm-rg350-3c6639eb86e8328af84c190878b09c331fe4c1ac.zip
SCI: implemented kPalVary(reverse) for pharkas, although there is a bug somewhere, not working 100%
svn-id: r50089
Diffstat (limited to 'engines/sci/graphics')
-rw-r--r--engines/sci/graphics/palette.cpp47
-rw-r--r--engines/sci/graphics/palette.h9
2 files changed, 39 insertions, 17 deletions
diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp
index f4222fabdd..94e847014f 100644
--- a/engines/sci/graphics/palette.cpp
+++ b/engines/sci/graphics/palette.cpp
@@ -486,9 +486,16 @@ void GfxPalette::palVaryInit() {
_palVaryStep = 0;
_palVaryStepStop = 0;
_palVaryDirection = 0;
+ _palVaryTicks = 0;
}
-bool GfxPalette::kernelPalVaryInit(GuiResourceId resourceId, uint16 ticks, uint16 stepStop, int16 direction) {
+void GfxPalette::palVaryInstallTimer() {
+ int16 ticks = _palVaryTicks > 0 ? _palVaryTicks : 1;
+ // Call signal increase every [ticks]
+ g_sci->getTimerManager()->installTimerProc(&palVaryCallback, 1000000 / 60 * ticks, this);
+}
+
+bool GfxPalette::kernelPalVaryInit(GuiResourceId resourceId, uint16 ticks, uint16 stepStop, uint16 direction) {
//kernelSetFromResource(resourceId, true);
//return;
if (_palVaryResourceId != -1) // another palvary is taking place, return
@@ -503,21 +510,36 @@ bool GfxPalette::kernelPalVaryInit(GuiResourceId resourceId, uint16 ticks, uint1
memcpy(&_palVaryOriginPalette, &_sysPalette, sizeof(Palette));
_palVarySignal = 0;
+ _palVaryTicks = ticks;
_palVaryStep = 1;
_palVaryStepStop = stepStop;
_palVaryDirection = direction;
- if (!ticks) {
- // if no ticks are given, jump directly to destination
+ // if no ticks are given, jump directly to destination
+ if (!_palVaryTicks)
_palVaryDirection = stepStop;
- ticks = 1;
- }
- // Call signal increase every [ticks]
- g_sci->getTimerManager()->installTimerProc(&palVaryCallback, 1000000 / 60 * ticks, this);
+ palVaryInstallTimer();
return true;
}
return false;
}
+int16 GfxPalette::kernelPalVaryReverse(int16 ticks, uint16 stepStop, int16 direction) {
+ if (_palVaryResourceId == -1)
+ return 0;
+
+ if (_palVaryStep > 64)
+ _palVaryStep = 64;
+ if (ticks != -1)
+ _palVaryTicks = ticks;
+ _palVaryStepStop = stepStop;
+ _palVaryDirection = direction != -1 ? -direction : -_palVaryDirection;
+
+ if (!_palVaryTicks)
+ _palVaryDirection = _palVaryStepStop - _palVaryStep;
+ palVaryInstallTimer();
+ return kernelPalVaryGetCurrentStep();
+}
+
int16 GfxPalette::kernelPalVaryGetCurrentStep() {
if (_palVaryDirection >= 0)
return _palVaryStep;
@@ -540,9 +562,6 @@ void GfxPalette::kernelPalVaryPause(bool pause) {
void GfxPalette::kernelPalVaryDeinit() {
g_sci->getTimerManager()->removeTimerProc(&palVaryCallback);
- // HACK: just set the target palette
- //kernelSetFromResource(_palVaryResourceId, true);
-
_palVaryResourceId = -1; // invalidate the target palette
}
@@ -573,7 +592,7 @@ void GfxPalette::palVaryProcess(int signal, bool setPalette) {
_palVaryStep = _palVaryStepStop;
} else {
if (_palVaryStep < _palVaryStepStop) {
- if (!signal)
+ if (signal)
_palVaryStep = _palVaryStepStop;
}
}
@@ -588,11 +607,11 @@ void GfxPalette::palVaryProcess(int signal, bool setPalette) {
for (int colorNr = 1; colorNr < 255; colorNr++) {
inbetween.used = _sysPalette.colors[colorNr].used;
color = _palVaryTargetPalette.colors[colorNr].r - _palVaryOriginPalette.colors[colorNr].r;
- inbetween.r = ((color * _palVaryStep) >> 6) + _palVaryOriginPalette.colors[colorNr].r;
+ inbetween.r = ((color * _palVaryStep) / 64) + _palVaryOriginPalette.colors[colorNr].r;
color = _palVaryTargetPalette.colors[colorNr].g - _palVaryOriginPalette.colors[colorNr].g;
- inbetween.g = ((color * _palVaryStep) >> 6) + _palVaryOriginPalette.colors[colorNr].g;
+ inbetween.g = ((color * _palVaryStep) / 64) + _palVaryOriginPalette.colors[colorNr].g;
color = _palVaryTargetPalette.colors[colorNr].b - _palVaryOriginPalette.colors[colorNr].b;
- inbetween.b = ((color * _palVaryStep) >> 6) + _palVaryOriginPalette.colors[colorNr].b;
+ inbetween.b = ((color * _palVaryStep) / 64) + _palVaryOriginPalette.colors[colorNr].b;
if (memcmp(&inbetween, &_sysPalette.colors[colorNr], sizeof(Sci::Color))) {
_sysPalette.colors[colorNr] = inbetween;
diff --git a/engines/sci/graphics/palette.h b/engines/sci/graphics/palette.h
index 7ea231f13b..5fcf1a0412 100644
--- a/engines/sci/graphics/palette.h
+++ b/engines/sci/graphics/palette.h
@@ -62,7 +62,8 @@ public:
void kernelAnimateSet();
void kernelAssertPalette(GuiResourceId resourceId);
- bool kernelPalVaryInit(GuiResourceId resourceId, uint16 ticks, uint16 stopPercentage, int16 direction);
+ bool kernelPalVaryInit(GuiResourceId resourceId, uint16 ticks, uint16 stepStop, uint16 direction);
+ int16 kernelPalVaryReverse(int16 ticks, uint16 stepStop, int16 direction);
int16 kernelPalVaryGetCurrentStep();
void kernelPalVaryPause(bool pause);
void kernelPalVaryDeinit();
@@ -73,6 +74,7 @@ public:
private:
void palVaryInit();
+ void palVaryInstallTimer();
static void palVaryCallback(void *refCon);
void palVaryIncreaseSignal();
@@ -87,9 +89,10 @@ private:
GuiResourceId _palVaryResourceId;
Palette _palVaryOriginPalette;
Palette _palVaryTargetPalette;
- uint16 _palVaryStep;
- uint16 _palVaryStepStop;
+ int16 _palVaryStep;
+ int16 _palVaryStepStop;
int16 _palVaryDirection;
+ uint16 _palVaryTicks;
int _palVaryPaused;
int _palVarySignal;
};