# 機能設計書 6-オプション設定画面

## 概要

K-Shoot MANIAのオプション設定画面の機能設計書である。画面設定・ゲームプレイ設定・HiSpeed設定・キー設定の4ページ構成で、ゲーム全般の設定を変更する画面である。

### 本機能の処理概要

オプション設定画面は、ゲームの各種設定を4ページのタブ構成で管理する。各ページで異なるカテゴリの設定項目を操作でき、変更はconfig.iniに保存される。

**業務上の目的・背景**：プレイヤーごとに異なるプレイ環境（画面解像度、入力デバイス、音量、描画品質等）に対応するため、柔軟な設定変更機能が必要である。特にキーバインド設定は、SDVX専用コントローラーやキーボードなど多様な入力デバイスに対応する。

**機能の利用シーン**：タイトル画面から「Option」を選択して遷移する。Escキーでタイトル画面に戻る。設定変更時にテクスチャ再読み込みが必要な場合はimgrefresh=1が設定される。

**主要な処理内容**：
1. ページ0: 画面設定（フルスクリーン/ウィンドウ、解像度、言語、描画品質、マスターボリューム、Vsync）
2. ページ1: ゲームプレイ設定（ノートモード、レーザー入力方式、判定遅延）
3. ページ2: HiSpeed設定（x倍速/C値/m値/a値/オフセット値の有効/無効）
4. ページ3: キーバインド設定（BT/FX/レーザー/Start/Backのキー割り当て）

**関連システム・外部連携**：BASS Audio Library（オプションBGM再生）、config.ini（設定保存）

**権限による制御**：特になし。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 8 | オプション設定画面 | 主画面 | 4ページ構成オプション画面の主処理 |
| 1 | タイトル画面 | 遷移元/遷移先 | Escキー押下でSCENE_TITLEへ遷移 |

## 機能種別

設定管理・画面表示・シーン遷移制御

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| fullscr | int | No | フルスクリーン設定 | 0(ウィンドウ) / 1(フルスクリーン) |
| windowsize | int[2] | No | ウィンドウサイズ | 幅,高さ |
| fullscrsize | int[2] | No | フルスクリーン解像度 | 幅,高さ |
| lowquality | int | No | 描画品質 | 0(HIGH) / 1(MEDIUM) / 2(SMALL) |
| mastervol | int | No | マスターボリューム | 0-100 |
| vsync | int | No | Vsync設定 | 0(OFF) / 1(ON) |
| analoginput | int | No | レーザー入力方式 | 0-5 |
| judgedelay_config | int | No | 入力遅延(ms) | 整数 |
| analogdelay_config | int | No | レーザー遅延(ms) | 整数 |
| key | int[14] | No | キーバインド配列 | キーコード |

### 入力データソース

- config.ini：現在の設定値
- キーボード・ジョイスティック入力

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| config.ini | file | 更新された設定ファイル |
| imgrefresh | int | テクスチャ再読み込みフラグ |
| scene | int | 遷移先シーンID（SCENE_TITLE） |

### 出力先

- config.ini（設定値の永続化）
- グローバル変数（各設定値の即時反映）

## 処理フロー

### 処理シーケンス

```
1. オプション画面初期化（on_update_option）
   ├─ ジョイスティック検索
   ├─ 画像リソース読み込み（config_*.gif, config_*.png等）
   ├─ IME無効化
   ├─ 現在設定値の保持（fullscrp, lowqualityp）
   └─ オプションBGM再生開始
2. オプションメインループ
   ├─ 背景描画
   ├─ 入力処理
   │   ├─ 上下キー：項目選択
   │   ├─ 左右キー：値変更
   │   ├─ FXキー：ページ切替
   │   ├─ Space/FX同時押し：キーリセット（ページ3）
   │   └─ Esc：設定保存・画面終了
   └─ ページ別設定項目描画
3. 設定保存・シーン遷移
   ├─ config.iniへの書き込み
   ├─ imgrefresh判定（画面設定変更時）
   └─ SCENE_TITLE遷移
```

### フローチャート

```mermaid
flowchart TD
    A[オプション画面開始] --> B[初期化・画像読み込み]
    B --> C[オプションBGM再生]
    C --> D[メインループ]
    D --> E{入力判定}
    E -->|FXキー| F[ページ切替]
    E -->|上下キー| G[項目選択]
    E -->|左右キー| H[値変更]
    E -->|Esc| I[設定保存]
    F --> D
    G --> D
    H --> D
    I --> J{画面設定変更?}
    J -->|Yes| K[imgrefresh=1]
    J -->|No| L[SCENE_TITLE]
    K --> L
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | 4ページ構成 | pagenow=0(画面)/1(プレイ)/2(HiSpeed)/3(キー)のページ切替 | 常時 |
| BR-02 | キーバインドリセット | Space/FX同時押しでキーを-1(未割当)にリセット | pagenow=3 |
| BR-03 | テクスチャ再読み込み判定 | fullscr/lowquality変更時にimgrefresh=1 | Esc終了時 |
| BR-04 | マスターボリューム | 0-100の範囲で5%刻み調整 | ページ0 |
| BR-05 | 言語設定 | 5言語（Japanese/English/Korean/簡体字/繁体字）から選択 | ページ0 |

### 計算ロジック

特になし。

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

本機能ではデータベース操作は行わない。config.iniファイルへの読み書きのみ。

## エラー処理

### エラーケース一覧

特にエラー処理なし。不正な値の入力は範囲制限で防止。

### リトライ仕様

リトライ処理は実装されていない。

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

トランザクション処理は適用されない。

## パフォーマンス要件

特に厳密な要件なし。

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

特になし。

## 備考

- キーバインド設定（ページ3）では、キーの割り当てをキーボード(key/key2)とジョイスティック(joykey)の4セットで管理
- ckey変数（0:key, 1:key2, 2:joy, 3:joy2）でアクティブなキーセットを切替

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | kshootmania.hsp | `kshootmania.hsp` | 設定関連のグローバル変数定義 |

**読解のコツ**: HSPのグローバル変数はファイルの先頭で初期値が設定される。config.iniの読み込み処理（416-681行目）で各変数に値が反映される。

- **282-343行目**: 各種設定変数のデフォルト値（lowquality, analoginput, mastervol等）
- **339行目**: vhstype=1,1,0,0,0 - HiSpeed方式の初期設定

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | option.hsp | `src/scene/option.hsp` | on_update_optionサブルーチン |

**主要処理フロー**:
1. **1行目**: `#deffunc on_update_option`
2. **3行目**: `is_scene_initial_frame=1` チェック
3. **4-5行目**: ジョイスティック検索・初期化
4. **6-49行目**: 画像リソース読み込み
5. **50行目**: IME無効化
6. **51-52行目**: 変更検知用の前値保持（fullscrp, lowqualityp）
7. **60-62行目**: オプションBGM再生開始
8. **72-100行目**: キーバインドリセット処理（pagenow=3, Space/FX同時押し時）

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

```
kshootmania.hsp (メインループ: 1085行目 case SCENE_OPTION)
    │
    └─ on_update_option (src/scene/option.hsp: 1行目)
           ├─ JStickSearchID (ジョイスティック検索)
           ├─ 画像リソース読み込み（config_*.gif/png）
           ├─ BASS_ChannelPlay (オプションBGM再生)
           ├─ *confkeshu (キー入力処理)
           ├─ ページ別設定項目処理
           │      ├─ ページ0: 画面設定
           │      ├─ ページ1: ゲームプレイ設定
           │      ├─ ページ2: HiSpeed設定
           │      └─ ページ3: キーバインド設定
           └─ config.ini保存
```

### データフロー図

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

config.ini ──────────────────▶ 設定値読み込み ────────────────▶ 各グローバル変数
                                    │
キーボード/ジョイスティック ──▶ 入力処理 ─────────────────────▶ 設定値変更
                                    │
変更された設定値 ────────────▶ config.ini保存 ────────────────▶ config.ini
                                    │
画面設定変更検知 ────────────▶ imgrefresh判定 ────────────────▶ imgrefresh=1
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| option.hsp | `src/scene/option.hsp` | ソース | オプション設定画面の全処理 |
| kshootmania.hsp | `kshootmania.hsp` | ソース | メインループ・設定変数定義・config.ini読み込み |
| config.ini | `config.ini` | 設定 | ゲーム設定ファイル |
| bg.jpg | `imgs/bg.jpg` | 画像 | オプション画面背景 |
| config_fx.gif | `imgs/config_fx.gif` | 画像 | FXキー表示画像 |
| config_item.gif | `imgs/config_item.gif` | 画像 | 設定項目枠画像 |
| config_top.png | `imgs/config_top.png` | 画像 | ページタブ表示画像 |
| option_bgm.ogg | `se/option_bgm.ogg` | 音声 | オプション画面BGM |
