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); }
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); }
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); }