From f32597b164169a7eaa9939a4e0f56ae13e57fd83 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Sat, 26 Sep 2020 19:07:12 -0400 Subject: [PATCH] reimplemented Path of Ancestry to prevent Blood Sun from removing scry trigger --- .../src/mage/cards/p/PathOfAncestry.java | 123 +++++++++--------- 1 file changed, 60 insertions(+), 63 deletions(-) diff --git a/Mage.Sets/src/mage/cards/p/PathOfAncestry.java b/Mage.Sets/src/mage/cards/p/PathOfAncestry.java index 5750db49fb7..8b4085a101e 100644 --- a/Mage.Sets/src/mage/cards/p/PathOfAncestry.java +++ b/Mage.Sets/src/mage/cards/p/PathOfAncestry.java @@ -1,26 +1,26 @@ package mage.cards.p; -import mage.MageObject; import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.DelayedTriggeredAbility; import mage.abilities.common.EntersBattlefieldTappedAbility; -import mage.abilities.effects.Effect; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; import mage.abilities.effects.keyword.ScryEffect; import mage.abilities.keyword.ChangelingAbility; import mage.abilities.mana.CommanderColorIdentityManaAbility; +import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.Duration; import mage.constants.SubType; import mage.constants.SubTypeSet; -import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import mage.game.stack.Spell; import mage.players.Player; -import java.util.Iterator; +import java.util.HashSet; import java.util.Set; import java.util.UUID; @@ -35,12 +35,10 @@ public final class PathOfAncestry extends CardImpl { // Path of Ancestry enters the battlefield tapped. this.addAbility(new EntersBattlefieldTappedAbility()); - // T: Add one mana of any color in your commander's color identity. + // T: Add one mana of any color in your commander's color identity. When that mana is spent to cast a creature spell that shares a creature type with your commander, scry 1. Ability ability = new CommanderColorIdentityManaAbility(); + ability.addEffect(new CreateDelayedTriggeredAbilityEffect(new PathOfAncestryTriggeredAbility())); this.addAbility(ability); - - // When that mana is spent to cast a creature spell that shares a creature type with your commander, scry 1. - this.addAbility(new PathOfAncestryTriggeredAbility(new ScryEffect(1))); } public PathOfAncestry(final PathOfAncestry card) { @@ -53,13 +51,13 @@ public final class PathOfAncestry extends CardImpl { } } -class PathOfAncestryTriggeredAbility extends TriggeredAbilityImpl { +class PathOfAncestryTriggeredAbility extends DelayedTriggeredAbility { - public PathOfAncestryTriggeredAbility(Effect effect) { - super(Zone.ALL, effect, false); + PathOfAncestryTriggeredAbility() { + super(new ScryEffect(1), Duration.Custom, true, false); } - public PathOfAncestryTriggeredAbility(final PathOfAncestryTriggeredAbility ability) { + private PathOfAncestryTriggeredAbility(final PathOfAncestryTriggeredAbility ability) { super(ability); } @@ -75,61 +73,60 @@ class PathOfAncestryTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { - if (getSourceId().equals(event.getSourceId())) { - Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(getSourceId()); - if (sourcePermanent != null) { - boolean found = false; - for (Ability ability : sourcePermanent.getAbilities()) { - if (ability instanceof CommanderColorIdentityManaAbility && ability.getOriginalId().toString().equals(event.getData())) { - found = true; - break; - } - } - if (found) { - Spell spell = game.getStack().getSpell(event.getTargetId()); - if (spell != null && spell.isCreature()) { - Player controller = game.getPlayer(getControllerId()); - Set commanders = game.getCommandersIds(controller); - if (controller != null && commanders != null && !commanders.isEmpty()) { - if (spell.getAbilities().contains(ChangelingAbility.getInstance())) { - for (UUID cmdr : commanders) { - MageObject commander = game.getObject(cmdr); - if (commander != null) { - if (commander.getAbilities().contains(ChangelingAbility.getInstance())) { - return true; - } - Iterator cmdrSubs = commander.getSubtype(game).iterator(); - while (cmdrSubs.hasNext()) { - SubType sType = cmdrSubs.next(); - if (sType.getSubTypeSet() == SubTypeSet.CreatureType) { - return true; - } - } - } - } - } - Iterator spellSubs = spell.getSubtype(game).iterator(); - while (spellSubs.hasNext()) { - SubType sType = spellSubs.next(); - if (sType.getSubTypeSet() == SubTypeSet.CreatureType) { - for (UUID cmdr : commanders) { - MageObject commander = game.getObject(cmdr); - if (commander != null && (commander.hasSubtype(sType, game) || commander.getAbilities().contains(ChangelingAbility.getInstance()))) { - return true; - } - } - } - } - } - } - } + if (!getSourceId().equals(event.getSourceId())) { + return false; + } + Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(getSourceId()); + if (sourcePermanent == null) { + return false; + } + boolean found = false; + for (Ability ability : sourcePermanent.getAbilities()) { + if (ability instanceof CommanderColorIdentityManaAbility + && ability.getOriginalId().toString().equals(event.getData())) { + found = true; + break; } } - return false; + if (!found) { + return false; + } + Spell spell = game.getStack().getSpell(event.getTargetId()); + if (spell == null || (spell.getSubtype(game).isEmpty() + && !spell.hasAbility(ChangelingAbility.getInstance(), game))) { + return false; + } + Player player = game.getPlayer(getControllerId()); + if (player == null) { + return false; + } + boolean isAllA = false; + Set subTypeSet = new HashSet<>(); + for (UUID commanderId : game.getCommandersIds(player)) { + Card commander = game.getPermanent(commanderId); + if (commander == null) { + commander = game.getCard(commanderId); + } + if (commander == null) { + continue; + } + if (commander.isAllCreatureTypes() + || commander.hasAbility(ChangelingAbility.getInstance(), game)) { + isAllA = true; + break; + } + subTypeSet.addAll(commander.getSubtype(game)); + } + subTypeSet.removeIf(subType -> subType.getSubTypeSet() != SubTypeSet.CreatureType); + if (subTypeSet.isEmpty() && !isAllA) { + return false; + } + return spell.hasAbility(ChangelingAbility.getInstance(), game) + || spell.getSubtype(game).stream().anyMatch(subTypeSet::contains); } @Override public String getRule() { - return "When that mana is used to cast a creature spell that shares a creature type with your commander, " + super.getRule(); + return "When that mana is spent to cast a creature spell that shares a creature type with your commander, scry 1."; } }