updated skills
This commit is contained in:
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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`
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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`.
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user