Votre niveau veut enfin dire quelque chose
Chaque place à la table gagne désormais de l’XP, le premier passage de niveau coûte 60 XP au lieu de deux semaines de jeu, et les niveaux accordent un rang et des cartes à collectionner.

En clair
L’XP était un nombre qui ne faisait rien. Rien dans le jeu ne dépendait de votre niveau, et seul le vainqueur d’une partie en gagnait — ce qui voulait dire qu’environ deux tiers des personnes autour de chaque table jouaient une partie entière, perdaient, voyaient « XP de la partie +0 » et n’avaient aucune raison de penser que ce nombre les concernait.
Maintenant, chaque place rapporte. Votre classement rapporte, les monopoles que vous détenez à la fin rapportent, et atteindre la fin sans être éliminé rapporte. La victoire domine toujours — elle vaut plus du double du meilleur résultat perdant possible — mais bien perdre ne vaut plus zéro.
| Ce que vous avez fait | XP |
|---|---|
| Gagné la partie | +200 |
| Deuxième place | +50 |
| Troisième place | +30 |
| Quatrième place et au-delà | +15 |
| Chaque monopole détenu à la fin (jusqu’à 3) | +10 |
| Atteint la fin sans être éliminé | +20 |
La courbe a été refaite autour de cela. Le premier passage de niveau coûte désormais 60 XP, qu’une partie correcte suffit à couvrir — même perdue — alors qu’il fallait auparavant une dizaine de jours de jeu. Les niveaux suivants deviennent plus chers progressivement plutôt que d’un coup.
Et les niveaux accordent maintenant deux choses. Votre niveau porte un rang — 7 en tout, de Qualifié à Maître — affiché à côté de votre nom sur votre profil et dans le classement. Et franchir un niveau-jalon fait tomber une carte de propriété à collectionner dans votre collection : les niveaux 3, 5, 7, 10, 13, 16, 20, puis tous les 5 niveaux ensuite.

Pour les curieux techniques
La moitié intéressante de ce travail a été de supprimer des copies. L’ancienne règle — un niveau tous les 500 XP — était écrite à la main dans cinq migrations de base de données et trois fichiers TypeScript, et elles avaient déjà divergé : les données de test semaient un niveau qu’aucune version de la règle ne pouvait produire. Il n’y a désormais qu’une courbe, dans un seul fichier, reproduite à l’identique dans la base :
// 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 eachL’arithmétique est volontairement entière — pas de racine carrée, pas de virgule flottante — pour que le SQL et le TypeScript concordent exactement à chaque frontière et non approximativement, et un test tournant sur une vraie base les compare valeur par valeur. Les deux courbes sont croissantes, donc personne n’a doublé personne au classement lors du recalcul.
La construction a mis au jour trois bugs en production depuis un moment, qu’aucun test n’avait attrapés : la barre de niveau de l’écran de résultat lisait la récompense de la partie au lieu de votre total, si bien que tous les joueurs à tous les niveaux voyaient la même barre figée à 40 % ; gagner une partie courte était enregistré comme une défaite, donc ces victoires ne faisaient jamais avancer une mission de victoire ; et en mode équipe, le coéquipier vainqueur ne touchait rien et était noté perdant, parce que l’un des deux gagnants n’était pas premier selon le numéro de ligne. Les trois sont corrigés, et chacun a un test qui échoue sans le correctif.
