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