46 lines
2.2 KiB
Markdown
46 lines
2.2 KiB
Markdown
# Authoritative game core
|
|
|
|
Milestone 006 provides the portable movement engine and view projector. The
|
|
ESP remains the only owner of mutable game state. Object interaction, item
|
|
effects, exits, results, reconnect behavior, and browser controls remain out of
|
|
scope until their later milestones.
|
|
|
|
## Command processing
|
|
|
|
Move commands enter a fixed 16-entry FIFO. The server assigns a monotonically
|
|
increasing command sequence when an entry is accepted into the queue, then
|
|
processes entries one at a time. An accepted move crosses exactly one open
|
|
north, east, south, or west passage. Countdown commands, closed-wall moves,
|
|
out-of-order timestamps, and commands inside the configured per-player
|
|
cooldown leave authoritative game state and the state sequence unchanged.
|
|
|
|
Each player has an independent cooldown clock. Player positions never block
|
|
one another. When an accepted move ends on the other player's cell, that
|
|
command emits exactly one meeting event and advances the meeting sequence.
|
|
Observers cannot enqueue commands.
|
|
|
|
## Projection boundary
|
|
|
|
Player projections contain only cells whose Chebyshev distance from the
|
|
player is at most the active radius:
|
|
|
|
`max(abs(x - player_x), abs(y - player_y)) <= radius`
|
|
|
|
The projector supports the normal radius three and vision-effect radius six.
|
|
Map boundaries clip the square; walls do not occlude it. Each projection is
|
|
rebuilt from zero, so an opponent or object that leaves the current square is
|
|
omitted instead of surviving as stale state. Observer projections contain all
|
|
maze cells, static objects, and both current player positions.
|
|
|
|
The serialized view is split into bounded JSON records of at most 512 bytes,
|
|
matching the WebSocket gateway's message bound.
|
|
Every record uses the architecture's versioned envelope and carries the
|
|
authoritative state sequence, role, match phase, meeting sequence, chunk index,
|
|
and chunk count. Cell records contain only the cell index and current passage
|
|
flags. Object records contain kind, owner, variant, and cell index. Player
|
|
records omit the `opponent` member when that player is not currently visible;
|
|
observer records instead carry both positions in `players`.
|
|
|
|
Static maze objects are projected for visibility testing, but Milestone 006
|
|
does not pick up, consume, transfer, or otherwise mutate them.
|