syntax = "proto3"; package city; message Rect { sint32 min_x = 1; sint32 min_y = 2; sint32 max_x = 3; sint32 max_y = 4; } message Join { string room = 1; uint32 client_version = 2; string nickname = 3; } message Subscribe { Rect rect = 1; uint32 lod = 2; } message Ping { uint32 nonce = 1; } message Propose { uint32 speed = 1; } message Vote { bool yes = 1; } // Equal rights for every connected player; only these three bounded actions exist. message Intervene { string action = 1; } message Needs { uint32 hunger = 1; uint32 fatigue = 2; uint32 morale = 3; } message GameEvent { uint64 minute = 1; string kind = 2; } message Gameplay { sint64 treasury = 1; uint64 food = 2; Needs needs = 3; repeated GameEvent events = 4; repeated string pending = 5; uint64 minute = 6; uint64 next_intervention_minute = 7; } message CreateCity { repeated double bbox = 1; string name = 2; uint32 seed = 3; } message CityJob { string id = 1; string city_id = 2; string status = 3; string room_id = 4; string error = 5; string stage = 6; } message ClientMessage { oneof body { Join join = 1; Subscribe subscribe = 2; Ping ping = 3; Propose propose = 4; Vote vote = 5; Intervene intervene = 6; } } message Agent { uint32 id = 1; sint32 x = 2; sint32 y = 3; uint32 kind = 4; } message Welcome { string room = 1; uint64 tick = 2; string city_manifest_url = 3; string session = 4; uint32 protocol_version = 5; } message Snapshot { uint64 tick = 1; repeated Agent entities = 2; } message Delta { uint64 tick = 1; repeated Agent spawned = 2; repeated Agent changed = 3; repeated uint32 despawned = 4; } message Error { string code = 1; string message = 2; } message VoteState { bool active = 1; uint32 speed = 2; uint32 yes = 3; uint32 players = 4; uint32 remaining_seconds = 5; } message Clock { uint64 tick = 1; double game_seconds = 2; uint32 speed = 3; } message ServerMessage { oneof body { Welcome welcome = 1; Snapshot snapshot = 2; Delta delta = 3; Error error = 4; Ping pong = 5; VoteState vote_state = 6; Clock clock = 7; Gameplay gameplay = 8; } } message SavedAgent { uint32 id = 1; uint32 route = 2; double distance = 3; } message Route { repeated sint32 xy = 1; string home_id = 2; string workplace_id = 3; } message RoomSave { uint32 version = 1; string id = 2; string city_id = 3; uint32 city_version = 4; uint64 tick = 5; uint64 seed = 6; double game_seconds = 7; uint32 speed = 8; repeated SavedAgent agents = 9; repeated Route routes = 10; string city_revision = 11; Gameplay gameplay = 12; }