[Scummvm-git-logs] scummvm master -> 89472823447b7a41190c3613dc3a200f690d2dbf

bluegr bluegr at gmail.com
Sat Dec 19 20:06:33 UTC 2020


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:
8947282344 STARTREK: More bridge sequence functions. Start implementing beaming up


Commit: 89472823447b7a41190c3613dc3a200f690d2dbf
    https://github.com/scummvm/scummvm/commit/89472823447b7a41190c3613dc3a200f690d2dbf
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2020-12-19T22:06:09+02:00

Commit Message:
STARTREK: More bridge sequence functions. Start implementing beaming up

Changed paths:
    engines/startrek/bridge.cpp
    engines/startrek/room.cpp
    engines/startrek/startrek.cpp
    engines/startrek/startrek.h


diff --git a/engines/startrek/bridge.cpp b/engines/startrek/bridge.cpp
index 3cc387df06..d1325b5fd8 100644
--- a/engines/startrek/bridge.cpp
+++ b/engines/startrek/bridge.cpp
@@ -52,8 +52,8 @@ enum BridgeMenuEvent {
 	kBridgeKirkCaptainsLog = 16,
 	kBridgeKirkTransporter = 17,
 	kBridgeKirkOptions = 18,
-	kBridgeSpockNothingToReport = 32,
-	kBridgeSpockConsultComputer = 33,
+	kBridgeSpockConsult = 32,
+	kBridgeSpockComputer = 33,
 	kBridgeScottyDamageControl = 48,
 	kBridgeScottyEmergencyPower = 49,
 	kBridgeUhuraCommunications = 64,
@@ -72,16 +72,17 @@ enum BridgeMenuEvent {
 };
 
 enum BridgeSequence {
+	kSeqNone = -1,
 	kSeqStartMissionDemon = 0,
 	kSeqEndMockBattle,
 	kSeqShowDebriefDemon,
-	kSeqTalkWithPolluxPriest,
+	kSeqArrivedAtPolluxV,
 	kSeqEndMissionDemon,
 	kSeqStartMissionTug,
-	kSeqUnk6,
-	kSeqUnk7,
-	kSeqUnk8,
-	kSeqUnk9,
+	kSeqStartElasiPirateBattle,
+	kSeqApproachMasada,
+	kSeqTalkWithMasadaElasiCereth,
+	kSeqEndMissionTug,
 	kSeqStartMissionLove,
 	kSeqUnk11,
 	kSeqUnk12,
@@ -129,6 +130,17 @@ enum Planet {
 	kPlanetChristgen = 19
 };
 
+enum BridgeTalkers {
+	kBridgeTalkerKirk = 0,
+	kBridgeTalkerSpock,
+	kBridgeTalkerSulu,
+	kBridgeTalkerChekov,
+	kBridgeTalkerUhura,
+	kBridgeTalkerScotty,
+	kBridgeTalkerMcCoy,
+	kBridgeTalkerCaptainsLog
+};
+
 void StarTrekEngine::initBridge(bool b) {
 	_gfx->loadPalette("bridge");
 	_sound->loadMusicFile("bridge");
@@ -159,17 +171,6 @@ void StarTrekEngine::loadBridge() {
 	//initStarfieldSprite();
 	//initStarfieldSprite();
 	//initStarfieldSprite();
-
-	// Play bridge sequences for Demon World, for now
-	// TODO
-	playBridgeSequence(kSeqStartMissionDemon);
-	playBridgeSequence(kSeqEndMockBattle);
-	playBridgeSequence(kSeqShowDebriefDemon);
-	// End mission sequence
-	//_missionName = _missionToLoad = "DEMON";
-	//_resource->setTxtFileName(_missionName);
-	//_awayMission.demon.missionScore = 100;
-	//playBridgeSequence(kSeqEndMissionDemon);
 }
 
 void StarTrekEngine::loadBridgeActors() {
@@ -184,13 +185,40 @@ void StarTrekEngine::setBridgeMouseCursor() {
 	_gfx->setMouseBitmap("pushbtn"/*_mouseControllingShip ? "entcur" : "cursor"*/);
 }
 
+void StarTrekEngine::showTextboxBridge(int talker, int textId) {
+	showTextboxBridge(talker, _resource->getLoadedText(textId));
+}
+
+void StarTrekEngine::showTextboxBridge(int talker, Common::String text) {
+	switch (talker) {
+	case kBridgeTalkerKirk:
+		showTextbox("Captain Kirk", text, 160, 130, 176, 0);
+		break;
+	case kBridgeTalkerSpock:
+		showTextbox("Mr. Spock", text, 294, 106, 44, 0);
+		break;
+	case kBridgeTalkerSulu:
+		showTextbox("Mr. Sulu", text, 122, 116, 176, 0);
+		break;
+	case kBridgeTalkerChekov:
+		showTextbox("Mr. Chekov", text, 196, 116, 176, 0);
+		break;
+	case kBridgeTalkerUhura:
+		showTextbox("Lieutenant Uhura", text, 298, 150, 161, 0);
+		break;
+	case kBridgeTalkerScotty:
+		showTextbox("Mr. Scott", text, 64, 100, 161, 0);
+		break;
+	case kBridgeTalkerMcCoy:
+		showTextbox("Dr. McCoy", text, 160, 100, 44, 0);
+		break;
+	case kBridgeTalkerCaptainsLog:
+		showTextbox("Captain's Log", text, 160, 130, 176, 0);
+		break;
+	}
+}
+
 void StarTrekEngine::playBridgeSequence(int sequenceId) {
-	const char *captainsLogHeader = "Captain's Log";
-	const char *uhuraHeader = "Lieutenant Uhura";
-	const char *kirkHeader = "Captain Kirk";
-	const char *spockHeader = "Mr. Spock";
-	const char *mcCoyHeader = "Dr. McCoy";
-	const char *suluHeader = "Mr. Sulu";
 	const char *lowerShieldsText = "#BRID\\B_336#Lowering shields and disarming weapons.";
 
 	switch (sequenceId) {
@@ -198,29 +226,34 @@ void StarTrekEngine::playBridgeSequence(int sequenceId) {
 		_missionName = _missionToLoad = "DEMON";
 		_resource->setTxtFileName(_missionName);
 		_sound->loadMusicFile("bridgew");
-		// TODO: showMissionStartEnterpriseFlyby "DEM0\\FLYBY", "demon"
-		showTextbox(captainsLogHeader, _resource->getLoadedText(0), 160, 130, 176, 0);
-		showTextbox(uhuraHeader, _resource->getLoadedText(1), 298, 150, 161, 0);
-		showTextbox(spockHeader, _resource->getLoadedText(2), 294, 106, 44, 0);
+		showMissionStartEnterpriseFlyby("DEM0\\FLYBY", "demon");
+		showTextboxBridge(kBridgeTalkerCaptainsLog, 0);
+		showTextboxBridge(kBridgeTalkerUhura, 1);
+		showTextboxBridge(kBridgeTalkerSpock, 2);
 		// TODO: sub_2FF19("enterpri") // random number generation
 		// TODO: changeBridgeMode 1
 		_sound->playMidiMusicTracks(2, -1);
 		_sound->playSoundEffectIndex(40);
+
+		// HACK: Play the end of the mock battle sequence, until the 3D code is implemented
+		_bridgeSequenceToLoad = kSeqEndMockBattle;
 		break;
 	case kSeqEndMockBattle:
 		if (true) {	// TODO: Check for Enterprise damage
 			// Mock battle won
 			_sound->playMidiMusicTracks(3, -1);
-			showTextbox(spockHeader, _resource->getLoadedText(4), 294, 106, 44, 0);
-			showTextbox(uhuraHeader, _resource->getLoadedText(5), 298, 150, 161, 0);
+			showTextboxBridge(kBridgeTalkerSpock, 4);
+			showTextboxBridge(kBridgeTalkerUhura, 5);
 			// TODO: sub_2f4c3()
 			// TODO: sub_321f9()
-			showTextbox(suluHeader, lowerShieldsText, 122, 116, 176, 0);
+			showTextboxBridge(kBridgeTalkerSulu, lowerShieldsText);
 			// TODO: Check variable
 		} else {
 			// Mock battle lost
 			// TODO
 		}
+
+		_bridgeSequenceToLoad = kSeqShowDebriefDemon;
 		break;
 	case kSeqShowDebriefDemon:
 		setBridgeMouseCursor();	// 0, 0
@@ -228,45 +261,99 @@ void StarTrekEngine::playBridgeSequence(int sequenceId) {
 		showBridgeScreenTalkerWithMessage(12, "Admiral", "woman");
 		_targetPlanet = kPlanetPollux;
 		break;
-	case kSeqTalkWithPolluxPriest:
-		/*
-		// TODO: Check target planet
-		showTextbox(spockHeader, _resource->getLoadedText(15), 294, 106, 44, 0);
-		// TODO: Check if under attack
-		showTextbox(uhuraHeader, _resource->getLoadedText(16), 298, 150, 161, 0);
-		*/
-		_sound->playSoundEffectIndex(34);
-		showTextbox(uhuraHeader, _resource->getLoadedText(17), 298, 150, 161, 0);
-		showBridgeScreenTalkerWithMessage(18, "Priest", "prst");
-		/*
-		showTextbox(uhuraHeader, _resource->getLoadedText(19), 298, 150, 161, 0);
-		// TODO: Check if under attack
-		// TODO: Check target planet
-		showTextbox(spockHeader, _resource->getLoadedText(20), 294, 106, 44, 0);
-		// TODO: Check if in orbit
-		showTextbox(spockHeader, _resource->getLoadedText(21), 294, 106, 44, 0);
-		showTextbox(spockHeader, _resource->getLoadedText(22), 294, 106, 44, 0);
-		// TODO: Check against 32, 64, 96, 1, 6
-		*/
+	case kSeqArrivedAtPolluxV:
+		// In the original, this is actually a handler for Spock, Uhura and Chekov.
+		// We moved their actions in separate functions instead.
+		if (_currentPlanet == _targetPlanet) {
+			showTextboxBridge(kBridgeTalkerSpock, 15); // We have arrived at Pollux V
+		}
 		break;
 	case kSeqEndMissionDemon:
+		_resource->setTxtFileName("DEMON");
 		loadActorAnim(1, "xstndsp", 0, 0, 1.0);	// Standing Spock
 		loadActorAnim(2, "xstndmc", 0, 0, 1.0);	// Standing McCoy
 		_sound->playSoundEffectIndex(34);
-		showTextbox(uhuraHeader, _resource->getLoadedText(23), 298, 150, 161, 0);	// Message from Starfleet
-		showTextbox(kirkHeader, _resource->getLoadedText(24), 160, 130, 176, 0);
-		showMissionPerformance(_awayMission.demon.missionScore, 29);
-		showTextbox(mcCoyHeader, _resource->getLoadedText(25), 160, 100, 44, 0);
-		showTextbox(kirkHeader, _resource->getLoadedText(26), 160, 130, 176, 0);
-		showTextbox(spockHeader, _resource->getLoadedText(27), 294, 106, 44, 0);
-		showTextbox(mcCoyHeader, _resource->getLoadedText(28), 160, 100, 44, 0);
+		showTextboxBridge(kBridgeTalkerUhura, 23); // Message from Starfleet
+		showTextboxBridge(kBridgeTalkerKirk, 24);
+		showMissionPerformance(_awayMission.demon.missionScore * 100 / 32, 29);
+		showTextboxBridge(kBridgeTalkerMcCoy, 25);
+		showTextboxBridge(kBridgeTalkerKirk, 26);
+		showTextboxBridge(kBridgeTalkerSpock, 27);
+		showTextboxBridge(kBridgeTalkerMcCoy, 28);
 		loadActorAnim(1, "bstndsp", 0, 0, 1.0); // Sitting Spock
 		removeActorFromScreen(2);
-		// TODO: Proceed to tug
+		_bridgeSequenceToLoad = kSeqStartMissionTug;
 		break;
 	case kSeqStartMissionTug: // Chapter 2: Hijacked (tug)
 		_targetPlanet = kPlanetBetaMyamid;
-		// TODO
+		_missionName = _missionToLoad = "TUG";
+		_resource->setTxtFileName(_missionName);
+		_sound->loadMusicFile("bridge");
+		showMissionStartEnterpriseFlyby("TUG0\\FLYBY", "hijacked");
+		_sound->playMidiMusicTracks(0, -1);
+		_sound->playSoundEffectIndex(34);
+		showTextboxBridge(kBridgeTalkerUhura, 0);
+		showTextboxBridge(kBridgeTalkerKirk, 1);
+		showBridgeScreenTalkerWithMessage(2, "Admiral", "woman");
+		showTextboxBridge(kBridgeTalkerChekov, 3);
+		showTextboxBridge(kBridgeTalkerUhura, 4);
+		showTextboxBridge(kBridgeTalkerSpock, 5);
+		break;
+	case kSeqStartElasiPirateBattle:
+		showTextboxBridge(kBridgeTalkerSpock, 6);
+		_sound->playSoundEffectIndex(34);
+		showTextboxBridge(kBridgeTalkerUhura, 7);
+		showTextboxBridge(kBridgeTalkerKirk, 8);
+		showBridgeScreenTalkerWithMessage(9, "Elasi Captain", "pira", false);
+		showTextboxBridge(kBridgeTalkerKirk, 10);
+		showTextbox("Elasi Captain", _resource->getLoadedText(11), 160, 190, 44, 0);
+		removeActorFromScreen(_currentScreenTalker);
+		initStarfieldSprite(&_starfieldSprite, new StubBitmap(0, 0), _starfieldRect);
+		_sound->playSoundEffectIndex(40);
+		startBattle("orion");	// Elasi Pirate battle
+		_enterpriseState.underAttack = true;
+		_sound->playMidiMusicTracks(2, -1);
+		showTextboxBridge(kBridgeTalkerUhura, 12);
+		showTextboxBridge(kBridgeTalkerSpock, 13);
+		_enterpriseState.underAttack = false;
+		_sound->playMidiMusicTracks(3, -1);
+		showTextboxBridge(kBridgeTalkerChekov, 14);
+		showTextboxBridge(kBridgeTalkerSpock, 15);
+		_bridgeSequenceToLoad = kSeqApproachMasada;
+		break;
+	case kSeqApproachMasada:
+		// TODO: 3D code to approach and show the Masada
+		showTextboxBridge(kBridgeTalkerUhura, 16);
+		showTextboxBridge(kBridgeTalkerSpock, 17);
+		_bridgeSequenceToLoad = kSeqTalkWithMasadaElasiCereth;
+		break;
+	case kSeqTalkWithMasadaElasiCereth:
+		showTextboxBridge(kBridgeTalkerSpock, 20);
+		// TODO: showText2
+		showTextboxBridge(kBridgeTalkerUhura, 21);
+		showBridgeScreenTalkerWithMessage(22, "Elasi Cereth", "pira", false);
+		showTextboxBridge(kBridgeTalkerKirk, 23);
+		removeActorFromScreen(_currentScreenTalker);
+		initStarfieldSprite(&_starfieldSprite, new StubBitmap(0, 0), _starfieldRect);
+		break;
+	case kSeqEndMissionTug:
+		_resource->setTxtFileName("TUG");
+		loadActorAnim(1, "xstndsp", 0, 0, 1.0); // Standing Spock
+		loadActorAnim(2, "xstndmc", 0, 0, 1.0); // Standing McCoy
+		// TODO: 3 possible outcomes depending on mission actions
+		_sound->playSoundEffectIndex(34);
+		showTextboxBridge(kBridgeTalkerUhura, 29); // Message from Starfleet
+		showTextboxBridge(kBridgeTalkerKirk, 30);
+		showMissionPerformance(_awayMission.tug.missionScore * 100 / 32, 31);
+		showTextboxBridge(kBridgeTalkerMcCoy, 32);
+		showTextboxBridge(kBridgeTalkerSpock, 33);
+		showTextboxBridge(kBridgeTalkerMcCoy, 34);
+		showTextboxBridge(kBridgeTalkerKirk, 35);
+		showTextboxBridge(kBridgeTalkerSpock, 36);
+		showTextboxBridge(kBridgeTalkerKirk, 37);
+		loadActorAnim(1, "bstndsp", 0, 0, 1.0); // Sitting Spock
+		removeActorFromScreen(2);
+		_bridgeSequenceToLoad = kSeqStartMissionLove;
 		break;
 	case kSeqStartMissionLove:	// Chapter 3: Love's Labor Jeopardized (love)
 		_targetPlanet = kPlanetArk7;
@@ -282,6 +369,89 @@ void StarTrekEngine::playBridgeSequence(int sequenceId) {
 	}
 }
 
+// This is slightly different than the original: the original sets a pointer to a function that
+// handles actions for McCoy, Uhura and Chekov per chapter. We handle them separately.
+void StarTrekEngine::bridgeActionSpock() {
+	const char *nothingToReportText = "#BRID\\B_155#Nothing to report, Captain.";
+	if (_enterpriseState.underAttack)
+		return;
+
+	//showTextboxBridge(kBridgeTalkerSpock, nothingToReportText);
+
+	switch (_targetPlanet) {
+	case kPlanetPollux: // Chapter 1: Demon world (demon)
+		if (_currentPlanet != _targetPlanet) {
+			showTextboxBridge(kBridgeTalkerSpock, 20); // I advise referring to the star map and setting a course for the Pollux system, Sir
+		} else {
+			if (!_enterpriseState.inOrbit)
+				showTextboxBridge(kBridgeTalkerSpock, 21); // We are too far from the planet for a sensor probe, Captain
+			else
+				showTextboxBridge(kBridgeTalkerSpock, 22); // Pollux V has recently emerged from an ice age, Sir...
+		}
+		break;
+	case kPlanetBetaMyamid: // Chapter 2: Hijacked (tug)
+		// TODO
+		break;
+	case kPlanetArk7: // Chapter 3: Love's Labor Jeopardized (love)
+		// TODO
+		break;
+	case kPlanetHarlequin: // Chapter 4: Another Fine Mess (mudd)
+		// TODO
+		break;
+	case kPlanetDigifal: // Chapter 5A: The Feathered Serpent (feather)
+		// TODO
+		break;
+	case kPlanetHrakkour: // Chapter 5B: The Feathered Serpent (trial)
+		// TODO
+		break;
+	case kPlanetAlphaProxima: // Chapter 6: The Old Devil Moon (sins)
+		// TODO
+		break;
+	}
+}
+
+// This is slightly different than the original: the original sets a pointer to a function that
+// handles actions for McCoy, Uhura and Chekov per chapter. We handle them separately.
+void StarTrekEngine::bridgeActionUhura() {
+	if (_enterpriseState.underAttack)
+		return;
+
+	switch (_targetPlanet) {
+	case kPlanetPollux:	// Chapter 1: Demon world (demon)
+		if (_currentPlanet != _targetPlanet) {
+			showTextboxBridge(kBridgeTalkerUhura, 16); // Orders are to proceed to the Pollux system
+		} else {
+			if (!_hailedPollux) {
+				_sound->playSoundEffectIndex(34);
+				showTextboxBridge(kBridgeTalkerUhura, 17);
+				showBridgeScreenTalkerWithMessage(18, "Priest", "prst");
+				_hailedPollux = true;
+			} else {
+				showTextboxBridge(kBridgeTalkerUhura, 19); // The High Prelate is waiting for you to beam down, Sir
+			}
+		}
+		break;
+	case kPlanetBetaMyamid:	// Chapter 2: Hijacked (tug)
+		// TODO
+		break;
+	case kPlanetArk7:	// Chapter 3: Love's Labor Jeopardized (love)
+		// TODO
+		break;
+	case kPlanetHarlequin:	// Chapter 4: Another Fine Mess (mudd)
+		// TODO
+		break;
+	case kPlanetDigifal: // Chapter 5A: The Feathered Serpent (feather)
+		// TODO
+		break;
+	case kPlanetHrakkour: // Chapter 5B: The Feathered Serpent (trial)
+		// TODO
+		break;
+	case kPlanetAlphaProxima: // Chapter 6: The Old Devil Moon (sins)
+		// TODO
+		break;
+	}
+}
+
 Common::String StarTrekEngine::getSpeechSampleForNumber(int number) {
 	const char *speechTemplate = ",BRID\\B_%03d";
 	Common::String result;
@@ -337,22 +507,25 @@ void StarTrekEngine::showMissionPerformance(int score, int missionScoreTextId) {
 		commendationPoints
 	);
 
-	const char *textIds[] = {
-		missionPerformanceText.c_str(),
-		performanceDescription.c_str(),
-		NULL
+	Common::String texts[] = {
+		missionPerformanceText,
+		performanceDescription,
+		""
 	};
 
-	showBridgeScreenTalkerWithMessages(textIds, "Admiral", "woman");
+	showBridgeScreenTalkerWithMessages(texts, "Admiral", "woman");
 }
 
-void StarTrekEngine::showBridgeScreenTalkerWithMessage(int textId, Common::String talkerHeader, Common::String talkerId) {
-	const char *text = _resource->getLoadedText(textId).c_str();
-	const char *texts[] = { text, NULL };
-	showBridgeScreenTalkerWithMessages(texts, talkerHeader, talkerId);
+void StarTrekEngine::showBridgeScreenTalkerWithMessage(int textId, Common::String talkerHeader, Common::String talkerId, bool removeTalker) {
+	Common::String text = _resource->getLoadedText(textId);
+	Common::String texts[] = {
+		text,
+		""
+	};
+	showBridgeScreenTalkerWithMessages(texts, talkerHeader, talkerId, removeTalker);
 }
 
-void StarTrekEngine::showBridgeScreenTalkerWithMessages(const char *texts[], Common::String talkerHeader, Common::String talkerId) {
+void StarTrekEngine::showBridgeScreenTalkerWithMessages(Common::String texts[], Common::String talkerHeader, Common::String talkerId, bool removeTalker) {
 	if (talkerId == "romula" || talkerId == "pira" || talkerId == "klg1" || talkerId == "klg2" || talkerId == "maddoc")
 		_sound->playMidiMusicTracks(15, -1);
 	else if (talkerId == "mudd")
@@ -361,16 +534,18 @@ void StarTrekEngine::showBridgeScreenTalkerWithMessages(const char *texts[], Com
 	initStarfieldSprite(&_starfieldSprite, new Bitmap(_resource->loadBitmapFile(talkerId)), _starfieldRect);
 	_starfieldSprite.drawMode = 0;
 	// TODO: Check why we need the coord adjustments below
-	int actorId = loadActorAnim(-1, talkerId, 72 - 2, 30 + 1, 1.0);
+	_currentScreenTalker = loadActorAnim(-1, talkerId, 72 - 2, 30 + 1, 1.0);
 	int i = 0;
-	const char *text = texts[i];
-	while (text != NULL) {
-		showTextbox(talkerHeader, Common::String(text), 160, 190, 44, 0);
+	Common::String text = texts[i];
+	while (text != "") {
+		showTextbox(talkerHeader, text, 160, 190, 44, 0);
 		text = texts[++i];
 	}
-	
-	removeActorFromScreen(actorId);
-	initStarfieldSprite(&_starfieldSprite, new StubBitmap(0, 0), _starfieldRect);
+
+	if (removeTalker) {
+		removeActorFromScreen(_currentScreenTalker);
+		initStarfieldSprite(&_starfieldSprite, new StubBitmap(0, 0), _starfieldRect);
+	}
 }
 
 void StarTrekEngine::bridgeLeftClick() {
@@ -415,6 +590,12 @@ void StarTrekEngine::runBridge() {
 		handleBridgeEvents();
 
 		// TODO: pseudo-3D related functionality
+
+		if (_bridgeSequenceToLoad != kSeqNone) {
+			int bridgeSequence = _bridgeSequenceToLoad;
+			_bridgeSequenceToLoad = kSeqNone;
+			playBridgeSequence(bridgeSequence);
+		}
 	}
 }
 
@@ -422,6 +603,13 @@ void StarTrekEngine::handleBridgeEvents() {
 	TrekEvent event;
 
 	if (popNextEvent(&event)) {
+		if (_gameIsPaused) {
+			if (event.type == TREKEVENT_LBUTTONDOWN || event.type == TREKEVENT_KEYDOWN) {
+				_gameIsPaused = false;
+			}
+			return;
+		}
+
 		switch (event.type) {
 		case TREKEVENT_TICK:
 			updateActorAnimations();
@@ -500,17 +688,16 @@ void StarTrekEngine::handleBridgeEvents() {
 				handleBridgeMenu(kBridgeKirkOptions);
 				break;
 			case Common::KEYCODE_t:	// Ask Mr. Spock for advice
-				// TODO
-				handleBridgeMenu(kBridgeSpockNothingToReport);
+				handleBridgeMenu(kBridgeSpockConsult);
 				break;
 			case Common::KEYCODE_c:	// Spock's library computer
-				handleBridgeMenu(kBridgeSpockConsultComputer);
+				handleBridgeMenu(kBridgeSpockComputer);
 				break;
 			case Common::KEYCODE_h:	// Uhura's communication icon
 				handleBridgeMenu(kBridgeUhuraCommunications);
 				break;
 			case Common::KEYCODE_p:	// Pause game
-				// TODO
+				_gameIsPaused = true;
 				break;
 			case Common::KEYCODE_e:	// Toggle SFX / emergency power
 				if (event.kbd.flags && Common::KBD_CTRL)
@@ -557,18 +744,11 @@ void StarTrekEngine::handleBridgeEvents() {
 
 void StarTrekEngine::handleBridgeMenu(int menuEvent) {
 	// TODO: Move these
-	const char *kirkHeader = "Captain Kirk";
-	const char *spockHeader = "Mr. Spock";
-	const char *scottyHeader = "Mr. Scott";
-	const char *uhuraHeader = "Lieutenant Uhura";
-	const char *suluHeader = "Mr. Sulu";
-	const char *chekovHeader = "Mr. Chekov";
 	const char *shieldsUpText = "#BRID\\B_332#Captain, the shields are up.";
 	const char *notInOrbitText = "#BRID\\B_350#We're not in orbit, Captain.";
 	const char *wrongDestinationText = "#BRID\\B_346#This isn't our destination.";
 	const char *transporterText = "#BRID\\C_060#Spock, come with me. Mr Scott, you have the conn.";
 	const char *transporterTextFeather = "#BRID\\C_006#Assemble a landing party. Unless we find this so-called criminal, we're going to war.";
-	const char *nothingToReportText = "#BRID\\B_155#Nothing to report, Captain.";
 	const char *raiseShieldsText = "#BRID\\B_340#Raising shields.";
 	const char *lowerShieldsText = "#BRID\\B_337#Lowering shields, Captain.";
 	const char *armWeaponsText = "#BRID\\B_351#Arming weapons.";
@@ -600,27 +780,26 @@ void StarTrekEngine::handleBridgeMenu(int menuEvent) {
 		break;
 	case kBridgeKirkTransporter: // Kirk, transporter
 		if (_enterpriseState.shields) {
-			showTextbox(suluHeader, shieldsUpText, 122, 116, 161, 0);
+			showTextboxBridge(kBridgeTalkerSulu, shieldsUpText);
 		} else if (!_enterpriseState.inOrbit) {
-			showTextbox(suluHeader, notInOrbitText, 122, 116, 161, 0);
-		//} else if (false) {
-		//	// TODO: Check if the destination is correct
-		//	showTextbox(suluHeader, wrongDestinationText, 122, 116, 176, 0);
+			showTextboxBridge(kBridgeTalkerSulu, notInOrbitText);
+		} else if (_currentPlanet != _targetPlanet) {
+			showTextboxBridge(kBridgeTalkerSulu, wrongDestinationText);
 		} else {
 			if (_missionToLoad != "FEATHER")
-				showTextbox(kirkHeader, transporterText, 160, 130, 176, 0);
+				showTextboxBridge(kBridgeTalkerKirk, transporterText);
 			else
-				showTextbox(kirkHeader, transporterTextFeather, 160, 130, 176, 0);
+				showTextboxBridge(kBridgeTalkerKirk, transporterTextFeather);
 			runGameMode(GAMEMODE_BEAMDOWN, false);
 		}
 		break;
 	case kBridgeKirkOptions: // Kirk, options
 		showOptionsMenu(65, 60);
 		break;
-	case kBridgeSpockNothingToReport: // Spock, nothing to report
-		showTextbox(spockHeader, nothingToReportText, 294, 106, 44, 0);
+	case kBridgeSpockConsult: // Spock, nothing to report
+		bridgeActionSpock();
 		break;
-	case kBridgeSpockConsultComputer: // Spock, consult computer
+	case kBridgeSpockComputer: // Spock, consult computer
 		handleBridgeComputer();
 		break;
 	case kBridgeScottyDamageControl: // Scotty, damage control
@@ -628,44 +807,44 @@ void StarTrekEngine::handleBridgeMenu(int menuEvent) {
 		break;
 	case kBridgeScottyEmergencyPower: // Scotty, emergency power
 		// TODO: check for emergency power
-		showTextbox(scottyHeader, noEmergencyPowerText, 64, 100, 161, 0);
+		showTextboxBridge(kBridgeTalkerScotty, noEmergencyPowerText);
 		break;
 	case kBridgeUhuraCommunications: // Uhura, communications
-		// TODO: text
-		//showTextbox(uhuraHeader, _resource->getLoadedText(16), 298, 150, 161, 0);
-		playBridgeSequence(kSeqTalkWithPolluxPriest);
+		bridgeActionUhura();
 		break;
 	case kBridgeSuluOrbit: // Sulu, orbit
 		if (_enterpriseState.underAttack) {
-			showTextbox(suluHeader, underAttackText, 122, 116, 176, 0);
+			showTextboxBridge(kBridgeTalkerSulu, underAttackText);
 		//} else if (false) {
 		//	// TODO: Check if mission is over
-		//	showTextbox(suluHeader, missionNotOverText, 122, 116, 44, 0);
+		//	showTextboxBridge(kBridgeTalkerSulu, missionNotOverText);
 		} else {
 			orbitPlanet();
 		}
 		break;
 	case kBridgeSuluShields: // Sulu, shields
 		_enterpriseState.shields = !_enterpriseState.shields;
-		showTextbox(suluHeader, _enterpriseState.shields ? raiseShieldsText : lowerShieldsText, 122, 116, 176, 0);
+		showTextboxBridge(kBridgeTalkerSulu, _enterpriseState.shields ? raiseShieldsText : lowerShieldsText);
 		break;
 	case kBridgeChekovNavigation: // Chekov, navigation
 		if (_enterpriseState.underAttack) {
-			showTextbox(suluHeader, underAttackText, 122, 116, 176, 0);
+			showTextboxBridge(kBridgeTalkerSulu, underAttackText);
 		//} else if (false) {
 		//	// TODO: Check if mission is over
-		//	showTextbox(suluHeader, missionNotOverText, 122, 116, 44, 0);
+		//	showTextboxBridge(kBridgeTalkerSulu, missionNotOverText);
 		} else if (_enterpriseState.inOrbit) {
-			showTextbox(suluHeader, leaveOrbitText, 122, 116, 176, 0);
+			showTextboxBridge(kBridgeTalkerSulu, leaveOrbitText);
 		} else {
 			showStarMap();
-			// TODO: Check if destination is correct, and start a random encounter if it isn't
-			// TODO: Redraw sprites
+			if (_currentPlanet != _targetPlanet) {
+				wrongDestinationRandomEncounter();
+				// TODO: Redraw sprites
+			}
 		}
 		break;
 	case kBridgeChekovWeapons: // Chekov, weapons
 		_enterpriseState.weapons = !_enterpriseState.weapons;
-		showTextbox(chekovHeader, _enterpriseState.weapons ? armWeaponsText : disarmWeaponsText, 196, 116, 176, 0);
+		showTextboxBridge(kBridgeTalkerChekov, _enterpriseState.weapons ? armWeaponsText : disarmWeaponsText);
 		setBridgeMouseCursor();
 		break;
 	case kBridgeChekovRepairShields:
@@ -676,11 +855,11 @@ void StarTrekEngine::handleBridgeMenu(int menuEvent) {
 	case kBridgeChekovRepairHull:
 	case kBridgeChekovRepairWarpDrives:
 		// TODO: Repair ship part (-1, 4, 2, 6, 1, 0, 7)
-		showTextbox(scottyHeader, ayeSirText, 64, 100, 161, 0);
+		showTextboxBridge(kBridgeTalkerScotty, ayeSirText);
 		break;
 	case kBridgeSuluTargetAnalysis: // Chekov, target analysis
 		_enterpriseState.targetAnalysis = !_enterpriseState.targetAnalysis;
-		showTextbox(suluHeader, _enterpriseState.targetAnalysis ? targetAnalysisOnText : targetAnalysisOffText, 122, 116, 176, 0);
+		showTextboxBridge(kBridgeTalkerSulu, _enterpriseState.targetAnalysis ? targetAnalysisOnText : targetAnalysisOffText);
 		// TODO: Target analysis
 		break;
 	default:
@@ -689,11 +868,30 @@ void StarTrekEngine::handleBridgeMenu(int menuEvent) {
 }
 
 void StarTrekEngine::showStarMap() {
+	// HACK: Move to the target planet and play its associated sequence, until the starmap code is implemented
+	_currentPlanet = _targetPlanet;
+
+	if (_targetPlanet == kPlanetPollux)
+		_bridgeSequenceToLoad = kSeqArrivedAtPolluxV;
+	else if (_targetPlanet == kPlanetBetaMyamid)
+		_bridgeSequenceToLoad = kSeqStartElasiPirateBattle;
+
+	// TODO
+}
+
+void StarTrekEngine::showMissionStartEnterpriseFlyby(Common::String sequence, Common::String name) {
+	// TODO
+}
+
+void StarTrekEngine::startBattle(Common::String enemyShip) {
+	// TODO
+}
+
+void StarTrekEngine::wrongDestinationRandomEncounter() {
 	// TODO
 }
 
 void StarTrekEngine::orbitPlanet() {
-	const char *suluHeader = "Mr. Sulu";
 	const char *enteringOrbitText = "#BRID\\B_333#Entering standard orbit.";
 	const char *leavingOrbitText = "#BRID\\B_335#Leaving orbit.";
 
@@ -702,14 +900,13 @@ void StarTrekEngine::orbitPlanet() {
 	// TODO: Update sprites
 
 	_enterpriseState.inOrbit = !_enterpriseState.inOrbit;
-	showTextbox(suluHeader, _enterpriseState.inOrbit ? enteringOrbitText : leavingOrbitText, 122, 116, 176, 0);
+	showTextboxBridge(kBridgeTalkerSulu, _enterpriseState.inOrbit ? enteringOrbitText : leavingOrbitText);
 }
 
 void StarTrekEngine::captainsLog() {
 	// TODO: Show points for recently completed missions
-	const char *captainsLogHeader = "Captain's Log";
 	const char *noRecentMissions = "#BRID\\C_007#No recent missions have been completed.";
-	showTextbox(captainsLogHeader, noRecentMissions, 160, 130, 176, 0);
+	showTextboxBridge(kBridgeTalkerCaptainsLog, noRecentMissions);
 }
 
 void StarTrekEngine::loadBridgeComputerTopics() {
diff --git a/engines/startrek/room.cpp b/engines/startrek/room.cpp
index 2469498935..06db3a7c09 100644
--- a/engines/startrek/room.cpp
+++ b/engines/startrek/room.cpp
@@ -668,26 +668,31 @@ void Room::endMission(int16 score, int16 arg1, int16 arg2) {
 
 	_vm->_awayMission.disableInput = false;
 
-	// TODO: This is a stopgap measure (loading the next away mission immediately).
-	// Replace this with the proper code later.
-	_vm->_gameMode = GAMEMODE_BEAMDOWN;
-	_vm->_roomIndexToLoad = 0;
-
-	const char *missionNames[] = {
-		"DEMON",
-		"TUG",
-		"LOVE",
-		"MUDD",
-		"FEATHER",
-		"TRIAL",
-		"SINS",
-		"VENG"
-	};
-
-	for (int i = 0; i < ARRAYSIZE(missionNames)-1; i++) {
-		if (_vm->_missionName == missionNames[i]) {
-			_vm->_missionToLoad = missionNames[i + 1];
-			break;
+	if (_vm->_missionName == "DEMON") {
+		_vm->_gameMode = GAMEMODE_BEAMUP;
+		_vm->_roomIndexToLoad = 0;
+		_vm->_bridgeSequenceToLoad = 4;	// kSeqEndMissionDemon
+	} else {
+		// TODO: This is a stopgap measure (loading the next away mission immediately).
+		// Replace this with the proper code later.
+		_vm->_gameMode = GAMEMODE_BEAMDOWN;
+		_vm->_roomIndexToLoad = 0;
+
+		const char *missionNames[] = {
+		    //"DEMON",
+		    "TUG",
+		    "LOVE",
+		    "MUDD",
+		    "FEATHER",
+		    "TRIAL",
+		    "SINS",
+		    "VENG"};
+
+		for (int i = 0; i < ARRAYSIZE(missionNames) - 1; i++) {
+			if (_vm->_missionName == missionNames[i]) {
+				_vm->_missionToLoad = missionNames[i + 1];
+				break;
+			}
 		}
 	}
 }
diff --git a/engines/startrek/startrek.cpp b/engines/startrek/startrek.cpp
index 8a069e1215..1f99c595a4 100644
--- a/engines/startrek/startrek.cpp
+++ b/engines/startrek/startrek.cpp
@@ -113,6 +113,8 @@ StarTrekEngine::StarTrekEngine(OSystem *syst, const StarTrekGameDescription *gam
 
 	_targetPlanet = -1;
 	_currentPlanet = -1;
+	_gameIsPaused = false;
+	_hailedPollux = false;
 
 	const Common::FSNode gameDataDir(ConfMan.get("path"));
 	SearchMan.addSubDirectoryMatching(gameDataDir, "patches");
@@ -152,13 +154,16 @@ Common::Error StarTrekEngine::run() {
 		if (!isDemo) {
 			playIntro();
 			_missionToLoad = "DEMON";
+			_bridgeSequenceToLoad = 0;
 			runGameMode(GAMEMODE_BRIDGE, false);
 		} else {
 			_missionToLoad = "DEMO";
+			_bridgeSequenceToLoad = -1;
 			runGameMode(GAMEMODE_AWAYMISSION, false);
 		}
 	} else {
 		_roomIndexToLoad = -1;
+		_bridgeSequenceToLoad = -1;
 		runGameMode(_gameMode, true);
 	}
 	
diff --git a/engines/startrek/startrek.h b/engines/startrek/startrek.h
index 9be14115ed..524b6fce7d 100644
--- a/engines/startrek/startrek.h
+++ b/engines/startrek/startrek.h
@@ -259,17 +259,29 @@ public:
 	void runBridge();
 	void setBridgeMouseCursor();
 	void playBridgeSequence(int sequenceId);
-	void showBridgeScreenTalkerWithMessage(int textId, Common::String talkerHeader, Common::String talkerId);
-	void showBridgeScreenTalkerWithMessages(const char *texts[], Common::String talkerHeader, Common::String talkerId);
 	void handleBridgeEvents();
 	void handleBridgeComputer();
 	void showMissionPerformance(int score, int missionScoreTextId);
 
+	int _bridgeSequenceToLoad;
+
 private:
 	Common::String getSpeechSampleForNumber(int number);
+	void showTextboxBridge(int talker, int textId);
+	void showTextboxBridge(int talker, Common::String text);
+	void showBridgeScreenTalkerWithMessage(int textId, Common::String talkerHeader, Common::String talkerId, bool removeTalker = true);
+	void showBridgeScreenTalkerWithMessages(Common::String texts[], Common::String talkerHeader, Common::String talkerId, bool removeTalker = true);
+	void showMissionStartEnterpriseFlyby(Common::String sequence, Common::String name);
+	void startBattle(Common::String enemyShip);
+	void wrongDestinationRandomEncounter();
+	void bridgeActionSpock();
+	void bridgeActionUhura();
 
 	int _targetPlanet;
 	int _currentPlanet;
+	int _currentScreenTalker;
+	bool _gameIsPaused;
+	bool _hailedPollux;
 
 public:
 	void playMovie(Common::String filename);




More information about the Scummvm-git-logs mailing list