SCI: implemented kPalVary(changeTicks)

svn-id: r50100
This commit is contained in:
Martin Kiewitz 2010-06-20 21:12:15 +00:00
parent 4a83b2c5f6
commit 6f195ae5a4
3 changed files with 27 additions and 8 deletions

View File

@ -673,7 +673,7 @@ reg_t kPalVary(EngineState *s, int argc, reg_t *argv) {
warning("kPalVary(reverse) called with ticks = %d, stop = %d, direction = %d", ticks, stepStop, direction);
return make_reg(0, result);
} else {
warning("kPalVary(1) called with parameter %d (argc %d)", argv[1].toUint16(), argc);
warning("kPalVary(reverse) called with parameter %d (argc %d)", argv[1].toUint16(), argc);
}
}
case 2: { // Get Current Step
@ -694,13 +694,18 @@ reg_t kPalVary(EngineState *s, int argc, reg_t *argv) {
}
break;
}
case 4: { // Unknown
warning("kPalVary(4) called with parameter %d (argc %d)", argv[1].toUint16(), argc);
case 4: { // Change Target
// seems to be 1 parameter, we should find a game that is using this feature before implementing it
warning("kPalVary(changeTarget) called with parameter %d (argc %d)", argv[1].toUint16(), argc);
break;
}
case 5: { // Unknown
// Called in xmas 1992 demo (2 parameters)
warning("kPalVary(5) called with parameter %d (argc %d)", argv[1].toUint16(), argc);
case 5: { // Change ticks
if (argc == 2) {
uint16 ticks = argv[1].toUint16();
g_sci->_gfxPalette->kernelPalVaryChangeTicks(ticks);
} else {
warning("kPalVary(changeTicks) called with parameter %d (argc %d)", argv[1].toUint16(), argc);
}
break;
}
case 6: { // Pause/Resume

View File

@ -519,6 +519,10 @@ void GfxPalette::palVaryInstallTimer() {
g_sci->getTimerManager()->installTimerProc(&palVaryCallback, 1000000 / 60 * ticks, this);
}
void GfxPalette::palVaryRemoveTimer() {
g_sci->getTimerManager()->removeTimerProc(&palVaryCallback);
}
bool GfxPalette::kernelPalVaryInit(GuiResourceId resourceId, uint16 ticks, uint16 stepStop, uint16 direction) {
if (_palVaryResourceId != -1) // another palvary is taking place, return
return false;
@ -564,6 +568,14 @@ int16 GfxPalette::kernelPalVaryGetCurrentStep() {
return -_palVaryStep;
}
void GfxPalette::kernelPalVaryChangeTicks(uint16 ticks) {
_palVaryTicks = ticks;
if (_palVaryStep - _palVaryStepStop) {
palVaryRemoveTimer();
palVaryInstallTimer();
}
}
void GfxPalette::kernelPalVaryPause(bool pause) {
if (_palVaryResourceId == -1)
return;
@ -578,7 +590,7 @@ void GfxPalette::kernelPalVaryPause(bool pause) {
}
void GfxPalette::kernelPalVaryDeinit() {
g_sci->getTimerManager()->removeTimerProc(&palVaryCallback);
palVaryRemoveTimer();
_palVaryResourceId = -1; // invalidate the target palette
}
@ -624,7 +636,7 @@ void GfxPalette::palVaryProcess(int signal, bool setPalette) {
// We don't need updates anymore, if we reached end-position
if (_palVaryStep == _palVaryStepStop)
g_sci->getTimerManager()->removeTimerProc(&palVaryCallback);
palVaryRemoveTimer();
if (_palVaryStep == 0)
_palVaryResourceId = -1;

View File

@ -66,6 +66,7 @@ public:
bool kernelPalVaryInit(GuiResourceId resourceId, uint16 ticks, uint16 stepStop, uint16 direction);
int16 kernelPalVaryReverse(int16 ticks, uint16 stepStop, int16 direction);
int16 kernelPalVaryGetCurrentStep();
void kernelPalVaryChangeTicks(uint16 ticks);
void kernelPalVaryPause(bool pause);
void kernelPalVaryDeinit();
void palVaryUpdate();
@ -77,6 +78,7 @@ public:
private:
void palVaryInit();
void palVaryInstallTimer();
void palVaryRemoveTimer();
bool palVaryLoadTargetPalette(GuiResourceId resourceId);
static void palVaryCallback(void *refCon);
void palVaryIncreaseSignal();