mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-15 14:18:37 +00:00
XEEN: Added remainder of Darkside ending
This commit is contained in:
parent
212b1b7531
commit
d06e32f030
@ -65,7 +65,7 @@ protected:
|
||||
* Delays either the specified number of frames, or until
|
||||
* an entire subtitle line is shown if subtitles are on
|
||||
*/
|
||||
bool subtitlesWait(uint minTime);
|
||||
bool subtitlesWait(uint minTime = 0);
|
||||
|
||||
/**
|
||||
* Records the current execution time
|
||||
|
@ -224,11 +224,11 @@ bool DarkSideCutscenes::showDarkSideEnding() {
|
||||
Screen &screen = *_vm->_screen;
|
||||
Sound &sound = *_vm->_sound;
|
||||
|
||||
//sound.playSong("dngon3.m");
|
||||
sound.playSong("dngon3.m");
|
||||
screen.loadBackground("scene1.raw");
|
||||
screen.loadPalette("endgame.pal");
|
||||
screen.update();
|
||||
/*
|
||||
|
||||
screen.fadeIn();
|
||||
WAIT(30);
|
||||
|
||||
@ -315,7 +315,7 @@ bool DarkSideCutscenes::showDarkSideEnding() {
|
||||
File whoosh("whoosh.voc");
|
||||
|
||||
screen.horizMerge();
|
||||
int yp = 101, ctr = 0, frameNum = 0;
|
||||
int yp = 101, tCtr = 0, frameNum = 0;
|
||||
for (int xp = 0; xp < 320; xp += 2) {
|
||||
screen.horizMerge(xp);
|
||||
|
||||
@ -328,7 +328,7 @@ bool DarkSideCutscenes::showDarkSideEnding() {
|
||||
sound.playSound(whoosh);
|
||||
WAIT(1);
|
||||
|
||||
if (++ctr % 2)
|
||||
if (++tCtr % 2)
|
||||
frameNum = (frameNum + 1) % 10;
|
||||
|
||||
if (xp < 100)
|
||||
@ -502,6 +502,7 @@ bool DarkSideCutscenes::showDarkSideEnding() {
|
||||
screen.restoreBackground();
|
||||
showSubtitles();
|
||||
} while (_subtitleSize);
|
||||
|
||||
sc09.clear();
|
||||
|
||||
// Nor do you!
|
||||
@ -516,7 +517,7 @@ bool DarkSideCutscenes::showDarkSideEnding() {
|
||||
sound.playSound("nordo2.voc");
|
||||
|
||||
screen.restoreBackground();
|
||||
sc09.draw(screen, getSpeakingFrame(0, 1));
|
||||
sc10.draw(screen, getSpeakingFrame(0, 1));
|
||||
showSubtitles();
|
||||
WAIT(3);
|
||||
}
|
||||
@ -525,8 +526,8 @@ bool DarkSideCutscenes::showDarkSideEnding() {
|
||||
screen.restoreBackground();
|
||||
showSubtitles();
|
||||
} while (_subtitleSize);
|
||||
|
||||
sc10.clear();
|
||||
*/_subtitles.load("special.bin");
|
||||
|
||||
// Closeup of side of Alamar's helmet
|
||||
SpriteResource sc11("sc11.end");
|
||||
@ -617,7 +618,7 @@ bool DarkSideCutscenes::showDarkSideEnding() {
|
||||
screen.update();
|
||||
screen.fadeIn();
|
||||
|
||||
for (int waveNum = 0; waveNum < 3; ++waveNum) {
|
||||
for (int waveNum = 0; waveNum < 2; ++waveNum) {
|
||||
for (int idx = 0; idx < 10; ++idx) {
|
||||
if (waveNum == 0 && idx == 3)
|
||||
sound.playSound("fight2.voc");
|
||||
@ -637,10 +638,440 @@ bool DarkSideCutscenes::showDarkSideEnding() {
|
||||
sc14.clear();
|
||||
|
||||
// Fighting start
|
||||
SpriteResource sc15("sc15.end");
|
||||
screen.loadBackground("mainback.raw");
|
||||
screen.saveBackground();
|
||||
sc15.draw(screen, 0, Common::Point(52, 84));
|
||||
screen.update();
|
||||
|
||||
for (int idx = 0; idx < 21; ++idx) {
|
||||
screen.restoreBackground();
|
||||
sc15.draw(screen, idx, Common::Point(52, 84));
|
||||
screen.update();
|
||||
WAIT(3);
|
||||
|
||||
// TODO
|
||||
events.wait(5000);
|
||||
if (idx == 4)
|
||||
sound.playSound("disint.voc");
|
||||
else if (idx == 12)
|
||||
sound.playSound("explosio.voc");
|
||||
}
|
||||
|
||||
sc15.clear();
|
||||
sound.stopSound();
|
||||
|
||||
// I can not fail
|
||||
SpriteResource sc16("sc16.end");
|
||||
resetSubtitles();
|
||||
recordTime();
|
||||
_subtitleLineNum = 28;
|
||||
_subtitleSize = 1;
|
||||
|
||||
screen.loadBackground("scene4.raw");
|
||||
screen.loadPage(0);
|
||||
screen.loadBackground("scene4-1.raw");
|
||||
screen.loadPage(1);
|
||||
screen.loadBackground("sc170001.raw");
|
||||
screen.saveBackground();
|
||||
screen.horizMerge(0);
|
||||
sc16.draw(screen, 0, Common::Point(7, 29));
|
||||
showSubtitles();
|
||||
sound.playSound("fail1.voc");
|
||||
|
||||
for (int idx = 0; idx < 5; ++idx) {
|
||||
screen.horizMerge(0);
|
||||
sc16.draw(screen, idx, Common::Point(7, 29));
|
||||
showSubtitles();
|
||||
WAIT(4);
|
||||
}
|
||||
|
||||
// Force sphere goes horizontally
|
||||
int val = 5;
|
||||
for (int idx = 0; idx < 320; idx += 16) {
|
||||
screen.horizMerge(idx);
|
||||
sc16.draw(screen, (val >= 12) ? 11 : val++,
|
||||
Common::Point(idx * -1 + 7, 29));
|
||||
|
||||
if (val > 10)
|
||||
sc16.draw(screen, 12, Common::Point(273, 70));
|
||||
|
||||
showSubtitles();
|
||||
WAIT(2);
|
||||
|
||||
if (idx == 48)
|
||||
sound.playSound("alien2.voc");
|
||||
}
|
||||
|
||||
screen.freePages();
|
||||
sc16.clear();
|
||||
|
||||
// Sheltem protects himself with cloak
|
||||
SpriteResource sc17[2] = {
|
||||
SpriteResource("sc17xa.end"), SpriteResource("sc17xb.end")
|
||||
};
|
||||
screen.restoreBackground();
|
||||
screen.update();
|
||||
|
||||
for (int idx = 0; idx < 16; ++idx) {
|
||||
screen.restoreBackground();
|
||||
sc17[idx / 8].draw(screen, idx % 8, Common::Point(44, 19));
|
||||
screen.update();
|
||||
WAIT(3);
|
||||
|
||||
if (idx == 9)
|
||||
sound.playSound("thud1.voc");
|
||||
}
|
||||
|
||||
screen.fadeOut();
|
||||
sc17[0].clear();
|
||||
sc17[1].clear();
|
||||
|
||||
// Sheltem fires on Corak
|
||||
SpriteResource sc18[4] = {
|
||||
SpriteResource("sc18a.end"), SpriteResource("sc18b.end"),
|
||||
SpriteResource("sc18c.end"), SpriteResource("sc18d.end")
|
||||
};
|
||||
screen.loadBackground("sc180001.raw");
|
||||
screen.saveBackground();
|
||||
screen.update();
|
||||
screen.fadeIn();
|
||||
|
||||
for (int idx = 0; idx < 31; ++idx) {
|
||||
screen.restoreBackground();
|
||||
sc18[idx / 8].draw(screen, idx % 8, Common::Point(29, 12));
|
||||
screen.update();
|
||||
WAIT(3);
|
||||
|
||||
if (idx == 2)
|
||||
sound.playSound("gascompr.voc");
|
||||
}
|
||||
|
||||
for (int idx = 0; idx < 4; ++idx)
|
||||
sc18[idx].clear();
|
||||
|
||||
// Closeup of Corak bleeding
|
||||
SpriteResource sc19("sc19.end");
|
||||
screen.loadBackground("sc190001.raw");
|
||||
screen.saveBackground();
|
||||
screen.update();
|
||||
|
||||
for (int idx = 0; idx < 28; ++idx) {
|
||||
if (idx == 20)
|
||||
sound.songCommand(207);
|
||||
|
||||
screen.restoreBackground();
|
||||
sc19.draw(screen, idx, Common::Point(33, 10));
|
||||
WAIT(3);
|
||||
}
|
||||
|
||||
sc19.clear();
|
||||
sound.stopSong();
|
||||
screen.fadeOut();
|
||||
|
||||
// Corak waving his hands
|
||||
SpriteResource sc20("sc20.end");
|
||||
sound.setMusicVolume(95);
|
||||
sound.playSong("sf17.m");
|
||||
screen.loadBackground("blank.raw");
|
||||
screen.saveBackground();
|
||||
screen.update();
|
||||
screen.fadeIn();
|
||||
|
||||
for (int waveNum = 0; waveNum < 2; ++waveNum) {
|
||||
sound.playSound("cast.voc");
|
||||
|
||||
for (int idx = 0; idx < 9; ++idx) {
|
||||
screen.restoreBackground();
|
||||
sc20.draw(screen, idx, Common::Point(80, 18));
|
||||
screen.update();
|
||||
WAIT(3);
|
||||
}
|
||||
}
|
||||
|
||||
sc20.clear();
|
||||
|
||||
// Sheltem bounces back bolts that Corak fires
|
||||
SpriteResource sc21("sc21.end");
|
||||
File alien2("alien2.voc");
|
||||
screen.loadBackground("mainback.raw");
|
||||
screen.saveBackground();
|
||||
sc21.draw(screen, 0, Common::Point(133, 81));
|
||||
screen.update();
|
||||
|
||||
for (int boltNum = 0; boltNum < 4; ++boltNum) {
|
||||
sound.playSound(alien2);
|
||||
|
||||
for (int idx = (boltNum == 0) ? 0 : 3; idx < 13; ++idx) {
|
||||
screen.restoreBackground();
|
||||
sc21.draw(screen, idx, Common::Point(133, 81));
|
||||
WAIT(2);
|
||||
}
|
||||
}
|
||||
|
||||
screen.restoreBackground();
|
||||
sc21.draw(screen, 0, Common::Point(133, 81));
|
||||
screen.update();
|
||||
|
||||
sc21.clear();
|
||||
alien2.close();
|
||||
|
||||
// Sheltem fires force sphere at Corak
|
||||
SpriteResource sc22("sc22.end");
|
||||
screen.loadBackground("scene4.raw");
|
||||
screen.loadPage(0);
|
||||
screen.loadBackground("scene4-1.raw");
|
||||
screen.loadPage(1);
|
||||
screen.loadBackground("sc230001.raw");
|
||||
screen.saveBackground();
|
||||
screen.horizMerge(SCREEN_WIDTH);
|
||||
|
||||
while (sound.isPlaying()) {
|
||||
WAIT(1);
|
||||
}
|
||||
|
||||
sc22.draw(screen, 0, Common::Point(156, 28));
|
||||
screen.update();
|
||||
sound.playSound("cast.voc");
|
||||
|
||||
for (int idx = 0; idx < 5; ++idx) {
|
||||
screen.horizMerge(SCREEN_WIDTH);
|
||||
sc22.draw(screen, idx, Common::Point(156, 28));
|
||||
screen.update();
|
||||
WAIT(3);
|
||||
}
|
||||
|
||||
// The sphere travels horizontally
|
||||
sound.playSound("gascompr.voc");
|
||||
|
||||
int ctr = 5;
|
||||
for (int idx = SCREEN_WIDTH, xOffset = 0; idx >= 0; idx -= 16, xOffset += 16) {
|
||||
screen.horizMerge(idx);
|
||||
sc22.draw(screen, (ctr >= 8) ? 7 : ctr++,
|
||||
Common::Point(xOffset + 156, 28), SPRFLAG_800);
|
||||
if (ctr > 7)
|
||||
sc22.draw(screen, 8, Common::Point(136, 64));
|
||||
screen.update();
|
||||
|
||||
WAIT(2);
|
||||
}
|
||||
|
||||
screen.freePages();
|
||||
sc22.clear();
|
||||
|
||||
// Corak raises shield and blocks sphere
|
||||
SpriteResource sc23[2] = {
|
||||
SpriteResource("sc23a.end"), SpriteResource("sc23b.end")
|
||||
};
|
||||
|
||||
screen.restoreBackground();
|
||||
screen.update();
|
||||
sound.playSound("cast.voc");
|
||||
|
||||
for (int idx = 0; idx < 19; ++idx) {
|
||||
screen.restoreBackground();
|
||||
sc23[idx / 12].draw(screen, idx % 12, Common::Point(72, 4));
|
||||
screen.update();
|
||||
WAIT(3);
|
||||
|
||||
if (idx == 5)
|
||||
sound.playSound("padspell.voc");
|
||||
else if (idx == 11)
|
||||
sound.playFX(9);
|
||||
}
|
||||
|
||||
screen.restoreBackground();
|
||||
sc23[0].draw(screen, 0, Common::Point(72, 4));
|
||||
screen.update();
|
||||
screen.fadeOut();
|
||||
|
||||
sc23[0].clear();
|
||||
sc23[1].clear();
|
||||
|
||||
// Corak does a ricochet shot on Sheltem
|
||||
SpriteResource sc24[2] = {
|
||||
SpriteResource("sc24a.end"), SpriteResource("sc24b.end")
|
||||
};
|
||||
|
||||
screen.loadBackground("mainback.raw");
|
||||
screen.saveBackground();
|
||||
sc24[0].draw(screen, 0, Common::Point(148, 0));
|
||||
screen.update();
|
||||
screen.fadeIn(4);
|
||||
sound.playSound("cast.voc");
|
||||
|
||||
for (int idx = 0; idx < 30; ++idx) {
|
||||
screen.restoreBackground();
|
||||
sc24[idx / 15].draw(screen, idx % 15, Common::Point(148, 0));
|
||||
screen.update();
|
||||
WAIT(3);
|
||||
|
||||
if (idx == 6)
|
||||
sound.playSound("padspell.voc");
|
||||
else if (idx == 11 || idx == 14)
|
||||
sound.playSound("click.voc");
|
||||
else if (idx == 17)
|
||||
sound.playSound("thud1.voc");
|
||||
}
|
||||
|
||||
sc24[0].clear();
|
||||
sc24[1].clear();
|
||||
|
||||
// Admit your defeat Corak
|
||||
// Interestingly, the original also has a sc25b.end here, which was of
|
||||
// Corak speaking here. It seems this was ditched in favor of the
|
||||
// following closeup of him speaking "I do"
|
||||
SpriteResource sc25("sc25a.end");
|
||||
resetSubtitles();
|
||||
recordTime();
|
||||
_subtitleLineNum = 29;
|
||||
_subtitleSize = 1;
|
||||
|
||||
screen.loadBackground("sc250001.raw");
|
||||
screen.saveBackground();
|
||||
sc25.draw(screen, 0, Common::Point(27, 30));
|
||||
screen.update();
|
||||
|
||||
for (int struggleNum = 0; struggleNum < 2; ++struggleNum) {
|
||||
for (int idx = 0; idx < 9; ++idx) {
|
||||
if (struggleNum == 0 && idx == 2)
|
||||
sound.playSound("admit2.voc");
|
||||
|
||||
sc25.draw(screen, idx, Common::Point(27, 30));
|
||||
showSubtitles();
|
||||
WAIT(3);
|
||||
}
|
||||
}
|
||||
subtitlesWait();
|
||||
sc25.clear();
|
||||
|
||||
// I do. Kamakazi time
|
||||
SpriteResource sc26[4] = {
|
||||
SpriteResource("sc26a.end"), SpriteResource("sc26b.end"),
|
||||
SpriteResource("sc26c.end"), SpriteResource("sc26d.end")
|
||||
};
|
||||
resetSubtitles();
|
||||
recordTime();
|
||||
_subtitleLineNum = 30;
|
||||
_subtitleSize = 1;
|
||||
|
||||
screen.loadBackground("sc260001.raw");
|
||||
screen.saveBackground();
|
||||
showSubtitles();
|
||||
sound.playSound("ido2.voc");
|
||||
|
||||
for (int idx = 0; sound.isPlaying() || _subtitleSize; ) {
|
||||
screen.restoreBackground();
|
||||
sc26[idx / 8].draw(screen, idx % 8, Common::Point(58, 25));
|
||||
WAIT(2);
|
||||
|
||||
idx = (idx == 31) ? 22 : idx + 1;
|
||||
}
|
||||
|
||||
screen.loadBackground("sc270001.raw");
|
||||
screen.saveBackground();
|
||||
|
||||
while (sound.isPlaying() && !_vm->shouldQuit()) {
|
||||
events.pollEventsAndWait();
|
||||
if (events.isKeyMousePressed())
|
||||
return false;
|
||||
}
|
||||
|
||||
for (int idx = 0; idx < 4; ++idx)
|
||||
sc26[idx].clear();
|
||||
|
||||
// What? No!
|
||||
SpriteResource sc27("sc27.end");
|
||||
resetSubtitles();
|
||||
recordTime();
|
||||
_subtitleLineNum = 31;
|
||||
_subtitleSize = 1;
|
||||
showSubtitles();
|
||||
|
||||
for (int idx = 0; idx < 12; ++idx) {
|
||||
if (idx == 1)
|
||||
sound.playSound("what3.voc");
|
||||
|
||||
screen.restoreBackground();
|
||||
sc27.draw(screen, idx, Common::Point(65, 22));
|
||||
showSubtitles();
|
||||
WAIT(3);
|
||||
}
|
||||
|
||||
subtitlesWait();
|
||||
sc27.clear();
|
||||
|
||||
// Vortex is opened and the two are sucked in, obliterating them
|
||||
SpriteResource sc28[11] = {
|
||||
SpriteResource("sca28.end"), SpriteResource("scb28.end"),
|
||||
SpriteResource("scc28.end"), SpriteResource("scd28.end"),
|
||||
SpriteResource("sce28.end"), SpriteResource("scf28.end"),
|
||||
SpriteResource("scg28.end"), SpriteResource("sch28.end"),
|
||||
SpriteResource("sci28.end"), SpriteResource("sck28.end"),
|
||||
SpriteResource("sck28.end")
|
||||
};
|
||||
|
||||
sound.playSong("dungeon2.m");
|
||||
screen.fadeOut();
|
||||
screen.loadBackground("mainback.raw");
|
||||
screen.saveBackground();
|
||||
|
||||
sc28[0].draw(screen, 0, Common::Point(74, 0));
|
||||
screen.update();
|
||||
screen.fadeIn();
|
||||
|
||||
for (int idx = 0; idx < 44; ++idx) {
|
||||
screen.restoreBackground();
|
||||
sc28[idx / 4].draw(screen, idx % 4, Common::Point(74, 0));
|
||||
screen.update();
|
||||
WAIT(3);
|
||||
|
||||
if (idx == 0 || idx == 10 || idx == 18)
|
||||
sound.playSound("rumble.voc");
|
||||
else if (idx == 27)
|
||||
sound.playSound("airmon.voc");
|
||||
else if (idx == 38)
|
||||
sound.playSound("explosio.voc");
|
||||
}
|
||||
|
||||
screen.fadeOut();
|
||||
for (int idx = 0; idx < 11; ++idx)
|
||||
sc28[idx].clear();
|
||||
|
||||
// Longshot of castle blowing up
|
||||
SpriteResource sc29[6] = {
|
||||
SpriteResource("sc29a.end"), SpriteResource("sc29b.end"),
|
||||
SpriteResource("sc29c.end"), SpriteResource("sc29d.end"),
|
||||
SpriteResource("sc29e.end"), SpriteResource("sc29f.end")
|
||||
};
|
||||
|
||||
screen.loadBackground("sc290001.raw");
|
||||
screen.saveBackground();
|
||||
screen.fadeIn();
|
||||
|
||||
for (int idx = 0; idx < 54; ++idx) {
|
||||
screen.restoreBackground();
|
||||
if (idx == 40)
|
||||
sound.songCommand(207);
|
||||
|
||||
sc29[idx / 10].draw(screen, idx % 10, Common::Point(92, 10));
|
||||
screen.update();
|
||||
WAIT(3);
|
||||
|
||||
if (idx == 1 || idx == 5 || idx == 11 || idx == 19 || idx == 34 || idx == 35)
|
||||
sound.playSound("explosio.voc");
|
||||
}
|
||||
|
||||
// Final bit of smoke from destroyed castle
|
||||
for (int loopNum = 0; loopNum < 4; ++loopNum) {
|
||||
for (int idx = 49; idx < 54; ++idx) {
|
||||
screen.restoreBackground();
|
||||
sc29[idx / 10].draw(screen, idx % 10, Common::Point(92, 10));
|
||||
screen.update();
|
||||
WAIT(3);
|
||||
}
|
||||
}
|
||||
|
||||
for (int idx = 0; idx < 6; ++idx)
|
||||
sc29[idx].clear();
|
||||
|
||||
freeSubtitles();
|
||||
return true;
|
||||
|
Loading…
Reference in New Issue
Block a user