package com.hearthsim.event.deathrattle;
import com.hearthsim.card.CharacterIndex;
import com.hearthsim.event.effect.EffectCharacter;
import com.hearthsim.event.filter.FilterCharacterUntargetedDeathrattle;
import com.hearthsim.model.PlayerSide;
import com.hearthsim.util.factory.BoardStateFactoryBase;
import com.hearthsim.util.tree.HearthTreeNode;
import com.hearthsim.util.tree.RandomEffectNode;
import java.util.ArrayList;
import java.util.List;
public class DeathrattleEffectRandomMinion extends DeathrattleAction {
private final EffectCharacter effect;
private final FilterCharacterUntargetedDeathrattle filter;
public DeathrattleEffectRandomMinion(EffectCharacter effect, FilterCharacterUntargetedDeathrattle filter) {
this.effect = effect;
this.filter = filter;
}
@Override
public HearthTreeNode performAction(CharacterIndex originIndex, PlayerSide playerSide, HearthTreeNode boardState) {
// TODO could probably be faster and belongs in a more common location
List<CharacterIndex.CharacterLocation> locations = new ArrayList<>();
for (CharacterIndex.CharacterLocation location : boardState.data_) {
if (this.filter.targetMatches(playerSide, null, location.getPlayerSide(), location.getIndex(), boardState.data_)) {
locations.add(location);
}
}
switch (locations.size()) {
case 0: // no targets, do nothing
break;
case 1: // one target, no RNG needed
this.effect.applyEffect(locations.get(0).getPlayerSide(), locations.get(0).getIndex(), boardState);
break;
default: // more than 1 option, generate all possible futures
RandomEffectNode rngNode = new RandomEffectNode(boardState, boardState.getAction());
for (CharacterIndex.CharacterLocation location : locations) {
HearthTreeNode newState = new HearthTreeNode(rngNode.data_.deepCopy());
this.effect.applyEffect(location.getPlayerSide(), location.getIndex(), newState);
BoardStateFactoryBase.handleDeadMinions(newState);
rngNode.addChild(newState);
}
boardState = rngNode;
break;
}
return boardState;
}
}