[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