package Roguelike.Entity.AI.BehaviourTree.Selectors;
import java.util.Iterator;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.XmlReader.Element;
import Roguelike.Entity.GameEntity;
import Roguelike.Entity.AI.BehaviourTree.BehaviourTree.BehaviourTreeState;
public class SelectorAny extends AbstractSelector
{
Array<Integer> runningList = new Array<Integer>();
@Override
public BehaviourTreeState evaluate(GameEntity entity)
{
BehaviourTreeState state = BehaviourTreeState.FAILED;
if (runningList.size > 0)
{
Iterator<Integer> itr = runningList.iterator();
while (itr.hasNext())
{
BehaviourTreeState temp = nodes.get(itr.next()).evaluate(entity);
if (state != BehaviourTreeState.RUNNING && temp == BehaviourTreeState.SUCCEEDED)
{
state = temp;
itr.remove();
}
else if (temp == BehaviourTreeState.RUNNING)
{
state = temp;
}
else
{
itr.remove();
}
}
}
else
{
for (int i = 0; i < nodes.size; i++)
{
BehaviourTreeState temp = nodes.get(i).evaluate(entity);
if (state != BehaviourTreeState.RUNNING && temp == BehaviourTreeState.SUCCEEDED)
{
state = temp;
}
else if (temp == BehaviourTreeState.RUNNING)
{
state = temp;
runningList.add(i);
}
}
}
if (reset)
{
runningList.clear();
}
this.State = state;
return state;
}
@Override
public void cancel()
{
for (int i = 0; i < nodes.size; i++)
{
nodes.get(i).cancel();
}
runningList.clear();
}
//----------------------------------------------------------------------
@Override
public void parse(Element xmlElement)
{
super.parse(xmlElement);
reset = xmlElement.getBooleanAttribute("Reset", false);
}
//----------------------------------------------------------------------
public boolean reset = false;
}