]> git.gir.st - solVItaire.git/blob - sol.h
comments on the undo feature
[solVItaire.git] / sol.h
1 #ifndef __SOL_H__
2 #define __SOL_H__
3
4 #define SHORTHELP "%s [OPTIONS]\n"
5 #ifdef KLONDIKE
6 #define LONGHELP_SPECIFIC ""
7 #define DIRECT_ADDR_KEYHELP \
8 " 1 .. 7: directly address tableu\n" \
9 " 8,9,0 : directly address stock/waste/foundation\n"
10 #elif defined SPIDER
11 #define LONGHELP_SPECIFIC \
12 " -d(ifficulty) (eady|medium|hard)\n"
13 #define DIRECT_ADDR_KEYHELP \
14 " 1 .. 0: directly address tableu\n"
15 #endif
16 #define LONGHELP \
17 "OPTIONS:\n" \
18 LONGHELP_SPECIFIC \
19 " -o(ption) (consv=conserve vertical space)\n" \
20 " -s(cheme) (color|mono|small)\n" \
21 " -h(elp)\n" \
22 "\n"
23 #define KEYHELP \
24 "Keybindings:\n" \
25 " hjkl : move cursor\n" \
26 " H, L : move cursor to first/last tableu pile\n" \
27 " J, K : join to here, show hint\n" \
28 " n, q : new game, quit\n" \
29 " space : select at cursor\n" \
30 " return: draw from stock\n" \
31 DIRECT_ADDR_KEYHELP
32
33 #define DECK_SIZE 52
34 enum cards {
35 NO_CARD,
36 CLU_A, DIA_A, HEA_A, SPA_A,
37 CLU_2, DIA_2, HEA_2, SPA_2,
38 CLU_3, DIA_3, HEA_3, SPA_3,
39 CLU_4, DIA_4, HEA_4, SPA_4,
40 CLU_5, DIA_5, HEA_5, SPA_5,
41 CLU_6, DIA_6, HEA_6, SPA_6,
42 CLU_7, DIA_7, HEA_7, SPA_7,
43 CLU_8, DIA_8, HEA_8, SPA_8,
44 CLU_9, DIA_9, HEA_9, SPA_9,
45 CLU_X, DIA_X, HEA_X, SPA_X,
46 CLU_J, DIA_J, HEA_J, SPA_J,
47 CLU_Q, DIA_Q, HEA_Q, SPA_Q,
48 CLU_K, DIA_K, HEA_K, SPA_K,
49 _NUM_CARDS_internal
50 };
51 enum colors {
52 BLK,
53 RED,
54 NUM_COLORS
55 };
56 enum suits {
57 CLUBS,
58 DIAMONDS,
59 HEARTS,
60 SPADES,
61 NUM_SUITS
62 };
63 enum ranks {
64 RANK_A,
65 RANK_2,
66 RANK_3,
67 RANK_4,
68 RANK_5,
69 RANK_6,
70 RANK_7,
71 RANK_8,
72 RANK_9,
73 RANK_X,
74 RANK_J,
75 RANK_Q,
76 RANK_K,
77 NUM_RANKS
78 };
79
80 enum action_return {
81 OK, /*move successful*/
82 ERR, /*invalid move*/
83 WON, /*game won*/
84 };
85 enum game_states {
86 GAME_NEW,
87 GAME_WON,
88 GAME_QUIT,
89 };
90
91 /* WARN: stock must always follow immediately after `TAB_*`! */
92 #define TAB_MAX (STOCK-1)
93 enum field_places {
94 TAB_1,
95 TAB_2,
96 TAB_3,
97 TAB_4,
98 TAB_5,
99 TAB_6,
100 TAB_7,
101 #ifdef SPIDER
102 TAB_8,
103 TAB_9,
104 TAB_10,
105 STOCK,
106 #define WASTE 0; /* need it for get_cmd(), but don't count it in NUM_PLACES */
107 #elif defined KLONDIKE
108 STOCK,
109 WASTE,
110 FOUNDATION,
111 #endif
112 NUM_PLACES,
113 };
114 enum special_cmds {
115 CMD_MOVE,
116 CMD_INVAL,
117 CMD_NONE,
118 CMD_QUIT,
119 CMD_NEW,
120 CMD_AGAIN,
121 CMD_HINT,
122 CMD_JOIN,
123 };
124
125 enum difficulty {
126 NORMAL,
127 MEDIUM,
128 EASY,
129 };
130
131 typedef signed char card_t;
132
133 struct cursor {
134 int pile;
135 int opt; /* klondike: foundation id; spider: move nth movable card */
136 };
137 const struct cursor no_hi = {-1, -1};
138 #define NO_HI &no_hi
139
140 int sol(void);
141 void quit(void);
142 int find_top(card_t* pile);
143 int first_movable(card_t* pile);
144 void turn_over(card_t* pile);
145 int check_won(void);
146 int rank_next (card_t a, card_t b);
147 int is_consecutive (card_t* pile, int pos);
148 int is_movable(card_t* pile, int n);
149 #ifdef KLONDIKE
150 card_t stack_take(void);
151 int t2f(int from, int to, int opt);
152 int w2f(int from, int to, int opt);
153 int s2w(int from, int to, int opt);
154 int w2s(int from, int to, int opt);
155 int f2t(int from, int to, int opt);
156 int w2t(int from, int to, int opt);
157 int t2t(int from, int to, int opt);
158 #elif defined SPIDER
159 void remove_if_complete (card_t* pile);
160 int t2t(int from, int to, int opt);
161 int s2t(int from, int to, int opt);
162 #endif
163 int nop(int from, int to, int opt);
164 int get_cmd (int* from, int* to, int* opt);
165 void deal(void);
166 void print_hi(int invert, int grey_bg, int bold, char* str);
167 void print_table(const struct cursor* active, const struct cursor* inactive);
168 void win_anim(void);
169 void visbell (void);
170 void append_undo (int n, int f, int t);
171 void screen_setup (int enable);
172 void raw_mode(int enable);
173 void signal_handler (int signum);
174 void signal_setup(void);
175
176 #endif
Imprint / Impressum