forked from Ports/goldeneye-pc-port
* README: 32 s gameplay preview montage (mp4) + preview-video runbook * Prune: drop superseded goldeneye-demo.gif (replaced by gh-preview montage) * Docs: v0.2.0 finalization pass — final wording, aligned known issues, Deck-verified line, social preview card - README + pages site: 'v0.2.0 (pre-release)' -> v0.2.0 throughout; the stale 'not yet verified on real Deck hardware' line is replaced with the playtest fact (D253 fixed, D255 still open). - Known-issues lists in README + site now match the release notes one-for-one (adds the F10 bottom-row duplicate D251 and the intermittent Deck SIGSEGV D255; D243/D230/D252/D245/D246/D75 carry their finding labels). - Working list mentions AllUnlocked default-ON (D257) with the F10 opt-out. - First-public-release note added to the README hero and site status line, hedged with 'to our knowledge'. - social-preview.png (1280x640 GitHub link card) composed from a gameplay frame of the preview montage; scratchpad/make-social-preview.py is the local recipe (gitignored, like make-preview.py). - Commit docs/img/shots/manifest.csv (gallery -> source recording map); gitignore the regenerable CONTACT-SHEET.jpg; drop scratch-gdb-cmds.txt. * Social preview: regenerate card from updated briefing HTML (v0.2.0 final wording) The PNG committed earlier was a screenshot of the rendered site (stale wording, video element unrendered). The canonical source is .github/social-preview.html per .github/social-preview.md; update its Status/Statistics lines to the v0.2.0 final state and re-render: - Status: RELEASED v0.2.0 — WINDOWS · LINUX · STEAM DECK - All 21 solo missions — full campaign completed in playtesting - ~22k lines C/C++ · ~10k Python (port layer + tools) - ~250 bugs root-caused · two coding agents, one human, part-time Verified by pixel-diff against the previous render: only the four text bands changed; title/fonts/layout identical. Drop the unreferenced root-level social-preview.png. * docs: refresh social preview + status for v0.2.0 playtest results - Social card: 'RELEASED v0.2.0', 21/21 missions completed in playtesting, ~250 bugs fixed, two agents + one human; re-rendered the PNG from the canonical .github/social-preview.html source (pixel-diff vs the old render shows only the four edited text bands changed) - README Status: campaign now claimed as completable end to end (user playtest: full campaign, Agent difficulty, PC); Working list matches - findings: D255 updated with the Deck register capture (Rdi=nil -> NULL ObjectRecord.model, destroy-path ordering case confirmed; truncation ruled out) and the rule-#2 sign-off question for a guard; D254 field-verified * docs: regenerate findings index (D254/D255 status updates)
79 lines
3.8 KiB
Markdown
79 lines
3.8 KiB
Markdown
# GitHub preview video — runbook
|
||
|
||
The README embeds `docs/media/goldeneye-gh-preview.mp4` (the gif of the same
|
||
name is too heavy for GitHub; keep it only if someone wants a local copy).
|
||
It's a ~32 s, 8-clip montage of gameplay cut from ShadowPlay session
|
||
recordings.
|
||
|
||
## Tooling
|
||
|
||
`scratchpad/` is gitignored, so `make-preview.py` is a **local** tool (it
|
||
hardcodes local video paths anyway) — this doc is the tracked artifact. If it
|
||
goes missing, the commands below describe exactly what to rebuild. Run with
|
||
plain `python`.
|
||
Working files (per-clip mp4s, concat list, palette, `state.json`) go to
|
||
`scratchpad/.preview-work/` — disposable, safe to wipe (but then re-run
|
||
`build` after any edit).
|
||
|
||
```sh
|
||
python scratchpad/make-preview.py list # montage index -> source session + time
|
||
python scratchpad/make-preview.py shift <i> <±sec> # nudge a clip within its source video
|
||
python scratchpad/make-preview.py set <i> <sec> # absolute source time
|
||
python scratchpad/make-preview.py replace <i> <.10|.12|.18|.19> # new random spot in a session
|
||
python scratchpad/make-preview.py regen --seed N # full random redo (same clips/lengths)
|
||
python scratchpad/make-preview.py build # re-concat + re-render from state.json
|
||
```
|
||
|
||
Every edit command rebuilds mp4 + gif automatically. A full rebuild takes
|
||
~30–50 s; a single-clip shift is the same cost (concat dominates). Budget
|
||
one command per step if running under a timeout — cut+concat and the two gif
|
||
passes together fit in ~55 s.
|
||
|
||
## Source material
|
||
|
||
`C:\Users\james\Videos\NVIDIA\Build-pc\new\` — ShadowPlay recordings
|
||
(3072x1728 @ 60 fps, h264), no usable audio track (cut with `-an`). The four
|
||
sessions and their tags are hardcoded in `SESSIONS` at the top of the script;
|
||
add a new session there (tag, filename suffix, duration) to use it.
|
||
|
||
## Rules learned from review rounds
|
||
|
||
- **Never start a clip in the first ~60 s** of a session: desktop / boot /
|
||
menus. (`MIN_START`)
|
||
- **Bad zones** — source times that show non-gameplay; random picks avoid
|
||
them and `replace` should too. Currently known (in `BAD_ZONES`):
|
||
- `.10` @ ~395–425 s: file-select menu
|
||
- `.10` @ ~1290–1420 s: watch close-up (appears twice in that session)
|
||
Add new ones here whenever a review round finds another.
|
||
- **Clip length** 4 s is the sweet spot; 5 s starts to drag, <3 s flickers.
|
||
- **Same-session spacing**: two clips from one session ≥90 s apart, or they
|
||
read as a repeat of the same scene.
|
||
- When told "roll forward/back ~N seconds", use N ± a few s and prefer a
|
||
high-motion moment in that window if you have keyframe stats (see below);
|
||
otherwise a flat offset is fine.
|
||
- If a pick lands on a menu/loading screen, step it forward again rather
|
||
than picking a new random time — the user's "a bit later/earlier" almost
|
||
always means the *same* scene, different part.
|
||
|
||
## Output spec (don't change casually)
|
||
|
||
- mp4: 1920x1080 @ 30 fps, libx264 crf 20, `+faststart`, no audio. ~25 MB for 32 s.
|
||
- gif: 512 px wide, 12 fps, two-pass palette (`palettegen` then
|
||
`paletteuse=dither=bayer:bayer_scale=3`). ~28 MB — local use only.
|
||
|
||
## Optional: motion data to find "cool" moments
|
||
|
||
`scratchpad/analyze-sessions.py` dumps per-keyframe YAVG stats for the
|
||
session files; the diff between consecutive keyframes is a decent proxy for
|
||
"something is happening". If you need to find the coolest moment in a time
|
||
window, maximize it — but note plain random picks with spacing constraints
|
||
have been preferred by the reviewer over signal-optimized cuts, so use this
|
||
only when asked for "something cool".
|
||
|
||
## ffmpeg notes (Windows)
|
||
|
||
No system ffmpeg; the script falls back to the `imageio-ffmpeg` static
|
||
binary (`pip install imageio-ffmpeg`). Pass paths as forward-slash or bare
|
||
filenames with `cwd=` set — drive-letter colons and backslashes break
|
||
filter-graph argument parsing.
|