From 88fe4e3106e4eb7f3c179dfdb3b5a2f4fd3c7e2c Mon Sep 17 00:00:00 2001 From: Einar Johan Trøan Sømåen Date: Mon, 23 Jul 2012 04:40:31 +0200 Subject: WINTERMUTE: Handle the "language/" subdirectory separately for choice of language. Since we don't have the same launcher the games have, we'll have to avoid including ALL the datafiles, as the localization-dcps are usually intended to work alone. For now, it's hardcoded to only load english. --- engines/wintermute/base/base_file_manager.cpp | 28 ++++++++++++++++++++------- engines/wintermute/base/base_file_manager.h | 4 ++-- engines/wintermute/base/file/base_package.cpp | 7 ++++--- engines/wintermute/base/file/base_package.h | 2 ++ 4 files changed, 29 insertions(+), 12 deletions(-) diff --git a/engines/wintermute/base/base_file_manager.cpp b/engines/wintermute/base/base_file_manager.cpp index 5d399c33a1..1ff82d5e18 100644 --- a/engines/wintermute/base/base_file_manager.cpp +++ b/engines/wintermute/base/base_file_manager.cpp @@ -246,7 +246,10 @@ bool BaseFileManager::initPaths() { if (dataSubFolder.exists()) { addPath(PATH_PACKAGE, dataSubFolder); } - + Common::FSNode languageSubFolder = gameData.getChild("language"); + if (languageSubFolder.exists()) { + addPath(PATH_PACKAGE, languageSubFolder); + } return STATUS_OK; } @@ -254,7 +257,7 @@ bool BaseFileManager::registerPackages(const Common::FSList &fslist) { for (Common::FSList::const_iterator it = fslist.begin(); it != fslist.end(); it++) { debugC(kWinterMuteDebugFileAccess, "Adding %s", (*it).getName().c_str()); if ((*it).getName().contains(".dcp")) { - if (registerPackage((*it).createReadStream())) { + if (registerPackage((*it))) { addPath(PATH_PACKAGE, (*it)); } } @@ -276,8 +279,16 @@ bool BaseFileManager::registerPackages() { for (Common::FSList::iterator fileIt = files.begin(); fileIt != files.end(); fileIt++) { if (!fileIt->getName().contains(".dcp")) continue; + // Avoid registering all the language files + // TODO: Select based on the gameDesc. + if (fileIt->getParent().getName() == "language") { + Common::String parentName = fileIt->getParent().getName(); + Common::String dcpName = fileIt->getName(); + if (fileIt->getName() != "english.dcp") + continue; + } warning("Registering %s %s", (*fileIt).getPath().c_str(), (*fileIt).getName().c_str()); - registerPackage((*fileIt).createReadStream()); + registerPackage((*fileIt)); } } @@ -287,7 +298,7 @@ bool BaseFileManager::registerPackages() { } ////////////////////////////////////////////////////////////////////////// -bool BaseFileManager::registerPackage(const Common::String &filename , bool searchSignature) { +/*bool BaseFileManager::registerPackage(const Common::String &filename , bool searchSignature) { Common::File *package = new Common::File(); package->open(filename); if (!package->isOpen()) { @@ -295,12 +306,14 @@ bool BaseFileManager::registerPackage(const Common::String &filename , bool sear return STATUS_OK; } return registerPackage(package, filename); -} +}*/ -bool BaseFileManager::registerPackage(Common::SeekableReadStream *package, const Common::String &filename, bool searchSignature) { +bool BaseFileManager::registerPackage(Common::FSNode file, const Common::String &filename, bool searchSignature) { uint32 absoluteOffset = 0; bool boundToExe = false; - + Common::SeekableReadStream * package = file.createReadStream(); + if (!package) + return STATUS_FAILED; if (searchSignature) { uint32 offset; if (!findPackageSignature(package, &offset)) { @@ -335,6 +348,7 @@ bool BaseFileManager::registerPackage(Common::SeekableReadStream *package, const for (uint32 i = 0; i < hdr._numDirs; i++) { BasePackage *pkg = new BasePackage(this); + pkg->_fsnode = file; if (!pkg) return STATUS_FAILED; pkg->_boundToExe = boundToExe; diff --git a/engines/wintermute/base/base_file_manager.h b/engines/wintermute/base/base_file_manager.h index 8dfde06f74..f859e39b00 100644 --- a/engines/wintermute/base/base_file_manager.h +++ b/engines/wintermute/base/base_file_manager.h @@ -75,8 +75,8 @@ private: Common::FSList _packagePaths; // Common::FSList _singlePaths; bool findPackageSignature(Common::SeekableReadStream *f, uint32 *offset); - bool registerPackage(Common::SeekableReadStream *stream, const Common::String &filename = "", bool searchSignature = false); - bool registerPackage(const Common::String &filename, bool searchSignature = false); + bool registerPackage(Common::FSNode package, const Common::String &filename = "", bool searchSignature = false); +// bool registerPackage(const Common::String &filename, bool searchSignature = false); Common::Array _packages; Common::Array _openFiles; Common::HashMap _files; diff --git a/engines/wintermute/base/file/base_package.cpp b/engines/wintermute/base/file/base_package.cpp index a0f56ddf83..427f2f46f8 100644 --- a/engines/wintermute/base/file/base_package.cpp +++ b/engines/wintermute/base/file/base_package.cpp @@ -86,12 +86,13 @@ bool BasePackage::read(Common::SeekableReadStream *file, uint32 offset, byte *bu ////////////////////////////////////////////////////////////////////////// Common::SeekableReadStream *BasePackage::getFilePointer() { - Common::File *file = _fileManager->openPackage(_name); + Common::SeekableReadStream *stream = _fsnode.createReadStream(); +/* Common::File *file = _fileManager->openPackage(_name); if (!file) { _fileManager->requestCD(_cd, _name, ""); file = _fileManager->openPackage(_name); - } - return file; + }*/ + return stream; } ////////////////////////////////////////////////////////////////////////// diff --git a/engines/wintermute/base/file/base_package.h b/engines/wintermute/base/file/base_package.h index af180ac7bf..673655a710 100644 --- a/engines/wintermute/base/file/base_package.h +++ b/engines/wintermute/base/file/base_package.h @@ -30,6 +30,7 @@ #define WINTERMUTE_BPACKAGE_H #include "common/stream.h" +#include "common/fs.h" namespace Common { class SeekableReadStream; @@ -43,6 +44,7 @@ public: Common::SeekableReadStream *getFilePointer(); void closeFilePointer(Common::SeekableReadStream *&file); + Common::FSNode _fsnode; bool _boundToExe; byte _priority; bool read(Common::SeekableReadStream *file, uint32 offset, byte *buffer, uint32 size); -- cgit v1.2.3