diff --git a/Mage.Sets/src/mage/sets/arabiannights/NafsAsp.java b/Mage.Sets/src/mage/sets/arabiannights/NafsAsp.java new file mode 100644 index 00000000000..810922c640c --- /dev/null +++ b/Mage.Sets/src/mage/sets/arabiannights/NafsAsp.java @@ -0,0 +1,69 @@ +/* + * 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.arabiannights; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.DealsDamageToAPlayerTriggeredAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.LoseLifeTargetEffect; +import mage.abilities.effects.common.UnlessPaysDelayedEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.PhaseStep; +import mage.constants.Rarity; + +/** + * + * @author LoneFox + */ +public class NafsAsp extends CardImpl { + + public NafsAsp(UUID ownerId) { + super(ownerId, 36, "Nafs Asp", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{G}"); + this.expansionSetCode = "ARN"; + this.subtype.add("Snake"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Whenever Nafs Asp deals damage to a player, that player loses 1 life at the beginning of his or her next draw step unless he or she pays {1} before that draw step. + this.addAbility(new DealsDamageToAPlayerTriggeredAbility(new UnlessPaysDelayedEffect( + new ManaCostsImpl("{1}"), new LoseLifeTargetEffect(1), PhaseStep.DRAW, true, + "that player loses 1 life at the beginning of his or her next draw step unless he or she pays {1} before that draw step."), + false, true)); + } + + public NafsAsp(final NafsAsp card) { + super(card); + } + + @Override + public NafsAsp copy() { + return new NafsAsp(this); + } +} diff --git a/Mage.Sets/src/mage/sets/conflux/QuenchableFire.java b/Mage.Sets/src/mage/sets/conflux/QuenchableFire.java index 881d4bbb18a..98ecf9f98a2 100644 --- a/Mage.Sets/src/mage/sets/conflux/QuenchableFire.java +++ b/Mage.Sets/src/mage/sets/conflux/QuenchableFire.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,7 +20,7 @@ * 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. @@ -29,23 +29,13 @@ package mage.sets.conflux; import java.util.UUID; -import mage.MageObject; -import mage.abilities.Ability; -import mage.abilities.DelayedTriggeredAbility; -import mage.abilities.SpecialAction; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.Effect; -import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DamageTargetEffect; -import mage.abilities.effects.common.RemoveDelayedTriggeredAbilityEffect; -import mage.abilities.effects.common.RemoveSpecialActionEffect; +import mage.abilities.effects.common.UnlessPaysDelayedEffect; import mage.cards.CardImpl; import mage.constants.CardType; -import mage.constants.Outcome; +import mage.constants.PhaseStep; import mage.constants.Rarity; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; import mage.target.TargetPlayer; /** @@ -59,10 +49,12 @@ public class QuenchableFire extends CardImpl { this.expansionSetCode = "CON"; // Quenchable Fire deals 3 damage to target player. - // It deals an additional 3 damage to that player at the beginning of your next upkeep step unless he or she pays {U} before that step. this.getSpellAbility().addTarget(new TargetPlayer()); this.getSpellAbility().addEffect(new DamageTargetEffect(3)); - this.getSpellAbility().addEffect(new QuenchableFireEffect()); + // It deals an additional 3 damage to that player at the beginning of your next upkeep step unless he or she pays {U} before that step. + this.getSpellAbility().addEffect(new UnlessPaysDelayedEffect(new ManaCostsImpl("{U}"), + new DamageTargetEffect(3, true, "that player"), PhaseStep.UPKEEP, false, + "It deals an additional 3 damage to that player at the beginning of your next upkeep step unless he or she pays {U} before that step.")); } public QuenchableFire(final QuenchableFire card) { @@ -74,112 +66,3 @@ public class QuenchableFire extends CardImpl { return new QuenchableFire(this); } } - -class QuenchableFireEffect extends OneShotEffect { - - public QuenchableFireEffect() { - super(Outcome.Damage); - staticText = "{this} deals an additional 3 damage to that player at the beginning of your next upkeep step unless he or she pays {U} before that step." - + "
Use the Special button to pay the {U} with a special action before the beginning of your next upkeep step."; - } - - public QuenchableFireEffect(final QuenchableFireEffect effect) { - super(effect); - } - - @Override - public QuenchableFireEffect copy() { - return new QuenchableFireEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - MageObject sourceObject = source.getSourceObject(game); - if (sourceObject != null) { - - //create special action - QuenchableFireSpecialAction newAction = new QuenchableFireSpecialAction(); - - //create delayed triggered ability - QuenchableFireDelayedTriggeredAbility delayedAbility = new QuenchableFireDelayedTriggeredAbility(); - delayedAbility.setSourceId(source.getSourceId()); - delayedAbility.setControllerId(source.getControllerId()); - delayedAbility.setSourceObject(sourceObject, game); - delayedAbility.getTargets().addAll(source.getTargets()); - delayedAbility.setSpecialActionId(newAction.getId()); - UUID delayedAbilityId = game.addDelayedTriggeredAbility(delayedAbility); - - // update special action - newAction.addCost(new ManaCostsImpl("{U}")); - Effect effect = new RemoveDelayedTriggeredAbilityEffect(delayedAbilityId); - newAction.addEffect(effect); - effect.setText(sourceObject.getIdName() + " - Pay {U} to remove the triggered ability that deals 3 damage to you at the beginning of your next upkeep step"); - newAction.addEffect(new RemoveSpecialActionEffect(newAction.getId())); - newAction.setSourceId(source.getSourceId()); - newAction.setControllerId(source.getFirstTarget()); - newAction.getTargets().addAll(source.getTargets()); - game.getState().getSpecialActions().add(newAction); - return true; - } - return false; - } - -} - -class QuenchableFireDelayedTriggeredAbility extends DelayedTriggeredAbility { - - private UUID specialActionId; - - public QuenchableFireDelayedTriggeredAbility() { - super(new DamageTargetEffect(3)); - } - - public void setSpecialActionId(UUID specialActionId) { - this.specialActionId = specialActionId; - } - - public QuenchableFireDelayedTriggeredAbility(final QuenchableFireDelayedTriggeredAbility ability) { - super(ability); - } - - @Override - public QuenchableFireDelayedTriggeredAbility copy() { - return new QuenchableFireDelayedTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == EventType.UPKEEP_STEP_PRE; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (event.getPlayerId().equals(this.controllerId)) { - for (SpecialAction action: game.getState().getSpecialActions()) { - if (action.getId().equals(specialActionId)) { - game.getState().getSpecialActions().remove(action); - break; - } - } - return true; - } - return false; - } - -} - -class QuenchableFireSpecialAction extends SpecialAction { - - public QuenchableFireSpecialAction() { - super(); - } - - public QuenchableFireSpecialAction(final QuenchableFireSpecialAction ability) { - super(ability); - } - - @Override - public QuenchableFireSpecialAction copy() { - return new QuenchableFireSpecialAction(this); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/fourthedition/NafsAsp.java b/Mage.Sets/src/mage/sets/fourthedition/NafsAsp.java new file mode 100644 index 00000000000..34c8f18ad57 --- /dev/null +++ b/Mage.Sets/src/mage/sets/fourthedition/NafsAsp.java @@ -0,0 +1,52 @@ +/* + * 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.fourthedition; + +import java.util.UUID; + +/** + * + * @author LoneFox + */ +public class NafsAsp extends mage.sets.arabiannights.NafsAsp { + + public NafsAsp(UUID ownerId) { + super(ownerId); + this.cardNumber = 148; + this.expansionSetCode = "4ED"; + } + + public NafsAsp(final NafsAsp card) { + super(card); + } + + @Override + public NafsAsp copy() { + return new NafsAsp(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mirage/SabertoothCobra.java b/Mage.Sets/src/mage/sets/mirage/SabertoothCobra.java new file mode 100644 index 00000000000..2de9e874109 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirage/SabertoothCobra.java @@ -0,0 +1,75 @@ +/* + * 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.mirage; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.DealsDamageToAPlayerTriggeredAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.UnlessPaysDelayedEffect; +import mage.abilities.effects.common.counter.AddPoisonCounterTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.PhaseStep; +import mage.constants.Rarity; + +/** + * + * @author LoneFox + */ +public class SabertoothCobra extends CardImpl { + + public SabertoothCobra(UUID ownerId) { + super(ownerId, 136, "Sabertooth Cobra", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{G}"); + this.expansionSetCode = "MIR"; + this.subtype.add("Snake"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Whenever Sabertooth Cobra deals damage to a player, he or she gets a poison counter. That player gets another poison counter at the beginning of his or her next upkeep unless he or she pays {2} before that turn. + Effect effect = new AddPoisonCounterTargetEffect(1); + effect.setText("that player gets a poison counter"); + Ability ability = new DealsDamageToAPlayerTriggeredAbility(effect, false, true); + effect = new AddPoisonCounterTargetEffect(1); + effect.setText("That player gets another poison counter."); + ability.addEffect(new UnlessPaysDelayedEffect(new ManaCostsImpl("{2}"), effect, PhaseStep.UPKEEP, true, + "That player gets another poison counter at the beginning of his or her next upkeep unless he or she pays {2} before that turn.")); + this.addAbility(ability); + } + + public SabertoothCobra(final SabertoothCobra card) { + super(card); + } + + @Override + public SabertoothCobra copy() { + return new SabertoothCobra(this); + } +} diff --git a/Mage.Sets/src/mage/sets/timespiral/GlassAsp.java b/Mage.Sets/src/mage/sets/timespiral/GlassAsp.java new file mode 100644 index 00000000000..ff69cd88e05 --- /dev/null +++ b/Mage.Sets/src/mage/sets/timespiral/GlassAsp.java @@ -0,0 +1,69 @@ +/* + * 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.timespiral; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.DealsDamageToAPlayerTriggeredAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.LoseLifeTargetEffect; +import mage.abilities.effects.common.UnlessPaysDelayedEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.PhaseStep; +import mage.constants.Rarity; + +/** + * + * @author LoneFox + */ +public class GlassAsp extends CardImpl { + + public GlassAsp(UUID ownerId) { + super(ownerId, 197, "Glass Asp", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{G}{G}"); + this.expansionSetCode = "TSP"; + this.subtype.add("Snake"); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // Whenever Glass Asp deals combat damage to a player, that player loses 2 life at the beginning of his or her next draw step unless he or she pays {2} before that step. + this.addAbility(new DealsDamageToAPlayerTriggeredAbility(new UnlessPaysDelayedEffect( + new ManaCostsImpl("{2}"), new LoseLifeTargetEffect(2), PhaseStep.DRAW, true, + "that player loses 2 life at the beginning of his or her next draw step unless he or she pays {2} before that draw step."), + false, true)); + } + + public GlassAsp(final GlassAsp card) { + super(card); + } + + @Override + public GlassAsp copy() { + return new GlassAsp(this); + } +} diff --git a/Mage/src/main/java/mage/abilities/effects/common/UnlessPaysDelayedEffect.java b/Mage/src/main/java/mage/abilities/effects/common/UnlessPaysDelayedEffect.java new file mode 100644 index 00000000000..a474a2a19e2 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/effects/common/UnlessPaysDelayedEffect.java @@ -0,0 +1,186 @@ +/* + * 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.common; + +import java.util.UUID; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.DelayedTriggeredAbility; +import mage.abilities.SpecialAction; +import mage.abilities.costs.Cost; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.RemoveDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.RemoveSpecialActionEffect; +import mage.constants.Outcome; +import mage.constants.PhaseStep; +import mage.game.Game; +import mage.game.events.GameEvent.EventType; +import mage.game.events.GameEvent; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author LoneFox (based on Quenchable Fire code by BetaSteward_at_googlemail.com) + */ + +public class UnlessPaysDelayedEffect extends OneShotEffect { + + private final Cost cost; + private final Effect effect; + private final PhaseStep step; + private final boolean affectedPlayersTurn; + + public UnlessPaysDelayedEffect(Cost cost, Effect effect, PhaseStep step, boolean affectedPlayersTurn, String text) { + super(Outcome.Detriment); + this.cost = cost; + this.effect = effect; + this.step = step; + this.affectedPlayersTurn = affectedPlayersTurn; + staticText = text + "
Use the Special button to pay the " + cost.getText() + + " with a special action before that step."; + } + + public UnlessPaysDelayedEffect(final UnlessPaysDelayedEffect effect) { + super(effect); + this.cost = effect.cost.copy(); + this.effect = effect.effect.copy(); + this.step = effect.step; + this.affectedPlayersTurn = effect.affectedPlayersTurn; + } + + @Override + public UnlessPaysDelayedEffect copy() { + return new UnlessPaysDelayedEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + MageObject sourceObject = source.getSourceObject(game); + if (sourceObject != null) { + + //create special action + UnlessPaysDelayedEffectAction newAction = new UnlessPaysDelayedEffectAction(); + + //create delayed triggered ability + UUID turnPlayer = affectedPlayersTurn ? getTargetPointer().getFirst(game, source) : source.getControllerId(); + effect.setTargetPointer(new FixedTarget(getTargetPointer().getFirst(game, source))); + UnlessPaysDelayedEffectTriggeredAbility delayedAbility = new UnlessPaysDelayedEffectTriggeredAbility(turnPlayer, step, effect); + delayedAbility.setSourceId(source.getSourceId()); + delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(sourceObject, game); + delayedAbility.setSpecialActionId(newAction.getId()); + UUID delayedAbilityId = game.addDelayedTriggeredAbility(delayedAbility); + + // update special action + newAction.addCost(cost); + Effect removeEffect = new RemoveDelayedTriggeredAbilityEffect(delayedAbilityId); + newAction.addEffect(removeEffect); + newAction.addEffect(new RemoveSpecialActionEffect(newAction.getId())); + newAction.setSourceId(source.getSourceId()); + newAction.setControllerId(getTargetPointer().getFirst(game, source)); + removeEffect.setText(sourceObject.getIdName() + " - Pay " + cost.getText() + " to remove the triggered ability."); + game.getState().getSpecialActions().add(newAction); + return true; + } + return false; + } + +} + +class UnlessPaysDelayedEffectTriggeredAbility extends DelayedTriggeredAbility { + + private UUID specialActionId; + private final UUID turnPlayer; + private final PhaseStep step; + + public UnlessPaysDelayedEffectTriggeredAbility(UUID turnPlayer, PhaseStep step, Effect effect) { + super(effect); + this.turnPlayer = turnPlayer; + this.step = step; + } + + public void setSpecialActionId(UUID specialActionId) { + this.specialActionId = specialActionId; + } + + public UnlessPaysDelayedEffectTriggeredAbility(final UnlessPaysDelayedEffectTriggeredAbility ability) { + super(ability); + this.turnPlayer = ability.turnPlayer; + this.step = ability.step; + this.specialActionId = ability.specialActionId; + } + + @Override + public UnlessPaysDelayedEffectTriggeredAbility copy() { + return new UnlessPaysDelayedEffectTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + switch(step) { + case UPKEEP: + return event.getType() == EventType.UPKEEP_STEP_PRE; + case DRAW: + return event.getType() == EventType.DRAW_STEP_PRE; + default: + return false; + } + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (event.getPlayerId().equals(turnPlayer)) { + for (SpecialAction action: game.getState().getSpecialActions()) { + if (action.getId().equals(specialActionId)) { + game.getState().getSpecialActions().remove(action); + break; + } + } + return true; + } + return false; + } + +} + +class UnlessPaysDelayedEffectAction extends SpecialAction { + + public UnlessPaysDelayedEffectAction() { + super(); + } + + public UnlessPaysDelayedEffectAction(final UnlessPaysDelayedEffectAction ability) { + super(ability); + } + + @Override + public UnlessPaysDelayedEffectAction copy() { + return new UnlessPaysDelayedEffectAction(this); + } +}