package Roguelike.Entity.AI.BehaviourTree.Selectors;
import Roguelike.Entity.GameEntity;
import Roguelike.Entity.AI.BehaviourTree.BehaviourTree.BehaviourTreeState;
import com.badlogic.gdx.utils.Array;
// A selector that will keep randomly selecting a node until the first non-failed node is found
public class SelectorRandom extends AbstractSelector
{
//####################################################################//
//region Public Methods
//----------------------------------------------------------------------
@Override
public BehaviourTreeState evaluate(GameEntity entity)
{
BehaviourTreeState state = BehaviourTreeState.FAILED;
if (i == -1)
{
numList.clear();
for (int i = 0; i < nodes.size; i++) { numList.add(i); }
while (state == BehaviourTreeState.FAILED && numList.size > 0)
{
int ti = ran.nextInt(numList.size);
i = numList.get(ti);
numList.removeIndex(ti);
state = nodes.get(i).evaluate(entity);
}
}
if (state != BehaviourTreeState.RUNNING)
{
i = -1;
}
this.State = state;
return state;
}
//----------------------------------------------------------------------
@Override
public void cancel()
{
i = -1;
for (int i = 0; i < nodes.size; i++)
{
nodes.get(i).cancel();
}
}
//endregion Public Methods
//####################################################################//
//region Data
//----------------------------------------------------------------------
private final java.util.Random ran = new java.util.Random();
//----------------------------------------------------------------------
private final Array<Integer> numList = new Array<Integer>(false, 16);
//----------------------------------------------------------------------
private int i = -1;
//endregion Data
//####################################################################//
}