//
//
+#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;
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);
}
}
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);
}
}
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);
}
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);
}
}
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);
}
}
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);
+ }
+}
+