diff options
Diffstat (limited to 'engines/draci/script.h')
-rw-r--r-- | engines/draci/script.h | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/engines/draci/script.h b/engines/draci/script.h new file mode 100644 index 0000000000..86abb5ee9b --- /dev/null +++ b/engines/draci/script.h @@ -0,0 +1,176 @@ +/* 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 2 + * 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#ifndef DRACI_SCRIPT_H +#define DRACI_SCRIPT_H + +#include "common/str.h" +#include "common/stream.h" +#include "common/queue.h" + +namespace Draci { + +/** The maximum number of parameters for a GPL command */ +const int kMaxParams = 3; + +class DraciEngine; +class Script; + +enum { + kNumCommands = 55 +}; + +typedef void (Script::* GPLHandler)(Common::Queue<int> &); +typedef int (Script::* GPLOperatorHandler)(int, int); +typedef int (Script::* GPLFunctionHandler)(int); + +/** + * Represents a single command in the GPL scripting language bytecode. + * Each command is represented in the bytecode by a command number and a + * subnumber. + */ + +struct GPL2Command { + byte _number; + byte _subNumber; + Common::String _name; + uint16 _numParams; + int _paramTypes[kMaxParams]; + GPLHandler _handler; +}; + +struct GPL2Operator { + Common::String _name; + GPLOperatorHandler _handler; +}; + +struct GPL2Function { + Common::String _name; + GPLFunctionHandler _handler; +}; + +/** + * A convenience data type that holds both the actual bytecode and the + * length of the bytecode. Passed to Script::run(). + */ + +struct GPL2Program { + GPL2Program() : _bytecode(NULL), _length(0) {} + + byte *_bytecode; + uint16 _length; +}; + +class Script { + +public: + Script(DraciEngine *vm) : _vm(vm), _jump(0) { setupCommandList(); }; + + int run(GPL2Program program, uint16 offset); + bool testExpression(GPL2Program, uint16 offset); + void endCurrentProgram(); + +private: + + int _jump; + bool _endProgram; + + /** List of all GPL commands. Initialised in the constructor. */ + const GPL2Command *_commandList; + const GPL2Operator *_operatorList; + const GPL2Function *_functionList; + + void c_If(Common::Queue<int> ¶ms); + void c_Goto(Common::Queue<int> ¶ms); + void c_Let(Common::Queue<int> ¶ms); + void load(Common::Queue<int> ¶ms); + void start(Common::Queue<int> ¶ms); + void mark(Common::Queue<int> ¶ms); + void release(Common::Queue<int> ¶ms); + void icoStat(Common::Queue<int> ¶ms); + void objStat(Common::Queue<int> ¶ms); + void objStatOn(Common::Queue<int> ¶ms); + void execInit(Common::Queue<int> ¶ms); + void execLook(Common::Queue<int> ¶ms); + void execUse(Common::Queue<int> ¶ms); + void walkOn(Common::Queue<int> ¶ms); + void walkOnPlay(Common::Queue<int> ¶ms); + void play(Common::Queue<int> ¶ms); + void startPlay(Common::Queue<int> ¶ms); + void newRoom(Common::Queue<int> ¶ms); + void talk(Common::Queue<int> ¶ms); + void loadMap(Common::Queue<int> ¶ms); + void roomMap(Common::Queue<int> ¶ms); + void dialogue(Common::Queue<int> ¶ms); + void exitDialogue(Common::Queue<int> ¶ms); + void resetDialogue(Common::Queue<int> ¶ms); + void resetDialogueFrom(Common::Queue<int> ¶ms); + void resetBlock(Common::Queue<int> ¶ms); + void setPalette(Common::Queue<int> ¶ms); + void blackPalette(Common::Queue<int> ¶ms); + void loadPalette(Common::Queue<int> ¶ms); + + int operAnd(int op1, int op2); + int operOr(int op1, int op2); + int operXor(int op1, int op2); + int operSub(int op1, int op2); + int operAdd(int op1, int op2); + int operDiv(int op1, int op2); + int operMul(int op1, int op2); + int operEqual(int op1, int op2); + int operNotEqual(int op1, int op2); + int operGreater(int op1, int op2); + int operLess(int op1, int op2); + int operGreaterOrEqual(int op1, int op2); + int operLessOrEqual(int op1, int op2); + int operMod(int op1, int op2); + + int funcRandom(int n); + int funcNot(int n); + int funcIsIcoOn(int iconID); + int funcIcoStat(int iconID); + int funcActIco(int iconID); + int funcIsIcoAct(int iconID); + int funcIsObjOn(int objID); + int funcIsObjOff(int objID); + int funcIsObjAway(int objID); + int funcActPhase(int objID); + int funcObjStat(int objID); + int funcLastBlock(int blockID); + int funcAtBegin(int yesno); + int funcBlockVar(int blockID); + int funcHasBeen(int blockID); + int funcMaxLine(int lines); + + void setupCommandList(); + const GPL2Command *findCommand(byte num, byte subnum); + int handleMathExpression(Common::MemoryReadStream &reader); + + DraciEngine *_vm; +}; + +} + +#endif // DRACI_SCRIPT_H |