Spaces:
Sleeping
Sleeping
| # 新しいオペコードのテスト計画 | |
| ## 概要 | |
| 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. カードコンパイラを更新して新しいオペコードを使用 | |