package net.demilich.metastone.game.cards;
import net.demilich.metastone.game.GameContext;
import net.demilich.metastone.game.Player;
import net.demilich.metastone.game.actions.PlayCardAction;
import net.demilich.metastone.game.actions.PlaySpellCardAction;
import net.demilich.metastone.game.cards.desc.SpellCardDesc;
import net.demilich.metastone.game.entities.Entity;
import net.demilich.metastone.game.spells.desc.SpellDesc;
import net.demilich.metastone.game.spells.desc.condition.Condition;
import net.demilich.metastone.game.spells.desc.filter.EntityFilter;
import net.demilich.metastone.game.targeting.TargetSelection;
public class SpellCard extends Card {
private SpellDesc spell;
private TargetSelection targetRequirement;
private Condition condition;
public SpellCard(SpellCardDesc desc) {
super(desc);
setTargetRequirement(desc.targetSelection);
setSpell(desc.spell);
if (desc.condition != null) {
condition = desc.condition.create();
}
}
public boolean canBeCast(GameContext context, Player player) {
Player opponent = context.getOpponent(player);
switch (targetRequirement) {
case ENEMY_MINIONS:
return context.getMinionCount(opponent) > 0;
case FRIENDLY_MINIONS:
return context.getMinionCount(player) > 0;
case MINIONS:
return context.getTotalMinionCount() > 0;
default:
break;
}
if (condition != null) {
return condition.isFulfilled(context, player, null, null);
}
return true;
}
public boolean canBeCastOn(GameContext context, Player player, Entity target) {
EntityFilter filter = spell.getEntityFilter();
if (filter == null) {
return true;
}
return filter.matches(context, player, target);
}
@Override
public SpellCard clone() {
SpellCard clone = (SpellCard) super.clone();
if (spell == null) {
throw new RuntimeException("Spell is NULL for SpellCard " + getName());
}
clone.spell = spell.clone();
clone.condition = condition;
return clone;
}
public SpellDesc getSpell() {
return spell;
}
public TargetSelection getTargetRequirement() {
return targetRequirement;
}
@Override
public PlayCardAction play() {
return new PlaySpellCardAction(getSpell(), this, getTargetRequirement());
}
public void setSpell(SpellDesc spell) {
this.spell = spell;
}
public void setTargetRequirement(TargetSelection targetRequirement) {
this.targetRequirement = targetRequirement;
}
}