package net.demilich.metastone.game.spells.desc.filter;
import net.demilich.metastone.game.GameContext;
import net.demilich.metastone.game.Player;
import net.demilich.metastone.game.entities.Entity;
import net.demilich.metastone.game.spells.TargetPlayer;
public abstract class EntityFilter {
protected final FilterDesc desc;
public EntityFilter(FilterDesc desc) {
this.desc = desc;
}
public Object getArg(FilterArg arg) {
return desc.get(arg);
}
public boolean hasArg(FilterArg arg) {
return desc.contains(arg);
}
public boolean matches(GameContext context, Player player, Entity entity) {
boolean invert = desc.getBool(FilterArg.INVERT);
TargetPlayer targetPlayer = (TargetPlayer) desc.get(FilterArg.TARGET_PLAYER);
if (targetPlayer == null) {
targetPlayer = TargetPlayer.SELF;
}
Player providingPlayer = null;
switch (targetPlayer) {
case ACTIVE:
providingPlayer = context.getActivePlayer();
break;
case BOTH:
boolean test = false;
for (Player selectedPlayer : context.getPlayers()) {
test |= (this.test(context, selectedPlayer, entity) != invert);
}
return test;
case INACTIVE:
providingPlayer = context.getOpponent(context.getActivePlayer());
break;
case OPPONENT:
providingPlayer = context.getOpponent(player);
break;
case OWNER:
providingPlayer = context.getPlayer(entity.getOwner());
break;
case SELF:
default:
providingPlayer = player;
break;
}
return this.test(context, providingPlayer, entity) != invert;
}
protected abstract boolean test(GameContext context, Player player, Entity entity);
}