{
  "$schema": "https://pointcast.xyz/for-agents",
  "generatedAt": "2026-10-30T13:20:06.751Z",
  "name": "Lighthouse",
  "status": "playable browser game",
  "human": "https://pointcast.xyz/lighthouse",
  "image": "https://pointcast.xyz/images/lighthouse/og.png",
  "intent": "A memory game after Simon (Milton Bradley, 1978; designed by Ralph Baer and Howard Morrison), drawn as a lighthouse lens at night: four lamps, a growing sequence of light and tone, and a mood the player and the game keep together.",
  "direction": "Michael Hoydich's 2026-10-22 brief for PointCast games: \"80s innocence, joy of the compute and flow, mood state symbiosis, mobile and full screen, audio visual multimedia, Atari and Commodore inspired style modern\", then \"set up 5 new threads to create more\" and \"keep going\". Lighthouse is one of five wave-two threads.",
  "credits": {
    "director": "Michael Hoydich",
    "build": "Claude Code, 2026-10-22",
    "note": "Original code, art, and synthesized sound. No ROMs, no emulation, no recordings. Simon and the machine names are referenced as tributes."
  },
  "family": {
    "lobby": "https://pointcast.xyz/cabinet-row",
    "first": "https://pointcast.xyz/breakwater",
    "shared": [
      "3x5 pixel font",
      "Atari 800XL and Commodore 64 palettes",
      "mood model"
    ]
  },
  "game": {
    "genre": "memory / follow the sequence",
    "after": {
      "name": "Simon",
      "year": 1978,
      "publisher": "Milton Bradley",
      "designers": [
        "Ralph H. Baer",
        "Howard J. Morrison"
      ]
    },
    "field": {
      "width": 288,
      "height": "384 to 480, taller on tall phones"
    },
    "lamps": [
      {
        "position": 1,
        "id": "north",
        "band": "green",
        "note": "E",
        "midi": 52,
        "hz": 164.81,
        "keys": [
          "ArrowUp",
          "KeyW",
          "Digit1"
        ]
      },
      {
        "position": 2,
        "id": "east",
        "band": "red",
        "note": "A",
        "midi": 57,
        "hz": 220,
        "keys": [
          "ArrowRight",
          "KeyD",
          "Digit2"
        ]
      },
      {
        "position": 3,
        "id": "south",
        "band": "yellow",
        "note": "C#",
        "midi": 61,
        "hz": 277.18,
        "keys": [
          "ArrowDown",
          "KeyS",
          "Digit3"
        ]
      },
      {
        "position": 4,
        "id": "west",
        "band": "orange",
        "note": "E",
        "midi": 64,
        "hz": 329.63,
        "keys": [
          "ArrowLeft",
          "KeyA",
          "Digit4"
        ]
      }
    ],
    "tones": "E, A, C sharp and the E an octave above: an A major chord, after Simon's four bugle-like tones (E, C sharp, A, E). Square waves on the 800XL, triangle waves on the C64.",
    "sequence": "The light plays a sequence; the player repeats it; the light adds one lamp at random and plays it all again.",
    "speedRule": "Playback speeds up after the 5th, 9th, 13th step of a sequence, as on Simon. Seconds per flash by tier: 0.46, 0.34, 0.26, 0.2, multiplied by the mood.",
    "responseWindow": "About 3 seconds per lamp before the mood bends it; it restarts with each correct press.",
    "miss": "A wrong lamp or a slow answer sounds a low buzz and blinks the lamp that was due. On PLAY and RUSH the game ends; on CALM the same sequence replays.",
    "best": "The longest sequence repeated, kept in this browser.",
    "freePlay": "FREE turns the lens into a four-note instrument: hold a lamp to sound it, slide between lamps for a run. Free play is not a game: it records no best and does not hand a mood to the town.",
    "localBestScore": true
  },
  "moodSymbiosis": {
    "labels": [
      "DAWN",
      "FLOW",
      "RUSH",
      "DRIFT"
    ],
    "events": {
      "paddle": "each correct press",
      "brick": "each completed sequence",
      "loss": "a miss",
      "wave": "every 8th step reached (sequences of 8, 16, 24 ...)"
    },
    "meaning": {
      "DAWN": "warming up: a little more time to answer, cool palette, slow major arpeggio",
      "FLOW": "a clean run: brighter lamps, the music opens up",
      "RUSH": "high energy: faster playback, lamps dark between flashes, tighter window, raster bars, more sparks",
      "DRIFT": "after a miss: slower playback, a longer response window, softened palette, sparse notes"
    },
    "playerSide": {
      "dial": [
        {
          "id": "calm",
          "label": "CALM",
          "baseline": 0.22,
          "cap": 0.62,
          "noGameOver": true
        },
        {
          "id": "play",
          "label": "PLAY",
          "baseline": 0.45,
          "cap": 1,
          "noGameOver": false
        },
        {
          "id": "rush",
          "label": "RUSH",
          "baseline": 0.66,
          "cap": 1,
          "noGameOver": false
        }
      ],
      "note": "The dial sets the baseline the game relaxes toward. On CALM a miss replays the same sequence and the game never ends."
    },
    "gameSide": [
      "playback speed",
      "response window (generosity)",
      "lamp brightness between flashes",
      "music tempo and scale",
      "palette",
      "spark density",
      "beam brightness",
      "raster bars"
    ],
    "memory": "The session mood tape and the last energy are kept in this browser and the next session starts most of the way back. After a game, the current label is written to the sitewide pc:mood key (chill, flow, hype, quiet) so the town and Cabinet Row carry it."
  },
  "machines": [
    {
      "id": "xl",
      "name": "ATARI 800XL",
      "year": 1983,
      "soundChip": "POKEY",
      "prompt": "READY",
      "field": "#2545a8",
      "border": "#000000",
      "lamps": {
        "red": "#d84a3a",
        "orange": "#e7893a",
        "green": "#67b24a",
        "yellow": "#efd25a"
      }
    },
    {
      "id": "c64",
      "name": "COMMODORE 64",
      "year": 1982,
      "soundChip": "SID",
      "prompt": "READY.",
      "field": "#3e31a2",
      "border": "#7c70da",
      "lamps": {
        "red": "#c46c71",
        "orange": "#dd8855",
        "green": "#a9ff9f",
        "yellow": "#edf171"
      }
    }
  ],
  "audio": {
    "engine": "Web Audio API, synthesized at runtime; starts on the first tap or key, per browser autoplay rules",
    "lamps": "One held oscillator per lamp; in a game a tap sounds for a beat, in free play the note lasts as long as the finger.",
    "miss": "Two detuned square waves near 43 Hz under a low-pass filter: a low buzz.",
    "music": "A quiet generative arpeggio in A under the lens, ducked while the light plays and the player answers. Tempo and scale follow the mood.",
    "haptics": "short vibration on correct presses and misses where supported"
  },
  "controls": {
    "pointer": "Tap or click a lamp. Tap anywhere to start.",
    "keyboard": "Arrow keys, W D S A, or 1 2 3 4 clockwise from the top play the lamps. Space starts, P pauses, F full screen, M sound, C scanlines, X switches machines, Z turns the dial, T free play.",
    "fullscreen": "The FULL button uses the Fullscreen API on the stage element. iOS Safari lacks it for pages, so the stage fills the viewport instead.",
    "mobile": "Portrait first, 100dvh stage, touch-action none on the field, pauses when the tab is hidden."
  },
  "storage": {
    "key": "lighthouse:v1",
    "fields": [
      "best",
      "machine",
      "dial",
      "sound",
      "crt",
      "mood"
    ]
  },
  "accessibility": [
    "every lamp has a key",
    "a polite live region announces turns, misses and the lamp that was due",
    "CRT scanlines can be switched off",
    "reduced-motion preference stops the beam sweep and softens flashes",
    "colors are paired with positions and tones, so the game does not depend on telling colors apart"
  ],
  "caveats": [
    "Scores, settings and the mood tape are browser-local only.",
    "The tones approximate Simon's chord with square or triangle oscillators; they are not measured from a unit.",
    "The machine palettes are tributes chosen to read on modern displays, not chip-accurate output."
  ],
  "links": {
    "human": "https://pointcast.xyz/lighthouse",
    "json": "https://pointcast.xyz/lighthouse.json",
    "research": "https://github.com/mhoydich/pointcast/blob/main/docs/notes/2026-10-22-lighthouse-notes.md",
    "cabinetRow": "https://pointcast.xyz/cabinet-row",
    "breakwater": "https://pointcast.xyz/breakwater",
    "games": "https://pointcast.xyz/games/",
    "play": "https://pointcast.xyz/play",
    "pointcast": "https://pointcast.xyz/"
  }
}