Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
808f848
fix(parser): distribute Mutable Pupa's perpetual keyword-mirror trigg…
jsdevninja Jul 23, 2026
b6fb304
fix(PR-6533): cover perpetual keyword grant role
matthewevans Jul 23, 2026
dd27f8d
fix(PR-6533): address parser review findings
matthewevans Jul 23, 2026
e63b6e5
fix(PR-6533): dereference parser test effect
matthewevans Jul 23, 2026
7e48552
fix(PR-6533): select Kathril counter recipient
matthewevans Jul 23, 2026
186078a
test(PR-6533): fund Kathril regression correctly
matthewevans Jul 23, 2026
0a0d6cc
fix(test): use self-ref counter recipient in Kathril regression test
jsdevninja Jul 23, 2026
6b6563c
fix(parser): recognize "any <type>" as a real typed target, not a fal…
jsdevninja Jul 23, 2026
fda6123
fix(engine): give each untargeted PutCounter instruction its own CR 6…
jsdevninja Jul 23, 2026
ec287c1
fix(engine): pass ability by reference to should_propagate_parent_tar…
jsdevninja Jul 23, 2026
b92afb8
fix(parser): compose the "any" quantifier strip through other/another
jsdevninja Jul 23, 2026
96b2937
test: regenerate Kathril snapshot fixtures for the any-quantifier par…
jsdevninja Jul 23, 2026
09798c1
test: add target_choice_timing to Kathril snapshot fixtures
jsdevninja Jul 23, 2026
55e02f5
fix(test): default ChooseFromZoneChoice's test driver to the legal set
jsdevninja Jul 24, 2026
ab3ef96
fix(test): drive ChooseFromZoneChoice manually, don't auto-handle in …
jsdevninja Jul 24, 2026
6b2d818
fix(parser): chain a second consecutive subtype word instead of dropp…
jsdevninja Jul 24, 2026
f57544f
Merge branch 'main' into fix/mutable-pupa-perpetual-keyword-mirror
matthewevans Jul 24, 2026
7c48b74
fix(parser): exclude the "Urza's" possessive fragment from subtype ch…
jsdevninja Jul 24, 2026
50d1de7
fix(parser): scope consecutive-subtype chaining to creature types only
jsdevninja Jul 24, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions crates/engine/src/game/ability_rw.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3696,6 +3696,7 @@ fn walk_ability(
target_selection_mode: _,
chosen_players: _,
sub_link: _,
sibling_condition: _, // replication marker, no read/write effect
replacement_applied: _,
parent_target_missing_reason: _,
} = a;
Expand Down Expand Up @@ -3816,6 +3817,7 @@ fn walk_definition(
target_selection_mode: _,
sub_link: _,
iteration_kind_binding: _,
sibling_condition: _,
} = a;

// §4.3.2: own `player_scope` overrides the inherited scope (Brink's Discard
Expand Down
3 changes: 3 additions & 0 deletions crates/engine/src/game/ability_scan.rs
Original file line number Diff line number Diff line change
Expand Up @@ -258,6 +258,7 @@ fn resolved_ability_axes(a: &ResolvedAbility, mode: ScanMode) -> Axes {
chosen_players: _, // concrete chosen player ids
replacement_applied: _, // replacement provenance set, no dynamic read
sub_link: _, // SubAbilityLink kind tag
sibling_condition: _, // SiblingCondition replication marker, no dynamic read
parent_target_missing_reason: _, // seam flag
} = a;

Expand Down Expand Up @@ -4240,6 +4241,7 @@ fn ability_definition_axes(def: &AbilityDefinition, mode: ScanMode) -> Axes {
target_selection_mode: _,
sub_link: _,
iteration_kind_binding: _,
sibling_condition: _,
} = def;

let mut acc = scan_effect(effect, mode);
Expand Down Expand Up @@ -6451,6 +6453,7 @@ pub(crate) fn ability_resolution_choice_freedom(a: &ResolvedAbility) -> Resoluti
chosen_players: _, // concrete chosen player ids (already selected)
replacement_applied: _, // replacement provenance set, no prompt
sub_link: _, // SubAbilityLink kind tag
sibling_condition: _, // SiblingCondition replication marker, no resolution-time choice
parent_target_missing_reason: _, // seam flag
} = a;

Expand Down
7 changes: 7 additions & 0 deletions crates/engine/src/game/ability_utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,13 @@ pub fn build_resolved_from_def_with_targets(
// CR 608.2c: Carry the parent-link kind through so the decline classifier can
// distinguish a separate-sentence sibling from a within-clause continuation.
resolved.sub_link = def.sub_link;
// CR 702.1c ("the same is true") + CR 608.2c (written order): Carry the
// replication marker through so `resolve_chain_body` evaluates a
// `ReplicatedOrBranch` per-item OR-branch (Mutable Pupa, Kathril)
// independently of a preceding sibling's failed gate. Without this copy the
// parser-stamped `SiblingCondition` never reaches the resolved sub and the
// keyword list collapses after the first false gate.
resolved.sibling_condition = def.sibling_condition;
// CR 700.2b + CR 603.3c: Carry the reflexive modal choice + per-mode abilities
// through so try_begin_reflexive_target_selection can route a gated modal
// trigger (Caesar) to AbilityModeChoice instead of resolving the modes
Expand Down
1 change: 1 addition & 0 deletions crates/engine/src/game/effects/additional_phase.rs
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,7 @@ mod tests {
repeat_until: None,
replacement_applied: Default::default(),
sub_link: crate::types::ability::SubAbilityLink::ContinuationStep,
sibling_condition: crate::types::ability::SiblingCondition::Dependent,
modal: None,
mode_abilities: vec![],
parent_target_missing_reason: None,
Expand Down
1 change: 1 addition & 0 deletions crates/engine/src/game/effects/double.rs
Original file line number Diff line number Diff line change
Expand Up @@ -359,6 +359,7 @@ mod tests {
repeat_until: None,
replacement_applied: Default::default(),
sub_link: crate::types::ability::SubAbilityLink::ContinuationStep,
sibling_condition: crate::types::ability::SiblingCondition::Dependent,
modal: None,
mode_abilities: vec![],
parent_target_missing_reason: None,
Expand Down
1 change: 1 addition & 0 deletions crates/engine/src/game/effects/extra_turn.rs
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@ mod tests {
repeat_until: None,
replacement_applied: Default::default(),
sub_link: crate::types::ability::SubAbilityLink::ContinuationStep,
sibling_condition: crate::types::ability::SiblingCondition::Dependent,
modal: None,
mode_abilities: vec![],
parent_target_missing_reason: None,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,9 @@ pub fn resolve(
#[cfg(test)]
mod tests {
use super::*;
use crate::types::ability::{AbilityKind, QuantityExpr, SpellContext, SubAbilityLink};
use crate::types::ability::{
AbilityKind, QuantityExpr, SiblingCondition, SpellContext, SubAbilityLink,
};
use crate::types::identifiers::ObjectId;
use crate::types::player::PlayerId;

Expand Down Expand Up @@ -128,6 +130,7 @@ mod tests {
repeat_until: None,
replacement_applied: Default::default(),
sub_link: SubAbilityLink::ContinuationStep,
sibling_condition: SiblingCondition::Dependent,
modal: None,
mode_abilities: vec![],
parent_target_missing_reason: None,
Expand Down
Loading
Loading