-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-// 02111-1307, USA.
-#include <config.h>
-#include <assert.h>
-
-#include "main.hpp"
-
-#include <stdexcept>
-#include <iostream>
-#include <sstream>
-#include <time.h>
-#include <stdlib.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <dirent.h>
-#include <unistd.h>
-#include <assert.h>
-#include <physfs.h>
-#include <SDL.h>
-#include <SDL_mixer.h>
-#include <SDL_image.h>
-#include <SDL_opengl.h>
-
-#include "gameconfig.hpp"
-#include "resources.hpp"
-#include "gettext.hpp"
-#include "audio/sound_manager.hpp"
-#include "video/surface.hpp"
-#include "video/texture_manager.hpp"
-#include "control/joystickkeyboardcontroller.hpp"
-#include "misc.hpp"
-#include "title.hpp"
-#include "game_session.hpp"
-#include "file_system.hpp"
-#include "physfs/physfs_sdl.hpp"
-#include "exceptions.hpp"
-
-SDL_Surface* screen = 0;
-JoystickKeyboardController* main_controller = 0;
-TinyGetText::DictionaryManager dictionary_manager;
-
-static void init_config()
-{
- config = new Config();
- try {
- config->load();
- } catch(std::exception& e) {
- std::cerr << "Couldn't load config file: " << e.what() << "\n";
- std::cerr << "Using default settings.\n";
- }
-}
-
-static void init_tinygettext()
-{
- dictionary_manager.add_directory("locale");
- dictionary_manager.set_charset("UTF-8");
-}
-
-static void init_physfs(const char* argv0)
-{
- if(!PHYSFS_init(argv0)) {
- std::stringstream msg;
- msg << "Couldn't initialize physfs: " << PHYSFS_getLastError();
- throw std::runtime_error(msg.str());
- }
-
- // Initialize physfs (this is a slightly modified version of
- // PHYSFS_setSaneConfig
- const char* application = PACKAGE_NAME;
- const char* userdir = PHYSFS_getUserDir();
- const char* dirsep = PHYSFS_getDirSeparator();
- char* writedir = new char[strlen(userdir) + strlen(application) + 2];
-
- // Set configuration directory
- sprintf(writedir, "%s.%s", userdir, application);
- if(!PHYSFS_setWriteDir(writedir)) {
- // try to create the directory
- char* mkdir = new char[strlen(application) + 2];
- sprintf(mkdir, ".%s", application);
- if(!PHYSFS_setWriteDir(userdir) || !PHYSFS_mkdir(mkdir)) {
- std::ostringstream msg;
- msg << "Failed creating configuration directory '"
- << writedir << "': " << PHYSFS_getLastError();
- delete[] writedir;
- delete[] mkdir;
- throw std::runtime_error(msg.str());
- }
- delete[] mkdir;
-
- if(!PHYSFS_setWriteDir(writedir)) {
- std::ostringstream msg;
- msg << "Failed to use configuration directory '"
- << writedir << "': " << PHYSFS_getLastError();
- delete[] writedir;
- throw std::runtime_error(msg.str());
- }
- }
- PHYSFS_addToSearchPath(writedir, 0);
- delete[] writedir;
-
- // Search for archives and add them to the search path
- const char* archiveExt = "zip";
- char** rc = PHYSFS_enumerateFiles("/");
- size_t extlen = strlen(archiveExt);
-
- for(char** i = rc; *i != 0; ++i) {
- size_t l = strlen(*i);
- if((l > extlen) && ((*i)[l - extlen - 1] == '.')) {
- const char* ext = (*i) + (l - extlen);
- if(strcasecmp(ext, archiveExt) == 0) {
- const char* d = PHYSFS_getRealDir(*i);
- char* str = new char[strlen(d) + strlen(dirsep) + l + 1];
- sprintf(str, "%s%s%s", d, dirsep, *i);
- PHYSFS_addToSearchPath(str, 1);
- delete[] str;
- }
- }
- }
-
- PHYSFS_freeList(rc);
-
- // when started from source dir...
- std::string dir = PHYSFS_getBaseDir();
- 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)) {
- std::cout << "Warning: Couldn't add '" << dir
- << "' to physfs searchpath: " << PHYSFS_getLastError() << "\n";
- } else {
- sourcedir = true;
- }
- }
-
- if(!sourcedir) {
-#if defined(APPDATADIR) || defined(ENABLE_BINRELOC)
- std::string datadir;
-#ifdef ENABLE_BINRELOC
- char* brdatadir = br_strcat(DATADIR, "/" PACKAGE_NAME);
- datadir = brdatadir;
- free(brdatadir);
-#else
- datadir = APPDATADIR;
-#endif
- if(!PHYSFS_addToSearchPath(datadir.c_str(), 1)) {
- std::cout << "Couldn't add '" << datadir
- << "' to physfs searchpath: " << PHYSFS_getLastError() << "\n";
- }
-#endif
- }
-
- // allow symbolic links
- PHYSFS_permitSymbolicLinks(1);
-
- //show search Path
- for(char** i = PHYSFS_getSearchPath(); *i != NULL; i++)
- printf("[%s] is in the search path.\n", *i);
-}
-
-static void print_usage(const char* argv0)
-{
- fprintf(stderr, _("Usage: %s [OPTIONS] [LEVELFILE]\n\n"), argv0);
- fprintf(stderr,
- _("Options:\n"
- " -f, --fullscreen Run in fullscreen mode\n"
- " -w, --window Run in window mode\n"
- " -g, --geometry WIDTHxHEIGHT Run SuperTux in given resolution\n"
- " --disable-sfx Disable sound effects\n"
- " --disable-music Disable music\n"
- " --help Show this help message\n"
- " --version Display SuperTux version and quit\n"
- " --show-fps Display framerate in levels\n"
- " --record-demo FILE LEVEL Record a demo to FILE\n"
- " --play-demo FILE LEVEL Play a recorded demo\n"
- "\n"));
-}
-
-static void parse_commandline(int argc, char** argv)
-{
- for(int i = 1; i < argc; ++i) {
- std::string arg = argv[i];
-
- if(arg == "--fullscreen" || arg == "-f") {
- config->use_fullscreen = true;
- } else if(arg == "--window" || arg == "-w") {
- config->use_fullscreen = false;
- } else if(arg == "--geometry" || arg == "-g") {
- if(i+1 >= argc) {
- print_usage(argv[0]);
- throw std::runtime_error("Need to specify a parameter for geometry switch");
- }
- if(sscanf(argv[++i], "%dx%d", &config->screenwidth, &config->screenheight)
- != 2) {
- print_usage(argv[0]);
- throw std::runtime_error("Invalid geometry spec, should be WIDTHxHEIGHT");
- }
- } else if(arg == "--show-fps") {
- config->show_fps = true;
- } else if(arg == "--disable-sfx") {
- config->sound_enabled = false;
- } else if(arg == "--disable-music") {
- config->music_enabled = false;
- } else if(arg == "--play-demo") {
- if(i+1 >= argc) {
- print_usage(argv[0]);
- throw std::runtime_error("Need to specify a demo filename");
- }
- config->start_demo = argv[++i];
- } else if(arg == "--record-demo") {
- if(i+1 >= argc) {
- print_usage(argv[0]);
- throw std::runtime_error("Need to specify a demo filename");
- }
- config->record_demo = argv[++i];
- } else if(arg == "--help") {
- print_usage(argv[0]);
- throw graceful_shutdown();
- } else if(arg == "--version") {
- std::cerr << PACKAGE_NAME << " " << PACKAGE_VERSION << "\n";
- throw graceful_shutdown();
- } else if(arg[0] != '-') {
- config->start_level = arg;
- } else {
- std::cerr << "Unknown option '" << arg << "'.\n";
- std::cerr << "Use --help to see a list of options.\n";
- }
- }
-
- // TODO joystick switchyes...
-}