package net.demilich.metastone.game.actions; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import net.demilich.metastone.game.Attribute; import net.demilich.metastone.game.GameContext; import net.demilich.metastone.game.Player; import net.demilich.metastone.game.cards.Card; import net.demilich.metastone.game.cards.SpellCard; import net.demilich.metastone.game.entities.Entity; import net.demilich.metastone.game.targeting.CardReference; public abstract class PlayCardAction extends GameAction { public static Logger logger = LoggerFactory.getLogger(PlayCardAction.class); private final CardReference cardReference; private int groupIndex; public PlayCardAction(CardReference cardReference) { this.cardReference = cardReference; } @Override public boolean canBeExecutedOn(GameContext context, Player player, Entity entity) { Card card = context.resolveCardReference(getCardReference()); if (card instanceof SpellCard) { SpellCard spellCard = (SpellCard) card; return spellCard.canBeCastOn(context, player, entity); } return true; } @Override public void execute(GameContext context, int playerId) { Card card = context.resolveCardReference(getCardReference()); context.setPendingCard(card); try { context.getLogic().playCard(playerId, getCardReference()); // card was countered, do not actually resolve its effects if (!card.hasAttribute(Attribute.COUNTERED)) { play(context, playerId); } } catch (Exception e) { logger.error("ERROR while playing card " + card + " reference: " + cardReference); context.getLogic().panicDump(); e.printStackTrace(); System.exit(-1); throw e; } context.getLogic().afterCardPlayed(playerId, getCardReference()); context.setPendingCard(null); } public CardReference getCardReference() { return cardReference; } public int getGroupIndex() { return groupIndex; } @Override public String getPromptText() { return "[Play card]"; } @Override public boolean isSameActionGroup(GameAction anotherAction) { if (anotherAction.getActionType() != getActionType()) { return false; } PlayCardAction playCardAction = (PlayCardAction) anotherAction; return playCardAction.getGroupIndex() == getGroupIndex() && this.cardReference.equals(playCardAction.cardReference); } protected abstract void play(GameContext context, int playerId); public void setGroupIndex(int groupIndex) { this.groupIndex = groupIndex; } @Override public String toString() { return String.format("%s Card: %s Target: %s", getActionType(), cardReference, getTargetKey()); } }