# Hurry Curry! protocol

The protocol schema is defined in [`protocol.ts`](./test-client/protocol.ts)

1. Connect to the server via WebSocket and send/receive JSON in text messages.
2. Wait for `version` packet and check version compatibiliy (see below).
3. The server will send the current game data and state, then finishes with
   `set_ingame(state=true)`
4. Send `join` with your username, the server will confirm your join with
   `joined`.
5. Run the game loop
   - Send a `keepalive` packet every 1000ms.
   - Send your position and inputs via `movement` whenever inputs change.
   - Send `interact` when the player interacts with a tile.
   - Receive packets
6. The Game ends. The server will remove all players and tiles, then send
   `set_ingame(state=false)`. Then continue at step 3.

## Ports

- 443: All uses with TLS
- 27032: Game Server Websocket
- 27033: Registry API HTTP / Local dicovery service
- 27034: Lobby Server Websocket
- 27035: Map Editor Server Websocket

## Protocol Versioning

The `init` packet sends minor and major version numbers of the protocol is use
by the server. These are to be interpreted according to
[SemVer](https://semver.org/) for the JSON protocol.

## Movement

Movement is handled server-side but should be predicted by client for better
latency. For this reason it implemented three times:

- In GDscript (for the Godot client):
  [controllable_player.gd](./client/player/controllable_player.gd)
- In Rust (for server and standalone bots):
  [movement.rs](./server/protocol/src/movement.rs)
- In TypeScript (for test-client): [movement.ts](./test-client/movement.ts)

## Limits

The server currently enforces the following network limits:

- Server inbound json packets are at most 8196 bytes in size
- Player names are no longer than 32 characters
- Player names are no longer than 64 bytes
