- added fullscreen/window switch to F11 (gnome-like)
[supertux.git] / src / sector.cpp
index 3b3cbc8..125d186 100644 (file)
@@ -1184,6 +1184,10 @@ Sector::collision_static_constrains(MovingObject& object)
   }
 }
 
+namespace {
+  const float MAX_SPEED = 16.0f;
+}
+
 void
 Sector::handle_collisions()
 {
@@ -1193,6 +1197,13 @@ Sector::handle_collisions()
   for(MovingObjects::iterator i = moving_objects.begin();
       i != moving_objects.end(); ++i) {
     MovingObject* moving_object = *i;
+    Vector mov = moving_object->get_movement();
+
+    // make sure movement is never faster than MAX_SPEED. Norm is pretty fat, so two addl. checks are done before.
+    if (((mov.x > MAX_SPEED * M_SQRT1_2) || (mov.y > MAX_SPEED * M_SQRT1_2)) && (mov.norm() > MAX_SPEED)) {
+      moving_object->movement = mov.unit() * MAX_SPEED;
+      //log_debug << "Temporarily reduced object's speed of " << mov.norm() << " to " << moving_object->movement.norm() << "." << std::endl;
+    }
 
     moving_object->dest = moving_object->get_bbox();
     moving_object->dest.move(moving_object->get_movement());
@@ -1288,7 +1299,7 @@ Sector::handle_collisions()
 }
 
 bool
-Sector::is_free_of_tiles(const Rect& rect) const
+Sector::is_free_of_tiles(const Rect& rect, const bool ignoreUnisolid) const
 {
   using namespace collision;
 
@@ -1313,7 +1324,8 @@ Sector::is_free_of_tiles(const Rect& rect) const
          Constraints constraints;
          return collision::rectangle_aatriangle(&constraints, rect, triangle);
        }
-       if(tile->getAttributes() & Tile::SOLID) return false;
+       if((tile->getAttributes() & Tile::SOLID) && !ignoreUnisolid) return false;
+       if((tile->getAttributes() & Tile::SOLID) && !(tile->getAttributes() & Tile::UNISOLID)) return false;
       }
     }
   }
@@ -1322,11 +1334,11 @@ Sector::is_free_of_tiles(const Rect& rect) const
 }
 
 bool
-Sector::is_free_of_statics(const Rect& rect, const MovingObject* ignore_object) const
+Sector::is_free_of_statics(const Rect& rect, const MovingObject* ignore_object, const bool ignoreUnisolid) const
 {
   using namespace collision;
 
-  if (!is_free_of_tiles(rect)) return false;
+  if (!is_free_of_tiles(rect, ignoreUnisolid)) return false;
 
   for(MovingObjects::const_iterator i = moving_objects.begin();
       i != moving_objects.end(); ++i) {