From d645c1a5d80cf1a368c5f1a018b2bf4bd96f7746 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 21 May 2018 19:59:17 -0400 Subject: [PATCH] Implemented Will Kenrith --- Mage.Sets/src/mage/cards/w/WillKenrith.java | 154 ++++++++++++++++++ Mage.Sets/src/mage/sets/Battlebond.java | 1 + .../abilities/effects/ContinuousEffect.java | 2 + .../effects/ContinuousEffectImpl.java | 5 + .../abilities/keyword/PartnerWithAbility.java | 17 +- .../src/main/java/mage/constants/SubType.java | 1 + .../command/emblems/WillKenrithEmblem.java | 54 ++++++ 7 files changed, 231 insertions(+), 3 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/w/WillKenrith.java create mode 100644 Mage/src/main/java/mage/game/command/emblems/WillKenrithEmblem.java 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 + )); + } +}