]> git.gir.st - solVItaire.git/blob - sol.h
improve readme
[solVItaire.git] / sol.h
1 #ifndef __SOL_H__
2 #define __SOL_H__
3
4 // enums and constants {{{
5 #define DECK_SIZE 52
6 #ifdef KLONDIKE
7 #define NUM_PILES 7
8 #define MAX_HIDDEN 6 /*how many cards are turned over at most in a tableu pile*/
9 #define MAX_STOCK 24 /*how many cards can be in the stock at most (=@start)*/
10 #define NUM_DECKS 1
11 #define PILE_SIZE MAX_HIDDEN+NUM_RANKS
12 #elif defined SPIDER
13 #define MAX_HIDDEN 5
14 #define NUM_PILES 10
15 #define MAX_STOCK 50 /*how many cards can be dealt onto the piles*/
16 #define NUM_DECKS 2
17 #define PILE_SIZE DECK_SIZE*NUM_DECKS /* no maximum stack size in spider :/ */
18 #endif
19
20 enum cards {
21 NO_CARD,
22 CLU_A, DIA_A, HEA_A, SPA_A,
23 CLU_2, DIA_2, HEA_2, SPA_2,
24 CLU_3, DIA_3, HEA_3, SPA_3,
25 CLU_4, DIA_4, HEA_4, SPA_4,
26 CLU_5, DIA_5, HEA_5, SPA_5,
27 CLU_6, DIA_6, HEA_6, SPA_6,
28 CLU_7, DIA_7, HEA_7, SPA_7,
29 CLU_8, DIA_8, HEA_8, SPA_8,
30 CLU_9, DIA_9, HEA_9, SPA_9,
31 CLU_X, DIA_X, HEA_X, SPA_X,
32 CLU_J, DIA_J, HEA_J, SPA_J,
33 CLU_Q, DIA_Q, HEA_Q, SPA_Q,
34 CLU_K, DIA_K, HEA_K, SPA_K,
35 _NUM_CARDS_internal
36 };
37 enum colors {
38 BLK,
39 RED,
40 NUM_COLORS
41 };
42 enum suits {
43 CLUBS,
44 DIAMONDS,
45 HEARTS,
46 SPADES,
47 NUM_SUITS
48 };
49 enum ranks {
50 RANK_A,
51 RANK_2,
52 RANK_3,
53 RANK_4,
54 RANK_5,
55 RANK_6,
56 RANK_7,
57 RANK_8,
58 RANK_9,
59 RANK_X,
60 RANK_J,
61 RANK_Q,
62 RANK_K,
63 NUM_RANKS
64 };
65
66 enum action_return {
67 OK, /*move successful*/
68 ERR, /*invalid move*/
69 WON, /*game won*/
70 };
71 enum game_states {
72 GAME_NEW,
73 GAME_WON,
74 GAME_QUIT,
75 };
76
77 /* WARN: stock must always follow immediately after `TAB_*`! */
78 #define TAB_MAX (STOCK-1)
79 enum field_places {
80 TAB_1,
81 TAB_2,
82 TAB_3,
83 TAB_4,
84 TAB_5,
85 TAB_6,
86 TAB_7,
87 #ifdef SPIDER
88 TAB_8,
89 TAB_9,
90 TAB_10,
91 STOCK,
92 #define WASTE 0 /* for action[][10] (must be valid index) */
93 #define TABLEU STOCK+1 /* for undo{.t} (value never read) */
94 #define FOUNDATION STOCK+2 /* for undo{.t} (must be unique) */
95 #elif defined KLONDIKE
96 STOCK,
97 WASTE,
98 FOUNDATION,
99 #endif
100 NUM_PLACES,
101 };
102 enum special_cmds {
103 CMD_MOVE,
104 CMD_INVAL,
105 CMD_NONE,
106 CMD_QUIT,
107 CMD_NEW,
108 CMD_AGAIN,
109 CMD_HINT,
110 CMD_JOIN,
111 CMD_UNDO,
112 };
113
114 enum event {
115 /* for getctrlseq() */
116 KEY_NULL = 0,
117 KEY_EOF = -1,
118 KEY_INVAL = -2,
119 MOUSE_ANY = -3,
120 /* for getch() */
121 MOUSE_LEFT = -4,
122 MOUSE_MIDDLE = -5,
123 MOUSE_RIGHT = -6,
124 MOUSE_DRAG = -7,
125 KEY_LEFT = -8,
126 KEY_DOWN = -9,
127 KEY_UP = -10,
128 KEY_RIGHT = -11,
129 KEY_HOME = -12,
130 KEY_END = -13,
131 KEY_INS = -14,
132 KEY_PGUP = -15,
133 KEY_PGDN = -16,
134 };
135
136 enum difficulty {
137 NORMAL,
138 MEDIUM,
139 EASY,
140 };
141 //}}}
142
143 typedef signed char card_t;
144
145 struct playfield {
146 int z; /* stock size */
147 int w; /* waste; index into stock (occupied foundations in spider) */
148 card_t s[MAX_STOCK]; /* stock */
149 card_t f[NUM_DECKS*NUM_SUITS][PILE_SIZE]; /* foundation */
150 card_t t[NUM_PILES][PILE_SIZE]; /* tableu piles */
151 struct undo {
152 int f; /* pile cards were taken from */
153 int t; /* pile cards were moved to */
154 int n; /* if tableu: number of cards moved */
155 /* else: index into stock/foundation */
156 int o; /* turn_over() fired? */
157 struct undo* prev;
158 struct undo* next;
159 }* u;
160 };
161 struct opts {
162 #ifdef SPIDER
163 int m; /* difficulty mode */
164 #endif
165 unsigned short w[2]; /* terminal window rows/columns */
166 const struct scheme* s;
167 };
168 struct cursor {
169 int pile;
170 int opt; /* klondike: foundation id; spider: move nth movable card */
171 };
172 const struct cursor no_hi = {-1, -1};
173 #define NO_HI &no_hi
174
175 struct undo undo_sentinel;
176
177 // help texts {{{
178 #define SHORTHELP "%s [OPTIONS]\n"
179 #ifdef KLONDIKE
180 #define LONGHELP_SPECIFIC ""
181 #define DIRECT_ADDR_KEYHELP \
182 " 1 .. 7: directly address tableu\n" \
183 " 8,9,0 : directly address stock/waste/foundation\n"
184 #elif defined SPIDER
185 #define LONGHELP_SPECIFIC \
186 " -s(uits) <1, 2 or 4>\n"
187 #define DIRECT_ADDR_KEYHELP \
188 " 1 .. 0: directly address tableu\n"
189 #endif
190 #define LONGHELP \
191 "OPTIONS:\n" \
192 LONGHELP_SPECIFIC \
193 " -b(land colorscheme)\n" \
194 " -c(olorful colorscheme)\n" \
195 " -m(iniature colorscheme)\n" \
196 " -h(elp)\n" \
197 "\n"
198 #define KEYHELP \
199 "Keybindings:\n" \
200 " hjkl : move cursor (or cursor keys)\n" \
201 " H,M,L : move cursor to first/centre/last tableu pile (or home/ins/end)\n" \
202 " J : join to here\n" \
203 /*" K : show hint\n" */\
204 " space : select at cursor\n" \
205 " return: draw from stock\n" \
206 " :n : new game\n" \
207 " :q : quit\n" \
208 DIRECT_ADDR_KEYHELP
209 //}}}
210
211 int sol(void);
212 void quit(void);
213 int find_top(card_t* pile);
214 int first_movable(card_t* pile);
215 int turn_over(card_t* pile);
216 int check_won(void);
217 int rank_next (card_t a, card_t b);
218 int is_consecutive (card_t* pile, int pos);
219 int is_movable(card_t* pile, int n);
220 #ifdef KLONDIKE
221 card_t stack_take(void);
222 int t2f(int from, int to, int opt);
223 int w2f(int from, int to, int opt);
224 int s2w(int from, int to, int opt);
225 int w2s(int from, int to, int opt);
226 int f2t(int from, int to, int opt);
227 int w2t(int from, int to, int opt);
228 int t2t(int from, int to, int opt);
229 #elif defined SPIDER
230 int remove_if_complete (int pileno);
231 int t2t(int from, int to, int opt);
232 int s2t(int from, int to, int opt);
233 int t2f(int from, int to, int opt);
234 #endif
235 int join(int to);
236 int nop(int from, int to, int opt);
237 void cursor_left (struct cursor* cursor);
238 void cursor_down (struct cursor* cursor);
239 void cursor_up (struct cursor* cursor);
240 void cursor_right (struct cursor* cursor);
241 void cursor_to (struct cursor* cursor, int pile);
242 int get_cmd (int* from, int* to, int* opt);
243 int getctrlseq(unsigned char* buf);
244 int term2pile(unsigned char *mouse);
245 int wait_mouse_up(unsigned char* mouse);
246 int getch(unsigned char* buf);
247 void deal(long seed);
248 void print_hi(int invert, int grey_bg, int bold, char* str);
249 void print_table(const struct cursor* active, const struct cursor* inactive);
250 void visbell (void);
251 void win_anim(void);
252 void undo_push (int f, int t, int n, int o);
253 void undo_pop (struct undo* u);
254 void free_undo (struct undo* u);
255 void screen_setup (int enable);
256 void raw_mode(int enable);
257 void signal_handler (int signum);
258 void signal_setup(void);
259
260 #endif
Imprint / Impressum