From d896c892e5e78614b2faec9c175cfd1330a0bc55 Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Sun, 9 Nov 2008 14:32:24 +0000 Subject: Allow pausing (from the outside) during credits and palette fades. Refactored the code to distinguish outside pausing from in-game pausing, to avoid cursor-related problems. The screen is now only dimmed during in-game pausing. svn-id: r34957 --- engines/sword2/palette.cpp | 13 ++++++++----- engines/sword2/screen.cpp | 14 ++++++++------ engines/sword2/screen.h | 2 ++ engines/sword2/sword2.cpp | 48 +++++++++++++++++++++++++--------------------- engines/sword2/sword2.h | 2 ++ 5 files changed, 46 insertions(+), 33 deletions(-) (limited to 'engines') diff --git a/engines/sword2/palette.cpp b/engines/sword2/palette.cpp index b020359e36..35a7aea11d 100644 --- a/engines/sword2/palette.cpp +++ b/engines/sword2/palette.cpp @@ -164,8 +164,11 @@ void Screen::setPalette(int16 startEntry, int16 noEntries, byte *colourTable, ui void Screen::dimPalette(bool dim) { if (dim != _dimPalette) { _dimPalette = dim; - setSystemPalette(_palette, 0, 256); - setNeedFullRedraw(); + // If the palette is in the middle of fading, don't update it. + if (_fadeStatus != RDFADE_DOWN && _fadeStatus != RDFADE_UP) { + setSystemPalette(_palette, 0, 256); + setNeedFullRedraw(); + } } } @@ -180,7 +183,7 @@ int32 Screen::fadeUp(float time) { _fadeTotalTime = (int32)(time * 1000); _fadeStatus = RDFADE_UP; - _fadeStartTime = _vm->_system->getMillis(); + _fadeStartTime = getTick(); return RD_OK; } @@ -196,7 +199,7 @@ int32 Screen::fadeDown(float time) { _fadeTotalTime = (int32)(time * 1000); _fadeStatus = RDFADE_DOWN; - _fadeStartTime = _vm->_system->getMillis(); + _fadeStartTime = getTick(); return RD_OK; } @@ -232,7 +235,7 @@ void Screen::fadeServer() { // I don't know if this is necessary, but let's limit how often the // palette is updated, just to be safe. - currentTime = _vm->_system->getMillis(); + currentTime = getTick(); if (currentTime - previousTime <= 25) return; diff --git a/engines/sword2/screen.cpp b/engines/sword2/screen.cpp index 871e55a647..d793e46192 100644 --- a/engines/sword2/screen.cpp +++ b/engines/sword2/screen.cpp @@ -111,6 +111,10 @@ Screen::~Screen() { free(_lightMask); } +uint32 Screen::getTick() { + return _vm->getMillis() - _pauseTicks; +} + void Screen::pauseScreen(bool pause) { if (pause) { _pauseStartTick = _vm->_system->getMillis(); @@ -323,10 +327,10 @@ void Screen::buildDisplay() { updateDisplay(); _frameCount++; - if (_vm->getMillis() > _cycleTime) { + if (getTick() > _cycleTime) { _fps = _frameCount; _frameCount = 0; - _cycleTime = _vm->getMillis() + 1000; + _cycleTime = getTick() + 1000; } } while (!endRenderCycle()); @@ -397,7 +401,7 @@ void Screen::displayMsg(byte *text, int time) { waitForFade(); if (time > 0) { - uint32 targetTime = _vm->getMillis() + (time * 1000); + uint32 targetTime = _vm->_system->getMillis() + (time * 1000); _vm->sleepUntil(targetTime); } else { while (!_vm->shouldQuit()) { @@ -1038,9 +1042,7 @@ void Screen::rollCredits() { bool abortCredits = false; int scrollSteps = lineTop + CREDITS_FONT_HEIGHT; - uint32 musicStart = _vm->getMillis(); - - _pauseTicks = 0; + uint32 musicStart = getTick(); // Ideally the music should last just a tiny bit longer than the // credits. Note that musicTimeRemaining() will return 0 if the music diff --git a/engines/sword2/screen.h b/engines/sword2/screen.h index 9971ad312c..608fb0c686 100644 --- a/engines/sword2/screen.h +++ b/engines/sword2/screen.h @@ -355,6 +355,8 @@ private: uint32 _pauseTicks; uint32 _pauseStartTick; + uint32 getTick(); + public: Screen(Sword2Engine *vm, int16 width, int16 height); ~Screen(); diff --git a/engines/sword2/sword2.cpp b/engines/sword2/sword2.cpp index 7220151267..d8ebbf99d3 100644 --- a/engines/sword2/sword2.cpp +++ b/engines/sword2/sword2.cpp @@ -451,7 +451,7 @@ Common::Error Sword2Engine::go() { #ifdef SWORD2_DEBUG if (_stepOneCycle) { - pauseEngineIntern(true); + pauseEngine(true); _stepOneCycle = false; } #endif @@ -465,9 +465,9 @@ Common::Error Sword2Engine::go() { switch (ke->kbd.keycode) { case Common::KEYCODE_p: if (_gamePaused) - pauseEngineIntern(false); + pauseEngine(false); else - pauseEngineIntern(true); + pauseEngine(true); break; case Common::KEYCODE_c: if (!_logic->readVar(DEMO) && !_mouse->isChoosing()) { @@ -480,7 +480,7 @@ Common::Error Sword2Engine::go() { case Common::KEYCODE_SPACE: if (_gamePaused) { _stepOneCycle = true; - pauseEngineIntern(false); + pauseEngine(false); } break; case Common::KEYCODE_s: @@ -741,19 +741,13 @@ void Sword2Engine::sleepUntil(uint32 time) { } } -void Sword2Engine::pauseEngineIntern(bool pause) { - if (pause) { - // FIXME: We should never disallow pausing. +void Sword2Engine::pauseEngine(bool pause) { + if (pause == _gamePaused) + return; - // Don't allow Pause while screen fading or while black - if (_screen->getFadeStatus() != RDFADE_NONE) - return; - - _sound->pauseAllSound(); - _mouse->pauseEngine(true); - _logic->pauseMovie(true); - _screen->pauseScreen(true); + pauseEngineIntern(pause); + if (pause) { #ifdef SWORD2_DEBUG // Don't dim it if we're single-stepping through frames // dim the palette during the pause @@ -763,21 +757,31 @@ void Sword2Engine::pauseEngineIntern(bool pause) { #else _screen->dimPalette(true); #endif + } else { + _screen->dimPalette(false); + + // If mouse is about or we're in a chooser menu + if (!_mouse->getMouseStatus() || _mouse->isChoosing()) + _mouse->setMouse(NORMAL_MOUSE_ID); + } +} + +void Sword2Engine::pauseEngineIntern(bool pause) { + if (pause == _gamePaused) + return; + if (pause) { + _sound->pauseAllSound(); + _mouse->pauseEngine(true); + _logic->pauseMovie(true); + _screen->pauseScreen(true); _gamePaused = true; } else { _mouse->pauseEngine(false); _logic->pauseMovie(false); _screen->pauseScreen(false); _sound->unpauseAllSound(); - - _screen->dimPalette(false); - _gamePaused = false; - - // If mouse is about or we're in a chooser menu - if (!_mouse->getMouseStatus() || _mouse->isChoosing()) - _mouse->setMouse(NORMAL_MOUSE_ID); } } diff --git a/engines/sword2/sword2.h b/engines/sword2/sword2.h index cb2a8d5b80..8cff53ffa1 100644 --- a/engines/sword2/sword2.h +++ b/engines/sword2/sword2.h @@ -135,6 +135,8 @@ public: Sword2Engine(OSystem *syst); ~Sword2Engine(); + void pauseEngine(bool pause); + int getFramesPerSecond(); void registerDefaultSettings(); -- cgit v1.2.3