毎日続けたくなる「ドーパミン分泌型」体験への進化 — Daily Challenge・ストリーク強化・Juice演出
| 項目 | 内容 |
|---|---|
| バージョン | 1.1.0 (Build 3) |
| リリース予定日 | 2026年6月初頭 |
| 目的 | 毎日続けたくなる「ドーパミン分泌型」体験への進化 |
| D1リテンション目標 | 35% → 50%(+30% 以上) |
| D7リテンション目標 | 12% → 25%(+50% 以上) |
| DAU目標 | 50 → 150 |
| 必要OS | iOS 18.0+(既存と同じ) |
| 指標 | v1.0 基準値 | v1.1 当初目標 | v1.1.0 修正版(評価反映後) |
|---|---|---|---|
| D1リテンション | 35% | 50% | 55%(Near Miss効果で再挑戦率向上見込み) |
| D7リテンション | 12% | 25% | 30%(Variable Surprise で慣れ防止) |
| 平均セッション数/日 | 1.2 | 2.5 | 3.0 |
| DAU | 50 | 150 | 150(変更なし) |
| Daily Challenge参加率 | — | 新規DAUの 70% 以上 | 新規DAUの 70%(変更なし) |
| 「あと1ラウンドだった」モーメント比率 | — | — | 全プレイの 25% 以上を目標 |
| Surprise遭遇率 | — | — | 約10ゲームに1回(5.5%) |
全プレイヤーが同じ日に同じ色順をプレイするモード。
日付(yyyyMMdd)をシードとする SplitMix64 ベースの決定論的 RNG でシーケンスを生成することで、
サーバーレスで全員が同一体験を共有できる。
公開起算日: 2026-05-12 = Day 1。
ゲームオーバー時に DailyChallengeResultView を表示し、絵文字グリッド(🟥🟩🟦🟨)形式でシェア可能。
| キー | 型 | 用途 |
|---|---|---|
chromatic_daily_best_yyyyMMdd | String → Int | Daily Challenge 日別ベストスコア(日付ごとに1エントリ) |
chromatic_daily_completed_count | Int | Daily Challenge 累計プレイ数 |
chromatic_daily_last_played_date | String (yyyyMMdd) | Daily Challenge 最終プレイ日 |
chromatic_daily_last_played_score | Int | Daily Challenge 最終プレイスコア |
| ファイル | 役割 |
|---|---|
Daily/SeededRandomNumberGenerator.swift | SplitMix64 決定論的 RNG |
Daily/DailyChallengeManager.swift | 日付シード・本日ベスト管理 |
Daily/DailyChallengeEntryButton.swift | ホームのエントリボタン |
Daily/DailyChallengeResultView.swift | 絵文字グリッド結果オーバーレイ |
idle 画面に大型炎アイコン + 日数を常時表示。 既存の StreakBadgeView より視覚的インパクトを大幅に強化。
chromatic_streak_shield_available_date で管理| マイルストーン(日数) | 演出内容 |
|---|---|
| 3 日 | ミニお祝いオーバーレイ |
| 7 日 | フルスクリーンお祝いオーバーレイ(パーティクル + ハプティクス + カラーグラデーション) |
| 14 日 | 同上 |
| 30 日 | 同上(heavy 演出) |
| 60 日 | 同上 |
| 100 日 | 同上(最大演出) |
| 365 日 | 同上(最大演出) |
演出トリガー: idle 画面への復帰時にチェック。chromatic_last_streak_milestone で重複防止。
chromatic_notifications_enabled で ON/OFF 管理| キー | 型 | 用途 |
|---|---|---|
chromatic_streak_shield_available_date | String (yyyy-MM-dd) | シールド次回利用可能日 |
chromatic_last_streak_milestone | Int | 最後に演出済みのマイルストーン日数 |
chromatic_notifications_enabled | Bool | 通知 ON/OFF 設定 |
| ファイル | 役割 |
|---|---|
Streak/StreakManager.swift | ストリーク判定・シールド消費ロジック(既存拡張) |
Streak/LargeStreakDisplayView.swift | idle 画面の大型炎 + 日数表示 |
Streak/StreakMilestoneOverlay.swift | 7/30/100 日のお祝い演出 |
Notifications/NotificationManager.swift | 毎日 21 時リマインダー |
| 発火タイミング | パターン |
|---|---|
| パネルタップ | light × 1 |
| ラウンドクリア | medium × 1 |
| マイルストーン到達 | heavy × 2 連打 |
| ベスト更新 | success + heavy |
| ストリーク達成 | heavy × 2 + success |
| ゲームオーバー | error × 1 |
SwiftUI Canvas + TimelineView による軽量パーティクル実装。
重力・回転・透明度フェードを対応。
| サイズ種別 | パーティクル数 |
|---|---|
| small(マイルストーン 3/14 日等) | 14 個 |
| medium(ラウンドクリア等) | 36 個 |
| large(ベスト更新・100 日等) | 72 個 |
プレイ中ベスト更新の瞬間に全画面ゴールドフラッシュを発火。0.3s でフェードアウト。
GeometryEffect ベースの減衰 sin 波シェイク。マイルストーン到達時・ベスト更新時に発火。
| ファイル | 役割 |
|---|---|
Effects/HapticsManager.swift | ハプティクス一元管理 |
Effects/ParticleBurstView.swift | SwiftUI Canvas パーティクル爆発 |
Effects/ScreenShakeModifier.swift | GeometryEffect ベース画面シェイク |
Game/NewBestFlashView.swift | 全画面ゴールドフラッシュ |
Game/MilestoneFlashView.swift | マイルストーン到達演出(既存強化) |
「短時間で脳を高負荷運転させる」設計としてはかなり強い。
ただし現状は 競技性は強いが、依存性はまだ弱い。
必要なのは Near Miss / Flow演出 / Variable Reward / リズム没入 / Surprise。
目的: 「ベストまであと1」「Round 5まであと2」など、惜しい時のフレーズで再挑戦動機を最大化。
GameOverOverlayView表示優先4段階で出し分け(nearMissText: String? computed property で返す):
| 優先度 | 条件 | 表示フレーズ |
|---|---|---|
| 1(最高) | isNewBest = true | スキップ(NEW BEST ! と排他) |
| 2 | ベスト直前(差が 1〜3) | 「ベストまであと N」 |
| 3 | マイルストーン直前(5/10/15/20/25/30/40/50)(差が 1〜4) | 「Round X まであと N」 |
| 4(初プレイ時) | best = 0 | 「最初の壁 Round 5 まで あと N」 |
DailyChallengeResultView2系統のフレーズを独立して表示可能:
| 系統 | 条件 | 表示フレーズ |
|---|---|---|
| メイン Near Miss | 本日ベスト直前(差が 1〜3) | 「本日ベストまであと N」 |
| メイン Near Miss | Roundマイルストーン直前 | 「Round X まであと N」 |
| 「明日来てね」誘導 | 累計プレイ数の次マイルストーン(3/7/14/30/50/100/365)直前 | 「明日プレイで Daily 累計 N 回達成!」 |
「明日来てね」誘導は Near Miss と独立して表示可(idle帰着動機)。
#FF9500変更ファイル: GameOverOverlayView.swift(nearMissText computed property 追加、NEW BEST ! と排他で表示)、DailyChallengeResultView.swift(nearMissText + comebackText 追加)
目的: 評価AIから「320→250msの急変で記憶ゲー→反射ゲーに変質する」指摘を受け、滑らかなランプに修正。
| 実効ラウンド | 旧速度(5段階) | 新速度(6段階) | ラベル |
|---|---|---|---|
| 1〜4 | 650ms | 650ms | NORMAL |
| 5〜9 | 500ms | 500ms | NORMAL+ |
| 10〜14 | 400ms | 400ms | FAST |
| 15〜19 | 320ms | 340ms | FAST+ |
| 20〜24 | 250ms | 300ms | RAPID(新規) |
| 25+ | — | 280ms | INSANE |
Difficulty.insane の roundOffset を 19 → 24 に変更。INSANE難易度モードは Round 25+ の INSANE 280ms 速度から開始。
注意: 既存ベストスコアは継続有効。新スコアは旧より上振れ可能性あり(互換性のある変更)。
変更ファイル: GameViewModel.swift(computeSpeed() 6段階化、Difficulty.insane.roundOffset 19→24)
目的: 評価AIから「報酬密度が単調、予測可能、Variable Reward不足」を指摘され、希少サプライズを追加。
SurpriseEffectManager(@Observable @MainActor singleton)— 4種発火・確率判定・1プレイ1回制約SurpriseBannerView(共用バナーView)— 4種共有のCapsuleバナーhandlePanelTap 内ラウンドクリア時に maybeTrigger(round:) 呼び出し)startGame() 時に resetForNewGame() でフラグリセット| 演出 | 確率 | バナー文言 | カラー | アイコン | 追加効果 |
|---|---|---|---|---|---|
| RAINBOW BURST | 2.0% | "RAINBOW BURST!" | #FF3B30 → #AF52DE | sparkles | 7色虹パーティクル発火 |
| GOLDEN ROUND | 1.5% | "GOLDEN ROUND" | #FFD60A → #FF9500 | star.fill | バナーのみ(v1.1) |
| ECHO | 1.0% | "ECHO!" | #007AFF → #A0A0FF | waveform | バナーのみ(v1.1) |
| FLOW MOMENT | 1.5% | "FLOW" | #34C759 → #007AFF | infinity | バナーのみ(v1.1) |
注: v1.1 では GOLDEN / ECHO / FLOW は「バナー表示のみ」。各演出の追加ロジック(金パネル化・シーケンスリプレイ・心拍パルス)は v1.2 で本格実装予定。
.allowsHitTesting(false)変更ファイル: GameViewModel.swift(startGame() で resetForNewGame() 呼び出し)、GameView.swift(SurpriseEffectManager.shared 監視、RainbowParticleBurstView 追加、SurpriseBannerView × 4 配置)
Effects/
├── HapticsManager.swift # ハプティクス一元管理
├── ParticleBurstView.swift # SwiftUI Canvas パーティクル
├── ScreenShakeModifier.swift # GeometryEffect ベース画面シェイク
├── SurpriseEffectManager.swift # 4種サプライズ発火・確率・1回制約(新規)
└── SurpriseBannerView.swift # 共用サプライズバナーView(新規)
Daily/
├── SeededRandomNumberGenerator.swift # SplitMix64 決定論的RNG
├── DailyChallengeManager.swift # 日付シード・本日ベスト管理
├── DailyChallengeEntryButton.swift # ホームのエントリボタン
└── DailyChallengeResultView.swift # 絵文字グリッド結果オーバーレイ
Streak/
├── LargeStreakDisplayView.swift # idle画面の大型炎+日数表示
└── StreakMilestoneOverlay.swift # 7/30/100日のお祝い演出
Notifications/
└── NotificationManager.swift # 毎日21時リマインダー
Game/
└── NewBestFlashView.swift # 全画面ゴールドフラッシュ
修正ファイル(評価フィードバック反映):
├── GameViewModel.swift # startGame()→resetForNewGame(), maybeTrigger(), computeSpeed()6段階化, roundOffset 19→24
├── GameView.swift # SurpriseEffectManager.shared監視, RainbowParticleBurstView, SurpriseBannerView×4
├── GameOverOverlayView.swift # nearMissText computed property 追加(NEW BEST ! 排他)
└── DailyChallengeResultView.swift # nearMissText + comebackText 追加
| キー | 型 | 用途 |
|---|---|---|
chromatic_streak_shield_available_date | String | シールド次回利用可能日 |
chromatic_last_streak_milestone | Int | 最後に演出済みのマイルストーン日数 |
chromatic_notifications_enabled | Bool | 通知 ON/OFF 設定 |
chromatic_daily_best_yyyyMMdd | String → Int | Daily Challenge 日別ベストスコア |
chromatic_daily_completed_count | Int | Daily Challenge 累計プレイ数 |
chromatic_daily_last_played_date | String | Daily Challenge 最終プレイ日 |
chromatic_daily_last_played_score | Int | Daily Challenge 最終プレイスコア |
| 画面・状態 | 変更内容 |
|---|---|
| idle 画面 | 大型ストリーク表示(LargeStreakDisplayView)追加、TODAY'S CHALLENGE ボタン追加、難易度 Picker + START ボタンは既存のまま |
| Daily Challenge プレイ中 | 通常難易度と同じ UI。speedLabel が "DAILY" に変化 |
| Daily Challenge ゲームオーバー | DailyChallengeResultView(絵文字グリッド + シェアボタン)を表示 |
| ストリーク 7/30/100 日到達時 | 任意の idle 復帰タイミングで StreakMilestoneOverlay 全画面表示 |
UNUserNotificationCenter 許諾リクエストUNCalendarNotificationTrigger(repeats: true) を 1 本登録refreshAfterPlay() で同名 ID を削除 → 翌日シングルトリガー + 明後日以降リピートに切り替えchromatic_last_streak_milestone で管理)DailyChallengeManager にハードコード| 発生条件 | 対応 |
|---|---|
| 通知許諾拒否後のリマインダー登録要求 | SettingsView に誘導バナー表示。通知なしで通常動作は継続 |
| 通知二重発火(プレイ済み日の再起動等) | refreshAfterPlay() で同名 ID 削除 + 再登録で解決 |
| 低スペック端末でのパーティクル FPS 低下 | Canvas レンダリングのため軽量だが、将来的に粒子数を端末性能で動的調整する |
| タイムゾーン跨ぎでのリセット誤作動 | ローカル日付基準で統一。UTC 変換は行わない |
refreshAfterPlay() で同名 ID 削除 + 再登録パターンを採用評価AIの提案のうち、規模が大きいか v1.1 で実装しきれなかった項目。次期スプリントの計画時に参照すること。
| 機能 | 理由・概要 | 工数感 |
|---|---|---|
| PERFECT CHAIN / リズム評価システム | 「記憶ゲー → 音ゲー脳混合」で寿命延長。入力テンポ安定度を内部評価し、SMOOTH/PERFECT FLOW判定で BGM・Glow に反映 | 大(2週) |
| BGM 動的レイヤリング | フロー状態の演出。連続クリアでBGMが強化される | 大(2週) |
| 背景心拍同期パルス | Round 15+ で背景がBPMに同期して微脈動。Geometry Dash的ゾーン感 | 中(1週) |
| Daily「美しい並び」生成 | 単なるランダムでなく、ABAB / 対称 / リズム感のあるシーケンスを優先生成。"意味ありげ"が中毒化する | 中(1週) |
| 「読み」演出 | 次ラウンドの色を一瞬予告。期待形成 → 当てた時の達成感 | 小〜中 |
| GOLDEN ROUND の本格演出 | パネルが金色光沢に変化(v1.1 はバナーのみ) | 小 |
| ECHO の本格演出 | クリアしたシーケンスを高速リプレイ表示(v1.1 はバナーのみ) | 中 |
| FLOW MOMENT の本格演出 | 全画面の薄い脈動演出(v1.1 はバナーのみ) | 小 |
| カラークリスタル経済 + パレット解禁 + 宝箱開封 + パレット課金 | v1.2 既定スコープ。ゲーム内経済圏の確立 | 大 |
| バージョン | 日付 | 変更内容 |
|---|---|---|
| 1.0 | 2026-04-30 | v1.0 初回審査提出 |
| 1.0.1 | 2026-05-11 | 特商法対応 |
| 1.1.0 | 2026-06予定 | ドーパミン強化アップデート(Daily Challenge・ストリーク強化・Juice演出) |
| doc 1.0 | 2026-05-11 | 本仕様書 初版作成 |
| doc 1.1 | 2026-05-12 | Near Miss演出 / 速度カーブ6段階化 / Variable Surprise 4種を追加実装(評価フィードバック反映)。実装規模: 30〜40行のViewModel変更 + 2新規ファイル。v1.2持ち越し項目を明示 |