aboutsummaryrefslogtreecommitdiff
path: root/engines/xeen
diff options
context:
space:
mode:
authorPaul Gilbert2018-03-04 18:40:25 -0500
committerPaul Gilbert2018-03-04 22:40:43 -0500
commitb6b9714ec02aa4b927ace42cb9699de899494f91 (patch)
tree45b4671a63cc2095f9b59919aa92038e9817a541 /engines/xeen
parent67d4de1bb818b2cfc628549ba38cc4f00b8236b2 (diff)
downloadscummvm-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/xeen')
-rw-r--r--engines/xeen/cutscenes.cpp94
-rw-r--r--engines/xeen/screen.cpp96
-rw-r--r--engines/xeen/screen.h8
-rw-r--r--engines/xeen/worldofxeen/worldofxeen_menu.cpp5
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;
}