normalize paths for images so that you can use .. in them
authorMatthias Braun <matze@braunis.de>
Wed, 28 Dec 2005 00:09:51 +0000 (00:09 +0000)
committerMatthias Braun <matze@braunis.de>
Wed, 28 Dec 2005 00:09:51 +0000 (00:09 +0000)
SVN-Revision: 2960

13 files changed:
src/badguy/bomb.cpp
src/badguy/bouncing_snowball.cpp
src/badguy/dispenser.cpp
src/badguy/fish.cpp
src/badguy/flame.cpp
src/badguy/flyingsnowball.cpp
src/badguy/jumpy.cpp
src/badguy/kugelblitz.cpp
src/badguy/mrbomb.cpp
src/file_system.cpp
src/file_system.hpp
src/tile_manager.cpp
src/video/texture_manager.cpp

index c611337..741d161 100644 (file)
@@ -17,7 +17,6 @@
 //  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 "bomb.hpp"
@@ -30,7 +29,7 @@ Bomb::Bomb(const Vector& pos, Direction dir)
   start_position = pos;
   bbox.set_pos(pos);
   bbox.set_size(31.8, 31.8);
-  sprite = sprite_manager->create("bomb");
+  sprite = sprite_manager->create("images/creatures/mr_bomb/bomb.sprite");
   state = 0;
   timer.start(TICKINGTIME);
   this->dir = dir;
index a704a04..80d9bb6 100644 (file)
@@ -17,7 +17,6 @@
 //  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 "bouncing_snowball.hpp"
@@ -30,7 +29,7 @@ BouncingSnowball::BouncingSnowball(const lisp::Lisp& reader)
   reader.get("x", start_position.x);
   reader.get("y", start_position.y);
   bbox.set_size(31.8, 31.8);
-  sprite = sprite_manager->create("bouncingsnowball");
+  sprite = sprite_manager->create("images/creatures/bouncing_snowball/bouncing_snowball.sprite");
   set_direction = false;
 }
 
@@ -39,7 +38,7 @@ BouncingSnowball::BouncingSnowball(float pos_x, float pos_y, Direction d)
    start_position.x = pos_x;
    start_position.y = pos_y;
    bbox.set_size(31.8, 31.8);
-   sprite = sprite_manager->create("bouncingsnowball");
+   sprite = sprite_manager->create("images/creatures/bouncing_snowball/bouncing_snowball.sprite");
    set_direction = true;
    initial_direction = d;
 }
index b565bfe..4aea90c 100644 (file)
@@ -17,7 +17,6 @@
 //  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 "dispenser.hpp"
@@ -36,7 +35,7 @@ Dispenser::Dispenser(const lisp::Lisp& reader)
   reader.get("cycle", cycle);
   reader.get("badguy", badguy);
   bbox.set_size(32, 32);
-  sprite = sprite_manager->create("dispenser");
+  sprite = sprite_manager->create("images/creatures/dispenser/dispenser.sprite");
   if (badguy == "mrrocket") {
      sprite->set_action(dir == LEFT ? "working-left" : "working-right");
   }
index e5003a4..5fca837 100644 (file)
@@ -32,7 +32,7 @@ Fish::Fish(const lisp::Lisp& reader)
   reader.get("x", start_position.x);
   reader.get("y", start_position.y);
   bbox.set_size(31.8, 31.8);
-  sprite = sprite_manager->create("fish");
+  sprite = sprite_manager->create("images/creatures/fish/fish.sprite");
   physic.enable_gravity(true);
 }
 
@@ -42,7 +42,7 @@ Fish::Fish(float pos_x, float pos_y)
   start_position.x = pos_x;
   start_position.y = pos_y;
   bbox.set_size(31.8, 31.8);
-  sprite = sprite_manager->create("fish");
+  sprite = sprite_manager->create("images/creatures/fish/fish.sprite");
   physic.enable_gravity(true);
 }
 
index 1c03b35..9697a37 100644 (file)
@@ -17,7 +17,6 @@
 //  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 "flame.hpp"
@@ -32,7 +31,7 @@ Flame::Flame(const lisp::Lisp& reader)
   bbox.set_pos(Vector(start_position.x + cos(angle) * radius,
                       start_position.y + sin(angle) * radius));
   bbox.set_size(32, 32);  
-  sprite = sprite_manager->create("flame");
+  sprite = sprite_manager->create("images/creatures/flame.sprite");
   countMe = false;
 }
 
index 3135c6a..c25a8cb 100644 (file)
@@ -17,8 +17,8 @@
 //  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 <stdio.h>
 
 #include "flyingsnowball.hpp"
@@ -31,7 +31,7 @@ FlyingSnowBall::FlyingSnowBall(const lisp::Lisp& reader)
   reader.get("x", start_position.x);
   reader.get("y", start_position.y);
   bbox.set_size(31.8, 31.8);
-  sprite = sprite_manager->create("flyingsnowball");
+  sprite = sprite_manager->create("images/creatures/flying_snowball/flying_snowball.sprite");
   physic.enable_gravity(false);
 }
 
@@ -40,7 +40,7 @@ FlyingSnowBall::FlyingSnowBall(float pos_x, float pos_y)
   start_position.x = pos_x;
   start_position.y = pos_y;
   bbox.set_size(31.8, 31.8);
-  sprite = sprite_manager->create("flyingsnowball");
+  sprite = sprite_manager->create("images/creatures/flying_snowball/flying_snowball.sprite");
   physic.enable_gravity(false);
 }
 
index 9b2a6b7..2b450b2 100644 (file)
@@ -31,7 +31,7 @@ Jumpy::Jumpy(const lisp::Lisp& reader)
   reader.get("x", start_position.x);
   reader.get("y", start_position.y);
   bbox.set_size(31.8, 31.8);
-  sprite = sprite_manager->create("jumpy");
+  sprite = sprite_manager->create("images/creatures/jumpy/jumpy.sprite");
 }
 
 void
index 4c7f5eb..eb4fc2e 100644 (file)
@@ -38,7 +38,7 @@ Kugelblitz::Kugelblitz(const lisp::Lisp& reader)
   reader.get("x", start_position.x);
   start_position.y = 0; //place above visible area
   bbox.set_size(63.8, 63.8);
-  sprite = sprite_manager->create("kugelblitz");
+  sprite = sprite_manager->create("images/creatures/kugelblitz/kugelblitz.sprite");
   sprite->set_action("falling");
   physic.enable_gravity(false);
 }
index 596899e..2829616 100644 (file)
@@ -17,7 +17,6 @@
 //  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 "mrbomb.hpp"
@@ -30,7 +29,7 @@ MrBomb::MrBomb(const lisp::Lisp& reader)
   reader.get("x", start_position.x);
   reader.get("y", start_position.y);
   bbox.set_size(31.8, 31.8);
-  sprite = sprite_manager->create("mrbomb");
+  sprite = sprite_manager->create("images/creatures/mr_bomb/mr_bomb.sprite");
   set_direction = false;
 }
 
@@ -39,7 +38,7 @@ MrBomb::MrBomb(float pos_x, float pos_y, Direction d)
   start_position.x = pos_x;
   start_position.y = pos_y;
   bbox.set_size(31.8, 31.8);
-  sprite = sprite_manager->create("mrbomb");
+  sprite = sprite_manager->create("images/creatures/mr_bomb/mr_bomb.sprite");
   set_direction = true;
   initial_direction = d;
 }
index 4989540..826d4b7 100644 (file)
@@ -3,6 +3,9 @@
 #include "file_system.hpp"
 
 #include <string>
+#include <vector>
+#include <iostream>
+#include <sstream>
 
 namespace FileSystem
 {
@@ -25,5 +28,55 @@ std::string basename(const std::string& filename)
   return filename.substr(p, filename.size()-p);
 }
 
+std::string normalize(const std::string& filename)
+{
+  std::vector<std::string> path_stack;
+
+  const char* p = filename.c_str();
+
+  while(true) {
+    while(*p == '/') {
+      p++;
+      continue;
+    }
+
+    const char* pstart = p;
+    while(*p != '/' && *p != 0) {
+      ++p;
+    }
+
+    size_t len = p - pstart;
+    if(len == 0)
+      break;
+    
+    std::string pathelem(pstart, p-pstart);
+    if(pathelem == ".")
+      continue;
+    
+    if(pathelem == "..") {
+      if(path_stack.empty()) {
+        std::cout << "Invalid '..' in path '" << filename << "'.\n";
+        // push it into the result path so that the users sees his error...
+        path_stack.push_back(pathelem);
+      } else {
+        path_stack.pop_back();
+      }
+    } else {
+      path_stack.push_back(pathelem);
+    }
+  }
+
+  // construct path
+  std::ostringstream result;
+  for(std::vector<std::string>::iterator i = path_stack.begin();
+      i != path_stack.end(); ++i) {
+    result << '/' << *i;
+  }
+  if(path_stack.empty())
+    result << '/';
+
+  return result.str();
+}
+
 }
 
index 47f86f4..2241904 100644 (file)
@@ -8,6 +8,11 @@ namespace FileSystem
 {
   std::string dirname(const std::string& filename);
   std::string basename(const std::string& filename);
+  /**
+   * normalize filename so that "blup/bla/blo/../../bar" will become
+   * "blup/bar"
+   */
+  std::string normalize(const std::string& filename);
 }
 
 #endif
index e6a3a15..25c4997 100644 (file)
@@ -72,6 +72,9 @@ void TileManager::load_tileset(std::string filename)
       while(tile->id >= tiles.size()) {
         tiles.push_back(0);
       }
+      if(tiles[tile->id] != 0) {
+        std::cout << "Warning: Tile with ID " << tile->id << " redefined\n";
+      }
       tiles[tile->id] = tile;
     } else if(iter.item() == "tilegroup") {
       TileGroup tilegroup;
index ab5788e..73c71fd 100644 (file)
@@ -12,6 +12,7 @@
 #include "physfs/physfs_sdl.hpp"
 #include "image_texture.hpp"
 #include "glutil.hpp"
+#include "file_system.hpp"
 
 TextureManager* texture_manager = NULL;
 
@@ -33,8 +34,9 @@ TextureManager::~TextureManager()
 }
 
 ImageTexture*
-TextureManager::get(const std::string& filename)
+TextureManager::get(const std::string& _filename)
 {
+  std::string filename = FileSystem::normalize(_filename);
   ImageTextures::iterator i = image_textures.find(filename);
 
   ImageTexture* texture = NULL;