Esempio n. 1
0
        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));
        }
Esempio n. 2
0
        /// <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);
            }
        }