package net.demilich.metastone.game.spells.desc.source; import net.demilich.metastone.game.GameContext; import net.demilich.metastone.game.Player; import net.demilich.metastone.game.cards.CardCollection; import net.demilich.metastone.game.spells.TargetPlayer; public abstract class CardSource { protected final SourceDesc desc; public CardSource(SourceDesc desc) { this.desc = desc; } public Object getArg(SourceArg arg) { return desc.get(arg); } public boolean hasArg(SourceArg arg) { return desc.contains(arg); } public CardCollection getCards(GameContext context, Player player) { TargetPlayer targetPlayer = (TargetPlayer) desc.get(SourceArg.TARGET_PLAYER); if (targetPlayer == null) { targetPlayer = TargetPlayer.SELF; } Player providingPlayer = null; switch (targetPlayer) { case ACTIVE: providingPlayer = context.getActivePlayer(); break; case BOTH: CardCollection cards = new CardCollection(); for (Player selectedPlayer : context.getPlayers()) { cards.addAll(this.match(context, selectedPlayer)); } return cards; case INACTIVE: providingPlayer = context.getOpponent(context.getActivePlayer()); break; case OPPONENT: providingPlayer = context.getOpponent(player); break; case OWNER: case SELF: default: providingPlayer = player; break; } return this.match(context, providingPlayer); } protected abstract CardCollection match(GameContext context, Player player); }