com.gamethesky.make.game

gamethesky.com

Schema Diff

+4 -2

From

CID
bafyreigizubtyhp...
Indexed At
2026-10-26 03:02 UTC
View this version

To

CID
bafyreifnpteohf3...
Indexed At
2026-10-26 07:46 UTC
View this version

Compatibility Analysis

Breaking Changes Detected

1 breaking change, 0 non-breaking changes.

Breaking Changes (1)
  • ConstraintTightened ConstraintTightened { vertex_id: "com.gamethesky.make.game#chapter.module", sort: "knownValues", old_value: "[\"platformer\",\"house\",\"tanks\",\"vortex\",\"roll\",\"fight\",\"golf\",\"cycles\",\"discs\",\"uplink\",\"canyon\",\"belts\",\"race\",\"gunner\",\"drones\",\"landing\",\"deckgun\",\"minefield\",\"pipes\",\"catch\",\"fence\",\"airdrop\",\"invaders\",\"crossing\",\"walk\",\"fps\",\"trivia\",\"hunt\",\"puzzle\",\"chase\",\"kart\"]", new_value: "[\"platformer\",\"house\",\"tanks\",\"vortex\",\"roll\",\"fight\",\"golf\",\"cycles\",\"discs\",\"uplink\",\"canyon\",\"belts\",\"race\",\"gunner\",\"drones\",\"landing\",\"deckgun\",\"minefield\",\"pipes\",\"catch\",\"fence\",\"airdrop\",\"invaders\",\"crossing\",\"walk\",\"fps\",\"trivia\",\"hunt\",\"puzzle\",\"chase\",\"kart\",\"grift\",\"f47\"]" }

Migration Guidance

Constraint Changes

  • ConstraintTightened ConstraintTightened { vertex_id: "com.gamethesky.make.game#chapter.module", sort: "knownValues", old_value: "[\"platformer\",\"house\",\"tanks\",\"vortex\",\"roll\",\"fight\",\"golf\",\"cycles\",\"discs\",\"uplink\",\"canyon\",\"belts\",\"race\",\"gunner\",\"drones\",\"landing\",\"deckgun\",\"minefield\",\"pipes\",\"catch\",\"fence\",\"airdrop\",\"invaders\",\"crossing\",\"walk\",\"fps\",\"trivia\",\"hunt\",\"puzzle\",\"chase\",\"kart\"]", new_value: "[\"platformer\",\"house\",\"tanks\",\"vortex\",\"roll\",\"fight\",\"golf\",\"cycles\",\"discs\",\"uplink\",\"canyon\",\"belts\",\"race\",\"gunner\",\"drones\",\"landing\",\"deckgun\",\"minefield\",\"pipes\",\"catch\",\"fence\",\"airdrop\",\"invaders\",\"crossing\",\"walk\",\"fps\",\"trivia\",\"hunt\",\"puzzle\",\"chase\",\"kart\",\"grift\",\"f47\"]" }
1 1
{
2 2
  "$type": "com.atproto.lexicon.schema",
3 3
  "defs": {
4 4
    "chapter": {
5 5
      "properties": {
6 6
        "backdrop": {
7 7
          "accept": [
8 8
            "image/jpeg",
9 9
            "image/png"
10 10
          ],
11 11
          "description": "A picture for this chapter's sky or backdrop, drawn behind the play where the chapter type can (at most 1600×900). Public once published. Looks only: play, boards and the verifier never read it.",
12 12
          "maxSize": 716800,
13 13
          "type": "blob"
14 14
        },
15 15
        "castMap": {
16 16
          "description": "Who plays the chapter type's parts in this chapter, where the builder changed it from the type's own: an object of slots (hero1…extra4) by part (the type's own names: guard, boss, rival, ghoul…; \"in this chapter, the guards are Foe 3\"). A reader keeps only parts its module has. Looks only.",
17 17
          "type": "unknown"
18 18
        },
19 19
        "hunt": {
20 20
          "description": "A photo hunt chapter's own pictures and what to find in them, in the order shown (absent: its preset's painted scenes). Part of play: where the spots are decides the score. A reader lets go of a spot it can't place and of a picture with none left.",
21 21
          "items": {
22 22
            "ref": "#huntRoom",
23 23
            "type": "ref"
24 24
          },
25 25
          "maxLength": 5,
26 26
          "type": "array"
27 27
        },
28 28
        "level": {
29 29
          "description": "A level the builder drew in the maker, in place of the preset's own map, for modules whose levels can be drawn (platformer, house, tank maze, vortex, walk-through). A reader runs the module's own checker on it and refuses the game if it fails.",
30 30
          "ref": "#level",
31 31
          "type": "ref"
32 32
        },
33 33
        "messages": {
34 34
          "description": "Story beats placed on squares of the chapter's level (drawn or the preset's own), for modules whose levels take them (house, walk, fps, platformer, tanks): each shown in a strip as the player reaches its square, without stopping play. Looks only: play, boards and the verifier never read them.",
35 35
          "items": {
36 36
            "ref": "#message",
37 37
            "type": "ref"
38 38
          },
39 39
          "maxLength": 24,
40 40
          "type": "array"
41 41
        },
42 42
        "module": {
43 -
          "description": "The engine, one of Game the Sky's games made a chapter: platformer, house (a haunted floor), tanks (a tank maze), vortex (a tube of lanes), roll (a tilting course), fight (a bout), golf (a hole), cycles, discs, uplink and canyon (the grid), belts (the counter), race (a sling race), gunner (the door gunner), the arcade classics, walk (a haunted walk-through: no gun, a nerve meter), and fps (first person, armed, in a place such as a military facility: guards, keycards, intel, extraction), and kart (a kart race on a 3D course, with items). The list grows as games are added; a reader refuses a module it doesn't have.",
43 +
          "description": "The engine, one of Game the Sky's games made a chapter: platformer, house (a haunted floor), tanks (a tank maze), vortex (a tube of lanes), roll (a tilting course), fight (a bout), golf (a hole), cycles, discs, uplink and canyon (the grid), belts (the counter), race (a sling race), gunner (the door gunner), the arcade classics, walk (a haunted walk-through: no gun, a nerve meter), and fps (first person, armed, in a place such as a military facility: guards, keycards, intel, extraction), kart (a kart race on a 3D course, with items), grift (Grift Chaser, a speed platformer side on), and f47 (an isometric strike mission in a stealth fighter-bomber). The list grows as games are added; a reader refuses a module it doesn't have.",
44 44
          "knownValues": [
45 45
            "platformer",
46 46
            "house",
47 47
            "tanks",
48 48
            "vortex",
49 49
            "roll",
50 50
            "fight",
51 51
            "golf",
52 52
            "cycles",
53 53
            "discs",
54 54
            "uplink",
55 55
            "canyon",
56 56
            "belts",
57 57
            "race",
58 58
            "gunner",
59 59
            "drones",
60 60
            "landing",
61 61
            "deckgun",
62 62
            "minefield",
63 63
            "pipes",
64 64
            "catch",
65 65
            "fence",
66 66
            "airdrop",
67 67
            "invaders",
68 68
            "crossing",
69 69
            "walk",
70 70
            "fps",
71 71
            "trivia",
72 72
            "hunt",
73 73
            "puzzle",
74 74
            "chase",
75 -
            "kart"
75 +
            "kart",
76 +
            "grift",
77 +
            "f47"
76 78
          ],
77 79
          "maxLength": 32,
78 80
          "type": "string"
79 81
        },
80 82
        "next": {
81 83
          "description": "Where the path goes once this chapter is cleared, when it isn't simply the next chapter: a later chapter's index counting from 0, written in digits (\"3\"), or \"end\" (the ending). Forward only: a reader lets go of a value that isn't later than this chapter or is past the last, and the chapter goes on to the next as if it had none. Absent: the next chapter, or the ending after the last. Part of play.",
82 84
          "maxLength": 8,
83 85
          "type": "string"
84 86
        },
85 87
        "pictures": {
86 88
          "description": "The chapter's own pictures, by key, each a blob: a JPEG or PNG that fits inside 512×512 keeping its own shape (at most 200 KB). poster1 to poster6 are the pictures its posters hang on the level's walls; q1 to q20 are a trivia chapter's pictures for its questions (by a question's pic); room1 to room5 are a photo hunt's rooms (by a room's pic), which may be up to 1024 across; objective, keycard, ammo, medkit and coin are the faces of what the player picks up, where the chapter type has them (objective: first person's intel and evidence, the house's and the walk-through's key and the sign over their way out, the platformer's door; coin: first person's and the platformer's coins), shown on the pickup, on the HUD and in its banner. Public once published. Looks only: play, boards and the verifier never read them.",
87 89
          "type": "unknown"
88 90
        },
89 91
        "posters": {
90 92
          "description": "The builder's pictures hung on the level's walls (a wanted poster, a family photo, a logo, a sign), for chapter types whose levels have walls to see (the house, the walk-through, first person, the tank maze): one a wall square, framed on the face that looks onto the most open floor. A poster on a square that isn't a wall, or whose picture is missing, isn't shown. Looks only: not part of play.",
91 93
          "items": {
92 94
            "ref": "#poster",
93 95
            "type": "ref"
94 96
          },
95 97
          "maxLength": 24,
96 98
          "type": "array"
97 99
        },
98 100
        "preset": {
99 101
          "description": "The module's own level to start from (or, with a drawn level, the look it's drawn in).",
100 102
          "maxLength": 32,
101 103
          "type": "string"
102 104
        },
103 105
        "quiz": {
104 106
          "description": "A trivia chapter's own questions, in the order asked (absent: its preset's). Part of play: the right answers decide the score, so they're in the record for the verifier (anyone reading the record can see them). A reader lets go of a question it can't play (no words, fewer than two answers, the right one empty) and plays the preset's if none is left.",
105 107
          "items": {
106 108
            "ref": "#question",
107 109
            "type": "ref"
108 110
          },
109 111
          "maxLength": 20,
110 112
          "type": "array"
111 113
        },
112 114
        "rivals": {
113 115
          "description": "This chapter's own rule for who its rivals wear, in place of the game's ('cast' here says the cast even in a game of follows). Looks only.",
114 116
          "knownValues": [
115 117
            "cast",
116 118
            "follows",
117 119
            "both"
118 120
          ],
119 121
          "maxLength": 16,
120 122
          "type": "string"
121 123
        },
122 124
        "settings": {
123 125
          "description": "The module's knobs as an object of whole numbers by key (for example {\"lives\": 3, \"speed\": 120}). Each module declares its keys and ranges; readers clamp to them, and a missing key takes its default. First person's include, all optional: stealth, guards, bodies (guards find bodies), rally (after you're down: back at the last checkpoint, topped up), kit (the built-in weapons carried besides the rifle, a bit each: pistol, suppressed pistol, SMG, shotgun, sniper rifle, taser, tranquilizer), custom (the game's own weapons carried, a bit each), coins and emps (the gadgets).",
124 126
          "type": "unknown"
125 127
        },
126 128
        "sounds": {
127 129
          "description": "The game's own sounds in place of the chapter's, by the noise (an object of sound ids by key): the walk-through's jump-outs (ghoul, thing, face, hound, victim, drop, member) and sound pieces (cueA, cueL, cueR, cueI, cueJ, cueN, cueY); First person's alerts (spotted, alarm, caught, checkpoint). A reader takes only the keys its module names and the sounds the game has. Looks only.",
128 130
          "type": "unknown"
129 131
        },
130 132
        "textures": {
131 133
          "description": "The builder's own art for the pieces of the chapter's level, by piece (the module's own names: the platformer's ground, bricks and ledge; the house's and the tank maze's wall and floor; the walk-through's wall, floor, ceiling and portrait), each a blob: a square JPEG (256×256, at most 120 KB) drawn tiled, one a square of the level. Public once published. Looks only.",
132 134
          "type": "unknown"
133 135
        },
134 136
        "title": {
135 137
          "maxGraphemes": 40,
136 138
          "maxLength": 160,
137 139
          "type": "string"
138 140
        },
139 141
        "version": {
140 142
          "description": "The module's rules this chapter was built on. A reader that doesn't have that version refuses the game rather than playing it differently.",
141 143
          "minimum": 1,
142 144
          "type": "integer"
143 145
        },
144 146
        "words": {
145 147
          "description": "The builder's own words in place of the chapter's: an object of strings by key (for example {\"objective\": \"Grandma's recipe\", \"boss\": \"AUNT MARGE\"}). Each module declares its keys (its banners, toasts, HUD labels, the hint) and how long each may be; a reader keeps only keys it knows, trims each to its limit, and says the rest in the module's own words. A word may hold placeholders such as {n} and {total}, filled with the numbers as it's said. Looks only: play, boards and the verifier never read it.",
146 148
          "type": "unknown"
147 149
        },
148 150
        "world": {
149 151
          "description": "A new world (or section) starts at this chapter: its name (\"The Deep\"), shown as a banner on the chapter card and grouping the chapters after it, up to the next chapter that starts one. Empty is a world named by its number. Looks only.",
150 152
          "maxGraphemes": 40,
151 153
          "maxLength": 160,
152 154
          "type": "string"
153 155
        }
154 156
      },
155 157
      "required": [
156 158
        "module",
157 159
        "version",
158 160
        "title",
159 161
        "preset",
160 162
        "settings"
161 163
      ],
162 164
      "type": "object"
163 165
    },
164 166
    "choice": {
165 167
      "description": "One way on from a scene's choice.",
166 168
      "properties": {
167 169
        "label": {
168 170
          "description": "What the button says. Words only: a hidden game's read \"Option 1\", \"Option 2\"…",
169 171
          "maxGraphemes": 60,
170 172
          "maxLength": 240,
171 173
          "type": "string"
172 174
        },
173 175
        "to": {
174 176
          "description": "Where it goes: a chapter's index counting from 0, written in digits (\"2\"), this scene's own chapter or a later one; or \"end\", the ending (not from the opening scene: a run plays at least one chapter). Arriving at another chapter plays that chapter's own scene (and its choice) first.",
175 177
          "maxLength": 8,
176 178
          "type": "string"
177 179
        }
178 180
      },
179 181
      "required": [
180 182
        "label",
181 183
        "to"
182 184
      ],
183 185
      "type": "object"
184 186
    },
185 187
    "credits": {
186 188
      "properties": {
187 189
        "lines": {
188 190
          "description": "The builder's own lines (\"Made by Todd for the Lambert family reunion\").",
189 191
          "items": {
190 192
            "maxGraphemes": 80,
191 193
            "maxLength": 320,
192 194
            "type": "string"
193 195
          },
194 196
          "maxLength": 12,
195 197
          "type": "array"
196 198
        },
197 199
        "loop": {
198 200
          "description": "The credits' sound plays over and over under the whole roll (a music bed).",
199 201
          "type": "boolean"
200 202
        },
201 203
        "picture": {
202 204
          "accept": [
203 205
            "image/jpeg",
204 206
            "image/png"
205 207
          ],
206 208
          "description": "A picture at the end of the roll (at most 1600×900). Public once published. Looks only.",
207 209
          "maxSize": 716800,
208 210
          "type": "blob"
209 211
        },
210 212
        "sound": {
211 213
          "description": "One of the game's own sounds (its id), played as the credits start to roll.",
212 214
          "maxLength": 12,
213 215
          "type": "string"
214 216
        },
215 217
        "starring": {
216 218
          "description": "The cast, in order, each once: shown with their photo and the name they go by in the game.",
217 219
          "items": {
218 220
            "ref": "#starring",
219 221
            "type": "ref"
220 222
          },
221 223
          "maxLength": 15,
222 224
          "type": "array"
223 225
        }
224 226
      },
225 227
      "type": "object"
226 228
    },
227 229
    "gift": {
228 230
      "properties": {
229 231
        "as": {
230 232
          "description": "The slot of the game's cast they play (the star, a Hero slot, or the villain, Villain 1): the gift card shows that slot's photo.",
231 233
          "knownValues": [
232 234
            "hero1",
233 235
            "hero2",
234 236
            "hero3",
235 237
            "foe1",
236 238
            "foe2",
237 239
            "foe3",
238 240
            "foe4",
239 241
            "foe5",
240 242
            "foe6",
241 243
            "villain1",
242 244
            "villain2",
243 245
            "villain3",
244 246
            "extra1",
245 247
            "extra2",
246 248
            "extra3",
247 249
            "extra4"
248 250
          ],
249 251
          "maxLength": 16,
250 252
          "type": "string"
251 253
        },
252 254
        "from": {
253 255
          "description": "Who it's from, as they'd sign it; absent, the card names the account that made it.",
254 256
          "maxGraphemes": 40,
255 257
          "maxLength": 160,
256 258
          "type": "string"
257 259
        },
258 260
        "message": {
259 261
          "description": "The builder's message to them (\"Happy 50th, Ray! Love, Todd\"), shown on the gift card.",
260 262
          "maxGraphemes": 300,
261 263
          "maxLength": 1200,
262 264
          "type": "string"
263 265
        },
264 266
        "to": {
265 267
          "description": "Who the game is for, by the name they go by (\"Ray\").",
266 268
          "maxGraphemes": 40,
267 269
          "maxLength": 160,
268 270
          "type": "string"
269 271
        }
270 272
      },
271 273
      "required": [
272 274
        "to",
273 275
        "message"
274 276
      ],
275 277
      "type": "object"
276 278
    },
277 279
    "huntRoom": {
278 280
      "properties": {
279 281
        "name": {
280 282
          "description": "What the picture is called (\"Grandma's kitchen\"). Looks only.",
281 283
          "maxGraphemes": 40,
282 284
          "maxLength": 160,
283 285
          "type": "string"
284 286
        },
285 287
        "pic": {
286 288
          "description": "Which of the chapter's pictures it is (its pictures' room1 to room5).",
287 289
          "maximum": 5,
288 290
          "minimum": 1,
289 291
          "type": "integer"
290 292
        },
291 293
        "targets": {
292 294
          "items": {
293 295
            "ref": "#huntTarget",
294 296
            "type": "ref"
295 297
          },
296 298
          "maxLength": 8,
297 299
          "minLength": 1,
298 300
          "type": "array"
299 301
        }
300 302
      },
301 303
      "required": [
302 304
        "pic",
303 305
        "targets"
304 306
      ],
305 307
      "type": "object"
306 308
    },
307 309
    "huntTarget": {
308 310
      "properties": {
309 311
        "label": {
310 312
          "description": "What it is, on the list of what to find (\"Grandpa\", \"the cat\"). Looks only.",
311 313
          "maxGraphemes": 40,
312 314
          "maxLength": 160,
313 315
          "type": "string"
314 316
        },
315 317
        "r": {
316 318
          "description": "How far from its middle a tap still finds it, in the same space.",
317 319
          "maximum": 250,
318 320
          "minimum": 12,
319 321
          "type": "integer"
320 322
        },
321 323
        "s": {
322 324
          "description": "How tall the cast member stands, in the picture's space. Looks only.",
323 325
          "maximum": 800,
324 326
          "minimum": 40,
325 327
          "type": "integer"
326 328
        },
327 329
        "who": {
328 330
          "description": "One of the game's cast (any slot) stood in the picture here as a cut-out, to be found. Looks only.",
329 331
          "knownValues": [
330 332
            "hero1",
331 333
            "hero2",
332 334
            "hero3",
333 335
            "foe1",
334 336
            "foe2",
335 337
            "foe3",
336 338
            "foe4",
337 339
            "foe5",
338 340
            "foe6",
339 341
            "villain1",
340 342
            "villain2",
341 343
            "villain3",
342 344
            "extra1",
343 345
            "extra2",
344 346
            "extra3",
345 347
            "extra4"
346 348
          ],
347 349
          "maxLength": 16,
348 350
          "type": "string"
349 351
        },
350 352
        "x": {
351 353
          "description": "Its middle, across the picture, in the picture's own space: its longer side runs 0 to 999 and the shorter in proportion.",
352 354
          "maximum": 999,
353 355
          "minimum": 0,
354 356
          "type": "integer"
355 357
        },
356 358
        "y": {
357 359
          "description": "Its middle, down the picture, in the same space.",
358 360
          "maximum": 999,
359 361
          "minimum": 0,
360 362
          "type": "integer"
361 363
        }
362 364
      },
363 365
      "required": [
364 366
        "x",
365 367
        "y",
366 368
        "r",
367 369
        "label"
368 370
      ],
369 371
      "type": "object"
370 372
    },
371 373
    "level": {
372 374
      "properties": {
373 375
        "rows": {
374 376
          "description": "The grid, top row first, one character a square, every row the same length. The characters are the module's own. The platformer: . air, # ground, = bricks, - ledge, o coin, ^ spikes, w walker, h hopper, B boss, + extra life, S start, D door. The house: Make a House's tiles. The walk-through: the house's walls, portraits, windows, start, key and doors, E the way out, jump-outs (g h f x V T, and ⑴ to ⒃ one of the cast placed by hand: hero1 to extra4), sounds (A L R I J N Y), F a fog machine, props (s Z C t H c j w b). The tank maze: a square, # block, . floor, S you, r a rival. The vortex: o the rim, one square a lane, a loop for a closed tube or a line for an open one. First person also takes weapon pickups (ⓟ pistol, ⓢ suppressed pistol, ⓜ SMG, ⓖ shotgun, ⓝ sniper rifle, ⓣ taser, ⓓ tranquilizer, ① to ⑧ the game's own weapons), gadgets (ⓒ a coin, ⓔ an EMP) and ⚑ a checkpoint. The walk-through, First person, the puzzle room and the street chase take ⑴ to ⒃: one of the cast, by slot (hero1, hero2, hero3, foe1 to foe6, villain1 to villain3, extra1 to extra4), placed by hand.",
375 377
          "items": {
376 378
            "maxLength": 160,
377 379
            "type": "string"
378 380
          },
379 381
          "maxLength": 24,
380 382
          "minLength": 8,
381 383
          "type": "array"
382 384
        }
383 385
      },
384 386
      "required": [
385 387
        "rows"
386 388
      ],
387 389
      "type": "object"
388 390
    },
389 391
    "main": {
390 392
      "description": "A game somebody made in Make the Sky, published into their own repo: a title, a line about it, its look, and one to eight chapters, each one of Game the Sky's engines (a module) on one of its levels (a preset) with its knobs set. Play is decided by the chapters alone (and, in a game whose story branches, where its choices and jumps go). A game is edited in place (the same record, a new version): its board belongs to its way of playing (the chapters' modules, versions, presets and settings, and its paths), so renaming or restyling it keeps the board, and changing a chapter starts a fresh one. A run pins the version it was played on; a verifier replays it on the game as it stands and takes it only if it replays the same.",
391 393
      "key": "tid",
392 394
      "record": {
393 395
        "properties": {
394 396
          "builds": {
395 397
            "description": "Players build their own for the chapter types that take one (Fight the Sky's fighter: points over its stats and a special), chosen before a run; each run carries its build (`builds` on the run). Part of play.",
396 398
            "type": "boolean"
397 399
          },
398 400
          "campaign": {
399 401
            "description": "With daily: a week's campaign. Today's run is one chapter, tonight's (the last chapter, the finale, on Saturdays and Sundays; the others in turn through the week), and the week's board adds up each account's nights Monday to Sunday (UTC). Part of play.",
400 402
            "type": "boolean"
401 403
          },
402 404
          "carryLives": {
403 405
            "description": "Lives carry over: each chapter with lives after the first starts with the lives the player had left (at most 9), not its own lives setting; chapters without lives pass them along. Part of play: a game with it has its own board.",
404 406
            "type": "boolean"
405 407
          },
406 408
          "cast": {
407 409
            "description": "The maker's own cast, by slot (Heroes 1–3: the player and their allies; Foes 1–6: the regular enemies; Villains 1–3: the bosses; Extras 1–4: the rescued, faces on portraits, a host, a crowd), each once, with both of a person's pictures (a face and a cut-out figure). Each chapter type says which of its parts each slot plays (a chapter's castMap can change it). Optional: a game published without one is played with each player's own. Looks only.",
408 410
            "items": {
409 411
              "ref": "#member",
410 412
              "type": "ref"
411 413
            },
412 414
            "maxLength": 16,
413 415
            "type": "array"
414 416
          },
415 417
          "chapters": {
416 418
            "description": "Played in order, unless the game branches: clearing one goes on to the next (or where its next says, and a scene's choice can send the player ahead); losing one ends the run.",
417 419
            "items": {
418 420
              "ref": "#chapter",
419 421
              "type": "ref"
420 422
            },
421 423
            "maxLength": 60,
422 424
            "minLength": 1,
423 425
            "type": "array"
424 426
          },
425 427
          "cover": {
426 428
            "accept": [
427 429
              "image/jpeg",
428 430
              "image/png"
429 431
            ],
430 432
            "description": "The game's picture: its page, its share card, its tile in the gallery. 1200×630, cropped by the maker. Public once published. Looks only: play, boards and the verifier never read it.",
431 433
            "maxSize": 614400,
432 434
            "type": "blob"
433 435
          },
434 436
          "createdAt": {
435 437
            "format": "datetime",
436 438
            "type": "string"
437 439
          },
438 440
          "credits": {
439 441
            "description": "The game's end credits, rolled after the ending and before the results, skippable. Present means they're on. Looks only: not part of play.",
440 442
            "ref": "#credits",
441 443
            "type": "ref"
442 444
          },
443 445
          "daily": {
444 446
            "description": "The game offers today's run: its chapters on seeds of the day (a run names its `day`, a board a day), besides the run that's the same every time. Part of play.",
445 447
            "type": "boolean"
446 448
          },
447 449
          "description": {
448 450
            "maxGraphemes": 200,
449 451
            "maxLength": 800,
450 452
            "type": "string"
451 453
          },
452 454
          "ghost": {
453 455
            "description": "Race your best: where a chapter type can show one (the rolling ball), the player's best run of that chapter rolls alongside them, see-through. Looks only.",
454 456
            "type": "boolean"
455 457
          },
456 458
          "ghostFights": {
457 459
            "description": "Players can save their fighter (a com.gamethesky.make.fighter record) and anyone can fight it as a ghost: one bout on the game's first chapter whose type takes a ghost, the chapter's CPU driving the saved build and style at a skill the challenger picks. A run against a ghost pins the fighter's version (`vs` on the run), verifies and never ranks. Part of play.",
458 460
            "type": "boolean"
459 461
          },
460 462
          "gift": {
461 463
            "description": "A game made for someone: who it's for, a message to them, and who it's from. Its link opens on a gift card (\"A game for Ray\", the message, their photo, a big Play button) and its share card says so. Words only: not part of play.",
462 464
            "ref": "#gift",
463 465
            "type": "ref"
464 466
          },
465 467
          "granny": {
466 468
            "description": "With levels: a fourth level, Granny, easier than Easy (a board of its own). Part of play.",
467 469
            "type": "boolean"
468 470
          },
469 471
          "levels": {
470 472
            "description": "The game offers Easy, Normal and Hard: each chapter's settings moved toward the easy or the hard end of their ranges (a run names its `difficulty`, a board each). Part of play.",
471 473
            "type": "boolean"
472 474
          },
473 475
          "logo": {
474 476
            "accept": [
475 477
              "image/png",
476 478
              "image/jpeg"
477 479
            ],
478 480
            "description": "The game's title as a picture (a PNG with a clear background, at most 1200×400), shown in place of the typed title on its page, its chapter cards and its share card; the typed title stays for readers. Public once published. Looks only.",
479 481
            "maxSize": 409600,
480 482
            "type": "blob"
481 483
          },
482 484
          "remixOf": {
483 485
            "description": "The game this one was remixed from, pinned to the version remixed: credit, shown on the game's page. Absent for an original.",
484 486
            "ref": "com.atproto.repo.strongRef",
485 487
            "type": "ref"
486 488
          },
487 489
          "rivals": {
488 490
            "description": "Who the enemies and rivals wear: 'cast', the game's cast (the default); 'follows', the faces of the people the player follows on Bluesky, on every foe part (the cast keeps you, the one you came for and the builder's own members); 'both', the cast where it has a photo and follows in the parts left uncast. Looks only: play, boards and the verifier never read it.",
489 491
            "knownValues": [
490 492
              "cast",
491 493
              "follows",
492 494
              "both"
493 495
            ],
494 496
            "maxLength": 16,
495 497
            "type": "string"
496 498
          },
497 499
          "scenes": {
498 500
            "description": "The story told between chapters: cut-scenes, one at most before each chapter (the first is the opening) and one each for winning and losing at the end (and, in a game whose story branches, an ending of a way's own: see the scene's chapter). A scene a reader can't use is skipped, never the game. Words and looks only (not part of play, so adding or editing scenes keeps the game's board, and a verifier never reads them), except a scene's choices: where each goes is part of play.",
499 501
            "items": {
500 502
              "ref": "#scene",
501 503
              "type": "ref"
502 504
            },
503 505
            "maxLength": 62,
504 506
            "type": "array"
505 507
          },
506 508
          "sounds": {
507 509
            "description": "The builder's own sounds, recorded or uploaded in the maker: at most eight, five seconds each. Used by id where the game makes a noise: a scene's sting and a message's sound (as \"sound:<id>\"), a chapter's sounds (the walk-through's jump-outs and sound pieces, First person's alerts), the title card's and the credits' sound. Only the ones the game uses are published. Public once published; looks only: play, boards and the verifier never read them. A hidden game's are withheld.",
508 510
            "items": {
509 511
              "ref": "#sound",
510 512
              "type": "ref"
511 513
            },
512 514
            "maxLength": 8,
513 515
            "type": "array"
514 516
          },
515 517
          "theme": {
516 518
            "ref": "#theme",
517 519
            "type": "ref"
518 520
          },
519 521
          "title": {
520 522
            "maxGraphemes": 60,
521 523
            "maxLength": 240,
522 524
            "type": "string"
523 525
          },
524 526
          "titleCard": {
525 527
            "description": "The game's own title card, shown before the opening scene or the first chapter's card, with a short fade. Present means it's on. Looks only: not part of play.",
526 528
            "ref": "#titleCard",
527 529
            "type": "ref"
528 530
          },
529 531
          "video": {
530 532
            "description": "The page records each chapter as it's played, so a player can save a video of their run (it never leaves their device unless they share it). Looks only.",
531 533
            "type": "boolean"
532 534
          },
533 535
          "weapons": {
534 536
            "description": "The builder's own weapons, for First person chapters: a chapter carries the ones its `custom` setting ticks (a bit each, the first weapon bit 0), and a drawn level places them as pickups (① to ⑧). Their numbers are part of play (changing one gives the game a fresh board); their names, looks and pictures are words and looks. A reader takes eight at most and clamps each number to its range.",
535 537
            "items": {
536 538
              "ref": "#weapon",
537 539
              "type": "ref"
538 540
            },
539 541
            "maxLength": 8,
540 542
            "type": "array"
541 543
          },
542 544
          "worldLife": {
543 545
            "description": "With carryLives: each chapter that starts a new world (after the first chapter) gives a life back, up to 5 (never fewer than carried). Part of play, with where the worlds start: a game with it has its own board.",
544 546
            "type": "boolean"
545 547
          }
546 548
        },
547 549
        "required": [
548 550
          "title",
549 551
          "theme",
550 552
          "chapters",
551 553
          "createdAt"
552 554
        ],
553 555
        "type": "object"
554 556
      },
555 557
      "type": "record"
556 558
    },
557 559
    "member": {
558 560
      "description": "One of the cast: their slot, the name they're billed under, and their pictures (a face and a cut-out figure, both made from one photo), or a Bluesky person by their handle (no picture uploaded: players fetch the avatar live from the public profile). At least one picture or a handle.",
559 561
      "properties": {
560 562
        "body": {
561 563
          "accept": [
562 564
            "image/png"
563 565
          ],
564 566
          "description": "A cut-out PNG of them head to toe, the background clear. 192 KB at most.",
565 567
          "maxSize": 196608,
566 568
          "type": "blob"
567 569
        },
568 570
        "face": {
569 571
          "accept": [
570 572
            "image/jpeg"
571 573
          ],
572 574
          "description": "A 256×256 JPEG of their face. 192 KB at most.",
573 575
          "maxSize": 196608,
574 576
          "type": "blob"
575 577
        },
576 578
        "handle": {
577 579
          "description": "A Bluesky person: their handle. Players' pages fetch their avatar live (app.bsky.actor.getProfile on the public AppView) and wear it as the face, on a drawn body where a figure is wanted; an account that's gone leaves the name and the chapter's own look. Usually with no face or body. A hidden game shows neither the name nor the handle.",
578 580
          "format": "handle",
579 581
          "type": "string"
580 582
        },
581 583
        "name": {
582 584
          "maxGraphemes": 40,
583 585
          "maxLength": 160,
584 586
          "type": "string"
585 587
        },
586 588
        "slot": {
587 589
          "description": "Which slot they're in: hero1 (you), hero2–3, foe1–6, villain1–3, extra1–4.",
588 590
          "knownValues": [
589 591
            "hero1",
590 592
            "hero2",
591 593
            "hero3",
592 594
            "foe1",
593 595
            "foe2",
594 596
            "foe3",
595 597
            "foe4",
596 598
            "foe5",
597 599
            "foe6",
598 600
            "villain1",
599 601
            "villain2",
600 602
            "villain3",
601 603
            "extra1",
602 604
            "extra2",
603 605
            "extra3",
604 606
            "extra4"
605 607
          ],
606 608
          "maxLength": 16,
607 609
          "type": "string"
608 610
        }
609 611
      },
610 612
      "required": [
611 613
        "slot",
612 614
        "name"
613 615
      ],
614 616
      "type": "object"
615 617
    },
616 618
    "message": {
617 619
      "properties": {
618 620
        "again": {
619 621
          "description": "Shown every time the player steps back onto it, not only the first.",
620 622
          "type": "boolean"
621 623
        },
622 624
        "sting": {
623 625
          "description": "A sound as it shows: one of the horror pack's recordings, a radio's blip, or one of the game's own sounds as \"sound:<id>\".",
624 626
          "knownValues": [
625 627
            "creepy_hello",
626 628
            "creepy_laugh",
627 629
            "female_scream",
628 630
            "intrigue_event",
629 631
            "jump_scare",
630 632
            "jump_scare_horn",
631 633
            "lets_play",
632 634
            "radio"
633 635
          ],
634 636
          "maxLength": 32,
635 637
          "type": "string"
636 638
        },
637 639
        "text": {
638 640
          "maxGraphemes": 160,
639 641
          "maxLength": 640,
640 642
          "type": "string"
641 643
        },
642 644
        "who": {
643 645
          "description": "Who says it: one of the game's cast's slots (shown with their photo and name), or absent for a note or the narrator.",
644 646
          "knownValues": [
645 647
            "hero1",
646 648
            "hero2",
647 649
            "hero3",
648 650
            "foe1",
649 651
            "foe2",
650 652
            "foe3",
651 653
            "foe4",
652 654
            "foe5",
653 655
            "foe6",
654 656
            "villain1",
655 657
            "villain2",
656 658
            "villain3",
657 659
            "extra1",
658 660
            "extra2",
659 661
            "extra3",
660 662
            "extra4"
661 663
          ],
662 664
          "maxLength": 16,
663 665
          "type": "string"
664 666
        },
665 667
        "x": {
666 668
          "description": "The square's column, as the level's rows have it.",
667 669
          "minimum": 0,
668 670
          "type": "integer"
669 671
        },
670 672
        "y": {
671 673
          "description": "The square's row.",
672 674
          "minimum": 0,
673 675
          "type": "integer"
674 676
        }
675 677
      },
676 678
      "required": [
677 679
        "x",
678 680
        "y",
679 681
        "text"
680 682
      ],
681 683
      "type": "object"
682 684
    },
683 685
    "poster": {
684 686
      "properties": {
685 687
        "pic": {
686 688
          "description": "Which of the chapter's poster pictures it shows: 1 is pictures.poster1, and so on.",
687 689
          "maximum": 6,
688 690
          "minimum": 1,
689 691
          "type": "integer"
690 692
        },
691 693
        "x": {
692 694
          "description": "The wall square's column, as the level's rows have it (the drawn level's, or the preset's own map).",
693 695
          "minimum": 0,
694 696
          "type": "integer"
695 697
        },
696 698
        "y": {
697 699
          "description": "The wall square's row.",
698 700
          "minimum": 0,
699 701
          "type": "integer"
700 702
        }
701 703
      },
702 704
      "required": [
703 705
        "x",
704 706
        "y",
705 707
        "pic"
706 708
      ],
707 709
      "type": "object"
708 710
    },
709 711
    "question": {
710 712
      "properties": {
711 713
        "answers": {
712 714
          "description": "Two to four answers, shown in this order.",
713 715
          "items": {
714 716
            "maxGraphemes": 60,
715 717
            "maxLength": 240,
716 718
            "type": "string"
717 719
          },
718 720
          "maxLength": 4,
719 721
          "minLength": 2,
720 722
          "type": "array"
721 723
        },
722 724
        "pic": {
723 725
          "description": "The chapter's picture shown with it (its pictures' q1 to q20). Looks only.",
724 726
          "maximum": 20,
725 727
          "minimum": 1,
726 728
          "type": "integer"
727 729
        },
728 730
        "q": {
729 731
          "description": "What's asked (\"What year did Grandpa buy the station wagon?\").",
730 732
          "maxGraphemes": 160,
731 733
          "maxLength": 640,
732 734
          "type": "string"
733 735
        },
734 736
        "right": {
735 737
          "description": "Which answer is right, counting from 0.",
736 738
          "maximum": 3,
737 739
          "minimum": 0,
738 740
          "type": "integer"
739 741
        },
740 742
        "time": {
741 743
          "description": "Its own clock in seconds, in place of the chapter's setting.",
742 744
          "maximum": 60,
743 745
          "minimum": 5,
744 746
          "type": "integer"
745 747
        }
746 748
      },
747 749
      "required": [
748 750
        "q",
749 751
        "answers",
750 752
        "right"
751 753
      ],
752 754
      "type": "object"
753 755
    },
754 756
    "scene": {
755 757
      "description": "A cut-scene: a title and a few lines typed out over a letterboxed screen, each said by one of the cast or by nobody (narration), over a background of the builder's choosing.",
756 758
      "properties": {
757 759
        "at": {
758 760
          "description": "Where it plays: before a chapter (see chapter), or at the end, after the last chapter is cleared (win) or after a chapter is lost (lose), before the results.",
759 761
          "knownValues": [
760 762
            "before",
761 763
            "win",
762 764
            "lose"
763 765
          ],
764 766
          "maxLength": 16,
765 767
          "type": "string"
766 768
        },
767 769
        "bg": {
768 770
          "description": "What plays behind the words: replay, the last moments of the chapter just played, slowed down, dimmed and silent (a flyby before the first chapter, where nothing's been played yet); flyby, a slow look round the next chapter's level; picture, the builder's own (see picture); plain, the game's theme.",
769 771
          "knownValues": [
770 772
            "replay",
771 773
            "flyby",
772 774
            "picture",
773 775
            "plain"
774 776
          ],
775 777
          "maxLength": 16,
776 778
          "type": "string"
777 779
        },
778 780
        "chapter": {
779 781
          "description": "For a scene before a chapter: which one, counting from 0 (0 is the opening, before the first chapter's card). For an ending (win or lose) in a game whose story branches: the ending for the way whose last chapter played was this one; the ending without a chapter plays wherever no way's own matches. Looks only.",
780 782
          "maximum": 59,
781 783
          "minimum": 0,
782 784
          "type": "integer"
783 785
        },
784 786
        "choices": {
785 787
          "description": "For a scene before a chapter: a choice of two or three ways, shown as buttons after its last line. Picking one plays where it goes instead of this scene's chapter. A reader that can't take every option (one going backward, past the last chapter, or to the ending from the opening) plays the scene without a choice. Where the ways go is part of play; their labels are words.",
786 788
          "items": {
787 789
            "ref": "#choice",
788 790
            "type": "ref"
789 791
          },
790 792
          "maxLength": 3,
791 793
          "minLength": 2,
792 794
          "type": "array"
793 795
        },
794 796
        "lines": {
795 797
          "description": "Typed out one at a time; the player moves on line by line.",
796 798
          "items": {
797 799
            "ref": "#sceneLine",
798 800
            "type": "ref"
799 801
          },
800 802
          "maxLength": 6,
801 803
          "type": "array"
802 804
        },
803 805
        "music": {
804 806
          "description": "A mood of music under the scene. Absent: none.",
805 807
          "knownValues": [
806 808
            "musicbox",
807 809
            "heartbeat",
808 810
            "unease",
809 811
            "dread",
810 812
            "tension",
811 813
            "groove",
812 814
            "pulse",
813 815
            "drift",
814 816
            "alarm",
815 817
            "island",
816 818
            "heist"
817 819
          ],
818 820
          "maxLength": 32,
819 821
          "type": "string"
820 822
        },
821 823
        "picture": {
822 824
          "accept": [
823 825
            "image/jpeg",
824 826
            "image/png"
825 827
          ],
826 828
          "description": "The builder's own picture for a picture background (at most 1600×900). Public once published. Looks only.",
827 829
          "maxSize": 716800,
828 830
          "type": "blob"
829 831
        },
830 832
        "sting": {
831 833
          "description": "A recorded sound as the scene opens: one of the horror pack's, or one of the game's own sounds as \"sound:<id>\". Absent: none.",
832 834
          "knownValues": [
833 835
            "creepy_hello",
834 836
            "creepy_laugh",
835 837
            "female_scream",
836 838
            "intrigue_event",
837 839
            "jump_scare",
838 840
            "jump_scare_horn",
839 841
            "lets_play"
840 842
          ],
841 843
          "maxLength": 32,
842 844
          "type": "string"
843 845
        },
844 846
        "title": {
845 847
          "maxGraphemes": 60,
846 848
          "maxLength": 240,
847 849
          "type": "string"
848 850
        }
849 851
      },
850 852
      "required": [
851 853
        "at",
852 854
        "bg"
853 855
      ],
854 856
      "type": "object"
855 857
    },
856 858
    "sceneLine": {
857 859
      "properties": {
858 860
        "text": {
859 861
          "maxGraphemes": 160,
860 862
          "maxLength": 640,
861 863
          "type": "string"
862 864
        },
863 865
        "who": {
864 866
          "description": "Who says it: one of the cast's slots (their photo and name show beside the line). Absent: narration.",
865 867
          "knownValues": [
866 868
            "hero1",
867 869
            "hero2",
868 870
            "hero3",
869 871
            "foe1",
870 872
            "foe2",
871 873
            "foe3",
872 874
            "foe4",
873 875
            "foe5",
874 876
            "foe6",
875 877
            "villain1",
876 878
            "villain2",
877 879
            "villain3",
878 880
            "extra1",
879 881
            "extra2",
880 882
            "extra3",
881 883
            "extra4"
882 884
          ],
883 885
          "maxLength": 16,
884 886
          "type": "string"
885 887
        }
886 888
      },
887 889
      "required": [
888 890
        "text"
889 891
      ],
890 892
      "type": "object"
891 893
    },
892 894
    "sound": {
893 895
      "description": "One of the builder's own sounds.",
894 896
      "properties": {
895 897
        "blob": {
896 898
          "accept": [
897 899
            "audio/*",
898 900
            "video/mp4"
899 901
          ],
900 902
          "description": "The sound: AAC in an MP4, or 16-bit PCM in a WAV, mono, at most five seconds and 200 KB. (A data server may name an MP4 video/mp4 or audio/x-m4a, and a WAV audio/x-wav or audio/vnd.wave, by its bytes.)",
901 903
          "maxSize": 204800,
902 904
          "type": "blob"
903 905
        },
904 906
        "id": {
905 907
          "description": "Lowercase letters and digits, unique in the game: how the rest of the record names it.",
906 908
          "maxLength": 12,
907 909
          "type": "string"
908 910
        },
909 911
        "mime": {
910 912
          "description": "What it is, as the maker made it.",
911 913
          "knownValues": [
912 914
            "audio/mp4",
913 915
            "audio/wav"
914 916
          ],
915 917
          "maxLength": 32,
916 918
          "type": "string"
917 919
        },
918 920
        "ms": {
919 921
          "description": "How long it is, in milliseconds.",
920 922
          "maximum": 5000,
921 923
          "minimum": 1,
922 924
          "type": "integer"
923 925
        },
924 926
        "name": {
925 927
          "description": "What the builder calls it (\"Grandpa's yell\").",
926 928
          "maxGraphemes": 40,
927 929
          "maxLength": 160,
928 930
          "type": "string"
929 931
        }
930 932
      },
931 933
      "required": [
932 934
        "id",
933 935
        "blob",
934 936
        "mime",
935 937
        "ms"
936 938
      ],
937 939
      "type": "object"
938 940
    },
939 941
    "starring": {
940 942
      "properties": {
941 943
        "as": {
942 944
          "description": "Who they play (\"Grandma\"), shown as \"as Grandma\".",
943 945
          "maxGraphemes": 40,
944 946
          "maxLength": 160,
945 947
          "type": "string"
946 948
        },
947 949
        "who": {
948 950
          "description": "One of the game's cast's slots.",
949 951
          "knownValues": [
950 952
            "hero1",
951 953
            "hero2",
952 954
            "hero3",
953 955
            "foe1",
954 956
            "foe2",
955 957
            "foe3",
956 958
            "foe4",
957 959
            "foe5",
958 960
            "foe6",
959 961
            "villain1",
960 962
            "villain2",
961 963
            "villain3",
962 964
            "extra1",
963 965
            "extra2",
964 966
            "extra3",
965 967
            "extra4"
966 968
          ],
967 969
          "maxLength": 16,
968 970
          "type": "string"
969 971
        }
970 972
      },
971 973
      "required": [
972 974
        "who"
973 975
      ],
974 976
      "type": "object"
975 977
    },
976 978
    "theme": {
977 979
      "properties": {
978 980
        "card": {
979 981
          "description": "The share card's layout: the game card (absent), a movie poster billing the cast (Haunt the Sky's), or a fight poster: faces in rings, VS, a red slash (Fight the Sky's). Looks only.",
980 982
          "knownValues": [
981 983
            "card",
982 984
            "poster",
983 985
            "fight"
984 986
          ],
985 987
          "type": "string"
986 988
        },
987 989
        "ladder": {
988 990
          "description": "Faces worn as Sky Vortex wears them: one face a web, in turn, and every face at once on a world's last web (the faces not cast in a part, then the people the player follows). Looks only.",
989 991
          "type": "boolean"
990 992
        },
991 993
        "mood": {
992 994
          "description": "How the chapters light their worlds.",
993 995
          "knownValues": [
994 996
            "bright",
995 997
            "dusk",
996 998
            "cold",
997 999
            "neon",
998 1000
            "space",
999 1001
            "horror",
1000 1002
            "retro"
1001 1003
          ],
1002 1004
          "type": "string"
1003 1005
        },
1004 1006
        "native": {
1005 1007
          "description": "Each level in its own look and song, where its chapter type has looks by level (the vortex's and the tank maze's worlds, the house's floors), as the standalone games show them; else the mood picks one look for the whole game. Looks only.",
1006 1008
          "type": "boolean"
1007 1009
        },
1008 1010
        "palette": {
1009 1011
          "description": "Five #rrggbb colors: the page, its panels, the accent, danger, and the words.",
1010 1012
          "items": {
1011 1013
            "maxLength": 7,
1012 1014
            "type": "string"
1013 1015
          },
1014 1016
          "maxLength": 5,
1015 1017
          "minLength": 5,
1016 1018
          "type": "array"
1017 1019
        },
1018 1020
        "pattern": {
1019 1021
          "knownValues": [
1020 1022
            "none",
1021 1023
            "grid",
1022 1024
            "stripes",
1023 1025
            "dots",
1024 1026
            "checks",
1025 1027
            "waves",
1026 1028
            "stars"
1027 1029
          ],
1028 1030
          "type": "string"
1029 1031
        },
1030 1032
        "preset": {
1031 1033
          "description": "The look it started from (haunted, neon, storybook, space, retro, frozen, sunset), or custom.",
1032 1034
          "maxLength": 20,
1033 1035
          "type": "string"
1034 1036
        },
1035 1037
        "title": {
1036 1038
          "description": "How the game's title is lettered: plain (absent), or in stripes from the palette (accent, words, white, words, accent: TRAN's flag). Looks only.",
1037 1039
          "knownValues": [
1038 1040
            "plain",
1039 1041
            "stripes"
1040 1042
          ],
1041 1043
          "type": "string"
1042 1044
        },
1043 1045
        "type": {
1044 1046
          "description": "The typeface for titles.",
1045 1047
          "knownValues": [
1046 1048
            "anton",
1047 1049
            "creepster",
1048 1050
            "inter"
1049 1051
          ],
1050 1052
          "type": "string"
1051 1053
        }
1052 1054
      },
1053 1055
      "required": [
1054 1056
        "palette",
1055 1057
        "pattern",
1056 1058
        "mood",
1057 1059
        "type"
1058 1060
      ],
1059 1061
      "type": "object"
1060 1062
    },
1061 1063
    "titleCard": {
1062 1064
      "properties": {
1063 1065
        "line": {
1064 1066
          "description": "A line under the title.",
1065 1067
          "maxGraphemes": 120,
1066 1068
          "maxLength": 480,
1067 1069
          "type": "string"
1068 1070
        },
1069 1071
        "picture": {
1070 1072
          "accept": [
1071 1073
            "image/jpeg",
1072 1074
            "image/png"
1073 1075
          ],
1074 1076
          "description": "The builder's picture for the card (at most 1600×900); absent, the game's logo if it has one. Public once published. Looks only.",
1075 1077
          "maxSize": 716800,
1076 1078
          "type": "blob"
1077 1079
        },
1078 1080
        "sound": {
1079 1081
          "description": "One of the game's own sounds (its id), played as the card fades in.",
1080 1082
          "maxLength": 12,
1081 1083
          "type": "string"
1082 1084
        },
1083 1085
        "title": {
1084 1086
          "description": "In place of the game's title on the card; absent, the game's own.",
1085 1087
          "maxGraphemes": 60,
1086 1088
          "maxLength": 240,
1087 1089
          "type": "string"
1088 1090
        }
1089 1091
      },
1090 1092
      "type": "object"
1091 1093
    },
1092 1094
    "weapon": {
1093 1095
      "description": "One of the builder's own weapons: what it's called, which built-in model it wears, and what it does. Every number is a whole number in its range (a reader clamps it).",
1094 1096
      "properties": {
1095 1097
        "damage": {
1096 1098
          "description": "Health off a guard per round that lands (a guard has 4 at the default toughness, the boss 28). Lethal weapons only.",
1097 1099
          "maximum": 10,
1098 1100
          "minimum": 1,
1099 1101
          "type": "integer"
1100 1102
        },
1101 1103
        "delay": {
1102 1104
          "description": "A non-lethal weapon's: 60 Hz ticks a guard staggers before it drops (0: at once).",
1103 1105
          "maximum": 300,
1104 1106
          "minimum": 0,
1105 1107
          "type": "integer"
1106 1108
        },
1107 1109
        "lethal": {
1108 1110
          "description": "False: a hit knocks a guard out (unconscious) instead of hurting it.",
1109 1111
          "type": "boolean"
1110 1112
        },
1111 1113
        "look": {
1112 1114
          "description": "The built-in model it wears. Looks only.",
1113 1115
          "knownValues": [
1114 1116
            "pistol",
1115 1117
            "silenced",
1116 1118
            "smg",
1117 1119
            "shotgun",
1118 1120
            "sniper",
1119 1121
            "taser",
1120 1122
            "tranq"
1121 1123
          ],
1122 1124
          "maxLength": 16,
1123 1125
          "type": "string"
1124 1126
        },
1125 1127
        "magazine": {
1126 1128
          "description": "Rounds (or charges) in a magazine.",
1127 1129
          "maximum": 60,
1128 1130
          "minimum": 1,
1129 1131
          "type": "integer"
1130 1132
        },
1131 1133
        "name": {
1132 1134
          "maxGraphemes": 24,
1133 1135
          "maxLength": 96,
1134 1136
          "type": "string"
1135 1137
        },
1136 1138
        "noise": {
1137 1139
          "description": "How far guards hear a shot, in squares (0: silent).",
1138 1140
          "maximum": 14,
1139 1141
          "minimum": 0,
1140 1142
          "type": "integer"
1141 1143
        },
1142 1144
        "pellets": {
1143 1145
          "description": "Rounds a pull of the trigger (a shotgun's several).",
1144 1146
          "maximum": 9,
1145 1147
          "minimum": 1,
1146 1148
          "type": "integer"
1147 1149
        },
1148 1150
        "range": {
1149 1151
          "description": "How far a round goes, in squares.",
1150 1152
          "maximum": 24,
1151 1153
          "minimum": 1,
1152 1154
          "type": "integer"
1153 1155
        },
1154 1156
        "rate": {
1155 1157
          "description": "60 Hz ticks between shots.",
1156 1158
          "maximum": 120,
1157 1159
          "minimum": 4,
1158 1160
          "type": "integer"
1159 1161
        },
1160 1162
        "reload": {
1161 1163
          "description": "60 Hz ticks to reload.",
1162 1164
          "maximum": 300,
1163 1165
          "minimum": 20,
1164 1166
          "type": "integer"
1165 1167
        },
1166 1168
        "skin": {
1167 1169
          "accept": [
1168 1170
            "image/jpeg",
1169 1171
            "image/png"
1170 1172
          ],
1171 1173
          "description": "The builder's picture on its body (a square JPEG, 256×256, at most 120 KB). Public once published. Looks only.",
1172 1174
          "maxSize": 122880,
1173 1175
          "type": "blob"
1174 1176
        },
1175 1177
        "spare": {
1176 1178
          "description": "Spare magazines carried at the start.",
1177 1179
          "maximum": 9,
1178 1180
          "minimum": 0,
1179 1181
          "type": "integer"
1180 1182
        },
1181 1183
        "spread": {
1182 1184
          "description": "How far a round can stray either way, in 1024ths of a turn.",
1183 1185
          "maximum": 60,
1184 1186
          "minimum": 0,
1185 1187
          "type": "integer"
1186 1188
        }
1187 1189
      },
1188 1190
      "required": [
1189 1191
        "name",
1190 1192
        "look",
1191 1193
        "damage",
1192 1194
        "rate",
1193 1195
        "range",
1194 1196
        "magazine",
1195 1197
        "lethal"
1196 1198
      ],
1197 1199
      "type": "object"
1198 1200
    }
1199 1201
  },
1200 1202
  "id": "com.gamethesky.make.game",
1201 1203
  "lexicon": 1
1202 1204
}

Compare Other Versions

Lexicon Garden

@