package mage.abilities.keyword;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.SacrificeSourceEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.effects.common.counter.RemoveCounterSourceEffect;
import mage.constants.Zone;
import mage.counters.CounterType;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.util.CardUtil;
/**
* @author TheElk801
*/
public class VanishingAbility extends EntersBattlefieldAbility {
private static final Condition condition = new SourceHasCounterCondition(CounterType.TIME);
private final int amount;
public VanishingAbility(int amount) {
super(new AddCountersSourceEffect(CounterType.TIME.createInstance(amount)));
this.amount = amount;
this.addSubAbility(new ConditionalInterveningIfTriggeredAbility(
new BeginningOfUpkeepTriggeredAbility(
new RemoveCounterSourceEffect(CounterType.TIME.createInstance()), false
), condition, "At the beginning of your upkeep, if this permanent " +
"has a time counter on it, remove a time counter from it."
).setRuleVisible(false));
this.addSubAbility(new VanishingTriggeredAbility());
}
private VanishingAbility(final VanishingAbility ability) {
super(ability);
this.amount = ability.amount;
}
@Override
public VanishingAbility copy() {
return new VanishingAbility(this);
}
@Override
public String getRule() {
if (amount > 0) {
return "Vanishing " + amount + " (This permanent enters the battlefield with " +
CardUtil.numberToText(amount) + " time counters on it. At the beginning of your upkeep, " +
"remove a time counter from it. When the last is removed, sacrifice it.)";
}
return "Vanishing (At the beginning of your upkeep, remove a time counter " +
"from this permanent. When the last is removed, sacrifice it.)";
}
}
class VanishingTriggeredAbility extends TriggeredAbilityImpl {
VanishingTriggeredAbility() {
super(Zone.BATTLEFIELD, new SacrificeSourceEffect());
this.setRuleVisible(false);
}
private VanishingTriggeredAbility(final VanishingTriggeredAbility ability) {
super(ability);
}
@Override
public VanishingTriggeredAbility copy() {
return new VanishingTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.COUNTERS_REMOVED;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (!CounterType.TIME.getName().equals(event.getData())) {
return false;
}
Permanent permanent = getSourcePermanentIfItStillExists(game);
return permanent != null && permanent.getCounters(game).getCount(CounterType.TIME) < 1;
}
@Override
public String getRule() {
return "When the last time counter is removed from {this}, sacrifice it.";
}
}