diff options
author | Paul Gilbert | 2017-12-20 21:47:16 -0500 |
---|---|---|
committer | Paul Gilbert | 2017-12-20 21:47:16 -0500 |
commit | b032b6ebb6312cfb7944b6eab9999fd3d24404bb (patch) | |
tree | 6920f91eb3c08bbffe39ec89b3d760d5f7494900 /engines/xeen/files.cpp | |
parent | 7555a02c2a4975346f99709195518b11c7e57b79 (diff) | |
download | scummvm-rg350-b032b6ebb6312cfb7944b6eab9999fd3d24404bb.tar.gz scummvm-rg350-b032b6ebb6312cfb7944b6eab9999fd3d24404bb.tar.bz2 scummvm-rg350-b032b6ebb6312cfb7944b6eab9999fd3d24404bb.zip |
XEEN: Starting to do archive access more like the original
Previously the game wasn't paying much attention to the access of
dark.cc vs xeen.cc, which was causing problems when trying to
travel to Dark Side. This is the beginnings of a refactoring
to more closely work like the original does
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 |