private static IEnumerable <ADecisionNode> createMoveToEntityTree(DecisionTree p_aiDecisionTree, ADecisionNode p_rootNode, Entity p_sourceEntity, Entity p_targetEntity) { MoveToEntityNode l_moveToEntityNode = MoveToEntityNode.alloc(p_sourceEntity, p_targetEntity); DecisionTree.linkDecisionNodes(p_aiDecisionTree, p_rootNode, l_moveToEntityNode); return(createMoveToNavigationNodesLink(p_aiDecisionTree, l_moveToEntityNode)); }
/// <summary> /// Calculates all possibilities to move next to the Entity provided by <paramref name="p_moveToEntityNode"/>. /// </summary> private static IEnumerable <ADecisionNode> createMoveToNavigationNodesLink(DecisionTree p_aiDecisionTree, MoveToEntityNode p_moveToEntityNode) { var l_reachableNavigationNodes = NavigationGraphAlgorithm.getReachableNeighborNavigationNodes( NavigationGraphContainer.UniqueNavigationGraph, p_moveToEntityNode.TargetEntity.CurrentNavigationNode, NavigationGraphFlag.CURRENT).GetEnumerator(); while (l_reachableNavigationNodes.MoveNext()) { MoveToNavigationNodeNode l_moveToNavigationNodeNode = MoveToNavigationNodeNode.alloc(p_moveToEntityNode.SourceEntity.CurrentNavigationNode, l_reachableNavigationNodes.Current); DecisionTree.linkDecisionNodes(p_aiDecisionTree, p_moveToEntityNode, l_moveToNavigationNodeNode); yield return(l_moveToNavigationNodeNode); } /* If the source entity is already a neighbor of the target entity, we still create a node to move to same position to simulate the fact of staying at the same position. */ if (NavigationGraphAlgorithm.areNavigationNodesNeighbors( NavigationGraphContainer.UniqueNavigationGraph, p_moveToEntityNode.SourceEntity.CurrentNavigationNode, p_moveToEntityNode.TargetEntity.CurrentNavigationNode, NavigationGraphFlag.SNAPSHOT)) { MoveToNavigationNodeNode l_moveToNavigationNodeNode = MoveToNavigationNodeNode.alloc(p_moveToEntityNode.SourceEntity.CurrentNavigationNode, p_moveToEntityNode.SourceEntity.CurrentNavigationNode); DecisionTree.linkDecisionNodes(p_aiDecisionTree, p_moveToEntityNode, l_moveToNavigationNodeNode); yield return(l_moveToNavigationNodeNode); } }