Project Plateau
Project Plateau: four glass plates, one living valley, and the road back to camp.
手番のないリアルタイム麻雀。4人が同時にツモ・打牌し、鳴き・和了は早押しで決まる。
Translation pending
GamesTypeScript · CSSGitHub @dw659550-sourceOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗手番のないリアルタイム麻雀(仕様書 v0.5)。4人が同時並行でツモ・打牌し、鳴き・和了は早押しで決まります。
構成はワードジャマー/17ポーカーと同じ Next.js 14 + Firebase Firestore(Vercel無料枠で公開可、課金不要)です。
shared/ 麻雀ロジック(役・符・点数・対局進行・CPU)とテスト
web/ Next.js アプリ(ロビー・待機室・対局・観戦・ランキング・管理画面)
npm install
ワードジャマー・17ポーカーと 同じFirebaseプロジェクトを使ってOK です(コレクション名は dopa_* で分けています)。
web/firestore.rules の中身を貼り付けて「公開」。
firebaseConfig の6項目を控える(既存アプリと同じ値)。web/.env.local.example を web/.env.local にコピーして値を入れます。
| 変数 | 内容 |
|---|---|
NEXT_PUBLIC_FIREBASE_* | 手順2-2の6項目 |
ADMIN_PASSWORD | 管理画面のパスワード(任意の文字列) |
FIREBASE_SERVICE_ACCOUNT_JSON | 手順2-3のJSONの中身(1行にして貼る。base64でも可) |
ADMIN_PASSWORD と FIREBASE_SERVICE_ACCOUNT_JSON はサーバー側だけで使います。NEXT_PUBLIC_ を付けないでください。
npm run dev # http://localhost:3000
npm test # 麻雀ロジックのテスト
web を指定。FIREBASE_SERVICE_ACCOUNT_JSON は複数行のJSONをそのまま貼ってOK。「starts and ends with whitespace and has return characters」という警告が出ますが問題ありません。main ブランチです。作業ブランチからのデプロイはプレビュー扱いになります。本番では、Vercelが自動で作るアカウント名入りのURL(*.vercel.app)で開かれると、https://dopa-mahjong.vercel.app に自動で切り替わります(web/src/middleware.ts)。別のURLに変える場合は、環境変数 CANONICAL_HOST にそのホスト名(例:dopa-mj.vercel.app)を設定してください。
管理画面は /admin です(ロビーからはリンクしていません)。
サーバー(常駐プロセス)を持たない構成のため、仕様8章「判定はすべてサーバー側」を次の形で実現しています。
shared/)を実行し、結果を書き込みます。トランザクションは「先にコミットした方が勝ち」なので、早押しは Firestore に届いた順 で決まります。制約(正直に書いておきます):
dopa_admin_logs に記録します。閲覧操作は記録しません。確認済みのもの:
こちらで決めたもの(変更したい場合は言ってください):
dopa_matches に kind: "kifu" として保存する(JSON文字列。Firestoreが配列の中の配列を保存できないため)。rules.turnBased、今は少牌マイティのときだけ選べる):順番にツモ・打牌する普通の進行。1手番10秒(立直後のツモ切りは1秒)。打牌・加槓・北抜きのあと、ロン・ポン・カンできる人が答えるまで(最大10秒、スキップ可)次へ進まない。ロンはポン・カンより優先(ロンできる人が答え終わってから、宣言済みのポン・カンが成立)。ロンが複数人できるときは先に宣言した人の和了(自動和了の人どうしはダブロン)。見逃し・スキップは同巡内フリテン。鳴き・暗槓が入ると全員の第1巡は終わり。戦績はドパありと同じ集計。CPUの反応時間は強さに関係なく0.3〜0.6秒(進行役の書き込みが1秒間隔なので、実際は1手あたり約1秒)。/api/visit(サーバー)が接続元IP・Vercelが付けるIPからの推定地域・ブラウザ/端末情報・名前・ブラウザIDを dopa_access_logs に保存する(同じ端末・同じ名前では1日1回まで。その日に名前を変えるともう1回)。GPSなどブラウザの許可画面が出る情報は取らない。このコレクションはFirestoreのルールで許可していないため、ブラウザから直接は読み書きできず、管理画面の「接続記録」タブからのみ見られる。web/.env.local に以下を加えると、本番のFirestoreを使わずに試せます(Java と firebase-tools が必要)。
NEXT_PUBLIC_FIRESTORE_EMULATOR_HOST=127.0.0.1:8080
FIRESTORE_EMULATOR_HOST=127.0.0.1:8080