summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorkrzys-h <krzys_h@interia.pl>2014-08-06 12:27:17 +0200
committerkrzys-h <krzys_h@interia.pl>2014-08-06 12:27:17 +0200
commit0b2f25a6e3fda014b0f5a4282283fb90b0958d42 (patch)
tree110222c4e1dd4885e24d9c76257032106da68af3 /src
parent9a3cd67c3bb2f7d0d4b83f6a5ac8bbcfedf4207b (diff)
downloadcolobot-0b2f25a6e3fda014b0f5a4282283fb90b0958d42.tar.gz
colobot-0b2f25a6e3fda014b0f5a4282283fb90b0958d42.tar.bz2
colobot-0b2f25a6e3fda014b0f5a4282283fb90b0958d42.zip
Restored -datadir and -langdir arguments, added -savedir
Also, fixed some crashes when unable to open file
Diffstat (limited to 'src')
-rw-r--r--src/app/app.cpp68
-rw-r--r--src/app/app.h9
-rw-r--r--src/app/main.cpp5
-rw-r--r--src/app/system.cpp10
-rw-r--r--src/app/system.h6
-rw-r--r--src/app/system_macosx.cpp11
-rw-r--r--src/app/system_macosx.h2
-rw-r--r--src/common/resources/resourcemanager.cpp6
-rw-r--r--src/common/resources/resourcemanager.h1
-rw-r--r--src/common/resources/sndfile.cpp11
-rw-r--r--src/graphics/engine/text.cpp8
11 files changed, 99 insertions, 38 deletions
diff --git a/src/app/app.cpp b/src/app/app.cpp
index cf509f9..429a9d4 100644
--- a/src/app/app.cpp
+++ b/src/app/app.cpp
@@ -146,6 +146,10 @@ CApplication::CApplication()
m_kmodState = 0;
m_mouseButtonsState = 0;
m_trackedKeys = 0;
+
+ m_dataPath = GetSystemUtils()->GetDataPath();
+ m_langPath = GetSystemUtils()->GetLangPath();
+ m_savePath = GetSystemUtils()->GetSaveDir();
m_runSceneName = "";
m_runSceneRank = 0;
@@ -208,8 +212,10 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[])
OPT_LOGLEVEL,
OPT_LANGUAGE,
OPT_LANGDIR,
- OPT_VBO,
- OPT_MOD
+ OPT_DATADIR,
+ OPT_SAVEDIR,
+ OPT_MOD,
+ OPT_VBO
};
option options[] =
@@ -221,8 +227,10 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[])
{ "loglevel", required_argument, nullptr, OPT_LOGLEVEL },
{ "language", required_argument, nullptr, OPT_LANGUAGE },
{ "langdir", required_argument, nullptr, OPT_LANGDIR },
- { "vbo", required_argument, nullptr, OPT_VBO },
+ { "datadir", required_argument, nullptr, OPT_DATADIR },
+ { "savedir", required_argument, nullptr, OPT_SAVEDIR },
{ "mod", required_argument, nullptr, OPT_MOD },
+ { "vbo", required_argument, nullptr, OPT_VBO },
{ nullptr, 0, nullptr, 0}
};
@@ -260,8 +268,10 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[])
GetLogger()->Message(" -loglevel level set log level to level (one of: trace, debug, info, warn, error, none)\n");
GetLogger()->Message(" -language lang set language (one of: en, de, fr, pl, ru)\n");
GetLogger()->Message(" -langdir path set custom language directory path\n");
- GetLogger()->Message(" -vbo mode set OpenGL VBO mode (one of: auto, enable, disable)\n");
+ GetLogger()->Message(" -datadir path set custom data directory path\n");
+ GetLogger()->Message(" -savedir path set custom save directory path (must be writable)\n");
GetLogger()->Message(" -mod path load datadir mod from given path\n");
+ GetLogger()->Message(" -vbo mode set OpenGL VBO mode (one of: auto, enable, disable)\n");
return PARSE_ARGS_HELP;
}
case OPT_DEBUG:
@@ -341,11 +351,28 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[])
break;
}
+ case OPT_DATADIR:
+ {
+ m_dataPath = optarg;
+ GetLogger()->Info("Using data dir: '%s'\n", optarg);
+ break;
+ }
+ case OPT_LANGDIR:
+ {
+ m_langPath = optarg;
+ GetLogger()->Info("Using language dir: '%s'\n", optarg);
+ break;
+ }
+ case OPT_SAVEDIR:
+ {
+ m_savePath = optarg;
+ GetLogger()->Info("Using save dir: '%s'\n", optarg);
+ break;
+ }
case OPT_MOD:
{
- GetLogger()->Info("Loading mod from \"%s\"\n", optarg);
+ GetLogger()->Info("Loading mod: '%s'\n", optarg);
CResourceManager::AddLocation(optarg, true);
-
break;
}
default:
@@ -362,23 +389,28 @@ bool CApplication::Create()
bool defaultValues = false;
GetLogger()->Info("Creating CApplication\n");
-
- if (!GetProfile().InitCurrentDirectory())
- {
- GetLogger()->Warn("Config not found. Default values will be used!\n");
- defaultValues = true;
- }
-
- boost::filesystem::path dataPath(COLOBOT_DEFAULT_DATADIR);
+
+ boost::filesystem::path dataPath(m_dataPath);
if (! (boost::filesystem::exists(dataPath) && boost::filesystem::is_directory(dataPath)) )
{
- GetLogger()->Error("Data directory '%s' doesn't exist or is not a directory\n", COLOBOT_DEFAULT_DATADIR);
+ GetLogger()->Error("Data directory '%s' doesn't exist or is not a directory\n", m_dataPath.c_str());
m_errorMessage = std::string("Could not read from data directory:\n") +
- std::string("'") + COLOBOT_DEFAULT_DATADIR + std::string("'\n") +
- std::string("Please check your installation, or supply a valid data directory by -datadir option.");
+ std::string("'") + m_dataPath + std::string("'\n") +
+ std::string("Please check your installation, or supply a valid data directory by -datadir option.");
m_exitCode = 1;
return false;
}
+
+ CResourceManager::AddLocation(m_dataPath, false);
+ boost::filesystem::create_directories(m_savePath);
+ CResourceManager::SetSaveLocation(m_savePath);
+ CResourceManager::AddLocation(m_savePath, true);
+
+ if (!GetProfile().InitCurrentDirectory())
+ {
+ GetLogger()->Warn("Config not found. Default values will be used!\n");
+ defaultValues = true;
+ }
if (GetProfile().GetLocalProfileString("Language", "Lang", path)) {
Language language;
@@ -1696,7 +1728,7 @@ void CApplication::SetLanguage(Language language)
setlocale(LC_ALL, "");
- bindtextdomain("colobot", CResourceManager::GetLanguageLocation().c_str());
+ bindtextdomain("colobot", m_langPath.c_str());
bind_textdomain_codeset("colobot", "UTF-8");
textdomain("colobot");
diff --git a/src/app/app.h b/src/app/app.h
index 66b8900..0df3096 100644
--- a/src/app/app.h
+++ b/src/app/app.h
@@ -464,6 +464,15 @@ protected:
std::vector<int> m_joyAxeState;
//! Current state of joystick buttons; may be updated from another thread
std::vector<bool> m_joyButtonState;
+
+ //! Path to directory with data files
+ std::string m_dataPath;
+
+ //! Path to directory with language files
+ std::string m_langPath;
+
+ //! Path to directory with save files
+ std::string m_savePath;
//@{
//! Scene to run on startup
diff --git a/src/app/main.cpp b/src/app/main.cpp
index 294b306..e67cd7f 100644
--- a/src/app/main.cpp
+++ b/src/app/main.cpp
@@ -79,7 +79,6 @@ int SDL_MAIN_FUNC(int argc, char *argv[])
{
CLogger logger; // single istance of logger
CResourceManager manager(argv[0]);
- manager.AddLocation(COLOBOT_DEFAULT_DATADIR, false);
// Initialize static string arrays
InitializeRestext();
@@ -102,9 +101,6 @@ int SDL_MAIN_FUNC(int argc, char *argv[])
{
return app->GetExitCode();
}
-
- manager.SetSaveLocation(systemUtils->GetSaveDir());
- manager.AddLocation(systemUtils->GetSaveDir(), true);
int code = 0;
@@ -124,7 +120,6 @@ int SDL_MAIN_FUNC(int argc, char *argv[])
delete app;
delete systemUtils;
- //delete manager;
logger.Info("Exiting with code %d\n", code);
return code;
diff --git a/src/app/system.cpp b/src/app/system.cpp
index 66d08e5..0435b39 100644
--- a/src/app/system.cpp
+++ b/src/app/system.cpp
@@ -192,6 +192,16 @@ float CSystemUtils::TimeStampDiff(SystemTimeStamp *before, SystemTimeStamp *afte
return result;
}
+std::string CSystemUtils::GetDataPath()
+{
+ return COLOBOT_DEFAULT_DATADIR;
+}
+
+std::string CSystemUtils::GetLangPath()
+{
+ return COLOBOT_I18N_DIR;
+}
+
std::string CSystemUtils::GetSaveDir()
{
return std::string("save");
diff --git a/src/app/system.h b/src/app/system.h
index 6d2fe58..5177815 100644
--- a/src/app/system.h
+++ b/src/app/system.h
@@ -130,6 +130,12 @@ public:
/** The difference is \a after - \a before. */
virtual long long TimeStampExactDiff(SystemTimeStamp *before, SystemTimeStamp *after) = 0;
+ //! Returns the data path (containing textures, levels, helpfiles, etc)
+ virtual std::string GetDataPath();
+
+ //! Returns the translations path
+ virtual std::string GetLangPath();
+
//! Returns the save dir location
virtual std::string GetSaveDir();
};
diff --git a/src/app/system_macosx.cpp b/src/app/system_macosx.cpp
index 473a10c..06c67d3 100644
--- a/src/app/system_macosx.cpp
+++ b/src/app/system_macosx.cpp
@@ -87,10 +87,19 @@ void CSystemUtilsMacOSX::Init()
m_dataPath += "/Contents/Resources";
}
+std::string CSystemUtilsMacOSX::GetDataPath()
+{
+ return m_dataPath;
+}
+
+std::string CSystemUtilsMacOSX::GetLangPath()
+{
+ return m_dataPath + "/i18n";
+}
+
std::string CSystemUtilsMacOSX::GetSaveDir()
{
std::string savegameDir = m_ASPath;
- boost::filesystem::create_directories(savegameDir.c_str());
GetLogger()->Trace("Saved game files are going to %s\n", savegameDir.c_str());
return savegameDir;
diff --git a/src/app/system_macosx.h b/src/app/system_macosx.h
index 6423320..8ae233c 100644
--- a/src/app/system_macosx.h
+++ b/src/app/system_macosx.h
@@ -28,6 +28,8 @@ class CSystemUtilsMacOSX : public CSystemUtilsOther
public:
virtual void Init() override;
+ virtual std::string GetDataPath() override;
+ virtual std::string GetLangPath() override;
virtual std::string GetSaveDir() override;
private:
std::string m_ASPath;
diff --git a/src/common/resources/resourcemanager.cpp b/src/common/resources/resourcemanager.cpp
index be5baa8..8119a6b 100644
--- a/src/common/resources/resourcemanager.cpp
+++ b/src/common/resources/resourcemanager.cpp
@@ -86,12 +86,6 @@ bool CResourceManager::SetSaveLocation(const std::string &location)
}
-std::string CResourceManager::GetLanguageLocation()
-{
- return COLOBOT_I18N_DIR;
-}
-
-
SDL_RWops* CResourceManager::GetSDLFileHandler(const std::string &filename)
{
SDL_RWops *handler = SDL_AllocRW();
diff --git a/src/common/resources/resourcemanager.h b/src/common/resources/resourcemanager.h
index 36f6fa5..4052047 100644
--- a/src/common/resources/resourcemanager.h
+++ b/src/common/resources/resourcemanager.h
@@ -30,7 +30,6 @@ public:
static bool AddLocation(const std::string &location, bool prepend = true);
static bool RemoveLocation(const std::string &location);
static bool SetSaveLocation(const std::string &location);
- static std::string GetLanguageLocation();
static SDL_RWops* GetSDLFileHandler(const std::string &filename);
static CSNDFile* GetSNDFileHandler(const std::string &filename);
static bool Exists(const std::string &filename);
diff --git a/src/common/resources/sndfile.cpp b/src/common/resources/sndfile.cpp
index 9e8e729..3f5a60d 100644
--- a/src/common/resources/sndfile.cpp
+++ b/src/common/resources/sndfile.cpp
@@ -52,18 +52,17 @@ CSNDFile::~CSNDFile()
if (m_file)
{
PHYSFS_close(m_file);
- }
-
- if (m_snd_file)
- {
- sf_close(m_snd_file);
+ if (m_snd_file)
+ {
+ sf_close(m_snd_file);
+ }
}
}
bool CSNDFile::IsOpen()
{
- return m_snd_file;
+ return m_file && m_snd_file;
}
diff --git a/src/graphics/engine/text.cpp b/src/graphics/engine/text.cpp
index 78cf7b8..6df8894 100644
--- a/src/graphics/engine/text.cpp
+++ b/src/graphics/engine/text.cpp
@@ -867,7 +867,13 @@ CachedFont* CText::GetOrOpenFont(FontType font, float size)
}
m_lastCachedFont = new CachedFont();
- m_lastCachedFont->font = TTF_OpenFontRW(CResourceManager::GetSDLFileHandler(mf->fileName), 1, pointSize);
+ SDL_RWops* file = CResourceManager::GetSDLFileHandler(mf->fileName);
+ if(file == nullptr)
+ {
+ m_error = std::string("Unable to open file");
+ return nullptr;
+ }
+ m_lastCachedFont->font = TTF_OpenFontRW(file, 1, pointSize);
if (m_lastCachedFont->font == nullptr)
m_error = std::string("TTF_OpenFont error ") + std::string(TTF_GetError());