Пример #1
0
 public ExecutableAction(string _label, WorldStateModifier <TKey, TValue> _preconditions, WorldStateModifier <TKey, TValue> _effects, float _baseUtility)
 {
     m_Label         = _label;
     m_Preconditions = _preconditions;
     m_Effects       = _effects;
     m_BaseUtility   = _baseUtility;
 }
Пример #2
0
        public List <PlannerNode <TKey, TValue> > GetNeighbours(PlannerNode <TKey, TValue> _baseNode)
        {
            m_NeighbourNodes.Clear();

            WorldStateModifier <TKey, TValue> basePreconditions    = _baseNode.Action?.GetPreconditions();
            WorldState <TKey, TValue>         worldStateAtBaseNode = _baseNode.GetWorldStateAtNode();
            Goal <TKey, TValue> goalWorldStateAtBaseNode           = _baseNode.GetGoalWorldStateAtNode();

            WorldState <TKey, TValue> remainingGoals = goalWorldStateAtBaseNode - worldStateAtBaseNode;

            // We implement regressive A* for GOAP by chaining action preconditions to action effects until all preconditions are fulfilled.
            // For this planner, neighbours are nodes that fulfil any of the remaining goals of the base node without conflicting with any of its preconditions.

            foreach (IAction <TKey, TValue> possibleAction in m_CurrentAgent.GetActionSet())
            {
                var effects = possibleAction.GetEffects();

                if (!effects.ContainsAny(remainingGoals))
                {
                    continue;
                }

                if (effects.ConflictsAny(basePreconditions))
                {
                    continue;
                }

                PlannerNode <TKey, TValue> plannerNode = GetAvailablePlannerNode();
                plannerNode.Init(possibleAction);

                plannerNode.CalculateWorldStateAtNode(worldStateAtBaseNode);
                plannerNode.CalculateGoalWorldStateAtNode(goalWorldStateAtBaseNode);

                bool foundInUsed = false;
                foreach (PlannerNode <TKey, TValue> usedNode in m_UsedNodes)
                {
                    if (usedNode.Equals(plannerNode))
                    {
                        plannerNode = usedNode;
                        foundInUsed = true;
                        break;
                    }
                }

                m_NeighbourNodes.Add(plannerNode);

                if (!foundInUsed)
                {
                    m_UsedNodes.Add(plannerNode);
                }
            }

            return(m_NeighbourNodes);
        }
Пример #3
0
 public void SetPreconditions(WorldStateModifier <string, object> _preconditons)
 {
     m_Preconditions = _preconditons;
 }
Пример #4
0
 public void SetEffects(WorldStateModifier <string, object> _effects)
 {
     m_Effects = _effects;
 }