[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