From 9e356dd945863a4c4dfa89f2a94dd1a56c2d03a6 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 3 Mar 2014 23:40:23 -0500 Subject: MADS: Implemented extra message and dirty area classes --- engines/mads/messages.cpp | 384 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 384 insertions(+) create mode 100644 engines/mads/messages.cpp (limited to 'engines/mads/messages.cpp') diff --git a/engines/mads/messages.cpp b/engines/mads/messages.cpp new file mode 100644 index 0000000000..c08f29fd91 --- /dev/null +++ b/engines/mads/messages.cpp @@ -0,0 +1,384 @@ +/* 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 "mads/mads.h" +#include "mads/font.h" +#include "mads/graphics.h" +#include "mads/messages.h" +#include "mads/scene_data.h" + +namespace MADS { + +KernelMessages::KernelMessages(MADSEngine *vm): _vm(vm) { + Scene &scene = _vm->_game->_scene; + + for (int i = 0; i < KERNEL_MESSAGES_SIZE; ++i) { + KernelMessage rec; + _entries.push_back(rec); + } + + scene._textSpacing = -1; + _talkFont = _vm->_font->getFont(FONT_CONVERSATION); + word_8469E = 0; +} + +void KernelMessages::clear() { + Scene &scene = _vm->_game->_scene; + + for (uint i = 0; i < _entries.size(); ++i) + _entries[i]._flags = 0; + + scene._textSpacing = -1; + _talkFont = _vm->_font->getFont(FONT_CONVERSATION); +} + +int KernelMessages::add(const Common::Point &pt, uint fontColor, uint8 flags, + uint8 abortTimers, uint32 timeout, const Common::String &msg) { + Scene &scene = _vm->_game->_scene; + + // Find a free slot + uint idx = 0; + while ((idx < _entries.size()) && ((_entries[idx]._flags & KMSG_ACTIVE) != 0)) + ++idx; + if (idx == _entries.size()) { + if (abortTimers == 0) + return -1; + + error("KernelMessages overflow"); + } + + KernelMessage &rec = _entries[idx]; + rec._msg = msg; + rec._flags = flags | KMSG_ACTIVE; + rec._color1 = fontColor & 0xff; + rec._color2 = fontColor >> 8; + rec._position = pt; + rec._textDisplayIndex = -1; + rec._timeout = timeout; + rec._frameTimer = _vm->_game->_currentTimer; + rec._abortTimers = abortTimers; + rec._abortMode = _vm->_game->_abortTimersMode2; + + rec._actionDetails = scene._action._activeAction; + + if (flags & KMSG_PLAYER_TIMEOUT) + rec._frameTimer = _vm->_game->_player._ticksAmount + + _vm->_game->_player._priorTimer; + + return idx; +} + +int KernelMessages::addQuote(int quoteId, int abortTimers, uint32 timeout) { + Common::String quoteStr = _vm->_game->getQuote(quoteId); + return add(Common::Point(), 0x1110, KMSG_PLAYER_TIMEOUT | KMSG_CENTER_ALIGN, abortTimers, timeout, quoteStr); +} + +void KernelMessages::scrollMessage(int msgIndex, int numTicks, bool quoted) { + if (msgIndex < 0) + return; + + _entries[msgIndex]._flags |= quoted ? (KMSG_SCROLL | KMSG_QUOTED) : KMSG_SCROLL; + _entries[msgIndex]._msgOffset = 0; + _entries[msgIndex]._numTicks = numTicks; + _entries[msgIndex]._frameTimer2 = _vm->_game->_currentTimer; + + Common::String msg = _entries[msgIndex]._msg; + _entries[msgIndex]._asciiChar = msg[0]; + _entries[msgIndex]._asciiChar2 = msg[1]; + + if (_entries[msgIndex]._flags & KMSG_PLAYER_TIMEOUT) + _entries[msgIndex]._frameTimer2 = _vm->_game->_player._ticksAmount + + _vm->_game->_player._priorTimer; + + _entries[msgIndex]._frameTimer = _entries[msgIndex]._frameTimer2; +} + +void KernelMessages::setSeqIndex(int msgIndex, int seqIndex) { + if (msgIndex >= 0) { + _entries[msgIndex]._flags |= KMSG_SEQ_ENTRY; + _entries[msgIndex]._sequenceIndex = seqIndex; + } +} + +void KernelMessages::remove(int msgIndex) { + KernelMessage &rec = _entries[msgIndex]; + Scene &scene = _vm->_game->_scene; + + if (rec._flags & KMSG_ACTIVE) { + if (rec._flags & KMSG_SCROLL) { + rec._msg.setChar(rec._asciiChar, rec._msgOffset); + rec._msg.setChar(rec._asciiChar2, rec._msgOffset + 1); + } + + if (rec._textDisplayIndex >= 0) + scene._textDisplay.expire(rec._textDisplayIndex); + + rec._flags &= ~KMSG_ACTIVE; + } +} + +void KernelMessages::reset() { + for (uint i = 0; i < _entries.size(); ++i) + remove(i); + + warning("TODO: KernelMessages::reset - sub_20454"); +} + +void KernelMessages::update() { + uint32 currentTimer = _vm->_game->_currentTimer; + + for (uint i = 0; i < _entries.size(); ++i) { + if (((_entries[i]._flags & KMSG_ACTIVE) != 0) && + (currentTimer >= _entries[i]._frameTimer)) + processText(i); + } +} + +void KernelMessages::processText(int msgIndex) { + Scene &scene = _vm->_game->_scene; + KernelMessage &msg = _entries[msgIndex]; + uint32 currentTimer = _vm->_game->_currentTimer; + bool flag = false; + + if ((msg._flags & KMSG_EXPIRE) != 0) { + scene._textDisplay.expire(msg._textDisplayIndex); + msg._flags &= !KMSG_ACTIVE; + return; + } + + if ((msg._flags & KMSG_SCROLL) == 0) { + msg._timeout -= 3; + } + + if (msg._flags & KMSG_SEQ_ENTRY) { + SequenceEntry &seqEntry = scene._sequences[msg._sequenceIndex]; + if (seqEntry._doneFlag || !seqEntry._active) + msg._timeout = 0; + } + + if ((msg._timeout <= 0) && (_vm->_game->_abortTimers == 0)) { + msg._flags |= KMSG_EXPIRE; + if (msg._abortTimers != 0) { + _vm->_game->_abortTimers = msg._abortTimers; + _vm->_game->_abortTimersMode = msg._abortMode; + + if (_vm->_game->_abortTimersMode != ABORTMODE_1) { + scene._action._activeAction = msg._actionDetails; + } + } + } + + msg._frameTimer = currentTimer + 3; + int x1 = 0, y1 = 0; + + if (msg._flags & KMSG_SEQ_ENTRY) { + SequenceEntry &seqEntry = scene._sequences[msg._sequenceIndex]; + if (!seqEntry._nonFixed) { + SpriteAsset &spriteSet = scene._spriteSlots.getSprite(seqEntry._spritesIndex); + MSprite *frame = spriteSet.getFrame(seqEntry._frameIndex - 1); + x1 = frame->getBounds().left; + y1 = frame->getBounds().top; + } else { + x1 = seqEntry._msgPos.x; + y1 = seqEntry._msgPos.y; + } + } + + if (msg._flags & KMSG_PLAYER_TIMEOUT) { + if (word_8469E != 0) { + warning("TODO: KernelMessages::processText"); + // TODO: Figure out various flags + } else { + x1 = 160; + y1 = 78; + } + } + + x1 += msg._position.x; + y1 += msg._position.y; + + if ((msg._flags & KMSG_SCROLL) && (msg._frameTimer >= currentTimer)) { + msg._msg.setChar(msg._asciiChar, msg._msgOffset); + + ++msg._msgOffset; + msg._msg.setChar(msg._asciiChar2, msg._msgOffset); + msg._asciiChar = msg._msg[msg._msgOffset]; + msg._asciiChar2 = msg._msg[msg._msgOffset + 1]; + + if (!msg._asciiChar) { + // End of message + msg._msg.setChar('\0', msg._msgOffset); + msg._flags &= ~KMSG_SCROLL; + } else if (msg._flags & KMSG_QUOTED) { + msg._msg.setChar('"', msg._msgOffset); + msg._msg.setChar('\0', msg._msgOffset + 1); + } + + msg._frameTimer = msg._frameTimer2 = currentTimer + msg._numTicks; + flag = true; + } + + int strWidth = _talkFont->getWidth(msg._msg, scene._textSpacing); + + if (msg._flags & (KMSG_RIGHT_ALIGN | KMSG_CENTER_ALIGN)) { + x1 -= (msg._flags & KMSG_CENTER_ALIGN) ? strWidth / 2 : strWidth; + } + + // Make sure text appears entirely on-screen + int x2 = x1 + strWidth; + if (x2 > MADS_SCREEN_WIDTH) + x1 -= x2 - MADS_SCREEN_WIDTH; + if (x1 > (MADS_SCREEN_WIDTH - 1)) + x1 = MADS_SCREEN_WIDTH - 1; + if (x1 < 0) + x1 = 0; + + if (y1 >(MADS_SCENE_HEIGHT - 1)) + y1 = MADS_SCENE_HEIGHT - 1; + if (y1 < 0) + y1 = 0; + + if (msg._textDisplayIndex >= 0) { + TextDisplay &textEntry = scene._textDisplay[msg._textDisplayIndex]; + + if (flag || (textEntry._bounds.left != x1) || (textEntry._bounds.top != y1)) { + // Mark the associated text entry as deleted, so it can be re-created + scene._textDisplay.expire(msg._textDisplayIndex); + msg._textDisplayIndex = -1; + } + } + + if (msg._textDisplayIndex < 0) { + // Need to create a new text display entry for this message + int idx = scene._textDisplay.add(x1, y1, msg._color1 | (msg._color2 << 8), + scene._textSpacing, msg._msg, _talkFont); + if (idx >= 0) + msg._textDisplayIndex = idx; + } +} + +/*------------------------------------------------------------------------*/ + +TextDisplay::TextDisplay() { + _active = false; + _expire = 0; + _spacing = 0; + _color1 = 0; + _color2 = 0; + _font = nullptr; +} + +/*------------------------------------------------------------------------*/ + +TextDisplayList::TextDisplayList(MADSEngine *vm) : _vm(vm) { + for (int i = 0; i < TEXT_DISPLAY_SIZE; ++i) { + TextDisplay rec; + rec._active = false; + rec._expire = 0; + _entries.push_back(rec); + } +} + +void TextDisplayList::clear() { + for (int i = 0; i < TEXT_DISPLAY_SIZE; ++i) + _entries[i]._active = false; +} + +int TextDisplayList::add(int xp, int yp, uint fontColor, int charSpacing, + const Common::String &msg, Font *font) { + int usedSlot = -1; + + for (int idx = 0; idx < TEXT_DISPLAY_SIZE; ++idx) { + if (!_entries[idx]._active) { + usedSlot = idx; + + _entries[idx]._bounds.left = xp; + _entries[idx]._bounds.top = yp; + _entries[idx]._font = font; + _entries[idx]._msg = msg; + _entries[idx]._bounds.setWidth(font->getWidth(msg, charSpacing)); + _entries[idx]._bounds.setHeight(font->getHeight()); + _entries[idx]._color1 = fontColor & 0xff; + _entries[idx]._color2 = fontColor >> 8; + _entries[idx]._spacing = charSpacing; + _entries[idx]._expire = 1; + _entries[idx]._active = true; + break; + } + } + + return usedSlot; +} + +void TextDisplayList::setDirtyAreas() { + Scene &scene = _vm->_game->_scene; + + for (uint idx = 0, dirtyIdx = DIRTY_AREAS_TEXT_DISPLAY_IDX; dirtyIdx < DIRTY_AREAS_SIZE; ++idx, ++dirtyIdx) { + if ((_entries[idx]._expire >= 0) || !_entries[idx]._active) + scene._dirtyAreas[dirtyIdx]._active = false; + else { + scene._dirtyAreas[dirtyIdx]._textActive = true; + scene._dirtyAreas.setTextDisplay(dirtyIdx, _entries[idx]); + } + } +} + +void TextDisplayList::setDirtyAreas2() { + Scene &scene = _vm->_game->_scene; + + for (uint idx = 0, dirtyIdx = DIRTY_AREAS_TEXT_DISPLAY_IDX; dirtyIdx < DIRTY_AREAS_SIZE; ++idx, ++dirtyIdx) { + if (_entries[idx]._active && (_entries[idx]._expire >= 0)) { + scene._dirtyAreas.setTextDisplay(dirtyIdx, _entries[idx]); + scene._dirtyAreas[dirtyIdx]._textActive = (_entries[idx]._expire <= 0) ? 0 : 1; + } + } +} + +void TextDisplayList::draw(MSurface *view) { + error("TODO"); + /* + for (uint idx = 0; idx < _entries.size(); ++idx) { + if (_entries[idx]._active && (_entries[idx]._expire >= 0)) { + _entries[idx]._font->setColors(_entries[idx]._color1, _entries[idx]._color2, 0); + _entries[idx]._font->writeString(view, _entries[idx]._msg, + Common::Point(_entries[idx]._bounds.left, _entries[idx]._bounds.top), + _entries[idx]._bounds.width(), _entries[idx]._spacing); + } + } + */ +} + +void TextDisplayList::cleanUp() { + for (uint idx = 0; idx < _entries.size(); ++idx) { + if (_entries[idx]._expire < 0) { + _entries[idx]._active = false; + _entries[idx]._expire = 0; + } + } +} + +void TextDisplayList::expire(int idx) { + _entries[idx]._expire = -1; +} + +} // End of namespace MADS -- cgit v1.2.3 From f6888eef1069ac5df07c3f4dcc3a30755bc4ebb0 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 4 Mar 2014 09:33:57 -0500 Subject: MADS: Implementation of timer functionality for Scene::doFrame --- engines/mads/messages.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'engines/mads/messages.cpp') diff --git a/engines/mads/messages.cpp b/engines/mads/messages.cpp index c08f29fd91..cc618c4b76 100644 --- a/engines/mads/messages.cpp +++ b/engines/mads/messages.cpp @@ -75,7 +75,7 @@ int KernelMessages::add(const Common::Point &pt, uint fontColor, uint8 flags, rec._position = pt; rec._textDisplayIndex = -1; rec._timeout = timeout; - rec._frameTimer = _vm->_game->_currentTimer; + rec._frameTimer = _vm->_game->_priorFrameTimer; rec._abortTimers = abortTimers; rec._abortMode = _vm->_game->_abortTimersMode2; @@ -100,7 +100,7 @@ void KernelMessages::scrollMessage(int msgIndex, int numTicks, bool quoted) { _entries[msgIndex]._flags |= quoted ? (KMSG_SCROLL | KMSG_QUOTED) : KMSG_SCROLL; _entries[msgIndex]._msgOffset = 0; _entries[msgIndex]._numTicks = numTicks; - _entries[msgIndex]._frameTimer2 = _vm->_game->_currentTimer; + _entries[msgIndex]._frameTimer2 = _vm->_game->_priorFrameTimer; Common::String msg = _entries[msgIndex]._msg; _entries[msgIndex]._asciiChar = msg[0]; @@ -145,7 +145,7 @@ void KernelMessages::reset() { } void KernelMessages::update() { - uint32 currentTimer = _vm->_game->_currentTimer; + uint32 currentTimer = _vm->_game->_priorFrameTimer; for (uint i = 0; i < _entries.size(); ++i) { if (((_entries[i]._flags & KMSG_ACTIVE) != 0) && @@ -157,7 +157,7 @@ void KernelMessages::update() { void KernelMessages::processText(int msgIndex) { Scene &scene = _vm->_game->_scene; KernelMessage &msg = _entries[msgIndex]; - uint32 currentTimer = _vm->_game->_currentTimer; + uint32 currentTimer = _vm->_game->_priorFrameTimer; bool flag = false; if ((msg._flags & KMSG_EXPIRE) != 0) { @@ -277,6 +277,12 @@ void KernelMessages::processText(int msgIndex) { } } +void KernelMessages::delay(uint32 priorFrameTime, uint32 currentTime) { + for (uint i = 0; i < _entries.size(); ++i) { + _entries[i]._timeout += currentTime - priorFrameTime; + } +} + /*------------------------------------------------------------------------*/ TextDisplay::TextDisplay() { -- cgit v1.2.3 From 568fc31b3090a70aa922479991540d4f5c2e918c Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 4 Mar 2014 22:33:27 -0500 Subject: MADS: Beginnings of code support for Scene::drawElements --- engines/mads/messages.cpp | 49 ++++++++++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 24 deletions(-) (limited to 'engines/mads/messages.cpp') diff --git a/engines/mads/messages.cpp b/engines/mads/messages.cpp index cc618c4b76..3b6663e71d 100644 --- a/engines/mads/messages.cpp +++ b/engines/mads/messages.cpp @@ -301,13 +301,13 @@ TextDisplayList::TextDisplayList(MADSEngine *vm) : _vm(vm) { TextDisplay rec; rec._active = false; rec._expire = 0; - _entries.push_back(rec); + push_back(rec); } } void TextDisplayList::clear() { for (int i = 0; i < TEXT_DISPLAY_SIZE; ++i) - _entries[i]._active = false; + (*this)[i]._active = false; } int TextDisplayList::add(int xp, int yp, uint fontColor, int charSpacing, @@ -315,20 +315,21 @@ int TextDisplayList::add(int xp, int yp, uint fontColor, int charSpacing, int usedSlot = -1; for (int idx = 0; idx < TEXT_DISPLAY_SIZE; ++idx) { - if (!_entries[idx]._active) { + TextDisplay &td = (*this)[idx]; + if (!td._active) { usedSlot = idx; - _entries[idx]._bounds.left = xp; - _entries[idx]._bounds.top = yp; - _entries[idx]._font = font; - _entries[idx]._msg = msg; - _entries[idx]._bounds.setWidth(font->getWidth(msg, charSpacing)); - _entries[idx]._bounds.setHeight(font->getHeight()); - _entries[idx]._color1 = fontColor & 0xff; - _entries[idx]._color2 = fontColor >> 8; - _entries[idx]._spacing = charSpacing; - _entries[idx]._expire = 1; - _entries[idx]._active = true; + td._bounds.left = xp; + td._bounds.top = yp; + td._font = font; + td._msg = msg; + td._bounds.setWidth(font->getWidth(msg, charSpacing)); + td._bounds.setHeight(font->getHeight()); + td._color1 = fontColor & 0xff; + td._color2 = fontColor >> 8; + td._spacing = charSpacing; + td._expire = 1; + td._active = true; break; } } @@ -340,11 +341,11 @@ void TextDisplayList::setDirtyAreas() { Scene &scene = _vm->_game->_scene; for (uint idx = 0, dirtyIdx = DIRTY_AREAS_TEXT_DISPLAY_IDX; dirtyIdx < DIRTY_AREAS_SIZE; ++idx, ++dirtyIdx) { - if ((_entries[idx]._expire >= 0) || !_entries[idx]._active) + if (((*this)[idx]._expire >= 0) || !(*this)[idx]._active) scene._dirtyAreas[dirtyIdx]._active = false; else { scene._dirtyAreas[dirtyIdx]._textActive = true; - scene._dirtyAreas.setTextDisplay(dirtyIdx, _entries[idx]); + scene._dirtyAreas[dirtyIdx].setTextDisplay(&(*this)[idx]); } } } @@ -353,9 +354,9 @@ void TextDisplayList::setDirtyAreas2() { Scene &scene = _vm->_game->_scene; for (uint idx = 0, dirtyIdx = DIRTY_AREAS_TEXT_DISPLAY_IDX; dirtyIdx < DIRTY_AREAS_SIZE; ++idx, ++dirtyIdx) { - if (_entries[idx]._active && (_entries[idx]._expire >= 0)) { - scene._dirtyAreas.setTextDisplay(dirtyIdx, _entries[idx]); - scene._dirtyAreas[dirtyIdx]._textActive = (_entries[idx]._expire <= 0) ? 0 : 1; + if ((*this)[idx]._active && ((*this)[idx]._expire >= 0)) { + scene._dirtyAreas[dirtyIdx].setTextDisplay(&(*this)[idx]); + scene._dirtyAreas[dirtyIdx]._textActive = ((*this)[idx]._expire <= 0) ? 0 : 1; } } } @@ -375,16 +376,16 @@ void TextDisplayList::draw(MSurface *view) { } void TextDisplayList::cleanUp() { - for (uint idx = 0; idx < _entries.size(); ++idx) { - if (_entries[idx]._expire < 0) { - _entries[idx]._active = false; - _entries[idx]._expire = 0; + for (uint idx = 0; idx < size(); ++idx) { + if ((*this)[idx]._expire < 0) { + (*this)[idx]._active = false; + (*this)[idx]._expire = 0; } } } void TextDisplayList::expire(int idx) { - _entries[idx]._expire = -1; + (*this)[idx]._expire = -1; } } // End of namespace MADS -- cgit v1.2.3 From d98f890029936dfa8139cf8dce4756ec92bc2568 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 5 Mar 2014 09:04:53 -0500 Subject: MADS: Completed implementing drawElements and support methods --- engines/mads/messages.cpp | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) (limited to 'engines/mads/messages.cpp') diff --git a/engines/mads/messages.cpp b/engines/mads/messages.cpp index 3b6663e71d..11db00f1b9 100644 --- a/engines/mads/messages.cpp +++ b/engines/mads/messages.cpp @@ -305,7 +305,7 @@ TextDisplayList::TextDisplayList(MADSEngine *vm) : _vm(vm) { } } -void TextDisplayList::clear() { +void TextDisplayList::reset() { for (int i = 0; i < TEXT_DISPLAY_SIZE; ++i) (*this)[i]._active = false; } @@ -361,18 +361,16 @@ void TextDisplayList::setDirtyAreas2() { } } -void TextDisplayList::draw(MSurface *view) { - error("TODO"); - /* - for (uint idx = 0; idx < _entries.size(); ++idx) { - if (_entries[idx]._active && (_entries[idx]._expire >= 0)) { - _entries[idx]._font->setColors(_entries[idx]._color1, _entries[idx]._color2, 0); - _entries[idx]._font->writeString(view, _entries[idx]._msg, - Common::Point(_entries[idx]._bounds.left, _entries[idx]._bounds.top), - _entries[idx]._bounds.width(), _entries[idx]._spacing); +void TextDisplayList::draw(MSurface *s) { + for (uint idx = 0; idx < size(); ++idx) { + TextDisplay &td = (*this)[idx]; + if (td._active && (td._expire >= 0)) { + td._font->setColors(0xFF, td._color1, td._color2, 0); + td._font->writeString(s, td._msg, + Common::Point(td._bounds.left, td._bounds.top), + td._bounds.width(), td._spacing); } } - */ } void TextDisplayList::cleanUp() { -- cgit v1.2.3 From c9186f51b9502a4cfb1881f2db4f92eeb6227144 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 6 Mar 2014 20:30:05 -0500 Subject: MADS: Added in Rex Nebular globals class --- engines/mads/messages.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'engines/mads/messages.cpp') diff --git a/engines/mads/messages.cpp b/engines/mads/messages.cpp index 11db00f1b9..33a6a8ef6c 100644 --- a/engines/mads/messages.cpp +++ b/engines/mads/messages.cpp @@ -37,7 +37,6 @@ KernelMessages::KernelMessages(MADSEngine *vm): _vm(vm) { _entries.push_back(rec); } - scene._textSpacing = -1; _talkFont = _vm->_font->getFont(FONT_CONVERSATION); word_8469E = 0; } -- cgit v1.2.3 From a77ed90618664e50705b3e59dd2111faec2f5f39 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 6 Mar 2014 22:31:41 -0500 Subject: MADS: Implementing support methods needed for scene 804 initialisation --- engines/mads/messages.cpp | 2 -- 1 file changed, 2 deletions(-) (limited to 'engines/mads/messages.cpp') diff --git a/engines/mads/messages.cpp b/engines/mads/messages.cpp index 33a6a8ef6c..aaf6c4100e 100644 --- a/engines/mads/messages.cpp +++ b/engines/mads/messages.cpp @@ -30,8 +30,6 @@ namespace MADS { KernelMessages::KernelMessages(MADSEngine *vm): _vm(vm) { - Scene &scene = _vm->_game->_scene; - for (int i = 0; i < KERNEL_MESSAGES_SIZE; ++i) { KernelMessage rec; _entries.push_back(rec); -- cgit v1.2.3 From 7310080967d506de91b99611e468c209456b3f81 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 8 Mar 2014 08:26:09 -0500 Subject: MADS: Fix memory leak with conversation font loading --- engines/mads/messages.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'engines/mads/messages.cpp') diff --git a/engines/mads/messages.cpp b/engines/mads/messages.cpp index aaf6c4100e..69d984313b 100644 --- a/engines/mads/messages.cpp +++ b/engines/mads/messages.cpp @@ -39,6 +39,10 @@ KernelMessages::KernelMessages(MADSEngine *vm): _vm(vm) { word_8469E = 0; } +KernelMessages::~KernelMessages() { + delete _talkFont; +} + void KernelMessages::clear() { Scene &scene = _vm->_game->_scene; @@ -46,7 +50,6 @@ void KernelMessages::clear() { _entries[i]._flags = 0; scene._textSpacing = -1; - _talkFont = _vm->_font->getFont(FONT_CONVERSATION); } int KernelMessages::add(const Common::Point &pt, uint fontColor, uint8 flags, -- cgit v1.2.3 From 8d3857c0536e47a6a03497346424c111b5bebd7b Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 8 Mar 2014 08:44:01 -0500 Subject: MADS: Cleanup code for accessing sprite assets --- engines/mads/messages.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'engines/mads/messages.cpp') diff --git a/engines/mads/messages.cpp b/engines/mads/messages.cpp index 69d984313b..0e66626bbc 100644 --- a/engines/mads/messages.cpp +++ b/engines/mads/messages.cpp @@ -194,7 +194,7 @@ void KernelMessages::processText(int msgIndex) { if (msg._flags & KMSG_SEQ_ENTRY) { SequenceEntry &seqEntry = scene._sequences[msg._sequenceIndex]; if (!seqEntry._nonFixed) { - SpriteAsset &spriteSet = scene._spriteSlots.getSprite(seqEntry._spritesIndex); + SpriteAsset &spriteSet = *scene._sprites[seqEntry._spritesIndex]; MSprite *frame = spriteSet.getFrame(seqEntry._frameIndex - 1); x1 = frame->getBounds().left; y1 = frame->getBounds().top; -- cgit v1.2.3 From 8cd85f3a000ab755da7b13c8589d3c67c081122a Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 8 Mar 2014 16:06:37 -0500 Subject: MADS: Fixes for drawing scene elements --- engines/mads/messages.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'engines/mads/messages.cpp') diff --git a/engines/mads/messages.cpp b/engines/mads/messages.cpp index 0e66626bbc..8bdbe72512 100644 --- a/engines/mads/messages.cpp +++ b/engines/mads/messages.cpp @@ -340,7 +340,7 @@ int TextDisplayList::add(int xp, int yp, uint fontColor, int charSpacing, void TextDisplayList::setDirtyAreas() { Scene &scene = _vm->_game->_scene; - for (uint idx = 0, dirtyIdx = DIRTY_AREAS_TEXT_DISPLAY_IDX; dirtyIdx < DIRTY_AREAS_SIZE; ++idx, ++dirtyIdx) { + for (uint idx = 0, dirtyIdx = DIRTY_AREAS_TEXT_DISPLAY_IDX; dirtyIdx < size(); ++idx, ++dirtyIdx) { if (((*this)[idx]._expire >= 0) || !(*this)[idx]._active) scene._dirtyAreas[dirtyIdx]._active = false; else { @@ -353,7 +353,7 @@ void TextDisplayList::setDirtyAreas() { void TextDisplayList::setDirtyAreas2() { Scene &scene = _vm->_game->_scene; - for (uint idx = 0, dirtyIdx = DIRTY_AREAS_TEXT_DISPLAY_IDX; dirtyIdx < DIRTY_AREAS_SIZE; ++idx, ++dirtyIdx) { + for (uint idx = 0, dirtyIdx = DIRTY_AREAS_TEXT_DISPLAY_IDX; idx < size(); ++idx, ++dirtyIdx) { if ((*this)[idx]._active && ((*this)[idx]._expire >= 0)) { scene._dirtyAreas[dirtyIdx].setTextDisplay(&(*this)[idx]); scene._dirtyAreas[dirtyIdx]._textActive = ((*this)[idx]._expire <= 0) ? 0 : 1; -- cgit v1.2.3 From 408f5e79df5e8a33367fdf2a9c17b424953edace Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 12 Mar 2014 22:45:33 -0400 Subject: MADS: General cleanup and minor fixes --- engines/mads/messages.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'engines/mads/messages.cpp') diff --git a/engines/mads/messages.cpp b/engines/mads/messages.cpp index 8bdbe72512..dcac541cf8 100644 --- a/engines/mads/messages.cpp +++ b/engines/mads/messages.cpp @@ -340,10 +340,10 @@ int TextDisplayList::add(int xp, int yp, uint fontColor, int charSpacing, void TextDisplayList::setDirtyAreas() { Scene &scene = _vm->_game->_scene; - for (uint idx = 0, dirtyIdx = DIRTY_AREAS_TEXT_DISPLAY_IDX; dirtyIdx < size(); ++idx, ++dirtyIdx) { - if (((*this)[idx]._expire >= 0) || !(*this)[idx]._active) + for (uint idx = 0, dirtyIdx = SPRITE_SLOTS_MAX_SIZE; dirtyIdx < size(); ++idx, ++dirtyIdx) { + if (((*this)[idx]._expire >= 0) || !(*this)[idx]._active) { scene._dirtyAreas[dirtyIdx]._active = false; - else { + } else { scene._dirtyAreas[dirtyIdx]._textActive = true; scene._dirtyAreas[dirtyIdx].setTextDisplay(&(*this)[idx]); } @@ -353,7 +353,7 @@ void TextDisplayList::setDirtyAreas() { void TextDisplayList::setDirtyAreas2() { Scene &scene = _vm->_game->_scene; - for (uint idx = 0, dirtyIdx = DIRTY_AREAS_TEXT_DISPLAY_IDX; idx < size(); ++idx, ++dirtyIdx) { + for (uint idx = 0, dirtyIdx = SPRITE_SLOTS_MAX_SIZE; idx < size(); ++idx, ++dirtyIdx) { if ((*this)[idx]._active && ((*this)[idx]._expire >= 0)) { scene._dirtyAreas[dirtyIdx].setTextDisplay(&(*this)[idx]); scene._dirtyAreas[dirtyIdx]._textActive = ((*this)[idx]._expire <= 0) ? 0 : 1; -- cgit v1.2.3 From 3f0cd4771c94a83c72f09f74ba351a3905357d1c Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 13 Mar 2014 22:25:16 -0400 Subject: MADS: Fixed handling of dirty rects to copy areas to the physical screen --- engines/mads/messages.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'engines/mads/messages.cpp') diff --git a/engines/mads/messages.cpp b/engines/mads/messages.cpp index dcac541cf8..21463aa58a 100644 --- a/engines/mads/messages.cpp +++ b/engines/mads/messages.cpp @@ -23,7 +23,7 @@ #include "common/scummsys.h" #include "mads/mads.h" #include "mads/font.h" -#include "mads/graphics.h" +#include "mads/screen.h" #include "mads/messages.h" #include "mads/scene_data.h" -- cgit v1.2.3 From 10124f6806150aad409f6db9a6c7a60afcb44872 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 15 Mar 2014 17:38:44 -0400 Subject: MADS: Implemented scene 103 setup and needed support methods --- engines/mads/messages.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'engines/mads/messages.cpp') diff --git a/engines/mads/messages.cpp b/engines/mads/messages.cpp index 21463aa58a..a9ce093c1f 100644 --- a/engines/mads/messages.cpp +++ b/engines/mads/messages.cpp @@ -283,6 +283,29 @@ void KernelMessages::delay(uint32 priorFrameTime, uint32 currentTime) { } } +void KernelMessages::setQuoted(int msgIndex, int numTicks, bool quoted) { + if (msgIndex >= 0) { + KernelMessage &msg = _entries[msgIndex]; + + msg._flags |= KMSG_SCROLL; + if (quoted) + msg._flags |= KMSG_QUOTED; + + msg._msgOffset = 0; + msg._numTicks = numTicks; + msg._frameTimer2 = _vm->_game->_scene._frameStartTime; + msg._asciiChar = msg._msg[0]; + msg._asciiChar2 = msg._msg[1]; + + if (msg._flags & KMSG_PLAYER_TIMEOUT) { + msg._frameTimer2 = _vm->_game->_player._priorTimer + + _vm->_game->_player._ticksAmount; + } + + msg._frameTimer = msg._frameTimer2; + } +} + /*------------------------------------------------------------------------*/ TextDisplay::TextDisplay() { -- cgit v1.2.3 From acba8f9254a724ce9c57f5ddd81e6b9264c07274 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 16 Mar 2014 23:40:21 -0400 Subject: MADS: Implementing user interface text display methods --- engines/mads/messages.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'engines/mads/messages.cpp') diff --git a/engines/mads/messages.cpp b/engines/mads/messages.cpp index a9ce093c1f..c355dacb7c 100644 --- a/engines/mads/messages.cpp +++ b/engines/mads/messages.cpp @@ -391,7 +391,7 @@ void TextDisplayList::draw(MSurface *s) { td._font->setColors(0xFF, td._color1, td._color2, 0); td._font->writeString(s, td._msg, Common::Point(td._bounds.left, td._bounds.top), - td._bounds.width(), td._spacing); + td._spacing, td._bounds.width()); } } } -- cgit v1.2.3 From b831323c85bb1ca26368cee6690d4664c37e9c0b Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 17 Mar 2014 00:00:22 -0400 Subject: MADS: Added caching for font instances --- engines/mads/messages.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'engines/mads/messages.cpp') diff --git a/engines/mads/messages.cpp b/engines/mads/messages.cpp index c355dacb7c..592dd4bd28 100644 --- a/engines/mads/messages.cpp +++ b/engines/mads/messages.cpp @@ -40,7 +40,6 @@ KernelMessages::KernelMessages(MADSEngine *vm): _vm(vm) { } KernelMessages::~KernelMessages() { - delete _talkFont; } void KernelMessages::clear() { -- cgit v1.2.3 From bbabe2b06b479fb5775b55c0de7b10df7ff67501 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 22 Mar 2014 14:20:04 -0400 Subject: MADS: Fix positioning of kernel messages --- engines/mads/messages.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) (limited to 'engines/mads/messages.cpp') diff --git a/engines/mads/messages.cpp b/engines/mads/messages.cpp index 592dd4bd28..6dde40bbda 100644 --- a/engines/mads/messages.cpp +++ b/engines/mads/messages.cpp @@ -36,7 +36,6 @@ KernelMessages::KernelMessages(MADSEngine *vm): _vm(vm) { } _talkFont = _vm->_font->getFont(FONT_CONVERSATION); - word_8469E = 0; } KernelMessages::~KernelMessages() { @@ -89,7 +88,8 @@ int KernelMessages::add(const Common::Point &pt, uint fontColor, uint8 flags, int KernelMessages::addQuote(int quoteId, int abortTimers, uint32 timeout) { Common::String quoteStr = _vm->_game->getQuote(quoteId); - return add(Common::Point(), 0x1110, KMSG_PLAYER_TIMEOUT | KMSG_CENTER_ALIGN, abortTimers, timeout, quoteStr); + return add(Common::Point(), 0x1110, KMSG_PLAYER_TIMEOUT | KMSG_CENTER_ALIGN, + abortTimers, timeout, quoteStr); } void KernelMessages::scrollMessage(int msgIndex, int numTicks, bool quoted) { @@ -203,10 +203,16 @@ void KernelMessages::processText(int msgIndex) { } } + Player &player = _vm->_game->_player; if (msg._flags & KMSG_PLAYER_TIMEOUT) { - if (word_8469E != 0) { - warning("TODO: KernelMessages::processText"); - // TODO: Figure out various flags + if (player._visible3) { + SpriteAsset &asset = *_vm->_game->_scene._sprites[player._spritesStart + player._spritesIdx]; + MSprite *frame = asset.getFrame(player._frameNum - 1); + + int yAmount = player._currentScale * player._yScale / 100; + x1 = player._playerPos.x; + y1 = (frame->h * player._currentScale / -100) + yAmount + + player._playerPos.y - 15; } else { x1 = 160; y1 = 78; @@ -222,11 +228,10 @@ void KernelMessages::processText(int msgIndex) { ++msg._msgOffset; msg._msg.setChar(msg._asciiChar2, msg._msgOffset); msg._asciiChar = msg._msg[msg._msgOffset]; - msg._asciiChar2 = msg._msg[msg._msgOffset + 1]; + msg._asciiChar2 = !msg._asciiChar ? '\0' : msg._msg[msg._msgOffset + 1]; if (!msg._asciiChar) { // End of message - msg._msg.setChar('\0', msg._msgOffset); msg._flags &= ~KMSG_SCROLL; } else if (msg._flags & KMSG_QUOTED) { msg._msg.setChar('"', msg._msgOffset); -- cgit v1.2.3 From 74b48ba813b91e240be2f228faacc61be75011e6 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 22 Mar 2014 14:43:08 -0400 Subject: MADS: Fixes for displaying kernel messages --- engines/mads/messages.cpp | 34 +++++++++++++--------------------- 1 file changed, 13 insertions(+), 21 deletions(-) (limited to 'engines/mads/messages.cpp') diff --git a/engines/mads/messages.cpp b/engines/mads/messages.cpp index 6dde40bbda..be84739fc0 100644 --- a/engines/mads/messages.cpp +++ b/engines/mads/messages.cpp @@ -102,8 +102,6 @@ void KernelMessages::scrollMessage(int msgIndex, int numTicks, bool quoted) { _entries[msgIndex]._frameTimer2 = _vm->_game->_priorFrameTimer; Common::String msg = _entries[msgIndex]._msg; - _entries[msgIndex]._asciiChar = msg[0]; - _entries[msgIndex]._asciiChar2 = msg[1]; if (_entries[msgIndex]._flags & KMSG_PLAYER_TIMEOUT) _entries[msgIndex]._frameTimer2 = _vm->_game->_player._ticksAmount + @@ -125,8 +123,7 @@ void KernelMessages::remove(int msgIndex) { if (rec._flags & KMSG_ACTIVE) { if (rec._flags & KMSG_SCROLL) { - rec._msg.setChar(rec._asciiChar, rec._msgOffset); - rec._msg.setChar(rec._asciiChar2, rec._msgOffset + 1); + // WORKAROUND: Code here no longer needed in ScummVM } if (rec._textDisplayIndex >= 0) @@ -144,11 +141,12 @@ void KernelMessages::reset() { } void KernelMessages::update() { - uint32 currentTimer = _vm->_game->_priorFrameTimer; + uint32 currentTimer = _vm->_game->_scene._frameStartTime; - for (uint i = 0; i < _entries.size(); ++i) { - if (((_entries[i]._flags & KMSG_ACTIVE) != 0) && - (currentTimer >= _entries[i]._frameTimer)) + for (uint i = 0; i < _entries.size() && !_vm->_game->_abortTimers; ++i) { + KernelMessage &msg = _entries[i]; + + if (((msg._flags & KMSG_ACTIVE) != 0) && (currentTimer >= msg._frameTimer)) processText(i); } } @@ -222,27 +220,23 @@ void KernelMessages::processText(int msgIndex) { x1 += msg._position.x; y1 += msg._position.y; - if ((msg._flags & KMSG_SCROLL) && (msg._frameTimer >= currentTimer)) { - msg._msg.setChar(msg._asciiChar, msg._msgOffset); + Common::String displayMsg = msg._msg; + if ((msg._flags & KMSG_SCROLL) && (msg._frameTimer >= currentTimer)) { ++msg._msgOffset; - msg._msg.setChar(msg._asciiChar2, msg._msgOffset); - msg._asciiChar = msg._msg[msg._msgOffset]; - msg._asciiChar2 = !msg._asciiChar ? '\0' : msg._msg[msg._msgOffset + 1]; - if (!msg._asciiChar) { + if (msg._msgOffset >= msg._msg.size()) { // End of message msg._flags &= ~KMSG_SCROLL; - } else if (msg._flags & KMSG_QUOTED) { - msg._msg.setChar('"', msg._msgOffset); - msg._msg.setChar('\0', msg._msgOffset + 1); + } else { + displayMsg = Common::String(msg._msg.c_str(), msg._msg.c_str() + msg._msgOffset); } msg._frameTimer = msg._frameTimer2 = currentTimer + msg._numTicks; flag = true; } - int strWidth = _talkFont->getWidth(msg._msg, scene._textSpacing); + int strWidth = _talkFont->getWidth(displayMsg, scene._textSpacing); if (msg._flags & (KMSG_RIGHT_ALIGN | KMSG_CENTER_ALIGN)) { x1 -= (msg._flags & KMSG_CENTER_ALIGN) ? strWidth / 2 : strWidth; @@ -275,7 +269,7 @@ void KernelMessages::processText(int msgIndex) { if (msg._textDisplayIndex < 0) { // Need to create a new text display entry for this message int idx = scene._textDisplay.add(x1, y1, msg._color1 | (msg._color2 << 8), - scene._textSpacing, msg._msg, _talkFont); + scene._textSpacing, displayMsg, _talkFont); if (idx >= 0) msg._textDisplayIndex = idx; } @@ -298,8 +292,6 @@ void KernelMessages::setQuoted(int msgIndex, int numTicks, bool quoted) { msg._msgOffset = 0; msg._numTicks = numTicks; msg._frameTimer2 = _vm->_game->_scene._frameStartTime; - msg._asciiChar = msg._msg[0]; - msg._asciiChar2 = msg._msg[1]; if (msg._flags & KMSG_PLAYER_TIMEOUT) { msg._frameTimer2 = _vm->_game->_player._priorTimer + -- cgit v1.2.3 From 6c85572d76245f616ae3bf2ac1ccc713d8271fa9 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 27 Mar 2014 22:38:28 -0400 Subject: MADS: Initial cleanup of action/player handling --- engines/mads/messages.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'engines/mads/messages.cpp') diff --git a/engines/mads/messages.cpp b/engines/mads/messages.cpp index be84739fc0..617bd6d2a0 100644 --- a/engines/mads/messages.cpp +++ b/engines/mads/messages.cpp @@ -74,7 +74,7 @@ int KernelMessages::add(const Common::Point &pt, uint fontColor, uint8 flags, rec._textDisplayIndex = -1; rec._timeout = timeout; rec._frameTimer = _vm->_game->_priorFrameTimer; - rec._abortTimers = abortTimers; + rec._trigger = abortTimers; rec._abortMode = _vm->_game->_abortTimersMode2; rec._actionDetails = scene._action._activeAction; @@ -143,7 +143,7 @@ void KernelMessages::reset() { void KernelMessages::update() { uint32 currentTimer = _vm->_game->_scene._frameStartTime; - for (uint i = 0; i < _entries.size() && !_vm->_game->_abortTimers; ++i) { + for (uint i = 0; i < _entries.size() && !_vm->_game->_trigger; ++i) { KernelMessage &msg = _entries[i]; if (((msg._flags & KMSG_ACTIVE) != 0) && (currentTimer >= msg._frameTimer)) @@ -173,10 +173,10 @@ void KernelMessages::processText(int msgIndex) { msg._timeout = 0; } - if ((msg._timeout <= 0) && (_vm->_game->_abortTimers == 0)) { + if ((msg._timeout <= 0) && (_vm->_game->_trigger == 0)) { msg._flags |= KMSG_EXPIRE; - if (msg._abortTimers != 0) { - _vm->_game->_abortTimers = msg._abortTimers; + if (msg._trigger != 0) { + _vm->_game->_trigger = msg._trigger; _vm->_game->_abortTimersMode = msg._abortMode; if (_vm->_game->_abortTimersMode != ABORTMODE_1) { -- cgit v1.2.3 From b9daf53bcd14332624f3d18fd21514b1f9146107 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Fri, 28 Mar 2014 09:19:55 -0400 Subject: MADS: Cleanup of direction setup, fix sprite mirroring for walking --- engines/mads/messages.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'engines/mads/messages.cpp') diff --git a/engines/mads/messages.cpp b/engines/mads/messages.cpp index 617bd6d2a0..5c6e11339c 100644 --- a/engines/mads/messages.cpp +++ b/engines/mads/messages.cpp @@ -205,9 +205,9 @@ void KernelMessages::processText(int msgIndex) { if (msg._flags & KMSG_PLAYER_TIMEOUT) { if (player._visible3) { SpriteAsset &asset = *_vm->_game->_scene._sprites[player._spritesStart + player._spritesIdx]; - MSprite *frame = asset.getFrame(player._frameNum - 1); + MSprite *frame = asset.getFrame(player._frameNumber - 1); - int yAmount = player._currentScale * player._yScale / 100; + int yAmount = player._currentScale * player._centerOfGravity / 100; x1 = player._playerPos.x; y1 = (frame->h * player._currentScale / -100) + yAmount + player._playerPos.y - 15; -- cgit v1.2.3 From 71b1343adf6e886cfd2e1a0040a12b5025672d14 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 29 Mar 2014 11:18:07 -0400 Subject: MADS: Implemented NebularGame::step --- engines/mads/messages.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'engines/mads/messages.cpp') diff --git a/engines/mads/messages.cpp b/engines/mads/messages.cpp index 5c6e11339c..3903b71766 100644 --- a/engines/mads/messages.cpp +++ b/engines/mads/messages.cpp @@ -75,7 +75,7 @@ int KernelMessages::add(const Common::Point &pt, uint fontColor, uint8 flags, rec._timeout = timeout; rec._frameTimer = _vm->_game->_priorFrameTimer; rec._trigger = abortTimers; - rec._abortMode = _vm->_game->_abortTimersMode2; + rec._abortMode = _vm->_game->_triggerSetupMode; rec._actionDetails = scene._action._activeAction; @@ -177,9 +177,9 @@ void KernelMessages::processText(int msgIndex) { msg._flags |= KMSG_EXPIRE; if (msg._trigger != 0) { _vm->_game->_trigger = msg._trigger; - _vm->_game->_abortTimersMode = msg._abortMode; + _vm->_game->_triggerMode = msg._abortMode; - if (_vm->_game->_abortTimersMode != ABORTMODE_1) { + if (_vm->_game->_triggerMode != KERNEL_TRIGGER_DAEMON) { scene._action._activeAction = msg._actionDetails; } } -- cgit v1.2.3 From 0b340a034330fd5124b1534544a8ef9500349411 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 15 Apr 2014 23:51:41 -0400 Subject: MADS: Fix depth issues with sitting in chair in scene 101 --- engines/mads/messages.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'engines/mads/messages.cpp') diff --git a/engines/mads/messages.cpp b/engines/mads/messages.cpp index 3903b71766..46b05c1413 100644 --- a/engines/mads/messages.cpp +++ b/engines/mads/messages.cpp @@ -179,7 +179,7 @@ void KernelMessages::processText(int msgIndex) { _vm->_game->_trigger = msg._trigger; _vm->_game->_triggerMode = msg._abortMode; - if (_vm->_game->_triggerMode != KERNEL_TRIGGER_DAEMON) { + if (_vm->_game->_triggerMode != SEQUENCE_TRIGGER_DAEMON) { scene._action._activeAction = msg._actionDetails; } } -- cgit v1.2.3 From 0e9e6cda40ee0bf739e6c7a6320a81307df7c8b9 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 22 Apr 2014 23:00:41 -0400 Subject: MADS: Beginnings of savegame synchronisation --- engines/mads/messages.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'engines/mads/messages.cpp') diff --git a/engines/mads/messages.cpp b/engines/mads/messages.cpp index 46b05c1413..2f59a67359 100644 --- a/engines/mads/messages.cpp +++ b/engines/mads/messages.cpp @@ -203,7 +203,7 @@ void KernelMessages::processText(int msgIndex) { Player &player = _vm->_game->_player; if (msg._flags & KMSG_PLAYER_TIMEOUT) { - if (player._visible3) { + if (player._beenVisible) { SpriteAsset &asset = *_vm->_game->_scene._sprites[player._spritesStart + player._spritesIdx]; MSprite *frame = asset.getFrame(player._frameNumber - 1); -- cgit v1.2.3 From e89b16a5f2cab78b5031337d9a86a70f2cffdc5b Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 8 May 2014 02:44:31 +0300 Subject: MADS: Reset the font in KernelMessages::reset() Fixes the dialog font with the native woman in scene 210, after it gets set to the interface font in scene 208 --- engines/mads/messages.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'engines/mads/messages.cpp') diff --git a/engines/mads/messages.cpp b/engines/mads/messages.cpp index 2f59a67359..08e86e20de 100644 --- a/engines/mads/messages.cpp +++ b/engines/mads/messages.cpp @@ -137,6 +137,7 @@ void KernelMessages::reset() { for (uint i = 0; i < _entries.size(); ++i) remove(i); + _talkFont = _vm->_font->getFont(FONT_CONVERSATION); warning("TODO: KernelMessages::reset - sub_20454"); } -- cgit v1.2.3 From b7dd01fdefd910c3c0f6291145ceab4060ae1a70 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 8 May 2014 11:43:23 +0300 Subject: MADS: Remove trailing whitespace --- engines/mads/messages.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'engines/mads/messages.cpp') diff --git a/engines/mads/messages.cpp b/engines/mads/messages.cpp index 08e86e20de..e498ab9621 100644 --- a/engines/mads/messages.cpp +++ b/engines/mads/messages.cpp @@ -50,9 +50,9 @@ void KernelMessages::clear() { scene._textSpacing = -1; } -int KernelMessages::add(const Common::Point &pt, uint fontColor, uint8 flags, +int KernelMessages::add(const Common::Point &pt, uint fontColor, uint8 flags, uint8 abortTimers, uint32 timeout, const Common::String &msg) { - Scene &scene = _vm->_game->_scene; + Scene &scene = _vm->_game->_scene; // Find a free slot uint idx = 0; @@ -80,7 +80,7 @@ int KernelMessages::add(const Common::Point &pt, uint fontColor, uint8 flags, rec._actionDetails = scene._action._activeAction; if (flags & KMSG_PLAYER_TIMEOUT) - rec._frameTimer = _vm->_game->_player._ticksAmount + + rec._frameTimer = _vm->_game->_player._ticksAmount + _vm->_game->_player._priorTimer; return idx; @@ -88,7 +88,7 @@ int KernelMessages::add(const Common::Point &pt, uint fontColor, uint8 flags, int KernelMessages::addQuote(int quoteId, int abortTimers, uint32 timeout) { Common::String quoteStr = _vm->_game->getQuote(quoteId); - return add(Common::Point(), 0x1110, KMSG_PLAYER_TIMEOUT | KMSG_CENTER_ALIGN, + return add(Common::Point(), 0x1110, KMSG_PLAYER_TIMEOUT | KMSG_CENTER_ALIGN, abortTimers, timeout, quoteStr); } @@ -104,7 +104,7 @@ void KernelMessages::scrollMessage(int msgIndex, int numTicks, bool quoted) { Common::String msg = _entries[msgIndex]._msg; if (_entries[msgIndex]._flags & KMSG_PLAYER_TIMEOUT) - _entries[msgIndex]._frameTimer2 = _vm->_game->_player._ticksAmount + + _entries[msgIndex]._frameTimer2 = _vm->_game->_player._ticksAmount + _vm->_game->_player._priorTimer; _entries[msgIndex]._frameTimer = _entries[msgIndex]._frameTimer2; @@ -269,7 +269,7 @@ void KernelMessages::processText(int msgIndex) { if (msg._textDisplayIndex < 0) { // Need to create a new text display entry for this message - int idx = scene._textDisplay.add(x1, y1, msg._color1 | (msg._color2 << 8), + int idx = scene._textDisplay.add(x1, y1, msg._color1 | (msg._color2 << 8), scene._textSpacing, displayMsg, _talkFont); if (idx >= 0) msg._textDisplayIndex = idx; @@ -330,7 +330,7 @@ void TextDisplayList::reset() { (*this)[i]._active = false; } -int TextDisplayList::add(int xp, int yp, uint fontColor, int charSpacing, +int TextDisplayList::add(int xp, int yp, uint fontColor, int charSpacing, const Common::String &msg, Font *font) { int usedSlot = -1; @@ -387,7 +387,7 @@ void TextDisplayList::draw(MSurface *s) { if (td._active && (td._expire >= 0)) { td._font->setColors(0xFF, td._color1, td._color2, 0); td._font->writeString(s, td._msg, - Common::Point(td._bounds.left, td._bounds.top), + Common::Point(td._bounds.left, td._bounds.top), td._spacing, td._bounds.width()); } } -- cgit v1.2.3 From 622f97244df3f6bf80c86c4452f064bee8871e3d Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Fri, 16 May 2014 23:02:35 -0400 Subject: MADS: In progress framework for on-screen random messages --- engines/mads/messages.cpp | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) (limited to 'engines/mads/messages.cpp') diff --git a/engines/mads/messages.cpp b/engines/mads/messages.cpp index e498ab9621..8ec6350236 100644 --- a/engines/mads/messages.cpp +++ b/engines/mads/messages.cpp @@ -36,6 +36,9 @@ KernelMessages::KernelMessages(MADSEngine *vm): _vm(vm) { } _talkFont = _vm->_font->getFont(FONT_CONVERSATION); + + _randomMaxMessages = 0; + resetRandomMessages(); } KernelMessages::~KernelMessages() { @@ -138,7 +141,7 @@ void KernelMessages::reset() { remove(i); _talkFont = _vm->_font->getFont(FONT_CONVERSATION); - warning("TODO: KernelMessages::reset - sub_20454"); + resetRandomMessages(); } void KernelMessages::update() { @@ -303,6 +306,46 @@ void KernelMessages::setQuoted(int msgIndex, int numTicks, bool quoted) { } } +void KernelMessages::resetRandomMessages() { + for (int i = 0; i < RANDOM_MESSAGE_SIZE; ++i) { + _randomMessages[i]._handle = -1; + _randomMessages[i]._quote = -1; + } +} + +#define RANDOM_MESSAGE_TRIGGER 240 + +void KernelMessages::randomServer() { + if ((_vm->_game->_trigger >= RANDOM_MESSAGE_TRIGGER) && + (_vm->_game->_trigger < (RANDOM_MESSAGE_TRIGGER + _randomMaxMessages))) { + _randomMessages[_vm->_game->_trigger - RANDOM_MESSAGE_TRIGGER]._handle = -1; + _randomMessages[_vm->_game->_trigger - RANDOM_MESSAGE_TRIGGER]._quote = -1; + } +} + +int KernelMessages::checkRandom() { + int total = 0; + + for (int i = 0; i < _randomMaxMessages; ++i) { + if (_randomMessages[i]._handle >= 0) + ++total; + } + + return total; +} + +bool KernelMessages::generateRandom(int major, int minor) { + // TODO + return false; +} + +void KernelMessages::initRandomMessages(int maxSimultaneousMessages, + const Common::Rect &bounds, int minYSpacing, int scrollRate, + int color, int duration, int quoteId, ...) { + // TODO +} + + /*------------------------------------------------------------------------*/ TextDisplay::TextDisplay() { -- cgit v1.2.3 From 11f784713e302c38aab0dbdc779632136096bb2a Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 17 May 2014 12:04:39 -0400 Subject: MADS: Completed random message generation method --- engines/mads/messages.cpp | 124 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 108 insertions(+), 16 deletions(-) (limited to 'engines/mads/messages.cpp') diff --git a/engines/mads/messages.cpp b/engines/mads/messages.cpp index 8ec6350236..23fdbb2785 100644 --- a/engines/mads/messages.cpp +++ b/engines/mads/messages.cpp @@ -29,6 +29,19 @@ namespace MADS { +RandomMessages::RandomMessages() { + reserve(RANDOM_MESSAGE_SIZE); + _randomSpacing = 0; +} + +void RandomMessages::reset() { + for (uint i = 0; i < size(); ++i) { + (*this)[i]._handle = -1; + (*this)[i]._quoteId = -1; + } +} + + KernelMessages::KernelMessages(MADSEngine *vm): _vm(vm) { for (int i = 0; i < KERNEL_MESSAGES_SIZE; ++i) { KernelMessage rec; @@ -36,9 +49,6 @@ KernelMessages::KernelMessages(MADSEngine *vm): _vm(vm) { } _talkFont = _vm->_font->getFont(FONT_CONVERSATION); - - _randomMaxMessages = 0; - resetRandomMessages(); } KernelMessages::~KernelMessages() { @@ -141,7 +151,7 @@ void KernelMessages::reset() { remove(i); _talkFont = _vm->_font->getFont(FONT_CONVERSATION); - resetRandomMessages(); + _randomMessages.clear(); } void KernelMessages::update() { @@ -306,27 +316,20 @@ void KernelMessages::setQuoted(int msgIndex, int numTicks, bool quoted) { } } -void KernelMessages::resetRandomMessages() { - for (int i = 0; i < RANDOM_MESSAGE_SIZE; ++i) { - _randomMessages[i]._handle = -1; - _randomMessages[i]._quote = -1; - } -} - #define RANDOM_MESSAGE_TRIGGER 240 void KernelMessages::randomServer() { if ((_vm->_game->_trigger >= RANDOM_MESSAGE_TRIGGER) && - (_vm->_game->_trigger < (RANDOM_MESSAGE_TRIGGER + _randomMaxMessages))) { + (_vm->_game->_trigger < (RANDOM_MESSAGE_TRIGGER + (int)_randomMessages.size()))) { _randomMessages[_vm->_game->_trigger - RANDOM_MESSAGE_TRIGGER]._handle = -1; - _randomMessages[_vm->_game->_trigger - RANDOM_MESSAGE_TRIGGER]._quote = -1; + _randomMessages[_vm->_game->_trigger - RANDOM_MESSAGE_TRIGGER]._quoteId = -1; } } int KernelMessages::checkRandom() { int total = 0; - for (int i = 0; i < _randomMaxMessages; ++i) { + for (uint i = 0; i < _randomMessages.size(); ++i) { if (_randomMessages[i]._handle >= 0) ++total; } @@ -335,8 +338,97 @@ int KernelMessages::checkRandom() { } bool KernelMessages::generateRandom(int major, int minor) { - // TODO - return false; + bool generatedMessage = false; + + // Scan through the random messages array + for (uint msgCtr = 0; msgCtr < _randomMessages.size(); msgCtr++) { + // Find currently active random messages + if (_randomMessages[msgCtr]._handle < 0) { + // Check whether there's any existing 'scrolling in' message + bool bad = false; + for (uint scanCtr = 0; scanCtr < _randomMessages.size(); ++scanCtr) { + if (_randomMessages[scanCtr]._handle >= 0) { + if (_entries[_randomMessages[scanCtr]._handle]._flags & KMSG_SCROLL) { + bad = true; + break; + } + } + } + + // Do a random check for a new message to appear + if (_vm->getRandomNumber(major) <= minor && !bad) { + int quoteId; + + // Pick a random quote to display from the available list + do { + int quoteIdx = _vm->getRandomNumber(_randomQuotes.size() - 1); + quoteId = _randomQuotes[quoteIdx]; + + // Ensure the quote isn't already in use + bad = false; + for (uint scanCtr = 0; scanCtr < _randomMessages.size(); ++scanCtr) { + if (quoteId == _randomMessages[scanCtr]._quoteId) { + bad = true; + break; + } + } + } while (bad); + + // Store the quote Id to be used + _randomMessages[msgCtr]._quoteId = quoteId; + + // Position the message at a random position + Common::Point textPos; + textPos.x = _vm->getRandomNumber(_randomMessages._bounds.left, + _randomMessages._bounds.right); + + // Figure out Y position, making sure not to be overlapping with + // any other on-screen message + int abortCounter = 0; + + do { + // Ensure we don't get stuck in an infinite loop if too many messages + // are alrady on-screen + if (abortCounter++ > 100) goto done; + bad = false; + + // Set potential new Y position + textPos.y = _vm->getRandomNumber(_randomMessages._bounds.top, + _randomMessages._bounds.bottom); + + // Ensure it doesn't overlap an existing on-screen message + for (uint msgCtr2 = 0; msgCtr2 < _randomMessages.size(); ++msgCtr2) { + if (_randomMessages[msgCtr2]._handle >= 0) { + int lastY = _entries[_randomMessages[msgCtr2]._handle]._position.y; + + if ((textPos.y >= (lastY - _randomMessages._randomSpacing)) && + (textPos.y <= (lastY + _randomMessages._randomSpacing))) { + bad = true; + } + } + } + } while (bad); + + // Add the message + _randomMessages[msgCtr]._handle = add(textPos, _randomMessages._color, 0, + RANDOM_MESSAGE_TRIGGER + msgCtr, _randomMessages._duration, + _vm->_game->getQuote(_randomMessages[msgCtr]._quoteId)); + + if (_randomMessages._scrollRate > 0) { + if (_randomMessages[msgCtr]._handle >= 0) { + setQuoted(_randomMessages[msgCtr]._handle, + _randomMessages._scrollRate, true); + } + } + + generatedMessage = true; + break; + } + } + } + +done: + return generatedMessage; } void KernelMessages::initRandomMessages(int maxSimultaneousMessages, -- cgit v1.2.3 From 3244db7ff45bcee9190abe9e209a66eb2464b653 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 17 May 2014 12:30:17 -0400 Subject: MADS: Added initialisation method for random messages display --- engines/mads/messages.cpp | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) (limited to 'engines/mads/messages.cpp') diff --git a/engines/mads/messages.cpp b/engines/mads/messages.cpp index 23fdbb2785..4fd02cc814 100644 --- a/engines/mads/messages.cpp +++ b/engines/mads/messages.cpp @@ -434,7 +434,29 @@ done: void KernelMessages::initRandomMessages(int maxSimultaneousMessages, const Common::Rect &bounds, int minYSpacing, int scrollRate, int color, int duration, int quoteId, ...) { - // TODO + // Reset the random messages list + _randomMessages.clear(); + _randomMessages.resize(maxSimultaneousMessages); + + // Store passed parameters + _randomMessages._bounds = bounds; + _randomMessages._randomSpacing = minYSpacing; + _randomMessages._scrollRate = scrollRate; + _randomMessages._color = color; + _randomMessages._duration = duration; + + // Store the variable length random quote list + va_list va; + va_start(va, quoteId); + _randomQuotes.clear(); + + while (quoteId > 0) { + _randomQuotes.push_back(quoteId); + assert(_randomQuotes.size() < 100); + quoteId = va_arg(va, int); + } + + va_end(va); } -- cgit v1.2.3 From 87f7c0cda3a7d3ce46d8ad0cb39ce33a0f40d557 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 24 May 2014 18:56:44 -0400 Subject: MADS: Generalize sequence record _msgPos as _position --- engines/mads/messages.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'engines/mads/messages.cpp') diff --git a/engines/mads/messages.cpp b/engines/mads/messages.cpp index 4fd02cc814..263d8fa661 100644 --- a/engines/mads/messages.cpp +++ b/engines/mads/messages.cpp @@ -210,8 +210,8 @@ void KernelMessages::processText(int msgIndex) { x1 = frame->getBounds().left; y1 = frame->getBounds().top; } else { - x1 = seqEntry._msgPos.x; - y1 = seqEntry._msgPos.y; + x1 = seqEntry._position.x; + y1 = seqEntry._position.y; } } -- cgit v1.2.3 From f0cdc47226db90ce99f2e83f0a2643e49d71d3ed Mon Sep 17 00:00:00 2001 From: Strangerke Date: Mon, 26 May 2014 21:46:37 +0200 Subject: MADS: Fix issue in KernelMessages::processText() --- engines/mads/messages.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'engines/mads/messages.cpp') diff --git a/engines/mads/messages.cpp b/engines/mads/messages.cpp index 263d8fa661..e85a582cda 100644 --- a/engines/mads/messages.cpp +++ b/engines/mads/messages.cpp @@ -173,7 +173,7 @@ void KernelMessages::processText(int msgIndex) { if ((msg._flags & KMSG_EXPIRE) != 0) { scene._textDisplay.expire(msg._textDisplayIndex); - msg._flags &= !KMSG_ACTIVE; + msg._flags &= ~KMSG_ACTIVE; return; } -- cgit v1.2.3 From 9866aba2e43da914a17d17b695456ca25a875469 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 27 May 2014 00:58:25 +0200 Subject: MADS: Slight formatting fixes. --- engines/mads/messages.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'engines/mads/messages.cpp') diff --git a/engines/mads/messages.cpp b/engines/mads/messages.cpp index e85a582cda..f5d1047a86 100644 --- a/engines/mads/messages.cpp +++ b/engines/mads/messages.cpp @@ -42,7 +42,8 @@ void RandomMessages::reset() { } -KernelMessages::KernelMessages(MADSEngine *vm): _vm(vm) { +KernelMessages::KernelMessages(MADSEngine *vm) + : _vm(vm) { for (int i = 0; i < KERNEL_MESSAGES_SIZE; ++i) { KernelMessage rec; _entries.push_back(rec); -- cgit v1.2.3 From 91728aae9bc0f3fc1308c8d5bbe06afe4a3afc3d Mon Sep 17 00:00:00 2001 From: Strangerke Date: Tue, 27 May 2014 21:50:02 +0200 Subject: MADS: Initialize several other variables --- engines/mads/messages.cpp | 3 +++ 1 file changed, 3 insertions(+) (limited to 'engines/mads/messages.cpp') diff --git a/engines/mads/messages.cpp b/engines/mads/messages.cpp index f5d1047a86..ae56f871f4 100644 --- a/engines/mads/messages.cpp +++ b/engines/mads/messages.cpp @@ -32,6 +32,9 @@ namespace MADS { RandomMessages::RandomMessages() { reserve(RANDOM_MESSAGE_SIZE); _randomSpacing = 0; + _color = -1; + _duration = 0; + _scrollRate = -1; } void RandomMessages::reset() { -- cgit v1.2.3 From 2168d43d5d8c66cc4316e2bd0450ef108b27fda5 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Wed, 28 May 2014 23:25:49 +0200 Subject: MADS: Janitorial - Trim more trailing whitespace --- engines/mads/messages.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'engines/mads/messages.cpp') diff --git a/engines/mads/messages.cpp b/engines/mads/messages.cpp index ae56f871f4..0d747279bf 100644 --- a/engines/mads/messages.cpp +++ b/engines/mads/messages.cpp @@ -337,7 +337,7 @@ int KernelMessages::checkRandom() { if (_randomMessages[i]._handle >= 0) ++total; } - + return total; } -- cgit v1.2.3 From ddf38aa288db1538b8ff126190029ce6e0fffc94 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 29 May 2014 22:14:02 -0400 Subject: MADS: Fix resetting KernelMessages _talkFont after teleporter scene --- engines/mads/messages.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'engines/mads/messages.cpp') diff --git a/engines/mads/messages.cpp b/engines/mads/messages.cpp index 0d747279bf..9b2d6f3114 100644 --- a/engines/mads/messages.cpp +++ b/engines/mads/messages.cpp @@ -64,6 +64,7 @@ void KernelMessages::clear() { for (uint i = 0; i < _entries.size(); ++i) _entries[i]._flags = 0; + _talkFont = _vm->_font->getFont(FONT_CONVERSATION); scene._textSpacing = -1; } @@ -154,7 +155,6 @@ void KernelMessages::reset() { for (uint i = 0; i < _entries.size(); ++i) remove(i); - _talkFont = _vm->_font->getFont(FONT_CONVERSATION); _randomMessages.clear(); } -- cgit v1.2.3