diff options
-rw-r--r-- | engines/scumm/script.cpp | 41 | ||||
-rw-r--r-- | engines/scumm/scumm.h | 3 |
2 files changed, 24 insertions, 20 deletions
diff --git a/engines/scumm/script.cpp b/engines/scumm/script.cpp index 223e9822e2..3c5dd9df6f 100644 --- a/engines/scumm/script.cpp +++ b/engines/scumm/script.cpp @@ -339,7 +339,7 @@ void ScummEngine::runScriptNested(int script) { _currentScript = script; getScriptBaseAddress(); - getScriptEntryPoint(); + resetScriptPointer(); executeScript(); if (vm.numNestedScripts != 0) @@ -354,7 +354,7 @@ void ScummEngine::runScriptNested(int script) { slot->status != ssDead && slot->freezeCount == 0) { _currentScript = nest->slot; getScriptBaseAddress(); - getScriptEntryPoint(); + resetScriptPointer(); return; } } @@ -441,12 +441,27 @@ void ScummEngine::getScriptBaseAddress() { } -void ScummEngine::getScriptEntryPoint() { +void ScummEngine::resetScriptPointer() { if (_currentScript == 0xFF) return; _scriptPointer = _scriptOrgPointer + vm.slot[_currentScript].offs; } +/** + * This method checks whether the resource that contains the active script + * moved, and if so, updates the script pointer accordingly. + * + * The script resource may have moved because it might have been garbage + * collected by ResourceManager::expireResources. + */ +void ScummEngine::refreshScriptPointer() { + if (*_lastCodePtr + sizeof(MemBlkHeader) != _scriptOrgPointer) { + long oldoffs = _scriptPointer - _scriptOrgPointer; + getScriptBaseAddress(); + _scriptPointer = _scriptOrgPointer + oldoffs; + } +} + /** Execute a script - Read opcode, and execute it from the table */ void ScummEngine::executeScript() { int c; @@ -492,20 +507,12 @@ const char *ScummEngine::getOpcodeDesc(byte i) { } byte ScummEngine::fetchScriptByte() { - if (*_lastCodePtr + sizeof(MemBlkHeader) != _scriptOrgPointer) { - long oldoffs = _scriptPointer - _scriptOrgPointer; - getScriptBaseAddress(); - _scriptPointer = _scriptOrgPointer + oldoffs; - } + refreshScriptPointer(); return *_scriptPointer++; } uint ScummEngine::fetchScriptWord() { - if (*_lastCodePtr + sizeof(MemBlkHeader) != _scriptOrgPointer) { - long oldoffs = _scriptPointer - _scriptOrgPointer; - getScriptBaseAddress(); - _scriptPointer = _scriptOrgPointer + oldoffs; - } + refreshScriptPointer(); uint a = READ_LE_UINT16(_scriptPointer); _scriptPointer += 2; return a; @@ -516,11 +523,7 @@ int ScummEngine::fetchScriptWordSigned() { } uint ScummEngine::fetchScriptDWord() { - if (*_lastCodePtr + sizeof(MemBlkHeader) != _scriptOrgPointer) { - long oldoffs = _scriptPointer - _scriptOrgPointer; - getScriptBaseAddress(); - _scriptPointer = _scriptOrgPointer + oldoffs; - } + refreshScriptPointer(); uint a = READ_LE_UINT32(_scriptPointer); _scriptPointer += 4; return a; @@ -898,7 +901,7 @@ void ScummEngine::runAllScripts() { if (vm.slot[i].cycle == cycle && vm.slot[i].status == ssRunning && !vm.slot[i].didexec) { _currentScript = (byte)i; getScriptBaseAddress(); - getScriptEntryPoint(); + resetScriptPointer(); executeScript(); } } diff --git a/engines/scumm/scumm.h b/engines/scumm/scumm.h index 26cbda222e..dc881ffa77 100644 --- a/engines/scumm/scumm.h +++ b/engines/scumm/scumm.h @@ -753,9 +753,10 @@ protected: void stopObjectScript(int script); void getScriptBaseAddress(); - void getScriptEntryPoint(); + void resetScriptPointer(); int getVerbEntrypoint(int obj, int entry); + void refreshScriptPointer(); byte fetchScriptByte(); virtual uint fetchScriptWord(); virtual int fetchScriptWordSigned(); |