aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/mads/messages.cpp45
-rw-r--r--engines/mads/messages.h30
-rw-r--r--engines/mads/nebular/nebular_scenes2.cpp32
-rw-r--r--engines/mads/nebular/nebular_scenes3.cpp13
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;
}
}