package com.hearthsim.event.effect; import com.hearthsim.card.Card; 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 EffectCharacterSummonNew<T extends Card> implements EffectCharacter<T> { private Class<? extends Minion> minionClass; private int count; private boolean atEnd; public EffectCharacterSummonNew(Class<? extends Minion> minionClass) { this(minionClass, 1); } public EffectCharacterSummonNew(Class<? extends Minion> minionClass, int count) { this(minionClass, count, false); } public EffectCharacterSummonNew(Class<? extends Minion> minionClass, int count, boolean atEnd) { this.minionClass = minionClass; this.count = count; this.atEnd = atEnd; } @Override public HearthTreeNode applyEffect(PlayerSide targetSide, CharacterIndex targetCharacterIndex, HearthTreeNode boardState) { // TODO this kind of check belongs in a pre-check/filter PlayerModel player = boardState.data_.modelForSide(targetSide); if (player.isBoardFull()) { return null; } for (int i = 0; i < this.count; i++) { try { Minion summon = this.minionClass.newInstance(); summon.hasBeenUsed(true); if (atEnd) { boardState = summon.summonMinionAtEnd(targetSide, boardState, true); } else { boardState = summon.summonMinion(targetSide, targetCharacterIndex, boardState, true); } } catch (InstantiationException | IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } player = boardState.data_.modelForSide(targetSide); if (player.isBoardFull()) { break; } } // if no origin is set then we have no idea whether we are in the original state. copy our base minion and summon a copy. // this is used for Minions with RNG battlecries (e.g. Bomb Lobber) // if (origin == null) { // summon = (Minion)minion.deepCopy(); // } return boardState; } }