package magic.model.event; import magic.model.MagicAbility; import magic.model.MagicCardDefinition; import magic.model.MagicChangeCardDefinition; import magic.model.MagicGame; import magic.model.MagicManaType; import magic.model.MagicPermanent; import magic.model.MagicPlayerState; import magic.model.condition.MagicCondition; import java.util.List; import java.util.LinkedList; public abstract class MagicManaActivation implements MagicChangeCardDefinition { protected static final String ActivationRestriction = ", Activate this ability "; private final List<MagicManaType> manaTypes; private final MagicCondition[] conditions; private final int weight; public MagicManaActivation(final List<MagicManaType> manaTypes) { this(manaTypes, MagicActivation.NO_COND, manaTypes.size() - 1); } public MagicManaActivation(final List<MagicManaType> manaTypes, final int weight) { this(manaTypes, MagicActivation.NO_COND, weight); } public MagicManaActivation(final List<MagicManaType> manaTypes, final MagicCondition[] conditions, final int weight) { this.manaTypes=manaTypes; this.conditions=conditions; this.weight=weight; } public final List<MagicManaType> getManaTypes() { return manaTypes; } public final int getWeight() { return weight; } public final boolean canPlay(final MagicGame game,final MagicPermanent source) { // Check if source or player has can't activate activated abilities if (source.hasAbility(MagicAbility.CantActivateAbilities) || source.getController().hasState(MagicPlayerState.CantActivateAbilities)) { return false; } // Check conditions for activation for (final MagicCondition condition : conditions) { if (!condition.accept(source)) { return false; } } // Check able to pay costs for (final MagicEvent event : getCostEvent(source)) { if (event.isSatisfied() == false) { return false; } } return true; } public abstract Iterable<? extends MagicEvent> getCostEvent(final MagicPermanent source); @Override public void change(final MagicCardDefinition cdef) { cdef.addManaAct(this); } public static final MagicManaActivation create(final String costs, final List<MagicManaType> manaTypes) { final String[] part = costs.split(ActivationRestriction); final List<MagicMatchedCostEvent> matchedCostEvents = MagicRegularCostEvent.build(part[0]); assert matchedCostEvents.size() > 0; if (part.length > 1) { matchedCostEvents.addAll(MagicCondition.build(part[1])); } // Mana activation cost events do not have choices. for (final MagicMatchedCostEvent costEvent : matchedCostEvents) { if (costEvent.getEvent(MagicPermanent.NONE).hasChoice()) { throw new RuntimeException("mana activation cost should not have choice: \"" + costs + "\""); } } return new MagicManaActivation(manaTypes) { @Override public Iterable<? extends MagicEvent> getCostEvent(final MagicPermanent source) { final List<MagicEvent> costEvents = new LinkedList<MagicEvent>(); for (final MagicMatchedCostEvent matched : matchedCostEvents) { costEvents.add(matched.getEvent(source)); } return costEvents; } }; } }