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