diff options
Diffstat (limited to 'engines')
-rw-r--r-- | engines/made/script.cpp | 36 | ||||
-rw-r--r-- | engines/made/scriptfuncs.cpp | 5 |
2 files changed, 28 insertions, 13 deletions
diff --git a/engines/made/script.cpp b/engines/made/script.cpp index 6f4ff7ace3..62c0cf338b 100644 --- a/engines/made/script.cpp +++ b/engines/made/script.cpp @@ -30,6 +30,7 @@ #include "made/script.h" #include "made/database.h" #include "made/scriptfuncs.h" +#include "made/screen.h" namespace Made { @@ -44,47 +45,47 @@ ScriptStack::ScriptStack() { ScriptStack::~ScriptStack() { } -int16 ScriptStack::top() { +inline int16 ScriptStack::top() { return _stack[_stackPos]; } -int16 ScriptStack::pop() { +inline int16 ScriptStack::pop() { if (_stackPos == kScriptStackSize) error("ScriptStack::pop() Stack underflow"); return _stack[_stackPos++]; } -void ScriptStack::push(int16 value) { +inline void ScriptStack::push(int16 value) { if (_stackPos == 0) error("ScriptStack::push() Stack overflow"); _stack[--_stackPos] = value; } -void ScriptStack::setTop(int16 value) { +inline void ScriptStack::setTop(int16 value) { _stack[_stackPos] = value; } -int16 ScriptStack::peek(int16 index) { +inline int16 ScriptStack::peek(int16 index) { return _stack[index]; } -void ScriptStack::poke(int16 index, int16 value) { +inline void ScriptStack::poke(int16 index, int16 value) { _stack[index] = value; } -void ScriptStack::alloc(int16 count) { +inline void ScriptStack::alloc(int16 count) { _stackPos -= count; } -void ScriptStack::free(int16 count) { +inline void ScriptStack::free(int16 count) { _stackPos += count; } -void ScriptStack::setStackPos(int16 stackPtr) { +inline void ScriptStack::setStackPos(int16 stackPtr) { _stackPos = stackPtr; } -int16 *ScriptStack::getStackPtr() { +inline int16 *ScriptStack::getStackPtr() { return &_stack[_stackPos]; } @@ -187,6 +188,9 @@ ScriptInterpreter::~ScriptInterpreter() { } void ScriptInterpreter::runScript(int16 scriptObjectIndex) { + + uint32 opcodeSleepCounter = 0; + _vm->_quit = false; _runningScriptObjectIndex = scriptObjectIndex; @@ -194,19 +198,27 @@ void ScriptInterpreter::runScript(int16 scriptObjectIndex) { _codeBase = _vm->_dat->getObject(_runningScriptObjectIndex)->getData(); _codeIp = _codeBase; - + while (!_vm->_quit) { _vm->handleEvents(); byte opcode = readByte(); + if (opcode >= 1 && opcode <= _commandsMax) { debug(4, "[%04X:%04X] %s", _runningScriptObjectIndex, (uint) (_codeIp - _codeBase), _commands[opcode - 1].desc); (this->*_commands[opcode - 1].proc)(); } else { warning("ScriptInterpreter::runScript(%d) Unknown opcode %02X", _runningScriptObjectIndex, opcode); } - + + /* We sleep a little after 500 opcodes to reduce the CPU load. + */ + if (++opcodeSleepCounter > 500) { + _vm->_screen->updateScreenAndWait(5); + opcodeSleepCounter = 0; + } + } } diff --git a/engines/made/scriptfuncs.cpp b/engines/made/scriptfuncs.cpp index 0051b80dae..835d846108 100644 --- a/engines/made/scriptfuncs.cpp +++ b/engines/made/scriptfuncs.cpp @@ -195,7 +195,10 @@ int16 ScriptFunctions::sfClearScreen(int16 argc, int16 *argv) { int16 ScriptFunctions::sfShowPage(int16 argc, int16 *argv) { _vm->_screen->show(); - return 0; + // NOTE: We need to return something != 0 here or some game scripts won't + // work correctly. The actual meaning of this value is unknown to me. + // 0x38 was found out by analyzing debug output of the original engine. + return 0x38; } int16 ScriptFunctions::sfPollEvent(int16 argc, int16 *argv) { |