diff --git a/Mage.Sets/src/mage/cards/d/DireBlunderbuss.java b/Mage.Sets/src/mage/cards/d/DireBlunderbuss.java new file mode 100644 index 00000000000..91249b76a42 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DireBlunderbuss.java @@ -0,0 +1,170 @@ +package mage.cards.d; + +import mage.abilities.Ability; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.common.delayed.ReflexiveTriggeredAbility; +import mage.abilities.costs.Cost; +import mage.abilities.costs.SacrificeCost; +import mage.abilities.costs.UseAttachedCost; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.effects.common.DamageWithPowerFromSourceToAnotherTargetEffect; +import mage.abilities.effects.common.DoWhenCostPaid; +import mage.abilities.effects.common.continuous.BoostEquippedEffect; +import mage.abilities.keyword.EquipAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.filter.common.FilterControlledArtifactPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.MageObjectReferencePredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.common.TargetCreaturePermanent; +import mage.target.targetpointer.FixedTarget; + +import java.util.UUID; + +/** + * @author Susucr + */ +public final class DireBlunderbuss extends CardImpl { + + public DireBlunderbuss(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, ""); + this.nightCard = true; + + this.subtype.add(SubType.EQUIPMENT); + this.color.setRed(true); + + // Equipped creature gets +3/+0 and has "Whenever this creature attacks, you may sacrifice an artifact other than Dire Blunderbuss. When you do, this creature deals damage equal to its power to target creature" + Ability ability = new SimpleStaticAbility(new BoostEquippedEffect(3, 3)); + ability.addEffect(new DireBlunderbussGainAbilityEffect()); + this.addAbility(ability); + + // Equip {1} + this.addAbility(new EquipAbility(1)); + } + + private DireBlunderbuss(final DireBlunderbuss card) { + super(card); + } + + @Override + public DireBlunderbuss copy() { + return new DireBlunderbuss(this); + } +} + +class DireBlunderbussGainAbilityEffect extends ContinuousEffectImpl { + + DireBlunderbussGainAbilityEffect() { + super(Duration.WhileOnBattlefield, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility); + staticText = "and has \"Whenever this creature attacks, you may sacrifice an artifact other than {this}. " + + "When you do, this creature deals damage equal to its power to target creature\""; + } + + protected DireBlunderbussGainAbilityEffect(final DireBlunderbussGainAbilityEffect effect) { + super(effect); + } + + @Override + public DireBlunderbussGainAbilityEffect copy() { + return new DireBlunderbussGainAbilityEffect(this); + } + + @Override + public void init(Ability source, Game game) { + super.init(source, game); + if (affectedObjectsSet) { + Permanent equipment = game.getPermanentOrLKIBattlefield(source.getSourceId()); + if (equipment != null && equipment.getAttachedTo() != null) { + this.setTargetPointer(new FixedTarget(equipment.getAttachedTo(), game.getState().getZoneChangeCounter(equipment.getAttachedTo()))); + } + } + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = null; + if (affectedObjectsSet) { + permanent = game.getPermanent(targetPointer.getFirst(game, source)); + if (permanent == null) { + discard(); + return true; + } + } else { + Permanent equipment = game.getPermanent(source.getSourceId()); + if (equipment != null && equipment.getAttachedTo() != null) { + permanent = game.getPermanentOrLKIBattlefield(equipment.getAttachedTo()); + } + } + if (permanent == null) { + return true; + } + Ability ability = makeAbility(game, source); + ability.getEffects().setValue("attachedPermanent", game.getPermanent(source.getSourceId())); + permanent.addAbility(ability, source.getSourceId(), game); + return true; + } + + protected Ability makeAbility(Game game, Ability source) { + ReflexiveTriggeredAbility reflexive = new ReflexiveTriggeredAbility( + new DamageWithPowerFromSourceToAnotherTargetEffect("this creature"), false + ); + reflexive.addTarget(new TargetCreaturePermanent()); + return new AttacksTriggeredAbility( + new DoWhenCostPaid( + reflexive, new DireBlunderbussSacrificeCost(source, game), + "Sacrifice an artifact other than the equipment?" + ), false + ); + } +} + +class DireBlunderbussSacrificeCost extends UseAttachedCost implements SacrificeCost { + + private final SacrificeTargetCost sacrificeCost; + + DireBlunderbussSacrificeCost(Ability source, Game game) { + super(); + this.setMageObjectReference(source, game); + FilterControlledArtifactPermanent filter = new FilterControlledArtifactPermanent(); + filter.add(Predicates.not(new MageObjectReferencePredicate(this.mageObjectReference))); + this.sacrificeCost = new SacrificeTargetCost(filter); + } + + private DireBlunderbussSacrificeCost(final DireBlunderbussSacrificeCost cost) { + super(cost); + this.sacrificeCost = cost.sacrificeCost.copy(); + } + + @Override + public boolean canPay(Ability ability, Ability source, UUID controllerId, Game game) { + return sacrificeCost.canPay(ability, source, controllerId, game); + } + + @Override + public boolean pay(Ability ability, Game game, Ability source, UUID controllerId, boolean noMana, Cost costToPay) { + if (mageObjectReference == null) { + return false; + } + Permanent permanent = game.getPermanent(source.getSourceId()); + if (permanent == null) { + return paid; + } + paid = sacrificeCost.pay(ability, game, source, controllerId, noMana, costToPay); + return paid; + } + + @Override + public DireBlunderbussSacrificeCost copy() { + return new DireBlunderbussSacrificeCost(this); + } + + @Override + public String getText() { + return "sacrifice an artifact other than " + this.name; + } +} diff --git a/Mage.Sets/src/mage/cards/d/DireFlail.java b/Mage.Sets/src/mage/cards/d/DireFlail.java new file mode 100644 index 00000000000..b85e4cfb4fe --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DireFlail.java @@ -0,0 +1,43 @@ +package mage.cards.d; + +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.continuous.BoostEquippedEffect; +import mage.abilities.keyword.CraftAbility; +import mage.abilities.keyword.EquipAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; + +import java.util.UUID; + +/** + * @author Susucr + */ +public final class DireFlail extends CardImpl { + + public DireFlail(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{R}"); + this.secondSideCardClazz = mage.cards.d.DireBlunderbuss.class; + + this.subtype.add(SubType.EQUIPMENT); + + // Equipped creature gets +2/+0. + this.addAbility(new SimpleStaticAbility(new BoostEquippedEffect(2, 0))); + + // Equip {1} + this.addAbility(new EquipAbility(1)); + + // Craft with artifact {3}{R}{R} + this.addAbility(new CraftAbility("{3}{R}{R}")); + } + + private DireFlail(final DireFlail card) { + super(card); + } + + @Override + public DireFlail copy() { + return new DireFlail(this); + } +} diff --git a/Mage.Sets/src/mage/sets/TheLostCavernsOfIxalan.java b/Mage.Sets/src/mage/sets/TheLostCavernsOfIxalan.java index a4948271fe2..7c843a7d6ed 100644 --- a/Mage.Sets/src/mage/sets/TheLostCavernsOfIxalan.java +++ b/Mage.Sets/src/mage/sets/TheLostCavernsOfIxalan.java @@ -92,6 +92,8 @@ public final class TheLostCavernsOfIxalan extends ExpansionSet { cards.add(new SetCardInfo("Didact Echo", 53, Rarity.COMMON, mage.cards.d.DidactEcho.class)); cards.add(new SetCardInfo("Digsite Conservator", 252, Rarity.UNCOMMON, mage.cards.d.DigsiteConservator.class)); cards.add(new SetCardInfo("Dinotomaton", 144, Rarity.COMMON, mage.cards.d.Dinotomaton.class)); + cards.add(new SetCardInfo("Dire Blunderbuss", 145, Rarity.RARE, mage.cards.d.DireBlunderbuss.class)); + cards.add(new SetCardInfo("Dire Flail", 145, Rarity.RARE, mage.cards.d.DireFlail.class)); cards.add(new SetCardInfo("Disruptor Wanderglyph", 253, Rarity.COMMON, mage.cards.d.DisruptorWanderglyph.class)); cards.add(new SetCardInfo("Dowsing Device", 146, Rarity.UNCOMMON, mage.cards.d.DowsingDevice.class)); cards.add(new SetCardInfo("Dreadmaw's Ire", 147, Rarity.UNCOMMON, mage.cards.d.DreadmawsIre.class));