diff --git a/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/ExploradoresDePintia.kt b/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/ExploradoresDePintia.kt index 5b1557d2841f05a4ff94f303b925332e6cdac879..56d9117457ebd4e700ee6b66cfd8468b4429f2de 100644 --- a/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/ExploradoresDePintia.kt +++ b/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/ExploradoresDePintia.kt @@ -20,9 +20,11 @@ import com.example.ellegadodepintia.exploradoresDePintia.model.GeneradorDeEvento import com.example.ellegadodepintia.exploradoresDePintia.model.LayoutUtils import com.example.ellegadodepintia.exploradoresDePintia.model.GestorDeEventos import com.example.ellegadodepintia.repositorios.RepositorioObjetos +import com.example.ellegadodepintia.soundManager.SoundManager import java.lang.ref.WeakReference class ExploradoresDePintia : AppCompatActivity() { + private lateinit var soundManager: SoundManager private var dificultad = 0 private lateinit var startForResult: ActivityResultLauncher<Intent> @@ -31,6 +33,8 @@ class ExploradoresDePintia : AppCompatActivity() { super.onCreate(savedInstanceState) setContentView(R.layout.activity_exploradores_de_pintia) + soundManager = SoundManager(this) + soundManager.playSoundLoop(R.raw.sound_exploradores_idle,100) startForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == Activity.RESULT_OK) { @@ -109,5 +113,10 @@ class ExploradoresDePintia : AppCompatActivity() { } + override fun onDestroy() { + super.onDestroy() + soundManager.stopSound() + } + } 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 62dced39627d4596efec0733a6ad6306982c346b..b5672f5b2a378717cf68b76b998e571b1298926e 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 @@ -8,29 +8,84 @@ import com.example.ellegadodepintia.exploradoresDePintia.model.GameState.context import com.example.ellegadodepintia.exploradoresDePintia.model.eventoFactory.Evento import com.example.ellegadodepintia.exploradoresDePintia.model.eventoFactory.EventoCombate import com.example.ellegadodepintia.exploradoresDePintia.model.eventoFactory.EventoFactorySelector +import kotlin.random.Random object GeneradorDeEventos { - private const val CANTIDAD = 8 // Numero de eventos generados + private const val CANTIDAD = 10 // Numero de eventos generados private var eventos = ArrayList<Evento>() - private fun crearEvento(): Evento { - val factory = EventoFactorySelector.obtenerFactory() - return factory.generarEvento() - } + private val pesosBase = mutableMapOf( + TipoEvento.Reliquia to 0.25, + TipoEvento.Tienda to 0.1, + TipoEvento.Riesgo to 0.2, + TipoEvento.Trampa to 0.1, + TipoEvento.Combate to 0.25, + TipoEvento.Descanso to 0.0, + TipoEvento.Ladron to 0.1 + ) + + private var historialTipos = mutableListOf<TipoEvento>() + fun generarEventos() { val eventosGenerados = ArrayList<Evento>() + historialTipos = mutableListOf() + + while (eventosGenerados.size < CANTIDAD) { - val nuevoEvento = crearEvento() + val tipoSeleccionado = seleccionarTipoEvento() + println(historialTipos) + if (historialTipos.isNotEmpty() && tipoSeleccionado == historialTipos.last()) { + continue + } + + val nuevoEvento = EventoFactorySelector.obtenerFactory(tipoSeleccionado).generarEvento() if (!eventosGenerados.contains(nuevoEvento)) { eventosGenerados.add(nuevoEvento) + historialTipos.add(tipoSeleccionado) } } + eventos = eventosGenerados } + private fun seleccionarTipoEvento(): TipoEvento { + val pesosActuales = pesosBase.toMutableMap() + + // 20% Descanso tras dos riegsos en los últimos 3 eventos + val recientes = historialTipos.takeLast(3) + if (recientes.count { it == TipoEvento.Riesgo } >= 2) { + pesosActuales[TipoEvento.Tienda] = pesosActuales[TipoEvento.Tienda]!! + 0.2 + // 25% Ladron si 2 reliquias + }else if(recientes.count{it == TipoEvento.Reliquia} >= 2){ + pesosActuales[TipoEvento.Ladron] = 0.25 + } + + // 35% Prob de descanso tras combate 20% Tienda 10% Combate + val ultimoTipo = historialTipos.lastOrNull() + if (ultimoTipo == TipoEvento.Combate) { + pesosActuales[TipoEvento.Descanso] = 0.35 + pesosActuales[TipoEvento.Tienda] = 0.2 + pesosActuales[TipoEvento.Combate] = 0.1 + } + + val totalPesos = pesosActuales.values.sum() + val probabilidadesNormalizadas = pesosActuales.mapValues { it.value / totalPesos } + + val acumulado = probabilidadesNormalizadas.entries.fold(mutableListOf<Pair<Double, TipoEvento>>()) { acc, entry -> + val sumaAcumulada = acc.lastOrNull()?.first ?: 0.0 + acc.add(Pair(sumaAcumulada + entry.value, entry.key)) + acc + } + + val random = Random.nextDouble() + val tipoSeleccionado = acumulado.first { random <= it.first }.second + + return tipoSeleccionado + } + fun comprobarEventoDisponible() : Boolean{ return eventos.size >= 1 } @@ -66,7 +121,7 @@ object GeneradorDeEventos { private fun filtrarEventosPorDificultad(eventos: ArrayList<Evento>, dificultad: Int): Evento { val eventosFiltrados = eventos.filter { it.dificultad == dificultad } - return eventosFiltrados[eventosFiltrados.indices.random()] + return eventosFiltrados[eventosFiltrados.indices.first] } 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..f8f1ae086d47b6b7355bb945c3f28ab3d0d6f5ec 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() @@ -81,9 +101,15 @@ object GestorCombate { } else { evento.actualizarFinalizado(true) turnoJugador = true - "¡Enhorabuena has acabado con el monstruo!".also { - context!!.findViewById<TextView>(R.id.textoResultado).text = it + 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) } + } } @@ -104,36 +130,47 @@ 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/TipoEvento.kt b/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/TipoEvento.kt index 6e5dcbe9b768c5f3c492a609df7d78f5a20ed7a0..4966a4d9e691dfa242eb888b3304b6b836e3c473 100644 --- a/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/TipoEvento.kt +++ b/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/TipoEvento.kt @@ -10,6 +10,7 @@ enum class TipoEvento { Ladron, Desenterrar, /*Trampa, + /* Aliado, Misterio, Magia, diff --git a/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/efecto/EfectoAtaqueProtagonista.kt b/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/efecto/EfectoAtaqueProtagonista.kt index 98ef0631da7edf17005c7b726fd3a2ade4e8da29..50da27b81c9bd3825a8b500adc0e78491fdedb41 100644 --- a/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/efecto/EfectoAtaqueProtagonista.kt +++ b/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/efecto/EfectoAtaqueProtagonista.kt @@ -15,7 +15,7 @@ class EfectoAtaqueProtagonista(probabilidadExito: Int) : Efecto(probabilidadExit GameState.eventoActual.actualizarResistencia(-ataqueReal) mensaje = "¡Ataque realizado con éxito has hecho $ataqueReal de daño" } else { - mensaje = "El enemigo ha aguantado el golpe, recibe 0 de daño" + mensaje = "Has fallado el golpe, recibe 0 de daño" } return mensaje } 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..9d2ccef3749a14d325e73395a27d820fc4d54fee 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,28 @@ 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 +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 recompensa: Objeto +) 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 +38,7 @@ class CombateFactory : EventoFactory { Opcion( descripcion = "Investigar", atributoRequerida = Atributo.Investigacion, - EfectoInvestigarEnemigo(100) + efecto = EfectoInvestigarEnemigo(100) ), Opcion( descripcion = "Habilidades", @@ -38,7 +50,12 @@ 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()) + ), + RepositorioObjetos.obtenerObjetoPorNombre("Moneda de plata Vaccea")!! ), ) @@ -48,30 +65,29 @@ 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(), + recompensa = combateInfo.recompensa ) } 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 20f6e438be2a7feaa632d5f94736289f3e302e54..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 @@ -7,40 +7,33 @@ import com.example.ellegadodepintia.exploradoresDePintia.model.efecto.EfectoIgno import com.example.ellegadodepintia.exploradoresDePintia.model.efecto.EfectoNubeVaccea class DescansoFactory : EventoFactory { - private val descansosMap = mapOf( - "Llegaste a un campamento vacceo, con un gran fuego en el centro y chozas hechas de madera y barro. Aquí puedes descansar, recuperar energía y estar listo para nuevas aventuras." to Pair( - R.drawable.asi_exploradores_campamento, listOf( - Opcion( - descripcion = "Descansar", - atributoRequerida = Atributo.Energia, - EfectoNubeVaccea() - - ), Opcion( - descripcion = "Continuar", - atributoRequerida = Atributo.Nula, - EfectoIgnorar(100) - ) - ) - ) - ) + val descripcion = "Llegaste a un campamento vacceo, con un gran fuego en el centro y chozas hechas de madera y barro. Aquí puedes descansar, recuperar energía y estar listo para nuevas aventuras." override fun generarDescripcion(): String { - return descansosMap.keys.random() + return descripcion } override fun generarOpciones(descripcion: String): MutableList<Opcion> { - return descansosMap[descripcion]?.second?.toMutableList() - ?: mutableListOf() + return mutableListOf( + Opcion( + descripcion = "Descansar", + atributoRequerida = Atributo.Energia, + EfectoNubeVaccea() + + ), Opcion( + descripcion = "Continuar", + atributoRequerida = Atributo.Nula, + EfectoIgnorar(100) + )) } override fun generarImagen(descripcion: String): Int { - return descansosMap[descripcion]?.first!! + return R.drawable.asi_exploradores_campamento } override fun generarEvento(): EventoDescanso { - val descripcion = generarDescripcion() return EventoDescanso( - descripcion = descripcion, + descripcion = generarDescripcion(), dificultad = 0, opciones = generarOpciones(descripcion), imagen = generarImagen(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/EventoCombate.kt b/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/eventoFactory/EventoCombate.kt index 5c42d31a6f20b47634a8f94683424fff423ffac3..5545d623ce49ed4e23366fecc626722905ad1697 100644 --- a/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/eventoFactory/EventoCombate.kt +++ b/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/eventoFactory/EventoCombate.kt @@ -2,8 +2,11 @@ package com.example.ellegadodepintia.exploradoresDePintia.model.eventoFactory import com.example.ellegadodepintia.exploradoresDePintia.model.Opcion import com.example.ellegadodepintia.exploradoresDePintia.model.efecto.Efecto +import com.example.ellegadodepintia.exploradoresDePintia.model.objeto.Objeto +import java.util.UUID class EventoCombate( + override val descripcion: String, override val dificultad: Int, override val opciones: MutableList<Opcion>, @@ -12,4 +15,18 @@ class EventoCombate( var ataque: Int, val imagenAtaque : Int, val acciones: MutableList<Efecto>, -) : Evento(descripcion, dificultad, opciones, imagen, resistenciaMax, resistenciaMax, finalizado) \ No newline at end of file + val recompensa : Objeto +) : 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 + other as EventoCombate + + return id == other.id + } + + override fun hashCode(): Int { + return 31 * id.hashCode() + } +} \ No newline at end of file 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 d30a839cc13c4ebba9023266ef6ccd4bbd4b473c..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,6 +1,7 @@ package com.example.ellegadodepintia.exploradoresDePintia.model.eventoFactory import com.example.ellegadodepintia.exploradoresDePintia.model.Opcion +import java.util.UUID class EventoDescanso( override val descripcion: String, @@ -8,4 +9,18 @@ class EventoDescanso( override val opciones: MutableList<Opcion>, override val imagen: Int, resistenciaMax: Int, override var finalizado: Boolean, -) : Evento(descripcion, dificultad, opciones, imagen, resistenciaMax, resistenciaMax, finalizado) \ No newline at end of file +) : 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 + other as EventoDescanso + + return id == other.id + } + + override fun hashCode(): Int { + return 31 * id.hashCode() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/eventoFactory/EventoFactorySelector.kt b/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/eventoFactory/EventoFactorySelector.kt index 9cb68052b600087f8ea52de84343234763b87ce7..3a1beff845c1866979e24dc021165e2d53d96b0b 100644 --- a/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/eventoFactory/EventoFactorySelector.kt +++ b/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/eventoFactory/EventoFactorySelector.kt @@ -4,9 +4,7 @@ import com.example.ellegadodepintia.exploradoresDePintia.model.TipoEvento object EventoFactorySelector { - fun obtenerFactory(): EventoFactory { - val tipo = seleccionarTipoEventoConProbabilidades() - + fun obtenerFactory(tipo: TipoEvento): EventoFactory { return when (tipo) { TipoEvento.Reliquia -> ReliquiaFactory() TipoEvento.Combate -> CombateFactory() @@ -18,26 +16,4 @@ object EventoFactorySelector { TipoEvento.Desenterrar -> DesenterrarFactory() } } - - private fun seleccionarTipoEventoConProbabilidades(): TipoEvento { - val probabilidades = mapOf( - TipoEvento.Reliquia to 0.2, - TipoEvento.Tienda to 0.1, - TipoEvento.Riesgo to 0.1, - TipoEvento.Trampa to 0.1, - TipoEvento.Combate to 0.2, - TipoEvento.Descanso to 0.1, - TipoEvento.Ladron to 0.1, - TipoEvento.Desenterrar to 0.1 - ) - - val acumulado = probabilidades.entries.fold(mutableListOf<Pair<Double, TipoEvento>>()) { acc, entry -> - val sumaAcumulada = acc.lastOrNull()?.first ?: 0.0 - acc.add(Pair(sumaAcumulada + entry.value, entry.key)) - acc - } - - val random = Math.random() - return acumulado.first { random <= it.first }.second - } } diff --git a/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/eventoFactory/RiesgoFactory.kt b/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/eventoFactory/RiesgoFactory.kt index 26c410bbd07a0e35a38269ac675fdb2beec73942..e205b26cf3163982beb433062d994addd96ddd2a 100644 --- a/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/eventoFactory/RiesgoFactory.kt +++ b/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/eventoFactory/RiesgoFactory.kt @@ -76,7 +76,7 @@ class RiesgoFactory : EventoFactory { val evento = EventoRiesgo( id = id, - descripcion = descripcionComun, + descripcion = generarDescripcion(), dificultad = 0, opciones = eventoData.opciones.toMutableList(), imagen = eventoData.imagen, diff --git a/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/objeto/ObjetoDeValor.kt b/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/objeto/ObjetoDeValor.kt index 176b7f0e11fcd36d6dc111ba2f59e87e24340580..c434380705674280cdd816e23dada73ec6e4acf8 100644 --- a/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/objeto/ObjetoDeValor.kt +++ b/app/src/main/java/com/example/ellegadodepintia/exploradoresDePintia/model/objeto/ObjetoDeValor.kt @@ -2,7 +2,7 @@ package com.example.ellegadodepintia.exploradoresDePintia.model.objeto import com.example.ellegadodepintia.exploradoresDePintia.model.objeto.efectoObjeto.EfectoVender -class ObjetoDeValor( +open class ObjetoDeValor( nombre: String, descripcion: String, imagen: Int, 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 dc314b5604e581e2d5ffe8fda2afff2075f4e187..f1072323c00dcff1d94eb40a4d4af222642bc44f 100644 --- a/app/src/main/java/com/example/ellegadodepintia/repositorios/RepositorioObjetos.kt +++ b/app/src/main/java/com/example/ellegadodepintia/repositorios/RepositorioObjetos.kt @@ -83,6 +83,12 @@ object RepositorioObjetos { nombre = "Pala Vaccea", descripcion = "Una antigua pala con marcas de uso, forjada con madera resistente y un metal desgastado por el tiempo. Parece estar llena de historia.", imagen = R.drawable.asi_objeto_pala + ), + ObjetoDeValor( + nombre= "Moneda de plata Vaccea", + descripcion = "Pequeño denario con símbolos celtíberos, utilizadas para el comercio. Su circulación refleja una economía organizada en torno a la élite guerrera", + imagen = R.drawable.asi_objeto_moneda, + coste = 15 ) ).associateBy { it.nombre } } diff --git a/app/src/main/res/drawable-nodpi/asi_objeto_moneda.JPG b/app/src/main/res/drawable-nodpi/asi_objeto_moneda.JPG new file mode 100644 index 0000000000000000000000000000000000000000..00d4e625af26a461291d568eeebbab83c70b3f6b Binary files /dev/null and b/app/src/main/res/drawable-nodpi/asi_objeto_moneda.JPG differ diff --git a/app/src/main/res/drawable/asi_objeto_tesoro.jpg b/app/src/main/res/drawable/asi_objeto_tesoro.jpg new file mode 100644 index 0000000000000000000000000000000000000000..830886700eac2926108f9e2b89c3b824edff0df7 Binary files /dev/null and b/app/src/main/res/drawable/asi_objeto_tesoro.jpg differ 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> diff --git a/app/src/main/res/raw/sound_battle.mp3 b/app/src/main/res/raw/sound_battle.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..588f4a2749b70c22dc422170eb5ce329364d3eaa Binary files /dev/null and b/app/src/main/res/raw/sound_battle.mp3 differ diff --git a/app/src/main/res/raw/sound_exploradores_idle.mp3 b/app/src/main/res/raw/sound_exploradores_idle.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..ee993bc43e6b2909544974f29d827dc14a223443 Binary files /dev/null and b/app/src/main/res/raw/sound_exploradores_idle.mp3 differ