aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Horn2009-09-17 16:50:53 +0000
committerMax Horn2009-09-17 16:50:53 +0000
commiteb77efda785dd7df31a90fb3fd57ea17bf49a606 (patch)
tree5a31e8292859154a920a0abdf945df0cbd0e4ab4
parent9651562e72ac4c73393a2aba87e835269c25210f (diff)
downloadscummvm-rg350-eb77efda785dd7df31a90fb3fd57ea17bf49a606.tar.gz
scummvm-rg350-eb77efda785dd7df31a90fb3fd57ea17bf49a606.tar.bz2
scummvm-rg350-eb77efda785dd7df31a90fb3fd57ea17bf49a606.zip
SCI: Add a global getSciVersion() function and make use of it
svn-id: r44170
-rw-r--r--engines/sci/console.cpp13
-rw-r--r--engines/sci/engine/gc.cpp2
-rw-r--r--engines/sci/engine/kernel.cpp2
-rw-r--r--engines/sci/engine/kgraphics.cpp6
-rw-r--r--engines/sci/engine/kmovement.cpp2
-rw-r--r--engines/sci/engine/kscripts.cpp14
-rw-r--r--engines/sci/engine/savegame.cpp5
-rw-r--r--engines/sci/engine/scriptdebug.cpp9
-rw-r--r--engines/sci/engine/seg_manager.cpp24
-rw-r--r--engines/sci/engine/seg_manager.h2
-rw-r--r--engines/sci/engine/segment.cpp16
-rw-r--r--engines/sci/engine/segment.h64
-rw-r--r--engines/sci/engine/state.cpp10
-rw-r--r--engines/sci/engine/vm.cpp42
-rw-r--r--engines/sci/engine/vm.h8
-rw-r--r--engines/sci/sci.h8
16 files changed, 104 insertions, 123 deletions
diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp
index 7922e30b01..3d6d35a5fc 100644
--- a/engines/sci/console.cpp
+++ b/engines/sci/console.cpp
@@ -1649,7 +1649,7 @@ bool Console::cmdGCShowReachable(int argc, const char **argv) {
}
DebugPrintf("Reachable from %04x:%04x:\n", PRINT_REG(addr));
- mobj->listAllOutgoingReferences(addr, NULL, _print_address, _vm->_gamestate->resMan->sciVersion());
+ mobj->listAllOutgoingReferences(addr, NULL, _print_address);
return true;
}
@@ -3054,7 +3054,6 @@ int Console::printObject(reg_t pos) {
Object *obj = s->segMan->getObject(pos);
Object *var_container = obj;
int i;
- SciVersion version = s->resMan->sciVersion(); // for the selector defines
if (!obj) {
DebugPrintf("[%04x:%04x]: Not an object.", PRINT_REG(pos));
@@ -3065,13 +3064,13 @@ int Console::printObject(reg_t pos) {
DebugPrintf("[%04x:%04x] %s : %3d vars, %3d methods\n", PRINT_REG(pos), s->segMan->getObjectName(pos),
obj->_variables.size(), obj->methods_nr);
- if (!(obj->getInfoSelector(version).offset & SCRIPT_INFO_CLASS))
- var_container = s->segMan->getObject(obj->getSuperClassSelector(version));
+ if (!(obj->getInfoSelector().offset & SCRIPT_INFO_CLASS))
+ var_container = s->segMan->getObject(obj->getSuperClassSelector());
DebugPrintf(" -- member variables:\n");
for (i = 0; (uint)i < obj->_variables.size(); i++) {
printf(" ");
if (i < var_container->variable_names_nr) {
- uint16 varSelector = var_container->getVarSelector(i, version);
+ uint16 varSelector = var_container->getVarSelector(i);
DebugPrintf("[%03x] %s = ", varSelector, selector_name(s, varSelector));
} else
DebugPrintf("p#%x = ", i);
@@ -3087,8 +3086,8 @@ int Console::printObject(reg_t pos) {
}
DebugPrintf(" -- methods:\n");
for (i = 0; i < obj->methods_nr; i++) {
- reg_t fptr = obj->getFunction(i, version);
- DebugPrintf(" [%03x] %s = %04x:%04x\n", obj->getFuncSelector(i, version), selector_name(s, obj->getFuncSelector(i, version)), PRINT_REG(fptr));
+ reg_t fptr = obj->getFunction(i);
+ DebugPrintf(" [%03x] %s = %04x:%04x\n", obj->getFuncSelector(i), selector_name(s, obj->getFuncSelector(i)), PRINT_REG(fptr));
}
if (s->segMan->_heap[pos.segment]->getType() == SEG_TYPE_SCRIPT)
DebugPrintf("\nOwner script:\t%d\n", s->segMan->getScript(pos.segment)->_nr);
diff --git a/engines/sci/engine/gc.cpp b/engines/sci/engine/gc.cpp
index 5e5db1f8a4..d9635bff73 100644
--- a/engines/sci/engine/gc.cpp
+++ b/engines/sci/engine/gc.cpp
@@ -134,7 +134,7 @@ reg_t_hash_map *find_all_used_references(EngineState *s) {
if (reg.segment != s->stack_segment) { // No need to repeat this one
debugC(2, kDebugLevelGC, "[GC] Checking %04x:%04x\n", PRINT_REG(reg));
if (reg.segment < segMan->_heap.size() && segMan->_heap[reg.segment])
- segMan->_heap[reg.segment]->listAllOutgoingReferences(reg, &wm, add_outgoing_refs, s->resMan->sciVersion());
+ segMan->_heap[reg.segment]->listAllOutgoingReferences(reg, &wm, add_outgoing_refs);
}
}
diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp
index eb3abec50d..1b06b78159 100644
--- a/engines/sci/engine/kernel.cpp
+++ b/engines/sci/engine/kernel.cpp
@@ -643,8 +643,6 @@ int determine_reg_type(SegManager *segMan, reg_t reg, bool allow_invalid) {
if (!mobj)
return 0; // Invalid
- SciVersion version = segMan->sciVersion(); // for the offset defines
-
switch (mobj->getType()) {
case SEG_TYPE_SCRIPT:
if (reg.offset <= (*(Script *)mobj)._bufSize && reg.offset >= -SCRIPT_OBJECT_MAGIC_OFFSET
diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp
index 01942cda90..80db212703 100644
--- a/engines/sci/engine/kgraphics.cpp
+++ b/engines/sci/engine/kgraphics.cpp
@@ -669,7 +669,7 @@ void _k_dirloop(reg_t obj, uint16 angle, EngineState *s, int argc, reg_t *argv)
int signal = GET_SEL32V(obj, signal);
int loop;
int maxloops;
- bool oldScriptHeader = (s->resMan->sciVersion() == SCI_VERSION_0_EARLY);
+ bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY);
if (signal & _K_VIEW_SIG_FLAG_DOESNT_TURN)
return;
@@ -1113,7 +1113,7 @@ void _k_base_setter(EngineState *s, reg_t object) {
// does not exist (earliest one was KQ4 SCI, version 0.000.274). This code is left here
// for reference only
#if 0
- if (s->resMan->sciVersion() <= SCI_VERSION_0)
+ if (getSciVersion() <= SCI_VERSION_0)
--absrect.top; // Compensate for early SCI OB1 'bug'
#endif
@@ -1328,7 +1328,7 @@ static void disableCertainButtons(SegManager *segMan, Common::String gameName, r
*/
// NOTE: This _only_ works with the English version
if (type == K_CONTROL_BUTTON && text && (gameName == "sq4") &&
- segMan->sciVersion() < SCI_VERSION_1_1 && !strcmp(text, " Delete ")) {
+ getSciVersion() < SCI_VERSION_1_1 && !strcmp(text, " Delete ")) {
PUT_SEL32V(obj, state, (state | kControlStateDisabled) & ~kControlStateEnabled);
}
diff --git a/engines/sci/engine/kmovement.cpp b/engines/sci/engine/kmovement.cpp
index 9f7e418c91..b9381b1383 100644
--- a/engines/sci/engine/kmovement.cpp
+++ b/engines/sci/engine/kmovement.cpp
@@ -276,7 +276,7 @@ static void bresenham_autodetect(EngineState *s) {
}
buf = s->segMan->getScript(fptr.segment)->_buf + fptr.offset;
- handle_movecnt = (s->segMan->sciVersion() <= SCI_VERSION_01 || checksum_bytes(buf, 8) == 0x216) ? INCREMENT_MOVECNT : IGNORE_MOVECNT;
+ handle_movecnt = (getSciVersion() <= SCI_VERSION_01 || checksum_bytes(buf, 8) == 0x216) ? INCREMENT_MOVECNT : IGNORE_MOVECNT;
printf("b-moveCnt action based on checksum: %s\n", handle_movecnt == IGNORE_MOVECNT ? "ignore" : "increment");
} else {
warning("bresenham_autodetect failed");
diff --git a/engines/sci/engine/kscripts.cpp b/engines/sci/engine/kscripts.cpp
index 157f285541..ce7656f47e 100644
--- a/engines/sci/engine/kscripts.cpp
+++ b/engines/sci/engine/kscripts.cpp
@@ -201,13 +201,11 @@ reg_t kClone(EngineState *s, int, int argc, reg_t *argv) {
*clone_obj = *parent_obj;
clone_obj->flags = 0;
- SciVersion version = s->resMan->sciVersion(); // for the selector defines
-
// Mark as clone
- clone_obj->setInfoSelector(make_reg(0, SCRIPT_INFO_CLONE), version);
- clone_obj->setSpeciesSelector(clone_obj->pos, version);
- if (parent_obj->isClass(version))
- clone_obj->setSuperClassSelector(parent_obj->pos, version);
+ clone_obj->setInfoSelector(make_reg(0, SCRIPT_INFO_CLONE));
+ clone_obj->setSpeciesSelector(clone_obj->pos);
+ if (parent_obj->isClass())
+ clone_obj->setSuperClassSelector(parent_obj->pos);
s->segMan->getScript(parent_obj->pos.segment)->incrementLockers();
s->segMan->getScript(clone_obj->pos.segment)->incrementLockers();
@@ -228,9 +226,7 @@ reg_t kDisposeClone(EngineState *s, int, int argc, reg_t *argv) {
return s->r_acc;
}
- SciVersion version = s->resMan->sciVersion(); // for the selector defines
-
- if (victim_obj->getInfoSelector(version).offset != SCRIPT_INFO_CLONE) {
+ if (victim_obj->getInfoSelector().offset != SCRIPT_INFO_CLONE) {
//warning("Attempt to dispose something other than a clone at %04x", offset);
// SCI silently ignores this behaviour; some games actually depend on it
return s->r_acc;
diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp
index da0b93ed14..8713805fec 100644
--- a/engines/sci/engine/savegame.cpp
+++ b/engines/sci/engine/savegame.cpp
@@ -554,7 +554,6 @@ static void load_script(EngineState *s, Script *scr) {
static void reconstruct_scripts(EngineState *s, SegManager *self) {
uint i, j;
SegmentObj *mobj;
- SciVersion version = self->sciVersion(); // for the selector defines
for (i = 0; i < self->_heap.size(); i++) {
if (self->_heap[i]) {
@@ -613,11 +612,11 @@ static void reconstruct_scripts(EngineState *s, SegManager *self) {
int funct_area = READ_LE_UINT16( data + SCRIPT_FUNCTAREAPTR_OFFSET );
Object *base_obj;
- base_obj = s->segMan->getObject(scr->_objects[j].getSpeciesSelector(version));
+ base_obj = s->segMan->getObject(scr->_objects[j].getSpeciesSelector());
if (!base_obj) {
warning("Object without a base class: Script %d, index %d (reg address %04x:%04x",
- scr->_nr, j, PRINT_REG(scr->_objects[j].getSpeciesSelector(version)));
+ scr->_nr, j, PRINT_REG(scr->_objects[j].getSpeciesSelector()));
continue;
}
scr->_objects[j].variable_names_nr = base_obj->_variables.size();
diff --git a/engines/sci/engine/scriptdebug.cpp b/engines/sci/engine/scriptdebug.cpp
index 8c086758d6..099976343a 100644
--- a/engines/sci/engine/scriptdebug.cpp
+++ b/engines/sci/engine/scriptdebug.cpp
@@ -69,7 +69,6 @@ int propertyOffsetToId(SegManager *segMan, int prop_ofs, reg_t objp) {
Object *obj = segMan->getObject(objp);
byte *selectoroffset;
int selectors;
- SciVersion version = segMan->sciVersion(); // for the selector defines
if (!obj) {
warning("Applied propertyOffsetToId on non-object at %04x:%04x", PRINT_REG(objp));
@@ -78,11 +77,11 @@ int propertyOffsetToId(SegManager *segMan, int prop_ofs, reg_t objp) {
selectors = obj->_variables.size();
- if (segMan->sciVersion() < SCI_VERSION_1_1)
+ if (getSciVersion() < SCI_VERSION_1_1)
selectoroffset = ((byte *)(obj->base_obj)) + SCRIPT_SELECTOR_OFFSET + selectors * 2;
else {
- if (!(obj->getInfoSelector(version).offset & SCRIPT_INFO_CLASS)) {
- obj = segMan->getObject(obj->getSuperClassSelector(version));
+ if (!(obj->getInfoSelector().offset & SCRIPT_INFO_CLASS)) {
+ obj = segMan->getObject(obj->getSuperClassSelector());
selectoroffset = (byte *)obj->base_vars;
} else
selectoroffset = (byte *)obj->base_vars;
@@ -269,7 +268,7 @@ reg_t disassemble(EngineState *s, reg_t pos, int print_bw_tag, int print_bytecod
if (opcode == op_callk) {
int stackframe = (scr[pos.offset + 2] >> 1) + (scriptState.restAdjust);
int argc = ((scriptState.xs->sp)[- stackframe - 1]).offset;
- bool oldScriptHeader = (s->segMan->sciVersion() == SCI_VERSION_0_EARLY);
+ bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY);
if (!oldScriptHeader)
argc += (scriptState.restAdjust);
diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp
index cb178098b2..76f85f42fe 100644
--- a/engines/sci/engine/seg_manager.cpp
+++ b/engines/sci/engine/seg_manager.cpp
@@ -133,18 +133,18 @@ Script *SegManager::allocateScript(int script_nr, SegmentId *seg_id) {
void Script::setScriptSize(int script_nr, ResourceManager *resMan) {
Resource *script = resMan->findResource(ResourceId(kResourceTypeScript, script_nr), 0);
Resource *heap = resMan->findResource(ResourceId(kResourceTypeHeap, script_nr), 0);
- bool oldScriptHeader = (_sciVersion == SCI_VERSION_0_EARLY);
+ bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY);
_scriptSize = script->size;
_heapSize = 0; // Set later
- if (!script || (_sciVersion >= SCI_VERSION_1_1 && !heap)) {
+ if (!script || (getSciVersion() >= SCI_VERSION_1_1 && !heap)) {
error("SegManager::setScriptSize: failed to load %s", !script ? "script" : "heap");
}
if (oldScriptHeader) {
_bufSize = script->size + READ_LE_UINT16(script->data) * 2;
//locals_size = READ_LE_UINT16(script->data) * 2;
- } else if (_sciVersion < SCI_VERSION_1_1) {
+ } else if (getSciVersion() < SCI_VERSION_1_1) {
_bufSize = script->size;
} else {
_bufSize = script->size + heap->size;
@@ -240,7 +240,6 @@ SegmentType SegManager::getSegmentType(SegmentId seg) {
Object *SegManager::getObject(reg_t pos) {
SegmentObj *mobj = getSegmentObj(pos.segment);
- SciVersion version = _resMan->sciVersion();
Object *obj = NULL;
if (mobj != NULL) {
@@ -262,11 +261,10 @@ Object *SegManager::getObject(reg_t pos) {
const char *SegManager::getObjectName(reg_t pos) {
Object *obj = getObject(pos);
- SciVersion version = _resMan->sciVersion();
if (!obj)
return "<no such object>";
- reg_t nameReg = obj->getNameSelector(version);
+ reg_t nameReg = obj->getNameSelector();
if (nameReg.isNull())
return "<no name>";
@@ -312,7 +310,7 @@ int Script::relocateBlock(Common::Array<reg_t> &block, int block_location, Segme
return 0;
}
block[idx].segment = segment; // Perform relocation
- if (_sciVersion >= SCI_VERSION_1_1)
+ if (getSciVersion() >= SCI_VERSION_1_1)
block[idx].offset += _scriptSize;
return 1;
@@ -461,7 +459,6 @@ reg_t SegManager::getClassAddress(int classnr, ScriptLoadType lock, reg_t caller
Object *Script::scriptObjInit0(reg_t obj_pos) {
Object *obj;
- SciVersion version = _sciVersion; // for the offset defines
uint base = obj_pos.offset - SCRIPT_OBJECT_MAGIC_OFFSET;
VERIFY(base < _bufSize, "Attempt to initialize object beyond end of script\n");
@@ -554,7 +551,7 @@ Object *Script::scriptObjInit11(reg_t obj_pos) {
}
Object *Script::scriptObjInit(reg_t obj_pos) {
- if (_sciVersion < SCI_VERSION_1_1)
+ if (getSciVersion() < SCI_VERSION_1_1)
return scriptObjInit0(obj_pos);
else
return scriptObjInit11(obj_pos);
@@ -598,7 +595,7 @@ void SegManager::scriptInitialiseLocals(reg_t location) {
VERIFY(location.offset + 1 < (uint16)scr->_bufSize, "Locals beyond end of script\n");
- if (_resMan->sciVersion() >= SCI_VERSION_1_1)
+ if (getSciVersion() >= SCI_VERSION_1_1)
count = READ_LE_UINT16(scr->_buf + location.offset - 2);
else
count = (READ_LE_UINT16(scr->_buf + location.offset - 2) - 4) >> 1;
@@ -640,7 +637,6 @@ void SegManager::scriptRelocateExportsSci11(SegmentId seg) {
void SegManager::scriptInitialiseObjectsSci11(SegmentId seg) {
Script *scr = getScript(seg);
byte *seeker = scr->_heapStart + 4 + READ_LE_UINT16(scr->_heapStart + 2) * 2;
- SciVersion version = _resMan->sciVersion(); // for the selector defines
while (READ_LE_UINT16(seeker) == SCRIPT_OBJECT_MAGIC_NUMBER) {
if (READ_LE_UINT16(seeker + 14) & SCRIPT_INFO_CLASS) {
@@ -679,7 +675,7 @@ void SegManager::scriptInitialiseObjectsSci11(SegmentId seg) {
// Copy base from species class, as we need its selector IDs
obj->setSuperClassSelector(
- getClassAddress(obj->getSuperClassSelector(version).offset, SCRIPT_GET_LOCK, NULL_REG), version);
+ getClassAddress(obj->getSuperClassSelector().offset, SCRIPT_GET_LOCK, NULL_REG));
// Set the -classScript- selector to the script number.
// FIXME: As this selector is filled in at run-time, it is likely
@@ -783,8 +779,6 @@ Clone *SegManager::allocateClone(reg_t *addr) {
}
void SegManager::reconstructClones() {
- SciVersion version = sciVersion(); // for the selector defines
-
for (uint i = 0; i < _heap.size(); i++) {
if (_heap[i]) {
SegmentObj *mobj = _heap[i];
@@ -809,7 +803,7 @@ void SegManager::reconstructClones() {
continue;
CloneTable::Entry &seeker = ct->_table[j];
- base_obj = getObject(seeker.getSpeciesSelector(version));
+ base_obj = getObject(seeker.getSpeciesSelector());
if (!base_obj) {
warning("Clone entry without a base class: %d", j);
seeker.base = NULL;
diff --git a/engines/sci/engine/seg_manager.h b/engines/sci/engine/seg_manager.h
index 5e45e3c4f6..6fec14a3dd 100644
--- a/engines/sci/engine/seg_manager.h
+++ b/engines/sci/engine/seg_manager.h
@@ -355,8 +355,6 @@ public:
void scriptRelocateExportsSci11(SegmentId seg);
void scriptInitialiseObjectsSci11(SegmentId seg);
- SciVersion sciVersion() { return _resMan->sciVersion(); }
-
public: // TODO: make private
Common::Array<SegmentObj *> _heap;
Common::Array<Class> _classtable; /**< Table of all classes */
diff --git a/engines/sci/engine/segment.cpp b/engines/sci/engine/segment.cpp
index b072c2d380..7969969ec3 100644
--- a/engines/sci/engine/segment.cpp
+++ b/engines/sci/engine/segment.cpp
@@ -119,8 +119,6 @@ void Script::freeScript() {
}
bool Script::init(int script_nr, ResourceManager *resMan) {
- _sciVersion = resMan->sciVersion();
-
setScriptSize(script_nr, resMan);
_buf = (byte *)malloc(_bufSize);
@@ -147,7 +145,7 @@ bool Script::init(int script_nr, ResourceManager *resMan) {
_nr = script_nr;
- if (_sciVersion >= SCI_VERSION_1_1)
+ if (getSciVersion() >= SCI_VERSION_1_1)
_heapStart = _buf + _scriptSize;
else
_heapStart = _buf;
@@ -326,7 +324,7 @@ void Script::listAllDeallocatable(SegmentId segId, void *param, NoteCallback not
(*note)(param, make_reg(segId, 0));
}
-void Script::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback note, SciVersion version) {
+void Script::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback note) {
if (addr.offset <= _bufSize && addr.offset >= -SCRIPT_OBJECT_MAGIC_OFFSET && RAW_IS_OBJECT(_buf + addr.offset)) {
Object *obj = getObject(addr.offset);
if (obj) {
@@ -348,7 +346,7 @@ void Script::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback not
//-------------------- clones --------------------
-void CloneTable::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback note, SciVersion version) {
+void CloneTable::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback note) {
Clone *clone;
// assert(addr.segment == _segId);
@@ -401,7 +399,7 @@ reg_t LocalVariables::findCanonicAddress(SegManager *segMan, reg_t addr) {
return make_reg(owner_seg, 0);
}
-void LocalVariables::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback note, SciVersion version) {
+void LocalVariables::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback note) {
// assert(addr.segment == _segId);
for (uint i = 0; i < _locals.size(); i++)
@@ -415,7 +413,7 @@ reg_t DataStack::findCanonicAddress(SegManager *segMan, reg_t addr) {
return addr;
}
-void DataStack::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback note, SciVersion version) {
+void DataStack::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback note) {
fprintf(stderr, "Emitting %d stack entries\n", nr);
for (int i = 0; i < nr; i++)
(*note)(param, entries[i]);
@@ -428,7 +426,7 @@ void ListTable::freeAtAddress(SegManager *segMan, reg_t sub_addr) {
freeEntry(sub_addr.offset);
}
-void ListTable::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback note, SciVersion version) {
+void ListTable::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback note) {
if (!isValidEntry(addr.offset)) {
warning("Invalid list referenced for outgoing references: %04x:%04x", PRINT_REG(addr));
return;
@@ -448,7 +446,7 @@ void NodeTable::freeAtAddress(SegManager *segMan, reg_t sub_addr) {
freeEntry(sub_addr.offset);
}
-void NodeTable::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback note, SciVersion version) {
+void NodeTable::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback note) {
if (!isValidEntry(addr.offset)) {
warning("Invalid node referenced for outgoing references: %04x:%04x", PRINT_REG(addr));
return;
diff --git a/engines/sci/engine/segment.h b/engines/sci/engine/segment.h
index ef8bc28bfb..0c59ad59c5 100644
--- a/engines/sci/engine/segment.h
+++ b/engines/sci/engine/segment.h
@@ -107,7 +107,7 @@ public:
* @param note Invoked for each outgoing reference within the object
* Note: This function may also choose to report numbers (segment 0) as adresses
*/
- virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note, SciVersion version) {}
+ virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note) {}
};
@@ -190,7 +190,7 @@ public:
virtual bool isValidOffset(uint16 offset) const;
virtual byte *dereference(reg_t pointer, int *size);
virtual reg_t findCanonicAddress(SegManager *segMan, reg_t sub_addr);
- virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note, SciVersion version);
+ virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note);
virtual void saveLoadWithSerializer(Common::Serializer &ser);
};
@@ -210,43 +210,43 @@ struct Object {
uint16 *base_vars; /**< Pointer to the varselector area for this object */
Common::Array<reg_t> _variables;
- uint16 getVarSelector(uint16 i, SciVersion version) {
- if (version < SCI_VERSION_1_1)
+ uint16 getVarSelector(uint16 i) {
+ if (getSciVersion() < SCI_VERSION_1_1)
return READ_LE_UINT16(base_obj + _variables.size() * 2 + i * 2);
else
return *(base_vars + i);
}
- reg_t getSpeciesSelector(SciVersion version) {
- return _variables[version < SCI_VERSION_1_1 ? 0 : 5];
+ reg_t getSpeciesSelector() {
+ return _variables[getSciVersion() < SCI_VERSION_1_1 ? 0 : 5];
}
- void setSpeciesSelector(reg_t value, SciVersion version) {
- _variables[version < SCI_VERSION_1_1 ? 0 : 5] = value;
+ void setSpeciesSelector(reg_t value) {
+ _variables[getSciVersion() < SCI_VERSION_1_1 ? 0 : 5] = value;
}
- reg_t getSuperClassSelector(SciVersion version) {
- return _variables[version < SCI_VERSION_1_1 ? 1 : 6];
+ reg_t getSuperClassSelector() {
+ return _variables[getSciVersion() < SCI_VERSION_1_1 ? 1 : 6];
}
- void setSuperClassSelector(reg_t value, SciVersion version) {
- _variables[version < SCI_VERSION_1_1 ? 1 : 6] = value;
+ void setSuperClassSelector(reg_t value) {
+ _variables[getSciVersion() < SCI_VERSION_1_1 ? 1 : 6] = value;
}
- reg_t getInfoSelector(SciVersion version) {
- return _variables[version < SCI_VERSION_1_1 ? 2 : 7];
+ reg_t getInfoSelector() {
+ return _variables[getSciVersion() < SCI_VERSION_1_1 ? 2 : 7];
}
- void setInfoSelector(reg_t value, SciVersion version) {
- _variables[version < SCI_VERSION_1_1 ? 2 : 7] = value;
+ void setInfoSelector(reg_t value) {
+ _variables[getSciVersion() < SCI_VERSION_1_1 ? 2 : 7] = value;
}
- reg_t getNameSelector(SciVersion version) {
- return _variables[version < SCI_VERSION_1_1 ? 3 : 8];
+ reg_t getNameSelector() {
+ return _variables[getSciVersion() < SCI_VERSION_1_1 ? 3 : 8];
}
- void setNameSelector(reg_t value, SciVersion version) {
- _variables[version < SCI_VERSION_1_1 ? 3 : 8] = value;
+ void setNameSelector(reg_t value) {
+ _variables[getSciVersion() < SCI_VERSION_1_1 ? 3 : 8] = value;
}
reg_t getClassScriptSelector() {
@@ -257,18 +257,18 @@ struct Object {
_variables[4] = value;
}
- uint16 getFuncSelector(uint16 i, SciVersion version) {
- uint16 offset = (version < SCI_VERSION_1_1) ? i : i * 2 + 1;
+ uint16 getFuncSelector(uint16 i) {
+ uint16 offset = (getSciVersion() < SCI_VERSION_1_1) ? i : i * 2 + 1;
return READ_LE_UINT16((byte *) (base_method + offset));
}
- reg_t getFunction(uint16 i, SciVersion version) {
- uint16 offset = (version < SCI_VERSION_1_1) ? methods_nr + 1 + i : i * 2 + 2;
+ reg_t getFunction(uint16 i) {
+ uint16 offset = (getSciVersion() < SCI_VERSION_1_1) ? methods_nr + 1 + i : i * 2 + 2;
return make_reg(pos.segment, READ_LE_UINT16((byte *) (base_method + offset)));
}
- bool isClass(SciVersion version) {
- return (getInfoSelector(version).offset & SCRIPT_INFO_CLASS);
+ bool isClass() {
+ return (getInfoSelector().offset & SCRIPT_INFO_CLASS);
}
};
@@ -298,8 +298,6 @@ protected:
IntMapper *_objIndices;
- SciVersion _sciVersion;
-
public:
/**
* Table for objects, contains property variables.
@@ -328,7 +326,7 @@ public:
virtual reg_t findCanonicAddress(SegManager *segMan, reg_t sub_addr);
virtual void freeAtAddress(SegManager *segMan, reg_t sub_addr);
virtual void listAllDeallocatable(SegmentId segId, void *param, NoteCallback note);
- virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note, SciVersion version);
+ virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note);
virtual void saveLoadWithSerializer(Common::Serializer &ser);
@@ -484,7 +482,7 @@ public:
virtual bool isValidOffset(uint16 offset) const;
virtual byte *dereference(reg_t pointer, int *size);
virtual reg_t findCanonicAddress(SegManager *segMan, reg_t sub_addr);
- virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note, SciVersion version);
+ virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note);
virtual void saveLoadWithSerializer(Common::Serializer &ser);
};
@@ -581,7 +579,7 @@ public:
/* CloneTable */
struct CloneTable : public Table<Clone> {
virtual void freeAtAddress(SegManager *segMan, reg_t sub_addr);
- virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note, SciVersion version);
+ virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note);
virtual void saveLoadWithSerializer(Common::Serializer &ser);
};
@@ -590,7 +588,7 @@ struct CloneTable : public Table<Clone> {
/* NodeTable */
struct NodeTable : public Table<Node> {
virtual void freeAtAddress(SegManager *segMan, reg_t sub_addr);
- virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note, SciVersion version);
+ virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note);
virtual void saveLoadWithSerializer(Common::Serializer &ser);
};
@@ -599,7 +597,7 @@ struct NodeTable : public Table<Node> {
/* ListTable */
struct ListTable : public Table<List> {
virtual void freeAtAddress(SegManager *segMan, reg_t sub_addr);
- virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note, SciVersion version);
+ virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note);
virtual void saveLoadWithSerializer(Common::Serializer &ser);
};
diff --git a/engines/sci/engine/state.cpp b/engines/sci/engine/state.cpp
index aedbd92319..fbc64d8075 100644
--- a/engines/sci/engine/state.cpp
+++ b/engines/sci/engine/state.cpp
@@ -183,7 +183,7 @@ kLanguage EngineState::getLanguage() {
if (((SciEngine*)g_engine)->getKernel()->_selectorCache.printLang != -1) {
lang = (kLanguage)GET_SEL32V(this->game_obj, printLang);
- if ((segMan->sciVersion() == SCI_VERSION_1_1) || (lang == K_LANG_NONE)) {
+ if ((getSciVersion() == SCI_VERSION_1_1) || (lang == K_LANG_NONE)) {
// If language is set to none, we use the language from the game detector.
// SSCI reads this from resource.cfg (early games do not have a language
// setting in resource.cfg, but instead have the secondary language number
@@ -335,10 +335,8 @@ SciVersion EngineState::detectSetCursorType() {
SciVersion EngineState::detectLofsType() {
if (_lofsType == SCI_VERSION_AUTODETECT) {
- SciVersion version = segMan->sciVersion();
-
// This detection only works (and is only needed) pre-SCI1.1
- if (version >= SCI_VERSION_1_1) {
+ if (getSciVersion() >= SCI_VERSION_1_1) {
_lofsType = SCI_VERSION_1_1;
return _lofsType;
}
@@ -355,7 +353,7 @@ SciVersion EngineState::detectLofsType() {
// Check methods of the Game class for lofs operations
if (obj) {
for (int m = 0; m < obj->methods_nr; m++) {
- reg_t fptr = obj->getFunction(m, version);
+ reg_t fptr = obj->getFunction(m);
Script *script = segMan->getScript(fptr.segment);
@@ -440,7 +438,7 @@ SciVersion EngineState::detectLofsType() {
if (couldBeRel == couldBeAbs) {
warning("Lofs detection failed, taking an educated guess");
- if (version >= SCI_VERSION_1_MIDDLE)
+ if (getSciVersion() >= SCI_VERSION_1_MIDDLE)
_lofsType = SCI_VERSION_1_MIDDLE;
else
_lofsType = SCI_VERSION_0_EARLY;
diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp
index 93cd6aa2fb..b114af1034 100644
--- a/engines/sci/engine/vm.cpp
+++ b/engines/sci/engine/vm.cpp
@@ -915,7 +915,7 @@ void run_vm(EngineState *s, int restoring) {
scriptState.xs->sp -= (opparams[1] >> 1) + 1;
- bool oldScriptHeader = (s->segMan->sciVersion() == SCI_VERSION_0_EARLY);
+ bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY);
if (!oldScriptHeader) {
scriptState.xs->sp -= scriptState.restAdjust;
s->restAdjust = 0; // We just used up the scriptState.restAdjust, remember?
@@ -1396,17 +1396,16 @@ void run_vm(EngineState *s, int restoring) {
static int _obj_locate_varselector(SegManager *segMan, Object *obj, Selector slc) {
// Determines if obj explicitly defines slc as a varselector
// Returns -1 if not found
- SciVersion version = segMan->sciVersion(); // for the selector defines
byte *buf;
uint varnum;
- if (version < SCI_VERSION_1_1) {
+ if (getSciVersion() < SCI_VERSION_1_1) {
varnum = obj->variable_names_nr;
int selector_name_offset = varnum * 2 + SCRIPT_SELECTOR_OFFSET;
buf = obj->base_obj + selector_name_offset;
} else {
- if (!(obj->getInfoSelector(version).offset & SCRIPT_INFO_CLASS))
- obj = segMan->getObject(obj->getSuperClassSelector(version));
+ if (!(obj->getInfoSelector().offset & SCRIPT_INFO_CLASS))
+ obj = segMan->getObject(obj->getSuperClassSelector());
buf = (byte *)obj->base_vars;
varnum = obj->_variables[1].toUint16();
@@ -1419,7 +1418,7 @@ static int _obj_locate_varselector(SegManager *segMan, Object *obj, Selector slc
return -1; // Failed
}
-static int _class_locate_funcselector(Object *obj, Selector slc, SciVersion version) {
+static int _class_locate_funcselector(Object *obj, Selector slc) {
// Determines if obj is a class and explicitly defines slc as a funcselector
// Does NOT say anything about obj's superclasses, i.e. failure may be
// returned even if one of the superclasses defines the funcselector.
@@ -1427,7 +1426,7 @@ static int _class_locate_funcselector(Object *obj, Selector slc, SciVersion vers
int i;
for (i = 0; i < funcnum; i++)
- if (obj->getFuncSelector(i, version) == slc) // Found it?
+ if (obj->getFuncSelector(i) == slc) // Found it?
return i; // report success
return -1; // Failed
@@ -1435,22 +1434,21 @@ static int _class_locate_funcselector(Object *obj, Selector slc, SciVersion vers
static SelectorType _lookup_selector_function(SegManager *segMan, int seg_id, Object *obj, Selector selector_id, reg_t *fptr) {
int index;
- SciVersion version = segMan->sciVersion(); // for the selector defines
// "recursive" lookup
while (obj) {
- index = _class_locate_funcselector(obj, selector_id, version);
+ index = _class_locate_funcselector(obj, selector_id);
if (index >= 0) {
if (fptr) {
- *fptr = obj->getFunction(index, version);
+ *fptr = obj->getFunction(index);
}
return kSelectorMethod;
} else {
- seg_id = obj->getSuperClassSelector(version).segment;
- obj = segMan->getObject(obj->getSuperClassSelector(version));
+ seg_id = obj->getSuperClassSelector().segment;
+ obj = segMan->getObject(obj->getSuperClassSelector());
}
}
@@ -1461,8 +1459,7 @@ SelectorType lookup_selector(SegManager *segMan, reg_t obj_location, Selector se
Object *obj = segMan->getObject(obj_location);
Object *species;
int index;
- SciVersion version = segMan->sciVersion(); // for the selector defines
- bool oldScriptHeader = (version == SCI_VERSION_0_EARLY);
+ bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY);
// Early SCI versions used the LSB in the selector ID as a read/write
// toggle, meaning that we must remove it for selector lookup.
@@ -1474,15 +1471,15 @@ SelectorType lookup_selector(SegManager *segMan, reg_t obj_location, Selector se
PRINT_REG(obj_location));
}
- if (obj->isClass(version))
+ if (obj->isClass())
species = obj;
else
- species = segMan->getObject(obj->getSpeciesSelector(version));
+ species = segMan->getObject(obj->getSpeciesSelector());
if (!obj) {
error("lookup_selector(): Error while looking up Species class.\nOriginal address was %04x:%04x. Species address was %04x:%04x",
- PRINT_REG(obj_location), PRINT_REG(obj->getSpeciesSelector(version)));
+ PRINT_REG(obj_location), PRINT_REG(obj->getSpeciesSelector()));
return kSelectorNone;
}
@@ -1688,14 +1685,14 @@ int script_instantiate_sci0(ResourceManager *resMan, SegManager *segMan, int scr
Object *base_obj;
// Instantiate the superclass, if neccessary
- obj->setSpeciesSelector(INST_LOOKUP_CLASS(obj->getSpeciesSelector(version).offset), version);
+ obj->setSpeciesSelector(INST_LOOKUP_CLASS(obj->getSpeciesSelector().offset));
- base_obj = segMan->getObject(obj->getSpeciesSelector(version));
+ base_obj = segMan->getObject(obj->getSpeciesSelector());
obj->variable_names_nr = base_obj->_variables.size();
obj->base_obj = base_obj->base_obj;
// Copy base from species class, as we need its selector IDs
- obj->setSuperClassSelector(INST_LOOKUP_CLASS(obj->getSuperClassSelector(version).offset), version);
+ obj->setSuperClassSelector(INST_LOOKUP_CLASS(obj->getSuperClassSelector().offset));
} // if object or class
break;
case SCI_OBJ_POINTERS: // A relocation table
@@ -1758,11 +1755,10 @@ int script_instantiate(ResourceManager *resMan, SegManager *segMan, int script_n
}
void script_uninstantiate_sci0(SegManager *segMan, int script_nr, SegmentId seg) {
- bool oldScriptHeader = (segMan->sciVersion() == SCI_VERSION_0_EARLY);
+ bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY);
reg_t reg = make_reg(seg, oldScriptHeader ? 2 : 0);
int objtype, objlength;
Script *scr = segMan->getScript(seg);
- SciVersion version = segMan->sciVersion();
// Make a pass over the object in order uninstantiate all superclasses
objlength = 0;
@@ -1823,7 +1819,7 @@ void script_uninstantiate(SegManager *segMan, int script_nr) {
if (segMan->_classtable[i].reg.segment == segment)
segMan->_classtable[i].reg = NULL_REG;
- if (segMan->sciVersion() < SCI_VERSION_1_1)
+ if (getSciVersion() < SCI_VERSION_1_1)
script_uninstantiate_sci0(segMan, script_nr, segment);
else
warning("FIXME: Add proper script uninstantiation for SCI 1.1");
diff --git a/engines/sci/engine/vm.h b/engines/sci/engine/vm.h
index fa1b4f8817..f712193753 100644
--- a/engines/sci/engine/vm.h
+++ b/engines/sci/engine/vm.h
@@ -67,10 +67,10 @@ class ResourceManager;
#define SCRIPT_FUNCTAREAPTR_MAGIC 8 -8
/** Offset of the name pointer */
-#define SCRIPT_NAME_OFFSET (version < SCI_VERSION_1_1 ? 14 -8 : 16)
+#define SCRIPT_NAME_OFFSET (getSciVersion() < SCI_VERSION_1_1 ? 14 -8 : 16)
/** Object-relative offset of the -info- selector */
-#define SCRIPT_INFO_OFFSET (version < SCI_VERSION_1_1 ? 12 -8 : 14)
+#define SCRIPT_INFO_OFFSET (getSciVersion() < SCI_VERSION_1_1 ? 12 -8 : 14)
/** Flag fo the -info- selector */
#define SCRIPT_INFO_CLONE 0x0001
@@ -82,12 +82,12 @@ class ResourceManager;
/** Magical object identifier */
#define SCRIPT_OBJECT_MAGIC_NUMBER 0x1234
/** Offset of this identifier */
-#define SCRIPT_OBJECT_MAGIC_OFFSET (version < SCI_VERSION_1_1 ? -8 : 0)
+#define SCRIPT_OBJECT_MAGIC_OFFSET (getSciVersion() < SCI_VERSION_1_1 ? -8 : 0)
/** Script-relative offset of the species ID */
#define SCRIPT_SPECIES_OFFSET 8 -8
-#define SCRIPT_SUPERCLASS_OFFSET (version < SCI_VERSION_1_1 ? 10 -8 : 12)
+#define SCRIPT_SUPERCLASS_OFFSET (getSciVersion() < SCI_VERSION_1_1 ? 10 -8 : 12)
/** Magic adjustment value for lofsa and lofss */
#define SCRIPT_LOFS_MAGIC 3
diff --git a/engines/sci/sci.h b/engines/sci/sci.h
index 3de7e6a86c..6f7eb90c6a 100644
--- a/engines/sci/sci.h
+++ b/engines/sci/sci.h
@@ -137,6 +137,14 @@ private:
Console *_console;
};
+/**
+ * Convenience function to obtain the active SCI version.
+ */
+inline static SciVersion getSciVersion() {
+ return ((SciEngine*)g_engine)->getVersion();
+}
+
+
} // End of namespace Sci
#endif // SCI_H