Skip to content

Commit

Permalink
XEEN: Starting to do archive access more like the original
Browse files Browse the repository at this point in the history
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
  • Loading branch information
dreammaster committed Dec 21, 2017
1 parent 7555a02 commit b032b6e
Show file tree
Hide file tree
Showing 14 changed files with 175 additions and 101 deletions.
2 changes: 0 additions & 2 deletions engines/xeen/debugger.cpp
Expand Up @@ -93,8 +93,6 @@ bool Debugger::cmdDump(int argc, const char **argv) {
} else {
if (argc == 2)
f.open(argv[1]);
else
f.open(argv[1], (ArchiveType)strToInt(argv[2]));

if (f.isOpen()) {
Common::DumpFile df;
Expand Down
2 changes: 1 addition & 1 deletion engines/xeen/dialogs_quests.cpp
Expand Up @@ -245,7 +245,7 @@ void Quests::addButtons() {
}

void Quests::loadQuestNotes() {
File f("qnotes.bin", _vm->getGameID() == GType_Clouds ? GAME_ARCHIVE : ALTSIDE_ARCHIVE);
File f("qnotes.bin");
while (f.pos() < f.size())
_questNotes.push_back(f.readString());
f.close();
Expand Down
137 changes: 93 additions & 44 deletions engines/xeen/files.cpp
Expand Up @@ -26,6 +26,7 @@
#include "common/textconsole.h"
#include "xeen/xeen.h"
#include "xeen/files.h"
#include "xeen/saves.h"

namespace Xeen {

Expand Down Expand Up @@ -120,15 +121,15 @@ 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);
}

CCArchive::CCArchive(const Common::String &filename, const Common::String &prefix,
bool encoded): BaseCCArchive(), _filename(filename),
_prefix(prefix), _encoded(encoded) {
_prefix.toLowercase();
File f(filename);
File f(filename, SearchMan);
loadIndex(&f);
}

Expand Down Expand Up @@ -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;
}

Expand All @@ -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;
Expand All @@ -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
54 changes: 37 additions & 17 deletions engines/xeen/files.h
Expand Up @@ -32,11 +32,6 @@

namespace Xeen {

enum ArchiveType {
ANY_ARCHIVE = -1, GAME_ARCHIVE = 0, ALTSIDE_ARCHIVE = 1,
INTRO_ARCHIVE = 2
};

class XeenEngine;
class CCArchive;
class File;
Expand All @@ -59,38 +54,44 @@ class File;
* Main resource manager
*/
class FileManager {
friend class File;
private:
static CCArchive *_archives[3];
public:
bool _isDarkCc;
public:
/**
* Instantiates the resource manager
* Constructor
*/
FileManager(XeenEngine *vm);

/**
* Destructor
*/
~FileManager();

/**
* Set which game side files to use
* @param ccMode 0=Clouds, 1=Dark Side
*/
void setGameCc(bool isDarkCc);
void setGameCc(int ccMode);
};

/**
* Derived file class
*/
class File : public Common::File {
friend class FileManager;
private:
static CCArchive *_currentArchive;
static CCArchive *_xeenCc;
static CCArchive *_darkCc;
public:
static ArchiveType _currentArchive;

/**
* Sets which archive is used by default
*/
static void setCurrentArchive(ArchiveType arcType) { _currentArchive = arcType; }
static void setCurrentArchive(int ccMode);
public:
File() : Common::File() {}
File(const Common::String &filename);
File(const Common::String &filename, ArchiveType archiveType);
File(const Common::String &filename, int ccMode);
File(const Common::String &filename, Common::Archive &archive);
virtual ~File() {}

Expand All @@ -102,12 +103,12 @@ class File : public Common::File {
/**
* Opens the given file, throwing an error if it can't be opened
*/
virtual bool open(const Common::String &filename, ArchiveType archiveType);
virtual bool open(const Common::String &filename, Common::Archive &archive);

/**
* Opens the given file, throwing an error if it can't be opened
*/
virtual bool open(const Common::String &filename, Common::Archive &archive);
virtual bool open(const Common::String &filename, int ccMode);

/**
* Opens the given file
Expand All @@ -123,7 +124,26 @@ class File : public Common::File {
return Common::File::open(stream, name);
}

/**
* Reads in a null terminated string
*/
Common::String readString();

/**
* Checks if a given file exists
*
* @param filename the file to check for
* @return true if the file exists, false otherwise
*/
static bool exists(const Common::String &filename);

/**
* Checks if a given file exists
*
* @param filename the file to check for
* @return true if the file exists, false otherwise
*/
static bool exists(const Common::String &filename, int ccMode);
};

class StringArray : public Common::StringArray {
Expand All @@ -139,7 +159,7 @@ class StringArray : public Common::StringArray {
/**
* Loads a string array from the specified file
*/
void load(const Common::String &name, ArchiveType archiveType);
void load(const Common::String &name, int ccMode);
};

class XeenSerializer : public Common::Serializer {
Expand Down

0 comments on commit b032b6e

Please sign in to comment.