IEnumerator Atacar() { int guerrerosEnCapital = 0; while (puntosDispAux > StageData.COSTE_PA_ATACAR) { for (int i = guerrerosDisponibles.Count - 1; i >= 0; i--) { if (guerrerosDisponibles[i] == null) { guerrerosDisponibles.Remove(guerrerosDisponibles[i]); } else { guerrerosDisponibles[i].AvanzarHaciaDestino(ref puntosDispAux); while (!guerrerosDisponibles[i].AccionTerminada()) { yield return(null); } } } if (guerrerosDisponibles.Count <= MINIMO_GUERREROS) { estado = EstadoAtaque.Preparacion; } } fin = true; }
IEnumerator ColocarTropasEnCapital() { Node nodoDestino = StageData.currentInstance.GetNodeFromPosition(jug.capitalesEnemigas[objetivoActual].transform.position); //obtenemos nodos suficientes alrededor para colocar a los guerreros casillasDestinoPreparacion = new List <Node>(); int radioNecesario = guerrerosDisponibles.Count / 8; while (casillasDestinoPreparacion.Count <= guerrerosDisponibles.Count) { radioNecesario++; casillasDestinoPreparacion = Control.GetNodosAlAlcance(nodoDestino, radioNecesario); } //asignamos a cada unidad un destino for (int i = 0; i < guerrerosDisponibles.Count; i++) { guerrerosDisponibles[i].SetDestino(casillasDestinoPreparacion[i]); while (!guerrerosDisponibles[i].caminoListo) { yield return(null); } } estado = EstadoAtaque.Ataque; //al terminar, volvemos a ejecutar para empezar la accion en si Ataca(objetivoActual, puntosDispAux); }
IEnumerator dirigirTropas() { un.caminoListo = false; StageData.currentInstance.GetPathToTarget(this.transform.position, jug.capitalesEnemigas[objetivoActual].transform.position, un); while (!un.caminoListo) { yield return(null); } caminoCapial = un.caminoActual; //se preparan las tropas a una distancia segura //elegimos alrededor de que nodo se concentraran Node nodoDestino = StageData.currentInstance.GetNodeFromPosition(caminoCapial[caminoCapial.Count - DISTANCIA_PREPARACION_CAPITAL]); //obtenemos nodos suficientes alrededor para colocar a los guerreros casillasDestinoPreparacion = new List <Node>(); int radioNecesario = guerrerosDisponibles.Count / 8; while (casillasDestinoPreparacion.Count <= guerrerosDisponibles.Count) { radioNecesario++; casillasDestinoPreparacion = Control.GetNodosAlAlcance(nodoDestino, radioNecesario); } //asignamos a cada unidad un destino for (int i = 0; i < guerrerosDisponibles.Count; i++) { guerrerosDisponibles[i].SetDestino(casillasDestinoPreparacion[i]); while (!guerrerosDisponibles[i].caminoListo) { yield return(null); } } estado = EstadoAtaque.Preparacion; //al terminar, volvemos a ejecutar para empezar la accion en si Ataca(objetivoActual, puntosDispAux); fin = true; }
public void Ataca(int objetivo, int puntosDisponibles, bool empezarDeCero = false) { puntosDispAux = puntosDisponibles; if (empezarDeCero) { estado = EstadoAtaque.Planificacion; } fin = false; switch (estado) { case EstadoAtaque.Planificacion: objetivoActual = objetivo; guerrerosDisponibles.Clear(); //contamos los guerreros y si hay poca el ataque se cancela //se obtienen los guerreros de los que se dispone for (int i = 0; i < jug.unidadesDisponibles.Count; i++) { if (jug.unidadesDisponibles[i].IdUnidad == TipoUnidad.Warrior) { guerrerosDisponibles.Add((IA_Guerrero)jug.unidadesDisponibles[i]); } } StartCoroutine("dirigirTropas"); puntosDispAux = puntosDisponibles; break; case EstadoAtaque.Preparacion: puntosDispAux = puntosDisponibles; StartCoroutine("PrepararTropas"); break; case EstadoAtaque.Ataque: puntosDispAux = puntosDisponibles; StartCoroutine("Atacar"); break; } }