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