added inheritance diagram for the gameobjects
[supertux.git] / src / player.cpp
index fde8292..2dad290 100644 (file)
@@ -41,6 +41,8 @@ Surface* tux_life;
 Sprite* smalltux_gameover;
 Sprite* smalltux_star;
 Sprite* largetux_star;
+Sprite* growingtux_left;
+Sprite* growingtux_right;
 
 PlayerSprite smalltux;
 PlayerSprite largetux;
@@ -83,8 +85,6 @@ Player::~Player()
 void
 Player::init()
 {
-  Level* plevel = World::current()->get_level();
-
   holding_something = false;
 
   base.width = 32;
@@ -93,12 +93,13 @@ Player::init()
   size = SMALL;
   got_power = NONE_POWER;
 
-  base.x = plevel->start_pos_x;
-  base.y = plevel->start_pos_y;
+  base.x = 0;
+  base.y = 0;
   previous_base = old_base = base;
   dir = RIGHT;
   old_dir = dir;
   duck = false;
+  dead = false;
 
   dying   = DYING_NOT;
   last_ground_y = 0;
@@ -118,6 +119,7 @@ Player::init()
   frame_timer.init(true);
   kick_timer.init(true);
   shooting_timer.init(true);
+  growing_timer.init(true);
 
   physic.reset();
 }
@@ -172,6 +174,7 @@ Player::level_begin()
   skidding_timer.init(true);
   safe_timer.init(true);
   frame_timer.init(true);
+  growing_timer.init(true);
 
   physic.reset();
 }
@@ -181,6 +184,11 @@ Player::action(float elapsed_time)
 {
   bool jumped_in_solid = false;
 
+  if(dying && !dying_timer.check()) {
+    dead = true;
+    return;
+  }
+
   if (input.fire == UP)
     holding_something = false;
 
@@ -304,7 +312,10 @@ Player::on_ground()
 {
   return ( issolid(base.x + base.width / 2, base.y + base.height) ||
            issolid(base.x + 1, base.y + base.height) ||
-           issolid(base.x + base.width - 1, base.y + base.height)  );
+           issolid(base.x + base.width - 1, base.y + base.height) ||
+          isunisolid(base.x + base.width / 2, base.y + base.height) ||
+          isunisolid(base.x + 1, base.y + base.height) ||
+          isunisolid(base.x + base.width - 1, base.y + base.height) );
 }
 
 bool
@@ -565,7 +576,7 @@ Player::handle_input()
 }
 
 void
-Player::grow()
+Player::grow(bool animate)
 {
   if(size == BIG)
     return;
@@ -574,6 +585,9 @@ Player::grow()
   base.height = 64;
   base.y -= 32;
 
+  if(animate)
+    growing_timer.start((int)((growingtux_left->get_frames() / growingtux_left->get_fps()) * 1000));
+
   old_base = previous_base = base;
 }
 
@@ -655,7 +669,14 @@ Player::draw(Camera& viewport, int layer)
         }
       else
         {
-          if (duck && size != SMALL)
+          if(growing_timer.check())
+            {
+              if (dir == RIGHT)
+                growingtux_right->draw(pos);
+              else 
+                growingtux_left->draw(pos);
+            }
+          else if (duck && size != SMALL)
             {
               if (dir == RIGHT)
                 sprite->duck_right->draw(pos);
@@ -818,6 +839,11 @@ Player::collision(void* p_c_object, int c_object)
       pplatform_c = (FlyingPlatform*) p_c_object;
       
       base.y = pplatform_c->base.y - base.height;
+      physic.set_velocity_x(pplatform_c->get_vel_x());
+      
+      physic.enable_gravity(false);
+      can_jump = true;
+      fall_mode = ON_GROUND;
       break;
 
     default:
@@ -831,6 +857,9 @@ Player::collision(void* p_c_object, int c_object)
 void
 Player::kill(HurtMode mode)
 {
+  if(dying)
+    return;
+  
   play_sound(sounds[SND_HURT], SOUND_CENTER_SPEAKER);
 
   physic.set_velocity_x(0);
@@ -854,32 +883,12 @@ Player::kill(HurtMode mode)
       physic.enable_gravity(true);
       physic.set_acceleration(0, 0);
       physic.set_velocity(0, 7);
-      if(dying != DYING_SQUISHED)
       --player_status.lives;
       dying = DYING_SQUISHED;
+      dying_timer.start(3000);
     }
 }
 
-void
-Player::is_dying()
-{
-  remove_powerups();
-  dying = DYING_NOT;
-}
-
-bool Player::is_dead()
-{
-  float scroll_x =
-    World::current()->camera->get_translation().x;
-  float scroll_y =
-    World::current()->camera->get_translation().y;
-  if(base.y > screen->h + scroll_y || base.y > World::current()->get_level()->height*32 ||
-      base.x < scroll_x - AUTOSCROLL_DEAD_INTERVAL)  // can happen in auto-scrolling
-    return true;
-  else
-    return false;
-}
-
 /* Remove Tux's power ups */
 void
 Player::remove_powerups()
@@ -890,8 +899,15 @@ Player::remove_powerups()
 }
 
 void
-Player::check_bounds(Camera& viewport,
-    bool back_scrolling, bool hor_autoscroll)
+Player::move(const Vector& vector)
+{
+  base.x = vector.x;
+  base.y = vector.y;
+  old_base = previous_base = base;
+}
+
+void
+Player::check_bounds(Camera& viewport)
 {
   /* Keep tux in bounds: */
   if (base.x < 0)
@@ -904,21 +920,27 @@ Player::check_bounds(Camera& viewport,
   if (base.y > World::current()->get_level()->height * /*TILE_HEIGHT*/ 32)
     {
       kill(KILL);
+      return;
     }
 
-  if(base.x < viewport.get_translation().x && (!back_scrolling || hor_autoscroll))  // can happen if back scrolling is disabled
+  bool adjust = false;
+  // can happen if back scrolling is disabled
+  if(base.x < viewport.get_translation().x) {
     base.x = viewport.get_translation().x;
+    adjust = true;
+  }
+  if(base.x >= viewport.get_translation().x + screen->w - base.width) {
+    base.x = viewport.get_translation().x + screen->w - base.width;
+    adjust = true;
+  }
 
-  if(hor_autoscroll)
-    {
-    if(base.x == viewport.get_translation().x)
-      if(issolid(base.x+32, base.y) || (size != SMALL && issolid(base.x+32, base.y+32)))
-        kill(KILL);
-
-    if(base.x + base.width > viewport.get_translation().x + screen->w)
-      base.x = viewport.get_translation().x + screen->w - base.width;
+  if(adjust) {
+    // squished now?
+    if(collision_object_map(base)) {
+      kill(KILL);
+      return;
     }
-    
+  }
 }
 
 // EOF //