{
  "$schema": "https://pointcast.xyz/for-agents",
  "generatedAt": "2026-10-22T18:41:56.680Z",
  "name": "Crosswalk",
  "status": "playable browser game",
  "human": "https://pointcast.xyz/crosswalk",
  "image": "https://pointcast.xyz/images/crosswalk/og.png",
  "intent": "A lane-crossing arcade game in the shape of Frogger, set on a street in El Segundo: sidewalk, five lanes of traffic, median, bike path, sand, and four lifeguard towers to reach before the clock runs out, with a street that answers your mood.",
  "direction": "Brief by Michael Hoydich, 2026-10-22: 80s innocence, the joy of the compute and flow, mood-state symbiosis, mobile and full screen, audio-visual multimedia, Atari and Commodore inspired, rendered modern. Thread 4 of 5 sibling games after Breakwater.",
  "credits": {
    "director": "Michael Hoydich",
    "build": "Claude Code, 2026-10-22",
    "note": "Original code, art, and synthesized sound. No ROMs, no emulation, no copyrighted sprites or recordings. Frogger (Konami, 1981; Sega/Gremlin in arcades) is referenced as the shape this tribute follows."
  },
  "game": {
    "genre": "lane crossing / Frogger-like",
    "field": {
      "width": 288,
      "height": 384,
      "columns": 12,
      "rows": 11,
      "rowKinds": [
        "water",
        "sand",
        "lane",
        "lane",
        "median",
        "lane",
        "lane",
        "lane",
        "lane",
        "lane",
        "sidewalk"
      ],
      "towerColumns": [
        1,
        4,
        7,
        10
      ]
    },
    "lanes": [
      {
        "row": 2,
        "name": "BIKE PATH",
        "vehicle": "BIKE",
        "direction": "left",
        "speed": 92,
        "slots": 3
      },
      {
        "row": 3,
        "name": "BIKE PATH",
        "vehicle": "BIKE",
        "direction": "right",
        "speed": 66,
        "slots": 3
      },
      {
        "row": 5,
        "name": "FAST LANE",
        "vehicle": "CAR",
        "direction": "left",
        "speed": 96,
        "slots": 2
      },
      {
        "row": 6,
        "name": "BUS LANE",
        "vehicle": "BUS",
        "direction": "right",
        "speed": 38,
        "slots": 2
      },
      {
        "row": 7,
        "name": "SKATE LANE",
        "vehicle": "SKATEBOARD",
        "direction": "left",
        "speed": 58,
        "slots": 4
      },
      {
        "row": 8,
        "name": "STREET",
        "vehicle": "CAR",
        "direction": "right",
        "speed": 52,
        "slots": 3
      },
      {
        "row": 9,
        "name": "STREET",
        "vehicle": "CAR",
        "direction": "left",
        "speed": 44,
        "slots": 3
      }
    ],
    "lanesNote": "Speeds are logical pixels per second at stage 1 before the mood multiplier. Directions reverse on every odd stage.",
    "scoring": {
      "hop": 10,
      "tower": 50,
      "perSecond": 10,
      "ball": 200,
      "stage": 1000,
      "extraEvery": 2000,
      "rule": "10 per new row reached; a tower pays 50 plus 10 per unused second; the beach ball adds 200; all four towers add 1000."
    },
    "clock": {
      "stage1Seconds": 30,
      "perStage": "two seconds shorter each stage, never under 18",
      "moodNote": "DRIFT lengthens the clock, RUSH shortens it a little."
    },
    "lives": 3,
    "extraLifeEvery": 2000,
    "pace": [
      {
        "speed": 1,
        "timer": 30,
        "stage": 0
      },
      {
        "speed": 1.12,
        "timer": 28,
        "stage": 1
      },
      {
        "speed": 1.24,
        "timer": 26,
        "stage": 2
      },
      {
        "speed": 1.3599999999999999,
        "timer": 24,
        "stage": 3
      }
    ],
    "hazards": [
      "hit by a vehicle",
      "the clock runs out",
      "hopping into the water between towers"
    ],
    "beachBall": "On RUSH a beach ball appears on the sand; carry it to a tower for the bonus.",
    "localBestScore": true
  },
  "moodSymbiosis": {
    "labels": [
      "DAWN",
      "FLOW",
      "RUSH",
      "DRIFT"
    ],
    "events": {
      "paddle": "each safe hop forward",
      "brick": "each lane cleared",
      "loss": "a hit, a splash or a timeout",
      "wave": "all four towers filled"
    },
    "meaning": {
      "DAWN": "warming up: cool palette, slow major arpeggio, an ordinary street",
      "FLOW": "a long run of safe hops: bright palette, the music opens up",
      "RUSH": "high energy: hot palette, raster bars, faster lanes, tighter gaps, beach ball on the sand",
      "DRIFT": "after hits: softened palette, thinner traffic, wider gaps, a longer clock, sparse notes"
    },
    "playerSide": {
      "dial": [
        {
          "id": "calm",
          "label": "CALM",
          "baseline": 0.22,
          "cap": 0.62,
          "unlimitedLives": true,
          "note": "No lives. A hit just walks you back to the sidewalk."
        },
        {
          "id": "play",
          "label": "PLAY",
          "baseline": 0.45,
          "cap": 1,
          "unlimitedLives": false,
          "note": "Three beach-goers, one more every 2000 points."
        },
        {
          "id": "rush",
          "label": "RUSH",
          "baseline": 0.66,
          "cap": 1,
          "unlimitedLives": false,
          "note": "Starts hot: faster lanes, tighter gaps, a beach ball on the sand."
        }
      ],
      "note": "The dial sets the baseline the game relaxes toward. Safe hops push energy up, hits pull calm down, time restores it. The model is shared with Breakwater unchanged."
    },
    "gameSide": [
      "lane speed",
      "traffic density",
      "crossing clock",
      "music tempo and scale",
      "palette temperature",
      "particle density",
      "raster bars",
      "beach ball"
    ],
    "memory": "The session mood tape and the last energy are kept in this browser under crosswalk:v1 and the next session starts most of the way back. On leaving after a game, the current label is written to the sitewide pc:mood key (chill, flow, hype, quiet) so the town carries it."
  },
  "machines": [
    {
      "id": "xl",
      "name": "ATARI 800XL",
      "year": 1983,
      "soundChip": "POKEY",
      "prompt": "READY",
      "field": "#2545a8",
      "border": "#000000",
      "text": "#a9b9f5",
      "bands": {
        "red": "#d84a3a",
        "orange": "#e7893a",
        "green": "#67b24a",
        "yellow": "#efd25a"
      }
    },
    {
      "id": "c64",
      "name": "COMMODORE 64",
      "year": 1982,
      "soundChip": "SID",
      "prompt": "READY.",
      "field": "#3e31a2",
      "border": "#7c70da",
      "text": "#7c70da",
      "bands": {
        "red": "#c46c71",
        "orange": "#dd8855",
        "green": "#a9ff9f",
        "yellow": "#edf171"
      }
    }
  ],
  "audio": {
    "engine": "Web Audio API, synthesized at runtime",
    "voices": "Square, triangle and sawtooth oscillators with short envelopes. The C64 mode adds a resonant low-pass sweep in the SID spirit; the 800XL mode keeps raw squares with a noise burst, in the POKEY spirit.",
    "music": "A generative arpeggiator with a walking bass over a four-chord loop. Tempo and scale follow the mood: major at DAWN, bright at FLOW, minor at RUSH, sparse at DRIFT.",
    "sfx": "A hop blip that rises with every row crossed, a two-tone horn on a hit, a splash, a three-beat timeout, a four-note fanfare at a tower, a longer run when all four fill.",
    "startsOn": "first tap or key, per browser autoplay rules",
    "haptics": "short vibration on forward hops, towers and hits where supported"
  },
  "controls": {
    "touch": "Swipe anywhere on the field to hop in that direction, or tap above, below, left or right of the beach-goer.",
    "keyboard": "Arrows or W A S D hop, Space starts or resumes, P pauses, F toggles full screen, M toggles sound, C toggles the CRT overlay, 1 and 2 switch machines, 3 cycles the dial.",
    "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."
  },
  "accessibility": [
    "CRT scanlines can be switched off",
    "reduced-motion preference lowers particles and stops raster movement",
    "a polite live region announces towers, hits and stages",
    "no sound is required to play",
    "touch hints say SWIPE or TAP, not key names"
  ],
  "caveats": [
    "Scores, settings and the mood tape are browser-local only.",
    "The machine palettes are tributes chosen to read on modern displays, not chip-accurate output.",
    "The boot screens are affectionate tributes with PointCast wording, not copies of the original ROM text.",
    "El Segundo is the setting, not a map: the lanes are a cartoon of the street between the town and the sand."
  ],
  "links": {
    "human": "https://pointcast.xyz/crosswalk",
    "json": "https://pointcast.xyz/crosswalk.json",
    "research": "https://github.com/mhoydich/pointcast/blob/main/docs/notes/2026-10-22-crosswalk-notes.md",
    "breakwater": "https://pointcast.xyz/breakwater",
    "games": "https://pointcast.xyz/games/",
    "play": "https://pointcast.xyz/play",
    "pointcast": "https://pointcast.xyz/"
  }
}