[Scummvm-git-logs] scummvm master -> 68602a9e0a485124b38d3cb365e51cf4fbbddcbc

mgerhardy martin.gerhardy at gmail.com
Sun Oct 31 19:03:15 UTC 2021


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
68602a9e0a TWINE: little big adventure 2 fixes


Commit: 68602a9e0a485124b38d3cb365e51cf4fbbddcbc
    https://github.com/scummvm/scummvm/commit/68602a9e0a485124b38d3cb365e51cf4fbbddcbc
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-10-31T20:03:11+01:00

Commit Message:
TWINE: little big adventure 2 fixes

implemented smk movieinfo handling
main menu shows correct text now
music track handling

Changed paths:
    engines/twine/audio/music.cpp
    engines/twine/holomap.cpp
    engines/twine/menu/menu.cpp
    engines/twine/menu/menuoptions.cpp
    engines/twine/movies.cpp
    engines/twine/movies.h
    engines/twine/resources/resources.cpp
    engines/twine/resources/resources.h
    engines/twine/script/script_life_v1.cpp
    engines/twine/script/script_move_v1.cpp
    engines/twine/shared.h
    engines/twine/twine.cpp
    engines/twine/twine.h


diff --git a/engines/twine/audio/music.cpp b/engines/twine/audio/music.cpp
index 7e6373cf5f..d1f03bafa4 100644
--- a/engines/twine/audio/music.cpp
+++ b/engines/twine/audio/music.cpp
@@ -35,8 +35,6 @@
 
 namespace TwinE {
 
-/** MP3 music folder */
-#define MUSIC_FOLDER "music"
 /**
  * LBA1 default number of tracks
  * <pre>
@@ -62,7 +60,6 @@ namespace TwinE {
  *    INDEX 01 32:04:62
  * </pre>
  */
-#define NUM_CD_TRACKS 10
 
 TwinEMidiPlayer::TwinEMidiPlayer(TwinEEngine* engine) : _engine(engine) {
 	MidiPlayer::createDriver();
@@ -123,10 +120,58 @@ void Music::musicFadeOut() {
 	musicVolume(volume);
 }
 
+static const char *musicTracksLba2[] = {
+	""
+	"",
+	"TADPCM1",
+	"TADPCM2",
+	"TADPCM3",
+	"TADPCM4",
+	"TADPCM5",
+	"JADPCM01",
+	"",	// Track6.wav
+	"JADPCM02",
+	"JADPCM03",
+	"JADPCM04",
+	"JADPCM05",
+	"JADPCM06",
+	"JADPCM07",
+	"JADPCM08",
+	"JADPCM09",
+	"JADPCM10",
+	"JADPCM11",
+	"JADPCM12",
+	"JADPCM13",
+	"JADPCM14",
+	"JADPCM15",
+	"JADPCM16",
+	"JADPCM17",
+	"JADPCM18",
+	"LOGADPCM"
+};
+
 bool Music::playTrackMusicCd(int32 track) {
 	if (!_engine->_cfgfile.UseCD) {
 		return false;
 	}
+
+	if (_engine->isLBA2()) {
+		const char *basename = musicTracksLba2[track];
+		Audio::SeekableAudioStream *stream = Audio::SeekableAudioStream::openStreamFile(basename);
+		if (stream != nullptr) {
+			const int volume = _engine->_system->getMixer()->getVolumeForSoundType(Audio::Mixer::kMusicSoundType);
+			_engine->_system->getMixer()->playStream(Audio::Mixer::kMusicSoundType, &_midiHandle,
+						Audio::makeLoopingAudioStream(stream, 1), volume);
+			debug(3, "Play audio track %s for track id %i", basename, track);
+			return true;
+		}
+		debug(3, "Failed to find a supported format for audio track: %s", basename);
+		// TODO: are there versions with real audio cd?
+		// us release starting at track 0
+		// other releases at track 6
+		return false;
+	}
+
 	AudioCDManager *cdrom = g_system->getAudioCDManager();
 	return cdrom->play(track, 1, 0, 0);
 }
@@ -199,7 +244,7 @@ bool Music::playMidiMusic(int32 midiIdx, int32 loop) {
 		stopMidiMusic();
 	}
 
-	if (_engine->_gameFlags & TF_DOTEMU_ENHANCED) {
+	if (_engine->isDotEmuEnhanced()) {
 		const Common::String &trackName = Common::String::format("lba1-%02i", midiIdx);
 		Audio::SeekableAudioStream *stream = Audio::SeekableAudioStream::openStreamFile(trackName);
 		if (stream != nullptr) {
diff --git a/engines/twine/holomap.cpp b/engines/twine/holomap.cpp
index 069e986df3..fc3ce3eb1c 100644
--- a/engines/twine/holomap.cpp
+++ b/engines/twine/holomap.cpp
@@ -63,15 +63,15 @@ static const float zDistanceTrajectory = 5300.0f;
 Holomap::Holomap(TwinEEngine *engine) : _engine(engine) {}
 
 int32 Holomap::distance(float distance) const {
-	const float w = (float)_engine->width() / (float)ORIGINAL_WIDTH;
-	const float h = (float)_engine->height() / (float)ORIGINAL_HEIGHT;
+	const float w = (float)_engine->width() / (float)_engine->originalWidth();
+	const float h = (float)_engine->height() / (float)_engine->originalHeight();
 	const float f = MIN<float>(w, h);
 	return (int32)(distance / f);
 }
 
 int32 Holomap::scale(float val) const {
-	const float w = (float)_engine->width() / (float)ORIGINAL_WIDTH;
-	const float h = (float)_engine->height() / (float)ORIGINAL_HEIGHT;
+	const float w = (float)_engine->width() / (float)_engine->originalWidth();
+	const float h = (float)_engine->height() / (float)_engine->originalHeight();
 	const float f = MIN<float>(w, h);
 	return (int32)(val * f);
 }
diff --git a/engines/twine/menu/menu.cpp b/engines/twine/menu/menu.cpp
index 1df4c50c90..efdaa29fde 100644
--- a/engines/twine/menu/menu.cpp
+++ b/engines/twine/menu/menu.cpp
@@ -79,13 +79,22 @@ enum MenuButtonTypesEnum {
 
 namespace _priv {
 
-static MenuSettings createMainMenu() {
+static MenuSettings createMainMenu(bool lba1) {
 	MenuSettings settings;
 	settings.setButtonsBoxHeight(200);
-	settings.addButton(TextId::kNewGame);
-	settings.addButton(TextId::kContinueGame);
-	settings.addButton(TextId::kOptions);
-	settings.addButton(TextId::kQuit);
+	if (lba1) {
+		settings.addButton(TextId::kNewGame);
+		settings.addButton(TextId::kContinueGame);
+		settings.addButton(TextId::kOptions);
+		settings.addButton(TextId::kQuit);
+	} else {
+		settings.addButton(TextId::toContinueGame);
+		settings.addButton(TextId::toNewGame);
+		settings.addButton(TextId::toLoadGame);
+		settings.addButton(TextId::toSauver);
+		settings.addButton(TextId::toOptions);
+		settings.addButton(TextId::toQuit);
+	}
 	return settings;
 }
 
@@ -106,7 +115,7 @@ static MenuSettings createGiveUpSaveMenu() {
 	return settings;
 }
 
-static MenuSettings createOptionsMenu() {
+static MenuSettings createOptionsMenu(bool lba1) {
 	MenuSettings settings;
 	settings.addButton(TextId::kReturnMenu);
 	settings.addButton(TextId::kVolumeSettings);
@@ -160,12 +169,12 @@ const char *MenuSettings::getButtonText(Text *text, int buttonIndex) {
 Menu::Menu(TwinEEngine *engine) {
 	_engine = engine;
 
-	_optionsMenuState = _priv::createOptionsMenu();
+	_optionsMenuState = _priv::createOptionsMenu(engine->isLBA1());
 	_giveUpMenuWithSaveState = _priv::createGiveUpSaveMenu();
 	_volumeMenuState = _priv::createVolumeMenu();
 	_saveManageMenuState = _priv::createSaveManageMenu();
 	_giveUpMenuState = _priv::createGiveUpMenu();
-	_mainMenuState = _priv::createMainMenu();
+	_mainMenuState = _priv::createMainMenu(engine->isLBA1());
 	_advOptionsMenuState = _priv::createAdvancedOptionsMenu();
 
 	Common::fill(&_behaviourAnimState[0], &_behaviourAnimState[4], 0);
@@ -591,12 +600,14 @@ int32 Menu::processMenu(MenuSettings *menuSettings, bool showCredits) {
 			startMillis = loopMillis;
 		}
 		if (showCredits && loopMillis - startMillis > 11650) {
+			// TODO: lba2 only show the credits only in the main menu and you could force it by pressing shift+c
+			// TODO: lba2 has a cd audio track (2) for the credits
 			_engine->_menuOptions->showCredits();
-			if (_engine->_flaMovies->playFlaMovie(FLA_DRAGON3)) {
+			if (_engine->_movie->playMovie(FLA_DRAGON3)) {
 				if (!_engine->_screens->loadImageDelay(TwineImage(Resources::HQR_RESS_FILE, 15, 16), 3)) {
 					if (!_engine->_screens->loadImageDelay(TwineImage(Resources::HQR_RESS_FILE, 17, 18), 3)) {
 						if (!_engine->_screens->loadImageDelay(TwineImage(Resources::HQR_RESS_FILE, 19, 20), 3)) {
-							if (_engine->_flaMovies->playFlaMovie(FLA_BATEAU)) {
+							if (_engine->_movie->playMovie(FLA_BATEAU)) {
 								if (_engine->_cfgfile.Version == USA_VERSION) {
 									_engine->_screens->loadImageDelay(_engine->_resources->relentLogo(), 3);
 								} else {
@@ -766,23 +777,30 @@ EngineState Menu::run() {
 	FrameMarker frame(_engine);
 	_engine->_text->initTextBank(TextBankId::Options_and_menus);
 
-	_engine->_music->playTrackMusic(9); // LBA's Theme
+	if (_engine->isLBA1()) {
+		_engine->_music->playTrackMusic(9); // LBA's Theme
+	} else {
+		_engine->_music->playTrackMusic(6); // LBA2's Theme
+	}
 	_engine->_sound->stopSamples();
 
 	ScopedCursor scoped(_engine);
 	switch (processMenu(&_mainMenuState)) {
+	case (int32)TextId::toNewGame:
 	case (int32)TextId::kNewGame: {
 		if (_engine->_menuOptions->newGameMenu()) {
 			return EngineState::GameLoop;
 		}
 		break;
 	}
+	case (int32)TextId::toContinueGame:
 	case (int32)TextId::kContinueGame: {
 		if (_engine->_menuOptions->continueGameMenu()) {
 			return EngineState::LoadedGame;
 		}
 		break;
 	}
+	case (int32)TextId::toOptions:
 	case (int32)TextId::kOptions: {
 		optionsMenu();
 		break;
@@ -792,6 +810,7 @@ EngineState Menu::run() {
 		break;
 	}
 	case (int32)TextId::kQuit:
+	case (int32)TextId::toQuit:
 	case kQuitEngine:
 		debug("quit the game");
 		return EngineState::QuitGame;
diff --git a/engines/twine/menu/menuoptions.cpp b/engines/twine/menu/menuoptions.cpp
index 31cb62cb5a..a4483e0dec 100644
--- a/engines/twine/menu/menuoptions.cpp
+++ b/engines/twine/menu/menuoptions.cpp
@@ -81,7 +81,7 @@ void MenuOptions::newGame() {
 
 	if (!aborted) {
 		_engine->_music->playMidiMusic(1);
-		_engine->_flaMovies->playFlaMovie(FLA_INTROD);
+		_engine->_movie->playMovie(FLA_INTROD);
 	}
 
 	_engine->_text->textClipSmall();
@@ -114,7 +114,7 @@ void MenuOptions::showCredits() {
 }
 
 void MenuOptions::showEndSequence() {
-	_engine->_flaMovies->playFlaMovie(FLA_THEEND);
+	_engine->_movie->playMovie(FLA_THEEND);
 
 	_engine->_screens->clearScreen();
 	_engine->setPalette(_engine->_screens->_paletteRGBA);
diff --git a/engines/twine/movies.cpp b/engines/twine/movies.cpp
index 98c23ca8d5..2c8d5df998 100644
--- a/engines/twine/movies.cpp
+++ b/engines/twine/movies.cpp
@@ -23,6 +23,8 @@
 #include "twine/movies.h"
 #include "common/endian.h"
 #include "common/file.h"
+#include "common/language.h"
+#include "common/str.h"
 #include "common/system.h"
 #include "graphics/managed_surface.h"
 #include "image/gif.h"
@@ -353,11 +355,14 @@ void Movies::playGIFMovie(const char *flaName) {
 	}
 }
 
-bool Movies::playFlaMovie(const char *flaName) {
-	assert(_engine->isLBA1());
+bool Movies::playMovie(const char *name) {
+	if (_engine->isLBA2()) {
+		const int index = _engine->_resources->findSmkMovieIndex(name);
+		return playSmkMovie(name, index);
+	}
 	_engine->_sound->stopSamples();
 
-	Common::String fileNamePath = Common::String::format("%s", flaName);
+	Common::String fileNamePath = name;
 	const size_t n = fileNamePath.findLastOf(".");
 	if (n != Common::String::npos) {
 		fileNamePath.erase(n);
@@ -399,7 +404,7 @@ bool Movies::playFlaMovie(const char *flaName) {
 	if (version != MKTAG('V', '1', '.', '3')) {
 		int32 currentFrame = 0;
 
-		debug("Play fla: %s", flaName);
+		debug("Play fla: %s", name);
 
 		ScopedKeyMap scopedKeyMap(_engine, cutsceneKeyMapId);
 
@@ -451,20 +456,60 @@ bool Movies::playFlaMovie(const char *flaName) {
 	return finished;
 }
 
-void Movies::playSmkMovie(int index) {
+class TwineSmackerDecoder : public Video::SmackerDecoder {
+public:
+	void enableLanguage(int track, int volume) {
+		AudioTrack* audio = getAudioTrack(track);
+		if (audio == nullptr) {
+			return;
+		}
+		audio->setMute(false);
+		audio->setVolume(CLIP<int>(volume, 0, Audio::Mixer::kMaxMixerVolume));
+	}
+};
+
+bool Movies::playSmkMovie(const char *name, int index) {
 	assert(_engine->isLBA2());
-	Video::SmackerDecoder decoder;
+	TwineSmackerDecoder decoder;
 	Common::SeekableReadStream *stream = HQR::makeReadStream(TwineResource(Resources::HQR_VIDEO_FILE, index));
 	if (stream == nullptr) {
 		warning("Failed to find smacker video %i", index);
-		return;
+		return false;
 	}
 	if (!decoder.loadStream(stream)) {
 		warning("Failed to load smacker video %i", index);
-		return;
+		return false;
 	}
+	const int volume = _engine->_system->getMixer()->getVolumeForSoundType(Audio::Mixer::kMusicSoundType);
+	decoder.setVolume(CLIP<int>(volume, 0, Audio::Mixer::kMaxMixerVolume));
 	decoder.start();
 
+	decoder.setAudioTrack(0); // music
+	if (_engine->_cfgfile.Voice) {
+		int additionalAudioTrack = -1;
+		if (!scumm_strnicmp(name, "INTRO", 5)) {
+			switch (_engine->getGameLang()) {
+			default:
+			case Common::Language::EN_ANY:
+			case Common::Language::EN_GRB:
+			case Common::Language::EN_USA:
+				additionalAudioTrack = 3;
+				break;
+			case Common::Language::DE_DEU:
+				additionalAudioTrack = 2;
+				break;
+			case Common::Language::FR_FRA:
+				additionalAudioTrack = 1;
+				break;
+			}
+		}
+		const int speechVolume = _engine->_system->getMixer()->getVolumeForSoundType(Audio::Mixer::kSpeechSoundType);
+		debug(3, "Play additional speech track: %i (of %i tracks)", additionalAudioTrack, decoder.getAudioTrackCount());
+		decoder.enableLanguage(additionalAudioTrack, speechVolume);
+	} else {
+		debug(3, "Disabled smacker speech");
+	}
+
 	for (;;) {
 		if (decoder.endOfVideo()) {
 			break;
@@ -491,6 +536,7 @@ void Movies::playSmkMovie(int index) {
 	}
 
 	decoder.close();
+	return true;
 }
 
 } // namespace TwinE
diff --git a/engines/twine/movies.h b/engines/twine/movies.h
index f02198b856..f20e8f1ad9 100644
--- a/engines/twine/movies.h
+++ b/engines/twine/movies.h
@@ -95,17 +95,17 @@ private:
 	void prepareGIF(int index);
 	void playGIFMovie(const char *flaName);
 
+	bool playSmkMovie(const char *name, int index);
+
 public:
 	Movies(TwinEEngine *engine);
 
 	/**
 	 * Play FLA movies
-	 * @param flaName FLA movie name
+	 * @param name FLA movie name
 	 * @return @c true if finished. @c false if aborted.
 	 */
-	bool playFlaMovie(const char *flaName);
-
-	void playSmkMovie(int index);
+	bool playMovie(const char *name);
 };
 
 } // namespace TwinE
diff --git a/engines/twine/resources/resources.cpp b/engines/twine/resources/resources.cpp
index dca05b661c..9530b15804 100644
--- a/engines/twine/resources/resources.cpp
+++ b/engines/twine/resources/resources.cpp
@@ -211,6 +211,13 @@ const Trajectory *Resources::getTrajectory(int index) const {
 	return _trajectories.getTrajectory(index);
 }
 
+int Resources::findSmkMovieIndex(const char *name) const {
+	Common::String smkName = name;
+	smkName.toLowercase();
+	const Common::Array<int32> &info = getMovieInfo(smkName);
+	return info[0];
+}
+
 void Resources::loadMovieInfo() {
 	uint8 *content = nullptr;
 	int32 size;
@@ -228,7 +235,7 @@ void Resources::loadMovieInfo() {
 	Common::StringTokenizer tok(str, "\r\n");
 	int videoIndex = 0;
 	while (!tok.empty()) {
-		const Common::String &line = tok.nextToken();
+		Common::String line = tok.nextToken();
 		if (_engine->isLBA1()) {
 			Common::StringTokenizer lineTok(line);
 			if (lineTok.empty()) {
@@ -243,8 +250,15 @@ void Resources::loadMovieInfo() {
 			}
 			_movieInfo.setVal(name, frames);
 		} else {
-			Common::Array<int32> info(videoIndex);
+			Common::Array<int32> info(1);
+			info[0] = videoIndex;
+			line.toLowercase();
+			if (line.hasSuffix(".smk")) {
+				line = line.substr(0, line.size() - 4);
+			}
 			_movieInfo.setVal(line, info);
+			debug(4, "movie name %s mapped to hqr index %i", line.c_str(), videoIndex);
+			++videoIndex;
 		}
 	}
 }
diff --git a/engines/twine/resources/resources.h b/engines/twine/resources/resources.h
index 1194a8b961..4b07d8f717 100644
--- a/engines/twine/resources/resources.h
+++ b/engines/twine/resources/resources.h
@@ -189,6 +189,8 @@ public:
 
 	const TextEntry *getText(TextBankId textBankId, TextId index) const;
 
+	int findSmkMovieIndex(const char *name) const;
+
 	// main palette
 	static constexpr const char *HQR_RESS_FILE = "ress.hqr";
 	// dialoges
diff --git a/engines/twine/script/script_life_v1.cpp b/engines/twine/script/script_life_v1.cpp
index 1b50c73d42..ac8ea064e8 100644
--- a/engines/twine/script/script_life_v1.cpp
+++ b/engines/twine/script/script_life_v1.cpp
@@ -1199,7 +1199,7 @@ static int32 lPLAY_FLA(TwinEEngine *engine, LifeScriptContext &ctx) {
 		}
 	} while (true);
 
-	engine->_flaMovies->playFlaMovie(movie);
+	engine->_movie->playMovie(movie);
 	engine->setPalette(engine->_screens->_paletteRGBA);
 	engine->_screens->clearScreen();
 
diff --git a/engines/twine/script/script_move_v1.cpp b/engines/twine/script/script_move_v1.cpp
index 88b90014d5..37b060e6e7 100644
--- a/engines/twine/script/script_move_v1.cpp
+++ b/engines/twine/script/script_move_v1.cpp
@@ -561,7 +561,7 @@ static int32 mPLAY_FLA(TwinEEngine *engine, MoveScriptContext &ctx) {
 		}
 	} while (true);
 
-	engine->_flaMovies->playFlaMovie(movie);
+	engine->_movie->playMovie(movie);
 	engine->setPalette(engine->_screens->_paletteRGBA);
 	engine->_screens->clearScreen();
 	return 0;
diff --git a/engines/twine/shared.h b/engines/twine/shared.h
index fd6e531f85..3b073ec0a0 100644
--- a/engines/twine/shared.h
+++ b/engines/twine/shared.h
@@ -533,7 +533,16 @@ enum class TextId : int16 {
 	kCustomHighResOptionOn = -2,
 	kCustomHighResOptionOff = -3,
 	kCustomWallCollisionOn = -4,
-	kCustomWallCollisionOff = -5
+	kCustomWallCollisionOff = -5,
+
+	// ------ lba2
+
+	toContinueGame = 70,
+	toNewGame = 71,
+	toLoadGame = 72,
+	toSauver = 73,
+	toOptions = 74,
+	toQuit = 75
 };
 
 enum InventoryItems {
diff --git a/engines/twine/twine.cpp b/engines/twine/twine.cpp
index fdfe204a23..1dce5bb85b 100644
--- a/engines/twine/twine.cpp
+++ b/engines/twine/twine.cpp
@@ -131,6 +131,7 @@ TwinEEngine::TwinEEngine(OSystem *system, Common::Language language, uint32 flag
 	SearchMan.addSubDirectoryMatching(gameDataDir, "vox");
 	if (isLBA2()) {
 		SearchMan.addSubDirectoryMatching(gameDataDir, "video");
+		SearchMan.addSubDirectoryMatching(gameDataDir, "music");
 	}
 	if (isDotEmuEnhanced()) {
 		SearchMan.addSubDirectoryMatching(gameDataDir, "resources/lba_files/hqr");
@@ -162,7 +163,7 @@ TwinEEngine::TwinEEngine(OSystem *system, Common::Language language, uint32 flag
 	_movements = new Movements(this);
 	_interface = new Interface(this);
 	_menu = new Menu(this);
-	_flaMovies = new Movies(this);
+	_movie = new Movies(this);
 	_menuOptions = new MenuOptions(this);
 	_music = new Music(this);
 	_redraw = new Redraw(this);
@@ -193,7 +194,7 @@ TwinEEngine::~TwinEEngine() {
 	delete _movements;
 	delete _interface;
 	delete _menu;
-	delete _flaMovies;
+	delete _movie;
 	delete _menuOptions;
 	delete _music;
 	delete _redraw;
@@ -244,8 +245,8 @@ Common::Error TwinEEngine::run() {
 	AchMan.setActiveDomain(getMetaEngine()->getAchievementsInfo(gameTarget));
 
 	syncSoundSettings();
-	int32 w = ORIGINAL_WIDTH;
-	int32 h = ORIGINAL_HEIGHT;
+	int32 w = originalWidth();
+	int32 h = originalHeight();
 	const bool highRes = ConfMan.getBool("usehighres");
 	if (highRes) {
 		w = 1024;
@@ -374,7 +375,8 @@ void TwinEEngine::autoSave() {
 void TwinEEngine::allocVideoMemory(int32 w, int32 h) {
 	const Graphics::PixelFormat format = Graphics::PixelFormat::createFormatCLUT8();
 
-	_imageBuffer.create(ORIGINAL_WIDTH, ORIGINAL_HEIGHT, format); // original lba1 resolution for a lot of images.
+	// original resolution of the game
+	_imageBuffer.create(originalWidth(), originalHeight(), format);
 
 	_workVideoBuffer.create(w, h, format);
 	_frontVideoBuffer.create(w, h, format);
@@ -517,9 +519,9 @@ void TwinEEngine::initEngine() {
 
 	if (!abort) {
 		if (isLBA1()) {
-			_flaMovies->playFlaMovie(FLA_DRAGON3);
+			_movie->playMovie(FLA_DRAGON3);
 		} else {
-			_flaMovies->playSmkMovie(16);
+			_movie->playMovie("INTRO");
 		}
 	}
 	_input->enableKeyMap(uiKeyMapId);
@@ -714,7 +716,7 @@ int32 TwinEEngine::runGameEngine() { // mainLoopInteration
 	readKeys();
 
 	if (!_queuedFlaMovie.empty()) {
-		_flaMovies->playFlaMovie(_queuedFlaMovie.c_str());
+		_movie->playMovie(_queuedFlaMovie.c_str());
 		_queuedFlaMovie.clear();
 	}
 
@@ -1155,6 +1157,10 @@ void TwinEEngine::drawText(int32 x, int32 y, const Common::String &text, bool ce
 	                 center ? Graphics::kTextAlignCenter : Graphics::kTextAlignLeft, 0, true);
 }
 
+Common::Language TwinEEngine::getGameLang() const {
+	return _gameLang;
+}
+
 const char *TwinEEngine::getGameId() const {
 	if (isLBA1()) {
 		return "lba";
diff --git a/engines/twine/twine.h b/engines/twine/twine.h
index 6efe3c949b..4a3e8f045f 100644
--- a/engines/twine/twine.h
+++ b/engines/twine/twine.h
@@ -248,6 +248,7 @@ public:
 	bool isDotEmuEnhanced() const { return (_gameFlags & TwinE::TF_DOTEMU_ENHANCED) != 0; }
 	bool isDemo() const { return (_gameFlags & ADGF_DEMO) != 0; };
 	const char *getGameId() const;
+	Common::Language getGameLang() const;
 
 	bool unlockAchievement(const Common::String &id);
 
@@ -260,7 +261,7 @@ public:
 	Movements *_movements;
 	Interface *_interface;
 	Menu *_menu;
-	Movies *_flaMovies;
+	Movies *_movie;
 	MenuOptions *_menuOptions;
 	Music *_music;
 	Redraw *_redraw;
@@ -299,6 +300,11 @@ public:
 
 	int width() const;
 	int height() const;
+
+	// the resolution the game was meant to be played with
+	int originalWidth() const;
+	int originalHeight() const;
+
 	Common::Rect rect() const;
 	Common::Rect centerOnScreen(int32 w, int32 h) const;
 	Common::Rect centerOnScreenX(int32 w, int32 y, int32 h) const;
@@ -387,6 +393,15 @@ inline Common::Rect TwinEEngine::rect() const {
 	return Common::Rect(0, 0, _frontVideoBuffer.w - 1, _frontVideoBuffer.h - 1);
 }
 
+inline int TwinEEngine::originalWidth() const {
+	return 640;
+}
+
+inline int TwinEEngine::originalHeight() const {
+	return 480;
+}
+
+
 } // namespace TwinE
 
 #endif




More information about the Scummvm-git-logs mailing list