X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fsupertux%2Fmain.cpp;h=17571a3c8c2a5c8bb411e595b8cbc4a6df22f5bd;hb=c0e497c19521c1868f44c0fd21bbf666a66654be;hp=34a5ddca915a23c794889ff0813bafd51d466620;hpb=b525265f5a6d9600221c207f3abd802ad2cac48e;p=supertux.git diff --git a/src/supertux/main.cpp b/src/supertux/main.cpp index 34a5ddca9..17571a3c8 100644 --- a/src/supertux/main.cpp +++ b/src/supertux/main.cpp @@ -20,12 +20,12 @@ #include #include -#include -#include -#include -#include #include +#include +#include +#include #include +#include extern "C" { #include } @@ -114,90 +114,116 @@ Main::init_tinygettext() class PhysfsSubsystem { +private: + boost::optional m_forced_datadir; + boost::optional m_forced_userdir; + public: - PhysfsSubsystem(const char* argv0) + PhysfsSubsystem(const char* argv0, + boost::optional forced_datadir, + boost::optional forced_userdir) : + m_forced_datadir(forced_datadir), + m_forced_userdir(forced_userdir) { - if(!PHYSFS_init(argv0)) { + if (!PHYSFS_init(argv0)) + { std::stringstream msg; msg << "Couldn't initialize physfs: " << PHYSFS_getLastError(); throw std::runtime_error(msg.str()); } + else + { + // allow symbolic links + PHYSFS_permitSymbolicLinks(1); - // allow symbolic links - PHYSFS_permitSymbolicLinks(1); - - // Initialize physfs (this is a slightly modified version of - // PHYSFS_setSaneConfig) - const char *env_writedir; - std::string writedir; - - if ((env_writedir = getenv("SUPERTUX2_USER_DIR")) != NULL) { - writedir = env_writedir; - if(!PHYSFS_setWriteDir(writedir.c_str())) { - std::ostringstream msg; - msg << "Failed to use configuration directory '" - << writedir << "': " << PHYSFS_getLastError(); - throw std::runtime_error(msg.str()); - } + find_userdir(); + find_datadir(); + } + } - } else { - std::string userdir = PHYSFS_getUserDir(); - - // Set configuration directory - writedir = userdir + WRITEDIR_NAME; - if(!PHYSFS_setWriteDir(writedir.c_str())) { - // try to create the directory - if(!PHYSFS_setWriteDir(userdir.c_str()) || !PHYSFS_mkdir(WRITEDIR_NAME)) { - std::ostringstream msg; - msg << "Failed creating configuration directory '" - << writedir << "': " << PHYSFS_getLastError(); - throw std::runtime_error(msg.str()); - } - - if(!PHYSFS_setWriteDir(writedir.c_str())) { - std::ostringstream msg; - msg << "Failed to use configuration directory '" - << writedir << "': " << PHYSFS_getLastError(); - throw std::runtime_error(msg.str()); - } - } + void find_datadir() + { + std::string datadir; + if (m_forced_datadir) + { + datadir = *m_forced_datadir; } - PHYSFS_addToSearchPath(writedir.c_str(), 0); - - // when started from source dir... - char* base_path = SDL_GetBasePath(); - std::string dir = base_path; - SDL_free(base_path); - - if (dir[dir.length() - 1] != '/') - dir += "/"; - dir += "data"; - std::string testfname = dir; - testfname += "/credits.txt"; - bool sourcedir = false; - FILE* f = fopen(testfname.c_str(), "r"); - if(f) { - fclose(f); - if(!PHYSFS_addToSearchPath(dir.c_str(), 1)) { - log_warning << "Couldn't add '" << dir << "' to physfs searchpath: " << PHYSFS_getLastError() << std::endl; - } else { - sourcedir = true; + else if (const char* env_datadir = getenv("SUPERTUX2_DATA_DIR")) + { + datadir = env_datadir; + } + else + { + // check if we run from source dir + char* basepath_c = SDL_GetBasePath(); + std::string basepath = basepath_c; + SDL_free(basepath_c); + + datadir = FileSystem::join(basepath, "data"); + std::string testfname = FileSystem::join(datadir, "credits.txt"); + if (!FileSystem::exists(testfname)) + { + // if the game is not run from the source directory, try to find + // the global install location + datadir = datadir.substr(0, datadir.rfind(INSTALL_SUBDIR_BIN)); + datadir = FileSystem::join(datadir, INSTALL_SUBDIR_SHARE); } } - if(!sourcedir) { - std::string datadir = PHYSFS_getBaseDir(); - datadir = datadir.substr(0, datadir.rfind(INSTALL_SUBDIR_BIN)); - datadir += "/" INSTALL_SUBDIR_SHARE; - if(!PHYSFS_addToSearchPath(datadir.c_str(), 1)) { - log_warning << "Couldn't add '" << datadir << "' to physfs searchpath: " << PHYSFS_getLastError() << std::endl; - } + if (!PHYSFS_addToSearchPath(datadir.c_str(), 1)) + { + log_warning << "Couldn't add '" << datadir << "' to physfs searchpath: " << PHYSFS_getLastError() << std::endl; + } + } + + void find_userdir() + { + std::string userdir; + if (m_forced_userdir) + { + userdir = *m_forced_userdir; } + else if (const char* env_userdir = getenv("SUPERTUX2_USER_DIR")) + { + userdir = env_userdir; + } + else + { + std::string physfs_userdir = PHYSFS_getUserDir(); +#ifdef _WIN32 + userdir = FileSystem::join(physfs_userdir, PACKAGE_NAME); +#else + userdir = FileSystem::join(physfs_userdir, "." PACKAGE_NAME); +#endif + } + + if (!FileSystem::is_directory(userdir)) + { + FileSystem::mkdir(userdir); + log_info << "Created SuperTux userdir: " << userdir << std::endl; + } + + if (!PHYSFS_setWriteDir(userdir.c_str())) + { + std::ostringstream msg; + msg << "Failed to use userdir directory '" + << userdir << "': " << PHYSFS_getLastError(); + throw std::runtime_error(msg.str()); + } + + PHYSFS_addToSearchPath(userdir.c_str(), 0); + } - //show search Path + void print_search_path() + { + const char* writedir = PHYSFS_getWriteDir(); + log_info << "PhysfsWritedDir: " << (writedir ? writedir : "(null)") << std::endl; + log_info << "PhysfsSearchPath:" << std::endl; char** searchpath = PHYSFS_getSearchPath(); - for(char** i = searchpath; *i != NULL; i++) - log_info << "[" << *i << "] is in the search path" << std::endl; + for(char** i = searchpath; *i != NULL; ++i) + { + log_info << " " << *i << std::endl; + } PHYSFS_freeList(searchpath); } @@ -273,6 +299,11 @@ Main::launch_game() SDLSubsystem sdl_subsystem; ConsoleBuffer console_buffer; + timelog("audio"); + SoundManager sound_manager; + sound_manager.enable_sound(g_config->sound_enabled); + sound_manager.enable_music(g_config->music_enabled); + timelog("controller"); InputManager input_manager(g_config->keyboard_config, g_config->joystick_config); @@ -280,15 +311,9 @@ Main::launch_game() timelog("video"); std::unique_ptr video_system = VideoSystem::create(g_config->video); - DrawingContext context(video_system->get_renderer(), - video_system->get_lightmap()); + DrawingContext context(*video_system); init_video(); - timelog("audio"); - SoundManager sound_manager; - sound_manager.enable_sound(g_config->sound_enabled); - sound_manager.enable_music(g_config->music_enabled); - Console console(console_buffer); timelog("scripting"); @@ -300,8 +325,7 @@ Main::launch_game() Resources resources; timelog("addons"); - AddonManager addon_manager(g_config->disabled_addon_filenames); - addon_manager.load_addons(); + AddonManager addon_manager("addons", g_config->addons); timelog(0); @@ -370,7 +394,8 @@ Main::run(int argc, char** argv) return EXIT_FAILURE; } - PhysfsSubsystem physfs_subsystem(argv[0]); + PhysfsSubsystem physfs_subsystem(argv[0], args.datadir, args.userdir); + physfs_subsystem.print_search_path(); timelog("config"); ConfigSubsystem config_subsystem;