aboutsummaryrefslogtreecommitdiff
path: root/engines/mads
diff options
context:
space:
mode:
authorPaul Gilbert2014-02-22 08:39:44 -0500
committerPaul Gilbert2014-02-22 08:39:44 -0500
commit54c4515232ec26397903373ed46e9492223ce2f2 (patch)
tree1dc0425af979ac0923864f26b2da96053a979bf3 /engines/mads
parent9f1416c6a358eb1dc860ff1176ae89721d82fc50 (diff)
downloadscummvm-rg350-54c4515232ec26397903373ed46e9492223ce2f2.tar.gz
scummvm-rg350-54c4515232ec26397903373ed46e9492223ce2f2.tar.bz2
scummvm-rg350-54c4515232ec26397903373ed46e9492223ce2f2.zip
MADS: Beginnings of dialog class hierarchy
Diffstat (limited to 'engines/mads')
-rw-r--r--engines/mads/dialogs.cpp200
-rw-r--r--engines/mads/dialogs.h137
-rw-r--r--engines/mads/font.h24
-rw-r--r--engines/mads/module.mk1
-rw-r--r--engines/mads/nebular/dialogs_nebular.cpp129
-rw-r--r--engines/mads/nebular/dialogs_nebular.h71
6 files changed, 347 insertions, 215 deletions
diff --git a/engines/mads/dialogs.cpp b/engines/mads/dialogs.cpp
new file mode 100644
index 0000000000..4e64f08822
--- /dev/null
+++ b/engines/mads/dialogs.cpp
@@ -0,0 +1,200 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "common/scummsys.h"
+#include "common/config-manager.h"
+#include "mads/mads.h"
+#include "mads/graphics.h"
+#include "mads/msurface.h"
+#include "mads/nebular/dialogs_nebular.h"
+
+namespace MADS {
+
+Dialog::Dialog(MADSEngine *vm): _vm(vm), _savedSurface(nullptr),
+ _position(Common::Point(-1, -1)), _width(0), _height(0) {
+}
+
+Dialog::~Dialog() {
+ delete _savedSurface;
+}
+
+
+void Dialog::save(MSurface *s) {
+ _savedSurface = MSurface::init(_width, _height);
+ s->copyTo(_savedSurface,
+ Common::Rect(_position.x, _position.y, _position.x + _width, _position.y + _height),
+ Common::Point());
+}
+
+void Dialog::restore(MSurface *s) {
+ _savedSurface->copyTo(s, _position);
+ delete _savedSurface;
+ _savedSurface = nullptr;
+}
+
+/*------------------------------------------------------------------------*/
+
+TextDialog::TextDialog(MADSEngine *vm, const Common::String &fontName,
+ const Common::Point &pos, int maxChars):
+ Dialog(vm) {
+ _vm = vm;
+ _fontName = fontName;
+ _position = pos;
+
+ _vm->_font->setFont(FONT_INTERFACE);
+ _vm->_font->setColors(TEXTDIALOG_FONT, TEXTDIALOG_FONT, TEXTDIALOG_FONT, TEXTDIALOG_FONT);
+
+ _innerWidth = (_vm->_font->maxWidth() + 1) * maxChars;
+ _width = _innerWidth + 10;
+ _lineSize = maxChars * 2;
+ _lineWidth = 0;
+ _currentX = 0;
+ _numLines = 0;
+ Common::fill(&_lineXp[0], &_lineXp[TEXT_DIALOG_MAX_LINES], 0);
+
+ Common::copy(&_vm->_palette->_mainPalette[TEXTDIALOG_F8 * 3],
+ &_vm->_palette->_mainPalette[TEXTDIALOG_F8 * 3 + 8 * 3],
+ &_savedPalette[0]);
+ Palette::setGradient(_vm->_palette->_mainPalette, TEXTDIALOG_F8, 2, 0x24, 0x20);
+ Palette::setGradient(_vm->_palette->_mainPalette, TEXTDIALOG_FA, 2, 0x27, 0x1C);
+ Palette::setGradient(_vm->_palette->_mainPalette, TEXTDIALOG_FC, 2, 0x24, 0x20);
+ Palette::setGradient(_vm->_palette->_mainPalette, TEXTDIALOG_FE, 1, 0x37, 0x37);
+
+ _vm->_palette->setPalette(_vm->_palette->_mainPalette + (TEXTDIALOG_F8 * 3),
+ TEXTDIALOG_F8, 8);
+}
+
+TextDialog::~TextDialog() {
+}
+
+void TextDialog::addLine(const Common::String &line, bool underline) {
+ if (_lineWidth > 0 || _currentX > 0)
+ incNumLines();
+
+ int stringWidth = _vm->_font->getWidth(line);
+ if (stringWidth >= _innerWidth || (int)line.size() >= _lineSize) {
+ wordWrap(line);
+ } else {
+ _lineXp[_numLines] = (_innerWidth / 2) - (stringWidth / 2);
+ _lines[_numLines] = line;
+
+ if (underline)
+ underlineLine();
+ }
+
+ incNumLines();
+}
+
+void TextDialog::underlineLine() {
+ _lineXp[_numLines] |= 0x80;
+}
+
+void TextDialog::incNumLines() {
+ _lineWidth = 0;
+ _currentX = 0;
+ if (++_numLines == TEXT_DIALOG_MAX_LINES)
+ error("Exceeded text dialog line max");
+}
+
+void TextDialog::wordWrap(const Common::String &line) {
+ Common::String tempLine;
+
+ if (!line.empty()) {
+ const char *srcP = line.c_str();
+
+ do {
+ tempLine = "";
+ bool endWord = false;
+ bool newLine = false;
+ bool continueFlag = true;
+
+ do {
+ if (!*srcP) {
+ continueFlag = false;
+ } else {
+ tempLine += *srcP;
+
+ if (*srcP == 10) {
+ continueFlag = false;
+ newLine = true;
+ ++srcP;
+ tempLine.deleteLastChar();
+ } else if (*srcP == ' ') {
+ ++srcP;
+ endWord = true;
+ } else if (!endWord) {
+ ++srcP;
+ } else {
+ tempLine.deleteLastChar();
+ continueFlag = false;
+ }
+ }
+ } while (continueFlag);
+
+ if (tempLine.hasSuffix(" "))
+ tempLine.deleteLastChar();
+
+ Common::String tempLine2;
+ if (_currentX > 0)
+ tempLine2 += ' ';
+ tempLine2 += tempLine;
+
+ int lineWidth = _vm->_font->getWidth(tempLine2, 1);
+ if (((_currentX + (int)tempLine2.size()) > _lineSize) ||
+ ((_lineWidth + lineWidth) > _innerWidth)) {
+ incNumLines();
+ appendLine(tempLine);
+ } else {
+ appendLine(tempLine2);
+ }
+
+ if (newLine)
+ incNumLines();
+ } while (*srcP);
+ }
+}
+
+void TextDialog::appendLine(const Common::String &line) {
+ _currentX += line.size();
+ _lineWidth += _vm->_font->getWidth(line, 1);
+ _lines[_numLines] += line;
+}
+
+/*------------------------------------------------------------------------*/
+
+MessageDialog::MessageDialog(MADSEngine *vm, int maxChars, ...):
+ TextDialog(vm, FONT_INTERFACE, Common::Point(-1, -1), maxChars) {
+ // Add in passed line list
+ va_list va;
+ va_start(va, maxChars);
+
+ const char *line = va_arg(va, const char *);
+ while (line) {
+ addLine(line);
+ line = va_arg(va, const char *);
+ }
+ va_end(va);
+
+ // TODO
+}
+
+} // End of namespace MADS
diff --git a/engines/mads/dialogs.h b/engines/mads/dialogs.h
new file mode 100644
index 0000000000..03710b6b82
--- /dev/null
+++ b/engines/mads/dialogs.h
@@ -0,0 +1,137 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef MADS_DIALOGS_H
+#define MADS_DIALOGS_H
+
+#include "common/scummsys.h"
+#include "mads/game.h"
+#include "mads/msurface.h"
+
+namespace MADS {
+
+class Dialog {
+protected:
+ MADSEngine *_vm;
+ MSurface *_savedSurface;
+ Common::Point _position;
+ int _width;
+ int _height;
+
+ /**
+ * Save the section of the passed surface the dialog will cover.
+ * @param s Screen surface to save
+ */
+ void save(MSurface *s);
+
+ /**
+ * Restore saved dialog surface
+ * @param s Screen surface to restore to.
+ */
+ void restore(MSurface *s);
+public:
+ /**
+ * Constructor
+ */
+ Dialog(MADSEngine *vm);
+
+ /**
+ * Destructor
+ */
+ ~Dialog();
+};
+
+enum {
+ TEXTDIALOG_F8 = 0XF8,
+ TEXTDIALOG_F9 = 0XF8,
+ TEXTDIALOG_FA = 0XF8,
+ TEXTDIALOG_FB = 0XF8,
+ TEXTDIALOG_FC = 0XF8,
+ TEXTDIALOG_FD = 0XF8,
+ TEXTDIALOG_FE = 0XF8,
+ TEXTDIALOG_FONT = 0
+};
+
+#define TEXT_DIALOG_MAX_LINES 20
+
+class TextDialog: protected Dialog {
+private:
+ /**
+ * Increments the number of text lines the text dialog uses
+ */
+ void incNumLines();
+
+ /**
+ * Flags the previously added line to be underlined
+ */
+ void underlineLine();
+
+ /**
+ * Append text to the currently end line.
+ */
+ void appendLine(const Common::String &line);
+protected:
+ Common::String _fontName;
+ int _innerWidth;
+ int _lineWidth;
+ int _currentX;
+ int _numLines;
+ int _lineSize;
+ Common::String _lines[TEXT_DIALOG_MAX_LINES];
+ int _lineXp[TEXT_DIALOG_MAX_LINES];
+ byte _savedPalette[8 * 3];
+
+ /**
+ * Add a new line to the dialog
+ */
+ void addLine(const Common::String &line, bool underline = false);
+
+ /**
+ * Adds one or more lines, word wrapping the passed text
+ */
+ void wordWrap(const Common::String &line);
+public:
+ /**
+ * Constructor
+ * @param vm Engine reference
+ * @param fontName Font to use for display
+ * @param pos Position for window top-left
+ * @param maxChars Horizontal width of window in characters
+ */
+ TextDialog(MADSEngine *vm, const Common::String &fontName, const Common::Point &pos,
+ int maxChars);
+
+ /**
+ * Destructor
+ */
+ ~TextDialog();
+
+};
+
+class MessageDialog: protected TextDialog {
+public:
+ MessageDialog(MADSEngine *vm, int lines, ...);
+};
+
+} // End of namespace MADS
+
+#endif /* MADS_DIALOGS_H */
diff --git a/engines/mads/font.h b/engines/mads/font.h
index 3f01260fbd..e042768c40 100644
--- a/engines/mads/font.h
+++ b/engines/mads/font.h
@@ -30,23 +30,13 @@
namespace MADS {
-#define FONT_MENU "fontmenu.fnt"
-#define FONT_INTERFACE "fontintr.fnt"
-#define FONT_TINY "small.fnt"
-#define FONT_SMALL "small.fnt"
-#define FONT_MEDIUM "medium.fnt"
-#define FONT_LINE "fontline.fnt"
-#define FONT_CONVERSATION "fontconv.fnt"
-#define FONT_4X6 "4x6pp.fnt"
-#define FONT_5X6 "5x6pp.fnt"
-
-#define FONT_CONVERSATION_MADS "fontconv.ff"
-#define FONT_INTERFACE_MADS "fontintr.ff"
-#define FONT_MAIN_MADS "fontmain.ff"
-#define FONT_MENU_MADS "fontmenu.ff" // Not in Rex (uses bitmap files for menu strings)
-#define FONT_MISC_MADS "fontmisc.ff"
-#define FONT_TELE_MADS "fonttele.ff" // Not in Phantom
-#define FONT_PHAN_MADS "fontphan.ff" // Phantom only
+#define FONT_CONVERSATION "fontconv.ff"
+#define FONT_INTERFACE "fontintr.ff"
+#define FONT_MAIN "fontmain.ff"
+#define FONT_MENU "fontmenu.ff" // Not in Rex (uses bitmap files for menu strings)
+#define FONT_MISC "fontmisc.ff"
+#define FONT_TELE "fonttele.ff" // Not in Phantom
+#define FONT_PHAN "fontphan.ff" // Phantom only
class MADSEngine;
diff --git a/engines/mads/module.mk b/engines/mads/module.mk
index 9d115b8b6e..179c1979b4 100644
--- a/engines/mads/module.mk
+++ b/engines/mads/module.mk
@@ -6,6 +6,7 @@ MODULE_OBJS := \
nebular/sound_nebular.o \
compression.o \
detection.o \
+ dialogs.o \
events.o \
font.o \
game.o \
diff --git a/engines/mads/nebular/dialogs_nebular.cpp b/engines/mads/nebular/dialogs_nebular.cpp
index 85b06ce592..76b6162d14 100644
--- a/engines/mads/nebular/dialogs_nebular.cpp
+++ b/engines/mads/nebular/dialogs_nebular.cpp
@@ -31,133 +31,6 @@ namespace MADS {
namespace Nebular {
-TextDialog::TextDialog(MADSEngine *vm, const Common::String &fontName,
- const Common::Point &pos, int maxChars) {
- _vm = vm;
- _fontName = fontName;
- _position = pos;
-
- _vm->_font->setFont(FONT_INTERFACE);
- _vm->_font->setColors(TEXTDIALOG_FONT, TEXTDIALOG_FONT, TEXTDIALOG_FONT, TEXTDIALOG_FONT);
-
- _innerWidth = (_vm->_font->maxWidth() + 1) * maxChars;
- _width = _innerWidth + 10;
- _lineSize = maxChars * 2;
- _lineWidth = 0;
- _currentX = 0;
- _numLines = 0;
- Common::fill(&_lineXp[0], &_lineXp[TEXT_DIALOG_MAX_LINES], 0);
-
- Common::copy(&_vm->_palette->_mainPalette[TEXTDIALOG_F8 * 3],
- &_vm->_palette->_mainPalette[TEXTDIALOG_F8 * 3 + 8 * 3],
- &_savedPalette[0]);
- Palette::setGradient(_vm->_palette->_mainPalette, TEXTDIALOG_F8, 2, 0x24, 0x20);
- Palette::setGradient(_vm->_palette->_mainPalette, TEXTDIALOG_FA, 2, 0x27, 0x1C);
- Palette::setGradient(_vm->_palette->_mainPalette, TEXTDIALOG_FC, 2, 0x24, 0x20);
- Palette::setGradient(_vm->_palette->_mainPalette, TEXTDIALOG_FE, 1, 0x37, 0x37);
-
- _vm->_palette->setPalette(_vm->_palette->_mainPalette + (TEXTDIALOG_F8 * 3),
- TEXTDIALOG_F8, 8);
-}
-
-TextDialog::~TextDialog() {
-}
-
-void TextDialog::addLine(const Common::String &line, bool underline) {
- if (_lineWidth > 0 || _currentX > 0)
- incNumLines();
-
- int stringWidth = _vm->_font->getWidth(line);
- if (stringWidth >= _innerWidth || (int)line.size() >= _lineSize) {
- wordWrap(line);
- } else {
- _lineXp[_numLines] = (_innerWidth / 2) - (stringWidth / 2);
- _lines[_numLines] = line;
-
- if (underline)
- underlineLine();
- }
-
- incNumLines();
-}
-
-void TextDialog::underlineLine() {
- _lineXp[_numLines] |= 0x80;
-}
-
-void TextDialog::incNumLines() {
- _lineWidth = 0;
- _currentX = 0;
- if (++_numLines == TEXT_DIALOG_MAX_LINES)
- error("Exceeded text dialog line max");
-}
-
-void TextDialog::wordWrap(const Common::String &line) {
- Common::String tempLine;
-
- if (!line.empty()) {
- const char *srcP = line.c_str();
-
- do {
- tempLine = "";
- bool endWord = false;
- bool newLine = false;
- bool continueFlag = true;
-
- do {
- if (!*srcP) {
- continueFlag = false;
- } else {
- tempLine += *srcP;
-
- if (*srcP == 10) {
- continueFlag = false;
- newLine = true;
- ++srcP;
- tempLine.deleteLastChar();
- } else if (*srcP == ' ') {
- ++srcP;
- endWord = true;
- } else if (!endWord) {
- ++srcP;
- } else {
- tempLine.deleteLastChar();
- continueFlag = false;
- }
- }
- } while (continueFlag);
-
- if (tempLine.hasSuffix(" "))
- tempLine.deleteLastChar();
-
- Common::String tempLine2;
- if (_currentX > 0)
- tempLine2 += ' ';
- tempLine2 += tempLine;
-
- int lineWidth = _vm->_font->getWidth(tempLine2, 1);
- if (((_currentX + (int)tempLine2.size()) > _lineSize) ||
- ((_lineWidth + lineWidth) > _innerWidth)) {
- incNumLines();
- appendLine(tempLine);
- } else {
- appendLine(tempLine2);
- }
-
- if (newLine)
- incNumLines();
- } while (*srcP);
- }
-}
-
-void TextDialog::appendLine(const Common::String &line) {
- _currentX += line.size();
- _lineWidth += _vm->_font->getWidth(line, 1);
- _lines[_numLines] += line;
-}
-
-/*------------------------------------------------------------------------*/
-
bool CopyProtectionDialog::show(MADSEngine *vm) {
CopyProtectionDialog *dlg = new CopyProtectionDialog(vm, false);
@@ -166,7 +39,7 @@ bool CopyProtectionDialog::show(MADSEngine *vm) {
}
CopyProtectionDialog::CopyProtectionDialog(MADSEngine *vm, bool priorAnswerWrong):
- TextDialog(vm, FONT_INTERFACE_MADS, Common::Point(-1, -1), 32) {
+ TextDialog(vm, FONT_INTERFACE, Common::Point(-1, -1), 32) {
getHogAnusEntry(_hogEntry);
if (priorAnswerWrong) {
diff --git a/engines/mads/nebular/dialogs_nebular.h b/engines/mads/nebular/dialogs_nebular.h
index 3e28ee39b3..7a63397603 100644
--- a/engines/mads/nebular/dialogs_nebular.h
+++ b/engines/mads/nebular/dialogs_nebular.h
@@ -25,81 +25,12 @@
#include "common/scummsys.h"
#include "mads/game.h"
+#include "mads/dialogs.h"
namespace MADS {
namespace Nebular {
-enum {
- TEXTDIALOG_F8 = 0XF8,
- TEXTDIALOG_F9 = 0XF8,
- TEXTDIALOG_FA = 0XF8,
- TEXTDIALOG_FB = 0XF8,
- TEXTDIALOG_FC = 0XF8,
- TEXTDIALOG_FD = 0XF8,
- TEXTDIALOG_FE = 0XF8,
- TEXTDIALOG_FONT = 0
-};
-
-#define TEXT_DIALOG_MAX_LINES 20
-
-class TextDialog {
-private:
- /**
- * Increments the number of text lines the text dialog uses
- */
- void incNumLines();
-
- /**
- * Flags the previously added line to be underlined
- */
- void underlineLine();
-
- /**
- * Append text to the currently end line.
- */
- void appendLine(const Common::String &line);
-protected:
- MADSEngine *_vm;
- Common::Point _position;
- Common::String _fontName;
- int _width;
- int _innerWidth;
- int _lineWidth;
- int _currentX;
- int _numLines;
- int _lineSize;
- Common::String _lines[TEXT_DIALOG_MAX_LINES];
- int _lineXp[TEXT_DIALOG_MAX_LINES];
- byte _savedPalette[8 * 3];
-
- /**
- * Add a new line to the dialog
- */
- void addLine(const Common::String &line, bool underline = false);
-
- /**
- * Adds one or more lines, word wrapping the passed text
- */
- void wordWrap(const Common::String &line);
-public:
- /**
- * Constructor
- * @param vm Engine reference
- * @param fontName Font to use for display
- * @param pos Position for window top-left
- * @param maxChars Horizontal width of window in characters
- */
- TextDialog(MADSEngine *vm, const Common::String &fontName, const Common::Point &pos,
- int maxChars);
-
- /**
- * Destructor
- */
- ~TextDialog();
-
-};
-
struct HOGANUS {
int _bookId;
int _pageNum;