aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/mohawk/livingbooks.cpp30
-rw-r--r--engines/mohawk/livingbooks.h3
2 files changed, 23 insertions, 10 deletions
diff --git a/engines/mohawk/livingbooks.cpp b/engines/mohawk/livingbooks.cpp
index c9397a7612..2aceb4c2c5 100644
--- a/engines/mohawk/livingbooks.cpp
+++ b/engines/mohawk/livingbooks.cpp
@@ -1661,6 +1661,10 @@ void LBItem::readData(uint16 type, uint16 size, Common::SeekableSubReadStreamEnd
entry->type, entry->event, entry->opcode, entry->param);
size -= 6;
+ // TODO: read as bytes, if this is correct (but beware endianism)
+ byte expectedConditions = (entry->event & 0xff00) >> 8;
+ entry->event = entry->event & 0xff;
+
if (type == kLBMsgListScript) {
if (size < 2)
error("Script entry of type 0x%04x was too small (%d)", type, size);
@@ -1694,26 +1698,33 @@ void LBItem::readData(uint16 type, uint16 size, Common::SeekableSubReadStreamEnd
entry->newUnknown, entry->newMode, entry->newPage, entry->newSubpage);
size -= 8;
}
- // FIXME: what is 0x1d?
- if (entry->event == kLBEventNotified || entry->opcode == 0x1d) {
+ if (entry->event == kLBEventNotified) {
if (size < 4)
- error("not enough bytes (%d) in event %d, opcode 0x%04x", size, entry->event, entry->opcode);
+ error("not enough bytes (%d) in kLBEventNotified, opcode 0x%04x", size, entry->opcode);
entry->matchFrom = stream->readUint16();
entry->matchNotify = stream->readUint16();
debug(4, "kLBEventNotified: unknowns %04x, %04x",
entry->matchFrom, entry->matchNotify);
size -= 4;
}
+ if (entry->opcode == kLBOpSendExpression) {
+ if (size < 4)
+ error("not enough bytes (%d) in kLBOpSendExpression, event 0x%04x", size, entry->event);
+ entry->offset = stream->readUint32();
+ debug(4, "kLBOpSendExpression: offset %08x", entry->offset);
+ size -= 4;
+ }
if (entry->opcode == 0xffff) {
if (size < 4)
- error("didn't get enough bytes (%d) to read command in script entry", size);
+ error("didn't get enough bytes (%d) to read message in script entry", size);
size -= 4;
uint16 msgId = stream->readUint16();
+ uint16 msgLen = stream->readUint16();
if (msgId != kLBCommand)
error("expected a command in script entry, got 0x%04x", msgId);
- uint16 msgLen = stream->readUint16();
- if (msgLen != size)
+
+ if (msgLen != size && expectedConditions == 0)
error("script entry msgLen %d is not equal to size %d", msgLen, size);
Common::String command = readString(stream);
@@ -1725,7 +1736,9 @@ void LBItem::readData(uint16 type, uint16 size, Common::SeekableSubReadStreamEnd
entry->command = command;
debug(4, "script entry command '%s'", command.c_str());
- } else if (size) {
+ }
+
+ if (size) {
byte commandLen = stream->readByte();
if (commandLen)
error("got confused while reading bytes at end of script entry (got %d)", commandLen);
@@ -1742,9 +1755,6 @@ void LBItem::readData(uint16 type, uint16 size, Common::SeekableSubReadStreamEnd
debug(4, "script entry condition '%s'", condition.c_str());
}
- // TODO: read as bytes, if this is correct (but beware endianism)
- byte expectedConditions = (entry->event & 0xff00) >> 8;
- entry->event = entry->event & 0xff;
if (entry->conditions.size() != expectedConditions)
error("got %d conditions, but expected %d", entry->conditions.size(), expectedConditions);
diff --git a/engines/mohawk/livingbooks.h b/engines/mohawk/livingbooks.h
index b1879824ad..483f2dac7d 100644
--- a/engines/mohawk/livingbooks.h
+++ b/engines/mohawk/livingbooks.h
@@ -222,6 +222,9 @@ struct LBScriptEntry {
uint16 matchFrom;
uint16 matchNotify;
+ // kLBOpSendExpression
+ uint32 offset;
+
Common::String command;
Common::Array<Common::String> conditions;
};