aboutsummaryrefslogtreecommitdiff
path: root/kyra/script.h
diff options
context:
space:
mode:
authorJohannes Schickel2005-10-13 18:05:04 +0000
committerJohannes Schickel2005-10-13 18:05:04 +0000
commitce2e9ab9d8a814f2356371b941ddb7e83d387427 (patch)
tree16516e73d26edb16fde1ce44384829b74f3fd4ff /kyra/script.h
parente9b7a88e77de0043aa1eacf1e80b90d9d257c5c9 (diff)
downloadscummvm-rg350-ce2e9ab9d8a814f2356371b941ddb7e83d387427.tar.gz
scummvm-rg350-ce2e9ab9d8a814f2356371b941ddb7e83d387427.tar.bz2
scummvm-rg350-ce2e9ab9d8a814f2356371b941ddb7e83d387427.zip
Rewrite of the script interpretation class:
- Now only one instance is needed for many scripts - Fixed a few command procs, but lacks opcode caller implementation svn-id: r19064
Diffstat (limited to 'kyra/script.h')
-rw-r--r--kyra/script.h183
1 files changed, 65 insertions, 118 deletions
diff --git a/kyra/script.h b/kyra/script.h
index 3acaf6bb9c..b9cc31d562 100644
--- a/kyra/script.h
+++ b/kyra/script.h
@@ -22,136 +22,83 @@
#ifndef KYRASCRIPT_H
#define KYRASCRIPT_H
+#include "kyra/kyra.h"
+
namespace Kyra {
-// TODO:
-// find out more script functions
-enum ScriptFunc {
- kSetupScene = 0,
- kClickEvent = 1, // _registers[1] and _registers[2] are mouse x, y _registers[4] is action
- kActorEvent = 2,
- kEnterEvent = 4,
- kExitEvent = 5,
- kLoadResources = 7
+struct ScriptData {
+ byte *text;
+ byte *data;
+ byte *ordr;
+ uint16 dataSize;
+ /*command table ptr (uint32)*/
+ uint16 mustBeFreed;
};
-enum ScriptState {
- kScriptStopped = 0,
- kScriptRunning = 1,
- kScriptWaiting = 2,
- kScriptError = 3
+struct ScriptState {
+ byte *ip;
+ ScriptData *dataPtr;
+ int16 retValue;
+ uint16 bp;
+ uint16 sp;
+ int16 variables[30];
+ int16 stack[61];
};
+enum {
+ SCRIPT_INIT = 0
+};
-class VMContext {
-
+class ScriptHelper {
public:
-
- VMContext(KyraEngine* engine);
- ~VMContext() { delete [] _scriptFile; }
-
- void loadScript(const char* file);
-
- const char* stringAtIndex(int32 index);
-
- // TODO: check for 'over'flow
- void pushStack(int32 value) { _stack[_stackPos++] = value; }
- void registerValue(int32 reg, int32 value) { _registers[reg] = value; }
- int32 checkReg(int32 reg) { return _registers[reg]; }
-
- uint32 state(void) { return _scriptState; }
-
- bool startScript(int32 func);
- uint32 contScript(void);
-
+ ScriptHelper(KyraEngine *vm);
+ virtual ~ScriptHelper();
+
+ bool loadScript(const char *filename, ScriptData *data, byte *specialPtr = 0);
+ void unloadScript(ScriptData *data);
+
+ void initScript(ScriptState *scriptStat, ScriptData *data);
+ bool startScript(ScriptState *script, int function);
+
+ bool validScript(ScriptState *script);
+
+ bool runScript(ScriptState *script);
protected:
- KyraEngine* _engine;
- uint8* _scriptFile;
- uint32 _scriptFileSize;
-
- uint32 _scriptState;
- uint32 _delay;
-
- int32 _registers[32]; // registers of the interpreter
- int32 _stack[64]; // our stack
-
- // TODO: check for 'under'flow
- int32 popStack(void) { return _stack[--_stackPos]; }
- int32& topStack(void) { return _stack[_stackPos]; }
-
- uint32 _returnValue;
-
- int32 _nextScriptPos;
- int32 _instructionPos;
- int32 _stackPos;
- int32 _tempPos;
-
- // used by command & opcode procs
- uint16 _argument;
- uint8 _currentCommand;
- uint32 _currentOpcode;
-
- int32 param(int32 index);
- const char* paramString(int32 index) { return stringAtIndex(param(index)); }
-
- bool _error; // used by all command- and opcodefuncs
-
- enum ScriptChunkTypes {
- kForm = 0,
- kEmc2Ordr = 1,
- kText = 2,
- kData = 3,
- kCountChunkTypes
- };
-
- struct ScriptChunk {
- uint32 _size;
- uint8* _data; // by TEXT used for count of texts, by EMC2ODRD it is used for a count of somewhat
- uint8* _additional; // currently only used for TEXT
- };
-
- ScriptChunk _chunks[kCountChunkTypes];
-
- typedef void (VMContext::*CommandProc)();
+ uint32 getFORMBlockSize(byte *&data) const;
+ uint32 getIFFBlockSize(byte *start, byte *&data, uint32 maxSize, const uint32 chunk) const;
+ bool loadIFFBlock(byte *start, byte *&data, uint32 maxSize, const uint32 chunk, byte *loadTo, uint32 ptrSize) const;
+
+ KyraEngine *_vm;
+ ScriptState *_curScript;
+ uint32 _parameter;
+ bool _continue;
+
+ typedef void (ScriptHelper::*CommandProc)();
struct CommandEntry {
CommandProc proc;
const char* desc;
};
-
- typedef void (VMContext::*OpcodeProc)();
- struct OpcodeEntry {
- OpcodeProc proc;
- const char* desc;
- };
-
- uint16 _numCommands;
- const CommandEntry* _commands;
- uint16 _numOpcodes;
- const OpcodeEntry* _opcodes;
-
-protected:
- // the command procs
- void c1_goToLine(void); // 0x00
- void c1_setReturn(void); // 0x01
- void c1_pushRetRec(void); // 0x02
- void c1_push(void); // 0x03 & 0x04
- void c1_pushVar(void); // 0x05
- void c1_pushFrameNeg(void); // 0x06
- void c1_pushFramePos(void); // 0x07
- void c1_popRetRec(void); // 0x08
- void c1_popVar(void); // 0x09
- void c1_popFrameNeg(void); // 0x0A
- void c1_popFramePos(void); // 0x0B
- void c1_addToSP(void); // 0x0C
- void c1_subFromSP(void); // 0x0D
- void c1_execOpcode(void); // 0x0E
- void c1_ifNotGoTo(void); // 0x0F
- void c1_negate(void); // 0x10
- void c1_evaluate(void); // 0x11
- void c1_unknownCommand(void);
-
- // the opcode procs
- void o1_0x68(void); // 0x68
- void o1_unknownOpcode(void);
+
+ const CommandEntry *_commands;
+private:
+ void c1_jmpTo();
+ void c1_setRetValue();
+ void c1_pushRetOrPos();
+ void c1_push();
+ //void c1_push(); same as 03
+ void c1_pushVar();
+ void c1_pushBPNeg();
+ void c1_pushBPAdd();
+ void c1_popRetOrPos();
+ void c1_popVar();
+ void c1_popBPNeg();
+ void c1_popBPAdd();
+ void c1_addSP();
+ void c1_subSP();
+ void c1_execOpcode();
+ void c1_ifNotJmp();
+ void c1_negate();
+ void c1_eval();
+ void c1_setRetAndJmp();
};
} // end of namespace Kyra