package com.hearthsim.event.deathrattle;
import com.hearthsim.card.CharacterIndex;
import com.hearthsim.card.minion.Minion;
import com.hearthsim.model.PlayerModel;
import com.hearthsim.model.PlayerSide;
import com.hearthsim.util.tree.HearthTreeNode;
public class DeathrattleSummonMinionAction extends DeathrattleAction {
private final int numMinions_;
private final Class<? extends Minion> minionClass_;
private final PlayerSide sideToSummon;
public DeathrattleSummonMinionAction(Class<? extends Minion> minionClass, int numMinions) {
this(minionClass, numMinions, PlayerSide.CURRENT_PLAYER);
}
public DeathrattleSummonMinionAction(Class<? extends Minion> minionClass, int numMnions, PlayerSide sideToSummon) {
numMinions_ = numMnions;
minionClass_ = minionClass;
this.sideToSummon = sideToSummon;
}
@Override
public HearthTreeNode performAction(CharacterIndex originIndex, PlayerSide playerSide, HearthTreeNode boardState) {
HearthTreeNode toRet = super.performAction(originIndex, playerSide, boardState);
if (toRet == null)
return boardState;
PlayerModel targetPlayer = toRet.data_.modelForSide(playerSide);
PlayerSide targetPlayerSide = playerSide;
if (sideToSummon == PlayerSide.WAITING_PLAYER) {
targetPlayer = toRet.data_.modelForSide(playerSide.getOtherPlayer());
targetPlayerSide = playerSide.getOtherPlayer();
}
int numMinionsToActuallySummon = numMinions_;
if (targetPlayer.getNumEmptyBoardSpace() < numMinionsToActuallySummon) {
numMinionsToActuallySummon = targetPlayer.getNumEmptyBoardSpace();
}
for (int index = 0; index < numMinionsToActuallySummon; ++index) {
try {
Minion newMinion = minionClass_.newInstance();
if (sideToSummon == PlayerSide.WAITING_PLAYER)
toRet = newMinion.summonMinion(targetPlayerSide, CharacterIndex.fromInteger(targetPlayer.getNumMinions()), toRet, false);
else
toRet = newMinion.summonMinion(targetPlayerSide, originIndex.indexToLeft(), toRet, false);
} catch (InstantiationException | IllegalAccessException e) {
throw new RuntimeException("Unable to instantiate card.");
}
}
return toRet;
}
}