From a6156a680583bfd3876bcd1c6d5e550763d0a677 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sat, 29 May 2010 15:29:27 +0000 Subject: Removed the scriptRelocateExportsSci11() hack. The open spell in QFG1VGA works now (thanks to waltervn for all his help on this) svn-id: r49311 --- engines/sci/engine/kscripts.cpp | 8 +++++++- engines/sci/engine/savegame.cpp | 1 - engines/sci/engine/script.cpp | 18 ------------------ 3 files changed, 7 insertions(+), 20 deletions(-) diff --git a/engines/sci/engine/kscripts.cpp b/engines/sci/engine/kscripts.cpp index eeaa0ceec0..9b07648647 100644 --- a/engines/sci/engine/kscripts.cpp +++ b/engines/sci/engine/kscripts.cpp @@ -204,7 +204,13 @@ reg_t kScriptID(EngineState *s, int argc, reg_t *argv) { return NULL_REG; } - return make_reg(scriptSeg, scr->validateExportFunc(index)); + uint16 address = scr->validateExportFunc(index); + + // Point to the heap for SCI1.1+ games + if (getSciVersion() >= SCI_VERSION_1_1) + address += scr->_scriptSize; + + return make_reg(scriptSeg, address); } reg_t kDisposeScript(EngineState *s, int argc, reg_t *argv) { diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index c967dddf7d..ab8b9eec58 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -798,7 +798,6 @@ void SegManager::reconstructScripts(EngineState *s) { scr->_synonyms = 0; if (READ_LE_UINT16(scr->_buf + 6) > 0) { scr->setExportTableOffset(6); - s->_segMan->scriptRelocateExportsSci11(i); } } else { scr->_exportTable = (uint16 *) scr->findBlock(SCI_OBJ_EXPORTS); diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index e0bcd632cc..d1cbfbf551 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -200,23 +200,6 @@ void SegManager::scriptInitialiseLocals(reg_t location) { } } -void SegManager::scriptRelocateExportsSci11(SegmentId seg) { - Script *scr = getScript(seg); - for (int i = 0; i < scr->_numExports; i++) { - /* We are forced to use an ugly heuristic here to distinguish function - exports from object/class exports. The former kind points into the - script resource, the latter into the heap resource. */ - uint16 location = READ_SCI11ENDIAN_UINT16(scr->_exportTable + i); - - if ((location < scr->_heapSize - 1) && (READ_SCI11ENDIAN_UINT16(scr->_heapStart + location) == SCRIPT_OBJECT_MAGIC_NUMBER)) { - WRITE_SCI11ENDIAN_UINT16(scr->_exportTable + i, location + scr->_heapStart - scr->_buf); - } else { - // Otherwise it's probably a function export, - // and we don't need to do anything. - } - } -} - void SegManager::scriptInitialiseObjectsSci11(SegmentId seg) { Script *scr = getScript(seg); const byte *seeker = scr->_heapStart + 4 + READ_SCI11ENDIAN_UINT16(scr->_heapStart + 2) * 2; @@ -484,7 +467,6 @@ int script_instantiate_sci11(ResourceManager *resMan, SegManager *segMan, int sc segMan->scriptInitialiseLocals(make_reg(seg_id, _heapStart + 4)); - segMan->scriptRelocateExportsSci11(seg_id); segMan->scriptInitialiseObjectsSci11(seg_id); scr->heapRelocate(make_reg(seg_id, READ_SCI11ENDIAN_UINT16(heap->data))); -- cgit v1.2.3