converted player to new object system
[supertux.git] / src / special.cpp
index 064ab63..26c30c7 100644 (file)
 #include "sprite_manager.h"
 #include "resources.h"
 
-Sprite* img_bullet;
+Sprite* img_firebullet;
+Sprite* img_icebullet;
 Sprite* img_star;
 Sprite* img_growup;
 Sprite* img_iceflower;
+Sprite* img_fireflower;
 Sprite* img_1up;
 
 #define GROWUP_SPEED 1.0f
@@ -43,7 +45,7 @@ Sprite* img_1up;
 #define BULLET_XM 6
 
 void
-Bullet::init(float x, float y, float xm, Direction dir)
+Bullet::init(float x, float y, float xm, Direction dir, int kind_)
 {
   life_count = 3;
   base.width = 4;
@@ -60,9 +62,10 @@ Bullet::init(float x, float y, float xm, Direction dir)
       base.xm = -BULLET_XM + xm;
     }
 
-  base.y = y;
+  base.y = y + base.height/2;
   base.ym = BULLET_STARTING_YM;
   old_base = base;
+  kind = kind_;
 }
 
 void
@@ -103,11 +106,13 @@ Bullet::action(double frame_ratio)
       life_count -= 1;
     }
 
-  base.ym = base.ym + 0.5 * frame_ratio;
+  if(kind == FIRE_BULLET)
+    base.ym = base.ym + 0.5 * frame_ratio;
+  else if(kind == ICE_BULLET)
+    base.ym = 0;
 
   if (base.x < scroll_x ||
       base.x > scroll_x + screen->w ||
-      base.y < 0 ||
       base.y > screen->h ||
       issolid(base.x + 4, base.y + 2) ||
       issolid(base.x, base.y + 2) ||
@@ -124,7 +129,10 @@ Bullet::draw()
   if (base.x >= scroll_x - base.width &&
       base.x <= scroll_x + screen->w)
     {
-      img_bullet->draw(base.x - scroll_x, base.y);
+      if(kind == FIRE_BULLET)
+        img_firebullet->draw(base.x, base.y);
+      else if(kind == ICE_BULLET)
+        img_icebullet->draw(base.x, base.y);
     }
 }
 
@@ -155,7 +163,7 @@ Upgrade::init(float x_, float y_, Direction dir_, UpgradeKind kind_)
     physic.set_velocity(dir == LEFT ? -1 : 1, 4);
     physic.enable_gravity(true);
     base.height = 32;
-  } else if (kind == UPGRADE_ICEFLOWER) {
+  } else if (kind == UPGRADE_ICEFLOWER || kind == UPGRADE_FIREFLOWER) {
     // nothing
   } else if (kind == UPGRADE_GROWUP) {
     physic.set_velocity(dir == LEFT ? -GROWUP_SPEED : GROWUP_SPEED, 0);
@@ -182,7 +190,8 @@ Upgrade::remove_me()
 void
 Upgrade::action(double frame_ratio)
 {
-  if (kind == UPGRADE_ICEFLOWER || kind == UPGRADE_GROWUP) {
+  if (kind == UPGRADE_ICEFLOWER || kind == UPGRADE_FIREFLOWER
+      || kind == UPGRADE_GROWUP) {
     if (base.height < 32) {
       /* Rise up! */
       base.height = base.height + 0.7 * frame_ratio;
@@ -193,13 +202,10 @@ Upgrade::action(double frame_ratio)
     }
   }
 
-  /* Off screen? Kill it! */
+  /* Away from the screen? Kill it! */
   if(base.x < scroll_x - OFFSCREEN_DISTANCE) {
-    // we don't remove growups for now, when off screen
-    if(kind != UPGRADE_GROWUP) {
       remove_me();
       return;
-    }
   }
   if(base.y > screen->h) {
     remove_me();
@@ -252,11 +258,12 @@ void
 Upgrade::draw()
 {
   SDL_Rect dest;
+
   if (base.height < 32)
     {
       /* Rising up... */
 
-      dest.x = (int)(base.x - scroll_x);
+      dest.x = (int)(base.x);
       dest.y = (int)(base.y + 32 - base.height);
       dest.w = 32;
       dest.h = (int)base.height;
@@ -265,6 +272,8 @@ Upgrade::draw()
         img_growup->draw_part(0,0,dest.x,dest.y,dest.w,dest.h);
       else if (kind == UPGRADE_ICEFLOWER)
         img_iceflower->draw_part(0,0,dest.x,dest.y,dest.w,dest.h);
+      else if (kind == UPGRADE_FIREFLOWER)
+        img_fireflower->draw_part(0,0,dest.x,dest.y,dest.w,dest.h);
       else if (kind == UPGRADE_HERRING)
         img_star->draw_part(0,0,dest.x,dest.y,dest.w,dest.h);
       else if (kind == UPGRADE_1UP)
@@ -275,27 +284,32 @@ Upgrade::draw()
       if (kind == UPGRADE_GROWUP)
         {
           img_growup->draw(
-                       base.x - scroll_x, base.y);
+                       base.x, base.y);
         }
       else if (kind == UPGRADE_ICEFLOWER)
         {
           img_iceflower->draw(
-                       base.x - scroll_x, base.y);
+                       base.x, base.y);
+        }
+      else if (kind == UPGRADE_FIREFLOWER)
+        {
+          img_fireflower->draw(
+                       base.x, base.y);
         }
       else if (kind == UPGRADE_HERRING)
         {
           img_star->draw(
-                       base.x - scroll_x, base.y);
+                       base.x, base.y);
         }
       else if (kind == UPGRADE_1UP)
         {
-          img_1up->draw( base.x - scroll_x, base.y);
+          img_1up->draw( base.x, base.y);
         }
     }
 }
 
 void
-Upgrade::bump(Player* )
+Upgrade::bump(Player* player)
 {
   // these can't be bumped
   if(kind != UPGRADE_GROWUP)
@@ -303,9 +317,14 @@ Upgrade::bump(Player* )
 
   play_sound(sounds[SND_BUMP_UPGRADE], SOUND_CENTER_SPEAKER);
   
+  // determine new direction
+  if (player->base.x + player->base.width/2 > base.x + base.width/2)
+    dir = LEFT;
+  else
+    dir = RIGHT;
+
   // do a little jump and change direction
   physic.set_velocity(-physic.get_velocity_x(), 3);
-  dir = dir == LEFT ? RIGHT : LEFT;
   physic.enable_gravity(true);
 }
 
@@ -334,32 +353,25 @@ Upgrade::collision(void* p_c_object, int c_object, CollisionType type)
       if (kind == UPGRADE_GROWUP)
         {
           play_sound(sounds[SND_EXCELLENT], SOUND_CENTER_SPEAKER);
-          pplayer->size = BIG;
-          pplayer->base.height = 64;
-         pplayer->base.y -= 32;
-         if(collision_object_map(pplayer->base))
-            {
-              pplayer->base.height = 32;
-              pplayer->base.y += 32;
-              pplayer->duck = true;
-            }
+          pplayer->grow();
+        }
+      else if (kind == UPGRADE_FIREFLOWER)
+        {
+          play_sound(sounds[SND_COFFEE], SOUND_CENTER_SPEAKER);
+          pplayer->grow();
+          pplayer->got_power = pplayer->FIRE_POWER;
         }
       else if (kind == UPGRADE_ICEFLOWER)
         {
           play_sound(sounds[SND_COFFEE], SOUND_CENTER_SPEAKER);
-          pplayer->got_coffee = true;
-          if (pplayer->size == SMALL)
-            {
-              pplayer->size = BIG;
-              pplayer->base.height = 64;
-              pplayer->base.y -= 32;
-            }
-         if(collision_object_map(pplayer->base))
-            {
-              pplayer->base.height = 32;
-              pplayer->base.y += 32;
-              pplayer->duck = true;
-            }
+          pplayer->grow();
+          pplayer->got_power = pplayer->ICE_POWER;
+        }
+      else if (kind == UPGRADE_FIREFLOWER)
+        {
+          play_sound(sounds[SND_COFFEE], SOUND_CENTER_SPEAKER);
+          pplayer->grow();
+          pplayer->got_power = pplayer->FIRE_POWER;
         }
       else if (kind == UPGRADE_HERRING)
         {
@@ -384,10 +396,12 @@ void load_special_gfx()
 {
   img_growup    = sprite_manager->load("egg");
   img_iceflower = sprite_manager->load("iceflower");
+  img_fireflower = sprite_manager->load("fireflower");
   img_star      = sprite_manager->load("star");
   img_1up       = sprite_manager->load("1up");
 
-  img_bullet    = sprite_manager->load("bullet");
+  img_firebullet    = sprite_manager->load("firebullet");
+  img_icebullet    = sprite_manager->load("icebullet");
 }
 
 void free_special_gfx()