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