updated skills

This commit is contained in:
2026-06-09 21:06:27 +01:00
parent db1ce43ee1
commit 427a5bd919
1283 changed files with 24684 additions and 2313 deletions

View File

@@ -163,4 +163,3 @@ full deferral table and rationale.
- [`src/engine/game-loop/game-loop.md`](src/engine/game-loop/game-loop.md)
- [`src/engine/plugin-manager/plugin-manager.md`](src/engine/plugin-manager/plugin-manager.md)
- [`src/observability/otel.md`](src/observability/otel.md)

View File

@@ -81,6 +81,7 @@ mgr.stopHeartbeatMonitor();
`new PlayerManager(deps, options?)` where `deps` is
`{ clock, timers, logger, events }`. Options:
- `timeoutThresholdMs` (default 30000) — ms without heartbeat before a
connected player is marked `timeout`.
- `reconnectionGraceMs` (default 10000) — ms after a disconnect during

View File

@@ -105,7 +105,7 @@ const match = engine.createMatchFromQueue(
The skill-based algorithm tries each candidate as an anchor and grows
the group greedily until either `maxPlayers` is reached or no further
peers fit inside the `skillRange`. The match returned is the *largest*
peers fit inside the `skillRange`. The match returned is the _largest_
viable group; on ties the first-found anchor wins, matching the
upstream behaviour. The engine deliberately does not own the
`QueueManager`'s "remove on match" semantics — `createMatchFromQueue`

View File

@@ -101,7 +101,7 @@ const stats = qm.getStats();
returns `[]` if not enough tickets are waiting; throws
`INVALID_MATCH_CRITERIA` on a non-positive size.
- `getQueueSize(queueKey): number` / `getQueuePosition(queueKey, playerId)`.
- `getStats(): readonly QueueStats[]` — one entry per *known* queue key
- `getStats(): readonly QueueStats[]` — one entry per _known_ queue key
(preserved even after the queue empties, so dashboards see history).
- `clear(): void` — drops every queue.

View File

@@ -13,9 +13,9 @@ seeker waits. It is the matchmaking primitive that powers
isolation when callers want fine-grained control over rating math, such
as during round-by-round tournament seeding or AI bot pairing.
Two pieces of math drive the matcher: the *effective range* (base
Two pieces of math drive the matcher: the _effective range_ (base
`ratingRange` plus `waitTimeBonus * waitMinutes`, capped at `maxRange`)
and the *score* (by default `Math.abs(seeker.rating - candidate.rating)`,
and the _score_ (by default `Math.abs(seeker.rating - candidate.rating)`,
overridable via the `score` dep so callers can plug in Glicko or
TrueSkill). Tie-breaks across candidates with identical scores can be
made deterministic by injecting an `Rng`.

View File

@@ -110,6 +110,6 @@ rather than a live `MapIterator` to keep callers from mutating the
internal map by accident. The `onSpectatorJoined` callback receives the
fully-constructed `Spectator` (id + `joinedAt` + permissions) so a
network fan-out caller does not need a second lookup to broadcast the
join. Duplicate-spectator detection runs *before* cap enforcement so an
join. Duplicate-spectator detection runs _before_ cap enforcement so an
already-attached viewer never accidentally fails with
`SPECTATOR_LIMIT_REACHED` when the session happens to be full.