[Scummvm-cvs-logs] scummvm master -> a0add53c6003a8ed42324d4bacc7f4745ee25543

bluegr md5 at scummvm.org
Fri Jun 15 21:33:26 CEST 2012


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

Summary:
160732b2f7 Revert "SCI: Change Script::getObject() to accept a reg_t"
5ca22a1104 SCI: Fix warnings
041b1447c0 SCI: Replace RAW_IS_OBJECT with a method
8666a0528f SCI: Also skip a robot video in the Lighthouse demo
a0add53c60 SCI: Change getClassAddress() to only require the caller segment


Commit: 160732b2f73a5df173c1fa867f82fa2913ec2236
    https://github.com/scummvm/scummvm/commit/160732b2f73a5df173c1fa867f82fa2913ec2236
Author: Filippos Karapetis (md5 at scummvm.org)
Date: 2012-06-15T12:32:14-07:00

Commit Message:
Revert "SCI: Change Script::getObject() to accept a reg_t"

This reverts commit 577d7e41c9ca2c498dc85e41c373fbdca8d2ed41.

Changed paths:
    engines/sci/engine/kernel.cpp
    engines/sci/engine/script.cpp
    engines/sci/engine/script.h
    engines/sci/engine/seg_manager.cpp



diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp
index 0266414..c99bc4f 100644
--- a/engines/sci/engine/kernel.cpp
+++ b/engines/sci/engine/kernel.cpp
@@ -377,7 +377,7 @@ uint16 Kernel::findRegType(reg_t reg) {
 		if (reg.offset <= (*(Script *)mobj).getBufSize() &&
 			reg.offset >= -SCRIPT_OBJECT_MAGIC_OFFSET &&
 		    RAW_IS_OBJECT((*(Script *)mobj).getBuf(reg.offset)) ) {
-			result |= ((Script *)mobj)->getObject(reg) ? SIG_TYPE_OBJECT : SIG_TYPE_REFERENCE;
+			result |= ((Script *)mobj)->getObject(reg.offset) ? SIG_TYPE_OBJECT : SIG_TYPE_REFERENCE;
 		} else
 			result |= SIG_TYPE_REFERENCE;
 		break;
diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp
index 7714983..0ed9598 100644
--- a/engines/sci/engine/script.cpp
+++ b/engines/sci/engine/script.cpp
@@ -223,16 +223,16 @@ const byte *Script::getSci3ObjectsPointer() {
 	return ptr;
 }
 
-Object *Script::getObject(reg_t pos) {
-	if (_objects.contains(pos.offset))
-		return &_objects[pos.offset];
+Object *Script::getObject(uint16 offset) {
+	if (_objects.contains(offset))
+		return &_objects[offset];
 	else
 		return 0;
 }
 
-const Object *Script::getObject(reg_t pos) const {
-	if (_objects.contains(pos.offset))
-		return &_objects[pos.offset];
+const Object *Script::getObject(uint16 offset) const {
+	if (_objects.contains(offset))
+		return &_objects[offset];
 	else
 		return 0;
 }
@@ -726,7 +726,7 @@ Common::Array<reg_t> Script::listAllDeallocatable(SegmentId segId) const {
 Common::Array<reg_t> Script::listAllOutgoingReferences(reg_t addr) const {
 	Common::Array<reg_t> tmp;
 	if (addr.offset <= _bufSize && addr.offset >= -SCRIPT_OBJECT_MAGIC_OFFSET && RAW_IS_OBJECT(_buf + addr.offset)) {
-		const Object *obj = getObject(addr);
+		const Object *obj = getObject(addr.offset);
 		if (obj) {
 			// Note all local variables, if we have a local variable environment
 			if (_localsSegment)
diff --git a/engines/sci/engine/script.h b/engines/sci/engine/script.h
index 4d23ffb..df7f42c 100644
--- a/engines/sci/engine/script.h
+++ b/engines/sci/engine/script.h
@@ -118,8 +118,8 @@ public:
 
 	virtual void saveLoadWithSerializer(Common::Serializer &ser);
 
-	Object *getObject(reg_t pos);
-	const Object *getObject(reg_t pos) const;
+	Object *getObject(uint16 offset);
+	const Object *getObject(uint16 offset) const;
 
 	/**
 	 * Initializes an object within the segment manager
diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp
index 8f85577..20a8240 100644
--- a/engines/sci/engine/seg_manager.cpp
+++ b/engines/sci/engine/seg_manager.cpp
@@ -228,7 +228,7 @@ Object *SegManager::getObject(reg_t pos) const {
 			Script *scr = (Script *)mobj;
 			if (pos.offset <= scr->getBufSize() && pos.offset >= -SCRIPT_OBJECT_MAGIC_OFFSET
 			        && RAW_IS_OBJECT(scr->getBuf(pos.offset))) {
-				obj = scr->getObject(pos);
+				obj = scr->getObject(pos.offset);
 			}
 		}
 	}


Commit: 5ca22a1104d2e1ca0a7b7f5ac159b5c721e13ead
    https://github.com/scummvm/scummvm/commit/5ca22a1104d2e1ca0a7b7f5ac159b5c721e13ead
Author: Filippos Karapetis (md5 at scummvm.org)
Date: 2012-06-15T12:32:15-07:00

Commit Message:
SCI: Fix warnings

Thanks to DrMcCoy for reporting them

Changed paths:
    engines/sci/engine/file.cpp
    engines/sci/engine/kgraphics32.cpp
    engines/sci/engine/script.cpp



diff --git a/engines/sci/engine/file.cpp b/engines/sci/engine/file.cpp
index 3470d23..c44963f 100644
--- a/engines/sci/engine/file.cpp
+++ b/engines/sci/engine/file.cpp
@@ -427,7 +427,7 @@ bool VirtualIndexFile::seek(int32 offset, int whence) {
 		_ptr = _buffer + offset;
 		break;
 	case SEEK_END:
-		assert(_bufferSize - offset >= 0);
+		assert((int32)_bufferSize - offset >= 0);
 		_ptr = _buffer + (_bufferSize - offset);
 		break;
 	}
diff --git a/engines/sci/engine/kgraphics32.cpp b/engines/sci/engine/kgraphics32.cpp
index 53cf8ad..377c059 100644
--- a/engines/sci/engine/kgraphics32.cpp
+++ b/engines/sci/engine/kgraphics32.cpp
@@ -241,6 +241,7 @@ reg_t kSetShowStyle(EngineState *s, int argc, reg_t *argv) {
 	//int16 priority = argv[4].toSint16();	// always 0xc8 (200) when fading in/out
 	//uint16 animate = argv[5].toUint16();	// boolean, animate or not while the transition lasts
 	//uint16 refFrame = argv[6].toUint16();	// refFrame, always 0 when fading in/out
+#if 0
 	int16 divisions;
 
 	// If the game has the pFadeArray selector, another parameter is used here,
@@ -252,7 +253,7 @@ reg_t kSetShowStyle(EngineState *s, int argc, reg_t *argv) {
 	} else {
 		divisions = (argc >= 8) ? argv[7].toSint16() : -1;	// divisions (transition steps?)
 	}
-
+#endif
 	if (showStyle > 15) {
 		warning("kSetShowStyle: Illegal style %d for plane %04x:%04x", showStyle, PRINT_REG(planeObj));
 		return s->r_acc;
diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp
index 0ed9598..ca7eaad 100644
--- a/engines/sci/engine/script.cpp
+++ b/engines/sci/engine/script.cpp
@@ -199,7 +199,7 @@ void Script::load(int script_nr, ResourceManager *resMan) {
 			_localsOffset = 0;
 
 		if (_localsOffset + _localsCount * 2 + 1 >= (int)_bufSize) {
-			error("Locals extend beyond end of script: offset %04x, count %d vs size %d", _localsOffset, _localsCount, _bufSize);
+			error("Locals extend beyond end of script: offset %04x, count %d vs size %d", _localsOffset, _localsCount, (int)_bufSize);
 			//_localsCount = (_bufSize - _localsOffset) >> 1;
 		}
 	}


Commit: 041b1447c02616c0f285556bb453e79268da7dce
    https://github.com/scummvm/scummvm/commit/041b1447c02616c0f285556bb453e79268da7dce
Author: Filippos Karapetis (md5 at scummvm.org)
Date: 2012-06-15T12:32:15-07:00

Commit Message:
SCI: Replace RAW_IS_OBJECT with a method

Changed paths:
    engines/sci/engine/kernel.cpp
    engines/sci/engine/script.cpp
    engines/sci/engine/script.h
    engines/sci/engine/seg_manager.cpp
    engines/sci/engine/vm.h



diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp
index c99bc4f..3a33c92 100644
--- a/engines/sci/engine/kernel.cpp
+++ b/engines/sci/engine/kernel.cpp
@@ -376,7 +376,7 @@ uint16 Kernel::findRegType(reg_t reg) {
 	case SEG_TYPE_SCRIPT:
 		if (reg.offset <= (*(Script *)mobj).getBufSize() &&
 			reg.offset >= -SCRIPT_OBJECT_MAGIC_OFFSET &&
-		    RAW_IS_OBJECT((*(Script *)mobj).getBuf(reg.offset)) ) {
+			(*(Script *)mobj).offsetIsObject(reg.offset)) {
 			result |= ((Script *)mobj)->getObject(reg.offset) ? SIG_TYPE_OBJECT : SIG_TYPE_REFERENCE;
 		} else
 			result |= SIG_TYPE_REFERENCE;
diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp
index ca7eaad..d09b5ac 100644
--- a/engines/sci/engine/script.cpp
+++ b/engines/sci/engine/script.cpp
@@ -725,7 +725,7 @@ Common::Array<reg_t> Script::listAllDeallocatable(SegmentId segId) const {
 
 Common::Array<reg_t> Script::listAllOutgoingReferences(reg_t addr) const {
 	Common::Array<reg_t> tmp;
-	if (addr.offset <= _bufSize && addr.offset >= -SCRIPT_OBJECT_MAGIC_OFFSET && RAW_IS_OBJECT(_buf + addr.offset)) {
+	if (addr.offset <= _bufSize && addr.offset >= -SCRIPT_OBJECT_MAGIC_OFFSET && offsetIsObject(addr.offset)) {
 		const Object *obj = getObject(addr.offset);
 		if (obj) {
 			// Note all local variables, if we have a local variable environment
@@ -761,4 +761,8 @@ Common::Array<reg_t> Script::listObjectReferences() const {
 	return tmp;
 }
 
+bool Script::offsetIsObject(uint16 offset) const {
+	return (READ_SCI11ENDIAN_UINT16((const byte *)_buf + offset + SCRIPT_OBJECT_MAGIC_OFFSET) == SCRIPT_OBJECT_MAGIC_NUMBER);
+}
+
 } // End of namespace Sci
diff --git a/engines/sci/engine/script.h b/engines/sci/engine/script.h
index df7f42c..0c99f13 100644
--- a/engines/sci/engine/script.h
+++ b/engines/sci/engine/script.h
@@ -89,6 +89,7 @@ public:
 	void syncLocalsBlock(SegManager *segMan);
 	ObjMap &getObjectMap() { return _objects; }
 	const ObjMap &getObjectMap() const { return _objects; }
+	bool offsetIsObject(uint16 offset) const;
 
 public:
 	Script();
diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp
index 20a8240..eaa587e 100644
--- a/engines/sci/engine/seg_manager.cpp
+++ b/engines/sci/engine/seg_manager.cpp
@@ -227,7 +227,7 @@ Object *SegManager::getObject(reg_t pos) const {
 		} else if (mobj->getType() == SEG_TYPE_SCRIPT) {
 			Script *scr = (Script *)mobj;
 			if (pos.offset <= scr->getBufSize() && pos.offset >= -SCRIPT_OBJECT_MAGIC_OFFSET
-			        && RAW_IS_OBJECT(scr->getBuf(pos.offset))) {
+			        && scr->offsetIsObject(pos.offset)) {
 				obj = scr->getObject(pos.offset);
 			}
 		}
diff --git a/engines/sci/engine/vm.h b/engines/sci/engine/vm.h
index cdd9b9a..67b9dd4 100644
--- a/engines/sci/engine/vm.h
+++ b/engines/sci/engine/vm.h
@@ -61,8 +61,6 @@ struct Class {
 	reg_t reg; ///< offset; script-relative offset, segment: 0 if not instantiated
 };
 
-#define RAW_IS_OBJECT(datablock) (READ_SCI11ENDIAN_UINT16(((const byte *) datablock) + SCRIPT_OBJECT_MAGIC_OFFSET) == SCRIPT_OBJECT_MAGIC_NUMBER)
-
 // A reference to an object's variable.
 // The object is stored as a reg_t, the variable as an index into _variables
 struct ObjVarRef {


Commit: 8666a0528ff7f01acff97355df1bddf6136869b1
    https://github.com/scummvm/scummvm/commit/8666a0528ff7f01acff97355df1bddf6136869b1
Author: Filippos Karapetis (md5 at scummvm.org)
Date: 2012-06-15T12:32:16-07:00

Commit Message:
SCI: Also skip a robot video in the Lighthouse demo

Changed paths:
    engines/sci/video/robot_decoder.cpp



diff --git a/engines/sci/video/robot_decoder.cpp b/engines/sci/video/robot_decoder.cpp
index 8ffcecc..ebcfac6 100644
--- a/engines/sci/video/robot_decoder.cpp
+++ b/engines/sci/video/robot_decoder.cpp
@@ -93,6 +93,10 @@ bool RobotDecoder::load(GuiResourceId id) {
 	// videos. Skip it for now.
 	if (g_sci->getGameId() == GID_RAMA && id == 1003)
 		return false;
+	
+	// TODO: The robot video in the Lighthouse demo gets stuck
+	if (g_sci->getGameId() == GID_LIGHTHOUSE && id == 16)
+		return false;
 
 	Common::String fileName = Common::String::format("%d.rbt", id);
 	Common::SeekableReadStream *stream = SearchMan.createReadStreamForMember(fileName);


Commit: a0add53c6003a8ed42324d4bacc7f4745ee25543
    https://github.com/scummvm/scummvm/commit/a0add53c6003a8ed42324d4bacc7f4745ee25543
Author: Filippos Karapetis (md5 at scummvm.org)
Date: 2012-06-15T12:32:17-07:00

Commit Message:
SCI: Change getClassAddress() to only require the caller segment

The caller offset is never actually used inside the function

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



diff --git a/engines/sci/engine/object.cpp b/engines/sci/engine/object.cpp
index 2a0ed38..de02839 100644
--- a/engines/sci/engine/object.cpp
+++ b/engines/sci/engine/object.cpp
@@ -153,7 +153,7 @@ void Object::initSpecies(SegManager *segMan, reg_t addr) {
 	if (speciesOffset == 0xffff)		// -1
 		setSpeciesSelector(NULL_REG);	// no species
 	else
-		setSpeciesSelector(segMan->getClassAddress(speciesOffset, SCRIPT_GET_LOCK, addr));
+		setSpeciesSelector(segMan->getClassAddress(speciesOffset, SCRIPT_GET_LOCK, addr.segment));
 }
 
 void Object::initSuperClass(SegManager *segMan, reg_t addr) {
@@ -162,7 +162,7 @@ void Object::initSuperClass(SegManager *segMan, reg_t addr) {
 	if (superClassOffset == 0xffff)			// -1
 		setSuperClassSelector(NULL_REG);	// no superclass
 	else
-		setSuperClassSelector(segMan->getClassAddress(superClassOffset, SCRIPT_GET_LOCK, addr));
+		setSuperClassSelector(segMan->getClassAddress(superClassOffset, SCRIPT_GET_LOCK, addr.segment));
 }
 
 bool Object::initBaseObject(SegManager *segMan, reg_t addr, bool doInitSuperClass) {
diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp
index d09b5ac..d018872 100644
--- a/engines/sci/engine/script.cpp
+++ b/engines/sci/engine/script.cpp
@@ -653,7 +653,7 @@ void Script::initializeObjectsSci11(SegManager *segMan, SegmentId segmentId) {
 
 		// Copy base from species class, as we need its selector IDs
 		obj->setSuperClassSelector(
-			segMan->getClassAddress(obj->getSuperClassSelector().offset, SCRIPT_GET_LOCK, NULL_REG));
+			segMan->getClassAddress(obj->getSuperClassSelector().offset, SCRIPT_GET_LOCK, 0));
 
 		// If object is instance, get -propDict- from class and set it for this
 		// object. This is needed for ::isMemberOf() to work.
@@ -686,7 +686,7 @@ void Script::initializeObjectsSci3(SegManager *segMan, SegmentId segmentId) {
 		reg_t reg = make_reg(segmentId, seeker - _buf);
 		Object *obj = scriptObjInit(reg);
 
-		obj->setSuperClassSelector(segMan->getClassAddress(obj->getSuperClassSelector().offset, SCRIPT_GET_LOCK, NULL_REG));
+		obj->setSuperClassSelector(segMan->getClassAddress(obj->getSuperClassSelector().offset, SCRIPT_GET_LOCK, 0));
 		seeker += READ_SCI11ENDIAN_UINT16(seeker + 2);
 	}
 
diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp
index eaa587e..ac02022 100644
--- a/engines/sci/engine/seg_manager.cpp
+++ b/engines/sci/engine/seg_manager.cpp
@@ -939,7 +939,7 @@ void SegManager::createClassTable() {
 	_resMan->unlockResource(vocab996);
 }
 
-reg_t SegManager::getClassAddress(int classnr, ScriptLoadType lock, reg_t caller) {
+reg_t SegManager::getClassAddress(int classnr, ScriptLoadType lock, uint16 callerSegment) {
 	if (classnr == 0xffff)
 		return NULL_REG;
 
@@ -956,7 +956,7 @@ reg_t SegManager::getClassAddress(int classnr, ScriptLoadType lock, reg_t caller
 				return NULL_REG;
 			}
 		} else
-			if (caller.segment != the_class->reg.segment)
+			if (callerSegment != the_class->reg.segment)
 				getScript(the_class->reg.segment)->incrementLockers();
 
 		return the_class->reg;
diff --git a/engines/sci/engine/seg_manager.h b/engines/sci/engine/seg_manager.h
index 62e711e..356a1b0 100644
--- a/engines/sci/engine/seg_manager.h
+++ b/engines/sci/engine/seg_manager.h
@@ -125,7 +125,7 @@ private:
 
 public:
 	// TODO: document this
-	reg_t getClassAddress(int classnr, ScriptLoadType lock, reg_t caller);
+	reg_t getClassAddress(int classnr, ScriptLoadType lock, uint16 callerSegment);
 
 	/**
 	 * Return a pointer to the specified script.
diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp
index 162dce9..7dc397c 100644
--- a/engines/sci/engine/vm.cpp
+++ b/engines/sci/engine/vm.cpp
@@ -996,7 +996,7 @@ void run_vm(EngineState *s) {
 		case op_class: // 0x28 (40)
 			// Get class address
 			s->r_acc = s->_segMan->getClassAddress((unsigned)opparams[0], SCRIPT_GET_LOCK,
-											s->xs->addr.pc);
+											s->xs->addr.pc.segment);
 			break;
 
 		case 0x29: // (41)
@@ -1021,7 +1021,7 @@ void run_vm(EngineState *s) {
 
 		case op_super: // 0x2b (43)
 			// Send to any class
-			r_temp = s->_segMan->getClassAddress(opparams[0], SCRIPT_GET_LOAD, s->xs->addr.pc);
+			r_temp = s->_segMan->getClassAddress(opparams[0], SCRIPT_GET_LOAD, s->xs->addr.pc.segment);
 
 			if (!r_temp.isPointer())
 				error("[VM]: Invalid superclass in object");






More information about the Scummvm-git-logs mailing list