diff options
author | Eugene Sandulenko | 2016-03-06 12:28:20 +0100 |
---|---|---|
committer | Eugene Sandulenko | 2016-03-06 12:28:20 +0100 |
commit | 0a07ef2361f28f3d9fe4ec113c44c34f346b7db2 (patch) | |
tree | 83c66d259894f14f11ef255cab96384f67dee24f /engines/wintermute/base/file | |
parent | dba38332d19f9aa902eae8b232c8d0f4048edb0a (diff) | |
parent | 891986fd2be496834ce5c8dc54f0dd09d3271f95 (diff) | |
download | scummvm-rg350-0a07ef2361f28f3d9fe4ec113c44c34f346b7db2.tar.gz scummvm-rg350-0a07ef2361f28f3d9fe4ec113c44c34f346b7db2.tar.bz2 scummvm-rg350-0a07ef2361f28f3d9fe4ec113c44c34f346b7db2.zip |
Merge pull request #696 from tobiatesan/fix_7067_broken_abs
WINTERMUTE: Rewrite absolute prefix workarounds block with loop
Diffstat (limited to 'engines/wintermute/base/file')
-rw-r--r-- | engines/wintermute/base/file/base_disk_file.cpp | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/engines/wintermute/base/file/base_disk_file.cpp b/engines/wintermute/base/file/base_disk_file.cpp index b474c069db..d0c51616f4 100644 --- a/engines/wintermute/base/file/base_disk_file.cpp +++ b/engines/wintermute/base/file/base_disk_file.cpp @@ -113,15 +113,28 @@ Common::SeekableReadStream *openDiskFile(const Common::String &filename) { Common::String fixedFilename = filename; correctSlashes(fixedFilename); - // Absolute path: TODO: Add specific fallbacks here. + // HACK: There are a few games around which mistakenly refer to absolute paths in the scripts. + // The original interpreter on Windows usually simply ignores them when it can't find them. + // We try to turn the known ones into relative paths. if (fixedFilename.contains(':')) { - if (fixedFilename.hasPrefix("c:/windows/fonts/")) { // East Side Story refers to "c:\windows\fonts\framd.ttf" - fixedFilename = filename.c_str() + 14; - } else if (fixedFilename.hasPrefix("c:/carol6/svn/data/")) { // Carol Reed 6: Black Circle refers to "c:\carol6\svn\data\sprites\system\help.png" - fixedFilename = fixedFilename.c_str() + 19; - } else if (fixedFilename.hasPrefix("f:/dokument/spel 5/demo/data/")) { // Carol Reed 5 (non-demo) refers to "f:\dokument\spel 5\demo\data\scenes\credits\op_cred_00\op_cred_00.jpg" - fixedFilename = fixedFilename.c_str() + 29; - } else { + const char* const knownPrefixes[] = { // Known absolute paths + "c:/windows/fonts/", // East Side Story refers to "c:\windows\fonts\framd.ttf" + "c:/carol6/svn/data/", // Carol Reed 6: Black Circle refers to "c:\carol6\svn\data\sprites\system\help.png" + "f:/dokument/spel 5/demo/data/" // Carol Reed 5 (non-demo) refers to "f:\dokument\spel 5\demo\data\scenes\credits\op_cred_00\op_cred_00.jpg" + }; + + bool matched = false; + + for (uint i = 0; i < ARRAYSIZE(knownPrefixes); i++) { + if (fixedFilename.hasPrefix(knownPrefixes[i])) { + fixedFilename = fixedFilename.c_str() + strlen(knownPrefixes[i]); + matched = true; + } + } + + if (!matched) { + // fixedFilename is unchanged and thus still broken, none of the above workarounds worked. + // We can only bail out error("openDiskFile::Absolute path or invalid filename used in %s", filename.c_str()); } } |