diff options
Diffstat (limited to 'engines/supernova/state.cpp')
-rw-r--r-- | engines/supernova/state.cpp | 118 |
1 files changed, 106 insertions, 12 deletions
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp index 812cf1a0af..c289fbaa67 100644 --- a/engines/supernova/state.cpp +++ b/engines/supernova/state.cpp @@ -319,6 +319,14 @@ void GameManager::initState() { _timer1 = 0; _animationTimer = 0; + _currentSentence = -1; + for (int i = 0 ; i < 6 ; ++i) { + _sentenceNumber[i] = -1; + _texts[i] = kNoString; + _rows[i] = 0; + _rowsStart[i] = 0; + } + _state._time = ticksToMsec(916364); // 2 pm _state._timeSleep = 0; _state._timeAlarm = ticksToMsec(458182); // 7 am @@ -775,33 +783,119 @@ void GameManager::shipStart() { // STUB } -void GameManager::removeSentence(int sentence, int number) { - // STUB -} - -void GameManager::addSentence(int sentence, int number) { - // STUB +void GameManager::sentence(int number, bool brightness) { + if (number < 0) + return; + _vm->renderBox(0, 141 + _rowsStart[number] * 10, 320, _rows[number] * 10 - 1, brightness ? kColorWhite44 : kColorWhite25); + if (_texts[_rowsStart[number]] == kStringDialogSeparator) + _vm->renderText(kStringConversationEnd, 1, 142 + _rowsStart[number] * 10, brightness ? kColorRed : kColorDarkRed); + else { + for (int r = _rowsStart[number]; r < _rowsStart[number] + _rows[number]; ++r) + _vm->renderText(_texts[r], 1, 142 + r * 10, brightness ? kColorGreen : kColorDarkGreen); + } } void GameManager::say(StringID textId) { - // STUB + Common::String str = _vm->getGameString(textId); + if (!str.empty()) + say(str.c_str()); } void GameManager::say(const char *text) { - // STUB + 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 (int r = 0; r < numRows; ++r) + _vm->renderText(row[r], 1, 142 + r * 10, kColorDarkGreen); + mouseWait((t.size() + 20) * _vm->_textSpeed / 10); + _vm->renderBox(0, 138, 320, 62, kColorBlack); } void GameManager::reply(StringID textId, int aus1, int aus2) { - // STUB + 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) { - // STUB + if (*text != '|') + _vm->renderMessage(text, kMessageTop); + + for (int z = (strlen(text) + 20) * _vm->_textSpeed / 40; z > 0; --z) { + drawImage(aus1); + mouseWait(2); + if (_keyPressed) // ?? origin: key != -1, need to check what mouseWait does... + z = 1; + drawImage(aus2); + mouseWait(2); + if (_keyPressed) + z = 1; + } + if (*text != '|') + _vm->removeMessage(); } int GameManager::dialog(int num, byte rowLength[6], StringID text[6], int number) { - // STUB - return 0; + bool remove[6]; + for (int i = 0; i < 5; ++i) + remove[i] = _currentRoom->sentencedRemoved(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 { + mouseInput3(); + } while (_currentSentence == -1); + + _vm->renderBox(0, 138, 320, 62, kColorBlack); + + if (number && _texts[_rowsStart[_currentSentence]] != kStringDialogSeparator) + _currentRoom->removeSentence(_currentSentence, number); + + 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::turnOff() { |