aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
Diffstat (limited to 'engines')
-rw-r--r--engines/xeen/music.cpp4
-rw-r--r--engines/xeen/music.h10
-rw-r--r--engines/xeen/resources.cpp27
-rw-r--r--engines/xeen/resources.h5
-rw-r--r--engines/xeen/scripts.cpp3
-rw-r--r--engines/xeen/worldofxeen/worldofxeen.cpp4
-rw-r--r--engines/xeen/worldofxeen/worldofxeen.h2
-rw-r--r--engines/xeen/worldofxeen/worldofxeen_cutscenes.cpp129
-rw-r--r--engines/xeen/worldofxeen/worldofxeen_cutscenes.h17
-rw-r--r--engines/xeen/xeen.h5
10 files changed, 169 insertions, 37 deletions
diff --git a/engines/xeen/music.cpp b/engines/xeen/music.cpp
index c9a62d5007..42cb446dcc 100644
--- a/engines/xeen/music.cpp
+++ b/engines/xeen/music.cpp
@@ -759,4 +759,8 @@ void Music::updateSoundSettings() {
stopSong();
}
+bool Music::isMusicPlaying() const {
+ return _musicDriver->isPlaying();
+}
+
} // End of namespace Xeen
diff --git a/engines/xeen/music.h b/engines/xeen/music.h
index 83355cb448..ac1f78433d 100644
--- a/engines/xeen/music.h
+++ b/engines/xeen/music.h
@@ -171,6 +171,11 @@ public:
* Executes special music command
*/
virtual int songCommand(uint commandId, byte volume = 0);
+
+ /**
+ * Returns whether music is currently playing
+ */
+ bool isPlaying() const { return _musicPlaying; }
};
class AdlibMusicDriver : public MusicDriver {
@@ -371,6 +376,11 @@ public:
}
/**
+ * Returns true if music is playing
+ */
+ bool isMusicPlaying() const;
+
+ /**
* Sets whether music is on
*/
void setMusicOn(bool isOn);
diff --git a/engines/xeen/resources.cpp b/engines/xeen/resources.cpp
index 1239dd9512..ddea6ca0d2 100644
--- a/engines/xeen/resources.cpp
+++ b/engines/xeen/resources.cpp
@@ -1693,7 +1693,7 @@ 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] = {
+const char *const Resources::WORLD_END_TEXT[9] = {
"\n\n\n\n\n\n\n"
"Congratulations Adventurers!\n\n"
"Let the unification ceremony begin!",
@@ -1704,7 +1704,30 @@ const char *const Resources::WORLD_END_TEXT[8] = {
"\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."
+ "\xB""026and the Sceptre, onto the Altar of Joining.",
+ "With the prophecy complete, the two sides of Xeen were united as one",
+};
+
+const char *const Resources::WORLD_CONGRATULATIONS =
+ "\x3""cCongratulations\n\n"
+ "Your Final Score is:\n\n"
+ "%010lu\n"
+ "\x3l\n"
+ "Please send this score to the Ancient's Headquarters where "
+ "you'll be added to the Hall of Legends!\n\n"
+ "Ancient's Headquarters\n"
+ "New World Computing, Inc.\n"
+ "P.O. Box 4302\n"
+ "Hollywood, CA 90078";
+const char *const Resources::WORLD_CONGRATULATIONS2 =
+ "\n\n\n\n\n\n"
+ "But wait... there's more!\n"
+ "\n\n"
+ "Include the message\n"
+ "\"%s\"\n"
+ "with your final score and receive a special bonus.";
+const char *const Resources::GOOBER[3] = {
+ "", "I am a Goober!", "I am a Super Goober!"
};
} // End of namespace Xeen
diff --git a/engines/xeen/resources.h b/engines/xeen/resources.h
index de031dba77..0144d9b731 100644
--- a/engines/xeen/resources.h
+++ b/engines/xeen/resources.h
@@ -361,7 +361,10 @@ 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];
+ static const char *const WORLD_END_TEXT[9];
+ static const char *const WORLD_CONGRATULATIONS;
+ static const char *const WORLD_CONGRATULATIONS2;
+ static const char *const GOOBER[3];
public:
/**
* Initializes an instnace of the resources
diff --git a/engines/xeen/scripts.cpp b/engines/xeen/scripts.cpp
index 255b9e5588..3693bddd12 100644
--- a/engines/xeen/scripts.cpp
+++ b/engines/xeen/scripts.cpp
@@ -1456,7 +1456,8 @@ void Scripts::doEnding(const Common::String &endStr) {
}
}
- g_vm->showCutscene(endStr);
+ // TODO: Pass proper score
+ g_vm->showCutscene(endStr, state, 42);
g_vm->_quitMode = QMODE_MENU;
}
diff --git a/engines/xeen/worldofxeen/worldofxeen.cpp b/engines/xeen/worldofxeen/worldofxeen.cpp
index 87b4013d54..7229a4d89e 100644
--- a/engines/xeen/worldofxeen/worldofxeen.cpp
+++ b/engines/xeen/worldofxeen/worldofxeen.cpp
@@ -165,7 +165,7 @@ void WorldOfXeenEngine::death() {
w.update();
}
-void WorldOfXeenEngine::showCutscene(const Common::String &name) {
+void WorldOfXeenEngine::showCutscene(const Common::String &name, int status, uint score) {
_sound->stopAllAudio();
if (name == "ENDGAME")
@@ -173,7 +173,7 @@ void WorldOfXeenEngine::showCutscene(const Common::String &name) {
else if (name == "ENDGAME2")
showDarkSideEnding();
else if (name == "WORLDEND")
- showWorldOfXeenEnding();
+ showWorldOfXeenEnding((GooberState)status, score);
}
} // End of namespace WorldOfXeen
diff --git a/engines/xeen/worldofxeen/worldofxeen.h b/engines/xeen/worldofxeen/worldofxeen.h
index 907bda0626..1122115498 100644
--- a/engines/xeen/worldofxeen/worldofxeen.h
+++ b/engines/xeen/worldofxeen/worldofxeen.h
@@ -61,7 +61,7 @@ public:
/**
* Show a cutscene
*/
- virtual void showCutscene(const Common::String &name);
+ virtual void showCutscene(const Common::String &name, int status, uint score);
/**
* Set the next overall game action to do
diff --git a/engines/xeen/worldofxeen/worldofxeen_cutscenes.cpp b/engines/xeen/worldofxeen/worldofxeen_cutscenes.cpp
index 4b073599d2..170a2ca54a 100644
--- a/engines/xeen/worldofxeen/worldofxeen_cutscenes.cpp
+++ b/engines/xeen/worldofxeen/worldofxeen_cutscenes.cpp
@@ -27,7 +27,10 @@
namespace Xeen {
namespace WorldOfXeen {
-void WorldOfXeenCutscenes::showWorldOfXeenEnding() {
+void WorldOfXeenCutscenes::showWorldOfXeenEnding(GooberState state, uint score) {
+ _goober = state;
+ _finalScore = score;
+
worldEnding1();
if (!_vm->shouldQuit())
worldEnding2();
@@ -80,7 +83,7 @@ void WorldOfXeenCutscenes::worldEnding1() {
sound.playSong("nwblksmt.m");
screen.blitFrom(savedBg);
- setWorldEndingSubtitle(Res.WORLD_END_TEXT[1]);
+ setSubtitle(Res.WORLD_END_TEXT[1]);
w0.update();
screen.fadeIn();
@@ -94,7 +97,7 @@ void WorldOfXeenCutscenes::worldEnding1() {
events.updateGameCounter();
screen.blitFrom(savedBg);
sc02.draw(0, idx);
- setWorldEndingSubtitle(Res.WORLD_END_TEXT[1]);
+ setSubtitle(Res.WORLD_END_TEXT[1]);
w0.update();
events.wait(2);
@@ -128,7 +131,7 @@ void WorldOfXeenCutscenes::worldEnding1() {
xp = SCREEN_WIDTH;
if (idx > 120)
- setWorldEndingSubtitle(Res.WORLD_END_TEXT[2]);
+ setSubtitle(Res.WORLD_END_TEXT[2]);
w0.update();
events.wait(2);
}
@@ -140,7 +143,7 @@ void WorldOfXeenCutscenes::worldEnding1() {
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]);
+ setSubtitle(Res.WORLD_END_TEXT[2]);
w0.update();
events.wait(2);
}
@@ -169,7 +172,7 @@ void WorldOfXeenCutscenes::worldEnding1() {
screen.loadBackground("eg140001.raw");
savedBg.blitFrom(screen);
w0.update();
- setWorldEndingSubtitle(Res.WORLD_END_TEXT[3]);
+ setSubtitle(Res.WORLD_END_TEXT[3]);
screen.fadeIn();
for (int idx1 = 0; idx1 < 2 && !_vm->shouldQuit(); ++idx1) {
@@ -177,7 +180,7 @@ void WorldOfXeenCutscenes::worldEnding1() {
events.updateGameCounter();
screen.blitFrom(savedBg);
sc14.draw(0, idx2, Common::Point(141, 63));
- setWorldEndingSubtitle(Res.WORLD_END_TEXT[3]);
+ setSubtitle(Res.WORLD_END_TEXT[3]);
w0.update();
events.wait(2);
@@ -193,7 +196,7 @@ void WorldOfXeenCutscenes::worldEnding1() {
events.updateGameCounter();
screen.blitFrom(savedBg);
sc14.draw(0, idx2, Common::Point(26, 21));
- setWorldEndingSubtitle(Res.WORLD_END_TEXT[4]);
+ setSubtitle(Res.WORLD_END_TEXT[4]);
w0.update();
events.wait(2);
@@ -203,7 +206,7 @@ void WorldOfXeenCutscenes::worldEnding1() {
screen.blitFrom(savedBg);
sc13.draw(0, 5, Common::Point(26, 21));
savedBg.blitFrom(screen);
- setWorldEndingSubtitle(Res.WORLD_END_TEXT[4]);
+ setSubtitle(Res.WORLD_END_TEXT[4]);
w0.update();
frame = 0;
@@ -215,7 +218,7 @@ void WorldOfXeenCutscenes::worldEnding1() {
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]);
+ setSubtitle(Res.WORLD_END_TEXT[4]);
w0.update();
events.wait(2);
@@ -230,7 +233,7 @@ void WorldOfXeenCutscenes::worldEnding1() {
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]);
+ setSubtitle(Res.WORLD_END_TEXT[4]);
w0.update();
events.wait(2);
@@ -240,7 +243,7 @@ void WorldOfXeenCutscenes::worldEnding1() {
return;
screen.blitFrom(savedBg);
sc17.draw(0, 0, Common::Point(33, 68), SPRFLAG_4000);
- setWorldEndingSubtitle(Res.WORLD_END_TEXT[4]);
+ setSubtitle(Res.WORLD_END_TEXT[4]);
w0.update();
screen.fadeOut();
@@ -268,7 +271,7 @@ void WorldOfXeenCutscenes::worldEnding1() {
events.updateGameCounter();
screen.blitFrom(savedBg);
sc10.draw(0, idx2, Common::Point(26, 21));
- setWorldEndingSubtitle(Res.WORLD_END_TEXT[5]);
+ setSubtitle(Res.WORLD_END_TEXT[5]);
w0.update();
events.wait(3);
@@ -276,14 +279,14 @@ void WorldOfXeenCutscenes::worldEnding1() {
}
screen.blitFrom(savedBg);
- setWorldEndingSubtitle(Res.WORLD_END_TEXT[5]);
+ setSubtitle(Res.WORLD_END_TEXT[5]);
w0.update();
for (int idx = 185; idx > 13 && !_vm->shouldQuit(); idx -= 6) {
events.updateGameCounter();
screen.blitFrom(savedBg);
staff.draw(0, 0, Common::Point(196, idx), SPRFLAG_4000);
- setWorldEndingSubtitle(Res.WORLD_END_TEXT[5]);
+ setSubtitle(Res.WORLD_END_TEXT[5]);
w0.update();
events.wait(2);
@@ -331,7 +334,7 @@ void WorldOfXeenCutscenes::worldEnding1() {
sc20[0].draw(0, 0, Common::Point(26, 55));
hands.draw(0, 0, Common::Point(58, 17));
cube.draw(0, 0, Common::Point(101, 11), SPRFLAG_4000);
- setWorldEndingSubtitle(Res.WORLD_END_TEXT[6]);
+ setSubtitle(Res.WORLD_END_TEXT[6]);
w0.update();
events.wait(2);
@@ -347,7 +350,7 @@ void WorldOfXeenCutscenes::worldEnding1() {
sc20[0].draw(0, 0, Common::Point(26, 55));
hands.draw(0, 0, Common::Point(58, 17));
cube.draw(0, frame, Common::Point(101, 11), SPRFLAG_4000);
- setWorldEndingSubtitle(Res.WORLD_END_TEXT[6]);
+ setSubtitle(Res.WORLD_END_TEXT[6]);
w0.update();
events.wait(2);
@@ -363,7 +366,7 @@ void WorldOfXeenCutscenes::worldEnding1() {
screen.blitFrom(savedBg);
sc20[0].draw(0, 0, Common::Point(26, 55));
cube.draw(0, frame, Common::Point(101, idx), SPRFLAG_4000);
- setWorldEndingSubtitle(Res.WORLD_END_TEXT[6]);
+ setSubtitle(Res.WORLD_END_TEXT[6]);
w0.update();
events.wait(2);
@@ -384,7 +387,7 @@ void WorldOfXeenCutscenes::worldEnding1() {
events.updateGameCounter();
screen.blitFrom(savedBg);
sc20[idx / 7].draw(0, idx % 7, Common::Point(26, 55));
- setWorldEndingSubtitle(Res.WORLD_END_TEXT[6]);
+ setSubtitle(Res.WORLD_END_TEXT[6]);
w0.update();
events.wait(2);
@@ -397,7 +400,7 @@ void WorldOfXeenCutscenes::worldEnding1() {
events.updateGameCounter();
screen.blitFrom(savedBg);
sc20[2].draw(0, idx, Common::Point(26, 55));
- setWorldEndingSubtitle(Res.WORLD_END_TEXT[6]);
+ setSubtitle(Res.WORLD_END_TEXT[6]);
w0.update();
events.wait(3);
@@ -407,7 +410,7 @@ void WorldOfXeenCutscenes::worldEnding1() {
events.updateGameCounter();
screen.blitFrom(savedBg);
sc20[3].draw(0, idx, Common::Point(26, 55));
- setWorldEndingSubtitle(Res.WORLD_END_TEXT[6]);
+ setSubtitle(Res.WORLD_END_TEXT[6]);
w0.update();
events.wait(4);
@@ -416,7 +419,7 @@ void WorldOfXeenCutscenes::worldEnding1() {
if (_vm->shouldQuit())
return;
screen.blitFrom(savedBg);
- setWorldEndingSubtitle(Res.WORLD_END_TEXT[6]);
+ setSubtitle(Res.WORLD_END_TEXT[6]);
w0.update();
events.updateGameCounter();
events.wait(30);
@@ -436,7 +439,7 @@ void WorldOfXeenCutscenes::worldEnding1() {
events.updateGameCounter();
screen.blitFrom(savedBg);
sc22[idx / 20].draw(0, idx % 20, Common::Point(112, 17));
- setWorldEndingSubtitle(Res.WORLD_END_TEXT[7]);
+ setSubtitle(Res.WORLD_END_TEXT[7]);
w0.update();
events.wait(3);
@@ -567,7 +570,16 @@ void WorldOfXeenCutscenes::worldEnding4() {
Window &w0 = windows[0];
Graphics::ManagedSurface savedBg(SCREEN_WIDTH, SCREEN_HEIGHT);
- SpriteResource sc27("sc27.eg2");
+ SpriteResource sc27("sc27.eg2"), sc30("sc30.eg2");
+ SpriteResource sc28[14] = {
+ SpriteResource("sc28a.eg2"), SpriteResource("sc28b1.eg2"),
+ SpriteResource("sc28c.eg2"), SpriteResource("sc28d.eg2"),
+ SpriteResource("sc28e.eg2"), SpriteResource("sc28f.eg2"),
+ SpriteResource("sc28g.eg2"), SpriteResource("sc28h.eg2"),
+ SpriteResource("sc28i.eg2"), SpriteResource("sc28j.eg2"),
+ SpriteResource("sc28k.eg2"), SpriteResource("sc28l.eg2"),
+ SpriteResource("sc28m.eg2"), SpriteResource("sc28n.eg2"),
+ };
screen.fadeOut();
screen.loadBackground("eg270001.raw");
@@ -591,11 +603,68 @@ void WorldOfXeenCutscenes::worldEnding4() {
sound.stopSound();
screen.fadeOut();
+ screen.loadBackground("eg280001.raw");
+ savedBg.blitFrom(screen);
+ w0.update();
+ screen.fadeIn();
+
+ for (int idx = 0; idx < 138 && !_vm->shouldQuit(); ++idx) {
+ if (!sound.isPlaying() && idx > 98)
+ sound.playSound("rumble.voc");
+
+ events.updateGameCounter();
+ sc28[idx / 10].draw(0, idx % 10, Common::Point(52, 15));
+
+ w0.update();
+ events.wait(2);
+ }
+
+ sound.stopSound();
+ if (_vm->shouldQuit())
+ return;
+
+ screen.loadPalette("white.pal");
+ screen.fadeIn();
+ sound.playSound("explosio.voc");
+ events.updateGameCounter();
+ events.wait(10);
+ if (_vm->shouldQuit())
+ return;
+
+ screen.loadPalette("eg250001.pal");
+ screen.fadeOut();
+
+ for (int idx1 = 0; idx1 < 20 && !_vm->shouldQuit(); ++idx1) {
+ for (int idx2 = 0; idx2 < 4 && !_vm->shouldQuit(); ++idx2) {
+ sc30.draw(0, idx2);
+ setSubtitle2(Res.WORLD_END_TEXT[8]);
+ w0.update();
+
+ if (!idx1 && !idx2)
+ screen.fadeIn();
+ //if (idx1 == 17) ??MUSIC
+ events.wait(2);
+ }
+ }
+
+ screen.fadeOut();
+ while (sound.isMusicPlaying() && !_vm->shouldQuit()) {
+ events.updateGameCounter();
+ events.wait(2);
+ }
+ if (_vm->shouldQuit())
+ return;
+
+ sound.playSong("outday3.m");
- // TODO
+ Common::String gooberStr = Res.GOOBER[_goober];
+ Common::String congratsStr1 = Common::String::format(Res.WORLD_CONGRATULATIONS, _finalScore);
+ Common::String congratsStr2 = _goober == NON_GOOBER ? "" :
+ Common::String::format(Res.WORLD_CONGRATULATIONS2, gooberStr.c_str());
+ showPharaohEndText(congratsStr1.c_str(), congratsStr2.c_str());
}
-void WorldOfXeenCutscenes::setWorldEndingSubtitle(const Common::String &msg) {
+void WorldOfXeenCutscenes::setSubtitle(const Common::String &msg) {
Windows &windows = *_vm->_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";
@@ -603,5 +672,13 @@ void WorldOfXeenCutscenes::setWorldEndingSubtitle(const Common::String &msg) {
windows[28].writeString(Common::String::format(FORMAT2, msg.c_str()));
}
+void WorldOfXeenCutscenes::setSubtitle2(const Common::String &msg) {
+ Windows &windows = *_vm->_windows;
+ const char *const FORMAT1 = "\xB""000\t000\xC""05\x3""c%s";
+ const char *const FORMAT2 = "\xB""000\t000\xC""11\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_cutscenes.h b/engines/xeen/worldofxeen/worldofxeen_cutscenes.h
index 0e6b22c6f3..bd78593e8c 100644
--- a/engines/xeen/worldofxeen/worldofxeen_cutscenes.h
+++ b/engines/xeen/worldofxeen/worldofxeen_cutscenes.h
@@ -30,15 +30,26 @@
namespace Xeen {
namespace WorldOfXeen {
+enum GooberState {
+ NON_GOOBER = 0, GOOBER = 1, SUPER_GOOBER = 2
+};
+
class WorldOfXeenCutscenes : public CloudsCutscenes,
public DarkSideCutscenes {
private:
XeenEngine *_vm;
+ GooberState _goober;
+ uint _finalScore;
private:
/**
* Sets a subtitle during the world of xeen ending
*/
- void setWorldEndingSubtitle(const Common::String &msg);
+ void setSubtitle(const Common::String &msg);
+
+ /**
+ * Sets a subtitle during the world of xeen ending
+ */
+ void setSubtitle2(const Common::String &msg);
/**
* Part 1 of World of Xeen ending
@@ -63,10 +74,10 @@ protected:
/**
* Shows the World of Xeen ending sequence
*/
- void showWorldOfXeenEnding();
+ void showWorldOfXeenEnding(GooberState state, uint score);
public:
WorldOfXeenCutscenes(XeenEngine *vm) : _vm(vm), CloudsCutscenes(vm),
- DarkSideCutscenes(vm) {}
+ DarkSideCutscenes(vm), _goober(NON_GOOBER), _finalScore(0) {}
};
} // End of namespace WorldOfXeen
diff --git a/engines/xeen/xeen.h b/engines/xeen/xeen.h
index 34ed53857c..a8e6441459 100644
--- a/engines/xeen/xeen.h
+++ b/engines/xeen/xeen.h
@@ -202,8 +202,11 @@ public:
/**
* Show a cutscene
+ * @param name Name of cutscene
+ * @param status For World of Xeen, Goober status
+ * @param score Final score
*/
- virtual void showCutscene(const Common::String &name) {}
+ virtual void showCutscene(const Common::String &name, int status, uint score) {}
static Common::String printMil(uint value);