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

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
@@ -0,0 +1,504 @@
1
+ import { clone, GameError, makeDeck, markReady, nextRandom, rankLabel, rankSeats, shuffled, sortCards, SUITS, SYMBOL, teamOfSeat, thinkFor, who, } from "./kit.js";
2
+ import { bestLoser, cheapestWinner, trickWinner } from "./tricks.js";
3
+ export const classic500 = { id: "500-classic", name: "Five Hundred", misere: true, slam: true };
4
+ export const plain500 = { ...classic500, id: "500-plain", name: "No misère", misere: false };
5
+ const DENOMS = ["spades", "clubs", "diamonds", "hearts", "nt"];
6
+ const BASE = { spades: 40, clubs: 60, diamonds: 80, hearts: 100, nt: 120, misere: 250 };
7
+ export const bidValue = (b) => (b.denom === "misere" ? 250 : BASE[b.denom] + (b.tricks - 6) * 100);
8
+ export const bidName500 = (b) => (b.denom === "misere" ? "Misère" : `${b.tricks}${b.denom === "nt" ? " no trumps" : SYMBOL[b.denom]}`);
9
+ const shortBid = (b) => (b.denom === "misere" ? "Misère" : `${b.tricks}${b.denom === "nt" ? "NT" : SYMBOL[b.denom]}`);
10
+ /** Every bid there is, cheapest first. */
11
+ export function allBids(rules) {
12
+ const out = [];
13
+ for (let t = 6; t <= 10; t++)
14
+ for (const d of DENOMS)
15
+ out.push({ tricks: t, denom: d });
16
+ if (rules.misere)
17
+ out.push({ tricks: 0, denom: "misere" });
18
+ return out.sort((a, b) => bidValue(a) - bidValue(b));
19
+ }
20
+ const RED = ["hearts", "diamonds"];
21
+ const isJoker = (c) => c.kind === "joker";
22
+ const rank = (c) => c.rank;
23
+ const rawSuit = (c) => c.suit;
24
+ const trumpOf = (s) => (s.high && s.high.bid.denom !== "nt" && s.high.bid.denom !== "misere" ? s.high.bid.denom : null);
25
+ const isRight = (c, trump) => !!trump && !isJoker(c) && rank(c) === 11 && rawSuit(c) === trump;
26
+ const isLeft = (c, trump) => !!trump && !isJoker(c) && rank(c) === 11 && rawSuit(c) !== trump && RED.includes(rawSuit(c)) === RED.includes(trump);
27
+ /** The suit a card counts as. The joker is a trump; with no trumps it's the suit it was led as (or none). */
28
+ const suitFor = (trump, jokerSuit) => (c) => (isJoker(c) ? (trump ?? jokerSuit ?? "joker") : isLeft(c, trump) ? trump : rawSuit(c));
29
+ const powerFor = (trump) => (c) => (isJoker(c) ? 1000 : isRight(c, trump) ? 100 : isLeft(c, trump) ? 99 : rank(c));
30
+ const label = (c) => (isJoker(c) ? "joker" : `${rankLabel(rank(c))}${SYMBOL[rawSuit(c)]}`);
31
+ const partnerOf = (seat) => (seat + 2) % 4;
32
+ const sitter = (s) => (s.high?.bid.denom === "misere" ? partnerOf(s.high.seat) : null);
33
+ const inHand = (s) => (sitter(s) === null ? 4 : 3);
34
+ const nextSeat = (s, seat) => {
35
+ let n = (seat + 1) % 4;
36
+ if (n === sitter(s))
37
+ n = (n + 1) % 4;
38
+ return n;
39
+ };
40
+ const sortFor = (cards, trump) => sortCards(cards, powerFor(trump), (c) => (isJoker(c) ? (trump ?? "joker") : suitFor(trump, null)(c)));
41
+ /** The 43-card deck: 5 to ace, the red 4s, and a joker. */
42
+ export function deck500() {
43
+ const deck = makeDeck({ ranks: [5, 6, 7, 8, 9, 10, 11, 12, 13, 14], jokers: 1 });
44
+ return [...deck, ...makeDeck({ ranks: [4] }).filter((c) => RED.includes(rawSuit(c)))];
45
+ }
46
+ function deal(s) {
47
+ const deck = shuffled(deck500(), nextRandom(s));
48
+ s.hands = [0, 1, 2, 3].map((i) => sortFor(deck.slice(i * 10, i * 10 + 10), null));
49
+ s.kitty = deck.slice(40);
50
+ s.bids = [null, null, null, null];
51
+ s.passed = [false, false, false, false];
52
+ s.high = null;
53
+ s.trick = [];
54
+ s.jokerSuit = null;
55
+ s.lastTrick = null;
56
+ s.tricksWon = [0, 0, 0, 0];
57
+ s.ready = [false, false, false, false];
58
+ s.phase = "bidding";
59
+ s.turn = (s.dealer + 1) % 4;
60
+ }
61
+ export function newFiveHundred(rules, _seats, seed) {
62
+ const s = { game: "fivehundred", rules, seats: 4, rng: seed >>> 0, hand: 0, dealer: seed % 4, scores: [0, 0], lastHand: null, narration: null };
63
+ deal(s);
64
+ return s;
65
+ }
66
+ /** The bids this seat may make now (passing is always allowed). */
67
+ export function bidsFor(s, seat) {
68
+ if (s.phase !== "bidding" || s.turn !== seat)
69
+ return [];
70
+ const floor = s.high ? bidValue(s.high.bid) : 0;
71
+ return allBids(s.rules).filter((b) => bidValue(b) > floor);
72
+ }
73
+ export function legal500(s, seat) {
74
+ if (s.phase !== "playing" || s.turn !== seat)
75
+ return [];
76
+ const hand = s.hands[seat];
77
+ if (!s.trick.length)
78
+ return hand;
79
+ const trump = trumpOf(s);
80
+ const suitOf = suitFor(trump, s.jokerSuit);
81
+ const led = suitOf(s.trick[0].card);
82
+ const same = hand.filter((c) => !isJoker(c) && suitOf(c) === led);
83
+ // With trumps the joker is a trump and follows trump leads; without, it's played when you're out of the suit led.
84
+ if (trump) {
85
+ const follow = hand.filter((c) => suitOf(c) === led);
86
+ return follow.length ? follow : hand;
87
+ }
88
+ return same.length ? same : hand;
89
+ }
90
+ function nextBidder(s, from) {
91
+ for (let i = 1; i <= 4; i++) {
92
+ const n = (from + i) % 4;
93
+ if (!s.passed[n])
94
+ return n;
95
+ }
96
+ return null;
97
+ }
98
+ function apply(state, seat, move) {
99
+ const s = clone(state);
100
+ switch (move.type) {
101
+ case "next": {
102
+ if (s.phase !== "scored")
103
+ throw new GameError("The hand isn't over.");
104
+ if (markReady(s.ready, seat)) {
105
+ s.hand += 1;
106
+ s.dealer = (s.dealer + 1) % 4;
107
+ s.narration = null;
108
+ deal(s);
109
+ }
110
+ return s;
111
+ }
112
+ case "pass":
113
+ case "bid": {
114
+ if (s.phase !== "bidding" || s.turn !== seat)
115
+ throw new GameError("It's not your turn to bid.");
116
+ if (move.type === "bid") {
117
+ const bid = { tricks: Number(move.tricks), denom: move.denom };
118
+ if (!bidsFor(s, seat).some((b) => b.tricks === bid.tricks && b.denom === bid.denom))
119
+ throw new GameError(s.high ? `Bid more than ${bidName500(s.high.bid)} (${bidValue(s.high.bid)}).` : "That's not a bid.");
120
+ s.bids[seat] = bid;
121
+ s.high = { seat, bid };
122
+ s.narration = `${who(seat)} bid ${bidName500(bid)}`;
123
+ }
124
+ else {
125
+ s.passed[seat] = true;
126
+ s.narration = `${who(seat)} passed`;
127
+ }
128
+ const left = s.passed.filter((p) => !p).length;
129
+ if (left === 0) {
130
+ s.narration = "Everyone passed: new deal";
131
+ s.dealer = (s.dealer + 1) % 4;
132
+ deal(s);
133
+ return s;
134
+ }
135
+ if (left === 1 && s.high && !s.passed[s.high.seat]) {
136
+ // The auction is won: the kitty goes to the bidder.
137
+ const w = s.high.seat;
138
+ s.hands[w] = sortFor([...s.hands[w], ...s.kitty], trumpOf(s));
139
+ s.kitty = [];
140
+ s.phase = "kitty";
141
+ s.turn = w;
142
+ s.narration = `${who(w)} won the bid: ${bidName500(s.high.bid)}${s.high.bid.denom === "misere" ? `, and ${who(partnerOf(w))} sits out` : ""}`;
143
+ return s;
144
+ }
145
+ s.turn = nextBidder(s, seat);
146
+ return s;
147
+ }
148
+ case "discard": {
149
+ if (s.phase !== "kitty" || s.turn !== seat)
150
+ throw new GameError("It's not time to discard.");
151
+ if (!Array.isArray(move.cards) || new Set(move.cards).size !== 3)
152
+ throw new GameError("Put three cards back.");
153
+ const hand = s.hands[seat];
154
+ if (!move.cards.every((id) => hand.some((c) => c.id === id)))
155
+ throw new GameError("You don't have those cards.");
156
+ s.kitty = hand.filter((c) => move.cards.includes(c.id));
157
+ s.hands[seat] = hand.filter((c) => !move.cards.includes(c.id));
158
+ const trump = trumpOf(s);
159
+ s.hands = s.hands.map((h) => sortFor(h, trump));
160
+ s.phase = "playing";
161
+ s.turn = seat;
162
+ s.narration = `${who(seat)} leads`;
163
+ return s;
164
+ }
165
+ case "nominate": {
166
+ if (s.phase !== "nominate" || s.turn !== seat)
167
+ throw new GameError("It's not time to name a suit.");
168
+ if (!SUITS.includes(move.suit))
169
+ throw new GameError("That's not a suit.");
170
+ s.jokerSuit = move.suit;
171
+ s.phase = "playing";
172
+ s.narration = `${who(seat)} led the joker as ${SYMBOL[move.suit]}`;
173
+ s.turn = nextSeat(s, seat);
174
+ return s;
175
+ }
176
+ case "play": {
177
+ if (s.phase !== "playing" || s.turn !== seat)
178
+ throw new GameError("It's not your turn.");
179
+ const card = s.hands[seat].find((c) => c.id === move.card);
180
+ if (!card)
181
+ throw new GameError("You don't have that card.");
182
+ if (!legal500(s, seat).some((c) => c.id === card.id))
183
+ throw new GameError("Follow the suit led if you can (the joker and the left bower are trumps).");
184
+ if (!s.trick.length) {
185
+ s.lastTrick = null;
186
+ s.jokerSuit = null;
187
+ }
188
+ s.hands[seat] = s.hands[seat].filter((c) => c.id !== card.id);
189
+ s.trick.push({ seat, card });
190
+ s.narration = null;
191
+ // The joker led with no trumps: its leader says which suit it is.
192
+ if (s.trick.length === 1 && isJoker(card) && !trumpOf(s)) {
193
+ s.phase = "nominate";
194
+ return s;
195
+ }
196
+ if (s.trick.length < inHand(s)) {
197
+ s.turn = nextSeat(s, seat);
198
+ return s;
199
+ }
200
+ const trump = trumpOf(s);
201
+ const joker = s.trick.find((p) => isJoker(p.card));
202
+ const win = joker ?? trickWinner(s.trick, trump, suitFor(trump, s.jokerSuit), powerFor(trump));
203
+ s.tricksWon[win.seat] += 1;
204
+ s.lastTrick = { plays: s.trick, winner: win.seat };
205
+ s.trick = [];
206
+ s.turn = win.seat;
207
+ // Misère is lost the moment the bidder takes a trick.
208
+ const misereLost = s.high.bid.denom === "misere" && win.seat === s.high.seat;
209
+ if (misereLost || s.hands[win.seat].length === 0)
210
+ scoreHand(s);
211
+ return s;
212
+ }
213
+ default:
214
+ throw new GameError("That's not a move in Five Hundred.");
215
+ }
216
+ }
217
+ /** What each side scores for a hand. */
218
+ export function score500(rules, bid, bidderTricks, otherTricks) {
219
+ if (bid.denom === "misere") {
220
+ const made = bidderTricks === 0;
221
+ return { bidders: made ? 250 : -250, others: 0, made };
222
+ }
223
+ const made = bidderTricks >= bid.tricks;
224
+ const value = bidValue(bid);
225
+ const bidders = made ? (rules.slam && bidderTricks === 10 ? Math.max(value, 250) : value) : -value;
226
+ return { bidders, others: otherTricks * 10, made };
227
+ }
228
+ function scoreHand(s) {
229
+ const { seat, bid } = s.high;
230
+ const team = teamOfSeat(seat);
231
+ const tricks = [s.tricksWon[0] + s.tricksWon[2], s.tricksWon[1] + s.tricksWon[3]];
232
+ const bidderTricks = bid.denom === "misere" ? s.tricksWon[seat] : tricks[team];
233
+ const { bidders, others, made } = score500(s.rules, bid, bidderTricks, tricks[1 - team]);
234
+ const points = [0, 0];
235
+ points[team] = bidders;
236
+ // The other side can't go out on 10s: they stop at 490.
237
+ const otherTeam = (1 - team);
238
+ points[otherTeam] = Math.max(0, Math.min(others, 490 - s.scores[otherTeam]));
239
+ s.scores = [s.scores[0] + points[0], s.scores[1] + points[1]];
240
+ s.lastHand = { seat, bid, tricks, points, made };
241
+ s.narration = made ? `${who(seat)} made ${bidName500(bid)}: +${bidders}` : `${who(seat)} went down in ${bidName500(bid)}: ${bidders}`;
242
+ s.ready = [false, false, false, false];
243
+ const won = s.scores[team] >= 500 && made;
244
+ const lost = s.scores.some((n) => n <= -500);
245
+ s.phase = won || lost ? "finished" : "scored";
246
+ }
247
+ function winningTeam(s) {
248
+ if (s.scores[0] <= -500)
249
+ return 1;
250
+ if (s.scores[1] <= -500)
251
+ return 0;
252
+ return s.scores[0] >= 500 ? 0 : 1;
253
+ }
254
+ function view(s, seat) {
255
+ const over = s.phase === "finished";
256
+ const trump = trumpOf(s);
257
+ const sits = sitter(s);
258
+ let choices = null;
259
+ const bids = bidsFor(s, seat);
260
+ if (s.phase === "bidding" && s.turn === seat) {
261
+ // The next two levels up (and misère), not all 26 bids at once.
262
+ const lowest = Math.min(...bids.filter((b) => b.denom !== "misere").map((b) => b.tricks));
263
+ const shown = bids.filter((b) => b.denom === "misere" || b.tricks <= lowest + 1);
264
+ const options = [{ label: "Pass", move: { type: "pass" } }, ...shown.map((b) => ({ label: shortBid(b), move: { type: "bid", tricks: b.tricks, denom: b.denom }, hint: String(bidValue(b)) }))];
265
+ const beat = s.high ? `${bidName500(s.high.bid)} (${bidValue(s.high.bid)}) to beat. ` : "";
266
+ choices = { prompt: `${beat}Bid tricks for your side, or pass. Six: ♠40 ♣60 ♦80 ♥100 NT120, +100 a trick.`, options, layout: "grid" };
267
+ }
268
+ else if (s.phase === "nominate" && s.turn === seat) {
269
+ choices = { prompt: "You led the joker: which suit is it?", options: SUITS.map((suit) => ({ label: SYMBOL[suit], move: { type: "nominate", suit } })), layout: "row" };
270
+ }
271
+ else if (s.phase === "scored" && !s.ready[seat])
272
+ choices = { prompt: "", options: [{ label: "Deal the next hand", move: { type: "next" }, primary: true }] };
273
+ const bidding = s.phase === "bidding";
274
+ const winner = over ? winningTeam(s) : null;
275
+ const sides = [
276
+ [0, 2],
277
+ [1, 3],
278
+ ];
279
+ return {
280
+ game: "fivehundred",
281
+ seats: 4,
282
+ me: seat,
283
+ teams: true,
284
+ phase: s.phase,
285
+ turn: s.phase === "scored" || over ? null : s.turn,
286
+ dealer: s.dealer,
287
+ hand: s.hands[seat],
288
+ tap: s.phase === "playing" && s.turn === seat ? { type: "play", cards: legal500(s, seat).map((c) => c.id) } : null,
289
+ pick: s.phase === "kitty" && s.turn === seat
290
+ ? { min: 3, max: 3, prompt: "You took the kitty: pick three cards to put back", cards: s.hands[seat].map((c) => c.id), actions: [{ label: "Put back", type: "discard", primary: true }] }
291
+ : null,
292
+ choices,
293
+ players: s.hands.map((h, i) => ({
294
+ cards: h.length,
295
+ line: bidding ? (s.passed[i] ? "Passed" : s.bids[i] ? `Bid ${shortBid(s.bids[i])}` : "") : `Took ${s.tricksWon[i]}`,
296
+ team: teamOfSeat(i),
297
+ dealer: i === s.dealer,
298
+ out: i === sits,
299
+ badge: !bidding && s.high?.seat === i ? shortBid(s.high.bid) : i === sits ? "Sitting out" : undefined,
300
+ })),
301
+ center: bidding
302
+ ? { kind: "piles", stock: 3, discard: [], discardCount: 0, drawMove: null, takeMove: null, noDiscard: true, stockLabel: "The kitty" }
303
+ : { kind: "trick", plays: s.trick.length ? s.trick : (s.lastTrick?.plays ?? []), winner: s.trick.length ? null : (s.lastTrick?.winner ?? null) },
304
+ melds: [],
305
+ info: [
306
+ ...(s.high && !bidding ? [s.high.bid.denom === "misere" ? `${who(s.high.seat)} must lose every trick` : `${who(s.high.seat)} & ${who(partnerOf(s.high.seat))} need ${s.high.bid.tricks}`] : []),
307
+ ...(bidding ? [] : trump ? [`Trump ${SYMBOL[trump]} · joker high`] : s.high ? ["No trumps · the joker is top"] : []),
308
+ ...(s.jokerSuit && s.trick.length ? [`Joker led as ${SYMBOL[s.jokerSuit]}`] : []),
309
+ "To 500",
310
+ ],
311
+ narration: s.narration,
312
+ scores: [
313
+ { seats: [0, 2], value: s.scores[0] },
314
+ { seats: [1, 3], value: s.scores[1] },
315
+ ],
316
+ result: s.lastHand && (s.phase === "scored" || over)
317
+ ? {
318
+ key: `500-${s.hand}`,
319
+ title: s.lastHand.made ? `${who(s.lastHand.seat)} made ${bidName500(s.lastHand.bid)}` : `${who(s.lastHand.seat)} went down`,
320
+ sides,
321
+ rows: [
322
+ { label: "Tricks", values: s.lastHand.tricks.map(String) },
323
+ { label: "This hand", values: s.lastHand.points.map((p) => (p > 0 ? `+${p}` : String(p))), tone: "score" },
324
+ { label: "Score", values: s.scores.map(String), tone: "total" },
325
+ ],
326
+ }
327
+ : null,
328
+ over: winner !== null ? { winners: [winner, winner + 2], title: `${who(winner)} & ${who(winner + 2)} win ${s.scores[winner]} to ${s.scores[1 - winner]}` } : null,
329
+ };
330
+ }
331
+ // ---- Computer players --------------------------------------------------------------------------
332
+ /** Tricks a hand should take with this denomination, counting on a trick or so from partner. */
333
+ export function estimate500(hand, denom) {
334
+ if (denom === "misere")
335
+ return 0;
336
+ const trump = denom === "nt" ? null : denom;
337
+ const suitOf = suitFor(trump, null);
338
+ let est = 0;
339
+ const trumps = trump ? hand.filter((c) => suitOf(c) === trump) : [];
340
+ for (const c of hand) {
341
+ if (isJoker(c))
342
+ est += 1;
343
+ else if (trump && suitOf(c) === trump)
344
+ est += isRight(c, trump) ? 1 : isLeft(c, trump) ? 0.9 : rank(c) === 14 ? 0.85 : rank(c) === 13 ? 0.65 : rank(c) >= 10 ? 0.45 : 0.35;
345
+ else if (rank(c) === 14)
346
+ est += trump ? 0.8 : 0.9;
347
+ else if (rank(c) === 13 && hand.filter((x) => !isJoker(x) && rawSuit(x) === rawSuit(c)).length >= 2)
348
+ est += trump ? 0.35 : 0.5;
349
+ }
350
+ if (trump)
351
+ est += Math.max(0, trumps.length - 4) * 0.4; // long trumps take extra tricks
352
+ else
353
+ est -= 0.6; // no trumps is hard to hold
354
+ return est + 2.3; // partner
355
+ }
356
+ /** A hand fit for misère: no joker, nothing above a 9, or very little. */
357
+ const misereFit = (hand) => !hand.some(isJoker) && hand.filter((c) => rank(c) >= 11).length === 0 && hand.filter((c) => rank(c) >= 9).length <= 2;
358
+ function bot(s, seat, style) {
359
+ if (s.phase === "scored")
360
+ return s.ready[seat] ? null : { type: "next" };
361
+ if (s.turn !== seat)
362
+ return null;
363
+ const hand = s.hands[seat];
364
+ const careless = Math.random() < (style.sloppy ?? 0) + (1 - (style.skill ?? 1)) * 0.25;
365
+ if (s.phase === "bidding") {
366
+ const options = bidsFor(s, seat);
367
+ // Don't outbid partner just to bid.
368
+ if (s.high && teamOfSeat(s.high.seat) === teamOfSeat(seat) && Math.random() > 0.15)
369
+ return { type: "pass" };
370
+ const nerve = (style.bold ?? 0.3) * 0.6;
371
+ // The denomination the hand is worth most in; bid the cheapest level of it that beats the table.
372
+ let best = null;
373
+ let bestWorth = 0;
374
+ for (const denom of DENOMS) {
375
+ const t = Math.min(10, Math.floor(estimate500(hand, denom) + nerve));
376
+ if (t < 6)
377
+ continue;
378
+ const pick = options.find((o) => o.denom === denom && o.tricks <= t);
379
+ const worth = bidValue({ tricks: t, denom });
380
+ if (pick && worth > bestWorth) {
381
+ best = pick;
382
+ bestWorth = worth;
383
+ }
384
+ }
385
+ if (s.rules.misere && misereFit(hand) && options.some((o) => o.denom === "misere"))
386
+ return { type: "bid", tricks: 0, denom: "misere" };
387
+ return best ? { type: "bid", tricks: best.tricks, denom: best.denom } : { type: "pass" };
388
+ }
389
+ const trump = trumpOf(s);
390
+ const power = powerFor(trump);
391
+ const suitOf = suitFor(trump, s.jokerSuit);
392
+ const strength = (c) => power(c) + (trump && suitOf(c) === trump ? 200 : 0);
393
+ if (s.phase === "kitty") {
394
+ // Throw the weakest side cards, shortest suits first.
395
+ const misere = s.high.bid.denom === "misere";
396
+ const side = hand.filter((c) => !isJoker(c) && (misere || suitOf(c) !== trump));
397
+ const len = (c) => hand.filter((x) => !isJoker(x) && suitOf(x) === suitOf(c)).length;
398
+ const order = misere ? [...hand].sort((a, b) => strength(b) - strength(a)) : [...side].sort((a, b) => len(a) - len(b) || rank(a) - rank(b));
399
+ const keep = order.length >= 3 ? order : [...order, ...[...hand].sort((a, b) => strength(a) - strength(b))];
400
+ return { type: "discard", cards: [...new Set(keep.map((c) => c.id))].slice(0, 3) };
401
+ }
402
+ if (s.phase === "nominate") {
403
+ const counts = SUITS.map((x) => ({ x, n: hand.filter((c) => !isJoker(c) && rawSuit(c) === x).length }));
404
+ return { type: "nominate", suit: counts.sort((a, b) => a.n - b.n)[0].x };
405
+ }
406
+ if (s.phase !== "playing")
407
+ return null;
408
+ const legal = legal500(s, seat);
409
+ if (legal.length === 1 || careless)
410
+ return { type: "play", card: legal[Math.floor(Math.random() * legal.length)].id };
411
+ const misere = s.high.bid.denom === "misere";
412
+ const bidder = s.high.seat;
413
+ // Misère: the bidder ducks everything; the others try to make the bidder win.
414
+ if (misere) {
415
+ if (seat === bidder) {
416
+ if (!s.trick.length)
417
+ return { type: "play", card: [...legal].sort((a, b) => strength(a) - strength(b))[0].id };
418
+ return { type: "play", card: bestLoser(legal.filter((c) => !isJoker(c)).length ? legal.filter((c) => !isJoker(c)) : legal, seat, s.trick, trump, suitOf, power).id };
419
+ }
420
+ return { type: "play", card: [...legal].sort((a, b) => strength(a) - strength(b))[0].id };
421
+ }
422
+ const ours = teamOfSeat(bidder) === teamOfSeat(seat);
423
+ if (!s.trick.length) {
424
+ const trumps = legal.filter((c) => trump && suitOf(c) === trump).sort((a, b) => strength(b) - strength(a));
425
+ if (ours && trumps.length >= 2)
426
+ return { type: "play", card: trumps[0].id };
427
+ const ace = legal.find((c) => !isJoker(c) && suitOf(c) !== trump && rank(c) === 14);
428
+ if (ace)
429
+ return { type: "play", card: ace.id };
430
+ return { type: "play", card: [...legal].filter((c) => !isJoker(c)).sort((a, b) => strength(a) - strength(b))[0]?.id ?? legal[0].id };
431
+ }
432
+ const joker = s.trick.find((p) => isJoker(p.card));
433
+ const winning = joker ?? trickWinner(s.trick, trump, suitOf, power);
434
+ if (teamOfSeat(winning.seat) === teamOfSeat(seat))
435
+ return { type: "play", card: [...legal].sort((a, b) => strength(a) - strength(b))[0].id };
436
+ if (!joker) {
437
+ const win = cheapestWinner(legal, seat, s.trick, trump, suitOf, (c) => (isJoker(c) ? 1000 : power(c)));
438
+ if (win)
439
+ return { type: "play", card: win.id };
440
+ }
441
+ return { type: "play", card: [...legal].filter((c) => !isJoker(c)).sort((a, b) => strength(a) - strength(b))[0]?.id ?? legal[0].id };
442
+ }
443
+ export const fiveHundred = {
444
+ id: "fivehundred",
445
+ name: "Five Hundred",
446
+ emoji: "💯",
447
+ blurb: "Partners bid tricks; the joker is boss",
448
+ tagline: "Partners bid how many tricks they'll take, and in what. The joker is the best card. First to 500.",
449
+ seats: { min: 4, max: 4, default: 4 },
450
+ teams: true,
451
+ presets: [classic500, plain500],
452
+ fields: [
453
+ { key: "misere", label: "Misère", hint: "Bid to lose every trick, alone (250).", kind: "toggle" },
454
+ { key: "slam", label: "Slam", hint: "Taking all ten tricks scores at least 250.", kind: "toggle" },
455
+ ],
456
+ normalize(rules) {
457
+ const given = (rules && typeof rules === "object" ? rules : {});
458
+ const base = [classic500, plain500].find((p) => p.id === given.id) ?? classic500;
459
+ return { ...base, ...given };
460
+ },
461
+ validate() {
462
+ return [];
463
+ },
464
+ describe(r) {
465
+ return [
466
+ "Partners sit across. A 43-card deck: 5s up to aces, the red 4s, and a joker. Ten cards each and three in the kitty.",
467
+ `Bid how many tricks your side will take (6 to 10) and in what: ♠ 40, ♣ 60, ♦ 80, ♥ 100, no trumps 120 for six, and 100 more for each trick above six.${r.misere ? " Misère (250): play alone, partner sitting out, and lose every trick." : ""} Each bid must be worth more; once you pass you're out of the auction.`,
468
+ "The winner takes the kitty and puts three cards back.",
469
+ "The joker is the top trump, then the jack of trumps and the other jack of the same colour. With no trumps the joker beats everything; lead it and you say which suit it is.",
470
+ `Make your bid and score its value${r.slam ? " (all ten tricks score at least 250)" : ""}; fall short and lose it. The other side scores 10 a trick, but can't go out that way.`,
471
+ "First side to 500 by making a bid wins; a side at −500 loses.",
472
+ ];
473
+ },
474
+ newGame: newFiveHundred,
475
+ apply,
476
+ view,
477
+ bot,
478
+ thinkingTime(s, seat) {
479
+ if (s.phase === "bidding")
480
+ return 1800;
481
+ if (s.phase === "kitty")
482
+ return 2000;
483
+ if (s.phase === "scored")
484
+ return 900;
485
+ return thinkFor(legal500(s, seat).length);
486
+ },
487
+ summary(s) {
488
+ const over = s.phase === "finished";
489
+ const w = over ? winningTeam(s) : 0;
490
+ return {
491
+ game: "fivehundred",
492
+ rules: s.rules.name,
493
+ phase: s.phase,
494
+ over,
495
+ hand: s.hand + 1,
496
+ scoreLine: s.scores.join(" · "),
497
+ order: over ? rankSeats([{ seats: [w, w + 2], score: 1 }, { seats: [1 - w, 3 - w], score: 0 }]) : null,
498
+ winners: over ? [w, w + 2] : null,
499
+ teams: true,
500
+ seats: 4,
501
+ };
502
+ },
503
+ };
504
+ //# sourceMappingURL=fivehundred.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fivehundred.js","sourceRoot":"","sources":["../src/fivehundred.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import { type BaseRules, type CardGame, type KCard } from "./kit.js";
2
+ export interface FreeCellRules extends BaseRules {
3
+ /** A deal number to play (the same number always deals the same game); 0 deals a new one. */
4
+ deal: number;
5
+ }
6
+ export declare const freeCellNew: FreeCellRules;
7
+ type Phase = "playing" | "finished";
8
+ export interface FreeCellState {
9
+ game: "freecell";
10
+ rules: FreeCellRules;
11
+ seats: 1;
12
+ rng: number;
13
+ hand: number;
14
+ dealer: 0;
15
+ phase: Phase;
16
+ /** The deal's number: play it again with the same number. */
17
+ dealNumber: number;
18
+ cells: (KCard | null)[];
19
+ foundations: KCard[][];
20
+ columns: KCard[][];
21
+ moves: number;
22
+ /** Moves since a card last went home: a computer player that's going nowhere gives up. */
23
+ idle: number;
24
+ won: boolean;
25
+ history: string[];
26
+ narration: string | null;
27
+ }
28
+ export declare const MAX_DEAL = 1000000;
29
+ export declare function newFreeCell(rules: FreeCellRules, _seats: number, seed: number): FreeCellState;
30
+ /** How many cards can move at once, counting the free cells and empty columns (not the one moved into). */
31
+ export declare function maxRun(s: FreeCellState, toEmpty: boolean): number;
32
+ type Move = {
33
+ type: "auto";
34
+ card: string;
35
+ }
36
+ /** The card (and the run on it) to a place you choose: a column or a free cell by its index, or home. */
37
+ | {
38
+ type: "move";
39
+ card: string;
40
+ to: "foundation" | "column" | "cell";
41
+ index?: number;
42
+ } | {
43
+ type: "undo";
44
+ } | {
45
+ type: "finish";
46
+ } | {
47
+ type: "resign";
48
+ };
49
+ export declare const freeCell: CardGame<FreeCellRules, FreeCellState, Move>;
50
+ export {};