From aea75d09f6df521b4b30298eea2c9d8c9bd7c9c9 Mon Sep 17 00:00:00 2001 From: P. J. McDermott Date: Sun, 08 Aug 2021 17:33:53 -0400 Subject: game: Add win condition --- (limited to 'src') diff --git a/src/game.c b/src/game.c index 8c3a8ff..5a410e2 100644 --- a/src/game.c +++ b/src/game.c @@ -33,6 +33,13 @@ struct _mf_game { struct mftk_widget *timer; char time_buf[6]; Uint32 beg; + int player_cx; + int player_cy; + int player_travel; + int player_dx; + int player_dy; + int player_x; + int player_y; }; static int @@ -63,8 +70,8 @@ _mf_game_form(SDL_Renderer *renderer, TTF_Font *text_font, } static int -_mf_game_fow(SDL_Renderer *renderer, struct mf_maze *maze, - struct mf_player *player, int cw) +_mf_game_fow(SDL_Renderer *renderer, struct _mf_game *game, + struct mf_maze *maze, int cw) { int x1; int y1; @@ -84,8 +91,11 @@ _mf_game_fow(SDL_Renderer *renderer, struct mf_maze *maze, return -1; \ } - mf_player_get_vector(player, &x1, &y1, &travel, &dx, &dy); - x2 = x1, y2 = y1; + x2 = x1 = game->player_cx; + y2 = y1 = game->player_cy; + travel = game->player_travel; + dx = game->player_dx; + dy = game->player_dy; while (!mf_maze_is_wall(maze, dx >= 0 ? x2 : x1, dy >= 0 ? y2 : y1, dx, dy)) { if (dx >= 0) x2 += dx; @@ -142,6 +152,7 @@ mf_game(long seed, int size, int fow, int reveal, SDL_Renderer *renderer) struct _mf_game game; struct mftk_window *win = NULL; int fr; + int won; Uint32 beg; int secs; Uint32 end; @@ -189,6 +200,7 @@ mf_game(long seed, int size, int fow, int reveal, SDL_Renderer *renderer) game.beg = SDL_GetTicks(); fr = 30; + won = SDL_FALSE; while(1) { beg = SDL_GetTicks(); while (SDL_PollEvent(&event)) { @@ -215,26 +227,41 @@ mf_game(long seed, int size, int fow, int reveal, SDL_Renderer *renderer) goto err; } } - mf_player_update(player); + if (won == SDL_FALSE) { + mf_player_update(player); + mf_player_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; + game.player_y = game.player_cy * MF_WINDOW_H / size; + game.player_x += game.player_travel * game.player_dx; + game.player_y += game.player_travel * game.player_dy; + if (game.player_cx == size - 1 && + game.player_cy == size - 1) { + won = SDL_TRUE; + } + } SDL_SetRenderDrawColor(renderer, MF_COLOR_BACK_R, MF_COLOR_BACK_G, MF_COLOR_BACK_B, MF_COLOR_BACK_A); SDL_RenderClear(renderer); mf_player_render(player, renderer); - if (fow == SDL_TRUE && _mf_game_fow(renderer, maze, player, + if (fow == SDL_TRUE && _mf_game_fow(renderer, &game, maze, MF_WINDOW_H / size) < 0) { goto err; } mf_maze_render(maze, renderer, &maze_color, MF_WINDOW_H / size); - secs = (beg - game.beg) / 1000; - if (sprintf(game.time_buf, "%02d:%02d", secs / 60, secs % 60) - < 0) { - SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, - "Couldn't allocate string: %s", - strerror(errno)); - goto err; + if (won == SDL_FALSE) { + secs = (beg - game.beg) / 1000; + if (sprintf(game.time_buf, "%02d:%02d", + secs / 60, secs % 60) < 0) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, + "Couldn't allocate string: %s", + strerror(errno)); + goto err; + } + mftk_text_set_value(game.timer, game.time_buf); } - mftk_text_set_value(game.timer, game.time_buf); mftk_window_render(win, renderer); SDL_RenderPresent(renderer); end = SDL_GetTicks(); -- cgit v0.9.1