Bots, die nicht alle gleich reden
Jede Zeile, die die Stammgäste je gepostet hatten, war einer von sechs Sätzen. Jetzt sind es Hunderte, jeder schreibt in seinem eigenen Ton, und nichts wiederholt sich, solange es noch auf dem Bildschirm steht.

Kurz gesagt
Zwei Tage nachdem die Stammgäste in der Lobby aufgetaucht waren, war die Beschwerde offensichtlich, sobald man hinsah: Sie sagten alle dasselbe. Einer von ihnen postete an einem einzigen Abend „quick game anyone“, „lets play“, „quick game anyone“, „need one more“, „need one more“. Ein anderer sagte in neunzig Minuten dreimal „anyone up for a game“.
Die Datenbank war unmissverständlich: Jede Zeile, die je einer von ihnen gepostet hatte, war einer von sechs Sätzen. Im Spiel sah es genauso aus – ein Spitzname sagte neunmal „had to have it“. Und es gab ein drittes Anzeichen, das niemand gemeldet hatte: Alle zwölf schrieben in genau einem Ton – klein geschrieben, abgehackt, ohne Satzzeichen –, während die Menschen im selben Raum „Hi guys!“, „Someone wanne play?“ und „Let’s goooooooooo!“ tippten.
Jetzt hat jeder Stammgast eine eigene Stimme, abgeleitet daraus, wer er ist, statt jedes Mal zufällig gewählt. Über die ganze Runde hinweg heißt das:
- manche schreiben klein, andere in ordentlichen Sätzen – und dabei bleibt es;
- manche setzen viele Satzzeichen, manche gar keine;
- jeder hat zwei oder drei Emoji, die er tatsächlich benutzt, statt eines gemeinsamen Vorrats;
- manche dehnen Wörter, manche kürzen ab, manche vertippen sich gelegentlich;
- was sie sagen, passt zum Raum: Niemand fragt nach „noch einem“, wenn vier Plätze frei sind.
Sie schreiben überall ausschließlich auf Englisch, was derselben Entscheidung folgt wie das übrige Verhalten der Bots im Spiel.
Für technisch Neugierige
Der Textbestand ist nach Absicht geordnet – begrüßen, eine Partie suchen, noch einen brauchen, gerade beigetreten, den Modus kommentieren, warten, Geplänkel, anfeuern, Rückkampf –, und zwei dieser Absichten werden aus dem laufenden Raum befüllt, sodass der Satz nicht dem widersprechen kann, was der Spieler vor sich sieht.
Die Stimme eines Stammgastes wird aus seinem Spitznamen abgeleitet statt gespeichert, sie braucht also kein neues Feld am Persona-Typ und übersteht einen Prozessneustart unverändert:
// botChat.voice.ts — the voice is a pure function of the nickname
const rng = createRng(`voice:${persona.nickname}`);
return {
sentenceCase: rng.float() < 0.34,
punctuation: pick(rng, ['none', 'light', 'heavy']),
emoji: pickN(rng, EMOJI_POOL, rng.int(2, 3)), // habitual, not shared
elongation: rng.float() * 0.2,
typoRate: rng.float() * 0.06,
};Wiederholungen fängt ein kleines Gedächtnis ab, das sowohl an den Raum als auch an den Stammgast gebunden ist – dieselbe Zeile kann also nicht zurückkommen, solange sie noch auf dem Bildschirm steht, und zwei Stammgäste in einem Raum können einander nicht nachplappern.
Der interessante Fehler steckte in der Tippfehler-Umformung. Bot-Chat wird mit der Service-Rolle geschrieben, die am Schimpfwortfilter vorbeigeht, den menschliche Nachrichten durchlaufen – ein „realistischer“ Tippfehler konnte also ein gesperrtes Wort ergeben („and“ als „nad“ vertippt steht auf der Liste). Ein Test mit 2.600 Stichproben lief fröhlich durch; es brauchte rund 68.000 Ziehungen, bis es auftauchte. Der Test ist jetzt eine erschöpfende Aufzählung von rund 260.000 möglichen Zeichenketten, läuft in 1,4 Sekunden und ruft dieselben Generatoren auf wie die Chat-Schicht, statt sie nachzubauen – der erste Versuch baute sie nach und driftete sofort ab.
