diff options
author | krzys-h <krzys_h@interia.pl> | 2014-05-18 12:12:47 +0200 |
---|---|---|
committer | krzys-h <krzys_h@interia.pl> | 2014-05-18 12:12:47 +0200 |
commit | f0d97bfdb91a2c0a17d1697b145d4df930280dbb (patch) | |
tree | 2d529428006e145b624108cce636b07867f566af /src/app/gamedata.cpp | |
parent | f71658e38dbcfc5635a6b2a9c6c4168582728bb5 (diff) | |
download | colobot-f0d97bfdb91a2c0a17d1697b145d4df930280dbb.tar.gz colobot-f0d97bfdb91a2c0a17d1697b145d4df930280dbb.tar.bz2 colobot-f0d97bfdb91a2c0a17d1697b145d4df930280dbb.zip |
Better datadir mod support
Diffstat (limited to 'src/app/gamedata.cpp')
-rw-r--r-- | src/app/gamedata.cpp | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/src/app/gamedata.cpp b/src/app/gamedata.cpp new file mode 100644 index 0000000..1bf3f36 --- /dev/null +++ b/src/app/gamedata.cpp @@ -0,0 +1,123 @@ +// * This file is part of the COLOBOT source code +// * Copyright (C) 2014, Polish Portal of Colobot (PPC) +// * +// * This program is free software: you can redistribute it and/or modify +// * it under the terms of the GNU General Public License as published by +// * the Free Software Foundation, either version 3 of the License, or +// * (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have received a copy of the GNU General Public License +// * along with this program. If not, see http://www.gnu.org/licenses/. + +#include "app/gamedata.h" + + +#include "app/app.h" + +#include <boost/filesystem.hpp> + +template<> CGameData* CSingleton<CGameData>::m_instance = nullptr; + +CGameData::CGameData() +{ + m_dataDirSet = false; + + for (int i = 0; i < DIR_MAX; ++i) + m_standardDataDirs[i] = nullptr; + + m_standardDataDirs[DIR_AI] = "ai"; + m_standardDataDirs[DIR_FONT] = "fonts"; + m_standardDataDirs[DIR_HELP] = "help"; + m_standardDataDirs[DIR_ICON] = "icons"; + m_standardDataDirs[DIR_LEVEL] = "levels"; + m_standardDataDirs[DIR_MODEL] = "models"; + m_standardDataDirs[DIR_MUSIC] = "music"; + m_standardDataDirs[DIR_SOUND] = "sounds"; + m_standardDataDirs[DIR_TEXTURE] = "textures"; +} + +CGameData::~CGameData() +{ +} + +void CGameData::SetDataDir(std::string path) +{ + assert(!m_dataDirSet); + m_dataDirSet = true; + + m_dataDirs.insert(m_dataDirs.begin(), path); +} + +void CGameData::AddMod(std::string path) +{ + m_dataDirs.push_back(path); +} + +void CGameData::Init() +{ + std::string out = "Using datadirs: "; + bool first = true; + for(std::vector<std::string>::reverse_iterator rit = m_dataDirs.rbegin(); rit != m_dataDirs.rend(); ++rit) { + if(!first) out += ", "; + first = false; + out += *rit; + } + out += "\n"; + CLogger::GetInstancePointer()->Info(out.c_str()); +} + +std::string CGameData::GetFilePath(DataDir dir, const std::string& subpath) +{ + int index = static_cast<int>(dir); + assert(index >= 0 && index < DIR_MAX); + + for(std::vector<std::string>::reverse_iterator rit = m_dataDirs.rbegin(); rit != m_dataDirs.rend(); ++rit) { + std::stringstream str; + str << *rit; + str << "/"; + str << m_standardDataDirs[index]; + if (dir == DIR_HELP) + { + str << "/"; + str << CApplication::GetInstancePointer()->GetLanguageChar(); + } + str << "/"; + str << subpath; + boost::filesystem::path path(str.str()); + if(boost::filesystem::exists(path)) + { + return str.str(); + } + } + + std::stringstream str; + str << m_dataDirs[0]; + str << "/"; + str << m_standardDataDirs[index]; + if (dir == DIR_HELP) + { + str << "/"; + str << CApplication::GetInstancePointer()->GetLanguageChar(); + } + str << "/"; + str << subpath; + return str.str(); +} + +std::string CGameData::GetDataPath(const std::string &subpath) +{ + for(std::vector<std::string>::reverse_iterator rit = m_dataDirs.rbegin(); rit != m_dataDirs.rend(); ++rit) { + std::string path = *rit + "/" + subpath; + boost::filesystem::path boostPath(path); + if(boost::filesystem::exists(boostPath)) + { + return path; + } + } + return m_dataDirs[0] + "/" + subpath; +} |