Ejemplo n.º 1
0
    public override bool perform(GameObject agent)
    {
        if (startTime == 0)
        {
            startTime = Time.time;
        }
        targetEstanteComponent.isUsed = true;
        //Debug.Log("startTime" + startTime);

        if (Time.time - startTime > workDuration)
        {
            //Debug.Log(Time.time-startTime);
            // finished filled
            BackpackComponent backpack         = (BackpackComponent)agent.GetComponent(typeof(BackpackComponent));
            EstanteComponent  estanteComponent = targetEstanteComponent;

            Debug.LogError("desiredFood " + DesiredFood);
            if (estanteComponent.alimento == DesiredFood)
            {
                int    preTakeAmount = 0;
                Client aux           = null;
                if (agent.GetComponent <Labourer>() is Client)
                {
                    aux           = (Client)agent.GetComponent <Client>();
                    preTakeAmount = aux.listaDelaCompraDictionary[DesiredFood];   //ESTA CANTIDAD NO ES LA CANTIDAD QUE SE COGE FINALMENTE , SIMPLEMENTE ES LA CANTIDAD QUE DESEA COGER
                }
                int canFillAmount = backpack.canFill(DesiredFood, preTakeAmount); //Cantidad de ese alimento que puede meter en su inventario a pesar de que su idea fuera meter mas.
                Debug.LogError(canFillAmount + " canfill");
                //TakedAmount es la cantidad que si ha podido coger en base a la disponibilidad de ese producto en el almacen y teniendo en cuenta que ya se valoro la disponibilidad del propio inventario
                int takedAmount = estanteComponent.Take(canFillAmount);
                Debug.LogError(takedAmount + " taked");
                int r = backpack.Fill(DesiredFood, takedAmount);
                Debug.LogError(r + " fill");
                //Debug.Log("Creo que estoy embuclado " + canFillAmount + " " + alimentoRandom);

                //HEMOS COGIDO LA COMIDA , AHORA HAY QUE ACTUALIZAR LA LISTA DE LA COMPRA
                aux.updateBuyList(DesiredFood, r);
                targetEstanteComponent.isUsed = false;
                if (aux.listaDelaCompra.Count == 0)
                {
                    addEffect("isListComplete", true);
                }
                taked = true;
            }
            else
            {
                return(false); //Se ha fallado al intentar conseguir el alimento del estante que queriamos.
            }
            //Debug.Log("He salido de un bucle");
        }
        return(true);
    }
Ejemplo n.º 2
0
    public override bool checkProceduralPrecondition(GameObject agent)
    {
        EstanteComponent[] estantes = FindObjectsOfType(typeof(EstanteComponent)) as EstanteComponent[];
        EstanteComponent   closest  = null;
        float closestDist           = 0;

        if (agent.GetComponent <Client>().listaDelaCompra.Count != 0)
        {
            DesiredFood = agent.GetComponent <Client>().listaDelaCompra[Random.Range(0, agent.GetComponent <Client>().listaDelaCompra.Count)];
        }
        //Busca una estanteria no vacia , sin usar y con el alimento que desea
        foreach (EstanteComponent estante in estantes)
        {
            if (!estante.isEmpty() && !estante.isUsed && estante.alimento == DesiredFood)
            {
                if (closest == null)
                {
                    // first one, so choose it for now
                    closest     = estante;
                    closestDist = (estante.gameObject.transform.position - agent.transform.position).magnitude;
                }
                else
                {
                    // is this one closer than the last?
                    float dist = (estante.gameObject.transform.position - agent.transform.position).magnitude;
                    if (dist < closestDist)
                    {
                        // we found a closer one, use it
                        closest     = estante;
                        closestDist = dist;
                    }
                }
                Debug.Log(closest.name);
            }
        }

        targetEstanteComponent = closest;
        if (targetEstanteComponent != null)
        {
            target = targetEstanteComponent.gameObject;
        }
        return(closest != null);
    }
    public override bool perform(GameObject agent)
    {
        BackpackComponent backpack = (BackpackComponent)agent.GetComponent(typeof(BackpackComponent));

        if (backpack.KindsOfFoodAvailable().Contains(FillerFood))
        {
            if (startTime == 0)
            {
                startTime = Time.time;
            }
            targetEstanteComponent.isUsed = true;    //Se ocupa la estanteria por tanto nadie mas puede acceder.
            //(Asi tambien resolvemos temas de concurrencia , aunque se podria hacer que pudieran "modificar" varios)

            if (Time.time - startTime > workDuration)
            {
                // finished filled
                EstanteComponent estante = targetEstanteComponent;

                int filledAmount = estante.canFill(FillerFood, backpack.dictionary[FillerFood]);
                // Debug.LogError(filledAmount + " Amount i can fill");
                int takedAmount = backpack.Take(FillerFood, filledAmount);
                // Debug.LogError(takedAmount + " Amount i take considering the one i can fill");
                int a = estante.Fill(FillerFood, takedAmount);
                // Debug.LogError(a + " Amount i fill considering the one i take");
                filled = true;

                //SOLO si nos quedamos sin comida en la mochila añadimos el efecto
                //(Se deberia hacer en el constructor, yo creo q no porq no es algo q se sabe que se cumple a priori)
                if (!backpack.HasFood())
                {
                    addEffect("hasFood", false);
                }
                targetEstanteComponent.isUsed = false;
            }
        }
        else
        {
            return(false);
        }
        return(true);
    }
Ejemplo n.º 4
0
 public override void reset()
 {
     taked = false;
     targetEstanteComponent = null;
     startTime = 0;
 }
    public override bool checkProceduralPrecondition(GameObject agent)
    {
        Debug.Log("Check Procedural");
        // find the nearest stand we can fill
        EstanteComponent[] estantes = FindObjectsOfType(typeof(EstanteComponent)) as EstanteComponent[];
        EstanteComponent   closest  = null;
        float closestDist           = 0;

        //PRIMERO SE PRIORIZA RELLENAR LAS ESTANTERIAS VACIAS && QUE NO ESTEN EN USO
        foreach (EstanteComponent estante in estantes)
        {
            if (estante.isEmpty() && !estante.isUsed)
            {
                if (closest == null)
                {
                    // first one, so choose it for now
                    closest     = estante;
                    closestDist = (estante.gameObject.transform.position - agent.transform.position).magnitude;
                }
                else
                {
                    // is this one closer than the last?
                    float dist = (estante.gameObject.transform.position - agent.transform.position).magnitude;
                    if (dist < closestDist)
                    {
                        // we found a closer one, use it
                        closest     = estante;
                        closestDist = dist;
                    }
                }
            }
        }

        //SI HEMOS ENCONTRADO UNA VACIA SE SELECCIONA ESA Y SE DICE QUE SE PUEDE RELLENAR && QUE NO ESTEN EN USO
        if (closest != null)
        {
            //Toma un alimento al azar pero tienen mayor probabilidad aquellos de los que almacene mas cantidad
            List <Alimento.enAlimentos> auxList = agent.GetComponent <BackpackComponent>().alimentos;
            if (auxList.Count > 0)
            {
                FillerFood = auxList[(int)(UnityEngine.Random.Range(0, auxList.Count - 1.0f))];
            }
            //Debug.Log(FillerFood);
            targetEstanteComponent = closest;
            target = targetEstanteComponent.gameObject;
            return(closest != null);
        }

        //SEGUNDO SE PRIORIZA RELLENAR AQUELLAS CON EL MISMO PRODUCTO QUE SE TIENE Y QUE NO ESTEN LLENAS Y QUE NO ESTE EN USO
        foreach (EstanteComponent estante in estantes)
        {
            if (agent.GetComponent <BackpackComponent>().HasFood(estante.alimento) && !estante.isFull() && !estante.isUsed)//DEBUG
            {
                if (closest == null)
                {
                    // first one, so choose it for now
                    closest     = estante;
                    closestDist = (estante.gameObject.transform.position - agent.transform.position).magnitude;
                }
                else
                {
                    // is this one closer than the last?
                    float dist = (estante.gameObject.transform.position - agent.transform.position).magnitude;
                    if (dist < closestDist)
                    {
                        // we found a closer one, use it
                        closest     = estante;
                        closestDist = dist;
                    }
                }
            }
        }

        if (closest != null)
        {
            //SI HEMOS ENCONTRADO UNA QUE CUMPLA LA SEGUNDA POSIBLE SE SELECCIONA ESA Y SE DICE QUE SE PUEDE RELLENAR
            FillerFood             = closest.alimento;
            targetEstanteComponent = closest;
            target = targetEstanteComponent.gameObject;
        }
        return(closest != null);
    }