예제 #1
0
 public void PersonajeDetectado()
 {
     Personaje.PuedeMoverse = false;
     StopAllCoroutines();
     ControladorDatos.Instancia.AniadirCorrutinaACola(CorrutinasComunes.MoverHastaPosicion(this, Personaje.Posicion));
     npc.MostrarDialogo();
 }
예제 #2
0
    private IEnumerator MostrarPantallaDeCarga(EventoTeletransportarse e)
    {
        estaTeletransportandose = true;
        yield return(StartCoroutine(CorrutinasComunes.AlfaDeCeroAUno(UIControlador.Instancia.Teletransportador.pantallaDeCarga)));

        Personaje.TeletransportarPersonaje.CambiarPosicion(e.Destino, Herramientas.ObtenerDireccion(e.DireccionMirar));
        yield return(new WaitForSeconds(0.3f));

        yield return(StartCoroutine(CorrutinasComunes.AlfaDeUnoACero(UIControlador.Instancia.Teletransportador.pantallaDeCarga)));

        estaTeletransportandose = false;
    }
예제 #3
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);
     }
 }
예제 #4
0
    public void EjecutarAccion()
    {
        Conversacion ultimaConversacion = null;

        for (int i = 0; i < secuenciaDeAcciones.Count; i++)
        {
            accionActual = secuenciaDeAcciones[i];

            if (accionActual.npc != null && !accionActual.npc.gameObject.activeSelf)
            {
                accionActual.npc.gameObject.SetActive(true);
            }
            switch (accionActual.TipoDeAccion)
            {
            case AccionSequencia.NPC_MoverAPosicionEspecifica:
                ControladorDatos.Instancia.AniadirCorrutinaACola(CorrutinasComunes.MoverHastaPosicion(accionActual.npc.MoverNPC, accionActual.posicion.position));
                break;

            case AccionSequencia.NPC_MoverASuPosicionInicial:
                ControladorDatos.Instancia.AniadirCorrutinaACola(CorrutinasComunes.MoverHastaPosicion(accionActual.npc.MoverNPC, accionActual.npc.PosicionInicial));
                break;

            case AccionSequencia.NPC_MoverHastaElPersonaje:
                ControladorDatos.Instancia.AniadirCorrutinaACola(CorrutinasComunes.MoverHastaPosicion(accionActual.npc.MoverNPC, Personaje.Posicion));
                break;

            case AccionSequencia.NPC_MostrarConversacion:
                NPC npc = accionActual.npc.GetComponent <NPC>();
                if (npc != null && npc.TieneDialogoPendiente())
                {
                    ultimaConversacion = npc.AniadirDialogoASecuencia(ultimaConversacion);
                }
                break;

            case AccionSequencia.NPC_Ocultar:
                ControladorDatos.Instancia.AniadirCorrutinaACola(DesactivarNPC(accionActual.npc.gameObject));
                break;

            case AccionSequencia.Personaje_MoverAPosicionEspecífica:
                ControladorDatos.Instancia.AniadirCorrutinaACola(CorrutinasComunes.MoverHastaPosicion(Personaje.MoverPersonaje, accionActual.posicion.position));
                break;

            case AccionSequencia.Personaje_TeletransportarAPosicionEspecifica:
                ControladorEventos.Instancia.LanzarEvento(new EventoTeletransportarse(accionActual.posicion.position, accionActual.direccion));
                break;

            case AccionSequencia.Personaje_SeguirNPC:
                ControladorDatos.Instancia.AniadirCorrutinaACola(CorrutinasComunes.SeguirObjeto(Personaje.MoverPersonaje, accionActual.npc.MoverNPC), false, "Seguir");
                break;

            case AccionSequencia.Personaje_DejarDeSeguirNPC:
                ControladorDatos.Instancia.AniadirCorrutinaACola(DetenerSeguimiento("Seguir"), false);
                break;

            case AccionSequencia.EjecutarMetodos:
                ControladorDatos.Instancia.AniadirCorrutinaACola(EjecutarEventoUnity(accionActual.eventoUnity));
                break;

            case AccionSequencia.EsperarTiempo:
                ControladorDatos.Instancia.AniadirCorrutinaACola(DetenerTiempo(accionActual.tiempoDeEspera));
                break;

            case AccionSequencia.ReproducirAnimacion:
                ControladorDatos.Instancia.AniadirCorrutinaACola(ReproducirAnimacion(accionActual.animator, accionActual.nombreAnimacionODialogo));
                break;

            case AccionSequencia.CurarEquipoPokemon:
                ControladorDatos.Instancia.AniadirCorrutinaACola(CentroPokemon());
                break;

            case AccionSequencia.MostrarDialogoEspecifico:
                ControladorDatos.Instancia.AniadirCorrutinaACola(UIControlador.Instancia.Dialogo.componentePrincipal.MostrarTextoCorrutina(accionActual.nombreAnimacionODialogo, true));
                break;
            }
        }

        ControladorDatos.Instancia.AniadirCorrutinaACola(Fin(), false);
    }
예제 #5
0
    private IEnumerator CombateCorrutina(TipoDeCombate tipoCombate)
    {
        ControladorDatos.Instancia.ReproducirMusicaCombate();
        DatosCombate.CombateActivo = true;

        //*********************
        // TEXTO INICIAL DEL ENTRENADOR ANTES DEL COMBATE
        //*********************
        if (tipoCombate == TipoDeCombate.Entrenador)
        {
            yield return(StartCoroutine(UIControlador.Instancia.Dialogo.componentePrincipal.MostrarTextoCorrutina(entrenador.Conversacion.texto, false, false, Ajustes.Instancia.tiempoDeEsperaUltimaVentanaDialogoEnCombateSiNoSeLeeElTeclado)));
        }

        //*********************
        // TRANSICION A OSCURO
        //*********************
        yield return(StartCoroutine(CorrutinasComunes.AlfaDeCeroAUno(pantallaDeCarga)));

        //*********************
        // ESTABLECE VALORES POR DEFECTO
        //*********************
        //Rotamos la cámara para evitar problemas con otros sprites
        Camera.main.transform.rotation = Quaternion.Euler(Camera.main.transform.rotation.eulerAngles.x, Camera.main.transform.rotation.eulerAngles.y + 180, Camera.main.transform.rotation.eulerAngles.z);
        panelBarraSaludPokemonJugador.SetActive(false);
        panelBarraSaludPokemonEnemigo.SetActive(false);
        menuEleccionesCombate.SetActive(false);
        UIControlador.Instancia.Dialogo.ventanaDialogo.SetActive(false);
        UIControlador.Instancia.Dialogo.campoDeTexto.text = string.Empty;
        panelPrincipalUICombate.SetActive(true);

        //*********************
        // PREPARAR EQUIPOS DE POKEMON LUCHADORES
        //*********************
        DatosCombate = new DatosCombate();
        if (tipoCombate == TipoDeCombate.PokemonSalvaje)
        {
            DatosCombate.PrepararCombateContraPokemonSalvaje(pokemonSalvaje);
        }
        else
        {
            DatosCombate.PrepararCombateContraEntrenador(entrenador);
        }


        //*********************
        // ASIGNA LOS SPRITES RENDERER Y RELLENA LAS BARRAS DE VIDA
        //*********************
        spritesCombate.gameObject.SetActive(true);
        yield return(new WaitForSeconds(0.05f));

        RellenarInterfazConDatosDelPokemonActivo(DatosCombate.PokemonJugadorActivo(), barraSaludPokemonJugador, nombreYNivelPokemonJugador, textoSaludPokemonJugador);

        yield return(new WaitForSeconds(0.05f));

        RellenarInterfazConDatosDelPokemonActivo(DatosCombate.PokemonEnemigoActivo(), barraSaludPokemonEnemigo, nombreYNivelPokemonEnemigo, textoSaludPokemonEnemigo, false);


        //*********************
        //  TRANSICION A CLARO
        //*********************
        yield return(StartCoroutine(CorrutinasComunes.AlfaDeUnoACero(pantallaDeCarga)));

        ////*********************
        ////  MUESTRA MENSAJE DE ENTRENADOR O POKÉMON SALVaJE
        ////*********************
        if (tipoCombate == TipoDeCombate.PokemonSalvaje)
        {
            string texto = Ajustes.Instancia.textoPokemonSalvajeAparecio.Replace(Ajustes.Instancia.palabraParaReemplazarEnLosTexto1, DatosCombate.PokemonEnemigoActivo().Pokemon.DatosFijos.nombre);
            yield return(StartCoroutine(UIControlador.Instancia.Dialogo.componentePrincipal.MostrarTextoCorrutina(texto, true, false, Ajustes.Instancia.tiempoDeEsperaUltimaVentanaDialogoEnCombateSiNoSeLeeElTeclado)));

            while (spritesCombate.MostrarAnimacionCombate(AnimacionCombate.PokemonSalvajeAparece))
            {
                yield return(null);
            }
        }
        else
        {
            string texto = Ajustes.Instancia.textoEntrenadorTeDesafia.Replace(Ajustes.Instancia.palabraParaReemplazarEnLosTexto1, entrenador.NombreNPC);
            yield return(StartCoroutine(UIControlador.Instancia.Dialogo.componentePrincipal.MostrarTextoCorrutina(texto, false, false, Ajustes.Instancia.tiempoDeEsperaUltimaVentanaDialogoEnCombateSiNoSeLeeElTeclado)));

            texto = Ajustes.Instancia.textoEntrenadorEnviaPokemon
                    .Replace(Ajustes.Instancia.palabraParaReemplazarEnLosTexto1, entrenador.NombreNPC)
                    .Replace(Ajustes.Instancia.palabraParaReemplazarEnLosTexto2, DatosCombate.PokemonEnemigoActivo().Pokemon.DatosFijos.nombre);
            yield return(StartCoroutine(UIControlador.Instancia.Dialogo.componentePrincipal.MostrarTextoCorrutina(texto, false, false, Ajustes.Instancia.tiempoDeEsperaUltimaVentanaDialogoEnCombateSiNoSeLeeElTeclado)));

            while (spritesCombate.MostrarAnimacionCombate(AnimacionCombate.EntrenadorEnviaPokemon))
            {
                yield return(null);
            }
        }

        panelBarraSaludPokemonEnemigo.SetActive(true);
        yield return(new WaitForSeconds(1.5f));

        string 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)));

        while (spritesCombate.MostrarAnimacionCombate(AnimacionCombate.JugadorEnviaPokemon))
        {
            yield return(null);
        }
        panelBarraSaludPokemonJugador.SetActive(true);
        yield return(new WaitForSeconds(1f));

        menuEleccionesCombate.SetActive(true);

        //*********************
        //  BUCLE HASTA FINAL DE COMBATE (ENEMIGOS DERROTADOS, JUGADOR DERROTADO O ESCAPE)
        //*********************
        IEnumerator turno1 = TurnoJugadorCorrutina();
        IEnumerator turno2 = TurnoOponenteCorrutina();

        while (DatosCombate.CombateActivo)
        {
            //*********************
            //  ESPERA ACCIÓN DEL JUGADOR
            //*********************
            UIControlador.Instancia.Dialogo.campoDeTexto.text = string.Empty;
            UIControlador.Instancia.Dialogo.ventanaDialogo.SetActive(false);
            menuEleccionesCombate.SetActive(true);
            while (proximaAccion == null)
            {
                yield return(null);
            }
            menuEleccionesCombate.SetActive(false);

            //*********************
            //  COMPROBAR EL TIPO DE ACCIÓN
            //*********************
            switch (proximaAccion.TipoAccion)
            {
            case TipoAccion.Atacar:
                if (DatosCombate.PokemonJugadorActivo().Pokemon.EstadisticaVelocidadCombate() >= DatosCombate.PokemonEnemigoActivo().Pokemon.EstadisticaVelocidadCombate())
                {
                    Debug.Log("Combate: el jugador ataca primero");
                    turno1 = TurnoJugadorCorrutina();
                    turno2 = TurnoOponenteCorrutina();
                }
                else
                {
                    Debug.Log("Combate: el enemigo ataca primero");
                    turno1 = TurnoOponenteCorrutina();
                    turno2 = TurnoJugadorCorrutina();
                }
                break;

            case TipoAccion.UsarItem:
            case TipoAccion.Escapar:
            case TipoAccion.CambiarPokemon:
                turno1 = TurnoJugadorCorrutina();
                turno2 = TurnoOponenteCorrutina();
                break;
            }
            yield return(StartCoroutine(turno1));

            yield return(StartCoroutine(turno2));

            yield return(StartCoroutine(ComprobarPokemonVivos()));

            proximaAccion = null;
        }

        //*********************
        //  FIN DEL COMBATE, COMPROBAR SI HA GANADO
        //*********************
        if (DatosCombate.CombateGanado)
        {
            if (tipoCombate == TipoDeCombate.Entrenador)
            {
                string texto = Ajustes.Instancia.textoEntrenadorVencido
                               .Replace(Ajustes.Instancia.palabraParaReemplazarEnLosTexto1, entrenador.NombreNPC)
                               .Replace(Ajustes.Instancia.palabraParaReemplazarEnLosTexto2, entrenador.Conversacion.monedasRecompensa.ToString());
                yield return(StartCoroutine(UIControlador.Instancia.Dialogo.componentePrincipal.MostrarTextoCorrutina(texto, false, false, Ajustes.Instancia.tiempoDeEsperaUltimaVentanaDialogoEnCombateSiNoSeLeeElTeclado)));
            }
        }
        else
        {
            ControladorDatos.Instancia.Datos.CombatePerdidoQuitarMitadMonedas();
            string texto = Ajustes.Instancia.textoCombatePerdido
                           .Replace(Ajustes.Instancia.palabraParaReemplazarEnLosTexto1, ControladorDatos.Instancia.Datos.Monedas.ToString());
            yield return(StartCoroutine(UIControlador.Instancia.Dialogo.componentePrincipal.MostrarTextoCorrutina(texto, false, false, Ajustes.Instancia.tiempoDeEsperaUltimaVentanaDialogoEnCombateSiNoSeLeeElTeclado)));
        }

        //*********************
        // TRANSICION A OSCURO
        //*********************
        yield return(StartCoroutine(CorrutinasComunes.AlfaDeCeroAUno(pantallaDeCarga)));

        //*********************
        // VALORES POR DEFECTO
        //*********************
        Camera.main.transform.rotation = Quaternion.Euler(Camera.main.transform.rotation.eulerAngles.x, Camera.main.transform.rotation.eulerAngles.y - 180, Camera.main.transform.rotation.eulerAngles.z);
        UIControlador.Instancia.Dialogo.ventanaDialogo.SetActive(false);
        UIControlador.Instancia.Dialogo.campoDeTexto.text = string.Empty;
        panelPrincipalUICombate.SetActive(false);
        spritesCombate.gameObject.SetActive(false);

        //*********************
        // SI HA PERDIDO LO ENVIAMOS AL CENTRO POKÉMON DEFINIDO EN LA ZONA
        //*********************
        if (!DatosCombate.CombateGanado)
        {
            ControladorEventos.Instancia.LanzarEvento(new EventoTeletransportarseCentroPokemon());
        }

        //*********************
        //  TRANSICION A CLARO
        //*********************
        yield return(StartCoroutine(CorrutinasComunes.AlfaDeUnoACero(pantallaDeCarga)));

        ControladorDatos.Instancia.QuitarMusicaCombate();


        //*********************
        // TEXTO TRAS COMBATIR Y GANAR CONTRA EL ENTRENADOR, SE EJECUTA EL MÉTODO MostrarMensajeConversacion PARA QUE COMPRUEBE SI LA CONVERSACIÓN DA LOGROS E ITEMS
        //*********************
        if (tipoCombate == TipoDeCombate.Entrenador && DatosCombate.CombateGanado)
        {
            EventoMostrarMensajeConversacion e = new EventoMostrarMensajeConversacion(entrenador.Conversacion);
            yield return(StartCoroutine(UIControlador.Instancia.Dialogo.componentePrincipal.MostrarMensajeConversacion(e, true)));

            if (e.Conversacion.curarEquipoPokemonDelJugador)
            {
                yield return(StartCoroutine(CorrutinasComunes.CurarEquipoPokemon()));
            }
        }

        //*********************
        // COMPROBAMOS SI ALGÚN POKÉMON HA EVOLUCIONADO
        //*********************
        if (DatosCombate.CombateGanado)
        {
            yield return(StartCoroutine(ComprobarSiAlgunPokemonDelEquipoHaEvolucionado()));
        }


        DatosCombate = null;
    }
예제 #6
0
    public IEnumerator ComprobarSiAlgunPokemonDelEquipoHaEvolucionado()
    {
        //Establecemos los valores y referencias
        PokemonModelo[] equipoPokemon = ControladorDatos.Instancia.Datos.ObtenerEquipoPokemon();

        //Recorremos cada pokémon del equipo...
        for (int i = 0; i < equipoPokemon.Length; i++)
        {
            //... Comprobación para evitar errores...
            if (equipoPokemon[i] != null)
            {
                //... Si el pokémon actual del equipo ha subido de nivel y está vivo...
                if (equipoPokemon[i].HaSubidoDeNivel && equipoPokemon[i].EstaVivo())
                {
                    //... Y tiene asignada una evolución y su nivel actual está por encima o es igual al nivel en el que evoluciona...
                    if (equipoPokemon[i].DatosFijos.evolucion != PokemonID.NINGUNO && equipoPokemon[i].DatosFijos.nivelEvolucion <= equipoPokemon[i].Nivel)
                    {
                        //... Mostramos un mensaje indicando que el pokémon va a evolucionar
                        string texto = Ajustes.Instancia.textoPokemonVaEvolucionar
                                       .Replace(Ajustes.Instancia.palabraParaReemplazarEnLosTexto1, equipoPokemon[i].DatosFijos.nombre);
                        yield return(StartCoroutine(UIControlador.Instancia.Dialogo.componentePrincipal.MostrarTextoCorrutina(texto, false)));

                        //... Oscurecemos la pantalla
                        yield return(StartCoroutine(CorrutinasComunes.AlfaDeCeroAUno(pantallaDeCarga)));

                        //... Rotamos la cámara para evitar que otros sprites del escenario se visualizen por encima
                        Camera.main.transform.rotation = Quaternion.Euler(Camera.main.transform.rotation.eulerAngles.x, Camera.main.transform.rotation.eulerAngles.y + 180, Camera.main.transform.rotation.eulerAngles.z);

                        //... Ponemos a false la subida de nivel para volver a comprobar la evolución la próxima vez que suba nivel
                        equipoPokemon[i].HaSubidoDeNivel = false;

                        //... Asignamos los sprites de los pokémon
                        UIControlador.Instancia.ventanaSpriteEvolucion.AsignarSprites(equipoPokemon[i].DatosFijos);

                        //... Aclaramos la pantalla
                        yield return(StartCoroutine(CorrutinasComunes.AlfaDeUnoACero(pantallaDeCarga)));

                        //... Reproducimos animación evolución
                        UIControlador.Instancia.ventanaSpriteEvolucion.ReproducirAnimacion();

                        //... Esperamos a que termine la animación
                        while (!UIControlador.Instancia.ventanaSpriteEvolucion.EvolucionFinalizada())
                        {
                            yield return(null);
                        }

                        //... Imprimimos mensaje indicando que ha evolucionado
                        texto = Ajustes.Instancia.textoPokemonHaEvolucionado
                                .Replace(Ajustes.Instancia.palabraParaReemplazarEnLosTexto1, equipoPokemon[i].DatosFijos.nombre)
                                .Replace(Ajustes.Instancia.palabraParaReemplazarEnLosTexto2, ControladorDatos.Instancia.ObtenerPokemon(equipoPokemon[i].DatosFijos.ID).nombre);
                        yield return(StartCoroutine(UIControlador.Instancia.Dialogo.componentePrincipal.MostrarTextoCorrutina(texto, true)));

                        //... Cambiamos el ID del pokémon por la de su evolución
                        equipoPokemon[i].Evolucionar();

                        //... Oscurecemos la pantalla
                        yield return(StartCoroutine(CorrutinasComunes.AlfaDeCeroAUno(pantallaDeCarga)));

                        //... Desactivamos la ventana de evolución
                        UIControlador.Instancia.ventanaSpriteEvolucion.gameObject.SetActive(false);

                        //... Restablecemos la rotación de la cámara
                        Camera.main.transform.rotation = Quaternion.Euler(Camera.main.transform.rotation.eulerAngles.x, Camera.main.transform.rotation.eulerAngles.y - 180, Camera.main.transform.rotation.eulerAngles.z);

                        //... Aclaramos la pantalla
                        yield return(StartCoroutine(CorrutinasComunes.AlfaDeUnoACero(pantallaDeCarga)));
                    }
                }
            }
            yield return(null);
        }
    }
예제 #7
0
    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;
            }
        }
    }
예제 #8
0
    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)));
        }
    }