- commited MatzeB's update patch
authorIngo Ruhnke <grumbel@gmx.de>
Mon, 12 Apr 2004 18:57:37 +0000 (18:57 +0000)
committerIngo Ruhnke <grumbel@gmx.de>
Mon, 12 Apr 2004 18:57:37 +0000 (18:57 +0000)
SVN-Revision: 506

src/badguy.cpp
src/resources.cpp
src/resources.h
src/special.cpp
src/special.h
src/world.cpp

index 1975cdf..c1a2ddf 100644 (file)
@@ -233,7 +233,8 @@ BadGuy::action_laptop(float frame_ratio)
 {
   Player& tux = *World::current()->get_tux();
 
-  fall();
+  if(dying == DYING_NOT)
+    fall();
   
   /* Move left/right: */
   if (mode == NORMAL || mode == KICK)
index b02fe49..f4b6340 100644 (file)
@@ -15,8 +15,6 @@ texture_type img_cloud[2][4];
 
 texture_type img_box_full;
 texture_type img_box_empty;
-texture_type img_mints;
-texture_type img_coffee;
 texture_type img_red_glow;
 
 /* Load graphics/sounds shared between all levels: */
@@ -244,20 +242,12 @@ void loadshared()
   load_badguy_gfx();
 
   /* Upgrades: */
-
-  texture_load(&img_mints, datadir + "/images/shared/mints.png", USE_ALPHA);
-  texture_load(&img_coffee, datadir + "/images/shared/coffee.png", USE_ALPHA);
-
+  load_special_gfx();
 
   /* Weapons: */
-
-  texture_load(&img_bullet, datadir + "/images/shared/bullet.png", USE_ALPHA);
-
   texture_load(&img_red_glow, datadir + "/images/shared/red-glow.png",
                USE_ALPHA);
 
-
-
   /* Distros: */
   texture_load(&img_distro[0], datadir + "/images/shared/distro-0.png",
                USE_ALPHA);
@@ -277,12 +267,6 @@ void loadshared()
   texture_load(&tux_life, datadir + "/images/shared/tux-life.png",
                USE_ALPHA);
 
-  /* Herring: */
-
-  texture_load(&img_golden_herring, datadir + "/images/shared/golden-herring.png",
-               USE_ALPHA);
-
-
   /* Sound effects: */
 
   /* if (use_sound) // this will introduce SERIOUS bugs here ! because "load_sound"
@@ -305,6 +289,8 @@ void unloadshared(void)
 {
   int i;
 
+  free_special_gfx();
+
   for (i = 0; i < 3; i++)
     {
       texture_free(&tux_right[i]);
@@ -345,9 +331,6 @@ void unloadshared(void)
   for (i = 0; i < 2; i++)
     texture_free(&img_flag[i]);
 
-  texture_free(&img_mints);
-  texture_free(&img_coffee);
-
   for (i = 0; i < 4; i++)
     {
       texture_free(&img_distro[i]);
@@ -355,8 +338,6 @@ void unloadshared(void)
       texture_free(&img_cloud[1][i]);
     }
 
-  texture_free(&img_golden_herring);
-
   for (i = 0; i < NUM_SOUNDS; i++)
     free_chunk(sounds[i]);
 
index 33c6719..e82b077 100644 (file)
@@ -10,8 +10,6 @@ extern texture_type img_cloud[2][4];
 
 extern texture_type img_box_full;
 extern texture_type img_box_empty;
-extern texture_type img_mints;
-extern texture_type img_coffee;
 extern texture_type img_super_bkgd;
 extern texture_type img_red_glow;
 
index 59c6d6e..9adb971 100644 (file)
@@ -10,6 +10,7 @@
 //
 //
 
+#include <assert.h>
 #include "SDL.h"
 #include "defines.h"
 #include "special.h"
 
 texture_type img_bullet;
 texture_type img_golden_herring;
-bitmask* bm_bullet;
-
-void create_special_bitmasks()
-{
-  bm_bullet = bitmask_create_SDL(img_bullet.sdl_surface);
-}
+texture_type img_growup;
+texture_type img_iceflower;
+texture_type img_1up;
 
 void
 Bullet::init(float x, float y, float xm, int dir)
@@ -53,6 +51,21 @@ Bullet::init(float x, float y, float xm, int dir)
 }
 
 void
+Bullet::remove_me()
+{
+  std::vector<Bullet>& bullets = World::current()->bullets;
+  for(std::vector<Bullet>::iterator i = bullets.begin();
+         i != bullets.end(); ++i) {
+    if( & (*i) == this) {
+      bullets.erase(i);
+      return;
+    }
+  }
+
+  assert(false);
+}
+
+void
 Bullet::action(double frame_ratio)
 {
   base.x = base.x + base.xm * frame_ratio;
@@ -75,7 +88,7 @@ Bullet::action(double frame_ratio)
       issolid(base.x + 4, base.y + 2) ||
       issolid(base.x, base.y + 2))
     {
-      World::current()->bullets.erase(static_cast<std::vector<Bullet>::iterator>(this));
+      remove_me();
     }
 
 }
@@ -95,101 +108,112 @@ void
 Bullet::collision(int c_object)
 {
   if(c_object == CO_BADGUY) {
-    std::vector<Bullet>::iterator i;
-    
-    for(i = World::current()->bullets.begin(); i != World::current()->bullets.end(); ++i) 
-      {
-        if(&(*i) == this) 
-          {
-            World::current()->bullets.erase(i);
-            return;
-          }
-      }
+    remove_me();
   }
 }
 
 void
 Upgrade::init(float x_, float y_, int dir_, int kind_)
 {
+  kind = kind_;
+  dir = dir_;
+
   base.width = 32;
   base.height = 0;
-  kind = kind_;
   base.x = x_;
   base.y = y_;
+  old_base = base;
 
-  if(dir_ == LEFT)
-    base.xm = -2;
-  else
-    base.xm = 2;
+  physic.reset();
+  physic.enable_gravity(false);
+
+  if(kind == UPGRADE_1UP || kind == UPGRADE_HERRING) {
+    physic.set_velocity(dir == LEFT ? -1 : 1, 4);
+    physic.enable_gravity(true);
+    base.height = 32;
+  } else if (kind == UPGRADE_ICEFLOWER) {
+    // nothing
+  } else {
+    physic.set_velocity(dir == LEFT ? -2 : 2, 0);
+  }
+}
 
-  base.ym = -2;
-  base.height = 0;
-  old_base = base;
+void
+Upgrade::remove_me()
+{
+  std::vector<Upgrade>& upgrades = World::current()->upgrades;
+  for(std::vector<Upgrade>::iterator i = upgrades.begin();
+         i != upgrades.end(); ++i) {
+    if( & (*i) == this) {
+      upgrades.erase(i);
+      return;
+    }
+  }
+
+  assert(false);
 }
 
 void
 Upgrade::action(double frame_ratio)
 {
-  if (base.height < 32)
-    {
+  if (kind == UPGRADE_ICEFLOWER || kind == UPGRADE_GROWUP) {
+    if (base.height < 32) {
       /* Rise up! */
-
       base.height = base.height + 0.7 * frame_ratio;
       if(base.height > 32)
         base.height = 32;
-    }
-  else
-    {
-      /* Move around? */
 
-      if (kind == UPGRADE_MINTS ||
-          kind == UPGRADE_HERRING)
-        {
-          base.x = base.x + base.xm * frame_ratio;
-          base.y = base.y + base.ym * frame_ratio;
-
-          collision_swept_object_map(&old_base,&base);
-
-          /* Off the screen?  Kill it! */
+      return;
+    }
+  }
 
-          if (base.x < scroll_x - base.width)
-            World::current()->upgrades.erase(static_cast<std::vector<Upgrade>::iterator>(this));
-          if (base.y > screen->h)
-            World::current()->upgrades.erase(static_cast<std::vector<Upgrade>::iterator>(this));
+  /* Off screen? Kill it! */
+  if(base.x < scroll_x - base.width || base.y > screen->h) {
+    remove_me();
+    return;
+  }
 
-          if (issolid(base.x + 1, base.y + 32.) ||
-              issolid(base.x + 31., base.y + 32.))
-            {
-              if (base.ym > 0)
-                {
-                  if (kind == UPGRADE_MINTS)
-                    {
-                      base.ym = 0;
-                    }
-                  else if (kind == UPGRADE_HERRING)
-                    {
-                      base.ym = -8;
-                    }
-
-                  base.y = (int)(base.y / 32) * 32;
-                }
-            }
-          else
-            base.ym = base.ym + GRAVITY * frame_ratio;
+  /* Move around? */
+  physic.apply(frame_ratio, base.x, base.y);
+  if(kind == UPGRADE_GROWUP) {
+    collision_swept_object_map(&old_base, &base);
+  }
 
-          if (issolid(base.x - 1, (int) base.y))
-            {
-              if(base.xm < 0)
-                base.xm = -base.xm;
-            }
-          else if (issolid(base.x + base.width, (int) base.y))
-            {
-              if(base.xm > 0)
-                base.xm = -base.xm;
-            }
+  // fall down?
+  if(kind == UPGRADE_GROWUP || kind == UPGRADE_HERRING) {
+    // falling?
+    if(physic.get_velocity_y() != 0) {
+      if(issolid(base.x, base.y + base.height)) {
+        base.y = int(base.y / 32) * 32;
+        old_base = base;                         
+        if(kind == UPGRADE_GROWUP) {
+          physic.enable_gravity(false);
+          physic.set_velocity(dir == LEFT ? -2 : 2, 0);
+        } else if(kind == UPGRADE_HERRING) {
+          physic.set_velocity(dir == LEFT ? -2 : 2, 3);
         }
+      }
+    } else {
+      if((physic.get_velocity_x() < 0
+            && !issolid(base.x+base.width, base.y + base.height))
+        || (physic.get_velocity_x() > 0
+            && !issolid(base.x, base.y + base.height))) {
+        physic.enable_gravity(true);
+        physic.set_velocity(0, physic.get_velocity_y());
+      }
+    }
+  }
 
+  // horizontal bounce?
+  if(kind == UPGRADE_GROWUP || kind == UPGRADE_HERRING) {
+    if (  (physic.get_velocity_x() < 0
+          && issolid(base.x, (int) base.y + base.height/2)) 
+        ||  (physic.get_velocity_x() > 0
+          && issolid(base.x + base.width, (int) base.y + base.height/2))) {
+        physic.set_velocity(-physic.get_velocity_x(),physic.get_velocity_y());
+        dir = dir == LEFT ? RIGHT : LEFT;
     }
+  }
 }
 
 void
@@ -205,23 +229,25 @@ Upgrade::draw()
       dest.w = 32;
       dest.h = (int)base.height;
 
-      if (kind == UPGRADE_MINTS)
-        texture_draw_part(&img_mints,0,0,dest.x,dest.y,dest.w,dest.h);
-      else if (kind == UPGRADE_COFFEE)
-        texture_draw_part(&img_coffee,0,0,dest.x,dest.y,dest.w,dest.h);
+      if (kind == UPGRADE_GROWUP)
+        texture_draw_part(&img_growup,0,0,dest.x,dest.y,dest.w,dest.h);
+      else if (kind == UPGRADE_ICEFLOWER)
+        texture_draw_part(&img_iceflower,0,0,dest.x,dest.y,dest.w,dest.h);
       else if (kind == UPGRADE_HERRING)
         texture_draw_part(&img_golden_herring,0,0,dest.x,dest.y,dest.w,dest.h);
+      else if (kind == UPGRADE_1UP)
+        texture_draw_part(&img_1up, 0, 0, dest.x, dest.y, dest.w, dest.h);
     }
   else
     {
-      if (kind == UPGRADE_MINTS)
+      if (kind == UPGRADE_GROWUP)
         {
-          texture_draw(&img_mints,
+          texture_draw(&img_growup,
                        base.x - scroll_x, base.y);
         }
-      else if (kind == UPGRADE_COFFEE)
+      else if (kind == UPGRADE_ICEFLOWER)
         {
-          texture_draw(&img_coffee,
+          texture_draw(&img_iceflower,
                        base.x - scroll_x, base.y);
         }
       else if (kind == UPGRADE_HERRING)
@@ -229,6 +255,10 @@ Upgrade::draw()
           texture_draw(&img_golden_herring,
                        base.x - scroll_x, base.y);
         }
+      else if (kind == UPGRADE_1UP)
+        {
+          texture_draw(&img_1up, base.x - scroll_x, base.y);
+        }
     }
 }
 
@@ -245,11 +275,9 @@ Upgrade::collision(void* p_c_object, int c_object)
       /* p_c_object is CO_PLAYER, so assign it to pplayer */
       pplayer = (Player*) p_c_object;
 
-      World::current()->upgrades.erase(static_cast<std::vector<Upgrade>::iterator>(this));
-
       /* Affect the player: */
 
-      if (kind == UPGRADE_MINTS)
+      if (kind == UPGRADE_GROWUP)
         {
           play_sound(sounds[SND_EXCELLENT], SOUND_CENTER_SPEAKER);
           pplayer->size = BIG;
@@ -262,7 +290,7 @@ Upgrade::collision(void* p_c_object, int c_object)
               pplayer->duck = true;
             }
         }
-      else if (kind == UPGRADE_COFFEE)
+      else if (kind == UPGRADE_ICEFLOWER)
         {
           play_sound(sounds[SND_COFFEE], SOUND_CENTER_SPEAKER);
           pplayer->got_coffee = true;
@@ -278,7 +306,39 @@ Upgrade::collision(void* p_c_object, int c_object)
               play_current_music();
             }
         }
-      break;
+      else if (kind == UPGRADE_1UP)
+        {
+          if(pplayer->lives < MAX_LIVES) {
+            pplayer->lives++;
+            play_sound(sounds[SND_LIFEUP], SOUND_CENTER_SPEAKER);
+          }
+        }
+
+      remove_me();
+      return;
     }
 }
 
+void load_special_gfx()
+{
+    texture_load(&img_growup, datadir + "/images/shared/egg.png", USE_ALPHA);
+    texture_load(&img_iceflower, datadir + "/images/shared/iceflower.png",
+            USE_ALPHA);
+    texture_load(&img_golden_herring, datadir +
+            "/images/shared/star.png", USE_ALPHA);
+    texture_load(&img_1up, datadir + "/images/shared/1up.png",
+            USE_ALPHA);
+
+    texture_load(&img_bullet, datadir + "/images/shared/bullet.png",
+            USE_ALPHA);
+}
+
+void free_special_gfx()
+{
+    texture_free(&img_growup);
+    texture_free(&img_iceflower);
+    texture_free(&img_1up);
+    texture_free(&img_golden_herring);
+    texture_free(&img_bullet);
+}
+
index fe68107..dfec8a4 100644 (file)
 #include "texture.h"
 #include "collision.h"
 #include "player.h"
+#include "physic.h"
 
 /* Upgrade types: */
 
 enum {
-  UPGRADE_MINTS,
-  UPGRADE_COFFEE,
-  UPGRADE_HERRING
+  UPGRADE_GROWUP,
+  UPGRADE_ICEFLOWER,
+  UPGRADE_HERRING,
+  UPGRADE_1UP
 };
 
+void load_special_gfx();
+void free_special_gfx();
+
 class Upgrade
 {
- public:
+public:
   int kind;
+  int dir;
   base_type base;
   base_type old_base;
+  Physic physic;
 
   void init(float x, float y, int dir, int kind);
   void action(double frame_ratio);
   void draw();
   void collision(void* p_c_object, int c_object);
+
+private:
+  /** removes the Upgrade from the global upgrade list. Note that after this
+   * call the class doesn't exist anymore! So don't use any member variables
+   * anymore then
+   */
+  void remove_me();
 };
 
 class Bullet
@@ -54,13 +68,13 @@ class Bullet
   void action(double frame_ratio);
   void draw();
   void collision(int c_object);
-};
 
-extern texture_type img_bullet;
-extern bitmask* bm_bullet;
-
-void create_special_bitmasks();
-
-extern texture_type img_golden_herring;
+private:
+  /** removes the Upgrade from the global upgrade list. Note that after this
+   * call the class doesn't exist anymore! So don't use any member variables
+   * anymore then
+   */
+  void remove_me();
+};
 
 #endif /*SUPERTUX_SPECIAL_H*/
index f2a64b5..e9d44cc 100644 (file)
@@ -465,10 +465,12 @@ World::tryemptybox(float x, float y, int col_side)
   else
     col_side = LEFT;
 
+  int posx = ((int)(x+1) / 32) * 32;
+  int posy = (int)(y/32) * 32 - 32;
   switch(tile->data)
     {
     case 1: // Box with a distro!
-      add_bouncy_distro(((int)(x + 1) / 32) * 32, (int)(y / 32) * 32 - 32);
+      add_bouncy_distro(posx, posy);
       play_sound(sounds[SND_DISTRO], SOUND_CENTER_SPEAKER);
       player_status.score = player_status.score + SCORE_DISTRO;
       player_status.distros++;
@@ -476,14 +478,18 @@ World::tryemptybox(float x, float y, int col_side)
 
     case 2: // Add an upgrade!
       if (tux.size == SMALL)     /* Tux is small, add mints! */
-        add_upgrade((int)((x + 1) / 32) * 32, (int)(y / 32) * 32 - 32, col_side, UPGRADE_MINTS);
-      else     /* Tux is big, add coffee: */
-        add_upgrade((int)((x + 1) / 32) * 32, (int)(y / 32) * 32 - 32, col_side, UPGRADE_COFFEE);
+        add_upgrade(posx, posy, col_side, UPGRADE_GROWUP);
+      else     /* Tux is big, add an iceflower: */
+        add_upgrade(posx, posy, col_side, UPGRADE_ICEFLOWER);
       play_sound(sounds[SND_UPGRADE], SOUND_CENTER_SPEAKER);
       break;
 
     case 3: // Add a golden herring
-      add_upgrade((int)((x + 1) / 32) * 32, (int)(y / 32) * 32 - 32, col_side, UPGRADE_HERRING);
+      add_upgrade(posx, posy, col_side, UPGRADE_HERRING);
+      break;
+
+    case 4: // Add a 1up extra
+      add_upgrade(posx, posy, col_side, UPGRADE_1UP);
       break;
     default:
       break;