diff --git a/README.md b/README.md index 61f9ffd..d8e5f23 100644 --- a/README.md +++ b/README.md @@ -6,19 +6,21 @@ ## ルール・仕様 -カードは実物で配り、このサイトはチップの代わりに使う(ベット・ポット・スタックの管理)。 +基本はカードを実物で配り、このサイトはチップの代わりに使う(ベット・ポット・スタックの管理)。 +実物のカードがないときは、テーブル作成時に「カードを配る」をオンにすると、サイトがカードを配って勝敗まで自動で判定する(既定はオフ)。 - ノーリミット・テキサスホールデムのリングゲーム(最大9人)。ホストが START を押すと、以降は2人以上いる限り自動でハンドが続く。 - 画面にディーラーボタン(D)・SB・BB と、いまのストリート(PREFLOP / FLOP / TURN / RIVER)が出るので、それに合わせて実物のカードを配る。 - ブラインドは自動で支払われ、ハンド開始時のレベルで固定。ヘッズアップはボタンが SB。 - 各自が自分のスマホで Fold / Check / Call / Bet / Raise を行う。最低レイズ額は直前のレイズ幅以上。足りないオールインのレイズは、すでにアクションした人に再レイズ権を与えない。 - ベッティングが終わると次のストリートへ。全員オールインならその時点でショーダウンになる(残りのカードは実物でめくる)。 -- **ショーダウン**: カードを見せ合い、ホストが勝った人を画面で選んで確定する(ポットの分配はテーブルのホストだけが行える)。サイドポットがあるときはポットごとに選ぶ。複数選ぶと山分け(端数はボタンの左から)。 +- **ショーダウン(カード機能オフ)**: カードを見せ合い、ホストが勝った人を画面で選んで確定する(ポットの分配はテーブルのホストだけが行える)。サイドポットがあるときはポットごとに選ぶ。複数選ぶと山分け(端数はボタンの左から)。 +- **カード機能オン**: 各自のスマホに自分の手札だけが表示され、場札はストリートごとに画面に配られる。ショーダウンでは残った人の手札を公開して役を判定し、ポット(サイドポット含む)を自動で分配する。引き分けは山分け(端数はボタンの左から)。全員オールインになったら手札を公開し、残りの場札を順にめくる。山札は暗号論的乱数でシャッフルし、サーバの外に出さない(他人の手札は公開されるまで送らない)。 - 全員フォールドしたら残った人が自動でポットを獲得。誰もコールしなかった分は自動で返る。 - 「離席」にすると次のハンドから配られない(手番が来たら自動でチェック/フォールド)。「復帰する」で戻る。 - チップがなくなったら開始スタックでリバイできる。画面下に収支(現在のチップ − バイイン合計)を表示。 - ハンド中に退席するとフォールド扱い(出したチップはポットに残る)。 -- ホストの一時停止中は、アクション・勝者の確定・ブラインドタイマー・次のハンドの開始がすべて止まる。 +- ホストの一時停止中は、アクション・勝者の確定・オールイン後の場札・ブラインドタイマー・次のハンドの開始がすべて止まる。 ## ローカルで動かす @@ -71,8 +73,9 @@ http://localhost:4671 を開く。 | `server/index.js` | HTTP ルーティング・セキュリティヘッダ・REST API・Socket.IO | | `server/auth.js` | 参加キー認証(Cookie)・回数制限・Origin チェック | | `server/tables.js` | テーブル状態(席・ボタン・ブラインド・タイマー・ハンドの開始/進行) | -| `server/hand.js` | 1ハンドのチップの動き(ブラインド・ベッティング・サイドポット・勝者への分配) | -| `test/` | チップ処理のテスト(`npm test`) | +| `server/hand.js` | 1ハンドの進行(ブラインド・ベッティング・サイドポット・勝者への分配、カード機能オン時の配札とショーダウン) | +| `server/cards.js` | 山札のシャッフルと役の判定(カード機能オン時) | +| `test/` | チップ処理・役の判定のテスト(`npm test`) | | `server/config.js` | `.env` の読み込みと各種上限値 | | `public/assets/blinds.js` | ブラインド計算(サーバ・ブラウザ共用) | | `public/*.html`, `public/assets/*.js` | 各画面 | diff --git a/public/assets/create.js b/public/assets/create.js index 0505be1..5fd44f9 100644 --- a/public/assets/create.js +++ b/public/assets/create.js @@ -16,6 +16,8 @@ const timerInput = $('timer'); const intervalInput = $('interval'); const scheduleEl = $('schedule'); + const cardsInput = $('cards'); + const cardsHint = $('cards-hint'); const blindHint = $('blind-hint'); const errorEl = $('error'); const submitBtn = $('submit'); @@ -66,9 +68,16 @@ .join(''); } + function updateCardsHint() { + cardsHint.textContent = cardsInput.checked + ? 'オン: 各自のスマホに手札が配られ、勝敗とポットの分配は自動' + : 'オフ: 実物のカードで遊び、ショーダウンの勝者はホストが選ぶ'; + } + function refresh() { updateHint(); updateSchedule(); + updateCardsHint(); } stackInput.addEventListener('input', () => { @@ -91,6 +100,7 @@ }); timerInput.addEventListener('change', refresh); intervalInput.addEventListener('input', refresh); + cardsInput.addEventListener('change', refresh); $('reroll').addEventListener('click', suggestName); function validate() { @@ -128,6 +138,7 @@ bigBlind: int(bbInput), blindTimerEnabled: timerInput.checked, blindIntervalMin: int(intervalInput), + cardsEnabled: cardsInput.checked, token: Store.token, }); location.href = '/table/' + encodeURIComponent(id); diff --git a/public/assets/lobby.js b/public/assets/lobby.js index 6fae91e..d87e733 100644 --- a/public/assets/lobby.js +++ b/public/assets/lobby.js @@ -61,6 +61,7 @@ 開始 ${chips(t.startingStack)} Lv.${t.level} ${chips(t.smallBlind)}/${chips(t.bigBlind)} ${timer} + ${t.cardsEnabled ? '🃏 カードあり' : ''} diff --git a/public/table.html b/public/table.html index 15c61d5..a857ee6 100644 --- a/public/table.html +++ b/public/table.html @@ -38,6 +38,7 @@
POT
$0
+
WAITING
@@ -53,9 +54,10 @@