dsh-poker 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 (123) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/LICENSE +21 -0
  3. package/README.md +56 -0
  4. package/cordis.patch.yml +3 -0
  5. package/lib/client.js +2419 -0
  6. package/lib/client.js.map +1 -0
  7. package/lib/index.js +3051 -0
  8. package/lib/index.js.map +1 -0
  9. package/lib/invariant-C3ZiFskw.js +13 -0
  10. package/lib/invariant-C3ZiFskw.js.map +1 -0
  11. package/lib/invariant.js +3 -0
  12. package/lib/join/card-back-landlord.png +0 -0
  13. package/lib/join/card-back.png +0 -0
  14. package/lib/join/face-a.png +0 -0
  15. package/lib/join/face-j.png +0 -0
  16. package/lib/join/face-k.png +0 -0
  17. package/lib/join/face-q.png +0 -0
  18. package/lib/join/index.html +13 -0
  19. package/lib/join/index.js +8910 -0
  20. package/lib/join/index.js.map +1 -0
  21. package/lib/join/join.css +14 -0
  22. package/lib/join/joker-black.png +0 -0
  23. package/lib/join/joker-red.png +0 -0
  24. package/lib/join/role-farmer-b.png +0 -0
  25. package/lib/join/role-farmer-c.png +0 -0
  26. package/lib/join/role-farmer.png +0 -0
  27. package/lib/join/role-landlord-b.png +0 -0
  28. package/lib/join/role-landlord.png +0 -0
  29. package/lib/join/role-spectator.png +0 -0
  30. package/lib/types/client/CardBack.d.ts +7 -0
  31. package/lib/types/client/CardBack.d.ts.map +1 -0
  32. package/lib/types/client/CardFace.d.ts +8 -0
  33. package/lib/types/client/CardFace.d.ts.map +1 -0
  34. package/lib/types/client/HostApp.d.ts +4 -0
  35. package/lib/types/client/HostApp.d.ts.map +1 -0
  36. package/lib/types/client/InviteDialog.d.ts +15 -0
  37. package/lib/types/client/InviteDialog.d.ts.map +1 -0
  38. package/lib/types/client/JoinForm.d.ts +13 -0
  39. package/lib/types/client/JoinForm.d.ts.map +1 -0
  40. package/lib/types/client/LobbyView.d.ts +34 -0
  41. package/lib/types/client/LobbyView.d.ts.map +1 -0
  42. package/lib/types/client/SeatAvatar.d.ts +18 -0
  43. package/lib/types/client/SeatAvatar.d.ts.map +1 -0
  44. package/lib/types/client/SeatRow.d.ts +8 -0
  45. package/lib/types/client/SeatRow.d.ts.map +1 -0
  46. package/lib/types/client/SettingsCard.d.ts +6 -0
  47. package/lib/types/client/SettingsCard.d.ts.map +1 -0
  48. package/lib/types/client/SettlementView.d.ts +6 -0
  49. package/lib/types/client/SettlementView.d.ts.map +1 -0
  50. package/lib/types/client/TableView.d.ts +16 -0
  51. package/lib/types/client/TableView.d.ts.map +1 -0
  52. package/lib/types/client/card-stack.d.ts +3 -0
  53. package/lib/types/client/card-stack.d.ts.map +1 -0
  54. package/lib/types/client/host-api.d.ts +50 -0
  55. package/lib/types/client/host-api.d.ts.map +1 -0
  56. package/lib/types/client/index.d.ts +5 -0
  57. package/lib/types/client/index.d.ts.map +1 -0
  58. package/lib/types/client/slots.d.ts +3 -0
  59. package/lib/types/client/slots.d.ts.map +1 -0
  60. package/lib/types/client/store.d.ts +15 -0
  61. package/lib/types/client/store.d.ts.map +1 -0
  62. package/lib/types/config.d.ts +76 -0
  63. package/lib/types/config.d.ts.map +1 -0
  64. package/lib/types/crypto.d.ts +9 -0
  65. package/lib/types/crypto.d.ts.map +1 -0
  66. package/lib/types/engine/cards.d.ts +22 -0
  67. package/lib/types/engine/cards.d.ts.map +1 -0
  68. package/lib/types/engine/deal.d.ts +11 -0
  69. package/lib/types/engine/deal.d.ts.map +1 -0
  70. package/lib/types/engine/hands.d.ts +16 -0
  71. package/lib/types/engine/hands.d.ts.map +1 -0
  72. package/lib/types/engine/index.d.ts +7 -0
  73. package/lib/types/engine/index.d.ts.map +1 -0
  74. package/lib/types/engine/play.d.ts +73 -0
  75. package/lib/types/engine/play.d.ts.map +1 -0
  76. package/lib/types/engine/random.d.ts +2 -0
  77. package/lib/types/engine/random.d.ts.map +1 -0
  78. package/lib/types/engine/score.d.ts +11 -0
  79. package/lib/types/engine/score.d.ts.map +1 -0
  80. package/lib/types/identity/player.d.ts +6 -0
  81. package/lib/types/identity/player.d.ts.map +1 -0
  82. package/lib/types/index.d.ts +8 -0
  83. package/lib/types/index.d.ts.map +1 -0
  84. package/lib/types/invariant.d.ts +9 -0
  85. package/lib/types/invariant.d.ts.map +1 -0
  86. package/lib/types/join/JoinApp.d.ts +2 -0
  87. package/lib/types/join/JoinApp.d.ts.map +1 -0
  88. package/lib/types/join/main.d.ts +2 -0
  89. package/lib/types/join/main.d.ts.map +1 -0
  90. package/lib/types/net/auth.d.ts +16 -0
  91. package/lib/types/net/auth.d.ts.map +1 -0
  92. package/lib/types/net/join-page.d.ts +6 -0
  93. package/lib/types/net/join-page.d.ts.map +1 -0
  94. package/lib/types/net/json.d.ts +3 -0
  95. package/lib/types/net/json.d.ts.map +1 -0
  96. package/lib/types/net/protocol.d.ts +2 -0
  97. package/lib/types/net/protocol.d.ts.map +1 -0
  98. package/lib/types/net/routes.d.ts +4 -0
  99. package/lib/types/net/routes.d.ts.map +1 -0
  100. package/lib/types/net/views.d.ts +3 -0
  101. package/lib/types/net/views.d.ts.map +1 -0
  102. package/lib/types/net/ws.d.ts +8 -0
  103. package/lib/types/net/ws.d.ts.map +1 -0
  104. package/lib/types/persist/domain.d.ts +104 -0
  105. package/lib/types/persist/domain.d.ts.map +1 -0
  106. package/lib/types/persist/schemas.d.ts +79 -0
  107. package/lib/types/persist/schemas.d.ts.map +1 -0
  108. package/lib/types/room/RoomManager.d.ts +142 -0
  109. package/lib/types/room/RoomManager.d.ts.map +1 -0
  110. package/lib/types/settle/audit.d.ts +15 -0
  111. package/lib/types/settle/audit.d.ts.map +1 -0
  112. package/lib/types/settle/escrow.d.ts +4 -0
  113. package/lib/types/settle/escrow.d.ts.map +1 -0
  114. package/lib/types/settle/grant.d.ts +7 -0
  115. package/lib/types/settle/grant.d.ts.map +1 -0
  116. package/lib/types/settle/ledger.d.ts +39 -0
  117. package/lib/types/settle/ledger.d.ts.map +1 -0
  118. package/lib/types/settle/math.d.ts +12 -0
  119. package/lib/types/settle/math.d.ts.map +1 -0
  120. package/lib/types/types.d.ts +253 -0
  121. package/lib/types/types.d.ts.map +1 -0
  122. package/package.json +116 -0
  123. package/prepare.mjs +16 -0
@@ -0,0 +1,14 @@
1
+ :root {
2
+ color-scheme: light;
3
+ --felt: #ffffff;
4
+ --ink: #1a1a1a;
5
+ --muted: #8a8a8a;
6
+ --line: #e8e8e8;
7
+ --accent: #4d6bfe;
8
+ --red: #d64545;
9
+ --ok: #2f8f62;
10
+ font-family: "SF Pro Text", "PingFang SC", "Noto Sans SC", sans-serif;
11
+ }
12
+ * { box-sizing: border-box; }
13
+ html, body, #root { margin: 0; min-height: 100%; background: var(--felt); color: var(--ink); }
14
+ button, input, select { font: inherit; }
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,7 @@
1
+ export { COMPACT_STACK_MAX, visibleBackCount } from './card-stack.ts';
2
+ export declare function CardBack({ count, compact, landlord, }: {
3
+ count?: number;
4
+ compact?: boolean;
5
+ landlord?: boolean;
6
+ }): import("react").JSX.Element;
7
+ //# sourceMappingURL=CardBack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CardBack.d.ts","sourceRoot":"","sources":["../../../../src/client/CardBack.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAErE,wBAAgB,QAAQ,CAAC,EACvB,KAAS,EACT,OAAe,EACf,QAAgB,GACjB,EAAE;IACD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,+BAsBA"}
@@ -0,0 +1,8 @@
1
+ import type { CardId } from '../types.ts';
2
+ export declare const FACE_ART_RANKS: readonly ["J", "Q", "K", "A"];
3
+ export declare function CardFace({ card, selected, laiZiRanks, }: {
4
+ card: CardId;
5
+ selected?: boolean;
6
+ laiZiRanks?: readonly string[];
7
+ }): import("react").JSX.Element;
8
+ //# sourceMappingURL=CardFace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CardFace.d.ts","sourceRoot":"","sources":["../../../../src/client/CardFace.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAKzC,eAAO,MAAM,cAAc,+BAAgC,CAAA;AAoB3D,wBAAgB,QAAQ,CAAC,EACvB,IAAI,EAAE,QAAgB,EAAE,UAAe,GACxC,EAAE;IACD,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC/B,+BA6BA"}
@@ -0,0 +1,4 @@
1
+ export declare function HostApp({ onClose }: {
2
+ onClose: () => void;
3
+ }): import("react").JSX.Element;
4
+ //# sourceMappingURL=HostApp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HostApp.d.ts","sourceRoot":"","sources":["../../../../src/client/HostApp.tsx"],"names":[],"mappings":"AAWA,wBAAgB,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,+BA6L3D"}
@@ -0,0 +1,15 @@
1
+ export declare function InviteDialog({ roomCode, sitUrl, shareable, }: {
2
+ roomCode: string;
3
+ sitUrl: string;
4
+ watchUrl?: string;
5
+ shareable: boolean;
6
+ }): import("react").JSX.Element;
7
+ export declare function RoomCodeBar({ title, roomCode, sitUrl, shareable, canRename, onRename, }: {
8
+ title: string;
9
+ roomCode: string;
10
+ sitUrl?: string;
11
+ shareable?: boolean;
12
+ canRename?: boolean;
13
+ onRename?: (title: string) => void;
14
+ }): import("react").JSX.Element;
15
+ //# sourceMappingURL=InviteDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InviteDialog.d.ts","sourceRoot":"","sources":["../../../../src/client/InviteDialog.tsx"],"names":[],"mappings":"AAGA,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EAAE,MAAM,EAAE,SAAS,GAC5B,EAAE;IACD,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,OAAO,CAAA;CACnB,+BAwBA;AAED,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,GACxD,EAAE;IACD,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CACnC,+BAmCA"}
@@ -0,0 +1,13 @@
1
+ export declare function JoinForm({ code, invite, name, onCode, onInvite, onName, onJoin, joining, showInvite, error, }: {
2
+ code: string;
3
+ invite: string;
4
+ name: string;
5
+ onCode: (value: string) => void;
6
+ onInvite: (value: string) => void;
7
+ onName: (value: string) => void;
8
+ onJoin: () => void;
9
+ joining?: boolean;
10
+ showInvite?: boolean;
11
+ error: string | null;
12
+ }): import("react").JSX.Element;
13
+ //# sourceMappingURL=JoinForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JoinForm.d.ts","sourceRoot":"","sources":["../../../../src/client/JoinForm.tsx"],"names":[],"mappings":"AAGA,wBAAgB,QAAQ,CAAC,EACvB,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAe,EAAE,UAAiB,EAAE,KAAK,GAChG,EAAE;IACD,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/B,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/B,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CACrB,+BAwDA"}
@@ -0,0 +1,34 @@
1
+ import type { SeatCount } from '../types.ts';
2
+ export declare function LobbyView({ tab, onTab, title, stakeM, maxMultiplier, seatCount, laiZi, onTitle, onStake, onCap, onSeats, onLaiZi, onCreate, creating, error, roomCode, sitUrl, watchUrl, shareable, welcomeAtoms, join, }: {
3
+ tab: 'create' | 'join';
4
+ onTab: (tab: 'create' | 'join') => void;
5
+ title: string;
6
+ stakeM: number;
7
+ maxMultiplier: number;
8
+ seatCount: SeatCount;
9
+ laiZi: boolean;
10
+ onTitle: (value: string) => void;
11
+ onStake: (value: number) => void;
12
+ onCap: (value: number) => void;
13
+ onSeats: (value: SeatCount) => void;
14
+ onLaiZi: (value: boolean) => void;
15
+ onCreate: () => void;
16
+ creating: boolean;
17
+ error: string | null;
18
+ roomCode: string;
19
+ sitUrl: string;
20
+ watchUrl: string;
21
+ shareable: boolean;
22
+ welcomeAtoms: bigint;
23
+ join: {
24
+ code: string;
25
+ invite: string;
26
+ name: string;
27
+ joining: boolean;
28
+ onCode: (value: string) => void;
29
+ onInvite: (value: string) => void;
30
+ onName: (value: string) => void;
31
+ onJoin: () => void;
32
+ };
33
+ }): import("react").JSX.Element;
34
+ //# sourceMappingURL=LobbyView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LobbyView.d.ts","sourceRoot":"","sources":["../../../../src/client/LobbyView.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAO5C,wBAAgB,SAAS,CAAC,EACxB,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAChI,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,GAC1D,EAAE;IACD,GAAG,EAAE,QAAQ,GAAG,MAAM,CAAA;IACtB,KAAK,EAAE,CAAC,GAAG,EAAE,QAAQ,GAAG,MAAM,KAAK,IAAI,CAAA;IACvC,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,SAAS,CAAA;IACpB,KAAK,EAAE,OAAO,CAAA;IACd,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAChC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAChC,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAC9B,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAA;IACnC,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IACjC,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,QAAQ,EAAE,OAAO,CAAA;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,OAAO,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM,CAAA;QACZ,MAAM,EAAE,MAAM,CAAA;QACd,IAAI,EAAE,MAAM,CAAA;QACZ,OAAO,EAAE,OAAO,CAAA;QAChB,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;QAC/B,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;QACjC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;QAC/B,MAAM,EAAE,MAAM,IAAI,CAAA;KACnB,CAAA;CACF,+BAuGA"}
@@ -0,0 +1,18 @@
1
+ import type { SeatState } from '../types.ts';
2
+ export declare const ROLE_ICONS: {
3
+ readonly landlord: "/doudizhu/assets/role-landlord.png";
4
+ readonly landlordB: "/doudizhu/assets/role-landlord-b.png";
5
+ readonly farmer: "/doudizhu/assets/role-farmer.png";
6
+ readonly farmerB: "/doudizhu/assets/role-farmer-b.png";
7
+ readonly farmerC: "/doudizhu/assets/role-farmer-c.png";
8
+ readonly spectator: "/doudizhu/assets/role-spectator.png";
9
+ };
10
+ export declare function roleIconSrc(role: SeatState['role'], seat?: number): string;
11
+ export declare function SeatAvatar({ avatarUrl, role, seat, occupied, spectator, }: {
12
+ avatarUrl?: string | null;
13
+ role?: SeatState['role'];
14
+ seat?: number;
15
+ occupied?: boolean;
16
+ spectator?: boolean;
17
+ }): import("react").JSX.Element | null;
18
+ //# sourceMappingURL=SeatAvatar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SeatAvatar.d.ts","sourceRoot":"","sources":["../../../../src/client/SeatAvatar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAK5C,eAAO,MAAM,UAAU;;;;;;;CAOb,CAAA;AAIV,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI,SAAI,GAAG,MAAM,CAGrE;AAED,wBAAgB,UAAU,CAAC,EACzB,SAAS,EACT,IAAc,EACd,IAAQ,EACR,QAAgB,EAChB,SAAiB,GAClB,EAAE;IACD,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,IAAI,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAA;IACxB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB,sCAuBA"}
@@ -0,0 +1,8 @@
1
+ import type { CardId, SeatState } from '../types.ts';
2
+ export declare function SeatRow({ seat, align, revealed, laiZiRanks, }: {
3
+ seat: SeatState;
4
+ align?: 'left' | 'right' | 'center';
5
+ revealed?: readonly CardId[];
6
+ laiZiRanks?: readonly string[];
7
+ }): import("react").JSX.Element;
8
+ //# sourceMappingURL=SeatRow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SeatRow.d.ts","sourceRoot":"","sources":["../../../../src/client/SeatRow.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAMpD,wBAAgB,OAAO,CAAC,EACtB,IAAI,EAAE,KAAc,EAAE,QAAQ,EAAE,UAAe,GAChD,EAAE;IACD,IAAI,EAAE,SAAS,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAA;IACnC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC5B,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC/B,+BAiCA"}
@@ -0,0 +1,6 @@
1
+ import type { SettingsScope } from '@deepseek-ai/dsh-client-runtime/client';
2
+ import type { PluginConfig } from '../config.ts';
3
+ export declare function SettingsCard({ scope }: {
4
+ scope: SettingsScope<PluginConfig>;
5
+ }): import("react").JSX.Element | null;
6
+ //# sourceMappingURL=SettingsCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SettingsCard.d.ts","sourceRoot":"","sources":["../../../../src/client/SettingsCard.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAA;AAC3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAqDhD,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,aAAa,CAAC,YAAY,CAAC,CAAA;CAAE,sCAkN7E"}
@@ -0,0 +1,6 @@
1
+ import type { PublicSettlement } from '../types.ts';
2
+ export declare function SettlementView({ settlement, onRematch, }: {
3
+ settlement: PublicSettlement;
4
+ onRematch: () => void;
5
+ }): import("react").JSX.Element;
6
+ //# sourceMappingURL=SettlementView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SettlementView.d.ts","sourceRoot":"","sources":["../../../../src/client/SettlementView.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAKnD,wBAAgB,cAAc,CAAC,EAC7B,UAAU,EAAE,SAAS,GACtB,EAAE;IACD,UAAU,EAAE,gBAAgB,CAAA;IAC5B,SAAS,EAAE,MAAM,IAAI,CAAA;CACtB,+BA2BA"}
@@ -0,0 +1,16 @@
1
+ import { type BidAction, type DoubleAction } from '../types.ts';
2
+ import { type CardId, type PlayerView, type Seat } from '../types.ts';
3
+ export declare function TableView({ view, selected, onToggle, onBid, onDouble, onMingPai, onPlay, onPass, onChat, }: {
4
+ view: PlayerView;
5
+ selected: CardId[];
6
+ onToggle: (card: CardId) => void;
7
+ onBid: (action: BidAction) => void;
8
+ onDouble: (action: DoubleAction) => void;
9
+ onMingPai?: () => void;
10
+ onPlay: () => void;
11
+ onPass: () => void;
12
+ onReady?: (ready: boolean) => void;
13
+ onChat: (text: string) => void;
14
+ }): import("react").JSX.Element;
15
+ export type { Seat };
16
+ //# sourceMappingURL=TableView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableView.d.ts","sourceRoot":"","sources":["../../../../src/client/TableView.tsx"],"names":[],"mappings":"AACA,OAAO,EAAa,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1E,OAAO,EAAc,KAAK,MAAM,EAAE,KAAK,UAAU,EAAE,KAAK,IAAI,EAAkB,MAAM,aAAa,CAAA;AAQjG,wBAAgB,SAAS,CAAC,EACxB,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAC7E,EAAE;IACD,IAAI,EAAE,UAAU,CAAA;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAChC,KAAK,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,CAAA;IAClC,QAAQ,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAA;IACxC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IACtB,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IAClC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAC/B,+BAqKA;AAsDD,YAAY,EAAE,IAAI,EAAE,CAAA"}
@@ -0,0 +1,3 @@
1
+ export declare const COMPACT_STACK_MAX = 5;
2
+ export declare function visibleBackCount(remaining: number, maxVisible?: number): number;
3
+ //# sourceMappingURL=card-stack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card-stack.d.ts","sourceRoot":"","sources":["../../../../src/client/card-stack.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,IAAI,CAAA;AAElC,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,SAAoB,GAAG,MAAM,CAG1F"}
@@ -0,0 +1,50 @@
1
+ import type { ClientCommand, PlayerView, PublicSettlement, ServerEvent } from '../types.ts';
2
+ export interface CreateRoomResponse {
3
+ roomId: string;
4
+ roomCode: string;
5
+ sitUrl: string;
6
+ watchUrl: string;
7
+ seatCapAtoms: string;
8
+ shareable: boolean;
9
+ hostPlayerId: string;
10
+ view: PlayerView;
11
+ wsTicket: string;
12
+ }
13
+ export interface JoinResponse {
14
+ playerId: string;
15
+ roomId: string;
16
+ seat: 0 | 1 | 2 | 3 | null;
17
+ wsTicket: string;
18
+ view: PlayerView;
19
+ }
20
+ export declare function createRoom(input: {
21
+ stakeM: number;
22
+ maxMultiplier: number;
23
+ seatCount?: 3 | 4;
24
+ laiZi?: boolean;
25
+ hostDisplayName?: string;
26
+ title?: string;
27
+ }): Promise<CreateRoomResponse>;
28
+ export declare function joinRoom(input: {
29
+ roomCode: string;
30
+ invite: string;
31
+ displayName: string;
32
+ role: 'sit' | 'watch';
33
+ }): Promise<JoinResponse>;
34
+ export declare function sendCommand(roomId: string, command: ClientCommand): Promise<{
35
+ seq: number;
36
+ }>;
37
+ export declare function fetchSince(roomId: string, seq: number): Promise<{
38
+ events: ServerEvent[];
39
+ untilSeq: number;
40
+ }>;
41
+ export declare function fetchLedger(): Promise<{
42
+ availableAtoms: string;
43
+ escrowAtoms: string;
44
+ }>;
45
+ export declare function connectChannel(ticket: string, onEvent: (event: ServerEvent) => void, fallback: {
46
+ roomId: string;
47
+ seq: () => number;
48
+ }): () => void;
49
+ export type { PlayerView, PublicSettlement, ServerEvent };
50
+ //# sourceMappingURL=host-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-api.d.ts","sourceRoot":"","sources":["../../../../src/client/host-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAI3F,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,OAAO,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE,UAAU,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;IAC1B,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,UAAU,CAAA;CACjB;AAoBD,wBAAgB,UAAU,CAAC,KAAK,EAAE;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;IACjB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,+BAEA;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,KAAK,GAAG,OAAO,CAAA;CAAE,yBAE/G;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa;SAC1C,MAAM;GAC7B;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;YAC3B,WAAW,EAAE;cAAY,MAAM;GACzD;AAED,wBAAgB,WAAW;oBACQ,MAAM;iBAAe,MAAM;GAC7D;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,EACrC,QAAQ,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,MAAM,CAAA;CAAE,GAC9C,MAAM,IAAI,CA4BZ;AAED,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAA"}
@@ -0,0 +1,5 @@
1
+ import type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client';
2
+ export declare const name = "doudizhu-client";
3
+ export declare const inject: string[];
4
+ export declare function apply(ctx: ClientContext): void;
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/client/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAA;AAM3E,eAAO,MAAM,IAAI,oBAAoB,CAAA;AAErC,eAAO,MAAM,MAAM,UAAqD,CAAA;AAExE,wBAAgB,KAAK,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CAK9C"}
@@ -0,0 +1,3 @@
1
+ import type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client';
2
+ export declare function registerClientSlots(ctx: ClientContext): void;
3
+ //# sourceMappingURL=slots.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slots.d.ts","sourceRoot":"","sources":["../../../../src/client/slots.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAA;AAO3E,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CAoB5D"}
@@ -0,0 +1,15 @@
1
+ import type { CardId, PlayerView, PublicSettlement } from '../types.ts';
2
+ export interface ClientState {
3
+ view: PlayerView | null;
4
+ settlement: PublicSettlement | null;
5
+ selected: CardId[];
6
+ error: string | null;
7
+ shareable: boolean;
8
+ sitUrl: string;
9
+ watchUrl: string;
10
+ roomCode: string;
11
+ }
12
+ export declare function emptyState(): ClientState;
13
+ export declare function toggleCard(selected: CardId[], card: CardId): CardId[];
14
+ export declare function selectionLegal(view: PlayerView | null, selected: CardId[]): boolean;
15
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../../src/client/store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAEvE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,UAAU,GAAG,IAAI,CAAA;IACvB,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAA;IACnC,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,SAAS,EAAE,OAAO,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,wBAAgB,UAAU,IAAI,WAAW,CAWxC;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAErE;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAanF"}
@@ -0,0 +1,76 @@
1
+ export declare const STAKE_LADDER: readonly [1, 2, 5, 10, 20, 50, 100];
2
+ export declare const DEFAULT_STAKE_M = 1;
3
+ export declare const DEFAULT_MAX_MULTIPLIER = 8;
4
+ export declare const DEFAULT_WELCOME_ATOMS = "200000000";
5
+ export declare const DEFAULT_SEAT_COUNT = 3;
6
+ export declare const DEFAULT_TURN_TIMEOUT_MS = 120000;
7
+ export declare const MAX_MULTIPLIER_OPTIONS: readonly [8, 16, 32, 64];
8
+ export declare const SEAT_COUNT_OPTIONS: readonly [3, 4];
9
+ export interface PluginConfig {
10
+ enabled?: boolean;
11
+ welcomeAtoms?: string;
12
+ defaultStakeM?: number;
13
+ defaultMaxMultiplier?: number;
14
+ defaultSeatCount?: 3 | 4;
15
+ defaultLaiZi?: boolean;
16
+ publicBaseUrl?: string;
17
+ maxRooms?: number;
18
+ allowSpectators?: boolean;
19
+ spectatorCardCounter?: boolean;
20
+ houseEnabled?: boolean;
21
+ reconnectWindowMs?: number;
22
+ turnTimeoutMs?: number;
23
+ doubleWindowMs?: number;
24
+ heartbeatMs?: number;
25
+ disconnectAfterMs?: number;
26
+ retainClosedRoomsHours?: number;
27
+ inviteTtlHours?: number;
28
+ routePrefix?: string;
29
+ }
30
+ export declare const Config: import("@deepseek-ai/schemastery").Schema<{
31
+ enabled: boolean;
32
+ welcomeAtoms: string;
33
+ defaultStakeM: number;
34
+ defaultMaxMultiplier: number;
35
+ defaultSeatCount: number;
36
+ defaultLaiZi: boolean;
37
+ publicBaseUrl: string;
38
+ maxRooms: number;
39
+ allowSpectators: boolean;
40
+ spectatorCardCounter: boolean;
41
+ houseEnabled: boolean;
42
+ reconnectWindowMs: number;
43
+ turnTimeoutMs: number;
44
+ doubleWindowMs: number;
45
+ heartbeatMs: number;
46
+ disconnectAfterMs: number;
47
+ retainClosedRoomsHours: number;
48
+ inviteTtlHours: number;
49
+ routePrefix: string;
50
+ }>;
51
+ export interface ResolvedConfig {
52
+ enabled: boolean;
53
+ welcomeAtoms: bigint;
54
+ defaultStakeM: number;
55
+ defaultMaxMultiplier: number;
56
+ defaultSeatCount: 3 | 4;
57
+ defaultLaiZi: boolean;
58
+ publicBaseUrl: string;
59
+ maxRooms: number;
60
+ allowSpectators: boolean;
61
+ spectatorCardCounter: boolean;
62
+ houseEnabled: boolean;
63
+ reconnectWindowMs: number;
64
+ turnTimeoutMs: number;
65
+ doubleWindowMs: number;
66
+ heartbeatMs: number;
67
+ disconnectAfterMs: number;
68
+ retainClosedRoomsHours: number;
69
+ inviteTtlHours: number;
70
+ routePrefix: string;
71
+ }
72
+ export declare function resolveConfig(config: PluginConfig): ResolvedConfig;
73
+ export declare function parseWelcome(value: string): bigint;
74
+ export declare function validatePublicBaseUrl(value: string): string;
75
+ export declare function assertCreateEconomy(welcomeAtoms: bigint, stakeM: number, maxMultiplier: number, seatCount?: 3 | 4): void;
76
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/config.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,YAAY,qCAAiB,CAAA;AAC1C,eAAO,MAAM,eAAe,IAAI,CAAA;AAChC,eAAO,MAAM,sBAAsB,IAAI,CAAA;AACvC,eAAO,MAAM,qBAAqB,cAAc,CAAA;AAChD,eAAO,MAAM,kBAAkB,IAAI,CAAA;AACnC,eAAO,MAAM,uBAAuB,SAAU,CAAA;AAC9C,eAAO,MAAM,sBAAsB,0BAA2B,CAAA;AAC9D,eAAO,MAAM,kBAAkB,iBAAkB,CAAA;AAEjD,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,gBAAgB,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;IACxB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;EAoBjB,CAAA;AAEF,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;IACrB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,gBAAgB,EAAE,CAAC,GAAG,CAAC,CAAA;IACvB,YAAY,EAAE,OAAO,CAAA;IACrB,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,MAAM,CAAA;IAChB,eAAe,EAAE,OAAO,CAAA;IACxB,oBAAoB,EAAE,OAAO,CAAA;IAC7B,YAAY,EAAE,OAAO,CAAA;IACrB,iBAAiB,EAAE,MAAM,CAAA;IACzB,aAAa,EAAE,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;IACtB,WAAW,EAAE,MAAM,CAAA;IACnB,iBAAiB,EAAE,MAAM,CAAA;IACzB,sBAAsB,EAAE,MAAM,CAAA;IAC9B,cAAc,EAAE,MAAM,CAAA;IACtB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,cAAc,CAyBlE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGlD;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAe3D;AAED,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,SAAS,GAAE,CAAC,GAAG,CAAK,GACnB,IAAI,CAcN"}
@@ -0,0 +1,9 @@
1
+ export declare function randomId(prefix: string): string;
2
+ export declare function randomRoomCode(): string;
3
+ export declare function randomToken(): string;
4
+ export declare function sha256Hex(value: string): string;
5
+ export declare function inviteHash(roomSecret: string, domain: 'sit' | 'watch', token: string): string;
6
+ export declare function cookieValue(): string;
7
+ export declare function nowIso(date?: Date): string;
8
+ export declare function addHours(hours: number, date?: Date): string;
9
+ //# sourceMappingURL=crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../../src/crypto.ts"],"names":[],"mappings":"AAEA,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,cAAc,IAAI,MAAM,CAGvC;AAED,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7F;AAED,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,wBAAgB,MAAM,CAAC,IAAI,OAAa,GAAG,MAAM,CAEhD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,OAAa,GAAG,MAAM,CAEjE"}
@@ -0,0 +1,22 @@
1
+ import { type CardId } from '../types.ts';
2
+ export declare const SUITS: readonly ["S", "H", "C", "D"];
3
+ export declare const RANK_ORDER: readonly ["3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2", "BJ", "RJ"];
4
+ export type Suit = typeof SUITS[number];
5
+ export type Rank = typeof RANK_ORDER[number];
6
+ export declare function cardBase(card: CardId | string): string;
7
+ export declare function rankOf(card: CardId): Rank;
8
+ export declare function suitOf(card: CardId): Suit | null;
9
+ export declare function rankValue(rank: string): number;
10
+ export declare function cardValue(card: CardId): number;
11
+ export declare function compareCards(a: CardId, b: CardId): number;
12
+ export declare function sortCards(cards: readonly CardId[]): CardId[];
13
+ export declare function fullDeck(copy?: number): CardId[];
14
+ export declare function stackedDeck(decks: 1 | 2): CardId[];
15
+ export declare const WILDABLE_RANKS: ("3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "J" | "Q" | "K" | "A" | "2")[];
16
+ export declare function isJokerRank(rank: Rank): boolean;
17
+ export declare function isWildCard(card: CardId, wildRanks: readonly string[]): boolean;
18
+ export declare function shuffle<T>(items: readonly T[], random: () => number): T[];
19
+ export declare function parseCardId(raw: string): CardId | null;
20
+ export declare function countRanks(cards: readonly CardId[]): Map<Rank, CardId[]>;
21
+ export declare function isNaturalSeqRank(rank: Rank): boolean;
22
+ //# sourceMappingURL=cards.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cards.d.ts","sourceRoot":"","sources":["../../../../src/engine/cards.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,MAAM,EAAE,MAAM,aAAa,CAAA;AAEnD,eAAO,MAAM,KAAK,+BAAgC,CAAA;AAClD,eAAO,MAAM,UAAU,yFAEb,CAAA;AAEV,MAAM,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,MAAM,CAAC,CAAA;AACvC,MAAM,MAAM,IAAI,GAAG,OAAO,UAAU,CAAC,MAAM,CAAC,CAAA;AAM5C,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAOzC;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAIhD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI9C;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAIzD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAE5D;AAED,wBAAgB,QAAQ,CAAC,IAAI,SAAI,GAAG,MAAM,EAAE,CAW3C;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE,CAIlD;AAED,eAAO,MAAM,cAAc,kFAA8D,CAAA;AAEzF,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAE/C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAI9E;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,MAAM,GAAG,CAAC,EAAE,CAWzE;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAItD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CASxE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAEpD"}
@@ -0,0 +1,11 @@
1
+ import { type CardId, type Seat, type SeatCount } from '../types.ts';
2
+ import { type Rank } from './cards.ts';
3
+ export interface Deal {
4
+ readonly hands: readonly CardId[][];
5
+ readonly bottom: readonly CardId[];
6
+ }
7
+ export declare function dealCards(seatCount?: SeatCount, random?: () => number): Deal;
8
+ export declare function giveBottom(hands: readonly CardId[][], bottom: readonly CardId[], landlord: Seat): CardId[][];
9
+ export declare function randomSeat(count?: SeatCount, random?: () => number): Seat;
10
+ export declare function pickLaiZiRanks(count: 1 | 2, random?: () => number, exclude?: readonly string[]): Rank[];
11
+ //# sourceMappingURL=deal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deal.d.ts","sourceRoot":"","sources":["../../../../src/engine/deal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,MAAM,EAAE,KAAK,IAAI,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAA;AACzF,OAAO,EAAwC,KAAK,IAAI,EAAE,MAAM,YAAY,CAAA;AAG5E,MAAM,WAAW,IAAI;IACnB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,CAAA;IACnC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;CACnC;AAED,wBAAgB,SAAS,CAAC,SAAS,GAAE,SAAa,EAAE,MAAM,GAAE,MAAM,MAAmB,GAAG,IAAI,CAY3F;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,GAAG,MAAM,EAAE,EAAE,CAE5G;AAED,wBAAgB,UAAU,CAAC,KAAK,GAAE,SAAa,EAAE,MAAM,GAAE,MAAM,MAAmB,GAAG,IAAI,CAExF;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,GAAE,MAAM,MAAmB,EAAE,OAAO,GAAE,SAAS,MAAM,EAAO,GAAG,IAAI,EAAE,CAUvH"}
@@ -0,0 +1,16 @@
1
+ import type { CardId, HandType, LegalCombo } from '../types.ts';
2
+ import { type Rank } from './cards.ts';
3
+ export interface ClassifiedHand {
4
+ readonly type: Exclude<HandType, 'pass'>;
5
+ readonly cards: readonly CardId[];
6
+ readonly key: number;
7
+ readonly length: number;
8
+ readonly wingLength: number;
9
+ readonly wild?: boolean;
10
+ }
11
+ export declare function classify(cards: readonly CardId[], laiZiRanks?: readonly string[]): ClassifiedHand | null;
12
+ export declare function beats(prev: ClassifiedHand, next: ClassifiedHand, decks?: 1 | 2): boolean;
13
+ export declare function enumerateLegal(hand: readonly CardId[], lead: ClassifiedHand | null, laiZiRanks?: readonly string[], decks?: 1 | 2): LegalCombo[];
14
+ export declare function smallestSolo(hand: readonly CardId[]): CardId | null;
15
+ export declare function classifyPlaneSolo(cards: readonly CardId[], entries?: readonly [Rank, CardId[]][]): ClassifiedHand | null;
16
+ //# sourceMappingURL=hands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hands.d.ts","sourceRoot":"","sources":["../../../../src/engine/hands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE/D,OAAO,EAEW,KAAK,IAAI,EAC1B,MAAM,YAAY,CAAA;AAEnB,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IACxC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;IACjC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,UAAU,GAAE,SAAS,MAAM,EAAO,GAAG,cAAc,GAAG,IAAI,CAU5G;AA6CD,wBAAgB,KAAK,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,GAAE,CAAC,GAAG,CAAK,GAAG,OAAO,CAiB3F;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,IAAI,EAAE,cAAc,GAAG,IAAI,EAC3B,UAAU,GAAE,SAAS,MAAM,EAAO,EAClC,KAAK,GAAE,CAAC,GAAG,CAAK,GACf,UAAU,EAAE,CAiCd;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAGnE;AA4ED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,OAAO,GAAE,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAEjC,GACA,cAAc,GAAG,IAAI,CA2BvB"}
@@ -0,0 +1,7 @@
1
+ export * from './cards.ts';
2
+ export * from './hands.ts';
3
+ export * from './deal.ts';
4
+ export * from './play.ts';
5
+ export * from './score.ts';
6
+ export * from './random.ts';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/engine/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA"}
@@ -0,0 +1,73 @@
1
+ import { type BidAction, type BidScore, type CardId, type DoubleAction, type Hand, type HandId, type Play, type RoomId, type Seat, type SeatCount } from '../types.ts';
2
+ export type EnginePhase = 'bidding' | 'doubling' | 'playing' | 'settled' | 'redeal';
3
+ export interface EngineState {
4
+ phase: EnginePhase;
5
+ seatCount: SeatCount;
6
+ laiZi: boolean;
7
+ hand: MutableHand;
8
+ firstLeadSeq: number | null;
9
+ successfulLandlordPlaysAfterLead: number;
10
+ farmerPlayed: boolean[];
11
+ bids: Array<BidAction | null>;
12
+ bidTurn: Seat;
13
+ called: boolean;
14
+ actedBid: boolean[];
15
+ refusedCall: boolean[];
16
+ robBackDone: boolean;
17
+ highestBidder: Seat | null;
18
+ passesInRow: number;
19
+ doubleDeadlineAt: number;
20
+ farmerDoubleDone: boolean[];
21
+ landlordDoubleDone: boolean;
22
+ }
23
+ export interface MutableHand {
24
+ handId: Hand['handId'];
25
+ roomId: Hand['roomId'];
26
+ dealerSeat: Seat;
27
+ bottom: CardId[];
28
+ hands: CardId[][];
29
+ bid: BidScore;
30
+ landlordSeat: Seat | null;
31
+ farmerDoubledBySeat: Partial<Record<Seat, number>>;
32
+ landlordReDouble: number;
33
+ mingPaiBySeat: Partial<Record<Seat, boolean>>;
34
+ mingPaiMult: number;
35
+ bombCount: number;
36
+ rocketCount: number;
37
+ spring: 'none' | 'spring' | 'anti';
38
+ table: Play[];
39
+ turnSeat: Seat;
40
+ leadSeat: Seat;
41
+ laiZiRanks: string[];
42
+ }
43
+ export type PlayResult = {
44
+ readonly ok: true;
45
+ readonly play: Play;
46
+ readonly emptied: boolean;
47
+ } | {
48
+ readonly ok: false;
49
+ readonly code: 'illegal' | 'not-your-turn' | 'phase';
50
+ readonly reason: string;
51
+ };
52
+ export declare function createHand(roomId: RoomId, dealerSeat: Seat | null, seq: number, options?: {
53
+ seatCount?: SeatCount;
54
+ laiZi?: boolean;
55
+ }): EngineState;
56
+ export declare function applyBid(state: EngineState, seat: Seat, action: BidAction): PlayResult;
57
+ export declare function applyMingPai(state: EngineState, seat: Seat): PlayResult;
58
+ export declare function applyDouble(state: EngineState, seat: Seat, action: DoubleAction, now?: number): PlayResult;
59
+ export declare function expireDoubling(state: EngineState, now?: number): void;
60
+ export declare function applyPlay(state: EngineState, seat: Seat, cards: readonly CardId[], seq: number, ts: string): PlayResult;
61
+ export declare function applyPass(state: EngineState, seat: Seat, seq: number, ts: string): PlayResult;
62
+ export declare function autoTimeout(state: EngineState, seq: number, ts: string): PlayResult | null;
63
+ export declare function legalFor(state: EngineState, seat: Seat): {
64
+ canPass: boolean;
65
+ combos: readonly [];
66
+ } | {
67
+ canPass: boolean;
68
+ combos: import("../types.ts").LegalCombo[];
69
+ };
70
+ export declare function finishHand(state: EngineState, winnerSeat: Seat): void;
71
+ export declare function snapshotHand(state: EngineState): Hand;
72
+ export declare function createHandId(roomId: RoomId, seq: number): HandId;
73
+ //# sourceMappingURL=play.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"play.d.ts","sourceRoot":"","sources":["../../../../src/engine/play.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function cryptoUnit(): number;
2
+ //# sourceMappingURL=random.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"random.d.ts","sourceRoot":"","sources":["../../../../src/engine/random.ts"],"names":[],"mappings":"AAEA,wBAAgB,UAAU,IAAI,MAAM,CAGnC"}