Dein Level bedeutet endlich etwas
Jeder Platz am Tisch verdient jetzt XP, der erste Levelaufstieg kostet 60 XP statt zwei Wochen Spielzeit, und Level bringen einen Rang und Sammelkarten.

Kurz gesagt
XP war eine Zahl, die nichts tat. Nichts im Spiel war je an dein Level geknüpft, und überhaupt verdiente nur der Sieger einer Partie welche – was bedeutete, dass rund zwei Drittel der Leute an jedem Tisch eine ganze Partie spielten, verloren, „Match-XP +0“ sahen und keinen Grund hatten zu glauben, dass die Zahl etwas mit ihnen zu tun hat.
Jetzt verdient jeder Platz. Deine Platzierung zahlt, die Monopole, die du beim Partieende hältst, zahlen, und das Ende zu erreichen, ohne rauszufliegen, zahlt. Gewinnen dominiert weiterhin – ein Sieg ist mehr als doppelt so viel wert wie das bestmögliche Verlustergebnis –, aber gut zu verlieren ist nicht mehr nichts wert.
| Was du getan hast | XP |
|---|---|
| Die Partie gewonnen | +200 |
| Zweiter Platz | +50 |
| Dritter Platz | +30 |
| Vierter Platz und darunter | +15 |
| Jedes am Ende gehaltene Monopol (bis zu 3) | +10 |
| Das Ende erreicht, ohne auszuscheiden | +20 |
Die Kurve wurde darum herum neu gebaut. Der erste Levelaufstieg kostet jetzt 60 XP, was eine anständige Partie schafft – selbst eine verlorene –, wo es vorher rund zehn Tage Spielzeit brauchte. Die Level danach werden allmählich teurer statt auf einen Schlag.
Und Level bringen jetzt zwei Dinge. Dein Level trägt einen Rang – 7 davon, vom Anwärter bis zum Meister –, der neben deinem Namen auf deinem Profil und in der Bestenliste steht. Und das Überschreiten eines Meilenstein-Levels lässt eine Grundstücks-Sammelkarte in deine Sammlung fallen: die Level 3, 5, 7, 10, 13, 16, 20 und danach jedes 5. Level.

Für technisch Neugierige
Die interessante Hälfte hiervon war das Löschen von Kopien. Die alte Regel – ein Level je 500 XP – war von Hand in fünf Datenbank-Migrationen und drei TypeScript-Dateien geschrieben worden, und sie waren bereits voneinander abgedriftet: Die Test-Fixtures setzten ein Level, das keine Fassung der Regel erzeugen konnte. Jetzt gibt es eine Kurve, in einer Datei, exakt in der Datenbank gespiegelt:
// 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 eachDie Arithmetik ist bewusst rein ganzzahlig – keine Quadratwurzeln, keine Gleitkommazahlen –, sodass SQL und TypeScript an jeder einzelnen Grenze übereinstimmen statt nur ungefähr, und ein Test, der gegen eine echte Datenbank läuft, vergleicht sie Wert für Wert. Beide Kurven sind steigend, es ist also niemand in der Bestenliste an jemandem vorbeigezogen, als die Neuberechnung lief.
Beim Bauen kamen drei Fehler zum Vorschein, die schon eine Weile live waren und die kein Test gefunden hatte: Die Level-Leiste auf dem Ergebnisbildschirm las die Partiebelohnung statt deines Gesamtstands, sodass jeder Spieler auf jedem Level dieselbe bei 40 % eingefrorene Leiste sah; ein Sieg in einer kurzen Partie wurde als Niederlage verbucht, sodass diese Siege nie eine Sieg-Mission weiterzählten; und im Team-Modus bekam der siegreiche Teamkamerad überhaupt nichts ausgezahlt und wurde als Niederlage protokolliert, weil einer der beiden Sieger nach Zeilennummer nicht auf dem ersten Platz stand. Alle drei sind behoben, und jeder hat einen Test, der ohne den Fix fehlschlägt.
