aboutsummaryrefslogtreecommitdiff
path: root/engines/titanic/support/credit_text.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/titanic/support/credit_text.cpp')
-rw-r--r--engines/titanic/support/credit_text.cpp101
1 files changed, 96 insertions, 5 deletions
diff --git a/engines/titanic/support/credit_text.cpp b/engines/titanic/support/credit_text.cpp
index e70d1dcf7a..1f12341e71 100644
--- a/engines/titanic/support/credit_text.cpp
+++ b/engines/titanic/support/credit_text.cpp
@@ -26,13 +26,13 @@
namespace Titanic {
CCreditText::CCreditText() : _screenManagerP(nullptr), _field14(0),
- _ticks(0), _fontHeight(1), _objectP(nullptr), _field34(0), _field38(0),
- _field3C(0), _field40(0), _field44(0), _field48(0), _field4C(0),
- _field50(0), _field54(0), _field58(0), _field5C(0) {
+ _ticks(0), _fontHeight(1), _objectP(nullptr), _totalHeight(0),
+ _field40(0), _field44(0), _field48(0), _field4C(0), _field50(0),
+ _field54(0), _field58(0), _field5C(0) {
}
void CCreditText::clear() {
- _list.destroyContents();
+ _groups.destroyContents();
_objectP = nullptr;
}
@@ -41,6 +41,9 @@ void CCreditText::load(CGameObject *obj, CScreenManager *screenManager,
_objectP = obj;
_screenManagerP = screenManager;
_field14 = v;
+
+ setup();
+
_ticks = g_vm->_events->getTicksCount();
_field40 = 0;
_field44 = 0xFF;
@@ -53,7 +56,95 @@ void CCreditText::load(CGameObject *obj, CScreenManager *screenManager,
}
void CCreditText::setup() {
- // TODO
+ Common::SeekableReadStream *stream = g_vm->_filesManager->getResource(
+ CString::format("TEXT/155"));
+ int oldFontNumber = _screenManagerP->setFontNumber(3);
+ _fontHeight = _screenManagerP->getFontHeight();
+
+ while (stream->pos() < stream->size()) {
+ // Read in the line
+ CString srcLine = readLine(stream);
+
+ // Create a new group and line within it
+ CCreditLineGroup *group = new CCreditLineGroup();
+ CCreditLine *line = new CCreditLine(srcLine,
+ _screenManagerP->stringWidth(srcLine));
+ group->_lines.push_back(line);
+
+ // Loop to add more lines to the group
+ bool hasDots = false;
+ while (stream->pos() < stream->size()) {
+ srcLine = readLine(stream);
+ if (srcLine.empty())
+ break;
+
+ CCreditLine *line = new CCreditLine(srcLine,
+ _screenManagerP->stringWidth(srcLine));
+ group->_lines.push_back(line);
+
+ if (srcLine.contains("...."))
+ hasDots = true;
+ }
+
+ _groups.push_back(group);
+ }
+
+ _groupIt = _groups.begin();
+ _lineIt = (*_groupIt)->_lines.begin();
+ _totalHeight = _objectP->getBounds().height() + _fontHeight * 2;
+}
+
+CString CCreditText::readLine(Common::SeekableReadStream *stream) {
+ CString line;
+ char c = stream->readByte();
+
+ while (c != '\r' && c != '\n' && c != '\0') {
+ line += c;
+
+ if (stream->pos() == stream->size())
+ break;
+ c = stream->readByte();
+ }
+
+ if (c == '\r') {
+ c = stream->readByte();
+ if (c != '\n')
+ stream->skip(-1);
+ }
+
+ return line;
+}
+
+void CCreditText::handleDots(CCreditLineGroup *group) {
+ uint maxWidth = 0;
+ CCreditLines::iterator second = group->_lines.begin();
+ ++second;
+
+ // Figure out the maximum width of secondary lines
+ for (CCreditLines::iterator i = second; i != group->_lines.end(); ++i)
+ maxWidth = MAX(maxWidth, (*i)->_lineWidth);
+
+ int charWidth = _screenManagerP->stringWidth(".");
+
+ // Process the secondary lines
+ for (CCreditLines::iterator i = second; i != group->_lines.end(); ++i) {
+ CCreditLine *line = *i;
+ if (line->_lineWidth >= maxWidth)
+ continue;
+
+ int dotsCount = (maxWidth + charWidth / 2 - line->_lineWidth) / charWidth;
+ int dotIndex = line->_line.indexOf("....");
+
+ if (dotIndex > 0) {
+ CString leftStr = line->_line.left(dotIndex);
+ CString dotsStr('.', dotsCount);
+ CString rightStr = line->_line.right(dotIndex);
+
+ line->_line = CString::format("%s%s%s", leftStr.c_str(),
+ dotsStr.c_str(), rightStr.c_str());
+ line->_lineWidth = maxWidth;
+ }
+ }
}
bool CCreditText::draw() {