[Scummvm-cvs-logs] CVS: scummvm/queen module.mk,1.5,1.6 resource.cpp,1.7,1.8 resource.h,1.7,1.8 restables.cpp,1.3,1.4 version.cpp,1.3,NONE

Joost Peters joostp at users.sourceforge.net
Mon Oct 6 16:41:39 CEST 2003


Update of /cvsroot/scummvm/scummvm/queen
In directory sc8-pr-cvs1:/tmp/cvs-serv9484/queen

Modified Files:
	module.mk resource.cpp resource.h restables.cpp 
Removed Files:
	version.cpp 
Log Message:
added resource-table loading from external file

Index: module.mk
===================================================================
RCS file: /cvsroot/scummvm/scummvm/queen/module.mk,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- module.mk	5 Oct 2003 16:07:07 -0000	1.5
+++ module.mk	6 Oct 2003 23:04:00 -0000	1.6
@@ -7,7 +7,6 @@
 	queen/queen.o \
 	queen/resource.o \
 	queen/restables.o \
-	queen/version.o \
 
 # This module can be built as a plugin
 ifdef BUILD_PLUGINS

Index: resource.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/queen/resource.cpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- resource.cpp	5 Oct 2003 16:07:07 -0000	1.7
+++ resource.cpp	6 Oct 2003 23:04:00 -0000	1.8
@@ -28,8 +28,23 @@
 #define JAS_VERSION_OFFSET	0x12484
 
 static const char *dataFilename = "queen.1";
+static const char *tableFilename = "queen.tbl";
 
-Resource::Resource(char *datafilePath) {
+const GameVersion Resource::_gameVersions[] = {
+	{ "PEM10", true,  false, 0x00000008 },
+	{ "CEM10", false, false, 0x0000584E },
+	{ "PFM10", true,  false, 0x0002CD93 },
+	{ "CFM10", false, false, 0x00032585 },
+	{ "PGM10", true,  false, 0x00059ACA },
+	{ "CGM10", false, false, 0x0005F2A7 },
+	{ "PIM10", true,  false, 0x000866B1 },
+	{ "CIM10", false, false, 0x0008BEE2 },
+	{ "PE100", true,  true,  0x000B343C },
+	{ "PE100", true,  true,  0x000B40F5 }
+};
+
+Resource::Resource(char *datafilePath)
+	: _resourceEntries(0), _resourceTable(NULL) {
 
 	_datafilePath = datafilePath;
 	_resourceFile = new File();
@@ -37,35 +52,30 @@
 	if (_resourceFile->isOpen() == false)
 		error("Could not open resource file '%s%s'", _datafilePath, dataFilename);
 
-	//detect game version based on resource file size.
-	//we try to verify that it is indeed the version we think it is later on
-
-	switch(_resourceFile->size()) {
-		case 3724538:
-			_gameVersion = &_gameVersionPE100v1;
-			break;
-		case 3732177:
-			_gameVersion = &_gameVersionPE100v2;
-			break;
-		case 22677657:
-			_gameVersion = &_gameVersionPEM10;
-			break;
-		case 190787021:
-			_gameVersion = &_gameVersionCEM10;
-			break;
-		default:
-			error("Unknown/unsupported FOTAQ version");
+	
+	_gameVersion = detectGameVersion(_resourceFile->size());
+	
+	if (!readTableFile()) {
+		//check if it is the english floppy version, for which we have a hardcoded version of the tables
+		if (!strcmp(_gameVersion->versionString, _gameVersions[VER_ENG_FLOPPY].versionString)) {
+			_gameVersion = &_gameVersions[VER_ENG_FLOPPY];
+			_resourceEntries = 1076;
+			_resourceTable = _resourceTablePEM10;
+		} else {
+			error("Couldn't find tablefile '%s%s'", _datafilePath, tableFilename);
+		}
 	}
 
-	debug(5, "Detected game version: %s, which has %d resource entries", _gameVersion->versionString, _gameVersion->resourceEntries);
-
 	if (strcmp(_gameVersion->versionString, JASVersion()))
-			error("Verifying game version failed! (expected: '%s', found: '%s')", _gameVersion->versionString, JASVersion());
+		error("Verifying game version failed! (expected: '%s', found: '%s')", _gameVersion->versionString, JASVersion());
 
+	debug(5, "Detected game version: %s, which has %d resource entries", _gameVersion->versionString, _resourceEntries);
 }
 
 Resource::~Resource() {
 	_resourceFile->close();
+	if(_resourceTable != _resourceTablePEM10) 
+		delete[] _resourceTable;
 }
 
 int32 Resource::resourceIndex(const char *filename) {
@@ -80,18 +90,18 @@
 	while (*ptr++);
 
 	uint32 low = 0;
-	uint32 high = _gameVersion->resourceEntries - 1;
+	uint32 high = _resourceEntries - 1;
 
-	if (!strcmp(entryName, _gameVersion->resourceTable[low].filename))
+	if (!strcmp(entryName, _resourceTable[low].filename))
 		return low;
-	if (!strcmp(entryName, _gameVersion->resourceTable[high].filename))
+	if (!strcmp(entryName, _resourceTable[high].filename))
 		return high;
 	
 
 	//Use simple binary search to locate file
 	for(;;) {
 		uint32 cur = (low + high) / 2;
-		int32 diff = strcmp(entryName, _gameVersion->resourceTable[cur].filename);
+		int32 diff = strcmp(entryName, _resourceTable[cur].filename);
 
 		if (!diff)
 			return cur;
@@ -110,11 +120,11 @@
 }
 
 uint32 Resource::fileSize(const char *filename) {
-	return _gameVersion->resourceTable[resourceIndex(filename)].size;
+	return _resourceTable[resourceIndex(filename)].size;
 }
 
 uint32 Resource::fileOffset(const char *filename) {
-	return _gameVersion->resourceTable[resourceIndex(filename)].offset;
+	return _resourceTable[resourceIndex(filename)].offset;
 }
 
 uint8 *Resource::loadFile(const char *filename, uint32 skipBytes) {
@@ -142,6 +152,67 @@
 
 bool Resource::isDemo() {
 	return _gameVersion->isDemo;
+}
+
+const GameVersion *Resource::detectGameVersion(uint32 dataFilesize) {
+	const GameVersion *pgv = NULL;
+	//detect game version based on resource file size.
+	//we try to verify that it is indeed the version we think it is later on
+	switch(dataFilesize) {
+	case 3724538:
+		pgv = &_gameVersions[VER_DEMO_PCGAMES];
+		break;
+	case 3732177:
+		pgv = &_gameVersions[VER_DEMO];
+		break;
+	case 22677657:
+		pgv = &_gameVersions[VER_ENG_FLOPPY];
+		break;
+	case 190787021:
+		pgv = &_gameVersions[VER_ENG_TALKIE];
+		break;
+	case 22157304: // computed from FREH_FAT.H
+		pgv = &_gameVersions[VER_FRE_FLOPPY];
+		break;
+	case 186689095:
+		pgv = &_gameVersions[VER_FRE_TALKIE];
+		break;
+	case 22240013: // computed from GERH_FAT.H
+		pgv = &_gameVersions[VER_GER_FLOPPY];
+		break;
+	case 217648975: // computed from GERC_FAT.H
+		pgv = &_gameVersions[VER_GER_TALKIE];
+		break;
+	case 22461366: // computed from ITAH_FAT.H
+		pgv = &_gameVersions[VER_ITA_FLOPPY];
+		break;
+	case 190795582: // computed from ITAC_FAT.H
+		pgv = &_gameVersions[VER_ITA_TALKIE];
+		break;
+	default:
+		error("Unknown/unsupported FOTAQ version");
+	}
+	return pgv;
+}
+
+bool Resource::readTableFile() {
+	File tableFile;
+	tableFile.open(tableFilename, _datafilePath);
+	if (tableFile.isOpen() && tableFile.readUint32BE() == 'QTBL') {
+		tableFile.seek(_gameVersion->tableOffset);
+		_resourceEntries = tableFile.readUint16BE();
+		_resourceTable = new ResourceEntry[_resourceEntries];
+		ResourceEntry *pre = _resourceTable;
+		for (uint32 i = 0; i < _resourceEntries; ++i, ++pre) {
+			tableFile.read(pre->filename, 12);
+			pre->filename[12] = '\0';
+			pre->inBundle = tableFile.readByte();
+			pre->offset = tableFile.readUint32BE();
+			pre->size = tableFile.readUint32BE();
+		}
+		return true;
+	}
+	return false;
 }
 
 } // End of namespace Queen

Index: resource.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/queen/resource.h,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- resource.h	5 Oct 2003 16:07:07 -0000	1.7
+++ resource.h	6 Oct 2003 23:04:00 -0000	1.8
@@ -26,6 +26,19 @@
 
 namespace Queen {
 
+enum {
+	VER_ENG_FLOPPY   = 0,
+	VER_ENG_TALKIE   = 1,
+	VER_FRE_FLOPPY   = 2,
+	VER_FRE_TALKIE   = 3,
+	VER_GER_FLOPPY   = 4,
+	VER_GER_TALKIE   = 5,
+	VER_ITA_FLOPPY   = 6,
+	VER_ITA_TALKIE   = 7,
+	VER_DEMO_PCGAMES = 8,
+	VER_DEMO         = 9
+};
+
 struct ResourceEntry {
 	char filename[13];
 	uint8 inBundle;
@@ -35,10 +48,9 @@
 
 struct GameVersion {
 	char versionString[6];
-	uint32 resourceEntries;
 	bool isFloppy;   
 	bool isDemo;
-	const struct ResourceEntry *resourceTable;	
+	uint32 tableOffset;
 };
 
 
@@ -54,20 +66,18 @@
 protected:
 	File *_resourceFile;
 	char *_datafilePath;
-	const struct GameVersion *_gameVersion;
-	static const struct GameVersion _gameVersionPE100v1;
-	static const struct GameVersion _gameVersionPE100v2;
-	static const struct GameVersion _gameVersionPEM10;
-	static const struct GameVersion _gameVersionCEM10;
-	static const struct ResourceEntry _resourceTablePE100v1[];
-	static const struct ResourceEntry _resourceTablePE100v2[];
-	static const struct ResourceEntry _resourceTablePEM10[];
-	static const struct ResourceEntry _resourceTableCEM10[];
+	const GameVersion *_gameVersion;
+	uint32 _resourceEntries;
+	ResourceEntry *_resourceTable;
+	static const GameVersion _gameVersions[];
+	static ResourceEntry _resourceTablePEM10[];
 
 	int32 resourceIndex(const char *filename);
 	uint32 fileSize(const char *filename);
 	uint32 fileOffset(const char *filename);
 	const char *JASVersion();
+	bool readTableFile();
+	static const GameVersion *detectGameVersion(uint32 dataFilesize);
 };
 
 } // End of namespace Queen

Index: restables.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/queen/restables.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- restables.cpp	5 Oct 2003 16:07:07 -0000	1.3
+++ restables.cpp	6 Oct 2003 23:04:00 -0000	1.4
@@ -23,326 +23,9 @@
 
 namespace Queen {
 
-//English Floppy Demo v1
-const ResourceEntry Resource::_resourceTablePE100v1[] = {
-	{ "ANDERSON.ACT", 1, 0x00000000, 0x00007c0a },
-	{ "AQ8.RL", 1, 0x00007c0a, 0x000167f8 },
-	{ "AQBANK.MUS", 1, 0x0001e402, 0x0002db36 },
-	{ "AQBANK.RL", 1, 0x0004bf38, 0x000059e9 },
-	{ "C11.BBK", 1, 0x00051921, 0x0000bf94 },
-	{ "C11.PCX", 1, 0x0005d8b5, 0x0000c01a },
[...7978 lines suppressed...]
-	{ "X5.PCX", 1, 0x0b4bc475, 0x0000adeb },
-	{ "X5_SPARK.ACT", 1, 0x0b4c7260, 0x00006e5a },
-	{ "X6.BAK", 1, 0x0b4ce0ba, 0x0000f95a },
-	{ "X6.BBK", 1, 0x0b4dda14, 0x0001889e },
-	{ "X6.PCX", 1, 0x0b4f62b2, 0x0000be75 },
-	{ "X6_HUGH.ACT", 1, 0x0b502127, 0x0000c25a },
-	{ "X7.BBK", 1, 0x0b50e381, 0x00002ada },
-	{ "X7.PCX", 1, 0x0b510e5b, 0x00009456 },
-	{ "X7A.SAM", 1, 0x0b51a2b1, 0x0001b7cb },
-	{ "X7B.SAM", 1, 0x0b535a7c, 0x0003b107 },
-	{ "X8.BBK", 1, 0x0b570b83, 0x00032a14 },
-	{ "X8.PCX", 1, 0x0b5a3597, 0x00013d4f },
-	{ "X9.BBK", 1, 0x0b5b72e6, 0x00028337 },
-	{ "X9.PCX", 1, 0x0b5df61d, 0x0000a31c },
-	{ "ZOMBIE.ACT", 1, 0x0b5e9939, 0x000078ea },
-	{ "ZOMBIE1.DOG", 1, 0x0b5f1223, 0x00000f6a },
-	{ "ZOMBIE2.DOG", 1, 0x0b5f218d, 0x00000c40 }
 };
 
 } // End of namespace Queen

--- version.cpp DELETED ---





More information about the Scummvm-git-logs mailing list