Moved calls to addDefaultDirectory, and creation of the master file handle, from the ScummEngine constructor to ScummEngine::init() (this makes it easier to implement more graceful error handling, for example)

svn-id: r24173
This commit is contained in:
Max Horn 2006-10-07 15:37:03 +00:00
parent 4973c657b8
commit e31ae8edc7

View file

@ -101,148 +101,7 @@ ScummEngine::ScummEngine(OSystem *syst, const DetectorResult &dr)
// Copy MD5 checksum
memcpy(_gameMD5, dr.md5sum, 16);
// Add default file directories.
if (((_game.platform == Common::kPlatformAmiga) || (_game.platform == Common::kPlatformAtariST)) && (_game.version <= 4)) {
// This is for the Amiga version of Indy3/Loom/Maniac/Zak
File::addDefaultDirectory(_gameDataPath + "ROOMS/");
File::addDefaultDirectory(_gameDataPath + "rooms/");
}
if ((_game.platform == Common::kPlatformMacintosh) && (_game.version == 3)) {
// This is for the Mac version of Indy3/Loom
File::addDefaultDirectory(_gameDataPath + "Rooms 1/");
File::addDefaultDirectory(_gameDataPath + "Rooms 2/");
File::addDefaultDirectory(_gameDataPath + "Rooms 3/");
}
#ifndef DISABLE_SCUMM_7_8
#ifdef MACOSX
if (_game.version == 8 && !memcmp(_gameDataPath.c_str(), "/Volumes/MONKEY3_", 17)) {
// Special case for COMI on Mac OS X. The mount points on OS X depend
// on the volume name. Hence if playing from CD, we'd get a problem.
// So if loading of a resource file fails, we fall back to the (fixed)
// CD mount points (/Volumes/MONKEY3_1 and /Volumes/MONKEY3_2).
//
// This check for whether we play from CD is very crude, though.
File::addDefaultDirectory("/Volumes/MONKEY3_1/RESOURCE/");
File::addDefaultDirectory("/Volumes/MONKEY3_1/resource/");
File::addDefaultDirectory("/Volumes/MONKEY3_2/");
File::addDefaultDirectory("/Volumes/MONKEY3_2/RESOURCE/");
File::addDefaultDirectory("/Volumes/MONKEY3_2/resource/");
} else
#endif
if (_game.version == 8) {
// This is for COMI
File::addDefaultDirectory(_gameDataPath + "RESOURCE/");
File::addDefaultDirectory(_gameDataPath + "resource/");
}
if (_game.version == 7) {
// This is for Full Throttle & The Dig
File::addDefaultDirectory(_gameDataPath + "VIDEO/");
File::addDefaultDirectory(_gameDataPath + "video/");
File::addDefaultDirectory(_gameDataPath + "DATA/");
File::addDefaultDirectory(_gameDataPath + "data/");
}
#endif
// The kGenAsIs method is only used for 'container files', i.e. files
// that contain the real game files bundled together in an archive format.
// This is the case of the NES, C64 and Mac versions of certain games.
// Note: All of these can also occur in 'extracted' form, in which case they
// are treated like any other SCUMM game.
if (_filenamePattern.genMethod == kGenUnchanged) {
if (_game.platform == Common::kPlatformNES) {
// We read data directly from NES ROM instead of extracting it with
// external tool
assert(_game.id == GID_MANIAC);
_fileHandle = new ScummNESFile();
_containerFile = _filenamePattern.pattern;
_filenamePattern.pattern = "%.2d.LFL";
_filenamePattern.genMethod = kGenRoomNum;
} else if (_game.platform == Common::kPlatformC64) {
// Read data from C64 disk images.
const char *tmpBuf1, *tmpBuf2;
assert(_game.id == GID_MANIAC || _game.id == GID_ZAK);
if (_game.id == GID_MANIAC) {
tmpBuf1 = "maniac1.d64";
tmpBuf2 = "maniac2.d64";
} else {
tmpBuf1 = "zak1.d64";
tmpBuf2 = "zak2.d64";
}
_fileHandle = new ScummC64File(tmpBuf1, tmpBuf2, _game.id == GID_MANIAC);
_containerFile = tmpBuf1;
_filenamePattern.pattern = "%.2d.LFL";
_filenamePattern.genMethod = kGenRoomNum;
} else if (_game.platform == Common::kPlatformMacintosh) {
// The mac versions of Indy4, Sam&Max, DOTT, FT and The Dig used a
// special meta (container) file format to store the actual SCUMM data
// files. The rescumm utility used to be used to extract those files.
// While that is still possible, we now support reading those files
// directly. The first step is to check whether one of them is present
// (we do that here); the rest is handled by the ScummFile class and
// code in openResourceFile() (and in the Sound class, for MONSTER.SOU
// handling).
assert(_game.version >= 5 && _game.heversion == 0);
_fileHandle = new ScummFile();
_containerFile = _filenamePattern.pattern;
// We now have to determine the correct _filenamePattern. To do this
// we simply hardcode the possibilites.
const char *p1 = 0, *p2 = 0;
switch (_game.id) {
case GID_INDY4:
p1 = "atlantis.%03d";
break;
case GID_TENTACLE:
p1 = "tentacle.%03d";
p2 = "dottdemo.%03d";
break;
case GID_SAMNMAX:
p1 = "samnmax.%03d";
p2 = "samdemo.%03d";
break;
case GID_FT:
p1 = "ft.la%d";
p2 = "ftdemo.la%d";
break;
case GID_DIG:
p1 = "dig.la%d";
break;
default:
break;
}
// Test which file name to use
_filenamePattern.genMethod = kGenDiskNum;
if (!_fileHandle->open(_containerFile))
error("Couldn't open container file '%s'", _containerFile.c_str());
if ((_filenamePattern.pattern = p1) && _fileHandle->openSubFile(generateFilename(0))) {
// Found regular version
} else if ((_filenamePattern.pattern = p2) && _fileHandle->openSubFile(generateFilename(0))) {
// Found demo
_game.features |= GF_DEMO;
} else
error("Couldn't find known subfile inside container file '%s'", _containerFile.c_str());
_fileHandle->close();
} else {
error("kGenAsIs used with unsupported platform");
}
} else {
// Regular access, no container file involved
_fileHandle = new ScummFile();
}
_fileHandle = 0;
// Init all vars
@ -957,6 +816,149 @@ ScummEngine_v8::~ScummEngine_v8() {
int ScummEngine::init() {
// Add default file directories.
if (((_game.platform == Common::kPlatformAmiga) || (_game.platform == Common::kPlatformAtariST)) && (_game.version <= 4)) {
// This is for the Amiga version of Indy3/Loom/Maniac/Zak
File::addDefaultDirectory(_gameDataPath + "ROOMS/");
File::addDefaultDirectory(_gameDataPath + "rooms/");
}
if ((_game.platform == Common::kPlatformMacintosh) && (_game.version == 3)) {
// This is for the Mac version of Indy3/Loom
File::addDefaultDirectory(_gameDataPath + "Rooms 1/");
File::addDefaultDirectory(_gameDataPath + "Rooms 2/");
File::addDefaultDirectory(_gameDataPath + "Rooms 3/");
}
#ifndef DISABLE_SCUMM_7_8
#ifdef MACOSX
if (_game.version == 8 && !memcmp(_gameDataPath.c_str(), "/Volumes/MONKEY3_", 17)) {
// Special case for COMI on Mac OS X. The mount points on OS X depend
// on the volume name. Hence if playing from CD, we'd get a problem.
// So if loading of a resource file fails, we fall back to the (fixed)
// CD mount points (/Volumes/MONKEY3_1 and /Volumes/MONKEY3_2).
//
// This check for whether we play from CD is very crude, though.
File::addDefaultDirectory("/Volumes/MONKEY3_1/RESOURCE/");
File::addDefaultDirectory("/Volumes/MONKEY3_1/resource/");
File::addDefaultDirectory("/Volumes/MONKEY3_2/");
File::addDefaultDirectory("/Volumes/MONKEY3_2/RESOURCE/");
File::addDefaultDirectory("/Volumes/MONKEY3_2/resource/");
} else
#endif
if (_game.version == 8) {
// This is for COMI
File::addDefaultDirectory(_gameDataPath + "RESOURCE/");
File::addDefaultDirectory(_gameDataPath + "resource/");
}
if (_game.version == 7) {
// This is for Full Throttle & The Dig
File::addDefaultDirectory(_gameDataPath + "VIDEO/");
File::addDefaultDirectory(_gameDataPath + "video/");
File::addDefaultDirectory(_gameDataPath + "DATA/");
File::addDefaultDirectory(_gameDataPath + "data/");
}
#endif
// The kGenAsIs method is only used for 'container files', i.e. files
// that contain the real game files bundled together in an archive format.
// This is the case of the NES, C64 and Mac versions of certain games.
// Note: All of these can also occur in 'extracted' form, in which case they
// are treated like any other SCUMM game.
if (_filenamePattern.genMethod == kGenUnchanged) {
if (_game.platform == Common::kPlatformNES) {
// We read data directly from NES ROM instead of extracting it with
// external tool
assert(_game.id == GID_MANIAC);
_fileHandle = new ScummNESFile();
_containerFile = _filenamePattern.pattern;
_filenamePattern.pattern = "%.2d.LFL";
_filenamePattern.genMethod = kGenRoomNum;
} else if (_game.platform == Common::kPlatformC64) {
// Read data from C64 disk images.
const char *tmpBuf1, *tmpBuf2;
assert(_game.id == GID_MANIAC || _game.id == GID_ZAK);
if (_game.id == GID_MANIAC) {
tmpBuf1 = "maniac1.d64";
tmpBuf2 = "maniac2.d64";
} else {
tmpBuf1 = "zak1.d64";
tmpBuf2 = "zak2.d64";
}
_fileHandle = new ScummC64File(tmpBuf1, tmpBuf2, _game.id == GID_MANIAC);
_containerFile = tmpBuf1;
_filenamePattern.pattern = "%.2d.LFL";
_filenamePattern.genMethod = kGenRoomNum;
} else if (_game.platform == Common::kPlatformMacintosh) {
// The mac versions of Indy4, Sam&Max, DOTT, FT and The Dig used a
// special meta (container) file format to store the actual SCUMM data
// files. The rescumm utility used to be used to extract those files.
// While that is still possible, we now support reading those files
// directly. The first step is to check whether one of them is present
// (we do that here); the rest is handled by the ScummFile class and
// code in openResourceFile() (and in the Sound class, for MONSTER.SOU
// handling).
assert(_game.version >= 5 && _game.heversion == 0);
_fileHandle = new ScummFile();
_containerFile = _filenamePattern.pattern;
// We now have to determine the correct _filenamePattern. To do this
// we simply hardcode the possibilites.
const char *p1 = 0, *p2 = 0;
switch (_game.id) {
case GID_INDY4:
p1 = "atlantis.%03d";
break;
case GID_TENTACLE:
p1 = "tentacle.%03d";
p2 = "dottdemo.%03d";
break;
case GID_SAMNMAX:
p1 = "samnmax.%03d";
p2 = "samdemo.%03d";
break;
case GID_FT:
p1 = "ft.la%d";
p2 = "ftdemo.la%d";
break;
case GID_DIG:
p1 = "dig.la%d";
break;
default:
break;
}
// Test which file name to use
_filenamePattern.genMethod = kGenDiskNum;
if (!_fileHandle->open(_containerFile))
error("Couldn't open container file '%s'", _containerFile.c_str());
if ((_filenamePattern.pattern = p1) && _fileHandle->openSubFile(generateFilename(0))) {
// Found regular version
} else if ((_filenamePattern.pattern = p2) && _fileHandle->openSubFile(generateFilename(0))) {
// Found demo
_game.features |= GF_DEMO;
} else
error("Couldn't find known subfile inside container file '%s'", _containerFile.c_str());
_fileHandle->close();
} else {
error("kGenAsIs used with unsupported platform");
}
} else {
// Regular access, no container file involved
_fileHandle = new ScummFile();
}
// Initialize backend
_system->beginGFXTransaction();
bool defaultTo1XScaler = false;