package magic.model.event;
import magic.model.MagicCard;
import magic.model.MagicGame;
import magic.model.MagicPayedCost;
import magic.model.MagicSource;
import magic.model.MagicCardDefinition;
import magic.model.MagicLocationType;
import magic.model.ARG;
import magic.model.action.PutItemOnStackAction;
import magic.model.choice.MagicChoice;
import magic.model.condition.MagicCondition;
import magic.model.stack.MagicAbilityOnStack;
import java.util.List;
import java.util.LinkedList;
public abstract class MagicCardAbilityActivation extends MagicHandCastActivation {
final String name;
public MagicCardAbilityActivation(final MagicCondition[] conditions, final MagicActivationHints hints, final String aName) {
super(
conditions,
hints,
aName
);
name = aName;
}
public MagicCardAbilityActivation(final MagicActivationHints hints, final String aName) {
this(MagicActivation.NO_COND, hints, aName);
}
public abstract MagicEvent getCardEvent(final MagicCard card, final MagicPayedCost payedCost);
@Override
public MagicEvent getEvent(final MagicSource source) {
return new MagicEvent(
source,
(final MagicGame game, final MagicEvent event) -> {
final MagicAbilityOnStack abilityOnStack = new MagicAbilityOnStack(
MagicCardAbilityActivation.this,
getCardEvent(event.getCard(), game.getPayedCost())
);
game.doAction(new PutItemOnStackAction(abilityOnStack));
},
"Play activated ability of SN."
);
}
@Override
final MagicChoice getChoice(final MagicCard source) {
return getCardEvent(source, MagicPayedCost.NO_COST).getChoice();
}
public static final MagicCardAbilityActivation create(final String act, final MagicLocationType loc) {
final String[] token = act.split(ARG.COLON, 2);
// build the actual costs
final String costs = token[0];
final List<MagicMatchedCostEvent> matchedCostEvents = MagicRegularCostEvent.build(costs);
assert matchedCostEvents.size() > 0;
// add restriction as a MagicMatchedCostEvent
final String[] part = token[1].split(ActivationRestriction);
if (part.length > 1) {
matchedCostEvents.addAll(MagicCondition.build(part[1]));
}
// parse the effect
final String rule = part[0];
final MagicSourceEvent sourceEvent = MagicRuleEventAction.create(rule);
boolean isIndependent = sourceEvent.isIndependent();
for (final MagicMatchedCostEvent matched : matchedCostEvents) {
isIndependent &= matched.isIndependent();
}
return new MagicCardAbilityActivation(
sourceEvent.getConditions(),
new MagicActivationHints(
sourceEvent.getTiming(),
isIndependent
),
sourceEvent.getName()
) {
@Override
public Iterable<? extends MagicEvent> getCostEvent(final MagicCard source) {
final List<MagicEvent> costEvents = new LinkedList<MagicEvent>();
for (final MagicMatchedCostEvent matched : matchedCostEvents) {
costEvents.add(matched.getEvent(source));
}
return costEvents;
}
@Override
public MagicEvent getCardEvent(final MagicCard source, final MagicPayedCost payedCost) {
return sourceEvent.getEvent(source, payedCost);
}
@Override
public void change(final MagicCardDefinition cdef) {
if (loc == MagicLocationType.OwnersHand) {
cdef.addHandAct(this);
} else if (loc == MagicLocationType.Graveyard) {
cdef.addGraveyardAct(this);
} else {
throw new RuntimeException("unknown location: \"" + loc + "\"");
}
}
};
}
}