From dac35ac1cc2f94022ba3435b4231b9dd4ac8d60f Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 4 Mar 2012 20:24:54 +1100 Subject: TSAGE: Some cleanup of R2R Animation Player, and fix for playing when objects are active --- engines/tsage/ringworld2/ringworld2_logic.cpp | 38 +++++++++++----- engines/tsage/ringworld2/ringworld2_logic.h | 5 ++- engines/tsage/ringworld2/ringworld2_scenes0.cpp | 58 ++++++++++++------------- engines/tsage/ringworld2/ringworld2_scenes0.h | 2 +- 4 files changed, 62 insertions(+), 41 deletions(-) (limited to 'engines/tsage') diff --git a/engines/tsage/ringworld2/ringworld2_logic.cpp b/engines/tsage/ringworld2/ringworld2_logic.cpp index 4cfcc29d24..a06899fe5a 100644 --- a/engines/tsage/ringworld2/ringworld2_logic.cpp +++ b/engines/tsage/ringworld2/ringworld2_logic.cpp @@ -1623,7 +1623,7 @@ AnimationPlayer::AnimationPlayer(): EventHandler() { _screenBounds = R2_GLOBALS._gfxManagerInstance._bounds; _rect1 = R2_GLOBALS._gfxManagerInstance._bounds; - _paletteMode = 0; + _paletteMode = ANIMPALMODE_REPLACE_PALETTE; _field3A = 1; _sliceHeight = 1; _field58 = 1; @@ -1709,7 +1709,7 @@ bool AnimationPlayer::load(int animId, Action *endAction) { debugC(1, ktSageDebugGraphics, "Data needed %d", _dataNeeded); - // Set up animation data array + // Set up animation data objects _animData1 = new AnimationData(); _sliceCurrent = _animData1; @@ -1737,21 +1737,25 @@ bool AnimationPlayer::load(int animId, Action *endAction) { // Handle starting palette switch (_paletteMode) { - case 0: - // Use existing active palette + case ANIMPALMODE_REPLACE_PALETTE: + // Use the palette provided with the animation directly _palette.getPalette(); for (int idx = _subData._palStart; idx < (_subData._palStart + _subData._palSize); ++idx) { - uint r, g, b; - _palette.getEntry(idx, &r, &g, &b); + byte r = _subData._palData[idx * 3]; + byte g = _subData._palData[idx * 3 + 1]; + byte b = _subData._palData[idx * 3 + 2]; + R2_GLOBALS._scenePalette.setEntry(idx, r, g, b); } R2_GLOBALS._sceneManager._hasPalette = true; break; - case 2: + case ANIMPALMODE_NONE: break; default: + // ANIMPALMODE_CURR_PALETTE + // Use the closest matching colours in the currently active palette to those specified in the animation for (int idx = _subData._palStart; idx < (_subData._palStart + _subData._palSize); ++idx) { byte r = _subData._palData[idx * 3]; byte g = _subData._palData[idx * 3 + 1]; @@ -1858,12 +1862,26 @@ void AnimationPlayer::drawFrame(int sliceIndex) { break; } - if (_field56 == 42) { + // Unlock the screen surface + R2_GLOBALS._screenSurface.unlockSurface(); + + if (_objectMode == 42) { _screenBounds.expandPanes(); + + // Copy the drawn frame to the back surface + Rect srcRect = R2_GLOBALS._screenSurface.getBounds(); + Rect destRect = srcRect; + destRect.translate(-g_globals->_sceneOffset.x, -g_globals->_sceneOffset.y); + R2_GLOBALS._sceneManager._scene->_backSurface.copyFrom(R2_GLOBALS._screenSurface, + srcRect, destRect); + + // Draw any objects into the scene R2_GLOBALS._sceneObjects->draw(); } else { - if (R2_GLOBALS._sceneManager._hasPalette) + if (R2_GLOBALS._sceneManager._hasPalette) { + R2_GLOBALS._sceneManager._hasPalette = false; R2_GLOBALS._scenePalette.refresh(); + } } } @@ -1916,7 +1934,7 @@ void AnimationPlayer::close() { // Close the resource file _resourceFile.close(); - if (_field56 != 42) { + if (_objectMode != 42) { // flip screen in original } diff --git a/engines/tsage/ringworld2/ringworld2_logic.h b/engines/tsage/ringworld2/ringworld2_logic.h index b63c0ac2a7..0b573bf7f0 100644 --- a/engines/tsage/ringworld2/ringworld2_logic.h +++ b/engines/tsage/ringworld2/ringworld2_logic.h @@ -375,6 +375,9 @@ public: int _animSlicesSize; }; +enum AnimationPaletteMode { ANIMPALMODE_REPLACE_PALETTE = 0, ANIMPALMODE_CURR_PALETTE = 1, + ANIMPALMODE_NONE = 2 }; + class AnimationPlayer: public EventHandler { private: void rleDecode(const byte *pSrc, byte *pDest, int size); @@ -390,7 +393,7 @@ public: Rect _rect1, _screenBounds; int _field38; int _field3A, _paletteMode; - int _field56; + int _objectMode; int _field58, _sliceHeight; byte _palIndexes[256]; ScenePalette _palette; diff --git a/engines/tsage/ringworld2/ringworld2_scenes0.cpp b/engines/tsage/ringworld2/ringworld2_scenes0.cpp index 94a119338a..4c98fcf00a 100644 --- a/engines/tsage/ringworld2/ringworld2_scenes0.cpp +++ b/engines/tsage/ringworld2/ringworld2_scenes0.cpp @@ -1549,18 +1549,18 @@ void Scene180::signal() { switch (_sceneMode++) { case 0: - setFrameInc(6); + setSceneDelay(6); break; case 1: _field412 = 1; R2_GLOBALS._sceneManager._hasPalette = true; - _animationPlayer._paletteMode = 2; + _animationPlayer._paletteMode = ANIMPALMODE_NONE; _animationPlayer._v = 1; - _animationPlayer._field56 = 1; + _animationPlayer._objectMode = 1; R2_GLOBALS._scene180Mode = 1; - _animationPlayer.load(1, NULL); + _animationPlayer.load(1); R2_GLOBALS._scenePalette.loadPalette(_animationPlayer._subData._palData, 0, 256); R2_GLOBALS._sound1.play(1); @@ -1571,9 +1571,9 @@ void Scene180::signal() { R2_GLOBALS._paneRefreshFlag[0] = 3; if (R2_GLOBALS._sound1.isPlaying()) { - setFrameInc(1); + setSceneDelay(1); } else { - setFrameInc(180); + setSceneDelay(180); } break; @@ -1583,7 +1583,7 @@ void Scene180::signal() { if (R2_GLOBALS._sound1.isPlaying()) _sceneMode = 3; - setFrameInc(1); + setSceneDelay(1); break; case 4: @@ -1598,9 +1598,9 @@ void Scene180::signal() { break; case 5: - _animationPlayer._paletteMode = 2; + _animationPlayer._paletteMode = ANIMPALMODE_NONE; _animationPlayer._v = 1; - _animationPlayer._field56 = 1; + _animationPlayer._objectMode = 1; R2_GLOBALS._scene180Mode = 2; _animationPlayer.load(2); @@ -1614,9 +1614,9 @@ void Scene180::signal() { R2_GLOBALS._paneRefreshFlag[0] = 3; if (R2_GLOBALS._sound1.isPlaying()) { - setFrameInc(1); + setSceneDelay(1); } else { - setFrameInc(180); + setSceneDelay(180); } break; @@ -1625,19 +1625,19 @@ void Scene180::signal() { R2_GLOBALS._scene180Mode = 2; if (R2_GLOBALS._sound1.isPlaying()) _sceneMode = 7; - setFrameInc(1); + setSceneDelay(1); break; case 9: R2_GLOBALS._sound1.play(3); clearScreen(); - setFrameInc(2); + setSceneDelay(2); break; case 10: loadScene(4002); R2_GLOBALS._scenePalette.loadPalette(0); - setFrameInc(6); + setSceneDelay(6); break; case 11: @@ -1656,7 +1656,7 @@ void Scene180::signal() { case 24: case 26: case 46: - setFrameInc((R2_GLOBALS._speechSubtitles & 1) ? 1 : 18); + setSceneDelay((R2_GLOBALS._speechSubtitles & 1) ? 1 : 18); break; case 13: @@ -1691,7 +1691,7 @@ void Scene180::signal() { _field412 = 0; _object4.remove(); _object5.remove(); - setFrameInc(2); + setSceneDelay(2); break; case 28: @@ -1703,9 +1703,9 @@ void Scene180::signal() { case 29: _field412 = 1; - _animationPlayer._paletteMode = 0; + _animationPlayer._paletteMode = ANIMPALMODE_REPLACE_PALETTE; _animationPlayer._v = 1; - _animationPlayer._field56 = 42; + _animationPlayer._objectMode = 42; R2_GLOBALS._scene180Mode = 3; _animationPlayer.load(3); break; @@ -1727,7 +1727,7 @@ void Scene180::signal() { if (R2_GLOBALS._sceneManager._hasPalette) R2_GLOBALS._scenePalette.refresh(); - setFrameInc(6); + setSceneDelay(6); break; case 32: @@ -1799,19 +1799,19 @@ void Scene180::signal() { case 39: R2_GLOBALS._sound1.changeSound(8); - setFrameInc(1); + setSceneDelay(1); break; case 40: - _animationPlayer._paletteMode = 2; - _animationPlayer._field56 = 1; + _animationPlayer._paletteMode = ANIMPALMODE_NONE; + _animationPlayer._objectMode = 1; R2_GLOBALS._scene180Mode = 4; if (_animationPlayer.load(4)) { _animationPlayer.dispatch(); R2_GLOBALS._scenePalette.addFader(_animationPlayer._subData._palData, 256, 8, this); } else { _sceneMode = 43; - setFrameInc(1); + setSceneDelay(1); } break; @@ -1823,7 +1823,7 @@ void Scene180::signal() { case 42: R2_GLOBALS._scene180Mode = 4; R2_GLOBALS._paneRefreshFlag[0] = 3; - setFrameInc(1); + setSceneDelay(1); break; case 44: @@ -1832,7 +1832,7 @@ void Scene180::signal() { if (R2_GLOBALS._sceneManager._hasPalette) R2_GLOBALS._scenePalette.refresh(); - setFrameInc(6); + setSceneDelay(6); break; case 45: @@ -1841,9 +1841,9 @@ void Scene180::signal() { case 48: _field412 = 1; - _animationPlayer._paletteMode = 2; + _animationPlayer._paletteMode = ANIMPALMODE_NONE; _animationPlayer._v = 1; - _animationPlayer._field56 = 1; + _animationPlayer._objectMode = 1; R2_GLOBALS._scene180Mode = 15; _animationPlayer.load(15, NULL); @@ -1854,7 +1854,7 @@ void Scene180::signal() { case 49: R2_GLOBALS._scene180Mode = 15; R2_GLOBALS._paneRefreshFlag[0] = 3; - setFrameInc(1); + setSceneDelay(1); break; case 50: @@ -1865,7 +1865,7 @@ void Scene180::signal() { } } -void Scene180::setFrameInc(int v) { +void Scene180::setSceneDelay(int v) { _frameInc = v; _frameNumber = R2_GLOBALS._events.getFrameNumber(); } diff --git a/engines/tsage/ringworld2/ringworld2_scenes0.h b/engines/tsage/ringworld2/ringworld2_scenes0.h index e39efbca3d..2f52f9578f 100644 --- a/engines/tsage/ringworld2/ringworld2_scenes0.h +++ b/engines/tsage/ringworld2/ringworld2_scenes0.h @@ -195,7 +195,7 @@ class Scene180: public SceneExt { void signal(); }; private: - void setFrameInc(int v); + void setSceneDelay(int v); public: SpeakerWebbster _webbsterSpeaker; SpeakerDutyOfficer _dutyOfficerSpeaker; -- cgit v1.2.3