package magic.model.event;
import magic.model.MagicCard;
import magic.model.MagicCardList;
import magic.model.MagicGame;
import magic.model.MagicPlayer;
import magic.model.MagicSource;
import magic.model.trigger.MagicTriggerType;
public class MagicClashEvent extends MagicEvent {
public MagicClashEvent(final MagicEvent event, final MagicEventAction aClashAction) {
this(event.getSource(), event.getPlayer(), aClashAction);
}
public MagicClashEvent(final MagicSource source, final MagicPlayer player, final MagicEventAction aClashAction) {
super(
source,
player,
EventAction(aClashAction),
"Clash with an opponent."
);
}
public static final MagicEventAction EventAction(final MagicEventAction clashAction) {
return (final MagicGame game, final MagicEvent event) -> {
final MagicPlayer winner = executeClash(game, event);
if (winner == event.getPlayer()) {
clashAction.executeEvent(game, event);
};
game.executeTrigger(MagicTriggerType.WhenClash, winner);
};
}
public static MagicPlayer executeClash(final MagicGame game, final MagicEvent event) {
final MagicPlayer player = event.getPlayer();
final MagicPlayer opponent = player.getOpponent();
final MagicCardList clashCards = player.getLibrary().getCardsFromTop(1);
clashCards.addAll(opponent.getLibrary().getCardsFromTop(1));
// 701.20c A player wins a clash if that player revealed a card with a
// higher converted mana cost than all other cards revealed in that clash.
MagicPlayer winner = MagicPlayer.NONE;
int maxCMC = -1;
for (final MagicCard card : clashCards) {
if (card.getConvertedCost() > maxCMC) {
maxCMC = card.getConvertedCost();
winner = card.getOwner();
} else if (card.getConvertedCost() == maxCMC) {
winner = MagicPlayer.NONE;
}
}
if (winner == MagicPlayer.NONE) {
game.logAppendMessage(player, "It is a tie.");
} else if (winner == player) {
game.logAppendMessage(player, player + " won the clash.");
} else {
game.logAppendMessage(player, player + " lost the clash.");
}
game.addFirstEvent(MagicScryEvent.Pseudo(event.getSource(), opponent));
game.addFirstEvent(MagicScryEvent.Pseudo(event.getSource(), player));
return winner;
}
}