diff options
-rw-r--r-- | engines/xeen/worldofxeen/clouds_cutscenes.cpp | 183 | ||||
-rw-r--r-- | engines/xeen/worldofxeen/clouds_cutscenes.h | 12 |
2 files changed, 185 insertions, 10 deletions
diff --git a/engines/xeen/worldofxeen/clouds_cutscenes.cpp b/engines/xeen/worldofxeen/clouds_cutscenes.cpp index 26ce12eb69..baec53b825 100644 --- a/engines/xeen/worldofxeen/clouds_cutscenes.cpp +++ b/engines/xeen/worldofxeen/clouds_cutscenes.cpp @@ -336,7 +336,12 @@ bool CloudsCutscenes::showCloudsIntro() { return true; } -bool CloudsCutscenes::showCloudsEnding() { +void CloudsCutscenes::showCloudsEnding() { + if (showCloudsEnding1()) + showCloudsEnding2(); +} + +bool CloudsCutscenes::showCloudsEnding1() { EventsManager &events = *_vm->_events; FileManager &files = *_vm->_files; Screen &screen = *_vm->_screen; @@ -361,12 +366,13 @@ bool CloudsCutscenes::showCloudsEnding() { sound.playFX(1); sound.playFX(34); + // prec loop for (int idx = 1; idx < 42; ++idx) { // Load up the background frame of swirling clouds loadScreen(Common::String::format("prec00%02u.frm", idx)); // Render castle in front of it - prec.draw(0, 0); + prec.draw(0, 0, Common::Point(0, 0)); prec.draw(0, 1, Common::Point(160, 0)); screen.update(); @@ -391,22 +397,181 @@ bool CloudsCutscenes::showCloudsEnding() { prec.clear(); - // Show swirling vortex - // TODO? SpriteResource vort[21]; - SpriteResource cast[16], darkLord[4]; + SpriteResource cast[16], darkLord[3]; for (int idx = 1; idx < 7; ++idx) cast[idx - 1].load(Common::String::format("cast%02u.end", idx)); for (int idx = 1; idx < 4; ++idx) - darkLord[idx].load(Common::String::format("darklrd%d.end", idx)); + darkLord[idx - 1].load(Common::String::format("darklrd%d.end", idx)); + // First vortex loop + int cloudsCtr = 1; for (int idx = 1; idx < 16; ++idx) { - loadScreen(Common::String::format("vort%02u.frm", idx)); + loadScreen(Common::String::format("vort%02u.frm", cloudsCtr++)); cast[0].draw(0, 0); - cast[idx - 1].draw(0, 0, Common::Point(0, 100)); + cast[0].draw(0, 0, Common::Point(0, 100)); + WAIT(3); + } + + screen.loadPalette("mm4.pal"); + screen.fadeIn(0x81); + + const byte COUNTS1[6] = { 9, 3, 2, 2, 3, 15 }; + bool flag = false; + for (int idx1 = 1; idx1 < 7; ++idx1) { + for (int idx2 = 0; idx2 < COUNTS1[idx1 - 1]; ++idx2) { + loadScreen(Common::String::format("vort%02u.frm", cloudsCtr)); + if (cloudsCtr++ > 20) + cloudsCtr = 1; + + if (flag && !sound.isPlaying()) { + flag = false; + sound.playFX(34); + } else if (!flag && idx1 == 1 && idx2 == 6) { + flag = true; + sound.playSound("xeenlaff.voc"); + } + + switch (cloudsCtr) { + case 0: + case 1: + case 5: + case 9: + case 15: + sound.playFX(34); + break; + case 2: + case 7: + case 10: + case 13: + sound.playFX(33); + break; + default: + break; + } + + cast[idx1 - 1].draw(0, idx2, Common::Point(0, 0)); + cast[idx1 - 1].draw(0, idx2, Common::Point(0, 100)); + WAIT(3); + } + } + + for (int idx = 0; idx < 16; ++idx) { + loadScreen(Common::String::format("vort%02u.frm", cloudsCtr)); + if (cloudsCtr++ > 20) + cloudsCtr = 1; + + if (idx < 7) + darkLord[0].draw(0, idx); + else if (idx < 11) + darkLord[1].draw(0, idx - 7); + else + darkLord[2].draw(0, idx - 11); + + switch (cloudsCtr - 1) { + case 0: + case 4: + case 8: + case 14: + sound.playFX(34); + break; + case 1: + case 6: + case 9: + case 12: + sound.playFX(33); + break; + default: + break; + } + + WAIT(3); + } + sound.setMusicVolume(75); + + for (int idx = 0; idx < 3; ++idx) { + switch (idx) { + case 0: + sound.playSound("dark1.voc"); + break; + case 1: + sound.playSound("dark2.voc"); + break; + case 2: + sound.playSound("dark3.voc"); + break; + } + + do { + loadScreen(Common::String::format("vort%02u.frm", cloudsCtr)); + if (cloudsCtr++ > 20) + cloudsCtr = 1; + + darkLord[2].draw(0, getSpeakingFrame(2, 6)); + + switch (cloudsCtr - 1) { + case 0: + case 4: + case 8: + case 14: + sound.playFX(34); + break; + case 1: + case 6: + case 9: + case 12: + sound.playFX(33); + break; + default: + break; + } + + showSubtitles(0); + WAIT(3); + } while (sound.isPlaying() || _subtitleSize > 0); } + sound.playSound("darklaff.voc"); + sound.setMusicVolume(95); + + for (int idx = 12; idx >= 0; --idx) { + loadScreen(Common::String::format("vort%02u.frm", cloudsCtr)); + if (cloudsCtr++ > 20) + cloudsCtr = 1; + + if (idx < 7) + darkLord[0].draw(0, idx); + else if (idx < 11) + darkLord[1].draw(0, idx - 7); + else + darkLord[2].draw(0, idx - 11); + + switch (cloudsCtr - 1) { + case 0: + case 4: + case 8: + case 14: + sound.playFX(34); + break; + case 1: + case 6: + case 9: + case 12: + sound.playFX(33); + break; + default: + break; + } + + WAIT(3); + } + + sound.stopSound(); + screen.fadeOut(); + return true; +} + +bool CloudsCutscenes::showCloudsEnding2() { // TODO - WAIT(5000); return true; } diff --git a/engines/xeen/worldofxeen/clouds_cutscenes.h b/engines/xeen/worldofxeen/clouds_cutscenes.h index 262d36be46..8469f7c6e7 100644 --- a/engines/xeen/worldofxeen/clouds_cutscenes.h +++ b/engines/xeen/worldofxeen/clouds_cutscenes.h @@ -39,6 +39,16 @@ private: static const byte _DECODE_TABLE2[256]; private: void loadScreen(const Common::String &name); + + /** + * Shows part 1 of the Clouds of Xeen ending + */ + bool showCloudsEnding1(); + + /** + * Shows part 1 of the Clouds of Xeen ending + */ + bool showCloudsEnding2(); public: CloudsCutscenes(XeenEngine *vm) : Cutscenes(vm) {} @@ -55,7 +65,7 @@ public: /** * Shows the Clouds of Xeen ending sequence */ - bool showCloudsEnding(); + void showCloudsEnding(); }; } // End of namespace WorldOfXeen |