diff options
-rw-r--r-- | freecell.c | 33 | ||||
-rw-r--r-- | layout.h | 8 |
2 files changed, 21 insertions, 20 deletions
diff --git a/freecell.c b/freecell.c index da8729d..b7f6378 100644 --- a/freecell.c +++ b/freecell.c @@ -47,14 +47,14 @@ enum { static struct Stack stacks[StacksLen]; -static uint kingFace = Cards_KingRight; - static struct { bool avail; uint dst; uint src; } undo; +static uint kingFace = Cards_KingRight; + static void gameDeal(void) { for (uint i = 0; i < StacksLen; ++i) { stackClear(&stacks[i]); @@ -64,14 +64,11 @@ static void gameDeal(void) { stackPush(&deck, i); } stackShuffle(&deck); - for (uint i = Tableau1; i <= Tableau4; ++i) { - stackMoveTo(&stacks[i], &deck, 7); - } - for (uint i = Tableau5; i <= Tableau8; ++i) { - stackMoveTo(&stacks[i], &deck, 6); + for (uint i = Tableau1; i <= Tableau8; ++i) { + stackMoveTo(&stacks[i], &deck, (i < Tableau5 ? 7 : 6)); } - kingFace = Cards_KingRight; undo.avail = false; + kingFace = Cards_KingRight; } static bool gameWin(void) { @@ -81,25 +78,25 @@ static bool gameWin(void) { return true; } -static bool gameFind(uint *stack, uint *index, Card card) { +static bool gameFind(uint *stack, Card card) { for (*stack = 0; *stack < StacksLen; ++*stack) { - for (*index = 0; *index < stacks[*stack].len; ++*index) { - if (stacks[*stack].cards[*index] == card) return true; + for (uint i = 0; i < stacks[*stack].len; ++i) { + if (stacks[*stack].cards[i] == card) return true; } } return false; } static bool gameAvail(Card card) { - uint stack, index; - if (!gameFind(&stack, &index, card)) return false; - if (stack >= Foundation1 && stack <= Foundation4) return false; + uint stack; + assert(gameFind(&stack, card)); + if (stack <= Foundation4) return false; return card == stackTop(&stacks[stack]); } static bool gameMove(uint dst, Card card) { - uint src, index; - if (!gameFind(&src, &index, card)) return false; + uint src; + assert(gameFind(&src, card)); Card top = stackTop(&stacks[dst]); if (src == dst) return false; @@ -261,7 +258,7 @@ static bool keyDown(SDL_KeyboardEvent key) { static bool keyUp(SDL_KeyboardEvent key) { (void)key; if (!reveal.len) return false; - reveal.len = 0; + listClear(&reveal); return true; } @@ -279,7 +276,7 @@ static bool mouseButtonUp(SDL_MouseButtonEvent button) { if (button.button == SDL_BUTTON_RIGHT) { if (!reveal.len) return false; - reveal.len = 0; + listClear(&reveal); return true; } diff --git a/layout.h b/layout.h index a9b3917..cbff6df 100644 --- a/layout.h +++ b/layout.h @@ -38,6 +38,10 @@ struct List { struct Item items[LAYOUT_CAP]; }; +static inline void listClear(struct List *list) { + list->len = 0; +} + static inline void listPush(struct List *list, const struct SDL_Rect *rect, Card card) { assert(list->len < LAYOUT_CAP); @@ -61,8 +65,8 @@ struct Layout { }; static inline void layoutClear(struct Layout *layout) { - layout->main.len = 0; - layout->drag.len = 0; + listClear(&layout->main); + listClear(&layout->drag); } struct Style { |