# ER図

K-Shoot MANIA v1.75b のデータ構造をER図として表現する。本プロジェクトはRDBMSを使用しないが、メモリ配列とファイルベースの永続化構造を論理的なエンティティ関係として図示する。

## 全体ER図

```mermaid
erDiagram
    Players {
        int player_id PK
        string player_name UK
    }

    Songs {
        int song_id PK
        int difficulty PK
        int type
        int level
        string folder_name
        string title
        string artist
        string ksh_filename
        string bpm
        string duration
        string jacket_image
        string title_image
        string artist_image
        string illustrator
    }

    Scores {
        int song_id PK, FK
        int difficulty PK
        string modifier_settings PK
        int score_value
        int medal
        int grade
        int gauge_percent
        int max_chain
        int play_count
        int clear_count
        int full_combo_count
        int perfect_count
    }

    GameResults {
        int total_score
        int critical
        int near
        int errorn
        int critical_short
        int critical_long
        int near_short
        int errorn_short
        int errorn_long
        int shortnum
        double gauge_final
    }

    Courses {
        int course_id PK
        string course_name
        string kco_filename
    }

    CourseScores {
        int course_id PK, FK
        int score
        int medal
        int grade
    }

    KeyConfig {
        int key_index PK
        int key_primary
        int key_secondary
        int joy_profile1
        int joy_profile2
    }

    GameConfig {
        string config_key PK
        string config_value
    }

    Players ||--o{ Scores : "has"
    Songs ||--o{ Scores : "has"
    GameResults }o--|| Scores : "updates"
    Players ||--o{ CourseScores : "has"
    Courses ||--|| CourseScores : "has"
```

## データフロー図

```mermaid
flowchart TD
    subgraph ファイルシステム
        KSH[".ksh 譜面ファイル<br/>songs/フォルダ/chart.ksh"]
        KSC[".ksc スコアファイル<br/>score/プレイヤー/曲/曲名.ksc"]
        KCO[".kco コースファイル<br/>courses/コース名.kco"]
        INI["config.ini<br/>設定ファイル"]
        CKSC[".ksc コーススコア<br/>courses/score/プレイヤー/コース.ksc"]
    end

    subgraph メモリ配列
        MINFO["minfo / minfostr<br/>曲情報配列"]
        MSCORE["mscore<br/>スコア配列"]
        PLAYERS["players<br/>プレイヤー配列"]
        KEY["key / key2 / joykey<br/>キー設定配列"]
        COURSE["course_sc / course_md / course_gr<br/>コーススコア配列"]
        RESULT["判定変数群<br/>critical, near, errorn等"]
    end

    subgraph 処理フロー
        LOAD_SONGS["曲一覧読込<br/>select.hsp *refreshfilelist"]
        LOAD_SCORE["スコア読込<br/>select.hsp *reloadscore"]
        PLAY["プレイ処理<br/>play.hsp"]
        SAVE_SCORE["スコア保存<br/>result.hsp"]
        LOAD_CONFIG["設定読込<br/>kshootmania.hsp"]
    end

    KSH -->|読込| LOAD_SONGS --> MINFO
    KSC -->|読込| LOAD_SCORE --> MSCORE
    INI -->|読込| LOAD_CONFIG --> KEY
    KCO -->|読込| LOAD_SONGS --> COURSE

    MINFO --> PLAY
    PLAY --> RESULT
    RESULT --> SAVE_SCORE
    MSCORE --> SAVE_SCORE
    SAVE_SCORE -->|書込| KSC
    SAVE_SCORE -->|書込| CKSC
```

## スコアファイル構造図

```mermaid
flowchart LR
    subgraph スコアディレクトリ構造
        ROOT["score/"]
        P1["PLAYER/"]
        P2["プレイヤー名/"]
        S1["曲フォルダ1/"]
        S2["曲フォルダ2/"]
        F1["曲名1.ksc"]
        F2["曲名2.ksc"]
        F3["曲名3.ksc"]

        ROOT --> P1
        ROOT --> P2
        P1 --> S1
        P1 --> S2
        S1 --> F1
        S1 --> F2
        S2 --> F3
    end

    subgraph KSCファイル内容
        LINE1["easy,normal,normal,on,on,on=5234100,3,4,85,2048,5,5,3,1"]
        LINE2["normal,mirror,normal,on,on,on=6543210,2,3,88,2800,2,1,0,0"]
    end

    F1 --- LINE1
    F1 --- LINE2
```
