From 81d5d4145a6fa400259acf36e7a93691bbe05888 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Wed, 18 Mar 2015 23:11:44 +0100 Subject: [PATCH] [DTK] Added Death Wind, Dragon Hunter and Qarsi Deceiver. --- .../mage/sets/dragonsoftarkir/DeathWind.java | 54 +++++++++ .../sets/dragonsoftarkir/DragonHunter.java | 103 ++++++++++++++++ .../sets/dragonsoftarkir/QarsiDeceiver.java | 111 ++++++++++++++++++ .../mage/abilities/keyword/FlyingAbility.java | 5 +- .../mage/constants/AsThoughEffectType.java | 1 + 5 files changed, 273 insertions(+), 1 deletion(-) create mode 100644 Mage.Sets/src/mage/sets/dragonsoftarkir/DeathWind.java create mode 100644 Mage.Sets/src/mage/sets/dragonsoftarkir/DragonHunter.java create mode 100644 Mage.Sets/src/mage/sets/dragonsoftarkir/QarsiDeceiver.java diff --git a/Mage.Sets/src/mage/sets/dragonsoftarkir/DeathWind.java b/Mage.Sets/src/mage/sets/dragonsoftarkir/DeathWind.java new file mode 100644 index 0000000000..c3c50fdd58 --- /dev/null +++ b/Mage.Sets/src/mage/sets/dragonsoftarkir/DeathWind.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.sets.dragonsoftarkir; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author LevelX2 + */ +public class DeathWind extends mage.sets.avacynrestored.DeathWind { + + public DeathWind(UUID ownerId) { + super(ownerId); + this.cardNumber = 95; + this.expansionSetCode = "DTK"; + this.rarity = Rarity.UNCOMMON; + } + + public DeathWind(final DeathWind card) { + super(card); + } + + @Override + public DeathWind copy() { + return new DeathWind(this); + } +} diff --git a/Mage.Sets/src/mage/sets/dragonsoftarkir/DragonHunter.java b/Mage.Sets/src/mage/sets/dragonsoftarkir/DragonHunter.java new file mode 100644 index 0000000000..105a178389 --- /dev/null +++ b/Mage.Sets/src/mage/sets/dragonsoftarkir/DragonHunter.java @@ -0,0 +1,103 @@ +/* + * 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.dragonsoftarkir; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.AsThoughEffectImpl; +import mage.abilities.keyword.ProtectionAbility; +import mage.cards.CardImpl; +import mage.constants.AsThoughEffectType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.game.Game; + +/** + * + * @author LevelX2 + */ +public class DragonHunter extends CardImpl { + + public DragonHunter(UUID ownerId) { + super(ownerId, 10, "Dragon Hunter", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{W}"); + this.expansionSetCode = "DTK"; + this.subtype.add("Human"); + this.subtype.add("Warrior"); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // Protection from Dragons + this.addAbility(new ProtectionAbility(new FilterPermanent("Dragon", "Dragons"))); + + // Dragon Hunter can block Dragons as though it had reach. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CanBlockDragonsAsThoughtIthadReachEffect(Duration.WhileOnBattlefield))); + + } + + public DragonHunter(final DragonHunter card) { + super(card); + } + + @Override + public DragonHunter copy() { + return new DragonHunter(this); + } +} +class CanBlockDragonsAsThoughtIthadReachEffect extends AsThoughEffectImpl { + + public CanBlockDragonsAsThoughtIthadReachEffect(Duration duration) { + super(AsThoughEffectType.BLOCK_DRAGON, duration, Outcome.Benefit); + staticText = "{this} can block Dragons as though it had reach"; + } + + public CanBlockDragonsAsThoughtIthadReachEffect(final CanBlockDragonsAsThoughtIthadReachEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public CanBlockDragonsAsThoughtIthadReachEffect copy() { + return new CanBlockDragonsAsThoughtIthadReachEffect(this); + } + + @Override + public boolean applies(UUID sourceId, Ability source, UUID affectedControllerId, Game game) { + return sourceId.equals(source.getSourceId()); + } + +} diff --git a/Mage.Sets/src/mage/sets/dragonsoftarkir/QarsiDeceiver.java b/Mage.Sets/src/mage/sets/dragonsoftarkir/QarsiDeceiver.java new file mode 100644 index 0000000000..082ab5fbe6 --- /dev/null +++ b/Mage.Sets/src/mage/sets/dragonsoftarkir/QarsiDeceiver.java @@ -0,0 +1,111 @@ +/* + * 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.dragonsoftarkir; + +import java.util.UUID; +import mage.ConditionalMana; +import mage.MageInt; +import mage.MageObject; +import mage.Mana; +import mage.abilities.Ability; +import mage.abilities.common.TurnFaceUpAbility; +import mage.abilities.condition.Condition; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.mana.ConditionalColorlessManaAbility; +import mage.abilities.mana.builder.ConditionalManaBuilder; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.game.Game; +import mage.game.stack.Spell; + +/** + * + * @author LevelX2 + */ +public class QarsiDeceiver extends CardImpl { + + public QarsiDeceiver(UUID ownerId) { + super(ownerId, 71, "Qarsi Deceiver", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{U}"); + this.expansionSetCode = "DTK"; + this.subtype.add("Naga"); + this.subtype.add("Wizard"); + this.power = new MageInt(0); + this.toughness = new MageInt(4); + + // {T}: Add {1} to your mana pool. Spend this mana only to cast a face-down creature spell, pay a mana cost to turn a manifested creature face up, or pay a morph cost. + this.addAbility(new ConditionalColorlessManaAbility(new TapSourceCost(), 1, new QarsiDeceiverManaBuilder())); + } + + public QarsiDeceiver(final QarsiDeceiver card) { + super(card); + } + + @Override + public QarsiDeceiver copy() { + return new QarsiDeceiver(this); + } +} + +class QarsiDeceiverManaBuilder extends ConditionalManaBuilder { + + @Override + public ConditionalMana build(Object... options) { + return new QarsiDeceiverConditionalMana(this.mana); + } + + @Override + public String getRule() { + return "Spend this mana only to cast a face-down creature spell, pay a mana cost to turn a manifested creature face up, or pay a morph cost. (A megamorph cost is a morph cost.)"; + } +} + +class QarsiDeceiverConditionalMana extends ConditionalMana { + + public QarsiDeceiverConditionalMana(Mana mana) { + super(mana); + addCondition(new QarsiDeceiverManaCondition()); + } +} + +class QarsiDeceiverManaCondition implements Condition { + + @Override + public boolean apply(Game game, Ability source) { + MageObject object = game.getObject(source.getSourceId()); + if (object instanceof Spell) { + if (((Spell) object).isFaceDown(game)) { + return true; + } + } + if (source instanceof TurnFaceUpAbility) { + return true; + } + return false; + } +} diff --git a/Mage/src/mage/abilities/keyword/FlyingAbility.java b/Mage/src/mage/abilities/keyword/FlyingAbility.java index fee064e4dc..0cc5d45fac 100644 --- a/Mage/src/mage/abilities/keyword/FlyingAbility.java +++ b/Mage/src/mage/abilities/keyword/FlyingAbility.java @@ -37,6 +37,7 @@ import mage.game.Game; import mage.game.permanent.Permanent; import java.io.ObjectStreamException; +import mage.constants.AsThoughEffectType; /** * @@ -87,7 +88,9 @@ class FlyingEffect extends RestrictionEffect implements MageSingleton { @Override public boolean canBeBlocked(Permanent attacker, Permanent blocker, Ability source, Game game) { - return blocker.getAbilities().containsKey(FlyingAbility.getInstance().getId()) || blocker.getAbilities().containsKey(ReachAbility.getInstance().getId()); + return blocker.getAbilities().containsKey(FlyingAbility.getInstance().getId()) + || blocker.getAbilities().containsKey(ReachAbility.getInstance().getId()) + || (game.getContinuousEffects().asThough(blocker.getId(), AsThoughEffectType.BLOCK_DRAGON, source, blocker.getControllerId(), game) && attacker.hasSubtype("Dragon")) ; } @Override diff --git a/Mage/src/mage/constants/AsThoughEffectType.java b/Mage/src/mage/constants/AsThoughEffectType.java index b7fb0738aa..66f09ee240 100644 --- a/Mage/src/mage/constants/AsThoughEffectType.java +++ b/Mage/src/mage/constants/AsThoughEffectType.java @@ -9,6 +9,7 @@ public enum AsThoughEffectType { ACTIVATE_HASTE, BLOCK_TAPPED, BLOCK_SHADOW, + BLOCK_DRAGON, BE_BLOCKED, PLAY_FROM_NON_HAND_ZONE, CAST_AS_INSTANT,