diff options
Diffstat (limited to 'engines/illusions/scriptthread.cpp')
-rw-r--r-- | engines/illusions/scriptthread.cpp | 25 |
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); } |