Initial commit
This commit is contained in:
309
engines/mohawk/livingbooks_code.h
Normal file
309
engines/mohawk/livingbooks_code.h
Normal file
@@ -0,0 +1,309 @@
|
||||
/* ScummVM - Graphic Adventure Engine
|
||||
*
|
||||
* ScummVM is the legal property of its developers, whose names
|
||||
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||
* file distributed with this source distribution.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef MOHAWK_LIVINGBOOKS_CODE_H
|
||||
#define MOHAWK_LIVINGBOOKS_CODE_H
|
||||
|
||||
#include "common/ptr.h"
|
||||
#include "common/rect.h"
|
||||
#include "common/stack.h"
|
||||
#include "common/substream.h"
|
||||
|
||||
namespace Mohawk {
|
||||
|
||||
class MohawkEngine_LivingBooks;
|
||||
class LBItem;
|
||||
class LBXObject;
|
||||
struct LBList;
|
||||
|
||||
enum LBValueType {
|
||||
kLBValueString,
|
||||
kLBValueInteger,
|
||||
kLBValueReal,
|
||||
kLBValuePoint,
|
||||
kLBValueRect,
|
||||
kLBValueItemPtr,
|
||||
kLBValueLBX,
|
||||
kLBValueList
|
||||
};
|
||||
|
||||
struct LBValue {
|
||||
LBValue() {
|
||||
type = kLBValueInteger;
|
||||
integer = 0;
|
||||
}
|
||||
LBValue(int val) {
|
||||
type = kLBValueInteger;
|
||||
integer = val;
|
||||
}
|
||||
LBValue(const Common::String &str) {
|
||||
type = kLBValueString;
|
||||
string = str;
|
||||
}
|
||||
LBValue(const Common::Point &p) {
|
||||
type = kLBValuePoint;
|
||||
point = p;
|
||||
}
|
||||
LBValue(const Common::Rect &r) {
|
||||
type = kLBValueRect;
|
||||
rect = r;
|
||||
}
|
||||
LBValue(LBItem *itm) {
|
||||
type = kLBValueItemPtr;
|
||||
item = itm;
|
||||
}
|
||||
LBValue(Common::SharedPtr<LBXObject> l) {
|
||||
type = kLBValueLBX;
|
||||
lbx = l;
|
||||
}
|
||||
LBValue(Common::SharedPtr<LBList> l) {
|
||||
type = kLBValueList;
|
||||
list = l;
|
||||
}
|
||||
LBValue(const LBValue &val) {
|
||||
copy(val);
|
||||
}
|
||||
|
||||
void copy(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;
|
||||
case kLBValueLBX:
|
||||
lbx = val.lbx;
|
||||
break;
|
||||
case kLBValueList:
|
||||
list = val.list;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
LBValue &operator=(const LBValue &other);
|
||||
|
||||
LBValueType type;
|
||||
Common::String string;
|
||||
int integer;
|
||||
double real;
|
||||
Common::Point point;
|
||||
Common::Rect rect;
|
||||
LBItem *item;
|
||||
Common::SharedPtr<LBXObject> lbx;
|
||||
Common::SharedPtr<LBList> list;
|
||||
|
||||
bool operator==(const LBValue &x) const;
|
||||
bool operator!=(const LBValue &x) const;
|
||||
|
||||
bool isNumeric() const;
|
||||
bool isZero() const;
|
||||
|
||||
Common::String toString() const;
|
||||
int toInt() const;
|
||||
double toDouble() const;
|
||||
Common::Point toPoint() const;
|
||||
Common::Rect toRect() const;
|
||||
};
|
||||
|
||||
struct LBList {
|
||||
Common::Array<LBValue> array;
|
||||
};
|
||||
|
||||
enum {
|
||||
kLBCodeLiteralInteger = 0x1,
|
||||
kLBCodeLiteralIntegerLE = 0x11
|
||||
};
|
||||
|
||||
enum {
|
||||
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, // ??
|
||||
kTokenEval = 0x4b,
|
||||
kTokenGeneralCommand = 0x4d,
|
||||
kTokenItemCommand = 0x4e,
|
||||
kTokenNotifyCommand = 0x4f,
|
||||
// 0x5e?!
|
||||
kTokenKeycode = 0x5f,
|
||||
|
||||
// v5 only:
|
||||
kTokenLocal = 0x61,
|
||||
kTokenPropListCommand = 0x70,
|
||||
kTokenRectCommand = 0x71
|
||||
};
|
||||
|
||||
class LBCode {
|
||||
public:
|
||||
LBCode(MohawkEngine_LivingBooks *vm, uint16 baseId);
|
||||
~LBCode();
|
||||
|
||||
LBValue runCode(LBItem *src, uint32 offset);
|
||||
uint parseCode(const Common::String &source);
|
||||
|
||||
protected:
|
||||
MohawkEngine_LivingBooks *_vm;
|
||||
|
||||
uint32 _size;
|
||||
byte *_data;
|
||||
Common::HashMap<uint16, Common::String> _strings;
|
||||
|
||||
uint32 _currOffset;
|
||||
LBItem *_currSource;
|
||||
|
||||
Common::Stack<LBValue> _stack;
|
||||
byte _currToken;
|
||||
LBValue _currValue;
|
||||
|
||||
void nextToken();
|
||||
|
||||
LBValue runCode(byte terminator);
|
||||
void parseStatement();
|
||||
void parseComparisons();
|
||||
void parseConcat();
|
||||
void parseArithmetic1();
|
||||
void parseArithmetic2();
|
||||
void parseMain();
|
||||
|
||||
LBValue *getIndexedVar(Common::String varname, const Common::Array<LBValue> &index);
|
||||
LBItem *resolveItem(const LBValue &value);
|
||||
Common::Array<LBValue> readParams();
|
||||
Common::Rect getRectFromParams(const Common::Array<LBValue> ¶ms);
|
||||
|
||||
void runGeneralCommand();
|
||||
void runItemCommand();
|
||||
void runNotifyCommand();
|
||||
|
||||
uint nextFreeString();
|
||||
bool parseCodeSymbol(Common::String name, uint &pos, Common::Array<byte> &code, bool useAllAliases);
|
||||
|
||||
public:
|
||||
void cmdUnimplemented(const Common::Array<LBValue> ¶ms);
|
||||
void cmdEval(const Common::Array<LBValue> ¶ms);
|
||||
void cmdRandom(const Common::Array<LBValue> ¶ms);
|
||||
void cmdStringLen(const Common::Array<LBValue> ¶ms);
|
||||
void cmdSubstring(const Common::Array<LBValue> ¶ms);
|
||||
void cmdMax(const Common::Array<LBValue> ¶ms);
|
||||
void cmdMin(const Common::Array<LBValue> ¶ms);
|
||||
void cmdAbs(const Common::Array<LBValue> ¶ms);
|
||||
void cmdGetRect(const Common::Array<LBValue> ¶ms);
|
||||
void cmdMakePoint(const Common::Array<LBValue> ¶ms);
|
||||
void cmdTopLeft(const Common::Array<LBValue> ¶ms);
|
||||
void cmdBottomRight(const Common::Array<LBValue> ¶ms);
|
||||
void cmdMousePos(const Common::Array<LBValue> ¶ms);
|
||||
void cmdTop(const Common::Array<LBValue> ¶ms);
|
||||
void cmdLeft(const Common::Array<LBValue> ¶ms);
|
||||
void cmdBottom(const Common::Array<LBValue> ¶ms);
|
||||
void cmdRight(const Common::Array<LBValue> ¶ms);
|
||||
void cmdXPos(const Common::Array<LBValue> ¶ms);
|
||||
void cmdYPos(const Common::Array<LBValue> ¶ms);
|
||||
void cmdWidth(const Common::Array<LBValue> ¶ms);
|
||||
void cmdHeight(const Common::Array<LBValue> ¶ms);
|
||||
void cmdMove(const Common::Array<LBValue> ¶ms);
|
||||
void cmdSetDragParams(const Common::Array<LBValue> ¶ms);
|
||||
void cmdNewList(const Common::Array<LBValue> ¶ms);
|
||||
void cmdAdd(const Common::Array<LBValue> ¶ms);
|
||||
void cmdAddAt(const Common::Array<LBValue> ¶ms);
|
||||
void cmdSetAt(const Common::Array<LBValue> ¶ms);
|
||||
void cmdListLen(const Common::Array<LBValue> ¶ms);
|
||||
void cmdDeleteAt(const Common::Array<LBValue> ¶ms);
|
||||
void cmdSetProperty(const Common::Array<LBValue> ¶ms);
|
||||
void cmdGetProperty(const Common::Array<LBValue> ¶ms);
|
||||
void cmdDeleteVar(const Common::Array<LBValue> ¶ms);
|
||||
void cmdExec(const Common::Array<LBValue> ¶ms);
|
||||
void cmdReturn(const Common::Array<LBValue> ¶ms);
|
||||
void cmdSetPlayParams(const Common::Array<LBValue> ¶ms);
|
||||
void cmdSetKeyEvent(const Common::Array<LBValue> ¶ms);
|
||||
void cmdSetHitTest(const Common::Array<LBValue> ¶ms);
|
||||
void cmdLBXCreate(const Common::Array<LBValue> ¶ms);
|
||||
void cmdLBXFunc(const Common::Array<LBValue> ¶ms);
|
||||
void cmdKey(const Common::Array<LBValue> ¶ms);
|
||||
|
||||
void itemClone(const Common::Array<LBValue> ¶ms);
|
||||
void itemIsPlaying(const Common::Array<LBValue> ¶ms);
|
||||
void itemIsLoaded(const Common::Array<LBValue> ¶ms);
|
||||
void itemMoveTo(const Common::Array<LBValue> ¶ms);
|
||||
void itemSeek(const Common::Array<LBValue> ¶ms);
|
||||
void itemSeekToFrame(const Common::Array<LBValue> ¶ms);
|
||||
void itemSetParent(const Common::Array<LBValue> ¶ms);
|
||||
};
|
||||
|
||||
} // End of namespace Mohawk
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user