# 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 via `movement` every 20ms - 40ms. - 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 4. ## 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 - Server inbound binary packets are at most 4096 bytes in size - Player names are no longer than 32 characters - Player names are no longer than 64 bytes