package net.demilich.metastone.game.spells.desc.filter; import net.demilich.metastone.game.Attribute; import net.demilich.metastone.game.GameContext; import net.demilich.metastone.game.Player; import net.demilich.metastone.game.cards.Card; import net.demilich.metastone.game.cards.CardType; import net.demilich.metastone.game.cards.Rarity; import net.demilich.metastone.game.entities.Actor; import net.demilich.metastone.game.entities.Entity; import net.demilich.metastone.game.entities.heroes.HeroClass; import net.demilich.metastone.game.entities.minions.Race; import net.demilich.metastone.game.spells.SpellUtils; public class CardFilter extends EntityFilter { public CardFilter(FilterDesc desc) { super(desc); } private boolean heroClassTest(GameContext context, Player player, Card card, HeroClass heroClass) { if (heroClass == HeroClass.OPPONENT) { heroClass = context.getOpponent(player).getHero().getHeroClass(); } else if (heroClass == HeroClass.SELF) { heroClass = player.getHero().getHeroClass(); } if (heroClass != null && card.hasHeroClass(heroClass)) { return false; } return true; } @Override protected boolean test(GameContext context, Player player, Entity entity) { Card card = null; if (entity instanceof Card) { card = (Card) entity; } else if (entity instanceof Actor) { Actor actor = (Actor) entity; card = actor.getSourceCard(); } else { return false; } CardType cardType = (CardType) desc.get(FilterArg.CARD_TYPE); if (cardType != null && !card.getCardType().isCardType(cardType)) { return false; } Race race = (Race) desc.get(FilterArg.RACE); if (race != null && race != card.getAttribute(Attribute.RACE)) { return false; } HeroClass[] heroClasses = (HeroClass[]) desc.get(FilterArg.HERO_CLASSES); if (heroClasses != null && heroClasses.length > 0) { boolean test = false; for (HeroClass heroClass : heroClasses) { test |= !heroClassTest(context, player, card, heroClass); } if (!test) { return false; } } HeroClass heroClass = (HeroClass) desc.get(FilterArg.HERO_CLASS); if (heroClass != null && heroClassTest(context, player, card, heroClass)) { return false; } if (desc.contains(FilterArg.MANA_COST)) { int manaCost = desc.getValue(FilterArg.MANA_COST, context, player, null, null, 0); if (manaCost != card.getBaseManaCost()) { return false; } } Rarity rarity = (Rarity) desc.get(FilterArg.RARITY); if (rarity != null && !card.getRarity().isRarity(rarity)) { return false; } if (desc.contains(FilterArg.ATTRIBUTE) && desc.contains(FilterArg.OPERATION)) { Attribute attribute = (Attribute) desc.get(FilterArg.ATTRIBUTE); Operation operation = (Operation) desc.get(FilterArg.OPERATION); if (operation == Operation.HAS || operation == null) { return card.hasAttribute(attribute); } int targetValue = desc.getInt(FilterArg.VALUE); int actualValue = card.getAttributeValue(attribute); return SpellUtils.evaluateOperation(operation, actualValue, targetValue); } return true; } }