com.gamethesky.make.game

gamethesky.com

Schema Diff

+24 -4

From

CID
bafyreidrojv3gmo...
Indexed At
2026-10-24 04:37 UTC
View this version

To

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

Compatibility Analysis

Breaking Changes Detected

2 breaking changes, 8 non-breaking changes.

Breaking Changes (2)
  • ConstraintTightened ConstraintTightened { vertex_id: "com.gamethesky.make.game#theme.card", sort: "knownValues", old_value: "[\"card\",\"poster\"]", new_value: "[\"card\",\"poster\",\"fight\"]" }
  • 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\"]" }
Non-Breaking Changes (8)
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game:body.builds" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game:body.ghostFights" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game:body.granny" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game:body.video" }
  • AddedEdge AddedEdge { src: "com.gamethesky.make.game:body", tgt: "com.gamethesky.make.game:body.builds", kind: "prop", name: Some("builds") }
  • AddedEdge AddedEdge { src: "com.gamethesky.make.game:body", tgt: "com.gamethesky.make.game:body.ghostFights", kind: "prop", name: Some("ghostFights") }
  • AddedEdge AddedEdge { src: "com.gamethesky.make.game:body", tgt: "com.gamethesky.make.game:body.granny", kind: "prop", name: Some("granny") }
  • AddedEdge AddedEdge { src: "com.gamethesky.make.game:body", tgt: "com.gamethesky.make.game:body.video", kind: "prop", name: Some("video") }

Migration Guidance

Added Elements

  • AddedVertex { vertex_id: "com.gamethesky.make.game:body.builds" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game:body.ghostFights" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game:body.granny" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game:body.video" }

Constraint Changes

  • ConstraintTightened ConstraintTightened { vertex_id: "com.gamethesky.make.game#theme.card", sort: "knownValues", old_value: "[\"card\",\"poster\"]", new_value: "[\"card\",\"poster\",\"fight\"]" }
  • 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\"]" }

Additional Notes

  • Non-breaking: AddedEdge { src: "com.gamethesky.make.game:body", tgt: "com.gamethesky.make.game:body.builds", kind: "prop", name: Some("builds") }
  • Non-breaking: AddedEdge { src: "com.gamethesky.make.game:body", tgt: "com.gamethesky.make.game:body.ghostFights", kind: "prop", name: Some("ghostFights") }
  • Non-breaking: AddedEdge { src: "com.gamethesky.make.game:body", tgt: "com.gamethesky.make.game:body.granny", kind: "prop", name: Some("granny") }
  • Non-breaking: AddedEdge { src: "com.gamethesky.make.game:body", tgt: "com.gamethesky.make.game:body.video", kind: "prop", name: Some("video") }
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": {
396 +
          "builds": {
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.",
398 +
            "type": "boolean"
399 +
          },
393 400
          "campaign": {
394 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.",
395 402
            "type": "boolean"
396 403
          },
397 404
          "carryLives": {
398 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.",
399 406
            "type": "boolean"
400 407
          },
401 408
          "cast": {
402 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.",
403 410
            "items": {
404 411
              "ref": "#member",
405 412
              "type": "ref"
406 413
            },
407 414
            "maxLength": 16,
408 415
            "type": "array"
409 416
          },
410 417
          "chapters": {
411 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.",
412 419
            "items": {
413 420
              "ref": "#chapter",
414 421
              "type": "ref"
415 422
            },
416 423
            "maxLength": 60,
417 424
            "minLength": 1,
418 425
            "type": "array"
419 426
          },
420 427
          "cover": {
421 428
            "accept": [
422 429
              "image/jpeg",
423 430
              "image/png"
424 431
            ],
425 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.",
426 433
            "maxSize": 614400,
427 434
            "type": "blob"
428 435
          },
429 436
          "createdAt": {
430 437
            "format": "datetime",
431 438
            "type": "string"
432 439
          },
433 440
          "credits": {
434 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.",
435 442
            "ref": "#credits",
436 443
            "type": "ref"
437 444
          },
438 445
          "daily": {
439 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.",
440 447
            "type": "boolean"
441 448
          },
442 449
          "description": {
443 450
            "maxGraphemes": 200,
444 451
            "maxLength": 800,
445 452
            "type": "string"
446 453
          },
447 454
          "ghost": {
448 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.",
449 456
            "type": "boolean"
450 457
          },
458 +
          "ghostFights": {
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.",
460 +
            "type": "boolean"
461 +
          },
451 462
          "gift": {
452 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.",
453 464
            "ref": "#gift",
454 465
            "type": "ref"
455 466
          },
467 +
          "granny": {
468 +
            "description": "With levels: a fourth level, Granny, easier than Easy (a board of its own). Part of play.",
469 +
            "type": "boolean"
470 +
          },
456 471
          "levels": {
457 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.",
458 473
            "type": "boolean"
459 474
          },
460 475
          "logo": {
461 476
            "accept": [
462 477
              "image/png",
463 478
              "image/jpeg"
464 479
            ],
465 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.",
466 481
            "maxSize": 409600,
467 482
            "type": "blob"
468 483
          },
469 484
          "remixOf": {
470 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.",
471 486
            "ref": "com.atproto.repo.strongRef",
472 487
            "type": "ref"
473 488
          },
474 489
          "rivals": {
475 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.",
476 491
            "knownValues": [
477 492
              "cast",
478 493
              "follows",
479 494
              "both"
480 495
            ],
481 496
            "maxLength": 16,
482 497
            "type": "string"
483 498
          },
484 499
          "scenes": {
485 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.",
486 501
            "items": {
487 502
              "ref": "#scene",
488 503
              "type": "ref"
489 504
            },
490 505
            "maxLength": 62,
491 506
            "type": "array"
492 507
          },
493 508
          "sounds": {
494 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.",
495 510
            "items": {
496 511
              "ref": "#sound",
497 512
              "type": "ref"
498 513
            },
499 514
            "maxLength": 8,
500 515
            "type": "array"
501 516
          },
502 517
          "theme": {
503 518
            "ref": "#theme",
504 519
            "type": "ref"
505 520
          },
506 521
          "title": {
507 522
            "maxGraphemes": 60,
508 523
            "maxLength": 240,
509 524
            "type": "string"
510 525
          },
511 526
          "titleCard": {
512 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.",
513 528
            "ref": "#titleCard",
514 529
            "type": "ref"
515 530
          },
531 +
          "video": {
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.",
533 +
            "type": "boolean"
534 +
          },
516 535
          "weapons": {
517 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.",
518 537
            "items": {
519 538
              "ref": "#weapon",
520 539
              "type": "ref"
521 540
            },
522 541
            "maxLength": 8,
523 542
            "type": "array"
524 543
          },
525 544
          "worldLife": {
526 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.",
527 546
            "type": "boolean"
528 547
          }
529 548
        },
530 549
        "required": [
531 550
          "title",
532 551
          "theme",
533 552
          "chapters",
534 553
          "createdAt"
535 554
        ],
536 555
        "type": "object"
537 556
      },
538 557
      "type": "record"
539 558
    },
540 559
    "member": {
541 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.",
542 561
      "properties": {
543 562
        "body": {
544 563
          "accept": [
545 564
            "image/png"
546 565
          ],
547 566
          "description": "A cut-out PNG of them head to toe, the background clear. 192 KB at most.",
548 567
          "maxSize": 196608,
549 568
          "type": "blob"
550 569
        },
551 570
        "face": {
552 571
          "accept": [
553 572
            "image/jpeg"
554 573
          ],
555 574
          "description": "A 256×256 JPEG of their face. 192 KB at most.",
556 575
          "maxSize": 196608,
557 576
          "type": "blob"
558 577
        },
559 578
        "handle": {
560 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.",
561 580
          "format": "handle",
562 581
          "type": "string"
563 582
        },
564 583
        "name": {
565 584
          "maxGraphemes": 40,
566 585
          "maxLength": 160,
567 586
          "type": "string"
568 587
        },
569 588
        "slot": {
570 589
          "description": "Which slot they're in: hero1 (you), hero2–3, foe1–6, villain1–3, extra1–4.",
571 590
          "knownValues": [
572 591
            "hero1",
573 592
            "hero2",
574 593
            "hero3",
575 594
            "foe1",
576 595
            "foe2",
577 596
            "foe3",
578 597
            "foe4",
579 598
            "foe5",
580 599
            "foe6",
581 600
            "villain1",
582 601
            "villain2",
583 602
            "villain3",
584 603
            "extra1",
585 604
            "extra2",
586 605
            "extra3",
587 606
            "extra4"
588 607
          ],
589 608
          "maxLength": 16,
590 609
          "type": "string"
591 610
        }
592 611
      },
593 612
      "required": [
594 613
        "slot",
595 614
        "name"
596 615
      ],
597 616
      "type": "object"
598 617
    },
599 618
    "message": {
600 619
      "properties": {
601 620
        "again": {
602 621
          "description": "Shown every time the player steps back onto it, not only the first.",
603 622
          "type": "boolean"
604 623
        },
605 624
        "sting": {
606 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>\".",
607 626
          "knownValues": [
608 627
            "creepy_hello",
609 628
            "creepy_laugh",
610 629
            "female_scream",
611 630
            "intrigue_event",
612 631
            "jump_scare",
613 632
            "jump_scare_horn",
614 633
            "lets_play",
615 634
            "radio"
616 635
          ],
617 636
          "maxLength": 32,
618 637
          "type": "string"
619 638
        },
620 639
        "text": {
621 640
          "maxGraphemes": 160,
622 641
          "maxLength": 640,
623 642
          "type": "string"
624 643
        },
625 644
        "who": {
626 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.",
627 646
          "knownValues": [
628 647
            "hero1",
629 648
            "hero2",
630 649
            "hero3",
631 650
            "foe1",
632 651
            "foe2",
633 652
            "foe3",
634 653
            "foe4",
635 654
            "foe5",
636 655
            "foe6",
637 656
            "villain1",
638 657
            "villain2",
639 658
            "villain3",
640 659
            "extra1",
641 660
            "extra2",
642 661
            "extra3",
643 662
            "extra4"
644 663
          ],
645 664
          "maxLength": 16,
646 665
          "type": "string"
647 666
        },
648 667
        "x": {
649 668
          "description": "The square's column, as the level's rows have it.",
650 669
          "minimum": 0,
651 670
          "type": "integer"
652 671
        },
653 672
        "y": {
654 673
          "description": "The square's row.",
655 674
          "minimum": 0,
656 675
          "type": "integer"
657 676
        }
658 677
      },
659 678
      "required": [
660 679
        "x",
661 680
        "y",
662 681
        "text"
663 682
      ],
664 683
      "type": "object"
665 684
    },
666 685
    "poster": {
667 686
      "properties": {
668 687
        "pic": {
669 688
          "description": "Which of the chapter's poster pictures it shows: 1 is pictures.poster1, and so on.",
670 689
          "maximum": 6,
671 690
          "minimum": 1,
672 691
          "type": "integer"
673 692
        },
674 693
        "x": {
675 694
          "description": "The wall square's column, as the level's rows have it (the drawn level's, or the preset's own map).",
676 695
          "minimum": 0,
677 696
          "type": "integer"
678 697
        },
679 698
        "y": {
680 699
          "description": "The wall square's row.",
681 700
          "minimum": 0,
682 701
          "type": "integer"
683 702
        }
684 703
      },
685 704
      "required": [
686 705
        "x",
687 706
        "y",
688 707
        "pic"
689 708
      ],
690 709
      "type": "object"
691 710
    },
692 711
    "question": {
693 712
      "properties": {
694 713
        "answers": {
695 714
          "description": "Two to four answers, shown in this order.",
696 715
          "items": {
697 716
            "maxGraphemes": 60,
698 717
            "maxLength": 240,
699 718
            "type": "string"
700 719
          },
701 720
          "maxLength": 4,
702 721
          "minLength": 2,
703 722
          "type": "array"
704 723
        },
705 724
        "pic": {
706 725
          "description": "The chapter's picture shown with it (its pictures' q1 to q20). Looks only.",
707 726
          "maximum": 20,
708 727
          "minimum": 1,
709 728
          "type": "integer"
710 729
        },
711 730
        "q": {
712 731
          "description": "What's asked (\"What year did Grandpa buy the station wagon?\").",
713 732
          "maxGraphemes": 160,
714 733
          "maxLength": 640,
715 734
          "type": "string"
716 735
        },
717 736
        "right": {
718 737
          "description": "Which answer is right, counting from 0.",
719 738
          "maximum": 3,
720 739
          "minimum": 0,
721 740
          "type": "integer"
722 741
        },
723 742
        "time": {
724 743
          "description": "Its own clock in seconds, in place of the chapter's setting.",
725 744
          "maximum": 60,
726 745
          "minimum": 5,
727 746
          "type": "integer"
728 747
        }
729 748
      },
730 749
      "required": [
731 750
        "q",
732 751
        "answers",
733 752
        "right"
734 753
      ],
735 754
      "type": "object"
736 755
    },
737 756
    "scene": {
738 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.",
739 758
      "properties": {
740 759
        "at": {
741 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.",
742 761
          "knownValues": [
743 762
            "before",
744 763
            "win",
745 764
            "lose"
746 765
          ],
747 766
          "maxLength": 16,
748 767
          "type": "string"
749 768
        },
750 769
        "bg": {
751 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.",
752 771
          "knownValues": [
753 772
            "replay",
754 773
            "flyby",
755 774
            "picture",
756 775
            "plain"
757 776
          ],
758 777
          "maxLength": 16,
759 778
          "type": "string"
760 779
        },
761 780
        "chapter": {
762 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.",
763 782
          "maximum": 59,
764 783
          "minimum": 0,
765 784
          "type": "integer"
766 785
        },
767 786
        "choices": {
768 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.",
769 788
          "items": {
770 789
            "ref": "#choice",
771 790
            "type": "ref"
772 791
          },
773 792
          "maxLength": 3,
774 793
          "minLength": 2,
775 794
          "type": "array"
776 795
        },
777 796
        "lines": {
778 797
          "description": "Typed out one at a time; the player moves on line by line.",
779 798
          "items": {
780 799
            "ref": "#sceneLine",
781 800
            "type": "ref"
782 801
          },
783 802
          "maxLength": 6,
784 803
          "type": "array"
785 804
        },
786 805
        "music": {
787 806
          "description": "A mood of music under the scene. Absent: none.",
788 807
          "knownValues": [
789 808
            "musicbox",
790 809
            "heartbeat",
791 810
            "unease",
792 811
            "dread",
793 812
            "tension",
794 813
            "groove",
795 814
            "pulse",
796 815
            "drift",
797 816
            "alarm",
798 817
            "island",
799 818
            "heist"
800 819
          ],
801 820
          "maxLength": 32,
802 821
          "type": "string"
803 822
        },
804 823
        "picture": {
805 824
          "accept": [
806 825
            "image/jpeg",
807 826
            "image/png"
808 827
          ],
809 828
          "description": "The builder's own picture for a picture background (at most 1600×900). Public once published. Looks only.",
810 829
          "maxSize": 716800,
811 830
          "type": "blob"
812 831
        },
813 832
        "sting": {
814 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.",
815 834
          "knownValues": [
816 835
            "creepy_hello",
817 836
            "creepy_laugh",
818 837
            "female_scream",
819 838
            "intrigue_event",
820 839
            "jump_scare",
821 840
            "jump_scare_horn",
822 841
            "lets_play"
823 842
          ],
824 843
          "maxLength": 32,
825 844
          "type": "string"
826 845
        },
827 846
        "title": {
828 847
          "maxGraphemes": 60,
829 848
          "maxLength": 240,
830 849
          "type": "string"
831 850
        }
832 851
      },
833 852
      "required": [
834 853
        "at",
835 854
        "bg"
836 855
      ],
837 856
      "type": "object"
838 857
    },
839 858
    "sceneLine": {
840 859
      "properties": {
841 860
        "text": {
842 861
          "maxGraphemes": 160,
843 862
          "maxLength": 640,
844 863
          "type": "string"
845 864
        },
846 865
        "who": {
847 866
          "description": "Who says it: one of the cast's slots (their photo and name show beside the line). Absent: narration.",
848 867
          "knownValues": [
849 868
            "hero1",
850 869
            "hero2",
851 870
            "hero3",
852 871
            "foe1",
853 872
            "foe2",
854 873
            "foe3",
855 874
            "foe4",
856 875
            "foe5",
857 876
            "foe6",
858 877
            "villain1",
859 878
            "villain2",
860 879
            "villain3",
861 880
            "extra1",
862 881
            "extra2",
863 882
            "extra3",
864 883
            "extra4"
865 884
          ],
866 885
          "maxLength": 16,
867 886
          "type": "string"
868 887
        }
869 888
      },
870 889
      "required": [
871 890
        "text"
872 891
      ],
873 892
      "type": "object"
874 893
    },
875 894
    "sound": {
876 895
      "description": "One of the builder's own sounds.",
877 896
      "properties": {
878 897
        "blob": {
879 898
          "accept": [
880 899
            "audio/*",
881 900
            "video/mp4"
882 901
          ],
883 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.)",
884 903
          "maxSize": 204800,
885 904
          "type": "blob"
886 905
        },
887 906
        "id": {
888 907
          "description": "Lowercase letters and digits, unique in the game: how the rest of the record names it.",
889 908
          "maxLength": 12,
890 909
          "type": "string"
891 910
        },
892 911
        "mime": {
893 912
          "description": "What it is, as the maker made it.",
894 913
          "knownValues": [
895 914
            "audio/mp4",
896 915
            "audio/wav"
897 916
          ],
898 917
          "maxLength": 32,
899 918
          "type": "string"
900 919
        },
901 920
        "ms": {
902 921
          "description": "How long it is, in milliseconds.",
903 922
          "maximum": 5000,
904 923
          "minimum": 1,
905 924
          "type": "integer"
906 925
        },
907 926
        "name": {
908 927
          "description": "What the builder calls it (\"Grandpa's yell\").",
909 928
          "maxGraphemes": 40,
910 929
          "maxLength": 160,
911 930
          "type": "string"
912 931
        }
913 932
      },
914 933
      "required": [
915 934
        "id",
916 935
        "blob",
917 936
        "mime",
918 937
        "ms"
919 938
      ],
920 939
      "type": "object"
921 940
    },
922 941
    "starring": {
923 942
      "properties": {
924 943
        "as": {
925 944
          "description": "Who they play (\"Grandma\"), shown as \"as Grandma\".",
926 945
          "maxGraphemes": 40,
927 946
          "maxLength": 160,
928 947
          "type": "string"
929 948
        },
930 949
        "who": {
931 950
          "description": "One of the game's cast's slots.",
932 951
          "knownValues": [
933 952
            "hero1",
934 953
            "hero2",
935 954
            "hero3",
936 955
            "foe1",
937 956
            "foe2",
938 957
            "foe3",
939 958
            "foe4",
940 959
            "foe5",
941 960
            "foe6",
942 961
            "villain1",
943 962
            "villain2",
944 963
            "villain3",
945 964
            "extra1",
946 965
            "extra2",
947 966
            "extra3",
948 967
            "extra4"
949 968
          ],
950 969
          "maxLength": 16,
951 970
          "type": "string"
952 971
        }
953 972
      },
954 973
      "required": [
955 974
        "who"
956 975
      ],
957 976
      "type": "object"
958 977
    },
959 978
    "theme": {
960 979
      "properties": {
961 980
        "card": {
962 -
          "description": "The share card's layout: the game card (absent), or a movie poster billing the cast (Haunt the Sky's). Looks only.",
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.",
963 982
          "knownValues": [
964 983
            "card",
965 -
            "poster"
984 +
            "poster",
985 +
            "fight"
966 986
          ],
967 987
          "type": "string"
968 988
        },
969 989
        "ladder": {
970 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.",
971 991
          "type": "boolean"
972 992
        },
973 993
        "mood": {
974 994
          "description": "How the chapters light their worlds.",
975 995
          "knownValues": [
976 996
            "bright",
977 997
            "dusk",
978 998
            "cold",
979 999
            "neon",
980 1000
            "space",
981 1001
            "horror",
982 1002
            "retro"
983 1003
          ],
984 1004
          "type": "string"
985 1005
        },
986 1006
        "native": {
987 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.",
988 1008
          "type": "boolean"
989 1009
        },
990 1010
        "palette": {
991 1011
          "description": "Five #rrggbb colors: the page, its panels, the accent, danger, and the words.",
992 1012
          "items": {
993 1013
            "maxLength": 7,
994 1014
            "type": "string"
995 1015
          },
996 1016
          "maxLength": 5,
997 1017
          "minLength": 5,
998 1018
          "type": "array"
999 1019
        },
1000 1020
        "pattern": {
1001 1021
          "knownValues": [
1002 1022
            "none",
1003 1023
            "grid",
1004 1024
            "stripes",
1005 1025
            "dots",
1006 1026
            "checks",
1007 1027
            "waves",
1008 1028
            "stars"
1009 1029
          ],
1010 1030
          "type": "string"
1011 1031
        },
1012 1032
        "preset": {
1013 1033
          "description": "The look it started from (haunted, neon, storybook, space, retro, frozen, sunset), or custom.",
1014 1034
          "maxLength": 20,
1015 1035
          "type": "string"
1016 1036
        },
1017 1037
        "title": {
1018 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.",
1019 1039
          "knownValues": [
1020 1040
            "plain",
1021 1041
            "stripes"
1022 1042
          ],
1023 1043
          "type": "string"
1024 1044
        },
1025 1045
        "type": {
1026 1046
          "description": "The typeface for titles.",
1027 1047
          "knownValues": [
1028 1048
            "anton",
1029 1049
            "creepster",
1030 1050
            "inter"
1031 1051
          ],
1032 1052
          "type": "string"
1033 1053
        }
1034 1054
      },
1035 1055
      "required": [
1036 1056
        "palette",
1037 1057
        "pattern",
1038 1058
        "mood",
1039 1059
        "type"
1040 1060
      ],
1041 1061
      "type": "object"
1042 1062
    },
1043 1063
    "titleCard": {
1044 1064
      "properties": {
1045 1065
        "line": {
1046 1066
          "description": "A line under the title.",
1047 1067
          "maxGraphemes": 120,
1048 1068
          "maxLength": 480,
1049 1069
          "type": "string"
1050 1070
        },
1051 1071
        "picture": {
1052 1072
          "accept": [
1053 1073
            "image/jpeg",
1054 1074
            "image/png"
1055 1075
          ],
1056 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.",
1057 1077
          "maxSize": 716800,
1058 1078
          "type": "blob"
1059 1079
        },
1060 1080
        "sound": {
1061 1081
          "description": "One of the game's own sounds (its id), played as the card fades in.",
1062 1082
          "maxLength": 12,
1063 1083
          "type": "string"
1064 1084
        },
1065 1085
        "title": {
1066 1086
          "description": "In place of the game's title on the card; absent, the game's own.",
1067 1087
          "maxGraphemes": 60,
1068 1088
          "maxLength": 240,
1069 1089
          "type": "string"
1070 1090
        }
1071 1091
      },
1072 1092
      "type": "object"
1073 1093
    },
1074 1094
    "weapon": {
1075 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).",
1076 1096
      "properties": {
1077 1097
        "damage": {
1078 1098
          "description": "Health off a guard per round that lands (a guard has 4 at the default toughness, the boss 28). Lethal weapons only.",
1079 1099
          "maximum": 10,
1080 1100
          "minimum": 1,
1081 1101
          "type": "integer"
1082 1102
        },
1083 1103
        "delay": {
1084 1104
          "description": "A non-lethal weapon's: 60 Hz ticks a guard staggers before it drops (0: at once).",
1085 1105
          "maximum": 300,
1086 1106
          "minimum": 0,
1087 1107
          "type": "integer"
1088 1108
        },
1089 1109
        "lethal": {
1090 1110
          "description": "False: a hit knocks a guard out (unconscious) instead of hurting it.",
1091 1111
          "type": "boolean"
1092 1112
        },
1093 1113
        "look": {
1094 1114
          "description": "The built-in model it wears. Looks only.",
1095 1115
          "knownValues": [
1096 1116
            "pistol",
1097 1117
            "silenced",
1098 1118
            "smg",
1099 1119
            "shotgun",
1100 1120
            "sniper",
1101 1121
            "taser",
1102 1122
            "tranq"
1103 1123
          ],
1104 1124
          "maxLength": 16,
1105 1125
          "type": "string"
1106 1126
        },
1107 1127
        "magazine": {
1108 1128
          "description": "Rounds (or charges) in a magazine.",
1109 1129
          "maximum": 60,
1110 1130
          "minimum": 1,
1111 1131
          "type": "integer"
1112 1132
        },
1113 1133
        "name": {
1114 1134
          "maxGraphemes": 24,
1115 1135
          "maxLength": 96,
1116 1136
          "type": "string"
1117 1137
        },
1118 1138
        "noise": {
1119 1139
          "description": "How far guards hear a shot, in squares (0: silent).",
1120 1140
          "maximum": 14,
1121 1141
          "minimum": 0,
1122 1142
          "type": "integer"
1123 1143
        },
1124 1144
        "pellets": {
1125 1145
          "description": "Rounds a pull of the trigger (a shotgun's several).",
1126 1146
          "maximum": 9,
1127 1147
          "minimum": 1,
1128 1148
          "type": "integer"
1129 1149
        },
1130 1150
        "range": {
1131 1151
          "description": "How far a round goes, in squares.",
1132 1152
          "maximum": 24,
1133 1153
          "minimum": 1,
1134 1154
          "type": "integer"
1135 1155
        },
1136 1156
        "rate": {
1137 1157
          "description": "60 Hz ticks between shots.",
1138 1158
          "maximum": 120,
1139 1159
          "minimum": 4,
1140 1160
          "type": "integer"
1141 1161
        },
1142 1162
        "reload": {
1143 1163
          "description": "60 Hz ticks to reload.",
1144 1164
          "maximum": 300,
1145 1165
          "minimum": 20,
1146 1166
          "type": "integer"
1147 1167
        },
1148 1168
        "skin": {
1149 1169
          "accept": [
1150 1170
            "image/jpeg",
1151 1171
            "image/png"
1152 1172
          ],
1153 1173
          "description": "The builder's picture on its body (a square JPEG, 256×256, at most 120 KB). Public once published. Looks only.",
1154 1174
          "maxSize": 122880,
1155 1175
          "type": "blob"
1156 1176
        },
1157 1177
        "spare": {
1158 1178
          "description": "Spare magazines carried at the start.",
1159 1179
          "maximum": 9,
1160 1180
          "minimum": 0,
1161 1181
          "type": "integer"
1162 1182
        },
1163 1183
        "spread": {
1164 1184
          "description": "How far a round can stray either way, in 1024ths of a turn.",
1165 1185
          "maximum": 60,
1166 1186
          "minimum": 0,
1167 1187
          "type": "integer"
1168 1188
        }
1169 1189
      },
1170 1190
      "required": [
1171 1191
        "name",
1172 1192
        "look",
1173 1193
        "damage",
1174 1194
        "rate",
1175 1195
        "range",
1176 1196
        "magazine",
1177 1197
        "lethal"
1178 1198
      ],
1179 1199
      "type": "object"
1180 1200
    }
1181 1201
  },
1182 1202
  "id": "com.gamethesky.make.game",
1183 1203
  "lexicon": 1
1184 1204
}

Compare Other Versions

Lexicon Garden

@