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

thebluegr at users.sourceforge.net thebluegr at users.sourceforge.net
Wed Nov 17 10:10:46 CET 2010


Revision: 54281
          http://scummvm.svn.sourceforge.net/scummvm/?rev=54281&view=rev
Author:   thebluegr
Date:     2010-11-17 09:10:43 +0000 (Wed, 17 Nov 2010)

Log Message:
-----------
SCI: Added the SCI3 equivalent of initialiseObjects(), from a patch by lskovlun

Modified Paths:
--------------
    scummvm/trunk/engines/sci/console.cpp
    scummvm/trunk/engines/sci/engine/script.cpp
    scummvm/trunk/engines/sci/engine/script.h

Modified: scummvm/trunk/engines/sci/console.cpp
===================================================================
--- scummvm/trunk/engines/sci/console.cpp	2010-11-17 08:53:02 UTC (rev 54280)
+++ scummvm/trunk/engines/sci/console.cpp	2010-11-17 09:10:43 UTC (rev 54281)
@@ -3670,7 +3670,7 @@
 	DebugPrintf("[%04x:%04x] %s : %3d vars, %3d methods\n", PRINT_REG(pos), s->_segMan->getObjectName(pos),
 				obj->getVarCount(), obj->getMethodCount());
 
-	if (!obj->isClass())
+	if (!obj->isClass() && getSciVersion() != SCI_VERSION_3)
 		var_container = s->_segMan->getObject(obj->getSuperClassSelector());
 	DebugPrintf("  -- member variables:\n");
 	for (i = 0; (uint)i < obj->getVarCount(); i++) {

Modified: scummvm/trunk/engines/sci/engine/script.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/script.cpp	2010-11-17 08:53:02 UTC (rev 54280)
+++ scummvm/trunk/engines/sci/engine/script.cpp	2010-11-17 09:10:43 UTC (rev 54281)
@@ -566,13 +566,39 @@
 	relocate(make_reg(segmentId, READ_SCI11ENDIAN_UINT16(_heapStart)));
 }
 
+void Script::initialiseObjectsSci3(SegManager *segMan, SegmentId segmentId) {
+	const byte *seeker = _buf;
+
+	// SCI3 local variables always start dword-aligned
+	if (_numExports % 2)
+		seeker = _buf + 22 + _numExports * 2;
+	else
+		seeker = _buf + 24 + _numExports * 2;
+
+	// SCI3 object structures always start dword-aligned
+	if (_localsCount % 2)
+		seeker = seeker + 2 + _localsCount * 2;
+	else
+		seeker = seeker + _localsCount * 2;
+
+	while (READ_SCI11ENDIAN_UINT16(seeker) == SCRIPT_OBJECT_MAGIC_NUMBER) {
+		reg_t reg = make_reg(segmentId, seeker - _buf);
+		Object *obj = scriptObjInit(reg);
+
+		obj->setSuperClassSelector(segMan->getClassAddress(obj->getSuperClassSelector().offset, SCRIPT_GET_LOCK, NULL_REG));
+		seeker += READ_SCI11ENDIAN_UINT16(seeker + 2);
+	}
+
+	relocate(make_reg(segmentId, 0));
+}
+
 void Script::initialiseObjects(SegManager *segMan, SegmentId segmentId) {
 	if (getSciVersion() <= SCI_VERSION_1_LATE)
 		initialiseObjectsSci0(segMan, segmentId);
 	else if (getSciVersion() >= SCI_VERSION_1_1 && getSciVersion() <= SCI_VERSION_2_1)
 		initialiseObjectsSci11(segMan, segmentId);
 	else if (getSciVersion() == SCI_VERSION_3)
-		warning("TODO: initialiseObjects(): SCI3 equivalent");
+		initialiseObjectsSci3(segMan, segmentId);
 }
 
 reg_t Script::findCanonicAddress(SegManager *segMan, reg_t addr) const {

Modified: scummvm/trunk/engines/sci/engine/script.h
===================================================================
--- scummvm/trunk/engines/sci/engine/script.h	2010-11-17 08:53:02 UTC (rev 54280)
+++ scummvm/trunk/engines/sci/engine/script.h	2010-11-17 09:10:43 UTC (rev 54281)
@@ -268,11 +268,18 @@
 	void initialiseObjectsSci0(SegManager *segMan, SegmentId segmentId);
 
 	/**
-	 * Initializes the script's objects (SCI1.1+)
+	 * Initializes the script's objects (SCI1.1 - SCI2.1)
 	 * @param segMan	A reference to the segment manager
 	 * @param segmentId	The script's segment id
 	 */
 	void initialiseObjectsSci11(SegManager *segMan, SegmentId segmentId);
+
+	/**
+	 * Initializes the script's objects (SCI3)
+	 * @param segMan	A reference to the segment manager
+	 * @param segmentId	The script's segment id
+	 */
+	void initialiseObjectsSci3(SegManager *segMan, SegmentId segmentId);
 };
 
 } // End of namespace Sci


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