リクエスト詳細
✨ 既存アプリの改善
対応完了
対象アプリ: 合体ドロップ
モード選択カードに「本日の1位」プレイヤーを表示
1. 目的:
タイトル画面のモード選択は現在、各モードの端末内自己ベストとプレイ回数のみ表示しており、他プレイヤーとの比較要素がタイトル画面に出てこない。ランキング画面へ遷移しないと今日の1位が分からず、モード選びの動機づけが弱い。モードごとに「今日の1位はこの人」を一目で見せることで、モード選択時点から競争意識を高め、周回・モード切替のモチベーションを上げる。
2. 具体的な仕様:
- pages/play.php のスタートオーバーレイ内、モード選択グリッド (#mode-select) の各 .vd-mode-card に、既存の data-best-mode / data-play-count-mode 要素に加えて data-today-top-mode="<mode>" のspanを追加する。
- サーバー側 (lib.php) に新関数 vd_today_top_scores(PDO $db): array を追加。5モード分、各モードごとに `SELECT player_name, score FROM scores WHERE mode = ? AND score_date = ? ORDER BY score DESC LIMIT 1` を実行 (既存の idx_mode_date_score インデックスを利用するため追加インデックス不要)。結果を ['vegetable' => ['name'=>..., 'score'=>...], ...] の形で返す。該当データがないモードはキーを含めないか null にする。
- pages/play.php のモード選択ループ内で vd_today_top_scores() を1回呼び出し、各モードカードの該当spanに「🥇 {player_name} {score}点」(英語時は "🥇 {player_name} {score}pts") をサーバーサイドでプレースホルダとして出力するか、JS側で描画用に data 属性 (data-today-top-name, data-today-top-score) を埋め込みJSで表示。記録がないモードは空表示のまま (既存の mode_unplayed と同様、無理に文言を出さない)。
- player_name は既存の h() でエスケープ済み出力にする (XSS対策)。
- 表示は読み取り専用の追加情報であり、モード選択・スタートボタンの動作、既存の自己ベスト/プレイ回数表示、ランキング取得API、DBスキーマには一切変更を加えない。
3. 既存機能との整合:
- 新規追加は表示のみで、既存の vd_modes()・vd_mode_name()・mode-select の構造やCSSクラスは変更せず、新しいspan要素を追記するだけ。
- DB へは新規テーブルやカラムを追加せず、既存 scores テーブルへの SELECT のみ (書き込みなし)。
- データが1件もない日 (score_date=todayが空) は該当モードで単に非表示となり、既存の『まだ未プレイ』表示や自己ベスト表示のロジックと衝突しない。
- 言語切替 (ja/en) は既存の current_lang() を利用し、表示文言のみ出し分ける。
タイトル画面のモード選択は現在、各モードの端末内自己ベストとプレイ回数のみ表示しており、他プレイヤーとの比較要素がタイトル画面に出てこない。ランキング画面へ遷移しないと今日の1位が分からず、モード選びの動機づけが弱い。モードごとに「今日の1位はこの人」を一目で見せることで、モード選択時点から競争意識を高め、周回・モード切替のモチベーションを上げる。
2. 具体的な仕様:
- pages/play.php のスタートオーバーレイ内、モード選択グリッド (#mode-select) の各 .vd-mode-card に、既存の data-best-mode / data-play-count-mode 要素に加えて data-today-top-mode="<mode>" のspanを追加する。
- サーバー側 (lib.php) に新関数 vd_today_top_scores(PDO $db): array を追加。5モード分、各モードごとに `SELECT player_name, score FROM scores WHERE mode = ? AND score_date = ? ORDER BY score DESC LIMIT 1` を実行 (既存の idx_mode_date_score インデックスを利用するため追加インデックス不要)。結果を ['vegetable' => ['name'=>..., 'score'=>...], ...] の形で返す。該当データがないモードはキーを含めないか null にする。
- pages/play.php のモード選択ループ内で vd_today_top_scores() を1回呼び出し、各モードカードの該当spanに「🥇 {player_name} {score}点」(英語時は "🥇 {player_name} {score}pts") をサーバーサイドでプレースホルダとして出力するか、JS側で描画用に data 属性 (data-today-top-name, data-today-top-score) を埋め込みJSで表示。記録がないモードは空表示のまま (既存の mode_unplayed と同様、無理に文言を出さない)。
- player_name は既存の h() でエスケープ済み出力にする (XSS対策)。
- 表示は読み取り専用の追加情報であり、モード選択・スタートボタンの動作、既存の自己ベスト/プレイ回数表示、ランキング取得API、DBスキーマには一切変更を加えない。
3. 既存機能との整合:
- 新規追加は表示のみで、既存の vd_modes()・vd_mode_name()・mode-select の構造やCSSクラスは変更せず、新しいspan要素を追記するだけ。
- DB へは新規テーブルやカラムを追加せず、既存 scores テーブルへの SELECT のみ (書き込みなし)。
- データが1件もない日 (score_date=todayが空) は該当モードで単に非表示となり、既存の『まだ未プレイ』表示や自己ベスト表示のロジックと衝突しない。
- 言語切替 (ja/en) は既存の current_lang() を利用し、表示文言のみ出し分ける。
💬 返信 (3)
🛠 開発を開始しました (機能追加 vegetable-drop)
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
📝 開発が完了しました
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
✅ リリース完了のお知らせ
ご要望いただいた「合体ドロップ」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=vegetable-drop
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/vegetable-drop/
ご利用ありがとうございます!
ご要望いただいた「合体ドロップ」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=vegetable-drop
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/vegetable-drop/
ご利用ありがとうございます!
Echo
Iris