aboutsummaryrefslogtreecommitdiff
path: root/kyra
diff options
context:
space:
mode:
authorJohannes Schickel2006-01-08 16:15:34 +0000
committerJohannes Schickel2006-01-08 16:15:34 +0000
commite7e1f692a6cc40191b674164213befde3e1147d3 (patch)
tree2a5cd3a20496826cf737ead683cf2b03b1022ead /kyra
parent5713d00eab77e3b9911114986c0ce75b9c30f938 (diff)
downloadscummvm-rg350-e7e1f692a6cc40191b674164213befde3e1147d3.tar.gz
scummvm-rg350-e7e1f692a6cc40191b674164213befde3e1147d3.tar.bz2
scummvm-rg350-e7e1f692a6cc40191b674164213befde3e1147d3.zip
Fixed script handling a bit.
svn-id: r19946
Diffstat (limited to 'kyra')
-rw-r--r--kyra/script.cpp132
-rw-r--r--kyra/script.h39
2 files changed, 85 insertions, 86 deletions
diff --git a/kyra/script.cpp b/kyra/script.cpp
index c374b007ee..285bf6b873 100644
--- a/kyra/script.cpp
+++ b/kyra/script.cpp
@@ -192,15 +192,14 @@ bool ScriptHelper::validScript(ScriptState *script) {
}
bool ScriptHelper::runScript(ScriptState *script) {
- _curScript = script;
_parameter = 0;
_continue = true;
- if (!_curScript->ip) {
+ if (!script->ip) {
return false;
}
- int16 code = READ_BE_UINT16(_curScript->ip); _curScript->ip += 2;
+ int16 code = READ_BE_UINT16(script->ip); script->ip += 2;
int16 opcode = (code >> 8) & 0x1F;
if (code & 0x8000) {
@@ -209,7 +208,7 @@ bool ScriptHelper::runScript(ScriptState *script) {
} else if (code & 0x4000) {
_parameter = (int8)(code);
} else if (code & 0x2000) {
- _parameter = READ_BE_UINT16(_curScript->ip); _curScript->ip += 2;
+ _parameter = READ_BE_UINT16(script->ip); script->ip += 2;
} else {
_parameter = 0;
}
@@ -218,10 +217,9 @@ bool ScriptHelper::runScript(ScriptState *script) {
error("Script unknown command: %d", opcode);
} else {
debug(5, "%s(%d)", _commands[opcode].desc, _parameter);
- (this->*(_commands[opcode].proc))();
+ (this->*(_commands[opcode].proc))(script);
}
- _curScript = 0;
return _continue;
}
@@ -299,123 +297,125 @@ bool ScriptHelper::loadIFFBlock(byte *start, byte *&data, uint32 maxSize, const
#pragma mark - Command implementations
#pragma mark -
-void ScriptHelper::c1_jmpTo() {
- _curScript->ip = _curScript->dataPtr->data + (_parameter << 1);
+void ScriptHelper::c1_jmpTo(ScriptState* script) {
+ script->ip = script->dataPtr->data + (_parameter << 1);
}
-void ScriptHelper::c1_setRetValue() {
- _curScript->retValue = _parameter;
+void ScriptHelper::c1_setRetValue(ScriptState* script) {
+ script->retValue = _parameter;
}
-void ScriptHelper::c1_pushRetOrPos() {
+void ScriptHelper::c1_pushRetOrPos(ScriptState* script) {
switch (_parameter) {
case 0:
- _curScript->stack[--_curScript->sp] = _curScript->retValue;
+ script->stack[--script->sp] = script->retValue;
break;
case 1:
- _curScript->stack[--_curScript->sp] = (_curScript->ip - _curScript->dataPtr->data) / 2 + 1;
- _curScript->stack[--_curScript->sp] = _curScript->bp;
- _curScript->bp = _curScript->sp + 2;
+ script->stack[--script->sp] = (script->ip - script->dataPtr->data) / 2 + 1;
+ script->stack[--script->sp] = script->bp;
+ script->bp = script->sp + 2;
break;
default:
_continue = false;
- _curScript->ip = 0;
+ script->ip = 0;
break;
}
}
-void ScriptHelper::c1_push() {
- _curScript->stack[--_curScript->sp] = _parameter;
+void ScriptHelper::c1_push(ScriptState* script) {
+ script->stack[--script->sp] = _parameter;
}
-void ScriptHelper::c1_pushVar() {
- _curScript->stack[--_curScript->sp] = _curScript->variables[_parameter];
+void ScriptHelper::c1_pushVar(ScriptState* script) {
+ script->stack[--script->sp] = script->variables[_parameter];
}
-void ScriptHelper::c1_pushBPNeg() {
- _curScript->stack[--_curScript->sp] = _curScript->stack[(-(int32)(_parameter + 2)) + _curScript->bp];
+void ScriptHelper::c1_pushBPNeg(ScriptState* script) {
+ script->stack[--script->sp] = script->stack[(-(int32)(_parameter + 2)) + script->bp];
}
-void ScriptHelper::c1_pushBPAdd() {
- _curScript->stack[--_curScript->sp] = _curScript->stack[(_parameter - 1) + _curScript->bp];
+void ScriptHelper::c1_pushBPAdd(ScriptState* script) {
+ script->stack[--script->sp] = script->stack[(_parameter - 1) + script->bp];
}
-void ScriptHelper::c1_popRetOrPos() {
+void ScriptHelper::c1_popRetOrPos(ScriptState* script) {
switch (_parameter) {
case 0:
- _curScript->retValue = _curScript->stack[_curScript->sp++];
+ script->retValue = script->stack[script->sp++];
break;
case 1:
- if (_curScript->sp >= 60) {
+ if (script->sp >= 60) {
_continue = false;
- _curScript->ip = 0;
+ script->ip = 0;
} else {
- _curScript->bp = _curScript->stack[_curScript->sp++];
- _curScript->ip = _curScript->dataPtr->data + (_curScript->stack[_curScript->sp++] << 1);
+ script->bp = script->stack[script->sp++];
+ script->ip = script->dataPtr->data + (script->stack[script->sp++] << 1);
}
break;
default:
_continue = false;
- _curScript->ip = 0;
+ script->ip = 0;
break;
}
}
-void ScriptHelper::c1_popVar() {
- _curScript->variables[_parameter] = _curScript->stack[_curScript->sp++];
+void ScriptHelper::c1_popVar(ScriptState* script) {
+ script->variables[_parameter] = script->stack[script->sp++];
}
-void ScriptHelper::c1_popBPNeg() {
- _curScript->stack[(-(int32)(_parameter + 2)) + _curScript->bp] = _curScript->stack[_curScript->sp++];
+void ScriptHelper::c1_popBPNeg(ScriptState* script) {
+ script->stack[(-(int32)(_parameter + 2)) + script->bp] = script->stack[script->sp++];
}
-void ScriptHelper::c1_popBPAdd() {
- _curScript->stack[(_parameter - 1) + _curScript->bp] = _curScript->stack[_curScript->sp++];
+void ScriptHelper::c1_popBPAdd(ScriptState* script) {
+ script->stack[(_parameter - 1) + script->bp] = script->stack[script->sp++];
}
-void ScriptHelper::c1_addSP() {
- _curScript->sp += _parameter;
+void ScriptHelper::c1_addSP(ScriptState* script) {
+ script->sp += _parameter;
}
-void ScriptHelper::c1_subSP() {
- _curScript->sp -= _parameter;
+void ScriptHelper::c1_subSP(ScriptState* script) {
+ script->sp -= _parameter;
}
-void ScriptHelper::c1_execOpcode() {
- assert((uint8)_parameter < _curScript->dataPtr->opcodeSize);
- if (_curScript->dataPtr->opcodes[(uint8)_parameter] == &KyraEngine::cmd_dummy)
+void ScriptHelper::c1_execOpcode(ScriptState* script) {
+ assert((uint8)_parameter < script->dataPtr->opcodeSize);
+ if (script->dataPtr->opcodes[(uint8)_parameter] == &KyraEngine::cmd_dummy)
debug("calling unimplemented opcode(0x%.02X)", (uint8)_parameter);
- _curScript->retValue = (_vm->*_curScript->dataPtr->opcodes[(uint8)_parameter])(_curScript);
+ int val = (_vm->*script->dataPtr->opcodes[(uint8)_parameter])(script);
+ assert(script);
+ script->retValue = val;
}
-void ScriptHelper::c1_ifNotJmp() {
- if (!_curScript->stack[_curScript->sp++]) {
+void ScriptHelper::c1_ifNotJmp(ScriptState* script) {
+ if (!script->stack[script->sp++]) {
_parameter &= 0x7FFF;
- _curScript->ip = _curScript->dataPtr->data + (_parameter << 1);
+ script->ip = script->dataPtr->data + (_parameter << 1);
}
}
-void ScriptHelper::c1_negate() {
- int16 value = _curScript->stack[_curScript->sp];
+void ScriptHelper::c1_negate(ScriptState* script) {
+ int16 value = script->stack[script->sp];
switch (_parameter) {
case 0:
if (!value) {
- _curScript->stack[_curScript->sp] = 1;
+ script->stack[script->sp] = 1;
} else {
- _curScript->stack[_curScript->sp] = 0;
+ script->stack[script->sp] = 0;
}
break;
case 1:
- _curScript->stack[_curScript->sp] = -value;
+ script->stack[script->sp] = -value;
break;
case 2:
- _curScript->stack[_curScript->sp] = ~value;
+ script->stack[script->sp] = ~value;
break;
default:
@@ -424,12 +424,12 @@ void ScriptHelper::c1_negate() {
}
}
-void ScriptHelper::c1_eval() {
+void ScriptHelper::c1_eval(ScriptState* script) {
int16 ret = 0;
bool error = false;
- int16 val1 = _curScript->stack[_curScript->sp++];
- int16 val2 = _curScript->stack[_curScript->sp++];
+ int16 val1 = script->stack[script->sp++];
+ int16 val2 = script->stack[script->sp++];
switch (_parameter) {
case 0:
@@ -543,22 +543,22 @@ void ScriptHelper::c1_eval() {
}
if (error) {
- _curScript->ip = 0;
+ script->ip = 0;
_continue = false;
} else {
- _curScript->stack[--_curScript->sp] = ret;
+ script->stack[--script->sp] = ret;
}
}
-void ScriptHelper::c1_setRetAndJmp() {
- if (_curScript->sp >= 60) {
+void ScriptHelper::c1_setRetAndJmp(ScriptState* script) {
+ if (script->sp >= 60) {
_continue = false;
- _curScript->ip = 0;
+ script->ip = 0;
} else {
- _curScript->retValue = _curScript->stack[_curScript->sp++];
- uint16 temp = _curScript->stack[_curScript->sp++];
- _curScript->stack[60] = 0;
- _curScript->ip = &_curScript->dataPtr->data[temp*2];
+ script->retValue = script->stack[script->sp++];
+ uint16 temp = script->stack[script->sp++];
+ script->stack[60] = 0;
+ script->ip = &script->dataPtr->data[temp*2];
}
}
} // end of namespace Kyra
diff --git a/kyra/script.h b/kyra/script.h
index bbce63aa24..60bb1f8244 100644
--- a/kyra/script.h
+++ b/kyra/script.h
@@ -69,11 +69,10 @@ protected:
bool loadIFFBlock(byte *start, byte *&data, uint32 maxSize, const uint32 chunk, byte *loadTo, uint32 ptrSize) const;
KyraEngine *_vm;
- ScriptState *_curScript;
int16 _parameter;
bool _continue;
- typedef void (ScriptHelper::*CommandProc)();
+ typedef void (ScriptHelper::*CommandProc)(ScriptState*);
struct CommandEntry {
CommandProc proc;
const char* desc;
@@ -81,25 +80,25 @@ protected:
const CommandEntry *_commands;
private:
- void c1_jmpTo();
- void c1_setRetValue();
- void c1_pushRetOrPos();
- void c1_push();
+ void c1_jmpTo(ScriptState*);
+ void c1_setRetValue(ScriptState*);
+ void c1_pushRetOrPos(ScriptState*);
+ void c1_push(ScriptState*);
//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();
+ void c1_pushVar(ScriptState*);
+ void c1_pushBPNeg(ScriptState*);
+ void c1_pushBPAdd(ScriptState*);
+ void c1_popRetOrPos(ScriptState*);
+ void c1_popVar(ScriptState*);
+ void c1_popBPNeg(ScriptState*);
+ void c1_popBPAdd(ScriptState*);
+ void c1_addSP(ScriptState*);
+ void c1_subSP(ScriptState*);
+ void c1_execOpcode(ScriptState*);
+ void c1_ifNotJmp(ScriptState*);
+ void c1_negate(ScriptState*);
+ void c1_eval(ScriptState*);
+ void c1_setRetAndJmp(ScriptState*);
};
} // end of namespace Kyra