package com.hearthsim.card.basic.spell;
import com.hearthsim.card.basic.minion.Huffer;
import com.hearthsim.card.basic.minion.Leokk;
import com.hearthsim.card.basic.minion.Misha;
import com.hearthsim.card.minion.Minion;
import com.hearthsim.card.spellcard.SpellRandomInterface;
import com.hearthsim.card.spellcard.SpellTargetableCard;
import com.hearthsim.event.effect.EffectCharacter;
import com.hearthsim.event.filter.FilterCharacter;
import com.hearthsim.event.filter.FilterCharacterSummon;
import com.hearthsim.model.BoardModel;
import com.hearthsim.model.PlayerSide;
import com.hearthsim.util.tree.HearthTreeNode;
import java.util.ArrayList;
import java.util.Collection;
public class AnimalCompanion extends SpellTargetableCard implements SpellRandomInterface {
/**
* Constructor
*
* @param hasBeenUsed Whether the card has already been used or not
*/
@Deprecated
public AnimalCompanion(boolean hasBeenUsed) {
this();
this.hasBeenUsed = hasBeenUsed;
}
/**
* Constructor
* Defaults to hasBeenUsed = false
*/
public AnimalCompanion() {
super();
}
@Override
public FilterCharacter getTargetableFilter() {
return FilterCharacterSummon.SELF;
}
@Override
public EffectCharacter getTargetableEffect() {
return null;
}
public boolean canBeUsedOn(PlayerSide playerSide, Minion minion, BoardModel boardModel) {
if (!super.canBeUsedOn(playerSide, minion, boardModel))
return false;
if (boardModel.modelForSide(PlayerSide.CURRENT_PLAYER).isBoardFull()) {
return false;
}
return true;
}
/**
* Use the card on the given target
* Summons either Huffer, Leokk, or Misha
*
* @param originSide
* @param boardState The BoardState before this card has performed its action. It will be manipulated and returned.
* @return The boardState is manipulated and returned
*/
@Override
public Collection<HearthTreeNode> createChildren(PlayerSide originSide, int originIndex, HearthTreeNode boardState) {
HearthTreeNode newState;
ArrayList<HearthTreeNode> children = new ArrayList<>();
for (Minion minion : new Minion[]{new Huffer(), new Leokk(), new Misha()}) {
newState = new HearthTreeNode(boardState.data_.deepCopy());
newState.data_.modelForSide(originSide).getHand().remove(originIndex);
newState = minion.summonMinionAtEnd(originSide, newState, false);
if (newState != null)
children.add(newState);
}
return children;
}
}