diff options
-rw-r--r-- | engines/mads/messages.cpp | 45 | ||||
-rw-r--r-- | engines/mads/messages.h | 30 | ||||
-rw-r--r-- | engines/mads/nebular/nebular_scenes2.cpp | 32 | ||||
-rw-r--r-- | engines/mads/nebular/nebular_scenes3.cpp | 13 |
4 files changed, 106 insertions, 14 deletions
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() { diff --git a/engines/mads/messages.h b/engines/mads/messages.h index 8aa8cd54da..7211598dff 100644 --- a/engines/mads/messages.h +++ b/engines/mads/messages.h @@ -34,6 +34,7 @@ namespace MADS { #define KERNEL_MESSAGES_SIZE 10 #define INDEFINITE_TIMEOUT 9999999 #define TEXT_DISPLAY_SIZE 40 +#define RANDOM_MESSAGE_SIZE 4 enum KernelMessageFlags { KMSG_QUOTED = 1, KMSG_PLAYER_TIMEOUT = 2, KMSG_SEQ_ENTRY = 4, KMSG_SCROLL = 8, @@ -67,9 +68,19 @@ public: class KernelMessages { private: MADSEngine *_vm; + + struct RandomEntry { + int _handle; + int _quote; + }; + RandomEntry _randomMessages[RANDOM_MESSAGE_SIZE]; + int _randomMaxMessages; + + void resetRandomMessages(); public: Common::Array<KernelMessage> _entries; Font *_talkFont; +public: KernelMessages(MADSEngine *vm); ~KernelMessages(); @@ -85,6 +96,25 @@ public: void processText(int msgIndex); void delay(uint32 priorFrameTime, uint32 currentTime); void setQuoted(int msgIndex, int numTicks, bool quoted); + + void initRandomMessages(int maxSimultaneousMessages, + const Common::Rect &bounds, int minYSpacing, int scrollRate, + int color, int duration, int quoteId, ...); + + /** + * Handles expiring any active random messages as necessary + */ + void randomServer(); + + /** + * Return the number of currently active random messages + */ + int checkRandom(); + + /** + * Handles generating new random messages + */ + bool generateRandom(int major, int minor); }; class TextDisplay { diff --git a/engines/mads/nebular/nebular_scenes2.cpp b/engines/mads/nebular/nebular_scenes2.cpp index a86b78f90a..1f5200ab92 100644 --- a/engines/mads/nebular/nebular_scenes2.cpp +++ b/engines/mads/nebular/nebular_scenes2.cpp @@ -1174,7 +1174,9 @@ void Scene205::enter() { _chickenTime = _vm->_game->_scene._frameStartTime; if (_globals[kSexOfRex] == SEX_FEMALE) - warning("sub71704(0x3, 0xC3, 0x108, 0x63, 0x86, 0xD, 2, 0xFDFC, 0x3C, 0x6C, 0x6C, 0x6D, 0x6D, 0x6E, 0x6E, 0x6F, 0x6C, 0);"); + _scene->_kernelMessages.initRandomMessages(3, + Common::Rect(195, 99, 264, 134), 13, 2, 0xFDFC, 60, + 108, 108, 109, 109, 110, 110, 111, 108, 0); if (_scene->_priorSceneId != -2) _game._player._playerPos = Common::Point(99, 152); @@ -1196,13 +1198,18 @@ void Scene205::enter() { } void Scene205::step() { + int chanceMajor, chanceMinor; + if (_globals[kSexOfRex] == SEX_FEMALE) { - warning("TODO: sub7178C()"); + _scene->_kernelMessages.randomServer(); if (_vm->_game->_scene._frameStartTime >= _chickenTime) { - warning("TODO: if (sub717B2(100, 1 + sub7176C())) {"); - _vm->_sound->command(28); - // } + chanceMajor = 100; + chanceMinor = _scene->_kernelMessages.checkRandom() + 1; + + if (_scene->_kernelMessages.generateRandom(chanceMajor, chanceMinor)) + _vm->_sound->command(28); + _chickenTime = _vm->_game->_scene._frameStartTime + 2; } } @@ -4553,7 +4560,9 @@ void Scene211::enter() { _game.loadQuoteSet(0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 1, 0); if (_globals[kMonkeyStatus] == MONKEY_AMBUSH_READY) - warning("sub71704(0x2, 0x0, 0x36, 0x0, 0x1E, 0xD, 2, 0xFDFC, 0x3C, 0x97, 0x98, 0x99, 0x9A, 0);"); + _scene->_kernelMessages.initRandomMessages(2, + Common::Rect(0, 0, 54, 30), 13, 2, 0xFDFC, 60, + 151, 152, 153, 154, 0); _monkeyTime = _vm->_game->_scene._frameStartTime; _scrollY = 30; @@ -4565,13 +4574,18 @@ void Scene211::enter() { } void Scene211::step() { + int chanceMajor, chanceMinor; + if (_globals[kMonkeyStatus] == MONKEY_AMBUSH_READY) { - warning("TODO: sub7178C()"); + _scene->_kernelMessages.randomServer(); if (!_ambushFl && !_wakeFl && (_vm->_game->_scene._frameStartTime >= _monkeyTime)) { - warning("if (sub717B2(80, 1 + sub7176C())) {"); + chanceMajor = 80; + chanceMinor = _scene->_kernelMessages.checkRandom() * 4 + 1; + + if (_scene->_kernelMessages.generateRandom(chanceMajor, chanceMinor)) _vm->_sound->command(18); - // } + _monkeyTime = _vm->_game->_scene._frameStartTime + 2; } diff --git a/engines/mads/nebular/nebular_scenes3.cpp b/engines/mads/nebular/nebular_scenes3.cpp index aca9b8b18e..4652c51d13 100644 --- a/engines/mads/nebular/nebular_scenes3.cpp +++ b/engines/mads/nebular/nebular_scenes3.cpp @@ -5536,7 +5536,9 @@ void Scene389::enter() { else { _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('m', -1)); _globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 6, 0, 0, 0); - warning("TODO: sub71704(1, 88, 177, 19, 17, 0xD, 2, 0xFDFC, 0x3C, 0xF7, 0xF8, 0xF9, 0);"); + _scene->_kernelMessages.initRandomMessages(1, + Common::Rect(88, 19, 177, 77), 13, 2, 0xFDFC, 60, + 247, 248, 249, 0); } _vm->_palette->setEntry(252, 63, 37, 26); @@ -5548,10 +5550,13 @@ void Scene389::enter() { } void Scene389::step() { - warning("TODO: sub7178C()"); - + int chanceMajor, chanceMinor; + + _scene->_kernelMessages.randomServer(); if (_scene->_frameStartTime >= _monsterTime) { - warning("sub717B2(20, (sub7176C() << 2) + 1);"); + chanceMajor = 20; + chanceMinor = _scene->_kernelMessages.checkRandom() * 4 + 1; + _scene->_kernelMessages.generateRandom(chanceMajor, chanceMinor); _monsterTime = _scene->_frameStartTime + 2; } } |