diff options
author | Filippos Karapetis | 2010-08-29 00:17:56 +0000 |
---|---|---|
committer | Filippos Karapetis | 2010-08-29 00:17:56 +0000 |
commit | 3f1f894e8eeb091153963b8b936b533f78f17e4a (patch) | |
tree | fa1f2d094b642e44ba21183da5fd9b83cb16e950 /engines | |
parent | a2a30735626f8b4440f2a3128e0568c55b840b30 (diff) | |
download | scummvm-rg350-3f1f894e8eeb091153963b8b936b533f78f17e4a.tar.gz scummvm-rg350-3f1f894e8eeb091153963b8b936b533f78f17e4a.tar.bz2 scummvm-rg350-3f1f894e8eeb091153963b8b936b533f78f17e4a.zip |
SCI: Added proper handling of QFG exported character files.
Now, QFG2, 3 and 4 may read exported characters from all
other QFG games, like the originals did. Fixes bug
#3054692 - "QFG2/QFG3 Import issues".
svn-id: r52430
Diffstat (limited to 'engines')
-rw-r--r-- | engines/sci/engine/kfile.cpp | 20 | ||||
-rw-r--r-- | engines/sci/sci.cpp | 40 | ||||
-rw-r--r-- | engines/sci/sci.h | 6 |
3 files changed, 48 insertions, 18 deletions
diff --git a/engines/sci/engine/kfile.cpp b/engines/sci/engine/kfile.cpp index 27b0c77e03..99567d5d6e 100644 --- a/engines/sci/engine/kfile.cpp +++ b/engines/sci/engine/kfile.cpp @@ -812,6 +812,20 @@ reg_t kFileIOOpen(EngineState *s, int argc, reg_t *argv) { return SIGNAL_REG; } debugC(2, kDebugLevelFile, "kFileIO(open): %s, 0x%x", name.c_str(), mode); + + // Since we're not wrapping/unwrapping save files for QFG import screens, + // the name of the save file will almost certainly be over 12 characters in + // length. Compensate for that fact here, by cutting off the last character + // and searching for the file via the first 11 characters + if (g_sci->isQFGImportScreen()) { + name.deleteLastChar(); + Common::String pattern = name + "*"; + + Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager(); + Common::StringArray saveNames = saveFileMan->listSavefiles(pattern); + name = saveNames.size() > 0 ? saveNames[0] : name; + } + return file_open(s, name.c_str(), mode); } @@ -945,6 +959,12 @@ reg_t kFileIOFindFirst(EngineState *s, int argc, reg_t *argv) { int attr = argv[2].toUint16(); // We won't use this, Win32 might, though... debugC(2, kDebugLevelFile, "kFileIO(findFirst): %s, 0x%x", mask.c_str(), attr); + // Change the file mask in QFG character import screens. The game + // is looking for *.*, but that may well include other files as well, + // thus limit the file mask to only include exported characters. + if (g_sci->isQFGImportScreen()) + mask = "qfg*.sav"; + // QfG3 uses "/\*.*" for the character import, QfG4 uses "/\*" if (mask.hasPrefix("/\\")) { mask.deleteChar(0); diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index c7309a8415..cb36ebd0f5 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -637,36 +637,40 @@ Common::String SciEngine::getSavegamePattern() const { } Common::String SciEngine::getFilePrefix() const { - if (_gameId == GID_QFG2) { - // Quest for Glory 2 wants to read files from Quest for Glory 1 (EGA/VGA) to import character data - if (_gamestate->currentRoomNumber() == 805) { - // Check if there are any QFG1VGA games - bug #3054613 - Common::StringArray saveNames = g_engine->getSaveFileManager()->listSavefiles("qfg1vga-*.sav"); - return (saveNames.size() > 0) ? "qfg1vga" : "qfg1"; - } - } else if (_gameId == GID_QFG3) { - // Quest for Glory 3 wants to read files from Quest for Glory 2 to import character data - if (_gamestate->currentRoomNumber() == 54) - return "qfg2"; - } else if (_gameId == GID_QFG4) { - // Quest for Glory 4 wants to read files from Quest for Glory 3 to import character data - if (_gamestate->currentRoomNumber() == 54) - return "qfg3"; - } return _targetName; } Common::String SciEngine::wrapFilename(const Common::String &name) const { - return getFilePrefix() + "-" + name; + // Do not wrap the game prefix when reading files in QFG import screens. + // That way, we can read exported characters from all QFG games, as + // intended. + return !isQFGImportScreen() ? getFilePrefix() + "-" + name : name; } Common::String SciEngine::unwrapFilename(const Common::String &name) const { Common::String prefix = getFilePrefix() + "-"; - if (name.hasPrefix(prefix.c_str())) + // Do not unwrap the file name when reading files in QFG import screens. + // We don't wrap the game ID prefix in these screens in order to read + // save states from all QFG games. + if (name.hasPrefix(prefix.c_str()) && !isQFGImportScreen()) return Common::String(name.c_str() + prefix.size()); return name; } +bool SciEngine::isQFGImportScreen() const { + if (_gameId == GID_QFG2 && _gamestate->currentRoomNumber() == 805) { + // QFG2 character import screen + return true; + } else if (_gameId == GID_QFG3 && _gamestate->currentRoomNumber() == 54) { + // QFG3 character import screen + return true; + } else if (_gameId == GID_QFG4 && _gamestate->currentRoomNumber() == 54) { + return true; + } else { + return false; + } +} + void SciEngine::pauseEngineIntern(bool pause) { _mixer->pauseAll(pause); } diff --git a/engines/sci/sci.h b/engines/sci/sci.h index 2e5d5c3efc..aaa53367a7 100644 --- a/engines/sci/sci.h +++ b/engines/sci/sci.h @@ -250,6 +250,12 @@ public: /** Remove the 'TARGET-' prefix of the given filename, if present. */ Common::String unwrapFilename(const Common::String &name) const; + /** + * Checks if we are in a QFG import screen, where special handling + * of save states is performed. + */ + bool isQFGImportScreen() const; + void sleep(uint32 msecs); void scriptDebug(); |