com.gamethesky.make.game

gamethesky.com

Schema Diff

+407 -81

From

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

To

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

Compatibility Analysis

Breaking Changes Detected

20 breaking changes, 89 non-breaking changes.

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

Compare Other Versions

Lexicon Garden

@