export const components = { securitySchemes: { tokenHttpAuthentication: { type: 'apiKey', description: 'Prefix the session ID with \"Token\" to indicate the custom authorization type', in: 'header', name: 'Authorization', }, }, schemas: { body_status: { type: 'object', description: 'Public information about a stellar body, returned in the `body` part of the status block and used to populate the Star Map.', properties: { id: { type: 'integer', description: 'The unique id of the body.' }, x: { type: 'number', description: 'The x coordinate of the body on the star map.' }, y: { type: 'number', description: 'The y coordinate of the body on the star map.' }, star_id: { type: 'integer', description: 'The id of the star this body orbits.' }, star_name: { type: 'string', description: 'The name of the star this body orbits.' }, zone: { type: 'string', description: 'The star map zone the body sits in, e.g. "0|0".' }, orbit: { type: 'number', description: 'Which orbit of the star the body occupies, where 1 is closest to the star.', }, // TODO: this can probably be an enum type: { type: 'string', description: 'The kind of body, e.g. "habitable planet", "gas giant", "asteroid", or "space station".', }, name: { type: 'string', description: 'The name of the body.' }, image: { type: 'string', description: 'The image key used to render the body.' }, size: { type: 'number', description: 'The size of the body. On a planet this is the number of building plots.', }, water: { type: 'number', description: 'The amount of water present on the body.' }, ore: { type: 'object', description: 'The ore concentrations present on the body, keyed by ore type.', properties: { anthracite: { type: 'integer' }, bauxite: { type: 'integer' }, beryl: { type: 'integer' }, chalcopyrite: { type: 'integer' }, chromite: { type: 'integer' }, fluorite: { type: 'integer' }, galena: { type: 'integer' }, goethite: { type: 'integer' }, gold: { type: 'integer' }, gypsum: { type: 'integer' }, halite: { type: 'integer' }, kerogen: { type: 'integer' }, magnetite: { type: 'integer' }, methane: { type: 'integer' }, monazite: { type: 'integer' }, rutile: { type: 'integer' }, sulfur: { type: 'integer' }, trona: { type: 'integer' }, uraninite: { type: 'integer' }, zircon: { type: 'integer' }, }, required: [ 'anthracite', 'bauxite', 'beryl', 'chalcopyrite', 'chromite', 'fluorite', 'galena', 'goethite', 'gold', 'gypsum', 'halite', 'kerogen', 'magnetite', 'methane', 'monazite', 'rutile', 'sulfur', 'trona', 'uraninite', 'zircon', ], }, empire: { type: 'object', description: 'The empire occupying this body. Only present when an empire occupies it.', properties: { id: { type: 'integer', description: 'The id of the occupying empire.' }, name: { type: 'string', description: 'The name of the occupying empire.' }, alignment: { type: 'string', enum: ['ally', 'self', 'hostile'], description: "The occupying empire's alignment relative to you.", }, is_isolationist: { type: 'integer', enum: [1, 0], description: '1 if the occupying empire has not sent out any probes or colony ships.', }, }, required: ['id', 'name', 'alignment', 'is_isolationist'], }, station: { type: 'object', description: "The space station whose influence this body is under. Only present when the body is within a station's jurisdiction.", properties: { id: { type: 'integer', description: 'The id of the space station.' }, x: { type: 'number', description: 'The x coordinate of the space station.' }, y: { type: 'number', description: 'The y coordinate of the space station.' }, name: { type: 'string', description: 'The name of the space station.' }, }, required: ['id', 'x', 'y', 'name'], }, }, required: [ 'id', 'x', 'y', 'star_id', 'star_name', 'orbit', 'type', 'name', 'image', 'size', 'ore', ], }, planet_status: { type: 'object', description: 'The comprehensive "own body" shape returned as the `planet` block on the Planetary Command / Station Command `view` — a body_status plus population, happiness, and per-resource stored/hour/capacity figures. Only returned for a body you own.', properties: { id: { type: 'integer', description: 'The unique id of the body.' }, x: { type: 'integer', description: 'The x coordinate of the body on the star map.' }, y: { type: 'integer', description: 'The y coordinate of the body on the star map.' }, star_id: { type: 'integer', description: 'The id of the star this body orbits.' }, star_name: { type: 'string', description: 'The name of the star this body orbits.' }, zone: { type: 'string', description: 'The star map zone the body sits in, e.g. "0|0".' }, orbit: { type: 'integer', description: 'Which orbit of the star the body occupies, where 1 is closest to the star.', }, type: { type: 'string', description: 'The kind of body, e.g. "habitable planet", "gas giant", "asteroid", or "space station".', }, name: { type: 'string', description: 'The name of the body.' }, image: { type: 'string', description: 'The image key used to render the body.' }, size: { type: 'integer', description: 'The size of the body. On a planet this is the number of building plots.', }, water: { type: 'integer', description: 'The amount of water stored on the body.' }, ore: { type: 'object', description: 'The ore concentrations present on the body, keyed by ore type.', additionalProperties: { type: 'integer' }, }, notes: { type: 'string', description: 'The per-colony notes set for this body.' }, neutral_entry: { type: 'string', description: 'The earliest time the body may enter the neutral area.', }, empire: { type: 'object', description: 'The empire occupying this body. Only present when an empire occupies it.', properties: { id: { type: 'integer', description: 'The id of the occupying empire.' }, name: { type: 'string', description: 'The name of the occupying empire.' }, alignment: { type: 'string', enum: ['ally', 'self', 'hostile'], description: "The occupying empire's alignment relative to you.", }, is_isolationist: { type: 'integer', enum: [1, 0], description: '1 if the occupying empire has not sent out any probes or colony ships.', }, }, }, building_count: { type: 'integer', description: 'The number of buildings currently on the body.', }, population: { type: 'integer', description: 'The current population of the body.' }, happiness: { type: 'integer', description: 'The current happiness stored on the body.' }, happiness_hour: { type: 'integer', description: 'The net happiness produced per hour on the body.', }, food_stored: { type: 'integer', description: 'The amount of food currently in storage.' }, food_capacity: { type: 'integer', description: 'The total food storage capacity.' }, food_hour: { type: 'integer', description: 'The net food produced per hour.' }, energy_stored: { type: 'integer', description: 'The amount of energy currently in storage.', }, energy_capacity: { type: 'integer', description: 'The total energy storage capacity.' }, energy_hour: { type: 'integer', description: 'The net energy produced per hour.' }, ore_hour: { type: 'integer', description: 'The net ore produced per hour.' }, ore_capacity: { type: 'integer', description: 'The total ore storage capacity.' }, ore_stored: { type: 'integer', description: 'The amount of ore currently in storage.' }, waste_hour: { type: 'integer', description: 'The net waste produced per hour.' }, waste_stored: { type: 'integer', description: 'The amount of waste currently in storage.' }, waste_capacity: { type: 'integer', description: 'The total waste storage capacity.' }, water_stored: { type: 'integer', description: 'The amount of water currently in storage.' }, water_hour: { type: 'integer', description: 'The net water produced per hour.' }, water_capacity: { type: 'integer', description: 'The total water storage capacity.' }, num_incoming_own: { type: 'integer', description: 'The number of incoming ships from your own colonies.', }, num_incoming_ally: { type: 'integer', description: 'The number of incoming ships from within your alliance.', }, num_incoming_enemy: { type: 'integer', description: 'The total number of incoming foreign ships.', }, }, }, empire_status: { type: 'object', description: 'Information about the current state of the empire, returned in the `empire` part of the status block of every relevant request.', properties: { essentia: { type: 'number', description: "The empire's current essentia balance." }, colonies: { type: 'object', description: 'Keyed by body id (a stringified integer), value is the colony name.', additionalProperties: { type: 'string' }, }, rpc_count: { type: 'integer', description: 'The number of calls made to the server so far in the current RPC period.', }, is_isolationist: { type: 'integer', description: "1 if the empire hasn't sent out any probes or colony ships.", }, id: { type: 'integer', description: 'The unique id of the empire.' }, planets: { type: 'object', description: 'Keyed by body id (a stringified integer), value is the planet name.', additionalProperties: { type: 'string' }, }, has_new_messages: { type: 'integer', description: 'The number of unread messages in the inbox.', }, name: { type: 'string', description: 'The name of the empire.' }, home_planet_id: { type: 'integer', description: "The id of the empire's home planet." }, insurrect_value: { type: 'integer', description: 'The current insurrection value.' }, status_message: { type: 'string', description: "The empire's status message." }, self_destruct_active: { type: 'integer', description: '1 if the self destruct countdown is currently running.', }, next_colony_srcs: { type: 'integer', description: 'The resource cost of the next colony.' }, stations: { type: 'object', description: 'Keyed by space station id (a stringified integer), value is the station name.', additionalProperties: { type: 'string' }, }, self_destruct_date: { type: 'string', description: 'The date the empire will self destruct, when a countdown is active.', }, next_colony_cost: { type: 'integer', description: 'The happiness cost of founding the next colony.', }, latest_message_id: { type: 'integer', description: 'The id of the most recent message.' }, bodies: { type: 'object', description: 'The bodies known to the empire, grouped by relationship.', properties: { colonies: { $ref: '#/components/schemas/bodies_list' }, mystations: { $ref: '#/components/schemas/bodies_list' }, ourstations: { $ref: '#/components/schemas/bodies_list' }, babies: { type: 'object', description: 'Empires that can be managed by this empire, keyed by id', additionalProperties: { type: 'object', required: ['id', 'planets', 'sitter_expiry'], properties: { id: { type: 'number', description: 'The id of the baby empire' }, alliance_id: { type: 'number', description: 'The id of the alliance the baby empire is a member of', }, sitter_expiry: { type: 'string', description: 'The date whereupon this baby will case to be managed by the empire', }, planets: { $ref: '#/components/schemas/bodies_list' }, }, }, }, }, required: ['colonies'], }, next_station_cost: { type: 'integer', description: 'The resource cost of the next space station.', }, tech_level: { type: 'integer', description: 'The highest level the University has reached.', }, }, required: [ 'essentia', 'colonies', 'rpc_count', 'is_isolationist', 'id', 'planets', 'has_new_messages', 'name', 'home_planet_id', 'insurrect_value', 'status_message', 'self_destruct_active', 'next_colony_srcs', 'stations', 'self_destruct_date', 'next_colony_cost', 'latest_message_id', 'bodies', 'next_station_cost', 'tech_level', ], }, bodies_list: { type: 'array', description: 'A list of colonies or stations.', items: { type: 'object', properties: { empire_name: { type: 'string' }, x: { type: 'integer' }, name: { type: 'string' }, empire_id: { type: 'integer' }, star_id: { type: 'integer' }, star_name: { type: 'string' }, y: { type: 'integer' }, id: { type: 'integer' }, orbit: { type: 'integer' }, zone: { type: 'string' }, }, required: [ 'empire_name', 'x', 'name', 'empire_id', 'star_id', 'star_name', 'y', 'id', 'orbit', 'zone', ], }, }, building_cost: { type: 'object', description: 'The resource and time cost of a build or upgrade.', properties: { food: { type: 'integer', description: 'Food spent from storage.' }, water: { type: 'integer', description: 'Water spent from storage.' }, energy: { type: 'integer', description: 'Energy spent from storage.' }, waste: { type: 'integer', description: 'Waste added to storage (not spent like the other resources).', }, ore: { type: 'integer', description: 'Ore spent from storage.' }, time: { type: 'integer', description: 'Build time in seconds.' }, halls: { type: 'integer', description: 'Number of Halls of Vrbansk required, for buildings built from glyphs.', }, }, required: ['time'], }, buildings_list: { type: 'object', description: "The lightweight per-building shape returned by get_buildings / repair_list. Place these on the planet's 11x11 grid and fill the rest with blank ground tiles. Not the full `building` schema, since this is a list/grid view rather than a single-building detail view.", required: ['buildings'], properties: { buildings: { type: 'object', description: 'Keyed by building id (a stringified integer).', additionalProperties: { type: 'object', required: ['id', 'name', 'x', 'y', 'url', 'level', 'image', 'efficiency'], properties: { id: { type: 'integer', description: 'The building id. Same value as the map key, repeated for convenience.', }, name: { type: 'string', description: 'The building name.' }, x: { type: 'integer', minimum: -5, maximum: 5, description: 'The x coordinate of the building on the surface grid.', }, y: { type: 'integer', minimum: -5, maximum: 5, description: 'The y coordinate of the building on the surface grid.', }, url: { type: 'string', description: 'The building type\'s API URL, e.g. "/apple".' }, level: { type: 'integer', description: 'The current level of the building.' }, image: { type: 'string', description: 'The image key used to render the building.' }, efficiency: { type: 'integer', description: 'The current efficiency of the building, from 0 to 100.', }, pending_build: { type: 'object', description: 'Only included when the building is being built or upgraded.', properties: { seconds_remaining: { type: 'integer' }, start: { type: 'string' }, end: { type: 'string' }, }, required: ['seconds_remaining', 'start', 'end'], }, work: { type: 'object', description: 'Only included when the building is working (Parks, Waste Recycling, etc).', properties: { seconds_remaining: { type: 'integer' }, start: { type: 'string' }, end: { type: 'string' }, }, required: ['seconds_remaining', 'start', 'end'], }, repair_costs: { type: 'object', description: 'Only included when the building is damaged (efficiency below 100).', properties: { food: { type: 'integer' }, water: { type: 'integer' }, energy: { type: 'integer' }, ore: { type: 'integer' }, }, required: ['food', 'water', 'energy', 'ore'], }, }, }, }, }, }, building_production: { type: 'object', description: "A building's hourly production and storage capacity for each resource.", properties: { food_hour: { type: 'integer', description: 'Net food produced per hour.' }, food_capacity: { type: 'integer', description: 'Food storage capacity added.' }, energy_hour: { type: 'integer', description: 'Net energy produced per hour.' }, energy_capacity: { type: 'integer', description: 'Energy storage capacity added.' }, ore_hour: { type: 'integer', description: 'Net ore produced per hour.' }, ore_capacity: { type: 'integer', description: 'Ore storage capacity added.' }, water_hour: { type: 'integer', description: 'Net water produced per hour.' }, water_capacity: { type: 'integer', description: 'Water storage capacity added.' }, waste_hour: { type: 'integer', description: 'Net waste produced per hour.' }, waste_capacity: { type: 'integer', description: 'Waste storage capacity added.' }, happiness_hour: { type: 'integer', description: 'Net happiness produced per hour.' }, }, required: [ 'food_hour', 'food_capacity', 'energy_hour', 'energy_capacity', 'ore_hour', 'ore_capacity', 'water_hour', 'water_capacity', 'waste_hour', 'waste_capacity', 'happiness_hour', ], }, building_resources: { type: 'object', description: "A single building's contribution to the planet economy, as returned by get_buildings_resources: the same aggregate figures as `building_production` plus a per-food-type and per-ore-type production breakdown. `ore_hour`, `ore_capacity` and `ore` are all omitted for the Mining Ministry, whose ore output is driven by its deployed mining platforms rather than the building itself.", properties: { food_hour: { type: 'integer', description: 'Net food produced per hour.' }, food_capacity: { type: 'integer', description: 'Food storage capacity added.' }, energy_hour: { type: 'integer', description: 'Net energy produced per hour.' }, energy_capacity: { type: 'integer', description: 'Energy storage capacity added.' }, water_hour: { type: 'integer', description: 'Net water produced per hour.' }, water_capacity: { type: 'integer', description: 'Water storage capacity added.' }, waste_hour: { type: 'integer', description: 'Net waste produced per hour.' }, waste_capacity: { type: 'integer', description: 'Waste storage capacity added.' }, happiness_hour: { type: 'integer', description: 'Net happiness produced per hour.' }, ore_hour: { type: 'integer', description: 'Net ore produced per hour. Omitted for the Mining Ministry.', }, ore_capacity: { type: 'integer', description: 'Ore storage capacity added. Omitted for the Mining Ministry.', }, food: { type: 'object', description: 'Hourly production keyed by food type. Only included when the building produces food.', additionalProperties: { type: 'integer' }, }, ore: { type: 'object', description: 'Hourly production keyed by ore type. Only included when the building produces ore.', additionalProperties: { type: 'integer' }, }, }, required: [ 'food_hour', 'food_capacity', 'energy_hour', 'energy_capacity', 'water_hour', 'water_capacity', 'waste_hour', 'waste_capacity', 'happiness_hour', ], }, buildings_resources_list: { type: 'object', description: 'The per-building shape returned by get_buildings_resources — the lightweight grid shape (as in buildings_list) with a `resources` object added. Keyed by building id (a stringified integer), one level deep (no extra `buildings` wrapper).', additionalProperties: { type: 'object', required: ['id', 'name', 'x', 'y', 'url', 'level', 'image', 'efficiency', 'resources'], properties: { id: { type: 'integer', description: 'The building id. Same value as the map key, repeated for convenience.', }, name: { type: 'string', description: 'The building name.' }, x: { type: 'integer', minimum: -5, maximum: 5, description: 'The x coordinate of the building on the surface grid.', }, y: { type: 'integer', minimum: -5, maximum: 5, description: 'The y coordinate of the building on the surface grid.', }, url: { type: 'string', description: 'The building type\'s API URL, e.g. "/apple".' }, level: { type: 'integer', description: 'The current level of the building.' }, image: { type: 'string', description: 'The image key used to render the building.' }, efficiency: { type: 'integer', description: 'The current efficiency of the building, from 0 to 100.', }, resources: { $ref: '#/components/schemas/building_resources' }, pending_build: { type: 'object', description: 'Only included when the building is being built or upgraded.', properties: { seconds_remaining: { type: 'integer' }, start: { type: 'string' }, end: { type: 'string' }, }, required: ['seconds_remaining', 'start', 'end'], }, work: { type: 'object', description: 'Only included when the building is working (Parks, Waste Recycling, etc).', properties: { seconds_remaining: { type: 'integer' }, start: { type: 'string' }, end: { type: 'string' }, }, required: ['seconds_remaining', 'start', 'end'], }, repair_costs: { type: 'object', description: 'Only included when the building is damaged (efficiency below 100).', properties: { food: { type: 'integer' }, water: { type: 'integer' }, energy: { type: 'integer' }, ore: { type: 'integer' }, }, required: ['food', 'water', 'energy', 'ore'], }, }, }, }, building: { type: 'object', description: "The fields common to every building's `view` response. Building-type-specific endpoints (see src/spec/paths/buildings/*.ts) add extra sibling fields alongside this on `view`.", properties: { id: { type: 'integer', description: 'The unique id of the building.' }, name: { type: 'string', description: 'The building name.' }, image: { type: 'string', description: 'The image key used to render the building.' }, url: { type: 'string', description: 'The building type\'s API URL, e.g. "/apple".' }, level: { type: 'integer', description: 'The current level of the building.' }, x: { type: 'integer', minimum: -5, maximum: 5, description: 'The x coordinate of the building on the surface grid.', }, y: { type: 'integer', minimum: -5, maximum: 5, description: 'The y coordinate of the building on the surface grid.', }, efficiency: { type: 'integer', description: 'The current efficiency of the building, from 0 to 100.', }, food_hour: { type: 'integer', description: 'Net food produced per hour.' }, food_capacity: { type: 'integer', description: 'Food storage capacity added.' }, energy_hour: { type: 'integer', description: 'Net energy produced per hour.' }, energy_capacity: { type: 'integer', description: 'Energy storage capacity added.' }, ore_hour: { type: 'integer', description: 'Net ore produced per hour.' }, ore_capacity: { type: 'integer', description: 'Ore storage capacity added.' }, water_hour: { type: 'integer', description: 'Net water produced per hour.' }, water_capacity: { type: 'integer', description: 'Water storage capacity added.' }, waste_hour: { type: 'integer', description: 'Net waste produced per hour.' }, waste_capacity: { type: 'integer', description: 'Waste storage capacity added.' }, happiness_hour: { type: 'integer', description: 'Net happiness produced per hour.' }, repair_costs: { type: 'object', description: 'The resources it would cost to repair the building to full efficiency. See the repair method.', properties: { food: { type: 'integer' }, water: { type: 'integer' }, energy: { type: 'integer' }, ore: { type: 'integer' }, }, required: ['food', 'water', 'energy', 'ore'], }, pending_build: { type: 'object', description: 'Only present while the building is being built or upgraded.', properties: { seconds_remaining: { type: 'integer' }, start: { type: 'string' }, end: { type: 'string' }, }, required: ['seconds_remaining', 'start', 'end'], }, work: { type: 'object', description: 'Only present while the building is doing work (e.g. Parks, Waste Recycling).', properties: { seconds_remaining: { type: 'integer' }, start: { type: 'string' }, end: { type: 'string' }, searching: { type: 'string', description: 'Present for an Archaeology Ministry that is searching for a glyph — the ore being searched.', }, }, required: ['seconds_remaining', 'start', 'end'], }, downgrade: { type: 'object', description: 'Whether the building can be downgraded, and why not.', properties: { can: { type: 'integer', enum: [1, 0], description: '1 if the building can be downgraded.', }, reason: { type: 'array', items: {}, description: 'A [code, message] pair; [0, ""] when there is no reason.', }, image: { type: 'string', description: 'The image key for the downgraded building.' }, }, required: ['can', 'reason', 'image'], }, upgrade: { type: 'object', description: 'Whether the building can be upgraded, its cost, and its projected stats.', properties: { can: { type: 'integer', enum: [1, 0], description: '1 if the building can be upgraded.', }, reason: { type: 'array', items: {}, description: 'A [code, message] pair; [0, ""] when there is no reason.', }, cost: { $ref: '#/components/schemas/building_cost' }, production: { $ref: '#/components/schemas/building_production' }, image: { type: 'string', description: 'The image key for the upgraded building.' }, }, required: ['can', 'reason', 'cost', 'production', 'image'], }, }, required: [ 'id', 'name', 'image', 'level', 'x', 'y', 'efficiency', 'food_hour', 'food_capacity', 'energy_hour', 'energy_capacity', 'ore_hour', 'ore_capacity', 'water_hour', 'water_capacity', 'waste_hour', 'waste_capacity', 'happiness_hour', 'repair_costs', 'downgrade', 'upgrade', ], }, rpc_error: { type: 'object', description: 'A JSON-RPC error response. The game returns these with an HTTP 500 status code whenever a method throws.', required: ['id', 'jsonrpc', 'error'], properties: { id: { type: 'number', description: 'The id echoed back from the request.' }, jsonrpc: { type: 'string', description: 'The JSON-RPC version, always "2.0".' }, error: { type: 'object', required: ['code', 'message'], properties: { code: { type: 'integer', description: 'The error code. 1000-1018 are general game errors, 1100-1101 concern un-founded empires, and 1200 is game over. See ErrorCodes in the original documentation.', enum: [ 1000, // Name not available. 1001, // Invalid password. 1002, // Object does not exist. 1003, // Too much information. 1004, // Password incorrect. 1005, // Contains invalid characters. 1006, // Session expired. 1007, // Overspend. 1008, // Underspend. 1009, // Invalid range. 1010, // Insufficient privileges. 1011, // Not enough resources in storage. 1012, // Not enough resources in production. 1013, // Missing prerequisites. 1014, // Captcha not valid. 1015, // Restricted for sitter logins. 1016, // Needs to solve a captcha. 1017, // Pending Parliamentary Vote 1018, // Already Voted 1100, // Empire not founded. 1101, // Empire not founded, and you tried to create it, but had the wrong password. 1200, // Game Over. ], }, message: { type: 'string', description: 'A human-readable description of the error.' }, data: { type: 'object', description: 'Extra context for the error, when available — e.g. a fresh captcha for 1014, or an empire id for 1100.', }, }, }, }, }, server_status: { type: 'object', description: 'Server-wide state, returned in the `server` part of the status block of every response.', properties: { version: { type: 'number', description: 'The running server version.' }, time: { type: 'string', description: 'The current server time, e.g. "01 31 2010 13:09:05 +0600".', }, star_map_size: { type: 'object', description: 'The inclusive [min, max] bounds of the star map on each axis.', properties: { y: { type: 'array', items: { type: 'integer' } }, x: { type: 'array', items: { type: 'integer' } }, }, required: ['y', 'x'], }, rpc_limit: { type: 'integer', description: 'The number of RPC calls allowed per 24 hour period.', }, announcement: { type: 'integer', enum: [1, 0], description: '1 when a server announcement is active. Clients pop the announcement window on the 0 -> 1 transition.', }, }, required: ['version', 'time', 'star_map_size', 'rpc_limit'], }, server_overview: { type: 'object', description: 'The "General" tab of the in-game stats window is fed by a static `server_overview.json` snapshot on the server (not a JSON-RPC method), so it has no path in this spec. This schema documents that snapshot\'s shape.', properties: { bodies: { type: 'object', properties: { count: { type: 'integer' }, colony_count: { type: 'integer' }, types: { type: 'object', description: 'Keyed by body class: asteroids, gas_giants, habitables, stations.', additionalProperties: { type: 'object', properties: { count: { type: 'integer' }, average_orbit: { type: 'number' }, average_size: { type: 'number' }, largest_size: { type: 'number' }, smallest_size: { type: 'number' }, }, }, }, }, }, buildings: { type: 'object', properties: { count: { type: 'integer' }, types: { type: 'object', description: 'Keyed by building name.', additionalProperties: { type: 'object', properties: { count: { type: 'integer' }, average_level: { type: 'number' }, highest_level: { type: 'integer' }, }, }, }, }, }, empires: { type: 'object', properties: { count: { type: 'integer' }, active_this_week_count: { type: 'integer' }, active_today_count: { type: 'integer' }, currently_active_count: { type: 'integer' }, average_university_level: { type: 'number' }, highest_university_level: { type: 'integer' }, essentia_using_count: { type: 'integer' }, isolationist_count: { type: 'integer' }, }, }, orbits: { type: 'object', description: "Keyed '1' through '8'.", additionalProperties: { type: 'object', properties: { bodies: { type: 'integer' }, inhabited: { type: 'integer' } }, }, }, ships: { type: 'object', properties: { count: { type: 'integer' }, types: { type: 'object', description: 'Keyed by ship type.', additionalProperties: { type: 'object', properties: { count: { type: 'integer' }, smallest_hold_size: { type: 'integer' }, average_hold_size: { type: 'number' }, largest_hold_size: { type: 'integer' }, slowest_speed: { type: 'integer' }, average_speed: { type: 'number' }, fastest_speed: { type: 'integer' }, }, }, }, }, }, spies: { type: 'object', description: 'A `count` plus a set of `average_*` / `highest_*` skill figures and `*_count` assignment tallies.', additionalProperties: { type: 'number' }, }, stars: { type: 'object', properties: { count: { type: 'integer' }, seized_count: { type: 'integer' }, probed_count: { type: 'integer' }, probes_count: { type: 'integer' }, }, }, glyphs: { type: 'object', properties: { types: { type: 'object', description: 'Glyph name to count.', additionalProperties: { type: 'integer' }, }, }, }, }, }, }, };