com.gamethesky.make.game

gamethesky.com

Schema Diff

+73 -3

From

CID
bafyreicexukhbe7...
Indexed At
2026-10-23 20:56 UTC
View this version

To

CID
bafyreib2rkoe7xn...
Indexed At
2026-10-24 02:28 UTC
View this version

Compatibility Analysis

Backward Compatible

Backward compatible. 25 non-breaking changes.

Non-Breaking Changes (25)
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game#chapter.rivals" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game#chapter.world" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game#theme.card" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game#theme.ladder" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game#theme.native" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game#theme.title" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game:body.campaign" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game:body.daily" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game:body.ghost" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game:body.levels" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game:body.rivals" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game:body.worldLife" }
  • AddedEdge AddedEdge { src: "com.gamethesky.make.game#chapter", tgt: "com.gamethesky.make.game#chapter.rivals", kind: "prop", name: Some("rivals") }
  • AddedEdge AddedEdge { src: "com.gamethesky.make.game#chapter", tgt: "com.gamethesky.make.game#chapter.world", kind: "prop", name: Some("world") }
  • AddedEdge AddedEdge { src: "com.gamethesky.make.game#theme", tgt: "com.gamethesky.make.game#theme.card", kind: "prop", name: Some("card") }
  • AddedEdge AddedEdge { src: "com.gamethesky.make.game#theme", tgt: "com.gamethesky.make.game#theme.ladder", kind: "prop", name: Some("ladder") }
  • AddedEdge AddedEdge { src: "com.gamethesky.make.game#theme", tgt: "com.gamethesky.make.game#theme.native", kind: "prop", name: Some("native") }
  • AddedEdge AddedEdge { src: "com.gamethesky.make.game#theme", tgt: "com.gamethesky.make.game#theme.title", kind: "prop", name: Some("title") }
  • AddedEdge AddedEdge { src: "com.gamethesky.make.game:body", tgt: "com.gamethesky.make.game:body.campaign", kind: "prop", name: Some("campaign") }
  • AddedEdge AddedEdge { src: "com.gamethesky.make.game:body", tgt: "com.gamethesky.make.game:body.daily", kind: "prop", name: Some("daily") }
  • AddedEdge AddedEdge { src: "com.gamethesky.make.game:body", tgt: "com.gamethesky.make.game:body.ghost", kind: "prop", name: Some("ghost") }
  • AddedEdge AddedEdge { src: "com.gamethesky.make.game:body", tgt: "com.gamethesky.make.game:body.levels", kind: "prop", name: Some("levels") }
  • AddedEdge AddedEdge { src: "com.gamethesky.make.game:body", tgt: "com.gamethesky.make.game:body.rivals", kind: "prop", name: Some("rivals") }
  • AddedEdge AddedEdge { src: "com.gamethesky.make.game:body", tgt: "com.gamethesky.make.game:body.worldLife", kind: "prop", name: Some("worldLife") }
  • ConstraintRelaxed ConstraintRelaxed { vertex_id: "com.gamethesky.make.game#scene.chapter", sort: "maximum", old_value: "7", new_value: "59" }

Migration Guidance

Added Elements

  • AddedVertex { vertex_id: "com.gamethesky.make.game#chapter.rivals" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game#chapter.world" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game#theme.card" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game#theme.ladder" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game#theme.native" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game#theme.title" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game:body.campaign" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game:body.daily" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game:body.ghost" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game:body.levels" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game:body.rivals" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game:body.worldLife" }

Constraint Changes

  • ConstraintRelaxed ConstraintRelaxed { vertex_id: "com.gamethesky.make.game#scene.chapter", sort: "maximum", old_value: "7", new_value: "59" }

Additional Notes

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

Compare Other Versions

Lexicon Garden

@