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

lskovlun at users.sourceforge.net lskovlun at users.sourceforge.net
Thu Nov 18 18:13:03 CET 2010


Revision: 54328
          http://scummvm.svn.sourceforge.net/scummvm/?rev=54328&view=rev
Author:   lskovlun
Date:     2010-11-18 17:13:01 +0000 (Thu, 18 Nov 2010)

Log Message:
-----------
SCI3: implement setInfoSelector() for SCI3, fixes infinite recursion

Modified Paths:
--------------
    scummvm/trunk/engines/sci/engine/kscripts.cpp
    scummvm/trunk/engines/sci/engine/segment.h

Modified: scummvm/trunk/engines/sci/engine/kscripts.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kscripts.cpp	2010-11-18 17:04:00 UTC (rev 54327)
+++ scummvm/trunk/engines/sci/engine/kscripts.cpp	2010-11-18 17:13:01 UTC (rev 54328)
@@ -103,7 +103,7 @@
 				g_sci->getResMan()->unlockResource(which);
 			else {
 				if (id.getType() == kResourceTypeInvalid)
-					warning("[resMan] Attempt to unlock resource %i of invalid type %i", id.getNumber(), type);
+				  warning("[resMan] Attempt to unlock resource %i of invalid type %i", id.getNumber(), argv[0].toUint16());
 				else
 					// Happens in CD games (e.g. LSL6CD) with the message
 					// resource. It isn't fatal, and it's usually caused
@@ -156,7 +156,7 @@
 	debugC(2, kDebugLevelMemory, "Attempting to clone from %04x:%04x", PRINT_REG(parentAddr));
 
 	// TODO: SCI3 equivalent, SCI3 objects don't have an -info- selector
-	uint16 infoSelector = readSelectorValue(s->_segMan, parentAddr, SELECTOR(_info_));
+	uint16 infoSelector = parentObj->getInfoSelector().offset;
 	cloneObj = s->_segMan->allocateClone(&cloneAddr);
 
 	if (!cloneObj) {
@@ -185,11 +185,7 @@
 
 	// Mark as clone
 	infoSelector &= ~kInfoFlagClass; // remove class bit
-	if (getSciVersion() == SCI_VERSION_3)
-		// TODO: SCI3 equivalent, SCI3 objects don't have an -info- selector
-		warning("TODO: not modifying -info- selector in kClone for SCI3");
-	else
-		writeSelectorValue(s->_segMan, cloneAddr, SELECTOR(_info_), infoSelector | kInfoFlagClone);
+	cloneObj->setInfoSelector(make_reg(0, infoSelector | kInfoFlagClone));
 
 	cloneObj->setSpeciesSelector(cloneObj->getPos());
 	if (parentObj->isClass())

Modified: scummvm/trunk/engines/sci/engine/segment.h
===================================================================
--- scummvm/trunk/engines/sci/engine/segment.h	2010-11-18 17:04:00 UTC (rev 54327)
+++ scummvm/trunk/engines/sci/engine/segment.h	2010-11-18 17:13:01 UTC (rev 54328)
@@ -273,6 +273,13 @@
 			return make_reg(0, READ_SCI11ENDIAN_UINT16(_baseObj + 10));
 	}
 
+	void setInfoSelector(reg_t info) {
+		if (getSciVersion() <= SCI_VERSION_2_1)
+			_variables[_offset + 2] = info;
+		else	// SCI3
+			WRITE_SCI11ENDIAN_UINT16(const_cast<byte*>(_baseObj + 10), info.offset);
+	}
+
 	// No setter for the -info- selector
 
 	reg_t getNameSelector() const {


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