Plus personne n’attend seul : voici les habitués
Ouvrir un salon revenait à attendre seul jusqu’à abandonner. Douze habitués, avec de vrais noms, un caractère fixe et un rythme humain, remplissent désormais les places libres.

En clair
Jusqu’à cette mise à jour, rien ne rejoignait jamais un salon que vous aviez créé. Vous choisissiez un mode, ouvriez une table et attendiez — le plus souvent seul. Les chiffres des six semaines précédentes sont sans appel :
| Ce que nous avons mesuré | Résultat |
|---|---|
| Salons ouverts par un joueur et jamais lancés | 38 |
| Attente moyenne avant d’abandonner | ~3,2 heures |
| Un salon complet à 4/4 qui n’a quand même jamais démarré | a attendu 2 jours |
| Parties terminées avec plus d’un humain | 46 sur 231 |
La table se remplit maintenant toute seule. Entre vingt secondes et quatre minutes après l’ouverture du salon, quelqu’un s’assoit. Une douzaine d’habitués tournent dans le hall — des pseudonymes ordinaires, pas des RoboBaron — et chacun reste le même joueur d’une rencontre à l’autre :
- un caractère fixe : le même adversaire joue toujours prudemment, ou surenchérit toujours ;
- une date d’inscription et un niveau d’expérience qui n’ont pas été inventés ce matin ;
- un rythme propre : ils réfléchissent une à six secondes, et non deux, au métronome ;
- de temps en temps une phrase courte dans le chat plutôt qu’un sticker ;
- aucun badge « bot » dans le salon d’attente, parce qu’à la table ils se comportent comme des joueurs.
Ils apparaissent aussi au classement, ce qui est la solution honnête dès lors qu’ils disputent de vraies parties — mais avec un plafond quotidien strict sur ce qu’ils peuvent gagner : ils progressent comme un joueur ordinaire plutôt qu’en farmant le tableau.
Pour les curieux techniques
Les douze personnages sont créés de façon idempotente au démarrage du démon de jeu et marqués avec une valeur que la table des profils acceptait déjà — la fonctionnalité entière est donc arrivée sans aucune migration de base de données et sans toucher à la moindre règle du jeu.
Le remplissage est un tick du planificateur, pas un minuteur par salon. Chaque délai découle d’un aléatoire à graine indexé sur le salon et la place, et il est ancré sur un horodatage stocké en base : un redémarrage reprend donc exactement le même calendrier au lieu de retirer de nouveaux délais.
// scheduler.ts — seeded per (room, seat), anchored on a DB timestamp
const rng = createRng(`${game.id}:fill:${seat}`);
const isLastSeat = freeSeats === 1;
const delayMs = isLastSeat
? rng.int(LAST_SEAT_MIN_MS, LAST_SEAT_MAX_MS) // 3-8 min: leave room for a human
: rng.int(SEAT_MIN_MS, SEAT_MAX_MS); // 20 s - 4 min
if (Date.now() - Date.parse(game.created_at) < delayMs) continue;| Réglage | Valeur |
|---|---|
| Délai de remplissage d’une place | 20 s – 4 min, à graine par place |
| Dernière place | 3 – 8 min |
| Démarrage automatique table pleine et silencieuse | 3 min |
| Temps de réflexion des bots | 1 – 6 s, modulé par personnage |
| XP des personnages | au plus une récompense par jour UTC |
Trois défauts ne sont apparus qu’une fois le système en fonctionnement, et aucun test unitaire n’en aurait attrapé un seul : les salons complets étaient exclus de la requête de candidats du remplissage, si bien que le démarrage automatique ne voyait jamais précisément le cas pour lequel il existe ; l’attente de réflexion était indexée par partie et non par bot, de sorte qu’une pause sur un tour bloquait aussi l’enchère de ce même bot jusqu’à ce qu’il soit automatiquement passé hors de sa propre fenêtre ; et une partie lancée par le démon ne réveillait pas les planificateurs de leur mise en veille, ce qui laissait 11,6 secondes entre le départ et le premier lancer d’un bot au lieu de 49 millisecondes.
