aboutsummaryrefslogtreecommitdiff
path: root/engines/mohawk/livingbooks_code.h
diff options
context:
space:
mode:
Diffstat (limited to 'engines/mohawk/livingbooks_code.h')
-rw-r--r--engines/mohawk/livingbooks_code.h169
1 files changed, 147 insertions, 22 deletions
diff --git a/engines/mohawk/livingbooks_code.h b/engines/mohawk/livingbooks_code.h
index 7960e79035..71174cc09e 100644
--- a/engines/mohawk/livingbooks_code.h
+++ b/engines/mohawk/livingbooks_code.h
@@ -26,6 +26,8 @@
#ifndef MOHAWK_LIVINGBOOKS_CODE_H
#define MOHAWK_LIVINGBOOKS_CODE_H
+#include "common/rect.h"
+#include "common/stack.h"
#include "common/substream.h"
namespace Mohawk {
@@ -35,18 +37,70 @@ class LBItem;
enum LBValueType {
kLBValueString,
- kLBValueInteger
+ kLBValueInteger,
+ kLBValueReal,
+ kLBValuePoint,
+ kLBValueRect,
+ kLBValueItemPtr
};
struct LBValue {
- LBValue() { type = kLBValueInteger; integer = 0; }
+ LBValue() {
+ type = kLBValueInteger;
+ integer = 0;
+ }
+ LBValue(int val) {
+ type = kLBValueInteger;
+ integer = val;
+ }
+ LBValue(const Common::String &str) {
+ type = kLBValueString;
+ string = str;
+ }
+ LBValue(LBItem *itm) {
+ type = kLBValueItemPtr;
+ item = itm;
+ }
+ LBValue(const LBValue &val) {
+ type = val.type;
+ switch (type) {
+ case kLBValueString:
+ string = val.string;
+ break;
+ case kLBValueInteger:
+ integer = val.integer;
+ break;
+ case kLBValueReal:
+ real = val.real;
+ break;
+ case kLBValuePoint:
+ point = val.point;
+ break;
+ case kLBValueRect:
+ rect = val.rect;
+ break;
+ case kLBValueItemPtr:
+ item = val.item;
+ break;
+ }
+ }
LBValueType type;
Common::String string;
int integer;
+ double real;
+ Common::Point point;
+ Common::Rect rect;
+ LBItem *item;
bool operator==(const LBValue &x) const;
bool operator!=(const LBValue &x) const;
+
+ bool isNumeric() const;
+ bool isZero() const;
+
+ int toInt() const;
+ double toDouble() const;
};
enum {
@@ -54,18 +108,63 @@ enum {
};
enum {
- kLBCodeTokenString = 0x1,
- kLBCodeTokenLiteral = 0x5,
- kLBCodeTokenChar = 0x6,
- kLBCodeTokenEndOfStatement = 0x7,
- kLBCodeTokenEndOfFile = 0x8,
- kLBCodeTokenOpenBracket = 0xf,
- kLBCodeTokenCloseBracket = 0x10,
- kLBCodeTokenLong = 0x11,
-
- kLBCodeTokenEquals = 0x22, // TODO: maybe..
- kLBCodeTokenQuote = 0x27, // "'"
- kLBCodeTokenComma = 0x2c // ","
+ kTokenIdentifier = 0x1,
+ kTokenLiteral = 0x5,
+ kTokenString = 0x6,
+ kTokenEndOfStatement = 0x7,
+ kTokenEndOfFile = 0x8,
+ kTokenConcat = 0xb,
+ kTokenSingleQuote = 0xc, // ??
+ kTokenDoubleQuote = 0xd, // ??
+ kTokenMultiply = 0xe,
+ kTokenOpenBracket = 0xf,
+ kTokenCloseBracket = 0x10,
+ kTokenMinus = 0x11,
+ kTokenMinusMinus = 0x12,
+ kTokenPlusEquals = 0x13,
+ kTokenPlus = 0x14,
+ kTokenPlusPlus = 0x15,
+ kTokenEquals = 0x16,
+ kTokenMinusEquals = 0x17,
+ kTokenMultiplyEquals = 0x18,
+ kTokenDivideEquals = 0x19,
+ kTokenListStart = 0x1a,
+ kTokenListEnd = 0x1b,
+ kTokenColon = 0x1c, // ??
+ kTokenLessThan = 0x1d,
+ kTokenGreaterThan = 0x1e,
+ kTokenAndEquals = 0x1f,
+ kTokenDotOperator = 0x20,
+ kTokenDivide = 0x21,
+ kTokenAssign = 0x22,
+ kTokenLessThanEq = 0x23,
+ kTokenGreaterThanEq = 0x24,
+ kTokenNotEq = 0x25,
+ kTokenQuote = 0x27, // ??
+ kTokenAnd = 0x2a,
+ kTokenComma = 0x2c,
+ kTokenConstMode = 0x31,
+ kTokenIntDivide = 0x32,
+ kTokenModulo = 0x34,
+ kTokenNot = 0x35,
+ kTokenOr = 0x37,
+ kTokenTrue = 0x39,
+ kTokenFalse = 0x3a,
+ kTokenConstDataType = 0x3b, // ??
+ kTokenConstItemType = 0x3c, // ??
+ kTokenConstEventId = 0x42,
+ kTokenConstScriptOpcode = 0x43, // ??
+ kTokenConstScriptParam = 0x44, // ??
+ kTokenGeneralCommand = 0x4d,
+ kTokenItemCommand = 0x4e,
+ kTokenNotifyCommand = 0x4f,
+ // 0x5e?!
+ kTokenKeycode = 0x5f,
+
+ // v5 only:
+ kTokenLocal = 0x61,
+ kTokenPropListCommand = 0x70,
+ kTokenRectCommand = 0x71
};
class LBCode {
@@ -73,20 +172,46 @@ public:
LBCode(MohawkEngine_LivingBooks *vm);
~LBCode();
- void runCode(LBItem *src, uint32 offset);
+ LBValue runCode(LBItem *src, uint32 offset);
protected:
MohawkEngine_LivingBooks *_vm;
- uint32 size;
- byte *data;
+ uint32 _size;
+ byte *_data;
+ Common::HashMap<uint16, Common::String> _strings;
+
+ uint32 _currOffset;
+ LBItem *_currSource;
+
+ Common::Stack<LBValue> _stack;
+ byte _currToken;
+ LBValue _currValue;
- Common::HashMap<uint16, Common::String> strings;
+ void nextToken();
- Common::Array<LBValue> readParams(LBItem *src, uint32 &offset);
- void runCodeCommand(LBItem *src, uint32 &offset);
- void runCodeItemCommand(LBItem *src, uint32 &offset);
- void runCodeNotifyCommand(LBItem *src, uint32 &offset);
+ LBValue runCode(byte terminator);
+ void parseStatement();
+ void parseComparisons();
+ void parseConcat();
+ void parseArithmetic1();
+ void parseArithmetic2();
+ void parseMain();
+
+ Common::Array<LBValue> readParams();
+ void runGeneralCommand();
+ void runItemCommand();
+ void runNotifyCommand();
+
+public:
+ void cmdUnimplemented(const Common::Array<LBValue> &params);
+ void cmdSetPlayParams(const Common::Array<LBValue> &params);
+ void cmdSetKeyEvent(const Common::Array<LBValue> &params);
+ void cmdSetHitTest(const Common::Array<LBValue> &params);
+ void cmdKey(const Common::Array<LBValue> &params);
+
+ void itemSetParent(const Common::Array<LBValue> &params);
+ void itemIsPlaying(const Common::Array<LBValue> &params);
};
} // End of namespace Mohawk