diff options
author | Paul Gilbert | 2018-03-04 18:40:25 -0500 |
---|---|---|
committer | Paul Gilbert | 2018-03-04 22:40:43 -0500 |
commit | b6b9714ec02aa4b927ace42cb9699de899494f91 (patch) | |
tree | 45b4671a63cc2095f9b59919aa92038e9817a541 /engines | |
parent | 67d4de1bb818b2cfc628549ba38cc4f00b8236b2 (diff) | |
download | scummvm-rg350-b6b9714ec02aa4b927ace42cb9699de899494f91.tar.gz scummvm-rg350-b6b9714ec02aa4b927ace42cb9699de899494f91.tar.bz2 scummvm-rg350-b6b9714ec02aa4b927ace42cb9699de899494f91.zip |
XEEN: Fix scroll effect for Clouds of Xeen main menu
Diffstat (limited to 'engines')
-rw-r--r-- | engines/xeen/cutscenes.cpp | 94 | ||||
-rw-r--r-- | engines/xeen/screen.cpp | 96 | ||||
-rw-r--r-- | engines/xeen/screen.h | 8 | ||||
-rw-r--r-- | engines/xeen/worldofxeen/worldofxeen_menu.cpp | 5 |
4 files changed, 109 insertions, 94 deletions
diff --git a/engines/xeen/cutscenes.cpp b/engines/xeen/cutscenes.cpp index 05d9fa7b93..1be9cc30da 100644 --- a/engines/xeen/cutscenes.cpp +++ b/engines/xeen/cutscenes.cpp @@ -116,99 +116,7 @@ uint Cutscenes::getSpeakingFrame(uint minFrame, uint maxFrame) { } bool Cutscenes::doScroll(bool rollUp, bool fadeIn) { - Screen &screen = *_vm->_screen; - EventsManager &events = *_vm->_events; - const int SCROLL_L[8] = { 29, 23, 15, -5, -11, -23, -49, -71 }; - const int SCROLL_R[8] = { 165, 171, 198, 218, 228, 245, 264, 281 }; - - if (_vm->_files->_isDarkCc) { - if (fadeIn) - screen.fadeIn(2); - return _vm->shouldExit(); - } - - screen.saveBackground(); - - // Load hand sprites - SpriteResource *hand[16]; - for (int i = 0; i < 16; ++i) { - Common::String name = Common::String::format("hand%02d.vga", i); - hand[i] = new SpriteResource(name); - } - - // Load marb sprites - SpriteResource *marb[5]; - for (int i = 0; i < 4; ++i) { - Common::String name = Common::String::format("marb%02d.vga", i + 1); - marb[i] = new SpriteResource(name); - } - - if (rollUp) { - for (int i = 22, ctr = 7; i > 0 && !events.isKeyMousePressed() - && !_vm->shouldExit(); --i) { - events.updateGameCounter(); - screen.restoreBackground(); - - if (i > 14) { - hand[14]->draw(0, 0, Common::Point(SCROLL_L[ctr], 0), SPRFLAG_800); - hand[15]->draw(0, 0, Common::Point(SCROLL_R[ctr], 0), SPRFLAG_800); - --ctr; - } else if (i != 0) { - hand[i - 1]->draw(0, 0); - } - - if (i <= 20) - marb[(i - 1) / 5]->draw(0, (i - 1) % 5); - screen.update(); - - while (!_vm->shouldExit() && events.timeElapsed() == 0) - events.pollEventsAndWait(); - - if (i == 0 && fadeIn) - screen.fadeIn(2); - } - } else { - for (int i = 0, ctr = 0; i < 22 && !events.isKeyMousePressed() - && !_vm->shouldExit(); ++i) { - events.updateGameCounter(); - screen.restoreBackground(); - - if (i < 14) { - hand[i]->draw(0, 0); - } else { - hand[14]->draw(0, 0, Common::Point(SCROLL_L[ctr], 0), SPRFLAG_800); - hand[15]->draw(0, 0, Common::Point(SCROLL_R[ctr], 0), SPRFLAG_800); - ++ctr; - } - - if (i < 20) { - marb[i / 5]->draw(0, i % 5); - } - screen.update(); - - while (!_vm->shouldExit() && events.timeElapsed() == 0) - events.pollEventsAndWait(); - - if (i == 0 && fadeIn) - screen.fadeIn(2); - } - } - - if (rollUp) { - hand[0]->draw(0, 0); - marb[0]->draw(0, 0); - } else { - screen.restoreBackground(); - } - screen.update(); - - // Free resources - for (int i = 0; i < 4; ++i) - delete marb[i]; - for (int i = 0; i < 16; ++i) - delete hand[i]; - - return _vm->shouldExit() || events.isKeyMousePressed(); + return _vm->_screen->doScroll(rollUp, fadeIn); } } // End of namespace Xeen diff --git a/engines/xeen/screen.cpp b/engines/xeen/screen.cpp index 2c92ee14c4..8dc7ec82dd 100644 --- a/engines/xeen/screen.cpp +++ b/engines/xeen/screen.cpp @@ -163,4 +163,100 @@ void Screen::restoreBackground(int slot) { blitFrom(_savedScreens[slot - 1]); } +bool Screen::doScroll(bool rollUp, bool fadeIn) { + Screen &screen = *_vm->_screen; + EventsManager &events = *_vm->_events; + const int SCROLL_L[8] = { 29, 23, 15, -5, -11, -23, -49, -71 }; + const int SCROLL_R[8] = { 165, 171, 198, 218, 228, 245, 264, 281 }; + + if (_vm->_files->_isDarkCc) { + if (fadeIn) + screen.fadeIn(2); + return _vm->shouldExit(); + } + + screen.saveBackground(); + + // Load hand sprites + SpriteResource *hand[16]; + for (int i = 0; i < 16; ++i) { + Common::String name = Common::String::format("hand%02d.vga", i); + hand[i] = new SpriteResource(name); + } + + // Load marb sprites + SpriteResource *marb[5]; + for (int i = 0; i < 4; ++i) { + Common::String name = Common::String::format("marb%02d.vga", i + 1); + marb[i] = new SpriteResource(name); + } + + if (rollUp) { + for (int i = 22, ctr = 7; i > 0 && !events.isKeyMousePressed() + && !_vm->shouldExit(); --i) { + events.updateGameCounter(); + screen.restoreBackground(); + + if (i > 14) { + hand[14]->draw(0, 0, Common::Point(SCROLL_L[ctr], 0), SPRFLAG_800); + hand[15]->draw(0, 0, Common::Point(SCROLL_R[ctr], 0), SPRFLAG_800); + --ctr; + } else if (i != 0) { + hand[i - 1]->draw(0, 0); + } + + if (i <= 20) + marb[(i - 1) / 5]->draw(0, (i - 1) % 5); + screen.update(); + + while (!_vm->shouldExit() && events.timeElapsed() == 0) + events.pollEventsAndWait(); + + if (i == 0 && fadeIn) + screen.fadeIn(2); + } + } else { + for (int i = 0, ctr = 0; i < 22 && !events.isKeyMousePressed() + && !_vm->shouldExit(); ++i) { + events.updateGameCounter(); + screen.restoreBackground(); + + if (i < 14) { + hand[i]->draw(0, 0); + } else { + hand[14]->draw(0, 0, Common::Point(SCROLL_L[ctr], 0), SPRFLAG_800); + hand[15]->draw(0, 0, Common::Point(SCROLL_R[ctr], 0), SPRFLAG_800); + ++ctr; + } + + if (i < 20) { + marb[i / 5]->draw(0, i % 5); + } + screen.update(); + + while (!_vm->shouldExit() && events.timeElapsed() == 0) + events.pollEventsAndWait(); + + if (i == 0 && fadeIn) + screen.fadeIn(2); + } + } + + if (rollUp) { + hand[0]->draw(0, 0); + marb[0]->draw(0, 0); + } else { + screen.restoreBackground(); + } + screen.update(); + + // Free resources + for (int i = 0; i < 4; ++i) + delete marb[i]; + for (int i = 0; i < 16; ++i) + delete hand[i]; + + return _vm->shouldExit() || events.isKeyMousePressed(); +} + } // End of namespace Xeen diff --git a/engines/xeen/screen.h b/engines/xeen/screen.h index 5028b505f0..3e7f23e19e 100644 --- a/engines/xeen/screen.h +++ b/engines/xeen/screen.h @@ -112,6 +112,14 @@ public: * Restores a previously saved screen */ void restoreBackground(int slot = 1); + + /** + * Draws the scroll in the background + * @param rollUp If true, rolls up the scroll. If false, unrolls. + * @param fadeIn If true, does an initial fade in + * @returns True if key or mouse pressed + */ + bool doScroll(bool rollUp, bool fadeIn); }; } // End of namespace Xeen diff --git a/engines/xeen/worldofxeen/worldofxeen_menu.cpp b/engines/xeen/worldofxeen/worldofxeen_menu.cpp index 4797309a9f..356bb8c3e3 100644 --- a/engines/xeen/worldofxeen/worldofxeen_menu.cpp +++ b/engines/xeen/worldofxeen/worldofxeen_menu.cpp @@ -70,6 +70,7 @@ void MainMenuContainer::draw() { void MainMenuContainer::execute() { EventsManager &events = *g_vm->_events; + Screen &screen = *g_vm->_screen; bool showFlag = false; // Show the cursor @@ -77,6 +78,8 @@ void MainMenuContainer::execute() { events.setCursor(0); events.showCursor(); + screen.doScroll(true, false); + while (!g_vm->shouldExit() && g_vm->_gameMode == GMODE_NONE) { // Draw the menu draw(); @@ -86,7 +89,7 @@ void MainMenuContainer::execute() { // Fade/scroll in screen if first frame if (!showFlag) { loadBackground(); - // TODO: doScroll(false, false); + screen.doScroll(false, false); showFlag = true; } |