diff options
Diffstat (limited to 'engines/sci/engine/segment.h')
-rw-r--r-- | engines/sci/engine/segment.h | 49 |
1 files changed, 24 insertions, 25 deletions
diff --git a/engines/sci/engine/segment.h b/engines/sci/engine/segment.h index 38f1895fdd..7266dc3b38 100644 --- a/engines/sci/engine/segment.h +++ b/engines/sci/engine/segment.h @@ -217,16 +217,16 @@ public: reg_t getClassScriptSelector() { return _variables[4]; } void setClassScriptSelector(reg_t value) { _variables[4] = value; } - Selector 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); + Selector getVarSelector(uint16 i) { return *(_baseVars + i); } + + reg_t getFunction(uint16 i) { + uint16 offset = (getSciVersion() < SCI_VERSION_1_1) ? _methodCount + 1 + i : i * 2 + 2; + return make_reg(_pos.segment, READ_LE_UINT16((byte *) (_baseMethod + offset))); } Selector getFuncSelector(uint16 i) { uint16 offset = (getSciVersion() < SCI_VERSION_1_1) ? i : i * 2 + 1; - return READ_LE_UINT16((byte *) (base_method + offset)); + return READ_LE_UINT16((byte *) (_baseMethod + offset)); } /** @@ -243,11 +243,6 @@ public: return -1; } - reg_t getFunction(uint16 i) { - uint16 offset = (getSciVersion() < SCI_VERSION_1_1) ? _methodCount + 1 + i : i * 2 + 2; - return make_reg(_pos.segment, READ_LE_UINT16((byte *) (base_method + offset))); - } - bool isClass() { return (getInfoSelector().offset & SCRIPT_INFO_CLASS); } void markAsFreed() { _flags |= OBJECT_FLAG_FREED; } @@ -258,19 +253,19 @@ public: void init(byte *buf, reg_t obj_pos) { byte *data = (byte *)(buf + obj_pos.offset); - base_obj = data; + _baseObj = data; _pos = obj_pos; if (getSciVersion() < SCI_VERSION_1_1) { - setVarCount(READ_LE_UINT16(data + SCRIPT_SELECTORCTR_OFFSET)); - base_vars = 0; - base_method = (uint16 *)(data + READ_LE_UINT16(data + SCRIPT_FUNCTAREAPTR_OFFSET)); - _methodCount = READ_LE_UINT16(base_method - 1); + _variables.resize(READ_LE_UINT16(data + SCRIPT_SELECTORCTR_OFFSET)); + _baseVars = (uint16 *)(_baseObj + _variables.size() * 2); + _baseMethod = (uint16 *)(data + READ_LE_UINT16(data + SCRIPT_FUNCTAREAPTR_OFFSET)); + _methodCount = READ_LE_UINT16(_baseMethod - 1); } else { - setVarCount(READ_LE_UINT16(data + 2)); - base_vars = (uint16 *)(buf + READ_LE_UINT16(data + 4)); - base_method = (uint16 *)(buf + READ_LE_UINT16(data + 6)); - _methodCount = READ_LE_UINT16(base_method); + _variables.resize(READ_LE_UINT16(data + 2)); + _baseVars = (uint16 *)(buf + READ_LE_UINT16(data + 4)); + _baseMethod = (uint16 *)(buf + READ_LE_UINT16(data + 6)); + _methodCount = READ_LE_UINT16(_baseMethod); } for (uint i = 0; i < _variables.size(); i++) @@ -284,13 +279,17 @@ public: void saveLoadWithSerializer(Common::Serializer &ser); - // TODO: make private. Used by validate_property(), ObjVarRef::getPointer and Script::relocateObject - Common::Array<reg_t> _variables; + void cloneFromObject(Object *obj) { + _baseObj = obj ? obj->_baseObj : NULL; + _baseMethod = obj ? obj->_baseMethod : NULL; + _baseVars = obj ? obj->_baseVars : NULL; + } // TODO: make private - byte *base_obj; /**< base + object offset within base */ - uint16 *base_method; /**< Pointer to the method selector area for this object */ - uint16 *base_vars; /**< Pointer to the varselector area for this object */ + Common::Array<reg_t> _variables; + byte *_baseObj; /**< base + object offset within base */ + uint16 *_baseVars; /**< Pointer to the varselector area for this object */ + uint16 *_baseMethod; /**< Pointer to the method selector area for this object */ private: uint16 _methodCount; |