]> git.gir.st - solVItaire.git/blob - README.md
join: in SPIDER, prefer completing a stack
[solVItaire.git] / README.md
1 # solVIItaire
2
3 play klondike and spider solitaire in your unicode terminal.
4
5 ## TODO
6
7 ### P1
8 ### P2
9 * TODO: suggest moves (`h` => hint)
10 * TODO: cleanup: in `x2y()` functions there is a lot of replication and noise
11 when calculating legal moves, top cards, etc.
12 ### P3
13 * TODO: differential drawing mode (at least for highlighting cards)
14 * TODO: `.` command (repeat last action)
15 ### P4
16 * TODO: mouse mode (problems: finding position with `extreme_overlap`)
17 * TODO: scores, variants: draw 3, max. n overturns
18 * TODO: vt220 mode (problems: charset, slow baudrate and no differential drawing mode)
19 * TODO: ed(1) mode (solEDaire): playable on a line printer; ascii/ibm only?
20
21 ### DONE
22 * DONE: use `#ifdef`s to differentiate games (sol, spider, ed-sol, ed-spider)
23 * DONE: keyboard alias: twice same key == waste/pile -> foundation
24 * DONE: spider keyboard: `<from><to>` stacks; 1-9,0=tableu, return=draw
25 * DONE: spider: easy/medium difficulty: only deal 1/2 suits instead of 4 -> deal()
26 * DONE: patience: allow taking from 0(foundation)
27 * DONE: highlight `from` pile, so users can see at what input stage they are
28 * DONE: make piles 0-indexed in klondike as well
29 * DONE: duplicate card ♠A found in tableu: added check at start to monitor this
30 Cannot reproduce, removed check
31 * DONE: bugs in spider's t2t()
32 * once segfaulted on large column
33 * sometimes doesn't work (ERR when it should be OK)
34 Cannot reproduce
35 * DONE: some input functions are in `x2y()` -- move them to `get_cmd()` (req.
36 for mouse, hjkl modes)
37 * DONE: sigint, sigcont handler! atexit() to avoid inconsistent term state
38 * DONE: hjkl keyboard mode
39 * DONE: more vim mode keys (first/last tableu)
40 * DONE: online (key-)help `?`, `-h`, `-v` (NOTE: implemented -h, rest deemed
41 not usedul)
42 * DONE: extreme overlapping: if we are printing a sequence or multiple face down
43 cards, only print `.overlap` lines of the ends, and `1` line for the
44 middle cards
45 * DONE: in direct addressing 'up to' dialog: make return/space select the lowest/highest option
46 * DONE: undo:
47 - insert append_undo() in x2y() functions
48 - to encode stack position we need to overload `f.u.n` as index.
49 (similar for foundation: overload `f.u.n` as foundation id)
50 - w2f(): have to encode both stock index and foundation id
51 don't want to add a struct field for this one case;
52 for the time being (i.e. forever) I'm ORing waste index and
53 (foundation id<<16). ugly but works :/
54 - turning over cards: this needs to be encoded, because the card might
55 be consecutive and there's no way to tell what its previous state was.
56 * indicate that a card was turned (can be at most 1) by negating u.n
57 pros: no wasted space (it's just a boolean value), negation pattern
58 already used for closed cards
59 cons: dirty C hack, less obvious than in other places, no need to
60 conserve memory this tightly
61 * DONE: screen size > stack height => rendering issues!
62 as good as it's going to get, since we can't just not draw cards at all
63 * DONE: 'join to here' command (should take longest chain available)
64 * DONE: expose deal() seed for restarting the game
65 * DONE: make portable (clang on FreeBSD)
66 makefile's `$<` refuses to work if prequisite name != target name
67 Fix:
68 ln -s sol.c. spider.c
69 sed -i 's/^spider: sol.c/spider: spider.c/' Makefile
70 * DONE: escape sequences (for real cursor keys)
71 * DONE: inverted moves (if A->B doesn't work, try B->A)
72
73 ## Notes
74
75 - terminology:
76 ```
77 {stock}[waste] [4*foundation]
78
79 [] {} {} {} {} {} {}
80 [] (tableu piles) {} {}
81 [] {} {} {} {}
82 [] {} {} {}
83 [] {} {}
84 [] {}
85 []
86 ```
87 - data structures:
88 - enum for each card (e.g. `SPADES_ACE`, `HEARTS_10`)
89 - each pile is an array holding (13 open cards + up to 6 closed)
90 [0] is the "northmost"/bottom-most card; unoccupied are NULL/NO_CARD
91 - a single card is represented in the 'cards' enum; if it is closed, it is negated.
92 - the foundation are 4 arrays of size 13
93 - the stock pile is an array holding n cards and an index to the one to display
94 when removing, decrement stack size and move all cards above index 1 over
95 - previous states array: where to move which cards to get back to the state before
96 - undo:
97 double-linked list (follow `.prev` to undo, `.next` to redo)
98 "N cards were moved from X to Y" (do Y->X to undo)
99 allows jumping forwards in time as well (by repeating X->Y)
100 warn: when appending state, must check if `.next` was non-NULL and free rest of chain if so.
101 - multiple card sizes: schemes.h will store cards like below. if we want to draw a card
102 that has one or more other cards below it, we only draw the first `.overlap` lines,
103 otherwise if it is the last one, we draw the whole one.
104 this will give a look like in `~/solitaire-tests`
105 ```
106 .grid=7, /*vertical alignment*/
107 .overlap=2,
108 .cards = [
109 ["╭───╮",
110 "│♠ X│",
111 "│ ♠ │",
112 "╰───╯",
113 NULL],
114 ]
115 /*or:*/
116 .grid=2,
117 .overlap=1,
118 .cards = [
119 [ "🃖 ", NULL ],
120 ]
121 ```
122 "open": face up card
123 "closed": face down card
Imprint / Impressum