gioser

sergio/humanoid

HTML 13TOML 10 Definiciones

Matiz: tablero a ratio de pantalla + progresión hasta 13×13

El tablero deja de forzarse cuadrado y llena el área disponible con el
ratio de la pantalla, así las baldosas heredan la forma del display en
todos los niveles. La progresión de formas escala ahora hasta 13×13,
repartida proporcionalmente por los 48 niveles base.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

b3044bd182ebdbc341a6ecd742e4195f3be9b2cf · por sergio · (hace 4 meses) · padre dcab57543 · ver el árbol en este commit

Delta semántico

Ninguna definición cambió: el cambio es de texto, documentación o datos.

2 archivos · +21 −14

diff --git a/matiz/src/main/java/com/rizoma/matiz/game/Level.kt b/matiz/src/main/java/com/rizoma/matiz/game/Level.kt
index a4793c2..cd52b57 100644
--- a/matiz/src/main/java/com/rizoma/matiz/game/Level.kt
+++ b/matiz/src/main/java/com/rizoma/matiz/game/Level.kt
@@ -45,10 +45,13 @@ class Puzzle(
 
 /** Generación determinista de niveles a partir del número de nivel (= seed). */
 object Levels {
-    // Forma de la rejilla por nivel (cols × rows), creciendo poco a poco.
+    // Forma de la rejilla (cols × rows), de la más fácil a la maestra. La
+    // progresión termina en 13×13: el tablero llena la pantalla, así que las
+    // baldosas no son cuadradas sino que heredan el ratio del display.
     private val SHAPES = listOf(
-        3 to 3, 3 to 4, 4 to 4, 4 to 5, 4 to 6,
-        5 to 6, 5 to 7, 5 to 8, 6 to 7, 6 to 8,
+        3 to 3, 3 to 4, 4 to 4, 4 to 5, 5 to 5,
+        5 to 6, 6 to 6, 6 to 7, 7 to 8, 8 to 9,
+        9 to 10, 10 to 11, 11 to 12, 12 to 13, 13 to 13,
     )
 
     private const val BASE = 0x5249_5A4F_4D41_0001L // "RIZOMA"
@@ -73,8 +76,17 @@ object Levels {
     /** Seed estable para un nivel: mismo id → mismo puzzle en todas partes. */
     fun seedFor(level: Int): Long = BASE xor (level.toLong() * -0x61c8864680b583ebL)
 
-    private fun shapeFor(level: Int): Pair<Int, Int> =
-        SHAPES[(level - 1).coerceIn(0, SHAPES.lastIndex)]
+    // Mayor nivel base: el tope de la última dificultad. La forma escala
+    // proporcionalmente de 1 (3×3) a este nivel (13×13), repartiendo las
+    // [SHAPES] por todo el rango en vez de agotarlas en los primeros niveles.
+    private val MAX_BASE_LEVEL = TIER_RANGES.last().last
+
+    private fun shapeFor(level: Int): Pair<Int, Int> {
+        val span = (MAX_BASE_LEVEL - 1).coerceAtLeast(1)
+        val frac = (level - 1).coerceIn(0, span).toDouble() / span
+        val idx = Math.round(frac * SHAPES.lastIndex).toInt().coerceIn(0, SHAPES.lastIndex)
+        return SHAPES[idx]
+    }
 
     /** Proporción de celdas fijas (además de las esquinas); decrece con el nivel. */
     private fun ratioFor(level: Int): Double = when {
diff --git a/matiz/src/main/java/com/rizoma/matiz/ui/MatizApp.kt b/matiz/src/main/java/com/rizoma/matiz/ui/MatizApp.kt
index 5621dd8..c876ae8 100644
--- a/matiz/src/main/java/com/rizoma/matiz/ui/MatizApp.kt
+++ b/matiz/src/main/java/com/rizoma/matiz/ui/MatizApp.kt
@@ -13,7 +13,6 @@ import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.Spacer
-import androidx.compose.foundation.layout.aspectRatio
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.height
@@ -53,8 +52,6 @@ fun MatizApp(vm: MatizViewModel = viewModel()) {
 private fun JuegoScreen(vm: MatizViewModel) {
     BackHandler(enabled = true) { vm.volverAlMapa() }
 
-    val ratio = vm.puzzle.cols.toFloat() / vm.puzzle.rows
-
     Box(
         Modifier
             .fillMaxSize()
@@ -67,12 +64,10 @@ private fun JuegoScreen(vm: MatizViewModel) {
                 Modifier.fillMaxWidth().weight(1f),
                 contentAlignment = Alignment.Center,
             ) {
-                Board(
-                    vm,
-                    Modifier
-                        .fillMaxSize()
-                        .aspectRatio(ratio, matchHeightConstraintsFirst = ratio < 1f),
-                )
+                // El tablero llena el área disponible (con el ratio de la
+                // pantalla) en vez de encajarse en un cuadrado: así las baldosas
+                // mantienen la forma de la pantalla y un 13×13 cabe entero.
+                Board(vm, Modifier.fillMaxSize())
             }
             Controls(vm)
         }