{
"id": "games.atmosphere.define",
"defs": {
"all": {
"type": "object",
"required": [
"check",
"rules"
],
"properties": {
"check": {
"type": "string",
"const": "all"
},
"label": {
"type": "string",
"maxLength": 120
},
"rules": {
"type": "array",
"items": {
"ref": "#rule",
"type": "ref"
},
"maxLength": 16,
"minLength": 1
},
"acquire": {
"type": "string",
"format": "uri"
}
},
"description": "Passes only when every rule passes."
},
"any": {
"type": "object",
"required": [
"check",
"rules"
],
"properties": {
"check": {
"type": "string",
"const": "any"
},
"label": {
"type": "string",
"maxLength": 120
},
"rules": {
"type": "array",
"items": {
"ref": "#rule",
"type": "ref"
},
"maxLength": 16,
"minLength": 1
},
"acquire": {
"type": "string",
"format": "uri"
}
},
"description": "Passes when at least one rule passes."
},
"not": {
"type": "object",
"required": [
"check",
"rule"
],
"properties": {
"rule": {
"ref": "#rule",
"type": "ref"
},
"check": {
"type": "string",
"const": "not"
},
"label": {
"type": "string",
"maxLength": 120
}
},
"description": "Passes only when the nested rule fails."
},
"main": {
"key": "any",
"type": "record",
"record": {
"type": "object",
"required": [
"name",
"url",
"publisher",
"category",
"createdAt"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "Where to play, download, or access the game."
},
"icon": {
"type": "blob",
"accept": [
"image/png",
"image/webp"
],
"maxSize": 512000,
"description": "Square icon. 256x256 recommended."
},
"name": {
"type": "string",
"maxLength": 100,
"description": "Display name."
},
"tags": {
"type": "array",
"items": {
"type": "string",
"maxLength": 32
},
"maxLength": 12,
"description": "Freeform search tags."
},
"uses": {
"type": "array",
"items": {
"ref": "#recordUse",
"type": "ref"
},
"maxLength": 32,
"description": "Other records this game reads or writes. Not required to play."
},
"cover": {
"type": "blob",
"accept": [
"image/png",
"image/jpeg",
"image/webp"
],
"maxSize": 4000000,
"description": "Card thumbnail image. 16:9 recommended."
},
"media": {
"type": "array",
"items": {
"ref": "#mediaItem",
"type": "ref"
},
"maxLength": 24,
"description": "Extra screenshots, banners, and key art."
},
"status": {
"type": "string",
"description": "Current availability.",
"knownValues": [
"live",
"beta",
"coming",
"archived"
]
},
"catalog": {
"type": "array",
"items": {
"ref": "#catalogRef",
"type": "ref"
},
"maxLength": 8,
"description": "Links to matching entries in other game catalogs. Purely supplementary."
},
"tagline": {
"type": "string",
"maxLength": 200,
"description": "One-line summary."
},
"category": {
"type": "string",
"maxLength": 30,
"description": "Type of experience.",
"knownValues": [
"browser",
"download",
"physical",
"other"
]
},
"requires": {
"type": "array",
"items": {
"ref": "#rule",
"type": "ref"
},
"maxLength": 16,
"description": "Hard gates. Every rule must pass before a player can use this game."
},
"trailers": {
"type": "array",
"items": {
"ref": "#video",
"type": "ref"
},
"maxLength": 8,
"description": "Video trailers or gameplay clips."
},
"createdAt": {
"type": "string",
"format": "datetime"
},
"developer": {
"ref": "#party",
"type": "ref",
"description": "The studio or person who made this."
},
"legacyIds": {
"type": "array",
"items": {
"type": "string",
"maxLength": 80
},
"maxLength": 12,
"description": "Old IDs used for this same game by other catalogs or tools."
},
"publisher": {
"type": "string",
"format": "at-uri",
"description": "AT-URI of the repo that owns this record. Must match this record's own repo."
},
"updatedAt": {
"type": "string",
"format": "datetime"
},
"releasedAt": {
"type": "string",
"format": "datetime",
"description": "When this became available."
},
"description": {
"type": "string",
"maxLength": 2000,
"description": "Full description."
},
"statNamespace": {
"type": "string",
"maxLength": 80,
"description": "Deprecated. Use uses[] instead."
}
}
},
"description": "One game definition per record, published in the developer's own repo. Keep the same rkey to update it in place."
},
"rule": {
"type": "object",
"required": [
"check"
],
"properties": {
"op": {
"type": "string",
"description": "Comparison operator.",
"knownValues": [
"exists",
"notExists",
"isPlayer",
"eq",
"neq",
"gt",
"gte",
"lt",
"lte"
]
},
"nsid": {
"type": "string",
"format": "nsid",
"description": "Collection to read."
},
"rkey": {
"type": "string",
"maxLength": 50,
"description": "Record key. Defaults to 'self'; 'any' scans the collection."
},
"rule": {
"ref": "#rule",
"type": "ref",
"description": "Nested rule for not."
},
"check": {
"type": "string",
"description": "Rule type.",
"knownValues": [
"record",
"field",
"matches",
"vouch",
"all",
"any",
"not"
]
},
"field": {
"type": "string",
"maxLength": 200,
"description": "Dot-path to test."
},
"label": {
"type": "string",
"maxLength": 120,
"description": "Why this is required."
},
"rules": {
"type": "array",
"items": {
"ref": "#rule",
"type": "ref"
},
"maxLength": 16,
"minLength": 1,
"description": "Nested rules for all/any."
},
"value": {
"type": "unknown",
"description": "Comparison value."
},
"verify": {
"ref": "#rule",
"type": "ref",
"description": "Additional proof that must also pass when this rule is used in requires[]."
},
"acquire": {
"type": "string",
"format": "uri",
"description": "Where to get this."
},
"filters": {
"type": "array",
"items": {
"ref": "#filter",
"type": "ref"
},
"maxLength": 8,
"minLength": 1,
"description": "Conditions for matches or vouch."
},
"authority": {
"type": "string",
"format": "did",
"description": "DID of the trusted issuer, for vouch."
}
},
"description": "One playability rule. 'check' selects the variant: record, field, matches, vouch, all, any, or not. A rule may include verify for an additional required proof. An unknown check must never pass."
},
"field": {
"type": "object",
"required": [
"check",
"nsid",
"field",
"op"
],
"properties": {
"op": {
"type": "string",
"description": "Comparison operator.",
"knownValues": [
"exists",
"notExists",
"isPlayer",
"eq",
"neq",
"gt",
"gte",
"lt",
"lte"
]
},
"nsid": {
"type": "string",
"format": "nsid"
},
"rkey": {
"type": "string",
"maxLength": 50,
"description": "Record key. Defaults to 'self'; 'any' scans the collection."
},
"check": {
"type": "string",
"const": "field"
},
"field": {
"type": "string",
"maxLength": 200,
"description": "Dot-path to the property to test."
},
"label": {
"type": "string",
"maxLength": 120
},
"value": {
"type": "unknown",
"description": "Comparison value."
},
"acquire": {
"type": "string",
"format": "uri"
}
},
"description": "Passes if a field on the player's record meets a condition."
},
"party": {
"type": "object",
"required": [
"name"
],
"properties": {
"did": {
"type": "string",
"format": "did",
"description": "DID of this entity's account, if it has one."
},
"url": {
"type": "string",
"format": "uri",
"description": "Website."
},
"name": {
"type": "string",
"maxLength": 100,
"description": "Display name."
}
},
"description": "An entity associated with the experience, such as its developer."
},
"video": {
"type": "object",
"required": [
"title"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "Direct URL, used when no platform/videoId is given."
},
"title": {
"type": "string",
"maxLength": 120,
"description": "Clip title."
},
"videoId": {
"type": "string",
"maxLength": 120,
"description": "Platform video id."
},
"platform": {
"type": "string",
"description": "Where the video lives.",
"knownValues": [
"youtube",
"vimeo",
"twitch",
"direct"
]
},
"thumbnail": {
"type": "blob",
"accept": [
"image/png",
"image/jpeg",
"image/webp"
],
"maxSize": 2000000,
"description": "Still frame shown before playing."
}
},
"description": "A trailer or gameplay clip."
},
"vouch": {
"type": "object",
"required": [
"check",
"authority",
"nsid"
],
"properties": {
"nsid": {
"type": "string",
"format": "nsid",
"description": "Collection to look for in the authority's repo."
},
"check": {
"type": "string",
"const": "vouch"
},
"label": {
"type": "string",
"maxLength": 120
},
"acquire": {
"type": "string",
"format": "uri"
},
"filters": {
"type": "array",
"items": {
"ref": "#filter",
"type": "ref"
},
"maxLength": 8,
"description": "Conditions the record must meet. Use 'isPlayer' to require it name the signed-in player."
},
"authority": {
"type": "string",
"format": "did",
"description": "DID of the account that issues the record."
}
},
"description": "Passes if a trusted authority's repo holds a matching record. Use for grants, awards, or approvals one account issues about another."
},
"filter": {
"type": "object",
"required": [
"field",
"op"
],
"properties": {
"op": {
"type": "string",
"description": "Comparison operator.",
"knownValues": [
"exists",
"notExists",
"isPlayer",
"eq",
"neq",
"gt",
"gte",
"lt",
"lte"
]
},
"field": {
"type": "string",
"maxLength": 200,
"description": "Dot-path to the field."
},
"value": {
"type": "unknown",
"description": "Comparison value."
}
},
"description": "One field condition, used by matches and vouch. 'isPlayer' passes when the field names the signed-in player."
},
"record": {
"type": "object",
"required": [
"check",
"nsid"
],
"properties": {
"nsid": {
"type": "string",
"format": "nsid",
"description": "Collection to check."
},
"check": {
"type": "string",
"const": "record"
},
"label": {
"type": "string",
"maxLength": 120,
"description": "Why this is required."
},
"acquire": {
"type": "string",
"format": "uri",
"description": "Where to get this."
}
},
"description": "Passes if the player holds any record in this collection."
},
"matches": {
"type": "object",
"required": [
"check",
"nsid",
"filters"
],
"properties": {
"nsid": {
"type": "string",
"format": "nsid"
},
"check": {
"type": "string",
"const": "matches"
},
"label": {
"type": "string",
"maxLength": 120
},
"acquire": {
"type": "string",
"format": "uri"
},
"filters": {
"type": "array",
"items": {
"ref": "#filter",
"type": "ref"
},
"maxLength": 8,
"minLength": 1,
"description": "All filters must match on the same record."
}
},
"description": "Passes if one record satisfies all filters."
},
"mediaItem": {
"type": "object",
"required": [
"image"
],
"properties": {
"alt": {
"type": "string",
"maxLength": 300,
"description": "Accessibility caption."
},
"type": {
"type": "string",
"description": "Kind of image.",
"knownValues": [
"screenshot",
"banner",
"artwork",
"poster",
"background",
"logo",
"thumbnail"
]
},
"image": {
"type": "blob",
"accept": [
"image/png",
"image/jpeg",
"image/webp",
"image/gif"
],
"maxSize": 8000000,
"description": "The image blob."
},
"width": {
"type": "integer",
"description": "Pixel width, if known."
},
"height": {
"type": "integer",
"description": "Pixel height, if known."
}
},
"description": "One image in the media gallery."
},
"recordUse": {
"type": "object",
"required": [
"role",
"nsid"
],
"properties": {
"nsid": {
"type": "string",
"format": "nsid",
"description": "Collection to read."
},
"path": {
"type": "string",
"maxLength": 200,
"description": "Dot-path to the relevant value inside the record."
},
"rkey": {
"type": "string",
"maxLength": 50,
"description": "Record key. Defaults to 'self'; 'any' scans the collection."
},
"role": {
"type": "string",
"description": "What this record is used for.",
"knownValues": [
"character",
"perk",
"cosmetic",
"interop",
"stats",
"activity",
"leaderboard",
"profile",
"session",
"inventory",
"other"
]
},
"label": {
"type": "string",
"maxLength": 120,
"description": "Short label for this use."
},
"verify": {
"ref": "#rule",
"type": "ref",
"description": "Optional rule confirming this use is genuine."
},
"acquire": {
"type": "string",
"format": "uri",
"description": "Where to create or manage this record."
},
"filters": {
"type": "array",
"items": {
"ref": "#filter",
"type": "ref"
},
"maxLength": 8,
"description": "Conditions to match, used with rkey 'any' or an authority."
},
"purpose": {
"type": "string",
"maxLength": 300,
"description": "Why this record matters."
},
"authority": {
"type": "string",
"format": "did",
"description": "DID of the repo holding this record, if not the player's own."
}
},
"description": "An optional record this game reads or writes. Not required to play; see requires[] for hard gates."
},
"catalogRef": {
"type": "object",
"required": [
"uri"
],
"properties": {
"uri": {
"type": "string",
"format": "at-uri",
"description": "AT-URI of the external catalog record."
},
"name": {
"type": "string",
"maxLength": 100,
"description": "Display name of the referenced entry."
},
"borrow": {
"type": "array",
"items": {
"type": "string",
"knownValues": [
"media",
"trailers",
"genres",
"platforms",
"releases",
"ratings",
"description",
"summary"
]
},
"maxLength": 8,
"description": "Which parts of the referenced record a portal may show alongside this one."
},
"source": {
"type": "string",
"maxLength": 60,
"description": "Short name of the catalog."
}
},
"description": "A link to a matching entry in another game catalog. Purely supplementary; never affects eligibility."
}
},
"$type": "com.atproto.lexicon.schema",
"lexicon": 1,
"description": "A game definition: what it is, what a player needs to play it, and what records it uses."
}