SCI: Add a global getSciVersion() function and make use of it

svn-id: r44170
This commit is contained in:
Max Horn 2009-09-17 16:50:53 +00:00
parent 9651562e72
commit eb77efda78
16 changed files with 104 additions and 123 deletions

View file

@ -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);

View file

@ -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);
}
}

View file

@ -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

View file

@ -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);
}

View file

@ -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");

View file

@ -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;

View file

@ -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();

View file

@ -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);

View file

@ -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;

View file

@ -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 */

View file

@ -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;

View file

@ -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);
};

View file

@ -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;

View file

@ -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");

View file

@ -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

View file

@ -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