package improbable; // A set of worker attributes. This represents a minimum set of requirements that a candidate worker // must fulfill in order to be eligible for some constraint, and corresponds to the concrete set of // capabilities defined in each worker's JSON configuration file. type WorkerAttributeSet { // A particular capability is just an arbitrary string. A particular worker's attribute set must // contain _all_ of these attributes in order to satisfy this WorkerAttributeSet. list attribute = 1; } // A WorkerRequirementSet is a way to describe a set of workers. We can use a WorkerRequirementSet // to, for example, describe the sorts of workers that are allowed to be authoritative on a // particular component. // // For example, we might want an entity to be readable on any worker that can handle "visual" or // "physical" things, and could describe that with a WorkerRequirementSet containing two // WorkerAttributeSets: // // { // { "visual" }, // { "physical" } // } type WorkerRequirementSet { // A worker satisfies this WorkerRequirementSet if it satisfies _any_ of these // WorkerAttributeSets (i.e. if any one of these WorkerAttributeSets is a subset of the worker's // attributes). list attribute_set = 1; } // The EntityAcl component defines what sorts of workers can read and write each entity in the // simulation. This component is REQUIRED (every entity must be created with it). component EntityAcl { id = 50; // The read ACL defined the kinds of workers that may check out the entity. Note that a worker // is currently required to satisfy this constraint even if it is authoritative on some component // on this entity; i.e. an entity will _never_ be checked out on any worker that does not match // this WorkerRequirementSet. WorkerRequirementSet read_acl = 1; // This map defines the kinds of worker that are allowed to be authoritative on each component, // where components are keyed by their component ID (as defined in schema and generated code). // A component does not have to have an ACL, in which case it can't be authoritative on any // worker. map component_write_acl = 2; } // The Metadata component is used to hold debug and convenience information about // the entity. This component is optional. component Metadata { id = 53; // The entity type is a string describing what kind of thing the entity represents // in the simulation. It is used by the Inspector to colour or filter entities // based on their entity type, for example "car" or "player". string entity_type = 1; } // A type representing a 3-dimensional position in space. This is primarily used as part of the // standard Position component, below, but can also be reused for other purposes. type Coordinates { double x = 1; double y = 2; double z = 3; } // A type representing the dimensions of a cuboid. type EdgeLength { double x = 1; double y = 2; double z = 3; } // The Position component defines the canonical position of an entity inside a SpatialOS simulation. // This is used by SpatialOS for load-balancing, authority delegation, and spatial queries. Note // that although this component can be used to represent an entity's position on workers, it doesn't // _have_ to be: it's completely reasonable for a simulation to define a custom or optimized notion // of position, and simply update this component as necessary (perhaps less frequently) for // authority delegation. component Position { id = 54; Coordinates coords = 1; } // The Peristence component is a marker component used to indicate that an entity should be // persisted in simulation snapshots. Any entity without this component will be dropped when a // snapshot is taken. component Persistence { id = 55; } // An entity's interest is a map of Component IDs to a list of Entity queries, where the queries define other Entities // needed to simulate the component. // // If a Worker is authoritative over a Component ID present in the map, it will be provided with updates for Entities // which match the corresponding queries. component Interest { id = 58; map component_interest = 1; } type ComponentInterest { type Query { QueryConstraint constraint = 1; // Either full_snapshot_result or a list of result_component_id should be provided. Providing both is invalid. option full_snapshot_result = 2; list result_component_id = 3; // Used for frequency-based rate limiting. Represents the maximum frequency of updates for this // particular query. An empty option represents no rate-limiting (ie. updates are received // as soon as possible). Frequency is measured in Hz. // // If set, the time between consecutive updates will be at least 1/frequency. This is determined // at the time that updates are sent from the Runtime and may not necessarily correspond to the // time updates are received by the worker. // // If after an update has been sent, multiple updates are applied to a component, they will be // merged and sent as a single update after 1/frequency of the last sent update. When components // with events are merged, the resultant component will contain a concatenation of all the // events. // // If multiple queries match the same Entity-Component then the highest of all frequencies is // used. option frequency = 4; } type QueryConstraint { // Only one constraint should be provided. Providing more than one is invalid. option sphere_constraint = 1; option cylinder_constraint = 2; option box_constraint = 3; option relative_sphere_constraint = 4; option relative_cylinder_constraint = 5; option relative_box_constraint = 6; option entity_id_constraint = 7; option component_constraint = 8; list and_constraint = 9; list or_constraint = 10; // reserved = 11 option self_constraint = 12; } type SphereConstraint { Coordinates center = 1; double radius = 2; } type CylinderConstraint { Coordinates center = 1; double radius = 2; } type BoxConstraint { Coordinates center = 1; EdgeLength edge_length = 2; } type RelativeSphereConstraint { double radius = 1; } type RelativeCylinderConstraint { double radius = 1; } type RelativeBoxConstraint { EdgeLength edge_length = 1; } // The self constraint matches the entity the Interest query is attached to. type SelfConstraint {} list queries = 1; } type ShardedMap {}