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