/** * Gets the most relevant goal at the moment * * GOAPGoal GetMostRelevantGoal(bool recalculate) * { * GOAPGoal maxGoal = null; * float highestRelevancy = 0.0f; * float currentTime = Time.timeSinceLevelLoad; * float nextEvalTime; * * float goalRelevance = 0.0f; * for (int i = 0; i < m_GoalSet.Count; i++) * { //First check for timing checks?! * //Don't recalculate the goal relevancy if not asked to do so * * if (recalculate) * { * nextEvalTime = m_GoalSet[i].NextEvaluationTime; * * if (currentTime < nextEvalTime) * { //clear relevancy , we dont want to select these goals * m_GoalSet[i].ClearGoalRelevancy(); * } * else if (!m_GoalSet[i].GetReEvalOnSatisfication() && m_GoalSet[i].IsWSSatisfied(Ai.GetWorldState())) * { * m_GoalSet[i].ClearGoalRelevancy(); * } * else * {// recalculate goal relevancy !!!! * m_GoalSet[i].CalculateGoalRelevancy(); * //m_GoalSet[i].SetNewEvaluationTime(); * //set new timing check time?! * * } * } * // check all goal relevancy * goalRelevance = m_GoalSet[i].GoalRelevancy; * if (goalRelevance > highestRelevancy) * { * highestRelevancy = goalRelevance; * maxGoal = m_GoalSet[i]; * } * * } * return maxGoal; * }*/ /** * Builds a new plan for this agent * @param the agent to build the plan for * @return true if the plan builds successfully, false otherwise */ public GOAPPlan BuildPlan(GOAPGoal goal) { if (goal == null) { return(null); } //if (Owner.debugGOAP) Debug.Log(Time.timeSinceLevelLoad + " " + goal.ToString() + " - build plan"); //initialize shit Map.Initialise(Owner); Goal.Initialise(Owner, Map, goal); Storage.ResetStorage(Map); AStar.End = -1; AStar.RunAStar(Owner); AStarNode currNode = AStar.CurrentNode; if (currNode == null || currNode.NodeID == -1) { Debug.LogError(Time.timeSinceLevelLoad + " " + goal.ToString() + " - FAILED , no node "); return(null); //Building of plan failed } GOAPPlan plan = new GOAPPlan(); //create a new plan GOAPAction action; /** * We need to push each new plan step onto the list of steps until we reach the last action * Which is going to be the goal node and of no use */ //if (Owner.debugGOAP) Debug.Log(Time.timeSinceLevelLoad + " " + goal.ToString() + " current node id :" + currNode.NodeID); while (currNode.NodeID != -1) { action = Map.GetAction(currNode.NodeID); if (action == null) //If we tried to cast an node to an action that can't be done, quit out { Debug.LogError(Time.timeSinceLevelLoad + " " + goal.ToString() + ": canot find action (" + currNode.NodeID + ")"); return(null); } plan.PushBack(action); currNode = currNode.Parent; } //Finally tell the ai what its plan is if (plan.IsDone()) { Debug.LogError(Time.timeSinceLevelLoad + " " + goal.ToString() + ": plan is already done !!! (" + plan.CurrentStepIndex + "," + plan.NumberOfSteps + ")"); return(null); } return(plan); }
public bool IsPlanFinished() { return(Plan == null ? true : Plan.IsDone()); }