Track 1 — Unity demo modes pre-launch.

Player Demo (Steam demo listing):

  • DemoFeatureFlags-gated Act 1 boss → DemoEndScreen with wishlist + Discord + quit CTAs (built from SciFiMenuKit, no scene asset needed).
  • Run-death path also routes to DemoEndScreen so demo testers don’t drop back into retail menu chrome that promises content the demo doesn’t have.
  • Difficulty select screen hard-locks Nightmare + Hell regardless of meta state. Skips the dropdown entirely if Normal is the only option.

Claude Demo (footage capture for trailer):

  • ClaudeDemoController auto-spawns when —claude-demo flag is set AND CLAUDE_DEMO_BUILD define is on. Parses —sequence/—seed/—output/etc. Validates required args (exits 2 on missing).
  • DeterministicRng seeds UnityEngine.Random so existing card-shuffle / damage-variance / AI-roll code becomes reproducible.
  • ScriptedInputProvider replaces real player input with a timestamped list of PlayCard / EndTurn / ChangeStance actions. Game logic doesn’t know it’s scripted — same code paths.
  • ScriptedAiOverride lets sequence authors force enemy intent at specific turn counts so the boss always casts its cinematic move.
  • DemoSequence is the ScriptableObject sequence definition: deck loadout, encounter, scripted inputs, camera, timing markers.
  • SequenceLoader caches Resources/DemoSequences/ and looks up by id.
  • CaptureMetadataWriter writes the sidecar JSON the trailer tool reads to find precise cut points (markers, sequence_id, framerate, etc.).
  • Unity Recorder integration is stubbed — package not installed yet. Install + wire StartRecorder/StopRecorderAndFinalize next.

Track 2 — Trailer Builder CLI (Python).

Standalone Python project at trailer-pipeline/. No Claude API calls; the CLI is deterministic. Spec + footage + audio in, mp4 out.

  • trailer_builder/spec.py — Pydantic models for the spec (FootageBeat, StillBeat, TextOverlay, ImageOverlay, MusicSettings, OutputSettings). Pydantic uses extra=“ignore” so additive schema changes don’t break older readers.
  • trailer_builder/footage.py — Loads sidecar JSON, resolves marker_start / marker_end to absolute timestamps, finds mp4+sidecar pairs by sequence_id with optional seed preference.
  • trailer_builder/beats.py — librosa beat detection with snap-to-beat helper. Tolerance defaults to 0.15s — beats outside that window are NOT force-snapped (drift is preferable to wrong-feeling cuts).
  • trailer_builder/overlays.py — drawtext + overlay filter snippets for text and image overlays with proper enable=between(t,…) gating.
  • trailer_builder/styles.py — text style + position presets so future specs can add styles without code changes.
  • trailer_builder/render.py — FFmpeg filter graph builder. Single-pass render (no intermediate files), trim+scale per footage beat, concat, overlays, audio mix with fade + ducking, AAC audio, h264/h265.
  • trailer_builder/cli.py — click CLI with build / validate / analyze / markers subcommands, —preview flag for fast 720p iteration, —print-graph for debugging.
  • examples/ai_apocalypse_launch_trailer.json — reference spec for the actual launch trailer (logo card, 3 class showcases, act montage, tagline still).
  • pyproject.toml + README.md.

Smoke-tested: trailer-builder analyze trailer_doom_metal_v1.mp3 returns “Tempo: 152.0 BPM” from the ElevenLabs-generated track. Beat detection + spec loading + render-graph construction all wire end-to-end.

Co-Authored-By: Claude Opus 4.7 (1M context) [email protected]


Commit 6977f23 by astafford8488.