fixed broken 1-time animations in sprites, fixed collision code returning no-collisio...
[supertux.git] / src / sector.cpp
index e5d76c9..fedeee5 100644 (file)
@@ -46,7 +46,6 @@
 #include "object/block.h"
 #include "object/invisible_block.h"
 #include "object/platform.h"
-#include "trigger/door.h"
 #include "object/bullet.h"
 #include "badguy/jumpy.h"
 #include "badguy/snowball.h"
@@ -55,6 +54,9 @@
 #include "badguy/mriceblock.h"
 #include "badguy/mrbomb.h"
 #include "badguy/dispenser.h"
+#include "badguy/spike.h"
+#include "badguy/nolok_01.h"
+#include "trigger/door.h"
 #include "trigger/sequence_trigger.h"
 #include "trigger/secretarea_trigger.h"
 
@@ -67,10 +69,13 @@ Sector::Sector()
   song_title = "Mortimers_chipdisko.mod";
   player = new Player();
   add_object(player);
+
+  printf("seccreated: %p.\n", this);
 }
 
 Sector::~Sector()
 {
+  printf("secdel: %p.\n", this);
   for(GameObjects::iterator i = gameobjects.begin(); i != gameobjects.end();
       ++i) {
     delete *i;
@@ -102,31 +107,17 @@ Sector *Sector::create(const std::string& name, size_t width, size_t height)
 }
 
 GameObject*
-Sector::parseObject(const std::string& name, LispReader& reader)
+Sector::parse_object(const std::string& name, LispReader& reader)
 {
   if(name == "background") {
     background = new Background(reader);
     return background;
   } else if(name == "camera") {
-    if(camera) {
-      std::cerr << "Warning: More than 1 camera defined in sector.\n";
-      return 0;
-    }
-    camera = new Camera(this);
-    camera->read(reader);
+    Camera* camera = new Camera(this);
+    camera->parse(reader);
     return camera;
   } else if(name == "tilemap") {
-    TileMap* tilemap = new TileMap(reader);
-
-    if(tilemap->is_solid()) {
-      if(solids) {
-        std::cerr << "Warning multiple solid tilemaps in sector.\n";
-        return 0;
-      }
-      solids = tilemap;
-      fix_old_tiles();
-    }
-    return tilemap;
+    return  new TileMap(reader);
   } else if(name == "particles-snow") {
     SnowParticleSystem* partsys = new SnowParticleSystem();
     partsys->parse(reader);
@@ -155,6 +146,10 @@ Sector::parseObject(const std::string& name, LispReader& reader)
     return new MrBomb(reader);
   } else if(name == "dispenser") {
     return new Dispenser(reader);
+  } else if(name == "spike") {
+    return new Spike(reader);
+  } else if(name == "nolok_01") {
+    return new Nolok_01(reader);
   }
 #if 0
     else if(badguykind_from_string(name) != BAD_INVALID) {
@@ -195,7 +190,7 @@ Sector::parse(LispReader& lispreader)
       reader.read_float("y", sp->pos.y);
       spawnpoints.push_back(sp);
     } else {
-      GameObject* object = parseObject(token, reader);
+      GameObject* object = parse_object(token, reader);
       if(object) {
         add_object(object);
       }
@@ -330,7 +325,7 @@ Sector::parse_old_format(LispReader& reader)
                                                                                 
         LispReader reader(lisp_cdr(data));
 
-        GameObject* object = parseObject(object_type, reader);
+        GameObject* object = parse_object(object_type, reader);
         if(object) {
           add_object(object);
         } else {
@@ -359,6 +354,18 @@ Sector::fix_old_tiles()
       if(tile->id == 112) {
         add_object(new InvisibleBlock(pos));
         solids->change(x, y, 0);
+      } else if(tile->id == 295) {
+        add_object(new Spike(pos, Spike::NORTH));
+        solids->change(x, y, 0);
+      } else if(tile->id == 296) {
+        add_object(new Spike(pos, Spike::EAST));
+        solids->change(x, y, 0);
+      } else if(tile->id == 297) {
+        add_object(new Spike(pos, Spike::SOUTH));
+        solids->change(x, y, 0);
+      } else if(tile->id == 298) {
+        add_object(new Spike(pos, Spike::WEST));
+        solids->change(x, y, 0);
       } else if(tile->attributes & Tile::COIN) {
         add_object(new Coin(pos));
         solids->change(x, y, 0);
@@ -547,15 +554,6 @@ Sector::update_game_objects()
             std::remove(bullets.begin(), bullets.end(), bullet),
             bullets.end());
       }
-#if 0
-      InteractiveObject* interactive_object =
-          dynamic_cast<InteractiveObject*> (*i);
-      if(interactive_object) {
-        interactive_objects.erase(
-            std::remove(interactive_objects.begin(), interactive_objects.end(),
-                interactive_object), interactive_objects.end());
-      }
-#endif
       delete *i;
       i = gameobjects.erase(i);
     } else {
@@ -567,17 +565,30 @@ Sector::update_game_objects()
   for(std::vector<GameObject*>::iterator i = gameobjects_new.begin();
       i != gameobjects_new.end(); ++i)
   {
-          Bullet* bullet = dynamic_cast<Bullet*> (*i);
-          if(bullet)
-            bullets.push_back(bullet);
-#if 0
-          InteractiveObject* interactive_object 
-              = dynamic_cast<InteractiveObject*> (*i);
-          if(interactive_object)
-            interactive_objects.push_back(interactive_object);
-#endif
+    Bullet* bullet = dynamic_cast<Bullet*> (*i);
+    if(bullet)
+      bullets.push_back(bullet);
+
+    TileMap* tilemap = dynamic_cast<TileMap*> (*i);
+    if(tilemap && tilemap->is_solid()) {
+      if(solids == 0) {
+        solids = tilemap;
+        fix_old_tiles();
+      } else {
+        std::cerr << "Another solid tilemaps added. Ignoring.";
+      }
+    }
 
-          gameobjects.push_back(*i);
+    Camera* camera = dynamic_cast<Camera*> (*i);
+    if(camera) {
+      if(this->camera != 0) {
+        std::cerr << "Warning: Multiple cameras added. Ignoring.";
+        continue;
+      }
+      this->camera = camera;
+    }
+
+    gameobjects.push_back(*i);
   }
   gameobjects_new.clear();
 }
@@ -655,23 +666,7 @@ Sector::collision_tilemap(MovingObject* object, int depth)
         AATriangle triangle;
         Vector p1(x*32, y*32);
         Vector p2((x+1)*32, (y+1)*32);
-        switch(tile->data) {
-          case 0:
-            triangle = AATriangle(p1, p2, AATriangle::SOUTHWEST);
-            break;
-          case 1:
-            triangle = AATriangle(p1, p2, AATriangle::NORTHEAST);
-            break;
-          case 2:
-            triangle = AATriangle(p1, p2, AATriangle::SOUTHEAST);
-            break;
-          case 3:
-            triangle = AATriangle(p1, p2, AATriangle::NORTHWEST);
-            break;
-          default:
-            printf("Invalid slope angle in tile %d !\n", tile->id);
-            break;
-        }
+        triangle = AATriangle(p1, p2, tile->data);
 
         if(Collision::rectangle_aatriangle(temphit, dest, object->movement,
               triangle)) {