Снова за стол — одним касанием
Экран результата теперь может тут же начать такую же партию, а «Быстрая игра» отправляет вас в комнату, которая уже наполняется, вместо того чтобы открывать рядом ещё одну пустую.

Простыми словами
Лучший момент начать партию — та секунда, когда закончилась предыдущая. Доказательство было у нас на руках, и мы его тратили впустую: из тех, кто возвращался за второй партией, больше половины начинали её в течение двух минут после конца первой, — а всё, что мы предлагали в этот момент, была ссылка в лобби, где нужно выбрать режим, выбрать число мест, создать комнату и ждать.
Теперь на экране результата есть кнопка «Играть снова». Одно касание — и вы в новой партии: тот же режим, то же число мест, пустые места уже заняты, игра уже идёт. Никакого лобби и ничего настраивать.

«Быстрая игра» — вторая половина той же задачи, уже в лобби. Раньше это была кнопка, которая ничего не делала. Теперь она отправляет вас в лучшую открытую комнату выбранного режима: сперва в ту, которую создал живой человек, затем в ту, что ближе всего к старту, и наконец в ту, что ждёт дольше всех. И только если присоединяться действительно не к чему, она открывает комнату для вас.
Для тех, кому интересны детали
Реванш не добавляет на сервере ни одной новой точки входа. Он делает ровно то, что игрок делает руками, — создаёт комнату, посаживает ботов по одному (вызов занимает следующее свободное место, поэтому параллельные вызовы боролись бы за одно и то же), затем запускает партию, — и каждый шаг выполняется с правами самого игрока, так что здесь действуют все те же правила, что и для комнаты, созданной вручную.
Это важно из-за того, кто нажимает кнопку. Девять из десяти уходов из первой партии — сдача, а не банкротство, поэтому обычный случай — игрок покидает партию, которая для остальных ещё идёт. Работает это потому, что выбывший из партии больше не считается находящимся в партии: правило, выпущенное год назад по другому поводу, — именно оно делает кнопку реванша законной.
«Быстрая игра» держит своё решение в чистой функции, поэтому её можно проверить без лобби и без базы данных. Режим здесь — фильтр, а не пожелание: попасть в получасовую классическую партию после выбора Блица было бы хуже, чем подождать минуту.
// lib/lobby/quickMatch.ts — which open room to try, in order
.sort((a, b) => {
// 1. a human host: pool the people who are actually online
if (a.creator_is_bot !== b.creator_is_bot) return a.creator_is_bot ? 1 : -1;
// 2. fewest free seats: a nearly-full room starts sooner
const freeA = a.max_players - a.player_count;
const freeB = b.max_players - b.player_count;
if (freeA !== freeB) return freeA - freeB;
// 3. oldest: whoever has waited longest gets company first
return Date.parse(a.created_at) - Date.parse(b.created_at);
});Возвращается весь упорядоченный список, а не одна комната, потому что число занятых мест — это снимок на момент запроса: вызывающая сторона идёт по списку, пока присоединение действительно не удастся, и это не даёт двум людям, борющимся за последнее место, остаться каждому в своей пустой комнате.
