From 6a66b0d709f1247b90a8ba78edede7a639ff56d5 Mon Sep 17 00:00:00 2001 From: Susucre <34709007+Susucre@users.noreply.github.com> Date: Fri, 18 Aug 2023 15:24:51 +0200 Subject: [PATCH] [WOE] Implement Virtue of Knowledge (#10855) --- .../cards/e/EleshNornMotherOfMachines.java | 54 +--------------- .../src/mage/cards/v/VirtueOfKnowledge.java | 47 ++++++++++++++ .../src/mage/cards/y/YarokTheDesecrated.java | 64 ++----------------- Mage.Sets/src/mage/sets/WildsOfEldraine.java | 1 + ...TriggerControlledETBReplacementEffect.java | 63 ++++++++++++++++++ 5 files changed, 119 insertions(+), 110 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/v/VirtueOfKnowledge.java create mode 100644 Mage/src/main/java/mage/abilities/effects/common/replacement/AdditionalTriggerControlledETBReplacementEffect.java diff --git a/Mage.Sets/src/mage/cards/e/EleshNornMotherOfMachines.java b/Mage.Sets/src/mage/cards/e/EleshNornMotherOfMachines.java index 33c5fc8a6d2..abfd4126c55 100644 --- a/Mage.Sets/src/mage/cards/e/EleshNornMotherOfMachines.java +++ b/Mage.Sets/src/mage/cards/e/EleshNornMotherOfMachines.java @@ -6,7 +6,7 @@ import mage.abilities.Ability; import mage.abilities.TriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; -import mage.abilities.effects.ReplacementEffectImpl; +import mage.abilities.effects.common.replacement.AdditionalTriggerControlledETBReplacementEffect; import mage.abilities.keyword.VigilanceAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -14,7 +14,6 @@ import mage.constants.*; import mage.game.Game; import mage.game.events.EntersTheBattlefieldEvent; import mage.game.events.GameEvent; -import mage.game.events.NumberOfTriggersEvent; import mage.game.permanent.Permanent; import java.util.UUID; @@ -36,7 +35,7 @@ public final class EleshNornMotherOfMachines extends CardImpl { this.addAbility(VigilanceAbility.getInstance()); // If a permanent entering the battlefield causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new EleshNornMotherOfMachinesDoublingEffect())); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new AdditionalTriggerControlledETBReplacementEffect())); // Permanents entering the battlefield don't cause abilities of permanents your opponents control to trigger. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new EleshNornMotherOfMachinesPreventionEffect())); @@ -48,55 +47,6 @@ public final class EleshNornMotherOfMachines extends CardImpl { public EleshNornMotherOfMachines copy() {return new EleshNornMotherOfMachines(this);} } -class EleshNornMotherOfMachinesDoublingEffect extends ReplacementEffectImpl { - - EleshNornMotherOfMachinesDoublingEffect() { - super(Duration.WhileOnBattlefield, Outcome.Benefit); - staticText = "If a permanent entering the battlefield causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time"; - } - - EleshNornMotherOfMachinesDoublingEffect(final EleshNornMotherOfMachinesDoublingEffect effect) { - super(effect); - } - - @Override - public EleshNornMotherOfMachinesDoublingEffect copy() { - return new EleshNornMotherOfMachinesDoublingEffect(this); - } - - @Override - public boolean checksEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.NUMBER_OF_TRIGGERS; - } - - @Override - public boolean applies(GameEvent event, Ability source, Game game) { - if (event instanceof NumberOfTriggersEvent) { - NumberOfTriggersEvent numberOfTriggersEvent = (NumberOfTriggersEvent) event; - // Only triggers for the controller of Elesh Norn - if (source.isControlledBy(event.getPlayerId())) { - GameEvent sourceEvent = numberOfTriggersEvent.getSourceEvent(); - // Only EtB triggers - if (sourceEvent != null - && sourceEvent.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD - && sourceEvent instanceof EntersTheBattlefieldEvent) { - // Only for triggers of permanents - if (game.getPermanent(numberOfTriggersEvent.getSourceId()) != null) { - return true; - } - } - } - } - return false; - } - - @Override - public boolean replaceEvent(GameEvent event, Ability source, Game game) { - event.setAmount(event.getAmount() + 1); - return false; - } -} - class EleshNornMotherOfMachinesPreventionEffect extends ContinuousRuleModifyingEffectImpl { EleshNornMotherOfMachinesPreventionEffect() { diff --git a/Mage.Sets/src/mage/cards/v/VirtueOfKnowledge.java b/Mage.Sets/src/mage/cards/v/VirtueOfKnowledge.java new file mode 100644 index 00000000000..beaba06d0cc --- /dev/null +++ b/Mage.Sets/src/mage/cards/v/VirtueOfKnowledge.java @@ -0,0 +1,47 @@ +package mage.cards.v; + +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.CopyTargetStackAbilityEffect; +import mage.abilities.effects.common.replacement.AdditionalTriggerControlledETBReplacementEffect; +import mage.cards.AdventureCard; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.TargetController; +import mage.filter.FilterStackObject; +import mage.target.common.TargetActivatedOrTriggeredAbility; + +import java.util.UUID; + +/** + * @author Susucr + */ +public final class VirtueOfKnowledge extends AdventureCard { + + private static final FilterStackObject filter + = new FilterStackObject("activated or triggered ability you control"); + + static { + filter.add(TargetController.YOU.getControllerPredicate()); + } + + public VirtueOfKnowledge(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, new CardType[]{CardType.INSTANT}, "{4}{U}", "Vantress Visions", "{1}{U}"); + + // If a permanent entering the battlefield causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time. + this.addAbility(new SimpleStaticAbility(new AdditionalTriggerControlledETBReplacementEffect())); + + // Vantress Visions + // Copy target activated or triggered ability you control. You may choose new targets for the copy. + this.getSpellCard().getSpellAbility().addEffect(new CopyTargetStackAbilityEffect()); + this.getSpellCard().getSpellAbility().addTarget(new TargetActivatedOrTriggeredAbility(filter)); + } + + private VirtueOfKnowledge(final VirtueOfKnowledge card) { + super(card); + } + + @Override + public VirtueOfKnowledge copy() { + return new VirtueOfKnowledge(this); + } +} diff --git a/Mage.Sets/src/mage/cards/y/YarokTheDesecrated.java b/Mage.Sets/src/mage/cards/y/YarokTheDesecrated.java index 5a361e4f9d9..53b740bfef5 100644 --- a/Mage.Sets/src/mage/cards/y/YarokTheDesecrated.java +++ b/Mage.Sets/src/mage/cards/y/YarokTheDesecrated.java @@ -1,18 +1,15 @@ package mage.cards.y; import mage.MageInt; -import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.ReplacementEffectImpl; +import mage.abilities.effects.common.replacement.AdditionalTriggerControlledETBReplacementEffect; import mage.abilities.keyword.DeathtouchAbility; import mage.abilities.keyword.LifelinkAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; -import mage.game.Game; -import mage.game.events.EntersTheBattlefieldEvent; -import mage.game.events.GameEvent; -import mage.game.events.NumberOfTriggersEvent; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.SuperType; import java.util.UUID; @@ -37,7 +34,7 @@ public final class YarokTheDesecrated extends CardImpl { this.addAbility(LifelinkAbility.getInstance()); // If a permanent entering the battlefield causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time. - this.addAbility(new SimpleStaticAbility(new YarokTheDesecratedEffect())); + this.addAbility(new SimpleStaticAbility(new AdditionalTriggerControlledETBReplacementEffect())); } private YarokTheDesecrated(final YarokTheDesecrated card) { @@ -48,53 +45,4 @@ public final class YarokTheDesecrated extends CardImpl { public YarokTheDesecrated copy() { return new YarokTheDesecrated(this); } -} - -class YarokTheDesecratedEffect extends ReplacementEffectImpl { - - YarokTheDesecratedEffect() { - super(Duration.WhileOnBattlefield, Outcome.Benefit); - staticText = "If a permanent entering the battlefield causes a triggered ability " + - "of a permanent you control to trigger, that ability triggers an additional time"; - } - - private YarokTheDesecratedEffect(final YarokTheDesecratedEffect effect) { - super(effect); - } - - @Override - public YarokTheDesecratedEffect copy() { - return new YarokTheDesecratedEffect(this); - } - - @Override - public boolean checksEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.NUMBER_OF_TRIGGERS; - } - - @Override - public boolean applies(GameEvent event, Ability source, Game game) { - if (!(event instanceof NumberOfTriggersEvent)) { - return false; - } - NumberOfTriggersEvent numberOfTriggersEvent = (NumberOfTriggersEvent) event; - if (!source.isControlledBy(event.getPlayerId())) { - return false; - } - GameEvent sourceEvent = numberOfTriggersEvent.getSourceEvent(); - // Only EtB triggers - if (sourceEvent == null - || sourceEvent.getType() != GameEvent.EventType.ENTERS_THE_BATTLEFIELD - || !(sourceEvent instanceof EntersTheBattlefieldEvent)) { - return false; - } - // Only for triggers of permanents - return game.getPermanent(numberOfTriggersEvent.getSourceId()) != null; - } - - @Override - public boolean replaceEvent(GameEvent event, Ability source, Game game) { - event.setAmount(event.getAmount() + 1); - return false; - } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/WildsOfEldraine.java b/Mage.Sets/src/mage/sets/WildsOfEldraine.java index 5bc63ea43dd..dd18ddccb51 100644 --- a/Mage.Sets/src/mage/sets/WildsOfEldraine.java +++ b/Mage.Sets/src/mage/sets/WildsOfEldraine.java @@ -88,6 +88,7 @@ public final class WildsOfEldraine extends ExpansionSet { cards.add(new SetCardInfo("Troublemaker Ouphe", 194, Rarity.COMMON, mage.cards.t.TroublemakerOuphe.class)); cards.add(new SetCardInfo("Troyan, Gutsy Explorer", 217, Rarity.UNCOMMON, mage.cards.t.TroyanGutsyExplorer.class)); cards.add(new SetCardInfo("Twisted Fealty", 154, Rarity.UNCOMMON, mage.cards.t.TwistedFealty.class)); + cards.add(new SetCardInfo("Virtue of Knowledge", 76, Rarity.MYTHIC, mage.cards.v.VirtueOfKnowledge.class)); cards.add(new SetCardInfo("Warehouse Tabby", 117, Rarity.COMMON, mage.cards.w.WarehouseTabby.class)); } diff --git a/Mage/src/main/java/mage/abilities/effects/common/replacement/AdditionalTriggerControlledETBReplacementEffect.java b/Mage/src/main/java/mage/abilities/effects/common/replacement/AdditionalTriggerControlledETBReplacementEffect.java new file mode 100644 index 00000000000..38267422654 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/effects/common/replacement/AdditionalTriggerControlledETBReplacementEffect.java @@ -0,0 +1,63 @@ +package mage.abilities.effects.common.replacement; + +import mage.abilities.Ability; +import mage.abilities.effects.ReplacementEffectImpl; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.game.Game; +import mage.game.events.EntersTheBattlefieldEvent; +import mage.game.events.GameEvent; +import mage.game.events.NumberOfTriggersEvent; + +/** + * @author TheElk801 + */ +public class AdditionalTriggerControlledETBReplacementEffect extends ReplacementEffectImpl { + + public AdditionalTriggerControlledETBReplacementEffect() { + super(Duration.WhileOnBattlefield, Outcome.Benefit); + staticText = "If a permanent entering the battlefield causes a triggered ability " + + "of a permanent you control to trigger, that ability triggers an additional time"; + } + + private AdditionalTriggerControlledETBReplacementEffect(final AdditionalTriggerControlledETBReplacementEffect effect) { + super(effect); + } + + @Override + public AdditionalTriggerControlledETBReplacementEffect copy() { + return new AdditionalTriggerControlledETBReplacementEffect(this); + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.NUMBER_OF_TRIGGERS; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + if (!(event instanceof NumberOfTriggersEvent)) { + return false; + } + NumberOfTriggersEvent numberOfTriggersEvent = (NumberOfTriggersEvent) event; + // Only triggers for the source controller + if (!source.isControlledBy(event.getPlayerId())) { + return false; + } + GameEvent sourceEvent = numberOfTriggersEvent.getSourceEvent(); + // Only EtB triggers + if (sourceEvent == null + || sourceEvent.getType() != GameEvent.EventType.ENTERS_THE_BATTLEFIELD + || !(sourceEvent instanceof EntersTheBattlefieldEvent)) { + return false; + } + // Only for triggers of permanents + return game.getPermanent(numberOfTriggersEvent.getSourceId()) != null; + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + event.setAmount(event.getAmount() + 1); + return false; + } +}