diff options
| author | Colin Snover | 2017-04-24 21:38:22 -0500 | 
|---|---|---|
| committer | Colin Snover | 2017-04-24 21:45:49 -0500 | 
| commit | 519719db497d5f96567ccc8b794922dedf6409dd (patch) | |
| tree | 0f22b5e8a521da1045852f8174c0048b69072f0a | |
| parent | e15a4c806a92403a3cf060bc369542b04bdeae15 (diff) | |
| download | scummvm-rg350-519719db497d5f96567ccc8b794922dedf6409dd.tar.gz scummvm-rg350-519719db497d5f96567ccc8b794922dedf6409dd.tar.bz2 scummvm-rg350-519719db497d5f96567ccc8b794922dedf6409dd.zip | |
SCI: Add var count sanity checking to object initialization
| -rw-r--r-- | engines/sci/engine/script.cpp | 26 | 
1 files changed, 26 insertions, 0 deletions
| diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index d35cb5b570..8cf6ad0c90 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -1063,6 +1063,7 @@ void Script::initializeObjectsSci0(SegManager *segMan, SegmentId segmentId) {  void Script::initializeObjectsSci11(SegManager *segMan, SegmentId segmentId) {  	SciSpan<const byte> seeker = _heap.subspan(4 + _heap.getUint16SEAt(2) * 2); +	Common::Array<reg_t> mismatchedVarCountObjects;  	while (seeker.getUint16SEAt(0) == SCRIPT_OBJECT_MAGIC_NUMBER) {  		reg_t reg = make_reg(segmentId, seeker - *_buf); @@ -1086,6 +1087,16 @@ void Script::initializeObjectsSci11(SegManager *segMan, SegmentId segmentId) {  			reg_t classObject = obj->getSuperClassSelector();  			const Object *classObj = segMan->getObject(classObject);  			obj->setPropDictSelector(classObj->getPropDictSelector()); + +			// At least some versions of Island of Dr Brain have a bMessager +			// instance in script 0 with a var count greater than that of its +			// class; warn about this here to see if it shows up in any other +			// games +			if (obj->getVarCount() != classObj->getVarCount()) { +				// Warnings have to be deferred until after relocation for the +				// object name to be resolvable +				mismatchedVarCountObjects.push_back(reg); +			}  		}  		// Set the -classScript- selector to the script number. @@ -1100,6 +1111,21 @@ void Script::initializeObjectsSci11(SegManager *segMan, SegmentId segmentId) {  	}  	relocateSci0Sci21(make_reg(segmentId, _heap.getUint16SEAt(0))); + +	for (uint i = 0; i < mismatchedVarCountObjects.size(); ++i) { +		const reg_t pos = mismatchedVarCountObjects[i]; +		const Object *obj = segMan->getObject(pos); +		reg_t classObject = obj->getSuperClassSelector(); +		const Object *classObj = segMan->getObject(classObject); + +		warning("Object %04x:%04x (%s) from %s declares %d variables, " +				"but its class declares %d variables", +				PRINT_REG(pos), +				segMan->getObjectName(pos), +				_buf->name().c_str(), +				obj->getVarCount(), +				classObj->getVarCount()); +	}  }  #ifdef ENABLE_SCI32 | 
