@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
package/dist/bridge.js ADDED
@@ -0,0 +1,494 @@
1
+ import { clone, FULL, GameError, makeDeck, markReady, nextRandom, rankSeats, shuffled, sortCards, SYMBOL, teamOfSeat, thinkFor, who, } from "./kit.js";
2
+ import { bestLoser, cheapestWinner, following, trickWinner } from "./tricks.js";
3
+ export const chicagoBridge = { id: "bridge-chicago", name: "Chicago (4 deals)", chukkers: 1 };
4
+ export const longBridge = { ...chicagoBridge, id: "bridge-8", name: "Two Chicagos (8 deals)", chukkers: 2 };
5
+ const STRAINS = ["clubs", "diamonds", "hearts", "spades", "nt"];
6
+ const rank = (c) => c.rank;
7
+ const suitOf = (c) => c.suit;
8
+ const order = (c) => (c.level - 1) * 5 + STRAINS.indexOf(c.strain);
9
+ export const strainName = (s) => (s === "nt" ? "NT" : SYMBOL[s]);
10
+ export const contractName = (c) => `${c.level}${strainName(c.strain)}${c.doubled === 2 ? " ×× " : c.doubled === 1 ? " ×" : ""}`.trim();
11
+ const callName = (c) => (c.type === "bid" ? `${c.level}${strainName(c.strain)}` : c.type === "pass" ? "Pass" : c.type === "double" ? "Double" : "Redouble");
12
+ const trumpOf = (s) => (s.contract && s.contract.strain !== "nt" ? s.contract.strain : null);
13
+ const partnerOf = (seat) => (seat + 2) % 4;
14
+ const dummyOf = (s) => (s.declarer === null ? null : partnerOf(s.declarer));
15
+ /** Who moves for the seat on turn: the declarer plays dummy's cards. */
16
+ const controller = (s, seat) => (s.phase === "playing" && seat === dummyOf(s) ? s.declarer : seat);
17
+ /** Chicago vulnerability: none, dealer's side, dealer's side, both. */
18
+ export function vulnerable(s, team) {
19
+ const k = s.hand % 4;
20
+ if (k === 0)
21
+ return false;
22
+ if (k === 3)
23
+ return true;
24
+ return teamOfSeat(s.dealer) === team;
25
+ }
26
+ const sortHand = (cards) => sortCards(cards, rank, suitOf);
27
+ function deal(s) {
28
+ const deck = shuffled(makeDeck({ ranks: FULL }), nextRandom(s));
29
+ s.hands = [0, 1, 2, 3].map((i) => sortHand(deck.slice(i * 13, i * 13 + 13)));
30
+ s.auction = [];
31
+ s.contract = null;
32
+ s.declarer = null;
33
+ s.trick = [];
34
+ s.lastTrick = null;
35
+ s.tricksWon = [0, 0, 0, 0];
36
+ s.ready = [false, false, false, false];
37
+ s.phase = "bidding";
38
+ s.turn = s.dealer;
39
+ }
40
+ export function newBridge(rules, _seats, seed) {
41
+ const s = { game: "bridge", rules, seats: 4, rng: seed >>> 0, hand: 0, dealer: seed % 4, scores: [0, 0], lastHand: null, narration: null };
42
+ deal(s);
43
+ return s;
44
+ }
45
+ /** The calls this seat may make: pass, a higher bid, double their bid, redouble our doubled bid. */
46
+ export function callsFor(s, seat) {
47
+ if (s.phase !== "bidding" || s.turn !== seat)
48
+ return [];
49
+ const out = [{ type: "pass" }];
50
+ const c = s.contract;
51
+ if (c && c.doubled === 0 && teamOfSeat(c.by) !== teamOfSeat(seat))
52
+ out.push({ type: "double" });
53
+ if (c && c.doubled === 1 && teamOfSeat(c.by) === teamOfSeat(seat))
54
+ out.push({ type: "redouble" });
55
+ for (let level = 1; level <= 7; level++)
56
+ for (const strain of STRAINS)
57
+ if (!c || order({ level, strain }) > order(c))
58
+ out.push({ type: "bid", level, strain });
59
+ return out;
60
+ }
61
+ export function bridgeLegal(s, seat) {
62
+ if (s.phase !== "playing" || s.turn !== seat)
63
+ return [];
64
+ return following(s.hands[seat], s.trick, suitOf);
65
+ }
66
+ function apply(state, seat, move) {
67
+ const s = clone(state);
68
+ if (move.type === "next") {
69
+ if (s.phase !== "scored")
70
+ throw new GameError("The hand isn't over.");
71
+ if (markReady(s.ready, seat)) {
72
+ s.hand += 1;
73
+ s.dealer = (s.dealer + 1) % 4;
74
+ s.narration = null;
75
+ deal(s);
76
+ }
77
+ return s;
78
+ }
79
+ if (move.type === "play") {
80
+ if (s.phase !== "playing")
81
+ throw new GameError("It's not time to play.");
82
+ if (controller(s, s.turn) !== seat)
83
+ throw new GameError("It's not your turn.");
84
+ const from = s.turn;
85
+ const card = s.hands[from].find((c) => c.id === move.card);
86
+ if (!card)
87
+ throw new GameError(from === seat ? "You don't have that card." : "Dummy doesn't have that card.");
88
+ if (!bridgeLegal(s, from).some((c) => c.id === card.id))
89
+ throw new GameError(`Follow suit: play a ${SYMBOL[suitOf(s.trick[0].card)]} if you can.`);
90
+ if (!s.trick.length)
91
+ s.lastTrick = null;
92
+ s.hands[from] = s.hands[from].filter((c) => c.id !== card.id);
93
+ s.trick.push({ seat: from, card });
94
+ s.narration = null;
95
+ if (s.trick.length < 4) {
96
+ s.turn = (from + 1) % 4;
97
+ return s;
98
+ }
99
+ const win = trickWinner(s.trick, trumpOf(s), suitOf, rank);
100
+ s.tricksWon[win.seat] += 1;
101
+ s.lastTrick = { plays: s.trick, winner: win.seat };
102
+ s.trick = [];
103
+ s.turn = win.seat;
104
+ if (s.hands.every((h) => !h.length))
105
+ scoreHand(s);
106
+ return s;
107
+ }
108
+ // A call in the auction.
109
+ if (s.phase !== "bidding" || s.turn !== seat)
110
+ throw new GameError("It's not your turn to bid.");
111
+ const allowed = callsFor(s, seat);
112
+ const ok = allowed.some((c) => c.type === move.type && (c.type !== "bid" || (move.type === "bid" && c.level === Number(move.level) && c.strain === move.strain)));
113
+ if (!ok)
114
+ throw new GameError(move.type === "bid" ? `Bid higher than ${contractName(s.contract)}.` : move.type === "double" ? "You can double only the other side's bid." : move.type === "redouble" ? "You can redouble only your side's doubled bid." : "That's not a call.");
115
+ const call = move.type === "bid" ? { type: "bid", level: Number(move.level), strain: move.strain } : { type: move.type };
116
+ s.auction.push({ seat, call });
117
+ if (call.type === "bid")
118
+ s.contract = { level: call.level, strain: call.strain, by: seat, doubled: 0 };
119
+ else if (call.type === "double")
120
+ s.contract.doubled = 1;
121
+ else if (call.type === "redouble")
122
+ s.contract.doubled = 2;
123
+ s.narration = `${who(seat)}: ${callName(call)}`;
124
+ // Three passes after a bid end it; four passes to start throw the deal in.
125
+ const tail = s.auction.slice(-3);
126
+ const passedOut = s.auction.length === 4 && s.auction.every((a) => a.call.type === "pass");
127
+ if (passedOut) {
128
+ s.lastHand = { contract: null, declarer: null, tricks: [0, 0], points: [0, 0], made: false };
129
+ s.narration = "Passed out: everyone passed. New deal.";
130
+ s.dealer = (s.dealer + 1) % 4;
131
+ deal(s);
132
+ return s;
133
+ }
134
+ if (s.contract && s.auction.length >= 4 && tail.length === 3 && tail.every((a) => a.call.type === "pass")) {
135
+ // The declarer: the first of the winning side to name the final strain.
136
+ const team = teamOfSeat(s.contract.by);
137
+ const first = s.auction.find((a) => a.call.type === "bid" && a.call.strain === s.contract.strain && teamOfSeat(a.seat) === team);
138
+ s.declarer = first.seat;
139
+ s.phase = "playing";
140
+ s.turn = (s.declarer + 1) % 4;
141
+ s.narration = `${who(s.declarer)} declares ${contractName(s.contract)}; ${who(partnerOf(s.declarer))} is dummy`;
142
+ return s;
143
+ }
144
+ s.turn = (seat + 1) % 4;
145
+ return s;
146
+ }
147
+ const TRICK_VALUE = { clubs: 20, diamonds: 20, hearts: 30, spades: 30, nt: 30 };
148
+ /** Points for the declaring side (positive) or the defenders (negative), Chicago style. */
149
+ export function bridgeScore(c, tricks, vul) {
150
+ const need = c.level + 6;
151
+ const mult = c.doubled === 2 ? 4 : c.doubled === 1 ? 2 : 1;
152
+ if (tricks >= need) {
153
+ const contractPts = (TRICK_VALUE[c.strain] * c.level + (c.strain === "nt" ? 10 : 0)) * mult;
154
+ let score = contractPts;
155
+ score += contractPts >= 100 ? (vul ? 500 : 300) : 50;
156
+ if (c.level === 6)
157
+ score += vul ? 750 : 500;
158
+ if (c.level === 7)
159
+ score += vul ? 1500 : 1000;
160
+ const over = tricks - need;
161
+ score += over * (c.doubled ? (vul ? 200 : 100) * (c.doubled === 2 ? 2 : 1) : TRICK_VALUE[c.strain]);
162
+ if (c.doubled)
163
+ score += c.doubled === 2 ? 100 : 50;
164
+ return score;
165
+ }
166
+ const down = need - tricks;
167
+ if (!c.doubled)
168
+ return -down * (vul ? 100 : 50);
169
+ let pen = 0;
170
+ for (let k = 1; k <= down; k++)
171
+ pen += vul ? (k === 1 ? 200 : 300) : k === 1 ? 100 : k <= 3 ? 200 : 300;
172
+ return -pen * (c.doubled === 2 ? 2 : 1);
173
+ }
174
+ function scoreHand(s) {
175
+ const c = s.contract;
176
+ const team = teamOfSeat(s.declarer);
177
+ const tricks = [s.tricksWon[0] + s.tricksWon[2], s.tricksWon[1] + s.tricksWon[3]];
178
+ const result = bridgeScore(c, tricks[team], vulnerable(s, team));
179
+ const points = [0, 0];
180
+ if (result >= 0)
181
+ points[team] = result;
182
+ else
183
+ points[(1 - team)] = -result;
184
+ s.scores = [s.scores[0] + points[0], s.scores[1] + points[1]];
185
+ const made = result >= 0;
186
+ s.lastHand = { contract: { level: c.level, strain: c.strain, doubled: c.doubled }, declarer: s.declarer, tricks, points, made };
187
+ const need = c.level + 6;
188
+ s.narration = made ? `${who(s.declarer)} made ${contractName(c)}${tricks[team] > need ? ` with ${tricks[team] - need} over` : ""}` : `${who(s.declarer)} went ${need - tricks[team]} down in ${contractName(c)}`;
189
+ s.ready = [false, false, false, false];
190
+ s.phase = s.hand + 1 >= s.rules.chukkers * 4 ? "finished" : "scored";
191
+ }
192
+ function winners(s) {
193
+ if (s.scores[0] === s.scores[1])
194
+ return [0, 1, 2, 3];
195
+ return s.scores[0] > s.scores[1] ? [0, 2] : [1, 3];
196
+ }
197
+ /** The bids worth showing: the next few, the games, and the small slams. */
198
+ function shownCalls(calls) {
199
+ const bids = calls.filter((c) => c.type === "bid");
200
+ const keep = new Set(bids.slice(0, 5));
201
+ const game = (b) => (b.level === 3 && b.strain === "nt") || (b.level === 4 && (b.strain === "hearts" || b.strain === "spades")) || (b.level === 5 && (b.strain === "clubs" || b.strain === "diamonds"));
202
+ // Slams only come up once the bidding is already high.
203
+ const high = (bids[0]?.level ?? 7) >= 4;
204
+ for (const b of bids)
205
+ if (game(b) || (high && b.level >= 6 && b.level === (bids[0].level >= 6 ? bids[0].level : 6)))
206
+ keep.add(b);
207
+ return [...calls.filter((c) => c.type !== "bid"), ...bids.filter((b) => keep.has(b))];
208
+ }
209
+ function view(s, seat) {
210
+ const over = s.phase === "finished";
211
+ const playing = s.phase === "playing";
212
+ const dummy = dummyOf(s);
213
+ const ctrl = controller(s, s.turn);
214
+ const fromDummy = playing && seat === s.declarer && s.turn === dummy;
215
+ // The declarer plays dummy's cards from the hand area when it's dummy's turn.
216
+ const hand = fromDummy ? s.hands[dummy] : s.hands[seat];
217
+ const melds = [];
218
+ if (playing && dummy !== null && s.trick.length + s.tricksWon.reduce((a, b) => a + b, 0) > 0) {
219
+ if (fromDummy)
220
+ melds.push({ owner: seat, label: "Your hand", cards: s.hands[seat] });
221
+ else
222
+ melds.push({ owner: dummy, label: "Dummy", cards: s.hands[dummy] });
223
+ }
224
+ let choices = null;
225
+ const calls = callsFor(s, seat);
226
+ if (calls.length) {
227
+ choices = {
228
+ prompt: s.contract ? `${contractName(s.contract)} by ${who(s.contract.by)} to beat.` : "Open the bidding, or pass.",
229
+ options: shownCalls(calls).map((c) => ({ label: callName(c), move: c })),
230
+ layout: "grid",
231
+ };
232
+ }
233
+ else if (s.phase === "scored" && !s.ready[seat])
234
+ choices = { prompt: "", options: [{ label: "Deal the next hand", move: { type: "next" }, primary: true }] };
235
+ const lastCall = (i) => [...s.auction].reverse().find((a) => a.seat === i)?.call;
236
+ const team = s.declarer !== null ? teamOfSeat(s.declarer) : null;
237
+ const tricksFor = (t) => s.tricksWon[t] + s.tricksWon[t + 2];
238
+ return {
239
+ game: "bridge",
240
+ seats: 4,
241
+ me: seat,
242
+ teams: true,
243
+ phase: s.phase,
244
+ turn: s.phase === "scored" || over ? null : ctrl,
245
+ dealer: s.dealer,
246
+ hand,
247
+ tap: playing && ctrl === seat ? { type: "play", cards: bridgeLegal(s, s.turn).map((c) => c.id) } : null,
248
+ pick: null,
249
+ choices,
250
+ players: s.hands.map((h, i) => ({
251
+ cards: i === seat ? hand.length : h.length,
252
+ line: s.phase === "bidding" ? (lastCall(i) ? callName(lastCall(i)) : "") : playing || s.phase === "scored" ? `Took ${s.tricksWon[i]}` : "",
253
+ team: teamOfSeat(i),
254
+ dealer: i === s.dealer,
255
+ badge: playing ? (i === s.declarer ? `Declarer ${contractName(s.contract)}` : i === dummy ? "Dummy" : undefined) : undefined,
256
+ })),
257
+ center: { kind: "trick", plays: s.trick.length ? s.trick : (s.lastTrick?.plays ?? []), winner: s.trick.length ? null : (s.lastTrick?.winner ?? null) },
258
+ melds,
259
+ info: [
260
+ ...(playing && s.contract && team !== null ? [`${contractName(s.contract)}: ${who(s.declarer)} & ${who(dummy)} need ${s.contract.level + 6}, have ${tricksFor(team)}`] : []),
261
+ ...(fromDummy ? ["You're playing dummy's cards"] : []),
262
+ `Deal ${(s.hand % 4) + 1} of 4${s.rules.chukkers > 1 ? ` (Chicago ${Math.floor(s.hand / 4) + 1} of ${s.rules.chukkers})` : ""}`,
263
+ vulLine(s),
264
+ ],
265
+ narration: s.narration,
266
+ scores: [
267
+ { seats: [0, 2], value: s.scores[0] },
268
+ { seats: [1, 3], value: s.scores[1] },
269
+ ],
270
+ result: s.lastHand?.contract && (s.phase === "scored" || over)
271
+ ? {
272
+ key: `bridge-${s.hand}`,
273
+ title: s.lastHand.made ? `${who(s.lastHand.declarer)} made ${contractName(s.lastHand.contract)}` : `${contractName(s.lastHand.contract)} went down`,
274
+ sides: [
275
+ [0, 2],
276
+ [1, 3],
277
+ ],
278
+ rows: [
279
+ { label: "Tricks", values: s.lastHand.tricks.map(String) },
280
+ { label: "This deal", values: s.lastHand.points.map((p) => (p ? `+${p}` : "0")), tone: "score" },
281
+ { label: "Total", values: s.scores.map(String), tone: "total" },
282
+ ],
283
+ }
284
+ : null,
285
+ over: over ? { winners: winners(s), title: winners(s).length === 4 ? "A tie!" : `${who(winners(s)[0])} & ${who(winners(s)[1])} win ${Math.max(...s.scores)} to ${Math.min(...s.scores)}` } : null,
286
+ };
287
+ }
288
+ function vulLine(s) {
289
+ const a = vulnerable(s, 0);
290
+ const b = vulnerable(s, 1);
291
+ if (a && b)
292
+ return "Both sides vulnerable";
293
+ if (!a && !b)
294
+ return "Nobody vulnerable";
295
+ return a ? `${who(0)} & ${who(2)} vulnerable` : `${who(1)} & ${who(3)} vulnerable`;
296
+ }
297
+ // ---- Computer players --------------------------------------------------------------------------
298
+ export const hcp = (hand) => hand.reduce((n, c) => n + Math.max(0, rank(c) - 10), 0);
299
+ const SUIT_LIST = ["clubs", "diamonds", "hearts", "spades"];
300
+ const lengths = (hand) => Object.fromEntries(SUIT_LIST.map((x) => [x, hand.filter((c) => suitOf(c) === x).length]));
301
+ const balanced = (hand) => {
302
+ const l = Object.values(lengths(hand)).sort((a, b) => a - b);
303
+ return l[0] >= 2 && l[1] >= 2 && l[3] <= 5;
304
+ };
305
+ /** What partner's calls suggest: points, and length in each suit they bid. */
306
+ function partnerShows(s, seat) {
307
+ const p = partnerOf(seat);
308
+ const theirs = s.auction.filter((a) => a.seat === p);
309
+ const len = { clubs: 2, diamonds: 2, hearts: 2, spades: 2, nt: 0 };
310
+ let pts = 4;
311
+ const bids = theirs.filter((a) => a.call.type === "bid").map((a) => a.call);
312
+ if (!bids.length)
313
+ return { pts: theirs.length ? 5 : 8, len };
314
+ // Did partner open, or answer us?
315
+ const firstBid = s.auction.find((a) => a.call.type === "bid");
316
+ const opened = firstBid?.seat === p;
317
+ const b = bids[0];
318
+ if (b.strain === "nt")
319
+ pts = b.level === 1 && opened ? 16 : b.level === 2 && opened ? 20 : opened ? 22 : 9;
320
+ else
321
+ pts = opened ? 13 : 9;
322
+ for (const x of bids)
323
+ if (x.strain !== "nt")
324
+ len[x.strain] = Math.max(len[x.strain], x.strain === "hearts" || x.strain === "spades" ? 5 : 4);
325
+ if (b.strain === "nt")
326
+ for (const x of SUIT_LIST)
327
+ len[x] = 3;
328
+ if (bids.length > 1)
329
+ pts += 2;
330
+ return { pts, len };
331
+ }
332
+ function chooseCall(s, seat, style) {
333
+ const hand = s.hands[seat];
334
+ const mine = hcp(hand);
335
+ const len = lengths(hand);
336
+ const legal = callsFor(s, seat);
337
+ const can = (level, strain) => legal.some((c) => c.type === "bid" && c.level === level && c.strain === strain);
338
+ const bid = (level, strain) => ({ type: "bid", level, strain });
339
+ const ourTeam = teamOfSeat(seat);
340
+ const ourBids = s.auction.filter((a) => teamOfSeat(a.seat) === ourTeam && a.call.type === "bid");
341
+ const theirBids = s.auction.filter((a) => teamOfSeat(a.seat) !== ourTeam && a.call.type === "bid");
342
+ const longest = [...SUIT_LIST].sort((a, b) => len[b] - len[a] || SUIT_LIST.indexOf(b) - SUIT_LIST.indexOf(a))[0];
343
+ const dist = Math.max(0, len[longest] - 4);
344
+ const bold = (style.bold ?? 0.3) * 2;
345
+ // Opening: nobody on our side has bid.
346
+ if (!ourBids.length) {
347
+ if (!theirBids.length) {
348
+ if (mine >= 15 && mine <= 17 && balanced(hand) && can(1, "nt"))
349
+ return bid(1, "nt");
350
+ if (mine >= 20 && mine <= 21 && balanced(hand) && can(2, "nt"))
351
+ return bid(2, "nt");
352
+ if (mine + dist + bold >= 12.5) {
353
+ const major = ["spades", "hearts"].find((m) => len[m] >= 5);
354
+ const suit = major ?? (len.diamonds > len.clubs ? "diamonds" : "clubs");
355
+ for (let lv = 1; lv <= 2; lv++)
356
+ if (can(lv, suit))
357
+ return bid(lv, suit);
358
+ }
359
+ return { type: "pass" };
360
+ }
361
+ // Overcall with a good five-card suit.
362
+ if (mine + dist >= 10 && len[longest] >= 5)
363
+ for (let lv = 1; lv <= 2; lv++)
364
+ if (can(lv, longest))
365
+ return bid(lv, longest);
366
+ if (mine >= 16 && balanced(hand) && can(1, "nt"))
367
+ return bid(1, "nt");
368
+ return { type: "pass" };
369
+ }
370
+ // Our side is bidding: aim for the right level in the best fit.
371
+ const partner = partnerShows(s, seat);
372
+ const combined = mine + dist + partner.pts + bold * 0.5;
373
+ const fits = SUIT_LIST.map((x) => ({ x, n: len[x] + partner.len[x] })).filter((f) => f.n >= 8).sort((a, b) => b.n - a.n || (["hearts", "spades"].includes(b.x) ? 1 : 0) - (["hearts", "spades"].includes(a.x) ? 1 : 0));
374
+ const strain = fits.length ? (fits.find((f) => f.x === "hearts" || f.x === "spades")?.x ?? (combined >= 25 && balanced(hand) ? "nt" : fits[0].x)) : balanced(hand) || mine >= 10 ? "nt" : longest;
375
+ const game = { nt: 3, hearts: 4, spades: 4, clubs: 5, diamonds: 5 };
376
+ let target = combined >= 37 ? 7 : combined >= 33 ? 6 : combined >= (strain === "clubs" || strain === "diamonds" ? 28 : 25.5) ? game[strain] : combined >= 22.5 ? (strain === "nt" ? 2 : 3) : combined >= 19 ? (strain === "nt" ? 1 : 2) : 1;
377
+ // A weak hand with no fit stays out of it.
378
+ if (mine < 6 && !fits.length && partner.pts < 15)
379
+ target = 0;
380
+ const current = s.contract;
381
+ const ours = current && teamOfSeat(current.by) === ourTeam;
382
+ if (target > 0 && can(target, strain)) {
383
+ // Already at or past a sensible spot for our side: stop.
384
+ if (ours && current.strain === strain && current.level >= target)
385
+ return { type: "pass" };
386
+ // Answer partner at the cheapest level when we're not sure of game yet.
387
+ if (target < game[strain]) {
388
+ for (let lv = 1; lv <= target; lv++)
389
+ if (can(lv, strain))
390
+ return bid(lv, strain);
391
+ }
392
+ return bid(target, strain);
393
+ }
394
+ // The other side outbid us: double if we have the values and they're high.
395
+ if (current && !ours && current.doubled === 0 && combined >= 24 && current.level >= 3)
396
+ return { type: "double" };
397
+ return { type: "pass" };
398
+ }
399
+ function bot(s, seat, style) {
400
+ if (s.phase === "scored")
401
+ return s.ready[seat] ? null : { type: "next" };
402
+ if (s.phase === "bidding")
403
+ return s.turn === seat ? chooseCall(s, seat, style) : null;
404
+ if (s.phase !== "playing" || controller(s, s.turn) !== seat)
405
+ return null;
406
+ const from = s.turn;
407
+ const legal = bridgeLegal(s, from);
408
+ const careless = Math.random() < (style.sloppy ?? 0) + (1 - (style.skill ?? 1)) * 0.25;
409
+ if (legal.length === 1 || careless)
410
+ return { type: "play", card: legal[Math.floor(Math.random() * legal.length)].id };
411
+ const trump = trumpOf(s);
412
+ const strength = (c) => rank(c) + (trump && suitOf(c) === trump ? 100 : 0);
413
+ if (!s.trick.length) {
414
+ // Lead an ace, else the top of a sequence, else a low card from the longest suit.
415
+ const ace = legal.find((c) => rank(c) === 14 && suitOf(c) !== trump);
416
+ if (ace)
417
+ return { type: "play", card: ace.id };
418
+ const declaring = teamOfSeat(from) === teamOfSeat(s.declarer);
419
+ const trumps = legal.filter((c) => trump && suitOf(c) === trump);
420
+ if (declaring && trumps.length >= 3)
421
+ return { type: "play", card: [...trumps].sort((a, b) => rank(b) - rank(a))[0].id };
422
+ const bySuit = SUIT_LIST.map((x) => legal.filter((c) => suitOf(c) === x && x !== trump)).filter((g) => g.length).sort((a, b) => b.length - a.length);
423
+ const group = bySuit[0] ?? legal;
424
+ const top = [...group].sort((a, b) => rank(b) - rank(a));
425
+ if (top.length >= 2 && rank(top[0]) >= 12 && rank(top[0]) - rank(top[1]) === 1)
426
+ return { type: "play", card: top[0].id };
427
+ return { type: "play", card: top.at(-1).id };
428
+ }
429
+ const winning = trickWinner(s.trick, trump, suitOf, rank);
430
+ if (teamOfSeat(winning.seat) === teamOfSeat(from))
431
+ return { type: "play", card: [...legal].sort((a, b) => strength(a) - strength(b))[0].id };
432
+ const win = cheapestWinner(legal, from, s.trick, trump, suitOf, rank);
433
+ // Second hand low (unless it's cheap to win); third and fourth hand try to win.
434
+ if (win && (s.trick.length >= 2 || rank(win) >= 13 || (trump && suitOf(win) === trump)))
435
+ return { type: "play", card: win.id };
436
+ return { type: "play", card: bestLoser(legal, from, s.trick, trump, suitOf, rank).id };
437
+ }
438
+ export const bridge = {
439
+ id: "bridge",
440
+ name: "Bridge",
441
+ emoji: "🌉",
442
+ blurb: "Contract bridge, Chicago scoring",
443
+ tagline: "Bid a contract with your partner, then make it, with dummy's cards face up. Four deals a Chicago.",
444
+ seats: { min: 4, max: 4, default: 4 },
445
+ teams: true,
446
+ presets: [chicagoBridge, longBridge],
447
+ fields: [{ key: "chukkers", label: "Length", kind: "choice", options: [[1, "One Chicago (4 deals)"], [2, "Two Chicagos (8 deals)"], [3, "Three Chicagos (12 deals)"]] }],
448
+ normalize(rules) {
449
+ const given = (rules && typeof rules === "object" ? rules : {});
450
+ const base = [chicagoBridge, longBridge].find((p) => p.id === given.id) ?? chicagoBridge;
451
+ const r = { ...base, ...given };
452
+ return { ...r, chukkers: Number(r.chukkers) };
453
+ },
454
+ validate(r) {
455
+ return r.chukkers >= 1 && r.chukkers <= 5 ? [] : ["Play 1 to 5 Chicagos."];
456
+ },
457
+ describe(r) {
458
+ return [
459
+ "Partners sit across. Thirteen cards each.",
460
+ "The auction: starting with the dealer, bid how many tricks over six your side will take and in what (♣ ♦ ♥ ♠ or no trumps, in that order), pass, double the other side's bid, or redouble a double. Three passes after a bid end it; four passes and the cards are dealt again.",
461
+ "The first player on the winning side to name the final suit is the declarer. The player on their left leads; then the declarer's partner, dummy, lays their cards face up, and the declarer plays them.",
462
+ "Follow suit if you can. Make the contract to score it: ♣ ♦ 20 a trick, ♥ ♠ 30, no trumps 40 then 30, with a bonus for a game (100 or more), and big bonuses for slams. Fall short and the other side scores.",
463
+ `Chicago scoring: four deals, with nobody vulnerable on the first, the dealer's side on the second and third, and both on the fourth. ${r.chukkers > 1 ? `${r.chukkers} Chicagos;` : ""} Highest total wins.`,
464
+ ];
465
+ },
466
+ newGame: newBridge,
467
+ apply,
468
+ view,
469
+ bot,
470
+ thinkingTime(s, seat) {
471
+ if (s.phase === "bidding")
472
+ return 1600;
473
+ if (s.phase === "scored")
474
+ return 900;
475
+ return thinkFor(bridgeLegal(s, s.turn).length, seat === s.turn ? 1 : 1.1);
476
+ },
477
+ summary(s) {
478
+ const over = s.phase === "finished";
479
+ const w = winners(s);
480
+ return {
481
+ game: "bridge",
482
+ rules: s.rules.name,
483
+ phase: s.phase,
484
+ over,
485
+ hand: s.hand + 1,
486
+ scoreLine: s.scores.join(" · "),
487
+ order: over ? rankSeats([{ seats: [0, 2], score: s.scores[0] }, { seats: [1, 3], score: s.scores[1] }]) : null,
488
+ winners: over ? w : null,
489
+ teams: true,
490
+ seats: 4,
491
+ };
492
+ },
493
+ };
494
+ //# sourceMappingURL=bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.js","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ import { type BaseRules, type CardGame, type KCard } from "./kit.js";
2
+ export interface CanastaRules extends BaseRules {
3
+ playTo: number;
4
+ /** Draw two from the stock instead of one (the modern way). */
5
+ drawTwo: boolean;
6
+ /** A side's first melds must be worth 50 (more as the score grows); off: any meld opens. */
7
+ minimums: boolean;
8
+ }
9
+ export declare const classicCanasta: CanastaRules;
10
+ export declare const modernCanasta: CanastaRules;
11
+ export declare const easyCanasta: CanastaRules;
12
+ type Phase = "draw" | "meld" | "scored" | "finished";
13
+ export interface TeamMeld {
14
+ rank: number;
15
+ cards: KCard[];
16
+ }
17
+ export interface CanastaState {
18
+ game: "canasta";
19
+ rules: CanastaRules;
20
+ seats: 4;
21
+ rng: number;
22
+ hand: number;
23
+ dealer: number;
24
+ phase: Phase;
25
+ hands: KCard[][];
26
+ stock: KCard[];
27
+ pile: KCard[];
28
+ melds: [TeamMeld[], TeamMeld[]];
29
+ red3s: [KCard[], KCard[]];
30
+ opened: [boolean, boolean];
31
+ /** Cards laid this turn by a side that hasn't opened yet (they can still be taken back). */
32
+ laid: string[];
33
+ /** This turn's opening was taken back: don't try it again before discarding. */
34
+ tookBack: boolean;
35
+ turn: number;
36
+ scores: [number, number];
37
+ lastHand: {
38
+ wentOut: number | null;
39
+ rows: Record<string, [number, number]>;
40
+ } | null;
41
+ ready: boolean[];
42
+ narration: string | null;
43
+ }
44
+ export declare const isWild: (c: KCard) => boolean;
45
+ export declare const isRedThree: (c: KCard) => boolean;
46
+ /** What a card counts in a meld (and against you, left in your hand). */
47
+ export declare function canastaValue(c: KCard): number;
48
+ export declare const isCanasta: (m: TeamMeld) => boolean;
49
+ /** The opening minimum for a side with this score. */
50
+ export declare function openingNeed(rules: CanastaRules, score: number): number;
51
+ export declare function newCanasta(rules: CanastaRules, _seats: number, seed: number): CanastaState;
52
+ interface Group {
53
+ rank: number;
54
+ naturals: KCard[];
55
+ wilds: KCard[];
56
+ /** Index of the side's meld this goes on, or -1 for a new meld. */
57
+ onto: number;
58
+ }
59
+ /** How the chosen cards would go down, or why they can't. */
60
+ export declare function meldPlan(s: CanastaState, seat: number, ids: string[]): {
61
+ groups: Group[];
62
+ } | {
63
+ error: string;
64
+ };
65
+ /** Whether the top of the pile can be taken, and how. */
66
+ export declare function takePlan(s: CanastaState, seat: number): {
67
+ groups: Group[];
68
+ } | {
69
+ error: string;
70
+ };
71
+ type Move = {
72
+ type: "draw";
73
+ } | {
74
+ type: "take";
75
+ } | {
76
+ type: "meld";
77
+ cards: string[];
78
+ } | {
79
+ type: "discard";
80
+ cards?: string[];
81
+ card?: string;
82
+ } | {
83
+ type: "takeback";
84
+ } | {
85
+ type: "next";
86
+ };
87
+ export declare const canasta: CardGame<CanastaRules, CanastaState, Move>;
88
+ export {};