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

m_kiewitz at users.sourceforge.net m_kiewitz at users.sourceforge.net
Sun Sep 5 17:09:50 CEST 2010


Revision: 52562
          http://scummvm.svn.sourceforge.net/scummvm/?rev=52562&view=rev
Author:   m_kiewitz
Date:     2010-09-05 15:09:50 +0000 (Sun, 05 Sep 2010)

Log Message:
-----------
SCI: merging -info- stuff in Clone/DisposeClone

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-09-05 14:59:09 UTC (rev 52561)
+++ scummvm/trunk/engines/sci/engine/kscripts.cpp	2010-09-05 15:09:50 UTC (rev 52562)
@@ -178,17 +178,13 @@
 	*clone_obj = *parent_obj;
 
 	// Mark as clone
-	clone_obj->markAsClone();
+	clone_obj->markAsClone(); // sets -info- selector
 	clone_obj->setSpeciesSelector(clone_obj->getPos());
 	if (parent_obj->isClass())
 		clone_obj->setSuperClassSelector(parent_obj->getPos());
 	s->_segMan->getScript(parent_obj->getPos().segment)->incrementLockers();
 	s->_segMan->getScript(clone_obj->getPos().segment)->incrementLockers();
 
-	// Mark as clone for scripts as well
-	uint16 infoSelector = readSelectorValue(s->_segMan, clone_addr, SELECTOR(_info_));
-	writeSelectorValue(s->_segMan, clone_addr, SELECTOR(_info_), (infoSelector & 0x7fff) | 1);
-
 	return clone_addr;
 }
 
@@ -204,17 +200,12 @@
 		return s->r_acc;
 	}
 
-	if (!object->isClone()) {
-		// SCI silently ignores non-clones; some games actually depend on it
-		return s->r_acc;
-	}
-
 	// SCI uses this technique to find out, if it's a clone and if it's supposed to get freed
 	//  At least kq4early relies on this behaviour. The scripts clone "Sound", then set bit 1 manually
 	//  and call kDisposeClone later. In that case we may not free it, otherwise we will run into issues
 	//  later, because kIsObject would then return false and Sound object wouldn't get checked.
 	uint16 infoSelector = readSelectorValue(s->_segMan, obj, SELECTOR(_info_));
-	if ((infoSelector & 3) == 1)
+	if ((infoSelector & 3) == kInfoFlagClone)
 		object->markAsFreed();
 
 	return s->r_acc;

Modified: scummvm/trunk/engines/sci/engine/segment.h
===================================================================
--- scummvm/trunk/engines/sci/engine/segment.h	2010-09-05 14:59:09 UTC (rev 52561)
+++ scummvm/trunk/engines/sci/engine/segment.h	2010-09-05 15:09:50 UTC (rev 52562)
@@ -290,7 +290,7 @@
 	bool isClass() const { return (getInfoSelector().offset & kInfoFlagClass); }
 	const Object *getClass(SegManager *segMan) const;
 
-	void markAsClone() { setInfoSelector(make_reg(0, kInfoFlagClone)); }
+	void markAsClone() { setInfoSelector(make_reg(0, getInfoSelector().offset | kInfoFlagClone)); }
 	bool isClone() const { return (getInfoSelector().offset & kInfoFlagClone); }
 
 	void markAsFreed() { _flags |= OBJECT_FLAG_FREED; }


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