# 機能設計書 83-games

## 概要

本ドキュメントは、space-vimのゲーム機能（games）の設計について記述する。この機能は、Vim内でミニゲームをプレイできる娯楽機能を提供する。

### 本機能の処理概要

**業務上の目的・背景**：長時間のコーディング作業や集中作業の合間に、気分転換やリフレッシュを目的としたエンターテインメント機能を提供する。Vimから離れることなく短時間の休憩を取ることで、作業効率の維持と開発者のウェルビーイング向上に貢献する。また、Vimの操作スキル向上の練習ツールとしても活用できる。

**機能の利用シーン**：コーディング作業の休憩時間、ビルド待機中、テスト実行中の空き時間など、短時間の気分転換が必要な場面で利用される。また、Vimの操作に慣れるための練習としても活用できる。

**主要な処理内容**：
1. `+fun/games`レイヤーの有効化によりvim-game-code-breakプラグインをロード
2. `:VimGameCodeBreak`コマンドでゲームを起動
3. ブロック崩しスタイルのゲームをVim内でプレイ
4. ゲーム終了後は通常の編集モードに復帰

**関連システム・外部連携**：johngrib/vim-game-code-breakプラグインとの連携。特別な外部依存はない。

**権限による制御**：特になし。レイヤーが有効化されていればすべてのユーザーが利用可能。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | ゲーム画面 | 主画面 | ブロック崩しゲームの表示・操作 |

## 機能種別

エンターテインメント / ゲーム

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| - | - | - | コマンド実行のみ、パラメータなし | - |

### 入力データソース

- ユーザーのキーボード入力（`:VimGameCodeBreak`コマンド）
- ゲーム中の方向キーまたはhjkl操作

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ゲーム画面 | Visual | ブロック崩しゲームの描画 |
| スコア | Number | ゲームのスコア表示 |

### 出力先

- Vimのバッファ（ゲーム専用バッファ）

## 処理フロー

### 処理シーケンス

```
1. コマンド実行
   └─ ユーザーが:VimGameCodeBreakを実行
2. ゲーム初期化
   └─ ゲーム用バッファ作成
   └─ 初期画面描画
3. ゲームループ
   └─ ユーザー入力待機
   └─ ボール/パドル位置更新
   └─ 衝突判定
   └─ 画面再描画
4. ゲーム終了
   └─ スコア表示
   └─ バッファクローズ
```

### フローチャート

```mermaid
flowchart TD
    A[VimGameCodeBreak実行] --> B[ゲームバッファ作成]
    B --> C[初期画面描画]
    C --> D{ゲームオーバー?}
    D -->|No| E[ユーザー入力待機]
    E --> F[ボール/パドル位置更新]
    F --> G[衝突判定]
    G --> H[画面再描画]
    H --> D
    D -->|Yes| I[スコア表示]
    I --> J[バッファクローズ]
    J --> K[通常モードに復帰]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-83-1 | 即時ロード | vim-game-code-breakは起動時に即座にロード | packages.vimでの登録時 |
| BR-83-2 | ゲームモード分離 | ゲーム中は通常の編集操作を受け付けない | ゲームバッファ表示中 |
| BR-83-3 | 終了復帰 | ゲーム終了後は元のバッファに戻る | ゲーム終了時 |

### 計算ロジック

- ボールの移動：フレームごとに位置を更新
- 衝突判定：ボールとパドル、ボールとブロック、ボールと壁の交差判定
- スコア計算：破壊したブロック数に基づく

## データベース操作仕様

本機能はデータベース操作を行わない。

### 操作別データベース影響一覧

該当なし

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | プラグイン未インストール | vim-game-code-breakがインストールされていない | :PlugInstallを実行 |
| - | レイヤー無効 | gamesレイヤーが有効化されていない | ~/.spacevimでLayer 'games'を追加 |
| - | ターミナルサイズ不足 | ターミナルが小さすぎてゲーム表示できない | ターミナルを拡大 |

### リトライ仕様

リトライは不要。エラー発生時はユーザーが設定を修正して再度操作する。

## トランザクション仕様

該当なし（ファイルシステムやDBへの永続化を伴わない）

## パフォーマンス要件

- ゲームのフレームレートは滑らかに動作すること
- ユーザー入力へのレスポンスは即座であること

## セキュリティ考慮事項

- 外部通信を行わないため、セキュリティリスクは最小限
- ゲームデータの永続化は行わない（ハイスコア等なし）

## 備考

- vim-game-code-breakはブロック崩しスタイルのゲーム
- Vimの操作（hjkl）でパドルを操作可能
- 現在のバッファのコードがブロックとして表示される場合がある

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

本機能は外部プラグイン（vim-game-code-break）が提供するゲームロジックを利用する。space-vim側ではプラグイン登録のみ。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | packages.vim | `layers/+fun/games/packages.vim` | ロードされるプラグインの確認 |

**読解のコツ**: `MP`マクロはvim-plugの`Plug`コマンドのラッパー。遅延ロードオプションが指定されていない場合は起動時にロードされる。

#### Step 2: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | packages.vim | `layers/+fun/games/packages.vim` | プラグイン登録がエントリーポイント |

**主要処理フロー**:
1. **1行目**: `MP 'johngrib/vim-game-code-break'` - プラグイン登録

#### Step 3: 設定を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | config.vim | `layers/+fun/games/config.vim` | 追加設定（現在空） |

**主要処理フロー**:
- config.vimは空のため、追加設定なし
- プラグインのデフォルト設定がそのまま使用される

### プログラム呼び出し階層図

```
vim起動
    │
    ├─ spacevim#bootstrap()
    │      └─ レイヤー読み込み
    │             └─ layers/+fun/games/packages.vim
    │                    └─ vim-plugへプラグイン登録
    │                           └─ vim-game-code-breakロード
    │
    └─ :VimGameCodeBreak実行
           └─ vim-game-code-breakプラグイン
                  └─ ゲームバッファ作成
                  └─ ゲームループ開始
```

### データフロー図

```
[入力]                    [処理]                         [出力]

:VimGameCodeBreak  vim-game-code-break          ゲーム画面
コマンド入力    ──▶  ゲーム初期化・ループ  ──▶  バッファ表示
                                                           │
hjklキー入力  ──▶  パドル位置更新  ──▶  画面再描画
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| packages.vim | `layers/+fun/games/packages.vim` | ソース | プラグイン登録 |
| config.vim | `layers/+fun/games/config.vim` | ソース | 設定（現在空） |
| README.md | `layers/+fun/games/README.md` | ドキュメント | レイヤー説明 |
