[Scummvm-git-logs] scummvm master -> 9dd63b12b15d08f24b39f17f2334b87d99a2a0ef

bluegr bluegr at gmail.com
Sat Sep 14 10:40:03 CEST 2019


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
9dd63b12b1 SCI: Add more script patcher checks for games without a selector vocab


Commit: 9dd63b12b15d08f24b39f17f2334b87d99a2a0ef
    https://github.com/scummvm/scummvm/commit/9dd63b12b15d08f24b39f17f2334b87d99a2a0ef
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2019-09-14T11:39:35+03:00

Commit Message:
SCI: Add more script patcher checks for games without a selector vocab

Fixes the LSL1 demo

Changed paths:
    engines/sci/engine/object.cpp
    engines/sci/engine/object.h
    engines/sci/engine/script.cpp
    engines/sci/engine/script.h


diff --git a/engines/sci/engine/object.cpp b/engines/sci/engine/object.cpp
index 98069b4..f3bd129 100644
--- a/engines/sci/engine/object.cpp
+++ b/engines/sci/engine/object.cpp
@@ -240,25 +240,29 @@ int Object::propertyOffsetToId(SegManager *segMan, int propertyOffset) const {
 	}
 }
 
-void Object::initSpecies(SegManager *segMan, reg_t addr) {
+void Object::initSpecies(SegManager *segMan, reg_t addr, bool applyScriptPatches) {
 	uint16 speciesOffset = getSpeciesSelector().getOffset();
 
 	if (speciesOffset == 0xffff)		// -1
 		setSpeciesSelector(NULL_REG);	// no species
-	else
-		setSpeciesSelector(segMan->getClassAddress(speciesOffset, SCRIPT_GET_LOCK, addr.getSegment()));
+	else {
+		reg_t species = segMan->getClassAddress(speciesOffset, SCRIPT_GET_LOCK, addr.getSegment(), applyScriptPatches);
+		setSpeciesSelector(species);
+	}
 }
 
-void Object::initSuperClass(SegManager *segMan, reg_t addr) {
+void Object::initSuperClass(SegManager *segMan, reg_t addr, bool applyScriptPatches) {
 	uint16 superClassOffset = getSuperClassSelector().getOffset();
 
 	if (superClassOffset == 0xffff)			// -1
 		setSuperClassSelector(NULL_REG);	// no superclass
-	else
-		setSuperClassSelector(segMan->getClassAddress(superClassOffset, SCRIPT_GET_LOCK, addr.getSegment()));
+	else {
+		reg_t classAddress = segMan->getClassAddress(superClassOffset, SCRIPT_GET_LOCK, addr.getSegment(), applyScriptPatches);
+		setSuperClassSelector(classAddress);
+	}
 }
 
-bool Object::initBaseObject(SegManager *segMan, reg_t addr, bool doInitSuperClass) {
+bool Object::initBaseObject(SegManager *segMan, reg_t addr, bool doInitSuperClass, bool applyScriptPatches) {
 	const Object *baseObj = segMan->getObject(getSpeciesSelector());
 
 	if (baseObj) {
@@ -270,7 +274,7 @@ bool Object::initBaseObject(SegManager *segMan, reg_t addr, bool doInitSuperClas
 		_baseObj = baseObj->_baseObj;
 		assert(_baseObj);
 		if (doInitSuperClass)
-			initSuperClass(segMan, addr);
+			initSuperClass(segMan, addr, applyScriptPatches);
 
 		if (_variables.size() != originalVarCount) {
 			// These objects are probably broken.
diff --git a/engines/sci/engine/object.h b/engines/sci/engine/object.h
index 7b65cc6..941a10f 100644
--- a/engines/sci/engine/object.h
+++ b/engines/sci/engine/object.h
@@ -300,9 +300,9 @@ public:
 
 	int propertyOffsetToId(SegManager *segMan, int propertyOffset) const;
 
-	void initSpecies(SegManager *segMan, reg_t addr);
-	void initSuperClass(SegManager *segMan, reg_t addr);
-	bool initBaseObject(SegManager *segMan, reg_t addr, bool doInitSuperClass = true);
+	void initSpecies(SegManager *segMan, reg_t addr, bool applyScriptPatches);
+	void initSuperClass(SegManager *segMan, reg_t addr, bool applyScriptPatches);
+	bool initBaseObject(SegManager *segMan, reg_t addr, bool doInitSuperClass = true, bool applyScriptPatches = true);
 
 #ifdef ENABLE_SCI32
 	bool mustSetViewVisible(const int index, const bool fromPropertyOp) const;
diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp
index 25d1283..72ae331 100644
--- a/engines/sci/engine/script.cpp
+++ b/engines/sci/engine/script.cpp
@@ -1068,7 +1068,7 @@ void Script::initializeClasses(SegManager *segMan) {
 	}
 }
 
-void Script::initializeObjectsSci0(SegManager *segMan, SegmentId segmentId) {
+void Script::initializeObjectsSci0(SegManager *segMan, SegmentId segmentId, bool applyScriptPatches) {
 	bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY);
 
 	// We need to make two passes, as the objects in the script might be in the
@@ -1089,10 +1089,10 @@ void Script::initializeObjectsSci0(SegManager *segMan, SegmentId segmentId) {
 					Object *obj;
 					if (pass == 1) {
 						obj = scriptObjInit(addr);
-						obj->initSpecies(segMan, addr);
+						obj->initSpecies(segMan, addr, applyScriptPatches);
 					} else {
 						obj = getObject(addr.getOffset());
-						if (!obj->initBaseObject(segMan, addr)) {
+						if (!obj->initBaseObject(segMan, addr, true, applyScriptPatches)) {
 							if ((_nr == 202 || _nr == 764) && g_sci->getGameId() == GID_KQ5) {
 								// WORKAROUND: Script 202 of KQ5 French and German
 								// (perhaps Spanish too?) has an invalid object.
@@ -1203,7 +1203,7 @@ void Script::initializeObjectsSci3(SegManager *segMan, SegmentId segmentId, bool
 
 void Script::initializeObjects(SegManager *segMan, SegmentId segmentId, bool applyScriptPatches) {
 	if (getSciVersion() <= SCI_VERSION_1_LATE)
-		initializeObjectsSci0(segMan, segmentId);
+		initializeObjectsSci0(segMan, segmentId, applyScriptPatches);
 	else if (getSciVersion() >= SCI_VERSION_1_1 && getSciVersion() <= SCI_VERSION_2_1_LATE)
 		initializeObjectsSci11(segMan, segmentId, applyScriptPatches);
 #ifdef ENABLE_SCI32
diff --git a/engines/sci/engine/script.h b/engines/sci/engine/script.h
index e1a4b96..a291ede 100644
--- a/engines/sci/engine/script.h
+++ b/engines/sci/engine/script.h
@@ -332,8 +332,9 @@ private:
 	 * Initializes the script's objects (SCI0)
 	 * @param segMan	A reference to the segment manager
 	 * @param segmentId	The script's segment id
+	 * @applyScriptPatches  Apply patches for the script, if available
 	 */
-	void initializeObjectsSci0(SegManager *segMan, SegmentId segmentId);
+	void initializeObjectsSci0(SegManager *segMan, SegmentId segmentId, bool applyScriptPatches);
 
 	/**
 	 * Initializes the script's objects (SCI1.1 - SCI2.1)





More information about the Scummvm-git-logs mailing list