diff options
author | Paul Gilbert | 2014-05-17 12:04:39 -0400 |
---|---|---|
committer | Paul Gilbert | 2014-05-17 12:04:39 -0400 |
commit | 11f784713e302c38aab0dbdc779632136096bb2a (patch) | |
tree | 6857958dce96f357326b0195e78fcce4454bb3ff /engines/mads | |
parent | 15dfef0796b8cc1288370758d593d443f8e7270c (diff) | |
download | scummvm-rg350-11f784713e302c38aab0dbdc779632136096bb2a.tar.gz scummvm-rg350-11f784713e302c38aab0dbdc779632136096bb2a.tar.bz2 scummvm-rg350-11f784713e302c38aab0dbdc779632136096bb2a.zip |
MADS: Completed random message generation method
Diffstat (limited to 'engines/mads')
-rw-r--r-- | engines/mads/messages.cpp | 124 | ||||
-rw-r--r-- | engines/mads/messages.h | 30 |
2 files changed, 130 insertions, 24 deletions
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, diff --git a/engines/mads/messages.h b/engines/mads/messages.h index 7211598dff..241f493434 100644 --- a/engines/mads/messages.h +++ b/engines/mads/messages.h @@ -65,18 +65,32 @@ public: KernelMessage(); }; +struct RandomEntry { + int _handle; + int _quoteId; + + RandomEntry() { _handle = _quoteId = -1; } +}; + +class RandomMessages: public Common::Array<RandomEntry> { +public: + Common::Rect _bounds; + int _randomSpacing; + int _color; + int _duration; + int _scrollRate; +public: + RandomMessages(); + + void reset(); +}; + class KernelMessages { private: MADSEngine *_vm; - struct RandomEntry { - int _handle; - int _quote; - }; - RandomEntry _randomMessages[RANDOM_MESSAGE_SIZE]; - int _randomMaxMessages; - - void resetRandomMessages(); + Common::Array<int> _randomQuotes; + RandomMessages _randomMessages; public: Common::Array<KernelMessage> _entries; Font *_talkFont; |