# インフラ構成図

## 全体構成図

```mermaid
graph TB
    subgraph "ユーザー環境（Windows PC）"
        subgraph "K-Shoot MANIA プロセス"
            EXE["kshootmania.exe<br/>（HSP 3.51 ランタイム）"]

            subgraph "アプリケーション層"
                MAIN["メインプログラム<br/>kshootmania.hsp"]
                SELECT["選曲画面<br/>src/scene/select.hsp"]
                PLAY["プレイ画面<br/>src/scene/play.hsp"]
                RESULT["リザルト画面<br/>src/scene/result.hsp"]
                IR["IR通信<br/>src/ir.hsp"]
            end

            subgraph "オーディオサブシステム"
                BASS["bass.dll<br/>（BASS Audio Library）"]
                BASSFX["bass_fx.dll<br/>（テンポ変更）"]
                BASSVST["bass_vst.dll<br/>（VSTホスト）"]
                BASSCONV["bassconv.dll<br/>（位置変換）"]
                subgraph "VSTプラグイン（lib/）"
                    VST1["regawo.dll<br/>Gate/Echo/Wobble"]
                    VST2["pitc.dll<br/>PitchShift"]
                    VST3["bitc.dll<br/>BitCrusher"]
                    VST4["tstp.dll<br/>TapeStop"]
                    VST5["phas.dll / flan.dll / sich.dll<br/>Phaser/Flanger/SideChain"]
                end
            end

            subgraph "ゲームエンジン"
                KSMCORE["ksmcore.dll<br/>（カメラ制御・キー音管理）"]
                KSHLIB["kshlib.dll<br/>（譜面解析・暗号）"]
                KSON["kson.dll<br/>（KSH/KSON変換）"]
            end

            subgraph "グラフィックスサブシステム"
                HGIMG3["hgimg3<br/>（HSP 3D/2D描画）"]
                D3D9["DirectX 9<br/>（d3d9.dll）"]
                GDIPLUS["GDI Plus<br/>（画像処理）"]
                VSYNC["mod_d3d9vsync<br/>（VSync制御）"]
            end

            subgraph "ネットワーク"
                HSPINET["hspinet.dll<br/>（HTTP/JSON）"]
            end
        end

        subgraph "ローカルファイルシステム"
            CONFIG["config.ini<br/>（設定ファイル）"]
            SONGS["songs/<br/>（楽曲データ .ksh/.kson）"]
            SCORE["score/<br/>（スコアデータ .ksc）"]
            CACHE["cache/<br/>（キャッシュ）"]
            SE["se/<br/>（効果音 .wav/.ogg）"]
            IMGS["imgs/<br/>（画像リソース）"]
        end

        TEMP["%TEMP%\\kshootmania\\<br/>（一時ファイル）"]

        subgraph "Windows OS"
            WINAPI["Windows API<br/>user32 / kernel32 / gdi32"]
            WINMM["winmm.dll<br/>（高精度タイマー）"]
            MSVCR["msvcr100.dll<br/>（VC++ 2010 ランタイム）"]
        end
    end

    subgraph "外部サービス"
        IRSRV["IRサーバー<br/>kshootmania.com"]
        TWITTER["Twitter / X<br/>Web Intent"]
    end

    MAIN --> SELECT
    MAIN --> PLAY
    MAIN --> RESULT
    RESULT --> IR

    PLAY --> BASS
    BASS --> BASSFX
    BASS --> BASSVST
    BASSVST --> VST1
    BASSVST --> VST2
    BASSVST --> VST3
    BASSVST --> VST4
    BASSVST --> VST5
    BASS --> BASSCONV

    PLAY --> KSMCORE
    SELECT --> KSHLIB
    PLAY --> KSHLIB
    PLAY --> KSON

    MAIN --> HGIMG3
    HGIMG3 --> D3D9
    VSYNC --> D3D9
    MAIN --> GDIPLUS

    IR --> HSPINET
    HSPINET -->|"HTTPS"| IRSRV
    RESULT -->|"ブラウザ起動"| TWITTER

    EXE --> WINAPI
    EXE --> WINMM
    EXE --> MSVCR

    MAIN --> CONFIG
    SELECT --> SONGS
    RESULT --> SCORE
    SELECT --> CACHE
    MAIN --> SE
    MAIN --> IMGS
    MAIN --> TEMP
```

## DLL依存関係図

```mermaid
graph LR
    subgraph "HSPランタイム"
        EXE["kshootmania.exe"]
    end

    subgraph "必須DLL（起動時チェック）"
        MSVCR["msvcr100.dll<br/>VC++ 2010"]
        KSHLIB["kshlib.dll<br/>≥v1663"]
        KSON["kson.dll<br/>≥v1752"]
        HSPINET["hspinet.dll"]
        BASSVST["bass_vst.dll"]
        BASSCONV["bassconv.dll"]
        BASS["bass.dll"]
    end

    subgraph "追加DLL（同梱）"
        BASSFX["bass_fx.dll"]
        KSMCORE["ksmcore.dll"]
        HSPDA["hspda.dll"]
        HSPEXT["hspext.dll"]
    end

    subgraph "VSTプラグイン（lib/）"
        REGAWO["regawo.dll"]
        PITC["pitc.dll"]
        BITC["bitc.dll"]
        TSTP["tstp.dll"]
        PHAS["phas.dll"]
        FLAN["flan.dll"]
        SICH["sich.dll"]
    end

    subgraph "Windows標準"
        D3D9["d3d9.dll"]
        USER32["user32.dll"]
        KERNEL32["kernel32.dll"]
        GDI32["gdi32.dll"]
        WINMM["winmm.dll"]
        GDIPLUS["gdiplus.dll"]
        COMCTL32["comctl32.dll"]
    end

    EXE --> MSVCR
    EXE --> KSHLIB
    EXE --> KSON
    EXE --> HSPINET
    EXE --> BASS
    EXE --> BASSFX
    EXE --> BASSVST
    EXE --> BASSCONV
    EXE --> KSMCORE
    EXE --> HSPDA
    EXE --> HSPEXT

    BASSVST --> REGAWO
    BASSVST --> PITC
    BASSVST --> BITC
    BASSVST --> TSTP
    BASSVST --> PHAS
    BASSVST --> FLAN
    BASSVST --> SICH

    EXE --> D3D9
    EXE --> USER32
    EXE --> KERNEL32
    EXE --> GDI32
    EXE --> WINMM
    EXE --> GDIPLUS
    EXE --> COMCTL32
```

## ネットワーク通信図

```mermaid
sequenceDiagram
    participant User as ユーザー
    participant KSM as K-Shoot MANIA
    participant HSPINET as hspinet.dll
    participant IR as IRサーバー<br/>(kshootmania.com)
    participant Browser as Webブラウザ
    participant Twitter as Twitter/X

    Note over KSM: 起動時
    KSM->>HSPINET: netinit
    KSM->>HSPINET: netproxy (設定時のみ)

    Note over KSM: IRログイン
    KSM->>HSPINET: neturl (IR URL)
    HSPINET->>IR: HTTP POST (認証情報)
    IR-->>HSPINET: レスポンス (JSON)
    HSPINET-->>KSM: ログイン結果

    Note over KSM: スコア送信
    KSM->>KSM: getChartIRHash (MD5)
    KSM->>HSPINET: neturl (スコアAPI)
    HSPINET->>IR: HTTP POST (スコア+ハッシュ)
    IR-->>HSPINET: レスポンス
    HSPINET-->>KSM: 送信結果

    Note over KSM: Twitterシェア
    User->>KSM: ツイートボタン押下
    KSM->>Browser: exec (Web Intent URL)
    Browser->>Twitter: GET /intent/tweet?text=...
    Twitter-->>User: ツイート画面表示
```

## ファイルI/O構成図

```mermaid
graph TB
    subgraph "K-Shoot MANIA"
        APP["アプリケーション"]
    end

    subgraph "実行ディレクトリ"
        CONFIG["config.ini<br/>読み書き：設定値47項目"]
        SCORE["score/{player}/{song}/{chart}.ksc<br/>書き込み：プレイ結果保存"]
        CSCORE["courses/score/{player}/{course}.ksc<br/>書き込み：コースリザルト保存"]
    end

    subgraph "楽曲データ（読み取り専用）"
        KSH["songs/{folder}/{chart}.ksh<br/>KSH譜面ファイル"]
        KSONF["songs/{folder}/{chart}.kson<br/>KSON譜面ファイル"]
        AUDIO["songs/{folder}/{audio}.ogg/.mp3<br/>楽曲オーディオ"]
        JACKET["songs/{folder}/jacket.png<br/>ジャケット画像"]
        CRS["courses/{course}.crs<br/>コースファイル"]
    end

    subgraph "キャッシュ（自動生成）"
        CACHE_ABC["cache/songs/{dir}_abc.cache<br/>楽曲リスト（ABC順）"]
        CACHE_LV["cache/songs/{dir}_lv.cache<br/>楽曲リスト（難易度順）"]
        CACHE_BG["cache/bg/<br/>背景画像キャッシュ"]
    end

    subgraph "一時ディレクトリ"
        TEMP["%TEMP%\\kshootmania\\<br/>一時処理用"]
    end

    APP -->|"読み書き"| CONFIG
    APP -->|"書き込み"| SCORE
    APP -->|"書き込み"| CSCORE
    APP -->|"読み取り"| KSH
    APP -->|"読み取り"| KSONF
    APP -->|"読み取り"| AUDIO
    APP -->|"読み取り"| JACKET
    APP -->|"読み取り"| CRS
    APP -->|"読み書き"| CACHE_ABC
    APP -->|"読み書き"| CACHE_LV
    APP -->|"読み書き"| CACHE_BG
    APP -->|"読み書き"| TEMP
```
