XEEN: More of Clouds endgame

This commit is contained in:
Paul Gilbert 2018-02-06 09:12:51 -05:00
parent 59eeadc6ac
commit eb50364c2d
6 changed files with 291 additions and 7 deletions

View File

@ -1726,6 +1726,18 @@ const char *const Resources::WORLD_CONGRATULATIONS2 =
"Include the message\n"
"\"%s\"\n"
"with your final score and receive a special bonus.";
const char *const Resources::CLOUDS_CONGRATULATIONS1 =
"\xC""23\x3l"
"\xB""000\t000Please send this score to the Ancient's Headquarters "
"where you'll be added to the Hall of Legends!\xC""33\x3""c"
"\xB""070\t000Press a Key";
const char *const Resources::CLOUDS_CONGRATULATIONS2 =
"\xC""23\x3l"
"\xB""000\t000Ancient's Headquarters\n"
"New World Computing, Inc.\n"
"P.O. Box 4302\n"
"Hollywood, CA 90078-4302\xC""33\x3""c"
"\xB""070\t000Press a Key";
const char *const Resources::GOOBER[3] = {
"", "I am a Goober!", "I am a Super Goober!"
};

View File

@ -364,6 +364,8 @@ public:
static const char *const WORLD_END_TEXT[9];
static const char *const WORLD_CONGRATULATIONS;
static const char *const WORLD_CONGRATULATIONS2;
static const char *const CLOUDS_CONGRATULATIONS1;
static const char *const CLOUDS_CONGRATULATIONS2;
static const char *const GOOBER[3];
public:
/**

View File

@ -1080,7 +1080,15 @@ bool Scripts::cmdSetVar(ParamsIterator &params) {
return true;
}
bool Scripts::cmdCutsceneEndClouds(ParamsIterator &params) { error("TODO"); }
bool Scripts::cmdCutsceneEndClouds(ParamsIterator &params) {
Party &party = *_vm->_party;
party._gameFlags[0][75] = true;
party._mazeId = 28;
party._mazePosition = Common::Point(18, 4);
doCloudsEnding();
return false;
}
bool Scripts::cmdWhoWill(ParamsIterator &params) {
int msg = params.readByte();

View File

@ -336,9 +336,11 @@ bool CloudsCutscenes::showCloudsIntro() {
return true;
}
void CloudsCutscenes::showCloudsEnding() {
void CloudsCutscenes::showCloudsEnding(uint finalScore) {
if (showCloudsEnding1())
showCloudsEnding2();
if (showCloudsEnding2())
if (!showCloudsEnding3())
showCloudsEnding4(finalScore);
}
bool CloudsCutscenes::showCloudsEnding1() {
@ -571,6 +573,255 @@ bool CloudsCutscenes::showCloudsEnding1() {
}
bool CloudsCutscenes::showCloudsEnding2() {
EventsManager &events = *_vm->_events;
Screen &screen = *_vm->_screen;
Sound &sound = *_vm->_sound;
SpriteResource king("king.end"), room("room.end"), bigSky("bigsky.end"),
mirror("mirror.end"), mirrBack("mirrback.end"), people("people.end"),
crodo("crodo.end"), kingCord("kingcord.end");
screen.loadPalette("endgame.pal");
screen.loadBackground("later.raw");
screen.fadeIn();
WAIT(100);
screen.fadeOut();
screen.loadBackground("throne1.raw");
screen.loadPage(0);
screen.loadBackground("throne2.raw");
screen.loadPage(1);
int ctr1 = 0, ctr3 = -1, ctr4 = 0, ctr5 = 0;
int xp2 = SCREEN_WIDTH;
for (int ctr2 = SCREEN_WIDTH, xp1 = 117, xp3 = 0; ctr2 > 0; ) {
events.updateGameCounter();
screen.horizMerge(xp3);
people.draw(0, 0, Common::Point(xp1, 68), SPRFLAG_800);
if (xp3 > 250) {
crodo.draw(0, 0, Common::Point(xp2, 68), SPRFLAG_800);
xp2 -= ctr1 * 2;
}
events.pollEventsAndWait();
if (_vm->shouldQuit())
return false;
if (!ctr4) {
ctr1 = events.timeElapsed();
if (!ctr1)
ctr1 = 1;
ctr4 = 1;
ctr5 = ctr1 * 2;
}
xp3 += ctr1;
ctr2 -= ctr1;
xp1 -= ctr5;
if (xp2 < 181)
xp2 = 181;
if (ctr3) {
screen.fadeIn();
ctr3 = 0;
}
}
screen.horizMerge(SCREEN_WIDTH);
crodo.draw(0, 0, Common::Point(xp2, 68), SPRFLAG_800);
screen.freePages();
WAIT(5);
Graphics::ManagedSurface savedBg;
savedBg.blitFrom(screen);
const int XLIST1[13] = { 0, -5, -10, -15, -20, -25, -30, -33, -27, -22, -17 };
const int XLIST2[13] = { 60, 145, 130, 115, 100, 85, 70, 57, 53, 48, 42, 39, 34 };
const int YLIST[13] = { 42, 39, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
for (int idx = 12; idx >= 0; --idx) {
screen.blitFrom(savedBg);
king.draw(0, 0, Common::Point(XLIST1[idx], YLIST[idx]));
king.draw(0, 1, Common::Point(XLIST2[idx], YLIST[idx]));
WAIT(1);
}
const char *const VOC_NAMES[3] = { "king1.voc", "king2.voc", "king3.voc" };
_subtitleSize = 0;
for (int idx = 0; idx < 3; ++idx) {
sound.playSound(VOC_NAMES[idx]);
do {
king.draw(0, 0, Common::Point(0, 0));
king.draw(0, 1, Common::Point(160, 0));
int frame = getSpeakingFrame(1, 6);
if (frame > 1)
king.draw(0, frame);
showSubtitles();
WAIT(3);
} while (sound.isPlaying() || _subtitleSize);
king.draw(0, 0, Common::Point(0, 0));
king.draw(0, 1, Common::Point(160, 0));
WAIT(1);
}
screen.fadeOut();
screen.loadPalette("mirror.pal");
screen.loadBackground("miror-s.raw");
screen.loadPage(0);
screen.loadPage(1);
room.draw(0, 0, Common::Point(0, 0));
room.draw(0, 1, Common::Point(160, 0));
screen.fadeIn();
for (int idx = 0; idx < 83; ++idx) {
screen.horizMerge(idx);
room.draw(0, 0, Common::Point(0, 0));
room.draw(0, 1, Common::Point(160, 0));
WAIT(1);
}
screen.freePages();
savedBg.blitFrom(screen);
const int XLIST3[9] = { 0, -5, -10, -15, -24, -30, -39, -50, -59 };
const int YLIST3[9] = { 0, 12, 25, 37, 46, 52, 59, 64, 68 };
for (int idx = 8; idx >= 0; --idx) {
screen.blitFrom(savedBg);
bigSky.draw(0, 0, Common::Point(XLIST3[idx], YLIST3[idx]), 0, idx);
mirrBack.draw(0, 0, Common::Point(XLIST3[idx], YLIST3[idx]), 0, idx);
WAIT(1);
}
int mergeX = 0;
const int DELTA = 2;
for (int idx = 0, xc1 = -115, yp = SCREEN_HEIGHT, xc2 = 335;
idx < 115; idx += DELTA, xc1 += DELTA, yp -= DELTA, xc2 -= DELTA) {
screen.horizMerge(mergeX);
mergeX = (mergeX + 1) % SCREEN_WIDTH;
mirrBack.draw(0, 0);
mirror.draw(0, 0);
kingCord.draw(0, 0, Common::Point(xc1, yp), SPRFLAG_800);
kingCord.draw(0, 1, Common::Point(xc2, yp), SPRFLAG_800);
WAIT(1);
}
screen.horizMerge(mergeX);
mergeX = (mergeX + 1) % SCREEN_WIDTH;
mirrBack.draw(0, 0);
mirror.draw(0, 0);
kingCord.draw(0, 0, Common::Point(0, 85), SPRFLAG_800);
kingCord.draw(0, 1, Common::Point(220, 85), SPRFLAG_800);
return true;
}
bool CloudsCutscenes::showCloudsEnding3() {
SpriteResource mon088("088.mon"), att034("034.att");
// TODO
doScroll(true, false);
return true;
}
bool CloudsCutscenes::showCloudsEnding4(uint finalScore) {
EventsManager &events = *_vm->_events;
Screen &screen = *_vm->_screen;
Windows &windows = *_vm->_windows;
SpriteResource mirror("mirror.end"), mirrBack("mirrback.end"),
endText("endtext.end");
int mergeX = 298;
screen.horizMerge(mergeX);
mirrBack.draw(0, 0);
mirror.draw(0, 0);
doScroll(false, false);
for (int idx = 0; idx < 19; ++idx) {
screen.horizMerge(mergeX);
mergeX = (mergeX + 1) % SCREEN_WIDTH;
mirrBack.draw(0, 0);
mirror.draw(0, 0);
endText.draw(0, idx);
WAIT(1);
}
int frames[10];
const int FRAMEX[10] = { 64, 83, 102, 121, 140, 159, 178, 197, 216, 235 };
for (int idx1 = 0; idx1 < 30; ++idx1) {
for (int idx2 = 0; idx2 < 10; ++idx2)
frames[idx2] = getSpeakingFrame(20, 29);
screen.horizMerge(mergeX);
mergeX = (mergeX + 1) % SCREEN_WIDTH;
mirrBack.draw(0, 0);
mirror.draw(0, 0);
endText.draw(0, 19);
for (int idx2 = 0; idx2 < 10; ++idx2)
endText.draw(0, frames[idx2], Common::Point(FRAMEX[idx2], 73));
WAIT(2);
}
Common::String scoreStr = Common::String::format("%.10u", finalScore);
for (int idx1 = 0; idx1 < 10; ++idx1) {
for (int idx2 = 0; idx2 < 10; ++idx2)
frames[idx2] = getSpeakingFrame(20, 29);
for (int idx2 = 0; idx2 <= idx1; ++idx2)
frames[9 - idx2] = (byte)scoreStr[9 - idx2] - 28;
screen.horizMerge(mergeX);
mergeX = (mergeX + 1) % SCREEN_WIDTH;
mirrBack.draw(0, 0);
mirror.draw(0, 0);
endText.draw(0, 19);
for (int idx2 = 0; idx2 < 10; ++idx2)
endText.draw(0, frames[idx2], Common::Point(FRAMEX[idx2], 73));
WAIT(2);
}
// Move the score down
for (int idx1 = 0; idx1 < 38; ++idx1) {
screen.horizMerge(mergeX);
mergeX = (mergeX + 1) % SCREEN_WIDTH;
mirrBack.draw(0, 0);
mirror.draw(0, 0);
endText.draw(0, 19);
for (int idx2 = 0; idx2 < 10; ++idx2)
endText.draw(0, frames[idx2], Common::Point(FRAMEX[idx2], 73 + idx1));
WAIT(1);
}
windows[28].setBounds(Common::Rect(63, 60, 254, 160));
for (int idx1 = 0; idx1 < 38; ++idx1) {
screen.horizMerge(mergeX);
mergeX = (mergeX + 1) % SCREEN_WIDTH;
mirrBack.draw(0, 0);
mirror.draw(0, 0);
endText.draw(0, 19);
for (int idx2 = 0; idx2 < 10; ++idx2)
endText.draw(0, frames[idx2], Common::Point(FRAMEX[idx2], 110));
windows[28].writeString(Res.CLOUDS_CONGRATULATIONS1);
WAIT(1);
}
// TODO
return true;
}

View File

@ -46,9 +46,20 @@ private:
bool showCloudsEnding1();
/**
* Shows part 1 of the Clouds of Xeen ending
* Shows part 2 of the Clouds of Xeen ending
*/
bool showCloudsEnding2();
/**
* Shows part 3 of the Clouds of Xeen ending, which shows a display
* of the game's monsters
*/
bool showCloudsEnding3();
/**
* Shows part 4 of the Clouds of Xeen ending, the final score
*/
bool showCloudsEnding4(uint finalScore);
public:
CloudsCutscenes(XeenEngine *vm) : Cutscenes(vm) {}
@ -65,7 +76,7 @@ public:
/**
* Shows the Clouds of Xeen ending sequence
*/
void showCloudsEnding();
void showCloudsEnding(uint finalScore);
};
} // End of namespace WorldOfXeen

View File

@ -54,7 +54,7 @@ void WorldOfXeenEngine::outerGameLoop() {
break;
case WOX_CLOUDS_ENDING:
showCloudsEnding();
//showCloudsEnding();
break;
case WOX_DARKSIDE_INTRO:
@ -169,7 +169,7 @@ void WorldOfXeenEngine::showCutscene(const Common::String &name, int status, uin
_sound->stopAllAudio();
if (name == "ENDGAME")
showCloudsEnding();
showCloudsEnding(score);
else if (name == "ENDGAME2")
showDarkSideEnding();
else if (name == "WORLDEND")