aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--queen/journal.cpp2
-rw-r--r--queen/logic.cpp26
-rw-r--r--queen/resource.cpp200
-rw-r--r--queen/resource.h47
4 files changed, 132 insertions, 143 deletions
diff --git a/queen/journal.cpp b/queen/journal.cpp
index f2e36ff550..076e92402a 100644
--- a/queen/journal.cpp
+++ b/queen/journal.cpp
@@ -543,7 +543,7 @@ void Journal::showInformationBox() {
_vm->graphics()->textSetCentered(144, "Fran\x87""ais", false);
break;
}
- char versionId[12];
+ char versionId[13];
sprintf(versionId, "Version %c.%c%c", ver[2], ver[3], ver[4]);
_vm->graphics()->textSetCentered(156, versionId, false);
}
diff --git a/queen/logic.cpp b/queen/logic.cpp
index 732424174a..a5a9c6b0b8 100644
--- a/queen/logic.cpp
+++ b/queen/logic.cpp
@@ -2458,25 +2458,15 @@ void Logic::changeRoom() {
if (currentRoom() == ROOM_JUNGLE_PINNACLE) {
handlePinnacleRoom();
- }
- else if (currentRoom() == FOTAQ_LOGO && gameState(VAR_INTRO_PLAYED) == 0) {
- // FIXME: this should be rewritten in a more elegant way
- bool pcGamesDemo = _vm->resource()->isDemo() && !_vm->resource()->exists("pclogo.cut");
+ } else if (currentRoom() == FOTAQ_LOGO && gameState(VAR_INTRO_PLAYED) == 0) {
- if (pcGamesDemo) {
+ if (_vm->resource()->isDemo())
currentRoom(79);
- }
roomDisplay(currentRoom(), RDM_FADE_NOJOE, 100, 2, true);
if (_vm->resource()->isDemo()) {
- if (pcGamesDemo) {
- playCutaway("clogo.cut");
- }
- else {
- playCutaway("pclogo.cut");
- }
- }
- else {
+ playCutaway("clogo.cut");
+ } else {
playCutaway("copy.cut");
playCutaway("clogo.cut");
@@ -2485,8 +2475,7 @@ void Logic::changeRoom() {
if (ConfMan.getBool("alt_intro")) {
_vm->graphics()->loadPanel();
playCutaway("cintr.cut");
- }
- else {
+ } else {
playCutaway("cdint.cut");
_vm->graphics()->loadPanel();
}
@@ -2507,8 +2496,7 @@ void Logic::changeRoom() {
inventorySetup();
inventoryRefresh();
- }
- else {
+ } else {
roomDisplay(currentRoom(), RDM_FADE_JOE, 100, 1, false);
}
_vm->display()->showMouseCursor(true); // _drawMouseFlag = 1;
@@ -2569,7 +2557,7 @@ void Logic::checkOptionSettings() {
// XXX check master_volume value
// only CD-ROM version has speech
- if (_vm->resource()->JASVersion()[0] != 'C' && _vm->sound()->speechOn()) {
+ if (_vm->resource()->isFloppy() && _vm->sound()->speechOn()) {
_vm->sound()->speechToggle(false);
}
diff --git a/queen/resource.cpp b/queen/resource.cpp
index cd4daf7c8d..e2d6811627 100644
--- a/queen/resource.cpp
+++ b/queen/resource.cpp
@@ -28,17 +28,17 @@ namespace Queen {
const char *Resource::_tableFilename = "queen.tbl";
const GameVersion Resource::_gameVersions[] = {
- { "PEM10", false, 0x00000008, 22677657 },
- { "CEM10", false, 0x0000584E, 190787021 },
- { "PFM10", false, 0x0002CD93, 22157304 },
- { "CFM10", false, 0x00032585, 186689095 },
- { "PGM10", false, 0x00059ACA, 22240013 },
- { "CGM10", false, 0x0005F2A7, 217648975 },
- { "PIM10", false, 0x000866B1, 22461366 },
- { "CIM10", false, 0x0008BEE2, 190795582 },
- { "CSM10", false, 0x000B343C, 190730602 },
- { "PE100", true, 0x000DA981, 3724538 },
- { "PE100", true, 0x000DB63A, 3732177 }
+ { "PEM10", 0x00000008, 22677657 },
+ { "CEM10", 0x0000584E, 190787021 },
+ { "PFM10", 0x0002CD93, 22157304 },
+ { "CFM10", 0x00032585, 186689095 },
+ { "PGM10", 0x00059ACA, 22240013 },
+ { "CGM10", 0x0005F2A7, 217648975 },
+ { "PIM10", 0x000866B1, 22461366 },
+ { "CIM10", 0x0008BEE2, 190795582 },
+ { "CSM10", 0x000B343C, 190730602 },
+ { "PE100", 0x000DA981, 3724538 },
+ { "PE100", 0x000DB63A, 3732177 }
};
@@ -46,46 +46,23 @@ Resource::Resource(const Common::String &datafilePath, SaveFileManager *mgr, con
: _JAS2Pos(0), _datafilePath(datafilePath), _savePath(savePath), _resourceEntries(0), _resourceTable(NULL), _saveFileManager(mgr) {
_resourceFile = new File();
- _resourceFile->open("queen.1", _datafilePath);
- if (_resourceFile->isOpen() == false)
- _resourceFile->open("queen.1c", _datafilePath);
- if (_resourceFile->isOpen() == false)
+ if (!findNormalVersion() && !findCompressedVersion())
error("Could not open resource file '%s%s'", _datafilePath.c_str(), "queen.1");
-
- if (_resourceFile->readUint32BE() == 'QTBL') {
- readTableCompResource();
- } else {
- _compression = COMPRESSION_NONE;
- _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.c_str(), _tableFilename);
- }
- }
- }
- if (strcmp(_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);
-
+ checkJASVersion();
+ debug(5, "Detected game version: %s, which has %d resource entries", _versionString, _resourceEntries);
_JAS2Ptr = (char *)loadFile("QUEEN2.JAS", 0);
}
Resource::~Resource() {
_resourceFile->close();
+ delete _resourceFile;
if(_resourceTable != _resourceTablePEM10)
delete[] _resourceTable;
delete[] _JAS2Ptr;
delete _saveFileManager;
}
-int32 Resource::resourceIndex(const char *filename) {
+int32 Resource::resourceIndex(const char *filename) const {
char entryName[14];
char *ptr = entryName;
@@ -136,14 +113,6 @@ char *Resource::getJAS2Line() {
return startOfLine;
}
-uint32 Resource::fileSize(const char *filename) {
- return _resourceTable[resourceIndex(filename)].size;
-}
-
-uint32 Resource::fileOffset(const char *filename) {
- return _resourceTable[resourceIndex(filename)].offset;
-}
-
uint8 *Resource::loadFile(const char *filename, uint32 skipBytes, byte *dstBuf) {
uint32 size = fileSize(filename) - skipBytes;
if (dstBuf == NULL)
@@ -158,30 +127,60 @@ uint8 *Resource::loadFileMalloc(const char *filename, uint32 skipBytes, byte *ds
return loadFile(filename, skipBytes, (byte *)malloc(fileSize(filename) - skipBytes));
}
-bool Resource::exists(const char *filename) {
- return resourceIndex(filename) >= 0;
-}
+bool Resource::findNormalVersion() {
+ _resourceFile->open("queen.1", _datafilePath);
+ if (!_resourceFile->isOpen()) {
+ return false;
+ }
-const char *Resource::JASVersion() {
- static char versionStr[6];
- if (isDemo())
- _resourceFile->seek(fileOffset("QUEEN.JAS") + JAS_VERSION_OFFSET_DEMO, SEEK_SET);
- else
- _resourceFile->seek(fileOffset("QUEEN.JAS") + JAS_VERSION_OFFSET, SEEK_SET);
- _resourceFile->read(versionStr, 6);
- return versionStr;
+ _compression = COMPRESSION_NONE;
+
+ // detect game version based on resource file size ; we try to
+ // verify that it is indeed the version we think it is later on
+ const GameVersion *gameVersion = detectGameVersion(_resourceFile->size());
+ if (gameVersion == NULL)
+ error("Unknown/unsupported FOTAQ version");
+
+ strcpy(_versionString, gameVersion->versionString);
+ if (!readTableFile(gameVersion)) {
+ // check if it is the english floppy version, for which we have a hardcoded version of the table
+ if (!strcmp(gameVersion->versionString, _gameVersions[VER_ENG_FLOPPY].versionString)) {
+ _resourceEntries = 1076;
+ _resourceTable = _resourceTablePEM10;
+ } else {
+ error("Could not find tablefile '%s%s'", _datafilePath.c_str(), _tableFilename);
+ }
+ }
+ return true;
}
-bool Resource::isDemo() const {
- return _gameVersion->isDemo;
+bool Resource::findCompressedVersion() {
+ _resourceFile->open("queen.1c", _datafilePath);
+ if (!_resourceFile->isOpen()) {
+ return false;
+ }
+ readTableCompResource();
+ return true;
}
-bool Resource::isFloppy() const {
- return _gameVersion->versionString[0] == 'P';
+void Resource::checkJASVersion() {
+ int32 offset = fileOffset("QUEEN.JAS");
+ if (isDemo())
+ offset += JAS_VERSION_OFFSET_DEMO;
+ else if (isInterview())
+ offset += JAS_VERSION_OFFSET_INTV;
+ else
+ offset += JAS_VERSION_OFFSET;
+ _resourceFile->seek(offset, SEEK_SET);
+
+ char versionStr[6];
+ _resourceFile->read(versionStr, 6);
+ if (strcmp(_versionString, versionStr))
+ error("Verifying game version failed! (expected: '%s', found: '%s')", _versionString, versionStr);
}
Language Resource::getLanguage() const {
- switch (_gameVersion->versionString[1]) {
+ switch (_versionString[1]) {
case 'E':
return ENGLISH;
case 'G':
@@ -197,63 +196,54 @@ Language Resource::getLanguage() const {
}
}
-const GameVersion *Resource::detectGameVersion(uint32 dataFilesize) {
- //detect game version based on resource file size.
- //we try to verify that it is indeed the version we think it is later on
- const GameVersion *pgv = _gameVersions;
- int i;
- for (i = 0; i < VER_COUNT; ++i, ++pgv) {
- if (pgv->dataFileSize == dataFilesize) {
- return pgv;
- }
- }
- error("Unknown/unsupported FOTAQ version");
- return NULL;
-}
-
-bool Resource::readTableFile() {
+bool Resource::readTableFile(const GameVersion *gameVersion) {
File tableFile;
tableFile.open(_tableFilename, _datafilePath);
if (!tableFile.isOpen())
- tableFile.open(_tableFilename, ""); //try current directory
+ tableFile.open(_tableFilename, ""); // try current directory
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();
- }
+ tableFile.seek(gameVersion->tableOffset);
+ readTableEntries(&tableFile);
return true;
}
return false;
}
void Resource::readTableCompResource() {
- GameVersion *gv = new GameVersion;
- _resourceFile->read(gv->versionString, 6);
- _resourceFile->readByte();
- gv->isDemo = _resourceFile->readByte() != 0;
+ if (_resourceFile->readUint32BE() != 'QTBL')
+ error("Invalid table header");
+
+ _resourceFile->read(_versionString, 6);
+ _resourceFile->readByte(); // obsolete
+ _resourceFile->readByte(); // obsolete
_compression = _resourceFile->readByte();
- _resourceEntries = _resourceFile->readUint16BE();
- _gameVersion = gv;
-
- _resourceFile->seek(15, SEEK_SET);
+
+ readTableEntries(_resourceFile);
+}
+
+void Resource::readTableEntries(File *file) {
+ _resourceEntries = file->readUint16BE();
_resourceTable = new ResourceEntry[_resourceEntries];
- ResourceEntry *pre = _resourceTable;
- for (uint32 i = 0; i < _resourceEntries; ++i, ++pre) {
- _resourceFile->read(pre->filename, 12);
- pre->filename[12] = '\0';
- pre->inBundle = _resourceFile->readByte();
- pre->offset = _resourceFile->readUint32BE();
- pre->size = _resourceFile->readUint32BE();
+ for (uint16 i = 0; i < _resourceEntries; ++i) {
+ ResourceEntry *re = &_resourceTable[i];
+ file->read(re->filename, 12);
+ re->filename[12] = '\0';
+ re->bundle = file->readByte();
+ re->offset = file->readUint32BE();
+ re->size = file->readUint32BE();
}
}
+const GameVersion *Resource::detectGameVersion(uint32 size) const {
+ const GameVersion *pgv = _gameVersions;
+ for (int i = 0; i < VER_COUNT; ++i, ++pgv) {
+ if (pgv->dataFileSize == size) {
+ return pgv;
+ }
+ }
+ return NULL;
+}
+
File *Resource::giveCompressedSound(const char *filename) {
assert(strstr(filename, ".SB"));
_resourceFile->seek(fileOffset(filename), SEEK_SET);
diff --git a/queen/resource.h b/queen/resource.h
index c520b25c0f..2a85e7707b 100644
--- a/queen/resource.h
+++ b/queen/resource.h
@@ -37,23 +37,26 @@ enum Version {
VER_GER_TALKIE = 5,
VER_ITA_FLOPPY = 6,
VER_ITA_TALKIE = 7,
+ // VER_ITA_FLOPPY
VER_SPA_TALKIE = 8,
+ // VER_HEB_FLOPPY
+ // VER_HEB_TALKIE
VER_DEMO_PCGAMES = 9,
VER_DEMO = 10,
+ // VER_INTERVIEW
VER_COUNT = 11
};
struct ResourceEntry {
char filename[13];
- uint8 inBundle;
+ uint8 bundle;
uint32 offset;
uint32 size;
};
struct GameVersion {
char versionString[6];
- bool isDemo;
uint32 tableOffset;
uint32 dataFileSize;
};
@@ -64,18 +67,23 @@ class Resource {
public:
Resource(const Common::String &datafilePath, SaveFileManager *mgr, const char *savePath);
~Resource(void);
+
uint8 *loadFile(const char *filename, uint32 skipBytes = 0, byte *dstBuf = NULL);
uint8 *loadFileMalloc(const char *filename, uint32 skipBytes = 0, byte *dstBuf = NULL);
- char *getJAS2Line();
- bool exists(const char *filename);
- bool isDemo() const;
- bool isFloppy() const;
- uint8 compression() { return _compression; }
- uint32 fileSize(const char *filename);
- uint32 fileOffset(const char *filename);
+ bool exists(const char *filename) const { return resourceIndex(filename) >= 0; }
+ uint32 fileSize(const char *filename) const { return _resourceTable[resourceIndex(filename)].size; }
+ uint32 fileOffset(const char *filename) const { return _resourceTable[resourceIndex(filename)].offset; }
+
File *giveCompressedSound(const char *filename);
+
+ bool isDemo() const { return !strcmp(_versionString, "PE100"); }
+ bool isInterview() const { return !strcmp(_versionString, "PEint"); }
+ bool isFloppy() const { return _versionString[0] == 'P'; }
+ uint8 compression() const { return _compression; }
+ const char *JASVersion() const { return _versionString; }
Language getLanguage() const;
- const char *JASVersion();
+ char *getJAS2Line();
+
bool writeSave(uint16 slot, const byte *saveData, uint32 size);
bool readSave(uint16 slot, byte *&ptr);
@@ -91,21 +99,24 @@ protected:
uint32 _JAS2Pos;
uint8 _compression;
const Common::String _datafilePath;
- const GameVersion *_gameVersion;
+ char _versionString[6];
const char *_savePath;
uint32 _resourceEntries;
ResourceEntry *_resourceTable;
+ SaveFileManager *_saveFileManager;
+
+ bool findNormalVersion();
+ bool findCompressedVersion();
+ void checkJASVersion();
+ int32 resourceIndex(const char *filename) const;
+ bool readTableFile(const GameVersion *gameVersion);
+ void readTableCompResource();
+ void readTableEntries(File *file);
+ const GameVersion *detectGameVersion(uint32 size) const;
static const char *_tableFilename;
static const GameVersion _gameVersions[];
static ResourceEntry _resourceTablePEM10[];
-
- int32 resourceIndex(const char *filename);
- bool readTableFile();
- void readTableCompResource();
- static const GameVersion *detectGameVersion(uint32 dataFilesize);
-
- SaveFileManager *_saveFileManager;
};
} // End of namespace Queen