package Roguelike.Entity.AI.BehaviourTree.Selectors;
import com.badlogic.gdx.utils.XmlReader.Element;
import Roguelike.Entity.GameEntity;
import Roguelike.Entity.AI.BehaviourTree.BehaviourTree.BehaviourTreeState;
// A selector that will run through each node until the first node that does not finish is encountered
public class SelectorSequence extends AbstractSelector
{
//####################################################################//
//region Public Methods
//----------------------------------------------------------------------
@Override
public BehaviourTreeState evaluate(GameEntity entity)
{
BehaviourTreeState state = BehaviourTreeState.SUCCEEDED;
for (; i < nodes.size; i++)
{
BehaviourTreeState temp = nodes.get(i).evaluate(entity);
if (temp != BehaviourTreeState.SUCCEEDED)
{
state = temp;
break;
}
}
if (state != BehaviourTreeState.RUNNING)
{
i = 0;
for (; i < nodes.size; i++)
{
nodes.get(i).cancel();
}
i = 0;
}
if (reset)
{
i = 0;
}
this.State = state;
return state;
}
//----------------------------------------------------------------------
@Override
public void cancel()
{
for (int i = 0; i < nodes.size; i++)
{
nodes.get(i).cancel();
}
i = 0;
}
//----------------------------------------------------------------------
@Override
public void parse(Element xmlElement)
{
super.parse(xmlElement);
reset = xmlElement.getBooleanAttribute("Reset", false);
}
//endregion Public Methods
//####################################################################//
//region Data
//----------------------------------------------------------------------
public boolean reset = false;
//----------------------------------------------------------------------
private int i = 0;
//endregion Data
//####################################################################//
}