diff --git a/Mage.Sets/src/mage/sets/theros/PolukranosWorldEater.java b/Mage.Sets/src/mage/sets/theros/PolukranosWorldEater.java new file mode 100644 index 0000000000..121533e53f --- /dev/null +++ b/Mage.Sets/src/mage/sets/theros/PolukranosWorldEater.java @@ -0,0 +1,155 @@ +/* + * 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.theros; + +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.BecomesMonstrousSourceTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.MonstrosityAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.ControllerPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.Target; +import mage.target.common.TargetCreaturePermanentAmount; + +/** + * + * * The value of X in Polukranos’s last ability is equal to the value chosen + * for X when its activated ability was activated. + * + * * The number of targets chosen for the triggered ability must be at least one + * (if X wasn’t 0) and at most X. You choose the division of damage as you put + * the ability on the stack, not as it resolves. Each target must be assigned + * at least 1 damage. In multiplayer games, you may choose creatures controlled + * by different opponents. + * + * * If some, but not all, of the ability’s targets become illegal, you can’t change + * the division of damage. Damage that would’ve been dealt to illegal targets + * simply isn’t dealt. + * + * * As Polukranos’s triggered ability resolves, Polukranos deals damage first, then + * the target creatures do. Although no creature will die until after the ability + * finishes resolving, the order could matter if Polukranos has wither or infect. + * + * @author LevelX2 + */ +public class PolukranosWorldEater extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(); + static { + filter.add(new ControllerPredicate(TargetController.OPPONENT)); + } + + public PolukranosWorldEater(UUID ownerId) { + super(ownerId, 172, "Polukranos, World Eater", Rarity.MYTHIC, new CardType[]{CardType.CREATURE}, "{2}{G}{G}"); + this.expansionSetCode = "THS"; + this.supertype.add("Legendary"); + this.subtype.add("Hydra"); + + this.color.setGreen(true); + this.power = new MageInt(5); + this.toughness = new MageInt(5); + + // {X}{X}{G}: Monstrosity X. + this.addAbility(new MonstrosityAbility("{X}{X}{G}", Integer.MAX_VALUE)); + // When Polukranos, World Eater becomes monstrous, it deals X damage divided as you choose among any number of target creatures your opponents control. Each of those creatures deals damage equal to its power to Polukranos. + Ability ability = new BecomesMonstrousSourceTriggeredAbility(new PolukranosWorldEaterEffect()); + ability.addTarget(new TargetCreaturePermanentAmount(1, filter)); + this.addAbility(ability); + + } + + @Override + public void adjustTargets(Ability ability, Game game) { + if (ability instanceof BecomesMonstrousSourceTriggeredAbility) { + int xValue = ((BecomesMonstrousSourceTriggeredAbility) ability).getMonstrosityValue(); + ability.getTargets().clear(); + ability.addTarget(new TargetCreaturePermanentAmount(xValue, filter)); + } + } + + public PolukranosWorldEater(final PolukranosWorldEater card) { + super(card); + } + + @Override + public PolukranosWorldEater copy() { + return new PolukranosWorldEater(this); + } +} + +class PolukranosWorldEaterEffect extends OneShotEffect { + + public PolukranosWorldEaterEffect() { + super(Outcome.Benefit); + this.staticText = "it deals X damage divided as you choose among any number of target creatures your opponents control. Each of those creatures deals damage equal to its power to Polukranos"; + } + + public PolukranosWorldEaterEffect(final PolukranosWorldEaterEffect effect) { + super(effect); + } + + @Override + public PolukranosWorldEaterEffect copy() { + return new PolukranosWorldEaterEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + if (source.getTargets().size() > 0) { + Target multiTarget = source.getTargets().get(0); + Set permanents = new HashSet(); + for (UUID target: multiTarget.getTargets()) { + Permanent permanent = game.getPermanent(target); + if (permanent != null) { + permanents.add(permanent); + permanent.damage(multiTarget.getTargetAmount(target), source.getSourceId(), game, true, false); + } + } + // Each of those creatures deals damage equal to its power to Polukranos + Permanent sourceCreature = game.getPermanent(source.getSourceId()); + if (sourceCreature != null) { + for (Permanent permanent :permanents) { + sourceCreature.damage(permanent.getPower().getValue(), source.getSourceId(), game, true, false); + } + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/theros/TimeToFeed.java b/Mage.Sets/src/mage/sets/theros/TimeToFeed.java new file mode 100644 index 0000000000..6cc1e8f099 --- /dev/null +++ b/Mage.Sets/src/mage/sets/theros/TimeToFeed.java @@ -0,0 +1,151 @@ + +/* + * 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.theros; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.DelayedTriggeredAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.FightTargetsEffect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.ControllerPredicate; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.ZoneChangeEvent; +import mage.target.Target; +import mage.target.common.TargetControlledCreaturePermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * Time to Feed has two targets: a creature an opponent controls and a creature you control. + * If only one of those creatures is a legal target when Time to Feed tries to resolve, the + * creatures won’t fight and neither will deal or be dealt damage. However, you’ll still gain + * 3 life when the creature you don’t control dies that turn, even if it was the illegal target as Time to Feed resolved. + * If neither creature is a legal target when Time to Feed tries to resolve, the spell will + * be countered and none of its effects will happen. + * If the first target creature dies that turn, you’ll gain 3 life no matter what caused the creature to die or who controls the creature at that time. + * + * @author LevelX2 + */ +public class TimeToFeed extends CardImpl { + + private static final FilterCreaturePermanent filter1 = new FilterCreaturePermanent("creature an opponent controls"); + static { + filter1.add(new ControllerPredicate(TargetController.OPPONENT)); + } + + public TimeToFeed(UUID ownerId) { + super(ownerId, 181, "Time to Feed", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{2}{G}"); + this.expansionSetCode = "THS"; + + this.color.setGreen(true); + + // Choose target creature an opponent controls. When that creature dies this turn, you gain 3 life. Target creature you control fights that creature. + this.getSpellAbility().addEffect(new TimeToFeedTextEffect()); + Target target = new TargetCreaturePermanent(filter1); + target.setRequired(true); + this.getSpellAbility().addTarget(target); + this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent(true)); + this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(new TimeToFeedDiesTargetTriggeredAbility())); + Effect effect = new FightTargetsEffect(); + effect.setText("Target creature you control fights that creature"); + this.getSpellAbility().addEffect(effect); + } + + public TimeToFeed(final TimeToFeed card) { + super(card); + } + + @Override + public TimeToFeed copy() { + return new TimeToFeed(this); + } +} + +class TimeToFeedTextEffect extends OneShotEffect { + + public TimeToFeedTextEffect() { + super(Outcome.Detriment); + this.staticText = "Choose target creature an opponent controls"; + } + + public TimeToFeedTextEffect(final TimeToFeedTextEffect effect) { + super(effect); + } + + @Override + public TimeToFeedTextEffect copy() { + return new TimeToFeedTextEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } +} + +class TimeToFeedDiesTargetTriggeredAbility extends DelayedTriggeredAbility { + + public TimeToFeedDiesTargetTriggeredAbility() { + super(new GainLifeEffect(3), Duration.EndOfTurn, false); + } + + public TimeToFeedDiesTargetTriggeredAbility(final TimeToFeedDiesTargetTriggeredAbility ability) { + super(ability); + } + + @Override + public TimeToFeedDiesTargetTriggeredAbility copy() { + return new TimeToFeedDiesTargetTriggeredAbility(this); + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (event.getType() == GameEvent.EventType.ZONE_CHANGE && ((ZoneChangeEvent)event).isDiesEvent()) { + if (event.getTargetId().equals(getEffects().get(0).getTargetPointer().getFirst(game, this))) { + return true; + } + } + return false; + } + + @Override + public String getRule() { + return "When that creature dies this turn, " + super.getRule(); + } +}