aboutsummaryrefslogtreecommitdiff
path: root/engines/xeen/files.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/xeen/files.cpp')
-rw-r--r--engines/xeen/files.cpp137
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