com.gamethesky.make.game

gamethesky.com

Schema Diff

+5 -2

From

CID
bafyreihzb4bzogr...
Indexed At
2026-10-24 05:36 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\"]", 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\"]", 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). 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 -
            "chase"
74 +
            "chase",
75 +
            "kart",
76 +
            "grift",
77 +
            "f47"
75 78
          ],
76 79
          "maxLength": 32,
77 80
          "type": "string"
78 81
        },
79 82
        "next": {
80 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.",
81 84
          "maxLength": 8,
82 85
          "type": "string"
83 86
        },
84 87
        "pictures": {
85 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.",
86 89
          "type": "unknown"
87 90
        },
88 91
        "posters": {
89 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.",
90 93
          "items": {
91 94
            "ref": "#poster",
92 95
            "type": "ref"
93 96
          },
94 97
          "maxLength": 24,
95 98
          "type": "array"
96 99
        },
97 100
        "preset": {
98 101
          "description": "The module's own level to start from (or, with a drawn level, the look it's drawn in).",
99 102
          "maxLength": 32,
100 103
          "type": "string"
101 104
        },
102 105
        "quiz": {
103 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.",
104 107
          "items": {
105 108
            "ref": "#question",
106 109
            "type": "ref"
107 110
          },
108 111
          "maxLength": 20,
109 112
          "type": "array"
110 113
        },
111 114
        "rivals": {
112 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.",
113 116
          "knownValues": [
114 117
            "cast",
115 118
            "follows",
116 119
            "both"
117 120
          ],
118 121
          "maxLength": 16,
119 122
          "type": "string"
120 123
        },
121 124
        "settings": {
122 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).",
123 126
          "type": "unknown"
124 127
        },
125 128
        "sounds": {
126 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.",
127 130
          "type": "unknown"
128 131
        },
129 132
        "textures": {
130 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.",
131 134
          "type": "unknown"
132 135
        },
133 136
        "title": {
134 137
          "maxGraphemes": 40,
135 138
          "maxLength": 160,
136 139
          "type": "string"
137 140
        },
138 141
        "version": {
139 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.",
140 143
          "minimum": 1,
141 144
          "type": "integer"
142 145
        },
143 146
        "words": {
144 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.",
145 148
          "type": "unknown"
146 149
        },
147 150
        "world": {
148 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.",
149 152
          "maxGraphemes": 40,
150 153
          "maxLength": 160,
151 154
          "type": "string"
152 155
        }
153 156
      },
154 157
      "required": [
155 158
        "module",
156 159
        "version",
157 160
        "title",
158 161
        "preset",
159 162
        "settings"
160 163
      ],
161 164
      "type": "object"
162 165
    },
163 166
    "choice": {
164 167
      "description": "One way on from a scene's choice.",
165 168
      "properties": {
166 169
        "label": {
167 170
          "description": "What the button says. Words only: a hidden game's read \"Option 1\", \"Option 2\"…",
168 171
          "maxGraphemes": 60,
169 172
          "maxLength": 240,
170 173
          "type": "string"
171 174
        },
172 175
        "to": {
173 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.",
174 177
          "maxLength": 8,
175 178
          "type": "string"
176 179
        }
177 180
      },
178 181
      "required": [
179 182
        "label",
180 183
        "to"
181 184
      ],
182 185
      "type": "object"
183 186
    },
184 187
    "credits": {
185 188
      "properties": {
186 189
        "lines": {
187 190
          "description": "The builder's own lines (\"Made by Todd for the Lambert family reunion\").",
188 191
          "items": {
189 192
            "maxGraphemes": 80,
190 193
            "maxLength": 320,
191 194
            "type": "string"
192 195
          },
193 196
          "maxLength": 12,
194 197
          "type": "array"
195 198
        },
196 199
        "loop": {
197 200
          "description": "The credits' sound plays over and over under the whole roll (a music bed).",
198 201
          "type": "boolean"
199 202
        },
200 203
        "picture": {
201 204
          "accept": [
202 205
            "image/jpeg",
203 206
            "image/png"
204 207
          ],
205 208
          "description": "A picture at the end of the roll (at most 1600×900). Public once published. Looks only.",
206 209
          "maxSize": 716800,
207 210
          "type": "blob"
208 211
        },
209 212
        "sound": {
210 213
          "description": "One of the game's own sounds (its id), played as the credits start to roll.",
211 214
          "maxLength": 12,
212 215
          "type": "string"
213 216
        },
214 217
        "starring": {
215 218
          "description": "The cast, in order, each once: shown with their photo and the name they go by in the game.",
216 219
          "items": {
217 220
            "ref": "#starring",
218 221
            "type": "ref"
219 222
          },
220 223
          "maxLength": 15,
221 224
          "type": "array"
222 225
        }
223 226
      },
224 227
      "type": "object"
225 228
    },
226 229
    "gift": {
227 230
      "properties": {
228 231
        "as": {
229 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.",
230 233
          "knownValues": [
231 234
            "hero1",
232 235
            "hero2",
233 236
            "hero3",
234 237
            "foe1",
235 238
            "foe2",
236 239
            "foe3",
237 240
            "foe4",
238 241
            "foe5",
239 242
            "foe6",
240 243
            "villain1",
241 244
            "villain2",
242 245
            "villain3",
243 246
            "extra1",
244 247
            "extra2",
245 248
            "extra3",
246 249
            "extra4"
247 250
          ],
248 251
          "maxLength": 16,
249 252
          "type": "string"
250 253
        },
251 254
        "from": {
252 255
          "description": "Who it's from, as they'd sign it; absent, the card names the account that made it.",
253 256
          "maxGraphemes": 40,
254 257
          "maxLength": 160,
255 258
          "type": "string"
256 259
        },
257 260
        "message": {
258 261
          "description": "The builder's message to them (\"Happy 50th, Ray! Love, Todd\"), shown on the gift card.",
259 262
          "maxGraphemes": 300,
260 263
          "maxLength": 1200,
261 264
          "type": "string"
262 265
        },
263 266
        "to": {
264 267
          "description": "Who the game is for, by the name they go by (\"Ray\").",
265 268
          "maxGraphemes": 40,
266 269
          "maxLength": 160,
267 270
          "type": "string"
268 271
        }
269 272
      },
270 273
      "required": [
271 274
        "to",
272 275
        "message"
273 276
      ],
274 277
      "type": "object"
275 278
    },
276 279
    "huntRoom": {
277 280
      "properties": {
278 281
        "name": {
279 282
          "description": "What the picture is called (\"Grandma's kitchen\"). Looks only.",
280 283
          "maxGraphemes": 40,
281 284
          "maxLength": 160,
282 285
          "type": "string"
283 286
        },
284 287
        "pic": {
285 288
          "description": "Which of the chapter's pictures it is (its pictures' room1 to room5).",
286 289
          "maximum": 5,
287 290
          "minimum": 1,
288 291
          "type": "integer"
289 292
        },
290 293
        "targets": {
291 294
          "items": {
292 295
            "ref": "#huntTarget",
293 296
            "type": "ref"
294 297
          },
295 298
          "maxLength": 8,
296 299
          "minLength": 1,
297 300
          "type": "array"
298 301
        }
299 302
      },
300 303
      "required": [
301 304
        "pic",
302 305
        "targets"
303 306
      ],
304 307
      "type": "object"
305 308
    },
306 309
    "huntTarget": {
307 310
      "properties": {
308 311
        "label": {
309 312
          "description": "What it is, on the list of what to find (\"Grandpa\", \"the cat\"). Looks only.",
310 313
          "maxGraphemes": 40,
311 314
          "maxLength": 160,
312 315
          "type": "string"
313 316
        },
314 317
        "r": {
315 318
          "description": "How far from its middle a tap still finds it, in the same space.",
316 319
          "maximum": 250,
317 320
          "minimum": 12,
318 321
          "type": "integer"
319 322
        },
320 323
        "s": {
321 324
          "description": "How tall the cast member stands, in the picture's space. Looks only.",
322 325
          "maximum": 800,
323 326
          "minimum": 40,
324 327
          "type": "integer"
325 328
        },
326 329
        "who": {
327 330
          "description": "One of the game's cast (any slot) stood in the picture here as a cut-out, to be found. Looks only.",
328 331
          "knownValues": [
329 332
            "hero1",
330 333
            "hero2",
331 334
            "hero3",
332 335
            "foe1",
333 336
            "foe2",
334 337
            "foe3",
335 338
            "foe4",
336 339
            "foe5",
337 340
            "foe6",
338 341
            "villain1",
339 342
            "villain2",
340 343
            "villain3",
341 344
            "extra1",
342 345
            "extra2",
343 346
            "extra3",
344 347
            "extra4"
345 348
          ],
346 349
          "maxLength": 16,
347 350
          "type": "string"
348 351
        },
349 352
        "x": {
350 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.",
351 354
          "maximum": 999,
352 355
          "minimum": 0,
353 356
          "type": "integer"
354 357
        },
355 358
        "y": {
356 359
          "description": "Its middle, down the picture, in the same space.",
357 360
          "maximum": 999,
358 361
          "minimum": 0,
359 362
          "type": "integer"
360 363
        }
361 364
      },
362 365
      "required": [
363 366
        "x",
364 367
        "y",
365 368
        "r",
366 369
        "label"
367 370
      ],
368 371
      "type": "object"
369 372
    },
370 373
    "level": {
371 374
      "properties": {
372 375
        "rows": {
373 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.",
374 377
          "items": {
375 378
            "maxLength": 160,
376 379
            "type": "string"
377 380
          },
378 381
          "maxLength": 24,
379 382
          "minLength": 8,
380 383
          "type": "array"
381 384
        }
382 385
      },
383 386
      "required": [
384 387
        "rows"
385 388
      ],
386 389
      "type": "object"
387 390
    },
388 391
    "main": {
389 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.",
390 393
      "key": "tid",
391 394
      "record": {
392 395
        "properties": {
393 396
          "builds": {
394 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.",
395 398
            "type": "boolean"
396 399
          },
397 400
          "campaign": {
398 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.",
399 402
            "type": "boolean"
400 403
          },
401 404
          "carryLives": {
402 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.",
403 406
            "type": "boolean"
404 407
          },
405 408
          "cast": {
406 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.",
407 410
            "items": {
408 411
              "ref": "#member",
409 412
              "type": "ref"
410 413
            },
411 414
            "maxLength": 16,
412 415
            "type": "array"
413 416
          },
414 417
          "chapters": {
415 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.",
416 419
            "items": {
417 420
              "ref": "#chapter",
418 421
              "type": "ref"
419 422
            },
420 423
            "maxLength": 60,
421 424
            "minLength": 1,
422 425
            "type": "array"
423 426
          },
424 427
          "cover": {
425 428
            "accept": [
426 429
              "image/jpeg",
427 430
              "image/png"
428 431
            ],
429 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.",
430 433
            "maxSize": 614400,
431 434
            "type": "blob"
432 435
          },
433 436
          "createdAt": {
434 437
            "format": "datetime",
435 438
            "type": "string"
436 439
          },
437 440
          "credits": {
438 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.",
439 442
            "ref": "#credits",
440 443
            "type": "ref"
441 444
          },
442 445
          "daily": {
443 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.",
444 447
            "type": "boolean"
445 448
          },
446 449
          "description": {
447 450
            "maxGraphemes": 200,
448 451
            "maxLength": 800,
449 452
            "type": "string"
450 453
          },
451 454
          "ghost": {
452 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.",
453 456
            "type": "boolean"
454 457
          },
455 458
          "ghostFights": {
456 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.",
457 460
            "type": "boolean"
458 461
          },
459 462
          "gift": {
460 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.",
461 464
            "ref": "#gift",
462 465
            "type": "ref"
463 466
          },
464 467
          "granny": {
465 468
            "description": "With levels: a fourth level, Granny, easier than Easy (a board of its own). Part of play.",
466 469
            "type": "boolean"
467 470
          },
468 471
          "levels": {
469 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.",
470 473
            "type": "boolean"
471 474
          },
472 475
          "logo": {
473 476
            "accept": [
474 477
              "image/png",
475 478
              "image/jpeg"
476 479
            ],
477 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.",
478 481
            "maxSize": 409600,
479 482
            "type": "blob"
480 483
          },
481 484
          "remixOf": {
482 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.",
483 486
            "ref": "com.atproto.repo.strongRef",
484 487
            "type": "ref"
485 488
          },
486 489
          "rivals": {
487 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.",
488 491
            "knownValues": [
489 492
              "cast",
490 493
              "follows",
491 494
              "both"
492 495
            ],
493 496
            "maxLength": 16,
494 497
            "type": "string"
495 498
          },
496 499
          "scenes": {
497 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.",
498 501
            "items": {
499 502
              "ref": "#scene",
500 503
              "type": "ref"
501 504
            },
502 505
            "maxLength": 62,
503 506
            "type": "array"
504 507
          },
505 508
          "sounds": {
506 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.",
507 510
            "items": {
508 511
              "ref": "#sound",
509 512
              "type": "ref"
510 513
            },
511 514
            "maxLength": 8,
512 515
            "type": "array"
513 516
          },
514 517
          "theme": {
515 518
            "ref": "#theme",
516 519
            "type": "ref"
517 520
          },
518 521
          "title": {
519 522
            "maxGraphemes": 60,
520 523
            "maxLength": 240,
521 524
            "type": "string"
522 525
          },
523 526
          "titleCard": {
524 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.",
525 528
            "ref": "#titleCard",
526 529
            "type": "ref"
527 530
          },
528 531
          "video": {
529 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.",
530 533
            "type": "boolean"
531 534
          },
532 535
          "weapons": {
533 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.",
534 537
            "items": {
535 538
              "ref": "#weapon",
536 539
              "type": "ref"
537 540
            },
538 541
            "maxLength": 8,
539 542
            "type": "array"
540 543
          },
541 544
          "worldLife": {
542 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.",
543 546
            "type": "boolean"
544 547
          }
545 548
        },
546 549
        "required": [
547 550
          "title",
548 551
          "theme",
549 552
          "chapters",
550 553
          "createdAt"
551 554
        ],
552 555
        "type": "object"
553 556
      },
554 557
      "type": "record"
555 558
    },
556 559
    "member": {
557 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.",
558 561
      "properties": {
559 562
        "body": {
560 563
          "accept": [
561 564
            "image/png"
562 565
          ],
563 566
          "description": "A cut-out PNG of them head to toe, the background clear. 192 KB at most.",
564 567
          "maxSize": 196608,
565 568
          "type": "blob"
566 569
        },
567 570
        "face": {
568 571
          "accept": [
569 572
            "image/jpeg"
570 573
          ],
571 574
          "description": "A 256×256 JPEG of their face. 192 KB at most.",
572 575
          "maxSize": 196608,
573 576
          "type": "blob"
574 577
        },
575 578
        "handle": {
576 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.",
577 580
          "format": "handle",
578 581
          "type": "string"
579 582
        },
580 583
        "name": {
581 584
          "maxGraphemes": 40,
582 585
          "maxLength": 160,
583 586
          "type": "string"
584 587
        },
585 588
        "slot": {
586 589
          "description": "Which slot they're in: hero1 (you), hero2–3, foe1–6, villain1–3, extra1–4.",
587 590
          "knownValues": [
588 591
            "hero1",
589 592
            "hero2",
590 593
            "hero3",
591 594
            "foe1",
592 595
            "foe2",
593 596
            "foe3",
594 597
            "foe4",
595 598
            "foe5",
596 599
            "foe6",
597 600
            "villain1",
598 601
            "villain2",
599 602
            "villain3",
600 603
            "extra1",
601 604
            "extra2",
602 605
            "extra3",
603 606
            "extra4"
604 607
          ],
605 608
          "maxLength": 16,
606 609
          "type": "string"
607 610
        }
608 611
      },
609 612
      "required": [
610 613
        "slot",
611 614
        "name"
612 615
      ],
613 616
      "type": "object"
614 617
    },
615 618
    "message": {
616 619
      "properties": {
617 620
        "again": {
618 621
          "description": "Shown every time the player steps back onto it, not only the first.",
619 622
          "type": "boolean"
620 623
        },
621 624
        "sting": {
622 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>\".",
623 626
          "knownValues": [
624 627
            "creepy_hello",
625 628
            "creepy_laugh",
626 629
            "female_scream",
627 630
            "intrigue_event",
628 631
            "jump_scare",
629 632
            "jump_scare_horn",
630 633
            "lets_play",
631 634
            "radio"
632 635
          ],
633 636
          "maxLength": 32,
634 637
          "type": "string"
635 638
        },
636 639
        "text": {
637 640
          "maxGraphemes": 160,
638 641
          "maxLength": 640,
639 642
          "type": "string"
640 643
        },
641 644
        "who": {
642 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.",
643 646
          "knownValues": [
644 647
            "hero1",
645 648
            "hero2",
646 649
            "hero3",
647 650
            "foe1",
648 651
            "foe2",
649 652
            "foe3",
650 653
            "foe4",
651 654
            "foe5",
652 655
            "foe6",
653 656
            "villain1",
654 657
            "villain2",
655 658
            "villain3",
656 659
            "extra1",
657 660
            "extra2",
658 661
            "extra3",
659 662
            "extra4"
660 663
          ],
661 664
          "maxLength": 16,
662 665
          "type": "string"
663 666
        },
664 667
        "x": {
665 668
          "description": "The square's column, as the level's rows have it.",
666 669
          "minimum": 0,
667 670
          "type": "integer"
668 671
        },
669 672
        "y": {
670 673
          "description": "The square's row.",
671 674
          "minimum": 0,
672 675
          "type": "integer"
673 676
        }
674 677
      },
675 678
      "required": [
676 679
        "x",
677 680
        "y",
678 681
        "text"
679 682
      ],
680 683
      "type": "object"
681 684
    },
682 685
    "poster": {
683 686
      "properties": {
684 687
        "pic": {
685 688
          "description": "Which of the chapter's poster pictures it shows: 1 is pictures.poster1, and so on.",
686 689
          "maximum": 6,
687 690
          "minimum": 1,
688 691
          "type": "integer"
689 692
        },
690 693
        "x": {
691 694
          "description": "The wall square's column, as the level's rows have it (the drawn level's, or the preset's own map).",
692 695
          "minimum": 0,
693 696
          "type": "integer"
694 697
        },
695 698
        "y": {
696 699
          "description": "The wall square's row.",
697 700
          "minimum": 0,
698 701
          "type": "integer"
699 702
        }
700 703
      },
701 704
      "required": [
702 705
        "x",
703 706
        "y",
704 707
        "pic"
705 708
      ],
706 709
      "type": "object"
707 710
    },
708 711
    "question": {
709 712
      "properties": {
710 713
        "answers": {
711 714
          "description": "Two to four answers, shown in this order.",
712 715
          "items": {
713 716
            "maxGraphemes": 60,
714 717
            "maxLength": 240,
715 718
            "type": "string"
716 719
          },
717 720
          "maxLength": 4,
718 721
          "minLength": 2,
719 722
          "type": "array"
720 723
        },
721 724
        "pic": {
722 725
          "description": "The chapter's picture shown with it (its pictures' q1 to q20). Looks only.",
723 726
          "maximum": 20,
724 727
          "minimum": 1,
725 728
          "type": "integer"
726 729
        },
727 730
        "q": {
728 731
          "description": "What's asked (\"What year did Grandpa buy the station wagon?\").",
729 732
          "maxGraphemes": 160,
730 733
          "maxLength": 640,
731 734
          "type": "string"
732 735
        },
733 736
        "right": {
734 737
          "description": "Which answer is right, counting from 0.",
735 738
          "maximum": 3,
736 739
          "minimum": 0,
737 740
          "type": "integer"
738 741
        },
739 742
        "time": {
740 743
          "description": "Its own clock in seconds, in place of the chapter's setting.",
741 744
          "maximum": 60,
742 745
          "minimum": 5,
743 746
          "type": "integer"
744 747
        }
745 748
      },
746 749
      "required": [
747 750
        "q",
748 751
        "answers",
749 752
        "right"
750 753
      ],
751 754
      "type": "object"
752 755
    },
753 756
    "scene": {
754 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.",
755 758
      "properties": {
756 759
        "at": {
757 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.",
758 761
          "knownValues": [
759 762
            "before",
760 763
            "win",
761 764
            "lose"
762 765
          ],
763 766
          "maxLength": 16,
764 767
          "type": "string"
765 768
        },
766 769
        "bg": {
767 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.",
768 771
          "knownValues": [
769 772
            "replay",
770 773
            "flyby",
771 774
            "picture",
772 775
            "plain"
773 776
          ],
774 777
          "maxLength": 16,
775 778
          "type": "string"
776 779
        },
777 780
        "chapter": {
778 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.",
779 782
          "maximum": 59,
780 783
          "minimum": 0,
781 784
          "type": "integer"
782 785
        },
783 786
        "choices": {
784 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.",
785 788
          "items": {
786 789
            "ref": "#choice",
787 790
            "type": "ref"
788 791
          },
789 792
          "maxLength": 3,
790 793
          "minLength": 2,
791 794
          "type": "array"
792 795
        },
793 796
        "lines": {
794 797
          "description": "Typed out one at a time; the player moves on line by line.",
795 798
          "items": {
796 799
            "ref": "#sceneLine",
797 800
            "type": "ref"
798 801
          },
799 802
          "maxLength": 6,
800 803
          "type": "array"
801 804
        },
802 805
        "music": {
803 806
          "description": "A mood of music under the scene. Absent: none.",
804 807
          "knownValues": [
805 808
            "musicbox",
806 809
            "heartbeat",
807 810
            "unease",
808 811
            "dread",
809 812
            "tension",
810 813
            "groove",
811 814
            "pulse",
812 815
            "drift",
813 816
            "alarm",
814 817
            "island",
815 818
            "heist"
816 819
          ],
817 820
          "maxLength": 32,
818 821
          "type": "string"
819 822
        },
820 823
        "picture": {
821 824
          "accept": [
822 825
            "image/jpeg",
823 826
            "image/png"
824 827
          ],
825 828
          "description": "The builder's own picture for a picture background (at most 1600×900). Public once published. Looks only.",
826 829
          "maxSize": 716800,
827 830
          "type": "blob"
828 831
        },
829 832
        "sting": {
830 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.",
831 834
          "knownValues": [
832 835
            "creepy_hello",
833 836
            "creepy_laugh",
834 837
            "female_scream",
835 838
            "intrigue_event",
836 839
            "jump_scare",
837 840
            "jump_scare_horn",
838 841
            "lets_play"
839 842
          ],
840 843
          "maxLength": 32,
841 844
          "type": "string"
842 845
        },
843 846
        "title": {
844 847
          "maxGraphemes": 60,
845 848
          "maxLength": 240,
846 849
          "type": "string"
847 850
        }
848 851
      },
849 852
      "required": [
850 853
        "at",
851 854
        "bg"
852 855
      ],
853 856
      "type": "object"
854 857
    },
855 858
    "sceneLine": {
856 859
      "properties": {
857 860
        "text": {
858 861
          "maxGraphemes": 160,
859 862
          "maxLength": 640,
860 863
          "type": "string"
861 864
        },
862 865
        "who": {
863 866
          "description": "Who says it: one of the cast's slots (their photo and name show beside the line). Absent: narration.",
864 867
          "knownValues": [
865 868
            "hero1",
866 869
            "hero2",
867 870
            "hero3",
868 871
            "foe1",
869 872
            "foe2",
870 873
            "foe3",
871 874
            "foe4",
872 875
            "foe5",
873 876
            "foe6",
874 877
            "villain1",
875 878
            "villain2",
876 879
            "villain3",
877 880
            "extra1",
878 881
            "extra2",
879 882
            "extra3",
880 883
            "extra4"
881 884
          ],
882 885
          "maxLength": 16,
883 886
          "type": "string"
884 887
        }
885 888
      },
886 889
      "required": [
887 890
        "text"
888 891
      ],
889 892
      "type": "object"
890 893
    },
891 894
    "sound": {
892 895
      "description": "One of the builder's own sounds.",
893 896
      "properties": {
894 897
        "blob": {
895 898
          "accept": [
896 899
            "audio/*",
897 900
            "video/mp4"
898 901
          ],
899 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.)",
900 903
          "maxSize": 204800,
901 904
          "type": "blob"
902 905
        },
903 906
        "id": {
904 907
          "description": "Lowercase letters and digits, unique in the game: how the rest of the record names it.",
905 908
          "maxLength": 12,
906 909
          "type": "string"
907 910
        },
908 911
        "mime": {
909 912
          "description": "What it is, as the maker made it.",
910 913
          "knownValues": [
911 914
            "audio/mp4",
912 915
            "audio/wav"
913 916
          ],
914 917
          "maxLength": 32,
915 918
          "type": "string"
916 919
        },
917 920
        "ms": {
918 921
          "description": "How long it is, in milliseconds.",
919 922
          "maximum": 5000,
920 923
          "minimum": 1,
921 924
          "type": "integer"
922 925
        },
923 926
        "name": {
924 927
          "description": "What the builder calls it (\"Grandpa's yell\").",
925 928
          "maxGraphemes": 40,
926 929
          "maxLength": 160,
927 930
          "type": "string"
928 931
        }
929 932
      },
930 933
      "required": [
931 934
        "id",
932 935
        "blob",
933 936
        "mime",
934 937
        "ms"
935 938
      ],
936 939
      "type": "object"
937 940
    },
938 941
    "starring": {
939 942
      "properties": {
940 943
        "as": {
941 944
          "description": "Who they play (\"Grandma\"), shown as \"as Grandma\".",
942 945
          "maxGraphemes": 40,
943 946
          "maxLength": 160,
944 947
          "type": "string"
945 948
        },
946 949
        "who": {
947 950
          "description": "One of the game's cast's slots.",
948 951
          "knownValues": [
949 952
            "hero1",
950 953
            "hero2",
951 954
            "hero3",
952 955
            "foe1",
953 956
            "foe2",
954 957
            "foe3",
955 958
            "foe4",
956 959
            "foe5",
957 960
            "foe6",
958 961
            "villain1",
959 962
            "villain2",
960 963
            "villain3",
961 964
            "extra1",
962 965
            "extra2",
963 966
            "extra3",
964 967
            "extra4"
965 968
          ],
966 969
          "maxLength": 16,
967 970
          "type": "string"
968 971
        }
969 972
      },
970 973
      "required": [
971 974
        "who"
972 975
      ],
973 976
      "type": "object"
974 977
    },
975 978
    "theme": {
976 979
      "properties": {
977 980
        "card": {
978 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.",
979 982
          "knownValues": [
980 983
            "card",
981 984
            "poster",
982 985
            "fight"
983 986
          ],
984 987
          "type": "string"
985 988
        },
986 989
        "ladder": {
987 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.",
988 991
          "type": "boolean"
989 992
        },
990 993
        "mood": {
991 994
          "description": "How the chapters light their worlds.",
992 995
          "knownValues": [
993 996
            "bright",
994 997
            "dusk",
995 998
            "cold",
996 999
            "neon",
997 1000
            "space",
998 1001
            "horror",
999 1002
            "retro"
1000 1003
          ],
1001 1004
          "type": "string"
1002 1005
        },
1003 1006
        "native": {
1004 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.",
1005 1008
          "type": "boolean"
1006 1009
        },
1007 1010
        "palette": {
1008 1011
          "description": "Five #rrggbb colors: the page, its panels, the accent, danger, and the words.",
1009 1012
          "items": {
1010 1013
            "maxLength": 7,
1011 1014
            "type": "string"
1012 1015
          },
1013 1016
          "maxLength": 5,
1014 1017
          "minLength": 5,
1015 1018
          "type": "array"
1016 1019
        },
1017 1020
        "pattern": {
1018 1021
          "knownValues": [
1019 1022
            "none",
1020 1023
            "grid",
1021 1024
            "stripes",
1022 1025
            "dots",
1023 1026
            "checks",
1024 1027
            "waves",
1025 1028
            "stars"
1026 1029
          ],
1027 1030
          "type": "string"
1028 1031
        },
1029 1032
        "preset": {
1030 1033
          "description": "The look it started from (haunted, neon, storybook, space, retro, frozen, sunset), or custom.",
1031 1034
          "maxLength": 20,
1032 1035
          "type": "string"
1033 1036
        },
1034 1037
        "title": {
1035 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.",
1036 1039
          "knownValues": [
1037 1040
            "plain",
1038 1041
            "stripes"
1039 1042
          ],
1040 1043
          "type": "string"
1041 1044
        },
1042 1045
        "type": {
1043 1046
          "description": "The typeface for titles.",
1044 1047
          "knownValues": [
1045 1048
            "anton",
1046 1049
            "creepster",
1047 1050
            "inter"
1048 1051
          ],
1049 1052
          "type": "string"
1050 1053
        }
1051 1054
      },
1052 1055
      "required": [
1053 1056
        "palette",
1054 1057
        "pattern",
1055 1058
        "mood",
1056 1059
        "type"
1057 1060
      ],
1058 1061
      "type": "object"
1059 1062
    },
1060 1063
    "titleCard": {
1061 1064
      "properties": {
1062 1065
        "line": {
1063 1066
          "description": "A line under the title.",
1064 1067
          "maxGraphemes": 120,
1065 1068
          "maxLength": 480,
1066 1069
          "type": "string"
1067 1070
        },
1068 1071
        "picture": {
1069 1072
          "accept": [
1070 1073
            "image/jpeg",
1071 1074
            "image/png"
1072 1075
          ],
1073 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.",
1074 1077
          "maxSize": 716800,
1075 1078
          "type": "blob"
1076 1079
        },
1077 1080
        "sound": {
1078 1081
          "description": "One of the game's own sounds (its id), played as the card fades in.",
1079 1082
          "maxLength": 12,
1080 1083
          "type": "string"
1081 1084
        },
1082 1085
        "title": {
1083 1086
          "description": "In place of the game's title on the card; absent, the game's own.",
1084 1087
          "maxGraphemes": 60,
1085 1088
          "maxLength": 240,
1086 1089
          "type": "string"
1087 1090
        }
1088 1091
      },
1089 1092
      "type": "object"
1090 1093
    },
1091 1094
    "weapon": {
1092 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).",
1093 1096
      "properties": {
1094 1097
        "damage": {
1095 1098
          "description": "Health off a guard per round that lands (a guard has 4 at the default toughness, the boss 28). Lethal weapons only.",
1096 1099
          "maximum": 10,
1097 1100
          "minimum": 1,
1098 1101
          "type": "integer"
1099 1102
        },
1100 1103
        "delay": {
1101 1104
          "description": "A non-lethal weapon's: 60 Hz ticks a guard staggers before it drops (0: at once).",
1102 1105
          "maximum": 300,
1103 1106
          "minimum": 0,
1104 1107
          "type": "integer"
1105 1108
        },
1106 1109
        "lethal": {
1107 1110
          "description": "False: a hit knocks a guard out (unconscious) instead of hurting it.",
1108 1111
          "type": "boolean"
1109 1112
        },
1110 1113
        "look": {
1111 1114
          "description": "The built-in model it wears. Looks only.",
1112 1115
          "knownValues": [
1113 1116
            "pistol",
1114 1117
            "silenced",
1115 1118
            "smg",
1116 1119
            "shotgun",
1117 1120
            "sniper",
1118 1121
            "taser",
1119 1122
            "tranq"
1120 1123
          ],
1121 1124
          "maxLength": 16,
1122 1125
          "type": "string"
1123 1126
        },
1124 1127
        "magazine": {
1125 1128
          "description": "Rounds (or charges) in a magazine.",
1126 1129
          "maximum": 60,
1127 1130
          "minimum": 1,
1128 1131
          "type": "integer"
1129 1132
        },
1130 1133
        "name": {
1131 1134
          "maxGraphemes": 24,
1132 1135
          "maxLength": 96,
1133 1136
          "type": "string"
1134 1137
        },
1135 1138
        "noise": {
1136 1139
          "description": "How far guards hear a shot, in squares (0: silent).",
1137 1140
          "maximum": 14,
1138 1141
          "minimum": 0,
1139 1142
          "type": "integer"
1140 1143
        },
1141 1144
        "pellets": {
1142 1145
          "description": "Rounds a pull of the trigger (a shotgun's several).",
1143 1146
          "maximum": 9,
1144 1147
          "minimum": 1,
1145 1148
          "type": "integer"
1146 1149
        },
1147 1150
        "range": {
1148 1151
          "description": "How far a round goes, in squares.",
1149 1152
          "maximum": 24,
1150 1153
          "minimum": 1,
1151 1154
          "type": "integer"
1152 1155
        },
1153 1156
        "rate": {
1154 1157
          "description": "60 Hz ticks between shots.",
1155 1158
          "maximum": 120,
1156 1159
          "minimum": 4,
1157 1160
          "type": "integer"
1158 1161
        },
1159 1162
        "reload": {
1160 1163
          "description": "60 Hz ticks to reload.",
1161 1164
          "maximum": 300,
1162 1165
          "minimum": 20,
1163 1166
          "type": "integer"
1164 1167
        },
1165 1168
        "skin": {
1166 1169
          "accept": [
1167 1170
            "image/jpeg",
1168 1171
            "image/png"
1169 1172
          ],
1170 1173
          "description": "The builder's picture on its body (a square JPEG, 256×256, at most 120 KB). Public once published. Looks only.",
1171 1174
          "maxSize": 122880,
1172 1175
          "type": "blob"
1173 1176
        },
1174 1177
        "spare": {
1175 1178
          "description": "Spare magazines carried at the start.",
1176 1179
          "maximum": 9,
1177 1180
          "minimum": 0,
1178 1181
          "type": "integer"
1179 1182
        },
1180 1183
        "spread": {
1181 1184
          "description": "How far a round can stray either way, in 1024ths of a turn.",
1182 1185
          "maximum": 60,
1183 1186
          "minimum": 0,
1184 1187
          "type": "integer"
1185 1188
        }
1186 1189
      },
1187 1190
      "required": [
1188 1191
        "name",
1189 1192
        "look",
1190 1193
        "damage",
1191 1194
        "rate",
1192 1195
        "range",
1193 1196
        "magazine",
1194 1197
        "lethal"
1195 1198
      ],
1196 1199
      "type": "object"
1197 1200
    }
1198 1201
  },
1199 1202
  "id": "com.gamethesky.make.game",
1200 1203
  "lexicon": 1
1201 1204
}

Compare Other Versions

Lexicon Garden

@