aboutsummaryrefslogtreecommitdiff
path: root/engines/xeen/files.cpp
diff options
context:
space:
mode:
authorPaul Gilbert2017-12-20 21:47:16 -0500
committerPaul Gilbert2017-12-20 21:47:16 -0500
commitb032b6ebb6312cfb7944b6eab9999fd3d24404bb (patch)
tree6920f91eb3c08bbffe39ec89b3d760d5f7494900 /engines/xeen/files.cpp
parent7555a02c2a4975346f99709195518b11c7e57b79 (diff)
downloadscummvm-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.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