# Wiring reference: one small complete game

Sindri AI knowledge pack, file `14-example-wiring-flappy.md`. Flappy, the smallest complete game in the repository, shown whole. Use it to see how a scene, several scripts, shared state and a HUD fit together, not as a model of game design.

Start with `00-start-here.md` if you have not read it. Every fact here is copied from the Sindri repository; nothing in this file is a guess.

## Contents of this file

- **Flappy** (`games/flappy`)

---

## Example: Flappy (`games/flappy`)

Every text file of the project follows, whole, under its path relative to the project folder. JSON files are shown with short arrays on one line; whitespace does not matter to Sindri.

### Flappy

A tiny side-view arcade genre showcase for Sindri: one-button flight through an endless line of gaps.

The game exists to prove a compact, readable Decay-first arcade loop rather than to reproduce the original Flappy Bird art or branding. Gameplay is authored in the scene and Decay: flap impulse, gravity-driven flight, scrolling obstacles, scoring, collision death, and restart.

#### Controls

- **Tap / click / Space / W / Arrow Up** — flap
- **The same, a moment after a crash** — restart

Gaps change height every lap, the course speeds up as the score climbs, and the sky, hills, and ground scroll in parallax.

#### Scope

Keep this showcase deliberately small: one scene, a handful of scripts, simple engine-native visuals, and a deterministic harness test that plays through a gap and then crashes. It should be useful as a project somebody can copy when starting a one-button arcade game.

### `assets/flappy.scene`

```json
{
  "format_version": 10,
  "metadata": {"name": "Flappy"},
  "entities": [
    {"id": "camera", "name": "Camera", "transform_3d": {"position": [0, 0, 10], "rotation": [0, 0, 0, 1], "scale": [1, 1, 1]}, "components": {"sindri.camera": {"projection": "orthographic", "vertical_size": 12.0, "near": 0.1, "far": 100.0, "fit": "height"}}},
    {"id": "environment", "name": "Sky", "components": {"sindri.environment": {"background": [0.33, 0.75, 0.93, 1.0], "shadows": {"enabled": false, "map_size": 1024, "distance": 48.0, "bias": 0.002}}}},
    {"id": "physics", "name": "Physics", "components": {"sindri.physics2d.world": {"gravity": [0.0, -18.0]}}},
    {"id": "hud", "name": "Hud", "components": {"sindri.script": {"source": "scripts/hud.decay", "script": "Hud", "properties": {}}}},
    {"id": "sun", "name": "Sun", "transform_3d": {"position": [3.2, 3.6, -2], "rotation": [0, 0, 0, 1], "scale": [2.2, 2.2, 1]}, "components": {"sindri.shape": {"kind": "ellipse", "count": 48.0, "fill": [1.0, 0.93, 0.55, 1.0], "stroke": [0, 0, 0, 0], "stroke_width": 0.0, "corner_radius": 0.0, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 0}}},
    {"id": "hill-0", "name": "Hill 0", "transform_3d": {"position": [-9, -4.8, -1.5], "rotation": [0, 0, 0, 1], "scale": [9, 5, 1]}, "components": {"sindri.shape": {"kind": "ellipse", "count": 48.0, "fill": [0.46, 0.8, 0.62, 1], "stroke": [0, 0, 0, 0], "stroke_width": 0.0, "corner_radius": 0.0, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 1}, "sindri.script": {"source": "scripts/drift.decay", "script": "Drift", "properties": {"factor": 0.15, "span": 32.0}}}},
    {"id": "hill-1", "name": "Hill 1", "transform_3d": {"position": [-1, -4.8, -1.5], "rotation": [0, 0, 0, 1], "scale": [11, 6.5, 1]}, "components": {"sindri.shape": {"kind": "ellipse", "count": 48.0, "fill": [0.42, 0.76, 0.58, 1], "stroke": [0, 0, 0, 0], "stroke_width": 0.0, "corner_radius": 0.0, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 1}, "sindri.script": {"source": "scripts/drift.decay", "script": "Drift", "properties": {"factor": 0.15, "span": 32.0}}}},
    {"id": "hill-2", "name": "Hill 2", "transform_3d": {"position": [8, -4.8, -1.5], "rotation": [0, 0, 0, 1], "scale": [10, 5.5, 1]}, "components": {"sindri.shape": {"kind": "ellipse", "count": 48.0, "fill": [0.46, 0.8, 0.62, 1], "stroke": [0, 0, 0, 0], "stroke_width": 0.0, "corner_radius": 0.0, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 1}, "sindri.script": {"source": "scripts/drift.decay", "script": "Drift", "properties": {"factor": 0.15, "span": 32.0}}}},
    {"id": "hill-3", "name": "Hill 3", "transform_3d": {"position": [15, -4.8, -1.5], "rotation": [0, 0, 0, 1], "scale": [9, 6, 1]}, "components": {"sindri.shape": {"kind": "ellipse", "count": 48.0, "fill": [0.42, 0.76, 0.58, 1], "stroke": [0, 0, 0, 0], "stroke_width": 0.0, "corner_radius": 0.0, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 1}, "sindri.script": {"source": "scripts/drift.decay", "script": "Drift", "properties": {"factor": 0.15, "span": 32.0}}}},
    {"id": "cloud-0-0", "name": "Cloud 0.0", "transform_3d": {"position": [-8.0, 3.8, -1.8], "rotation": [0, 0, 0, 1], "scale": [2.2, 1.1, 1]}, "components": {"sindri.shape": {"kind": "ellipse", "count": 32.0, "fill": [1, 1, 1, 0.92], "stroke": [0, 0, 0, 0], "stroke_width": 0.0, "corner_radius": 0.0, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 1}, "sindri.script": {"source": "scripts/drift.decay", "script": "Drift", "properties": {"factor": 0.3, "span": 32.0, "idle": 0.25}}}},
    {"id": "cloud-0-1", "name": "Cloud 0.1", "transform_3d": {"position": [-8.9, 3.5999999999999996, -1.8], "rotation": [0, 0, 0, 1], "scale": [1.4, 0.8, 1]}, "components": {"sindri.shape": {"kind": "ellipse", "count": 32.0, "fill": [1, 1, 1, 0.92], "stroke": [0, 0, 0, 0], "stroke_width": 0.0, "corner_radius": 0.0, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 1}, "sindri.script": {"source": "scripts/drift.decay", "script": "Drift", "properties": {"factor": 0.3, "span": 32.0, "idle": 0.25}}}},
    {"id": "cloud-0-2", "name": "Cloud 0.2", "transform_3d": {"position": [-7.1, 3.5999999999999996, -1.8], "rotation": [0, 0, 0, 1], "scale": [1.6, 0.8, 1]}, "components": {"sindri.shape": {"kind": "ellipse", "count": 32.0, "fill": [1, 1, 1, 0.92], "stroke": [0, 0, 0, 0], "stroke_width": 0.0, "corner_radius": 0.0, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 1}, "sindri.script": {"source": "scripts/drift.decay", "script": "Drift", "properties": {"factor": 0.3, "span": 32.0, "idle": 0.25}}}},
    {"id": "cloud-1-0", "name": "Cloud 1.0", "transform_3d": {"position": [-2.0, 2.6, -1.8], "rotation": [0, 0, 0, 1], "scale": [1.54, 0.77, 1]}, "components": {"sindri.shape": {"kind": "ellipse", "count": 32.0, "fill": [1, 1, 1, 0.92], "stroke": [0, 0, 0, 0], "stroke_width": 0.0, "corner_radius": 0.0, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 1}, "sindri.script": {"source": "scripts/drift.decay", "script": "Drift", "properties": {"factor": 0.3, "span": 32.0, "idle": 0.25}}}},
    {"id": "cloud-1-1", "name": "Cloud 1.1", "transform_3d": {"position": [-2.63, 2.46, -1.8], "rotation": [0, 0, 0, 1], "scale": [0.9799999999999999, 0.5599999999999999, 1]}, "components": {"sindri.shape": {"kind": "ellipse", "count": 32.0, "fill": [1, 1, 1, 0.92], "stroke": [0, 0, 0, 0], "stroke_width": 0.0, "corner_radius": 0.0, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 1}, "sindri.script": {"source": "scripts/drift.decay", "script": "Drift", "properties": {"factor": 0.3, "span": 32.0, "idle": 0.25}}}},
    {"id": "cloud-1-2", "name": "Cloud 1.2", "transform_3d": {"position": [-1.37, 2.46, -1.8], "rotation": [0, 0, 0, 1], "scale": [1.1199999999999999, 0.5599999999999999, 1]}, "components": {"sindri.shape": {"kind": "ellipse", "count": 32.0, "fill": [1, 1, 1, 0.92], "stroke": [0, 0, 0, 0], "stroke_width": 0.0, "corner_radius": 0.0, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 1}, "sindri.script": {"source": "scripts/drift.decay", "script": "Drift", "properties": {"factor": 0.3, "span": 32.0, "idle": 0.25}}}},
    {"id": "cloud-2-0", "name": "Cloud 2.0", "transform_3d": {"position": [4.0, 4.4, -1.8], "rotation": [0, 0, 0, 1], "scale": [2.64, 1.32, 1]}, "components": {"sindri.shape": {"kind": "ellipse", "count": 32.0, "fill": [1, 1, 1, 0.92], "stroke": [0, 0, 0, 0], "stroke_width": 0.0, "corner_radius": 0.0, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 1}, "sindri.script": {"source": "scripts/drift.decay", "script": "Drift", "properties": {"factor": 0.3, "span": 32.0, "idle": 0.25}}}},
    {"id": "cloud-2-1", "name": "Cloud 2.1", "transform_3d": {"position": [2.92, 4.16, -1.8], "rotation": [0, 0, 0, 1], "scale": [1.68, 0.96, 1]}, "components": {"sindri.shape": {"kind": "ellipse", "count": 32.0, "fill": [1, 1, 1, 0.92], "stroke": [0, 0, 0, 0], "stroke_width": 0.0, "corner_radius": 0.0, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 1}, "sindri.script": {"source": "scripts/drift.decay", "script": "Drift", "properties": {"factor": 0.3, "span": 32.0, "idle": 0.25}}}},
    {"id": "cloud-2-2", "name": "Cloud 2.2", "transform_3d": {"position": [5.08, 4.16, -1.8], "rotation": [0, 0, 0, 1], "scale": [1.92, 0.96, 1]}, "components": {"sindri.shape": {"kind": "ellipse", "count": 32.0, "fill": [1, 1, 1, 0.92], "stroke": [0, 0, 0, 0], "stroke_width": 0.0, "corner_radius": 0.0, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 1}, "sindri.script": {"source": "scripts/drift.decay", "script": "Drift", "properties": {"factor": 0.3, "span": 32.0, "idle": 0.25}}}},
    {"id": "cloud-3-0", "name": "Cloud 3.0", "transform_3d": {"position": [10.0, 3.0, -1.8], "rotation": [0, 0, 0, 1], "scale": [1.7600000000000002, 0.8800000000000001, 1]}, "components": {"sindri.shape": {"kind": "ellipse", "count": 32.0, "fill": [1, 1, 1, 0.92], "stroke": [0, 0, 0, 0], "stroke_width": 0.0, "corner_radius": 0.0, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 1}, "sindri.script": {"source": "scripts/drift.decay", "script": "Drift", "properties": {"factor": 0.3, "span": 32.0, "idle": 0.25}}}},
    {"id": "cloud-3-1", "name": "Cloud 3.1", "transform_3d": {"position": [9.28, 2.84, -1.8], "rotation": [0, 0, 0, 1], "scale": [1.1199999999999999, 0.6400000000000001, 1]}, "components": {"sindri.shape": {"kind": "ellipse", "count": 32.0, "fill": [1, 1, 1, 0.92], "stroke": [0, 0, 0, 0], "stroke_width": 0.0, "corner_radius": 0.0, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 1}, "sindri.script": {"source": "scripts/drift.decay", "script": "Drift", "properties": {"factor": 0.3, "span": 32.0, "idle": 0.25}}}},
    {"id": "cloud-3-2", "name": "Cloud 3.2", "transform_3d": {"position": [10.72, 2.84, -1.8], "rotation": [0, 0, 0, 1], "scale": [1.2800000000000002, 0.6400000000000001, 1]}, "components": {"sindri.shape": {"kind": "ellipse", "count": 32.0, "fill": [1, 1, 1, 0.92], "stroke": [0, 0, 0, 0], "stroke_width": 0.0, "corner_radius": 0.0, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 1}, "sindri.script": {"source": "scripts/drift.decay", "script": "Drift", "properties": {"factor": 0.3, "span": 32.0, "idle": 0.25}}}},
    {"id": "cloud-4-0", "name": "Cloud 4.0", "transform_3d": {"position": [15.0, 4.2, -1.8], "rotation": [0, 0, 0, 1], "scale": [2.2, 1.1, 1]}, "components": {"sindri.shape": {"kind": "ellipse", "count": 32.0, "fill": [1, 1, 1, 0.92], "stroke": [0, 0, 0, 0], "stroke_width": 0.0, "corner_radius": 0.0, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 1}, "sindri.script": {"source": "scripts/drift.decay", "script": "Drift", "properties": {"factor": 0.3, "span": 32.0, "idle": 0.25}}}},
    {"id": "cloud-4-1", "name": "Cloud 4.1", "transform_3d": {"position": [14.1, 4.0, -1.8], "rotation": [0, 0, 0, 1], "scale": [1.4, 0.8, 1]}, "components": {"sindri.shape": {"kind": "ellipse", "count": 32.0, "fill": [1, 1, 1, 0.92], "stroke": [0, 0, 0, 0], "stroke_width": 0.0, "corner_radius": 0.0, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 1}, "sindri.script": {"source": "scripts/drift.decay", "script": "Drift", "properties": {"factor": 0.3, "span": 32.0, "idle": 0.25}}}},
    {"id": "cloud-4-2", "name": "Cloud 4.2", "transform_3d": {"position": [15.9, 4.0, -1.8], "rotation": [0, 0, 0, 1], "scale": [1.6, 0.8, 1]}, "components": {"sindri.shape": {"kind": "ellipse", "count": 32.0, "fill": [1, 1, 1, 0.92], "stroke": [0, 0, 0, 0], "stroke_width": 0.0, "corner_radius": 0.0, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 1}, "sindri.script": {"source": "scripts/drift.decay", "script": "Drift", "properties": {"factor": 0.3, "span": 32.0, "idle": 0.25}}}},
    {"id": "pipe-a-top", "name": "Pipe a Top", "transform_3d": {"position": [6.0, 6.7, 0.5], "rotation": [0, 0, 0, 1], "scale": [1.5, 10.0, 1]}, "components": {"sindri.tags": {"tags": ["scroll", "hazard"]}, "sindri.shape": {"kind": "rect", "count": 4.0, "fill": [0.36, 0.78, 0.22, 1.0], "stroke": [0.12, 0.33, 0.07, 1.0], "stroke_width": 0.08, "corner_radius": 0.04, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 3}, "sindri.physics2d.collider": {"shape": {"shape": "box", "half_extents": [0.75, 5.0]}, "offset": [0, 0], "rotation": 0.0, "sensor": true, "layers": {"memberships": 2, "filter": 1}, "friction": 0.0, "restitution": 0.0}, "sindri.script": {"source": "scripts/pipe.decay", "script": "Pipe", "properties": {"offset": 6.7, "seed": 1.0}}}},
    {"id": "pipe-a-bottom", "name": "Pipe a Bottom", "transform_3d": {"position": [6.0, -6.7, 0.5], "rotation": [0, 0, 0, 1], "scale": [1.5, 10.0, 1]}, "components": {"sindri.tags": {"tags": ["scroll", "hazard"]}, "sindri.shape": {"kind": "rect", "count": 4.0, "fill": [0.36, 0.78, 0.22, 1.0], "stroke": [0.12, 0.33, 0.07, 1.0], "stroke_width": 0.08, "corner_radius": 0.04, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 3}, "sindri.physics2d.collider": {"shape": {"shape": "box", "half_extents": [0.75, 5.0]}, "offset": [0, 0], "rotation": 0.0, "sensor": true, "layers": {"memberships": 2, "filter": 1}, "friction": 0.0, "restitution": 0.0}, "sindri.script": {"source": "scripts/pipe.decay", "script": "Pipe", "properties": {"offset": -6.7, "seed": 1.0}}}},
    {"id": "cap-a-top", "name": "Cap a Top", "transform_3d": {"position": [6.0, 2.0, 0.5], "rotation": [0, 0, 0, 1], "scale": [1.9, 0.6, 1]}, "components": {"sindri.tags": {"tags": ["scroll", "hazard"]}, "sindri.shape": {"kind": "rect", "count": 4.0, "fill": [0.44, 0.86, 0.28, 1.0], "stroke": [0.12, 0.33, 0.07, 1.0], "stroke_width": 0.08, "corner_radius": 0.1, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 4}, "sindri.physics2d.collider": {"shape": {"shape": "box", "half_extents": [0.95, 0.3]}, "offset": [0, 0], "rotation": 0.0, "sensor": true, "layers": {"memberships": 2, "filter": 1}, "friction": 0.0, "restitution": 0.0}, "sindri.script": {"source": "scripts/pipe.decay", "script": "Pipe", "properties": {"offset": 2.0, "seed": 1.0}}}},
    {"id": "cap-a-bottom", "name": "Cap a Bottom", "transform_3d": {"position": [6.0, -2.0, 0.5], "rotation": [0, 0, 0, 1], "scale": [1.9, 0.6, 1]}, "components": {"sindri.tags": {"tags": ["scroll", "hazard"]}, "sindri.shape": {"kind": "rect", "count": 4.0, "fill": [0.44, 0.86, 0.28, 1.0], "stroke": [0.12, 0.33, 0.07, 1.0], "stroke_width": 0.08, "corner_radius": 0.1, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 4}, "sindri.physics2d.collider": {"shape": {"shape": "box", "half_extents": [0.95, 0.3]}, "offset": [0, 0], "rotation": 0.0, "sensor": true, "layers": {"memberships": 2, "filter": 1}, "friction": 0.0, "restitution": 0.0}, "sindri.script": {"source": "scripts/pipe.decay", "script": "Pipe", "properties": {"offset": -2.0, "seed": 1.0}}}},
    {"id": "score-a", "name": "Score a", "transform_3d": {"position": [6.0, 0.0, 0.5], "rotation": [0, 0, 0, 1], "scale": [0.25, 3.4, 1]}, "components": {"sindri.tags": {"tags": ["scroll", "score"]}, "sindri.physics2d.collider": {"shape": {"shape": "box", "half_extents": [0.12, 1.7]}, "offset": [0, 0], "rotation": 0.0, "sensor": true, "layers": {"memberships": 2, "filter": 1}, "friction": 0.0, "restitution": 0.0}, "sindri.script": {"source": "scripts/pipe.decay", "script": "Pipe", "properties": {"offset": 0.0, "seed": 1.0}}}},
    {"id": "pipe-b-top", "name": "Pipe b Top", "transform_3d": {"position": [10.6, 6.7, 0.5], "rotation": [0, 0, 0, 1], "scale": [1.5, 10.0, 1]}, "components": {"sindri.tags": {"tags": ["scroll", "hazard"]}, "sindri.shape": {"kind": "rect", "count": 4.0, "fill": [0.36, 0.78, 0.22, 1.0], "stroke": [0.12, 0.33, 0.07, 1.0], "stroke_width": 0.08, "corner_radius": 0.04, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 3}, "sindri.physics2d.collider": {"shape": {"shape": "box", "half_extents": [0.75, 5.0]}, "offset": [0, 0], "rotation": 0.0, "sensor": true, "layers": {"memberships": 2, "filter": 1}, "friction": 0.0, "restitution": 0.0}, "sindri.script": {"source": "scripts/pipe.decay", "script": "Pipe", "properties": {"offset": 6.7, "seed": 2.0}}}},
    {"id": "pipe-b-bottom", "name": "Pipe b Bottom", "transform_3d": {"position": [10.6, -6.7, 0.5], "rotation": [0, 0, 0, 1], "scale": [1.5, 10.0, 1]}, "components": {"sindri.tags": {"tags": ["scroll", "hazard"]}, "sindri.shape": {"kind": "rect", "count": 4.0, "fill": [0.36, 0.78, 0.22, 1.0], "stroke": [0.12, 0.33, 0.07, 1.0], "stroke_width": 0.08, "corner_radius": 0.04, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 3}, "sindri.physics2d.collider": {"shape": {"shape": "box", "half_extents": [0.75, 5.0]}, "offset": [0, 0], "rotation": 0.0, "sensor": true, "layers": {"memberships": 2, "filter": 1}, "friction": 0.0, "restitution": 0.0}, "sindri.script": {"source": "scripts/pipe.decay", "script": "Pipe", "properties": {"offset": -6.7, "seed": 2.0}}}},
    {"id": "cap-b-top", "name": "Cap b Top", "transform_3d": {"position": [10.6, 2.0, 0.5], "rotation": [0, 0, 0, 1], "scale": [1.9, 0.6, 1]}, "components": {"sindri.tags": {"tags": ["scroll", "hazard"]}, "sindri.shape": {"kind": "rect", "count": 4.0, "fill": [0.44, 0.86, 0.28, 1.0], "stroke": [0.12, 0.33, 0.07, 1.0], "stroke_width": 0.08, "corner_radius": 0.1, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 4}, "sindri.physics2d.collider": {"shape": {"shape": "box", "half_extents": [0.95, 0.3]}, "offset": [0, 0], "rotation": 0.0, "sensor": true, "layers": {"memberships": 2, "filter": 1}, "friction": 0.0, "restitution": 0.0}, "sindri.script": {"source": "scripts/pipe.decay", "script": "Pipe", "properties": {"offset": 2.0, "seed": 2.0}}}},
    {"id": "cap-b-bottom", "name": "Cap b Bottom", "transform_3d": {"position": [10.6, -2.0, 0.5], "rotation": [0, 0, 0, 1], "scale": [1.9, 0.6, 1]}, "components": {"sindri.tags": {"tags": ["scroll", "hazard"]}, "sindri.shape": {"kind": "rect", "count": 4.0, "fill": [0.44, 0.86, 0.28, 1.0], "stroke": [0.12, 0.33, 0.07, 1.0], "stroke_width": 0.08, "corner_radius": 0.1, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 4}, "sindri.physics2d.collider": {"shape": {"shape": "box", "half_extents": [0.95, 0.3]}, "offset": [0, 0], "rotation": 0.0, "sensor": true, "layers": {"memberships": 2, "filter": 1}, "friction": 0.0, "restitution": 0.0}, "sindri.script": {"source": "scripts/pipe.decay", "script": "Pipe", "properties": {"offset": -2.0, "seed": 2.0}}}},
    {"id": "score-b", "name": "Score b", "transform_3d": {"position": [10.6, 0.0, 0.5], "rotation": [0, 0, 0, 1], "scale": [0.25, 3.4, 1]}, "components": {"sindri.tags": {"tags": ["scroll", "score"]}, "sindri.physics2d.collider": {"shape": {"shape": "box", "half_extents": [0.12, 1.7]}, "offset": [0, 0], "rotation": 0.0, "sensor": true, "layers": {"memberships": 2, "filter": 1}, "friction": 0.0, "restitution": 0.0}, "sindri.script": {"source": "scripts/pipe.decay", "script": "Pipe", "properties": {"offset": 0.0, "seed": 2.0}}}},
    {"id": "pipe-c-top", "name": "Pipe c Top", "transform_3d": {"position": [15.2, 6.7, 0.5], "rotation": [0, 0, 0, 1], "scale": [1.5, 10.0, 1]}, "components": {"sindri.tags": {"tags": ["scroll", "hazard"]}, "sindri.shape": {"kind": "rect", "count": 4.0, "fill": [0.36, 0.78, 0.22, 1.0], "stroke": [0.12, 0.33, 0.07, 1.0], "stroke_width": 0.08, "corner_radius": 0.04, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 3}, "sindri.physics2d.collider": {"shape": {"shape": "box", "half_extents": [0.75, 5.0]}, "offset": [0, 0], "rotation": 0.0, "sensor": true, "layers": {"memberships": 2, "filter": 1}, "friction": 0.0, "restitution": 0.0}, "sindri.script": {"source": "scripts/pipe.decay", "script": "Pipe", "properties": {"offset": 6.7, "seed": 3.0}}}},
    {"id": "pipe-c-bottom", "name": "Pipe c Bottom", "transform_3d": {"position": [15.2, -6.7, 0.5], "rotation": [0, 0, 0, 1], "scale": [1.5, 10.0, 1]}, "components": {"sindri.tags": {"tags": ["scroll", "hazard"]}, "sindri.shape": {"kind": "rect", "count": 4.0, "fill": [0.36, 0.78, 0.22, 1.0], "stroke": [0.12, 0.33, 0.07, 1.0], "stroke_width": 0.08, "corner_radius": 0.04, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 3}, "sindri.physics2d.collider": {"shape": {"shape": "box", "half_extents": [0.75, 5.0]}, "offset": [0, 0], "rotation": 0.0, "sensor": true, "layers": {"memberships": 2, "filter": 1}, "friction": 0.0, "restitution": 0.0}, "sindri.script": {"source": "scripts/pipe.decay", "script": "Pipe", "properties": {"offset": -6.7, "seed": 3.0}}}},
    {"id": "cap-c-top", "name": "Cap c Top", "transform_3d": {"position": [15.2, 2.0, 0.5], "rotation": [0, 0, 0, 1], "scale": [1.9, 0.6, 1]}, "components": {"sindri.tags": {"tags": ["scroll", "hazard"]}, "sindri.shape": {"kind": "rect", "count": 4.0, "fill": [0.44, 0.86, 0.28, 1.0], "stroke": [0.12, 0.33, 0.07, 1.0], "stroke_width": 0.08, "corner_radius": 0.1, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 4}, "sindri.physics2d.collider": {"shape": {"shape": "box", "half_extents": [0.95, 0.3]}, "offset": [0, 0], "rotation": 0.0, "sensor": true, "layers": {"memberships": 2, "filter": 1}, "friction": 0.0, "restitution": 0.0}, "sindri.script": {"source": "scripts/pipe.decay", "script": "Pipe", "properties": {"offset": 2.0, "seed": 3.0}}}},
    {"id": "cap-c-bottom", "name": "Cap c Bottom", "transform_3d": {"position": [15.2, -2.0, 0.5], "rotation": [0, 0, 0, 1], "scale": [1.9, 0.6, 1]}, "components": {"sindri.tags": {"tags": ["scroll", "hazard"]}, "sindri.shape": {"kind": "rect", "count": 4.0, "fill": [0.44, 0.86, 0.28, 1.0], "stroke": [0.12, 0.33, 0.07, 1.0], "stroke_width": 0.08, "corner_radius": 0.1, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 4}, "sindri.physics2d.collider": {"shape": {"shape": "box", "half_extents": [0.95, 0.3]}, "offset": [0, 0], "rotation": 0.0, "sensor": true, "layers": {"memberships": 2, "filter": 1}, "friction": 0.0, "restitution": 0.0}, "sindri.script": {"source": "scripts/pipe.decay", "script": "Pipe", "properties": {"offset": -2.0, "seed": 3.0}}}},
    {"id": "score-c", "name": "Score c", "transform_3d": {"position": [15.2, 0.0, 0.5], "rotation": [0, 0, 0, 1], "scale": [0.25, 3.4, 1]}, "components": {"sindri.tags": {"tags": ["scroll", "score"]}, "sindri.physics2d.collider": {"shape": {"shape": "box", "half_extents": [0.12, 1.7]}, "offset": [0, 0], "rotation": 0.0, "sensor": true, "layers": {"memberships": 2, "filter": 1}, "friction": 0.0, "restitution": 0.0}, "sindri.script": {"source": "scripts/pipe.decay", "script": "Pipe", "properties": {"offset": 0.0, "seed": 3.0}}}},
    {"id": "pipe-d-top", "name": "Pipe d Top", "transform_3d": {"position": [19.799999999999997, 6.7, 0.5], "rotation": [0, 0, 0, 1], "scale": [1.5, 10.0, 1]}, "components": {"sindri.tags": {"tags": ["scroll", "hazard"]}, "sindri.shape": {"kind": "rect", "count": 4.0, "fill": [0.36, 0.78, 0.22, 1.0], "stroke": [0.12, 0.33, 0.07, 1.0], "stroke_width": 0.08, "corner_radius": 0.04, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 3}, "sindri.physics2d.collider": {"shape": {"shape": "box", "half_extents": [0.75, 5.0]}, "offset": [0, 0], "rotation": 0.0, "sensor": true, "layers": {"memberships": 2, "filter": 1}, "friction": 0.0, "restitution": 0.0}, "sindri.script": {"source": "scripts/pipe.decay", "script": "Pipe", "properties": {"offset": 6.7, "seed": 4.0}}}},
    {"id": "pipe-d-bottom", "name": "Pipe d Bottom", "transform_3d": {"position": [19.799999999999997, -6.7, 0.5], "rotation": [0, 0, 0, 1], "scale": [1.5, 10.0, 1]}, "components": {"sindri.tags": {"tags": ["scroll", "hazard"]}, "sindri.shape": {"kind": "rect", "count": 4.0, "fill": [0.36, 0.78, 0.22, 1.0], "stroke": [0.12, 0.33, 0.07, 1.0], "stroke_width": 0.08, "corner_radius": 0.04, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 3}, "sindri.physics2d.collider": {"shape": {"shape": "box", "half_extents": [0.75, 5.0]}, "offset": [0, 0], "rotation": 0.0, "sensor": true, "layers": {"memberships": 2, "filter": 1}, "friction": 0.0, "restitution": 0.0}, "sindri.script": {"source": "scripts/pipe.decay", "script": "Pipe", "properties": {"offset": -6.7, "seed": 4.0}}}},
    {"id": "cap-d-top", "name": "Cap d Top", "transform_3d": {"position": [19.799999999999997, 2.0, 0.5], "rotation": [0, 0, 0, 1], "scale": [1.9, 0.6, 1]}, "components": {"sindri.tags": {"tags": ["scroll", "hazard"]}, "sindri.shape": {"kind": "rect", "count": 4.0, "fill": [0.44, 0.86, 0.28, 1.0], "stroke": [0.12, 0.33, 0.07, 1.0], "stroke_width": 0.08, "corner_radius": 0.1, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 4}, "sindri.physics2d.collider": {"shape": {"shape": "box", "half_extents": [0.95, 0.3]}, "offset": [0, 0], "rotation": 0.0, "sensor": true, "layers": {"memberships": 2, "filter": 1}, "friction": 0.0, "restitution": 0.0}, "sindri.script": {"source": "scripts/pipe.decay", "script": "Pipe", "properties": {"offset": 2.0, "seed": 4.0}}}},
    {"id": "cap-d-bottom", "name": "Cap d Bottom", "transform_3d": {"position": [19.799999999999997, -2.0, 0.5], "rotation": [0, 0, 0, 1], "scale": [1.9, 0.6, 1]}, "components": {"sindri.tags": {"tags": ["scroll", "hazard"]}, "sindri.shape": {"kind": "rect", "count": 4.0, "fill": [0.44, 0.86, 0.28, 1.0], "stroke": [0.12, 0.33, 0.07, 1.0], "stroke_width": 0.08, "corner_radius": 0.1, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 4}, "sindri.physics2d.collider": {"shape": {"shape": "box", "half_extents": [0.95, 0.3]}, "offset": [0, 0], "rotation": 0.0, "sensor": true, "layers": {"memberships": 2, "filter": 1}, "friction": 0.0, "restitution": 0.0}, "sindri.script": {"source": "scripts/pipe.decay", "script": "Pipe", "properties": {"offset": -2.0, "seed": 4.0}}}},
    {"id": "score-d", "name": "Score d", "transform_3d": {"position": [19.799999999999997, 0.0, 0.5], "rotation": [0, 0, 0, 1], "scale": [0.25, 3.4, 1]}, "components": {"sindri.tags": {"tags": ["scroll", "score"]}, "sindri.physics2d.collider": {"shape": {"shape": "box", "half_extents": [0.12, 1.7]}, "offset": [0, 0], "rotation": 0.0, "sensor": true, "layers": {"memberships": 2, "filter": 1}, "friction": 0.0, "restitution": 0.0}, "sindri.script": {"source": "scripts/pipe.decay", "script": "Pipe", "properties": {"offset": 0.0, "seed": 4.0}}}},
    {"id": "pipe-e-top", "name": "Pipe e Top", "transform_3d": {"position": [24.4, 6.7, 0.5], "rotation": [0, 0, 0, 1], "scale": [1.5, 10.0, 1]}, "components": {"sindri.tags": {"tags": ["scroll", "hazard"]}, "sindri.shape": {"kind": "rect", "count": 4.0, "fill": [0.36, 0.78, 0.22, 1.0], "stroke": [0.12, 0.33, 0.07, 1.0], "stroke_width": 0.08, "corner_radius": 0.04, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 3}, "sindri.physics2d.collider": {"shape": {"shape": "box", "half_extents": [0.75, 5.0]}, "offset": [0, 0], "rotation": 0.0, "sensor": true, "layers": {"memberships": 2, "filter": 1}, "friction": 0.0, "restitution": 0.0}, "sindri.script": {"source": "scripts/pipe.decay", "script": "Pipe", "properties": {"offset": 6.7, "seed": 5.0}}}},
    {"id": "pipe-e-bottom", "name": "Pipe e Bottom", "transform_3d": {"position": [24.4, -6.7, 0.5], "rotation": [0, 0, 0, 1], "scale": [1.5, 10.0, 1]}, "components": {"sindri.tags": {"tags": ["scroll", "hazard"]}, "sindri.shape": {"kind": "rect", "count": 4.0, "fill": [0.36, 0.78, 0.22, 1.0], "stroke": [0.12, 0.33, 0.07, 1.0], "stroke_width": 0.08, "corner_radius": 0.04, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 3}, "sindri.physics2d.collider": {"shape": {"shape": "box", "half_extents": [0.75, 5.0]}, "offset": [0, 0], "rotation": 0.0, "sensor": true, "layers": {"memberships": 2, "filter": 1}, "friction": 0.0, "restitution": 0.0}, "sindri.script": {"source": "scripts/pipe.decay", "script": "Pipe", "properties": {"offset": -6.7, "seed": 5.0}}}},
    {"id": "cap-e-top", "name": "Cap e Top", "transform_3d": {"position": [24.4, 2.0, 0.5], "rotation": [0, 0, 0, 1], "scale": [1.9, 0.6, 1]}, "components": {"sindri.tags": {"tags": ["scroll", "hazard"]}, "sindri.shape": {"kind": "rect", "count": 4.0, "fill": [0.44, 0.86, 0.28, 1.0], "stroke": [0.12, 0.33, 0.07, 1.0], "stroke_width": 0.08, "corner_radius": 0.1, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 4}, "sindri.physics2d.collider": {"shape": {"shape": "box", "half_extents": [0.95, 0.3]}, "offset": [0, 0], "rotation": 0.0, "sensor": true, "layers": {"memberships": 2, "filter": 1}, "friction": 0.0, "restitution": 0.0}, "sindri.script": {"source": "scripts/pipe.decay", "script": "Pipe", "properties": {"offset": 2.0, "seed": 5.0}}}},
    {"id": "cap-e-bottom", "name": "Cap e Bottom", "transform_3d": {"position": [24.4, -2.0, 0.5], "rotation": [0, 0, 0, 1], "scale": [1.9, 0.6, 1]}, "components": {"sindri.tags": {"tags": ["scroll", "hazard"]}, "sindri.shape": {"kind": "rect", "count": 4.0, "fill": [0.44, 0.86, 0.28, 1.0], "stroke": [0.12, 0.33, 0.07, 1.0], "stroke_width": 0.08, "corner_radius": 0.1, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 4}, "sindri.physics2d.collider": {"shape": {"shape": "box", "half_extents": [0.95, 0.3]}, "offset": [0, 0], "rotation": 0.0, "sensor": true, "layers": {"memberships": 2, "filter": 1}, "friction": 0.0, "restitution": 0.0}, "sindri.script": {"source": "scripts/pipe.decay", "script": "Pipe", "properties": {"offset": -2.0, "seed": 5.0}}}},
    {"id": "score-e", "name": "Score e", "transform_3d": {"position": [24.4, 0.0, 0.5], "rotation": [0, 0, 0, 1], "scale": [0.25, 3.4, 1]}, "components": {"sindri.tags": {"tags": ["scroll", "score"]}, "sindri.physics2d.collider": {"shape": {"shape": "box", "half_extents": [0.12, 1.7]}, "offset": [0, 0], "rotation": 0.0, "sensor": true, "layers": {"memberships": 2, "filter": 1}, "friction": 0.0, "restitution": 0.0}, "sindri.script": {"source": "scripts/pipe.decay", "script": "Pipe", "properties": {"offset": 0.0, "seed": 5.0}}}},
    {"id": "ground", "name": "Ground", "transform_3d": {"position": [0, -5.6, 2], "rotation": [0, 0, 0, 1], "scale": [60, 1.6, 1]}, "components": {"sindri.shape": {"kind": "rect", "count": 4.0, "fill": [0.87, 0.8, 0.52, 1], "stroke": [0, 0, 0, 0], "stroke_width": 0.0, "corner_radius": 0.0, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 6}}},
    {"id": "grass", "name": "Grass", "transform_3d": {"position": [0, -4.85, 2.1], "rotation": [0, 0, 0, 1], "scale": [60, 0.3, 1]}, "components": {"sindri.shape": {"kind": "rect", "count": 4.0, "fill": [0.45, 0.8, 0.25, 1], "stroke": [0.2, 0.45, 0.1, 1], "stroke_width": 0.06, "corner_radius": 0.0, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 7}}},
    {"id": "stripe-0", "name": "Stripe 0", "transform_3d": {"position": [-16.0, -5.2, 2.2], "rotation": [0, 0, 0, 1], "scale": [0.9, 0.25, 1]}, "components": {"sindri.shape": {"kind": "rect", "count": 4.0, "fill": [0.8, 0.72, 0.44, 1], "stroke": [0, 0, 0, 0], "stroke_width": 0.0, "corner_radius": 0.1, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 7}, "sindri.script": {"source": "scripts/drift.decay", "script": "Drift", "properties": {"factor": 1.0, "span": 32.0}}}},
    {"id": "stripe-1", "name": "Stripe 1", "transform_3d": {"position": [-14.0, -5.2, 2.2], "rotation": [0, 0, 0, 1], "scale": [0.9, 0.25, 1]}, "components": {"sindri.shape": {"kind": "rect", "count": 4.0, "fill": [0.8, 0.72, 0.44, 1], "stroke": [0, 0, 0, 0], "stroke_width": 0.0, "corner_radius": 0.1, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 7}, "sindri.script": {"source": "scripts/drift.decay", "script": "Drift", "properties": {"factor": 1.0, "span": 32.0}}}},
    {"id": "stripe-2", "name": "Stripe 2", "transform_3d": {"position": [-12.0, -5.2, 2.2], "rotation": [0, 0, 0, 1], "scale": [0.9, 0.25, 1]}, "components": {"sindri.shape": {"kind": "rect", "count": 4.0, "fill": [0.8, 0.72, 0.44, 1], "stroke": [0, 0, 0, 0], "stroke_width": 0.0, "corner_radius": 0.1, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 7}, "sindri.script": {"source": "scripts/drift.decay", "script": "Drift", "properties": {"factor": 1.0, "span": 32.0}}}},
    {"id": "stripe-3", "name": "Stripe 3", "transform_3d": {"position": [-10.0, -5.2, 2.2], "rotation": [0, 0, 0, 1], "scale": [0.9, 0.25, 1]}, "components": {"sindri.shape": {"kind": "rect", "count": 4.0, "fill": [0.8, 0.72, 0.44, 1], "stroke": [0, 0, 0, 0], "stroke_width": 0.0, "corner_radius": 0.1, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 7}, "sindri.script": {"source": "scripts/drift.decay", "script": "Drift", "properties": {"factor": 1.0, "span": 32.0}}}},
    {"id": "stripe-4", "name": "Stripe 4", "transform_3d": {"position": [-8.0, -5.2, 2.2], "rotation": [0, 0, 0, 1], "scale": [0.9, 0.25, 1]}, "components": {"sindri.shape": {"kind": "rect", "count": 4.0, "fill": [0.8, 0.72, 0.44, 1], "stroke": [0, 0, 0, 0], "stroke_width": 0.0, "corner_radius": 0.1, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 7}, "sindri.script": {"source": "scripts/drift.decay", "script": "Drift", "properties": {"factor": 1.0, "span": 32.0}}}},
    {"id": "stripe-5", "name": "Stripe 5", "transform_3d": {"position": [-6.0, -5.2, 2.2], "rotation": [0, 0, 0, 1], "scale": [0.9, 0.25, 1]}, "components": {"sindri.shape": {"kind": "rect", "count": 4.0, "fill": [0.8, 0.72, 0.44, 1], "stroke": [0, 0, 0, 0], "stroke_width": 0.0, "corner_radius": 0.1, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 7}, "sindri.script": {"source": "scripts/drift.decay", "script": "Drift", "properties": {"factor": 1.0, "span": 32.0}}}},
    {"id": "stripe-6", "name": "Stripe 6", "transform_3d": {"position": [-4.0, -5.2, 2.2], "rotation": [0, 0, 0, 1], "scale": [0.9, 0.25, 1]}, "components": {"sindri.shape": {"kind": "rect", "count": 4.0, "fill": [0.8, 0.72, 0.44, 1], "stroke": [0, 0, 0, 0], "stroke_width": 0.0, "corner_radius": 0.1, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 7}, "sindri.script": {"source": "scripts/drift.decay", "script": "Drift", "properties": {"factor": 1.0, "span": 32.0}}}},
    {"id": "stripe-7", "name": "Stripe 7", "transform_3d": {"position": [-2.0, -5.2, 2.2], "rotation": [0, 0, 0, 1], "scale": [0.9, 0.25, 1]}, "components": {"sindri.shape": {"kind": "rect", "count": 4.0, "fill": [0.8, 0.72, 0.44, 1], "stroke": [0, 0, 0, 0], "stroke_width": 0.0, "corner_radius": 0.1, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 7}, "sindri.script": {"source": "scripts/drift.decay", "script": "Drift", "properties": {"factor": 1.0, "span": 32.0}}}},
    {"id": "stripe-8", "name": "Stripe 8", "transform_3d": {"position": [0.0, -5.2, 2.2], "rotation": [0, 0, 0, 1], "scale": [0.9, 0.25, 1]}, "components": {"sindri.shape": {"kind": "rect", "count": 4.0, "fill": [0.8, 0.72, 0.44, 1], "stroke": [0, 0, 0, 0], "stroke_width": 0.0, "corner_radius": 0.1, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 7}, "sindri.script": {"source": "scripts/drift.decay", "script": "Drift", "properties": {"factor": 1.0, "span": 32.0}}}},
    {"id": "stripe-9", "name": "Stripe 9", "transform_3d": {"position": [2.0, -5.2, 2.2], "rotation": [0, 0, 0, 1], "scale": [0.9, 0.25, 1]}, "components": {"sindri.shape": {"kind": "rect", "count": 4.0, "fill": [0.8, 0.72, 0.44, 1], "stroke": [0, 0, 0, 0], "stroke_width": 0.0, "corner_radius": 0.1, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 7}, "sindri.script": {"source": "scripts/drift.decay", "script": "Drift", "properties": {"factor": 1.0, "span": 32.0}}}},
    {"id": "stripe-10", "name": "Stripe 10", "transform_3d": {"position": [4.0, -5.2, 2.2], "rotation": [0, 0, 0, 1], "scale": [0.9, 0.25, 1]}, "components": {"sindri.shape": {"kind": "rect", "count": 4.0, "fill": [0.8, 0.72, 0.44, 1], "stroke": [0, 0, 0, 0], "stroke_width": 0.0, "corner_radius": 0.1, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 7}, "sindri.script": {"source": "scripts/drift.decay", "script": "Drift", "properties": {"factor": 1.0, "span": 32.0}}}},
    {"id": "stripe-11", "name": "Stripe 11", "transform_3d": {"position": [6.0, -5.2, 2.2], "rotation": [0, 0, 0, 1], "scale": [0.9, 0.25, 1]}, "components": {"sindri.shape": {"kind": "rect", "count": 4.0, "fill": [0.8, 0.72, 0.44, 1], "stroke": [0, 0, 0, 0], "stroke_width": 0.0, "corner_radius": 0.1, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 7}, "sindri.script": {"source": "scripts/drift.decay", "script": "Drift", "properties": {"factor": 1.0, "span": 32.0}}}},
    {"id": "stripe-12", "name": "Stripe 12", "transform_3d": {"position": [8.0, -5.2, 2.2], "rotation": [0, 0, 0, 1], "scale": [0.9, 0.25, 1]}, "components": {"sindri.shape": {"kind": "rect", "count": 4.0, "fill": [0.8, 0.72, 0.44, 1], "stroke": [0, 0, 0, 0], "stroke_width": 0.0, "corner_radius": 0.1, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 7}, "sindri.script": {"source": "scripts/drift.decay", "script": "Drift", "properties": {"factor": 1.0, "span": 32.0}}}},
    {"id": "stripe-13", "name": "Stripe 13", "transform_3d": {"position": [10.0, -5.2, 2.2], "rotation": [0, 0, 0, 1], "scale": [0.9, 0.25, 1]}, "components": {"sindri.shape": {"kind": "rect", "count": 4.0, "fill": [0.8, 0.72, 0.44, 1], "stroke": [0, 0, 0, 0], "stroke_width": 0.0, "corner_radius": 0.1, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 7}, "sindri.script": {"source": "scripts/drift.decay", "script": "Drift", "properties": {"factor": 1.0, "span": 32.0}}}},
    {"id": "stripe-14", "name": "Stripe 14", "transform_3d": {"position": [12.0, -5.2, 2.2], "rotation": [0, 0, 0, 1], "scale": [0.9, 0.25, 1]}, "components": {"sindri.shape": {"kind": "rect", "count": 4.0, "fill": [0.8, 0.72, 0.44, 1], "stroke": [0, 0, 0, 0], "stroke_width": 0.0, "corner_radius": 0.1, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 7}, "sindri.script": {"source": "scripts/drift.decay", "script": "Drift", "properties": {"factor": 1.0, "span": 32.0}}}},
    {"id": "stripe-15", "name": "Stripe 15", "transform_3d": {"position": [14.0, -5.2, 2.2], "rotation": [0, 0, 0, 1], "scale": [0.9, 0.25, 1]}, "components": {"sindri.shape": {"kind": "rect", "count": 4.0, "fill": [0.8, 0.72, 0.44, 1], "stroke": [0, 0, 0, 0], "stroke_width": 0.0, "corner_radius": 0.1, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 7}, "sindri.script": {"source": "scripts/drift.decay", "script": "Drift", "properties": {"factor": 1.0, "span": 32.0}}}},
    {"id": "bird", "name": "Bird", "transform_3d": {"position": [-1.5, 0.5, 1.0], "rotation": [0, 0, 0, 1], "scale": [1, 1, 1]}, "components": {"sindri.tags": {"tags": ["bird"]}, "sindri.physics2d.rigid_body": {"kind": "dynamic", "pose": {"position": [-1.5, 0.5], "rotation": 0.0}, "linear_velocity": [0, 0], "angular_velocity": 0.0, "gravity_scale": 1.0, "linear_damping": 0.0, "angular_damping": 0.0, "lock_rotation": true}, "sindri.physics2d.collider": {"shape": {"shape": "circle", "radius": 0.36}, "offset": [0, 0], "rotation": 0.0, "sensor": true, "layers": {"memberships": 1, "filter": 2}, "friction": 0.0, "restitution": 0.0}, "sindri.script": {"source": "scripts/bird.decay", "script": "Bird", "properties": {}}}},
    {"id": "bird-look", "name": "BirdLook", "parent": "bird", "transform_3d": {"position": [0, 0, 0], "rotation": [0, 0, 0, 1], "scale": [1, 1, 1]}, "components": {}},
    {"id": "bird-body", "name": "BirdBody", "parent": "bird-look", "transform_3d": {"position": [0, 0, 0], "rotation": [0, 0, 0, 1], "scale": [0.95, 0.78, 1]}, "components": {"sindri.shape": {"kind": "ellipse", "count": 32.0, "fill": [1.0, 0.8, 0.13, 1], "stroke": [0.2, 0.12, 0.05, 1], "stroke_width": 0.06, "corner_radius": 0.0, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 10}}},
    {"id": "bird-belly", "name": "BirdBelly", "parent": "bird-look", "transform_3d": {"position": [0.08, -0.16, 0], "rotation": [0, 0, 0, 1], "scale": [0.6, 0.36, 1]}, "components": {"sindri.shape": {"kind": "ellipse", "count": 32.0, "fill": [1.0, 0.93, 0.6, 1], "stroke": [0, 0, 0, 0], "stroke_width": 0.0, "corner_radius": 0.0, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 11}}},
    {"id": "bird-eye", "name": "BirdEye", "parent": "bird-look", "transform_3d": {"position": [0.22, 0.16, 0], "rotation": [0, 0, 0, 1], "scale": [0.34, 0.36, 1]}, "components": {"sindri.shape": {"kind": "ellipse", "count": 32.0, "fill": [1, 1, 1, 1], "stroke": [0.2, 0.12, 0.05, 1], "stroke_width": 0.06, "corner_radius": 0.0, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 12}}},
    {"id": "bird-pupil", "name": "BirdPupil", "parent": "bird-look", "transform_3d": {"position": [0.29, 0.16, 0], "rotation": [0, 0, 0, 1], "scale": [0.1, 0.16, 1]}, "components": {"sindri.shape": {"kind": "ellipse", "count": 32.0, "fill": [0.1, 0.08, 0.08, 1], "stroke": [0, 0, 0, 0], "stroke_width": 0.0, "corner_radius": 0.0, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 13}}},
    {"id": "bird-beak", "name": "BirdBeak", "parent": "bird-look", "transform_3d": {"position": [0.46, -0.06, 0], "rotation": [0, 0, 0, 1], "scale": [0.42, 0.2, 1]}, "components": {"sindri.shape": {"kind": "ellipse", "count": 32.0, "fill": [1.0, 0.45, 0.15, 1], "stroke": [0.2, 0.12, 0.05, 1], "stroke_width": 0.06, "corner_radius": 0.0, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 12}}},
    {"id": "bird-wing", "name": "BirdWing", "parent": "bird-look", "transform_3d": {"position": [-0.2, -0.02, 0], "rotation": [0, 0, 0, 1], "scale": [0.46, 0.3, 1]}, "components": {"sindri.shape": {"kind": "ellipse", "count": 32.0, "fill": [1.0, 0.97, 0.85, 1], "stroke": [0.2, 0.12, 0.05, 1], "stroke_width": 0.06, "corner_radius": 0.0, "dashes": 0.0, "dash_duty": 0.5, "sweep_start": 0.0, "sweep_turns": 1.0, "blend": "over", "layer": 12}}},
    {"id": "score-label", "name": "ScoreLabel", "transform_3d": {"position": [0, 0.72, 0], "rotation": [0, 0, 0, 1], "scale": [1, 1, 1]}, "components": {"sindri.ui.text": {"anchor": "center", "color": [1, 1, 1, 1], "font": "fonts/ChakraPetch-Bold.ttf", "font_size": 0.16, "layer": 200, "line_height": 0.17600000000000002, "text": "{}", "case": "as_written", "letter_spacing": 0.004, "bold": false}}},
    {"id": "hint", "name": "Hint", "transform_3d": {"position": [0, -0.35, 0], "rotation": [0, 0, 0, 1], "scale": [1, 1, 1]}, "components": {"sindri.ui.text": {"anchor": "center", "color": [1, 1, 1, 1], "font": "fonts/ChakraPetch-Bold.ttf", "font_size": 0.07, "layer": 200, "line_height": 0.07700000000000001, "text": "TAP TO FLAP", "case": "as_written", "letter_spacing": 0.004, "bold": false}}},
    {"id": "title", "name": "Title", "transform_3d": {"position": [0, 0.4, 0], "rotation": [0, 0, 0, 1], "scale": [1, 1, 1]}, "components": {"sindri.ui.text": {"anchor": "center", "color": [1.0, 0.85, 0.2, 1], "font": "fonts/ChakraPetch-Bold.ttf", "font_size": 0.14, "layer": 200, "line_height": 0.15400000000000003, "text": "FLAPPY", "case": "as_written", "letter_spacing": 0.004, "bold": false}}},
    {"id": "game-over", "name": "GameOver", "transform_3d": {"position": [0, 0.3, 0], "rotation": [0, 0, 0, 1], "scale": [1, 1, 1]}, "components": {"sindri.ui.text": {"anchor": "center", "color": [1.0, 0.42, 0.3, 1], "font": "fonts/ChakraPetch-Bold.ttf", "font_size": 0.12, "layer": 200, "line_height": 0.132, "text": "GAME OVER", "case": "as_written", "letter_spacing": 0.004, "bold": false}}},
    {"id": "best-label", "name": "BestLabel", "transform_3d": {"position": [0, 0.12, 0], "rotation": [0, 0, 0, 1], "scale": [1, 1, 1]}, "components": {"sindri.ui.text": {"anchor": "center", "color": [1, 1, 1, 1], "font": "fonts/ChakraPetch-Bold.ttf", "font_size": 0.07, "layer": 200, "line_height": 0.07700000000000001, "text": "BEST {}", "case": "as_written", "letter_spacing": 0.004, "bold": false}}}
  ]
}
```

### `assets/scripts/bird.decay`

```rust
// One-button flight. Physics supplies gravity; the script supplies the flap.
script Bird {
    @export let flap_speed: number = 7.2;
    @export let spawn_x: number = -1.5;
    @export let spawn_y: number = 0.5;
    @export let floor_y: number = -4.45;
    @export let ceiling_y: number = 6.4;
    @export let restart_delay: number = 0.6;

    var look: Entity = null;
    var wing: Entity = null;
    var clock: number = 0.0;
    var tilt: number = 0.0;

    fn start() {
        this.look = World.find("BirdLook");
        this.wing = World.find("BirdWing");
        reset();
    }

    fn update(dt: number) {
        this.clock += dt;
        let flap = Input.just_pressed("Space") || Input.just_pressed("W") || Input.just_pressed("ArrowUp")
            || Pointer.just_pressed("Left");

        if Game.dead {
            Game.dead_time += dt;
            // Tip over and drop to the ground after a crash.
            this.tilt = max(this.tilt - 6.0 * dt, -1.5);
            this.look.transform.rotation_z = this.tilt;
            if this.transform.position.y > this.floor_y {
                Physics.set_velocity(this.entity, 0.0, min(Physics.velocity_y(this.entity), 0.0) - 30.0 * dt);
            } else {
                Physics.set_velocity(this.entity, 0.0, 0.0);
                this.transform.position.y = this.floor_y;
            }
            if flap && Game.dead_time > this.restart_delay {
                reset();
            }
            return;
        }

        if flap {
            Game.started = true;
            Physics.set_velocity(this.entity, 0.0, this.flap_speed);
        }

        if !Game.started {
            // Hover on the title screen.
            Physics.set_velocity(this.entity, 0.0, 0.0);
            this.transform.position.y = this.spawn_y + sin(this.clock * 4.0) * 0.25;
            this.tilt = 0.0;
            this.wing.transform.scale.y = 0.3 * (0.6 + 0.4 * abs(sin(this.clock * 9.0)));
        } else {
            // Nose follows velocity; the wing beats faster while climbing.
            let vy = Physics.velocity_y(this.entity);
            let target = max(min(vy * 0.09, 0.45), -1.3);
            this.tilt += (target - this.tilt) * min(dt * 10.0, 1.0);
            var beat = 9.0;
            if vy > 0.0 { beat = 22.0; }
            this.wing.transform.scale.y = 0.3 * (0.4 + 0.6 * abs(sin(this.clock * beat)));
        }
        this.look.transform.rotation_z = this.tilt;

        for other in Physics.sensor_entered() {
            if World.has_tag(other, "hazard") {
                die();
                return;
            } else if World.has_tag(other, "score") {
                Game.score += 1.0;
                Game.speed = min(3.2 + Game.score * 0.08, 5.5);
                if Game.score > Game.best {
                    Game.best = Game.score;
                }
            }
        }

        if this.transform.position.y < this.floor_y || this.transform.position.y > this.ceiling_y {
            die();
        }
    }

    fn die() {
        Game.dead = true;
        Game.dead_time = 0.0;
        Physics.set_velocity(this.entity, 0.0, 0.0);
    }

    fn reset() {
        this.transform.position.x = this.spawn_x;
        this.transform.position.y = this.spawn_y;
        Physics.set_velocity(this.entity, 0.0, 0.0);
        this.tilt = 0.0;
        this.look.transform.rotation_z = 0.0;
        Game.score = 0.0;
        Game.speed = 3.2;
        Game.started = false;
        Game.dead = false;
        Game.run += 1.0;
    }
}
```

### `assets/scripts/drift.decay`

```rust
// Parallax scenery: slides left at a fraction of the course speed and wraps.
script Drift {
    @export let factor: number = 1.0;
    @export let span: number = 32.0;
    // Speed fraction while nobody is playing, so the sky still moves.
    @export let idle: number = 0.0;

    fn update(dt: number) {
        var rate = this.idle;
        if Game.started && !Game.dead {
            rate = this.factor;
        }
        this.transform.position.x -= Game.speed * rate * dt;
        if this.transform.position.x < -this.span * 0.5 {
            this.transform.position.x += this.span;
        }
    }
}
```

### `assets/scripts/game.decay`

```rust
// Shared run state for the Flappy showcase.
state Game {
    var score: number = 0.0;
    var best: number = 0.0;
    var started: bool = false;
    var dead: bool = false;
    // Seconds since the crash, so a panicked tap does not restart instantly.
    var dead_time: number = 0.0;
    // Bumped on every restart; scrolling pieces watch it to go home.
    var run: number = 0.0;
    // World units per second; ramps up with the score.
    var speed: number = 3.2;
}
```

### `assets/scripts/hud.decay`

```rust
// Score, title, and game-over text.
script Hud {
    var score: Entity = null;
    var hint: Entity = null;
    var title: Entity = null;
    var over: Entity = null;
    var best: Entity = null;

    fn start() {
        this.score = World.find("ScoreLabel");
        this.hint = World.find("Hint");
        this.title = World.find("Title");
        this.over = World.find("GameOver");
        this.best = World.find("BestLabel");
    }

    fn update(dt: number) {
        Ui.set_number(this.score, Game.score);
        Ui.set_number(this.best, Game.best);
        World.set_active(this.score, Game.started);
        World.set_active(this.title, !Game.started && !Game.dead);
        World.set_active(this.hint, !Game.started || (Game.dead && Game.dead_time > 0.6));
        World.set_active(this.over, Game.dead);
        World.set_active(this.best, Game.dead);
    }
}
```

### `assets/scripts/pipe.decay`

```rust
// One piece of a pipe pair. Every piece of a pair shares a seed, so they agree
// on where the gap is each lap without having to find one another.
script Pipe {
    @export let offset: number = 0.0;
    @export let seed: number = 1.0;
    @export let wrap_x: number = -11.5;
    @export let span: number = 23.0;

    var home_x: number = 0.0;
    var lap: number = 0.0;
    var run: number = -1.0;

    fn start() {
        this.home_x = this.transform.position.x;
    }

    fn update(dt: number) {
        if this.run != Game.run {
            this.run = Game.run;
            this.lap = 0.0;
            this.transform.position.x = this.home_x;
            place();
        }
        if !Game.started || Game.dead {
            return;
        }
        this.transform.position.x -= Game.speed * dt;
        if this.transform.position.x < this.wrap_x {
            this.transform.position.x += this.span;
            this.lap += 1.0;
            place();
        }
    }

    fn place() {
        // A cheap deterministic hash: same seed and lap, same gap.
        let h = sin(this.seed * 12.9898 + this.lap * 78.233 + Game.run * 3.71) * 43758.547;
        let t = h - floor(h);
        this.transform.position.y = -2.0 + t * 4.4 + this.offset;
    }
}
```

### `sindri.toml`

```toml
format_version = 1

[project]
name = "Flappy"
main_scene = "assets/flappy.scene"
```

### Binary files in this project

`assets/fonts/ChakraPetch-Bold.ttf`, `assets/fonts/Fonts-OFL.txt`

