package magic.model.condition;
import magic.model.MagicAbility;
import magic.model.MagicCard;
import magic.model.MagicColor;
import magic.model.MagicCounterType;
import magic.model.MagicGame;
import magic.model.MagicManaCost;
import magic.model.MagicPermanent;
import magic.model.MagicPlayer;
import magic.model.MagicSource;
import magic.model.MagicSubType;
import magic.model.event.MagicEvent;
import magic.model.event.MagicPermanentActivation;
import magic.model.target.MagicOtherCardTargetFilter;
import magic.model.target.MagicOtherPermanentTargetFilter;
import magic.model.target.MagicTargetFilter;
import magic.model.target.MagicTargetFilterFactory;
import magic.model.target.MagicTargetType;
public class MagicConditionFactory {
public static MagicCondition CounterAtMost(final MagicCounterType counterType, final int n) {
return new MagicCondition() {
public boolean accept(final MagicSource source) {
final MagicPermanent permanent = (MagicPermanent)source;
return permanent.getCounters(counterType) <= n;
}
};
}
public static MagicCondition CounterAtLeast(final MagicCounterType counterType, final int n) {
return new MagicCondition() {
public boolean accept(final MagicSource source) {
final MagicPermanent permanent = (MagicPermanent)source;
return permanent.getCounters(counterType) >= n;
}
};
}
public static MagicCondition EnchantedCounterAtLeast(final MagicCounterType counterType, final int n) {
return new MagicCondition() {
public boolean accept(final MagicSource source) {
final MagicPermanent permanent = (MagicPermanent)source;
return permanent.getEnchantedPermanent().getCounters(counterType) >= n;
}
};
}
public static MagicCondition EnchantedPowerAtLeast(final int n) {
return new MagicCondition() {
public boolean accept(final MagicSource source) {
final MagicPermanent permanent = (MagicPermanent)source;
return permanent.getEnchantedPermanent().getPower() >= n;
}
};
}
public static MagicCondition CounterEqual(final MagicCounterType counterType, final int n) {
return new MagicCondition() {
public boolean accept(final MagicSource source) {
final MagicPermanent permanent = (MagicPermanent)source;
return permanent.getCounters(counterType) == n;
}
};
}
public static MagicCondition ManaCost(String manaCost) {
return MagicManaCost.create(manaCost).getCondition();
}
public static MagicCondition HasSubType(final MagicSubType subtype) {
return new MagicCondition() {
public boolean accept(final MagicSource source) {
return source.hasSubType(subtype);
}
};
}
public static MagicCondition NotSubType(final MagicSubType subtype) {
return new MagicCondition() {
public boolean accept(final MagicSource source) {
return source.hasSubType(subtype) == false;
}
};
}
public static MagicCondition HasAbility(final MagicAbility ability) {
return new MagicCondition() {
public boolean accept(final MagicSource source) {
return source.hasAbility(ability);
}
};
}
public static MagicCondition NoAbility(final MagicAbility ability) {
return new MagicCondition() {
public boolean accept(final MagicSource source) {
return source.hasAbility(ability) == false;
}
};
}
public static MagicCondition HandAtLeast(final int n) {
return new MagicCondition() {
public boolean accept(final MagicSource source) {
return source.getController().getHandSize() >= n;
}
};
}
public static MagicCondition HandAtMost(final int n) {
return new MagicCondition() {
@Override
public boolean accept(MagicSource source) {
return source.getController().getHandSize() <= n;
}
};
}
public static MagicCondition RNHandAtLeast(final int n) {
return new MagicCondition() {
@Override
public boolean accept(final MagicEvent event) {
return event.getRefPlayer().getHandSize() >= n;
}
@Override
public boolean accept(final MagicSource source) {
throw new RuntimeException("accept(source) called on RNHandAtLeast");
}
};
}
public static MagicCondition RNHandAtMost(final int n) {
return new MagicCondition() {
@Override
public boolean accept(final MagicEvent event) {
return event.getRefPlayer().getHandSize() <= n;
}
@Override
public boolean accept(final MagicSource source) {
throw new RuntimeException("accept(source) called on RNHandAtMost");
}
};
}
public static MagicCondition LibraryAtLeast(final int n) {
return new MagicCondition() {
public boolean accept(final MagicSource source) {
return source.getController().getLibrary().size() >= n;
}
};
}
public static MagicCondition GraveyardAtLeast(final int n) {
return new MagicCondition() {
public boolean accept(final MagicSource source) {
return source.getController().getGraveyard().size() >= n;
}
};
}
public static MagicCondition DevotionAtLeast(final MagicColor color, final int n) {
return new MagicCondition() {
public boolean accept(final MagicSource source) {
return source.getController().getDevotion(color) >= n;
}
};
}
public static MagicCondition EnchantedIs(final MagicTargetFilter<MagicPermanent> filter) {
return new MagicCondition() {
public boolean accept(final MagicSource source) {
final MagicPermanent permanent = (MagicPermanent)source;
return filter.accept(source, source.getController(), permanent.getEnchantedPermanent());
}
};
}
public static MagicCondition EquippedIs(final MagicTargetFilter<MagicPermanent> filter) {
return new MagicCondition() {
public boolean accept(final MagicSource source) {
final MagicPermanent permanent = (MagicPermanent)source;
return filter.accept(source, source.getController(), permanent.getEquippedCreature());
}
};
}
public static MagicCondition SelfIs(final MagicTargetFilter<MagicPermanent> filter) {
return new MagicCondition() {
public boolean accept(final MagicSource source) {
final MagicPermanent permanent = (MagicPermanent)source;
return filter.accept(source, source.getController(), permanent);
}
};
}
public static MagicCondition YouEnergyAtLeast(final int n) {
return new MagicCondition() {
public boolean accept(final MagicSource source) {
return source.getController().getEnergy() >= n;
}
};
}
public static MagicCondition YouLifeAtLeast(final int n) {
return new MagicCondition() {
public boolean accept(final MagicSource source) {
return source.getController().getLife() >= n;
}
};
}
public static MagicCondition YouLifeOrLess(final int n) {
return new MagicCondition() {
public boolean accept(final MagicSource source) {
return source.getController().getLife() <= n;
}
};
}
public static MagicCondition YouGainLifeOrMore(final int n) {
return new MagicCondition() {
public boolean accept(final MagicSource source) {
return source.getController().getLifeGainThisTurn() >= n;
}
};
}
public static MagicCondition OpponentGainLifeOrMore(final int n) {
return new MagicCondition() {
public boolean accept(final MagicSource source) {
return source.getOpponent().getLifeGainThisTurn() >= n;
}
};
}
public static MagicCondition OpponentLoseLifeOrMore(final int n) {
return new MagicCondition() {
public boolean accept(final MagicSource source) {
return source.getOpponent().getLifeLossThisTurn() >= n;
}
};
}
public static MagicCondition SingleActivation(final MagicPermanentActivation act) {
return new MagicCondition() {
@Override
public boolean accept(final MagicSource source) {
final MagicGame game = source.getGame();
return !game.getStack().hasActivationOnTop(source,act);
}
};
}
public static MagicCondition YouControl(final MagicTargetFilter<MagicPermanent> filter) {
return new MagicCondition() {
@Override
public boolean accept(final MagicSource source) {
return source.getController().controlsPermanent(source, filter);
}
};
}
public static MagicCondition YouControlOr(final MagicTargetFilter<MagicPermanent> filter1,final MagicTargetFilter<MagicPermanent> filter2) {
return new MagicCondition() {
@Override
public boolean accept(final MagicSource source) {
return source.getController().controlsPermanent(source, filter1) || source.getController().controlsPermanent(source, filter2);
}
};
}
public static MagicCondition PlayerControlsSource(final MagicPlayer player) {
final long id = player.getId();
return new MagicCondition() {
@Override
public boolean accept(final MagicSource source) {
return source.getController().getId() == id;
}
};
}
public static MagicCondition YouHaveAtLeast(final MagicTargetFilter<MagicCard> filter, final int amt) {
return new MagicCondition() {
@Override
public boolean accept(final MagicSource source) {
return filter.filter(source.getController()).size() >= amt;
}
};
}
public static MagicCondition YouControlAtLeast(final MagicTargetFilter<MagicPermanent> filter, final int amt) {
return new MagicCondition() {
@Override
public boolean accept(final MagicSource source) {
return source.getController().getNrOfPermanents(source, filter) >= amt;
}
};
}
public static MagicCondition YouControlAtMost(final MagicTargetFilter<MagicPermanent> filter, final int amt) {
return new MagicCondition() {
@Override
public boolean accept(final MagicSource source) {
return source.getController().getNrOfPermanents(source, filter) <= amt;
}
};
}
public static MagicCondition OppControlAtLeast(final MagicTargetFilter<MagicPermanent> filter, final int amt) {
return new MagicCondition() {
@Override
public boolean accept(final MagicSource source) {
return source.getOpponent().getNrOfPermanents(source, filter) >= amt;
}
};
}
public static MagicCondition YouControlNone(final MagicTargetFilter<MagicPermanent> filter) {
return new MagicCondition() {
@Override
public boolean accept(final MagicSource source) {
return source.getController().getNrOfPermanents(source, filter) == 0;
}
};
}
public static MagicCondition BattlefieldEqual(final MagicTargetFilter<MagicPermanent> filter, final int amt) {
return new MagicCondition() {
@Override
public boolean accept(final MagicSource source) {
return source.getGame().getNrOfPermanents(source, filter) == amt;
}
};
}
public static MagicCondition BattlefieldAtLeast(final MagicTargetFilter<MagicPermanent> filter, final int amt) {
return new MagicCondition() {
@Override
public boolean accept(final MagicSource source) {
return source.getGame().getNrOfPermanents(source, filter) >= amt;
}
};
}
public static MagicCondition YouControlAnother(final MagicTargetFilter<MagicPermanent> filter) {
return new MagicCondition() {
@Override
public boolean accept(final MagicSource source) {
return source.getController().controlsPermanent(
new MagicOtherPermanentTargetFilter(filter, (MagicPermanent)source)
);
}
};
}
public static MagicCondition YouControlAnotherAtLeast(final MagicTargetFilter<MagicPermanent> filter, final int amt) {
return new MagicCondition() {
@Override
public boolean accept(final MagicSource source) {
return source.getController().getNrOfPermanents(
new MagicOtherPermanentTargetFilter(filter, (MagicPermanent)source)
) >= amt;
}
};
}
public static MagicCondition OpponentControl(final MagicTargetFilter<MagicPermanent> filter) {
return new MagicCondition() {
@Override
public boolean accept(final MagicSource source) {
return source.getOpponent().controlsPermanent(source, filter);
}
};
}
public static MagicCondition OtherCardInHand(final MagicColor color, final int amt) {
return new MagicCondition() {
@Override
public boolean accept(final MagicSource source) {
final MagicTargetFilter<MagicCard> filter = new MagicOtherCardTargetFilter(
MagicTargetFilterFactory.card(color).from(MagicTargetType.Hand),
(MagicCard)source
);
final MagicPlayer player = source.getController();
return filter.filter(player).size() >= amt;
}
};
}
public static MagicCondition Unless(final MagicCondition condition) {
return new MagicCondition() {
@Override
public boolean accept(final MagicSource source) {
return condition.accept(source) == false;
}
};
}
public static MagicCondition compose(final MagicCondition... conds) {
return new MagicCondition() {
@Override
public boolean accept(final MagicEvent event) {
for (final MagicCondition cond : conds) {
if (cond.accept(event) == false) {
return false;
}
}
return true;
}
@Override
public boolean accept(final MagicSource source) {
throw new RuntimeException("accept(source) called on compose");
}
};
}
}