package magic.model.action;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import magic.ai.ArtificialScoringSystem;
import magic.model.MagicCardDefinition;
import magic.model.MagicGame;
import magic.model.MagicLocationType;
import magic.model.MagicPayedCost;
import magic.model.MagicPermanent;
import magic.model.MagicPermanentState;
import magic.model.stack.MagicCardOnStack;
import magic.model.trigger.MagicTrigger;
import magic.model.trigger.MagicTriggerType;
public class PlayCardFromStackAction extends MagicAction {
private final MagicCardOnStack cardOnStack;
private final MagicCardDefinition cardDef;
private MagicPermanent permanent = MagicPermanent.NONE;
private MagicPermanent enchantedPermanent = MagicPermanent.NONE;
private MagicPayedCost payedCost = MagicPayedCost.NO_COST;
private boolean validEnchanted = false;
private List<? extends MagicPermanentAction> modifications = Collections.<MagicPermanentAction>emptyList();
public PlayCardFromStackAction(final MagicCardOnStack aCardOnStack, final MagicCardDefinition aCardDef, final List<? extends MagicPermanentAction> aModifications) {
cardOnStack = aCardOnStack;
cardDef = aCardDef;
payedCost = aCardOnStack.getPayedCost();
modifications = aModifications;
}
public PlayCardFromStackAction(final MagicCardOnStack aCardOnStack, final MagicCardDefinition aCardDef, final MagicPermanentAction... aModifications) {
this(aCardOnStack, aCardDef, Arrays.asList(aModifications));
}
public PlayCardFromStackAction(final MagicCardOnStack aCardOnStack, final MagicPermanentAction... aModifications) {
this(aCardOnStack, aCardOnStack.getCardDefinition(), aModifications);
}
public PlayCardFromStackAction(final MagicCardOnStack cardOnStack, final MagicPermanent aEnchantedPermanent, final MagicPermanentAction... aModifications) {
this(cardOnStack, aModifications);
enchantedPermanent = aEnchantedPermanent;
}
protected MagicPermanent createPermanent(final MagicGame game) {
cardOnStack.setMoveLocation(MagicLocationType.Battlefield);
return game.createPermanent(cardOnStack.getCard(),cardDef,cardOnStack.getController());
}
@Override
public void doAction(final MagicGame game) {
permanent=createPermanent(game);
permanent.getFirstController().addPermanent(permanent);
if (cardOnStack.isCast() && cardOnStack.getFromLocation() == MagicLocationType.OwnersHand) {
game.doAction(ChangeStateAction.Set(permanent, MagicPermanentState.CastFromHand));
}
//comes into play with/as, such as manifest
for (final MagicPermanentAction action : cardOnStack.getModifications()) {
action.doAction(permanent);
}
//comes into play with/as, such as bestowed
for (final MagicPermanentAction action : modifications) {
action.doAction(permanent);
}
game.update();
final int score=ArtificialScoringSystem.getTurnScore(game)-permanent.getStaticScore();
validEnchanted = enchantedPermanent.isValid();
if (validEnchanted) {
enchantedPermanent.addAura(permanent);
permanent.setEnchantedPermanent(enchantedPermanent);
}
//execute comes into play with
for (final MagicTrigger<MagicPayedCost> trigger : permanent.getComeIntoPlayTriggers()) {
if (trigger.getPriority() == MagicTrigger.REPLACEMENT) {
game.executeTrigger(trigger,permanent,permanent,payedCost);
}
}
game.addStatics(permanent);
game.update();
//execute come into play triggers
for (final MagicTrigger<MagicPayedCost> trigger : permanent.getComeIntoPlayTriggers()) {
if (trigger.getPriority() > MagicTrigger.REPLACEMENT) {
game.executeTrigger(trigger,permanent,permanent,payedCost);
}
}
//execute other come into player triggers
game.executeTrigger(MagicTriggerType.WhenOtherComesIntoPlay,permanent);
setScore(permanent.getController(),permanent.getScore()+permanent.getStaticScore()+score);
game.checkUniquenessRule(permanent);
game.setStateCheckRequired();
}
@Override
public void undoAction(final MagicGame game) {
// for change of control Auras, enchantedPermanent.isValid is false as
// change of control action is undone. Thus we store the validity in
// variable validEnchanted during doAction.
if (validEnchanted) {
enchantedPermanent.removeAura(permanent);
permanent.setEnchantedPermanent(MagicPermanent.NONE);
}
permanent.getFirstController().removePermanent(permanent);
game.removeTriggers(permanent);
game.removeAllStatics(permanent);
}
@Override
public String toString() {
if (enchantedPermanent.isValid()) {
return getClass().getSimpleName()+" ("+permanent+','+enchantedPermanent+')';
} else {
return getClass().getSimpleName()+" ("+permanent+')';
}
}
}