IEnumerator CoDejarPasar(Vector2 posFinalOtro) { if (npc.estadoActual != EstadoNPC.Ocupado) { yield return(new WaitWhile(() => pies.moviendo)); Suelo sueloActual, sueloAux; if (posOcupadas.Count == 0) { AddPosActual(); } sueloActual = new Suelo(posOcupadas[0], posOcupadas[0], m_ciudad, true, this); foreach (Data posible in sueloActual.GetPosibles()) { sueloAux = (Suelo)posible; if (sueloAux.PosicionNPC != posFinalOtro) { MoverOcupar(sueloAux.PosicionNPC); yield return(new WaitWhile(() => pies.moviendo)); npc.estadoActual = EstadoNPC.Quieto; yield break; } } } }
private bool EsPosibleMoverOcupar(Vector2 posInicial, Vector2 posFinal) { if (posInicial.x != posFinal.x && posInicial.y != posFinal.y) { return(false); } if (posInicial.x == posFinal.x && Mathf.Abs(posInicial.y - posFinal.y) > 1) { return(false); } if (posInicial.y == posFinal.y && Mathf.Abs(posInicial.x - posFinal.x) > 1) { return(false); } return(Suelo.EsPosible(posInicial, posFinal, m_ciudad, considerarNPCs, this, false)); }
//Verifica si las rutas se cruzan, si el otro npc ya lo verifico entonces obtiene su valor. private bool RutasCruzadas(NPC otroNPC) { bool rutasCruzadas; if (m_triggeredNPCs.ContainsKey(otroNPC)) { rutasCruzadas = m_triggeredNPCs[otroNPC]; m_triggeredNPCs.Remove(otroNPC); } else { rutasCruzadas = Suelo.RutasCruzadas(pathfinderNpc.GetRutaFiltrada(), otroNPC.pathfinder.GetRutaFiltrada(), m_npc.ciudad, pathfinderNpc, otroNPC.pathfinder); otroNPC.ojos.m_triggeredNPCs.Add(m_npc, rutasCruzadas); } return(rutasCruzadas); }
public static bool RutasCruzadas(List <Vector2> rutaA, List <Vector2> rutaB, Ciudad ciudad, PathfinderNPC npcA, PathfinderNPC npcB) { Suelo suelo; //En teoria nunca deberia haber un personaje caminando sin ultima posicion que este caminando. (WIP) #TO.DO if (npcB.ultimaPosicion == null) { return(true); } if (npcA.ultimaPosicion == null) { return(false); } Vector2 posFinal = npcB.ultimaPosicion.Value; //Ignora la ultima posicion si ambos van hacia alla. TEST QUE PASA SI LA POS FINAL NO ES UN EDIFICIO! bool ignorarUltimaPos = npcA.ultimaPosicion.Value == npcB.ultimaPosicion.Value; if (ignorarUltimaPos) { rutaA.Remove(npcA.ultimaPosicion.Value); rutaB.Remove(npcB.ultimaPosicion.Value); } for (int a = 0; a < rutaA.Count; a++) { for (int b = 0; b < rutaB.Count; b++) { if (Mathf.Abs(rutaA[a].x - rutaB[b].x) + Mathf.Abs(rutaA[a].y - rutaB[b].y) == 1) { PosRutaActual tiempoLlegada; if (npcA.rutaActual.TryGetValue(rutaB[b], out tiempoLlegada)) { suelo = new Suelo(rutaA[a], posFinal, ciudad, true, npcA); if (!suelo.EsPosible(tiempoLlegada.m_tiempo, npcB, rutaB[b], ignorarUltimaPos: ignorarUltimaPos)) { //Debug.LogError(rutaA[a] + " -> " + rutaB[b]); return(true); } } } } } //Debug.LogError("NO CRUZAN"); return(false); }
private float GetCostToNode(Suelo suelo) { if (suelo.PosicionNPC == this.PosicionNPC) { return(0.4f); } ESuelo tipoSuelo = (ESuelo)m_ciudad.PosicionesActuales[(int)suelo.PosicionNPC.x, (int)suelo.PosicionNPC.y]; switch (tipoSuelo) { case ESuelo.Marmol: return(0.9f); case ESuelo.Camino: return(1); case ESuelo.Tierra: return(1.5f); case ESuelo.Pasto: return(2f); case ESuelo.Arena: return(4f); default: return(0); } }
public override bool Comparar(Data data) { Suelo grilla = (Suelo)data; return(grilla.Comparador.Equals(this.Comparador)); }
public static bool EsPosible(Vector2 posInicial, Vector2 posObjetivo, Ciudad ciudad, bool considerarNPCs, PathfinderNPC npc, bool usarMargen = true) { Suelo suelo = new Suelo(posInicial, posObjetivo, ciudad, considerarNPCs, npc); return(suelo.EsPosible(posObjetivo, usarMargen)); }
private bool EsPosible(Vector2 posInicial, Vector2 posFinal) { return(Suelo.EsPosible(posInicial, posFinal, m_ciudad, considerarNPCs, this, false)); }