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 f8f1ae086d47b6b7355bb945c3f28ab3d0d6f5ec..6977a603b96450abaa90a037b3ea8d8bd462f2ce 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 @@ -12,6 +12,7 @@ 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.efecto.EfectoRevivirEnemigo import com.example.ellegadodepintia.exploradoresDePintia.model.eventoFactory.EventoCombate import com.example.ellegadodepintia.exploradoresDePintia.model.habilidad.efectoHabilidad.EfectoHabilidad @@ -99,18 +100,33 @@ object GestorCombate { accionEnemigo() }, 800) } else { - evento.actualizarFinalizado(true) turnoJugador = true - if(evento.resistenciaActual <= 0) { - GameState.jugador.conseguirObjeto(evento.recompensa) - Handler(Looper.getMainLooper()).postDelayed({ - "¡Enhorabuena has acabado con el monstruo!\n Te das cuenta que defendía un/una ${evento.recompensa.nombre}".also { - context!!.findViewById<TextView>(R.id.textoResultado).text = it - } - }, 200) + if (revivirEnemigo() == "Fallo") { + evento.actualizarFinalizado(true) + if (evento.resistenciaActual <= 0) { + GameState.jugador.conseguirObjeto(evento.recompensa) + Handler(Looper.getMainLooper()).postDelayed({ + "¡Enhorabuena has acabado con el monstruo!\n Te das cuenta que defendía un/una ${evento.recompensa.nombre}".also { + context!!.findViewById<TextView>(R.id.textoResultado).text = it + } + }, 200) + } } + } + } + private fun revivirEnemigo(): String { + var mensaje = "Fallo" + val tieneRevivir = evento.acciones.any { it is EfectoRevivirEnemigo } + if (tieneRevivir) { + mensaje = evento.acciones.filterIsInstance<EfectoRevivirEnemigo>().first().ejecutar() + Handler(Looper.getMainLooper()).postDelayed({ + val textoResultado = context!!.findViewById<TextView>(R.id.textoResultado) + "${textoResultado.text} \n\n $mensaje".also { textoResultado.text = it } + }, 200) } + return mensaje + } fun accionProtagonista(efecto: Efecto): String { @@ -167,9 +183,12 @@ object GestorCombate { val porcentajeVida = GameState.eventoActual.resistenciaActual / GameState.eventoActual.resistenciaMax.toDouble() return if (tieneRecuperacion && porcentajeVida <= 0.3) { - evento.acciones.random() + evento.acciones.filterNot { it is EfectoRevivirEnemigo }.random() } else { - evento.acciones.filterNot { it is EfectoRegeneracionEnemigo }.random() + evento.acciones.filterNot { + it is EfectoRegeneracionEnemigo + it is EfectoRevivirEnemigo + }.random() } } diff --git a/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/efecto/EfectoRevivirEnemigo.kt b/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/efecto/EfectoRevivirEnemigo.kt new file mode 100644 index 0000000000000000000000000000000000000000..6d8004ccf8663e5b66cef06009427caffa5b2fcb --- /dev/null +++ b/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/efecto/EfectoRevivirEnemigo.kt @@ -0,0 +1,27 @@ +package com.example.ellegadodepintia.exploradoresDePintia.model.efecto + +import com.example.ellegadodepintia.exploradoresDePintia.model.GameState +import com.example.ellegadodepintia.exploradoresDePintia.model.GestorCombate + +class EfectoRevivirEnemigo( + private val mensajeRevivir: String, private val porcentaje: Double, + probabilidadExito: Int +) : + Efecto(probabilidadExito) { + override fun ejecutar(): String { + val probabilidadGenerada = (1..100).random() + if (probabilidadGenerada <= probabilidadExito) { + GestorCombate.cargarAnimacionsRegeneracionEnemigo() + + GameState.eventoActual.setResistencia( + (GameState.eventoActual.resistenciaMax * porcentaje).toInt() + ) + return mensajeRevivir + + } else { + return "Fallo" + } + + + } +} \ 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 9d2ccef3749a14d325e73395a27d820fc4d54fee..dd20f2a9b2169350be56abed89db41f5af5fc737 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 @@ -12,14 +12,16 @@ import com.example.ellegadodepintia.exploradoresDePintia.model.efecto.EfectoHabi import com.example.ellegadodepintia.exploradoresDePintia.model.efecto.EfectoHuirProtagonista import com.example.ellegadodepintia.exploradoresDePintia.model.efecto.EfectoInvestigarEnemigo import com.example.ellegadodepintia.exploradoresDePintia.model.efecto.EfectoRegeneracionEnemigo +import com.example.ellegadodepintia.exploradoresDePintia.model.efecto.EfectoRevivirEnemigo import com.example.ellegadodepintia.exploradoresDePintia.model.objeto.Objeto import com.example.ellegadodepintia.repositorios.RepositorioObjetos data class CombateInfo( val imagenIdle: Int, val imagenAtaque: Int, - val opciones: List<Opcion>, val habilidades: List<Efecto>, + val vidaMax: Int, + val ataque: Int, val recompensa: Objeto ) @@ -29,34 +31,25 @@ class CombateFactory : EventoFactory { "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( - OpcionCombate( - descripcion = "Atacar", - atributoRequerida = Atributo.Ataque, - efecto = EfectoAtaqueProtagonista(70) - ), - Opcion( - descripcion = "Investigar", - atributoRequerida = Atributo.Investigacion, - efecto = EfectoInvestigarEnemigo(100) - ), - Opcion( - descripcion = "Habilidades", - atributoRequerida = Atributo.Nula, - efecto = EfectoHabilidadesProtagonista(GameState.jugador.atributos[Atributo.Vida]!!) - ), - OpcionCombate( - descripcion = "Huir", - 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()) + EfectoRegeneracionEnemigo( + "El metal reconfigura sus fragmentos recuperando parte de su vida", + (1..2).random() + ) ), + vidaMax = (5..10).random(), + ataque = (1..2).random(), RepositorioObjetos.obtenerObjetoPorNombre("Moneda de plata Vaccea")!! ), + "Al explorar una tumba de la necrópolis de las ruedas, un esqueleto armado aparece." to CombateInfo( + imagenIdle = R.drawable.monster_skeleton_idle, + imagenAtaque = R.drawable.monster_skeleton_attack, + habilidades = listOf(EfectoAtaqueEnemigo(75), EfectoRevivirEnemigo("El esqueleto se reconstruye reviviendo",0.35, 40)), + vidaMax = (5..8).random(), + ataque = (1..3).random(), + RepositorioObjetos.obtenerObjetoPorNombre("Poción de Veneno II")!! + ) ) override fun generarDescripcion(): String { @@ -65,16 +58,17 @@ class CombateFactory : EventoFactory { override fun generarEvento(): EventoCombate { val descripcion = generarDescripcion() - val combateInfo = combatesMap[descripcion] ?: throw IllegalArgumentException("No se encontró información de combate") + val combateInfo = combatesMap[descripcion] + ?: throw IllegalArgumentException("No se encontró información de combate") return EventoCombate( descripcion = descripcion, dificultad = 0, - opciones = combateInfo.opciones.toMutableList(), + opciones = generarOpciones(""), imagenAtaque = combateInfo.imagenAtaque, imagen = combateInfo.imagenIdle, - resistenciaMax = (5..10).random(), - ataque = (1..2).random(), + resistenciaMax = combateInfo.vidaMax, + ataque = combateInfo.ataque, finalizado = false, acciones = combateInfo.habilidades.toMutableList(), recompensa = combateInfo.recompensa @@ -82,8 +76,28 @@ class CombateFactory : EventoFactory { } override fun generarOpciones(descripcion: String): MutableList<Opcion> { - val combateInfo = combatesMap[descripcion] ?: return mutableListOf() - return combateInfo.opciones.take(4).toMutableList() + return mutableListOf( + OpcionCombate( + descripcion = "Atacar", + atributoRequerida = Atributo.Ataque, + efecto = EfectoAtaqueProtagonista(70) + ), + Opcion( + descripcion = "Investigar", + atributoRequerida = Atributo.Investigacion, + efecto = EfectoInvestigarEnemigo(100) + ), + Opcion( + descripcion = "Habilidades", + atributoRequerida = Atributo.Nula, + efecto = EfectoHabilidadesProtagonista(GameState.jugador.atributos[Atributo.Vida]!!) + ), + OpcionCombate( + descripcion = "Huir", + atributoRequerida = Atributo.Vida, + efecto = EfectoHuirProtagonista(GameState.jugador.atributos[Atributo.Vida]!!), + ) + ) } override fun generarImagen(descripcion: String): Int { 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 702fac9fa696005116810e05be687308d9059faf..5769c1392298f9541ce4364e0baf286df1e7e858 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 @@ -31,6 +31,11 @@ abstract class Evento( notifyObservers() } + fun setResistencia(valor : Int){ + resistenciaActual = valor + notifyObservers() + } + private fun notifyObservers() { observers.forEach { it(this) } } diff --git a/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/objeto/efectoObjeto/EfectoObjetoAtacar.kt b/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/objeto/efectoObjeto/EfectoObjetoAtacar.kt new file mode 100644 index 0000000000000000000000000000000000000000..b6b49b6614690a10356b53c4ea693f27d19b909a --- /dev/null +++ b/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/objeto/efectoObjeto/EfectoObjetoAtacar.kt @@ -0,0 +1,9 @@ +package com.example.ellegadodepintia.exploradoresDePintia.model.objeto.efectoObjeto + +import com.example.ellegadodepintia.exploradoresDePintia.model.GameState + +class EfectoObjetoAtacar (private val ptosAtaque : Int): EfectoObjeto(){ + override fun ejecutar() { + GameState.eventoActual.actualizarResistencia(-ptosAtaque) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/ellegadodepintia/repositorios/RepositorioObjetos.kt b/app/src/main/java/com/example/ellegadodepintia/repositorios/RepositorioObjetos.kt index 5bd73bf947d2bf12ace3d6f6de69e2f6dd687822..60823ae0225031efc058eee0c4d8dba324fb0eba 100644 --- a/app/src/main/java/com/example/ellegadodepintia/repositorios/RepositorioObjetos.kt +++ b/app/src/main/java/com/example/ellegadodepintia/repositorios/RepositorioObjetos.kt @@ -4,6 +4,7 @@ import com.example.ellegadodepintia.R import com.example.ellegadodepintia.exploradoresDePintia.model.Atributo import com.example.ellegadodepintia.exploradoresDePintia.model.objeto.* import com.example.ellegadodepintia.exploradoresDePintia.model.objeto.efectoObjeto.EfectoEquipableAumento +import com.example.ellegadodepintia.exploradoresDePintia.model.objeto.efectoObjeto.EfectoObjetoAtacar import com.example.ellegadodepintia.exploradoresDePintia.model.objeto.efectoObjeto.EfectoObjetoCura object RepositorioObjetos { @@ -57,6 +58,12 @@ object RepositorioObjetos { efecto = EfectoObjetoCura(999), imagen = R.drawable.asi_objeto_pocima_vida_all ), + ObjetoConsumible( + nombre = "Poción de Veneno II", + descripcion = "Según las leyendas, los vacceos preparaban este brebaje para impregnar sus armas, asegurando que incluso un rasguño pudiera derrotar a un enemigo. Hace 2 de daño al enemigo.", + efecto = EfectoObjetoAtacar(2), + imagen = R.drawable.asi_objeto_veneno2 + ), ObjetoEquipable( nombre = "Escudo Caetrae", descripcion = "La caetrae es un escudo redondo vacceo, forjado para la defensa en combate, que aumenta tu vida máxima en 10 puntos.", diff --git a/app/src/main/res/drawable-nodpi/asi_objeto_veneno2.png b/app/src/main/res/drawable-nodpi/asi_objeto_veneno2.png new file mode 100644 index 0000000000000000000000000000000000000000..0babd40946a9d35ce491dd830beadd79cd4dafca Binary files /dev/null and b/app/src/main/res/drawable-nodpi/asi_objeto_veneno2.png differ diff --git a/app/src/main/res/drawable-nodpi/skeleton_attack_01.png b/app/src/main/res/drawable-nodpi/skeleton_attack_01.png new file mode 100644 index 0000000000000000000000000000000000000000..19801cb86f9eacbc98d95e76cfec7ae98762077f Binary files /dev/null and b/app/src/main/res/drawable-nodpi/skeleton_attack_01.png differ diff --git a/app/src/main/res/drawable-nodpi/skeleton_attack_02.png b/app/src/main/res/drawable-nodpi/skeleton_attack_02.png new file mode 100644 index 0000000000000000000000000000000000000000..c33c5bdff6514c0b632a9a5602bacf31ec9da3a3 Binary files /dev/null and b/app/src/main/res/drawable-nodpi/skeleton_attack_02.png differ diff --git a/app/src/main/res/drawable-nodpi/skeleton_attack_03.png b/app/src/main/res/drawable-nodpi/skeleton_attack_03.png new file mode 100644 index 0000000000000000000000000000000000000000..e60fe4ea2586541d74a5da770f6a0313a3cf0072 Binary files /dev/null and b/app/src/main/res/drawable-nodpi/skeleton_attack_03.png differ diff --git a/app/src/main/res/drawable-nodpi/skeleton_attack_04.png b/app/src/main/res/drawable-nodpi/skeleton_attack_04.png new file mode 100644 index 0000000000000000000000000000000000000000..818f127f7317436b70a6e4702512578b3bb715f7 Binary files /dev/null and b/app/src/main/res/drawable-nodpi/skeleton_attack_04.png differ diff --git a/app/src/main/res/drawable-nodpi/skeleton_attack_05.png b/app/src/main/res/drawable-nodpi/skeleton_attack_05.png new file mode 100644 index 0000000000000000000000000000000000000000..1678bc479c16209b35b22fa242152784cb15501f Binary files /dev/null and b/app/src/main/res/drawable-nodpi/skeleton_attack_05.png differ diff --git a/app/src/main/res/drawable-nodpi/skeleton_attack_06.png b/app/src/main/res/drawable-nodpi/skeleton_attack_06.png new file mode 100644 index 0000000000000000000000000000000000000000..450d56e0091b34ba21fa5a88e05e75085b1eb6b1 Binary files /dev/null and b/app/src/main/res/drawable-nodpi/skeleton_attack_06.png differ diff --git a/app/src/main/res/drawable-nodpi/skeleton_attack_07.png b/app/src/main/res/drawable-nodpi/skeleton_attack_07.png new file mode 100644 index 0000000000000000000000000000000000000000..416309da36f918e26c6b22ab6641e0297cabce47 Binary files /dev/null and b/app/src/main/res/drawable-nodpi/skeleton_attack_07.png differ diff --git a/app/src/main/res/drawable-nodpi/skeleton_attack_08.png b/app/src/main/res/drawable-nodpi/skeleton_attack_08.png new file mode 100644 index 0000000000000000000000000000000000000000..3696dc8ced4867aa48812f09e0f2c010a0ac32f1 Binary files /dev/null and b/app/src/main/res/drawable-nodpi/skeleton_attack_08.png differ diff --git a/app/src/main/res/drawable-nodpi/skeleton_attack_09.png b/app/src/main/res/drawable-nodpi/skeleton_attack_09.png new file mode 100644 index 0000000000000000000000000000000000000000..30bfc4b4cc1bcfe243a09005014e4065f0e5b938 Binary files /dev/null and b/app/src/main/res/drawable-nodpi/skeleton_attack_09.png differ diff --git a/app/src/main/res/drawable-nodpi/skeleton_attack_10.png b/app/src/main/res/drawable-nodpi/skeleton_attack_10.png new file mode 100644 index 0000000000000000000000000000000000000000..77c6d1ce15ef309ca7c6839de3339b4841a3479b Binary files /dev/null and b/app/src/main/res/drawable-nodpi/skeleton_attack_10.png differ diff --git a/app/src/main/res/drawable-nodpi/skeleton_attack_11.png b/app/src/main/res/drawable-nodpi/skeleton_attack_11.png new file mode 100644 index 0000000000000000000000000000000000000000..1bf9be885d8060cf57a3bec6d9d471a18155e72e Binary files /dev/null and b/app/src/main/res/drawable-nodpi/skeleton_attack_11.png differ diff --git a/app/src/main/res/drawable-nodpi/skeleton_attack_12.png b/app/src/main/res/drawable-nodpi/skeleton_attack_12.png new file mode 100644 index 0000000000000000000000000000000000000000..8027bd8d15fed0beffabaac1418cd012b5dca961 Binary files /dev/null and b/app/src/main/res/drawable-nodpi/skeleton_attack_12.png differ diff --git a/app/src/main/res/drawable-nodpi/skeleton_attack_13.png b/app/src/main/res/drawable-nodpi/skeleton_attack_13.png new file mode 100644 index 0000000000000000000000000000000000000000..6c14d89e9d4bbace63b5f367a33e80677752b122 Binary files /dev/null and b/app/src/main/res/drawable-nodpi/skeleton_attack_13.png differ diff --git a/app/src/main/res/drawable-nodpi/skeleton_idle_00.png b/app/src/main/res/drawable-nodpi/skeleton_idle_00.png new file mode 100644 index 0000000000000000000000000000000000000000..94c2af31fd531f11277d93e18c687b519238e4c2 Binary files /dev/null and b/app/src/main/res/drawable-nodpi/skeleton_idle_00.png differ diff --git a/app/src/main/res/drawable-nodpi/skeleton_idle_01.png b/app/src/main/res/drawable-nodpi/skeleton_idle_01.png new file mode 100644 index 0000000000000000000000000000000000000000..59cc596314dd6d602f19ff0659c91e0fa5ee7dc1 Binary files /dev/null and b/app/src/main/res/drawable-nodpi/skeleton_idle_01.png differ diff --git a/app/src/main/res/drawable-nodpi/skeleton_idle_02.png b/app/src/main/res/drawable-nodpi/skeleton_idle_02.png new file mode 100644 index 0000000000000000000000000000000000000000..ac2280e11027d15b824d6e6da740368341f8cbb1 Binary files /dev/null and b/app/src/main/res/drawable-nodpi/skeleton_idle_02.png differ diff --git a/app/src/main/res/drawable-nodpi/skeleton_idle_03.png b/app/src/main/res/drawable-nodpi/skeleton_idle_03.png new file mode 100644 index 0000000000000000000000000000000000000000..e5c7cc437f2fe31e5090c8518df3c23bbf2ee6f0 Binary files /dev/null and b/app/src/main/res/drawable-nodpi/skeleton_idle_03.png differ diff --git a/app/src/main/res/drawable/monster_skeleton_attack.xml b/app/src/main/res/drawable/monster_skeleton_attack.xml new file mode 100644 index 0000000000000000000000000000000000000000..a41feddbd6e416269490a0c0d34390f6b4930ccf --- /dev/null +++ b/app/src/main/res/drawable/monster_skeleton_attack.xml @@ -0,0 +1,18 @@ +<animation-list xmlns:android="http://schemas.android.com/apk/res/android" + android:oneshot="false"> + + <item android:drawable="@drawable/skeleton_attack_01" android:duration="150" /> + <item android:drawable="@drawable/skeleton_attack_02" android:duration="150" /> + <item android:drawable="@drawable/skeleton_attack_03" android:duration="150" /> + <item android:drawable="@drawable/skeleton_attack_04" android:duration="150" /> + <item android:drawable="@drawable/skeleton_attack_05" android:duration="150" /> + <item android:drawable="@drawable/skeleton_attack_06" android:duration="150" /> + <item android:drawable="@drawable/skeleton_attack_07" android:duration="150" /> + <item android:drawable="@drawable/skeleton_attack_08" android:duration="150" /> + <item android:drawable="@drawable/skeleton_attack_09" android:duration="150" /> + <item android:drawable="@drawable/skeleton_attack_10" android:duration="150" /> + <item android:drawable="@drawable/skeleton_attack_11" android:duration="150" /> + <item android:drawable="@drawable/skeleton_attack_12" android:duration="150" /> + <item android:drawable="@drawable/skeleton_attack_13" android:duration="150" /> + +</animation-list> \ No newline at end of file diff --git a/app/src/main/res/drawable/monster_skeleton_idle.xml b/app/src/main/res/drawable/monster_skeleton_idle.xml new file mode 100644 index 0000000000000000000000000000000000000000..61853e207604adfbd78b9cd5ff265a4ac8c9e864 --- /dev/null +++ b/app/src/main/res/drawable/monster_skeleton_idle.xml @@ -0,0 +1,9 @@ +<animation-list xmlns:android="http://schemas.android.com/apk/res/android" + android:oneshot="false"> + + <item android:drawable="@drawable/skeleton_idle_00" android:duration="200" /> + <item android:drawable="@drawable/skeleton_idle_01" android:duration="200" /> + <item android:drawable="@drawable/skeleton_idle_02" android:duration="200" /> + <item android:drawable="@drawable/skeleton_idle_03" android:duration="200" /> + +</animation-list> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_exploradores_de_pintia.xml b/app/src/main/res/layout/activity_exploradores_de_pintia.xml index c5b7fb2787649283b97e88db5be0f52c2ffeb6b6..e35a936534af0456b72bbf445568b87bedb1d193 100644 --- a/app/src/main/res/layout/activity_exploradores_de_pintia.xml +++ b/app/src/main/res/layout/activity_exploradores_de_pintia.xml @@ -107,7 +107,7 @@ android:layout_height="match_parent" android:contentDescription="Imagen del yacimiento arqueológico" android:scaleX="-1" - android:src="@drawable/monster_metal_idle_00" /> + android:src="@drawable/skeleton_idle_03" /> <ImageView android:id="@+id/imagenEfectoEvento"