[Scummvm-git-logs] scummvm master -> f9ebef6e1a096417af1bbd4cfbea4bec9c0208e9

bluegr bluegr at gmail.com
Sat Nov 21 12:41:23 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:
f9ebef6e1a STARTREK: Implement the computer, some kb input and bridge functions


Commit: f9ebef6e1a096417af1bbd4cfbea4bec9c0208e9
    https://github.com/scummvm/scummvm/commit/f9ebef6e1a096417af1bbd4cfbea4bec9c0208e9
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2020-11-21T14:40:56+02:00

Commit Message:
STARTREK: Implement the computer, some kb input and bridge functions

Changed paths:
    engines/startrek/actors.cpp
    engines/startrek/awaymission.cpp
    engines/startrek/bridge.cpp
    engines/startrek/sound.cpp
    engines/startrek/sound.h
    engines/startrek/startrek.cpp
    engines/startrek/startrek.h
    engines/startrek/textbox.cpp


diff --git a/engines/startrek/actors.cpp b/engines/startrek/actors.cpp
index 1ef78d1e26..bf65542af0 100644
--- a/engines/startrek/actors.cpp
+++ b/engines/startrek/actors.cpp
@@ -445,7 +445,7 @@ void StarTrekEngine::actorFunc1() {
 
 void StarTrekEngine::drawActorToScreen(Actor *actor, const Common::String &_animName, int16 x, int16 y, Fixed8 scale, bool addSprite) {
 	Common::String animFilename = _animName;
-	if (_animName.hasPrefixIgnoreCase("stnd") /* && word_45d20 == -1 */) // TODO
+	if (_animName.contains("stnd") /* && word_45d20 == -1 */) // TODO
 		animFilename += 'j';
 
 	actor->animFilename = _animName;
diff --git a/engines/startrek/awaymission.cpp b/engines/startrek/awaymission.cpp
index 19c0119637..98606b4786 100644
--- a/engines/startrek/awaymission.cpp
+++ b/engines/startrek/awaymission.cpp
@@ -223,14 +223,21 @@ void StarTrekEngine::handleAwayMissionEvents() {
 				awayMissionSelectAction(true);
 				break;
 
-			case Common::KEYCODE_w:
+			case Common::KEYCODE_t:
 				hideInventoryIcons();
-				_awayMission.activeAction = ACTION_WALK;
+				_awayMission.activeAction = ACTION_TALK;
+				awayMissionSelectAction(false);
 				break;
 
-			case Common::KEYCODE_t:
+			case Common::KEYCODE_l:
 				hideInventoryIcons();
-				_awayMission.activeAction = ACTION_TALK;
+				_awayMission.activeAction = ACTION_LOOK;
+				awayMissionSelectAction(false);
+				break;
+
+			case Common::KEYCODE_g:
+				hideInventoryIcons();
+				_awayMission.activeAction = ACTION_GET;
 				awayMissionSelectAction(false);
 				break;
 
@@ -240,6 +247,11 @@ void StarTrekEngine::handleAwayMissionEvents() {
 				awayMissionSelectAction(false);
 				break;
 
+			case Common::KEYCODE_w:
+				hideInventoryIcons();
+				_awayMission.activeAction = ACTION_WALK;
+				break;
+
 			case Common::KEYCODE_i:
 				if (_awayMission.activeAction == ACTION_USE) {
 					hideInventoryIcons();
@@ -262,16 +274,34 @@ void StarTrekEngine::handleAwayMissionEvents() {
 				awayMissionLeftClick();
 				break;
 
-			case Common::KEYCODE_g:
-				hideInventoryIcons();
-				_awayMission.activeAction = ACTION_GET;
-				awayMissionSelectAction(false);
+			case Common::KEYCODE_c:
+				// Bridge computer, where the player can ask about various topics.
+				// ENHANCEMENT: Normally, this is only available when in the bridge.
+				// We also show it in missions.
+				handleBridgeComputer();
 				break;
 
-			case Common::KEYCODE_l:
-				hideInventoryIcons();
-				_awayMission.activeAction = ACTION_LOOK;
-				awayMissionSelectAction(false);
+			case Common::KEYCODE_p:
+				// Pause game
+				// TODO
+				break;
+
+			case Common::KEYCODE_e:
+				if (event.kbd.flags && Common::KBD_CTRL) {
+					_sound->toggleSfx();
+				}
+				break;
+
+			case Common::KEYCODE_m:
+				if (event.kbd.flags && Common::KBD_CTRL) {
+					_sound->toggleMusic();
+				}
+				break;
+
+			case Common::KEYCODE_q:
+				if (event.kbd.flags && Common::KBD_CTRL) {
+					showQuitGamePrompt(20, 20);
+				}
 				break;
 
 			default:
diff --git a/engines/startrek/bridge.cpp b/engines/startrek/bridge.cpp
index 5823bcd139..94203b42cd 100644
--- a/engines/startrek/bridge.cpp
+++ b/engines/startrek/bridge.cpp
@@ -59,13 +59,13 @@ void StarTrekEngine::loadBridge() {
 }
 
 void StarTrekEngine::loadBridgeActors() {
-	loadActorAnim(0, "bstndki", 0, 4, 256);
-	loadActorAnim(1, "bstndkp", 0, 0, 256);
-	loadActorAnim(6, "bstnduh", 0, 0, 256);
-	loadActorAnim(5, "bstndch", 0, 0, 256);
-	loadActorAnim(4, "bstndsu", 0, 0, 256);
-	loadActorAnim(7, "bstndsc", 0, 0, 256);
-	loadActorAnim(2, "xstndmc", 0, 0, 256);
+	loadActorAnim(0, "bstndki", 0, 0, 4);	// Kirk
+	loadActorAnim(1, "bstndsp", 0, 0, 0);	// Spock
+	loadActorAnim(6, "bstnduh", 0, 0, 0);	// Uhura
+	loadActorAnim(5, "bstndch", 0, 0, 0);	// Chekov
+	loadActorAnim(4, "bstndsu", 0, 0, 0);	// Sulu
+	loadActorAnim(7, "bstndsc", 0, 0, 0);	// Scotty
+	loadActorAnim(2, "xstndmc", 0, 0, 0);	// McCoy
 }
 
 void StarTrekEngine::cleanupBridge() {
@@ -79,9 +79,210 @@ void StarTrekEngine::cleanupBridge() {
 }
 
 void StarTrekEngine::runBridge() {
-	//while (_gameMode == GAMEMODE_BRIDGE && !_resetGameMode) {
+	while (_gameMode == GAMEMODE_BRIDGE && !_resetGameMode) {
+		handleBridgeEvents();
 
-	//}
+		// TODO: pseudo-3D related functionality
+	}
+}
+
+void StarTrekEngine::handleBridgeEvents() {
+	TrekEvent event;
+
+	if (popNextEvent(&event)) {
+		switch (event.type) {
+		case TREKEVENT_TICK:
+			updateActorAnimations();
+
+			//updateMouseBitmap();
+			renderBanBelowSprites();
+			_gfx->drawAllSprites(false);
+			renderBanAboveSprites();
+			_gfx->updateScreen();
+
+			_sound->checkLoopMusic();
+			_frameIndex++;
+			_roomFrameCounter++;
+			addAction(ACTION_TICK, _roomFrameCounter & 0xff, (_roomFrameCounter >> 8) & 0xff, 0);
+			if (_roomFrameCounter >= 2)
+				_gfx->incPaletteFadeLevel();
+			break;
+
+		case TREKEVENT_LBUTTONDOWN:
+			// TODO
+			break;
+
+		case TREKEVENT_MOUSEMOVE:
+			// TODO
+			break;
+
+		case TREKEVENT_RBUTTONDOWN:
+			// TODO
+			break;
+
+		case TREKEVENT_KEYDOWN:
+			switch (event.kbd.keycode) {
+			case Common::KEYCODE_w:
+				// Toggle weapons on/off
+				// TODO
+				break;
+			case Common::KEYCODE_s:
+				// Toggle shields on/off
+				// TODO
+				break;
+			case Common::KEYCODE_a:
+				// Target analysis
+				// TODO
+				break;
+			case Common::KEYCODE_d:
+				// Damage control
+				// TODO
+				break;
+			case Common::KEYCODE_RETURN:
+			case Common::KEYCODE_KP_ENTER:
+			case Common::KEYCODE_F1:
+				// Fire phasers
+				// TODO
+				break;
+			case Common::KEYCODE_SPACE:
+				// Fire photon torpedoes
+				// TODO
+				break;
+			case Common::KEYCODE_v:
+				// Toggle between the normal bridge view and full screen view
+				// TODO
+				break;
+			case Common::KEYCODE_TAB:
+				// Toggle between movement/fire mode and crew selection mode
+				// TODO
+				break;
+			case Common::KEYCODE_COMMA:
+				// Reduce the main view screen magnification
+				// TODO
+				break;
+			case Common::KEYCODE_PERIOD:
+				// Enlarge the main view screen magnification
+				// TODO
+				break;
+			case Common::KEYCODE_o:
+				// Enter/exit orbit
+				// TODO
+				break;
+			case Common::KEYCODE_KP5:
+				// Center controls
+				// TODO
+				break;
+			case Common::KEYCODE_n:
+				// Main star navigational map
+				// TODO
+				break;
+			case Common::KEYCODE_k:
+				// Kirk's options
+				// TODO
+				break;
+			case Common::KEYCODE_t:
+				// Ask Mr. Spock for advice
+				// TODO
+				break;
+			case Common::KEYCODE_c:
+				// Spock's library computer
+				handleBridgeComputer();
+				break;
+			case Common::KEYCODE_h:
+				// Uhura's communication icon
+				// TODO
+				break;
+			case Common::KEYCODE_p:
+				// Pause game
+				// TODO
+				break;
+
+			case Common::KEYCODE_e:
+				if (event.kbd.flags && Common::KBD_CTRL) {
+					_sound->toggleSfx();
+				} else {
+					// Emergency power
+					// TODO
+				}
+				break;
+
+			case Common::KEYCODE_m:
+				if (event.kbd.flags && Common::KBD_CTRL) {
+					_sound->toggleMusic();
+				}
+				break;
+
+			case Common::KEYCODE_q:
+				if (event.kbd.flags && Common::KBD_CTRL) {
+					showQuitGamePrompt(20, 20);
+				}
+				break;
+			case Common::KEYCODE_TILDE:
+				// Ship speed: reverse
+				// TODO
+				break;
+			case Common::KEYCODE_1:
+				// Ship speed: stop
+				// TODO
+				break;
+			case Common::KEYCODE_2:
+			case Common::KEYCODE_3:
+			case Common::KEYCODE_4:
+			case Common::KEYCODE_5:
+			case Common::KEYCODE_6:
+			case Common::KEYCODE_7:
+			case Common::KEYCODE_8:
+			case Common::KEYCODE_9:
+			case Common::KEYCODE_0:
+				// Ship speed: toggle slow -> fast
+				// TODO
+				break;
+			default:
+				break;
+			}
+			break;
+
+		default:
+			break;
+		}
+	}
+}
+
+void StarTrekEngine::loadBridgeComputerTopics() {
+	Common::MemoryReadStreamEndian *indexFile = _resource->loadFile("db.key");
+	Common::String line;
+	while (!indexFile->eos() && !indexFile->err()) {
+		line = indexFile->readLine();
+		if (line == "$")
+			break;
+		ComputerTopic topic;
+		topic.fileName = line.substr(0, 7);
+		topic.topic = line.substr(8);
+		_computerTopics.push_back(topic);
+	}
+	delete indexFile;
+}
+
+void StarTrekEngine::handleBridgeComputer() {
+	Common::String line;
+	Common::String input = showComputerInputBox();
+	if (input.size() < 3)
+		return;
+
+	char topics[10][8];
+	int topicIndex = 0;
+
+	memset(topics, 0, ARRAYSIZE(topics) * 8);
+
+	for (Common::List<ComputerTopic>::const_iterator i = _computerTopics.begin(), end = _computerTopics.end(); i != end; ++i) {
+		if (i->topic.hasPrefixIgnoreCase(input)) {
+			memcpy(topics[topicIndex++], i->fileName.c_str(), i->fileName.size());
+			if (topicIndex >= ARRAYSIZE(topics))
+				break;
+		}
+	}
+
+	showText(&StarTrekEngine::readTextFromFoundComputerTopics, (uintptr)topics, 20, 20, TEXTCOLOR_YELLOW, true, false, true);
 }
 
 } // End of namespace StarTrek
diff --git a/engines/startrek/sound.cpp b/engines/startrek/sound.cpp
index a3460d22a5..08b1720ceb 100644
--- a/engines/startrek/sound.cpp
+++ b/engines/startrek/sound.cpp
@@ -345,6 +345,10 @@ void Sound::playSoundEffectIndex(int index) {
 	}
 }
 
+void Sound::toggleMusic() {
+	setMusicEnabled(!_vm->_musicEnabled);
+}
+
 void Sound::setMusicEnabled(bool enable) {
 	if (!_vm->_musicWorking || _vm->_musicEnabled == enable)
 		return;
@@ -357,6 +361,10 @@ void Sound::setMusicEnabled(bool enable) {
 		clearMidiSlot(0);
 }
 
+void Sound::toggleSfx() {
+	setSfxEnabled(!_vm->_sfxEnabled);
+}
+
 void Sound::setSfxEnabled(bool enable) {
 	if (!_vm->_sfxWorking || _vm->_sfxEnabled == enable)
 		return;
diff --git a/engines/startrek/sound.h b/engines/startrek/sound.h
index 732d7819b9..0b9ef54fd4 100644
--- a/engines/startrek/sound.h
+++ b/engines/startrek/sound.h
@@ -72,6 +72,8 @@ public:
 	void playSoundEffectIndex(int index);
 	void setMusicEnabled(bool enable);
 	void setSfxEnabled(bool enable);
+	void toggleMusic();
+	void toggleSfx();
 	void checkLoopMusic();
 
 private:
diff --git a/engines/startrek/startrek.cpp b/engines/startrek/startrek.cpp
index 21daa8fb34..79e34aadf0 100644
--- a/engines/startrek/startrek.cpp
+++ b/engines/startrek/startrek.cpp
@@ -133,9 +133,9 @@ Common::Error StarTrekEngine::run() {
 
 	initGraphics(SCREEN_WIDTH, SCREEN_HEIGHT);
 	initializeEventsAndMouse();
+	loadBridgeComputerTopics();
 
 	_gfx->setMouseBitmap(!isDemo ? "pushbtn" : "cursor");
-	_gfx->toggleMouse(true);
 
 	bool loadedSave = false;
 
@@ -150,6 +150,7 @@ Common::Error StarTrekEngine::run() {
 			playIntro();
 			_missionToLoad = "DEMON";
 			runGameMode(GAMEMODE_BEAMDOWN, false);
+			//runGameMode(GAMEMODE_BRIDGE, false);
 		} else {
 			_missionToLoad = "DEMO";
 			runGameMode(GAMEMODE_AWAYMISSION, false);
@@ -163,6 +164,8 @@ Common::Error StarTrekEngine::run() {
 }
 
 Common::Error StarTrekEngine::runGameMode(int mode, bool resume) {
+	_gfx->toggleMouse(true);
+
 	if (!resume) { // Only run this if not just resuming from a savefile
 		_frameIndex = 0;
 		_lastGameMode = -1;
diff --git a/engines/startrek/startrek.h b/engines/startrek/startrek.h
index 879038baaa..fce8d79dcd 100644
--- a/engines/startrek/startrek.h
+++ b/engines/startrek/startrek.h
@@ -211,6 +211,10 @@ struct TrekEvent {
 	uint32 tick;
 };
 
+struct ComputerTopic {
+	Common::String fileName;
+	Common::String topic;
+};
 
 class Graphics;
 class IWFile;
@@ -237,6 +241,8 @@ public:
 	void loadBridgeActors();
 	void cleanupBridge();
 	void runBridge();
+	void handleBridgeEvents();
+	void handleBridgeComputer();
 
 	void playMovie(Common::String filename);
 	void playMovieMac(Common::String filename);
@@ -501,8 +507,10 @@ public:
 	 * Effectively replaces the "readTextFromRdf" function.
 	 */
 	String readTextFromArrayWithChoices(int choiceIndex, uintptr data, String *headerTextOutput);
+	Common::String readTextFromFoundComputerTopics(int choiceIndex, uintptr data, String *headerTextOutput);
 
 	Common::String showCodeInputBox();
+	Common::String showComputerInputBox();
 	void redrawTextInput();
 	void addCharToTextInputBuffer(char c);
 	/**
@@ -735,11 +743,13 @@ private:
 	int rightClickEvent();
 	int mouseMoveEvent();
 	int lookupNextAction(const int *lookupArray, int action);
+	void loadBridgeComputerTopics();
 
 	Common::RandomSource _randomSource;
 	Common::SineTable _sineTable;
 	Common::CosineTable _cosineTable;
 	Room *_room;
+	Common::List<ComputerTopic> _computerTopics;
 };
 
 // Static function
diff --git a/engines/startrek/textbox.cpp b/engines/startrek/textbox.cpp
index 79a6c108e2..523e10b012 100644
--- a/engines/startrek/textbox.cpp
+++ b/engines/startrek/textbox.cpp
@@ -25,6 +25,7 @@
 #include "graphics/cursorman.h"
 
 #include "startrek/graphics.h"
+#include "startrek/resource.h"
 #include "startrek/room.h"
 
 
@@ -690,9 +691,40 @@ String StarTrekEngine::readTextFromArrayWithChoices(int choiceIndex, uintptr dat
 	return String(mainText);
 }
 
+Common::String StarTrekEngine::readTextFromFoundComputerTopics(int choiceIndex, uintptr data, String *headerTextOutput) {
+	if (choiceIndex >= 10)
+		return Common::String();
+
+	Common::String topicFile = (char *)data + 8 * choiceIndex;
+	topicFile.trim();
+
+	if (topicFile.empty())
+		return Common::String();
+
+	Common::MemoryReadStreamEndian *content = _resource->loadFile(Common::String(topicFile) + ".db");
+	Common::String headerText = content->readLine();
+	Common::String mainText;
+	Common::String line;
+	while (!content->eos() && !content->err()) {
+		line = content->readLine();
+		if (line == "$")
+			break;
+		mainText += line;
+	}
+	delete content;
+
+	*headerTextOutput = "R: " + headerText;
+	return mainText;
+}
+
 Common::String StarTrekEngine::showCodeInputBox() {
 	memset(_textInputBuffer, 0, TEXT_INPUT_BUFFER_SIZE - 1);
-	return showTextInputBox(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2, "Code:\n                    ");
+	return showTextInputBox(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2, "Code:\n                   ");
+}
+
+Common::String StarTrekEngine::showComputerInputBox() {
+	memset(_textInputBuffer, 0, TEXT_INPUT_BUFFER_SIZE - 1);
+	return showTextInputBox(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2, "Computer:\n               ");
 }
 
 void StarTrekEngine::redrawTextInput() {
@@ -902,6 +934,7 @@ void StarTrekEngine::initTextInputSprite(int16 textboxX, int16 textboxY, const C
 	_textInputSprite.field8 = "System";
 	_textInputSprite.setXYAndPriority(textboxX, textboxY, 15);
 	_textInputSprite.drawPriority2 = 8;
+	_gfx->addSprite(&_textInputSprite);
 
 	_gfx->drawAllSprites();
 }




More information about the Scummvm-git-logs mailing list