diff --git a/Mage.Sets/src/mage/cards/w/WillKenrith.java b/Mage.Sets/src/mage/cards/w/WillKenrith.java
new file mode 100644
index 00000000000..ce133b91d6b
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/w/WillKenrith.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.cards.w;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.LoyaltyAbility;
+import mage.abilities.common.CanBeYourCommanderAbility;
+import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility;
+import mage.abilities.effects.ContinuousEffect;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.DrawCardTargetEffect;
+import mage.abilities.effects.common.GetEmblemTargetPlayerEffect;
+import mage.abilities.effects.common.continuous.LoseAllAbilitiesTargetEffect;
+import mage.abilities.effects.common.continuous.SetPowerToughnessTargetEffect;
+import mage.abilities.effects.common.cost.SpellsCostReductionAllEffect;
+import mage.abilities.keyword.PartnerWithAbility;
+import mage.constants.SubType;
+import mage.constants.SuperType;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.filter.FilterCard;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.CardTypePredicate;
+import mage.filter.predicate.permanent.ControllerIdPredicate;
+import mage.game.Game;
+import mage.game.command.emblems.WillKenrithEmblem;
+import mage.target.TargetPlayer;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author TheElk801
+ */
+public class WillKenrith extends CardImpl {
+
+ public WillKenrith(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{4}{U}{U}");
+
+ this.addSuperType(SuperType.LEGENDARY);
+ this.subtype.add(SubType.WILL);
+ this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4));
+
+ // +2: Until your next turn, up to two target creatures each have base power and toughness 0/3 and lose all abilities.
+ Ability ability = new LoyaltyAbility(
+ new SetPowerToughnessTargetEffect(0, 3, Duration.EndOfTurn)
+ .setText("until end of turn, up to two target creatures each have base power and toughness 0/3"),
+ 2
+ );
+ ability.addEffect(new LoseAllAbilitiesTargetEffect(Duration.EndOfTurn)
+ .setText("and lose all abilities")
+ );
+ ability.addTarget(new TargetCreaturePermanent(0, 2));
+ this.addAbility(ability);
+
+ // -2: Target player draws two cards. Until your next turn, instant, sorcery, and planeswalker spells that player casts cost 2 less to cast.
+ ability = new LoyaltyAbility(new DrawCardTargetEffect(2), -2);
+ ability.addEffect(new WillKenrithCostReductionEffect());
+ ability.addTarget(new TargetPlayer());
+ this.addAbility(ability);
+
+ // -8: Target player gets an emblem with "Whenever you cast an instant or sorcery spell, copy it. You may choose new targets for the copy."
+ Effect effect = new GetEmblemTargetPlayerEffect(new WillKenrithEmblem());
+ effect.setText(
+ "Target player gets an emblem with "
+ + "\"Whenever you cast an instant or sorcery spell, "
+ + "copy it. You may choose new targets for the copy.\""
+ );
+ ability = new LoyaltyAbility(effect, -8);
+ ability.addTarget(new TargetPlayer());
+ this.addAbility(ability);
+
+ // Partner with Rowan Kenrith
+ this.addAbility(new PartnerWithAbility("Rowan Kenrith", true, false));
+
+ // Will Kenrith can be your commander.
+ this.addAbility(CanBeYourCommanderAbility.getInstance());
+ }
+
+ public WillKenrith(final WillKenrith card) {
+ super(card);
+ }
+
+ @Override
+ public WillKenrith copy() {
+ return new WillKenrith(this);
+ }
+}
+
+class WillKenrithCostReductionEffect extends OneShotEffect {
+
+ private static final FilterCard filter = new FilterCard();
+
+ static {
+ filter.add(Predicates.or(
+ new CardTypePredicate(CardType.INSTANT),
+ new CardTypePredicate(CardType.SORCERY),
+ new CardTypePredicate(CardType.PLANESWALKER)
+ ));
+ }
+
+ WillKenrithCostReductionEffect() {
+ super(Outcome.Benefit);
+ this.staticText = "Until your next turn, instant, sorcery, and planeswalker spells that player casts cost {2} less to cast.";
+ }
+
+ WillKenrithCostReductionEffect(final WillKenrithCostReductionEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public WillKenrithCostReductionEffect copy() {
+ return new WillKenrithCostReductionEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ FilterCard filter2 = filter.copy();
+ filter2.add(new ControllerIdPredicate(source.getFirstTarget()));
+ ContinuousEffect effect = new SpellsCostReductionAllEffect(filter2, 2);
+ effect.setDuration(Duration.UntilYourNextTurn);
+ game.addEffect(effect, source);
+ return true;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/Battlebond.java b/Mage.Sets/src/mage/sets/Battlebond.java
index 1f990612a7c..52eba020239 100644
--- a/Mage.Sets/src/mage/sets/Battlebond.java
+++ b/Mage.Sets/src/mage/sets/Battlebond.java
@@ -78,5 +78,6 @@ public class Battlebond extends ExpansionSet {
cards.add(new SetCardInfo("Soulblade Renewer", 18, Rarity.UNCOMMON, mage.cards.s.SoulbladeRenewer.class));
cards.add(new SetCardInfo("Spire Garden", 85, Rarity.RARE, mage.cards.s.SpireGarden.class));
cards.add(new SetCardInfo("Toothy, Imaginary Friend", 12, Rarity.RARE, mage.cards.t.ToothyImaginaryFriend.class));
+ cards.add(new SetCardInfo("Will Kenrith", 1, Rarity.MYTHIC, mage.cards.w.WillKenrith.class));
}
}
diff --git a/Mage/src/main/java/mage/abilities/effects/ContinuousEffect.java b/Mage/src/main/java/mage/abilities/effects/ContinuousEffect.java
index 51df5b855d2..04e7fdec34f 100644
--- a/Mage/src/main/java/mage/abilities/effects/ContinuousEffect.java
+++ b/Mage/src/main/java/mage/abilities/effects/ContinuousEffect.java
@@ -51,6 +51,8 @@ public interface ContinuousEffect extends Effect {
void discard();
+ void setDuration(Duration duration);
+
Duration getDuration();
long getOrder();
diff --git a/Mage/src/main/java/mage/abilities/effects/ContinuousEffectImpl.java b/Mage/src/main/java/mage/abilities/effects/ContinuousEffectImpl.java
index ac2720a3932..eab9194ed5c 100644
--- a/Mage/src/main/java/mage/abilities/effects/ContinuousEffectImpl.java
+++ b/Mage/src/main/java/mage/abilities/effects/ContinuousEffectImpl.java
@@ -112,6 +112,11 @@ public abstract class ContinuousEffectImpl extends EffectImpl implements Continu
this.characterDefining = effect.characterDefining;
}
+ @Override
+ public void setDuration(Duration duration) {
+ this.duration = duration;
+ }
+
@Override
public Duration getDuration() {
return duration;
diff --git a/Mage/src/main/java/mage/abilities/keyword/PartnerWithAbility.java b/Mage/src/main/java/mage/abilities/keyword/PartnerWithAbility.java
index 15daf1a2a58..63cbcf43438 100644
--- a/Mage/src/main/java/mage/abilities/keyword/PartnerWithAbility.java
+++ b/Mage/src/main/java/mage/abilities/keyword/PartnerWithAbility.java
@@ -50,15 +50,21 @@ public class PartnerWithAbility extends EntersBattlefieldTriggeredAbility {
private final String partnerName;
private final String shortName;
+ private final boolean hasReminderText;
public PartnerWithAbility(String partnerName) {
this(partnerName, false);
}
public PartnerWithAbility(String partnerName, boolean isLegendary) {
+ this(partnerName, isLegendary, true);
+ }
+
+ public PartnerWithAbility(String partnerName, boolean isLegendary, boolean hasReminderText) {
super(new PartnersWithSearchEffect(partnerName), false);
this.addTarget(new TargetPlayer());
this.partnerName = partnerName;
+ this.hasReminderText = hasReminderText;
if (isLegendary) {
this.shortName = shortenName(partnerName);
} else {
@@ -70,6 +76,7 @@ public class PartnerWithAbility extends EntersBattlefieldTriggeredAbility {
super(ability);
this.partnerName = ability.partnerName;
this.shortName = ability.shortName;
+ this.hasReminderText = ability.hasReminderText;
}
@Override
@@ -79,9 +86,13 @@ public class PartnerWithAbility extends EntersBattlefieldTriggeredAbility {
@Override
public String getRule() {
- return "Partner with " + partnerName
- + " (When this creature enters the battlefield, target player may put " + shortName
- + " into their hand from their library, then shuffle.)";
+ if (hasReminderText) {
+ return "Partner with " + partnerName
+ + " (When this creature enters the battlefield, target player may put " + shortName
+ + " into their hand from their library, then shuffle.)";
+ } else {
+ return "Partner with " + partnerName;
+ }
}
public String getPartnerName() {
diff --git a/Mage/src/main/java/mage/constants/SubType.java b/Mage/src/main/java/mage/constants/SubType.java
index 05f7f08e477..7d81951dcc9 100644
--- a/Mage/src/main/java/mage/constants/SubType.java
+++ b/Mage/src/main/java/mage/constants/SubType.java
@@ -401,6 +401,7 @@ public enum SubType {
UGIN("Ugin", SubTypeSet.PlaneswalkerType),
VENSER("Venser", SubTypeSet.PlaneswalkerType),
VRASKA("Vraska", SubTypeSet.PlaneswalkerType),
+ WILL("Will", SubTypeSet.PlaneswalkerType),
XENAGOS("Xenagos", SubTypeSet.PlaneswalkerType),
YANGGU("Yanggu", SubTypeSet.PlaneswalkerType),
YANLING("Yanling", SubTypeSet.PlaneswalkerType),
diff --git a/Mage/src/main/java/mage/game/command/emblems/WillKenrithEmblem.java b/Mage/src/main/java/mage/game/command/emblems/WillKenrithEmblem.java
new file mode 100644
index 00000000000..6d89f2e22c5
--- /dev/null
+++ b/Mage/src/main/java/mage/game/command/emblems/WillKenrithEmblem.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ..AS IS.. AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.game.command.emblems;
+
+import mage.abilities.common.SpellCastControllerTriggeredAbility;
+import mage.abilities.effects.common.CopyTargetSpellEffect;
+import mage.constants.Zone;
+import mage.filter.StaticFilters;
+import mage.game.command.Emblem;
+
+/**
+ *
+ * @author spjspj
+ */
+public class WillKenrithEmblem extends Emblem {
+ // Target player gets an emblem with "Whenever you cast an instant or sorcery spell, copy it. You may choose new targets for the copy."
+
+ public WillKenrithEmblem() {
+ this.setName("Emblem Will Kenrith");
+ this.getAbilities().add(new SpellCastControllerTriggeredAbility(
+ Zone.COMMAND,
+ new CopyTargetSpellEffect(true)
+ .setText("copy that spell. You may choose new targets for the copy"),
+ StaticFilters.FILTER_INSTANT_OR_SORCERY_SPELL,
+ false,
+ true
+ ));
+ }
+}