# 画面設計書 8-オプション設定画面

## 概要

本ドキュメントは、K-Shoot MANIA のオプション設定画面の設計仕様を記述する。ゲーム設定画面であり、グラフィクス設定、サウンド設定、キーバインディング、ゲームプレイ設定、言語設定等を4ページ構成で管理する（1,385行）。

### 本画面の処理概要

オプション設定画面はゲームの各種設定をユーザーが変更するための画面であり、設定変更はconfig.iniファイルに保存される。

**業務上の目的・背景**：プレイヤーの環境やプレイスタイルに合わせてゲームをカスタマイズするための設定画面。画面解像度・フルスクリーン・描画品質などのグラフィクス設定、マスターボリュームなどのサウンド設定、BT/FX/レーザーのキーバインド設定、HiSpeedやゲージタイプなどのゲームプレイ設定を提供する。

**画面へのアクセス方法**：タイトル画面でメニュー項目1番（オプション設定）を選択してEnterキーを押下する。

**主要な操作・処理内容**：
1. 4ページ構成のタブ切替（左右キーまたはFXキー）
   - ページ-1（トップメニュー）：4ページへの遷移選択
   - ページ0（SCREEN設定）：フルスクリーン/ウィンドウ、解像度、描画品質、言語、Vsync等
   - ページ1（GAME PLAY設定）：ノートモード、レーザー入力方式、判定遅延、マスターボリューム等
   - ページ2（HI-SPEED設定）：x倍速/C値/m値/a値/オフセット値の有効/無効
   - ページ3（KEY CONFIG設定）：BT/FX/レーザー/Start/Backの各キー割り当て
2. 上下キーによる項目選択
3. 左右キーによる値変更
4. Spaceキー（またはFX同時押し）によるキーバインド設定のリセット
5. ESCキーによる設定保存とタイトル画面への復帰

**画面遷移**：
- 遷移先：タイトル画面（SCENE_TITLE、ESCキー押下後設定保存、行1071-1072）
- 遷移元：タイトル画面（メニュー1番選択）

**権限による表示制御**：特になし。全ユーザーに同一の設定項目が表示される。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 6 | オプション設定画面 | 主機能 | 画面設定・ゲームプレイ設定・HiSpeed設定・キー設定の4ページ構成オプション画面の主処理 |
| 82 | フルスクリーン・ウィンドウ設定 | 主機能 | fullscr変数によるフルスクリーン/ウィンドウ切替、解像度選択 |
| 83 | 言語設定 | 主機能 | curlang/clang変数によるJapanese/English/Korean/簡体字中国語/繁体字中国語の5言語切替 |
| 84 | 描画品質設定 | 主機能 | lowquality変数によるHIGH(0)/MEDIUM(1)/SMALL(2)の3段階描画品質設定 |
| 85 | マスターボリューム設定 | 主機能 | mastervol変数による0-100%範囲でのマスターボリューム調整（5%刻み） |
| 86 | Vsync設定 | 主機能 | vsync変数によるVsync有効(1)/無効(0)の切替 |
| 87 | ノートモード設定 | 主機能 | shortmodedef/longmodedef/analogmodedefによるBT/FX/LASERの各ON/OFF/HIDE/AUTO設定 |
| 88 | レーザー入力方式設定 | 主機能 | analoginput変数による6種類入力方式切替 |
| 89 | 判定遅延設定 | 主機能 | judgedelay_config/analogdelay_config変数による入力遅延のms単位調整 |
| 90 | HiSpeed設定 | 主機能 | vhstype配列による5種類HiSpeed方式の有効/無効設定 |
| 91 | キーバインド設定 | 主機能 | pagenow=3でのBT/FX/レーザー/Start/Backの各キー割り当て |
| 58 | キーボード入力 | 補助機能 | 方向キー・Enter・Escによる項目選択・値変更・ページ切替操作 |
| 59 | ジョイスティック入力 | 補助機能 | getjoykeystatによるジョイスティックでのオプション操作 |
| 42 | 音量制御 | 補助機能 | オプションBGM(optionbgmid)のマスターボリューム適用 |
| 98 | config.ini管理 | 主機能 | オプション変更値のconfig.iniへの保存処理 |
| 101 | 多言語テキスト管理 | 補助機能 | lang.3.*変数による設定項目ラベル・値説明の多言語表示 |
| 130 | BASS Audio Library | 補助機能 | オプションBGMの再生制御 |
| 7 | シーン遷移管理 | 遷移先機能 | ESCキー押下でSCENE_TITLEへ遷移 |

## 画面種別

設定画面（タブ付きフォーム）

## URL/ルーティング

デスクトップアプリケーション（HSP3）のため、URLルーティングは存在しない。シーン管理はscene変数（SCENE_OPTION = 7）により制御される。

## 入出力項目

| 項目名 | 入出力 | データ型 | 説明 |
|--------|--------|----------|------|
| pagenow | 内部状態 | int | 現在表示中のページ（-1:トップ, 0:SCREEN, 1:GAMEPLAY, 2:HISPEED, 3:KEYCONFIG） |
| selnow | 内部状態 | int | 現在選択中の項目インデックス |
| fullscr | 入力/出力 | int | フルスクリーン設定（0:ウィンドウ, 1:フルスクリーン） |
| windowsize | 入力/出力 | int配列 | ウィンドウサイズ（windowsize.0=幅, windowsize.1=高さ） |
| fullscrsize | 入力/出力 | int配列 | フルスクリーン解像度 |
| lowquality | 入力/出力 | int | 描画品質（0:HIGH, 1:MEDIUM, 2:SMALL） |
| mastervol | 入力/出力 | int | マスターボリューム（0-100、5%刻み） |
| vsync | 入力/出力 | int | Vsync設定（0:OFF, 1:ON） |
| curlang/clang | 入力/出力 | int | 言語設定 |
| analoginput | 入力/出力 | int | レーザー入力方式（0-5） |
| judgedelay_config | 入力/出力 | int | 入力判定遅延（ms） |
| analogdelay_config | 入力/出力 | int | レーザー判定遅延（ms） |
| shortmodedef | 入力/出力 | int | BTノートモード（ON/OFF/HIDE/AUTO） |
| longmodedef | 入力/出力 | int | FXノートモード |
| analogmodedef | 入力/出力 | int | LASERノートモード |
| vhstype | 入力/出力 | int配列 | HiSpeed方式の有効/無効配列 |
| key/key2 | 入力/出力 | int配列 | キーバインド設定（キーボード1/2） |
| joykey | 入力/出力 | int配列 | ジョイスティックキーバインド |
| ckey | 内部状態 | int | キーバインド設定対象（0:KB1, 1:KB2, 2+:ゲームパッド） |

## 表示項目

| 項目名 | 表示位置 | 説明 |
|--------|----------|------|
| 背景画像 | 画面全体 | bg.jpg（buffer 28） |
| ページタブ | 画面上部 | config_top.png（Image 81）による4ページタブ表示 |
| 設定項目リスト | 画面中央 | config_item*.gif（buffer 132/136/137/138/139）による設定項目表示 |
| 選択カーソル | 選択項目上 | config_item_cur.gif（buffer 141）による選択カーソル |
| FXキー表示 | 画面下部 | config_fx.gif（buffer 36）によるFXキー操作ガイド |
| キーバインド表示 | ページ3 | 各キーの現在の割り当て値 |
| 操作説明 | 画面最下部 | lang.3.93による操作ガイドテキスト |

## イベント仕様

### 1-ページ切替

ESCキーでトップメニュー（pagenow=-1）に戻る。トップメニューでEnterキーまたは左右キーでページ0-3に遷移する。ページ内で上下キーにより項目を選択する。

### 2-値変更（左右キー）

各設定項目で左右キーにより値を変更する：
- **フルスクリーン**：0（ウィンドウ）/1（フルスクリーン）をトグル
- **ウィンドウサイズ**：640x480 → 800x600 → 1024x768 → 1280x720 → 1280x1024のプリセットから選択
- **描画品質**：HIGH(0)/MEDIUM(1)/SMALL(2)を切替
- **マスターボリューム**：5%刻みで0-100%を調整
- **Vsync**：ON(1)/OFF(0)をトグル
- **言語**：5言語を順次切替
- **ノートモード**：ON/OFF/HIDE/AUTOを切替
- **レーザー入力方式**：6種類を順次切替
- **判定遅延**：ms単位で増減
- **HiSpeed方式**：有効/無効をトグル

### 3-キーバインド設定（ページ3）

ページ3ではBT(A-D)/FX(L,R)/Laser(L,R)/Start/Backの各キーを設定できる。項目を選択してキーを押下すると、そのキーが割り当てられる。Spaceキー（またはFX同時押し）でリセット（-1に設定）。ckey変数でキーボード1/2/ゲームパッドを切替える。

### 4-ESCキーによる保存・復帰

ESCキー押下時にpagenow=-1（トップメニュー）の場合、設定をconfig.iniに保存してSCENE_TITLEへ遷移する（行1061-1081）：
1. vhstypeの有効数を確認し、全て無効なら(1,1,0,0,0)にリセット（行1064-1067）
2. prev_scene=SCENE_OPTIONを設定（行1071）
3. scene=SCENE_TITLEを設定（行1072）
4. *saveconfigサブルーチンを呼び出し（行1081）
5. 画面解像度変更があった場合、画面サイズを再設定してimgrefresh=1を設定（行1089-1102）

## データベース更新仕様

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

| 操作（イベント） | 対象ファイル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| ESC押下時 | config.ini | UPDATE | 全設定値のconfig.iniへの保存 |

### テーブル別更新項目詳細

#### config.ini

| 操作 | 項目 | 更新値 | 備考 |
|-----|------|--------|------|
| UPDATE | fullscr | 0/1 | フルスクリーン設定 |
| UPDATE | windowsize | 幅,高さ | ウィンドウサイズ |
| UPDATE | lowquality | 0/1/2 | 描画品質 |
| UPDATE | mastervol | 0-100 | マスターボリューム |
| UPDATE | vsync | 0/1 | Vsync設定 |
| UPDATE | key.0-key.13 | キーコード | キーバインド（KB1） |
| UPDATE | key2.0-key2.13 | キーコード | キーバインド（KB2） |
| UPDATE | analoginput | 0-5 | レーザー入力方式 |
| UPDATE | judgedelay_config | ms値 | 入力判定遅延 |

## メッセージ仕様

| メッセージID | 種別 | 表示条件 | メッセージ内容 |
|-------------|------|----------|--------------|
| lang.3.* | UI | 常時 | 各設定項目のラベルと値の説明（多言語対応） |
| lang.3.93 | 情報 | 常時 | 操作説明テキスト（画面最下部） |

## 例外処理

| 例外条件 | 処理内容 |
|---------|---------|
| 全HiSpeed方式が無効 | vhstype=(1,1,0,0,0)にリセット（行1067） |
| 画面解像度変更 | imgrefresh=1を設定し、タイトル画面でテクスチャリフレッシュを実行 |

## 備考

- 設定画面は4ページ+トップメニューの5階層構成。pagenow=-1がトップメニュー、0-3が各設定ページ。
- オプションBGM（optionbgmid）はオプション画面表示中にループ再生される。
- 画面解像度変更やフルスクリーン切替はオプション画面を閉じた後、タイトル画面で反映される。imgrefresh=1フラグにより全テクスチャが再読み込みされる。
- 言語は5種類：Japanese/English/Korean/簡体字中国語/繁体字中国語。
- マスターボリュームはリアルタイムプレビュー可能（変更即座にBGMに反映）。
- ウィンドウサイズのプリセットは640x480/800x600/1024x768/1280x720/1280x1024。

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | kshootmania.hsp | `kshootmania.hsp` | 行17: SCENE_OPTION=7 |
| 1-2 | option.hsp | `src/scene/option.hsp` | pagenow, selnow, ckey変数がページ遷移・項目選択・キー設定対象を管理 |

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | option.hsp | `src/scene/option.hsp` | 行1: `#deffunc on_update_option`がエントリーポイント |

**主要処理フロー**:
1. **行1-63**: 初期化（is_scene_initial_frame=1時）。画像読み込み、BGM再生開始
2. **行64-**: 毎フレーム処理。背景描画、入力処理、設定値変更
3. **行72-119**: Spaceキー/FXキーによるキーバインドリセット
4. **行121-186**: 上下キーによる項目選択（ページ3は特殊なレイアウト）
5. **行187-**: 左右キーによる値変更
6. **行1060-**: ESCキーによる保存・遷移処理

#### Step 3: 保存・遷移処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | option.hsp | `src/scene/option.hsp` | 行1060-1110: ESCキー判定。vhstypeチェック、saveconfig呼び出し、画面サイズ変更処理 |

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

```
kshootmania.hsp (メインループ)
    |
    +-- on_update_option (src/scene/option.hsp:1)
            |
            +-- [初期化] is_scene_initial_frame=1時 (行2-63)
            |       +-- 画像読み込み (config_*.gif/png)
            |       +-- BASS_ChannelPlay optionbgmid (行62)
            |
            +-- 毎フレーム処理
            |       +-- 背景描画 (行67-71)
            |       +-- Space/FXキー処理 (行72-119)
            |       +-- 上下キー項目選択 (行121-186)
            |       +-- 左右キー値変更 (行187-)
            |       |       +-- ページ0: SCREEN設定
            |       |       +-- ページ1: GAMEPLAY設定
            |       |       +-- ページ2: HISPEED設定
            |       |       +-- ページ3: KEYCONFIG設定
            |       +-- ESCキー判定 (行1060-)
            |               +-- pagenow=-1時: 保存・遷移
            |                       +-- vhstypeチェック (行1064-1067)
            |                       +-- *saveconfig (行1081)
            |                       +-- 画面サイズ変更 (行1089-1110)
            |                       +-- scene=SCENE_TITLE (行1072)
            |               +-- pagenow>=0時: トップメニューに戻る
            |
            +-- *saveconfig ... config.iniへの設定保存
```

### データフロー図

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

config.ini -----------> 初回読み込み ------> 各設定変数
                        (タイトル画面で実行)

上下キー -------------> selnow変更 -------> 項目選択カーソル
左右キー -------------> 各設定変数変更 ----> 設定値表示更新
                                              |
                                              v（リアルタイム）
                                        BASS_ChannelSetAttribute
                                        (ボリュームプレビュー)

ESCキー --------------> *saveconfig ------> config.ini保存
                        |                    |
                        v                    v
                  scene=SCENE_TITLE    imgrefresh=1
                  prev_scene=           (解像度変更時)
                  SCENE_OPTION
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| option.hsp | `src/scene/option.hsp` | ソース | オプション設定画面の全処理（1,385行）。on_update_option関数 |
| kshootmania.hsp | `kshootmania.hsp` | ソース | メインループ、定数定義、config.ini読み込み |
| config.ini | `config.ini` | 設定 | ゲーム設定の永続化ファイル |
| bg.jpg | `imgs/bg.jpg` | リソース | オプション画面背景画像 |
| config_top.png | `imgs/config_top.png` | リソース | ページタブ画像 |
| config_item.gif | `imgs/config_item.gif` | リソース | 設定項目枠画像 |
| config_item2.gif | `imgs/config_item2.gif` | リソース | 設定項目枠画像（小） |
| config_item_0.gif | `imgs/config_item_0.gif` | リソース | SCREEN設定の値画像 |
| config_item_1.gif | `imgs/config_item_1.gif` | リソース | GAMEPLAY設定の値画像 |
| config_item_2.gif | `imgs/config_item_2.gif` | リソース | HISPEED設定の値画像 |
| config_item_cur.gif | `imgs/config_item_cur.gif` | リソース | 選択カーソル画像 |
| config_fx.gif | `imgs/config_fx.gif` | リソース | FXキー操作ガイド画像 |
