Ejemplo n.º 1
0
    private bool CheckIfNextStateIsInPlan()
    {
        //IA2-P3
        var myPlanGOAPStates = planner.GetPlan();
        var myPlanStates     = planner.GetPlan().Select(x => x.generatingAction.linkedState);

        if (myPlanStates.Any())
        {
            var nextStatesInPlan = myPlanStates.Aggregate(new List <IState>(), (acum, state) =>
            {
                //Dentro de mi plan....
                if (acum.Count == 0)                //Mientras que mi acumulador siga vacio
                {
                    if (state == _fsm.CurrentState) //Cuando encuentre mi actual estado
                    {
                        acum.Add(state);            //Lo agrego para que no entre mas al if.
                    }
                }
                else
                {
                    acum.Add(state);     //Agrego todos los siguientes a mi actual
                }

                return(acum);                //Devuelvo todos los siguientes estados.
            })
                                   .Skip(1); //Menos el estado actual.
            List <GOAPState> fromStateToGOAPStates = new List <GOAPState>();
            foreach (var state in nextStatesInPlan)
            {
                foreach (var goapState in myPlanGOAPStates)
                {
                    if (goapState.generatingAction.linkedState == state)
                    {
                        fromStateToGOAPStates.Add(goapState);
                        break;
                    }
                }
            }

            var nextState = fromStateToGOAPStates.Aggregate(new GOAPState(), (selectedState, elem) =>
            {
                Dictionary <string, bool> keyValue = elem.generatingAction.preconditions;
                bool canGoToState = true;
                foreach (var pair in keyValue)
                {
                    if ([email protected][pair.Key] == pair.Value)
                    {
                        canGoToState = false;
                    }
                }

                if (canGoToState)
                {
                    return(elem);
                }
                if (selectedState != null)
                {
                    return(selectedState);
                }
                return(null);
            });
            if (nextState.generatingAction != null)
            {
                _fsm.CurrentState = nextState.generatingAction.linkedState;
                Debug.LogWarning("Cambie a un estado que ya estaba en mi plan ;)");
                return(true);
            }
        }
        return(false);
    }