aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/supernova2/ms2_def.h5
-rw-r--r--engines/supernova2/state.cpp128
-rw-r--r--engines/supernova2/state.h8
3 files changed, 138 insertions, 3 deletions
diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index a495adf585..0f404974b0 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -128,7 +128,7 @@ enum StringId {
kNoString = -1,
kStringCommandGo, kStringCommandLook, kStringCommandTake, kStringCommandOpen, kStringCommandClose,
kStringCommandPress, kStringCommandPull, kStringCommandUse, kStringCommandTalk, kStringCommandGive,
-kString10, kStringStatusCommandGo, kStringStatusCommandLook, kStringStatusCommandTake, kStringStatusCommandOpen,
+kStringConversationEnd, kStringStatusCommandGo, kStringStatusCommandLook, kStringStatusCommandTake, kStringStatusCommandOpen,
kStringStatusCommandClose, kStringStatusCommandPress, kStringStatusCommandPull, kStringStatusCommandUse, kStringStatusCommandTalk,
kStringStatusCommandGive, kPhrasalVerbParticleGiveTo, kPhrasalVerbParticleUseWith, kString23, kString24,
kString25, kString26, kString27, kStringTextSpeed, kString29,
@@ -248,7 +248,8 @@ kStringIntro6, kStringIntro7, kStringIntro8, kStringIntroTV1, kStringIntroTV2,
kStringIntroTV3, kStringIntroTV4, kStringIntroTV5, kStringIntroTV6, kStringIntroTV7,
kStringIntroTV8, kStringIntroTV9, kStringIntroTV10, kStringIntroTV11, kStringIntroTV12,
kStringIntroTV13, kStringIntroTV14, kStringIntroTV15, kStringIntroTV16, kStringIntro9,
-kStringIntro10, kStringIntro11, kStringIntro12, kStringIntro13, kStringIntro14
+kStringIntro10, kStringIntro11, kStringIntro12, kStringIntro13, kStringIntro14,
+kStringDialogSeparator
};
ObjectType operator|(ObjectType a, ObjectType b);
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 4a10522cd8..204264e2c9 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -184,7 +184,7 @@ void GameManager::initState() {
_currentSentence = -1;
for (int i = 0 ; i < 6 ; ++i) {
_sentenceNumber[i] = -1;
-// _texts[i] = kNoString;
+ _texts[i] = kNoString;
_rows[i] = 0;
_rowsStart[i] = 0;
}
@@ -561,6 +561,132 @@ void GameManager::drawStatus() {
}
}
+void GameManager::sentence(int number, bool brightness) {
+ if (number < 0)
+ return;
+ _vm->renderBox(0, 141 + _rowsStart[number] * 10, 320, _rows[number] * 10 - 1, kColorWhite44);
+ if (_texts[_rowsStart[number]] == kStringDialogSeparator)
+ _vm->renderText(kStringConversationEnd, 1, 142 + _rowsStart[number] * 10, kColorRed);
+ else {
+ for (int r = _rowsStart[number]; r < _rowsStart[number] + _rows[number]; ++r)
+ _vm->renderText(_texts[r], 1, 142 + r * 10, kColorGreen);
+ }
+}
+
+void GameManager::say(StringId textId) {
+ Common::String str = _vm->getGameString(textId);
+ if (!str.empty())
+ say(str.c_str());
+}
+
+void GameManager::say(const char *text) {
+ Common::String t(text);
+ char *row[6];
+ Common::String::iterator p = t.begin();
+ uint numRows = 0;
+ while (*p) {
+ row[numRows++] = p;
+ while ((*p != '\0') && (*p != '|')) {
+ ++p;
+ }
+ if (*p == '|') {
+ *p = 0;
+ ++p;
+ }
+ }
+
+ _vm->renderBox(0, 138, 320, 62, kColorBlack);
+ _vm->renderBox(0, 141, 320, numRows * 10 - 1, kColorWhite25);
+ for (uint r = 0; r < numRows; ++r)
+ _vm->renderText(row[r], 1, 142 + r * 10, kColorDarkGreen);
+ waitOnInput((t.size() + 20) * _vm->_textSpeed / 10);
+ _vm->renderBox(0, 138, 320, 62, kColorBlack);
+}
+
+void GameManager::reply(StringId textId, int aus1, int aus2) {
+ Common::String str = _vm->getGameString(textId);
+ if (!str.empty())
+ reply(str.c_str(), aus1, aus2);
+}
+
+void GameManager::reply(const char *text, int aus1, int aus2) {
+ if (*text != '|')
+ _vm->renderMessage(text, kMessageTop);
+
+ for (int z = (strlen(text) + 20) * _vm->_textSpeed / 40; z > 0; --z) {
+ _vm->renderImage(aus1);
+ waitOnInput(2);
+ if (_keyPressed || _mouseClicked)
+ z = 1;
+ _vm->renderImage(aus2);
+ waitOnInput(2);
+ if (_keyPressed || _mouseClicked)
+ z = 1;
+ }
+ if (*text != '|')
+ _vm->removeMessage();
+}
+
+int GameManager::dialog(int num, byte rowLength[6], StringId text[6], int number) {
+ _vm->_allowLoadGame = false;
+ _guiEnabled = false;
+
+ bool remove[6];
+ for (int i = 0; i < 5; ++i)
+ remove[i] = _currentRoom->sentenceRemoved(i, number);
+ // The original does not initialize remove[5]!!!
+ // Set it to false/0. But maybe the loop above should use 6 instead of 5?
+ remove[5] = false;
+
+ _vm->renderBox(0, 138, 320, 62, kColorBlack);
+
+ for (int i = 0; i < 6 ; ++i)
+ _sentenceNumber[i] = -1;
+
+ int r = 0, rq = 0;
+ for (int i = 0; i < num; ++i) {
+ if (!remove[i]) {
+ _rowsStart[i] = r;
+ _rows[i] = rowLength[i];
+ for (int j = 0; j < _rows[i]; ++j, ++r, ++rq) {
+ _texts[r] = text[rq];
+ _sentenceNumber[r] = i;
+ }
+ sentence(i, false);
+ } else
+ rq += rowLength[i];
+ }
+
+ _currentSentence = -1;
+ do {
+ do {
+ updateEvents();
+ mousePosDialog(_mouseX, _mouseY);
+ g_system->updateScreen();
+ g_system->delayMillis(_vm->_delay);
+ } while (!_mouseClicked && !_vm->shouldQuit());
+ } while (_currentSentence == -1 && !_vm->shouldQuit());
+
+ _vm->renderBox(0, 138, 320, 62, kColorBlack);
+
+ if (number && _currentSentence != -1 && _texts[_rowsStart[_currentSentence]] != kStringDialogSeparator)
+ _currentRoom->removeSentence(_currentSentence, number);
+
+ _guiEnabled = true;
+ _vm->_allowLoadGame = true;
+
+ return _currentSentence;
+}
+
+void GameManager::mousePosDialog(int x, int y) {
+ int a = y < 141 ? -1 : _sentenceNumber[(y - 141) / 10];
+ if (a != _currentSentence) {
+ sentence(_currentSentence, false);
+ _currentSentence = a;
+ sentence(_currentSentence, true);
+ }
+}
+
void GameManager::takeObject(Object &obj) {
if (obj.hasProperty(CARRIED))
return;
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
index b849cde14d..237298f24e 100644
--- a/engines/supernova2/state.h
+++ b/engines/supernova2/state.h
@@ -143,6 +143,7 @@ public:
// Dialog
int _currentSentence;
int _sentenceNumber[6];
+ StringId _texts[6];
byte _rows[6];
byte _rowsStart[6];
@@ -171,6 +172,13 @@ public:
void handleInput();
void handleTime();
void setAnimationTimer(int ticks);
+ 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);
+ void reply(StringId textId, int aus1, int aus2);
+ void reply(const char *text, int aus1, int aus2);
+ void mousePosDialog(int x, int y);
private:
int _prevImgId;