- added spikes
authorRyan Flegel <rflegel@gmail.com>
Mon, 17 May 2004 06:26:41 +0000 (06:26 +0000)
committerRyan Flegel <rflegel@gmail.com>
Mon, 17 May 2004 06:26:41 +0000 (06:26 +0000)
SVN-Revision: 1230

src/badguy.cpp
src/collision.cpp
src/collision.h
src/gameobjs.cpp
src/player.cpp
src/tile.cpp
src/tile.h

index d2fe17d..7b8db66 100644 (file)
@@ -719,6 +719,17 @@ BadGuy::action(double frame_ratio)
     return;
   }
 
+  // Kill us if we landed on spikes
+  if (dying == DYING_NOT
+      && (kind != BAD_STALACTITE && kind != BAD_FLAME && kind != BAD_BOMB)
+      && (isspike(base.x, base.y) || isspike(base.x + base.width, base.y)
+      ||  isspike(base.x, base.y + base.height)
+      ||  isspike(base.x + base.width, base.y + base.height)))
+      {
+         physic.set_velocity_y(3);
+         kill_me(0);
+      }
+
   // Once it's on screen, it's activated!
   if (base.x <= scroll_x + screen->w + OFFSCREEN_DISTANCE)
     seen = true;
@@ -965,6 +976,7 @@ BadGuy::kill_me(int score)
   physic.enable_gravity(true);
 
   /* Gain some points: */
+  if (score != 0)
     World::current()->add_score(base.x, base.y,
                     score * player_status.score_multiplier);
 
index 2466d8c..5f08756 100644 (file)
@@ -263,6 +263,12 @@ bool isice(float x, float y)
   return tile && tile->ice;
 }
 
+bool isspike(float x, float y)
+{
+  Tile* tile = gettile(x,y);
+  return tile && tile->spike;
+}
+
 bool isfullbox(float x, float y)
 {
   Tile* tile = gettile(x,y);
index b9e8410..225a771 100644 (file)
@@ -54,6 +54,7 @@ Tile* gettile(float x, float y);
 bool  issolid(float x, float y);
 bool  isbrick(float x, float y);
 bool  isice(float x, float y);
+bool  isspike(float x, float y);
 bool  isfullbox(float x, float y);
 
 typedef void* (*tiletestfunction)(Tile* tile);
index f96a72c..3a1eeac 100644 (file)
@@ -255,6 +255,8 @@ Trampoline::draw()
 void
 Trampoline::action(double frame_ratio)
 {
+  // TODO: Remove if we're too far off the screen
+
   physic.apply(frame_ratio, base.x, base.y);
 
   // Falling
index a00560e..93b3cfc 100644 (file)
@@ -184,6 +184,14 @@ Player::action(double frame_ratio)
 
       collision_swept_object_map(&old_base, &base);
 
+      if (!invincible_timer.started()
+          && (isspike(base.x, base.y) || isspike(base.x + base.width, base.y)
+          ||  isspike(base.x, base.y + base.height)
+          ||  isspike(base.x + base.width, base.y + base.height)))
+      {
+         kill(SHRINK);
+      }
+
       // Don't accelerate Tux if he is running against a wall
       if (target.x != base.x)
         {
index 116f185..19a514f 100644 (file)
@@ -91,6 +91,7 @@ void TileManager::load_tileset(std::string filename)
               tile->brick   = false;
               tile->ice     = false;
               tile->water   = false;
+              tile->spike   = false;
               tile->fullbox = false;
               tile->distro  = false;
               tile->goal    = false;
@@ -104,6 +105,7 @@ void TileManager::load_tileset(std::string filename)
               reader.read_bool("brick",     &tile->brick);
               reader.read_bool("ice",       &tile->ice);
               reader.read_bool("water",     &tile->water);
+              reader.read_bool("spike",     &tile->spike);
               reader.read_bool("fullbox",   &tile->fullbox);
               reader.read_bool("distro",    &tile->distro);
               reader.read_bool("goal",      &tile->goal);
index c2c6a35..4d4f008 100644 (file)
@@ -58,12 +58,16 @@ public:
   /** water */
   bool water;
 
+  /** spike - kills player on contact */
+  bool spike;
+
   /** Bonusbox, content is stored in \a data */
   bool fullbox;
 
   /** Tile is a distro/coin */
   bool distro;
 
+
   /** the level should be finished when touching a goaltile.
    * if data is 0 then the endsequence should be triggered, if data is 1
    * then we can finish the level instantly.