matchmaking: deterministic 15s wait before bots fill empty seats
CI/CD / CI - API (dotnet build + engine sim) (push) Successful in 22s
CI/CD / CI - Web (tsc + next build) (push) Successful in 1m10s
CI/CD / Deploy - local stack (db + server + web) (push) Successful in 1m4s

Both the mock and the .NET server already waited then bot-filled, but used a
random 12-18s window. Make it exactly 15s on both sides so the rule is clear:
wait 15s for real online players to join, then replace any unfilled seats with
bots and start.

- client: new MATCH_QUEUE_WAIT_MS = 15000 in gamification.ts; mock beginSearch
  uses it instead of randInt(12000,18000).
- server: GameManager QueueWaitMs = 15000 (was randomized 12-18s per ticket).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
soroush.asadi
2026-06-11 18:27:46 +03:30
parent ad5b42db06
commit 8033023a1f
3 changed files with 16 additions and 10 deletions
+5 -6
View File
@@ -17,12 +17,11 @@ public sealed class Player
/// <summary>In-memory matchmaking + room registry. (EF/Postgres persistence is a TODO.)</summary>
public sealed class GameManager
{
// Real players get priority: wait ~15s for humans before bots fill in. The
// exact wait is randomized per ticket (1218s) so the queue doesn't feel
// robotically identical every time.
private const int QueueWaitMinMs = 12000;
private const int QueueWaitMaxMs = 18000;
private int NextQueueWaitMs() => _rng.Next(QueueWaitMinMs, QueueWaitMaxMs + 1);
// Real players get priority: wait exactly 15s for humans to join; whoever
// hasn't joined the table by then is replaced with a bot when the match forms.
// (Mirror of MATCH_QUEUE_WAIT_MS on the client — keep both in sync.)
private const int QueueWaitMs = 15000;
private int NextQueueWaitMs() => QueueWaitMs;
private static readonly string[] BotNames =
{ "آرش", "کیان", "نیلوفر", "سارا", "رضا", "مهسا", "امیر", "پارسا", "الناز", "بابک" };
+7
View File
@@ -178,6 +178,13 @@ export const SPEED_TURN_MS = 5000;
/** Speed mode races to fewer points so a match is over fast. */
export const SPEED_TARGET_SCORE = 5;
/**
* How long matchmaking waits for real online players before filling the
* remaining seats with bots and starting the match. (Mirror of the server's
* QueueWaitMs in GameManager.cs — keep both in sync.)
*/
export const MATCH_QUEUE_WAIT_MS = 15000;
export function turnMsForStake(stake: number, speed = false): number {
if (speed) return SPEED_TURN_MS;
if (stake >= 1000) return 7000;
+4 -4
View File
@@ -7,6 +7,7 @@ import {
CARD_BACKS,
CARD_FRONTS,
CITY_REWARD,
MATCH_QUEUE_WAIT_MS,
REACTION_PACKS,
STICKER_PACKS,
TITLES,
@@ -890,10 +891,9 @@ export class MockOnlineService implements OnlineService {
};
this.emitMM();
// Wait ~15s (randomized 1218s) for "online" players to show up; whoever
// hasn't joined by then is filled with a bot when the match forms. The exact
// wait varies so it never feels robotically identical.
const searchMs = randInt(12000, 18000);
// Wait 15s for "online" players to show up; whoever hasn't joined by then is
// filled with a bot when the match forms.
const searchMs = MATCH_QUEUE_WAIT_MS;
// 03 humans actually appear; the rest of the table fills with bots.
const humansFound = randInt(0, 3);