private void evaluateActions() { List <DecisionInfoObject> debugText = new List <DecisionInfoObject>(); //print("****EVALUATE****"); dirty = false; PriorityQueue endeavourQueue = new PriorityQueue(); List <Endeavour> staleEndeavours = new List <Endeavour>(); //print("\tCurrent Endeavours"); foreach (Endeavour action in currentEndeavours) { if (action.isStale()) { //print("\t\tstale: " + action.getName()); action.stopExecution(); staleEndeavours.Add(action); } else { //print("\t\t++" + action.getName()); availableEndeavours.Add(action); } } //print("\tAvailable Endeavours"); foreach (Endeavour action in availableEndeavours) { if (action.isStale()) { //print("\t\t--" + action.getName()); staleEndeavours.Add(action); } else { //print("\t\t++" + action.getName()); endeavourQueue.Enqueue(action); } } foreach (Endeavour action in staleEndeavours) { //print("remove: " + action.getName()); availableEndeavours.Remove(action); currentEndeavours.Remove(action); } HashSet <Endeavour> proposedEndeavours = new HashSet <Endeavour>(); Dictionary <System.Type, int> componentMap = getComponentUsageMap(); #if UNITY_EDITOR bool maxPrioritySet = false; float localMaxPriority = 0; float localMinPriority = 0; #endif while (endeavourQueue.Count > 0) { Endeavour action = (Endeavour)endeavourQueue.Dequeue(); if (action.isReady(componentMap)) { #if UNITY_EDITOR if (debug) { float priority = action.getPriority(); if (!maxPrioritySet) { maxPrioritySet = true; localMaxPriority = priority; localMinPriority = priority; } else { if (priority > localMaxPriority) { localMaxPriority = priority; } if (priority < localMinPriority) { localMinPriority = priority; } } debugText.Add(new DecisionInfoObject(action.getName(), action.getParent().getName(), priority, true)); } #endif if (proposedEndeavours.Contains(action)) { Debug.LogError("action already proposed!!!"); } proposedEndeavours.Add(action); availableEndeavours.Remove(action); } else { #if UNITY_EDITOR if (debug) { float priority = action.getPriority(); if (!maxPrioritySet) { maxPrioritySet = true; localMaxPriority = priority; localMinPriority = priority; } else { if (priority > localMaxPriority) { localMaxPriority = priority; } if (priority < localMinPriority) { localMinPriority = priority; } } debugText.Add(new DecisionInfoObject(action.getName(), action.getParent().getName(), priority, false)); } #endif if (action.active) { action.stopExecution(); } } } // All previous actions MUST be stopped before we start the new ones foreach (Endeavour action in proposedEndeavours) { if (!action.active) { action.execute(); } } currentEndeavours = proposedEndeavours; #if UNITY_EDITOR if (debug) { lines = debugText; maxPriority = (Mathf.Abs(localMaxPriority) > Mathf.Abs(localMinPriority)) ? Mathf.Abs(localMaxPriority) : Mathf.Abs(localMinPriority); if (shouldAlphabetize) { alphabetize(); } } #endif }