public void PersonajeDetectado() { Personaje.PuedeMoverse = false; StopAllCoroutines(); ControladorDatos.Instancia.AniadirCorrutinaACola(CorrutinasComunes.MoverHastaPosicion(this, Personaje.Posicion)); npc.MostrarDialogo(); }
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; }
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); } }
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); }
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; }
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); } }
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))); } }