//A: gerencia variaveis relacionadas a passagem de turno
    IEnumerator passaTurno()
    {
        yield return(new WaitForSeconds(entreTurnos / 2));

        //A: gerencia criacao de argumentos de ambos (pois existem posturas com retorno de dano, etc)
        if (atributosAdversario.getArgumentos() >= atributosAdversario.atributos.barraArgumento)
        {
            atributosAdversario.setArgumentos(0);
            criaArgumento(atributosAdversario);
            //A: codigo para criar argumento para adversario vai aqui;
        }
        if (atributosPlayer.getArgumentos() >= atributosPlayer.atributos.barraArgumento)
        {
            atributosPlayer.setArgumentos(0);
            criaArgumento(atributosPlayer);
            //A: codigo para criar argumento para jogador vai aqui;
        }

        //A: ajusta indices do alinhamento
        IdxAlinhaAgressivo.SetActive(false);
        IdxAlinhaDiplomatico.SetActive(false);
        IdxAlinhaDireita.SetActive(false);
        IdxAlinhaEsquerda.SetActive(false);
        IdxAlinhaManipulador.SetActive(false);
        IdxAlinhaDirRev.SetActive(false);
        IdxAlinhaEsqRev.SetActive(false);

        //A: esconde fala e exibe resposta
        if (turnoAtual == turno.adversario)
        {
            falasAdversario.SetActive(false);
            if (resposta != "")
            {
                falasPlayer.transform.GetChild(1).GetComponent <Text>().text = resposta;
                falasPlayer.SetActive(true);
            }
        }
        else
        {
            falasPlayer.SetActive(false);

            if (resposta != "")
            {
                falasAdversario.transform.GetChild(1).GetComponent <Text>().text = resposta;
                falasAdversario.SetActive(true);
            }
        }

        yield return(new WaitForSeconds(entreTurnos / 2));

        falasAdversario.SetActive(false);
        falasPlayer.SetActive(false);

        for (int i = 0; i < argumentosPlayer.Length; i++)
        {
            if (argumentosPlayer[i] != null)
            {
                turnoArgumentosPlayer[i]++;

                if (vidaArgumentosPlayer[i] <= 0 || turnoArgumentosPlayer[i] / 2 >= argumentosPlayer[i].duracao)
                {
                    argumentosPlayer[i] = null;
                    quadroArgumentoPlayer[i].GetComponent <QuadroDeArgumento>().LimpaArgumento();
                    numArgumentosPlayer--;
                }
                else
                {
                    if (argumentosPlayer[i].habilidade == CombateArgumento.tipoArgumento.Regenerar && turnoAtual == turno.jogador)
                    {
                        atributosPlayer.curar((int)argumentosPlayer[i].valor);
                    }
                }
            }
        }
        for (int i = 0; i < argumentosAdversario.Length; i++)
        {
            if (argumentosAdversario[i] != null)
            {
                turnoArgumentosAdversario[i]++;

                if (vidaArgumentosAdversario[i] <= 0 || turnoArgumentosAdversario[i] / 2 >= argumentosAdversario[i].duracao)
                {
                    argumentosAdversario[i] = null;
                    quadroArgumentoAdversario[i].GetComponent <QuadroDeArgumento>().LimpaArgumento();
                    numArgumentosAdversario--;
                }
                else
                {
                    if (argumentosAdversario[i].habilidade == CombateArgumento.tipoArgumento.Regenerar && turnoAtual == turno.adversario)
                    {
                        atributosAdversario.curar((int)argumentosAdversario[i].valor);
                    }
                }
            }
        }

        yield return(new WaitForSeconds(entreTurnos / 7));

        resposta = "";
        //A: Verifica se combate acabou
        efetividade.text = "";

        if (atributosPlayer.getVidaAtual() == 0)
        {
            LevelManagerObject.derrota = true;
            endBattle(LevelManagerObject.derrota);
        }
        else if (atributosAdversario.getVidaAtual() == 0)
        {
            LevelManagerObject.derrota = false;
            endBattle(LevelManagerObject.derrota);
        }
        //A: Se nao acabou, passa vez
        else
        {
            if (turnoAtual == turno.adversario)
            {
                turnoAtual = turno.jogador;
                atributosPlayer.Shuffle();
                for (int i = 0; i < nomeAcoes.Length; i++)
                {
                    //escolhe nome aleatorio entre os descritos no array
                    nomeAcoes[i].text = atributosPlayer.getAcao(i).nome[0];
                    //nomeAcoes[i].GetComponent<TooltipObserver>().associaAcao(atributosPlayer.getAcao(i));
                }
                vezDoOutro.SetActive(false);
            }
            else
            {
                turnoAtual = turno.adversario;
                turnoAdversario();
            }
        }
    }
    private void aplicaDano(CombateAtributos atributosAtacante, CombateAcao golpe, CombateAtributos atributosAlvo)
    {
        int   ataque             = atributosAtacante.atributos.dano;
        float multiplicadorGolpe = golpe.dano / 100;
        int   danoResultante;

        if (golpe.tipo != CombateAcao.tipoDano.Neutro)
        {
            //A: ajusta multiplicador conforme tipo
            if (atributosAlvo.isVulneravel((int)golpe.tipo))
            {
                multiplicadorGolpe *= multiplicadorEfetivo + (float)bonusAlinhamento(golpe);

                //A: texto de feedback
                efetividade.color = Color.green;
                efetividade.text  = "super efetivo!";
            }
            else if (atributosAlvo.isResistente((int)golpe.tipo))
            {
                multiplicadorGolpe = multiplicadorGolpe * multiplicadorResistente;

                //A: texto de feedback
                efetividade.color = Color.red;
                efetividade.text  = "pouco efetivo...";
            }
        }
        //A: implementacao da postura Defensivo Fortifica, aumentando o dano
        if (atributosAlvo.atributos.postura == CombateUnidade.posturaUnidade.defensivoFortalece)
        {
            multiplicadorGolpe *= multiplicadorFortalecimento;
            atributosAdversario.setAuxiliar(0);
        }
        danoResultante = (int)((ataque + danoBonusArgumento(atributosAtacante)) * multiplicadorGolpe - (atributosAlvo.atributos.defesa + defesaBonusArgumento(atributosAlvo)));

        //EnemyBattle.SetTrigger("GetHit");
        atacAudio.Play();

        if (atributosAtacante == atributosPlayer)
        {
            EnemyBattle.SetTrigger("GetHit");
            BrunoBattle.SetTrigger("Porrada");
        }
        else
        {
            PlayerBattle.SetTrigger("Dano");
        }

        //A: implementação da postura Reage a Agressivo
        if (atributosAlvo.atributos.postura == CombateUnidade.posturaUnidade.reageAgressivo && golpe.tipo == CombateAcao.tipoDano.Agressivo)
        {
            aplicaDano(atributosAlvo, atributosAlvo.getAcao(0), atributosAtacante);
        }

        //A: implementação da postura Defensivo Fortalece, salva dano levado
        if (atributosAlvo.atributos.postura == CombateUnidade.posturaUnidade.defensivoFortalece && golpe.tipo == CombateAcao.tipoDano.Manipulador)
        {
            atributosAdversario.setAuxiliar(atributosAdversario.getAuxiliar() + 1);
        }

        //A: Garante dano minimo = 1
        if (danoResultante < 1)
        {
            danoResultante = 1;
        }

        //A: implementação da postura ignoraManipulador
        if (atributosAlvo.atributos.postura == CombateUnidade.posturaUnidade.ignoraManipulador && golpe.tipo == CombateAcao.tipoDano.Manipulador)
        {
            danoResultante = 0;

            efetividade.color = Color.blue;
            efetividade.text  = "imune";
        }

        //A: implementação de argumentos de roubo de vida e evasão
        for (int i = 0; i < argumentosPlayer.Length; i++)
        {
            if (argumentosPlayer[i] != null)
            {
                if (argumentosPlayer[i].habilidade == CombateArgumento.tipoArgumento.RoubaVida && atributosAtacante == atributosPlayer)
                {
                    atributosPlayer.curar((int)argumentosPlayer[i].valor * danoResultante);
                }
                else if (argumentosPlayer[i].habilidade == CombateArgumento.tipoArgumento.Evasao && atributosAlvo == atributosPlayer)
                {
                    danoResultante = 0;
                    argumentosPlayer[i].valor--;
                    if (argumentosPlayer[i].valor < 1)
                    {
                        quadroArgumentoAdversario[i].GetComponent <QuadroDeArgumento>().LimpaArgumento();
                    }
                }
            }
        }
        for (int i = 0; i < argumentosAdversario.Length; i++)
        {
            if (argumentosAdversario[i] != null)
            {
                if (argumentosAdversario[i].habilidade == CombateArgumento.tipoArgumento.RoubaVida && atributosAtacante == atributosAdversario)
                {
                    atributosAdversario.curar((int)argumentosAdversario[i].valor * danoResultante);
                }
                else if (argumentosAdversario[i].habilidade == CombateArgumento.tipoArgumento.Evasao && atributosAlvo == atributosAdversario)
                {
                    danoResultante    = 0;
                    efetividade.color = Color.blue;
                    efetividade.text  = "imune";
                    argumentosAdversario[i].valor--;
                    if (argumentosAdversario[i].valor < 1)
                    {
                        quadroArgumentoAdversario[i].GetComponent <QuadroDeArgumento>().LimpaArgumento();
                    }
                }
            }
        }
        atributosAlvo.danifica(danoResultante);



        //A: ajusta multiplicador do alinhamento baseado em ataque escolhido, caso seja vez do player
        if (atributosAtacante.atributos.nome == atributosPlayer.atributos.nome)
        {
            ajustaAlinhamento(golpe);
        }

        //A: incrementa contador de vezes que o tipo de ataque foi usado
        somaTipo(atributosAtacante, golpe);

        //A: ajusta barra de argumentos de acordo caso nao tiver maximo de argumentos
        if ((atributosAtacante.atributos.nome == atributosPlayer.atributos.nome && numArgumentosPlayer < argumentosPlayer.Length && turnoAtual == turno.jogador) || (atributosAtacante.atributos.nome == atributosAdversario.atributos.nome && numArgumentosAdversario < argumentosAdversario.Length && turnoAtual == turno.adversario))
        {
            atributosAtacante.setArgumentos(atributosAtacante.getArgumentos() + golpe.barraArgumento);
        }

        if (turnoAtual == turno.adversario)
        {
            falasAdversario.transform.GetChild(1).GetComponent <Text>().text = golpe.nome[0];
            falasAdversario.SetActive(true);
        }
        else if (turnoAtual == turno.jogador && atributosAtacante == atributosPlayer)
        {
            falasPlayer.transform.GetChild(1).GetComponent <Text>().text = golpe.nome[0];
            falasPlayer.SetActive(true);
        }
    }