# 機能設計書 77-判定詳細表示

## 概要

結果画面においてCRITICAL/NEAR/ERROR個数・最大チェーン数を表示する機能の設計書である。

### 本機能の処理概要

プレイ終了後の結果画面で、各判定種別(CRITICAL/NEAR/ERROR)の個数と最大チェーン数(chainmax_song)をImage画像で数値表示する。これにより、プレイヤーはプレイの精度を詳細に確認できる。

**業務上の目的・背景**：プレイヤーがプレイ内容を振り返り、改善点を特定するために判定の内訳と最大チェーンの詳細情報が必要である。スコアやグレードだけでは分からない精度の詳細を提供する。

**機能の利用シーン**：結果画面(SCENE_RESULT)でスコア・グレード・クリア判定と共に表示される。FXキー長押し時にはショート/ロング別の内訳やFAST/SLOW統計も追加表示される。

**主要な処理内容**：
1. 全ノートの判定結果集計(チップノート/ロングBT/ロングFX/アナログ直角/アナログ通常)
2. CRITICAL/NEAR/ERROR個数の計算
3. ショート(チップ+アナログ直角)とロング(ロングBT/FX/アナログ通常)の内訳計算(v1.68cで追加)
4. 最大チェーン数(chainmax_song)の4桁ゼロパディング表示
5. CRITICAL/NEAR/ERROR各4桁以上の数値をImage10/Image13で描画
6. FXキー長押し時の追加情報表示(FAST/SLOW数、平均ズレ)

**関連システム・外部連携**：特になし。

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

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 6 | リザルト画面 | 主画面 | CRITICAL/NEAR/ERROR個数・最大チェーン数のImage画像による数値表示 |
| 7 | コースリザルト画面 | 主画面 | coursecritical/coursenear/courseerrorによるコース全体の判定詳細数値表示 |

## 機能種別

計算処理・画面表示処理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| noteresult | array | Yes | 各ノートの判定結果(0:未判定, 1:ERROR, 2:NEAR, 3:CRITICAL) | 0-3 |
| note | array | Yes | ノートデータ配列 | - |
| notenum | int | Yes | ノート総数 | 0以上 |
| shlj | array | Yes | ロングBT判定結果 | - |
| shljnum | int | Yes | ロングBT判定数 | 0以上 |
| longj | array | Yes | ロングFX判定結果 | - |
| longjnum | int | Yes | ロングFX判定数 | 0以上 |
| analoganj | array | Yes | アナログ直角判定結果 | - |
| analoganjnum | int | Yes | アナログ直角判定数 | 0以上 |
| analogj | array | Yes | アナログ通常判定結果 | - |
| analogjnum | int | Yes | アナログ通常判定数 | 0以上 |
| chainmax_song | int | Yes | 最大チェーン数 | 0以上 |
| shortmode/longmode/analogmode | int | Yes | ノートモード設定 | mode_on/mode_off/mode_auto/mode_hide |

### 入力データソース

プレイ画面で記録された各ノートの判定結果配列。

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| critical | int | CRITICAL判定回数 |
| near | int | NEAR判定回数 |
| errorn | int | ERROR判定回数 |
| critical_short/critical_long | int | ショート/ロング別CRITICAL回数 |
| near_short | int | ショートNEAR回数 |
| errorn_short/errorn_long | int | ショート/ロング別ERROR回数 |
| chainmax_song | int | 最大チェーン数 |

### 出力先

結果画面(Image32)への数値描画。

## 処理フロー

### 処理シーケンス

```
1. 判定結果集計
   ├─ チップノート(note.cnt.2=0)の集計
   │   ├─ BT(note.cnt.0<=3): shortmode!=mode_offの場合に集計
   │   └─ FX(note.cnt.0>3): longmode!=mode_offの場合に集計
   ├─ ロングBT(shlj): shlj.cnt.3=1→CRITICAL, 0→ERROR
   ├─ ロングFX(longj): longj.cnt.3=1→CRITICAL, 0→ERROR
   ├─ アナログ直角(analoganj): analoganj.cnt.2=1→CRITICAL, 0→ERROR (shortに分類)
   └─ アナログ通常(analogj): analogj.cnt.2=1→CRITICAL, 0→ERROR (longに分類)

2. 最大チェーン数表示
   └─ Image13の数値フォントで4桁以上ゼロパディング表示

3. CRITICAL/NEAR/ERROR表示
   └─ Image10の数値フォントでそれぞれ4桁以上ゼロパディング表示

4. FXキー長押し時の追加表示
   ├─ [SHORT] C/N/E の内訳表示
   ├─ [LONG] C/E の内訳表示
   └─ FAST/SLOW数と平均ズレ(ms)の表示
```

### フローチャート

```mermaid
flowchart TD
    A[判定集計開始] --> B[チップノート集計]
    B --> C[ロングBT集計]
    C --> D[ロングFX集計]
    D --> E[アナログ直角集計]
    E --> F[アナログ通常集計]
    F --> G[最大チェーン4桁表示]
    G --> H[CRITICAL/NEAR/ERROR 4桁表示]
    H --> I{FX-L長押し?}
    I -->|Yes| J[SHORT/LONG内訳表示]
    J --> K[FAST/SLOW統計表示]
    I -->|No| L[表示完了]
    K --> L
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-77-01 | ノートモード除外 | mode_offに設定されたノートタイプは集計から除外される | 常時 |
| BR-77-02 | ショート/ロング分類 | チップノートとアナログ直角はショート、ロングノートとアナログ通常はロングに分類 | v1.68c以降 |
| BR-77-03 | NEAR判定 | ショートノート(チップ)のみがNEAR判定を持つ | 常時 |
| BR-77-04 | ロング判定 | ロングノートとアナログはCRITICALまたはERRORの2値判定 | 常時 |
| BR-77-05 | 途中終了判定 | 未判定(noteresult=0)のノートがある場合にtochu=1(途中終了) | 集計時 |

### 計算ロジック

- CRITICAL = チップCRITICAL + ロングBT成功 + ロングFX成功 + アナログ直角成功 + アナログ通常成功
- NEAR = チップNEAR
- ERROR = チップERROR + ロングBT失敗 + ロングFX失敗 + アナログ直角失敗 + アナログ通常失敗
- FAST/SLOW平均: `-zure / zuremax` (ms)

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

該当なし。

## エラー処理

特になし。

### リトライ仕様

リトライ処理は不要。

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

該当なし。

## パフォーマンス要件

特になし。

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

特になし。

## 備考

- v1.68cでショート/ロング別の内訳統計機能が追加された(83-89行目のコメントで明記)
- FX-R長押し時にはゲージTOTAL値とGAIN値が表示される
- FX-L + FX-R同時長押しで差分スコア再表示とIR譜面登録が可能

---

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

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

### 推奨読解順序

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

判定結果の配列構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | result.hsp | `src/scene/result.hsp` | noteresult/shlj/longj/analoganj/analogj配列の構造を確認する |

#### Step 2: 集計ロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | result.hsp | `src/scene/result.hsp` | 78-158行目の判定結果集計ループを理解する |

**主要処理フロー**:
1. **94-108行目**: チップノート集計ループ(noteresult値に基づくCRITICAL/NEAR/ERROR分類)
2. **115-125行目**: ロングBT(shlj)集計(shlj.cnt.3=1でCRITICAL)
3. **126-136行目**: ロングFX(longj)集計
4. **137-147行目**: アナログ直角(analoganj)集計(ショートに分類)
5. **148-158行目**: アナログ通常(analogj)集計(ロングに分類)

#### Step 3: 描画処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | result.hsp | `src/scene/result.hsp` | 248-276行目の数値描画処理を理解する |

**主要処理フロー**:
- **248-259行目**: 最大チェーン数の4桁表示(Image13使用)
- **260-276行目**: CRITICAL/NEAR/ERROR各値の描画(scorear配列、Image10使用)

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

```
on_update_result (結果画面更新)
    │
    ├─ チップノート集計 (94-108行目)
    ├─ ロングBT集計 (115-125行目)
    ├─ ロングFX集計 (126-136行目)
    ├─ アナログ直角集計 (137-147行目)
    ├─ アナログ通常集計 (148-158行目)
    ├─ 最大チェーン描画 (248-259行目)
    ├─ CRITICAL/NEAR/ERROR描画 (260-276行目)
    └─ FXキー追加情報 (753-771行目)
```

### データフロー図

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

noteresult[]         ──▶ チップノート集計          ──▶ critical/near/errorn
                                                        critical_short/near_short/errorn_short

shlj[]/longj[]       ──▶ ロングノート集計          ──▶ critical_long/errorn_long

analoganj[]/analogj[] ──▶ アナログ集計             ──▶ critical/errorn (加算)

critical/near/errorn ──▶ Image10/13描画            ──▶ 結果画面表示
chainmax_song
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| result.hsp | `src/scene/result.hsp` | ソース | 判定集計・表示の主要処理 |
| play_game_logic.hsp | `src/scene/play/play_game_logic.hsp` | ソース | プレイ中の判定結果記録 |
| play_button_note.hsp | `src/scene/play/play_button_note.hsp` | ソース | BTノート判定結果の記録元 |
| play_laser_note.hsp | `src/scene/play/play_laser_note.hsp` | ソース | レーザーノート判定結果の記録元 |
