Saltar al contenido principal
ArceApps Logo ArceApps
code Bitácora

2025 W52: Limpieza de Casa y Cimientos Sólidos

calendar_today
Portada de 2025 W52: Limpieza de Casa y Cimientos Sólidos

A medida que el 2025 llega a su fin, en ArceApps decidimos que la mejor forma de recibir el año nuevo no era añadiendo más características frenéticamente, sino asegurándonos de que nuestra casa estuviera en orden. Esta semana, la penúltima del año, nos arremangamos para pagar una deuda técnica que nos venía persiguiendo: la inconsistencia en cómo nuestros 10 juegos manejaban sus estados internos.

Es ese tipo de trabajo que no siempre brilla en las capturas de pantalla, pero que hace que el motor ruja con mucha más suavidad.

🏗️ La Gran Unificación: BaseGameState

Durante meses, cada juego en PuzzleSuite había crecido de forma orgánica. Minesweeper tenía difficulty, Kakuro tenía gameCompleted, y Hashi contaba su tiempo en secondsPlayed. Todo funcionaba, pero mantener 10 “sabores” distintos de lógica de estado era una pesadilla cognitiva.

Esta semana, dimos un golpe en la mesa (metafóricamente) e introdujimos BaseGameState.

No fue una tarea pequeña. Tocamos el corazón de cada uno de los 10 juegos para alinearlos bajo una interfaz común:

interface BaseGameState {
    val isPaused: Boolean
    val isCompleted: Boolean
    val currentTime: Long
    val hintsUsed: Int
    // ...
}

El resultado fue increíblemente satisfactorio:

  • ~300 líneas de código eliminadas: Adiós a propiedades duplicadas y lógica redundante.
  • Consistencia total: Ahora, si queremos crear un componente genérico (como un diálogo de “Juego Terminado”), podemos hacerlo una vez y funcionará para todos los juegos.
  • Cero regresiones: A pesar de tocar archivos críticos en todos los módulos, la migración fue quirúrgica y el proyecto compila felizmente.

🎨 Hashi: Un Poco de Color en la Lógica

No todo fue código invisible. Mientras revisábamos Hashi, nos dimos cuenta de que distinguir entre una isla “completa” y una “incompleta” requería demasiado esfuerzo visual. Los colores eran demasiado similares.

Decidimos darle un repaso a la paleta:

  • Islas Completas: Ahora brillan con un Turquesa Intenso (cyan500). Es imposible no verlas.
  • Islas Incompletas: Se mantienen en un Verde Vibrante, invitando a ser conectadas.
  • Puentes: Ajustamos los tonos a verdes armoniosos que combinan mejor con el resto del tablero.

El cambio es sutil per se nota; el juego se siente más receptivo y menos cansado para la vista.

🌐 Hablando tu Idioma

También aprovechamos esta semana para pulir la internacionalización. Las pantallas de estadísticas de Minesweeper y Kakuro, que tenían algunos textos “quemados” en español o inglés, ahora son ciudadanos de primera clase en nuestro sistema de localización.

Lo más interesante fue descubrir (y eliminar) una duplicación absurda de definiciones de dificultad (Easy, Medium…) que vivían triplicadas en nuestros archivos de recursos. Ahora tenemos una única fuente de verdad para estos términos en toda la app.

🔚 Preparando el Cierre

Con la arquitectura más limpia que nunca y la UI de Hashi pulida, nos sentimos listos para la última semana del año. Sabemos que queda una pieza del rompecabezas pendiente: niveles de dificultad más desafiantes para nuestros usuarios más exigentes.

Pero eso… eso es historia para la próxima semana.

Nos vemos en el cierre de año. 👋