Exemple #1
0
 public bool isEqual(CombateAcao comparado)
 {
     if (this.nome == comparado.nome && this.dano == comparado.dano && this.barraArgumento == comparado.barraArgumento && this.tipo == comparado.tipo)
     {
         return(true);
     }
     else
     {
         return(false);
     }
 }
    //A: decide a qual contador somar +1
    private void somaTipo(CombateAtributos atributosAtacante, CombateAcao golpe)
    {
        //A: se jogador foi o atacante
        if (atributosAtacante.atributos.nome == atributosPlayer.atributos.nome)
        {
            switch (golpe.tipo)
            {
            case CombateAcao.tipoDano.Agressivo:

                contaAgressivosPlayer++;
                break;

            case CombateAcao.tipoDano.Manipulador:

                contaManipuladorPlayer++;
                break;

            case CombateAcao.tipoDano.Diplomatico:

                contaDiplomaticoPlayer++;
                break;

            default:
                return;
            }
        }
        else
        {
            switch (golpe.tipo)
            {
            case CombateAcao.tipoDano.Agressivo:

                contaAgressivosAdversario++;
                break;

            case CombateAcao.tipoDano.Manipulador:

                contaManipuladorAdversario++;
                break;

            case CombateAcao.tipoDano.Diplomatico:

                contaDiplomaticoAdversario++;
                break;

            default:
                return;
            }
        }
    }
    //A: calcula dano bonus baseado no alinhamento
    private double bonusAlinhamento(CombateAcao golpe)
    {
        switch (golpe.tipo)
        {
        case CombateAcao.tipoDano.Agressivo:
            if ((int)alinhamentoPlayer == 0)
            {
                return(1);
            }
            else if ((int)alinhamentoPlayer == 0)
            {
                return(0.5);
            }
            else
            {
                return(0);
            }

        case CombateAcao.tipoDano.Manipulador:
            if ((int)alinhamentoPlayer == 4)
            {
                return(1);
            }
            else if ((int)alinhamentoPlayer == 3)
            {
                return(0.5);
            }
            else
            {
                return(0);
            }

        case CombateAcao.tipoDano.Diplomatico:
            if ((int)alinhamentoPlayer == 2)
            {
                return(1);
            }
            else if ((int)alinhamentoPlayer == 1 || (int)alinhamentoPlayer == 3)
            {
                return(0.5);
            }
            else
            {
                return(0);
            }

        default:
            return(0);
        }
    }
    public void Shuffle()
    {
        for (int i = 0; i < acoes.Length; i++)
        {
            int rnd = Random.Range(0, acoes.Length);

            tempGO     = acoes[rnd];
            acoes[rnd] = acoes[i];
            acoes[i]   = tempGO;
        }
        for (int i = 0; i < acoes.Length; i++)
        {
            acoes[i].ShuffleFalas();
        }
    }
    /*private void mudaCor(CombateAtributos atributosAlvo){
     *
     *
     *   if (atributosAlvo.getAtributos().tipo== CombateUnidade.tipoUnidade.Agressivo){
     *      Adversario.transform.GetChild(0).GetComponent<SpriteRenderer>().color=  CorOfensivo.color;
     *
     *  }
     *  else if (atributosAlvo.getAtributos().tipo== CombateUnidade.tipoUnidade.Diplomatico){
     *      Adversario.transform.GetChild(0).GetComponent<SpriteRenderer>().color= CorDiplomatico.color;
     *
     *
     *  }
     *  else  Adversario.transform.GetChild(0).GetComponent<SpriteRenderer>().color= CorManipulador.color;
     *
     *
     *
     * }*/

    //A: ajusta alinhamento conforme ataque escolhido
    private void ajustaAlinhamento(CombateAcao golpe)
    {
        switch (golpe.tipo)
        {
        case CombateAcao.tipoDano.Agressivo:
            if ((int)alinhamentoPlayer > 0)
            {
                IdxAlinhaEsquerda.SetActive(true);
                alinhamentoPlayer--;
            }

            IdxAlinhaAgressivo.SetActive(true);
            break;

        case CombateAcao.tipoDano.Manipulador:

            if ((int)alinhamentoPlayer < 4)
            {
                IdxAlinhaDireita.SetActive(true);
                alinhamentoPlayer++;
            }
            IdxAlinhaManipulador.SetActive(true);
            break;

        case CombateAcao.tipoDano.Diplomatico:
            if ((int)alinhamentoPlayer < 2)
            {
                IdxAlinhaEsqRev.SetActive(true);
                alinhamentoPlayer++;
            }
            else if ((int)alinhamentoPlayer > 2)
            {
                IdxAlinhaDirRev.SetActive(true);
                alinhamentoPlayer--;
            }
            IdxAlinhaDiplomatico.SetActive(true);
            break;

        default:
            return;
        }
    }
 public void associaAcao(CombateAcao novaAssociada)
 {
     acaoAssociada = novaAssociada;
 }
    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);
        }
    }