# NIGHTSHIFT — assets, sources and licences

Everything shipped in `public/assets/` (and therefore in `dist/assets/`) is listed here. All third-party
items allow commercial use and redistribution. No brand names, logos or trademarks are used anywhere in
the game. Raw downloads are kept outside git in `assets-src/` (ignored); only the processed files below are
committed.

## Summary

| Asset | Files | Source | Author / owner | Licence | Attribution required |
| --- | --- | --- | --- | --- | --- |
| Player car | `models/player_car.glb` | made for this project | project | project-owned | No |
| Road and structure textures | `textures/asphalt*`, `concrete*`, `metal_galv*` | ambientCG | ambientCG (Lennart Demes) | CC0 1.0 | No |
| Panel and corrugated textures | `textures/concrete_panel*`, `metal_corrugated*` | Poly Haven | Poly Haven contributors | CC0 1.0 | No |
| Night sky environment | `textures/night_sky_1k.hdr` | Poly Haven HDRI "Kloppenheim 04" | Greg Zaal | CC0 1.0 | No |
| Display font | `fonts/saira-latin-var.woff2` | Fontsource / Omnibus-Type | The Saira Project Authors | SIL OFL 1.1 | Licence text shipped (`fonts/OFL-Saira.txt`) |
| Text font | `fonts/inter-latin-var.woff2` | Fontsource / rsms | The Inter Project Authors | SIL OFL 1.1 | Licence text shipped (`fonts/OFL-Inter.txt`) |
| Traffic vehicles | `models/traffic/traffic.glb` | made for this project | project | project-owned | No |
| Noise and grunge textures | `textures/noise_*.png`, `grunge_mask.webp` | generated by project scripts | project | project-owned | No |
| Audio | none shipped | synthesised at runtime | project | project-owned | No |
| Buildings, signs, roadside, VFX, weather, UI | no files | procedural code | project | project-owned | No |

No third-party asset in the game requires attribution: the textures are CC0 and the fonts ship with their OFL
licence texts. Credit is given below anyway.

## Textures (CC0)

Built by `tools/textures/build.mjs`: colour grade (grey balance, desaturation, brightness target), roughness
remap, resize with wrap padding so they stay seamless, normal renormalisation, WebP encode.

| Shipped file(s) | Source asset | Author |
| --- | --- | --- |
| `asphalt_{albedo,normal,rough}.webp` (2048²) | ambientCG Asphalt015, https://ambientcg.com/a/Asphalt015 | ambientCG |
| `asphalt2_*.webp` (1024²) | ambientCG Asphalt031, https://ambientcg.com/a/Asphalt031 | ambientCG |
| `concrete_*.webp` (1024²) | ambientCG Concrete024, https://ambientcg.com/a/Concrete024 | ambientCG |
| `metal_galv_*.webp` (512²) | ambientCG Metal011, https://ambientcg.com/a/Metal011 | ambientCG |
| `concrete_panel_*.webp` (1024²) | Poly Haven "concrete", https://polyhaven.com/a/concrete | Poly Haven contributors |
| `metal_corrugated_*.webp` (1024²) | Poly Haven "corrugated_iron_03", https://polyhaven.com/a/corrugated_iron_03 | Poly Haven contributors |
| `night_sky_1k.hdr` | Poly Haven "kloppenheim_04", https://polyhaven.com/a/kloppenheim_04 | Greg Zaal |

CC0 1.0: https://creativecommons.org/publicdomain/zero/1.0/ . Credit is not required; it is given here anyway.

## Fonts (SIL Open Font License 1.1)

| Shipped file | Font | Source |
| --- | --- | --- |
| `fonts/saira-latin-var.woff2` | Saira variable (weight 100–900, width 50–125), latin subset | npm `@fontsource-variable/saira@5.3.0`, upstream https://github.com/Omnibus-Type/Saira |
| `fonts/inter-latin-var.woff2` | Inter variable (weight 100–900), latin subset | npm `@fontsource-variable/inter@5.3.0`, upstream https://github.com/rsms/inter |

Files were only renamed. They are registered in the page under the family names "NS Display" and "NS Text",
loaded from the game's own folder (nothing is fetched from a font CDN). The OFL texts ship next to the fonts.

## Made for this project (no third-party content)

- **Player car**: a fictional two-seat sports car, not a real make or model, modelled entirely from code by a
  Python script in headless Blender 4.3 (`tools/car/build_car.py`, modules in `tools/car/lib/`), then checked and
  compressed by `tools/car/pack.mjs` (meshopt). No textures in the file: the paint flake, carbon weave, grille mesh
  and rain beads are generated at run time by `src/vehicle/playerCarVisual.ts`. Rebuild steps and the file contract:
  `docs/assets/car.md`.
  129 824 triangles, 26 draw calls, `player_car.glb` 1.95 MB.
- **Traffic vehicles**: eight types modelled by Python scripts in headless Blender (`tools/traffic/*.py`),
  packed and simplified by `tools/traffic/pack.mjs`. Vertex colours only, no textures; plates carry abstract
  glyphs, the tanker's hazard panels are generic and carry no numbers. Details: `docs/assets/traffic.md`.
- **Audio**: every sound is synthesised in the browser by `src/audio/` (engine, tyres, rain, impacts,
  explosions, thunder, UI). No samples. Details: `docs/assets/audio.md`.
- **World**: road, barriers, guardrails, gantries, signs, bridge, tunnel, overpasses, buildings, windows,
  illuminated sign words (generic: HOTEL, PARKING, 24H…), billboards with abstract artwork, parked cars,
  terrain and vegetation are procedural geometry and GLSL. Details: `docs/assets/backdrop.md`.
- **VFX and weather**: explosions, fire, smoke, sparks, debris, decals, nitro flames, rain, lens drops,
  spray, splashes: procedural shaders on instanced geometry. Details: `docs/assets/vfx.md`.
- **UI**: DOM and CSS; key-cap arrows are hand-written inline SVG. Details: `docs/assets/ui.md`.
- **Noise textures**: `noise_rgba.png`, `noise_fbm_512.png`, `grunge_mask.webp` come from `tools/textures/noise.mjs`.

## Software libraries (bundled in the JavaScript)

| Library | Licence |
| --- | --- |
| three.js | MIT |
| postprocessing | Zlib |
| @dimforge/rapier3d-compat | Apache-2.0 |

Build and test tools (Vite, TypeScript, Vitest, Playwright, sharp, glTF-Transform, meshoptimizer, Blender) are
not shipped with the game.
