Exemplo n.º 1
0
    public void Atacar()
    {
        if (bocadillos.hormigaSeleccionada != null && bocadillos.hormigaSeleccionada == this)
        {
            if (this.agente.isOnOffMeshLink)
            {
                bocadillos.Nada();
            }
            else
            {
                bocadillos.Atacar();
            }
        }

        // Si el enemigo al que tenia asignado como orden, muere, me quito la orden
        if (enemigoAlQueAtacarPorOrden == null)
        {
            if (hayOrdenDeAtacar)
            {
                hayOrdenDeAtacar = false;
                this.SacarDeOcupadas();
                Task.current.Succeed();
                return;
            }
        }

        // Si no tengo enemigo al que atacar, miro los enemigos cerca
        if (enemigoAlQueAtacar == null)
        {
            if (enemigosCerca.Count > 0)
            {
                enemigoAlQueAtacar = enemigosCerca[0];
                if (!enemigoAlQueAtacar.hormigasAtacandole.Contains(this))
                {
                    enemigoAlQueAtacar.hormigasAtacandole.Add(this);
                }
                Task.current.Succeed();
                return;
            }
            else if (enemigoAlQueAtacarPorOrden == null)
            {
                Task.current.Fail();
                return;
            }
        }

        // Si me encuentro un enemigo por el camino al que atacar
        if (enemigoAlQueAtacar != null)
        {
            // Me encuentro a un enemigo, aunque tenga orden

            // Elimino todo lo que esté haciendo, pero no le quito la orden
            // reina.DesasignarComidaACoger(this);
            // Suelto la comida, pero no la desasigno
            if (comida != null && comida.laEstanLLevando)
            {
                comida.transform.SetParent(null);
                comida.laEstanLLevando = false;
                posComida      = Vector3.zero;
                posDejarComida = Vector3.zero;
            }

            //reina.DesasignarHormigaACurar(this);
            // Dejo de curar a la hormgia pero no la desasigno
            if (hormigaACurar != null)
            {
                // No hace falta hacer nada
            }

            //reina.DesasignarHuevoACurar(this);
            // Dejo de cuidar un huevo pero no lo desasigno
            if (huevoACuidar != null)
            {
                // No hace falta hacer nada
            }

            // Asigno la posición a la que hay que ir
            agente.SetDestination(enemigoAlQueAtacar.transform.position);

            // En el momento que esté cerca
            if (Vector3.Distance(transform.position, enemigoAlQueAtacar.transform.position) < 1.2f)
            {
                if (tiempoEntreAtaques <= 0)
                {
                    float random = Random.Range(0, 10);
                    if (random < 9f)
                    {
                        enemigoAlQueAtacar.quitarVida(this.daño);
                    }
                    else
                    {
                        //Debug.Log("Ataque fallido");
                    }
                    tiempoEntreAtaques = tiempoEntreAtaquesMax;
                    Task.current.Succeed();
                    return;
                }
                else
                {
                    Vector3 randomDirection = UnityEngine.Random.insideUnitSphere * 1 + enemigoAlQueAtacar.transform.position;
                    agente.SetDestination(randomDirection);
                    tiempoEntreAtaques -= Time.deltaTime;
                    Task.current.Succeed();
                    return;
                }
            }
            else
            {
                // Te estás acercando al enemigo
                agente.SetDestination(enemigoAlQueAtacar.transform.position);
                Task.current.Succeed();
                return;
            }
        }

        // Si tengo un enemigo mandado por orden
        else if (enemigoAlQueAtacarPorOrden != null)
        {
            // Si tengo orden de atacar a un enemigo
            reina.DesasignarComidaACoger(this);
            reina.DesasignarHormigaACurar(this);
            reina.DesasignarHuevoACurar(this);

            agente.SetDestination(enemigoAlQueAtacarPorOrden.transform.position);

            // En el momento que esté cerca
            if (Vector3.Distance(transform.position, enemigoAlQueAtacarPorOrden.transform.position) < 1.2f)
            {
                if (tiempoEntreAtaques <= 0)
                {
                    float random = Random.Range(0, 10);
                    if (random < 9f)
                    {
                        enemigoAlQueAtacarPorOrden.quitarVida(this.daño);
                    }
                    else
                    {
                        //Debug.Log("Ataque fallido");
                    }
                    tiempoEntreAtaques = tiempoEntreAtaquesMax;
                    Task.current.Succeed();
                    return;
                }
                else
                {
                    Vector3 randomDirection = UnityEngine.Random.insideUnitSphere * 1 + enemigoAlQueAtacarPorOrden.transform.position;
                    agente.SetDestination(randomDirection);
                    tiempoEntreAtaques -= Time.deltaTime;
                    Task.current.Succeed();
                    return;
                }
            }
            else
            {
                // Te estás acercando al enemigo
                agente.SetDestination(enemigoAlQueAtacarPorOrden.transform.position);
                Task.current.Succeed();
                return;
            }
        }
    }