File size: 5,606 Bytes
9bd4ce5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# metadata.json と Enumification 分析レポート

## 概要

このレポートでは、`data/metadata.json` がシステム全体にどのように供給されているか、そして「enumification」(列挙型化)がまだ必要な箇所を特定します。

---

## 1. metadata.json の構造

| セクション | 用途 | エントリ数 |
|-----------|------|-----------|
| `triggers` | 能力の発動タイミング | 11 |
| `targets` | 効果の対象 | 14 |
| `opcodes` | バイトコード命令 | 67 |
| `phases` | ゲームフェーズ | 15 |
| `conditions` | 条件チェック命令 | 54 |
| `costs` | コスト種別 | 95 |
| `choices` | 選択タイプ | 28 |
| `zones` | ゾーン識別 | 11 |
| `extra_constants` | ビットマスク定数 | 76+ |

---

## 2. metadata.json のフロー

```mermaid
flowchart TD
    A[data/metadata.json] --> B[tools/sync_metadata.py]
    B --> C[engine_rust_src/src/core/generated_constants.rs]
    B --> D[engine_rust_src/src/core/enums.rs]
    B --> E[frontend/web_ui/js/generated_constants.js]
    B --> F[engine/models/generated_metadata.py]
    B --> G[engine_rust_src/src/core/shader_constants.wgsl]
```

---

## 3. 現在のEnumification状態

### ✅ 既にEnum化されている箇所

| ファイル | 内容 | 状態 |
|---------|------|------|
| [`engine/models/opcodes.py`](engine/models/opcodes.py) | `Opcode` enum | ✅ `generated_metadata.py` から自動生成 |
| [`engine/models/generated_metadata.py`](engine/models/generated_metadata.py) | 定数辞書 (OPCODES, TRIGGERS, etc.) | ✅ 自動生成 |
| [`engine/models/enums.py`](engine/models/enums.py) | `CardType`, `HeartColor`, `Area`, `Group`, `Unit` | ✅ 手動管理だが独立 |
| frontend JS | `TriggerType`, `EffectType`, `ActionBases` | ✅ `generated_constants.js` から import |

### ❌ Enumification がまだ必要な箇所

| ファイル | クラス | 問題点 |
|---------|-------|--------|
| [`engine/models/ability.py:27`](engine/models/ability.py) | `TriggerType` | `generated_metadata.py` 已有りの重複、手動管理 |
| [`engine/models/ability.py:42`](engine/models/ability.py) | `TargetType` | `generated_metadata.py` 已有りの重複、手動管理 |
| [`engine/models/ability.py:59`](engine/models/ability.py) | `EffectType` | `generated_metadata.py` 已有りの重複、手動管理 |
| [`engine/models/ability.py:347`](engine/models/ability.py) | `AbilityCostType` | **101+ エントリ**、手動管理、`generated_metadata.py` の COSTS と重複 |
| Rust engine | 各種 enum | `enums.rs` に重複定義の可能性 |

---

## 4. 具体的な重複例

### 4.1 TriggerType の重複

```python
# engine/models/ability.py (手動管理)
class TriggerType(IntEnum):
    NONE = 0
    ON_PLAY = 1
    # ...

# engine/models/generated_metadata.py (自動生成)
TRIGGERS = {
    "NONE": 0,
    "ON_PLAY": 1,
    # ...
}
```

### 4.2 AbilityCostType の問題

`metadata.json``costs` セクションには **95エントリ** がありますが、`ability.py``AbilityCostType` には **101+ エントリ** があり、値が重複或多すぎます。

```python
# ability.py からの例
class AbilityCostType(IntEnum):
    NONE = 0
    ENERGY = 1
    TAP_SELF = 2
    # ... 101+ entries
    # 多くは自動生成されたプレースホルダー
```

---

## 5. 推奨されるEnumification計画

### 5.1 短期 (高優先度)

1. **ability.py の enum を generated_metadata.py から import**
   - `TriggerType`, `TargetType`, `EffectType` を削除
   - `from .generated_metadata import TRIGGERS, TARGETS, OPCODES` を使用
   - または `generated_metadata.py` に IntEnum クラスを追加生成

2. **AbilityCostType の整理**
   - `metadata.json` の `costs` と 完全一致させる
   - 余分なエントリを削除
   - または `sync_metadata.py` を拡張して `AbilityCostType` enum を自動生成

### 5.2 中期 (中優先度)

3. **Rust engine の enum 統一**
   - `engine_rust_src/src/core/enums.rs``generated_constants.rs` から自動生成
   - 重複定義の排除

4. **Frontend JS の enum 統一**
   - `generated_constants.js` に IntEnum 相当のオブジェクトを追加

---

## 6. 関連ファイル一覧

| ファイル | 役割 |
|---------|------|
| [`data/metadata.json`](data/metadata.json) | マスターデータ |
| [`tools/sync_metadata.py`](tools/sync_metadata.py) | 同期スクリプト |
| [`engine/models/generated_metadata.py`](engine/models/generated_metadata.py) | 自動生成の定数 |
| [`engine/models/ability.py`](engine/models/ability.py) | 能力定義 (enum 重複問題) |
| [`engine/models/opcodes.py`](engine/models/opcodes.py) | Opcode enum (OK) |
| [`engine/models/enums.py`](engine/models/enums.py) | ゲーム基本enum |
| [`engine_rust_src/src/core/generated_constants.rs`](engine_rust_src/src/core/generated_constants.rs) | Rust定数 |
| [`frontend/web_ui/js/generated_constants.js`](frontend/web_ui/js/generated_constants.js) | Frontend定数 |

---

## 7. 結論

**enumification が最も必要な箇所:**

1. **`engine/models/ability.py`** - `TriggerType`, `TargetType`, `EffectType`, `AbilityCostType` の4つのenum
2. **Rust engine** - 手動管理されている enum の自動生成化

現在のシステムは **部分的に** enumification されていますが、`ability.py` には古い手動管理のenumが残っており、これらは `generated_metadata.py` と重複しています。将来的な一貫性のためには、これらのenumを自動生成システムに統合する必要があります。