summaryrefslogtreecommitdiff
path: root/src/ei
diff options
context:
space:
mode:
Diffstat (limited to 'src/ei')
-rw-r--r--src/ei/ei.c89
1 files changed, 49 insertions, 40 deletions
diff --git a/src/ei/ei.c b/src/ei/ei.c
index 665ebf0..4fb19c4 100644
--- a/src/ei/ei.c
+++ b/src/ei/ei.c
@@ -536,43 +536,63 @@ ei_game_update_status(struct ei_game *game)
snprintf(game->status_sprite, sizeof(game->status_sprite),
EI_STATUS_SPRITE_FORMAT, game->score, game->nr_lives);
+
+ eetg_object_update(&game->status);
}
static void
-ei_game_prepare(struct ei_game *game)
+ei_game_prepare(struct ei_game *game, bool score_reset)
{
assert(game);
eetg_world_clear(&game->world);
+ if (score_reset) {
+ game->score = 0;
+ }
+
game->state = EI_STATE_PREPARED;
}
static void
-ei_game_start(struct ei_game *game)
+ei_game_reset(struct ei_game *game)
{
assert(game);
eetg_world_clear(&game->world);
- eetg_world_add(&game->world, &game->player, 37, 23, 0);
-
- ei_game_add_bunkers(game);
- ei_game_add_aliens(game);
-
- eetg_world_add(&game->world, &game->status, 26, 0, 0);
-
+ game->sync_counter_reload = EI_FPS * 2;
+ game->sync_counter = 1;
+ game->nr_lives = EI_NR_LIVES;
game->player_missile_counter_reload = EI_FPS / EI_PLAYER_MISSILE_SPEED;
game->player_missile_counter = game->player_missile_counter_reload;
game->aliens_speed_counter_reload = EI_FPS / EI_ALIENS_SPEED;
game->aliens_speed_counter = game->aliens_speed_counter_reload;
game->first_alien_missile_counter = EI_FPS * EI_FIRST_ALIEN_MISSILE_DELAY;
game->alien_missile_counter_reload = EI_FPS / EI_ALIEN_MISSILE_SPEED;
+ game->alien_missile_counter = game->alien_missile_counter_reload;
game->ufo_counter_reload = EI_FPS / EI_UFO_SPEED;
+ game->ufo_counter = game->ufo_counter_reload;
game->nr_dead_aliens = 0;
-
+ game->state = EI_STATE_INTRO;
game->aliens_move_left = false;
game->aliens_move_down = false;
+ game->ufo_moves_left = false;
+
+ ei_game_update_status(game);
+}
+
+static void
+ei_game_start(struct ei_game *game)
+{
+ ei_game_reset(game);
+
+ eetg_world_add(&game->world, &game->player, 37, 23, 0);
+
+ ei_game_add_bunkers(game);
+ ei_game_add_aliens(game);
+
+ eetg_world_add(&game->world, &game->status, 26, 0, 0);
game->state = EI_STATE_PLAYING;
}
@@ -596,14 +616,12 @@ ei_game_kill_alien(struct ei_game *game, struct ei_alien *alien)
game->score += score;
- ei_game_update_status(game);
-
eetg_world_remove(&game->world, ei_alien_get_object(alien));
game->nr_dead_aliens++;
if (game->nr_dead_aliens == (EI_NR_ALIEN_GROUPS * EI_ALIEN_GROUP_SIZE)) {
- ei_game_prepare(game);
+ ei_game_prepare(game, false);
} else {
int aliens_speed;
@@ -633,7 +651,7 @@ ei_game_damage_bunker(struct ei_game *game, struct ei_bunker *bunker,
}
static void
-ei_game_terminate(struct ei_game *game)
+ei_game_end(struct ei_game *game)
{
assert(game);
@@ -654,11 +672,9 @@ ei_game_kill_player(struct ei_game *game, bool game_over)
game->nr_lives--;
- ei_game_update_status(game);
-
if (game_over || (game->nr_lives == 0))
{
- ei_game_terminate(game);
+ ei_game_end(game);
}
}
@@ -718,7 +734,7 @@ ei_game_handle_alien_missile_collision(struct ei_game *game,
}
}
-static void
+static bool
ei_game_handle_collision(struct eetg_object *object1,
struct eetg_object *object2,
int x, int y, void *arg)
@@ -745,17 +761,8 @@ ei_game_handle_collision(struct eetg_object *object1,
ei_game_handle_alien_missile_collision(arg, missile, other, x, y);
}
-}
-
-static void
-ei_game_reset_history(struct ei_game *game)
-{
- assert(game);
- game->score = 0;
- game->nr_lives = EI_NR_LIVES;
-
- ei_game_update_status(game);
+ return false;
}
static bool
@@ -771,8 +778,7 @@ ei_game_process_intro_input(struct ei_game *game, char c)
return false;
}
- ei_game_reset_history(game);
- ei_game_prepare(game);
+ ei_game_prepare(game, true);
return false;
}
@@ -962,7 +968,7 @@ ei_game_process_aliens(struct ei_game *game)
game_over = ei_alien_group_move_down(&game->aliens[i]);
if (game_over) {
- ei_game_terminate(game);
+ ei_game_end(game);
}
}
@@ -1095,13 +1101,6 @@ ei_game_init(struct ei_game *game, eetg_write_fn write_fn, void *arg)
{
assert(game);
- game->sync_counter_reload = EI_FPS * 2;
- game->sync_counter = 1;
-
- game->state = EI_STATE_INTRO;
-
- ei_game_reset_history(game);
-
eetg_world_init(&game->world, write_fn, arg);
eetg_world_set_collision_fn(&game->world, ei_game_handle_collision, game);
@@ -1129,12 +1128,15 @@ ei_game_init(struct ei_game *game, eetg_write_fn write_fn, void *arg)
eetg_object_init(&game->ufo, EI_TYPE_UFO, "<o~o>\n");
eetg_object_set_color(&game->ufo, EETG_COLOR_MAGENTA);
+ sprintf(game->status_sprite, "\n");
eetg_object_init(&game->status, EI_TYPE_STATUS, game->status_sprite);
eetg_object_set_color(&game->status, EETG_COLOR_RED);
eetg_object_init(&game->end_title, EI_TYPE_END_TITLE, EI_END_TITLE_SPRITE);
eetg_object_set_color(&game->end_title, EETG_COLOR_WHITE);
+ ei_game_reset(game);
+
eetg_world_add(&game->world, &game->title, 8, 1, 0);
eetg_world_add(&game->world, &game->help, 30, 16, 0);
eetg_world_add(&game->world, &game->start, 30, 20, 0);
@@ -1143,8 +1145,8 @@ ei_game_init(struct ei_game *game, eetg_write_fn write_fn, void *arg)
bool
ei_game_process(struct ei_game *game, int8_t c)
{
- bool sync = false;
- bool leave = false;
+ bool sync = false, leave = false;
+ int score = -1, nr_lives = -1;
game->sync_counter--;
@@ -1176,6 +1178,13 @@ ei_game_process(struct ei_game *game, int8_t c)
leave = ei_game_process_game_input(game, (char)c);
}
+ if ((score != game->score) || (nr_lives != game->nr_lives)) {
+ ei_game_update_status(game);
+
+ score = game->score;
+ nr_lives = game->nr_lives;
+ }
+
break;
}