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