aboutsummaryrefslogtreecommitdiff
path: root/kyra/script.cpp
diff options
context:
space:
mode:
authorJohannes Schickel2006-01-02 22:58:59 +0000
committerJohannes Schickel2006-01-02 22:58:59 +0000
commitbd965cd48388afdd8a85adf93d186db3da325822 (patch)
treef208a809a1ea109d1915265ad9fbd25d09e9d6aa /kyra/script.cpp
parent978cbb3fd00be5f57a42a58b8ea9447311ac1d98 (diff)
downloadscummvm-rg350-bd965cd48388afdd8a85adf93d186db3da325822.tar.gz
scummvm-rg350-bd965cd48388afdd8a85adf93d186db3da325822.tar.bz2
scummvm-rg350-bd965cd48388afdd8a85adf93d186db3da325822.zip
More 'cleanup' for kyra.
Moved scene object drawing into its own class (see animator.h and .cpp) (this needs some more cleanup!) Moved text displaying into its own class (see text.h and .cpp) Also moved timer code to timers.cpp and button code to gui.cpp. Also changed wrong (c) information in debugger.h and debugger.cpp svn-id: r19890
Diffstat (limited to 'kyra/script.cpp')
-rw-r--r--kyra/script.cpp267
1 files changed, 267 insertions, 0 deletions
diff --git a/kyra/script.cpp b/kyra/script.cpp
index ad9d853eed..c374b007ee 100644
--- a/kyra/script.cpp
+++ b/kyra/script.cpp
@@ -294,4 +294,271 @@ bool ScriptHelper::loadIFFBlock(byte *start, byte *&data, uint32 maxSize, const
}
return false;
}
+
+#pragma mark -
+#pragma mark - Command implementations
+#pragma mark -
+
+void ScriptHelper::c1_jmpTo() {
+ _curScript->ip = _curScript->dataPtr->data + (_parameter << 1);
+}
+
+void ScriptHelper::c1_setRetValue() {
+ _curScript->retValue = _parameter;
+}
+
+void ScriptHelper::c1_pushRetOrPos() {
+ switch (_parameter) {
+ case 0:
+ _curScript->stack[--_curScript->sp] = _curScript->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;
+ break;
+
+ default:
+ _continue = false;
+ _curScript->ip = 0;
+ break;
+ }
+}
+
+void ScriptHelper::c1_push() {
+ _curScript->stack[--_curScript->sp] = _parameter;
+}
+
+void ScriptHelper::c1_pushVar() {
+ _curScript->stack[--_curScript->sp] = _curScript->variables[_parameter];
+}
+
+void ScriptHelper::c1_pushBPNeg() {
+ _curScript->stack[--_curScript->sp] = _curScript->stack[(-(int32)(_parameter + 2)) + _curScript->bp];
+}
+
+void ScriptHelper::c1_pushBPAdd() {
+ _curScript->stack[--_curScript->sp] = _curScript->stack[(_parameter - 1) + _curScript->bp];
+}
+
+void ScriptHelper::c1_popRetOrPos() {
+ switch (_parameter) {
+ case 0:
+ _curScript->retValue = _curScript->stack[_curScript->sp++];
+ break;
+
+ case 1:
+ if (_curScript->sp >= 60) {
+ _continue = false;
+ _curScript->ip = 0;
+ } else {
+ _curScript->bp = _curScript->stack[_curScript->sp++];
+ _curScript->ip = _curScript->dataPtr->data + (_curScript->stack[_curScript->sp++] << 1);
+ }
+ break;
+
+ default:
+ _continue = false;
+ _curScript->ip = 0;
+ break;
+ }
+}
+
+void ScriptHelper::c1_popVar() {
+ _curScript->variables[_parameter] = _curScript->stack[_curScript->sp++];
+}
+
+void ScriptHelper::c1_popBPNeg() {
+ _curScript->stack[(-(int32)(_parameter + 2)) + _curScript->bp] = _curScript->stack[_curScript->sp++];
+}
+
+void ScriptHelper::c1_popBPAdd() {
+ _curScript->stack[(_parameter - 1) + _curScript->bp] = _curScript->stack[_curScript->sp++];
+}
+
+void ScriptHelper::c1_addSP() {
+ _curScript->sp += _parameter;
+}
+
+void ScriptHelper::c1_subSP() {
+ _curScript->sp -= _parameter;
+}
+
+void ScriptHelper::c1_execOpcode() {
+ assert((uint8)_parameter < _curScript->dataPtr->opcodeSize);
+ if (_curScript->dataPtr->opcodes[(uint8)_parameter] == &KyraEngine::cmd_dummy)
+ debug("calling unimplemented opcode(0x%.02X)", (uint8)_parameter);
+ _curScript->retValue = (_vm->*_curScript->dataPtr->opcodes[(uint8)_parameter])(_curScript);
+}
+
+void ScriptHelper::c1_ifNotJmp() {
+ if (!_curScript->stack[_curScript->sp++]) {
+ _parameter &= 0x7FFF;
+ _curScript->ip = _curScript->dataPtr->data + (_parameter << 1);
+ }
+}
+
+void ScriptHelper::c1_negate() {
+ int16 value = _curScript->stack[_curScript->sp];
+ switch (_parameter) {
+ case 0:
+ if (!value) {
+ _curScript->stack[_curScript->sp] = 1;
+ } else {
+ _curScript->stack[_curScript->sp] = 0;
+ }
+ break;
+
+ case 1:
+ _curScript->stack[_curScript->sp] = -value;
+ break;
+
+ case 2:
+ _curScript->stack[_curScript->sp] = ~value;
+ break;
+
+ default:
+ _continue = false;
+ break;
+ }
+}
+
+void ScriptHelper::c1_eval() {
+ int16 ret = 0;
+ bool error = false;
+
+ int16 val1 = _curScript->stack[_curScript->sp++];
+ int16 val2 = _curScript->stack[_curScript->sp++];
+
+ switch (_parameter) {
+ case 0:
+ if (!val2 || !val1) {
+ ret = 0;
+ } else {
+ ret = 1;
+ }
+ break;
+
+ case 1:
+ if (val2 || val1) {
+ ret = 1;
+ } else {
+ ret = 0;
+ }
+ break;
+
+ case 2:
+ if (val1 == val2) {
+ ret = 1;
+ } else {
+ ret = 0;
+ }
+ break;
+
+ case 3:
+ if (val1 != val2) {
+ ret = 1;
+ } else {
+ ret = 0;
+ }
+ break;
+
+ case 4:
+ if (val1 > val2) {
+ ret = 1;
+ } else {
+ ret = 0;
+ }
+ break;
+
+ case 5:
+ if (val1 >= val2) {
+ ret = 1;
+ } else {
+ ret = 0;
+ }
+ break;
+
+ case 6:
+ if (val1 < val2) {
+ ret = 1;
+ } else {
+ ret = 0;
+ }
+ break;
+
+ case 7:
+ if (val1 <= val2) {
+ ret = 1;
+ } else {
+ ret = 0;
+ }
+ break;
+
+ case 8:
+ ret = val1 + val2;
+ break;
+
+ case 9:
+ ret = val2 - val1;
+ break;
+
+ case 10:
+ ret = val1 * val2;
+ break;
+
+ case 11:
+ ret = val2 / val1;
+ break;
+
+ case 12:
+ ret = val2 >> val1;
+ break;
+
+ case 13:
+ ret = val2 << val1;
+ break;
+
+ case 14:
+ ret = val1 & val2;
+ break;
+
+ case 15:
+ ret = val1 | val2;
+ break;
+
+ case 16:
+ ret = val2 % val1;
+ break;
+
+ case 17:
+ ret = val1 ^ val2;
+ break;
+
+ default:
+ warning("Unknown evaluate func: %d", _parameter);
+ error = true;
+ break;
+ }
+
+ if (error) {
+ _curScript->ip = 0;
+ _continue = false;
+ } else {
+ _curScript->stack[--_curScript->sp] = ret;
+ }
+}
+
+void ScriptHelper::c1_setRetAndJmp() {
+ if (_curScript->sp >= 60) {
+ _continue = false;
+ _curScript->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];
+ }
+}
} // end of namespace Kyra