예제 #1
0
    // Update is called once per frame
    void Update()
    {
        piscaI.Update();
        atk.AttackIntervalUpdate();

        if (Control != Controlador.nulo)
        {
            switch (estado)
            {
            case EstadoDePersonagem.aPasseio:
                #region aPasseio

                bool    noChao = mov.NoChao;
                Vector3 V      = CommandReader.VetorDirecao(Control);
                mov.AplicadorDeMovimentos(V, CommandReader.ButtonDown(1, Control), dados.TemDoubleJump);

                if (V.z <= 0.75f)
                {
                    animador.EfetuarAnimacao(Mathf.Abs(mov.Velocity.x), !noChao);
                }

                atk.UpdateAttack();

                if (CommandReader.ButtonDown(0, Control))
                {
                    BotaoAtacar();
                }

                magic.Update(Control, Dados.PontosDeMana, noChao, dados);

                if (magic.EmTempoDeRecarga && magic.CustoParaRecarga <= Dados.PontosDeMana)
                {
                    estado = EstadoDePersonagem.emCura;
                    mov.AplicadorDeMovimentos(Vector3.zero, false, false);
                }

                if (dados.TemDash && dash.PodeDarDash(noChao) && CommandReader.ButtonDown(3, Control))
                {
                    dash.Start(Mathf.Sign(transform.localScale.x), noChao);
                    estado = EstadoDePersonagem.inDash;
                }

                if (CommandReader.ButtonDown(4, Control))
                {
                    atk.ModificouCorDaEspada(-1, dados);
                }
                else if (CommandReader.ButtonDown(5, Control))
                {
                    atk.ModificouCorDaEspada(1, dados);
                }

                if (V.z > 0.75f && noChao)
                {
                    mov.AplicadorDeMovimentos(Vector3.zero, false, false);
                    animador.EfetuarAnimacao(0, !noChao);
                    ActionManager.VerificaAcao();
                }
                #endregion
                break;

            case EstadoDePersonagem.emCura:
                magic.Update(Control, Dados.PontosDeMana, mov.NoChao, dados);
                break;

            case EstadoDePersonagem.emAtk:
                #region emAtk
                if (!mov.NoChao)
                {
                    mov.AplicadorDeMovimentos(CommandReader.VetorDirecao(Control), CommandReader.ButtonDown(1, Control), dados.TemDoubleJump);
                }
                else
                {
                    mov.AplicadorDeMovimentos(Vector3.Lerp(mov.Velocity.normalized, Vector3.zero, 30 * Time.deltaTime));
                }

                if (atk.UpdateAttack())
                {
                    estado = EstadoDePersonagem.aPasseio;
                }
                #endregion
                break;

            case EstadoDePersonagem.emDano:
                #region emDano
                if (emDano.Update(mov, CommandReader.VetorDirecao(Control)))
                {
                    if (tDamage.agendado)
                    {
                        mov.AplicadorDeMovimentos(Vector3.zero);
                        estado = EstadoDePersonagem.parado;
                        tDamage.Iniciar();
                    }
                    else
                    {
                        estado = EstadoDePersonagem.aPasseio;
                    }
                }
                #endregion
                break;

            case EstadoDePersonagem.downArrowActive:
                #region downArrowActive
                if (!mov.NoChao)
                {
                    piscaI.Start(0.5f, 4);
                    mov.GravityScaled(250);
                }
                else
                {
                    mov.AplicadorDeMovimentos(Vector3.zero, false, false);
                    if (magic.FinalizaDownArrow(mov.NoChao))
                    {
                        estado = EstadoDePersonagem.aPasseio;
                    }
                }
                #endregion
                break;

            case EstadoDePersonagem.inDash:
                #region inDash
                if (dash.Update(Mathf.Sign(transform.localScale.x), Mathf.Sign(CommandReader.VetorDirecao(Control).x)))
                {
                    estado = EstadoDePersonagem.aPasseio;
                }

                if (CommandReader.ButtonDown(0, Control))
                {
                    dash.RetornarAoEstadoDeEspera();
                    estado = EstadoDePersonagem.aPasseio;
                    BotaoAtacar();
                }
                #endregion
                break;

            case EstadoDePersonagem.inCheckPoint:
                #region inCheckPoint

                if (Mathf.Abs(CommandReader.VetorDirecao(GlobalController.g.Control).x) > 0.5f)
                {
                    particulaSaiuDoDescanso.gameObject.SetActive(true);
                    particulaSaiuDoDescanso.Play();
                    particulaDoDescanso.SetActive(false);
                    estado = EstadoDePersonagem.aPasseio;
                    EventAgregator.Publish(EventKey.checkPointExit, null);
                }
                #endregion
                break;

            case EstadoDePersonagem.derrotado:
                #region derrotado
                if (emDano.Update(mov, CommandReader.VetorDirecao(Control)))
                {
                    mov.AplicadorDeMovimentos(Vector3.zero, false, false);
                    particulaDoMorrendo.SetActive(true);
                    if (derrota.Update())
                    {
                        transform.position = dados.ultimoCheckPoint.Pos;
                        dados.SetarVidaMax();
                        //dados.SetarManaMax();

                        GameController.g.MyKeys.ReviverInimigos();

                        SaveDatesManager.SalvarAtualizandoDados(dados.ultimoCheckPoint.nomesDasCenas);
                        SceneLoader.IniciarCarregamento(SaveDatesManager.s.IndiceDoJogoAtualSelecionado,
                                                        () => {
                            estado = EstadoDePersonagem.aPasseio;
                            EventAgregator.Publish(EventKey.requestShowControllers, null);
                            derrota.DesligarLosangulo();
                        });
                        estado = EstadoDePersonagem.naoIniciado;
                    }
                }
                #endregion
                break;

            case EstadoDePersonagem.movimentoRequerido:
                if (positionRequest.UpdateMove())
                {
                    mov.AplicadorDeMovimentos(Vector3.zero);
                    estado = EstadoDePersonagem.parado;
                    EventAgregator.Publish(new StandardGameEvent(positionRequest.Requisitor, EventKey.positionRequeredOk));
                }
                break;
            }
        }
    }