diff options
Diffstat (limited to 'engines/xeen/files.cpp')
-rw-r--r-- | engines/xeen/files.cpp | 137 |
1 files changed, 93 insertions, 44 deletions
diff --git a/engines/xeen/files.cpp b/engines/xeen/files.cpp index 06dd3d12a7..b62a0d8cd5 100644 --- a/engines/xeen/files.cpp +++ b/engines/xeen/files.cpp @@ -26,6 +26,7 @@ #include "common/textconsole.h" #include "xeen/xeen.h" #include "xeen/files.h" +#include "xeen/saves.h" namespace Xeen { @@ -120,7 +121,7 @@ int BaseCCArchive::listMembers(Common::ArchiveMemberList &list) const { CCArchive::CCArchive(const Common::String &filename, bool encoded): BaseCCArchive(), _filename(filename), _encoded(encoded) { - File f(filename); + File f(filename, SearchMan); loadIndex(&f); } @@ -128,7 +129,7 @@ CCArchive::CCArchive(const Common::String &filename, const Common::String &prefi bool encoded): BaseCCArchive(), _filename(filename), _prefix(prefix), _encoded(encoded) { _prefix.toLowercase(); - File f(filename); + File f(filename, SearchMan); loadIndex(&f); } @@ -183,71 +184,67 @@ Common::SeekableReadStream *CCArchive::createReadStreamForMember(const Common::S /*------------------------------------------------------------------------*/ -CCArchive *FileManager::_archives[3]; - FileManager::FileManager(XeenEngine *vm) { Common::File f; int sideNum = 0; - File::_currentArchive = ANY_ARCHIVE; _isDarkCc = vm->getGameID() == GType_DarkSide; - _archives[0] = _archives[1] = _archives[2] = nullptr; - - if (vm->getGameID() != GType_DarkSide) { - _archives[0] = new CCArchive("xeen.cc", "xeen", true); - SearchMan.add("xeen", _archives[0]); - sideNum = 1; + + File::_xeenCc = (vm->getGameID() == GType_DarkSide) ? nullptr : + new CCArchive("xeen.cc", "xeen", true); + File::_darkCc = (vm->getGameID() == GType_Clouds) ? nullptr : + new CCArchive("dark.cc", "dark", true); + if (Common::File::exists("intro.cc")) { + CCArchive *introCc = new CCArchive("intro.cc", "intro", true); + SearchMan.add("intro", introCc); } - if (vm->getGameID() == GType_DarkSide || vm->getGameID() == GType_WorldOfXeen) { - _archives[sideNum] = new CCArchive("dark.cc", "dark", true); - SearchMan.add("dark", _archives[sideNum]); - } + File::_currentArchive = vm->getGameID() == GType_DarkSide ? + File::_darkCc : File::_xeenCc; + assert(File::_currentArchive); +} - if (f.exists("intro.cc")) { - _archives[2] = new CCArchive("intro.cc", "intro", true); - SearchMan.add("intro", _archives[2]); - } +FileManager::~FileManager() { + SearchMan.remove("intro"); + delete File::_xeenCc; + delete File::_darkCc; } -void FileManager::setGameCc(bool isDarkCc) { - _isDarkCc = isDarkCc; - File::_currentArchive = isDarkCc ? ALTSIDE_ARCHIVE : GAME_ARCHIVE; +void FileManager::setGameCc(int ccMode) { + if (g_vm->getGameID() != GType_WorldOfXeen) + ccMode = 1; + + File::setCurrentArchive(ccMode); + _isDarkCc = ccMode != 0; } /*------------------------------------------------------------------------*/ -ArchiveType File::_currentArchive; +CCArchive *File::_currentArchive; +CCArchive *File::_xeenCc; +CCArchive *File::_darkCc; File::File(const Common::String &filename) { File::open(filename); } -File::File(const Common::String &filename, ArchiveType archiveType) { - File::open(filename, archiveType); -} - File::File(const Common::String &filename, Common::Archive &archive) { File::open(filename, archive); } -bool File::open(const Common::String &filename) { - return File::open(filename, _currentArchive); +File::File(const Common::String &filename, int ccMode) { + File::open(filename, ccMode); } -bool File::open(const Common::String &filename, ArchiveType archiveType) { - if (archiveType == ANY_ARCHIVE) { - Common::File::open(filename); - } else { - CCArchive &archive = *FileManager::_archives[archiveType]; - if (!Common::File::open(filename, archive)) - // If not in the designated archive, try opening from any archive, - // or as a standalone file in the filesystem - Common::File::open(filename); +bool File::open(const Common::String &filename) { + if (!g_vm->_saves || !Common::File::open(filename, *g_vm->_saves)) { + if (!Common::File::open(filename, *_currentArchive)) { + // Could not find in current archive, so try intro.cc or in folder + if (!Common::File::open(filename)) + error("Could not open file - %s", filename.c_str()); + } } - if (!isOpen()) - error("Could not open file - %s", filename.c_str()); return true; } @@ -257,6 +254,34 @@ bool File::open(const Common::String &filename, Common::Archive &archive) { return true; } +bool File::open(const Common::String &filename, int ccMode) { + FileManager &files = *g_vm->_files; + int oldMode = files._isDarkCc ? 1 : 0; + + files.setGameCc(ccMode); + File::open(filename); + files.setGameCc(oldMode); + + return true; +} + +void File::setCurrentArchive(int ccMode) { + switch (ccMode) { + case 0: + _currentArchive = _xeenCc; + break; + + case 1: + _currentArchive = _darkCc; + break; + + default: + break; + } + + assert(_currentArchive); +} + Common::String File::readString() { Common::String result; char c; @@ -267,18 +292,42 @@ Common::String File::readString() { return result; } +bool File::exists(const Common::String &filename) { + if (!g_vm->_saves || !g_vm->_saves->hasFile(filename)) { + if (!_currentArchive->hasFile(filename)) { + // Could not find in current archive, so try intro.cc or in folder + return Common::File::exists(filename); + } + } + + return true; +} + +bool File::exists(const Common::String &filename, int ccMode) { + FileManager &files = *g_vm->_files; + int oldMode = files._isDarkCc ? 1 : 0; + + files.setGameCc(ccMode); + bool result = exists(filename); + files.setGameCc(oldMode); + + return result; +} + /*------------------------------------------------------------------------*/ void StringArray::load(const Common::String &name) { - load(name, ANY_ARCHIVE); + File f(name); + clear(); + while (f.pos() < f.size()) + push_back(f.readString()); } -void StringArray::load(const Common::String &name, ArchiveType archiveType) { - File f(name, archiveType); +void StringArray::load(const Common::String &name, int ccMode) { + File f(name, ccMode); clear(); while (f.pos() < f.size()) push_back(f.readString()); } - } // End of namespace Xeen |