mirror of
https://github.com/libretro/scummvm.git
synced 2025-01-30 07:23:05 +00:00
SCUMM: Add support for Steam versions of Indy 3, Indy 4, Loom and Dig
Many Thanks to Ben Castricum for the original patch
This commit is contained in:
parent
5e78bee2f5
commit
902a140f3e
@ -137,6 +137,8 @@ indy3 Indiana Jones and the Last Crusade
|
||||
1dd7aa088e09f96d06818aa9a9deabe0 5361 en Mac No AdLib EGA v1.7, 8/17/90 Fingolfin
|
||||
|
||||
1875b90fade138c9253a8e967007031a 6295 en DOS VGA VGA IBM 256 color v2.0 from 3 May 90 Peter Eckerlein, Fingolfin
|
||||
7fbcff27c323499beaedd605e1ebd47d 561152 en Windows Steam Steam Steam Version Ben Castricum, Filippos Karapetis
|
||||
a15d6e1e2c52bbd0ff7fa6b63ab7f796 680340 en Mac Steam Steam Steam Version Filippos Karapetis
|
||||
399b217b0c8d65d0398076da486363a9 6295 de DOS VGA VGA VGA v1.02 from 7 Nov 91 Peter Eckerlein, Fingolfin
|
||||
17b5d5e6af4ae89d62631641d66d5a05 -1 it DOS VGA VGA IBM 256 color v2.1 from 3 May 01 Andrea Petrucci, Peter Eckerlein
|
||||
3cce1913a3bc586b51a75c3892ff18dd -1 ru DOS VGA VGA VGA
|
||||
@ -170,6 +172,8 @@ loom Loom
|
||||
6f0be328c64d689bb606d22a389e1b0f 5748 en Mac No AdLib EGA v1.2 25 Jan 91 Fingolfin
|
||||
|
||||
5d88b9d6a88e6f8e90cded9d01b7f082 8307 en DOS VGA VGA CD Version v1.0 from 10. Feb 92 (Talkie) Peter Eckerlein, Fingolfin
|
||||
0354ee0d14cde1264ec762261c04c14a 585728 en Windows Steam Steam Steam Version Ben Castricum, Filippos Karapetis
|
||||
b4a677bf27c010a747975705108ff1e6 393572 en Mac Steam Steam Steam Version Filippos Karapetis
|
||||
|
||||
c5d10e190d4b4d59114b824f2fdbd00e 7540 en FM-TOWNS FM-TOWNS - - dhewg, Andrea Petrucci
|
||||
31b8fda4c8c7413fa6b39997e776eba4 -1 jp FM-TOWNS FM-TOWNS - - khalek, Andrea Petrucci
|
||||
@ -279,6 +283,8 @@ atlantis Indiana Jones and the Fate of Atlantis
|
||||
d6dd0646404768a63e963891a96daadd 12035 en Mac Floppy Floppy two data files Fingolfin
|
||||
|
||||
182344899c2e2998fca0bebcd82aa81a 12035 en DOS - CD - Fingolfin
|
||||
f3c5d9bf3f091bd1f18dc1013fba5396 638976 en Windows Steam Steam Steam Version Ben Castricum, Filippos Karapetis
|
||||
6a8133b63d46f6663fbcbb49d5a2edb1 520548 en Mac Steam Steam Steam Version Filippos Karapetis
|
||||
1a6e5ae2777a6a33f06ffc0226210934 -1 en Mac - CD - Scott Summers
|
||||
2d9d46f23cb07bbc90b8ad464d3e4ff8 -1 en Mac - CD Mac bundle Joachim Eberhard
|
||||
8e9417564f33790815445b2136efa667 11915 jp Mac - CD - Petr Maruska
|
||||
@ -358,6 +364,8 @@ ft Full Throttle
|
||||
|
||||
dig The Dig
|
||||
d8323015ecb8b10bf53474f6e6b0ae33 16304 All All - - - Fingolfin
|
||||
aad201302286c1cfee92321cd406e427 811008 en Windows Steam Steam Steam Version Ben Castricum, Filippos Karapetis
|
||||
d93cc8be628ed5d3b3a29188fc7105d3 1061296 en Mac Steam Steam Steam Version Filippos Karapetis
|
||||
d62047a6729349ab36f7ee065bf26509 -1 ru All - - - sev
|
||||
35a2d3040fa512f8232d9e443319d84d 659335495 en Mac - - Mac bundle Fingolfin
|
||||
21a6592322f92550f144f68a8a4e685e -1 fr Mac - - Mac bundle kaminari
|
||||
|
@ -79,10 +79,12 @@ Common::String ScummEngine::generateFilename(const int room) const {
|
||||
} else {
|
||||
switch (_filenamePattern.genMethod) {
|
||||
case kGenDiskNum:
|
||||
case kGenDiskNumSteam:
|
||||
result = Common::String::format(_filenamePattern.pattern, diskNumber);
|
||||
break;
|
||||
|
||||
case kGenRoomNum:
|
||||
case kGenRoomNumSteam:
|
||||
result = Common::String::format(_filenamePattern.pattern, room);
|
||||
break;
|
||||
|
||||
@ -209,14 +211,30 @@ Common::String ScummEngine_v70he::generateFilename(const int room) const {
|
||||
return result;
|
||||
}
|
||||
|
||||
static Common::String generateFilenameForDetection(const char *pattern, FilenameGenMethod genMethod) {
|
||||
static const char *getSteamExeNameFromPattern(Common::String pattern, Common::Platform platform) {
|
||||
for (const SteamIndexFile *indexFile = steamIndexFiles; indexFile->len; ++indexFile) {
|
||||
if (platform == indexFile->platform && pattern.equalsIgnoreCase(indexFile->pattern))
|
||||
return indexFile->executableName;
|
||||
}
|
||||
|
||||
error("Unable to find Steam executable from detection pattern");
|
||||
return "";
|
||||
}
|
||||
|
||||
static Common::String generateFilenameForDetection(const char *pattern, FilenameGenMethod genMethod, Common::Platform platform) {
|
||||
Common::String result;
|
||||
Common::String patternStr = pattern;
|
||||
|
||||
switch (genMethod) {
|
||||
case kGenDiskNum:
|
||||
case kGenRoomNum:
|
||||
result = Common::String::format(pattern, 0);
|
||||
break;
|
||||
|
||||
case kGenDiskNumSteam:
|
||||
case kGenRoomNumSteam:
|
||||
result = getSteamExeNameFromPattern(pattern, platform);
|
||||
break;
|
||||
|
||||
case kGenHEPC:
|
||||
case kGenHEIOS:
|
||||
@ -528,7 +546,8 @@ static void detectGames(const Common::FSList &fslist, Common::List<DetectorResul
|
||||
DetectorResult dr;
|
||||
|
||||
// Dive one level down since mac indy3/loom has its files split into directories. See Bug #1438631
|
||||
composeFileHashMap(fileMD5Map, fslist, 2, directoryGlobs);
|
||||
// Dive two levels down for Mac Steam games
|
||||
composeFileHashMap(fileMD5Map, fslist, 3, directoryGlobs);
|
||||
|
||||
// Iterate over all filename patterns.
|
||||
for (const GameFilenamePattern *gfp = gameFilenamesTable; gfp->gameid; ++gfp) {
|
||||
@ -540,7 +559,7 @@ static void detectGames(const Common::FSList &fslist, Common::List<DetectorResul
|
||||
// Generate the detectname corresponding to the gfp. If the file doesn't
|
||||
// exist in the directory we are looking at, we can skip to the next
|
||||
// one immediately.
|
||||
Common::String file(generateFilenameForDetection(gfp->pattern, gfp->genMethod));
|
||||
Common::String file(generateFilenameForDetection(gfp->pattern, gfp->genMethod, gfp->platform));
|
||||
if (!fileMD5Map.contains(file))
|
||||
continue;
|
||||
|
||||
@ -1025,7 +1044,7 @@ Common::Error ScummMetaEngine::createInstance(OSystem *syst, Engine **engine) co
|
||||
Common::FSNode dir(ConfMan.get("path"));
|
||||
if (!dir.isDirectory())
|
||||
return Common::kPathNotDirectory;
|
||||
if (!dir.getChildren(fslist, Common::FSNode::kListFilesOnly))
|
||||
if (!dir.getChildren(fslist, Common::FSNode::kListAll))
|
||||
return Common::kNoGameDataFoundError;
|
||||
|
||||
// Invoke the detector, but fixed to the specified gameid.
|
||||
@ -1081,7 +1100,7 @@ Common::Error ScummMetaEngine::createInstance(OSystem *syst, Engine **engine) co
|
||||
|
||||
md5Warning += Common::String::format(" SCUMM gameid '%s', file '%s', MD5 '%s'\n\n",
|
||||
res.game.gameid,
|
||||
generateFilenameForDetection(res.fp.pattern, res.fp.genMethod).c_str(),
|
||||
generateFilenameForDetection(res.fp.pattern, res.fp.genMethod, Common::kPlatformUnknown).c_str(),
|
||||
res.md5.c_str());
|
||||
|
||||
g_system->logMessage(LogMessageType::kWarning, md5Warning.c_str());
|
||||
|
@ -95,7 +95,9 @@ struct GameSettings {
|
||||
|
||||
enum FilenameGenMethod {
|
||||
kGenDiskNum,
|
||||
kGenDiskNumSteam,
|
||||
kGenRoomNum,
|
||||
kGenRoomNumSteam,
|
||||
kGenHEMac,
|
||||
kGenHEMacNoParens,
|
||||
kGenHEPC,
|
||||
|
@ -52,6 +52,8 @@ namespace Scumm {
|
||||
*/
|
||||
static const char *const directoryGlobs[] = {
|
||||
"rooms *", // Mac version of indy3/loom
|
||||
"Contents", // Mac Steam versions
|
||||
"MacOS", // Mac Steam versions
|
||||
0
|
||||
};
|
||||
|
||||
@ -221,6 +223,7 @@ static const GameSettings gameVariantsTable[] = {
|
||||
{"indy3", "EGA", "ega", GID_INDY3, 3, 0, MDT_PCSPK | MDT_PCJR | MDT_CMS | MDT_ADLIB, 0, UNK, GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)},
|
||||
{"indy3", "No AdLib", "ega", GID_INDY3, 3, 0, MDT_PCSPK | MDT_PCJR, 0, UNK, GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)},
|
||||
{"indy3", "VGA", "vga", GID_INDY3, 3, 0, MDT_PCSPK | MDT_PCJR | MDT_CMS | MDT_ADLIB, GF_OLD256 | GF_FEW_LOCALS, Common::kPlatformDOS, GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)},
|
||||
{"indy3", "Steam", "steam", GID_INDY3, 3, 0, MDT_PCSPK | MDT_PCJR | MDT_CMS | MDT_ADLIB, GF_OLD256 | GF_FEW_LOCALS, UNK, GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)},
|
||||
{"indy3", "FM-TOWNS", 0, GID_INDY3, 3, 0, MDT_TOWNS, GF_OLD256 | GF_FEW_LOCALS | GF_AUDIOTRACKS, Common::kPlatformFMTowns, GUIO4(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_MIDITOWNS, GUIO_NOASPECT)},
|
||||
|
||||
{"loom", "EGA", "ega", GID_LOOM, 3, 0, MDT_PCSPK | MDT_PCJR | MDT_CMS | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO1(GUIO_NOSPEECH)},
|
||||
@ -230,6 +233,7 @@ static const GameSettings gameVariantsTable[] = {
|
||||
#endif
|
||||
{"loom", "FM-TOWNS", 0, GID_LOOM, 3, 0, MDT_TOWNS, GF_AUDIOTRACKS | GF_OLD256, Common::kPlatformFMTowns, GUIO4(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_MIDITOWNS, GUIO_NOASPECT)},
|
||||
{"loom", "VGA", "vga", GID_LOOM, 4, 0, MDT_NONE, GF_AUDIOTRACKS, Common::kPlatformDOS, GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)},
|
||||
{"loom", "Steam", "steam", GID_LOOM, 4, 0, MDT_NONE, GF_AUDIOTRACKS, UNK, GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)},
|
||||
|
||||
{"pass", 0, 0, GID_PASS, 4, 0, MDT_PCSPK | MDT_PCJR | MDT_CMS | MDT_ADLIB, GF_16COLOR, Common::kPlatformDOS, GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)},
|
||||
|
||||
@ -245,6 +249,7 @@ static const GameSettings gameVariantsTable[] = {
|
||||
{"monkey2", "FM-TOWNS", 0, GID_MONKEY2, 5, 0, MDT_PCSPK | MDT_TOWNS | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, Common::kPlatformFMTowns, GUIO5(GUIO_NOSPEECH, GUIO_MIDITOWNS, GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_NOASPECT)},
|
||||
|
||||
{"atlantis", "", 0, GID_INDY4, 5, 0, MDT_PCSPK | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO0()},
|
||||
{"atlantis", "Steam", "steam", GID_INDY4, 5, 0, MDT_PCSPK | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO0()},
|
||||
{"atlantis", "Floppy", 0, GID_INDY4, 5, 0, MDT_PCSPK | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO1(GUIO_NOSPEECH)},
|
||||
{"atlantis", "FM-TOWNS", 0, GID_INDY4, 5, 0, MDT_TOWNS | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, Common::kPlatformFMTowns, GUIO4(GUIO_MIDITOWNS, GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_NOASPECT)},
|
||||
|
||||
@ -257,7 +262,8 @@ static const GameSettings gameVariantsTable[] = {
|
||||
#ifdef ENABLE_SCUMM_7_8
|
||||
{"ft", 0, 0, GID_FT, 7, 0, MDT_NONE, 0, UNK, GUIO1(GUIO_NOMIDI)},
|
||||
|
||||
{"dig", 0, 0, GID_DIG, 7, 0, MDT_NONE, 0, UNK, GUIO1(GUIO_NOMIDI)},
|
||||
{"dig", "", 0, GID_DIG, 7, 0, MDT_NONE, 0, UNK, GUIO1(GUIO_NOMIDI)},
|
||||
{"dig", "Steam", "steam", GID_DIG, 7, 0, MDT_NONE, 0, UNK, GUIO1(GUIO_NOMIDI)},
|
||||
|
||||
{"comi", 0, 0, GID_CMI, 8, 0, MDT_NONE, 0, Common::kPlatformWindows, GUIO2(GUIO_NOMIDI, GUIO_NOASPECT)},
|
||||
#endif
|
||||
@ -422,10 +428,10 @@ static const GameSettings gameVariantsTable[] = {
|
||||
using Common::UNK_LANG;
|
||||
|
||||
// The following describes how Fingolfin thinks this table might be used one day;
|
||||
// this is work in progress, so read this with a salt of grain...
|
||||
// this is work in progress, so read this with a grain of salt...
|
||||
//
|
||||
// The following table maps gameids to possible filename variants for that game.
|
||||
// This information is used by the detector to determin possible "detect files".
|
||||
// This information is used by the detector to determine possible "detect files".
|
||||
// It is also later used by the engine creation code to verify the game to be
|
||||
// launched is present. Finally, the correct GameFilenamePattern entry is passed on
|
||||
// to the engine which uses it to locate the files for the game.
|
||||
@ -451,6 +457,8 @@ static const GameFilenamePattern gameFilenamesTable[] = {
|
||||
{ "zak", "zak1.d64", kGenUnchanged, UNK_LANG, Common::kPlatformC64, "V1" }, // ... and zak2.d64
|
||||
|
||||
{ "indy3", "%02d.LFL", kGenRoomNum, UNK_LANG, UNK, 0 },
|
||||
{ "indy3", "%02d.LFL", kGenRoomNumSteam, UNK_LANG, Common::kPlatformWindows, "Steam" },
|
||||
{ "indy3", "%02d.LFL", kGenRoomNumSteam, UNK_LANG, Common::kPlatformMacintosh, "Steam" },
|
||||
|
||||
{ "indyloom", "%02d.LFL", kGenRoomNum, UNK_LANG, UNK, 0 },
|
||||
{ "indyzak", "%02d.LFL", kGenRoomNum, UNK_LANG, UNK, 0 },
|
||||
@ -458,6 +466,8 @@ static const GameFilenamePattern gameFilenamesTable[] = {
|
||||
|
||||
{ "loom", "%02d.LFL", kGenRoomNum, UNK_LANG, UNK, 0 },
|
||||
{ "loom", "%03d.LFL", kGenRoomNum, UNK_LANG, UNK, "VGA" }, // Loom CD
|
||||
{ "loom", "%03d.LFL", kGenRoomNumSteam, UNK_LANG, Common::kPlatformWindows, "Steam" },
|
||||
{ "loom", "%03d.LFL", kGenRoomNumSteam, UNK_LANG, Common::kPlatformMacintosh, "Steam" },
|
||||
|
||||
{ "pass", "%03d.LFL", kGenRoomNum, UNK_LANG, UNK, 0 },
|
||||
|
||||
@ -471,6 +481,8 @@ static const GameFilenamePattern gameFilenamesTable[] = {
|
||||
{ "monkey2", "mi2demo.%03d", kGenDiskNum, UNK_LANG, UNK, 0 },
|
||||
|
||||
{ "atlantis", "atlantis.%03d", kGenDiskNum, UNK_LANG, UNK, 0 },
|
||||
{ "atlantis", "atlantis.%03d", kGenDiskNumSteam, UNK_LANG, Common::kPlatformWindows, "Steam" },
|
||||
{ "atlantis", "atlantis.%03d", kGenDiskNumSteam, UNK_LANG, Common::kPlatformMacintosh, "Steam" },
|
||||
{ "atlantis", "fate.%03d", kGenDiskNum, UNK_LANG, UNK, 0 },
|
||||
{ "atlantis", "playfate.%03d", kGenDiskNum, UNK_LANG, UNK, 0 },
|
||||
{ "atlantis", "indy4.%03d", kGenDiskNum, Common::JA_JPN, Common::kPlatformFMTowns, "FM-TOWNS" },
|
||||
@ -494,6 +506,8 @@ static const GameFilenamePattern gameFilenamesTable[] = {
|
||||
|
||||
#ifdef ENABLE_SCUMM_7_8
|
||||
{ "dig", "dig.la%d", kGenDiskNum, UNK_LANG, UNK, 0 },
|
||||
{ "dig", "dig.la%d", kGenDiskNumSteam, UNK_LANG, Common::kPlatformWindows, "Steam" },
|
||||
{ "dig", "dig.la%d", kGenDiskNumSteam, UNK_LANG, Common::kPlatformMacintosh, "Steam" },
|
||||
{ "dig", "thedig.la%d", kGenDiskNum, UNK_LANG, UNK, "Demo" }, // Used by an alternate version of the demo
|
||||
{ "dig", "The Dig Data", kGenUnchanged, UNK_LANG, Common::kPlatformMacintosh, 0 },
|
||||
{ "dig", "The Dig Demo Data", kGenUnchanged, UNK_LANG, Common::kPlatformMacintosh, "Demo" },
|
||||
|
@ -29,6 +29,22 @@
|
||||
|
||||
namespace Scumm {
|
||||
|
||||
// The following table includes all the index files, which are embedded in the
|
||||
// main game executables in Steam versions.
|
||||
const SteamIndexFile steamIndexFiles[] = {
|
||||
{ GID_INDY3, Common::kPlatformWindows, "%02d.LFL", "00.LFL", "Indiana Jones and the Last Crusade.exe", 162056, 6295 },
|
||||
{ GID_INDY3, Common::kPlatformMacintosh, "%02d.LFL", "00.LFL", "The Last Crusade", 150368, 6295 },
|
||||
{ GID_INDY4, Common::kPlatformWindows, "atlantis.%03d", "ATLANTIS.000", "Indiana Jones and the Fate of Atlantis.exe", 224336, 12035 },
|
||||
{ GID_INDY4, Common::kPlatformMacintosh, "atlantis.%03d", "ATLANTIS.000", "The Fate of Atlantis", 260224, 12035 },
|
||||
{ GID_LOOM, Common::kPlatformWindows, "%03d.LFL", "000.LFL", "Loom.exe", 187248, 8307 },
|
||||
{ GID_LOOM, Common::kPlatformMacintosh, "%03d.LFL", "000.LFL", "Loom", 170464, 8307 },
|
||||
#ifdef ENABLE_SCUMM_7_8
|
||||
{ GID_DIG, Common::kPlatformWindows, "dig.la%d", "DIG.LA0", "The Dig.exe", 340632, 16304 },
|
||||
{ GID_DIG, Common::kPlatformMacintosh, "dig.la%d", "DIG.LA0", "The Dig", 339744, 16304 },
|
||||
#endif
|
||||
{ 0, Common::kPlatformUnknown, "", "", "", 0, 0 }
|
||||
};
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark --- ScummFile ---
|
||||
#pragma mark -
|
||||
@ -184,6 +200,29 @@ uint32 ScummFile::read(void *dataPtr, uint32 dataSize) {
|
||||
return realLen;
|
||||
}
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark --- ScummSteamFile ---
|
||||
#pragma mark -
|
||||
bool ScummSteamFile::open(const Common::String &filename) {
|
||||
for (const SteamIndexFile *indexFile = steamIndexFiles; indexFile->len; ++indexFile) {
|
||||
if (indexFile->id == _steamGame.id && indexFile->platform == _steamGame.platform && filename.equalsIgnoreCase(indexFile->indexFileName))
|
||||
return openWithSubRange(indexFile->executableName, indexFile->start, indexFile->len);
|
||||
}
|
||||
|
||||
// Regular non-bundled file
|
||||
return ScummFile::open(filename);
|
||||
}
|
||||
|
||||
bool ScummSteamFile::openWithSubRange(const Common::String &filename, int32 subFileStart, int32 subFileLen) {
|
||||
if (ScummFile::open(filename)) {
|
||||
_subFileStart = subFileStart;
|
||||
_subFileLen = subFileLen;
|
||||
seek(0, SEEK_SET);
|
||||
return true;
|
||||
} else
|
||||
return false;
|
||||
}
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark --- ScummDiskImage ---
|
||||
#pragma mark -
|
||||
|
@ -53,7 +53,7 @@ public:
|
||||
};
|
||||
|
||||
class ScummFile : public BaseScummFile {
|
||||
private:
|
||||
protected:
|
||||
int32 _subFileStart;
|
||||
int32 _subFileLen;
|
||||
bool _myEos; // Have we read past the end of the subfile?
|
||||
@ -64,7 +64,7 @@ private:
|
||||
public:
|
||||
ScummFile();
|
||||
|
||||
bool open(const Common::String &filename);
|
||||
virtual bool open(const Common::String &filename);
|
||||
bool openSubFile(const Common::String &filename);
|
||||
|
||||
void clearErr() { _myEos = false; BaseScummFile::clearErr(); }
|
||||
@ -76,6 +76,18 @@ public:
|
||||
uint32 read(void *dataPtr, uint32 dataSize);
|
||||
};
|
||||
|
||||
class ScummSteamFile : public ScummFile {
|
||||
private:
|
||||
GameSettings _steamGame;
|
||||
|
||||
bool openWithSubRange(const Common::String &filename, int32 subFileStart, int32 subFileLen);
|
||||
|
||||
public:
|
||||
ScummSteamFile(GameSettings game) : ScummFile(), _steamGame(game) {}
|
||||
|
||||
bool open(const Common::String &filename);
|
||||
};
|
||||
|
||||
class ScummDiskImage : public BaseScummFile {
|
||||
private:
|
||||
Common::SeekableReadStream *_stream;
|
||||
@ -120,6 +132,18 @@ public:
|
||||
uint32 read(void *dataPtr, uint32 dataSize);
|
||||
};
|
||||
|
||||
struct SteamIndexFile {
|
||||
byte id;
|
||||
Common::Platform platform;
|
||||
const char *pattern;
|
||||
const char *indexFileName;
|
||||
const char *executableName;
|
||||
int32 start;
|
||||
int32 len;
|
||||
};
|
||||
|
||||
extern const SteamIndexFile steamIndexFiles[];
|
||||
|
||||
} // End of namespace Scumm
|
||||
|
||||
#endif
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
This file was generated by the md5table tool on Wed Jun 25 09:07:50 2014
|
||||
This file was generated by the md5table tool on Wed Jun 25 10:34:07 2014
|
||||
DO NOT EDIT MANUALLY!
|
||||
*/
|
||||
|
||||
@ -17,6 +17,7 @@ static const MD5Table md5table[] = {
|
||||
{ "008e76ec3ae58d0add637ea7aa299a2c", "freddi3", "", "", -1, Common::FR_FRA, Common::kPlatformMacintosh },
|
||||
{ "02cae0e7ff8504f73618391873d5781a", "freddi3", "HE 98.5", "", -1, Common::DE_DEU, Common::kPlatformWindows },
|
||||
{ "0305e850382b812fec6e5998ef88a966", "pajama", "", "Demo", -1, Common::NL_NLD, Common::kPlatformUnknown },
|
||||
{ "0354ee0d14cde1264ec762261c04c14a", "loom", "Steam", "Steam", 585728, Common::EN_ANY, Common::kPlatformWindows },
|
||||
{ "035deab53b47bc43abc763560d0f8d4b", "atlantis", "Floppy", "Demo", -1, Common::EN_ANY, Common::kPlatformDOS },
|
||||
{ "037385a953789190298494d92b89b3d0", "catalog", "HE 72", "Demo", -1, Common::EN_ANY, Common::kPlatformWindows },
|
||||
{ "03d3b18ee3fd68114e2a687c871e38d5", "freddi4", "HE 99", "Mini Game", -1, Common::EN_USA, Common::kPlatformWindows },
|
||||
@ -299,6 +300,7 @@ static const MD5Table md5table[] = {
|
||||
{ "69ffe29185b8d71f09f6199f8b2a87cb", "lost", "HE 100", "", -1, Common::RU_RUS, Common::kPlatformWindows },
|
||||
{ "6a30a07f353a75cdc602db27d73e1b42", "puttputt", "HE 70", "", -1, Common::EN_ANY, Common::kPlatformWindows },
|
||||
{ "6a60d395b78b205c93a956100b1bf5ae", "pajama2", "HE 98.5", "", -1, Common::DE_DEU, Common::kPlatformUnknown },
|
||||
{ "6a8133b63d46f6663fbcbb49d5a2edb1", "atlantis", "Steam", "Steam", 520548, Common::EN_ANY, Common::kPlatformMacintosh },
|
||||
{ "6af2419fe3db5c2fdb091ae4e5833770", "puttrace", "HE 98.5", "Demo", -1, Common::NL_NLD, Common::kPlatformUnknown },
|
||||
{ "6b19d0e25cbf720d05822379b8b90ed9", "PuttTime", "HE 90", "Demo", -1, Common::NL_NLD, Common::kPlatformUnknown },
|
||||
{ "6b257bb2827dd894b8109a50a1a18b5a", "freddicove", "HE 100", "Demo", -1, Common::NL_NLD, Common::kPlatformUnknown },
|
||||
@ -357,6 +359,7 @@ static const MD5Table md5table[] = {
|
||||
{ "7edd665bbede7ea8b7233f8e650be6f8", "samnmax", "", "CD", -1, Common::FR_FRA, Common::kPlatformUnknown },
|
||||
{ "7f45ddd6dbfbf8f80c0c0efea4c295bc", "maniac", "V1", "V1", 1972, Common::EN_ANY, Common::kPlatformDOS },
|
||||
{ "7f945525abcd48015adf1632637a44a1", "pajama", "", "Demo", -1, Common::FR_FRA, Common::kPlatformUnknown },
|
||||
{ "7fbcff27c323499beaedd605e1ebd47d", "indy3", "Steam", "Steam", 561152, Common::EN_ANY, Common::kPlatformWindows },
|
||||
{ "7fc6cdb46b4c9d384c52327f4bca6416", "football", "", "", -1, Common::EN_ANY, Common::kPlatformUnknown },
|
||||
{ "810a9da887aefa597b0cf3c77d262897", "BluesABCTime", "", "Demo", -1, Common::EN_ANY, Common::kPlatformUnknown },
|
||||
{ "822807c3cd3b43a925cab2767ca6b453", "BluesTreasureHunt", "", "Disc 1", -1, Common::EN_ANY, Common::kPlatformUnknown },
|
||||
@ -439,6 +442,7 @@ static const MD5Table md5table[] = {
|
||||
{ "a095616d2d23ccf43b8e257711202cba", "football2002", "", "", -1, Common::EN_ANY, Common::kPlatformUnknown },
|
||||
{ "a095e33061606d231ff37dca4c64c8ac", "pajama", "HE 99", "", -1, Common::DE_DEU, Common::kPlatformUnknown },
|
||||
{ "a0a7dea72003933b8b3f8b99b9f7ddeb", "loom", "No AdLib", "EGA", -1, Common::EN_ANY, Common::kPlatformAtariST },
|
||||
{ "a15d6e1e2c52bbd0ff7fa6b63ab7f796", "indy3", "Steam", "Steam", 680340, Common::EN_ANY, Common::kPlatformMacintosh },
|
||||
{ "a194f15f51ee62badab74b9e7da97693", "baseball2001", "", "Demo", 20507, Common::EN_ANY, Common::kPlatformUnknown },
|
||||
{ "a197a87ae77f3b3333f09a7a2c448fe2", "freddi", "HE 99", "Updated", -1, Common::EN_ANY, Common::kPlatformWindows },
|
||||
{ "a22af0ad0e3126d19d22707b0267a37d", "balloon", "HE 80", "", -1, Common::NL_NLD, Common::kPlatformWindows },
|
||||
@ -467,6 +471,7 @@ static const MD5Table md5table[] = {
|
||||
{ "aa8a0cb65f3afbbe2c14c3f9f92775a3", "monkey", "CD", "CD", 8955, Common::FR_FRA, Common::kPlatformDOS },
|
||||
{ "aaa587701cde7e74692c68c1024b85eb", "puttrace", "HE 99", "Demo", -1, Common::NL_NLD, Common::kPlatformUnknown },
|
||||
{ "aaa7f36a253f277dd29dd1c051b0e4b9", "indy3", "No AdLib", "EGA", -1, Common::DE_DEU, Common::kPlatformAtariST },
|
||||
{ "aad201302286c1cfee92321cd406e427", "dig", "Steam", "Steam", 811008, Common::EN_ANY, Common::kPlatformWindows },
|
||||
{ "ab0693e9324cfcf498fdcbb12acf8bb4", "puttcircus", "", "", -1, Common::EN_ANY, Common::kPlatformUnknown },
|
||||
{ "ac1642b6edfb8521ca03760126f1c250", "tentacle", "", "Demo", -1, Common::DE_DEU, Common::kPlatformDOS },
|
||||
{ "ac62d50e39492ee3738b4e83a5ac780f", "freddi2", "HE 80", "", -1, Common::NL_NLD, Common::kPlatformWindows },
|
||||
@ -480,6 +485,7 @@ static const MD5Table md5table[] = {
|
||||
{ "b250d0f9cc83f80ced56fe11a4fb057c", "maniac", "V2", "V2", 1988, Common::EN_ANY, Common::kPlatformDOS },
|
||||
{ "b289a2a8cbedbf45786e0b4ad2f510f1", "samnmax", "Floppy", "Floppy", -1, Common::IT_ITA, Common::kPlatformDOS },
|
||||
{ "b47be81e39a9710f6f595f7b527b60f8", "puttrace", "HE 99", "", -1, Common::EN_GRB, Common::kPlatformWindows },
|
||||
{ "b4a677bf27c010a747975705108ff1e6", "loom", "Steam", "Steam", 393572, Common::EN_ANY, Common::kPlatformMacintosh },
|
||||
{ "b5298a5c15ffbe8b381d51ea4e26d35c", "freddi4", "HE 99", "", -1, Common::DE_DEU, Common::kPlatformUnknown },
|
||||
{ "b597e0403cc0002f69170e6caba7edd9", "indy3", "EGA", "EGA Demo", 5361, Common::EN_ANY, Common::kPlatformDOS },
|
||||
{ "b628506f7def772e40de0aa5440fb8e1", "activity", "HE 70", "", -1, Common::EN_ANY, Common::kPlatformWindows },
|
||||
@ -569,6 +575,7 @@ static const MD5Table md5table[] = {
|
||||
{ "d7b247c26bf1f01f8f7daf142be84de3", "balloon", "HE 99", "Updated", -1, Common::EN_ANY, Common::kPlatformWindows },
|
||||
{ "d8323015ecb8b10bf53474f6e6b0ae33", "dig", "", "", 16304, Common::UNK_LANG, Common::kPlatformUnknown },
|
||||
{ "d917f311a448e3cc7239c31bddb00dd2", "samnmax", "", "CD", 9080, Common::EN_ANY, Common::kPlatformUnknown },
|
||||
{ "d93cc8be628ed5d3b3a29188fc7105d3", "dig", "Steam", "Steam", 1061296, Common::EN_ANY, Common::kPlatformMacintosh },
|
||||
{ "d9d0dd93d16ab4dec55cabc2b86bbd17", "samnmax", "", "Demo", 6478, Common::EN_ANY, Common::kPlatformDOS },
|
||||
{ "da09e666fc8f5b78d7b0ac65d1a3b56e", "monkey2", "FM-TOWNS", "", 11135, Common::EN_ANY, Common::kPlatformFMTowns },
|
||||
{ "da6269b18fcb08189c0aa9c95533cce2", "monkey", "CD", "CD", 8955, Common::IT_ITA, Common::kPlatformDOS },
|
||||
@ -629,6 +636,7 @@ static const MD5Table md5table[] = {
|
||||
{ "f237bf8a5ef9af78b2a6a4f3901da341", "pajama", "", "Demo", 18354, Common::EN_ANY, Common::kPlatformUnknown },
|
||||
{ "f27b1ba0eadaf2a6617b2b58192d1dbf", "samnmax", "Floppy", "Floppy", -1, Common::DE_DEU, Common::kPlatformDOS },
|
||||
{ "f2ec78e50bdc63b70044e9758be10914", "spyfox", "HE 98.5", "Demo", -1, Common::NL_NLD, Common::kPlatformMacintosh },
|
||||
{ "f3c5d9bf3f091bd1f18dc1013fba5396", "atlantis", "Steam", "Steam", 638976, Common::EN_ANY, Common::kPlatformWindows },
|
||||
{ "f3d55aea441e260e9e9c7d2a187097e0", "puttzoo", "", "Demo", 14337, Common::EN_ANY, Common::kPlatformWindows },
|
||||
{ "f40a7f495f59188ca57a9d1d50301bb6", "puttputt", "HE 60", "Demo", -1, Common::EN_ANY, Common::kPlatformMacintosh },
|
||||
{ "f5228b0cc1c19e6ea8268ba2eeb61f60", "freddi", "HE 73", "Demo", -1, Common::FR_FRA, Common::kPlatformWindows },
|
||||
|
@ -1026,6 +1026,35 @@ Common::Error ScummEngine::init() {
|
||||
}
|
||||
#endif
|
||||
|
||||
// Extra directories needed for the Steam versions
|
||||
if (_filenamePattern.genMethod == kGenDiskNumSteam || _filenamePattern.genMethod == kGenRoomNumSteam) {
|
||||
if (_game.platform == Common::kPlatformWindows) {
|
||||
switch (_game.id) {
|
||||
case GID_INDY3 :
|
||||
SearchMan.addSubDirectoryMatching(gameDataDir, "indy3");
|
||||
break;
|
||||
case GID_INDY4 :
|
||||
SearchMan.addSubDirectoryMatching(gameDataDir, "atlantis");
|
||||
break;
|
||||
case GID_LOOM :
|
||||
SearchMan.addSubDirectoryMatching(gameDataDir, "loom");
|
||||
break;
|
||||
#ifdef ENABLE_SCUMM_7_8
|
||||
case GID_DIG :
|
||||
SearchMan.addSubDirectoryMatching(gameDataDir, "dig");
|
||||
SearchMan.addSubDirectoryMatching(gameDataDir, "dig/video");
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
SearchMan.addSubDirectoryMatching(gameDataDir, "Contents");
|
||||
SearchMan.addSubDirectoryMatching(gameDataDir, "Contents/MacOS");
|
||||
SearchMan.addSubDirectoryMatching(gameDataDir, "Contents/Resources");
|
||||
SearchMan.addSubDirectoryMatching(gameDataDir, "Contents/Resources/video");
|
||||
}
|
||||
}
|
||||
|
||||
// The kGenUnchanged method is only used for 'container files', i.e. files
|
||||
// that contain the real game files bundled together in an archive format.
|
||||
@ -1126,15 +1155,25 @@ Common::Error ScummEngine::init() {
|
||||
error("Couldn't find known subfile inside container file '%s'", _containerFile.c_str());
|
||||
|
||||
_fileHandle->close();
|
||||
|
||||
} else {
|
||||
error("kGenUnchanged used with unsupported platform");
|
||||
}
|
||||
} else {
|
||||
// Regular access, no container file involved
|
||||
_fileHandle = new ScummFile();
|
||||
if (_filenamePattern.genMethod == kGenDiskNumSteam || _filenamePattern.genMethod == kGenRoomNumSteam) {
|
||||
// Steam game versions have the index file embedded in the main executable
|
||||
_fileHandle = new ScummSteamFile(_game);
|
||||
} else {
|
||||
// Regular access, no container file involved
|
||||
_fileHandle = new ScummFile();
|
||||
}
|
||||
}
|
||||
|
||||
// Steam Win and Mac versions share the same DOS data files. We show Windows or Mac
|
||||
// for the platform the detector, but internally we force the platform to DOS, so that
|
||||
// the code for handling the original DOS data files is used.
|
||||
if (_filenamePattern.genMethod == kGenDiskNumSteam || _filenamePattern.genMethod == kGenRoomNumSteam)
|
||||
_game.platform = Common::kPlatformDOS;
|
||||
|
||||
// Load CJK font, if present
|
||||
// Load it earlier so _useCJKMode variable could be set
|
||||
loadCJKFont();
|
||||
@ -1218,7 +1257,7 @@ Common::Error ScummEngine::init() {
|
||||
|
||||
void ScummEngine::setupScumm() {
|
||||
// On some systems it's not safe to run CD audio games from the CD.
|
||||
if (_game.features & GF_AUDIOTRACKS) {
|
||||
if (_game.features & GF_AUDIOTRACKS && !Common::File::exists("CDDA.SOU")) {
|
||||
checkCD();
|
||||
|
||||
int cd_num = ConfMan.getInt("cdrom");
|
||||
|
Loading…
x
Reference in New Issue
Block a user