diff options
| author | Benjamin Haisch | 2008-04-23 08:08:37 +0000 | 
|---|---|---|
| committer | Benjamin Haisch | 2008-04-23 08:08:37 +0000 | 
| commit | 6069dba988e9940b4d5285d6abc01b83967f8702 (patch) | |
| tree | 3e70fa2ecffca571d1dde627a5f052653a44ae57 /engines/made/database.cpp | |
| parent | 18ed600abea41fee47f92fa798f6fe49c5c37d25 (diff) | |
| download | scummvm-rg350-6069dba988e9940b4d5285d6abc01b83967f8702.tar.gz scummvm-rg350-6069dba988e9940b4d5285d6abc01b83967f8702.tar.bz2 scummvm-rg350-6069dba988e9940b4d5285d6abc01b83967f8702.zip | |
Implemented direct loading of rtzcd.dat from the archive rtzcd.red, i.e. the game doesn't have to be installed first to get rtzcd.dat. Also added the respective detection entry.
svn-id: r31661
Diffstat (limited to 'engines/made/database.cpp')
| -rw-r--r-- | engines/made/database.cpp | 75 | 
1 files changed, 51 insertions, 24 deletions
| diff --git a/engines/made/database.cpp b/engines/made/database.cpp index d8330278ec..816df58510 100644 --- a/engines/made/database.cpp +++ b/engines/made/database.cpp @@ -117,6 +117,16 @@ const char *Object::getString() {  		return NULL;  } +void Object::setString(const char *str) { +	if (getClass() == 0x7FFF) { +		char *objStr = (char*)getData(); +		if (str) +			strncpy(objStr, str, getSize()); +		else +			objStr[0] = '\0'; +	} +} +  bool Object::isObject() {  	return getClass() < 0x7FFE;  } @@ -181,31 +191,48 @@ GameDatabase::~GameDatabase() {  }  void GameDatabase::open(const char *filename) { -	_fd.open(filename); +	debug(1, "GameDatabase::open() Loading from %s", filename); +	Common::File fd; +	if (!fd.open(filename)) +		error("GameDatabase::open() Could not open %s", filename); +	load(fd); +	fd.close(); +} + +void GameDatabase::openFromRed(const char *redFilename, const char *filename) { +	debug(1, "GameDatabase::openFromRed() Loading from %s->%s", redFilename, filename); +	Common::MemoryReadStream *fileS = RedReader::loadFromRed(redFilename, filename); +	if (!fileS) +		error("GameDatabase::openFromRed() Could not load %s from %s", filename, redFilename); +	load(*fileS); +	delete fileS; +} + +void GameDatabase::load(Common::SeekableReadStream &sourceS) {  	// TODO: Read/verifiy header -	_fd.seek(0x1E); +	sourceS.seek(0x1E); -	uint32 objectIndexOffs = _fd.readUint32LE(); -	uint16 objectCount = _fd.readUint16LE(); -	uint32 gameStateOffs = _fd.readUint32LE(); -	_gameStateSize = _fd.readUint32LE(); -	uint32 objectsOffs = _fd.readUint32LE(); -	uint32 objectsSize = _fd.readUint32LE(); -	_mainCodeObjectIndex = _fd.readUint16LE(); +	uint32 objectIndexOffs = sourceS.readUint32LE(); +	uint16 objectCount = sourceS.readUint16LE(); +	uint32 gameStateOffs = sourceS.readUint32LE(); +	_gameStateSize = sourceS.readUint32LE(); +	uint32 objectsOffs = sourceS.readUint32LE(); +	uint32 objectsSize = sourceS.readUint32LE(); +	_mainCodeObjectIndex = sourceS.readUint16LE();  	debug(2, "objectIndexOffs = %08X; objectCount = %d; gameStateOffs = %08X; gameStateSize = %d; objectsOffs = %08X; objectsSize = %d\n",  		objectIndexOffs, objectCount, gameStateOffs, _gameStateSize, objectsOffs, objectsSize);  	_gameState = new byte[_gameStateSize]; -	_fd.seek(gameStateOffs); -	_fd.read(_gameState, _gameStateSize); +	sourceS.seek(gameStateOffs); +	sourceS.read(_gameState, _gameStateSize);  	Common::Array<uint32> objectOffsets; -	_fd.seek(objectIndexOffs); +	sourceS.seek(objectIndexOffs);  	for (uint32 i = 0; i < objectCount; i++) -		objectOffsets.push_back(_fd.readUint32LE()); +		objectOffsets.push_back(sourceS.readUint32LE());  	for (uint32 i = 0; i < objectCount; i++) {  		Object *obj = new Object(); @@ -218,8 +245,8 @@ void GameDatabase::open(const char *filename) {  		if (objectOffsets[i] & 1) {  			debug(2, "-> const %08X\n", objectsOffs + objectOffsets[i] - 1); -			_fd.seek(objectsOffs + objectOffsets[i] - 1); -			obj->load(_fd); +			sourceS.seek(objectsOffs + objectOffsets[i] - 1); +			obj->load(sourceS);  		} else {  			debug(2, "-> var\n");  			obj->load(_gameState + objectOffsets[i]); @@ -253,11 +280,11 @@ int16 *GameDatabase::getObjectPropertyPtr(int16 objectIndex, int16 propertyId, i  	while (count2-- > 0) {  		if ((READ_LE_UINT16(prop) & 0x3FFF) == propertyId) {  			if (READ_LE_UINT16(prop) & 0x4000) { -				debug(2, "! L1.1\n"); +				//debug(2, "! L1.1\n");  				propertyFlag = 1;  				return (int16*)_gameState + READ_LE_UINT16(propPtr1);  			} else { -				debug(2, "! L1.2\n"); +				//debug(2, "! L1.2\n");  				propertyFlag = obj->getFlags() & 1;  				return propPtr1;  			} @@ -269,13 +296,13 @@ int16 *GameDatabase::getObjectPropertyPtr(int16 objectIndex, int16 propertyId, i  	// Now check in the object hierarchy of the given object  	int16 parentObjectIndex = obj->getClass();  	if (parentObjectIndex == 0) { -		debug(2, "! NULL(np)\n"); +		//debug(2, "! NULL(np)\n");  		return NULL;  	}  	while (parentObjectIndex != 0) { -		debug(2, "parentObjectIndex = %04X\n", parentObjectIndex); +		//debug(2, "parentObjectIndex = %04X\n", parentObjectIndex);  		obj = getObject(parentObjectIndex); @@ -290,11 +317,11 @@ int16 *GameDatabase::getObjectPropertyPtr(int16 objectIndex, int16 propertyId, i  			if (!(READ_LE_UINT16(prop) & 0x8000)) {  				if ((READ_LE_UINT16(prop) & 0x3FFF) == propertyId) {  					if (*prop & 0x4000) { -						debug(2, "! L2.1\n"); +						//debug(2, "! L2.1\n");  						propertyFlag = 1;  						return (int16*)_gameState + READ_LE_UINT16(propPtr1);  					} else { -						debug(2, "! L2.2\n"); +						//debug(2, "! L2.2\n");  						propertyFlag = obj->getFlags() & 1;  						return propPtr1;  					} @@ -304,11 +331,11 @@ int16 *GameDatabase::getObjectPropertyPtr(int16 objectIndex, int16 propertyId, i  			} else {  				if ((READ_LE_UINT16(prop) & 0x3FFF) == propertyId) {  					if (*prop & 0x4000) { -						debug(2, "! L3.1\n"); +						//debug(2, "! L3.1\n");  						propertyFlag = 1;  						return (int16*)_gameState + READ_LE_UINT16(propertyPtr);  					} else { -						debug(2, "! L3.2\n"); +						//debug(2, "! L3.2\n");  						propertyFlag = obj->getFlags() & 1;  						return propertyPtr;  					} @@ -322,7 +349,7 @@ int16 *GameDatabase::getObjectPropertyPtr(int16 objectIndex, int16 propertyId, i  	} -	debug(2, "! NULL(nf)\n"); +	//debug(2, "! NULL(nf)\n");  	return NULL;  } | 
