# 機能設計書 100-バージョン互換処理

## 概要

本ドキュメントは、K-Shoot MANIAにおける旧バージョンの設定値を新バージョンへ移行するバージョン互換処理機能の設計を記述する。

### 本機能の処理概要

本機能は、config.iniに保存された旧バージョンの設定値を新バージョンの設定値形式に自動的に移行するバージョン互換処理である。アプリケーション起動時にcurrentver設定を確認し、旧バージョンからの移行が必要な場合に設定値の変換を行う。

**業務上の目的・背景**：K-Shoot MANIAはバージョンアップに伴い設定項目の追加・変更が行われる。旧バージョンからアップデートしたユーザーが設定の不整合により問題が発生しないよう、設定値の自動移行が必要である。

**機能の利用シーン**：アプリケーション起動時のconfig.ini読み込み後に実行される。config.iniのcurrentver設定と現在のバージョンを比較し、旧バージョンの場合に移行処理を適用する。

**主要な処理内容**：
1. config.iniのcurrentver値を読み込み
2. 旧バージョン(v1.32未満)の場合、globaloffsetをjudgedelay_configに移行
3. currentverを現在のバージョン(175b)に更新して保存

**関連システム・外部連携**：config.iniの読み書き(No.98)。

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

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | なし（起動時処理） | - | config.ini読み込み後のバージョン互換処理 |

## 機能種別

データ変換 / マイグレーション

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| currentver2 | str | No | config.iniのcurrentver値(前回実行時のバージョン) | 存在しない場合は空文字 |
| globaloffset_config | int | No | 旧バージョンのグローバルオフセット値 | なし |

### 入力データソース

- config.iniのcurrentver設定(603-604行目)
- config.iniのglobaloffset設定(562-563行目)

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| judgedelay_config | int | 入力遅延設定（旧globaloffset_configから移行された値） |
| globaloffset_config | int | 0にリセット（移行後） |
| currentver | str | 現在のバージョン文字列(175b) |

### 出力先

- メモリ上の変数(judgedelay_config, globaloffset_config)
- config.iniに保存時にcurrentver=175bとして書き込み

## 処理フロー

### 処理シーケンス

```
1. config.iniからcurrentver2を読み込み
   └─ StartsWith(confstr.cnt, "currentver=") で検出(603行目)
2. currentver2の先頭3文字を整数化
   └─ int(strmid(currentver2,0,3))
3. バージョン比較
   └─ v1.32未満(数値<132)の場合:
     └─ judgedelay_config = globaloffset_config
     └─ globaloffset_config = 0
4. currentverは#define定数として"175b"に固定
   └─ *saveconfig時にcurrentver=175bとして保存(1454行目)
```

### フローチャート

```mermaid
flowchart TD
    A[config.ini読み込み完了] --> B[currentver2取得]
    B --> C{currentver2の数値 < 132?}
    C -->|Yes: v1.32未満| D[judgedelay_config = globaloffset_config]
    D --> E[globaloffset_config = 0]
    C -->|No: v1.32以降| F[移行不要]
    E --> G[通常処理続行]
    F --> G
    G --> H[*saveconfig時にcurrentver=175b保存]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-100-01 | v1.32未満の移行 | globaloffset_configの値をjudgedelay_configに移行し、globaloffset_configを0にリセット | currentver2の先頭3文字の数値が132未満 |
| BR-100-02 | バージョン固定 | currentverは#defineで"175b"に固定定義 | 常に |
| BR-100-03 | バージョン保存 | *saveconfig時にcurrentver=175bを保存 | 設定保存時 |

### 計算ロジック

- バージョン比較: `int(strmid(currentver2, 0, 3))` で先頭3文字を整数化して比較
- v1.32 = 数値132, 現在のv1.75b = 数値175

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

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

| 操作 | 対象ファイル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| バージョン読み込み | config.ini | READ | currentver設定の読み込み |
| バージョン保存 | config.ini | WRITE | currentver=175bの書き込み |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| N/A | バージョン未設定 | currentverがconfig.iniに存在しない場合 | currentver2は空文字、strmidは"0"相当、数値0 < 132でv1.32未満として移行を実行 |

### リトライ仕様

特になし。

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

特になし。起動時の1回限りの処理。

## パフォーマンス要件

起動時の1回限りの処理であり、パフォーマンス要件は特になし。

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

特になし。

## 備考

- 現在のソースコードでは v1.32未満 → v1.32以降の1パターンのみの移行処理が確認できる
- 現在のバージョンは v1.75b（currentver = "175b"）
- 将来のバージョンアップ時には新たな移行処理が追加される可能性がある
- kshlib.dllのバージョンチェック(1663以上必要)やkson.dllのバージョンチェック(1752以上必要)はDLL互換チェックであり、設定値の移行とは異なる

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | kshootmania.hsp | `kshootmania.hsp` | currentver定数の定義(77行目: #define currentver "175b") |
| 1-2 | kshootmania.hsp | `kshootmania.hsp` | aversion定数(75行目: #define aversion "1.75b") |
| 1-3 | kshootmania.hsp | `kshootmania.hsp` | currentver2変数: config.iniから読み込まれた前回バージョン |

**読解のコツ**: currentverは#defineの定数（コンパイル時固定）、currentver2はconfig.iniから読み込まれる変数（実行時に決定）。この2つを比較して移行処理を判断する。

#### Step 2: バージョン読み込みを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | kshootmania.hsp | `kshootmania.hsp` | currentver2の読み込み(603-604行目) |

**主要処理フロー**:
1. **603行目**: `StartsWith(confstr.cnt, "currentver=")` でcurrentver設定行を検出
2. **604行目**: `currentver2=strmid(confstr.cnt,11,64)` でバージョン文字列を抽出

#### Step 3: 移行処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | kshootmania.hsp | `kshootmania.hsp` | バージョン互換処理(742-745行目) |

**主要処理フロー**:
- **742行目**: `if(int(strmid(currentver2,0,3))<132)` でv1.32未満かを判定
- **743行目**: `judgedelay_config=globaloffset_config` で値を移行
- **744行目**: `globaloffset_config=0` で旧設定をリセット

#### Step 4: バージョン保存を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | kshootmania.hsp | `kshootmania.hsp` | *saveconfig内のcurrentver保存(1454行目) |

**主要処理フロー**:
- **1454行目**: `confs+="currentver="+currentver+stat1` でcurrentver(="175b")を保存

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

```
kshootmania.hsp (起動時)
    |
    +-- config.ini読み込み(416-681行目)
    |       +-- currentver2取得(603-604行目)
    |       └── globaloffset_config取得(562-563行目)
    |
    +-- バージョン互換処理(742-745行目)
    |       +-- v1.32未満判定
    |       +── judgedelay_config = globaloffset_config
    |       └── globaloffset_config = 0
    |
    +-- *saveconfig(設定保存時)
            └── currentver=175b書き込み(1454行目)
```

### データフロー図

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

config.ini              バージョン比較                   設定値移行
currentver=xxx ──────> int(strmid(xxx,0,3)) < 132? ──> judgedelay_config
globaloffset=N           |                               globaloffset=0
                         v
                   *saveconfig ─────────────────────> config.ini
                                                      currentver=175b
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| kshootmania.hsp | `kshootmania.hsp` | ソース | バージョン定数定義(75-77行目)、currentver2読み込み(603-604行目)、互換処理(742-745行目)、保存(1454行目) |
| config.ini | `config.ini` | 設定ファイル | currentver/globaloffsetの読み書き |
