Tu nivel por fin significa algo
Ahora cada asiento de la mesa gana XP, la primera subida de nivel cuesta 60 XP en vez de dos semanas de juego, y los niveles otorgan un rango y cartas coleccionables.

En palabras sencillas
La XP era un número que no hacía nada. Nada en el juego dependía de tu nivel y solo el ganador de una partida ganaba algo — lo que significaba que unas dos terceras partes de la gente de cada mesa jugaba una partida entera, perdía, veía "XP de la partida +0" y no tenía motivo para pensar que ese número fuera para ella.
Ahora gana cada asiento. Tu posición paga, los monopolios que tengas cuando acaba la partida pagan, y llegar al final sin quedar eliminado paga. Ganar sigue mandando — una victoria vale más del doble que el mejor resultado perdedor posible — pero perder bien ya no vale cero.
| Qué hiciste | XP |
|---|---|
| Ganaste la partida | +200 |
| Segundo puesto | +50 |
| Tercer puesto | +30 |
| Cuarto puesto o inferior | +15 |
| Cada monopolio en tu poder al final (hasta 3) | +10 |
| Llegaste al final sin ser eliminado | +20 |
La curva se rehízo alrededor de eso. La primera subida de nivel cuesta ahora 60 XP, que una partida decente cubre — incluso perdiéndola — cuando antes hacían falta unos diez días de juego. Los niveles siguientes encarecen poco a poco en lugar de todos de golpe.
Y los niveles ahora otorgan dos cosas. Tu nivel lleva un rango — 7 en total, de Clasificado a Maestro — que aparece junto a tu nombre en tu perfil y en la clasificación. Y cruzar un nivel hito suelta una carta de propiedad coleccionable en tu colección: los niveles 3, 5, 7, 10, 13, 16, 20 y, a partir de ahí, cada 5 niveles.

Para los más técnicos
La mitad interesante de esto fue borrar copias. La regla antigua — un nivel cada 500 XP — estaba escrita a mano en cinco migraciones de base de datos y tres archivos TypeScript, y ya se habían separado entre sí: los datos de prueba sembraban un nivel que ninguna versión de la regla podía producir. Ahora hay una curva, en un archivo, reflejada exactamente en la base de datos:
// packages/game-engine/src/progression.ts — one curve, mirrored exactly in SQL
step(L → L+1) = min(60 + 100·(L−1), 1500)
level 2 3 4 5 10 16 17+
xp 60 220 480 840 4,140 11,400 +1,500 eachLa aritmética es deliberadamente solo con enteros — sin raíces cuadradas y sin coma flotante — para que el SQL y el TypeScript coincidan en cada frontera exactamente y no de forma aproximada, y un test que corre contra una base de datos real los compara valor por valor. Ambas curvas son crecientes, así que nadie adelantó a nadie en la clasificación cuando se recalculó.
Construirlo destapó tres fallos que llevaban tiempo en producción y que ningún test había cazado: la barra de nivel de la pantalla de resultados leía la recompensa de la partida en vez de tu total, así que todos los jugadores de todos los niveles veían la misma barra congelada en el 40%; ganar una partida corta se registraba como derrota, de modo que esas victorias nunca avanzaban una misión de victoria; y en modo por equipos el compañero ganador no cobraba nada y quedaba anotado como derrotado, porque uno de los dos ganadores no estaba en primer puesto por número de fila. Los tres están arreglados y cada uno tiene un test que falla sin el arreglo.
