[Scummvm-cvs-logs] SF.net SVN: scummvm:[44170] scummvm/trunk/engines/sci

fingolfin at users.sourceforge.net fingolfin at users.sourceforge.net
Thu Sep 17 18:50:53 CEST 2009


Revision: 44170
          http://scummvm.svn.sourceforge.net/scummvm/?rev=44170&view=rev
Author:   fingolfin
Date:     2009-09-17 16:50:53 +0000 (Thu, 17 Sep 2009)

Log Message:
-----------
SCI: Add a global getSciVersion() function and make use of it

Modified Paths:
--------------
    scummvm/trunk/engines/sci/console.cpp
    scummvm/trunk/engines/sci/engine/gc.cpp
    scummvm/trunk/engines/sci/engine/kernel.cpp
    scummvm/trunk/engines/sci/engine/kgraphics.cpp
    scummvm/trunk/engines/sci/engine/kmovement.cpp
    scummvm/trunk/engines/sci/engine/kscripts.cpp
    scummvm/trunk/engines/sci/engine/savegame.cpp
    scummvm/trunk/engines/sci/engine/scriptdebug.cpp
    scummvm/trunk/engines/sci/engine/seg_manager.cpp
    scummvm/trunk/engines/sci/engine/seg_manager.h
    scummvm/trunk/engines/sci/engine/segment.cpp
    scummvm/trunk/engines/sci/engine/segment.h
    scummvm/trunk/engines/sci/engine/state.cpp
    scummvm/trunk/engines/sci/engine/vm.cpp
    scummvm/trunk/engines/sci/engine/vm.h
    scummvm/trunk/engines/sci/sci.h

Modified: scummvm/trunk/engines/sci/console.cpp
===================================================================
--- scummvm/trunk/engines/sci/console.cpp	2009-09-17 16:49:31 UTC (rev 44169)
+++ scummvm/trunk/engines/sci/console.cpp	2009-09-17 16:50:53 UTC (rev 44170)
@@ -1649,7 +1649,7 @@
 	}
 
 	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 @@
 	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 @@
 	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 @@
 	}
 	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);

Modified: scummvm/trunk/engines/sci/engine/gc.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/gc.cpp	2009-09-17 16:49:31 UTC (rev 44169)
+++ scummvm/trunk/engines/sci/engine/gc.cpp	2009-09-17 16:50:53 UTC (rev 44170)
@@ -134,7 +134,7 @@
 		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);
 		}
 	}
 

Modified: scummvm/trunk/engines/sci/engine/kernel.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kernel.cpp	2009-09-17 16:49:31 UTC (rev 44169)
+++ scummvm/trunk/engines/sci/engine/kernel.cpp	2009-09-17 16:50:53 UTC (rev 44170)
@@ -643,8 +643,6 @@
 	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

Modified: scummvm/trunk/engines/sci/engine/kgraphics.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kgraphics.cpp	2009-09-17 16:49:31 UTC (rev 44169)
+++ scummvm/trunk/engines/sci/engine/kgraphics.cpp	2009-09-17 16:50:53 UTC (rev 44170)
@@ -669,7 +669,7 @@
 	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 @@
 	// 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 @@
 	 */
 	// 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);
 	}
 

Modified: scummvm/trunk/engines/sci/engine/kmovement.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kmovement.cpp	2009-09-17 16:49:31 UTC (rev 44169)
+++ scummvm/trunk/engines/sci/engine/kmovement.cpp	2009-09-17 16:50:53 UTC (rev 44170)
@@ -276,7 +276,7 @@
 		}
 
 		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");

Modified: scummvm/trunk/engines/sci/engine/kscripts.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kscripts.cpp	2009-09-17 16:49:31 UTC (rev 44169)
+++ scummvm/trunk/engines/sci/engine/kscripts.cpp	2009-09-17 16:50:53 UTC (rev 44170)
@@ -201,13 +201,11 @@
 	*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 @@
 		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;

Modified: scummvm/trunk/engines/sci/engine/savegame.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/savegame.cpp	2009-09-17 16:49:31 UTC (rev 44169)
+++ scummvm/trunk/engines/sci/engine/savegame.cpp	2009-09-17 16:50:53 UTC (rev 44170)
@@ -554,7 +554,6 @@
 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 @@
 						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();

Modified: scummvm/trunk/engines/sci/engine/scriptdebug.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/scriptdebug.cpp	2009-09-17 16:49:31 UTC (rev 44169)
+++ scummvm/trunk/engines/sci/engine/scriptdebug.cpp	2009-09-17 16:50:53 UTC (rev 44170)
@@ -69,7 +69,6 @@
 	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 @@
 
 	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 @@
 		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);

Modified: scummvm/trunk/engines/sci/engine/seg_manager.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/seg_manager.cpp	2009-09-17 16:49:31 UTC (rev 44169)
+++ scummvm/trunk/engines/sci/engine/seg_manager.cpp	2009-09-17 16:50:53 UTC (rev 44170)
@@ -133,18 +133,18 @@
 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 @@
 
 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 @@
 
 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 @@
 		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 @@
 
 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::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 @@
 
 	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::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 @@
 
 		// 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 @@
 }
 
 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 @@
 						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;

Modified: scummvm/trunk/engines/sci/engine/seg_manager.h
===================================================================
--- scummvm/trunk/engines/sci/engine/seg_manager.h	2009-09-17 16:49:31 UTC (rev 44169)
+++ scummvm/trunk/engines/sci/engine/seg_manager.h	2009-09-17 16:50:53 UTC (rev 44170)
@@ -355,8 +355,6 @@
 	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 */

Modified: scummvm/trunk/engines/sci/engine/segment.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/segment.cpp	2009-09-17 16:49:31 UTC (rev 44169)
+++ scummvm/trunk/engines/sci/engine/segment.cpp	2009-09-17 16:50:53 UTC (rev 44170)
@@ -119,8 +119,6 @@
 }
 
 bool Script::init(int script_nr, ResourceManager *resMan) {
-	_sciVersion = resMan->sciVersion();
-
 	setScriptSize(script_nr, resMan);
 
 	_buf = (byte *)malloc(_bufSize);
@@ -147,7 +145,7 @@
 
 	_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 @@
 	(*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 @@
 
 //-------------------- 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 @@
 	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 @@
 	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 @@
 	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 @@
 	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;

Modified: scummvm/trunk/engines/sci/engine/segment.h
===================================================================
--- scummvm/trunk/engines/sci/engine/segment.h	2009-09-17 16:49:31 UTC (rev 44169)
+++ scummvm/trunk/engines/sci/engine/segment.h	2009-09-17 16:50:53 UTC (rev 44170)
@@ -107,7 +107,7 @@
 	 * @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 @@
 	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 @@
 	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 @@
 		_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 @@
 
 	IntMapper *_objIndices;
 
-	SciVersion _sciVersion;
-
 public:
 	/**
 	 * Table for objects, contains property variables.
@@ -328,7 +326,7 @@
 	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 @@
 	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 @@
 /* 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 @@
 /* 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 @@
 /* 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);
 };

Modified: scummvm/trunk/engines/sci/engine/state.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/state.cpp	2009-09-17 16:49:31 UTC (rev 44169)
+++ scummvm/trunk/engines/sci/engine/state.cpp	2009-09-17 16:50:53 UTC (rev 44170)
@@ -183,7 +183,7 @@
 	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::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 @@
 		// 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 @@
 		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;

Modified: scummvm/trunk/engines/sci/engine/vm.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/vm.cpp	2009-09-17 16:49:31 UTC (rev 44169)
+++ scummvm/trunk/engines/sci/engine/vm.cpp	2009-09-17 16:50:53 UTC (rev 44170)
@@ -915,7 +915,7 @@
 
 			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 @@
 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 @@
 	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 @@
 	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 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 @@
 	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 @@
 				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 @@
 			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 @@
 }
 
 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 @@
 		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");

Modified: scummvm/trunk/engines/sci/engine/vm.h
===================================================================
--- scummvm/trunk/engines/sci/engine/vm.h	2009-09-17 16:49:31 UTC (rev 44169)
+++ scummvm/trunk/engines/sci/engine/vm.h	2009-09-17 16:50:53 UTC (rev 44170)
@@ -67,10 +67,10 @@
 #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 @@
 /** 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

Modified: scummvm/trunk/engines/sci/sci.h
===================================================================
--- scummvm/trunk/engines/sci/sci.h	2009-09-17 16:49:31 UTC (rev 44169)
+++ scummvm/trunk/engines/sci/sci.h	2009-09-17 16:50:53 UTC (rev 44170)
@@ -137,6 +137,14 @@
 	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


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list