- added detection magic for the datadir
authorIngo Ruhnke <grumbel@gmx.de>
Sun, 21 Mar 2004 15:05:21 +0000 (15:05 +0000)
committerIngo Ruhnke <grumbel@gmx.de>
Sun, 21 Mar 2004 15:05:21 +0000 (15:05 +0000)
SVN-Revision: 292

src/globals.cpp
src/globals.h
src/setup.cpp

index 20ad5e6..2281855 100644 (file)
@@ -12,6 +12,9 @@
 
 #include "globals.h"
 
+/** The datadir prefix prepended when loading game data file */
+std::string datadir;
+
 SDL_Surface * screen;
 text_type black_text, gold_text, blue_text, red_text, yellow_nums, white_text, white_small_text, white_big_text;
 
index 502aa68..da08624 100644 (file)
 #ifndef SUPERTUX_GLOBALS_H
 #define SUPERTUX_GLOBALS_H
 
+#include <string>
 #include <SDL.h>
 #include "text.h"
 #include "menu.h"
 
+extern std::string datadir;
+
 extern SDL_Surface * screen;
 extern text_type black_text, gold_text, white_text, white_small_text, white_big_text, blue_text, red_text, yellow_nums;
 
index e932d80..dc79fd0 100644 (file)
@@ -10,6 +10,7 @@
   April 11, 2000 - March 15, 2004
 */
 
+#include <assert.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -26,6 +27,7 @@
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <dirent.h>
+#include <libgen.h>
 #include <ctype.h>
 #endif
 
@@ -253,7 +255,7 @@ void st_directory_setup(void)
     home = ".";
 
   st_dir = (char *) malloc(sizeof(char) * (strlen(home) +
-                           strlen("/.supertux") + 1));
+                                           strlen("/.supertux") + 1));
   strcpy(st_dir, home);
   strcat(st_dir, "/.supertux");
 
@@ -283,6 +285,31 @@ void st_directory_setup(void)
   mkdir(str);
 #endif
 
+  // User has not that a datadir, so we try some magic
+  if (datadir.empty())
+    {
+      // Detect datadir
+      char exe_file[PATH_MAX];
+      if (readlink("/proc/self/exe", exe_file, PATH_MAX) < 0)
+        {
+          puts("Couldn't read /proc/self/exe, using default path: " DATA_PREFIX);
+        }
+      else
+        {
+          std::string exedir = std::string(dirname(exe_file)) + "/";
+          
+          datadir = exedir + "../data/"; // SuperTux run from source dir
+          if (access(datadir.c_str(), F_OK) != 0)
+            {
+              datadir = exedir + "../share/supertux/"; // SuperTux run from PATH
+              if (access(datadir.c_str(), F_OK) != 0) 
+                { // If all fails, fall back to compiled path
+                  datadir = DATA_PREFIX; 
+                }
+            }
+        }
+    }
+  printf("Datadir: %s\n", datadir.c_str());
 }
 
 /* Create and setup menus. */
@@ -853,6 +880,12 @@ void parseargs(int argc, char * argv[])
         {
           launch_worldmap_mode = true;
         }
+      else if (strcmp(argv[i], "--datadir") == 0 
+               || strcmp(argv[i], "-d") == 0 )
+        {
+          assert(i+1 < argc);
+          datadir = argv[i+1];
+        }
       else if (strcmp(argv[i], "--show-fps") == 0)
         {
           /* Use full screen: */
@@ -929,6 +962,7 @@ void parseargs(int argc, char * argv[])
                "\n"
                "Misc Options:\n"
                "  --worldmap        Start in worldmap-mode (EXPERIMENTAL)\n"          
+               "  -d, --datadir DIR Load Game data from DIR (default: automatic)\n"
                "  --debug-mode      Enables the debug-mode, which is useful for developers.\n"
                "  --help            Display a help message summarizing command-line\n"
                "                    options, license and game controls.\n"