Skip to content

feat: 麻雀を簡易的にまず動くように - #30

Draft
4ster1sk wants to merge 159 commits into
cheripia-dev:developfrom
4ster1sk:feat/mahjong
Draft

4ster1sk wants to merge 159 commits into
cheripia-dev:developfrom
4ster1sk:feat/mahjong

Conversation

@4ster1sk

@4ster1sk 4ster1sk commented Nov 8, 2026

Copy link
Copy Markdown
Contributor

まだ未テスト

Base: develop ← Head: feat/mahjong

概要

misskey-dev/misskey#13112(feat: 麻雀)の実装を Cheripia 向けに移植し、ローカルユーザー4人で遊べる最小構成のヨンマを追加します。

  • ルーム作成・参加・準備完了・対局開始
  • 打牌、ツモ、ロン、ポン、チー、カン、暗槓、加槓、リーチ
  • ツモ和了、ロン和了、流局、次局、東風戦4局での終局
  • CPU(AI)との対局
  • 対局結果(役・ドラ・点数)表示と最終点数表示

変更内容

麻雀エンジン

  • packages/misskey-mahjong を追加
    • 牌・面子・待ち形・役判定・符計算用の待ち判定
    • 4人麻雀の対局エンジン(親子・局進行・鳴き・リーチ・和了)
    • クライアント側の対局状態エンジン
    • 役判定・点数計算のテスト

バックエンド

  • MahjongService を追加
    • Redis ベースのルーム管理
    • ルーム作成・参加・退出・準備完了
    • ターンタイマー、鳴き・ロン回答タイマー、次局確認
    • CPU 参加と簡易 AI
    • ルーム単位のロックによる同時操作の競合防止
    • 他家の手牌・暗槓の秘匿
    • 他家のツモ牌・嶺上牌を WebSocket で伏せる処理
  • 以下の API を追加
    • mahjong/create-room
    • mahjong/join-room
    • mahjong/show-room
  • WebSocket チャンネル mahjongRoom を追加
  • CoreModule / ServerModule / Connection / GlobalEventService / JSON schema へ統合

フロントエンド

  • /mahjong トップページ
  • /mahjong/g/:roomId ルーム画面
    • ルーム URL の共有・コピー
    • CPU 追加、準備完了
    • 対局画面(手牌・捨て牌・副露・リーチ・鳴き・和了)
    • 対局結果オーバーレイ、終局時の最終点数表示
  • /games に麻雀へのリンクを追加
  • 牌画像・効果音・背景アセットを追加
  • 日本語ロケールを追加

ビルド・周辺対応

  • pnpm-workspace.yaml / root package.json / backend・frontend の依存へ追加
  • Dockerfile、開発用・クリーン用スクリプト、lint / storybook CI、federation compose へ追加
  • misskey-js の API 型・streaming 型・API レポートを再生成
  • i18n の locale 型を再生成

動作確認

自動テスト

  • pnpm --filter misskey-mahjong test
    • 86 tests passed
  • pnpm --filter misskey-mahjong build
  • pnpm --filter backend typecheck / build
  • pnpm --filter frontend typecheck / build
  • pnpm --filter misskey-js typecheck / build

手動確認

テスト用 PostgreSQL / Redis を起動し、実際に API と WebSocket で確認しました。

  • ローカルユーザー4人でルーム作成 → 参加 → 全員準備完了 → 対局開始
  • 打牌、次局進行を確認
  • CPU 3人 + 人間1人で開始し、CPU の打牌・ツモ進行を確認
  • 他家の手牌・暗槓がクライアントに渡らないことを確認

既知の制限

今回の PR は「まずヨンマが動くこと」を優先した最小構成です。以下は未対応です。

  • 三麻
  • 東風戦4局固定(親の連荘、本場、供託なし)
  • 搶槓、流し満貫、四風連打、九種九牌、四槓散了、三家和了
  • 符計算(翻数ベースの簡易点数)
  • ゲーム履歴の永続化、ルーム一覧、招待、観戦、CRC による desync 復旧
  • 3D 描画
  • AI は簡易的(ポン・カンはランダム、ロンは常に宣言、チー・リーチなし)

関連

流局時の流し満貫検出と役満払い、初巡捨て牌ロンの人和を判定できるようにする。
通常役13翻以上を数え役満とし、役満・複合役は最大値を選択、大四喜を倍満にする。
暗槓・加槓・リーチの牌選択を解除して通常打牌に戻せるようにする。
加槓・暗槓と同様に分離表示し、和了可否ロジックへの影響はない。
異種牌のポン・カン・暗槓、同一牌ID重複、非順子のチーを修正する。
ヘッダーに局・残り山数を出し、河の最終打牌をハイライトする。
ゴミの上限付けと発火済みタイマーの残留除去。振る舞いは不変。
4席の家名と点数を各tickerの中央に配置する。
晒し牌や左右の捨て牌で牌画が縦向きのままになるのを修正する。
グリッド幅を牌実効幅で固定し、中央寄せをやめる。下家の河は上端始まりに揃える。
点数と増減に固定幅と右揃えを付け、表組み表示にする。
発光エフェクトを復活させ、白背景でも視認できる金色にする。
ルーム設定で持ち時間を変更でき、鳴き待ち時間にも同じ値を使う。
加槓と同様に牌種が1つの場合は選択を挟まず暗槓する。
送信後にボタン欄を非表示にし、手牌クリックも無視して二重送信を防ぐ。
リーチ成立打牌を記録し、河で平置き表示する。
副露を専用レーンに分けて河や手牌との重なりを解消する。
対面と自家の河グリッドを cheripia-dev#27 以前の自動幅に戻す。東西は維持。
幅固定ではなくコンテナの開始端固定で中央寄せを解消する。
サマリは詳細行のない家のみ表示し、各家を1回だけ出す。
局・タイマーを左端、ドラを右端に配置する。
南1局九種九牌後の進行停止の切り分けのため、黙って no-op になる分岐を可観測化する。振る舞いは不変。
トークンで世代を識別し、他世代の待機は消さない。同一待機抑止時も監視を張る。
ルーム設定で選択でき、東風戦は東4局で終了する。既定は東南戦。
帯レイアウト・cqw連動・未公開ドラ表示等。レビュー指摘2件を反映済み。
手牌と副露の帯レイアウト再配置、中央パネル縮小、副露積み方向変更、未公開ドラ表示。
fixes-2と同一内容のため、未適用だった6箇所のみ調整して適用。
河の縮小をtransformのscaleから牌寸法の倍率へ変え、ぼやけを解消する。中央パネル真四角化とオフセット再調整。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants