com.gamethesky.make.game

gamethesky.com

Schema Diff

+224 -112

From

CID
bafyreicexukhbe7...
Indexed At
2026-10-23 20:56 UTC
View this version

To

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

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
}

Compare Other Versions

Lexicon Garden

@