Seu nível finalmente significa alguma coisa
Agora todo assento da mesa ganha XP, a primeira subida de nível custa 60 XP em vez de duas semanas de jogo, e os níveis dão uma patente e cartas colecionáveis.

Em palavras simples
O XP era um número que não fazia nada. Nada no jogo dependia do seu nível e só quem vencia a partida ganhava algo — o que significava que cerca de dois terços das pessoas em cada mesa jogavam uma partida inteira, perdiam, viam "XP da partida +0" e não tinham motivo para achar que aquele número fosse para elas.
Agora todo assento ganha. A sua colocação paga, os monopólios que você tem quando a partida acaba pagam, e chegar ao fim sem ser eliminado paga. Vencer continua dominando — uma vitória vale mais que o dobro do melhor resultado possível de quem perde — mas perder bem já não vale zero.
| O que você fez | XP |
|---|---|
| Venceu a partida | +200 |
| Segundo lugar | +50 |
| Terceiro lugar | +30 |
| Quarto lugar ou abaixo | +15 |
| Cada monopólio em mãos no fim (até 3) | +10 |
| Chegou ao fim sem ser eliminado | +20 |
A curva foi refeita em torno disso. A primeira subida de nível custa agora 60 XP, que uma partida decente cobre — mesmo perdida — enquanto antes exigia cerca de dez dias de jogo. Os níveis seguintes ficam mais caros aos poucos, e não de uma vez.
E os níveis agora dão duas coisas. Seu nível carrega uma patente — 7 ao todo, de Classificado a Mestre — mostrada ao lado do seu nome no perfil e no ranking. E cruzar um nível marcante solta uma carta de propriedade colecionável na sua coleção: os níveis 3, 5, 7, 10, 13, 16, 20 e, depois disso, a cada 5 níveis.

Para os mais técnicos
A metade interessante disso foi apagar cópias. A regra antiga — um nível a cada 500 XP — estava escrita à mão em cinco migrações de banco de dados e três arquivos TypeScript, e elas já tinham divergido entre si: os dados de teste semeavam um nível que nenhuma versão da regra conseguia produzir. Agora há uma curva, num arquivo, espelhada exatamente no banco:
// 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 eachA aritmética é deliberadamente só com inteiros — sem raiz quadrada e sem ponto flutuante — para que o SQL e o TypeScript concordem em cada fronteira de forma exata e não aproximada, e um teste que roda contra um banco real compara os dois valor a valor. As duas curvas são crescentes, então ninguém ultrapassou ninguém no ranking quando o recálculo rodou.
Construir isso revelou três bugs que estavam no ar havia um tempo e que nenhum teste tinha pegado: a barra de nível da tela de resultado lia a recompensa da partida em vez do seu total, então todo jogador em todo nível via a mesma barra congelada em 40%; vencer uma partida curta era registrado como derrota, de modo que essas vitórias nunca avançavam uma missão de vitória; e no modo por equipes o companheiro vencedor não recebia nada e era anotado como derrotado, porque um dos dois vencedores não estava em primeiro pelo número da linha. Os três estão corrigidos, e cada um tem um teste que falha sem a correção.
