Empires Game Protocol ===================== Version: 0.9 For a specific game the following API endpoints are defined. (Note: Only the trailing portion of the API URI is provided here. The preceding portions of the path must be determined externally.) /events This is a server-sent events stream that allows the server to push game-related events to clients. When a client connects to this API endpoint the server will return a header that includes: Content-type: text/event-stream Connection: keep-alive Cache-Control: no-cache and will keep the connection open to return events. The following event types will be returned by the server: TYPE: players WHEN: When a client first connects PURPOSE: Describes all players in the game already EXAMPLE: event: players data: [{"id":1,"name":"Carl"},{"id":2,"name":"Kevin"}] TYPE: player-join WHEN: When a player joins the game EXAMPLE: event: player-join data: {"id":3,"name":"Richard"} TYPE: player-leave WHEN: When a player leaves the game EXAMPLE: event: player-leave data: {"id":3} TYPE: game-phase WHEN: When client first connects and whenever game phase changes VALUES: Event gives both the old and new phase. Each will be one of the following: none: Pseudo-phase used as old_phase when game is started join: Players are choosing characters and joining the game reveal: Character names are being revealed to players capture: Players are guessing characters in capture attempts NOTE: When a client first connects, it may see multiple game-phase transitions, to transition step-by-step from the initial phase to the phase of the current game. See the example below which would be presented to a client joining a game that is already in the "reveal phase. EXAMPLES: event: game-phase data: {"old_phase":"none","new_phase":"join"} event: game-phase data: {"old_phase":"join","new_phase":"reveal"} TYPE: character-reveal WHEN: Periodically during the "reveal" phase of the game EXAMPLE: event: character-reveal data: {"character":"Albert Einstein"} TYPE: capture WHEN: When one player captures another EXAMPLE: event: capture data: {"captor": 2, "captee": 1} /register Method: POST Behavior: Adds a new player with "name" and "character" and assigns an id. Also will add a new empire with empty "captured" array. Returns the numeric ID of the new player. Note: If the client supports cookies and has previously set a nickname in the current session via the upper-level /profile API, then the name can be omitted from the data here and the profile nickname will be used instead. Example data: { "name": "Carl", "character: "Elvis" } Example return data: 2 /deregister/ Method: POST Behavior: Removes an existing player with the given ID /spectator Method: POST Behavior: Add a new spectator with the given name, assigning and returning an ID for the spectator. Note: If the client supports cookies and has previously set a nickname in the current session via the upper-level /profile API, then the name can be omitted from the data here and the profile nickname will be used instead. Example data: { "name": "Carl" } Example return data: 23 /spectator/ Method: DELETE Behavior: Remove an existing spectator with the given ID /reveal Method: POST When: Only valid when in game phase of JOIN Behavior: Change phase to REVEAL; reveal character names to all clienta /start Method: POST When: Only valid when in game phase of REVEAL Behavior: Change game phase to CAPTURE /reset Method: POST Behavior: Removes all players (bulk deregister) /restart Method: POST Behavior: Eliminates all current empire ownership so the existing players can start a new game /capture// Method: POST Behavior: Indicate that empire ID1 has now captured ID2 /liberate/ Method: POST Behavior: Indicate that empire ID is no longer captured (undoing a previous /capture) /characters Method: GET Behavior: Returns a lists of all character names (in alphabetical order) Example data: [ "Einstein", "Elvis", "Fred Flintstone" ] /empires Method: GET Behavior: Shows which empires have been captured by other empires Example data [ { "id": 1, "captures": [] }, { "id": 2, "captures": [1] }, { "id": 3, "captures": [4, 5, 6] }, { "id": 4, "captures": [2] }, { "id": 5, "captures": [] }, { "id": 6, "captures": [] } ] /spectators Method: GET Behavior: Gets a list of all spectators. A spectator is someone who has started viewing the game (and stated their own name) but isn't directly involved in the game. Example data: [ { id: 1, name: "Richard"}, { id: 2, name: "Nancy"} ] Note: The IDs of spectators and players are unrelated. If a person initially joins as a spectator and then later joins the game as a player, an unrelated player ID will be generated. From the server's point of view, the events of a spectator leaving and a player joining that happens to have the same name---those two events have nothing to do with each other. /players Method: GET Behavior: Gets a list of all the player objects (without their character names). A player is someone who is registered a character choice to participate in the game. Example data: [ { id: 1, name: "Carl" }, { id: 2, name: "Kevin" } ] Server ====== There's a sample server available at: https://families.cworth.org/api/ We plan to move this to https://empires.cworth.org at some point.