package magic.model.event; import magic.model.MagicCard; import magic.model.MagicGame; import magic.model.MagicPlayer; import magic.model.MagicSource; import magic.model.action.DiscardCardAction; import magic.model.choice.MagicCardChoice; import magic.model.choice.MagicRandomCardChoice; import magic.model.condition.MagicCondition; import magic.model.condition.MagicConditionFactory; public class MagicDiscardEvent extends MagicEvent { private final MagicCondition cond; public MagicDiscardEvent(final MagicSource source,final MagicPlayer player, final int amount) { this(source, player, amount, false); } public MagicDiscardEvent(final MagicSource source,final MagicPlayer player) { this(source, player, 1); } public MagicDiscardEvent(final MagicSource source,final int amount) { this(source, source.getController(), amount); } public MagicDiscardEvent(final MagicSource source) { this(source, source.getController(), 1); } public static MagicDiscardEvent Random(final MagicSource source, final MagicPlayer player, final int amount) { return new MagicDiscardEvent(source, player, amount, true); } public static MagicDiscardEvent Random(final MagicSource source, final int amount) { return Random(source, source.getController(), amount); } public static MagicDiscardEvent Random(final MagicSource source, final MagicPlayer player) { return Random(source, player, 1); } public static MagicDiscardEvent Random(final MagicSource source) { return Random(source, source.getController(), 1); } private MagicDiscardEvent(final MagicSource source,final MagicPlayer player,final int amount,final boolean random) { super( source, player, random ? new MagicRandomCardChoice(amount) : new MagicCardChoice(amount), EVENT_ACTION, "PN " + genDescription(player,amount) ); //check if source is in player's hand final int minHandSize = player.getHand().contains(source) ? amount + 1 : amount; cond = MagicConditionFactory.HandAtLeast(minHandSize); } private static final MagicEventAction EVENT_ACTION = (final MagicGame game, final MagicEvent event) -> event.processChosenCards(game, (final MagicCard card) -> game.doAction(new DiscardCardAction(event.getPlayer(), card)) ); @Override public boolean isSatisfied() { return cond.accept(getSource()) && super.isSatisfied(); } private static String genDescription(final MagicPlayer player,final int amount) { final int actualAmount = Math.min(amount,player.getHandSize()); switch (actualAmount) { case 0: return "has no cards to discard."; case 1: return "discards a card$."; default : return "discards " + amount + " cards$."; } } }