diff options
| -rw-r--r-- | engines/xeen/resources.cpp | 13 | ||||
| -rw-r--r-- | engines/xeen/resources.h | 1 | ||||
| -rw-r--r-- | engines/xeen/worldofxeen/worldofxeen.cpp | 196 | ||||
| -rw-r--r-- | engines/xeen/worldofxeen/worldofxeen.h | 5 | 
4 files changed, 215 insertions, 0 deletions
| diff --git a/engines/xeen/resources.cpp b/engines/xeen/resources.cpp index 8e23341046..1239dd9512 100644 --- a/engines/xeen/resources.cpp +++ b/engines/xeen/resources.cpp @@ -1693,5 +1693,18 @@ 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] = { +	"\n\n\n\n\n\n\n" +	"Congratulations Adventurers!\n\n" +	"Let the unification ceremony begin!", +	"And so the call went out to the people throughout the lands of Xeen" +	" that the prophecy was nearing completion.", +	"They came in great numbers to witness the momentous occasion.", +	"\xB""026The Dragon Pharoah presided over the ceremony.", +	"\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." +};  } // End of namespace Xeen diff --git a/engines/xeen/resources.h b/engines/xeen/resources.h index 040a787538..de031dba77 100644 --- a/engines/xeen/resources.h +++ b/engines/xeen/resources.h @@ -361,6 +361,7 @@ 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];  public:  	/**  	 * Initializes an instnace of the resources diff --git a/engines/xeen/worldofxeen/worldofxeen.cpp b/engines/xeen/worldofxeen/worldofxeen.cpp index 9812b45e0f..4d25c4758c 100644 --- a/engines/xeen/worldofxeen/worldofxeen.cpp +++ b/engines/xeen/worldofxeen/worldofxeen.cpp @@ -178,8 +178,204 @@ void WorldOfXeenEngine::showCutscene(const Common::String &name) {  }  void WorldOfXeenEngine::showWorldOfXeenEnding() { +	Windows &windows = *_windows; +	Window &w0 = windows[0]; + +	_files->setGameCc(1); +	_sound->playSong("outday3.m"); +	showPharaohEndText(Res.WORLD_END_TEXT[0], nullptr, nullptr); +	_sound->playSound("elect.voc"); + +	Graphics::ManagedSurface savedBg; +	_screen->loadBackground("skymain.raw"); +	savedBg.copyFrom(*_screen); +	_screen->loadBackground("twrsky1.raw"); +	_screen->loadPage(0); +	_screen->loadPage(1); +	_screen->loadPalette("skymain.pal"); + +	SpriteResource sc02("sc02.eg2"), tower1("tower1.eg2"), tower2("tower2.eg2"), +		sc3a("sc3a.eg2"), sc06("sc06.eg2"), sc14("sc14.eg2"), sc13("sc13.eg2"), +		sc17("sc17.eg2"), cube("cube.eg2"), hands("hands.eg2"), +		sc20a("sc20a.eg2"), sc20b("sc20b.eg2"), sc20c("sc20c.eg2"), +		sc20d("sc20d.eg2"), sc22a("sc22a.eg2"), sc22b("sc22b.eg2"), +		sc10("sc10.eg2"), staff("staff.eg2"); +	SpriteResource sc3b[2] = { +		SpriteResource("sc3b1.eg2"), SpriteResource("sc3b2.eg2") +	}; + +	windows[41].writeString("\x1\xD"); +	_screen->fadeOut(); +	while (!shouldQuit() && _sound->isPlaying()) +		_events->pollEventsAndWait(); + +	_sound->playSong("nwblksmt.m"); +	_screen->blitFrom(savedBg); +	setWorldEndingSubtitle(Res.WORLD_END_TEXT[1]); +	w0.update(); +	_screen->fadeIn(); + +	_events->updateGameCounter(); +	_events->wait(60); + +	for (int idx = 0; idx < 50 && !shouldQuit(); ++idx) { +		if (idx == 9 || idx == 22 || idx == 33 || idx == 44) +			_sound->playSound("whoosh.voc"); + +		_events->updateGameCounter(); +		_screen->blitFrom(savedBg); +		sc02.draw(0, idx); +		setWorldEndingSubtitle(Res.WORLD_END_TEXT[1]); +		w0.update(); + +		_events->wait(2); +	} + +	for (int idx = 0; idx < 40 && !shouldQuit(); ++idx) { +		_screen->horizMerge(); +		_events->updateGameCounter(); +		tower1.draw(0, 0, Common::Point(0, 0), SPRFLAG_800); +		sc3a.draw(0, idx, Common::Point(91, 86), SPRFLAG_800); + +		w0.update(); +		_events->wait(2); +	} + +	int frame = 40, frame2 = 0; +	for (int idx = 0, xp = 0; idx < SCREEN_WIDTH && !shouldQuit(); ++idx) { +		_events->updateGameCounter(); +		_screen->horizMerge(xp); +		tower1.draw(0, 0, Common::Point(idx, 0), SPRFLAG_800); +		sc3a.draw(0, frame, Common::Point(idx + 91, 86), SPRFLAG_800); +		tower2.draw(0, 0, Common::Point(idx - 320, 0), SPRFLAG_800); +		tower2.draw(0, 1, Common::Point(idx - (SCREEN_WIDTH / 2), 0), SPRFLAG_800); +		sc3b[frame2 / 30].draw(0, frame2 % 30, Common::Point(idx - 277, 65), SPRFLAG_800); + +		frame = (frame + 1) % 57; +		if (idx > (SCREEN_WIDTH / 2)) +			frame2 = (frame2 + 1) % 60; +		xp -= 2; +		if (xp < 1) +			xp = SCREEN_WIDTH; + +		if (idx > 120) +			setWorldEndingSubtitle(Res.WORLD_END_TEXT[2]); +		w0.update(); +		_events->wait(2); +	} + +	for (; frame2 < 60 && !shouldQuit(); ++frame2) { +		_events->updateGameCounter(); +		_screen->horizMerge(frame); +		tower2.draw(0, 0, Common::Point(0, 0), SPRFLAG_800); +		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]); +		w0.update(); +		_events->wait(2); +	} + +	if (shouldQuit()) +		return; +	_screen->freePages(); +	_screen->fadeOut(); +	_screen->loadBackground("foura.raw"); +	savedBg.blitFrom(*_screen); + +	sc06.draw(0, 0, Common::Point(26, 25)); +	w0.update(); +	_screen->fadeIn(); + +	for (int idx = 0; idx < 26 && !shouldQuit(); ++idx) { +		_events->updateGameCounter(); +		_screen->blitFrom(savedBg); +		sc06.draw(0, idx, Common::Point(26, 75)); +		_events->wait(2); +	} + +	if (shouldQuit()) +		return; +	_screen->fadeOut(); +	_screen->loadBackground("eg140001.raw"); +	savedBg.blitFrom(*_screen); +	w0.update(); +	setWorldEndingSubtitle(Res.WORLD_END_TEXT[3]); +	_screen->fadeIn(); + +	for (int idx1 = 0; idx1 < 2 && !shouldQuit(); ++idx1) { +		for (int idx2 = 0; idx2 < 15 && !shouldQuit(); ++idx2) { +			_events->updateGameCounter(); +			_screen->blitFrom(savedBg); +			sc14.draw(0, idx2, Common::Point(141, 63)); +			setWorldEndingSubtitle(Res.WORLD_END_TEXT[3]); + +			w0.update(); +			_events->wait(2); +		} +	} + +	_screen->loadBackground("eg100001.raw"); +	_screen->loadPage(0); +	savedBg.blitFrom(*_screen); + +	for (int idx1 = 0; idx1 < 2 && !shouldQuit(); ++idx1) { +		for (int idx2 = 0; idx2 < 6 && !shouldQuit(); ++idx2) { +			_events->updateGameCounter(); +			_screen->blitFrom(savedBg); +			sc14.draw(0, idx2, Common::Point(26, 21)); +			setWorldEndingSubtitle(Res.WORLD_END_TEXT[4]); + +			w0.update(); +			_events->wait(2); +		} +	} + +	_screen->blitFrom(savedBg); +	sc13.draw(0, 5, Common::Point(26, 21)); +	savedBg.blitFrom(*_screen); +	setWorldEndingSubtitle(Res.WORLD_END_TEXT[4]); +	w0.update(); + +	frame = 0; +	for (int idx = 185; idx > 68 && !shouldQuit(); idx -= 3) { +		if (!_sound->isPlaying()) +			_sound->playSound("cast.voc"); + +		_events->updateGameCounter(); +		_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]); + +		w0.update(); +		_events->wait(2); +		frame = (frame + 1) % 17; +	} + +	for (int idx = 0; idx < 17 && !shouldQuit(); ++idx) { +		if (!_sound->isPlaying()) +			_sound->playSound("cast.voc"); + +		_events->updateGameCounter(); +		_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]); + +		w0.update(); +		_events->wait(2); +	}  	// TODO  } +void WorldOfXeenEngine::setWorldEndingSubtitle(const Common::String &msg) { +	Windows &windows = *_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"; +	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.h b/engines/xeen/worldofxeen/worldofxeen.h index 0ec31f3bf0..5c050e71c6 100644 --- a/engines/xeen/worldofxeen/worldofxeen.h +++ b/engines/xeen/worldofxeen/worldofxeen.h @@ -47,6 +47,11 @@ private:  	 * Show World of Xeen ending  	 */  	void showWorldOfXeenEnding(); + +	/** +	 * Sets a subtitle during the world of xeen ending +	 */ +	void setWorldEndingSubtitle(const Common::String &msg);  protected:  	/**  	 * Outer gameplay loop responsible for dispatching control to game-specific | 
