diff options
Diffstat (limited to 'engines/lab/resource.cpp')
-rw-r--r-- | engines/lab/resource.cpp | 73 |
1 files changed, 53 insertions, 20 deletions
diff --git a/engines/lab/resource.cpp b/engines/lab/resource.cpp index 17535a7659..aae369fbae 100644 --- a/engines/lab/resource.cpp +++ b/engines/lab/resource.cpp @@ -59,8 +59,6 @@ TextFont *Resource::getFont(const Common::String fileName) { if (fileSize <= headerSize) return nullptr; - _vm->updateMusicAndEvents(); - TextFont *textfont = new TextFont(); textfont->_dataLength = fileSize - headerSize; textfont->_height = dataFile->readUint16LE(); @@ -70,14 +68,13 @@ TextFont *Resource::getFont(const Common::String fileName) { dataFile->skip(4); textfont->_data = new byte[textfont->_dataLength + 4]; dataFile->read(textfont->_data, textfont->_dataLength); + delete dataFile; return textfont; } Common::String Resource::getText(const Common::String fileName) { Common::File *dataFile = openDataFile(fileName); - _vm->updateMusicAndEvents(); - uint32 count = dataFile->size(); byte *buffer = new byte[count]; byte *text = buffer; @@ -142,20 +139,26 @@ void Resource::readViews(uint16 roomNum) { readView(dataFile, curRoom->_view[kDirectionWest]); readRule(dataFile, curRoom->_rules); - _vm->updateMusicAndEvents(); delete dataFile; } Common::String Resource::translateFileName(const Common::String filename) { - Common::String upperFilename = filename; + Common::String upperFilename; + + // The DOS and Windows version aren't looking for the right file, + if (!filename.compareToIgnoreCase("P:ZigInt/BLK") && (_vm->getPlatform() != Common::kPlatformAmiga)) + upperFilename = "P:ZigInt/ZIGINT.BLK"; + else + upperFilename = filename; + upperFilename.toUppercase(); Common::String fileNameStrFinal; if (upperFilename.hasPrefix("P:") || upperFilename.hasPrefix("F:")) { if (_vm->_isHiRes) - fileNameStrFinal = "GAME/SPICT/"; + fileNameStrFinal = "SPICT/"; else - fileNameStrFinal = "GAME/PICT/"; + fileNameStrFinal = "PICT/"; if (_vm->getPlatform() == Common::kPlatformAmiga) { if (upperFilename.hasPrefix("P:")) { @@ -166,13 +169,9 @@ Common::String Resource::translateFileName(const Common::String filename) { } } } else if (upperFilename.hasPrefix("LAB:")) { - if (_vm->getPlatform() != Common::kPlatformAmiga) - fileNameStrFinal = "GAME/"; + // Look inside the game folder } else if (upperFilename.hasPrefix("MUSIC:")) { - if (_vm->getPlatform() != Common::kPlatformAmiga) - fileNameStrFinal = "GAME/MUSIC/"; - else - fileNameStrFinal = "MUSIC/"; + fileNameStrFinal = "MUSIC/"; } if (upperFilename.contains(':')) { @@ -183,22 +182,56 @@ Common::String Resource::translateFileName(const Common::String filename) { upperFilename.deleteChar(0); } + if (_vm->getPlatform() == Common::kPlatformDOS) { + // Some script of the DOS version uses names used in the Amiga (and Windows) version, + // which isn't limited to 8.3 characters. We need to parse upperFilename to detect + // the filename, and fix it if required so it matches a DOS filename. + while (upperFilename.contains('/') && upperFilename.size()) { + fileNameStrFinal += upperFilename[0]; + upperFilename.deleteChar(0); + } + + for (int i = 0; (i < 8) && upperFilename.size() && (upperFilename[0] != '.'); i++) { + fileNameStrFinal += upperFilename[0]; + upperFilename.deleteChar(0); + } + + // Remove the extra character in the filename + while (upperFilename.size() && (upperFilename[0] != '.')) + upperFilename.deleteChar(0); + + // copy max 4 characters for the extension ('.foo') + for (int i = 0; (i < 4) && upperFilename.size(); i++) { + fileNameStrFinal += upperFilename[0]; + upperFilename.deleteChar(0); + } + + // Skip the extra characters of the extension + upperFilename.clear(); + } + fileNameStrFinal += upperFilename; return fileNameStrFinal; } -Common::File *Resource::openDataFile(const Common::String fileName, uint32 fileHeader) { +Common::File *Resource::openDataFile(const Common::String filename, uint32 fileHeader) { Common::File *dataFile = new Common::File(); - dataFile->open(translateFileName(fileName)); - if (!dataFile->isOpen()) - error("openDataFile: Couldn't open %s (%s)", translateFileName(fileName).c_str(), fileName.c_str()); - + dataFile->open(translateFileName(filename)); + + if (!dataFile->isOpen()) { + // The DOS version is known to have some missing files + if (_vm->getPlatform() == Common::kPlatformDOS) { + warning("Incomplete DOS version, skipping file %s", filename.c_str()); + return nullptr; + } else + error("openDataFile: Couldn't open %s (%s)", translateFileName(filename).c_str(), filename.c_str()); + } if (fileHeader > 0) { uint32 headerTag = dataFile->readUint32BE(); if (headerTag != fileHeader) { dataFile->close(); - error("openDataFile: Unexpected header in %s (%s) - expected: %d, got: %d", translateFileName(fileName).c_str(), fileName.c_str(), fileHeader, headerTag); + error("openDataFile: Unexpected header in %s (%s) - expected: %d, got: %d", translateFileName(filename).c_str(), filename.c_str(), fileHeader, headerTag); } } |