com.gamethesky.make.game

gamethesky.com

Schema Diff

+129 -107

From

CID
bafyreib2rkoe7xn...
Indexed At
2026-10-24 02:28 UTC
View this version

To

CID
bafyreidrojv3gmo...
Indexed At
2026-10-24 04:37 UTC
View this version

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
}

Compare Other Versions

Lexicon Garden

@