Signal Runner

A playable three-lane courier game whose level is generated by the graph. Dodge red barriers, collect diamond signals, and reach the uplink with enough signals before the time limit. Gameplay runs locally in Canvas, not in graph executions per frame. There are no HTTP calls, credentials, paid services, audio, or persistent storage.

Try It

  1. Rebuild API, workers, and frontend first: this example requires the new bounded list/math nodes and their catalog manifests. No database migration is needed.
  2. Import graphs/games/signal-runner.subfork.json, run, and bind HTML Preview to view.html if the recommended layout is not applied.
  3. Press Start run. With Canvas focused, use Left/Right arrows or A/D to change lanes. Touch users can tap the steering buttons. Space or Pause holds the run.
  4. Restart replays the identical manifest. Best score lasts only for this page instance; reloading replaces it. No leaderboard or server score submission.
  5. Change World seed (integer 0..4294967295), Course length (5..60), Difficulty (easy, normal, hard), or Theme (amber, ice, rose) in the graph and rerun to create a new game artifact.

The graph JSON is self-contained with formatted HTML editable in the code editor. No per-game source directory, generator, or permanent runtime test suite is required. Generic computation-node regressions live in runtime tests.

Inspectable Construction

Count -> Number Sequence -> indices ----+
Seed + Count -> Random Integers -> lanes +-> Zip -> Compute Field -> Difference
                                        -> Level manifest -> Canvas game
Difficulty -> Rules lookup -------------+
Theme ---------------------------------+

Every row contains an index, distance, collectible lane, and blocked lanes. Distance is index * 180 + 650. Seeded integers choose the collectible lane 0..2; List Difference blocks the other two lanes. Each gate has exactly one safe lane, which also contains its signal. No bundled-course lookup remains.

The three difficulty profiles set speed, hull/lives, time limit, and required signal fraction. Gate spacing gives at least 0.62 seconds between gates at the highest supplied speed, allowing two discrete lane changes. This is not a promise that every difficulty is easy for every player. User-edited rules are validated, including whether the finish can be reached within the time limit.

The renderer performs movement, collision checks when crossing each gate’s distance, scoring, and drawing. It does not generate obstacles or random numbers. Collision semantics are lane/gate crossings, not pixel-perfect ship geometry. One collision costs one hull; zero hull ends the run. Reaching the finish without the required signal count also loses. Time advances with capped animation-frame deltas and pauses when the document is hidden or its window loses focus, so it is active simulation time rather than authoritative wall-clock timing.

Keyboard controls, touch buttons, and visible text status are provided. Canvas gameplay is visual; an equivalent screen-reader game is not implemented. Reduced-motion preference removes decorative streaks but cannot remove essential scrolling. The page starts idle and has no sound or autoplay. Start focuses the Canvas so keyboard events stay scoped to the game rather than global shortcuts.

Outputs And Validation

Outputs: html, HTML response, JSON manifest (signal-runner/1), and data_response. The manifest can be inspected independently or consumed by a different game renderer. Invalid or empty levels show a visible error rather than inventing a fallback course. HTML embedding uses HTML-safe JSON serialization.

Checks covered repeatability, changed seeds, minimum/default/maximum lengths, all three difficulty profiles’ supplied spacing/time budgets, and open lanes. Game simulation checks covered steering, victory, collisions/loss, pause/resume, visibility pause, restart/local best, invalid manifests, and a single animation loop. Desktop and narrow-screen ready-state layouts were inspected in headless Chrome. Dashboard import/run and real keyboard/touch play remain manual checks.

See bounded compute contracts for reproducibility, numeric validation, and resource limits.