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