package mage.abilities.common; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.effects.Effect; import mage.abilities.hint.Hint; import mage.abilities.hint.ValueHint; import mage.constants.WatcherScope; import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.stack.Spell; import mage.util.CardUtil; import mage.watchers.Watcher; import java.util.HashMap; import java.util.Map; import java.util.UUID; /** * @author Susucr */ public class ExpendTriggeredAbility extends TriggeredAbilityImpl { private static final Hint hint = new ValueHint("Mana you expended this turn", ExpendValue.instance); /** * For memory-usage purpose, we only support expend 4 and expend 8 so far. */ public enum Expend { FOUR(4), EIGHT(8); private final int amount; public int getAmount() { return amount; } Expend(int amount) { this.amount = amount; } } private final Expend amount; public ExpendTriggeredAbility(Effect effect, Expend amount) { this(effect, amount, false); } public ExpendTriggeredAbility(Effect effect, Expend amount, boolean optional) { this(Zone.BATTLEFIELD, effect, amount, optional); } public ExpendTriggeredAbility(Zone zone, Effect effect, Expend amount, boolean optional) { super(zone, effect, optional); this.amount = amount; setTriggerPhrase("Whenever you expend " + amount.getAmount() + ", "); this.addWatcher(new ExpendWatcher()); this.addHint(hint); } private ExpendTriggeredAbility(final ExpendTriggeredAbility ability) { super(ability); this.amount = ability.amount; } @Override public ExpendTriggeredAbility copy() { return new ExpendTriggeredAbility(this); } @Override public boolean checkEventType(GameEvent event, Game game) { return event.getType() == GameEvent.EventType.MANA_PAID; } @Override public boolean checkTrigger(GameEvent event, Game game) { return ExpendWatcher.checkExpend(getControllerId(), event, amount, game); } } enum ExpendValue implements DynamicValue { instance; @Override public int calculate(Game game, Ability sourceAbility, Effect effect) { return ExpendWatcher.getManaExpended(sourceAbility.getControllerId(), game); } @Override public ExpendValue copy() { return instance; } @Override public String getMessage() { return "mana you expended this turn"; } } /** * Watcher for mana expended this turn. *
* Of note, to reduce memory usage, only tracks the events that did expend 4 and expend 8.
* If expend N extends to more than a couple values, storing the full list (in order) of event id is advised.
*/
class ExpendWatcher extends Watcher {
// Player id -> number of mana expended this turn
private final Map