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