package magic.model.event;
import magic.model.MagicGame;
import magic.model.MagicPlayer;
import magic.model.MagicCard;
import magic.model.MagicCardList;
import magic.model.MagicLocationType;
import magic.model.target.MagicTargetFilter;
import magic.model.target.MagicGraveyardTargetPicker;
import magic.model.action.ShiftCardAction;
import magic.model.action.RevealAction;
import magic.model.choice.MagicFromCardListChoice;
import java.util.List;
public class MagicTutorTopEvent {
private static final MagicEventAction TakeCard(final int reveal, final MagicLocationType rest) {
return new MagicEventAction() {
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
if (reveal > 1) {
game.doAction(new RevealAction(event.getRefCardList()));
}
event.processChosenCards(game, (final MagicCard chosen) -> {
if (reveal == 1) {
game.doAction(new RevealAction(chosen));
}
game.doAction(new ShiftCardAction(
chosen,
MagicLocationType.OwnersLibrary,
MagicLocationType.OwnersHand
));
});
for (final MagicCard card : event.getRefCardList()) {
game.doAction(new ShiftCardAction(
card,
MagicLocationType.OwnersLibrary,
rest
));
}
}
};
}
private static final MagicEventAction HandGraveyard = TakeCard(0, MagicLocationType.Graveyard);
private static final MagicEventAction HandBottom = TakeCard(0, MagicLocationType.BottomOfOwnersLibrary);
private static final MagicEventAction RevealHandBottom = TakeCard(1, MagicLocationType.BottomOfOwnersLibrary);
private static final MagicEventAction RevealHandGraveyard = TakeCard(2, MagicLocationType.Graveyard);
public static MagicEvent reveal(final MagicEvent event, final int n, final MagicTargetFilter<MagicCard> filter) {
return create(event, n, filter, RevealHandGraveyard);
}
public static MagicEvent look(final MagicEvent event, final int n, final MagicTargetFilter<MagicCard> filter) {
return create(event, n, filter, RevealHandBottom);
}
private static MagicEvent create(final MagicEvent event, final int n, final MagicTargetFilter<MagicCard> filter, final MagicEventAction action) {
final MagicPlayer player = event.getPlayer();
final MagicCardList topCards = player.getLibrary().getCardsFromTop(n);
final List<MagicCard> choiceList = player.filterCards(topCards, filter);
return new MagicEvent(
event.getSource(),
player,
new MagicFromCardListChoice(choiceList, topCards, 1, true),
MagicGraveyardTargetPicker.ReturnToHand,
topCards,
action,
""
);
}
public static MagicEvent toGraveyard(final MagicEvent event, final int n, final int h) {
return create(event, n, h, HandGraveyard);
}
public static MagicEvent toBottom(final MagicEvent event, final int n, final int h) {
return create(event, n, h, HandBottom);
}
private static MagicEvent create(final MagicEvent event, final int n, final int h, final MagicEventAction action) {
final MagicPlayer player = event.getPlayer();
final MagicCardList topCards = player.getLibrary().getCardsFromTop(n);
return new MagicEvent(
event.getSource(),
player,
new MagicFromCardListChoice(topCards, h),
MagicGraveyardTargetPicker.ReturnToHand,
topCards,
action,
""
);
}
}