From f0d97bfdb91a2c0a17d1697b145d4df930280dbb Mon Sep 17 00:00:00 2001 From: krzys-h Date: Sun, 18 May 2014 12:12:47 +0200 Subject: Better datadir mod support --- src/app/gamedata.cpp | 123 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 src/app/gamedata.cpp (limited to 'src/app/gamedata.cpp') 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 + +template<> CGameData* CSingleton::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::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(dir); + assert(index >= 0 && index < DIR_MAX); + + for(std::vector::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::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; +} -- cgit v1.2.3-1-g7c22 From f5ba2a27d4422401317d814c60048121f9804429 Mon Sep 17 00:00:00 2001 From: Mohamed Waheed Date: Tue, 24 Jun 2014 20:31:17 +0300 Subject: fixed savefile screenshot loading bug --- src/app/gamedata.cpp | 35 ++++++++++++++++------------------- 1 file changed, 16 insertions(+), 19 deletions(-) (limited to 'src/app/gamedata.cpp') diff --git a/src/app/gamedata.cpp b/src/app/gamedata.cpp index 1bf3f36..05c0242 100644 --- a/src/app/gamedata.cpp +++ b/src/app/gamedata.cpp @@ -78,16 +78,22 @@ std::string CGameData::GetFilePath(DataDir dir, const std::string& subpath) for(std::vector::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) - { + + if ( subpath.find("save") == std::string::npos ){ // if its NOT a path to a savefile screenshot + str << *rit; + str << "/"; + str << m_standardDataDirs[index]; + + if (dir == DIR_HELP) + { + str << "/"; + str << CApplication::GetInstancePointer()->GetLanguageChar(); + } str << "/"; - str << CApplication::GetInstancePointer()->GetLanguageChar(); } - str << "/"; + str << subpath; + boost::filesystem::path path(str.str()); if(boost::filesystem::exists(path)) { @@ -95,18 +101,9 @@ std::string CGameData::GetFilePath(DataDir dir, const std::string& subpath) } } - 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(); + GetLogger()->Error("file subpath error\n"); + + return ""; } std::string CGameData::GetDataPath(const std::string &subpath) -- cgit v1.2.3-1-g7c22 From 092e7cc68de3d4e46505a2931ce266b4e5aabaab Mon Sep 17 00:00:00 2001 From: krzys-h Date: Thu, 26 Jun 2014 22:14:30 +0200 Subject: Fixed tests --- src/app/gamedata.cpp | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) (limited to 'src/app/gamedata.cpp') diff --git a/src/app/gamedata.cpp b/src/app/gamedata.cpp index 05c0242..ceeb7b3 100644 --- a/src/app/gamedata.cpp +++ b/src/app/gamedata.cpp @@ -101,9 +101,25 @@ std::string CGameData::GetFilePath(DataDir dir, const std::string& subpath) } } - GetLogger()->Error("file subpath error\n"); + if(m_dataDirs.size() > 0) { + std::stringstream str; + if ( subpath.find("save") == std::string::npos ){ // if its NOT a path to a savefile screenshot + str << m_dataDirs[0]; + str << "/"; + str << m_standardDataDirs[index]; + + if (dir == DIR_HELP) + { + str << "/"; + str << CApplication::GetInstancePointer()->GetLanguageChar(); + } + str << "/"; + } + str << subpath; + return str.str(); + } - return ""; + return subpath; } std::string CGameData::GetDataPath(const std::string &subpath) -- cgit v1.2.3-1-g7c22