[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