make supertux accepts normal paths on the commandline
authorMatthias Braun <matze@braunis.de>
Thu, 25 Nov 2004 19:48:36 +0000 (19:48 +0000)
committerMatthias Braun <matze@braunis.de>
Thu, 25 Nov 2004 19:48:36 +0000 (19:48 +0000)
SVN-Revision: 2198

lib/app/setup.cpp
src/gameloop.cpp
src/gameloop.h
src/level.cpp
src/level.h
src/level_subset.cpp
src/resources.cpp
src/resources.h
src/title.cpp
src/worldmap.cpp

index 20de542..0a29dc4 100644 (file)
@@ -280,10 +280,9 @@ void Setup::directories()
   st_dir = home + "/." + package_symbol_name;
 
   /* Remove .supertux config-file from old SuperTux versions */
-  if(FileSystem::faccessible(st_dir))
-    {
-      remove(st_dir.c_str());
-    }
+  if(FileSystem::faccessible(st_dir)) {
+    remove(st_dir.c_str());
+  }
 
   st_save_dir = st_dir + "/save";
 
@@ -296,7 +295,7 @@ void Setup::directories()
   // try current directory as datadir
   if(datadir.empty()) {
       if(FileSystem::faccessible("./data/intro.txt"))
-          datadir = "./data";
+          datadir = "./data/";
   }
 
   // User has not that a datadir, so we try some magic
@@ -314,23 +313,25 @@ void Setup::directories()
         {
          std::string exedir = std::string(dirname(exe_file)) + "/";
          
-          datadir = exedir + "../data"; // SuperTux run from source dir
+          datadir = exedir + "../data/"; // SuperTux run from source dir
           if (access(datadir.c_str(), F_OK) != 0)
             {
-             datadir = exedir + "../../data";  //SuperTux run from source dir (with libtool script)
+             datadir = exedir + "../../data/";  //SuperTux run from source dir (with libtool script)
              
              if (access(datadir.c_str(), F_OK) != 0)
              {
-              datadir = exedir + "../share/" + package_symbol_name; // SuperTux run from PATH
+              datadir = exedir + "../share/" + package_symbol_name + "/"; // SuperTux run from PATH
               if (access(datadir.c_str(), F_OK) != 0) 
                 { // If all fails, fall back to compiled path
-                  datadir = DATA_PREFIX; 
+                  datadir = DATA_PREFIX;
+                  datadir += "/"; 
                 }
              }
             }
         }
 #else
-  datadir = DATA_PREFIX;
+      datadir = DATA_PREFIX;
+      datadir += "/";
 #endif
     }
   printf("Datadir: %s\n", datadir.c_str());
index 83d7da7..fc9f471 100644 (file)
@@ -80,11 +80,11 @@ bool compare_last(std::string& haystack, std::string needle)
   return false;
 }
 
-GameSession::GameSession(const std::string& levelname_, int mode,
+GameSession::GameSession(const std::string& levelfile_, int mode,
     bool flip_level_, Statistics* statistics)
   : level(0), currentsector(0), st_gl_mode(mode),
-    end_sequence(NO_ENDSEQUENCE), levelname(levelname_), flip_level(flip_level_),
-    best_level_statistics(statistics)
+    end_sequence(NO_ENDSEQUENCE), levelfile(levelfile_),
+    flip_level(flip_level_), best_level_statistics(statistics)
 {
   current_ = this;
   
@@ -124,7 +124,7 @@ GameSession::restart_level()
   currentsector = 0;
 
   level = new Level;
-  level->load(levelname);
+  level->load(levelfile);
   if(flip_level)
     level->do_vertical_flip();
 
@@ -726,7 +726,8 @@ GameSession::run()
   while (exit_status == ES_NONE) {
     Uint32 ticks = SDL_GetTicks();
     float elapsed_time = float(ticks - lastticks) / 1000.;
-    global_time += elapsed_time;
+    if(!game_pause)
+      global_time += elapsed_time;
     lastticks = ticks;
 
     // 40fps is minimum
index 1d01487..d1898be 100644 (file)
@@ -78,7 +78,7 @@ private:
 
   bool game_pause;
 
-  std::string levelname;
+  std::string levelfile;
   bool flip_level;
 
   // the sector and spawnpoint we shoudl spawn after this frame
@@ -93,7 +93,8 @@ public:
   DrawingContext* context;
   Timer2 time_left;
 
-  GameSession(const std::string& level, int mode, bool flip_level_ = false, Statistics* statistics = NULL);
+  GameSession(const std::string& levelfile, int mode, bool flip_level_ = false,
+          Statistics* statistics = 0);
   ~GameSession();
 
   /** Enter the busy loop */
index f317b22..8788cc0 100644 (file)
@@ -62,20 +62,8 @@ Level::create(const std::string& filename)
 }
 
 void
-Level::load(const std::string& filename)
+Level::load(const std::string& filepath)
 {
-  std::string filepath;
-  filepath = st_dir + "/levels/" + filename;
-  if (access(filepath.c_str(), R_OK) != 0)
-  {
-    filepath = datadir + "/levels/" + filename;
-    if (access(filepath.c_str(), R_OK) != 0)
-    {
-      std::cerr << "Error: Level: couldn't find level: " << filename << std::endl;
-      return;
-    }
-  }
-  
   LispReader* level = LispReader::load(filepath, "supertux-level");
 
   int version = 1;
index cc280b5..d627d82 100644 (file)
@@ -51,6 +51,7 @@ public:
   Level();
   ~Level();
 
+  // loads a levelfile
   void load(const std::string& filename);
   void save(const std::string& filename);
   static void create(const std::string& filename);
index 0a67f1d..19edf47 100644 (file)
 
 #include <config.h>
 
+#include <sstream>
+#include <stdexcept>
 #include <assert.h>
 #include <unistd.h>
 #include "app/setup.h"
 #include "level.h"
+#include "resources.h"
 #include "app/globals.h"
 #include "video/surface.h"
 #include "level_subset.h"
@@ -89,14 +92,13 @@ void LevelSubset::load(const std::string& subset)
   
   // Check in which directory our subset is located (ie. ~/.supertux/
   // or SUPERTUX_DATADIR)
-  std::string filename;
-  filename = st_dir + "/levels/" + subset + "/info";
-  if (access(filename.c_str(), R_OK) != 0)
-    {
-      filename = datadir + "/levels/" + subset + "/info";
-      if (access(filename.c_str(), R_OK) != 0)
-        std::cout << "Error: LevelSubset: couldn't find subset: " << subset << std::endl;
-    }
+  std::string filename = get_resource_filename(
+      std::string("levels/") + subset + "/info");
+  if(filename == "") {
+    std::stringstream msg;
+    msg << "Couldn't find level subset '" << subset << "'.";
+    throw new std::runtime_error(msg.str());
+  }
   
   read_info_file(filename);
 
@@ -115,7 +117,8 @@ void LevelSubset::load(const std::string& subset)
       for(std::set<std::string>::iterator i = files.begin(); i != files.end(); ++i)
         {
           if (has_suffix(*i, ".stl"))
-            levels.push_back(subset+ "/" + *i);
+            levels.push_back(get_resource_filename(
+                  std::string("levels/" + subset+ "/" + *i)));
         }
     }
 }
@@ -177,5 +180,3 @@ LevelSubset::get_num_levels() const
 {
   return levels.size();
 }
-
-/* EOF */
index ac23078..da92958 100644 (file)
@@ -304,3 +304,16 @@ void unloadshared(void)
   sprite_manager = 0;
 }
 
+std::string get_resource_filename(const std::string& resource)
+{
+  std::string filepath = st_dir + resource;
+  if(access(filepath.c_str(), R_OK) == 0)
+    return filepath;
+  
+  filepath = datadir + resource;
+  if(access(filepath.c_str(), R_OK) == 0)
+    return filepath;
+
+  std::cerr << "Couldn't find resource: '" << resource  << "'." << std::endl;
+  return "";
+}
index 2519b04..f399af8 100644 (file)
@@ -93,6 +93,10 @@ extern Font* white_small_text;
 extern Font* white_big_text;
 extern Font* yellow_nums;
 
+// maps a virtual resource path to a real path (ie. levels/bla is mapped to
+// $DATADIR/levels/bla or $HOME/.supertux/levels/bla)
+std::string get_resource_filename(const std::string& resource);
+
 void loadshared();
 void unloadshared();
 
index e150112..4874916 100644 (file)
@@ -322,7 +322,8 @@ void title(void)
 
   Ticks::pause_init();
 
-  titlesession = new GameSession("misc/menu.stl", ST_GL_DEMO_GAME);
+  titlesession = new GameSession(get_resource_filename("levels/misc/menu.stl"),
+      ST_GL_DEMO_GAME);
 
   /* Load images: */
   bkg_title = new Surface(datadir + "/images/background/arctis.jpg", false);
@@ -483,6 +484,3 @@ void title(void)
   delete img_choose_subset;
 }
 
-
-// EOF //
-
index 4bbc4b2..974c75c 100644 (file)
@@ -863,7 +863,8 @@ WorldMap::update(float delta)
               // do a shriking fade to the level
               shrink_fade(Vector((level->pos.x*32 + 16 + offset.x),(level->pos.y*32 + 16
                       + offset.y)), 500);
-              GameSession session(level->name,
+              GameSession session(
+                  get_resource_filename(std::string("levels/" + level->name)),
                                   ST_GL_LOAD_LEVEL_FILE, level->vertical_flip,
                                   &level->statistics);