aboutsummaryrefslogtreecommitdiff
path: root/engines/saga/script.h
diff options
context:
space:
mode:
Diffstat (limited to 'engines/saga/script.h')
-rw-r--r--engines/saga/script.h156
1 files changed, 83 insertions, 73 deletions
diff --git a/engines/saga/script.h b/engines/saga/script.h
index 8d9e17af20..9785ef9a77 100644
--- a/engines/saga/script.h
+++ b/engines/saga/script.h
@@ -109,75 +109,6 @@ enum ThreadWaitTypes {
kWaitTypeWakeUp = 11 // IHNM. wait until get waken up
};
-enum OpCodes {
- opNextBlock = 0x01,
- opDup = 0x02,
- opDrop = 0x03,
- opZero = 0x04,
- opOne = 0x05,
- opConstint = 0x06,
-//...
- opStrlit = 0x08,
-//...
- opGetFlag = 0x0B,
- opGetInt = 0x0C,
-//...
- opPutFlag = 0x0F,
- opPutInt = 0x10,
- //...
- opPutFlagV = 0x13,
- opPutIntV = 0x14,
-//...
- opCall = 0x17,
- opCcall = 0x18,
- opCcallV = 0x19,
- opEnter = 0x1A,
- opReturn = 0x1B,
- opReturnV = 0x1C,
- opJmp = 0x1D,
- opJmpTrueV = 0x1E,
- opJmpFalseV = 0x1F,
- opJmpTrue = 0x20,
- opJmpFalse = 0x21,
- opJmpSwitch = 0x22,
-//...
- opJmpRandom = 0x24,
- opNegate = 0x25,
- opNot = 0x26,
- opCompl = 0x27,
- opIncV = 0x28,
- opDecV = 0x29,
- opPostInc = 0x2A,
- opPostDec = 0x2B,
- opAdd = 0x2C,
- opSub = 0x2D,
- opMul = 0x2E,
- opDiv = 0x2F,
- opMod = 0x30,
-//...
- opEq = 0x33,
- opNe = 0x34,
- opGt = 0x35,
- opLt = 0x36,
- opGe = 0x37,
- opLe = 0x38,
-//...
- opRsh = 0x3F,
- opLsh = 0x40,
- opAnd = 0x41,
- opOr = 0x42,
- opXor = 0x43,
- opLAnd = 0x44,
- opLOr = 0x45,
- opLXor = 0x46,
-//...
- opSpeak = 0x53,
- opDialogBegin = 0x54,
- opDialogEnd = 0x55,
- opReply = 0x56,
- opAnimate = 0x57
-};
-
enum CycleFlags {
kCyclePong = 1 << 0,
kCycleOnce = 1 << 1,
@@ -342,7 +273,7 @@ public:
typedef SortedList<ScriptThread> ScriptThreadList;
-
+#define SCRIPTOP_PARAMS ScriptThread *thread, MemoryReadStream *scriptS, bool &stopParsing, bool &breakOut
#define SCRIPTFUNC_PARAMS ScriptThread *thread, int nArgs, bool &disContinue
class Script {
@@ -472,7 +403,7 @@ private:
void loadModuleBase(ModuleData &module, const byte *resourcePointer, size_t resourceLength);
// runThread returns true if we should break running of other threads
- bool runThread(ScriptThread *thread, uint instructionLimit);
+ bool runThread(ScriptThread *thread);
void setThreadEntrypoint(ScriptThread *thread, int entrypointNumber);
public:
@@ -480,6 +411,85 @@ public:
private:
+ // Script opcodes ------------------------------------------------------------
+ typedef void (Script::*ScriptOpType)(SCRIPTOP_PARAMS);
+ struct ScriptOpDescription {
+ ScriptOpType scriptOp;
+ const char *scriptOpName;
+ };
+ const ScriptOpDescription *_scriptOpsList;
+
+ void setupScriptOpcodeList();
+ void opDummy(SCRIPTOP_PARAMS) { warning("Dummy opcode called"); }
+ void opNextBlock(SCRIPTOP_PARAMS) {
+ thread->_instructionOffset = (((thread->_instructionOffset) >> 10) + 1) << 10;
+ }
+ void opDup(SCRIPTOP_PARAMS);
+ void opDrop(SCRIPTOP_PARAMS);
+ void opZero(SCRIPTOP_PARAMS);
+ void opOne(SCRIPTOP_PARAMS);
+ void opConstInt(SCRIPTOP_PARAMS);
+ void opStrLit(SCRIPTOP_PARAMS);
+ void opGetFlag(SCRIPTOP_PARAMS);
+ void opGetByte(SCRIPTOP_PARAMS); // SAGA 2
+ void opGetInt(SCRIPTOP_PARAMS);
+ void opPutFlag(SCRIPTOP_PARAMS);
+ void opPutByte(SCRIPTOP_PARAMS); // SAGA 2
+ void opPutInt(SCRIPTOP_PARAMS);
+ void opPutFlagV(SCRIPTOP_PARAMS);
+ void opPutByteV(SCRIPTOP_PARAMS);
+ void opPutIntV(SCRIPTOP_PARAMS);
+ void opCall(SCRIPTOP_PARAMS); // SAGA 1
+ void opCallNear(SCRIPTOP_PARAMS); // SAGA 2
+ void opCallFar(SCRIPTOP_PARAMS); // SAGA 2
+ void opCcall(SCRIPTOP_PARAMS);
+ void opCcallV(SCRIPTOP_PARAMS);
+ void opCallMember(SCRIPTOP_PARAMS); // SAGA 2
+ void opCallMemberV(SCRIPTOP_PARAMS); // SAGA 2
+ void opEnter(SCRIPTOP_PARAMS);
+ void opReturn(SCRIPTOP_PARAMS);
+ void opReturnV(SCRIPTOP_PARAMS);
+ void opJmp(SCRIPTOP_PARAMS);
+ void opJmpTrueV(SCRIPTOP_PARAMS);
+ void opJmpFalseV(SCRIPTOP_PARAMS);
+ void opJmpTrue(SCRIPTOP_PARAMS);
+ void opJmpFalse(SCRIPTOP_PARAMS);
+ void opJmpSwitch(SCRIPTOP_PARAMS);
+ void opJmpRandom(SCRIPTOP_PARAMS);
+ void opNegate(SCRIPTOP_PARAMS);
+ void opNot(SCRIPTOP_PARAMS);
+ void opCompl(SCRIPTOP_PARAMS);
+ void opIncV(SCRIPTOP_PARAMS);
+ void opDecV(SCRIPTOP_PARAMS);
+ void opPostInc(SCRIPTOP_PARAMS);
+ void opPostDec(SCRIPTOP_PARAMS);
+ void opAdd(SCRIPTOP_PARAMS);
+ void opSub(SCRIPTOP_PARAMS);
+ void opMul(SCRIPTOP_PARAMS);
+ void opDiv(SCRIPTOP_PARAMS);
+ void opMod(SCRIPTOP_PARAMS);
+ void opEq(SCRIPTOP_PARAMS);
+ void opNe(SCRIPTOP_PARAMS);
+ void opGt(SCRIPTOP_PARAMS);
+ void opLt(SCRIPTOP_PARAMS);
+ void opGe(SCRIPTOP_PARAMS);
+ void opLe(SCRIPTOP_PARAMS);
+ void opRsh(SCRIPTOP_PARAMS);
+ void opLsh(SCRIPTOP_PARAMS);
+ void opAnd(SCRIPTOP_PARAMS);
+ void opOr(SCRIPTOP_PARAMS);
+ void opXor(SCRIPTOP_PARAMS);
+ void opLAnd(SCRIPTOP_PARAMS);
+ void opLOr(SCRIPTOP_PARAMS);
+ void opLXor(SCRIPTOP_PARAMS);
+ void opSpeak(SCRIPTOP_PARAMS);
+ void opDialogBegin(SCRIPTOP_PARAMS);
+ void opDialogEnd(SCRIPTOP_PARAMS);
+ void opReply(SCRIPTOP_PARAMS);
+ void opAnimate(SCRIPTOP_PARAMS);
+ void opJmpSeedRandom(SCRIPTOP_PARAMS);
+
+ // Script functions ----------------------------------------------------------
typedef void (Script::*ScriptFunctionType)(SCRIPTFUNC_PARAMS);
struct ScriptFunctionDescription {
@@ -488,7 +498,7 @@ private:
};
const ScriptFunctionDescription *_scriptFunctionsList;
- void setupScriptFuncList(void);
+ void setupScriptFuncList();
void sfPutString(SCRIPTFUNC_PARAMS);
void sfWait(SCRIPTFUNC_PARAMS);
@@ -515,7 +525,7 @@ private:
void sfScriptOpenDoor(SCRIPTFUNC_PARAMS);
void sfScriptCloseDoor(SCRIPTFUNC_PARAMS);
void sfSetBgdAnimSpeed(SCRIPTFUNC_PARAMS);
- void SF_cycleColors(SCRIPTFUNC_PARAMS);
+ void sfCycleColors(SCRIPTFUNC_PARAMS);
void sfDoCenterActor(SCRIPTFUNC_PARAMS);
void sfStartBgdAnimSpeed(SCRIPTFUNC_PARAMS);
void sfScriptWalkToAsync(SCRIPTFUNC_PARAMS);