diff options
-rw-r--r-- | engines/mads/conversations.cpp | 15 | ||||
-rw-r--r-- | engines/mads/conversations.h | 1 | ||||
-rw-r--r-- | engines/mads/dialogs.cpp | 44 | ||||
-rw-r--r-- | engines/mads/dialogs.h | 23 |
4 files changed, 69 insertions, 14 deletions
diff --git a/engines/mads/conversations.cpp b/engines/mads/conversations.cpp index 169e844220..84e0f8395b 100644 --- a/engines/mads/conversations.cpp +++ b/engines/mads/conversations.cpp @@ -47,6 +47,7 @@ GameConversations::GameConversations(MADSEngine *vm) : _vm(vm) { _currentNode = 0; _dialogNodeOffset = _dialogNodeSize = 0; _dialog = nullptr; + _dialogAltFlag = false; // Mark all conversation slots as empty for (int idx = 0; idx < MAX_CONVERSATIONS; ++idx) @@ -417,23 +418,27 @@ ConversationMode GameConversations::generateMenu() { } void GameConversations::generateText(int textLineIndex, Common::Array<int> &messages) { + _dialogAltFlag = true; + error("TODO: GameConversations::generateText"); } void GameConversations::generateMessage(Common::Array<int> &messageList, Common::Array<int> &voiceList) { + _dialogAltFlag = false; if (messageList.size() == 0) return; if (_dialog) delete _dialog; + // Get the speaker portrait + SpriteAsset &sprites = *_vm->_game->_scene._sprites[_speakerSeries[_personSpeaking]]; + MSprite *portrait = sprites.getFrame(_speakerFrame[_personSpeaking]); + // Create the new text dialog _dialog = new TextDialog(_vm, FONT_INTERFACE, - Common::Point(_popupX[_personSpeaking], _popupY[_personSpeaking]), _popupMaxLen[_personSpeaking]); - - // Add the sprite for the speaker - SpriteAsset &sprites = *_vm->_game->_scene._sprites[_speakerSeries[_personSpeaking]]; - _dialog->addIcon(sprites.getFrame(_speakerFrame[_personSpeaking])); + Common::Point(_popupX[_personSpeaking], _popupY[_personSpeaking]), + portrait, _popupMaxLen[_personSpeaking]); // Add in the lines for (uint msgNum = 0; msgNum < messageList.size(); ++msgNum) { diff --git a/engines/mads/conversations.h b/engines/mads/conversations.h index 7abdfbd976..a56cef53da 100644 --- a/engines/mads/conversations.h +++ b/engines/mads/conversations.h @@ -337,6 +337,7 @@ private: int _dialogNodeOffset, _dialogNodeSize; int _personSpeaking; TextDialog *_dialog; + bool _dialogAltFlag; /** * Returns the record for the specified conversation, if it's loaded diff --git a/engines/mads/dialogs.cpp b/engines/mads/dialogs.cpp index 80036601b4..14aa41eb30 100644 --- a/engines/mads/dialogs.cpp +++ b/engines/mads/dialogs.cpp @@ -29,6 +29,12 @@ namespace MADS { +enum PopupEdge { + EDGE_UPPER_LEFT = 0, EDGE_UPPER_RIGHT = 1, EDGE_LOWER_LEFT = 2, + EDGE_LOWER_RIGHT = 3, EDGE_LEFT = 4, EDGE_RIGHT = 5, EDGE_TOP = 6, + EDGE_BOTTOM = 7, EDGE_UPPER_CENTER = 8 +}; + Dialog::Dialog(MADSEngine *vm) : _vm(vm), _savedSurface(nullptr), _position(Common::Point(-1, -1)), _width(0), _height(0) { @@ -140,15 +146,34 @@ void Dialog::drawContent(const Common::Rect &r, int seed, byte color1, byte colo TextDialog::TextDialog(MADSEngine *vm, const Common::String &fontName, const Common::Point &pos, int maxChars) : Dialog(vm) { - _vm = vm; _font = _vm->_font->getFont(fontName); _position = pos; + _icon = nullptr; + _edgeSeries = nullptr; + _piecesPerCenter = 0; + _vm->_font->setColors(TEXTDIALOG_BLACK, TEXTDIALOG_BLACK, TEXTDIALOG_BLACK, TEXTDIALOG_BLACK); + _piecesPerCenter = 0; + + init(maxChars); +} +TextDialog::TextDialog(MADSEngine *vm, const Common::String &fontName, + const Common::Point &pos, MSurface *icon, int maxTextChars): Dialog(vm) { + _font = _vm->_font->getFont(fontName); + _position = pos; + _icon = icon; + _edgeSeries = new SpriteAsset(_vm, "box.ss", PALFLAG_RESERVED); _vm->_font->setColors(TEXTDIALOG_BLACK, TEXTDIALOG_BLACK, TEXTDIALOG_BLACK, TEXTDIALOG_BLACK); + _piecesPerCenter = _edgeSeries->getFrame(EDGE_UPPER_CENTER)->w / _edgeSeries->getFrame(EDGE_BOTTOM)->w; - _innerWidth = (_font->maxWidth() + 1) * maxChars; + int maxLen = estimatePieces(maxTextChars); + init(maxLen); +} + +void TextDialog::init(int maxTextChars) { + _innerWidth = (_font->maxWidth() + 1) * maxTextChars; _width = _innerWidth + 10; - _lineSize = maxChars * 2; + _lineSize = maxTextChars * 2; _lineWidth = 0; _currentX = 0; _numLines = 0; @@ -157,7 +182,16 @@ TextDialog::TextDialog(MADSEngine *vm, const Common::String &fontName, _askXp = 0; } +int TextDialog::estimatePieces(int maxLen) { + int fontLen = (_font->maxWidth() + 1) * maxLen; + int pieces = ((fontLen - 1) / _edgeSeries->getFrame(EDGE_TOP)->w) + 1; + int estimate = (maxLen - _piecesPerCenter) / 2; + + return estimate; +} + TextDialog::~TextDialog() { + delete _edgeSeries; } void TextDialog::addLine(const Common::String &line, bool underline) { @@ -275,10 +309,6 @@ void TextDialog::setLineXp(int xp) { _lineXp[_numLines] = xp; } -void TextDialog::addIcon(MSprite *frame) { - warning("TODO: addIcon"); -} - void TextDialog::draw() { if (!_lineWidth) --_numLines; diff --git a/engines/mads/dialogs.h b/engines/mads/dialogs.h index 61ba48034b..14e0932e05 100644 --- a/engines/mads/dialogs.h +++ b/engines/mads/dialogs.h @@ -110,6 +110,11 @@ private: * Clean up after finishing displaying the dialog */ void restorePalette(); + + /** + * Used by the constructors to initialize the dialog fields + */ + void init(int maxTextChars); protected: Font *_font; int _innerWidth; @@ -121,6 +126,9 @@ protected: int _askLineNum; Common::String _lines[TEXT_DIALOG_MAX_LINES]; int _lineXp[TEXT_DIALOG_MAX_LINES]; + SpriteAsset *_edgeSeries; + MSurface *_icon; + int _piecesPerCenter; /** * Calculate the bounds for the dialog @@ -138,6 +146,17 @@ public: int maxChars); /** + * Constructor + * @param vm Engine reference + * @param fontName Font to use for display + * @param pos Position for window top-left + * @param icon Speaker portrait to show in dialog + * @param maxTextChars Horizontal width of text portion of window in characters + */ + TextDialog(MADSEngine *vm, const Common::String &fontName, const Common::Point &pos, + MSurface *icon, int maxTextChars); + + /** * Destructor */ virtual ~TextDialog(); @@ -190,9 +209,9 @@ public: void setLineXp(int xp); /** - * Adds an icon to the dialog + * Estimates the maximum dialog length for text dialogs with icons */ - void addIcon(MSprite *frame); + int estimatePieces(int maxLen); /** * Show the dialog, and wait until a key or mouse press. |