- added color ligts
[supertux.git] / src / sector.hpp
index 6388556..b2ee219 100644 (file)
@@ -25,7 +25,6 @@
 #include <squirrel.h>
 
 #include "direction.hpp"
-#include "script_manager.hpp"
 #include "math/vector.hpp"
 #include "video/drawing_context.hpp"
 
@@ -46,6 +45,7 @@ class ScriptInterpreter;
 class SpawnPoint;
 class MovingObject;
 class CollisionHit;
+class Level;
 
 enum MusicType {
   LEVEL_MUSIC,
@@ -60,9 +60,12 @@ enum MusicType {
 class Sector
 {
 public:
-  Sector();
+  Sector(Level* parent);
   ~Sector();
 
+  /// get parent level
+  Level* get_level();
+
   /// read sector from lisp file
   void parse(const lisp::Lisp& lisp);
   void parse_old_format(const lisp::Lisp& lisp);
@@ -93,7 +96,10 @@ public:
   const std::string& get_name() const
   { return name; }
 
-  /// tests if a given rectangle is inside the sector
+  /**
+   * tests if a given rectangle is inside the sector
+   * (a rectangle that is on top of the sector is considered inside)
+   */
   bool inside(const Rect& rectangle) const;
 
   void play_music(MusicType musictype);
@@ -110,10 +116,21 @@ public:
   /** Get total number of badguys */
   int get_total_badguys();
 
+  /** Get total number of GameObjects of given type */
+  template<class T> int get_total_count()
+  {
+    int total = 0;
+    for(GameObjects::iterator i = gameobjects.begin(); i != gameobjects.end(); ++i) {
+      if (dynamic_cast<T*>(*i)) total++;
+    }
+    return total;
+  }
+
   void collision_tilemap(const Rect& dest, const Vector& movement, CollisionHit& hit) const;
 
   /** Checks if at the specified rectangle are gameobjects with STATIC flag set
-   * (or solid tiles from the tilemap)
+   * (or solid tiles from the tilemap).
+   * This does not(!) include badguys or players.
    */
   bool is_free_space(const Rect& rect) const;
 
@@ -131,6 +148,7 @@ public:
   typedef std::vector<SpawnPoint*> SpawnPoints;
 
 private:
+  Level* level; /**< Parent level containing this sector */
   uint32_t collision_tile_attributes(const Rect& dest) const;
 
   void before_object_remove(GameObject* object);
@@ -139,14 +157,29 @@ private:
   void try_expose(GameObject* object);
   void try_unexpose(GameObject* object);
   
-  bool collision_static(MovingObject* object, const Vector& movement);
-  
   /** Checks for all possible collisions. And calls the
       collision_handlers, which the collision_objects provide for this
       case (or not). */
   void handle_collisions();
-  
+  /**
+   * Does collision detection between 2 objects and does instant
+   * collision response handling in case of a collision
+   */
   void collision_object(MovingObject* object1, MovingObject* object2) const;
+
+  /**
+   * Does collision detection of an object against all other static
+   * objects (and the tilemap) in the level. Collision response is done
+   * for the first hit in time. (other hits get ignored, the function
+   * should be called repeatedly to resolve those)
+   *
+   * returns true if the collision detection should be aborted for this object
+   * (because of ABORT_MOVE in the collision response or no collisions)
+   */
+  bool collision_static(MovingObject* object, const Vector& movement);
+
+  
   GameObject* parse_object(const std::string& name, const lisp::Lisp& lisp);
 
   void fix_old_tiles();
@@ -168,11 +201,13 @@ private:
 
   HSQOBJECT sector_table;
   /// sector scripts
-  std::auto_ptr<ScriptManager> script_manager;
+  typedef std::vector<HSQOBJECT> ScriptList;
+  ScriptList scripts;
 
 public: // TODO make this private again
   /// show collision rectangles of moving objects (for debugging)
   static bool show_collrects;
+  static bool draw_solids_only;
   
   GameObjects gameobjects;
   MovingObjects moving_objects;