Không còn ai phải chờ một mình: gặp gỡ những gương mặt quen
Mở một phòng trước đây đồng nghĩa với ngồi chờ một mình cho đến khi bỏ cuộc. Giờ đây mười hai gương mặt quen với tên thật, tính cách cố định và nhịp độ rất người sẽ lấp đầy các ghế trống.

Nói đơn giản
Cho đến bản cập nhật này, chẳng có ai vào phòng do bạn tạo. Bạn chọn chế độ, mở một bàn rồi chờ — và phần lớn là chờ một mình. Số liệu sáu tuần trước khi bản này lên rất rõ ràng:
| Điều chúng tôi đo | Kết quả |
|---|---|
| Phòng do người chơi mở nhưng chưa bao giờ bắt đầu | 38 |
| Thời gian chờ trung bình trước khi bỏ cuộc | ~3,2 giờ |
| Một phòng đã đủ 4/4 mà vẫn không bắt đầu | chờ 2 ngày |
| Ván đã kết thúc có hơn một người thật | 46 trên 231 |
Giờ bàn tự lấp đầy. Trong khoảng hai mươi giây đến bốn phút sau khi bạn mở phòng, sẽ có người ngồi xuống. Một tá gương mặt quen luân phiên xuất hiện trong sảnh — biệt danh bình thường, không phải RoboBaron — và mỗi người vẫn là chính họ mỗi lần bạn gặp lại:
- tính cách cố định: cùng một đối thủ luôn chơi thận trọng, hoặc luôn trả giá quá cao;
- ngày tham gia và cấp độ kinh nghiệm không phải mới bịa ra sáng nay;
- nhịp riêng — họ suy nghĩ từ một đến sáu giây, chứ không đúng hai giây như máy đếm nhịp;
- thi thoảng một câu ngắn trong khung chat thay vì một nhãn dán;
- không còn nhãn "bot" trong phòng chờ, vì ở bàn chơi họ hành xử như người chơi.
Họ cũng xuất hiện trên bảng xếp hạng — đó là cách trung thực nếu họ thật sự chơi các ván đấu thật — nhưng có trần thưởng mỗi ngày rất chặt, nên họ thăng hạng như một người chơi bình thường chứ không cày bảng.
Cho người thích chi tiết kỹ thuật
Mười hai nhân vật được tạo theo cách bất biến khi tiến trình máy chủ trò chơi khởi động, và được đánh dấu bằng một giá trị mà bảng hồ sơ vốn đã hỗ trợ — nhờ vậy toàn bộ tính năng ra mắt mà không cần bất kỳ lần migrate cơ sở dữ liệu nào và không đổi một luật chơi nào.
Việc lấp ghế là một nhịp của bộ lập lịch, không phải một bộ hẹn giờ cho mỗi phòng. Mọi độ trễ đều sinh ra từ một bộ ngẫu nhiên có hạt giống theo phòng và theo ghế, đồng thời neo vào một mốc thời gian lưu trong cơ sở dữ liệu, nên khởi động lại tiến trình sẽ tiếp tục đúng lịch cũ thay vì bốc lại độ trễ mới:
// 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;| Tham số | Giá trị |
|---|---|
| Độ trễ lấp một ghế | 20 giây – 4 phút, có hạt giống theo ghế |
| Ghế cuối cùng | 3 – 8 phút |
| Tự khởi động khi bàn đã đủ và im ắng | 3 phút |
| Thời gian suy nghĩ của bot | 1 – 6 giây, co giãn theo nhân vật |
| XP của nhân vật | nhiều nhất một phần thưởng mỗi ngày UTC |
Ba lỗi chỉ lộ ra khi hệ thống thật sự chạy, và không một bài kiểm thử đơn vị nào bắt được: các phòng đã đầy lại bị loại khỏi truy vấn ứng viên của bộ lấp ghế, nên cơ chế tự khởi động không bao giờ nhìn thấy đúng tình huống mà nó sinh ra để xử lý; cổng chờ suy nghĩ được đánh khóa theo ván chứ không theo bot, nên một quãng dừng trong lượt cũng chặn luôn lượt trả giá của chính bot đó cho tới khi nó bị tự động bỏ qua khỏi cửa sổ của mình; và một ván do tiến trình máy chủ khởi động lại không đánh thức các bộ lập lịch khỏi trạng thái chờ, khiến khoảng cách từ lúc bắt đầu tới cú đổ xúc xắc đầu tiên của bot là 11,6 giây thay vì 49 mili-giây.
