ランダム短歌 — アイデアメモ¶
将来検討したい機能。未実装。
曲水の宴モード¶
コンセプト: 曲水の宴(ごくすいのえん)——時間制限のある短歌パーティ。「その間に書けなきゃ、その人は出せないぜ!」
コアルール: - ホストが 制限時間 を設定して「宴を始める」(例: 3分 / 5分) - 全員がカウントダウンを見ながらカードを書く - 時間内にカードを保存できた人だけ 合成に参加(準備OKは不要) - 何も書けなかった人は そのラウンドは不参加 - 宴が終わったら、参加確定者のカードだけで短歌を合成
イメージ(演出は後から足してもよい): - 画面上部に大きな 残り時間 表示 - (任意)中央に曲線の「流れ」UI — テーマやお題の言葉が流れてくる演出 - 時間切れ → 「宴終了」→ 参加確定 → ホストが合成(または自動合成)
フロー案:
1. ホストが「曲水の宴モード」を選び、制限時間を設定
2. 「宴を始める」→ writing_deadline_at をサーバーが記録、全員に同期
3. 参加者は制限時間内にカード入力 → 「カードを保存」(準備OKは任意・なくても参加可)
4. 時間切れ → 保存済みカードのある参加者だけが合成対象
5. 参加確定者のカードだけで合成
6. 「もう一度宴」で次ラウンド(カードリセット or 同カード再合成は要検討)
技術メモ:
- rooms.mode = 'gokusui'、rooms.writing_deadline_at、rooms.writing_duration_sec
- 合成 API: participantHasWrittenCards でフィルタ(ready は見ない)
- 期限は サーバー時刻 で判定(クライアントの時計ズレに依存しない)
- 3秒ポーリングで残り時間を更新(既存インフラで足りる。秒単位の厳密さが必要なら WebSocket 検討)
- 曲線 SVG や「言葉が流れる」演出は フェーズ2(ルールだけ先に実装可能)
実装可否: ✅ やれる。 既存の「準備OK → 合成」と相性がよい。 - 最小版(先にやる): 制限時間 + カウントダウン + 間に合わない人除外 + 合成 - 後から足す: 流れ UI、お題の自動切替、宴の BGM 的演出
非同期で誰かと遊ぶモード¶
→ 詳細要件: random-tanka-async.md
合意サマリ: - 締切 7日、期限到達時に 入力済みのみ 合成 - 最低 2人 - MVP: URL + 写真保存のみ(通知なし) - Phase 2: メール(メルマガ的・一斉通知) - LINE 画像添付: 将来(MVP では見送り)
人狼モード¶
コンセプト: 人狼のように「表のテーマ」と「裏のテーマ」が混在するパーティモード。全員が同じお題だと思って書いているうちに、誰かだけ別テーマで書いていた——というズレを楽しむ。
前提: - 3人以上(人狼役を1人入れる余裕が必要) - 通常の短歌合成フローはそのまま(カード入力 → 準備OK → 合成)
フロー案: 1. ホストが「人狼モード」をオンにしてルーム作成 2. 参加者全員に 表テーマ を表示(例: 「夏の思い出」) 3. ランダムで1人(または複数)にだけ 裏テーマ を通知(例: 「推し活」)— 本人以外には見えない 4. 各人がカードを書く(表テーマ派と裏テーマ派が混在) 5. 合成 → できあがった短歌を読む 6. (任意) どの短歌・どの言葉が「浮いている」か、誰が裏テーマだったかを当てる
当てる機能(あってもなくてもよい): - なし: 短歌を読んで「なんか違和感あるな〜」と盛り上がるだけでも成立 - あり: 合成後に「人狼だと思う人を投票」→ 正解発表、または「浮いてる言葉に印をつける」ミニゲーム
技術メモ:
- rooms に mode: 'normal' | 'werewolf'、裏テーマは rooms.werewolf_secret_theme など
- 参加者ごとに assigned_theme: 'public' | 'secret' をサーバー側だけ保持(他参加者の GET には含めない)
- 3人未満で人狼モード選択時は作成・参加を拒否
- 合成ロジック自体は変更不要(ランダム混ぜの結果として自然に「浮く」言葉が生まれる)
UX: - 表テーマは全員同じバナーで表示 - 裏テーマ担当者だけ、入力画面に控えめな「あなたの本当のテーマ: ○○」を表示 - 合成後: 「人狼モードでした」と明かすタイミングをホストが選べる(即 / 投票後)
一括保存・一括共有(1アクション)¶
コンセプト: 短歌が複数首できたあと、画像を全部保存したり LINE / メールに送るのを、今の「1首ずつ」から 1ボタン にまとめる。
なぜ効くか: - 非同期パーティは結果を見るタイミングがバラバラ → まとめて持ち帰りたい - スマホで1首ずつ保存・共有は地味に面倒 - Phase 2 のメール通知と組み合わせると「届いた → 一括保存」も自然
MVP 以降の案:
| アクション | 実装イメージ | 備考 |
|---|---|---|
| 全画像を保存 | Canvas をループ → downloadTankaBlob × N、または ZIP(JSZip) |
iOS Safari は連続 download に制限あり → 共有シート1回の方が現実的 |
| LINE に送る | 生成 PNG を navigator.share({ files }) で1回共有 |
公式 API でユーザー代わり送信は不可。ユーザー操作の共有が現実解 |
| メールに送る | mailto: 複数添付は不可 → Phase 2 サーバー送信 or 1通に複数画像添付 |
Resend 等 |
| 1アクション合成 | 「全部保存して LINE」= share sheet に複数 File | Web Share Level 2 が使える環境のみ |
UI案:
- 結果画面に「すべて保存」「共有(LINE など)」ボタンを btn-copy-all の隣に
- 非同期・曲水どちらでも同じコンポーネントを再利用
技術メモ:
- 既存: saveTankaImage(index), shareImageFile(file) — public/app.js
- 追加: saveAllTankaImages(), shareAllTankaImages() — 非同期 Promise.all で blob 生成
- 進捗トースト「3/5 首を準備中…」で UX 改善
優先: 非同期 MVP の Phase 1.5(結果 UI の改善)。通知 API より先にやっても価値が高い。
参加者色分け(試験実装)¶
コンセプト: 誰のカードか・誰が誰かを色で直感的に区別。
| 設定 | 場所 | 共有 |
|---|---|---|
| 色分け ON/OFF | 端末 localStorage | 自分の画面のみ |
| 自分の色(8色) | サーバー participants.accent_color |
ルーム全員のリストに反映 |
- 自分のカード入力欄: 選んだ色で枠・バッジ
- 参加者リスト: 各色のドット
- 未選択時: 参加順で自動割当
API: PUT /api/rooms/:code/accent
phrase_pool— おひとりさま練習で過去の言葉を再利用(合成の蓄積のみ、初期シードなし)- Canvas 画像生成 — メール添付の元ネタになりうる(2026-07 実装済み)