diff --git a/src/game.c b/src/game.c index 1dc2c7c..b90c822 100644 --- a/src/game.c +++ b/src/game.c @@ -200,7 +200,7 @@ static void deal_cards(struct deck *deck) { } void game_init(struct game *game, int passes_through_deck, - int four_color_deck) { + int four_color_deck, int auto_win_disable) { cursor_malloc(&cursor); cursor_init(cursor); deck_malloc(&deck); @@ -220,6 +220,7 @@ void game_init(struct game *game, int passes_through_deck, } game->four_color_deck = four_color_deck; + game->auto_win_disable = auto_win_disable; fill_deck(deck); shuffle_deck(deck); @@ -236,20 +237,27 @@ void game_end() { deck_free(deck); } -bool game_won() { - // If any card in the maneuvre stacks is covered, game is not won. - for (int i = 0; i < MANEUVRE_STACKS_NUMBER; i++) { - for (struct stack *j = deck->maneuvre[i]; j != NULL; j = j->next) { - if (j->card->face == COVERED) { - return (false); +bool game_won(int auto_win_disable) { + if (auto_win_disable) { + return(stack_length(deck->foundation[0]) == 13 && + stack_length(deck->foundation[1]) == 13 && + stack_length(deck->foundation[2]) == 13 && + stack_length(deck->foundation[3]) == 13); + } else { + // If any card in the maneuvre stacks is covered, game is not won. + for (int i = 0; i < MANEUVRE_STACKS_NUMBER; i++) { + for (struct stack *j = deck->maneuvre[i]; j != NULL; j = j->next) { + if (j->card->face == COVERED) { + return (false); + } } } - } - // If the stock pile or the waste pile aren't empty, game is not won. - if (!stack_empty(deck->stock) || !stack_empty(deck->waste_pile)) { - return (false); - } + // If the stock pile or the waste pile aren't empty, game is not won. + if (!stack_empty(deck->stock) || !stack_empty(deck->waste_pile)) { + return (false); + } - return (true); + return (true); + } } diff --git a/src/game.h b/src/game.h index 781eaad..26ef09a 100644 --- a/src/game.h +++ b/src/game.h @@ -33,6 +33,7 @@ struct game { int passes_through_deck_left; int four_color_deck; + int auto_win_disable; }; extern struct deck *deck; @@ -44,7 +45,7 @@ bool valid_move(struct stack *, struct stack *); void move_card(struct stack **, struct stack **); void move_block(struct stack **, struct stack **, int); void expose_top(struct stack **); -void game_init(struct game *, int, int); +void game_init(struct game *, int, int, int); bool game_won(); void game_end(); diff --git a/src/ttysolitaire.c b/src/ttysolitaire.c index 1092fe6..ffe6fb1 100644 --- a/src/ttysolitaire.c +++ b/src/ttysolitaire.c @@ -26,12 +26,14 @@ int main(int argc, char *argv[]) { int passes_through_deck = 3; static int four_color_deck; static int no_background_color; + static int auto_win_disable; static const struct option options[] = { {"help", no_argument, NULL, 'h'}, {"version", no_argument, NULL, 'v'}, {"passes", required_argument, NULL, 'p'}, {"four-color-deck", no_argument, &four_color_deck, 1}, {"no-background-color", no_argument, &no_background_color, 1}, + {"auto-win-disable", no_argument, &auto_win_disable, 1}, {0, 0, 0, 0}}; program_name = basename(argv[0]); @@ -108,7 +110,7 @@ int main(int argc, char *argv[]) { if (key == KEY_SPACEBAR) { clear(); refresh(); - game_init(&game, passes_through_deck, four_color_deck); + game_init(&game, passes_through_deck, four_color_deck, auto_win_disable); break; } } else if (key == KEY_RESIZE) { @@ -120,7 +122,7 @@ int main(int argc, char *argv[]) { do { keyboard_event(getch()); - } while (!game_won()); + } while (!game_won(game.auto_win_disable)); endwin(); game_end(); @@ -148,6 +150,8 @@ void usage(const char *program_name) { "(default: false)\n"); printf(" --no-background-color Don't draw background color " "(default: false)\n"); + printf(" --auto-win-disable Disable auto-winning the game " + "(default: false)\n"); } void version() { printf("%s\n", VERSION); }