rabukasim / docs /plans /new_opcode_test_plan.md
trioskosmos's picture
chore: remove large files for HF Space
9bd4ce5
# 新しいオペコードのテスト計画
## 概要
BP05シリーズで追加された新しいアビリティに対応するため、7つの新しいオペコードと4つの新しい条件を追加しました。このドキュメントでは、各オペコードの仕様と、それを使用するカードのアビリティテキストに基づいたテストケースを定義します。
## 新しいオペコード一覧
| オペコード | ID | 説明 |
|-----------|-----|------|
| LOOK_DECK_DYNAMIC | 91 | ライブスコアに基づいてデッキを見る |
| REDUCE_SCORE | 92 | ライブスコアを減らす |
| REPEAT_ABILITY | 93 | アビリティを繰り返す |
| LOSE_EXCESS_HEARTS | 94 | 余剰ハートを失う |
| SKIP_ACTIVATE_PHASE | 95 | アクティブフェーズをスキップ |
| PAY_ENERGY_DYNAMIC | 96 | カードスコアに基づいてエネルギーを支払う |
| PLACE_ENERGY_UNDER_MEMBER | 97 | エネルギーをメンバーの下に配置 |
## 新しい条件一覧
| 条件 | ID | 説明 |
|------|-----|------|
| COUNT_ENERGY_EXACT | 301 | エネルギーの正確な数をチェック |
| COUNT_BLADE_HEART_TYPES | 302 | ブレード/ハートタイプをカウント |
| OPPONENT_HAS_EXCESS_HEART | 303 | 相手が余剰ハートを持つかチェック |
| SCORE_TOTAL_CHECK | 304 | 合計スコアをチェック |
---
## テストケース
### 1. LOOK_DECK_DYNAMIC (91)
**カード例**: PL!-bp5-001-AR
**元のテキスト**:
> ライブ成功時、手札を1枚控え室に置いてもよい:自分のデッキの上から、自分のライブの合計スコアに2を足した数に等しい枚数見る。その中からカードを1枚手札に加える。残りを控え室に置く。
**現在のコンパイル状態**: `effect_type: 29` (META_RULE)
**期待される動作**:
1. ライブ成功時にトリガー
2. オプションコスト: 手札を1枚捨てる
3. ライブの合計スコア + 2枚のカードをデッキの上から見る
4. その中から1枚を手札に加える
5. 残りを控え室に置く
**テストシナリオ**:
```
GIVEN: ライブスコアが5の状態
WHEN: アビリティが発動
THEN: デッキの上から7枚(5+2)を見る
AND: 1枚を選んで手札に加える
AND: 残り6枚を控え室に置く
```
**Rustテストコード**:
```rust
#[test]
fn test_opcode_look_deck_dynamic_score() {
let mut state = create_test_state();
// Setup: ライブスコア5、デッキに10枚以上
state.core.players[0].live_score = 5;
// ... デッキのセットアップ
// Execute: LOOK_DECK_DYNAMIC(2)を実行
// 期待: 7枚を見る
// Assert: looked_cardsに7枚が含まれる
assert_eq!(state.core.players[0].looked_cards.len(), 7);
}
```
---
### 2. REDUCE_SCORE (92)
**説明**: ライブスコアを減少させる効果
**期待される動作**:
- 指定された値だけライブスコアを減らす
- スコアは0以下にならない
**テストシナリオ**:
```
GIVEN: ライブスコアが10の状態
WHEN: REDUCE_SCORE(3)を実行
THEN: ライブスコアが7になる
```
**Rustテストコード**:
```rust
#[test]
fn test_opcode_reduce_score() {
let mut state = create_test_state();
state.core.players[0].live_score = 10;
// Execute: REDUCE_SCORE(3)
// 期待: live_score = 7
assert_eq!(state.core.players[0].live_score, 7);
}
```
---
### 3. REPEAT_ABILITY (93)
**説明**: アビリティを指定回数繰り返す
**期待される動作**:
- 現在のアビリティを指定回数実行する
- 繰り返し回数は動的に計算可能
**テストシナリオ**:
```
GIVEN: アビリティが「1枚引く」
WHEN: REPEAT_ABILITY(2)を実行
THEN: 2枚引く
```
---
### 4. LOSE_EXCESS_HEARTS (94)
**説明**: 余剰ハートを失う効果
**期待される動作**:
- 必要ハート数を超えているハートを失う
- ライブ成功条件に影響する可能性がある
**テストシナリオ**:
```
GIVEN: 必要ハートが[1,0,1,0,7,1,0]、現在のハートが[2,1,2,0,8,2,1]
WHEN: LOSE_EXCESS_HEARTSを実行
THEN: ハートが[1,0,1,0,7,1,0]になる(余剰分を失う)
```
---
### 5. SKIP_ACTIVATE_PHASE (95)
**説明**: アクティブフェーズをスキップする
**期待される動作**:
- プレイヤーのアクティブフェーズをスキップ
- 次のフェーズに進む
**テストシナリオ**:
```
GIVEN: アクティブフェーズ
WHEN: SKIP_ACTIVATE_PHASEを実行
THEN: アクティブフェーズがスキップされる
```
---
### 6. PAY_ENERGY_DYNAMIC (96)
**説明**: カードのスコアに基づいてエネルギーを支払う
**期待される動作**:
- カードのスコア分のエネルギーを支払う
- 動的なコスト計算
**テストシナリオ**:
```
GIVEN: エネルギーゾーンに5枚、カードスコアが3
WHEN: PAY_ENERGY_DYNAMICを実行
THEN: エネルギーを3枚支払う
```
---
### 7. PLACE_ENERGY_UNDER_MEMBER (97)
**説明**: エネルギーをメンバーの下に配置
**期待される動作**:
- エネルギーカードをメンバーの下に移動
- 特殊な状態管理が必要
**テストシナリオ**:
```
GIVEN: エネルギーゾーンにカード、ステージにメンバー
WHEN: PLACE_ENERGY_UNDER_MEMBERを実行
THEN: エネルギーがメンバーの下に配置される
```
---
## 新しい条件のテスト
### COUNT_ENERGY_EXACT (301)
**テストシナリオ**:
```
GIVEN: エネルギーゾーンに3枚
WHEN: COUNT_ENERGY_EXACT(3)を評価
THEN: true
WHEN: COUNT_ENERGY_EXACT(4)を評価
THEN: false
```
### COUNT_BLADE_HEART_TYPES (302)
**テストシナリオ**:
```
GIVEN: メンバーが3種類のブレード/ハートを持つ
WHEN: COUNT_BLADE_HEART_TYPES(3)を評価
THEN: true
```
### OPPONENT_HAS_EXCESS_HEART (303)
**テストシナリオ**:
```
GIVEN: 相手が余剰ハートを持つ
WHEN: OPPONENT_HAS_EXCESS_HEARTを評価
THEN: true
```
### SCORE_TOTAL_CHECK (304)
**テストシナリオ**:
```
GIVEN: 合計スコアが10
WHEN: SCORE_TOTAL_CHECK(10)を評価
THEN: true
```
---
## 実装優先順位
1. **LOOK_DECK_DYNAMIC** - 最も多くのカードで使用
2. **REDUCE_SCORE** - スコア計算に重要
3. **PAY_ENERGY_DYNAMIC** - エネルギーコスト管理
4. **LOSE_EXCESS_HEARTS** - ライブメカニクス
5. **SKIP_ACTIVATE_PHASE** - フェーズ管理
6. **REPEAT_ABILITY** - 複雑な効果
7. **PLACE_ENERGY_UNDER_MEMBER** - 特殊な状態管理
---
## 次のステップ
1. CodeモードでRustエンジンにオペコードハンドラーを実装
2. 各オペコードのテストを追加
3. BP05カードをテストスイートに追加
4. カードコンパイラを更新して新しいオペコードを使用