aboutsummaryrefslogtreecommitdiff
path: root/engines/xeen
diff options
context:
space:
mode:
Diffstat (limited to 'engines/xeen')
-rw-r--r--engines/xeen/resources.cpp13
-rw-r--r--engines/xeen/resources.h1
-rw-r--r--engines/xeen/worldofxeen/worldofxeen.cpp196
-rw-r--r--engines/xeen/worldofxeen/worldofxeen.h5
4 files changed, 215 insertions, 0 deletions
diff --git a/engines/xeen/resources.cpp b/engines/xeen/resources.cpp
index 8e23341046..1239dd9512 100644
--- a/engines/xeen/resources.cpp
+++ b/engines/xeen/resources.cpp
@@ -1693,5 +1693,18 @@ const char *const Resources::NO_LOADING_IN_COMBAT =
"No Loading Allowed in Combat!";
const char *const Resources::NO_SAVING_IN_COMBAT =
"No Saving Allowed in Combat!";
+const char *const Resources::WORLD_END_TEXT[8] = {
+ "\n\n\n\n\n\n\n"
+ "Congratulations Adventurers!\n\n"
+ "Let the unification ceremony begin!",
+ "And so the call went out to the people throughout the lands of Xeen"
+ " that the prophecy was nearing completion.",
+ "They came in great numbers to witness the momentous occasion.",
+ "\xB""026The Dragon Pharoah presided over the ceremony.",
+ "\xB""026Queen Kalindra presented the Cube of Power.",
+ "\xB""026Prince Roland presented the Xeen Sceptre.",
+ "\xB""026Together, they placed the Cube of Power...",
+ "\xB""026and the Sceptre, onto the Altar of Joining."
+};
} // End of namespace Xeen
diff --git a/engines/xeen/resources.h b/engines/xeen/resources.h
index 040a787538..de031dba77 100644
--- a/engines/xeen/resources.h
+++ b/engines/xeen/resources.h
@@ -361,6 +361,7 @@ public:
static const char *const MR_WIZARD;
static const char *const NO_LOADING_IN_COMBAT;
static const char *const NO_SAVING_IN_COMBAT;
+ static const char *const WORLD_END_TEXT[8];
public:
/**
* Initializes an instnace of the resources
diff --git a/engines/xeen/worldofxeen/worldofxeen.cpp b/engines/xeen/worldofxeen/worldofxeen.cpp
index 9812b45e0f..4d25c4758c 100644
--- a/engines/xeen/worldofxeen/worldofxeen.cpp
+++ b/engines/xeen/worldofxeen/worldofxeen.cpp
@@ -178,8 +178,204 @@ void WorldOfXeenEngine::showCutscene(const Common::String &name) {
}
void WorldOfXeenEngine::showWorldOfXeenEnding() {
+ Windows &windows = *_windows;
+ Window &w0 = windows[0];
+
+ _files->setGameCc(1);
+ _sound->playSong("outday3.m");
+ showPharaohEndText(Res.WORLD_END_TEXT[0], nullptr, nullptr);
+ _sound->playSound("elect.voc");
+
+ Graphics::ManagedSurface savedBg;
+ _screen->loadBackground("skymain.raw");
+ savedBg.copyFrom(*_screen);
+ _screen->loadBackground("twrsky1.raw");
+ _screen->loadPage(0);
+ _screen->loadPage(1);
+ _screen->loadPalette("skymain.pal");
+
+ SpriteResource sc02("sc02.eg2"), tower1("tower1.eg2"), tower2("tower2.eg2"),
+ sc3a("sc3a.eg2"), sc06("sc06.eg2"), sc14("sc14.eg2"), sc13("sc13.eg2"),
+ sc17("sc17.eg2"), cube("cube.eg2"), hands("hands.eg2"),
+ sc20a("sc20a.eg2"), sc20b("sc20b.eg2"), sc20c("sc20c.eg2"),
+ sc20d("sc20d.eg2"), sc22a("sc22a.eg2"), sc22b("sc22b.eg2"),
+ sc10("sc10.eg2"), staff("staff.eg2");
+ SpriteResource sc3b[2] = {
+ SpriteResource("sc3b1.eg2"), SpriteResource("sc3b2.eg2")
+ };
+
+ windows[41].writeString("\x1\xD");
+ _screen->fadeOut();
+ while (!shouldQuit() && _sound->isPlaying())
+ _events->pollEventsAndWait();
+
+ _sound->playSong("nwblksmt.m");
+ _screen->blitFrom(savedBg);
+ setWorldEndingSubtitle(Res.WORLD_END_TEXT[1]);
+ w0.update();
+ _screen->fadeIn();
+
+ _events->updateGameCounter();
+ _events->wait(60);
+
+ for (int idx = 0; idx < 50 && !shouldQuit(); ++idx) {
+ if (idx == 9 || idx == 22 || idx == 33 || idx == 44)
+ _sound->playSound("whoosh.voc");
+
+ _events->updateGameCounter();
+ _screen->blitFrom(savedBg);
+ sc02.draw(0, idx);
+ setWorldEndingSubtitle(Res.WORLD_END_TEXT[1]);
+ w0.update();
+
+ _events->wait(2);
+ }
+
+ for (int idx = 0; idx < 40 && !shouldQuit(); ++idx) {
+ _screen->horizMerge();
+ _events->updateGameCounter();
+ tower1.draw(0, 0, Common::Point(0, 0), SPRFLAG_800);
+ sc3a.draw(0, idx, Common::Point(91, 86), SPRFLAG_800);
+
+ w0.update();
+ _events->wait(2);
+ }
+
+ int frame = 40, frame2 = 0;
+ for (int idx = 0, xp = 0; idx < SCREEN_WIDTH && !shouldQuit(); ++idx) {
+ _events->updateGameCounter();
+ _screen->horizMerge(xp);
+ tower1.draw(0, 0, Common::Point(idx, 0), SPRFLAG_800);
+ sc3a.draw(0, frame, Common::Point(idx + 91, 86), SPRFLAG_800);
+ tower2.draw(0, 0, Common::Point(idx - 320, 0), SPRFLAG_800);
+ tower2.draw(0, 1, Common::Point(idx - (SCREEN_WIDTH / 2), 0), SPRFLAG_800);
+ sc3b[frame2 / 30].draw(0, frame2 % 30, Common::Point(idx - 277, 65), SPRFLAG_800);
+
+ frame = (frame + 1) % 57;
+ if (idx > (SCREEN_WIDTH / 2))
+ frame2 = (frame2 + 1) % 60;
+ xp -= 2;
+ if (xp < 1)
+ xp = SCREEN_WIDTH;
+
+ if (idx > 120)
+ setWorldEndingSubtitle(Res.WORLD_END_TEXT[2]);
+ w0.update();
+ _events->wait(2);
+ }
+
+ for (; frame2 < 60 && !shouldQuit(); ++frame2) {
+ _events->updateGameCounter();
+ _screen->horizMerge(frame);
+ tower2.draw(0, 0, Common::Point(0, 0), SPRFLAG_800);
+ tower2.draw(0, 1, Common::Point(SCREEN_WIDTH / 2, 0), SPRFLAG_800);
+ sc3b[frame2 / 30].draw(frame2 % 30, 0, Common::Point(43, 65), SPRFLAG_800);
+
+ setWorldEndingSubtitle(Res.WORLD_END_TEXT[2]);
+ w0.update();
+ _events->wait(2);
+ }
+
+ if (shouldQuit())
+ return;
+ _screen->freePages();
+ _screen->fadeOut();
+ _screen->loadBackground("foura.raw");
+ savedBg.blitFrom(*_screen);
+
+ sc06.draw(0, 0, Common::Point(26, 25));
+ w0.update();
+ _screen->fadeIn();
+
+ for (int idx = 0; idx < 26 && !shouldQuit(); ++idx) {
+ _events->updateGameCounter();
+ _screen->blitFrom(savedBg);
+ sc06.draw(0, idx, Common::Point(26, 75));
+ _events->wait(2);
+ }
+
+ if (shouldQuit())
+ return;
+ _screen->fadeOut();
+ _screen->loadBackground("eg140001.raw");
+ savedBg.blitFrom(*_screen);
+ w0.update();
+ setWorldEndingSubtitle(Res.WORLD_END_TEXT[3]);
+ _screen->fadeIn();
+
+ for (int idx1 = 0; idx1 < 2 && !shouldQuit(); ++idx1) {
+ for (int idx2 = 0; idx2 < 15 && !shouldQuit(); ++idx2) {
+ _events->updateGameCounter();
+ _screen->blitFrom(savedBg);
+ sc14.draw(0, idx2, Common::Point(141, 63));
+ setWorldEndingSubtitle(Res.WORLD_END_TEXT[3]);
+
+ w0.update();
+ _events->wait(2);
+ }
+ }
+
+ _screen->loadBackground("eg100001.raw");
+ _screen->loadPage(0);
+ savedBg.blitFrom(*_screen);
+
+ for (int idx1 = 0; idx1 < 2 && !shouldQuit(); ++idx1) {
+ for (int idx2 = 0; idx2 < 6 && !shouldQuit(); ++idx2) {
+ _events->updateGameCounter();
+ _screen->blitFrom(savedBg);
+ sc14.draw(0, idx2, Common::Point(26, 21));
+ setWorldEndingSubtitle(Res.WORLD_END_TEXT[4]);
+
+ w0.update();
+ _events->wait(2);
+ }
+ }
+
+ _screen->blitFrom(savedBg);
+ sc13.draw(0, 5, Common::Point(26, 21));
+ savedBg.blitFrom(*_screen);
+ setWorldEndingSubtitle(Res.WORLD_END_TEXT[4]);
+ w0.update();
+
+ frame = 0;
+ for (int idx = 185; idx > 68 && !shouldQuit(); idx -= 3) {
+ if (!_sound->isPlaying())
+ _sound->playSound("cast.voc");
+
+ _events->updateGameCounter();
+ _screen->blitFrom(savedBg);
+ sc17.draw(0, 0, Common::Point(33, idx), SPRFLAG_4000);
+ sc17.draw(0, frame, Common::Point(33, idx), SPRFLAG_4000);
+ setWorldEndingSubtitle(Res.WORLD_END_TEXT[4]);
+
+ w0.update();
+ _events->wait(2);
+ frame = (frame + 1) % 17;
+ }
+
+ for (int idx = 0; idx < 17 && !shouldQuit(); ++idx) {
+ if (!_sound->isPlaying())
+ _sound->playSound("cast.voc");
+
+ _events->updateGameCounter();
+ _screen->blitFrom(savedBg);
+ sc17.draw(0, 0, Common::Point(33, 68), SPRFLAG_4000);
+ sc17.draw(0, idx, Common::Point(33, 68), SPRFLAG_4000);
+ setWorldEndingSubtitle(Res.WORLD_END_TEXT[4]);
+
+ w0.update();
+ _events->wait(2);
+ }
// TODO
}
+void WorldOfXeenEngine::setWorldEndingSubtitle(const Common::String &msg) {
+ Windows &windows = *_windows;
+ const char *const FORMAT1 = "\xB""000\t000\xC""38\x3""c%s";
+ const char *const FORMAT2 = "\xB""000\t000\xC""39\x3""c%s";
+ windows[28].writeString(Common::String::format(FORMAT1, msg.c_str()));
+ windows[28].writeString(Common::String::format(FORMAT2, msg.c_str()));
+}
+
} // End of namespace WorldOfXeen
} // End of namespace Xeen
diff --git a/engines/xeen/worldofxeen/worldofxeen.h b/engines/xeen/worldofxeen/worldofxeen.h
index 0ec31f3bf0..5c050e71c6 100644
--- a/engines/xeen/worldofxeen/worldofxeen.h
+++ b/engines/xeen/worldofxeen/worldofxeen.h
@@ -47,6 +47,11 @@ private:
* Show World of Xeen ending
*/
void showWorldOfXeenEnding();
+
+ /**
+ * Sets a subtitle during the world of xeen ending
+ */
+ void setWorldEndingSubtitle(const Common::String &msg);
protected:
/**
* Outer gameplay loop responsible for dispatching control to game-specific