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;
    }
 private void ProximaAccionSeleccionada(EventoBase mensaje)
 {
     proximaAccion = (EventoProximaAccionCombate)mensaje;
 }