aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThierry Crozat2017-12-05 22:22:04 +0000
committerThierry Crozat2018-01-23 02:15:42 +0000
commit75e3568f063c883ecfb057f4c6dccd3962d77a4c (patch)
treebbbf6837b900742a0308ed675bade510abf5c6bf
parentef90759e924caaf7b8b3854890eb0ea813a352c0 (diff)
downloadscummvm-rg350-75e3568f063c883ecfb057f4c6dccd3962d77a4c.tar.gz
scummvm-rg350-75e3568f063c883ecfb057f4c6dccd3962d77a4c.tar.bz2
scummvm-rg350-75e3568f063c883ecfb057f4c6dccd3962d77a4c.zip
SUPERNOVA: Implement dialogs with variable text
This was partially implemented but not finished. However I reverted the changes already done to support that in order to use a different approach.
-rw-r--r--devtools/create_supernova/gametext.h2
-rw-r--r--engines/supernova/msn_def.h5
-rw-r--r--engines/supernova/rooms.cpp9
-rw-r--r--engines/supernova/rooms.h4
-rw-r--r--engines/supernova/state.cpp14
-rw-r--r--engines/supernova/state.h3
-rw-r--r--engines/supernova/supernova.h9
7 files changed, 26 insertions, 20 deletions
diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
index d5b6c9a293..398e210c54 100644
--- a/devtools/create_supernova/gametext.h
+++ b/devtools/create_supernova/gametext.h
@@ -678,7 +678,7 @@ const char *gameText[] = {
"Dann gehe ich eben wieder.", // kStringDialogAxacussCorridor5_5
"Ach, halten Sie's Maul, ich gehe trotzdem!", // kStringDialogAxacussCorridor5_6
// 535
- "Wenn Sie mich durchlassen gebe ich Ihnen %s Xa.", // kStringDialogAxacussCorridor5_7
+ "Wenn Sie mich durchlassen gebe ich Ihnen %d Xa.", // kStringDialogAxacussCorridor5_7
"Hallo!", // kStringDialogX1
"Guten Tag!", // kStringDialogX2
"Ich bin's, Horst Hummel.", // kStringDialogX3
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 597749ab7b..3dc54c5fae 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -557,7 +557,10 @@ enum StringID {
kStringTelomat3, kStringTelomat4, kStringTelomat5, kStringTelomat6, kStringTelomat7,
kStringTelomat8, kStringTelomat9, kStringTelomat10, kStringTelomat11, kStringTelomat12,
kStringTelomat13, kStringTelomat14, kStringTelomat15, kStringTelomat16, kStringTelomat17,
- kStringTelomat18, kStringTelomat19, kStringTelomat20, kStringTelomat21, kStringAlarm
+ kStringTelomat18, kStringTelomat19, kStringTelomat20, kStringTelomat21, kStringAlarm,
+
+ // Add two placeholder strings at the end for variable text
+ kStringPlaceholder1, kStringPlaceholder2
};
static StringID guiCommands[] = {
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 6afae1314b..2349fc84e6 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -2565,10 +2565,13 @@ bool AxacussCorridor5::handleMoneyDialog() {
removeSentence(2, 2);
removeSentence(3, 2);
} else {
- _varTexts3[2] = Common::String::format("%d", _gm->_state._money - 200);
- _varTexts3[3] = Common::String::format("%d", _gm->_state._money);
+ Common::String string = _vm->getGameString(kStringDialogAxacussCorridor5_7);
+ _vm->setGameString(kStringPlaceholder1, Common::String::format(string.c_str(), _gm->_state._money - 200));
+ _vm->setGameString(kStringPlaceholder2, Common::String::format(string.c_str(), _gm->_state._money));
+ _dialog3[2] = kStringPlaceholder1;
+ _dialog3[3] = kStringPlaceholder2;
}
- switch (_gm->dialog(4, _rows, _dialog3, 2, _varTexts3)) {
+ switch (_gm->dialog(4, _rows, _dialog3, 2)) {
case 1:
_gm->wait2(3);
_vm->renderImage(1);
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index 62c7d8f6d0..ad28afb991 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -1015,9 +1015,6 @@ public:
_rows[3] = 1;
_rows[4] = 0;
_rows[5] = 0;
-
- for (int i = 0; i < 6; i++)
- _varTexts3[i] = "";
}
virtual void onEntrance();
@@ -1031,7 +1028,6 @@ private:
StringID _dialog1[2];
StringID _dialog2[2];
StringID _dialog3[4];
- Common::String _varTexts3[6];
byte _rows[6];
};
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 2481e6b307..e0f30e941e 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -355,7 +355,6 @@ void GameManager::initState() {
for (int i = 0 ; i < 6 ; ++i) {
_sentenceNumber[i] = -1;
_texts[i] = kNoString;
- _varTexts[i].clear();
_rows[i] = 0;
_rowsStart[i] = 0;
}
@@ -687,8 +686,6 @@ void GameManager::telomat(int nr) {
dial2[3] = kStringDialogSeparator;
static byte rows2[4] = {1, 1, 1, 1};
-
- Common::String varDial[6];
_vm->renderBox(0, 0, 320, 200, kColorBlack);
_vm->renderText(kStringTelomat7, 100, 70, kColorGreen);
@@ -755,13 +752,14 @@ void GameManager::telomat(int nr) {
waitOnInput(_timer1);
_vm->removeMessage();
if (_state._nameSeen[nr]) {
- varDial[1] = name2[nr];
- dial1[1] = kStringTelomat2;
+ Common::String string = _vm->getGameString(kStringTelomat2);
+ _vm->setGameString(kStringPlaceholder1, Common::String::format(string.c_str(), name2[nr].c_str()));
+ dial1[1] = kStringPlaceholder1;
_currentRoom->addSentence(1, 1);
} else
_currentRoom->removeSentence(1, 1);
- switch (dialog(3, rows1, dial1, 1, varDial)) {
+ switch (dialog(3, rows1, dial1, 1)) {
case 1: _vm->renderMessage(kStringTelomat18, kMessageTop);
waitOnInput(_timer1);
_vm->removeMessage();
@@ -1299,7 +1297,7 @@ void GameManager::reply(const char *text, int aus1, int aus2) {
_vm->removeMessage();
}
-int GameManager::dialog(int num, byte rowLength[6], StringID text[6], int number, Common::String varText[6]) {
+int GameManager::dialog(int num, byte rowLength[6], StringID text[6], int number) {
_vm->_allowLoadGame = false;
_guiEnabled = false;
@@ -1322,8 +1320,6 @@ int GameManager::dialog(int num, byte rowLength[6], StringID text[6], int number
_rows[i] = rowLength[i];
for (int j = 0; j < _rows[i]; ++j, ++r, ++rq) {
_texts[r] = text[rq];
- if (varText != nullptr && !varText[rq].empty())
- _varTexts[r] = varText[rq];
_sentenceNumber[r] = i;
}
sentence(i, false);
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 91ab54f49f..7bb7b1861e 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -142,7 +142,6 @@ public:
int _currentSentence;
int _sentenceNumber[6];
StringID _texts[6];
- Common::String _varTexts[6];
byte _rows[6];
byte _rowsStart[6];
@@ -189,7 +188,7 @@ public:
void setAnimationTimer(int ticks);
void dead(const char *message);
void dead(StringID messageId);
- int dialog(int num, byte rowLength[6], StringID text[6], int number, Common::String varText[6] = nullptr);
+ int dialog(int num, byte rowLength[6], StringID text[6], int number);
void sentence(int number, bool brightness);
void say(StringID textId);
void say(const char *text);
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 5602ce6035..e3aeebb5c1 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -150,6 +150,15 @@ public:
return _nullString;
return _gameStrings[idx];
}
+
+ void setGameString(int idx, const Common::String &string) {
+ if (idx < 0)
+ return;
+ while ((int)_gameStrings.size() <= idx)
+ _gameStrings.push_back(Common::String());
+ _gameStrings[idx] = string;
+ }
+
int textWidth(const Common::String &text) {
if (text.empty())
return 0;