diff --git a/Mage.Sets/src/mage/cards/b/BecomeImmense.java b/Mage.Sets/src/mage/cards/b/BecomeImmense.java index 6d3f10f7744..1b3c623820e 100644 --- a/Mage.Sets/src/mage/cards/b/BecomeImmense.java +++ b/Mage.Sets/src/mage/cards/b/BecomeImmense.java @@ -20,7 +20,8 @@ public final class BecomeImmense extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{5}{G}"); // Delve (Each card you exile from your graveyard while casting this spell pays for {1}.) - this.addAbility(new DelveAbility()); + this.addAbility(new DelveAbility(false)); + // Target creature gets +6/+6 until end of turn this.getSpellAbility().addEffect(new BoostTargetEffect(6, 6, Duration.EndOfTurn)); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); diff --git a/Mage.Sets/src/mage/cards/d/DeadDrop.java b/Mage.Sets/src/mage/cards/d/DeadDrop.java index 0d93dddd5d0..4ed711d4ca3 100644 --- a/Mage.Sets/src/mage/cards/d/DeadDrop.java +++ b/Mage.Sets/src/mage/cards/d/DeadDrop.java @@ -20,7 +20,8 @@ public final class DeadDrop extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{9}{B}"); // Delve - this.addAbility(new DelveAbility()); + this.addAbility(new DelveAbility(false)); + // Target player sacrifices two creatures this.getSpellAbility().addEffect(new SacrificeEffect(StaticFilters.FILTER_PERMANENT_CREATURES, 2, "Target player")); this.getSpellAbility().addTarget(new TargetPlayer()); diff --git a/Mage.Sets/src/mage/cards/d/DeathRattle.java b/Mage.Sets/src/mage/cards/d/DeathRattle.java index 8b39cdaca2c..a3017aa83b8 100644 --- a/Mage.Sets/src/mage/cards/d/DeathRattle.java +++ b/Mage.Sets/src/mage/cards/d/DeathRattle.java @@ -29,7 +29,7 @@ public final class DeathRattle extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{5}{B}"); // Delve - this.addAbility(new DelveAbility()); + this.addAbility(new DelveAbility(false)); // Destroy target nongreen creature. It can't be regenerated. this.getSpellAbility().addEffect(new DestroyTargetEffect(true)); diff --git a/Mage.Sets/src/mage/cards/d/DigThroughTime.java b/Mage.Sets/src/mage/cards/d/DigThroughTime.java index 0e2b3f88492..27d8f834b10 100644 --- a/Mage.Sets/src/mage/cards/d/DigThroughTime.java +++ b/Mage.Sets/src/mage/cards/d/DigThroughTime.java @@ -18,7 +18,7 @@ public final class DigThroughTime extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{6}{U}{U}"); // Delve - this.addAbility(new DelveAbility()); + this.addAbility(new DelveAbility(false)); // Look at the top seven cards of your library. Put two of them into your hand and the rest on the bottom of your library in any order. this.getSpellAbility().addEffect(new LookLibraryAndPickControllerEffect(7, 2, PutCards.HAND, PutCards.BOTTOM_ANY)); diff --git a/Mage.Sets/src/mage/cards/e/EmptyThePits.java b/Mage.Sets/src/mage/cards/e/EmptyThePits.java index 2086a177778..9a9b63733f5 100644 --- a/Mage.Sets/src/mage/cards/e/EmptyThePits.java +++ b/Mage.Sets/src/mage/cards/e/EmptyThePits.java @@ -21,7 +21,7 @@ public final class EmptyThePits extends CardImpl { // Delve - this.addAbility(new DelveAbility()); + this.addAbility(new DelveAbility(false)); // create X 2/2 black Zombie creature tokens tapped. this.getSpellAbility().addEffect(new CreateTokenEffect(new ZombieToken(), GetXValue.instance, true, false)); diff --git a/Mage.Sets/src/mage/cards/e/EtherealForager.java b/Mage.Sets/src/mage/cards/e/EtherealForager.java index 8fa7d93bf1c..5b748c72246 100644 --- a/Mage.Sets/src/mage/cards/e/EtherealForager.java +++ b/Mage.Sets/src/mage/cards/e/EtherealForager.java @@ -37,7 +37,7 @@ public final class EtherealForager extends CardImpl { this.toughness = new MageInt(3); // Delve - this.addAbility(new DelveAbility()); + this.addAbility(new DelveAbility(true)); // Flying this.addAbility(FlyingAbility.getInstance()); diff --git a/Mage.Sets/src/mage/cards/g/GurmagAngler.java b/Mage.Sets/src/mage/cards/g/GurmagAngler.java index 0e650201920..95fee54fba9 100644 --- a/Mage.Sets/src/mage/cards/g/GurmagAngler.java +++ b/Mage.Sets/src/mage/cards/g/GurmagAngler.java @@ -23,7 +23,7 @@ public final class GurmagAngler extends CardImpl { this.toughness = new MageInt(5); // Delve - this.addAbility(new DelveAbility()); + this.addAbility(new DelveAbility(false)); } private GurmagAngler(final GurmagAngler card) { diff --git a/Mage.Sets/src/mage/cards/h/HogaakArisenNecropolis.java b/Mage.Sets/src/mage/cards/h/HogaakArisenNecropolis.java index 3f047ea4f0a..adb05ec4b52 100644 --- a/Mage.Sets/src/mage/cards/h/HogaakArisenNecropolis.java +++ b/Mage.Sets/src/mage/cards/h/HogaakArisenNecropolis.java @@ -45,7 +45,7 @@ public final class HogaakArisenNecropolis extends CardImpl { this.addAbility(new ConvokeAbility()); // Delve - this.addAbility(new DelveAbility()); + this.addAbility(new DelveAbility(false)); // You may cast Hogaak, Arisen Necropolis from your graveyard. this.addAbility(new MayCastFromGraveyardSourceAbility()); diff --git a/Mage.Sets/src/mage/cards/h/HootingMandrills.java b/Mage.Sets/src/mage/cards/h/HootingMandrills.java index 543ab6aa2fe..9230ae993e4 100644 --- a/Mage.Sets/src/mage/cards/h/HootingMandrills.java +++ b/Mage.Sets/src/mage/cards/h/HootingMandrills.java @@ -24,7 +24,8 @@ public final class HootingMandrills extends CardImpl { this.toughness = new MageInt(4); // Delve - this.addAbility(new DelveAbility()); + this.addAbility(new DelveAbility(false)); + // Trample this.addAbility(TrampleAbility.getInstance()); } diff --git a/Mage.Sets/src/mage/cards/l/LogicKnot.java b/Mage.Sets/src/mage/cards/l/LogicKnot.java index 5b2902a354d..85f11189b0d 100644 --- a/Mage.Sets/src/mage/cards/l/LogicKnot.java +++ b/Mage.Sets/src/mage/cards/l/LogicKnot.java @@ -21,7 +21,7 @@ public final class LogicKnot extends CardImpl { // Delve - this.addAbility(new DelveAbility()); + this.addAbility(new DelveAbility(false)); // Counter target spell unless its controller pays {X}. this.getSpellAbility().addEffect(new CounterUnlessPaysEffect(GetXValue.instance)); diff --git a/Mage.Sets/src/mage/cards/m/MagmaticSinkhole.java b/Mage.Sets/src/mage/cards/m/MagmaticSinkhole.java index b918981ffa2..328aaf84eee 100644 --- a/Mage.Sets/src/mage/cards/m/MagmaticSinkhole.java +++ b/Mage.Sets/src/mage/cards/m/MagmaticSinkhole.java @@ -18,7 +18,7 @@ public final class MagmaticSinkhole extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{5}{R}"); // Delve - this.addAbility(new DelveAbility()); + this.addAbility(new DelveAbility(false)); // Magmatic Sinkhole deals 5 damage to target creature or planeswalker. this.getSpellAbility().addEffect(new DamageTargetEffect(5)); diff --git a/Mage.Sets/src/mage/cards/m/MurderousCut.java b/Mage.Sets/src/mage/cards/m/MurderousCut.java index b752f040150..7cf22972755 100644 --- a/Mage.Sets/src/mage/cards/m/MurderousCut.java +++ b/Mage.Sets/src/mage/cards/m/MurderousCut.java @@ -20,7 +20,7 @@ public final class MurderousCut extends CardImpl { // Delve - this.addAbility(new DelveAbility()); + this.addAbility(new DelveAbility(false)); // Destroy target creature. this.getSpellAbility().addEffect(new DestroyTargetEffect()); diff --git a/Mage.Sets/src/mage/cards/m/MurktideRegent.java b/Mage.Sets/src/mage/cards/m/MurktideRegent.java index f073d69e118..3ecdf272a13 100644 --- a/Mage.Sets/src/mage/cards/m/MurktideRegent.java +++ b/Mage.Sets/src/mage/cards/m/MurktideRegent.java @@ -37,7 +37,7 @@ public final class MurktideRegent extends CardImpl { this.toughness = new MageInt(3); // Delve - this.addAbility(new DelveAbility()); + this.addAbility(new DelveAbility(true)); // Flying this.addAbility(FlyingAbility.getInstance()); diff --git a/Mage.Sets/src/mage/cards/n/NecropolisFiend.java b/Mage.Sets/src/mage/cards/n/NecropolisFiend.java index 343aa8810e5..2f491e5ac22 100644 --- a/Mage.Sets/src/mage/cards/n/NecropolisFiend.java +++ b/Mage.Sets/src/mage/cards/n/NecropolisFiend.java @@ -48,7 +48,7 @@ public final class NecropolisFiend extends CardImpl { this.toughness = new MageInt(5); // Delve - this.addAbility(new DelveAbility()); + this.addAbility(new DelveAbility(false)); // Flying this.addAbility(FlyingAbility.getInstance()); diff --git a/Mage.Sets/src/mage/cards/r/RiteOfUndoing.java b/Mage.Sets/src/mage/cards/r/RiteOfUndoing.java index 809df0f9c2f..ac49502d802 100644 --- a/Mage.Sets/src/mage/cards/r/RiteOfUndoing.java +++ b/Mage.Sets/src/mage/cards/r/RiteOfUndoing.java @@ -29,7 +29,7 @@ public final class RiteOfUndoing extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{4}{U}"); // Delve - this.addAbility(new DelveAbility()); + this.addAbility(new DelveAbility(false)); // Return target nonland permanent you control and target nonland permanent you don't control to their owners' hands. this.getSpellAbility().addEffect(new ReturnToHandTargetEffect().setTargetPointer(new EachTargetPointer())); diff --git a/Mage.Sets/src/mage/cards/s/SetAdrift.java b/Mage.Sets/src/mage/cards/s/SetAdrift.java index 1451c5da27c..e7f9840916a 100644 --- a/Mage.Sets/src/mage/cards/s/SetAdrift.java +++ b/Mage.Sets/src/mage/cards/s/SetAdrift.java @@ -20,7 +20,8 @@ public final class SetAdrift extends CardImpl { // Delve - this.addAbility(new DelveAbility()); + this.addAbility(new DelveAbility(false)); + // Put target nonland permanent on top of its owner's library this.getSpellAbility().addEffect(new PutOnLibraryTargetEffect(true)); this.getSpellAbility().addTarget(new TargetNonlandPermanent()); diff --git a/Mage.Sets/src/mage/cards/s/ShamblingAttendants.java b/Mage.Sets/src/mage/cards/s/ShamblingAttendants.java index 561f29ab882..7e8c5a9c44b 100644 --- a/Mage.Sets/src/mage/cards/s/ShamblingAttendants.java +++ b/Mage.Sets/src/mage/cards/s/ShamblingAttendants.java @@ -24,7 +24,8 @@ public final class ShamblingAttendants extends CardImpl { this.toughness = new MageInt(5); // Delve - this.addAbility(new DelveAbility()); + this.addAbility(new DelveAbility(false)); + // Deathtouch this.addAbility(DeathtouchAbility.getInstance()); } diff --git a/Mage.Sets/src/mage/cards/s/SibsigMuckdraggers.java b/Mage.Sets/src/mage/cards/s/SibsigMuckdraggers.java index 28c896aedc4..f544bdd87f6 100644 --- a/Mage.Sets/src/mage/cards/s/SibsigMuckdraggers.java +++ b/Mage.Sets/src/mage/cards/s/SibsigMuckdraggers.java @@ -28,7 +28,8 @@ public final class SibsigMuckdraggers extends CardImpl { this.toughness = new MageInt(6); // Delve - this.addAbility(new DelveAbility()); + this.addAbility(new DelveAbility(false)); + // When Sibsig Muckdraggers enters the battlefield, return target creature card from your graveyard to your hand. Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnFromGraveyardToHandTargetEffect(), false); ability.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD)); diff --git a/Mage.Sets/src/mage/cards/s/SorcerousSquall.java b/Mage.Sets/src/mage/cards/s/SorcerousSquall.java index c998a191c88..9b99a1a1994 100644 --- a/Mage.Sets/src/mage/cards/s/SorcerousSquall.java +++ b/Mage.Sets/src/mage/cards/s/SorcerousSquall.java @@ -33,7 +33,7 @@ public final class SorcerousSquall extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{6}{U}{U}{U}"); // Delve - this.addAbility(new DelveAbility()); + this.addAbility(new DelveAbility(false)); // Target opponent mills nine cards, then you may cast an instant or sorcery spell from that player's graveyard without paying its mana cost. If that spell would be put into a graveyard, exile it instead. this.getSpellAbility().addEffect(new MillCardsTargetEffect(9)); diff --git a/Mage.Sets/src/mage/cards/s/Soulflayer.java b/Mage.Sets/src/mage/cards/s/Soulflayer.java index 269177ae832..60babb63a59 100644 --- a/Mage.Sets/src/mage/cards/s/Soulflayer.java +++ b/Mage.Sets/src/mage/cards/s/Soulflayer.java @@ -31,7 +31,7 @@ public final class Soulflayer extends CardImpl { this.toughness = new MageInt(4); // Delve - this.addAbility(new DelveAbility()); + this.addAbility(new DelveAbility(true)); // If a creature card with flying was exiled with Soulflayer's delve ability, Soulflayer has flying. The same is true for first strike, double strike, deathtouch, haste, hexproof, indestructible, lifelink, reach, trample, and vigilance. this.addAbility(new SimpleStaticAbility(new SoulflayerEffect())); diff --git a/Mage.Sets/src/mage/cards/s/SultaiScavenger.java b/Mage.Sets/src/mage/cards/s/SultaiScavenger.java index c3f133be5b7..6fe4bcf18a2 100644 --- a/Mage.Sets/src/mage/cards/s/SultaiScavenger.java +++ b/Mage.Sets/src/mage/cards/s/SultaiScavenger.java @@ -25,7 +25,8 @@ public final class SultaiScavenger extends CardImpl { this.toughness = new MageInt(3); // Delve - this.addAbility(new DelveAbility()); + this.addAbility(new DelveAbility(false)); + // Flying this.addAbility(FlyingAbility.getInstance()); } diff --git a/Mage.Sets/src/mage/cards/t/TasigurTheGoldenFang.java b/Mage.Sets/src/mage/cards/t/TasigurTheGoldenFang.java index 94c1d80bae7..050939d6980 100644 --- a/Mage.Sets/src/mage/cards/t/TasigurTheGoldenFang.java +++ b/Mage.Sets/src/mage/cards/t/TasigurTheGoldenFang.java @@ -35,7 +35,7 @@ public final class TasigurTheGoldenFang extends CardImpl { this.toughness = new MageInt(5); // Delve - this.addAbility(new DelveAbility()); + this.addAbility(new DelveAbility(false)); // {2}{G/U}{G/U}: Put the top two cards of your library into your graveyard, then return a nonland card of an opponent's choice from your graveyard to your hand. Ability ability = new SimpleActivatedAbility(new MillCardsControllerEffect(2), new ManaCostsImpl<>("{2}{G/U}{G/U}")); diff --git a/Mage.Sets/src/mage/cards/t/TasigursCruelty.java b/Mage.Sets/src/mage/cards/t/TasigursCruelty.java index a59ae456232..4bb70e38965 100644 --- a/Mage.Sets/src/mage/cards/t/TasigursCruelty.java +++ b/Mage.Sets/src/mage/cards/t/TasigursCruelty.java @@ -20,7 +20,7 @@ public final class TasigursCruelty extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{5}{B}"); // Delve - this.addAbility(new DelveAbility()); + this.addAbility(new DelveAbility(false)); // Each opponent discards two cards. this.getSpellAbility().addEffect(new DiscardEachPlayerEffect(StaticValue.get(2), false, TargetController.OPPONENT)); diff --git a/Mage.Sets/src/mage/cards/t/TemporalTrespass.java b/Mage.Sets/src/mage/cards/t/TemporalTrespass.java index d493616320d..8977c71a945 100644 --- a/Mage.Sets/src/mage/cards/t/TemporalTrespass.java +++ b/Mage.Sets/src/mage/cards/t/TemporalTrespass.java @@ -19,7 +19,8 @@ public final class TemporalTrespass extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{8}{U}{U}{U}"); // Delve - this.addAbility(new DelveAbility()); + this.addAbility(new DelveAbility(false)); + // Take an extra turn after this one. Exile Temporal Trespass. this.getSpellAbility().addEffect(new AddExtraTurnControllerEffect()); this.getSpellAbility().addEffect(new ExileSpellEffect()); diff --git a/Mage.Sets/src/mage/cards/t/Tombstalker.java b/Mage.Sets/src/mage/cards/t/Tombstalker.java index 138a32a73e3..7c415ad3bbb 100644 --- a/Mage.Sets/src/mage/cards/t/Tombstalker.java +++ b/Mage.Sets/src/mage/cards/t/Tombstalker.java @@ -26,10 +26,9 @@ public final class Tombstalker extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); + // Delve - Ability ability = new DelveAbility(); - ability.setRuleAtTheTop(false); - this.addAbility(ability); + this.addAbility(new DelveAbility(false)); } private Tombstalker(final Tombstalker card) { diff --git a/Mage.Sets/src/mage/cards/t/TreasureCruise.java b/Mage.Sets/src/mage/cards/t/TreasureCruise.java index 6adc2b216e9..c3ba68e8998 100644 --- a/Mage.Sets/src/mage/cards/t/TreasureCruise.java +++ b/Mage.Sets/src/mage/cards/t/TreasureCruise.java @@ -1,4 +1,3 @@ - package mage.cards.t; import java.util.UUID; @@ -17,9 +16,9 @@ public final class TreasureCruise extends CardImpl { public TreasureCruise(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{7}{U}"); - // Delve - this.addAbility(new DelveAbility()); + this.addAbility(new DelveAbility(false)); + // Draw 3 Cards this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(3)); } diff --git a/Mage.Sets/src/mage/cards/w/WillOfTheNaga.java b/Mage.Sets/src/mage/cards/w/WillOfTheNaga.java index dc6cd9d0141..64a61719676 100644 --- a/Mage.Sets/src/mage/cards/w/WillOfTheNaga.java +++ b/Mage.Sets/src/mage/cards/w/WillOfTheNaga.java @@ -1,4 +1,3 @@ - package mage.cards.w; import java.util.UUID; @@ -20,7 +19,8 @@ public final class WillOfTheNaga extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{4}{U}{U}"); // Delve - this.addAbility(new DelveAbility()); + this.addAbility(new DelveAbility(false)); + // Tap up to two target creatures. Those creatures don't untap during their controller's next untap step. this.getSpellAbility().addEffect(new TapTargetEffect()); this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 2)); diff --git a/Mage/src/main/java/mage/abilities/costs/common/ExileFromGraveCost.java b/Mage/src/main/java/mage/abilities/costs/common/ExileFromGraveCost.java index 0a518e03f9f..e3b234cb4e2 100644 --- a/Mage/src/main/java/mage/abilities/costs/common/ExileFromGraveCost.java +++ b/Mage/src/main/java/mage/abilities/costs/common/ExileFromGraveCost.java @@ -18,7 +18,6 @@ import mage.util.CardUtil; import java.util.ArrayList; import java.util.List; import java.util.UUID; -import java.util.stream.Collectors; /** * @author nantuko @@ -27,6 +26,7 @@ public class ExileFromGraveCost extends CostImpl { private final List exiledCards = new ArrayList<>(); private boolean setTargetPointer = false; + private boolean useSourceExileZone = true; public ExileFromGraveCost(TargetCardInYourGraveyard target) { target.withNotTarget(true); @@ -73,6 +73,7 @@ public class ExileFromGraveCost extends CostImpl { super(cost); this.exiledCards.addAll(cost.getExiledCards()); this.setTargetPointer = cost.setTargetPointer; + this.useSourceExileZone = cost.useSourceExileZone; } @Override @@ -90,11 +91,23 @@ public class ExileFromGraveCost extends CostImpl { } Cards cardsToExile = new CardsImpl(); cardsToExile.addAllCards(exiledCards); + + + UUID exileZoneId = null; + String exileZoneName = ""; + if (useSourceExileZone) { + exileZoneId = CardUtil.getExileZoneId(game, source); + exileZoneName = CardUtil.getSourceName(game, source); + } controller.moveCardsToExile( - cardsToExile.getCards(game), source, game, true, - CardUtil.getExileZoneId(game, source), - CardUtil.getSourceName(game, source) + cardsToExile.getCards(game), + source, + game, + true, + exileZoneId, + exileZoneName ); + if (setTargetPointer) { source.getEffects().setTargetPointer(new FixedTargets(cardsToExile.getCards(game), game)); } @@ -118,4 +131,12 @@ public class ExileFromGraveCost extends CostImpl { public List getExiledCards() { return exiledCards; } + + /** + * Put exiled cards to source zone, so next linked ability can find it + */ + public ExileFromGraveCost withSourceExileZone(boolean useSourceExileZone) { + this.useSourceExileZone = useSourceExileZone; + return this; + } } diff --git a/Mage/src/main/java/mage/abilities/keyword/DelveAbility.java b/Mage/src/main/java/mage/abilities/keyword/DelveAbility.java index f793e3e4ce8..e43fbecdeaa 100644 --- a/Mage/src/main/java/mage/abilities/keyword/DelveAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/DelveAbility.java @@ -63,10 +63,16 @@ public class DelveAbility extends SimpleStaticAbility implements AlternateManaPa private static final DynamicValue cardsInGraveyard = new CardsInControllerGraveyardCount(); - public DelveAbility() { + private boolean useSourceExileZone; + + /** + * @param useSourceExileZone - keep exiled cards in linked source zone, so next ability can find it + */ + public DelveAbility(boolean useSourceExileZone) { super(Zone.ALL, null); this.setRuleAtTheTop(true); this.addHint(new ValueHint("Cards in your graveyard", cardsInGraveyard)); + this.useSourceExileZone = useSourceExileZone; } protected DelveAbility(final DelveAbility ability) { @@ -101,8 +107,11 @@ public class DelveAbility extends SimpleStaticAbility implements AlternateManaPa unpaidAmount = 1; } specialAction.addCost(new ExileFromGraveCost(new TargetCardInYourGraveyard( - 0, Math.min(controller.getGraveyard().size(), unpaidAmount), - new FilterCard("cards from your graveyard"), true))); + 0, + Math.min(controller.getGraveyard().size(), unpaidAmount), + new FilterCard("cards from your graveyard"), + true + )).withSourceExileZone(this.useSourceExileZone)); if (specialAction.canActivate(source.getControllerId(), game).canActivate()) { game.getState().getSpecialActions().add(specialAction); }