com.gamethesky.make.game

gamethesky.com

Schema Diff

+153 -111

From

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

To

CID
bafyreifnpteohf3...
Indexed At
2026-10-26 07:46 UTC
View this version

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
}

Compare Other Versions

Lexicon Garden

@