- moved the global_world into the leveleditors namespace
[supertux.git] / src / world.cpp
index 1cfac5e..cd187e5 100644 (file)
 #include "world.h"
 #include "level.h"
 #include "tile.h"
+#include "resources.h"
 
 texture_type img_distro[4];
 
 World* World::current_ = 0;
 
-World world;
-
 World::World()
 {
   // FIXME: Move this to action and draw and everywhere else where the
@@ -41,6 +40,7 @@ World::World()
   current_ = this;
 
   level = new Level;
+  tux.init();
 }
 
 World::~World()
@@ -54,20 +54,17 @@ World::set_defaults()
   // Set defaults: 
   scroll_x = 0;
 
-  score_multiplier = 1;
-  timer_init(&super_bkgd_timer, true);
+  player_status.score_multiplier = 1;
 
   counting_distros = false;
   distro_counter = 0;
 
-  endpos = 0;
-
   /* set current song/music */
   set_current_music(LEVEL_MUSIC);
 }
 
 int
-World::load(const char* subset, int level_nr)
+World::load(const std::string& subset, int level_nr)
 {
   return level->load(subset, level_nr);
 }
@@ -128,24 +125,18 @@ World::draw()
 {
   int y,x;
 
-  /* Draw screen: */
-  if(timer_check(&super_bkgd_timer))
-    texture_draw(&img_super_bkgd, 0, 0);
+  /* Draw the real background */
+  if(get_level()->bkgd_image[0] != '\0')
+    {
+      int s = (int)scroll_x / 30;
+      texture_draw_part(&level->img_bkgd, s, 0,0,0,level->img_bkgd.w - s, level->img_bkgd.h);
+      texture_draw_part(&level->img_bkgd, 0, 0,screen->w - s ,0,s,level->img_bkgd.h);
+    }
   else
     {
-      /* Draw the real background */
-      if(get_level()->bkgd_image[0] != '\0')
-        {
-          int s = (int)scroll_x / 30;
-          texture_draw_part(&level->img_bkgd, s, 0,0,0,level->img_bkgd.w - s, level->img_bkgd.h);
-          texture_draw_part(&level->img_bkgd, 0, 0,screen->w - s ,0,s,level->img_bkgd.h);
-        }
-      else
-        {
-          clearscreen(level->bkgd_red, level->bkgd_green, level->bkgd_blue);
-        }
+      clearscreen(level->bkgd_red, level->bkgd_green, level->bkgd_blue);
     }
-
+    
   /* Draw particle systems (background) */
   std::vector<ParticleSystem*>::iterator p;
   for(p = particle_systems.begin(); p != particle_systems.end(); ++p)
@@ -183,13 +174,13 @@ World::draw()
   tux.draw();
 
   for (unsigned int i = 0; i < bullets.size(); ++i)
-    bullet_draw(&bullets[i]);
+    bullets[i].draw();
 
   for (unsigned int i = 0; i < floating_scores.size(); ++i)
     floating_scores[i].draw();
 
   for (unsigned int i = 0; i < upgrades.size(); ++i)
-    upgrade_draw(&upgrades[i]);
+    upgrades[i].draw();
 
   for (unsigned int i = 0; i < bouncy_distros.size(); ++i)
     bouncy_distros[i].draw();
@@ -215,15 +206,15 @@ World::draw()
 }
 
 void
-World::action()
+World::action(double frame_ratio)
 {
   /* Handle bouncy distros: */
   for (unsigned int i = 0; i < bouncy_distros.size(); i++)
-    bouncy_distros[i].action();
+    bouncy_distros[i].action(frame_ratio);
 
   /* Handle broken bricks: */
   for (unsigned int i = 0; i < broken_bricks.size(); i++)
-    broken_bricks[i].action();
+    broken_bricks[i].action(frame_ratio);
 
   /* Handle distro counting: */
   if (counting_distros)
@@ -236,19 +227,19 @@ World::action()
 
   // Handle all kinds of game objects
   for (unsigned int i = 0; i < bouncy_bricks.size(); i++)
-    bouncy_bricks[i].action();
+    bouncy_bricks[i].action(frame_ratio);
   
   for (unsigned int i = 0; i < floating_scores.size(); i++)
-    floating_scores[i].action();
+    floating_scores[i].action(frame_ratio);
 
   for (unsigned int i = 0; i < bullets.size(); ++i)
-    bullet_action(&bullets[i]);
+    bullets[i].action(frame_ratio);
   
   for (unsigned int i = 0; i < upgrades.size(); i++)
-    upgrade_action(&upgrades[i]);
+    upgrades[i].action(frame_ratio);
 
   for (unsigned int i = 0; i < bad_guys.size(); i++)
-    bad_guys[i].action();
+    bad_guys[i].action(frame_ratio);
 
   /* update particle systems */
   std::vector<ParticleSystem*>::iterator p;
@@ -279,7 +270,7 @@ World::collision_handler()
               // collide with bad_guy first, since bullet_collision will
               // delete the bullet
               bad_guys[j].collision(0, CO_BULLET);
-              bullet_collision(&bullets[i], CO_BADGUY);
+              bullets[i].collision(CO_BADGUY);
               break; // bullet is invalid now, so break
             }
         }
@@ -338,7 +329,7 @@ World::collision_handler()
         {
           // We have detected a collision and now call the collision
           // functions of the collided objects.
-          upgrade_collision(&upgrades[i], &tux, CO_PLAYER);
+          upgrades[i].collision(&tux, CO_PLAYER);
         }
     }
 }
@@ -346,7 +337,7 @@ World::collision_handler()
 void
 World::add_score(float x, float y, int s)
 {
-  score += s;
+  player_status.score += s;
 
   FloatingScore new_floating_score;
   new_floating_score.init(x,y,s);
@@ -399,16 +390,16 @@ World::add_bad_guy(float x, float y, BadGuyKind kind)
 void
 World::add_upgrade(float x, float y, int dir, int kind)
 {
-  upgrade_type new_upgrade;
-  upgrade_init(&new_upgrade,x,y,dir,kind);
+  Upgrade new_upgrade;
+  new_upgrade.init(x,y,dir,kind);
   upgrades.push_back(new_upgrade);
 }
 
 void 
 World::add_bullet(float x, float y, float xm, int dir)
 {
-  bullet_type new_bullet;
-  bullet_init(&new_bullet,x,y,xm,dir);
+  Bullet new_bullet;
+  new_bullet.init(x,y,xm,dir);
   bullets.push_back(new_bullet);
   
   play_sound(sounds[SND_SHOOT], SOUND_CENTER_SPEAKER);
@@ -439,8 +430,8 @@ World::trybreakbrick(float x, float y, bool small)
             plevel->change(x, y, TM_IA, tile->next_tile);
 
           play_sound(sounds[SND_DISTRO], SOUND_CENTER_SPEAKER);
-          score = score + SCORE_DISTRO;
-          distros++;
+          player_status.score = player_status.score + SCORE_DISTRO;
+          player_status.distros++;
         }
       else if (!small)
         {
@@ -454,7 +445,7 @@ World::trybreakbrick(float x, float y, bool small)
           
           /* Get some score: */
           play_sound(sounds[SND_BRICK], SOUND_CENTER_SPEAKER);
-          score = score + SCORE_BRICK;
+          player_status.score = player_status.score + SCORE_BRICK;
         }
     }
 }
@@ -478,8 +469,8 @@ World::tryemptybox(float x, float y, int col_side)
     case 1: // Box with a distro!
       add_bouncy_distro(((int)(x + 1) / 32) * 32, (int)(y / 32) * 32 - 32);
       play_sound(sounds[SND_DISTRO], SOUND_CENTER_SPEAKER);
-      score = score + SCORE_DISTRO;
-      distros++;
+      player_status.score = player_status.score + SCORE_DISTRO;
+      player_status.distros++;
       break;
 
     case 2: // Add an upgrade!
@@ -517,8 +508,8 @@ World::trygrabdistro(float x, float y, int bounciness)
                                   (int)(y / 32) * 32);
         }
 
-      score = score + SCORE_DISTRO;
-      distros++;
+      player_status.score = player_status.score + SCORE_DISTRO;
+      player_status.distros++;
     }
 }