From d370e7b4962a33cbd5baced051d38a0faf7c9d8a Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Wed, 30 Dec 2015 12:24:27 +0100 Subject: [PATCH] [OGW] Added support keyword and Shoulder to Shoulder. --- .../ShoulderToShoulder.java | 62 +++++++++++++ .../effects/keyword/SupportEffect.java | 92 +++++++++++++++++++ .../abilities/keyword/SupportAbility.java | 64 +++++++++++++ 3 files changed, 218 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/oathofthegatewatch/ShoulderToShoulder.java create mode 100644 Mage/src/main/java/mage/abilities/effects/keyword/SupportEffect.java create mode 100644 Mage/src/main/java/mage/abilities/keyword/SupportAbility.java diff --git a/Mage.Sets/src/mage/sets/oathofthegatewatch/ShoulderToShoulder.java b/Mage.Sets/src/mage/sets/oathofthegatewatch/ShoulderToShoulder.java new file mode 100644 index 0000000000..ceda4b5720 --- /dev/null +++ b/Mage.Sets/src/mage/sets/oathofthegatewatch/ShoulderToShoulder.java @@ -0,0 +1,62 @@ +/* + * 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.sets.oathofthegatewatch; + +import java.util.UUID; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.keyword.SupportEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author LevelX2 + */ +public class ShoulderToShoulder extends CardImpl { + + public ShoulderToShoulder(UUID ownerId) { + super(ownerId, 34, "Shoulder to Shoulder", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{2}{W}"); + this.expansionSetCode = "OGW"; + + // Support 2. + getSpellAbility().addEffect(new SupportEffect(this, 2)); + + // Draw a card. + getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1)); + } + + public ShoulderToShoulder(final ShoulderToShoulder card) { + super(card); + } + + @Override + public ShoulderToShoulder copy() { + return new ShoulderToShoulder(this); + } +} diff --git a/Mage/src/main/java/mage/abilities/effects/keyword/SupportEffect.java b/Mage/src/main/java/mage/abilities/effects/keyword/SupportEffect.java new file mode 100644 index 0000000000..9d33f9cf9b --- /dev/null +++ b/Mage/src/main/java/mage/abilities/effects/keyword/SupportEffect.java @@ -0,0 +1,92 @@ +/* + * 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.abilities.effects.keyword; + +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.common.StaticValue; +import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.cards.Card; +import mage.constants.CardType; +import mage.counters.CounterType; +import mage.filter.common.FilterCreaturePermanent; +import mage.target.common.TargetCreaturePermanent; +import mage.util.CardUtil; + +/** + * + * @author LevelX2 + */ +public class SupportEffect extends AddCountersTargetEffect { + + private final DynamicValue amountSupportTargets; + private boolean otherPermanent; + + public SupportEffect(Card card, int amount) { + this(new StaticValue(amount)); + if (card.getCardType().contains(CardType.INSTANT) || card.getCardType().contains(CardType.SORCERY)) { + otherPermanent = false; + card.getSpellAbility().addTarget(new TargetCreaturePermanent(0, amount, new FilterCreaturePermanent("target creatures"), false)); + } else { + otherPermanent = true; + } + } + + public SupportEffect(DynamicValue amount) { + super(CounterType.P1P1.createInstance(), new StaticValue(1)); + this.amountSupportTargets = amount; + this.staticText = setText(); + } + + public SupportEffect(final SupportEffect effect) { + super(effect); + this.amountSupportTargets = effect.amountSupportTargets; + } + + @Override + public SupportEffect copy() { + return new SupportEffect(this); + } + + private String setText() { + StringBuilder sb = new StringBuilder("support "); + if (amountSupportTargets instanceof StaticValue) { + sb.append(amountSupportTargets); + sb.append(". (Put a +1/+1 counter on each of up to "); + sb.append(CardUtil.numberToText(amountSupportTargets.toString())); + } else { + sb.append("X, where X is the number of "); + sb.append(amountSupportTargets.getMessage()); + sb.append(". (Put a +1/+1 counter on each of up to X"); + } + if (otherPermanent) { + sb.append(" other"); + } + sb.append(" target creatures.)"); + return sb.toString(); + } +} diff --git a/Mage/src/main/java/mage/abilities/keyword/SupportAbility.java b/Mage/src/main/java/mage/abilities/keyword/SupportAbility.java new file mode 100644 index 0000000000..a3290f90cd --- /dev/null +++ b/Mage/src/main/java/mage/abilities/keyword/SupportAbility.java @@ -0,0 +1,64 @@ +/* + * 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.abilities.keyword; + +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.effects.keyword.SupportEffect; +import mage.cards.Card; +import mage.constants.CardType; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.AnotherPredicate; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class SupportAbility extends EntersBattlefieldAbility { + + public SupportAbility(Card card, int amount) { + super(new SupportEffect(card, amount), false); + if (!card.getCardType().contains(CardType.INSTANT) && !card.getCardType().contains(CardType.SORCERY)) { + FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures"); + if (card.getCardType().contains(CardType.CREATURE)) { + filter.add(new AnotherPredicate()); + filter.setMessage("other target creatures"); + } + addTarget(new TargetCreaturePermanent(0, amount, filter, false)); + } + } + + public SupportAbility(final SupportAbility ability) { + super(ability); + } + + @Override + public SupportAbility copy() { + return new SupportAbility(this); + } +}