aboutsummaryrefslogtreecommitdiff
path: root/engines/illusions/scriptthread.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/illusions/scriptthread.cpp')
-rw-r--r--engines/illusions/scriptthread.cpp25
1 files changed, 20 insertions, 5 deletions
diff --git a/engines/illusions/scriptthread.cpp b/engines/illusions/scriptthread.cpp
index 78fb8b86ab..73ef8ecd67 100644
--- a/engines/illusions/scriptthread.cpp
+++ b/engines/illusions/scriptthread.cpp
@@ -42,11 +42,7 @@ int ScriptThread::onUpdate() {
opCall._result = kTSRun;
opCall._callerThreadId = _threadId;
while (!_terminated && opCall._result == kTSRun) {
- opCall._op = _scriptCodeIp[0];
- opCall._opSize = _scriptCodeIp[1] >> 1;
- opCall._threadId = _scriptCodeIp[1] & 1 ? _threadId : 0;
- opCall._code = _scriptCodeIp + 2;
- opCall._deltaOfs = opCall._opSize;
+ loadOpcode(opCall);
execOpcode(opCall);
_scriptCodeIp += opCall._deltaOfs;
}
@@ -55,6 +51,25 @@ int ScriptThread::onUpdate() {
return opCall._result;
}
+void ScriptThread::loadOpcode(OpCall &opCall) {
+#if 0
+ for (uint i = 0; i < 16; ++i)
+ debugN("%02X ", _scriptCodeIp[i]);
+ debug(".");
+#endif
+ if (_vm->getGameId() == kGameIdDuckman) {
+ opCall._op = _scriptCodeIp[0] & 0x7F;
+ opCall._opSize = _scriptCodeIp[1];
+ opCall._threadId = _scriptCodeIp[0] & 0x80 ? _threadId : 0;
+ } else {
+ opCall._op = _scriptCodeIp[0];
+ opCall._opSize = _scriptCodeIp[1] >> 1;
+ opCall._threadId = _scriptCodeIp[1] & 1 ? _threadId : 0;
+ }
+ opCall._code = _scriptCodeIp + 2;
+ opCall._deltaOfs = opCall._opSize;
+}
+
void ScriptThread::execOpcode(OpCall &opCall) {
_vm->_scriptOpcodes->execOpcode(this, opCall);
}