From 02f4e39418c8c374d65a5a2298ccdcb7d8c84bd2 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Mon, 3 Jun 2019 14:06:12 +0400 Subject: [PATCH] [MH1] added Face of Divinity --- .../src/mage/cards/f/FaceOfDivinity.java | 92 +++++++++++++++++++ Mage.Sets/src/mage/sets/ModernHorizons.java | 1 + .../cards/conditional/FaceOfDivinityTest.java | 45 +++++++++ 3 files changed, 138 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/f/FaceOfDivinity.java create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/conditional/FaceOfDivinityTest.java diff --git a/Mage.Sets/src/mage/cards/f/FaceOfDivinity.java b/Mage.Sets/src/mage/cards/f/FaceOfDivinity.java new file mode 100644 index 00000000000..04ea540252a --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FaceOfDivinity.java @@ -0,0 +1,92 @@ +package mage.cards.f; + +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.Condition; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.abilities.keyword.LifelinkAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author JayDi85 + */ +public final class FaceOfDivinity extends CardImpl { + + public FaceOfDivinity(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{W}"); + this.subtype.add(SubType.AURA); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // Enchanted creature gets +2/+2. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(2, 2, Duration.WhileOnBattlefield))); + + // As long as another Aura is attached to enchanted creature, it has first strike and lifelink. + Effect effect1 = new ConditionalContinuousEffect(new GainAbilityAttachedEffect(FirstStrikeAbility.getInstance(), AttachmentType.AURA), + FaceOfDivinityCondition.instance, "As long as another Aura is attached to enchanted creature, it has first strike"); + Effect effect2 = new ConditionalContinuousEffect(new GainAbilityAttachedEffect(LifelinkAbility.getInstance(), AttachmentType.AURA), + FaceOfDivinityCondition.instance, "and lifelink"); + Ability abilityBoost = new SimpleStaticAbility(Zone.BATTLEFIELD, effect1); + abilityBoost.addEffect(effect2); + this.addAbility(abilityBoost); + } + + public FaceOfDivinity(final FaceOfDivinity card) { + super(card); + } + + @Override + public FaceOfDivinity copy() { + return new FaceOfDivinity(this); + } + +} + +enum FaceOfDivinityCondition implements Condition { + + instance; + + @Override + public boolean apply(Game game, Ability source) { + Permanent currentAura = game.getPermanent(source.getSourceId()); + if (currentAura != null && currentAura.getAttachedTo() != null) { + Permanent permanent = game.getPermanent(currentAura.getAttachedTo()); + if (permanent != null && permanent.getAttachments().size() > 0) { + for (UUID id : permanent.getAttachments()) { + Permanent otherAura = game.getPermanent(id); + if (otherAura != null && !otherAura.getId().equals(currentAura.getId()) + && otherAura.getSubtype(game).contains(SubType.AURA)) { + return true; + } + } + } + } + return false; + } + + @Override + public String toString() { + return "another Aura is attached to enchanted creature"; + } +} + + diff --git a/Mage.Sets/src/mage/sets/ModernHorizons.java b/Mage.Sets/src/mage/sets/ModernHorizons.java index 37b8dfcfd37..0f97e04621b 100644 --- a/Mage.Sets/src/mage/sets/ModernHorizons.java +++ b/Mage.Sets/src/mage/sets/ModernHorizons.java @@ -78,6 +78,7 @@ public final class ModernHorizons extends ExpansionSet { cards.add(new SetCardInfo("Excavating Anurid", 163, Rarity.COMMON, mage.cards.e.ExcavatingAnurid.class)); cards.add(new SetCardInfo("Exclude", 48, Rarity.UNCOMMON, mage.cards.e.Exclude.class)); cards.add(new SetCardInfo("Eyekite", 49, Rarity.COMMON, mage.cards.e.Eyekite.class)); + cards.add(new SetCardInfo("Face of Divinity", 8, Rarity.UNCOMMON, mage.cards.f.FaceOfDivinity.class)); cards.add(new SetCardInfo("Fact or Fiction", 50, Rarity.UNCOMMON, mage.cards.f.FactOrFiction.class)); cards.add(new SetCardInfo("Faerie Seer", 51, Rarity.COMMON, mage.cards.f.FaerieSeer.class)); cards.add(new SetCardInfo("Fallen Shinobi", 199, Rarity.RARE, mage.cards.f.FallenShinobi.class)); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/conditional/FaceOfDivinityTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/conditional/FaceOfDivinityTest.java new file mode 100644 index 00000000000..026e4e6992e --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/conditional/FaceOfDivinityTest.java @@ -0,0 +1,45 @@ +package org.mage.test.cards.conditional; + +import mage.abilities.keyword.FirstStrikeAbility; +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * @author JayDi85 + */ +public class FaceOfDivinityTest extends CardTestPlayerBase { + + @Test + public void test_BoostCondition() { + // Enchanted creature gets +2/+2. + // As long as another Aura is attached to enchanted creature, it has first strike and lifelink. + addCard(Zone.HAND, playerA, "Face of Divinity", 1); // {2}{W} + addCard(Zone.BATTLEFIELD, playerA, "Plains", 3); + // + addCard(Zone.BATTLEFIELD, playerA, "Balduvian Bears", 1); // 2/2 + // + // Enchanted creature gets +1/+0 and can’t be blocked. + addCard(Zone.HAND, playerA, "Aether Tunnel", 1); // {1}{U} + addCard(Zone.BATTLEFIELD, playerA, "Island", 2); + + // attach without extra boost + activateManaAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Add {W}"); + activateManaAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Add {W}"); + activateManaAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Add {W}"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Face of Divinity", "Balduvian Bears"); + checkPT("boost 1", 1, PhaseStep.BEGIN_COMBAT, playerA, "Balduvian Bears", 2 + 2, 2 + 2); + checkAbility("boost 1", 1, PhaseStep.BEGIN_COMBAT, playerA, "Balduvian Bears", FirstStrikeAbility.class, false); + + // attach aura and get full boost + castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Aether Tunnel", "Balduvian Bears"); + checkPT("boost 2", 1, PhaseStep.END_TURN, playerA, "Balduvian Bears", 2 + 2 + 1, 2 + 2); + checkAbility("boost 2", 1, PhaseStep.END_TURN, playerA, "Balduvian Bears", FirstStrikeAbility.class, true); + + setStopAt(1, PhaseStep.END_TURN); + setStrictChooseMode(true); + execute(); + assertAllCommandsUsed(); + } +}