com.gamethesky.make.game

gamethesky.com

Schema Diff

+216 -2

From

CID
bafyreigsf3tma42...
Indexed At
2026-10-23 15:22 UTC
View this version

To

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

Compatibility Analysis

Breaking Changes Detected

12 breaking changes, 47 non-breaking changes.

Breaking Changes (12)
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "com.gamethesky.make.game#gift", src: "com.gamethesky.make.game#gift", tgt: "com.gamethesky.make.game#gift.to", kind: "prop", name: Some("to") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "com.gamethesky.make.game#gift", src: "com.gamethesky.make.game#gift", tgt: "com.gamethesky.make.game#gift.message", kind: "prop", name: Some("message") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "com.gamethesky.make.game#huntRoom", src: "com.gamethesky.make.game#huntRoom", tgt: "com.gamethesky.make.game#huntRoom.pic", kind: "prop", name: Some("pic") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "com.gamethesky.make.game#huntRoom", src: "com.gamethesky.make.game#huntRoom", tgt: "com.gamethesky.make.game#huntRoom.targets", kind: "prop", name: Some("targets") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "com.gamethesky.make.game#question", src: "com.gamethesky.make.game#question", tgt: "com.gamethesky.make.game#question.answers", kind: "prop", name: Some("answers") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "com.gamethesky.make.game#question", src: "com.gamethesky.make.game#question", tgt: "com.gamethesky.make.game#question.q", kind: "prop", name: Some("q") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "com.gamethesky.make.game#question", src: "com.gamethesky.make.game#question", tgt: "com.gamethesky.make.game#question.right", kind: "prop", name: Some("right") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "com.gamethesky.make.game#huntTarget", src: "com.gamethesky.make.game#huntTarget", tgt: "com.gamethesky.make.game#huntTarget.label", kind: "prop", name: Some("label") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "com.gamethesky.make.game#huntTarget", src: "com.gamethesky.make.game#huntTarget", tgt: "com.gamethesky.make.game#huntTarget.r", kind: "prop", name: Some("r") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "com.gamethesky.make.game#huntTarget", src: "com.gamethesky.make.game#huntTarget", tgt: "com.gamethesky.make.game#huntTarget.x", kind: "prop", name: Some("x") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "com.gamethesky.make.game#huntTarget", src: "com.gamethesky.make.game#huntTarget", tgt: "com.gamethesky.make.game#huntTarget.y", kind: "prop", name: Some("y") }
  • 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\"]", 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\"]" }
Non-Breaking Changes (47)
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game#chapter.hunt" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game#chapter.hunt:items" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game#chapter.quiz" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game#chapter.quiz:items" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game#gift" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game#gift.as" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game#gift.from" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game#gift.message" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game#gift.to" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game#huntRoom" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game#huntRoom.name" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game#huntRoom.pic" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game#huntRoom.targets" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game#huntRoom.targets:items" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game#huntTarget" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game#huntTarget.label" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game#huntTarget.r" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game#huntTarget.s" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game#huntTarget.who" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game#huntTarget.x" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game#huntTarget.y" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game#question" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game#question.answers" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game#question.answers:items" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game#question.pic" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game#question.q" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game#question.right" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game#question.time" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.game:body.gift" }
  • AddedEdge AddedEdge { src: "com.gamethesky.make.game#chapter", tgt: "com.gamethesky.make.game#chapter.hunt", kind: "prop", name: Some("hunt") }
  • AddedEdge AddedEdge { src: "com.gamethesky.make.game#chapter", tgt: "com.gamethesky.make.game#chapter.quiz", kind: "prop", name: Some("quiz") }
  • AddedEdge AddedEdge { src: "com.gamethesky.make.game#chapter.hunt", tgt: "com.gamethesky.make.game#chapter.hunt:items", kind: "items", name: None }
  • AddedEdge AddedEdge { src: "com.gamethesky.make.game#chapter.hunt:items", tgt: "com.gamethesky.make.game#huntRoom", kind: "ref", name: None }
  • AddedEdge AddedEdge { src: "com.gamethesky.make.game#chapter.quiz", tgt: "com.gamethesky.make.game#chapter.quiz:items", kind: "items", name: None }
  • AddedEdge AddedEdge { src: "com.gamethesky.make.game#chapter.quiz:items", tgt: "com.gamethesky.make.game#question", kind: "ref", name: None }
  • AddedEdge AddedEdge { src: "com.gamethesky.make.game#gift", tgt: "com.gamethesky.make.game#gift.as", kind: "prop", name: Some("as") }
  • AddedEdge AddedEdge { src: "com.gamethesky.make.game#gift", tgt: "com.gamethesky.make.game#gift.from", kind: "prop", name: Some("from") }
  • AddedEdge AddedEdge { src: "com.gamethesky.make.game#huntRoom", tgt: "com.gamethesky.make.game#huntRoom.name", kind: "prop", name: Some("name") }
  • AddedEdge AddedEdge { src: "com.gamethesky.make.game#huntRoom.targets", tgt: "com.gamethesky.make.game#huntRoom.targets:items", kind: "items", name: None }
  • AddedEdge AddedEdge { src: "com.gamethesky.make.game#huntRoom.targets:items", tgt: "com.gamethesky.make.game#huntTarget", kind: "ref", name: None }
  • AddedEdge AddedEdge { src: "com.gamethesky.make.game#huntTarget", tgt: "com.gamethesky.make.game#huntTarget.s", kind: "prop", name: Some("s") }
  • AddedEdge AddedEdge { src: "com.gamethesky.make.game#huntTarget", tgt: "com.gamethesky.make.game#huntTarget.who", kind: "prop", name: Some("who") }
  • AddedEdge AddedEdge { src: "com.gamethesky.make.game#question", tgt: "com.gamethesky.make.game#question.pic", kind: "prop", name: Some("pic") }
  • AddedEdge AddedEdge { src: "com.gamethesky.make.game#question", tgt: "com.gamethesky.make.game#question.time", kind: "prop", name: Some("time") }
  • AddedEdge AddedEdge { src: "com.gamethesky.make.game#question.answers", tgt: "com.gamethesky.make.game#question.answers:items", kind: "items", name: None }
  • AddedEdge AddedEdge { src: "com.gamethesky.make.game:body", tgt: "com.gamethesky.make.game:body.gift", kind: "prop", name: Some("gift") }
  • AddedEdge AddedEdge { src: "com.gamethesky.make.game:body.gift", tgt: "com.gamethesky.make.game#gift", kind: "ref", name: None }

Migration Guidance

Added Elements

  • AddedVertex { vertex_id: "com.gamethesky.make.game#chapter.hunt" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game#chapter.hunt:items" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game#chapter.quiz" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game#chapter.quiz:items" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game#gift" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game#gift.as" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game#gift.from" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game#gift.message" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game#gift.to" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game#huntRoom" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game#huntRoom.name" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game#huntRoom.pic" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game#huntRoom.targets" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game#huntRoom.targets:items" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game#huntTarget" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game#huntTarget.label" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game#huntTarget.r" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game#huntTarget.s" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game#huntTarget.who" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game#huntTarget.x" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game#huntTarget.y" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game#question" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game#question.answers" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game#question.answers:items" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game#question.pic" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game#question.q" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game#question.right" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game#question.time" }
  • AddedVertex { vertex_id: "com.gamethesky.make.game:body.gift" }

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\"]", 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\"]" }

Additional Notes

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

Compare Other Versions

Lexicon Garden

@