Bots que no hablan todos igual
Todas las frases que habían escrito los habituales eran una de seis. Ahora hay cientos, cada personaje escribe en su propio registro y nada se repite mientras sigue en pantalla.

En palabras sencillas
Dos días después de que los habituales llegaran al vestíbulo, la queja saltaba a la vista: todos decían lo mismo. Uno escribió "quick game anyone", "lets play", "quick game anyone", "need one more", "need one more" en una sola tarde. Otro dijo "anyone up for a game" tres veces en noventa minutos.
La base de datos fue tajante: cada frase que cualquiera de ellos había escrito era una de seis. Dentro de la partida ocurría lo mismo: un apodo dijo "had to have it" nueve veces. Y había una tercera señal que nadie había mencionado: los doce escribían exactamente en el mismo registro (minúsculas, frases cortadas, sin puntuación) mientras los humanos de esa misma sala tecleaban "Hi guys!", "Someone wanne play?" y "Let’s goooooooooo!".
Ahora cada habitual tiene una voz propia, derivada de quién es y no elegida al azar cada vez. En el conjunto eso significa:
- unos escriben en minúsculas y otros con frases bien formadas, y no cambian;
- unos puntúan mucho y otros nunca;
- cada uno tiene dos o tres emojis que de verdad usa, en vez de un repertorio común;
- unos alargan palabras, otros abrevian y algunos cometen alguna errata;
- y lo que dicen encaja con la sala: nadie pide "uno más" con cuatro asientos libres.
Escriben únicamente en inglés, en todas partes, siguiendo la misma decisión que rige el resto del comportamiento de los bots.
Para los más técnicos
El corpus está organizado por intención —saludar, buscar partida, pedir uno más, acabar de entrar, comentar el modo, esperar, bromear, animar, pedir revancha— y dos de esas intenciones se rellenan con datos de la sala en vivo, así que la frase no puede contradecir lo que el jugador está viendo.
La voz de un personaje se deriva de su apodo en lugar de almacenarse, de modo que no necesita ningún campo nuevo y sobrevive intacta al reinicio del proceso:
// 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,
};La repetición se controla con una pequeña memoria acotada a la vez por sala y por personaje, de modo que la misma frase no puede volver mientras siga en pantalla y dos personajes de una misma sala no pueden repetirse el uno al otro.
El fallo interesante estaba en la transformación que introduce erratas. El chat de los bots se escribe con el rol de servicio, que pasa por alto el filtro de palabrotas por el que sí pasan los mensajes humanos, así que una errata "realista" podía escribir una palabra bloqueada ("and" mal tecleado como "nad" está en la lista). Una prueba con 2.600 muestras pasó sin problemas; hicieron falta unas 68.000 tiradas para que aflorara. Ahora la prueba enumera de forma exhaustiva unas 260.000 cadenas posibles en 1,4 segundos y llama a los mismos generadores que usa la capa de chat, en vez de reimplementarlos: el primer intento los reimplementó y se desvió de inmediato.
