Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • main
1 result

Target

Select target project
  • diegval/el-legado-de-pintia
1 result
Select Git revision
  • main
1 result
Show changes
Showing
with 198 additions and 81 deletions
......@@ -28,6 +28,7 @@ class InicioMinijuego1 : AppCompatActivity() {
// Intent para iniciar una nueva actividad (supongamos que tienes una Activity llamada GameActivity)
val intent = Intent(this, Minijuego1::class.java)
startActivity(intent)
finish()
}
}
}
\ No newline at end of file
......@@ -17,6 +17,7 @@ import android.widget.ImageView
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import com.example.ellegadodepintia.R
import com.example.ellegadodepintia.exploradoresDePintia.model.GameState.context
import com.example.ellegadodepintia.soundManager.SoundManager
import kotlin.random.Random
......@@ -124,7 +125,7 @@ class Minijuego1 : AppCompatActivity() {
val intent = Intent(this@Minijuego1, FinMinijuego1::class.java)
intent.putExtra("puntuacion", puntaje)
if (!fuera) {
startActivity(intent)
context!!.startActivityForResult(intent, 104)
}
finish()
}
......
package com.example.ellegadodepintia.minijuego2
import android.content.Intent
import android.os.Bundle
import android.os.Handler
import android.os.Looper
......@@ -64,6 +65,7 @@ class Minijuego2 : AppCompatActivity() {
nube = findViewById(R.id.nube)
fondo1 = findViewById(R.id.fondo1)
fondo2 = findViewById(R.id.fondo2)
}
private fun configurarAnimaciones() {
......@@ -81,8 +83,8 @@ class Minijuego2 : AppCompatActivity() {
iniciarJuego()
protagonista.y = (layout.height / 2).toFloat()
fondo2.x = fondo1.x + fondo1.width * 4
protagonista.x = protagonista.x + 40
nube.x = protagonista.x + 30
protagonista.x = protagonista.x + (layout.width*0.1).toInt()
nube.x = protagonista.x + (layout.width*0.03).toInt()
}
}
......@@ -175,32 +177,33 @@ class Minijuego2 : AppCompatActivity() {
velocidad = 0f
} else if (nuevaPosicionY + protagonista.height < techoPantalla) {
protagonista.y = nuevaPosicionY
nube.y = protagonista.y + 100
nube.y = protagonista.y + (layout.height*0.05).toInt()
}
}
private fun generarObstaculo() {
val anchuraPantalla = layout.width
val alturaPantalla = layout.height
val muroInferior = ImageView(this)
muroInferior.setBackgroundResource(R.drawable.asi_minijuego_2_muro)
val screenHeight = findViewById<View>(android.R.id.content).height
val altualturaMuro = Random.nextInt(500, 1500)
val altualturaMuro = (alturaPantalla *(0.2f + Random.nextFloat() * (0.4f))).toInt()
// Configurar posición y tamaño de la tubería inferior
val layoutParams = RelativeLayout.LayoutParams(300, altualturaMuro)
val layoutParams = RelativeLayout.LayoutParams((anchuraPantalla*0.3f).toInt(), altualturaMuro)
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT)
muroInferior.layoutParams = layoutParams
muroInferior.x = layout.width.toFloat()
muroInferior.y = (screenHeight - altualturaMuro).toFloat()
muroInferior.y = (alturaPantalla - altualturaMuro).toFloat()
layout.addView(muroInferior)
obstaculos.add(muroInferior)
// Generar la tubería superior
val muroSuperior = ImageView(this)
muroSuperior.setBackgroundResource(R.drawable.asi_minijuego_2_muro)
val alturaMuroSuperior = screenHeight - altualturaMuro - 500
val alturaMuroSuperior = (alturaPantalla - altualturaMuro - alturaPantalla*0.2).toInt()
muroSuperior.rotation = 180f
// Configurar posición y tamaño de la tubería superior
val layoutParamsSuperior = RelativeLayout.LayoutParams(300, alturaMuroSuperior)
val layoutParamsSuperior = RelativeLayout.LayoutParams((anchuraPantalla*0.3f).toInt(), alturaMuroSuperior)
layoutParamsSuperior.addRule(RelativeLayout.ALIGN_PARENT_RIGHT)
muroSuperior.layoutParams = layoutParamsSuperior
muroSuperior.x = layout.width.toFloat()
......@@ -214,14 +217,12 @@ class Minijuego2 : AppCompatActivity() {
for (obstaculo in obstaculos) {
obstaculo.x -= velObs // Mover obstáculo a la izquierda
// Verificar si el protagonista pasa el obstáculo
if (obstaculo.x + obstaculo.width == protagonista.x && obstaculo.y < protagonista.y) {
puntuacion++
puntuacionTextView.text = "Puntuación: $puntuacion"
}
// Verificar si el obstáculo sale de la pantalla
if (obstaculo.x + obstaculo.width < 0) {
if(obstaculo.rotation ==180f){
puntuacion++
}
puntuacionTextView.text = "Puntuación: $puntuacion"
obstaculosAEliminar.add(obstaculo) // Agregar a la lista de eliminación
}
}
......@@ -246,21 +247,31 @@ class Minijuego2 : AppCompatActivity() {
}
private fun detenerJuego() {
val flag = intent.getBooleanExtra("FLAG_KEY", false)
jugando = false
soundManager.stopSound()
soundManager.playSound(R.raw.sound_over, 100)
protagonista.clearAnimation()
val animacionMuerte = AnimationUtils.loadAnimation(this, R.anim.caida)
obstacleTimer?.let { handler.removeCallbacks(it) } // Detener el temporizador de obstáculos
protagonista.startAnimation(animacionMuerte)
protagonista.visibility = View.GONE
botonReinicio.visibility = View.VISIBLE // Mostrar botón de reinicio
// Mostrar botón de reinicio
botonReinicio.visibility = View.VISIBLE
val animacion = AnimationUtils.loadAnimation(this, R.anim.animatitu)
botonReinicio.startAnimation(animacion)
if(flag){
botonReinicio.setOnClickListener {
botonReinicio.clearAnimation()
reiniciarJuego()
}
}else{
// Devuelve la puntuación actual y finaliza la actividad
val resultadoIntent = Intent()
resultadoIntent.putExtra("PUNTUACION", puntuacion.toString())
setResult(RESULT_OK, resultadoIntent)
finish()
}
}
private fun reiniciarJuego() {
......@@ -273,6 +284,7 @@ class Minijuego2 : AppCompatActivity() {
for (obstaculo in obstaculos) {
layout.removeView(obstaculo) // Eliminar cada obstáculo del layout
}
botonReinicio.clearAnimation()
botonReinicio.visibility = View.GONE // Ocultar botón de reinicio
iniciarJuego() // Reiniciar el juego
}
......
......@@ -18,7 +18,6 @@ import android.animation.AnimatorListenerAdapter
import android.animation.ValueAnimator
import android.graphics.ColorMatrix
import android.graphics.ColorMatrixColorFilter
import com.example.ellegadodepintia.MapActivity
import com.example.ellegadodepintia.R
import com.example.ellegadodepintia.soundManager.SoundManager
......@@ -35,7 +34,7 @@ class Minijuego3 : AppCompatActivity() {
private var segundaCarta: Carta? = null
private var procesandose = false
private var cuentraAtras: CountDownTimer? = null
private var tiempoRestante: Long = 45000 // 1 minuto en milisegundos
private var tiempoRestante: Long = 25000 // 1 minuto en milisegundos
private var tiempoCorriendo = false
override fun onCreate(savedInstanceState: Bundle?) {
......@@ -83,16 +82,22 @@ class Minijuego3 : AppCompatActivity() {
R.drawable.asi_minijuego_3_vasito, R.drawable.asi_minijuego_3_copa_negra_brunida, R.drawable.asi_minijuego_3_jarra_de_pico, R.drawable.asi_minijuego_3_copa_tumba_75,
R.drawable.asi_minijuego_3_sonajero_redondo, R.drawable.asi_minijuego_3_tres_en_raya, R.drawable.asi_minijuego_3_tapadera_zoomorfo, R.drawable.asi_minijuego_3_tintinnabulum
)
val imagenesCartas = (images + images).shuffled()
val tamannoCarta = 200
// Obtén el ancho de la pantalla
val displayMetrics = resources.displayMetrics
val screenWidth = displayMetrics.widthPixels
val numColumnas = 4.2
val margin = screenWidth/35
val tamannoCarta = (screenWidth - (margin * (numColumnas + 1))) / numColumnas
for (i in 0 until 16) {
val carta = Carta(id = i, imageResId = imagenesCartas[i])
cartas.add(carta)
val button = Button(this).apply {
layoutParams = GridLayout.LayoutParams().apply {
width = tamannoCarta
height = tamannoCarta + 50
setMargins(20, 20, 20, 20)
width = tamannoCarta.toInt()
height = ((tamannoCarta + screenWidth*0.05).toInt())
setMargins(10, 10, 10, 10)
}
setBackgroundResource(R.drawable.asi_minijuego_3_trasero)
setOnClickListener { cartaClickada(i) }
......@@ -190,7 +195,7 @@ class Minijuego3 : AppCompatActivity() {
}
private fun sumarTiempo() {
tiempoRestante += 5000
tiempoRestante += 2000
actualizarContador()
iniciarCronometro()
}
......@@ -199,8 +204,10 @@ class Minijuego3 : AppCompatActivity() {
Toast.makeText(this, mensaje, Toast.LENGTH_SHORT).show()
botonVolver.visibility = ImageView.VISIBLE
botonVolver.setOnClickListener{
val intent = Intent(this@Minijuego3, MapActivity::class.java)
startActivity(intent)
val resultadoIntent = Intent()
resultadoIntent.putExtra("TIEMPO", tiempoRestante.toString())
println(tiempoRestante)
setResult(RESULT_OK, resultadoIntent)
finish()
}
gridLayout.removeAllViews()
......
package com.example.ellegadodepintia.minijuego4
import androidx.appcompat.app.AppCompatActivity
class Minijuego4 : AppCompatActivity(){
}
\ No newline at end of file
......@@ -29,6 +29,7 @@ class MinijuegoReparacion : AppCompatActivity() {
var stop = false
val handler = Handler()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
soundManager = SoundManager(this)
......@@ -77,15 +78,15 @@ class MinijuegoReparacion : AppCompatActivity() {
}
private fun agregarFragmentosAlRelativeLayout(relativeLayout: RelativeLayout) {
val mesaHeightMin = 1700
val mesaHeightMax = 1900
val mesaHeightMin = relativeToHeight(1700)
val mesaHeightMax = relativeToHeight(1900)
for (fragmento in fragmentos) {
val imageView = ImageView(this)
imageView.setImageBitmap(fragmento.bitmap)
val params = RelativeLayout.LayoutParams(120, 120)
val params = RelativeLayout.LayoutParams(relativeToWidth(120), relativeToHeight(120))
params.leftMargin = Random.nextInt(250, 750)
params.leftMargin = Random.nextInt(relativeToWidth(250), relativeToWidth(750))
params.topMargin = Random.nextInt(mesaHeightMin, mesaHeightMax)
imageView.layoutParams = params
......@@ -104,8 +105,8 @@ class MinijuegoReparacion : AppCompatActivity() {
mostrarMartilloGolpe(relativeLayout)
for ((index, fragmento) in fragmentos.withIndex()) {
val imageView = relativeLayout.getChildAt(index) as? ImageView ?: continue
val margenIzquierdaFinal = fragmento.columna * 120 + 250
val margenArribaFinal = fragmento.fila * 120 + 1300
val margenIzquierdaFinal = fragmento.columna * relativeToWidth(120) + relativeToWidth(250)
val margenArribaFinal = fragmento.fila * relativeToHeight(120) + relativeToHeight(1300)
val precisionRandom = Random.nextFloat() * 0.4f + 0.6f
val precision = 1f - (clics * 0.20f) * precisionRandom
......@@ -113,7 +114,7 @@ class MinijuegoReparacion : AppCompatActivity() {
val margenArriba = fragmento.yPos + (margenArribaFinal - fragmento.yPos) * precision
val rotacion = fragmento.rotation * (1 - precision)
val params = RelativeLayout.LayoutParams(120, 120)
val params = RelativeLayout.LayoutParams(relativeToWidth(120), relativeToHeight(120))
params.leftMargin = margenIzquierda.toInt()
params.topMargin = margenArriba.toInt()
imageView.layoutParams = params
......@@ -135,8 +136,8 @@ class MinijuegoReparacion : AppCompatActivity() {
var para = false
val initialX = ruleImageView.x
val initialY = ruleImageView.y
val randomX = Random.nextFloat() * (1050 - 350)
val randomY = Random.nextFloat() * (1400 - 250)
val randomX = Random.nextFloat() * (relativeToWidth(1050) - relativeToWidth(350))
val randomY = Random.nextFloat() * (relativeToHeight(1400) - relativeToHeight(250))
ruleImageView.x = randomX
ruleImageView.y = randomY
val deltaX = ruleImageView.x - initialX
......@@ -237,8 +238,8 @@ class MinijuegoReparacion : AppCompatActivity() {
nubeView.setBackgroundResource(R.drawable.effect_reparar_animation)
val tam = Random.nextInt(150, 250)
val params = RelativeLayout.LayoutParams(tam, tam)
params.leftMargin = Random.nextInt(100, 800)
params.topMargin = Random.nextInt(1300, 1900)
params.leftMargin = Random.nextInt(relativeToWidth(100), relativeToWidth(700))
params.topMargin = Random.nextInt(relativeToHeight(1300), relativeToHeight(1900))
nubeView.layoutParams = params
nubeView.rotation = Random.nextFloat()* 360
relativeLayout.addView(nubeView)
......@@ -261,8 +262,8 @@ class MinijuegoReparacion : AppCompatActivity() {
martilloView.setImageResource(R.drawable.asi_reparar_martillo)
val tamMartillo = Random.nextInt(300, 500)
val params = RelativeLayout.LayoutParams(tamMartillo, tamMartillo)
params.leftMargin = Random.nextInt(100, 700)
params.topMargin = Random.nextInt(1300, 1900)
params.leftMargin = Random.nextInt(relativeToWidth(100), relativeToWidth(700))
params.topMargin = Random.nextInt(relativeToHeight(1300), relativeToHeight(1900))
martilloView.rotation = 50f
martilloView.layoutParams = params
relativeLayout.addView(martilloView)
......@@ -283,6 +284,16 @@ class MinijuegoReparacion : AppCompatActivity() {
soundManager.stopSound()
stop = true
}
// Funciones auxiliares para convertir a proporciones relativas
private fun relativeToWidth(value: Int): Int {
val metrics = resources.displayMetrics
var screenWidth = metrics.widthPixels
return (value * screenWidth) / 1080
}
private fun relativeToHeight(value: Int): Int {
val metrics = resources.displayMetrics
var screenHeight = metrics.heightPixels
return (value * screenHeight) / 2285
}
}
......@@ -2,43 +2,54 @@
import com.example.ellegadodepintia.R
import com.example.ellegadodepintia.exploradoresDePintia.model.Atributo
import com.example.ellegadodepintia.exploradoresDePintia.model.habilidad.Habilidad
import com.example.ellegadodepintia.exploradoresDePintia.model.habilidad.efectoHabilidad.EfectoBuffo
import com.example.ellegadodepintia.exploradoresDePintia.model.objeto.*
import com.example.ellegadodepintia.exploradoresDePintia.model.objeto.efectoObjeto.EfectoEquipableAumento
import com.example.ellegadodepintia.exploradoresDePintia.model.objeto.efectoObjeto.EfectoEquipableHabilidad
import com.example.ellegadodepintia.exploradoresDePintia.model.objeto.efectoObjeto.EfectoObjetoAtacar
import com.example.ellegadodepintia.exploradoresDePintia.model.objeto.efectoObjeto.EfectoObjetoCura
object RepositorioObjetos {
private val objetos: Map<String, Objeto> by lazy {
listOf(
ObjetoDeValor(
nombre = "Vasito de barro cocido",
descripcion = "Objeto de gran valor. Se convierte en 20 monedas si consigues completar la partida.",
coste = 20,
imagen = R.drawable.asi_exploradores_vasito
),
ObjetoDeValor(
nombre = "Jabonera de cerámica",
descripcion = "Objeto de gran valor. Se convierte en 20 monedas si consigues completar la partida.",
coste = 20,
imagen = R.drawable.asi_exploradores_jabonera
),
ObjetoDeValor(
nombre = "Copa negra con inscripciones",
descripcion = "Objeto de gran valor. Se convierte en 20 monedas si consigues completar la partida.",
coste = 20,
imagen = R.drawable.asi_minijuego_3_copa_negra_brunida
),
ObjetoDeValor(
nombre = "Tapadera de cerámica zoomorfa",
descripcion = "Objeto de gran valor. Se convierte en 20 monedas si consigues completar la partida.",
coste = 20,
imagen = R.drawable.asi_minijuego_3_tapadera_zoomorfo
),
//******************************************
// E Q U I P A B L E S
//******************************************
ObjetoEquipable(
nombre = "Espada de Hierro",
descripcion = "Una espada de hierro sencilla y confiable perfecta para un aventurero novato. Otorga 1 de daño extra",
efecto = EfectoEquipableAumento(1, Atributo.Ataque),
imagen = R.drawable.asi_objeto_espadadefault
),
ObjetoEquipable(
nombre = "Casco Ceremonial",
descripcion = "Casco ceremonial de oro de los vacceos decorado con intrincados patrones que simboliza el estatus social. Aumenta tu vida máxima en 3 puntos",
efecto = EfectoEquipableAumento(3, Atributo.Vida),
imagen = R.drawable.asi_objeto_casco
),
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 5 puntos.",
efecto = EfectoEquipableAumento(5, Atributo.Vida),
imagen = R.drawable.asi_objeto_escudo
),
ObjetoEquipable(
nombre = "Puñal Vacceo",
descripcion = "Espada corta, típica de diseño celtibérico. Mientras está equipada añade la habilidad \"Letalidad\" para su uso en combate.",
efecto = EfectoEquipableHabilidad(
Habilidad(
"Letalidad",
"Aumenta la probabilidad de realizar un golpe crítico a un 30% por dos turnos",
EfectoBuffo(Atributo.Critico, 22, 2),
energia = 2
)
),
imagen = R.drawable.asi_objeto_daga
),
//**********************************************
// C O N S U M I B L E S
//**********************************************
ObjetoConsumible(
nombre = "Elixir Menor de la Necrópolis",
descripcion = "Un frasco pequeño con un líquido granate y brillante, que destella con un resplandor profundo, capaz de restaurar 3 puntos de vida al instante.",
......@@ -57,18 +68,60 @@ object RepositorioObjetos {
efecto = EfectoObjetoCura(999),
imagen = R.drawable.asi_objeto_pocima_vida_all
),
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.",
efecto = EfectoEquipableAumento(10, Atributo.Vida),
imagen = R.drawable.asi_objeto_escudo
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 = "Casco Ceremonial",
descripcion = "Casco ceremonial de oro de los vacceos decorado con intrincados patrones que simboliza el estatus social. Aumenta tu vida máxima en 8 puntos",
efecto = EfectoEquipableAumento(8, Atributo.Vida),
imagen = R.drawable.asi_objeto_casco
//**********************************
// D E V A L O R
//**********************************
ObjetoDeValor(
nombre = "Vasito de barro cocido",
descripcion = "Objeto de gran valor. Se convierte en 10 monedas si consigues completar la partida.",
coste = 10,
imagen = R.drawable.asi_exploradores_vasito
),
ObjetoDeValor(
nombre = "Jabonera de cerámica",
descripcion = "Objeto de gran valor. Se convierte en 15 monedas si consigues completar la partida.",
coste = 15,
imagen = R.drawable.asi_exploradores_jabonera
),
ObjetoDeValor(
nombre = "Copa negra con inscripciones",
descripcion = "Objeto de gran valor. Se convierte en 15 monedas si consigues completar la partida.",
coste = 15,
imagen = R.drawable.asi_minijuego_3_copa_negra_brunida
),
ObjetoDeValor(
nombre = "Tapadera de cerámica zoomorfa",
descripcion = "Objeto de gran valor. Se convierte en 30 monedas si consigues completar la partida.",
coste = 30,
imagen = R.drawable.asi_minijuego_3_tapadera_zoomorfo
),
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
),
ObjetoDeValor(
nombre= "Sonajero Redondo",
descripcion = "Pequeño artefacto de cerámica utilizado en rituales funerarios o ceremonias. Su diseño y sonido característico eran símbolos de protección y conexión espiritual en la cultura celtíbera.",
imagen = R.drawable.asi_minijuego_3_sonajero_redondo,
coste = 15
),
ObjetoDeValor(
nombre= "Piel del Gran Lobo",
descripcion = "Piel obtenida del lobo que representa parte de la mitología vaccea. Está valorado en 100 monedas",
imagen = R.drawable.asi_minijuego_3_sonajero_redondo,
coste = 100
),
//**********************************************
// D E U T I L I D A D
//**********************************************
ObjetoUtilidad(
nombre = "Pico Vacceo",
descripcion = "Un pico viejo y oscuro con dibujos extraños que parecen brillar cerca de las piedras, como si estuviera esperando que lo uses para algo importante.",
......@@ -78,6 +131,11 @@ object RepositorioObjetos {
nombre = "Ticket",
descripcion = "Representa una invitación a un evento relacionado con la cultura vaccea, como una feria arqueológica o un festival cultural",
imagen = R.drawable.asi_objeto_ticket
),
ObjetoUtilidad(
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
)
).associateBy { it.nombre }
}
......@@ -86,6 +144,27 @@ object RepositorioObjetos {
return objetos[nombre]
}
fun obtenerObjetoPorCoste(coste: Int): Objeto? {
val objetosFiltrados = objetos.values
.filterIsInstance<ObjetoDeValor>()
.filter { it.coste <= coste }
.groupBy { it.coste }
if (objetosFiltrados.isEmpty()){
return null
}
val costeMasCercano = objetosFiltrados.keys
.filter { it <= coste }
.maxOrNull()
val objetosConCosteMasCercano = objetosFiltrados[costeMasCercano] ?: return null
return objetosConCosteMasCercano.random()
}
fun obtenerObjetosAleatoriosTienda(cantidad: Int): ArrayList<String> {
val consumibles = objetos.values.filter { it is ObjetoConsumible || it is ObjetoUtilidad }
return ArrayList<String>().apply {
......
app/src/main/res/drawable-nodpi/asi_objeto_moneda.JPG

266 KiB

app/src/main/res/drawable-nodpi/asi_objeto_veneno2.png

24 KiB

app/src/main/res/drawable-nodpi/monster_wolf_attack_00.png

870 B

app/src/main/res/drawable-nodpi/monster_wolf_attack_01.png

885 B

app/src/main/res/drawable-nodpi/monster_wolf_attack_02.png

850 B

app/src/main/res/drawable-nodpi/monster_wolf_attack_03.png

855 B

app/src/main/res/drawable-nodpi/monster_wolf_attack_04.png

887 B

app/src/main/res/drawable-nodpi/monster_wolf_idle_00.png

862 B

app/src/main/res/drawable-nodpi/monster_wolf_idle_01.png

854 B

app/src/main/res/drawable-nodpi/monster_wolf_idle_02.png

884 B

app/src/main/res/drawable-nodpi/monster_wolf_idle_03.png

875 B

app/src/main/res/drawable-nodpi/monster_wolf_idle_04.png

865 B

app/src/main/res/drawable-nodpi/monster_wolf_idle_05.png

840 B