Merge branch 'master' into respect-flags

This commit is contained in:
Murilo Pereira 2018-08-12 23:27:20 +02:00 committed by GitHub
commit c45969623a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 52 additions and 22 deletions

View File

@ -1,6 +1,8 @@
VERSION = 1.0.0
CC ?= gcc CC ?= gcc
CFLAGS ?= -g CFLAGS ?= -g
CFLAGS += -W -Wall -pedantic -ansi -std=c99 -g CFLAGS += -W -Wall -pedantic -ansi -std=c99 -DTS_VERSION=\"$(VERSION)\"
# OS X installs ncurses with wide character support, but not as "libncurses" # OS X installs ncurses with wide character support, but not as "libncurses"
ifeq ($(shell uname -s),Darwin) ifeq ($(shell uname -s),Darwin)
@ -9,7 +11,7 @@ else
LDFLAGS += -lncursesw LDFLAGS += -lncursesw
endif endif
PREFIX ?= /usr/local PREFIX ?= /usr/local
EXECUTABLE = ttysolitaire EXECUTABLE = ttysolitaire
SRC_DIR = src SRC_DIR = src
@ -40,6 +42,8 @@ TESTS_OBJECTS = $(TESTS_DIR)/frame_test.o \
.PHONY: test clean install uninstall .PHONY: test clean install uninstall
all: ${EXECUTABLE}
ttysolitaire: $(SRC_OBJECTS) ttysolitaire: $(SRC_OBJECTS)
$(CC) $(CFLAGS) $(SRC) -o $(EXECUTABLE) $(SRC_OBJECTS) $(LDFLAGS) $(CC) $(CFLAGS) $(SRC) -o $(EXECUTABLE) $(SRC_OBJECTS) $(LDFLAGS)

View File

@ -1 +0,0 @@
1.0.0

View File

@ -129,7 +129,6 @@ void move_block(struct stack **origin, struct stack **destination, int block_siz
stack_free(tmp); stack_free(tmp);
} }
static void fill_deck(struct deck *deck) { static void fill_deck(struct deck *deck) {
struct card *card[NUMBER_OF_CARDS]; struct card *card[NUMBER_OF_CARDS];
@ -166,10 +165,10 @@ static void shuffle_deck(struct deck *deck) {
} }
static void deal_cards(struct deck *deck) { static void deal_cards(struct deck *deck) {
for (int i = 0; i < 7; i++) { for (int i = 0; i < MANEUVRE_STACKS_NUMBER; i++) {
move_card(&(deck->stock), &(deck->maneuvre[i])); move_card(&(deck->stock), &(deck->maneuvre[i]));
card_expose(deck->maneuvre[i]->card); card_expose(deck->maneuvre[i]->card);
for (int j = i + 1; j < 7; j++) { for (int j = i + 1; j < MANEUVRE_STACKS_NUMBER; j++) {
move_card(&(deck->stock), &(deck->maneuvre[j])); move_card(&(deck->stock), &(deck->maneuvre[j]));
} }
} }
@ -207,8 +206,14 @@ void game_end() {
} }
bool game_won() { bool game_won() {
return(stack_length(deck->foundation[0]) == 13 && // if any card is covered, game is not won
stack_length(deck->foundation[1]) == 13 && for (int i = 0; i < MANEUVRE_STACKS_NUMBER; i++)
stack_length(deck->foundation[2]) == 13 && for (struct stack *j = deck->maneuvre[i]; j!= NULL; j = j->next)
stack_length(deck->foundation[3]) == 13); if (j->card->face == COVERED)
return false;
// else look in stock and waste pile
if (stack_empty(deck->stock) &&
stack_empty(deck->waste_pile))
return true;
else return false;
} }

View File

@ -95,6 +95,18 @@ static void handle_card_movement(struct cursor *cursor) {
} }
} }
break; break;
case 'M':
if (origin == cursor_stack(cursor) && maneuvre_stack(*origin)) {
for (struct stack *i = *origin; i && i->next; i = i->next) {
if (i->next->card->face == EXPOSED &&
(i->card->frame->begin_y - i->next->card->frame->begin_y) > 1) {
erase_stack(*origin);
card_mark(i->next->card);
draw_stack(*origin);
}
}
}
break;
case 'n': case 'n':
if (origin == cursor_stack(cursor) && maneuvre_stack(*origin)) { if (origin == cursor_stack(cursor) && maneuvre_stack(*origin)) {
for (struct stack *i = (*origin)->next; i; i = i->next) { for (struct stack *i = (*origin)->next; i; i = i->next) {
@ -116,6 +128,15 @@ static void handle_card_movement(struct cursor *cursor) {
} }
} }
break; break;
case 'N':
if (origin == cursor_stack(cursor) && maneuvre_stack(*origin)) {
erase_stack(*origin);
unmark_cards(*origin);
card_mark((*origin)->card);
draw_stack(*origin);
}
break;
case KEY_SPACEBAR:; case KEY_SPACEBAR:;
/* http://www.mail-archive.com/gcc-bugs@gcc.gnu.org/msg259382.html */ /* http://www.mail-archive.com/gcc-bugs@gcc.gnu.org/msg259382.html */
struct stack **destination = cursor_stack(cursor); struct stack **destination = cursor_stack(cursor);

View File

@ -8,6 +8,10 @@
#include "keyboard.h" #include "keyboard.h"
#include "common.h" #include "common.h"
#ifndef TS_VERSION
#define TS_VERSION "n/a"
#endif
const char *program_name; const char *program_name;
struct game game; struct game game;
@ -123,14 +127,5 @@ void usage(const char *program_name) {
} }
void version() { void version() {
FILE *version_file; printf("%s\n", TS_VERSION);
char version_string[6];
if (!(version_file = fopen("VERSION", "rb"))) {
tty_solitaire_generic_error(errno, __FILE__, __LINE__);
}
fread(version_string, 1, 5, version_file);
version_string[5] = '\0';
printf("%s\n", version_string);
fclose(version_file);
} }

View File

@ -129,6 +129,7 @@ void test_valid_move_from_waste_pile_to_foundation_stacks() {
card_set(foundation_stacks[2]->card, ACE, SPADES, EXPOSED, FOUNDATION_BEGIN_Y, FOUNDATION_2_BEGIN_X); card_set(foundation_stacks[2]->card, ACE, SPADES, EXPOSED, FOUNDATION_BEGIN_Y, FOUNDATION_2_BEGIN_X);
card_set(foundation_stacks[3]->card, ACE, SPADES, EXPOSED, FOUNDATION_BEGIN_Y, FOUNDATION_3_BEGIN_X); card_set(foundation_stacks[3]->card, ACE, SPADES, EXPOSED, FOUNDATION_BEGIN_Y, FOUNDATION_3_BEGIN_X);
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
// TODO: fix error here
assert(valid_move(waste_pile, foundation_stacks[i])); assert(valid_move(waste_pile, foundation_stacks[i]));
} }
stack_free(waste_pile); stack_free(waste_pile);
@ -155,6 +156,7 @@ void test_valid_move_from_waste_pile_to_maneuvre_stacks() {
card_set(maneuvre_stacks[5]->card, ACE, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_5_BEGIN_X); card_set(maneuvre_stacks[5]->card, ACE, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_5_BEGIN_X);
card_set(maneuvre_stacks[6]->card, ACE, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_6_BEGIN_X); card_set(maneuvre_stacks[6]->card, ACE, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_6_BEGIN_X);
for (int i = 0; i < 7; i++) { for (int i = 0; i < 7; i++) {
// TODO: fix error here
assert(valid_move(waste_pile, maneuvre_stacks[i])); assert(valid_move(waste_pile, maneuvre_stacks[i]));
} }
stack_free(waste_pile); stack_free(waste_pile);
@ -225,6 +227,7 @@ void test_valid_move_from_foundation_stack_to_foundation_stacks() {
if (i == j) { if (i == j) {
assert(!valid_move(foundation_stacks[i], foundation_stacks[j])); assert(!valid_move(foundation_stacks[i], foundation_stacks[j]));
} else { } else {
// TODO: fix error here
assert(valid_move(foundation_stacks[i], foundation_stacks[j])); assert(valid_move(foundation_stacks[i], foundation_stacks[j]));
} }
} }
@ -259,6 +262,7 @@ void test_valid_move_from_foundation_stack_to_maneuvre_stacks() {
card_set(maneuvre_stacks[6]->card, ACE, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_6_BEGIN_X); card_set(maneuvre_stacks[6]->card, ACE, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_6_BEGIN_X);
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
for (int j = 0; j < 7; j++) { for (int j = 0; j < 7; j++) {
// TODO: fix error here
assert(valid_move(foundation_stacks[i], maneuvre_stacks[j])); assert(valid_move(foundation_stacks[i], maneuvre_stacks[j]));
} }
} }
@ -347,6 +351,7 @@ void test_valid_move_from_maneuvre_stack_to_foundation_stacks() {
card_set(maneuvre_stacks[6]->card, ACE, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_6_BEGIN_X); card_set(maneuvre_stacks[6]->card, ACE, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_6_BEGIN_X);
for (int i = 0; i < 7; i++) { for (int i = 0; i < 7; i++) {
for (int j = 0; j < 4; j++) { for (int j = 0; j < 4; j++) {
// TODO: fix error here
assert(valid_move(maneuvre_stacks[i], foundation_stacks[j])); assert(valid_move(maneuvre_stacks[i], foundation_stacks[j]));
} }
} }
@ -377,6 +382,7 @@ void test_valid_move_from_maneuvre_stack_to_maneuvre_stacks() {
if (i == j) { if (i == j) {
assert(!valid_move(maneuvre_stacks[i], maneuvre_stacks[j])); assert(!valid_move(maneuvre_stacks[i], maneuvre_stacks[j]));
} else { } else {
// TODO: fix error here
assert(valid_move(maneuvre_stacks[i], maneuvre_stacks[j])); assert(valid_move(maneuvre_stacks[i], maneuvre_stacks[j]));
} }
} }

View File

@ -217,7 +217,7 @@ void test_stack_reverse_on_stack_empty_stack() {
old_stack = stack; old_stack = stack;
stack_reversed_stack = stack_reverse(stack); stack_reversed_stack = stack_reverse(stack);
assert(stack_reversed_stack == old_stack); assert(stacks_equal(stack_reversed_stack, old_stack));
stack_free(stack); stack_free(stack);
} }
@ -236,7 +236,7 @@ void test_stack_reverse_on_stack_with_one_element() {
old_stack = stack; old_stack = stack;
stack_reversed_stack = stack_reverse(stack); stack_reversed_stack = stack_reverse(stack);
assert(stack_reversed_stack == old_stack); assert(stacks_equal(stack_reversed_stack, old_stack));
stack_free(stack); stack_free(stack);
} }