diff --git a/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/GeneradorDeEventos.kt b/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/GeneradorDeEventos.kt index 626d9a481f52d78c9c15e3063780a180586da632..9ea2addde61575a1e7bb1f1a2e3877466b05bc19 100644 --- a/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/GeneradorDeEventos.kt +++ b/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/GeneradorDeEventos.kt @@ -30,16 +30,20 @@ object GeneradorDeEventos { fun generarEventos() { val eventosGenerados = ArrayList<Evento>() + historialTipos = mutableListOf() while (eventosGenerados.size < CANTIDAD) { val tipoSeleccionado = seleccionarTipoEvento() + + if (historialTipos.isNotEmpty() && tipoSeleccionado == historialTipos.last()) { + continue + } + val nuevoEvento = EventoFactorySelector.obtenerFactory(tipoSeleccionado).generarEvento() - if (historialTipos.lastOrNull() != tipoSeleccionado || eventosGenerados.isEmpty()) { - if (!eventosGenerados.contains(nuevoEvento)) { - eventosGenerados.add(nuevoEvento) - historialTipos.add(tipoSeleccionado) - } + if (!eventosGenerados.contains(nuevoEvento)) { + eventosGenerados.add(nuevoEvento) + historialTipos.add(tipoSeleccionado) } } @@ -78,11 +82,6 @@ object GeneradorDeEventos { val random = Random.nextDouble() val tipoSeleccionado = acumulado.first { random <= it.first }.second - val ultimosDos = historialTipos.takeLast(2) - if (tipoSeleccionado in ultimosDos) { - return seleccionarTipoEvento() - } - return tipoSeleccionado } diff --git a/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/GestorCombate.kt b/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/GestorCombate.kt index 1d45f960d44c08c169a0b0cca900325774dd56a6..69984783516e636f0122d01877f9fde0ccbdc496 100644 --- a/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/GestorCombate.kt +++ b/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/GestorCombate.kt @@ -1,6 +1,7 @@ package com.example.ellegadodepintia.exploradoresDePintia.model +import android.animation.ObjectAnimator import android.graphics.drawable.AnimationDrawable import android.os.Handler import android.os.Looper @@ -10,12 +11,13 @@ import com.example.ellegadodepintia.R import com.example.ellegadodepintia.exploradoresDePintia.model.GameState.context import com.example.ellegadodepintia.exploradoresDePintia.model.efecto.Efecto import com.example.ellegadodepintia.exploradoresDePintia.model.efecto.EfectoInvestigarEnemigo +import com.example.ellegadodepintia.exploradoresDePintia.model.efecto.EfectoRegeneracionEnemigo import com.example.ellegadodepintia.exploradoresDePintia.model.eventoFactory.EventoCombate import com.example.ellegadodepintia.exploradoresDePintia.model.habilidad.efectoHabilidad.EfectoHabilidad object GestorCombate { - lateinit var evento : EventoCombate + lateinit var evento: EventoCombate private var turnoJugador = true fun cargarAnimacionesAtaqueProtagonista() { @@ -62,6 +64,24 @@ object GestorCombate { }, ataqueDuracion.toLong()) } + fun cargarAnimacionsRegeneracionEnemigo() { + val imagenEvento = context!!.findViewById<ImageView>(R.id.imagenEvento) + val imagenEfecto = context!!.findViewById<ImageView>(R.id.imagenEfectoEvento) + + imagenEvento?.let { + val salto = ObjectAnimator.ofFloat(it, "translationY", 0f, -40f, 0f) + salto.duration = 300 + salto.start() + + imagenEfecto?.setImageResource(R.drawable.effect_regeneracion_animation) + val efectoAnimacion = imagenEfecto?.drawable as? AnimationDrawable + efectoAnimacion?.start() + Handler(Looper.getMainLooper()).postDelayed({ + imagenEfecto?.setImageDrawable(null) + }, 600) + } + } + fun calcularAtaque(ataqueBase: Int): Int { val ataqueFinal: Int val resultadoTirada = (0..100).random() @@ -104,36 +124,46 @@ object GestorCombate { fun habilidadProtagonista(nombre: String, efecto: EfectoHabilidad, energia: Int) { val textoResultado = context!!.findViewById<TextView>(R.id.textoResultado) - if(GameState.jugador.atributos[Atributo.Energia]!! >= energia){ + if (GameState.jugador.atributos[Atributo.Energia]!! >= energia) { turnoJugador = false "${textoResultado.text} \n\n Se ha utilizado $nombre".also { textoResultado.text = it } restarTurnoBuffos() efecto.ejecutar() GameState.jugador.actualizarAtributo(Atributo.Energia, -energia) comenzarAccionEnemigo() - }else{ + } else { "${textoResultado.text} \n\n EnergÃa insuficiente".also { textoResultado.text = it } } } - private fun restarTurnoBuffos(){ + private fun restarTurnoBuffos() { for (buffo in GameState.jugador.buffos) { - buffo.pasarTurno() + buffo.pasarTurno() } } - private fun accionEnemigo(){ - val textoResultado = context!!.findViewById<TextView>(R.id.textoResultado) - val efectoAtaque = evento.acciones.random().ejecutar() - if(GameState.jugador.atributos[Atributo.Vida]!! <= 0){ - Handler(Looper.getMainLooper()).postDelayed({ - turnoJugador = true - }, 2000) - } else { + private fun accionEnemigo() { + val textoResultado = context!!.findViewById<TextView>(R.id.textoResultado) + val efectoAtaque = seleccionarAccionEnemigo().ejecutar() + if (GameState.jugador.atributos[Atributo.Vida]!! <= 0) { + Handler(Looper.getMainLooper()).postDelayed({ turnoJugador = true - "${textoResultado.text} \n\n $efectoAtaque".also { textoResultado.text = it } - } + }, 2000) + } else { + turnoJugador = true + "${textoResultado.text} \n\n $efectoAtaque".also { textoResultado.text = it } + } + } + + private fun seleccionarAccionEnemigo(): Efecto{ + val tieneRecuperacion = evento.acciones.any {it is EfectoRegeneracionEnemigo } + val porcentajeVida = GameState.eventoActual.resistenciaActual/GameState.eventoActual.resistenciaMax.toDouble() + return if(tieneRecuperacion && porcentajeVida <= 0.3){ + evento.acciones.random() + }else{ + evento.acciones.filterNot { it is EfectoRegeneracionEnemigo }.random() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/efecto/EfectoRegeneracionEnemigo.kt b/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/efecto/EfectoRegeneracionEnemigo.kt new file mode 100644 index 0000000000000000000000000000000000000000..d3e0ae61f0573538fd48ffc1eda6b85ad9db6fae --- /dev/null +++ b/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/efecto/EfectoRegeneracionEnemigo.kt @@ -0,0 +1,14 @@ +package com.example.ellegadodepintia.exploradoresDePintia.model.efecto + +import com.example.ellegadodepintia.exploradoresDePintia.model.GameState +import com.example.ellegadodepintia.exploradoresDePintia.model.GestorCombate + +class EfectoRegeneracionEnemigo(private val mensajeCuracion: String,private val cantidad: Int) : Efecto(100) { + override fun ejecutar(): String { + GestorCombate.cargarAnimacionsRegeneracionEnemigo() + + GameState.eventoActual.actualizarResistencia(cantidad) + + return mensajeCuracion + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/eventoFactory/CombateFactory.kt b/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/eventoFactory/CombateFactory.kt index ba6004a2c96a5ca5b6d10cc0774c26e31f214073..91a89b69ac9170228a844bb050279b7347288843 100644 --- a/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/eventoFactory/CombateFactory.kt +++ b/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/eventoFactory/CombateFactory.kt @@ -5,16 +5,25 @@ import com.example.ellegadodepintia.exploradoresDePintia.model.GameState import com.example.ellegadodepintia.exploradoresDePintia.model.Atributo import com.example.ellegadodepintia.exploradoresDePintia.model.Opcion import com.example.ellegadodepintia.exploradoresDePintia.model.OpcionCombate +import com.example.ellegadodepintia.exploradoresDePintia.model.efecto.Efecto import com.example.ellegadodepintia.exploradoresDePintia.model.efecto.EfectoAtaqueEnemigo import com.example.ellegadodepintia.exploradoresDePintia.model.efecto.EfectoAtaqueProtagonista import com.example.ellegadodepintia.exploradoresDePintia.model.efecto.EfectoHabilidadesProtagonista import com.example.ellegadodepintia.exploradoresDePintia.model.efecto.EfectoHuirProtagonista import com.example.ellegadodepintia.exploradoresDePintia.model.efecto.EfectoInvestigarEnemigo +import com.example.ellegadodepintia.exploradoresDePintia.model.efecto.EfectoRegeneracionEnemigo + +data class CombateInfo( + val imagenIdle: Int, + val imagenAtaque: Int, + val opciones: List<Opcion>, + val habilidades: List<Efecto> +) class CombateFactory : EventoFactory { private val combatesMap = mapOf( - "El Metal Volador es una criatura formada por fragmentos de metal antiguo. Protege los secretos del yacimiento de Pintia." to Triple( + "El Metal Volador es una criatura formada por fragmentos de metal antiguo. Protege los secretos del yacimiento de Pintia." to CombateInfo( R.drawable.monster_metal_idle_animation, R.drawable.monster_metal_attack_animation, listOf( @@ -26,7 +35,7 @@ class CombateFactory : EventoFactory { Opcion( descripcion = "Investigar", atributoRequerida = Atributo.Investigacion, - EfectoInvestigarEnemigo(100) + efecto = EfectoInvestigarEnemigo(100) ), Opcion( descripcion = "Habilidades", @@ -38,6 +47,10 @@ class CombateFactory : EventoFactory { atributoRequerida = Atributo.Vida, efecto = EfectoHuirProtagonista(GameState.jugador.atributos[Atributo.Vida]!!), ), + ), + listOf( + EfectoAtaqueEnemigo(80), + EfectoRegeneracionEnemigo("El metal reconfigura sus fragmentos recuperando parte de su vida", (1..2).random()) ) ), ) @@ -48,30 +61,28 @@ class CombateFactory : EventoFactory { override fun generarEvento(): EventoCombate { val descripcion = generarDescripcion() + val combateInfo = combatesMap[descripcion] ?: throw IllegalArgumentException("No se encontró información de combate") + return EventoCombate( descripcion = descripcion, dificultad = 0, - opciones = generarOpciones(descripcion), - imagenAtaque = generarImagenAtaque(descripcion), - imagen = generarImagen(descripcion), + opciones = combateInfo.opciones.toMutableList(), + imagenAtaque = combateInfo.imagenAtaque, + imagen = combateInfo.imagenIdle, resistenciaMax = (5..10).random(), ataque = (1..2).random(), finalizado = false, - acciones = mutableListOf(EfectoAtaqueEnemigo(70)) + acciones = combateInfo.habilidades.toMutableList() ) } override fun generarOpciones(descripcion: String): MutableList<Opcion> { - return combatesMap[descripcion]?.third?.take(4)?.toMutableList() - ?: mutableListOf() + val combateInfo = combatesMap[descripcion] ?: return mutableListOf() + return combateInfo.opciones.take(4).toMutableList() } override fun generarImagen(descripcion: String): Int { - return combatesMap[descripcion]?.first!! - } - - private fun generarImagenAtaque(descripcion: String): Int { - return combatesMap[descripcion]?.second!! + return combatesMap[descripcion]!!.imagenIdle } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/eventoFactory/DescansoFactory.kt b/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/eventoFactory/DescansoFactory.kt index 487678254af22f7ec75633b7b5c8e4f5d4c3eb77..1e4b78b21012c8f90b9b7057b0a2d42b1b0b2421 100644 --- a/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/eventoFactory/DescansoFactory.kt +++ b/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/eventoFactory/DescansoFactory.kt @@ -33,7 +33,6 @@ class DescansoFactory : EventoFactory { override fun generarEvento(): EventoDescanso { return EventoDescanso( - id = (0..Int.MAX_VALUE).random(), descripcion = generarDescripcion(), dificultad = 0, opciones = generarOpciones(descripcion), diff --git a/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/eventoFactory/Evento.kt b/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/eventoFactory/Evento.kt index 7eba605a117f5f82d69aa2c3f858d405c717148f..702fac9fa696005116810e05be687308d9059faf 100644 --- a/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/eventoFactory/Evento.kt +++ b/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/eventoFactory/Evento.kt @@ -25,6 +25,9 @@ abstract class Evento( fun actualizarResistencia(valor : Int){ resistenciaActual += valor + if(resistenciaActual >= resistenciaMax){ + resistenciaActual = resistenciaMax + } notifyObservers() } diff --git a/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/eventoFactory/EventoDescanso.kt b/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/eventoFactory/EventoDescanso.kt index dc510df6cea179cd7a3e1a081cd015cfcc41d665..04c021b30607aee604b09d896623945f6a89ccec 100644 --- a/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/eventoFactory/EventoDescanso.kt +++ b/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/eventoFactory/EventoDescanso.kt @@ -1,15 +1,17 @@ package com.example.ellegadodepintia.exploradoresDePintia.model.eventoFactory import com.example.ellegadodepintia.exploradoresDePintia.model.Opcion +import java.util.UUID class EventoDescanso( - val id: Int, override val descripcion: String, override val dificultad: Int, override val opciones: MutableList<Opcion>, override val imagen: Int, resistenciaMax: Int, override var finalizado: Boolean, ) : Evento(descripcion, dificultad, opciones, imagen, resistenciaMax, resistenciaMax, finalizado) { + val id: String = UUID.randomUUID().toString() + override fun equals(other: Any?): Boolean { if (this === other) return true if (other == null || javaClass != other.javaClass) return false diff --git a/app/src/main/res/drawable/effect_regeneracion_00.png b/app/src/main/res/drawable/effect_regeneracion_00.png new file mode 100644 index 0000000000000000000000000000000000000000..4fb349e7880e17e77d3202fc3dd5f3835d76db9e Binary files /dev/null and b/app/src/main/res/drawable/effect_regeneracion_00.png differ diff --git a/app/src/main/res/drawable/effect_regeneracion_01.png b/app/src/main/res/drawable/effect_regeneracion_01.png new file mode 100644 index 0000000000000000000000000000000000000000..0fc4d55d75de910665fdb09ea550ec2c532c0b95 Binary files /dev/null and b/app/src/main/res/drawable/effect_regeneracion_01.png differ diff --git a/app/src/main/res/drawable/effect_regeneracion_010.png b/app/src/main/res/drawable/effect_regeneracion_010.png new file mode 100644 index 0000000000000000000000000000000000000000..560e8c8fbd67f9becdf18419d8c16dd18df905a2 Binary files /dev/null and b/app/src/main/res/drawable/effect_regeneracion_010.png differ diff --git a/app/src/main/res/drawable/effect_regeneracion_011.png b/app/src/main/res/drawable/effect_regeneracion_011.png new file mode 100644 index 0000000000000000000000000000000000000000..167b8b410c6f39279474ab98fa05146bf1d48221 Binary files /dev/null and b/app/src/main/res/drawable/effect_regeneracion_011.png differ diff --git a/app/src/main/res/drawable/effect_regeneracion_012.png b/app/src/main/res/drawable/effect_regeneracion_012.png new file mode 100644 index 0000000000000000000000000000000000000000..3b92a8410ab5563a0a510d0488ab94adc25bb8b7 Binary files /dev/null and b/app/src/main/res/drawable/effect_regeneracion_012.png differ diff --git a/app/src/main/res/drawable/effect_regeneracion_02.png b/app/src/main/res/drawable/effect_regeneracion_02.png new file mode 100644 index 0000000000000000000000000000000000000000..a0faad3bb6bae8939fbe8de17a49211423c6080c Binary files /dev/null and b/app/src/main/res/drawable/effect_regeneracion_02.png differ diff --git a/app/src/main/res/drawable/effect_regeneracion_03.png b/app/src/main/res/drawable/effect_regeneracion_03.png new file mode 100644 index 0000000000000000000000000000000000000000..7a509fab616c0e1c813f5c1b4400bd8b001df479 Binary files /dev/null and b/app/src/main/res/drawable/effect_regeneracion_03.png differ diff --git a/app/src/main/res/drawable/effect_regeneracion_04.png b/app/src/main/res/drawable/effect_regeneracion_04.png new file mode 100644 index 0000000000000000000000000000000000000000..ef5fc55768b9c59ce4be339f5cd60c2d7306c22f Binary files /dev/null and b/app/src/main/res/drawable/effect_regeneracion_04.png differ diff --git a/app/src/main/res/drawable/effect_regeneracion_05.png b/app/src/main/res/drawable/effect_regeneracion_05.png new file mode 100644 index 0000000000000000000000000000000000000000..8ac51a595d3450c1ddb19df34ce826dd9ec2e9e6 Binary files /dev/null and b/app/src/main/res/drawable/effect_regeneracion_05.png differ diff --git a/app/src/main/res/drawable/effect_regeneracion_06.png b/app/src/main/res/drawable/effect_regeneracion_06.png new file mode 100644 index 0000000000000000000000000000000000000000..9ef2e1281858a29e1c50f7cd23ba54760d91845e Binary files /dev/null and b/app/src/main/res/drawable/effect_regeneracion_06.png differ diff --git a/app/src/main/res/drawable/effect_regeneracion_07.png b/app/src/main/res/drawable/effect_regeneracion_07.png new file mode 100644 index 0000000000000000000000000000000000000000..c3c3e128f3a2850901ab5cb0b7677690aeca321e Binary files /dev/null and b/app/src/main/res/drawable/effect_regeneracion_07.png differ diff --git a/app/src/main/res/drawable/effect_regeneracion_08.png b/app/src/main/res/drawable/effect_regeneracion_08.png new file mode 100644 index 0000000000000000000000000000000000000000..f8efd3c2802e593150dd27ead530eabe5de921ca Binary files /dev/null and b/app/src/main/res/drawable/effect_regeneracion_08.png differ diff --git a/app/src/main/res/drawable/effect_regeneracion_09.png b/app/src/main/res/drawable/effect_regeneracion_09.png new file mode 100644 index 0000000000000000000000000000000000000000..d0c14e75f53098b0fdb281d52992a70bccc717b2 Binary files /dev/null and b/app/src/main/res/drawable/effect_regeneracion_09.png differ diff --git a/app/src/main/res/drawable/effect_regeneracion_animation.xml b/app/src/main/res/drawable/effect_regeneracion_animation.xml new file mode 100644 index 0000000000000000000000000000000000000000..d46358515a123a9101eea610576250817757d0e3 --- /dev/null +++ b/app/src/main/res/drawable/effect_regeneracion_animation.xml @@ -0,0 +1,17 @@ +<!-- res/drawable/idle_animation.xml --> +<animation-list xmlns:android="http://schemas.android.com/apk/res/android" + android:oneshot="false"> + <item android:drawable="@drawable/effect_regeneracion_00" android:duration="50" /> + <item android:drawable="@drawable/effect_regeneracion_01" android:duration="50" /> + <item android:drawable="@drawable/effect_regeneracion_02" android:duration="50" /> + <item android:drawable="@drawable/effect_regeneracion_03" android:duration="50" /> + <item android:drawable="@drawable/effect_regeneracion_04" android:duration="50" /> + <item android:drawable="@drawable/effect_regeneracion_05" android:duration="50" /> + <item android:drawable="@drawable/effect_regeneracion_06" android:duration="50" /> + <item android:drawable="@drawable/effect_regeneracion_07" android:duration="50" /> + <item android:drawable="@drawable/effect_regeneracion_08" android:duration="50" /> + <item android:drawable="@drawable/effect_regeneracion_09" android:duration="50" /> + <item android:drawable="@drawable/effect_regeneracion_010" android:duration="50" /> + <item android:drawable="@drawable/effect_regeneracion_011" android:duration="50" /> + <item android:drawable="@drawable/effect_regeneracion_012" android:duration="50" /> +</animation-list>