Das Spielprotokoll erzählt nicht mehr alles
Ein einziger Würfelwurf druckte früher fünf Zeilen, zwei davon nannten dasselbe Feld. Der Verlauf liest sich jetzt wie ein Kommentar statt wie ein Wortprotokoll – und gelöscht wurde dafür nichts.
Kurz gesagt
Die Leiste neben dem Brett schrieb jede einzelne Sache mit, die das Spiel tat. Ein gewöhnlicher Wurf erzeugte fünf getrennte Zeilen – gewürfelt, bewegt, gelandet, Zug beendet und oft noch eine –, von denen zwei dasselbe Feld nannten. Multipliziere das mit vier Spielern und dreißig Runden, und der Verlauf wurde zu einer Wand, die du nicht mehr gelesen hast. Schade, denn die zwei oder drei Zeilen, auf die es wirklich ankam, standen irgendwo darin.
Jetzt sind ein Wurf und alles, was er ausgelöst hat, eine Zeile. Landen, einen Zug beenden, eine Schuld ankündigen, bevor sie beglichen wird, einen Kauf ablehnen, bevor die Auktion beginnt – nichts davon wird noch ausgesprochen, weil das Brett oder die nächste Zeile es ohnehin sagt. Eine Reihe von Bauten auf einem Feld fällt zu einer einzigen Zeile zusammen, eine Auktion ohne Gegengebot nennt denselben Betrag nicht mehr zweimal, und im Speed-Modus meldet sich der Hypotheken-Countdown erst, wenn nur noch zwei Runden zum Handeln bleiben.
Auch deine Chatnachrichten werden nicht länger vom Bildschirm geschoben. Die Leiste hielt früher ein einziges Verlaufsfenster für alles, sodass ein reges Brett stillschweigend verdrängen konnte, was ein Mensch getippt hatte. Aktivität und Chat werden jetzt getrennt gehalten, und keine Menge Würfel kann eine Nachricht begraben, die tatsächlich jemand geschrieben hat.
Für technisch Neugierige
An der Quelle zu filtern kam nie infrage. Eine Partie wiederzugeben heißt, das vollständige Ereignisprotokoll zurück in einen Zustand zu falten – so funktionieren ein Seiten-Reload, ein Zuschauer, die Wiederholungsansicht und der Clip-Renderer allesamt. Lässt du ein Ereignis weg, um den Verlauf hübscher zu machen, beschädigst du jeden einzelnen davon. Also bleibt das Protokoll vollständig, und das Verdichten ist ausschließlich eine Sache des Renderns, in einem gemeinsamen Builder, den das Live-Brett, die Zuschaueransicht, Wiederholungen, die Clips und der Offline-Build gleichermaßen benutzen.
Was ein Ereignis mit dem Verlauf macht, ist ein erschöpfender Switch über die Ereignisarten der Engine – eine neue Art lässt sich also nicht kompilieren, bis jemand entschieden hat, wie sie sich lesen soll:
// lib/game/feedDigest.ts — an exhaustive switch over every engine event
case 'dice_rolled':
return 'move'; // the roll opens a line
case 'moved':
case 'passed_start':
case 'jail_attempt_failed':
return 'absorb'; // …and what it caused folds into that line
case 'landed': // names the cell 'moved' just named
case 'turn_ended': // the board already shows whose turn it is (14% of events)
case 'payment_due': // the intent; 'debt_paid' is the settlement, with the amount
case 'buy_declined': // always followed by 'auction_started', which says it better
case 'auction_passed':// carries no information, and outnumbers real bids 2:1
return 'hidden';Zwei Fehler kamen dabei zum Vorschein, die kein Test gefunden hätte, weil es bei beiden darum ging, wie sich die Ausgabe liest, und nicht darum, was sie enthält. Eine Auktion ohne Gegengebot nannte denselben Betrag zweimal – „P1 bot 2600k“, dann „P1 hat es für 2600k bekommen“ –, das Schlussgebot wird jetzt also verschluckt, und nur dieses eine, sodass sich ein echter Bieterkampf weiterhin wie ein Wettstreit liest. Und ein Ereignis mitten in einem Wurf beendete jede Bewegungszeile zu früh, bis dem Builder beigebracht wurde, darüber hinwegzugehen.
