@journey-to-code/games 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/LICENSE +21 -0
  2. package/dist/backgammon.d.ts +146 -0
  3. package/dist/backgammon.js +1221 -0
  4. package/dist/backgammon.js.map +1 -0
  5. package/dist/blackjack.d.ts +66 -0
  6. package/dist/blackjack.js +452 -0
  7. package/dist/blackjack.js.map +1 -0
  8. package/dist/bluff.d.ts +60 -0
  9. package/dist/bluff.js +239 -0
  10. package/dist/bluff.js.map +1 -0
  11. package/dist/board.d.ts +387 -0
  12. package/dist/board.js +105 -0
  13. package/dist/board.js.map +1 -0
  14. package/dist/bridge.d.ts +86 -0
  15. package/dist/bridge.js +494 -0
  16. package/dist/bridge.js.map +1 -0
  17. package/dist/canasta.d.ts +88 -0
  18. package/dist/canasta.js +646 -0
  19. package/dist/canasta.js.map +1 -0
  20. package/dist/checkers.d.ts +108 -0
  21. package/dist/checkers.js +756 -0
  22. package/dist/checkers.js.map +1 -0
  23. package/dist/chess.d.ts +162 -0
  24. package/dist/chess.js +904 -0
  25. package/dist/chess.js.map +1 -0
  26. package/dist/chesscore.d.ts +136 -0
  27. package/dist/chesscore.js +1121 -0
  28. package/dist/chesscore.js.map +1 -0
  29. package/dist/combat.d.ts +102 -0
  30. package/dist/combat.js +772 -0
  31. package/dist/combat.js.map +1 -0
  32. package/dist/contractrummy.d.ts +77 -0
  33. package/dist/contractrummy.js +430 -0
  34. package/dist/contractrummy.js.map +1 -0
  35. package/dist/crazy8.d.ts +65 -0
  36. package/dist/crazy8.js +366 -0
  37. package/dist/crazy8.js.map +1 -0
  38. package/dist/cribbage.d.ts +75 -0
  39. package/dist/cribbage.js +428 -0
  40. package/dist/cribbage.js.map +1 -0
  41. package/dist/cuckoo.d.ts +43 -0
  42. package/dist/cuckoo.js +216 -0
  43. package/dist/cuckoo.js.map +1 -0
  44. package/dist/drinkingpyramid.d.ts +54 -0
  45. package/dist/drinkingpyramid.js +213 -0
  46. package/dist/drinkingpyramid.js.map +1 -0
  47. package/dist/drinks.d.ts +25 -0
  48. package/dist/drinks.js +40 -0
  49. package/dist/drinks.js.map +1 -0
  50. package/dist/dropfour.d.ts +103 -0
  51. package/dist/dropfour.js +577 -0
  52. package/dist/dropfour.js.map +1 -0
  53. package/dist/durak.d.ts +58 -0
  54. package/dist/durak.js +332 -0
  55. package/dist/durak.js.map +1 -0
  56. package/dist/euchre.d.ts +80 -0
  57. package/dist/euchre.js +453 -0
  58. package/dist/euchre.js.map +1 -0
  59. package/dist/fivedraw.d.ts +50 -0
  60. package/dist/fivedraw.js +289 -0
  61. package/dist/fivedraw.js.map +1 -0
  62. package/dist/fivehundred.d.ts +90 -0
  63. package/dist/fivehundred.js +504 -0
  64. package/dist/fivehundred.js.map +1 -0
  65. package/dist/freecell.d.ts +50 -0
  66. package/dist/freecell.js +327 -0
  67. package/dist/freecell.js.map +1 -0
  68. package/dist/fruitsalad.d.ts +69 -0
  69. package/dist/fruitsalad.js +427 -0
  70. package/dist/fruitsalad.js.map +1 -0
  71. package/dist/gin.d.ts +72 -0
  72. package/dist/gin.js +393 -0
  73. package/dist/gin.js.map +1 -0
  74. package/dist/go.d.ts +132 -0
  75. package/dist/go.js +659 -0
  76. package/dist/go.js.map +1 -0
  77. package/dist/goboard.d.ts +218 -0
  78. package/dist/goboard.js +880 -0
  79. package/dist/goboard.js.map +1 -0
  80. package/dist/gofish.d.ts +37 -0
  81. package/dist/gofish.js +235 -0
  82. package/dist/gofish.js.map +1 -0
  83. package/dist/golf.d.ts +64 -0
  84. package/dist/golf.js +343 -0
  85. package/dist/golf.js.map +1 -0
  86. package/dist/handfoot.d.ts +86 -0
  87. package/dist/handfoot.js +515 -0
  88. package/dist/handfoot.js.map +1 -0
  89. package/dist/hearts.d.ts +65 -0
  90. package/dist/hearts.js +390 -0
  91. package/dist/hearts.js.map +1 -0
  92. package/dist/holdem.d.ts +45 -0
  93. package/dist/holdem.js +286 -0
  94. package/dist/holdem.js.map +1 -0
  95. package/dist/horserace.d.ts +49 -0
  96. package/dist/horserace.js +207 -0
  97. package/dist/horserace.js.map +1 -0
  98. package/dist/index.d.ts +65 -0
  99. package/dist/index.js +66 -0
  100. package/dist/index.js.map +1 -0
  101. package/dist/kingscorner.d.ts +59 -0
  102. package/dist/kingscorner.js +374 -0
  103. package/dist/kingscorner.js.map +1 -0
  104. package/dist/kingscup.d.ts +44 -0
  105. package/dist/kingscup.js +185 -0
  106. package/dist/kingscup.js.map +1 -0
  107. package/dist/kit.d.ts +283 -0
  108. package/dist/kit.js +73 -0
  109. package/dist/kit.js.map +1 -0
  110. package/dist/klondike.d.ts +57 -0
  111. package/dist/klondike.js +314 -0
  112. package/dist/klondike.js.map +1 -0
  113. package/dist/liarspoker.d.ts +61 -0
  114. package/dist/liarspoker.js +298 -0
  115. package/dist/liarspoker.js.map +1 -0
  116. package/dist/memory.d.ts +36 -0
  117. package/dist/memory.js +181 -0
  118. package/dist/memory.js.map +1 -0
  119. package/dist/minigolf.d.ts +104 -0
  120. package/dist/minigolf.js +724 -0
  121. package/dist/minigolf.js.map +1 -0
  122. package/dist/minigolfcourse.d.ts +127 -0
  123. package/dist/minigolfcourse.js +470 -0
  124. package/dist/minigolfcourse.js.map +1 -0
  125. package/dist/offers.d.ts +136 -0
  126. package/dist/offers.js +279 -0
  127. package/dist/offers.js.map +1 -0
  128. package/dist/ohhell.d.ts +66 -0
  129. package/dist/ohhell.js +331 -0
  130. package/dist/ohhell.js.map +1 -0
  131. package/dist/oldmaid.d.ts +40 -0
  132. package/dist/oldmaid.js +186 -0
  133. package/dist/oldmaid.js.map +1 -0
  134. package/dist/pinochle.d.ts +94 -0
  135. package/dist/pinochle.js +466 -0
  136. package/dist/pinochle.js.map +1 -0
  137. package/dist/pitch.d.ts +77 -0
  138. package/dist/pitch.js +362 -0
  139. package/dist/pitch.js.map +1 -0
  140. package/dist/poker.d.ts +79 -0
  141. package/dist/poker.js +268 -0
  142. package/dist/poker.js.map +1 -0
  143. package/dist/president.d.ts +56 -0
  144. package/dist/president.js +339 -0
  145. package/dist/president.js.map +1 -0
  146. package/dist/pyramid.d.ts +39 -0
  147. package/dist/pyramid.js +200 -0
  148. package/dist/pyramid.js.map +1 -0
  149. package/dist/registry.d.ts +17 -0
  150. package/dist/registry.js +70 -0
  151. package/dist/registry.js.map +1 -0
  152. package/dist/reversi.d.ts +69 -0
  153. package/dist/reversi.js +584 -0
  154. package/dist/reversi.js.map +1 -0
  155. package/dist/ridethebus.d.ts +48 -0
  156. package/dist/ridethebus.js +257 -0
  157. package/dist/ridethebus.js.map +1 -0
  158. package/dist/rummy500.d.ts +89 -0
  159. package/dist/rummy500.js +474 -0
  160. package/dist/rummy500.js.map +1 -0
  161. package/dist/sevens.d.ts +48 -0
  162. package/dist/sevens.js +221 -0
  163. package/dist/sevens.js.map +1 -0
  164. package/dist/slapjack.d.ts +42 -0
  165. package/dist/slapjack.js +224 -0
  166. package/dist/slapjack.js.map +1 -0
  167. package/dist/speed.d.ts +44 -0
  168. package/dist/speed.js +201 -0
  169. package/dist/speed.js.map +1 -0
  170. package/dist/spider.d.ts +51 -0
  171. package/dist/spider.js +320 -0
  172. package/dist/spider.js.map +1 -0
  173. package/dist/spite.d.ts +75 -0
  174. package/dist/spite.js +372 -0
  175. package/dist/spite.js.map +1 -0
  176. package/dist/sport.d.ts +266 -0
  177. package/dist/sport.js +48 -0
  178. package/dist/sport.js.map +1 -0
  179. package/dist/switch.d.ts +69 -0
  180. package/dist/switch.js +393 -0
  181. package/dist/switch.js.map +1 -0
  182. package/dist/table.d.ts +284 -0
  183. package/dist/table.js +67 -0
  184. package/dist/table.js.map +1 -0
  185. package/dist/talk.d.ts +17 -0
  186. package/dist/talk.js +44 -0
  187. package/dist/talk.js.map +1 -0
  188. package/dist/thirtyone.d.ts +66 -0
  189. package/dist/thirtyone.js +372 -0
  190. package/dist/thirtyone.js.map +1 -0
  191. package/dist/tictactoe.d.ts +68 -0
  192. package/dist/tictactoe.js +541 -0
  193. package/dist/tictactoe.js.map +1 -0
  194. package/dist/tricks.d.ts +21 -0
  195. package/dist/tricks.js +48 -0
  196. package/dist/tricks.js.map +1 -0
  197. package/dist/war.d.ts +44 -0
  198. package/dist/war.js +185 -0
  199. package/dist/war.js.map +1 -0
  200. package/dist/whist.d.ts +52 -0
  201. package/dist/whist.js +218 -0
  202. package/dist/whist.js.map +1 -0
  203. package/dist/yacht.d.ts +96 -0
  204. package/dist/yacht.js +653 -0
  205. package/dist/yacht.js.map +1 -0
  206. package/package.json +41 -4
  207. package/README.md +0 -3
package/dist/poker.js ADDED
@@ -0,0 +1,268 @@
1
+ // Poker's shared parts, for chips only (points, never money): ranking hands, fixed-limit betting
2
+ // rounds, and settling the pot (side pots included) at the showdown. Five Card Draw and Texas
3
+ // Hold'em are built on these.
4
+ import { GameError, rankLabel, who } from "./kit.js";
5
+ // ---- Ranking hands ------------------------------------------------------------------------------
6
+ const rankOf = (c) => c.rank;
7
+ const suitOf = (c) => c.suit;
8
+ export const CATEGORY = ["High card", "One pair", "Two pair", "Three of a kind", "Straight", "Flush", "Full house", "Four of a kind", "Straight flush"];
9
+ /** A five-card hand's strength: its category, then the ranks that break ties. Compare with compareScore. */
10
+ export function score5(cards) {
11
+ const ranks = cards.map(rankOf).sort((a, b) => b - a);
12
+ const counts = new Map();
13
+ for (const r of ranks)
14
+ counts.set(r, (counts.get(r) ?? 0) + 1);
15
+ // Ranks by how many there are, then how high.
16
+ const groups = [...counts].sort((a, b) => b[1] - a[1] || b[0] - a[0]);
17
+ const flush = new Set(cards.map(suitOf)).size === 1;
18
+ const unique = [...counts.keys()].sort((a, b) => b - a);
19
+ let straightHigh = 0;
20
+ if (unique.length === 5) {
21
+ if (unique[0] - unique[4] === 4)
22
+ straightHigh = unique[0];
23
+ else if (unique.join() === "14,5,4,3,2")
24
+ straightHigh = 5; // the wheel: A 2 3 4 5
25
+ }
26
+ if (straightHigh && flush)
27
+ return [8, straightHigh];
28
+ if (groups[0][1] === 4)
29
+ return [7, groups[0][0], groups[1][0]];
30
+ if (groups[0][1] === 3 && groups[1][1] === 2)
31
+ return [6, groups[0][0], groups[1][0]];
32
+ if (flush)
33
+ return [5, ...ranks];
34
+ if (straightHigh)
35
+ return [4, straightHigh];
36
+ if (groups[0][1] === 3)
37
+ return [3, groups[0][0], ...groups.slice(1).map((g) => g[0])];
38
+ if (groups[0][1] === 2 && groups[1][1] === 2)
39
+ return [2, groups[0][0], groups[1][0], groups[2][0]];
40
+ if (groups[0][1] === 2)
41
+ return [1, groups[0][0], ...groups.slice(1).map((g) => g[0])];
42
+ return [0, ...ranks];
43
+ }
44
+ export function compareScore(a, b) {
45
+ for (let i = 0; i < Math.max(a.length, b.length); i++)
46
+ if ((a[i] ?? 0) !== (b[i] ?? 0))
47
+ return (a[i] ?? 0) - (b[i] ?? 0);
48
+ return 0;
49
+ }
50
+ /** The best five cards of five to seven, and their score. */
51
+ export function bestHand(cards) {
52
+ let best = null;
53
+ const n = cards.length;
54
+ for (let a = 0; a < n; a++)
55
+ for (let b = a + 1; b < n; b++)
56
+ for (let c = b + 1; c < n; c++)
57
+ for (let d = c + 1; d < n; d++)
58
+ for (let e = d + 1; e < n; e++) {
59
+ const five = [cards[a], cards[b], cards[c], cards[d], cards[e]];
60
+ const score = score5(five);
61
+ if (!best || compareScore(score, best.score) > 0)
62
+ best = { score, cards: five };
63
+ }
64
+ return best;
65
+ }
66
+ const plural = (r) => ({ 14: "aces", 13: "kings", 12: "queens", 11: "jacks", 10: "tens", 9: "nines", 8: "eights", 7: "sevens", 6: "sixes", 5: "fives", 4: "fours", 3: "threes", 2: "twos" })[r] ?? `${r}s`;
67
+ const single = (r) => ({ 14: "ace", 13: "king", 12: "queen", 11: "jack", 10: "ten", 9: "nine", 8: "eight", 7: "seven", 6: "six", 5: "five", 4: "four", 3: "three", 2: "two" })[r] ?? String(r);
68
+ /** A hand's name, as you'd say it at the table: "two pair, kings and sevens". */
69
+ export function handName(score) {
70
+ const [cat, a = 0, b = 0] = score;
71
+ switch (cat) {
72
+ case 8:
73
+ return a === 14 ? "a royal flush" : `a straight flush to the ${single(a)}`;
74
+ case 7:
75
+ return `four ${plural(a)}`;
76
+ case 6:
77
+ return `a full house, ${plural(a)} full of ${plural(b)}`;
78
+ case 5:
79
+ return `a flush, ${single(a)} high`;
80
+ case 4:
81
+ return `a straight to the ${single(a)}`;
82
+ case 3:
83
+ return `three ${plural(a)}`;
84
+ case 2:
85
+ return `two pair, ${plural(a)} and ${plural(b)}`;
86
+ case 1:
87
+ return `a pair of ${plural(a)}`;
88
+ default:
89
+ return `${single(a)} high`;
90
+ }
91
+ }
92
+ /** Roughly how strong a made hand is, 0 to 1, for the computer players. */
93
+ export function strengthOf(score) {
94
+ const [cat = 0, a = 2] = score;
95
+ const base = [0.05, 0.3, 0.55, 0.68, 0.78, 0.84, 0.92, 0.97, 0.99][cat];
96
+ const span = [0.2, 0.22, 0.1, 0.08, 0.05, 0.05, 0.04, 0.02, 0.01][cat];
97
+ return Math.min(1, base + ((a - 2) / 12) * span);
98
+ }
99
+ export const MAX_RAISES = 4;
100
+ export const allIn = (b, seat) => b.live[seat] && b.stacks[seat] === 0;
101
+ export const pot = (b) => b.committed.reduce((n, x) => n + x, 0);
102
+ /** Players who can still act this round: in the hand with chips behind. */
103
+ const canAct = (b, seat) => b.live[seat] && b.stacks[seat] > 0;
104
+ /** Put chips in (as many as the player has: short of that is all in). */
105
+ export function putIn(b, seat, chips) {
106
+ const n = Math.min(chips, b.stacks[seat]);
107
+ b.stacks[seat] -= n;
108
+ b.committed[seat] += n;
109
+ b.roundBet[seat] += n;
110
+ }
111
+ /** Start a betting round: no bets yet (blinds are put in by the caller), first to act given. */
112
+ export function newRound(b, size, first) {
113
+ b.roundBet = b.roundBet.map(() => 0);
114
+ b.toMatch = 0;
115
+ b.size = size;
116
+ b.raises = 0;
117
+ b.acted = b.acted.map(() => false);
118
+ b.turn = nextToAct(b, first - 1) ?? first;
119
+ }
120
+ /** The next player after `from` who can act, or null. */
121
+ export function nextToAct(b, from) {
122
+ const n = b.stacks.length;
123
+ for (let i = 1; i <= n; i++) {
124
+ const seat = (((from + i) % n) + n) % n;
125
+ if (canAct(b, seat))
126
+ return seat;
127
+ }
128
+ return null;
129
+ }
130
+ /** The round is over: everyone who can act has, and has matched the bet. */
131
+ export function roundDone(b) {
132
+ if (b.live.filter(Boolean).length <= 1)
133
+ return true;
134
+ const actors = b.stacks.map((_, i) => i).filter((i) => canAct(b, i));
135
+ if (actors.length === 0)
136
+ return true;
137
+ // One player left with chips and nothing to call: no one to bet against.
138
+ if (actors.length === 1 && b.roundBet[actors[0]] >= b.toMatch)
139
+ return true;
140
+ return actors.every((i) => b.acted[i] && b.roundBet[i] === b.toMatch);
141
+ }
142
+ /** What this player may do now, with the chips each costs. */
143
+ export function options(b, seat) {
144
+ const owe = b.toMatch - b.roundBet[seat];
145
+ const stack = b.stacks[seat];
146
+ const othersCanCall = b.stacks.some((s, i) => i !== seat && b.live[i] && s > 0);
147
+ return {
148
+ fold: owe > 0,
149
+ check: owe === 0,
150
+ call: owe > 0 ? Math.min(owe, stack) : null,
151
+ raise: b.raises < MAX_RAISES && stack > owe && othersCanCall ? Math.min(owe + b.size, stack) : null,
152
+ };
153
+ }
154
+ /** Apply a betting move. Returns a few words for the news. */
155
+ export function bet(b, seat, move) {
156
+ if (b.turn !== seat)
157
+ throw new GameError("It's not your turn to bet.");
158
+ const opt = options(b, seat);
159
+ let words;
160
+ switch (move.type) {
161
+ case "fold":
162
+ if (!opt.fold)
163
+ throw new GameError("There's nothing to call: check instead.");
164
+ b.live[seat] = false;
165
+ words = "folds";
166
+ break;
167
+ case "check":
168
+ if (!opt.check)
169
+ throw new GameError(`It's ${b.toMatch - b.roundBet[seat]} to call.`);
170
+ words = "checks";
171
+ break;
172
+ case "call":
173
+ if (opt.call === null)
174
+ throw new GameError("There's nothing to call.");
175
+ putIn(b, seat, opt.call);
176
+ words = b.stacks[seat] === 0 ? `calls ${opt.call}, all in` : `calls ${opt.call}`;
177
+ break;
178
+ case "raise": {
179
+ if (opt.raise === null)
180
+ throw new GameError(b.raises >= MAX_RAISES ? "The betting is capped this round." : "You can't raise now.");
181
+ const was = b.toMatch;
182
+ putIn(b, seat, opt.raise);
183
+ b.toMatch = Math.max(b.toMatch, b.roundBet[seat]);
184
+ // A short all-in that doesn't make a full raise doesn't reopen the betting.
185
+ if (b.toMatch - was >= b.size) {
186
+ b.raises += 1;
187
+ b.acted = b.acted.map(() => false);
188
+ }
189
+ words = was === 0 ? `bets ${b.roundBet[seat]}` : `raises to ${b.roundBet[seat]}`;
190
+ if (b.stacks[seat] === 0)
191
+ words += ", all in";
192
+ break;
193
+ }
194
+ default:
195
+ throw new GameError("That's not a betting move.");
196
+ }
197
+ b.acted[seat] = true;
198
+ b.turn = nextToAct(b, seat) ?? seat;
199
+ return words;
200
+ }
201
+ /**
202
+ * Share out the pot at the showdown: main pot and side pots, each to the best hand among those who
203
+ * paid into it (ties split; odd chips to the first winner after the dealer). Returns chips won.
204
+ */
205
+ export function settle(b, scores, dealer) {
206
+ const n = b.stacks.length;
207
+ const won = Array.from({ length: n }, () => 0);
208
+ const levels = [...new Set(b.committed.filter((c, i) => c > 0 && b.live[i]))].sort((x, y) => x - y);
209
+ let prev = 0;
210
+ let left = pot(b);
211
+ for (const level of levels) {
212
+ const slice = b.committed.reduce((sum, c) => sum + Math.max(0, Math.min(c, level) - prev), 0);
213
+ const eligible = b.committed.map((c, i) => i).filter((i) => b.live[i] && b.committed[i] >= level && scores[i]);
214
+ if (eligible.length) {
215
+ const top = eligible.reduce((best, i) => (compareScore(scores[i], scores[best]) > 0 ? i : best), eligible[0]);
216
+ const winners = eligible.filter((i) => compareScore(scores[i], scores[top]) === 0).sort((x, y) => ((x - dealer - 1 + n) % n) - ((y - dealer - 1 + n) % n));
217
+ const share = Math.floor(slice / winners.length);
218
+ winners.forEach((i, k) => (won[i] += share + (k < slice - share * winners.length ? 1 : 0)));
219
+ left -= slice;
220
+ }
221
+ prev = level;
222
+ }
223
+ // Anything left over (from folded players above every live player's level) goes to the best hand.
224
+ if (left > 0) {
225
+ const live = b.live.map((l, i) => (l ? i : -1)).filter((i) => i >= 0 && scores[i]);
226
+ const top = live.reduce((best, i) => (compareScore(scores[i], scores[best]) > 0 ? i : best), live[0]);
227
+ won[top] += left;
228
+ }
229
+ for (let i = 0; i < n; i++)
230
+ b.stacks[i] += won[i];
231
+ return won;
232
+ }
233
+ /** Everyone but one folded: they take it all without showing. */
234
+ export function lastStanding(b) {
235
+ const live = b.live.map((l, i) => (l ? i : -1)).filter((i) => i >= 0);
236
+ return live.length === 1 ? live[0] : null;
237
+ }
238
+ /** The betting buttons for whoever's turn it is. */
239
+ export function betChoices(b, seat, wording = { bet: "Bet", raise: "Raise to" }) {
240
+ const o = options(b, seat);
241
+ const out = [];
242
+ if (o.fold)
243
+ out.push({ label: "Fold", move: { type: "fold" } });
244
+ if (o.check)
245
+ out.push({ label: "Check", move: { type: "check" }, primary: true });
246
+ if (o.call !== null)
247
+ out.push({ label: o.call === b.stacks[seat] ? `Call ${o.call} (all in)` : `Call ${o.call}`, move: { type: "call" }, primary: true });
248
+ if (o.raise !== null)
249
+ out.push({ label: b.toMatch === 0 ? `${wording.bet} ${o.raise}` : `${wording.raise} ${b.roundBet[seat] + o.raise}`, move: { type: "raise" } });
250
+ return out;
251
+ }
252
+ /** For a computer player: fold, check/call or raise, from how strong its hand is and its nerve. */
253
+ export function decide(b, seat, strength, bold, rand = Math.random) {
254
+ const o = options(b, seat);
255
+ const owe = o.call ?? 0;
256
+ const potOdds = owe / (pot(b) + owe || 1);
257
+ const bluff = rand() < 0.06 + bold * 0.1;
258
+ if (o.raise !== null && (strength > 0.72 - bold * 0.08 || (bluff && strength > 0.15)) && rand() < 0.8)
259
+ return { type: "raise" };
260
+ if (o.check)
261
+ return { type: "check" };
262
+ if (strength > potOdds + 0.12 - bold * 0.06 || owe <= b.size / 2)
263
+ return { type: "call" };
264
+ return { type: "fold" };
265
+ }
266
+ export const chipsWord = (n) => `${n} chip${n === 1 ? "" : "s"}`;
267
+ export { rankLabel, who };
268
+ //# sourceMappingURL=poker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poker.js","sourceRoot":"","sources":["../src/poker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import { type BaseRules, type CardGame, type KCard } from "./kit.js";
2
+ export interface PresidentRules extends BaseRules {
3
+ hands: number;
4
+ /** Twos are the highest cards (otherwise aces are, and twos are lowest). */
5
+ twosHigh: boolean;
6
+ /** The Scum and Vice Scum give their best cards to the President and Vice President. */
7
+ swap: boolean;
8
+ /** Drinking mode, a house rule: see the game's describe(). */
9
+ drinking?: boolean;
10
+ }
11
+ export declare const classicPresident: PresidentRules;
12
+ export declare const quickPresident: PresidentRules;
13
+ export declare const gentlePresident: PresidentRules;
14
+ type Phase = "swap" | "playing" | "scored" | "finished";
15
+ export interface PresidentState {
16
+ game: "president";
17
+ rules: PresidentRules;
18
+ seats: number;
19
+ rng: number;
20
+ hand: number;
21
+ dealer: number;
22
+ phase: Phase;
23
+ hands: KCard[][];
24
+ /** The cards on the pile now (the last play), who played them, and how many each play must be. */
25
+ pile: KCard[];
26
+ lastPlayer: number | null;
27
+ count: number;
28
+ passed: boolean[];
29
+ turn: number;
30
+ /** Seats in the order they went out this hand. */
31
+ finished: number[];
32
+ /** Last hand's titles by seat: 0 President, 1 Vice President, … */
33
+ places: number[] | null;
34
+ /** In the swap: how many cards each seat still has to give back, and what they were handed. */
35
+ owes: number[];
36
+ received: KCard[][];
37
+ scores: number[];
38
+ ready: boolean[];
39
+ narration: string | null;
40
+ }
41
+ /** The title for a finishing place among this many players. */
42
+ export declare function title(place: number, seats: number): string;
43
+ export declare function newPresident(rules: PresidentRules, seats: number, seed: number): PresidentState;
44
+ type Move = {
45
+ type: "play";
46
+ cards: string[];
47
+ } | {
48
+ type: "pass";
49
+ } | {
50
+ type: "give";
51
+ cards: string[];
52
+ } | {
53
+ type: "next";
54
+ };
55
+ export declare const president: CardGame<PresidentRules, PresidentState, Move>;
56
+ export {};