aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorTorbjörn Andersson2008-11-09 14:32:24 +0000
committerTorbjörn Andersson2008-11-09 14:32:24 +0000
commitd896c892e5e78614b2faec9c175cfd1330a0bc55 (patch)
tree785adb7a8b7c6f365cc41a199914d12354c24f85 /engines
parent2e9e68fc8e1ebcfd017500165f64b97c6b6a72a8 (diff)
downloadscummvm-rg350-d896c892e5e78614b2faec9c175cfd1330a0bc55.tar.gz
scummvm-rg350-d896c892e5e78614b2faec9c175cfd1330a0bc55.tar.bz2
scummvm-rg350-d896c892e5e78614b2faec9c175cfd1330a0bc55.zip
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
Diffstat (limited to 'engines')
-rw-r--r--engines/sword2/palette.cpp13
-rw-r--r--engines/sword2/screen.cpp14
-rw-r--r--engines/sword2/screen.h2
-rw-r--r--engines/sword2/sword2.cpp48
-rw-r--r--engines/sword2/sword2.h2
5 files changed, 46 insertions, 33 deletions
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();