File size: 10,500 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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
# オペコード実装監査レポート

## 概要

`data/metadata.json`で定義されたオペコード、条件、コストがRustエンジンで正しく実装されているかを監査しました。

## 1. 定義の同期状況

### ✅ 正常に同期されている項目

| カテゴリ | metadata.json | generated_constants.rs | 状態 |
|---------|---------------|------------------------|------|
| Opcodes | 62個 | 62個 | ✅ 完全一致 |
| Conditions | 50個 | 50個 | ✅ 完全一致 |
| Costs | 101個 | 101個 | ✅ 完全一致 |
| Triggers | 11個 | enums.rs | ✅ 完全一致 |
| Targets | 14個 | enums.rs | ✅ 完全一致 |
| Extra Constants | 22個 | 22個 | ✅ 完全一致 |

`generated_constants.rs`は`tools/sync_metadata.py`によって自動生成されており、`metadata.json`との同期は正しく維持されています。

---

## 2. オペコード実装状況

### ✅ 実装済みオペコード (56個)

#### 制御フロー (mod.rs)
| オペコード | 値 | 実装場所 |
|-----------|-----|---------|
| O_NOP | 0 | mod.rs:124 |
| O_RETURN | 1 | mod.rs:132 |
| O_JUMP | 2 | mod.rs:176 |
| O_JUMP_IF_FALSE | 3 | mod.rs:181 |
| O_SELECT_MODE | 30 | mod.rs:84-113 |

#### ドロー/ハンド (draw_hand.rs)
| オペコード | 値 | 実装状況 |
|-----------|-----|---------|
| O_DRAW | 10 | ✅ |
| O_DRAW_UNTIL | 66 | ✅ |
| O_ADD_TO_HAND | 44 | ✅ |

#### スコア/ハート (score_hearts.rs)
| オペコード | 値 | 実装状況 |
|-----------|-----|---------|
| O_ADD_BLADES | 11 | ✅ |
| O_ADD_HEARTS | 12 | ✅ |
| O_REDUCE_COST | 13 | ✅ |
| O_BOOST_SCORE | 16 | ✅ |
| O_BUFF_POWER | 18 | ✅ |
| O_SET_BLADES | 24 | ✅ |
| O_SET_HEARTS | 25 | ✅ |
| O_SET_SCORE | 37 | ✅ |
| O_TRANSFORM_COLOR | 39 | ✅ |
| O_REDUCE_HEART_REQ | 48 | ✅ |
| O_TRANSFORM_HEART | 73 | ✅ |
| O_INCREASE_HEART_COST | 61 | ✅ |

#### メンバー状態 (member_state.rs)
| オペコード | 値 | 実装状況 |
|-----------|-----|---------|
| O_ACTIVATE_MEMBER | 43 | ✅ |
| O_SET_TAPPED | 51 | ✅ |
| O_TAP_MEMBER | 53 | ✅ |
| O_TAP_OPPONENT | 32 | ✅ |
| O_MOVE_MEMBER | 20 | ✅ |
| O_FORMATION_CHANGE | 26 | ✅ (UNUSEDマーク付きだが実装済み) |
| O_PLACE_UNDER | 33 | ✅ |
| O_ADD_STAGE_ENERGY | 50 | ✅ |
| O_GRANT_ABILITY | 60 | ✅ |
| O_PLAY_MEMBER_FROM_HAND | 57 | ✅ |
| O_INCREASE_COST | 70 | ✅ |

#### エネルギー (energy.rs)
| オペコード | 値 | 実装状況 |
|-----------|-----|---------|
| O_ENERGY_CHARGE | 23 | ✅ |
| O_PAY_ENERGY | 64 | ✅ |
| O_ACTIVATE_ENERGY | 81 | ✅ |

#### デッキ/ゾーン (deck_zones.rs)
| オペコード | 値 | 実装状況 |
|-----------|-----|---------|
| O_LOOK_DECK | 14 | ✅ |
| O_RECOVER_LIVE | 15 | ✅ |
| O_RECOVER_MEMBER | 17 | ✅ |
| O_SWAP_CARDS | 21 | ✅ |
| O_SEARCH_DECK | 22 | ✅ (UNUSEDマーク付きだが実装済み) |
| O_ORDER_DECK | 28 | ✅ |
| O_MOVE_TO_DECK | 31 | ✅ |
| O_REVEAL_CARDS | 40 | ✅ |
| O_LOOK_AND_CHOOSE | 41 | ✅ |
| O_CHEER_REVEAL | 42 | ✅ |
| O_MOVE_TO_DISCARD | 58 | ✅ |
| O_REVEAL_UNTIL | 69 | ✅ |
| O_SWAP_ZONE | 38 | ✅ (UNUSEDマーク付きだが実装済み) |

#### メタ制御 (meta_control.rs)
| オペコード | 値 | 実装状況 |
|-----------|-----|---------|
| O_NEGATE_EFFECT | 27 | ✅ |
| O_META_RULE | 29 | ✅ |
| O_BATON_TOUCH_MOD | 36 | ✅ |
| O_IMMUNITY | 19 | ✅ |
| O_RESTRICTION | 35 | ✅ |
| O_REDUCE_YELL_COUNT | 62 | ✅ |
| O_SELECT_MEMBER | 65 | ✅ |
| O_SELECT_PLAYER | 67 | ✅ |
| O_SELECT_LIVE | 68 | ✅ |
| O_COLOR_SELECT | 45 | ✅ |
| O_OPPONENT_CHOOSE | 75 | ✅ |
| O_TRIGGER_REMOTE | 47 | ✅ |
| O_REDUCE_LIVE_SET_LIMIT | 77 | ✅ |
| O_PREVENT_PLAY_TO_SLOT | 71 | ✅ |
| O_PREVENT_ACTIVATE | 82 | ✅ |
| O_PREVENT_BATON_TOUCH | 90 | ✅ |
| O_PREVENT_SET_TO_SUCCESS_PILE | 80 | ✅ |
| O_SWAP_AREA | 72 | ✅ |

---

### ⚠️ レガシー実装のみ(新ハンドラーに未移行)(3個)

以下のオペコードは`interpreter_legacy.rs`に実装がありますが、新しいハンドラーシステム(`handlers/`)には移行されていません:

| オペコード | 値 | 実装場所 | 説明 |
|-----------|-----|---------|------|
| **O_PLAY_MEMBER_FROM_DISCARD** | 63 | interpreter_legacy.rs:1582 | 捨て札からメンバーをプレイ |
| **O_PLAY_LIVE_FROM_DISCARD** | 76 | interpreter_legacy.rs:1582 | 捨て札からライブをプレイ |
| **O_SELECT_CARDS** | 74 | interpreter_legacy.rs:1719 | カード選択処理 |

#### 使用しているカード

**O_PLAY_MEMBER_FROM_DISCARD (63) を使用するカード:**
- カードID 103: `PL!-pb1-018-P+` (矢澤にこ)
- カードID 163: `PL!HS-PR-022-PR`
- カードID 4263: `PL!HS-bp1-002-R`
- 他多数(`data/cards_compiled.json`で`"effect_type": 63`を検索)

**O_PLAY_LIVE_FROM_DISCARD (76) を使用するカード:**
- カードID 205: `PL!HS-bp2-018-N` (安養寺 姫芽)
- 他多数

**O_SELECT_CARDS (74) を使用するカード:**
- カードID 537: `PL!SP-bp2-011-P` (鬼塚冬毬)
- 効果: `SELECT_CARDS(2) {FROM="DISCARD", TYPE_LIVE, UNIQUE_NAMES} -> OPTIONS; OPPONENT_CHOOSE(OPTIONS) -> TARGET; ADD_TO_HAND(TARGET)`

---

### ⚪ UNUSEDマーク付き (実装なし、問題なし)

| オペコード | 値 | 状態 |
|-----------|-----|------|
| O_FLAVOR | 34 | 未実装 (意図的) |
| O_REPLACE_EFFECT | 46 | 未実装 (意図的) |
| O_ADD_CONTINUOUS | 52 | 未実装 (意図的) |
| O_SET_HEART_COST | 83 | 未実装 (意図的) |

---

## 3. 条件(Conditions)実装状況

### ✅ 実装済み (45個)

`conditions.rs`で実装済み:
- C_TURN_1, C_HAS_MEMBER, C_HAS_COLOR, C_COUNT_STAGE, C_COUNT_HAND, C_COUNT_DISCARD
- C_IS_CENTER, C_COUNT_GROUP, C_GROUP_FILTER, C_MODAL_ANSWER, C_COUNT_ENERGY
- C_HAS_LIVE_CARD, C_COST_CHECK, C_RARITY_CHECK, C_COUNT_SUCCESS_LIVE
- C_OPPONENT_HAND_DIFF, C_SCORE_COMPARE, C_COUNT_HEARTS, C_COUNT_BLADES
- C_OPPONENT_ENERGY_DIFF, C_HAS_KEYWORD, C_DECK_REFRESHED, C_BATON
- C_TYPE_CHECK, C_AREA_CHECK, C_COST_LEAD, C_SCORE_LEAD, C_HEART_LEAD
- C_HAS_EXCESS_HEART, C_NOT_HAS_EXCESS_HEART, C_TOTAL_BLADES
- C_COST_COMPARE, C_BLADE_COMPARE, C_HEART_COMPARE, C_OPPONENT_HAS_WAIT
-### ❌ 未実装条件 (5個)

以下の条件は`generated_constants.rs``logging.rs`に定義がありますが、`conditions.rs``check_condition_opcode`関数に実装がありません:

| 条件 | 値 | 説明 | ログ出力のみ |
|------|-----|------|-------------|
| **C_IS_TAPPED** | 245 | タップ状態チェック | ✅ logging.rs:78 |
| **C_IS_ACTIVE** | 246 | アクティブ状態チェック | ✅ logging.rs:79 |
| **C_LIVE_PERFORMED** | 247 | ライブ実行済みチェック | ✅ logging.rs:80 |
| **C_IS_PLAYER** | 248 | プレイヤー判定 | ✅ logging.rs:81 |
| **C_IS_OPPONENT** | 249 | 対戦相手判定 | ✅ logging.rs:82 |

これらの条件は`conditions.rs`のmatch文でデフォルトケース(`_ => false`)にフォールスルーし、常に`false`を返します。

---

## 4. コスト(Costs)実装状況

### ✅ 実装済み

`costs.rs`で主要なコストタイプは実装済み:
- COST_ENERGY, COST_TAP_SELF, COST_DISCARD_HAND, COST_RETURN_HAND
- COST_SACRIFICE_SELF, COST_REVEAL_HAND, COST_SACRIFICE_UNDER
- COST_DISCARD_ENERGY, COST_TAP_MEMBER, COST_TAP_ENERGY
- COST_RETURN_MEMBER_TO_DECK, COST_RETURN_DISCARD_TO_DECK
- 他多数

---

## 5. 発見された問題点

### 🔴 重要な問題

1. **未実装オペコードが存在**
   - `O_PLAY_MEMBER_FROM_DISCARD (63)` - 一部カードで使用される可能性
   - `O_PLAY_LIVE_FROM_DISCARD (76)` - 一部カードで使用される可能性
   - これらは`interpreter_legacy.rs`には実装があるが、新しいハンドラー構造には移行されていない

2. **未実装条件が存在**
   - `C_IS_TAPPED`, `C_IS_ACTIVE`, `C_LIVE_PERFORMED`, `C_IS_PLAYER`, `C_IS_OPPONENT`
   - これらは条件チェック(200-255)の範囲で、`conditions.rs`のmatch文でデフォルト`false`を返す

### 🟡 中程度の問題

3. **UNUSEDマークの不一致**
   - `O_SEARCH_DECK`, `O_FORMATION_CHANGE`, `O_SWAP_ZONE``[UNUSED]`マークがあるが実際は実装済み
   - metadata.jsonの`unused`リストと実装状況が一致していない

4. **重複実装**
   - `O_REDUCE_YELL_COUNT``meta_control.rs``score_hearts.rs`の両方で処理されている

---

## 6. 推奨アクション

### 即時対応が必要

1. **未実装オペコードの追加**
   ```rust
   // member_state.rs または deck_zones.rs に追加
   O_PLAY_MEMBER_FROM_DISCARD => { /* 実装 */ }
   O_PLAY_LIVE_FROM_DISCARD => { /* 実装 */ }
   O_SELECT_CARDS => { /* 実装 */ }
   ```

2. **未実装条件の追加**
   ```rust
   // conditions.rs に追加
   C_IS_TAPPED => player.is_tapped(ctx.area_idx as usize),
   C_IS_ACTIVE => !player.is_tapped(ctx.area_idx as usize),
   C_LIVE_PERFORMED => player.live_performed_this_turn,
   C_IS_PLAYER => ctx.player_id == state.current_player as u8,
   C_IS_OPPONENT => ctx.player_id != state.current_player as u8,
   ```

### 整理対応

3. **metadata.jsonの`unused`リスト更新**
   - 実装済みの`O_SEARCH_DECK`, `O_FORMATION_CHANGE`, `O_SWAP_ZONE`を削除

4. **重複実装の解消**
   - `O_REDUCE_YELL_COUNT`を一箇所に集約

---

## 7. アーキテクチャ評価

### ✅ 良い点

- ハンドラーが機能別に適切に分割されている
- `generated_constants.rs`の自動生成により同期が保たれている
- `HandlerResult`による一貫したフロー制御
- 条件チェックとオペコード実行の分離

### 改善推奨

- コンパイル時のオペコード網羅チェックの追加
- 未実装オペコードのログ出力または警告

---

## 結論

**実装状況:**
- **オペコード**: 59/62個が新ハンドラーで実装済み、3個はレガシー実装のみ
- **条件**: 45/50個が実装済み、5個は未実装(常にfalseを返す)

**重要な発見:**
1. 3つのオペコードは`interpreter_legacy.rs`に実装があるため、レガシーパスを使用すれば動作します
2. しかし、新しいハンドラーシステムへの移行が不完全です
3. 5つの条件は定義されているものの、実際には機能せず常にfalseを返します

**推奨アクション:**
1. レガシー実装を新ハンドラーに移行(`deck_zones.rs`または`member_state.rs`に追加)
2. 未実装条件を`conditions.rs`に追加