diff options
author | Paul Gilbert | 2018-02-01 20:15:09 -0500 |
---|---|---|
committer | Paul Gilbert | 2018-02-01 20:15:09 -0500 |
commit | 39b2a2f13787d254db2b227d74421a2a50eeedd3 (patch) | |
tree | 0546698d16e115f5abe620977abfe3a2d146bb43 | |
parent | 7f53a0cd31f07cdcc9610b3c6972002e296ff0ee (diff) | |
download | scummvm-rg350-39b2a2f13787d254db2b227d74421a2a50eeedd3.tar.gz scummvm-rg350-39b2a2f13787d254db2b227d74421a2a50eeedd3.tar.bz2 scummvm-rg350-39b2a2f13787d254db2b227d74421a2a50eeedd3.zip |
XEEN: Implemented remainder of World of Xeen ending
-rw-r--r-- | engines/xeen/music.cpp | 4 | ||||
-rw-r--r-- | engines/xeen/music.h | 10 | ||||
-rw-r--r-- | engines/xeen/resources.cpp | 27 | ||||
-rw-r--r-- | engines/xeen/resources.h | 5 | ||||
-rw-r--r-- | engines/xeen/scripts.cpp | 3 | ||||
-rw-r--r-- | engines/xeen/worldofxeen/worldofxeen.cpp | 4 | ||||
-rw-r--r-- | engines/xeen/worldofxeen/worldofxeen.h | 2 | ||||
-rw-r--r-- | engines/xeen/worldofxeen/worldofxeen_cutscenes.cpp | 129 | ||||
-rw-r--r-- | engines/xeen/worldofxeen/worldofxeen_cutscenes.h | 17 | ||||
-rw-r--r-- | engines/xeen/xeen.h | 5 |
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); |