summaryrefslogtreecommitdiffstats
path: root/src/game.c
diff options
context:
space:
mode:
authorP. J. McDermott <pj@pehjota.net>2021-08-18 17:01:27 (EDT)
committer P. J. McDermott <pj@pehjota.net>2021-08-18 17:42:41 (EDT)
commitb1fbb0b1c078e82a651181101fed9d6742164e0b (patch)
treeca238fc06522b822805f380e5ac2f7e7aaca30c5 /src/game.c
parent1b5817ea5fe469f9001e09acd8e9468c87aea2a0 (diff)
downloadmazefight-b1fbb0b1c078e82a651181101fed9d6742164e0b.zip
mazefight-b1fbb0b1c078e82a651181101fed9d6742164e0b.tar.gz
mazefight-b1fbb0b1c078e82a651181101fed9d6742164e0b.tar.bz2
char/enemy: Make a linked list of enemy chars
Diffstat (limited to 'src/game.c')
-rw-r--r--src/game.c71
1 files changed, 24 insertions, 47 deletions
diff --git a/src/game.c b/src/game.c
index 0c94202..22d6e11 100644
--- a/src/game.c
+++ b/src/game.c
@@ -144,8 +144,9 @@ mf_game(long seed, int size, int fow, int reveal, int enemies,
SDL_Renderer *renderer)
{
struct mf_maze *maze = NULL;
- struct mf_char **chars = NULL;
- int i;
+ struct mf_char *player = NULL;
+ struct mf_char *enemy_head = NULL;
+ struct mf_char *enemy_tail = NULL;
SDL_Color maze_color;
char *font_path = NULL;
TTF_Font *text_font = NULL;
@@ -156,7 +157,6 @@ mf_game(long seed, int size, int fow, int reveal, int enemies,
int fr;
int won;
Uint32 beg;
- int j;
int secs;
Uint32 end;
Uint32 delay;
@@ -172,22 +172,19 @@ mf_game(long seed, int size, int fow, int reveal, int enemies,
maze_color.b = MF_COLOR_MAZE_B;
maze_color.a = MF_COLOR_MAZE_A;
- chars = calloc(1 + enemies, sizeof(*chars));
- if (chars == NULL) {
- SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
- "Couldn't allocate characters: %s",
- strerror(errno));
- goto err;
- }
- chars[0] = mf_player_new(maze, MF_WINDOW_H / size);
- if (chars[0] == NULL) {
+ player = mf_player_new(maze, MF_WINDOW_H / size);
+ if (player == NULL) {
goto err;
}
- for (i = 1; i < 1 + enemies; ++i) {
- chars[i] = mf_enemy_new(maze, MF_WINDOW_H / size, size);
- if (chars[i] == NULL) {
+ for (; enemies > 0; --enemies) {
+ enemy_tail = mf_enemy_new(maze, MF_WINDOW_H / size, size,
+ enemy_tail);
+ if (enemy_tail == NULL) {
goto err;
}
+ if (enemy_head == NULL) {
+ enemy_head = enemy_tail;
+ }
}
font_path = mf_strcat(mf_get_fonts_dir(), "/FifteenTwenty-Regular.ttf");
@@ -233,7 +230,7 @@ mf_game(long seed, int size, int fow, int reveal, int enemies,
default:
break;
}
- mf_player_key_event(chars[0], &event);
+ mf_player_key_event(player, &event);
switch (mftk_window_event(win, &event)) {
case 0:
break;
@@ -244,16 +241,9 @@ mf_game(long seed, int size, int fow, int reveal, int enemies,
}
}
if (won == SDL_FALSE) {
- for (i = 0; i < 1 + enemies; ++i) {
- mf_char_update(chars[i]);
- }
- for (i = 1; i < 1 + enemies; ++i) {
- for (j = i + 1; j < 1 + enemies; ++j) {
- mf_char_collision(chars[i], chars[j],
- SDL_TRUE);
- }
- }
- mf_char_get_vector(chars[0], &game.player_cx,
+ mf_char_update(player);
+ mf_char_update(enemy_head);
+ mf_char_get_vector(player, &game.player_cx,
&game.player_cy, &game.player_travel,
&game.player_dx, &game.player_dy);
game.player_x = game.player_cx * MF_WINDOW_H / size;
@@ -269,9 +259,8 @@ mf_game(long seed, int size, int fow, int reveal, int enemies,
MF_COLOR_BACK_R, MF_COLOR_BACK_G,
MF_COLOR_BACK_B, MF_COLOR_BACK_A);
SDL_RenderClear(renderer);
- for (i = 0; i < 1 + enemies; ++i) {
- mf_char_render(chars[i], renderer);
- }
+ mf_char_render(player, renderer);
+ mf_char_render(enemy_head, renderer);
if (fow == SDL_TRUE && _mf_game_fow(renderer, &game, maze,
MF_WINDOW_H / size) < 0) {
goto err;
@@ -309,12 +298,8 @@ mf_game(long seed, int size, int fow, int reveal, int enemies,
TTF_CloseFont(text_font);
text_font = NULL;
mf_maze_destroy(&maze);
- if (chars != NULL) {
- for (i = 0; i < 1 + enemies; ++i) {
- mf_char_destroy(&chars[i]);
- }
- free(chars);
- }
+ mf_char_destroy(&player);
+ mf_char_destroy(&enemy_head);
return 0;
quit:
@@ -322,12 +307,8 @@ mf_game(long seed, int size, int fow, int reveal, int enemies,
TTF_CloseFont(text_font);
text_font = NULL;
mf_maze_destroy(&maze);
- if (chars != NULL) {
- for (i = 0; i < 1 + enemies; ++i) {
- mf_char_destroy(&chars[i]);
- }
- free(chars);
- }
+ mf_char_destroy(&player);
+ mf_char_destroy(&enemy_head);
return 1;
err:
@@ -339,11 +320,7 @@ mf_game(long seed, int size, int fow, int reveal, int enemies,
}
mftk_window_destroy(&win);
mf_maze_destroy(&maze);
- if (chars != NULL) {
- for (i = 0; i < 1 + enemies; ++i) {
- mf_char_destroy(&chars[i]);
- }
- free(chars);
- }
+ mf_char_destroy(&player);
+ mf_char_destroy(&enemy_head);
return -1;
}