mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-01-16 18:19:55 +00:00
Load fallback archives listed in openmw.cfg at startup
This commit is contained in:
parent
4b25ae30fd
commit
289bbc64f7
5 changed files with 68 additions and 7 deletions
|
@ -149,16 +149,22 @@ OMW::Engine::~Engine()
|
|||
delete mOgre;
|
||||
}
|
||||
|
||||
// Load all BSA files in data directory.
|
||||
// Load BSA files
|
||||
|
||||
void OMW::Engine::loadBSA()
|
||||
{
|
||||
const Files::MultiDirCollection& bsa = mFileCollections.getCollection (".bsa");
|
||||
|
||||
for (Files::MultiDirCollection::TIter iter(bsa.begin()); iter!=bsa.end(); ++iter)
|
||||
for (std::vector<std::string>::const_iterator archive = mArchives.begin(); archive != mArchives.end(); ++archive)
|
||||
{
|
||||
std::cout << "Adding " << iter->second.string() << std::endl;
|
||||
Bsa::addBSA(iter->second.string());
|
||||
if (mFileCollections.doesExist(*archive))
|
||||
{
|
||||
const std::string archivePath = mFileCollections.getPath(*archive).string();
|
||||
std::cout << "Adding BSA archive " << archivePath << std::endl;
|
||||
Bsa::addBSA(archivePath);
|
||||
}
|
||||
else
|
||||
{
|
||||
std::cout << "Archive " << *archive << " not found" << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
const Files::PathContainer& dataDirs = mFileCollections.getPaths();
|
||||
|
@ -199,6 +205,11 @@ void OMW::Engine::setDataDirs (const Files::PathContainer& dataDirs)
|
|||
mFileCollections = Files::Collections (dataDirs, !mFSStrict);
|
||||
}
|
||||
|
||||
// Add BSA archive
|
||||
void OMW::Engine::addArchive (const std::string& archive) {
|
||||
mArchives.push_back(archive);
|
||||
}
|
||||
|
||||
// Set resource dir
|
||||
void OMW::Engine::setResourceDir (const boost::filesystem::path& parResDir)
|
||||
{
|
||||
|
|
|
@ -64,6 +64,7 @@ namespace OMW
|
|||
ToUTF8::FromType mEncoding;
|
||||
ToUTF8::Utf8Encoder* mEncoder;
|
||||
Files::PathContainer mDataDirs;
|
||||
std::vector<std::string> mArchives;
|
||||
boost::filesystem::path mResDir;
|
||||
OEngine::Render::OgreRenderer *mOgre;
|
||||
std::string mCellName;
|
||||
|
@ -99,7 +100,7 @@ namespace OMW
|
|||
/// add a .zip resource
|
||||
void addZipResource (const boost::filesystem::path& path);
|
||||
|
||||
/// Load all BSA files in data directory.
|
||||
/// Load BSA files
|
||||
void loadBSA();
|
||||
|
||||
void executeLocalScripts();
|
||||
|
@ -126,6 +127,9 @@ namespace OMW
|
|||
/// Set data dirs
|
||||
void setDataDirs(const Files::PathContainer& dataDirs);
|
||||
|
||||
/// Add BSA archive
|
||||
void addArchive(const std::string& archive);
|
||||
|
||||
/// Set resource dir
|
||||
void setResourceDir(const boost::filesystem::path& parResDir);
|
||||
|
||||
|
|
|
@ -100,6 +100,9 @@ bool parseOptions (int argc, char** argv, OMW::Engine& engine, Files::Configurat
|
|||
("data-local", bpo::value<std::string>()->default_value(""),
|
||||
"set local data directory (highest priority)")
|
||||
|
||||
("fallback-archive", bpo::value<StringsVector>()->default_value(StringsVector(), "fallback-archive")
|
||||
->multitoken(), "set fallback BSA archives (later archives have higher priority)")
|
||||
|
||||
("resources", bpo::value<std::string>()->default_value("resources"),
|
||||
"set resources directory")
|
||||
|
||||
|
@ -201,6 +204,13 @@ bool parseOptions (int argc, char** argv, OMW::Engine& engine, Files::Configurat
|
|||
|
||||
engine.setDataDirs(dataDirs);
|
||||
|
||||
// fallback archives
|
||||
StringsVector archives = variables["fallback-archive"].as<StringsVector>();
|
||||
for (StringsVector::const_iterator it = archives.begin(); it != archives.end(); it++)
|
||||
{
|
||||
engine.addArchive(*it);
|
||||
}
|
||||
|
||||
engine.setResourceDir(variables["resources"].as<std::string>());
|
||||
|
||||
// master and plugin
|
||||
|
|
|
@ -31,6 +31,32 @@ namespace Files
|
|||
return iter->second;
|
||||
}
|
||||
|
||||
boost::filesystem::path Collections::getPath(const std::string& file) const
|
||||
{
|
||||
for (Files::PathContainer::const_iterator iter = mDirectories.begin();
|
||||
iter != mDirectories.end(); ++iter)
|
||||
{
|
||||
const boost::filesystem::path path = *iter / file;
|
||||
if (boost::filesystem::exists(path))
|
||||
return path.string();
|
||||
}
|
||||
|
||||
throw std::runtime_error ("file " + file + " not found");
|
||||
}
|
||||
|
||||
bool Collections::doesExist(const std::string& file) const
|
||||
{
|
||||
for (Files::PathContainer::const_iterator iter = mDirectories.begin();
|
||||
iter != mDirectories.end(); ++iter)
|
||||
{
|
||||
const boost::filesystem::path path = *iter / file;
|
||||
if (boost::filesystem::exists(path))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
const Files::PathContainer& Collections::getPaths() const
|
||||
{
|
||||
return mDirectories;
|
||||
|
|
|
@ -19,6 +19,16 @@ namespace Files
|
|||
/// leading dot and must be all lower-case.
|
||||
const MultiDirCollection& getCollection(const std::string& extension) const;
|
||||
|
||||
boost::filesystem::path getPath(const std::string& file) const;
|
||||
///< Return full path (including filename) of \a file.
|
||||
///
|
||||
/// If the file does not exist in any of the collection's
|
||||
/// directories, an exception is thrown. \a file must include the
|
||||
/// extension.
|
||||
|
||||
bool doesExist(const std::string& file) const;
|
||||
///< \return Does a file with the given name exist?
|
||||
|
||||
const Files::PathContainer& getPaths() const;
|
||||
|
||||
private:
|
||||
|
|
Loading…
Reference in a new issue