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

thebluegr at users.sourceforge.net thebluegr at users.sourceforge.net
Sun Oct 11 15:46:59 CEST 2009


Revision: 44921
          http://scummvm.svn.sourceforge.net/scummvm/?rev=44921&view=rev
Author:   thebluegr
Date:     2009-10-11 13:46:58 +0000 (Sun, 11 Oct 2009)

Log Message:
-----------
More work on the Object class

Modified Paths:
--------------
    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/segment.h
    scummvm/trunk/engines/sci/engine/selector.cpp
    scummvm/trunk/engines/sci/engine/vm.cpp

Modified: scummvm/trunk/engines/sci/engine/savegame.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/savegame.cpp	2009-10-11 13:44:19 UTC (rev 44920)
+++ scummvm/trunk/engines/sci/engine/savegame.cpp	2009-10-11 13:46:58 UTC (rev 44921)
@@ -613,7 +613,7 @@
 		const ObjMap::iterator end = scr->_objects.end();
 		for (it = scr->_objects.begin(); it != end; ++it) {
 			byte *data = scr->_buf + it->_value.getPos().offset;
-			it->_value.base_obj = data;
+			it->_value._baseObj = data;
 		}
 	}
 
@@ -634,24 +634,24 @@
 				uint16 *funct_area = (uint16 *)(scr->_buf + READ_LE_UINT16( data + 6 ));
 				uint16 *prop_area = (uint16 *)(scr->_buf + READ_LE_UINT16( data + 4 ));
 
-				it->_value.base_method = funct_area;
-				it->_value.base_vars = prop_area;
+				it->_value._baseMethod = funct_area;
+				it->_value._baseVars = prop_area;
 			} else {
 				int funct_area = READ_LE_UINT16(data + SCRIPT_FUNCTAREAPTR_OFFSET);
-				Object *base_obj;
+				Object *_baseObj;
 
-				base_obj = s->_segMan->getObject(it->_value.getSpeciesSelector());
+				_baseObj = s->_segMan->getObject(it->_value.getSpeciesSelector());
 
-				if (!base_obj) {
+				if (!_baseObj) {
 					warning("Object without a base class: Script %d, index %d (reg address %04x:%04x",
 						  scr->_nr, i, PRINT_REG(it->_value.getSpeciesSelector()));
 					continue;
 				}
-				it->_value.setVarCount(base_obj->getVarCount());
-				it->_value.base_obj = base_obj->base_obj;
+				it->_value.setVarCount(_baseObj->getVarCount());
+				it->_value._baseObj = _baseObj->_baseObj;
 
-				it->_value.base_method = (uint16 *)(data + funct_area);
-				it->_value.base_vars = (uint16 *)(data + it->_value.getVarCount() * 2 + SCRIPT_SELECTOR_OFFSET);
+				it->_value._baseMethod = (uint16 *)(data + funct_area);
+				it->_value._baseVars = (uint16 *)(data + it->_value.getVarCount() * 2 + SCRIPT_SELECTOR_OFFSET);
 			}
 		}
 	}

Modified: scummvm/trunk/engines/sci/engine/scriptdebug.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/scriptdebug.cpp	2009-10-11 13:44:19 UTC (rev 44920)
+++ scummvm/trunk/engines/sci/engine/scriptdebug.cpp	2009-10-11 13:46:58 UTC (rev 44921)
@@ -78,13 +78,13 @@
 	selectors = obj->getVarCount();
 
 	if (getSciVersion() < SCI_VERSION_1_1)
-		selectoroffset = ((byte *)(obj->base_obj)) + SCRIPT_SELECTOR_OFFSET + selectors * 2;
+		selectoroffset = ((byte *)(obj->_baseObj)) + SCRIPT_SELECTOR_OFFSET + selectors * 2;
 	else {
 		if (!(obj->getInfoSelector().offset & SCRIPT_INFO_CLASS)) {
 			obj = segMan->getObject(obj->getSuperClassSelector());
-			selectoroffset = (byte *)obj->base_vars;
+			selectoroffset = (byte *)obj->_baseVars;
 		} else
-			selectoroffset = (byte *)obj->base_vars;
+			selectoroffset = (byte *)obj->_baseVars;
 	}
 
 	if (prop_ofs < 0 || (prop_ofs >> 1) >= selectors) {

Modified: scummvm/trunk/engines/sci/engine/seg_manager.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/seg_manager.cpp	2009-10-11 13:44:19 UTC (rev 44920)
+++ scummvm/trunk/engines/sci/engine/seg_manager.cpp	2009-10-11 13:46:58 UTC (rev 44921)
@@ -242,6 +242,8 @@
 			CloneTable *ct = (CloneTable *)mobj;
 			if (ct->isValidEntry(pos.offset))
 				obj = &(ct->_table[pos.offset]);
+			else
+				warning("getObject(): Trying to get an invalid object");
 		} else if (mobj->getType() == SEG_TYPE_SCRIPT) {
 			Script *scr = (Script *)mobj;
 			if (pos.offset <= scr->_bufSize && pos.offset >= -SCRIPT_OBJECT_MAGIC_OFFSET
@@ -658,9 +660,9 @@
 #if 0
 		if (obj->_variables[5].offset != 0xffff) {
 			obj->_variables[5] = INST_LOOKUP_CLASS(obj->_variables[5].offset);
-			base_obj = getObject(obj->_variables[5]);
-			obj->variable_names_nr = base_obj->variables_nr;
-			obj->base_obj = base_obj->base_obj;
+			_baseObj = getObject(obj->_variables[5]);
+			obj->variable_names_nr = _baseObj->variables_nr;
+			obj->_baseObj = _baseObj->_baseObj;
 		}
 #endif
 
@@ -769,8 +771,6 @@
 				CloneTable *ct = (CloneTable *)mobj;
 
 				for (uint j = 0; j < ct->_table.size(); j++) {
-					Object *base_obj;
-
 					// Check if the clone entry is used
 					uint entryNum = (uint)ct->first_free;
 					bool isUsed = true;
@@ -786,17 +786,10 @@
 						continue;
 
 					CloneTable::Entry &seeker = ct->_table[j];
-					base_obj = getObject(seeker.getSpeciesSelector());
-					if (!base_obj) {
+					Object *_baseObj = getObject(seeker.getSpeciesSelector());
+					seeker.cloneFromObject(_baseObj);
+					if (!_baseObj)
 						warning("Clone entry without a base class: %d", j);
-						seeker.base_obj = NULL;
-						seeker.base_vars = NULL;
-						seeker.base_method = NULL;
-					} else {
-						seeker.base_obj = base_obj->base_obj;
-						seeker.base_vars = base_obj->base_vars;
-						seeker.base_method = base_obj->base_method;
-					}
 				}	// end for
 			}	// end if
 		}	// end if

Modified: scummvm/trunk/engines/sci/engine/segment.h
===================================================================
--- scummvm/trunk/engines/sci/engine/segment.h	2009-10-11 13:44:19 UTC (rev 44920)
+++ scummvm/trunk/engines/sci/engine/segment.h	2009-10-11 13:46:58 UTC (rev 44921)
@@ -217,16 +217,16 @@
 	reg_t getClassScriptSelector() { return _variables[4]; }
 	void setClassScriptSelector(reg_t value) { _variables[4] = value; }
 
-	Selector 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);
+	Selector getVarSelector(uint16 i) { return *(_baseVars + i); }
+
+	reg_t getFunction(uint16 i) {
+		uint16 offset = (getSciVersion() < SCI_VERSION_1_1) ? _methodCount + 1 + i : i * 2 + 2;
+		return make_reg(_pos.segment, READ_LE_UINT16((byte *) (_baseMethod + offset)));
 	}
 
 	Selector getFuncSelector(uint16 i) {
 		uint16 offset = (getSciVersion() < SCI_VERSION_1_1) ? i : i * 2 + 1;
-		return READ_LE_UINT16((byte *) (base_method + offset));
+		return READ_LE_UINT16((byte *) (_baseMethod + offset));
 	}
 
 	/**
@@ -243,11 +243,6 @@
 		return -1;
 	}
 
-	reg_t getFunction(uint16 i) {
-		uint16 offset = (getSciVersion() < SCI_VERSION_1_1) ? _methodCount + 1 + i : i * 2 + 2;
-		return make_reg(_pos.segment, READ_LE_UINT16((byte *) (base_method + offset)));
-	}
-
 	bool isClass() { return (getInfoSelector().offset & SCRIPT_INFO_CLASS);	}
 
 	void markAsFreed() { _flags |= OBJECT_FLAG_FREED; }
@@ -258,19 +253,19 @@
 
 	void init(byte *buf, reg_t obj_pos) {
 		byte *data = (byte *)(buf + obj_pos.offset);
-		base_obj = data;
+		_baseObj = data;
 		_pos = obj_pos;
 
 		if (getSciVersion() < SCI_VERSION_1_1) {
-			setVarCount(READ_LE_UINT16(data + SCRIPT_SELECTORCTR_OFFSET));
-			base_vars = 0;
-			base_method = (uint16 *)(data + READ_LE_UINT16(data + SCRIPT_FUNCTAREAPTR_OFFSET));
-			_methodCount = READ_LE_UINT16(base_method - 1);
+			_variables.resize(READ_LE_UINT16(data + SCRIPT_SELECTORCTR_OFFSET));
+			_baseVars = (uint16 *)(_baseObj + _variables.size() * 2);
+			_baseMethod = (uint16 *)(data + READ_LE_UINT16(data + SCRIPT_FUNCTAREAPTR_OFFSET));
+			_methodCount = READ_LE_UINT16(_baseMethod - 1);
 		} else {
-			setVarCount(READ_LE_UINT16(data + 2));
-			base_vars = (uint16 *)(buf + READ_LE_UINT16(data + 4));
-			base_method = (uint16 *)(buf + READ_LE_UINT16(data + 6));
-			_methodCount = READ_LE_UINT16(base_method);
+			_variables.resize(READ_LE_UINT16(data + 2));
+			_baseVars = (uint16 *)(buf + READ_LE_UINT16(data + 4));
+			_baseMethod = (uint16 *)(buf + READ_LE_UINT16(data + 6));
+			_methodCount = READ_LE_UINT16(_baseMethod);
 		}
 
 		for (uint i = 0; i < _variables.size(); i++)
@@ -284,13 +279,17 @@
 
 	void saveLoadWithSerializer(Common::Serializer &ser);
 
-	// TODO: make private. Used by validate_property(), ObjVarRef::getPointer and Script::relocateObject
-	Common::Array<reg_t> _variables;
+	void cloneFromObject(Object *obj) {
+		_baseObj = obj ? obj->_baseObj : NULL;
+		_baseMethod = obj ? obj->_baseMethod : NULL;
+		_baseVars = obj ? obj->_baseVars : NULL;
+	}
 
 	// TODO: make private
-	byte *base_obj; /**< base + object offset within base */
-	uint16 *base_method; /**< Pointer to the method selector area for this object */
-	uint16 *base_vars; /**< Pointer to the varselector area for this object */
+	Common::Array<reg_t> _variables;
+	byte *_baseObj; /**< base + object offset within base */
+	uint16 *_baseVars; /**< Pointer to the varselector area for this object */
+	uint16 *_baseMethod; /**< Pointer to the method selector area for this object */
 
 private:
 	uint16 _methodCount;

Modified: scummvm/trunk/engines/sci/engine/selector.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/selector.cpp	2009-10-11 13:44:19 UTC (rev 44920)
+++ scummvm/trunk/engines/sci/engine/selector.cpp	2009-10-11 13:46:58 UTC (rev 44921)
@@ -106,12 +106,12 @@
 	if (getSciVersion() < SCI_VERSION_1_1) {
 		varnum = obj->getVarCount();
 		int selector_name_offset = varnum * 2 + SCRIPT_SELECTOR_OFFSET;
-		buf = obj->base_obj + selector_name_offset;
+		buf = obj->_baseObj + selector_name_offset;
 	} else {
 		if (!(obj->getInfoSelector().offset & SCRIPT_INFO_CLASS))
 			obj = segMan->getObject(obj->getSuperClassSelector());
 
-		buf = (byte *)obj->base_vars;
+		buf = (byte *)obj->_baseVars;
 		varnum = obj->getVariable(1).toUint16();
 	}
 

Modified: scummvm/trunk/engines/sci/engine/vm.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/vm.cpp	2009-10-11 13:44:19 UTC (rev 44920)
+++ scummvm/trunk/engines/sci/engine/vm.cpp	2009-10-11 13:46:58 UTC (rev 44921)
@@ -1592,14 +1592,13 @@
 		case SCI_OBJ_OBJECT:
 		case SCI_OBJ_CLASS: { // object or class?
 			Object *obj = scr->scriptObjInit(addr);
-			Object *base_obj;
 
 			// Instantiate the superclass, if neccessary
 			obj->setSpeciesSelector(INST_LOOKUP_CLASS(obj->getSpeciesSelector().offset));
 
-			base_obj = segMan->getObject(obj->getSpeciesSelector());
-			obj->setVarCount(base_obj->getVarCount());
-			obj->base_obj = base_obj->base_obj;
+			Object *_baseObj = segMan->getObject(obj->getSpeciesSelector());
+			obj->setVarCount(_baseObj->getVarCount());
+			obj->_baseObj = _baseObj->_baseObj;
 			// Copy base from species class, as we need its selector IDs
 
 			obj->setSuperClassSelector(INST_LOOKUP_CLASS(obj->getSuperClassSelector().offset));


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