diff options
author | Max Horn | 2009-09-17 16:50:53 +0000 |
---|---|---|
committer | Max Horn | 2009-09-17 16:50:53 +0000 |
commit | eb77efda785dd7df31a90fb3fd57ea17bf49a606 (patch) | |
tree | 5a31e8292859154a920a0abdf945df0cbd0e4ab4 | |
parent | 9651562e72ac4c73393a2aba87e835269c25210f (diff) | |
download | scummvm-rg350-eb77efda785dd7df31a90fb3fd57ea17bf49a606.tar.gz scummvm-rg350-eb77efda785dd7df31a90fb3fd57ea17bf49a606.tar.bz2 scummvm-rg350-eb77efda785dd7df31a90fb3fd57ea17bf49a606.zip |
SCI: Add a global getSciVersion() function and make use of it
svn-id: r44170
-rw-r--r-- | engines/sci/console.cpp | 13 | ||||
-rw-r--r-- | engines/sci/engine/gc.cpp | 2 | ||||
-rw-r--r-- | engines/sci/engine/kernel.cpp | 2 | ||||
-rw-r--r-- | engines/sci/engine/kgraphics.cpp | 6 | ||||
-rw-r--r-- | engines/sci/engine/kmovement.cpp | 2 | ||||
-rw-r--r-- | engines/sci/engine/kscripts.cpp | 14 | ||||
-rw-r--r-- | engines/sci/engine/savegame.cpp | 5 | ||||
-rw-r--r-- | engines/sci/engine/scriptdebug.cpp | 9 | ||||
-rw-r--r-- | engines/sci/engine/seg_manager.cpp | 24 | ||||
-rw-r--r-- | engines/sci/engine/seg_manager.h | 2 | ||||
-rw-r--r-- | engines/sci/engine/segment.cpp | 16 | ||||
-rw-r--r-- | engines/sci/engine/segment.h | 64 | ||||
-rw-r--r-- | engines/sci/engine/state.cpp | 10 | ||||
-rw-r--r-- | engines/sci/engine/vm.cpp | 42 | ||||
-rw-r--r-- | engines/sci/engine/vm.h | 8 | ||||
-rw-r--r-- | engines/sci/sci.h | 8 |
16 files changed, 104 insertions, 123 deletions
diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 7922e30b01..3d6d35a5fc 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -1649,7 +1649,7 @@ bool Console::cmdGCShowReachable(int argc, const char **argv) { } DebugPrintf("Reachable from %04x:%04x:\n", PRINT_REG(addr)); - mobj->listAllOutgoingReferences(addr, NULL, _print_address, _vm->_gamestate->resMan->sciVersion()); + mobj->listAllOutgoingReferences(addr, NULL, _print_address); return true; } @@ -3054,7 +3054,6 @@ int Console::printObject(reg_t pos) { Object *obj = s->segMan->getObject(pos); Object *var_container = obj; int i; - SciVersion version = s->resMan->sciVersion(); // for the selector defines if (!obj) { DebugPrintf("[%04x:%04x]: Not an object.", PRINT_REG(pos)); @@ -3065,13 +3064,13 @@ int Console::printObject(reg_t pos) { DebugPrintf("[%04x:%04x] %s : %3d vars, %3d methods\n", PRINT_REG(pos), s->segMan->getObjectName(pos), obj->_variables.size(), obj->methods_nr); - if (!(obj->getInfoSelector(version).offset & SCRIPT_INFO_CLASS)) - var_container = s->segMan->getObject(obj->getSuperClassSelector(version)); + if (!(obj->getInfoSelector().offset & SCRIPT_INFO_CLASS)) + var_container = s->segMan->getObject(obj->getSuperClassSelector()); DebugPrintf(" -- member variables:\n"); for (i = 0; (uint)i < obj->_variables.size(); i++) { printf(" "); if (i < var_container->variable_names_nr) { - uint16 varSelector = var_container->getVarSelector(i, version); + uint16 varSelector = var_container->getVarSelector(i); DebugPrintf("[%03x] %s = ", varSelector, selector_name(s, varSelector)); } else DebugPrintf("p#%x = ", i); @@ -3087,8 +3086,8 @@ int Console::printObject(reg_t pos) { } DebugPrintf(" -- methods:\n"); for (i = 0; i < obj->methods_nr; i++) { - reg_t fptr = obj->getFunction(i, version); - DebugPrintf(" [%03x] %s = %04x:%04x\n", obj->getFuncSelector(i, version), selector_name(s, obj->getFuncSelector(i, version)), PRINT_REG(fptr)); + reg_t fptr = obj->getFunction(i); + DebugPrintf(" [%03x] %s = %04x:%04x\n", obj->getFuncSelector(i), selector_name(s, obj->getFuncSelector(i)), PRINT_REG(fptr)); } if (s->segMan->_heap[pos.segment]->getType() == SEG_TYPE_SCRIPT) DebugPrintf("\nOwner script:\t%d\n", s->segMan->getScript(pos.segment)->_nr); diff --git a/engines/sci/engine/gc.cpp b/engines/sci/engine/gc.cpp index 5e5db1f8a4..d9635bff73 100644 --- a/engines/sci/engine/gc.cpp +++ b/engines/sci/engine/gc.cpp @@ -134,7 +134,7 @@ reg_t_hash_map *find_all_used_references(EngineState *s) { if (reg.segment != s->stack_segment) { // No need to repeat this one debugC(2, kDebugLevelGC, "[GC] Checking %04x:%04x\n", PRINT_REG(reg)); if (reg.segment < segMan->_heap.size() && segMan->_heap[reg.segment]) - segMan->_heap[reg.segment]->listAllOutgoingReferences(reg, &wm, add_outgoing_refs, s->resMan->sciVersion()); + segMan->_heap[reg.segment]->listAllOutgoingReferences(reg, &wm, add_outgoing_refs); } } diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index eb3abec50d..1b06b78159 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -643,8 +643,6 @@ int determine_reg_type(SegManager *segMan, reg_t reg, bool allow_invalid) { if (!mobj) return 0; // Invalid - SciVersion version = segMan->sciVersion(); // for the offset defines - switch (mobj->getType()) { case SEG_TYPE_SCRIPT: if (reg.offset <= (*(Script *)mobj)._bufSize && reg.offset >= -SCRIPT_OBJECT_MAGIC_OFFSET diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 01942cda90..80db212703 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -669,7 +669,7 @@ void _k_dirloop(reg_t obj, uint16 angle, EngineState *s, int argc, reg_t *argv) int signal = GET_SEL32V(obj, signal); int loop; int maxloops; - bool oldScriptHeader = (s->resMan->sciVersion() == SCI_VERSION_0_EARLY); + bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY); if (signal & _K_VIEW_SIG_FLAG_DOESNT_TURN) return; @@ -1113,7 +1113,7 @@ void _k_base_setter(EngineState *s, reg_t object) { // does not exist (earliest one was KQ4 SCI, version 0.000.274). This code is left here // for reference only #if 0 - if (s->resMan->sciVersion() <= SCI_VERSION_0) + if (getSciVersion() <= SCI_VERSION_0) --absrect.top; // Compensate for early SCI OB1 'bug' #endif @@ -1328,7 +1328,7 @@ static void disableCertainButtons(SegManager *segMan, Common::String gameName, r */ // NOTE: This _only_ works with the English version if (type == K_CONTROL_BUTTON && text && (gameName == "sq4") && - segMan->sciVersion() < SCI_VERSION_1_1 && !strcmp(text, " Delete ")) { + getSciVersion() < SCI_VERSION_1_1 && !strcmp(text, " Delete ")) { PUT_SEL32V(obj, state, (state | kControlStateDisabled) & ~kControlStateEnabled); } diff --git a/engines/sci/engine/kmovement.cpp b/engines/sci/engine/kmovement.cpp index 9f7e418c91..b9381b1383 100644 --- a/engines/sci/engine/kmovement.cpp +++ b/engines/sci/engine/kmovement.cpp @@ -276,7 +276,7 @@ static void bresenham_autodetect(EngineState *s) { } buf = s->segMan->getScript(fptr.segment)->_buf + fptr.offset; - handle_movecnt = (s->segMan->sciVersion() <= SCI_VERSION_01 || checksum_bytes(buf, 8) == 0x216) ? INCREMENT_MOVECNT : IGNORE_MOVECNT; + handle_movecnt = (getSciVersion() <= SCI_VERSION_01 || checksum_bytes(buf, 8) == 0x216) ? INCREMENT_MOVECNT : IGNORE_MOVECNT; printf("b-moveCnt action based on checksum: %s\n", handle_movecnt == IGNORE_MOVECNT ? "ignore" : "increment"); } else { warning("bresenham_autodetect failed"); diff --git a/engines/sci/engine/kscripts.cpp b/engines/sci/engine/kscripts.cpp index 157f285541..ce7656f47e 100644 --- a/engines/sci/engine/kscripts.cpp +++ b/engines/sci/engine/kscripts.cpp @@ -201,13 +201,11 @@ reg_t kClone(EngineState *s, int, int argc, reg_t *argv) { *clone_obj = *parent_obj; clone_obj->flags = 0; - SciVersion version = s->resMan->sciVersion(); // for the selector defines - // Mark as clone - clone_obj->setInfoSelector(make_reg(0, SCRIPT_INFO_CLONE), version); - clone_obj->setSpeciesSelector(clone_obj->pos, version); - if (parent_obj->isClass(version)) - clone_obj->setSuperClassSelector(parent_obj->pos, version); + clone_obj->setInfoSelector(make_reg(0, SCRIPT_INFO_CLONE)); + clone_obj->setSpeciesSelector(clone_obj->pos); + if (parent_obj->isClass()) + clone_obj->setSuperClassSelector(parent_obj->pos); s->segMan->getScript(parent_obj->pos.segment)->incrementLockers(); s->segMan->getScript(clone_obj->pos.segment)->incrementLockers(); @@ -228,9 +226,7 @@ reg_t kDisposeClone(EngineState *s, int, int argc, reg_t *argv) { return s->r_acc; } - SciVersion version = s->resMan->sciVersion(); // for the selector defines - - if (victim_obj->getInfoSelector(version).offset != SCRIPT_INFO_CLONE) { + if (victim_obj->getInfoSelector().offset != SCRIPT_INFO_CLONE) { //warning("Attempt to dispose something other than a clone at %04x", offset); // SCI silently ignores this behaviour; some games actually depend on it return s->r_acc; diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index da0b93ed14..8713805fec 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -554,7 +554,6 @@ static void load_script(EngineState *s, Script *scr) { static void reconstruct_scripts(EngineState *s, SegManager *self) { uint i, j; SegmentObj *mobj; - SciVersion version = self->sciVersion(); // for the selector defines for (i = 0; i < self->_heap.size(); i++) { if (self->_heap[i]) { @@ -613,11 +612,11 @@ static void reconstruct_scripts(EngineState *s, SegManager *self) { int funct_area = READ_LE_UINT16( data + SCRIPT_FUNCTAREAPTR_OFFSET ); Object *base_obj; - base_obj = s->segMan->getObject(scr->_objects[j].getSpeciesSelector(version)); + base_obj = s->segMan->getObject(scr->_objects[j].getSpeciesSelector()); if (!base_obj) { warning("Object without a base class: Script %d, index %d (reg address %04x:%04x", - scr->_nr, j, PRINT_REG(scr->_objects[j].getSpeciesSelector(version))); + scr->_nr, j, PRINT_REG(scr->_objects[j].getSpeciesSelector())); continue; } scr->_objects[j].variable_names_nr = base_obj->_variables.size(); diff --git a/engines/sci/engine/scriptdebug.cpp b/engines/sci/engine/scriptdebug.cpp index 8c086758d6..099976343a 100644 --- a/engines/sci/engine/scriptdebug.cpp +++ b/engines/sci/engine/scriptdebug.cpp @@ -69,7 +69,6 @@ int propertyOffsetToId(SegManager *segMan, int prop_ofs, reg_t objp) { Object *obj = segMan->getObject(objp); byte *selectoroffset; int selectors; - SciVersion version = segMan->sciVersion(); // for the selector defines if (!obj) { warning("Applied propertyOffsetToId on non-object at %04x:%04x", PRINT_REG(objp)); @@ -78,11 +77,11 @@ int propertyOffsetToId(SegManager *segMan, int prop_ofs, reg_t objp) { selectors = obj->_variables.size(); - if (segMan->sciVersion() < SCI_VERSION_1_1) + if (getSciVersion() < SCI_VERSION_1_1) selectoroffset = ((byte *)(obj->base_obj)) + SCRIPT_SELECTOR_OFFSET + selectors * 2; else { - if (!(obj->getInfoSelector(version).offset & SCRIPT_INFO_CLASS)) { - obj = segMan->getObject(obj->getSuperClassSelector(version)); + if (!(obj->getInfoSelector().offset & SCRIPT_INFO_CLASS)) { + obj = segMan->getObject(obj->getSuperClassSelector()); selectoroffset = (byte *)obj->base_vars; } else selectoroffset = (byte *)obj->base_vars; @@ -269,7 +268,7 @@ reg_t disassemble(EngineState *s, reg_t pos, int print_bw_tag, int print_bytecod if (opcode == op_callk) { int stackframe = (scr[pos.offset + 2] >> 1) + (scriptState.restAdjust); int argc = ((scriptState.xs->sp)[- stackframe - 1]).offset; - bool oldScriptHeader = (s->segMan->sciVersion() == SCI_VERSION_0_EARLY); + bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY); if (!oldScriptHeader) argc += (scriptState.restAdjust); diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index cb178098b2..76f85f42fe 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -133,18 +133,18 @@ Script *SegManager::allocateScript(int script_nr, SegmentId *seg_id) { void Script::setScriptSize(int script_nr, ResourceManager *resMan) { Resource *script = resMan->findResource(ResourceId(kResourceTypeScript, script_nr), 0); Resource *heap = resMan->findResource(ResourceId(kResourceTypeHeap, script_nr), 0); - bool oldScriptHeader = (_sciVersion == SCI_VERSION_0_EARLY); + bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY); _scriptSize = script->size; _heapSize = 0; // Set later - if (!script || (_sciVersion >= SCI_VERSION_1_1 && !heap)) { + if (!script || (getSciVersion() >= SCI_VERSION_1_1 && !heap)) { error("SegManager::setScriptSize: failed to load %s", !script ? "script" : "heap"); } if (oldScriptHeader) { _bufSize = script->size + READ_LE_UINT16(script->data) * 2; //locals_size = READ_LE_UINT16(script->data) * 2; - } else if (_sciVersion < SCI_VERSION_1_1) { + } else if (getSciVersion() < SCI_VERSION_1_1) { _bufSize = script->size; } else { _bufSize = script->size + heap->size; @@ -240,7 +240,6 @@ SegmentType SegManager::getSegmentType(SegmentId seg) { Object *SegManager::getObject(reg_t pos) { SegmentObj *mobj = getSegmentObj(pos.segment); - SciVersion version = _resMan->sciVersion(); Object *obj = NULL; if (mobj != NULL) { @@ -262,11 +261,10 @@ Object *SegManager::getObject(reg_t pos) { const char *SegManager::getObjectName(reg_t pos) { Object *obj = getObject(pos); - SciVersion version = _resMan->sciVersion(); if (!obj) return "<no such object>"; - reg_t nameReg = obj->getNameSelector(version); + reg_t nameReg = obj->getNameSelector(); if (nameReg.isNull()) return "<no name>"; @@ -312,7 +310,7 @@ int Script::relocateBlock(Common::Array<reg_t> &block, int block_location, Segme return 0; } block[idx].segment = segment; // Perform relocation - if (_sciVersion >= SCI_VERSION_1_1) + if (getSciVersion() >= SCI_VERSION_1_1) block[idx].offset += _scriptSize; return 1; @@ -461,7 +459,6 @@ reg_t SegManager::getClassAddress(int classnr, ScriptLoadType lock, reg_t caller Object *Script::scriptObjInit0(reg_t obj_pos) { Object *obj; - SciVersion version = _sciVersion; // for the offset defines uint base = obj_pos.offset - SCRIPT_OBJECT_MAGIC_OFFSET; VERIFY(base < _bufSize, "Attempt to initialize object beyond end of script\n"); @@ -554,7 +551,7 @@ Object *Script::scriptObjInit11(reg_t obj_pos) { } Object *Script::scriptObjInit(reg_t obj_pos) { - if (_sciVersion < SCI_VERSION_1_1) + if (getSciVersion() < SCI_VERSION_1_1) return scriptObjInit0(obj_pos); else return scriptObjInit11(obj_pos); @@ -598,7 +595,7 @@ void SegManager::scriptInitialiseLocals(reg_t location) { VERIFY(location.offset + 1 < (uint16)scr->_bufSize, "Locals beyond end of script\n"); - if (_resMan->sciVersion() >= SCI_VERSION_1_1) + if (getSciVersion() >= SCI_VERSION_1_1) count = READ_LE_UINT16(scr->_buf + location.offset - 2); else count = (READ_LE_UINT16(scr->_buf + location.offset - 2) - 4) >> 1; @@ -640,7 +637,6 @@ void SegManager::scriptRelocateExportsSci11(SegmentId seg) { void SegManager::scriptInitialiseObjectsSci11(SegmentId seg) { Script *scr = getScript(seg); byte *seeker = scr->_heapStart + 4 + READ_LE_UINT16(scr->_heapStart + 2) * 2; - SciVersion version = _resMan->sciVersion(); // for the selector defines while (READ_LE_UINT16(seeker) == SCRIPT_OBJECT_MAGIC_NUMBER) { if (READ_LE_UINT16(seeker + 14) & SCRIPT_INFO_CLASS) { @@ -679,7 +675,7 @@ void SegManager::scriptInitialiseObjectsSci11(SegmentId seg) { // Copy base from species class, as we need its selector IDs obj->setSuperClassSelector( - getClassAddress(obj->getSuperClassSelector(version).offset, SCRIPT_GET_LOCK, NULL_REG), version); + getClassAddress(obj->getSuperClassSelector().offset, SCRIPT_GET_LOCK, NULL_REG)); // Set the -classScript- selector to the script number. // FIXME: As this selector is filled in at run-time, it is likely @@ -783,8 +779,6 @@ Clone *SegManager::allocateClone(reg_t *addr) { } void SegManager::reconstructClones() { - SciVersion version = sciVersion(); // for the selector defines - for (uint i = 0; i < _heap.size(); i++) { if (_heap[i]) { SegmentObj *mobj = _heap[i]; @@ -809,7 +803,7 @@ void SegManager::reconstructClones() { continue; CloneTable::Entry &seeker = ct->_table[j]; - base_obj = getObject(seeker.getSpeciesSelector(version)); + base_obj = getObject(seeker.getSpeciesSelector()); if (!base_obj) { warning("Clone entry without a base class: %d", j); seeker.base = NULL; diff --git a/engines/sci/engine/seg_manager.h b/engines/sci/engine/seg_manager.h index 5e45e3c4f6..6fec14a3dd 100644 --- a/engines/sci/engine/seg_manager.h +++ b/engines/sci/engine/seg_manager.h @@ -355,8 +355,6 @@ public: void scriptRelocateExportsSci11(SegmentId seg); void scriptInitialiseObjectsSci11(SegmentId seg); - SciVersion sciVersion() { return _resMan->sciVersion(); } - public: // TODO: make private Common::Array<SegmentObj *> _heap; Common::Array<Class> _classtable; /**< Table of all classes */ diff --git a/engines/sci/engine/segment.cpp b/engines/sci/engine/segment.cpp index b072c2d380..7969969ec3 100644 --- a/engines/sci/engine/segment.cpp +++ b/engines/sci/engine/segment.cpp @@ -119,8 +119,6 @@ void Script::freeScript() { } bool Script::init(int script_nr, ResourceManager *resMan) { - _sciVersion = resMan->sciVersion(); - setScriptSize(script_nr, resMan); _buf = (byte *)malloc(_bufSize); @@ -147,7 +145,7 @@ bool Script::init(int script_nr, ResourceManager *resMan) { _nr = script_nr; - if (_sciVersion >= SCI_VERSION_1_1) + if (getSciVersion() >= SCI_VERSION_1_1) _heapStart = _buf + _scriptSize; else _heapStart = _buf; @@ -326,7 +324,7 @@ void Script::listAllDeallocatable(SegmentId segId, void *param, NoteCallback not (*note)(param, make_reg(segId, 0)); } -void Script::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback note, SciVersion version) { +void Script::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback note) { if (addr.offset <= _bufSize && addr.offset >= -SCRIPT_OBJECT_MAGIC_OFFSET && RAW_IS_OBJECT(_buf + addr.offset)) { Object *obj = getObject(addr.offset); if (obj) { @@ -348,7 +346,7 @@ void Script::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback not //-------------------- clones -------------------- -void CloneTable::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback note, SciVersion version) { +void CloneTable::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback note) { Clone *clone; // assert(addr.segment == _segId); @@ -401,7 +399,7 @@ reg_t LocalVariables::findCanonicAddress(SegManager *segMan, reg_t addr) { return make_reg(owner_seg, 0); } -void LocalVariables::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback note, SciVersion version) { +void LocalVariables::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback note) { // assert(addr.segment == _segId); for (uint i = 0; i < _locals.size(); i++) @@ -415,7 +413,7 @@ reg_t DataStack::findCanonicAddress(SegManager *segMan, reg_t addr) { return addr; } -void DataStack::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback note, SciVersion version) { +void DataStack::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback note) { fprintf(stderr, "Emitting %d stack entries\n", nr); for (int i = 0; i < nr; i++) (*note)(param, entries[i]); @@ -428,7 +426,7 @@ void ListTable::freeAtAddress(SegManager *segMan, reg_t sub_addr) { freeEntry(sub_addr.offset); } -void ListTable::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback note, SciVersion version) { +void ListTable::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback note) { if (!isValidEntry(addr.offset)) { warning("Invalid list referenced for outgoing references: %04x:%04x", PRINT_REG(addr)); return; @@ -448,7 +446,7 @@ void NodeTable::freeAtAddress(SegManager *segMan, reg_t sub_addr) { freeEntry(sub_addr.offset); } -void NodeTable::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback note, SciVersion version) { +void NodeTable::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback note) { if (!isValidEntry(addr.offset)) { warning("Invalid node referenced for outgoing references: %04x:%04x", PRINT_REG(addr)); return; diff --git a/engines/sci/engine/segment.h b/engines/sci/engine/segment.h index ef8bc28bfb..0c59ad59c5 100644 --- a/engines/sci/engine/segment.h +++ b/engines/sci/engine/segment.h @@ -107,7 +107,7 @@ public: * @param note Invoked for each outgoing reference within the object * Note: This function may also choose to report numbers (segment 0) as adresses */ - virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note, SciVersion version) {} + virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note) {} }; @@ -190,7 +190,7 @@ public: virtual bool isValidOffset(uint16 offset) const; virtual byte *dereference(reg_t pointer, int *size); virtual reg_t findCanonicAddress(SegManager *segMan, reg_t sub_addr); - virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note, SciVersion version); + virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note); virtual void saveLoadWithSerializer(Common::Serializer &ser); }; @@ -210,43 +210,43 @@ struct Object { uint16 *base_vars; /**< Pointer to the varselector area for this object */ Common::Array<reg_t> _variables; - uint16 getVarSelector(uint16 i, SciVersion version) { - if (version < SCI_VERSION_1_1) + uint16 getVarSelector(uint16 i) { + if (getSciVersion() < SCI_VERSION_1_1) return READ_LE_UINT16(base_obj + _variables.size() * 2 + i * 2); else return *(base_vars + i); } - reg_t getSpeciesSelector(SciVersion version) { - return _variables[version < SCI_VERSION_1_1 ? 0 : 5]; + reg_t getSpeciesSelector() { + return _variables[getSciVersion() < SCI_VERSION_1_1 ? 0 : 5]; } - void setSpeciesSelector(reg_t value, SciVersion version) { - _variables[version < SCI_VERSION_1_1 ? 0 : 5] = value; + void setSpeciesSelector(reg_t value) { + _variables[getSciVersion() < SCI_VERSION_1_1 ? 0 : 5] = value; } - reg_t getSuperClassSelector(SciVersion version) { - return _variables[version < SCI_VERSION_1_1 ? 1 : 6]; + reg_t getSuperClassSelector() { + return _variables[getSciVersion() < SCI_VERSION_1_1 ? 1 : 6]; } - void setSuperClassSelector(reg_t value, SciVersion version) { - _variables[version < SCI_VERSION_1_1 ? 1 : 6] = value; + void setSuperClassSelector(reg_t value) { + _variables[getSciVersion() < SCI_VERSION_1_1 ? 1 : 6] = value; } - reg_t getInfoSelector(SciVersion version) { - return _variables[version < SCI_VERSION_1_1 ? 2 : 7]; + reg_t getInfoSelector() { + return _variables[getSciVersion() < SCI_VERSION_1_1 ? 2 : 7]; } - void setInfoSelector(reg_t value, SciVersion version) { - _variables[version < SCI_VERSION_1_1 ? 2 : 7] = value; + void setInfoSelector(reg_t value) { + _variables[getSciVersion() < SCI_VERSION_1_1 ? 2 : 7] = value; } - reg_t getNameSelector(SciVersion version) { - return _variables[version < SCI_VERSION_1_1 ? 3 : 8]; + reg_t getNameSelector() { + return _variables[getSciVersion() < SCI_VERSION_1_1 ? 3 : 8]; } - void setNameSelector(reg_t value, SciVersion version) { - _variables[version < SCI_VERSION_1_1 ? 3 : 8] = value; + void setNameSelector(reg_t value) { + _variables[getSciVersion() < SCI_VERSION_1_1 ? 3 : 8] = value; } reg_t getClassScriptSelector() { @@ -257,18 +257,18 @@ struct Object { _variables[4] = value; } - uint16 getFuncSelector(uint16 i, SciVersion version) { - uint16 offset = (version < SCI_VERSION_1_1) ? i : i * 2 + 1; + uint16 getFuncSelector(uint16 i) { + uint16 offset = (getSciVersion() < SCI_VERSION_1_1) ? i : i * 2 + 1; return READ_LE_UINT16((byte *) (base_method + offset)); } - reg_t getFunction(uint16 i, SciVersion version) { - uint16 offset = (version < SCI_VERSION_1_1) ? methods_nr + 1 + i : i * 2 + 2; + reg_t getFunction(uint16 i) { + uint16 offset = (getSciVersion() < SCI_VERSION_1_1) ? methods_nr + 1 + i : i * 2 + 2; return make_reg(pos.segment, READ_LE_UINT16((byte *) (base_method + offset))); } - bool isClass(SciVersion version) { - return (getInfoSelector(version).offset & SCRIPT_INFO_CLASS); + bool isClass() { + return (getInfoSelector().offset & SCRIPT_INFO_CLASS); } }; @@ -298,8 +298,6 @@ protected: IntMapper *_objIndices; - SciVersion _sciVersion; - public: /** * Table for objects, contains property variables. @@ -328,7 +326,7 @@ public: virtual reg_t findCanonicAddress(SegManager *segMan, reg_t sub_addr); virtual void freeAtAddress(SegManager *segMan, reg_t sub_addr); virtual void listAllDeallocatable(SegmentId segId, void *param, NoteCallback note); - virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note, SciVersion version); + virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note); virtual void saveLoadWithSerializer(Common::Serializer &ser); @@ -484,7 +482,7 @@ public: virtual bool isValidOffset(uint16 offset) const; virtual byte *dereference(reg_t pointer, int *size); virtual reg_t findCanonicAddress(SegManager *segMan, reg_t sub_addr); - virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note, SciVersion version); + virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note); virtual void saveLoadWithSerializer(Common::Serializer &ser); }; @@ -581,7 +579,7 @@ public: /* CloneTable */ struct CloneTable : public Table<Clone> { virtual void freeAtAddress(SegManager *segMan, reg_t sub_addr); - virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note, SciVersion version); + virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note); virtual void saveLoadWithSerializer(Common::Serializer &ser); }; @@ -590,7 +588,7 @@ struct CloneTable : public Table<Clone> { /* NodeTable */ struct NodeTable : public Table<Node> { virtual void freeAtAddress(SegManager *segMan, reg_t sub_addr); - virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note, SciVersion version); + virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note); virtual void saveLoadWithSerializer(Common::Serializer &ser); }; @@ -599,7 +597,7 @@ struct NodeTable : public Table<Node> { /* ListTable */ struct ListTable : public Table<List> { virtual void freeAtAddress(SegManager *segMan, reg_t sub_addr); - virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note, SciVersion version); + virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note); virtual void saveLoadWithSerializer(Common::Serializer &ser); }; diff --git a/engines/sci/engine/state.cpp b/engines/sci/engine/state.cpp index aedbd92319..fbc64d8075 100644 --- a/engines/sci/engine/state.cpp +++ b/engines/sci/engine/state.cpp @@ -183,7 +183,7 @@ kLanguage EngineState::getLanguage() { if (((SciEngine*)g_engine)->getKernel()->_selectorCache.printLang != -1) { lang = (kLanguage)GET_SEL32V(this->game_obj, printLang); - if ((segMan->sciVersion() == SCI_VERSION_1_1) || (lang == K_LANG_NONE)) { + if ((getSciVersion() == SCI_VERSION_1_1) || (lang == K_LANG_NONE)) { // If language is set to none, we use the language from the game detector. // SSCI reads this from resource.cfg (early games do not have a language // setting in resource.cfg, but instead have the secondary language number @@ -335,10 +335,8 @@ SciVersion EngineState::detectSetCursorType() { SciVersion EngineState::detectLofsType() { if (_lofsType == SCI_VERSION_AUTODETECT) { - SciVersion version = segMan->sciVersion(); - // This detection only works (and is only needed) pre-SCI1.1 - if (version >= SCI_VERSION_1_1) { + if (getSciVersion() >= SCI_VERSION_1_1) { _lofsType = SCI_VERSION_1_1; return _lofsType; } @@ -355,7 +353,7 @@ SciVersion EngineState::detectLofsType() { // Check methods of the Game class for lofs operations if (obj) { for (int m = 0; m < obj->methods_nr; m++) { - reg_t fptr = obj->getFunction(m, version); + reg_t fptr = obj->getFunction(m); Script *script = segMan->getScript(fptr.segment); @@ -440,7 +438,7 @@ SciVersion EngineState::detectLofsType() { if (couldBeRel == couldBeAbs) { warning("Lofs detection failed, taking an educated guess"); - if (version >= SCI_VERSION_1_MIDDLE) + if (getSciVersion() >= SCI_VERSION_1_MIDDLE) _lofsType = SCI_VERSION_1_MIDDLE; else _lofsType = SCI_VERSION_0_EARLY; diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 93cd6aa2fb..b114af1034 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -915,7 +915,7 @@ void run_vm(EngineState *s, int restoring) { scriptState.xs->sp -= (opparams[1] >> 1) + 1; - bool oldScriptHeader = (s->segMan->sciVersion() == SCI_VERSION_0_EARLY); + bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY); if (!oldScriptHeader) { scriptState.xs->sp -= scriptState.restAdjust; s->restAdjust = 0; // We just used up the scriptState.restAdjust, remember? @@ -1396,17 +1396,16 @@ void run_vm(EngineState *s, int restoring) { static int _obj_locate_varselector(SegManager *segMan, Object *obj, Selector slc) { // Determines if obj explicitly defines slc as a varselector // Returns -1 if not found - SciVersion version = segMan->sciVersion(); // for the selector defines byte *buf; uint varnum; - if (version < SCI_VERSION_1_1) { + if (getSciVersion() < SCI_VERSION_1_1) { varnum = obj->variable_names_nr; int selector_name_offset = varnum * 2 + SCRIPT_SELECTOR_OFFSET; buf = obj->base_obj + selector_name_offset; } else { - if (!(obj->getInfoSelector(version).offset & SCRIPT_INFO_CLASS)) - obj = segMan->getObject(obj->getSuperClassSelector(version)); + if (!(obj->getInfoSelector().offset & SCRIPT_INFO_CLASS)) + obj = segMan->getObject(obj->getSuperClassSelector()); buf = (byte *)obj->base_vars; varnum = obj->_variables[1].toUint16(); @@ -1419,7 +1418,7 @@ static int _obj_locate_varselector(SegManager *segMan, Object *obj, Selector slc return -1; // Failed } -static int _class_locate_funcselector(Object *obj, Selector slc, SciVersion version) { +static int _class_locate_funcselector(Object *obj, Selector slc) { // Determines if obj is a class and explicitly defines slc as a funcselector // Does NOT say anything about obj's superclasses, i.e. failure may be // returned even if one of the superclasses defines the funcselector. @@ -1427,7 +1426,7 @@ static int _class_locate_funcselector(Object *obj, Selector slc, SciVersion vers int i; for (i = 0; i < funcnum; i++) - if (obj->getFuncSelector(i, version) == slc) // Found it? + if (obj->getFuncSelector(i) == slc) // Found it? return i; // report success return -1; // Failed @@ -1435,22 +1434,21 @@ static int _class_locate_funcselector(Object *obj, Selector slc, SciVersion vers static SelectorType _lookup_selector_function(SegManager *segMan, int seg_id, Object *obj, Selector selector_id, reg_t *fptr) { int index; - SciVersion version = segMan->sciVersion(); // for the selector defines // "recursive" lookup while (obj) { - index = _class_locate_funcselector(obj, selector_id, version); + index = _class_locate_funcselector(obj, selector_id); if (index >= 0) { if (fptr) { - *fptr = obj->getFunction(index, version); + *fptr = obj->getFunction(index); } return kSelectorMethod; } else { - seg_id = obj->getSuperClassSelector(version).segment; - obj = segMan->getObject(obj->getSuperClassSelector(version)); + seg_id = obj->getSuperClassSelector().segment; + obj = segMan->getObject(obj->getSuperClassSelector()); } } @@ -1461,8 +1459,7 @@ SelectorType lookup_selector(SegManager *segMan, reg_t obj_location, Selector se Object *obj = segMan->getObject(obj_location); Object *species; int index; - SciVersion version = segMan->sciVersion(); // for the selector defines - bool oldScriptHeader = (version == SCI_VERSION_0_EARLY); + bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY); // Early SCI versions used the LSB in the selector ID as a read/write // toggle, meaning that we must remove it for selector lookup. @@ -1474,15 +1471,15 @@ SelectorType lookup_selector(SegManager *segMan, reg_t obj_location, Selector se PRINT_REG(obj_location)); } - if (obj->isClass(version)) + if (obj->isClass()) species = obj; else - species = segMan->getObject(obj->getSpeciesSelector(version)); + species = segMan->getObject(obj->getSpeciesSelector()); if (!obj) { error("lookup_selector(): Error while looking up Species class.\nOriginal address was %04x:%04x. Species address was %04x:%04x", - PRINT_REG(obj_location), PRINT_REG(obj->getSpeciesSelector(version))); + PRINT_REG(obj_location), PRINT_REG(obj->getSpeciesSelector())); return kSelectorNone; } @@ -1688,14 +1685,14 @@ int script_instantiate_sci0(ResourceManager *resMan, SegManager *segMan, int scr Object *base_obj; // Instantiate the superclass, if neccessary - obj->setSpeciesSelector(INST_LOOKUP_CLASS(obj->getSpeciesSelector(version).offset), version); + obj->setSpeciesSelector(INST_LOOKUP_CLASS(obj->getSpeciesSelector().offset)); - base_obj = segMan->getObject(obj->getSpeciesSelector(version)); + base_obj = segMan->getObject(obj->getSpeciesSelector()); obj->variable_names_nr = base_obj->_variables.size(); obj->base_obj = base_obj->base_obj; // Copy base from species class, as we need its selector IDs - obj->setSuperClassSelector(INST_LOOKUP_CLASS(obj->getSuperClassSelector(version).offset), version); + obj->setSuperClassSelector(INST_LOOKUP_CLASS(obj->getSuperClassSelector().offset)); } // if object or class break; case SCI_OBJ_POINTERS: // A relocation table @@ -1758,11 +1755,10 @@ int script_instantiate(ResourceManager *resMan, SegManager *segMan, int script_n } void script_uninstantiate_sci0(SegManager *segMan, int script_nr, SegmentId seg) { - bool oldScriptHeader = (segMan->sciVersion() == SCI_VERSION_0_EARLY); + bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY); reg_t reg = make_reg(seg, oldScriptHeader ? 2 : 0); int objtype, objlength; Script *scr = segMan->getScript(seg); - SciVersion version = segMan->sciVersion(); // Make a pass over the object in order uninstantiate all superclasses objlength = 0; @@ -1823,7 +1819,7 @@ void script_uninstantiate(SegManager *segMan, int script_nr) { if (segMan->_classtable[i].reg.segment == segment) segMan->_classtable[i].reg = NULL_REG; - if (segMan->sciVersion() < SCI_VERSION_1_1) + if (getSciVersion() < SCI_VERSION_1_1) script_uninstantiate_sci0(segMan, script_nr, segment); else warning("FIXME: Add proper script uninstantiation for SCI 1.1"); diff --git a/engines/sci/engine/vm.h b/engines/sci/engine/vm.h index fa1b4f8817..f712193753 100644 --- a/engines/sci/engine/vm.h +++ b/engines/sci/engine/vm.h @@ -67,10 +67,10 @@ class ResourceManager; #define SCRIPT_FUNCTAREAPTR_MAGIC 8 -8 /** Offset of the name pointer */ -#define SCRIPT_NAME_OFFSET (version < SCI_VERSION_1_1 ? 14 -8 : 16) +#define SCRIPT_NAME_OFFSET (getSciVersion() < SCI_VERSION_1_1 ? 14 -8 : 16) /** Object-relative offset of the -info- selector */ -#define SCRIPT_INFO_OFFSET (version < SCI_VERSION_1_1 ? 12 -8 : 14) +#define SCRIPT_INFO_OFFSET (getSciVersion() < SCI_VERSION_1_1 ? 12 -8 : 14) /** Flag fo the -info- selector */ #define SCRIPT_INFO_CLONE 0x0001 @@ -82,12 +82,12 @@ class ResourceManager; /** Magical object identifier */ #define SCRIPT_OBJECT_MAGIC_NUMBER 0x1234 /** Offset of this identifier */ -#define SCRIPT_OBJECT_MAGIC_OFFSET (version < SCI_VERSION_1_1 ? -8 : 0) +#define SCRIPT_OBJECT_MAGIC_OFFSET (getSciVersion() < SCI_VERSION_1_1 ? -8 : 0) /** Script-relative offset of the species ID */ #define SCRIPT_SPECIES_OFFSET 8 -8 -#define SCRIPT_SUPERCLASS_OFFSET (version < SCI_VERSION_1_1 ? 10 -8 : 12) +#define SCRIPT_SUPERCLASS_OFFSET (getSciVersion() < SCI_VERSION_1_1 ? 10 -8 : 12) /** Magic adjustment value for lofsa and lofss */ #define SCRIPT_LOFS_MAGIC 3 diff --git a/engines/sci/sci.h b/engines/sci/sci.h index 3de7e6a86c..6f7eb90c6a 100644 --- a/engines/sci/sci.h +++ b/engines/sci/sci.h @@ -137,6 +137,14 @@ private: Console *_console; }; +/** + * Convenience function to obtain the active SCI version. + */ +inline static SciVersion getSciVersion() { + return ((SciEngine*)g_engine)->getVersion(); +} + + } // End of namespace Sci #endif // SCI_H |