moved savelevel() code to level.h/c where it belongs to. :)
[supertux.git] / src / scene.c
index a8f77ee..40dedc0 100644 (file)
 //
 //
 
+#include <stdlib.h>
 #include "scene.h"
 
-void set_defaults(void)
+/* Initialize all 'dynamic' arrays */
+void arrays_init(void)
 {
-  int i;
-
-  /* Reset arrays: */
-
-  for (i = 0; i < NUM_BOUNCY_DISTROS; i++)
-    bouncy_distros[i].alive = NO;
-
-  for (i = 0; i < NUM_BROKEN_BRICKS; i++)
-    broken_bricks[i].alive = NO;
-
-  for (i = 0; i < NUM_BOUNCY_BRICKS; i++)
-    bouncy_bricks[i].alive = NO;
-
-  for (i = 0; i < NUM_BAD_GUYS; i++)
-  {
-    /*bad_guys[i].alive = NO;*/
-    badguy_init(&bad_guys[i]);
-    }
-  for (i = 0; i < NUM_FLOATING_SCORES; i++)
-    floating_scores[i].alive = NO;
-
-  for (i = 0; i < NUM_UPGRADES; i++)
-  {
-    /*upgrades[i].alive = NO;*/
-    upgrade_init(&upgrades[i]);
-    }
-
-  for (i = 0; i < NUM_BULLETS; i++)
-  {
-    /*bullets[i].alive = NO;*/
-    bullet_init(&bullets[i]);
-    }
+num_bad_guys = 0;
+num_bouncy_distros = 0;
+num_broken_bricks = 0;
+num_bouncy_bricks = 0;
+num_floating_scores = 0;
+num_upgrades = 0;
+num_bullets = 0;
+bad_guys = NULL;
+bouncy_distros = NULL;
+broken_bricks = NULL;
+bouncy_bricks = NULL;
+floating_scores = NULL;
+upgrades = NULL;
+bullets = NULL;
+}
 
+/* Free memory of 'dynamic' arrays */
+void arrays_free(void)
+{
+free(bad_guys);
+free(bouncy_distros);
+free(broken_bricks);
+free(bouncy_bricks);
+free(floating_scores);
+free(upgrades);
+free(bullets);
+}
 
+void set_defaults(void)
+{
   /* Set defaults: */
   
   scroll_x = 0;
 
   score_multiplier = 1;
-  super_bkgd_time = 0;
+  timer_init(&super_bkgd_timer);
 
   counting_distros = NO;
   distro_counter = 0;
@@ -81,16 +78,23 @@ void add_score(int x, int y, int s)
 
   found = -1;
 
-  for (i = 0; i < NUM_FLOATING_SCORES && found == -1; i++)
+  for (i = 0; i < num_floating_scores && found == -1; i++)
     {
-      if (!floating_scores[i].alive)
+      if (!floating_scores[i].base.alive)
         found = i;
     }
-
+    
+  if (found == -1)
+  {
+  ++num_floating_scores;
+  floating_scores = realloc(floating_scores,num_floating_scores*sizeof(floating_score_type));
+  floating_score_init(&floating_scores[num_floating_scores-1],x,y,s);
+  found = -1;
+  }
 
   if (found != -1)
     {
-       floating_score_init(&floating_scores[i],x,y,s);
+       floating_score_init(&floating_scores[found],x,y,s);
     }
 }
 
@@ -102,18 +106,22 @@ void add_bouncy_distro(float x, float y)
 
   found = -1;
 
-  for (i = 0; i < NUM_BOUNCY_DISTROS && found == -1; i++)
+  for (i = 0; i < num_bouncy_distros && found == -1; i++)
     {
-      if (!bouncy_distros[i].alive)
+      if (!bouncy_distros[i].base.alive)
         found = i;
     }
-
+    
+  if (found == -1)
+  {
+  ++num_bouncy_distros;
+  bouncy_distros = realloc(bouncy_distros,num_bouncy_distros*sizeof(bouncy_distro_type));
+  found = num_bouncy_distros - 1;
+  }
+    
   if (found != -1)
     {
-      bouncy_distros[found].alive = YES;
-      bouncy_distros[found].x = x;
-      bouncy_distros[found].y = y;
-      bouncy_distros[found].ym = -6;
+       bouncy_distro_init(&bouncy_distros[found],x,y);
     }
 }
 
@@ -122,11 +130,11 @@ void add_bouncy_distro(float x, float y)
 
 void add_broken_brick(float x, float y)
 {
-  add_broken_brick_piece(x, y, -4, -16);
-  add_broken_brick_piece(x, y + 16, -6, -12);
+  add_broken_brick_piece(x, y, -1, -4);
+  add_broken_brick_piece(x, y + 16, -1.5, -3);
 
-  add_broken_brick_piece(x + 16, y, 4, -16);
-  add_broken_brick_piece(x + 16, y + 16, 6, -12);
+  add_broken_brick_piece(x + 16, y, 1, -4);
+  add_broken_brick_piece(x + 16, y + 16, 1.5, -3);
 }
 
 
@@ -138,19 +146,22 @@ void add_broken_brick_piece(float x, float y, float xm, float ym)
 
   found = -1;
 
-  for (i = 0; i < NUM_BROKEN_BRICKS && found == -1; i++)
+  for (i = 0; i < num_broken_bricks && found == -1; i++)
     {
-      if (!broken_bricks[i].alive)
+      if (!broken_bricks[i].base.alive)
         found = i;
     }
 
+  if (found == -1)
+  {
+  ++num_broken_bricks;
+  broken_bricks = realloc(broken_bricks,num_broken_bricks*sizeof(broken_brick_type));
+  found = num_broken_bricks - 1;
+  }
+
   if (found != -1)
     {
-      broken_bricks[found].alive = YES;
-      broken_bricks[found].x = x;
-      broken_bricks[found].y = y;
-      broken_bricks[found].xm = xm;
-      broken_bricks[found].ym = ym;
+       broken_brick_init(&broken_bricks[found], x, y, xm, ym);
     }
 }
 
@@ -163,20 +174,22 @@ void add_bouncy_brick(float x, float y)
 
   found = -1;
 
-  for (i = 0; i < NUM_BOUNCY_BRICKS && found == -1; i++)
+  for (i = 0; i < num_bouncy_bricks && found == -1; i++)
     {
-      if (!bouncy_bricks[i].alive)
+      if (!bouncy_bricks[i].base.alive)
         found = i;
     }
+    
+  if (found == -1)
+  {
+  ++num_bouncy_bricks;
+  bouncy_bricks = realloc(bouncy_bricks,num_bouncy_bricks*sizeof(bouncy_brick_type));
+  found = num_bouncy_bricks - 1;
+  }
 
   if (found != -1)
     {
-      bouncy_bricks[found].alive = YES;
-      bouncy_bricks[found].x = x;
-      bouncy_bricks[found].y = y;
-      bouncy_bricks[found].offset = 0;
-      bouncy_bricks[found].offset_m = -BOUNCY_BRICK_SPEED;
-      bouncy_bricks[found].shape = shape(x, y);
+      bouncy_brick_init(&bouncy_bricks[found],x,y);
     }
 }
 
@@ -189,24 +202,78 @@ void add_bad_guy(float x, float y, int kind)
 
   found = -1;
 
-  for (i = 0; i < NUM_BAD_GUYS && found == -1; i++)
+  for (i = 0; i < num_bad_guys && found == -1; i++)
+    {
+      if (!bad_guys[i].base.alive)
+        found = i;
+    }
+  if (found == -1)
+  {
+  ++num_bad_guys;
+  bad_guys = realloc(bad_guys,num_bad_guys*sizeof(bad_guy_type));
+  found = num_bad_guys - 1;
+  }
+
+  if (found != -1)
+    {
+       badguy_init(&bad_guys[found], x, y, kind);
+    }
+}
+
+/* Add an upgrade: */
+
+void add_upgrade(float x, float y, int kind)
+{
+  int i, found;
+
+  found = -1;
+
+  for (i = 0; i < num_upgrades && found == -1; i++)
     {
-      if (!bad_guys[i].alive)
+      if (!upgrades[i].base.alive)
         found = i;
     }
 
+  if (found == -1)
+  {
+  ++num_upgrades;
+  upgrades = realloc(upgrades,num_upgrades*sizeof(upgrade_type));
+  found = num_upgrades - 1;
+  }
+
   if (found != -1)
     {
-      bad_guys[found].alive = YES;
-      bad_guys[found].mode = NORMAL;
-      bad_guys[found].dying = NO;
-      bad_guys[found].kind = kind;
-      bad_guys[found].x = x;
-      bad_guys[found].y = y;
-      bad_guys[found].xm = 1.3;
-      bad_guys[found].ym = 1.5;
-      bad_guys[found].dir = LEFT;
-      bad_guys[found].seen = NO;
-      timer_init(&bad_guys[found].timer);
+      upgrade_init(&upgrades[found], x, y, kind);
     }
 }
+
+/* Add a bullet: */
+
+void add_bullet(float x, float y, float xm, int dir)
+{
+  int i, found;
+  
+  found = -1;
+
+  for (i = 0; i < num_bullets && found == -1; i++)
+    {
+      if (!bullets[i].base.alive)
+        found = i;
+    }
+
+  if (found == -1)
+  {
+  ++num_bullets;
+  bullets = realloc(bullets,num_bullets*sizeof(bullet_type));
+  found = num_bullets - 1;
+  }
+
+  if (found != -1)
+    {
+      bullet_init(&bullets[found], x, y, xm, dir);
+
+      play_sound(sounds[SND_SHOOT], SOUND_CENTER_SPEAKER);
+    }
+}
+