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