reverted totally pointless commit of rmcruz. size does NOT contain the current power...
[supertux.git] / src / world.cpp
index f4d83db..2eca737 100644 (file)
@@ -32,6 +32,7 @@
 #include "level.h"
 #include "tile.h"
 #include "resources.h"
+#include "gameobjs.h"
 
 Surface* img_distro[4];
 
@@ -166,7 +167,7 @@ World::activate_objects()
   for (std::vector< ObjectData<TrampolineData> >::iterator i = level->trampoline_data.begin();
        i != level->trampoline_data.end();
        ++i)
-  {puts("fo");
+  {
     add_object<Trampoline, ObjectData<TrampolineData> >(*i);
   }
 }
@@ -301,6 +302,9 @@ World::action(double frame_ratio)
   for (BadGuys::iterator i = bad_guys.begin(); i != bad_guys.end(); ++i)
     (*i)->action(frame_ratio);
 
+  for (Trampolines::iterator i = trampolines.begin(); i != trampolines.end(); ++i)
+     (*i)->action(frame_ratio);
+
   /* update particle systems */
   std::vector<ParticleSystem*>::iterator p;
   for(p = particle_systems.begin(); p != particle_systems.end(); ++p)
@@ -340,7 +344,7 @@ void World::scrolling(double frame_ratio)
 
   float tux_pos_y = tux.base.y + (tux.base.height/2);
 
-  if(level->height > VISIBLE_TILES_Y-1)
+  if(level->height > VISIBLE_TILES_Y-1 && !tux.dying)
     {
     if (scroll_y < tux_pos_y - (screen->h - Y_SPACE))
       scroll_y = tux_pos_y - (screen->h - Y_SPACE);
@@ -495,6 +499,25 @@ World::collision_handler()
           upgrades[i].collision(&tux, CO_PLAYER, COLLISION_NORMAL);
         }
     }
+
+  // CO_TRAMPOLINE & (CO_PLAYER or CO_BADGUY)
+  for (Trampolines::iterator i = trampolines.begin(); i != trampolines.end(); ++i)
+  {
+    if (rectcollision((*i)->base, tux.base))
+    {
+      if (tux.previous_base.y < tux.base.y &&
+          tux.previous_base.y + tux.previous_base.height 
+          < (*i)->base.y + (*i)->base.height/2)
+      {
+        (*i)->collision(&tux, CO_PLAYER, COLLISION_SQUISH);
+      }
+      else if (tux.previous_base.y <= tux.base.y)
+      {
+        tux.collision(*i, CO_TRAMPOLINE);
+        (*i)->collision(&tux, CO_PLAYER, COLLISION_NORMAL);
+      }
+    }
+  }
 }
 
 void
@@ -554,7 +577,9 @@ T*
 World::add_object(U data)
 {
   T* tobject = new T(data);
-  trampolines.push_back(tobject);
+
+  if (data.type == OBJ_TRAMPOLINE)
+    trampolines.push_back(tobject);
 
   return tobject;
 }
@@ -618,7 +643,7 @@ World::get_music_type()
 }
 
 /* Break a brick: */
-void
+bool
 World::trybreakbrick(float x, float y, bool small)
 {
   Level* plevel = get_level();
@@ -652,6 +677,7 @@ World::trybreakbrick(float x, float y, bool small)
           play_sound(sounds[SND_DISTRO], SOUND_CENTER_SPEAKER);
           player_status.score = player_status.score + SCORE_DISTRO;
           player_status.distros++;
+          return true;
         }
       else if (!small)
         {
@@ -666,8 +692,12 @@ World::trybreakbrick(float x, float y, bool small)
           /* Get some score: */
           play_sound(sounds[SND_BRICK], SOUND_CENTER_SPEAKER);
           player_status.score = player_status.score + SCORE_BRICK;
+          
+          return true;
         }
     }
+
+  return false;
 }
 
 /* Empty a box: */