diff options
author | Martin Kiewitz | 2010-06-20 18:20:05 +0000 |
---|---|---|
committer | Martin Kiewitz | 2010-06-20 18:20:05 +0000 |
commit | 3c6639eb86e8328af84c190878b09c331fe4c1ac (patch) | |
tree | 8731a58e4dc5635b37140bfe3564db8abd7f3b4e /engines/sci/graphics | |
parent | ff785325ad3527394cec06fbd9dc331854e97f30 (diff) | |
download | scummvm-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.cpp | 47 | ||||
-rw-r--r-- | engines/sci/graphics/palette.h | 9 |
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; }; |