aboutsummaryrefslogtreecommitdiff
path: root/engines/startrek/room.cpp
diff options
context:
space:
mode:
authorFilippos Karapetis2019-10-07 01:08:18 +0300
committerFilippos Karapetis2019-10-07 01:08:51 +0300
commit95f8cfff1602d92178eea875794f83da548566c5 (patch)
treedbd74cc846b66ad9349e7dbaa9e093679f2daaa8 /engines/startrek/room.cpp
parent7caf897ee2e94a0c90601f55e476a1849b8c353b (diff)
downloadscummvm-rg350-95f8cfff1602d92178eea875794f83da548566c5.tar.gz
scummvm-rg350-95f8cfff1602d92178eea875794f83da548566c5.tar.bz2
scummvm-rg350-95f8cfff1602d92178eea875794f83da548566c5.zip
STARTREK: Handle shared messages
Also, start moving message patches inside patchRoomMessage(), and remove some redundant state variables
Diffstat (limited to 'engines/startrek/room.cpp')
-rw-r--r--engines/startrek/room.cpp62
1 files changed, 52 insertions, 10 deletions
diff --git a/engines/startrek/room.cpp b/engines/startrek/room.cpp
index 052a38cc71..eec1bb0f20 100644
--- a/engines/startrek/room.cpp
+++ b/engines/startrek/room.cpp
@@ -151,43 +151,85 @@ void Room::loadRoomMessages() {
void Room::loadRoomMessage(const char *text) {
int messageNum;
bool isTalkMessage;
+ bool isLookMessage;
bool isLookWithTalkerMessage;
+
+ Common::String patchedText = patchRoomMessage(text);
+ text = patchedText.c_str();
+
char textType = text[10]; // _ and U: talk message, N: look message, L: look with talker message
if (text[5] != '\\')
error("loadRoomMessage: Invalid message");
isTalkMessage = (textType == '_' || textType == 'U'); // U = Uhura
+ isLookMessage = (textType == 'N');
isLookWithTalkerMessage = (textType == 'L');
sscanf((const char *)(text + 11), "%3d", &messageNum);
if (text[14] != '#')
error("loadRoomMessage: Invalid message");
+ if (memcmp(text + 1, _vm->_missionName.c_str(), 3) || text[4] != _vm->_roomIndex + '0') {
+ // String with a prefix of another mission, separate it
+ messageNum += COMMON_MESSAGE_OFFSET;
+ }
+
if (isTalkMessage)
- _talkMessages[messageNum] = Common::String((const char *)text);
+ _talkMessages[messageNum] = text;
+ else if (isLookMessage)
+ _lookMessages[messageNum] = text;
else if (isLookWithTalkerMessage)
- _lookWithTalkerMessages[messageNum] = Common::String((const char *)text);
- else
- _lookMessages[messageNum] = Common::String((const char *)text);
+ _lookWithTalkerMessages[messageNum] = text;
+}
+
+Common::String Room::patchRoomMessage(const char *text) {
+ Common::String txt = text;
+ // Fix typos where some messages contain a hyphen instead of an underscore
+ // (e.g in LOV2)
+ if (txt[10] == '-')
+ txt.replace(10, 1, "_");
+
+ // Message index missing
+ if (txt.hasPrefix("#LOV3\\LOV3_#"))
+ txt = Common::String("#LOV3\\LOV3_000#") + (text + 12);
+
+ // Should be TX_LOV2_012, but the audio file is missing
+ if (txt.hasPrefix("#LOV2\\LOV2_012#"))
+ txt = Common::String("#LOV1\\LOV1_010#") + (text + 14);
+
+ // Original voice clip is someone who's clearly not Kelley saying "he's dead, Jim"
+ if (txt.hasPrefix("#FEA3\\FEA3_030#"))
+ txt = Common::String("#LOVA\\LOVA_100#") + (text + 14);
+
+ return txt;
}
void Room::loadOtherRoomMessages() {
uint16 startOffset = readRdfWord(14);
uint16 endOffset = readRdfWord(16);
uint16 offset = startOffset;
+ const char *validPrefixes[] = {
+ "BRI", "COM", "DEM", "FEA", "GEN", "LOV", "MUD", "SIN", "TRI", "TUG", "VEN"
+ };
while (offset < endOffset) {
uint16 nextOffset = readRdfWord(offset + 4);
if (nextOffset >= endOffset)
break;
-
+
while (offset < nextOffset) {
const char *text = (const char *)_rdfData + offset;
- if (text[0] == '#' && text[1] == _vm->_missionName[0] && text[5] == '\\')
- loadRoomMessage(text);
+ if (text[0] == '#' && text[5] == '\\') {
+ for (uint i = 0; i < ARRAYSIZE(validPrefixes); i++) {
+ if (!memcmp(text + 1, validPrefixes[i], 3)) {
+ loadRoomMessage(text);
+ break;
+ }
+ }
+ }
offset++;
}
@@ -383,11 +425,11 @@ int Room::showMultipleTexts(const TextRef *textIDs, bool fromRDF, bool lookWithT
// TODO: This isn't nice, but it's temporary till we migrate to reading text from RDF files
if (i > 0 && fromRDF) {
if (textIDs[0] == TX_NULL)
- text[i] = _lookMessages[textIDs[i]].c_str();
+ text[i] = _lookMessages.contains(textIDs[i]) ? _lookMessages[textIDs[i]].c_str() : _lookMessages[textIDs[i] - COMMON_MESSAGE_OFFSET].c_str();
else if (lookWithTalker)
- text[i] = _lookWithTalkerMessages[textIDs[i]].c_str();
+ text[i] = _lookWithTalkerMessages.contains(textIDs[i]) ? _lookWithTalkerMessages[textIDs[i]].c_str() : _lookWithTalkerMessages[textIDs[i] - COMMON_MESSAGE_OFFSET].c_str();
else
- text[i] = _talkMessages[textIDs[i]].c_str();
+ text[i] = _talkMessages.contains(textIDs[i]) ? _talkMessages[textIDs[i]].c_str() : _talkMessages[textIDs[i] - COMMON_MESSAGE_OFFSET].c_str();
} else
text[i] = g_gameStrings[textIDs[i]];
}