Exemple #1
0
 private void RestaurarSalud(Item item, UIMenuPokemonElementoLista pokemonLista)
 {
     if (!pokemonLista.PokemonDatos.TieneLaSaludCompleta())
     {
         pokemonLista.PokemonDatos.RestaurarSalud(item.cantidadSanacion);
         float porcentajeDeSalud = pokemonLista.PokemonDatos.SaludEnEscalaDe1();
         StartCoroutine(CorrutinasComunes.MoverBarraDeslizadora(pokemonLista.barraSalud, porcentajeDeSalud, pokemonLista.PokemonDatos.EstadisticaSaludMaxima(), pokemonLista.textoSalud, ItemUsadoConfirmado));
     }
     else
     {
         panelBloqueadorDePulsaciones.gameObject.SetActive(false);
     }
 }
    private IEnumerator ComprobarPokemonVivos()
    {
        //Si el pokémon enemigo actual no está vivo...
        if (!DatosCombate.PokemonEnemigoActivo().Pokemon.EstaVivo())
        {
            //... Imprime mensaje de pokémon derrotado
            string texto2 = Ajustes.Instancia.textoPokemonDerrotado.Replace(Ajustes.Instancia.palabraParaReemplazarEnLosTexto1, DatosCombate.PokemonEnemigoActivo().Pokemon.DatosFijos.nombre);
            yield return(StartCoroutine(UIControlador.Instancia.Dialogo.componentePrincipal.MostrarTextoCorrutina(texto2, false, true, Ajustes.Instancia.tiempoDeEsperaUltimaVentanaDialogoEnCombateSiNoSeLeeElTeclado)));

            //... Muestra la animación de pokémon derrotado
            while (spritesCombate.MostrarAnimacionCombate(AnimacionCombate.PokemonEnemigoDerrotado))
            {
                yield return(null);
            }

            //... Desactivamos el panel de vida
            panelBarraSaludPokemonEnemigo.SetActive(false);

            //... Conceder XP al pokémon del jugador
            int    experienciaSinAsignar = DatosCombate.PokemonEnemigoDerrotadoCalcularXP();
            string texto = Ajustes.Instancia.textoPokemonEnemigoDerrotado
                           .Replace(Ajustes.Instancia.palabraParaReemplazarEnLosTexto1, DatosCombate.PokemonEnemigoActivo().Pokemon.DatosFijos.nombre)
                           .Replace(Ajustes.Instancia.palabraParaReemplazarEnLosTexto2, experienciaSinAsignar.ToString());
            yield return(StartCoroutine(UIControlador.Instancia.Dialogo.componentePrincipal.MostrarTextoCorrutina(texto, false)));

            float experienciaTrasIncrementarEnEscala1 = 0;

            //... Mientras al aumentar experiencia al pokémon del jugador retorne un valor igual o superior a 0 (lo que indica que ha subido de nivel y hay experiencia sobrante)
            do
            {
                //... Aumentamos la experiencia del pokémon y obtenemos el sobrante
                experienciaSinAsignar = DatosCombate.PokemonJugadorActivo().Pokemon.IncrementarXP(experienciaSinAsignar);

                //... Si la experiencia es mayor a -1 ha subido de nivel y la barra de experiencia se animará hasta rellenarse completamente
                if (experienciaSinAsignar >= 0)
                {
                    experienciaTrasIncrementarEnEscala1 = 1;
                }
                //... Si no la barra se rellenará hasta el valor actual
                else
                {
                    experienciaTrasIncrementarEnEscala1 = DatosCombate.PokemonJugadorActivo().Pokemon.ExperienciaEnEscalaDe1();
                }

                //... Rellenamos la barra de experiencia con una animación
                yield return(StartCoroutine(CorrutinasComunes.MoverBarraDeslizadora(barraExperienciaJugador, experienciaTrasIncrementarEnEscala1, 0, null, null)));

                //... Si subió de nivel...
                if (experienciaSinAsignar >= 0)
                {
                    ControladorDatos.Instancia.ReproducirSonido(SonidoID.SonidoSubirNivel);

                    //... Mostramos el incremento de estadísticas respecto al nivel anterior
                    UIControlador.Instancia.Combate.ventanaIncrementoEstadisticas.MostrarIncrementoEstadisticas(DatosCombate.PokemonJugadorActivo().Pokemon);
                    //... Mostramos el mensaje indicando que ha subido de nivel
                    texto = Ajustes.Instancia.textoPokemonSubeNivel
                            .Replace(Ajustes.Instancia.palabraParaReemplazarEnLosTexto1, DatosCombate.PokemonJugadorActivo().Pokemon.DatosFijos.nombre)
                            .Replace(Ajustes.Instancia.palabraParaReemplazarEnLosTexto2, DatosCombate.PokemonJugadorActivo().Pokemon.Nivel.ToString());
                    yield return(StartCoroutine(UIControlador.Instancia.Dialogo.componentePrincipal.MostrarTextoCorrutina(texto, false)));

                    //... Desactivamos la ventana de estadísticas
                    UIControlador.Instancia.Combate.ventanaIncrementoEstadisticas.gameObject.SetActive(false);
                    //... Restablecemos la barra a 0
                    barraExperienciaJugador.fillAmount = 0;

                    //... Comprobamos si tiene que aprender algún nuevo ataque
                    yield return(StartCoroutine(SubeDeNivelComprobarAtaquesAprendidos(DatosCombate.PokemonJugadorActivo().Pokemon)));
                }

                yield return(null);
            } while (experienciaSinAsignar > 0); //Si la experiencia sobrante es igual a 0 no es necesario repetir el bucle, ya que ha subido justo la experiencia necesaria

            yield return(new WaitForSeconds(0.5f));

            //... Si el enemigo tiene algún pokémon vivo (para peleas contra entrenadores)...
            if (DatosCombate.ElEnemigoTieneAlgunPokemonVivo())
            {
                //... Buscamos el pokémon que queda vivo para establecerlo como el actual
                DatosCombate.PokemonEnemigoDerrotadoCambiarPorUnoVivo();

                //... Mostramos el texto indicando a qué pokémon va a enviar
                texto = Ajustes.Instancia.textoEntrenadorEnviaPokemon
                        .Replace(Ajustes.Instancia.palabraParaReemplazarEnLosTexto1, entrenador.nombreEvento)
                        .Replace(Ajustes.Instancia.palabraParaReemplazarEnLosTexto2, DatosCombate.PokemonEnemigoActivo().Pokemon.DatosFijos.nombre);
                yield return(StartCoroutine(UIControlador.Instancia.Dialogo.componentePrincipal.MostrarTextoCorrutina(texto, false, false, Ajustes.Instancia.tiempoDeEsperaUltimaVentanaDialogoEnCombateSiNoSeLeeElTeclado)));

                UIControlador.Instancia.Dialogo.campoDeTexto.text = string.Empty;

                //... Asigna los valores del nuevo pokémon a la interfaz y activa el panel de vida
                RellenarInterfazConDatosDelPokemonActivo(DatosCombate.PokemonEnemigoActivo(), barraSaludPokemonEnemigo, nombreYNivelPokemonEnemigo, textoSaludPokemonEnemigo, false);
                panelBarraSaludPokemonEnemigo.SetActive(true);

                //... Mostramos la animación de sacar nuevo pokémon
                while (spritesCombate.MostrarAnimacionCombate(AnimacionCombate.EntrenadorEnviaPokemon))
                {
                    yield return(null);
                }
            }
            //... Si no tiene más pokémon finaliza el combate
            else
            {
                DatosCombate.CombateGanado = true;
                DatosCombate.CombateActivo = false;
            }
        }

        //Si el pokémon del jugador actual no está vivo...
        if (!DatosCombate.PokemonJugadorActivo().Pokemon.EstaVivo())
        {
            while (spritesCombate.MostrarAnimacionCombate(AnimacionCombate.PokemonJugadorDerrotado))
            {
                yield return(null);
            }

            //... Desactivamos el panel de vida
            panelBarraSaludPokemonJugador.SetActive(false);

            //... Si el jugador tiene más pokémon vivos...
            if (DatosCombate.ElJugadorTieneAlgunPokemonVivo())
            {
                //... Imprime mensaje de pokémon derrotado
                string texto2 = Ajustes.Instancia.textoPokemonDerrotado.Replace(Ajustes.Instancia.palabraParaReemplazarEnLosTexto1, DatosCombate.PokemonJugadorActivo().Pokemon.DatosFijos.nombre);
                yield return(StartCoroutine(UIControlador.Instancia.Dialogo.componentePrincipal.MostrarTextoCorrutina(texto2, true, false, Ajustes.Instancia.tiempoDeEsperaUltimaVentanaDialogoEnCombateSiNoSeLeeElTeclado)));

                //... Muestra ventana de selección de pokémon y espera
                UIControlador.Instancia.EquipoPokemon.ventanaPrincipal.SetActive(true);
                UIControlador.Instancia.EquipoPokemon.botonCerrarVentana.SetActive(false);
                while (UIControlador.Instancia.EquipoPokemon.ventanaPrincipal.activeSelf)
                {
                    yield return(null);
                }
                //... Desde la ventana se ha cambiado el pokémon activo, volvemos a activar el botón de cerrar la ventana
                UIControlador.Instancia.EquipoPokemon.botonCerrarVentana.SetActive(true);

                //... Cambia el pokémon activo por el nuevo pokémon seleccionado
                DatosCombate.CambiarPokemonActivoDelJugador(proximaAccion.ProximoPokemon);

                //... Asigna los valores del nuevo pokémon a la interfaz y activa el panel de vida
                RellenarInterfazConDatosDelPokemonActivo(DatosCombate.PokemonJugadorActivo(), barraSaludPokemonJugador, nombreYNivelPokemonJugador, textoSaludPokemonJugador);

                //... Imprime mensaje de enviar nuevo pokémon
                texto2 = Ajustes.Instancia.textoJugadorEnviaPokemon.Replace(Ajustes.Instancia.palabraParaReemplazarEnLosTexto1, DatosCombate.PokemonJugadorActivo().Pokemon.DatosFijos.nombre);
                yield return(StartCoroutine(UIControlador.Instancia.Dialogo.componentePrincipal.MostrarTextoCorrutina(texto2, true, false, Ajustes.Instancia.tiempoDeEsperaUltimaVentanaDialogoEnCombateSiNoSeLeeElTeclado)));

                //... Muestra la animación de enviar nuevo pokémon
                while (spritesCombate.MostrarAnimacionCombate(AnimacionCombate.JugadorEnviaPokemon))
                {
                    yield return(null);
                }

                //... Activa la barra de salud
                panelBarraSaludPokemonJugador.SetActive(true);
            }
            //... Si no tiene más pokémon finaliza el combate
            else
            {
                DatosCombate.CombateGanado = false;
                DatosCombate.CombateActivo = false;
            }
        }
    }
    private IEnumerator Atacar(PokemonLuchador pokemonAtacante, PokemonLuchador pokemonDefensor, AtaqueCombate ataque, Image barraSaludAtacante, Image barraSaludDefensor, Text textoSaludPokemonAtacante, Text textoSaludPokemonDefensor, bool atacaElJugador)
    {
        //Si no ha fallado el ataque...
        if (!ataque.haFallado)
        {
            //... Imprime texto indicando el pokémon y ataque
            string texto = Ajustes.Instancia.textoPokemonAtaca
                           .Replace(Ajustes.Instancia.palabraParaReemplazarEnLosTexto1, pokemonAtacante.Pokemon.DatosFijos.nombre)
                           .Replace(Ajustes.Instancia.palabraParaReemplazarEnLosTexto2, pokemonAtacante.Pokemon.Ataque(ataque.id).DatosFijos.nombre);
            yield return(StartCoroutine(UIControlador.Instancia.Dialogo.componentePrincipal.MostrarTextoCorrutina(texto, false, false, Ajustes.Instancia.tiempoDeEsperaUltimaVentanaDialogoEnCombateSiNoSeLeeElTeclado)));

            if (atacaElJugador)
            {
                if (ataque.tipoAtaque == TipoDeAtaque.Fisico)
                {
                    while (spritesCombate.MostrarAnimacionCombate(AnimacionCombate.PokemonJugadorRealizaAtaqueFisico))
                    {
                        yield return(null);
                    }
                }

                while (spritesCombate.MostrarAnimacionAtaque(ataque.id, Atacante.Jugador))
                {
                    yield return(null);
                }
            }
            else
            {
                if (ataque.tipoAtaque == TipoDeAtaque.Fisico)
                {
                    while (spritesCombate.MostrarAnimacionCombate(AnimacionCombate.PokemonEnemigoRealizaAtaqueFisico))
                    {
                        yield return(null);
                    }
                }

                while (spritesCombate.MostrarAnimacionAtaque(ataque.id, Atacante.Enemigo))
                {
                    yield return(null);
                }
            }

            //... Comprobamos el incremento del daño del ataque según el tipo de elemento del pokémon enemigo
            float multiplicadorDanioPorElementos = tablaTipos.MultiplicadorElemento(ataque.elemento, pokemonDefensor.Pokemon.DatosFijos.tipoElemento1, pokemonDefensor.Pokemon.DatosFijos.tipoElemento2);
            //... Si ha devuelto 0 significa que es inmune y no se le hace daño...
            if (multiplicadorDanioPorElementos <= 0)
            {
                //... Por lo que imprime el texto en pantalla indicando que es inmune
                yield return(StartCoroutine(UIControlador.Instancia.Dialogo.componentePrincipal.MostrarTextoCorrutina(Ajustes.Instancia.textoPokemonInmuneAlAtaque, false, false)));
            }
            //... Si no es inmune comprobamos el daño final...
            else
            {
                //... Comprueba si el ataque ha sido crítico
                float multiplicadorCritico = 1;
                if (ataque.esCritico)
                {
                    multiplicadorCritico = Ajustes.Instancia.danioCriticos;
                }

                //... Calcula el daño final del ataque teniendo en cuenta los tipos de elementos y si ha sido crítico
                ataque.danio = (int)(ataque.danio * multiplicadorDanioPorElementos * multiplicadorCritico);

                //... El pokémon enemigo recibe el ataque
                pokemonDefensor.RecibirAtaque(ataque);

                //... Si el multiplicador no es cercano a 1 (1 sería un ataque normal que no es muy efectivo ni poco efectivo) imprimimos por pantalla un texto informando de la efectividad del ataque
                if (multiplicadorDanioPorElementos <= 0.9f || multiplicadorDanioPorElementos > 1.1f)
                {
                    if (multiplicadorDanioPorElementos < 0.3f)
                    {
                        texto = Ajustes.Instancia.textoPokemonAtaque25PorcientoDanio;
                    }
                    else if (multiplicadorDanioPorElementos < 0.7f)
                    {
                        texto = Ajustes.Instancia.textoPokemonAtaque50PorcientoDanio;
                    }
                    else if (multiplicadorDanioPorElementos > 1.9f)
                    {
                        texto = Ajustes.Instancia.textoPokemonAtaque200PorcientoDanio;
                    }
                    else
                    {
                        texto = Ajustes.Instancia.textoPokemonAtaque150PorcientoDanio;
                    }

                    yield return(StartCoroutine(UIControlador.Instancia.Dialogo.componentePrincipal.MostrarTextoCorrutina(texto, false, false, Ajustes.Instancia.tiempoDeEsperaUltimaVentanaDialogoEnCombateSiNoSeLeeElTeclado)));
                }

                if (atacaElJugador)
                {
                    while (spritesCombate.MostrarAnimacionCombate(AnimacionCombate.PokemonEnemigoRecibeAtaque))
                    {
                        yield return(null);
                    }
                }
                else
                {
                    while (spritesCombate.MostrarAnimacionCombate(AnimacionCombate.PokemonJugadorRecibeAtaque))
                    {
                        yield return(null);
                    }
                }

                //... Cambia el valor de la barra de salud con una animación
                float porcentajeDeSalud = pokemonDefensor.Pokemon.SaludEnEscalaDe1();
                yield return(StartCoroutine(CorrutinasComunes.MoverBarraDeslizadora(barraSaludDefensor, porcentajeDeSalud, pokemonDefensor.Pokemon.EstadisticaSaludMaxima(), textoSaludPokemonDefensor, null)));
            }

            //... Comprueba si el pokémon original se autoinflinge daño
            if (ataque.pokemonOriginalSeHaceDanio)
            {
                pokemonAtacante.RecibirAutoAtaque(ataque);
                //TODO: reproducir animacion recibir daño
                //... Cambia el valor de la barra de salud con una animación
                float porcentajeDeSalud = pokemonAtacante.Pokemon.SaludEnEscalaDe1();
                while (barraSaludAtacante.fillAmount != porcentajeDeSalud)
                {
                    barraSaludAtacante.fillAmount = Mathf.Lerp(barraSaludAtacante.fillAmount, porcentajeDeSalud, Ajustes.Instancia.velocidadDeMovimientoDeBarrasDeSaludEnCombate);
                    yield return(null);
                }
            }
            //... Comprueba si el pokémon original se autocura
            if (ataque.pokemonOriginalSeCura)
            {
                pokemonAtacante.RecibirAutoSanacion(ataque);
                //TODO: reproducir animacion curar
                //... Cambia el valor de la barra de salud con una animación
                float porcentajeDeSalud = pokemonAtacante.Pokemon.SaludEnEscalaDe1();
                while (barraSaludAtacante.fillAmount != porcentajeDeSalud)
                {
                    barraSaludAtacante.fillAmount = Mathf.Lerp(barraSaludAtacante.fillAmount, porcentajeDeSalud, Ajustes.Instancia.velocidadDeMovimientoDeBarrasDeSaludEnCombate);
                    yield return(null);
                }
            }

            //... Resta PP al ataque usado
            pokemonAtacante.RestarPP(ataque.id);
        }
        else
        {
            yield return(StartCoroutine(UIControlador.Instancia.Dialogo.componentePrincipal.MostrarTextoCorrutina(Ajustes.Instancia.textoPokemonFallaAtaque, false, false, Ajustes.Instancia.tiempoDeEsperaUltimaVentanaDialogoEnCombateSiNoSeLeeElTeclado)));
        }
    }