Proyectos

Murder Plot

Un juego de deducción para Android hecho 100 % en Jetpack Compose, sin motor de juegos. Lo diseñé y lo programé por mi cuenta, del generador de casos a los sonidos, y ya está publicado en Google Play.

Rol
Todo: diseño, código, arte, sonido y publicación
Tecnología
Kotlin y Jetpack Compose, sin motor de juegos
Estado
En Google Play desde el 30 de octubre de 2026
Idiomas
Español e inglés

Qué es

Murder Plot es un sudoku de asesinatos: ubicas a cada sospechoso en el plano siguiendo las pistas, nadie comparte fila ni columna, y la regla del caso delata al culpable. No usa motor de juegos: el tablero, las escenas, las animaciones y el sonido salen de las mismas herramientas que uso en cualquier app Android.

Más de 35.000 líneas de Kotlin entre la app y su módulo de puzzles, y 141 pruebas automatizadas.

Cómo se juega

Sin motor de juegos

Lo que normalmente resuelve un motor, aquí lo resuelven Compose y Kotlin.

  • Dibujo

    Las escenas de los expedientes son Canvas puro: unas 8.000 líneas de dibujo inmediato. La parte fija se graba una sola vez, la oscuridad se recorta con modos de fusión y no hay sprites ni shaders, así que funciona desde Android 8.

  • Física

    Las cortinas y las toallas son telas de Verlet, las lámparas se mecen como péndulos y las llamas de las velas se mueven con ruido. Con el dedo puedes empujar las cortinas o dejar ondas en el agua.

  • Tiempo y animación

    Un reloj de cuadros con withFrameNanos mueve las escenas. El tiempo se lee solo al dibujar, así que nada se recompone en cada cuadro. El resto son las animaciones de Compose: transiciones, resortes y estados animados.

  • Estado del juego

    Un ViewModel guarda el estado inmutable de la partida en un StateFlow. Cada jugada produce un estado nuevo, se puede deshacer hasta 50 pasos y la partida se guarda sola.

  • Sonido

    27 efectos sintetizados con un script propio en Python, sin muestras de terceros. Suenan con SoundPool y cambian un poco de tono para no repetirse.

  • Guardado

    DataStore en el teléfono y Juegos guardados de Play Juegos en la nube. Una copia con menos casos resueltos nunca reemplaza a otra más avanzada.

Cinco escenarios dibujados con código

Cada expediente es un camino ilustrado que se revela a medida que resuelves sus casos.

Casos con una sola solución

Los casos salen de un módulo en Kotlin puro, sin Android. Genera los 130 casos de los expedientes y sus temporadas, y los 365 diarios, y también corre en el teléfono para crear casos libres sin fin.

Por cada caso se generan seis candidatos y se elige el que mejor se ajusta a la dificultad buscada.

  1. HabitacionesCrecen al azar hasta llenar el plano.
  2. SospechososUno por fila y por columna, y la regla del caso apunta a uno solo.
  3. PistasHechos verdaderos elegidos al azar mientras ayuden a deducir, para que se combinen entre sí.
  4. LimpiezaSe quitan las pistas que sobran.
  5. VerificaciónUn solver exige una única solución, y que se llegue a ella solo deduciendo.

Decisiones

  1. Anuncios que respetan la partida

    Un anuncio nunca interrumpe un caso. Los recompensados los pide el jugador, para salvar la racha, ganar una lupa extra o duplicar monedas. El único que aparece solo sale al volver de una revelación, como mucho uno cada dos casos, nunca en los primeros días y nunca con el pase.

  2. Se aprende jugando

    La primera partida es un caso de 4×4 escrito a mano que se juega en el tablero real, paso a paso, en vez de una pantalla de instrucciones. Se puede repetir desde Ajustes.

  3. Nunca pistas ilimitadas

    Un botón que resuelve el caso vacía el juego. La lupa señala a quien está mal ubicado o te dice a quién puedes deducir ahora y con qué pista, y tiene un límite por caso.

  4. Se paga por un mundo nuevo

    El pase quita los anuncios y desbloquea el Teatro Imperial, un caso semanal de 7×7 y más casos difíciles. No da ventaja: en la tabla semanal no suma puntos extra.

  5. El mismo caso para todos

    El día del juego cambia a medianoche UTC-7, como las tablas diarias de Play Juegos, para que todos jueguen el mismo caso del día a la vez. Hay 365 casos diarios: fáciles el lunes y de 7×7 el domingo.

  6. El español es la llave

    Cada texto se escribe en español y esa frase es la llave de su traducción. Las pistas se guardan como hechos y no como frases, y se reescriben en inglés al cargar. Una prueba falla si falta o sobra una traducción.

  7. Play Juegos es opcional

    El juego no pide un perfil al abrirlo y sin sesión todo funciona igual. Si te conectas, el progreso se respalda en la nube y una copia nunca reemplaza a otra con más casos resueltos.

Con qué está hecha

Juego
Kotlin, Jetpack Compose, Canvas, Navigation Compose, ViewModel y StateFlow
Datos
DataStore, kotlinx.serialization, WorkManager para el recordatorio diario y Firebase Analytics con consentimiento
Google Play
AdMob con UMP, Play Billing para el pase y las gemas, y Play Juegos: logros, tabla semanal y juegos guardados
Herramientas
Un módulo de puzzles en Kotlin puro, 83 pruebas, sonidos sintetizados en Python y capturas de tienda automatizadas con adb

Ver los demás proyectos

Contacto

Para conversar sobre un proyecto, una oportunidad o algo que viste aquí.