diff --git a/ASSET-LICENSES.md b/ASSET-LICENSES.md index effffe0..78254f7 100644 --- a/ASSET-LICENSES.md +++ b/ASSET-LICENSES.md @@ -244,3 +244,18 @@ archive metadata. It does not grant rights in third-party settings or names, generation services, Warpkeep trademarks or canonical identity, or unrelated Warpkeep material by implication. The release describes The Core only as a Warpkeep faction and does not include outside reference imagery or branding. + +## Warpkeep background-video creation reference pack + +- **Set:** exact supplied 10.08-second castle/Core concept MP4, low-poly Core spire PNG, two Core crest-treatment PNGs, Warpkeep title-menu castle PNG, deterministic previews, manifests, and checksums +- **Release:** `background-video-reference-pack-2026-08-03` +- **Snapshot date:** 2026-08-03 +- **Deposit authority:** Ael explicitly requested packaging and public upload to Warpkeep-Assets for future background-video creation reference. +- **License status:** public archival and GitHub Release distribution authorized; no separate open-license grant asserted + +This authorization covers publication and distribution of the named +byte-exact reference package, its deterministic Git-tracked previews, and its +archive metadata. It does not grant rights in third-party tools or services, +Warpkeep or faction trademarks and canonical identity, or unrelated Warpkeep +material by implication. Reference designation and repository presence do not +by themselves assert current live-game integration or final production status. diff --git a/README.md b/README.md index a5d4d32..d120576 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,29 @@ Integration notes below describe what each asset release itself authorized or asserted when it was published. See the [Warpkeep repository](https://github.com/ael-dev3/Warpkeep) for the current live runtime. +[![Warpkeep background-video reference pack](previews/background-video-reference-pack-2026-08-03/00-background-video-reference-overview.jpg)](https://github.com/ael-dev3/Warpkeep-Assets/releases/tag/background-video-reference-pack-2026-08-03) + +## Background-video creation references + +The 2026-08-03 reference release preserves **five supplied source files** for +future Warpkeep menu-background and cinematic-video work: a 10.08-second +vertical castle-and-Core concept clip, a low-poly Core spire render, two Core +crest treatments, and the current Warpkeep title-menu castle composition. +Every source is retained byte-for-byte inside one checksum-addressed ZIP; only +its archive path is made descriptive. + +| Source | Technical read | Intended reference | +| --- | --- | --- | +| Animated concept | 834×1112, 60 fps H.264, stereo AAC | Castle foreground, sunset realm, distant Core animation | +| Core spire render | 1920×1080 PNG | Low-poly structure and emissive-violet language | +| Core crest treatments | 1600×1600 and 1254×1254 PNG | Dark presentation and green-screen compositing options | +| Warpkeep menu castle | 2548×1474 PNG | Current title/menu layout and atmosphere | + +**[Download the background-video reference pack](https://github.com/ael-dev3/Warpkeep-Assets/releases/tag/background-video-reference-pack-2026-08-03)** · [manifest](releases/background-video-reference-pack-2026-08-03/manifest.json) · [provenance](provenance/background-video-reference-pack-2026-08-03.md) · [video contact sheet](previews/background-video-reference-pack-2026-08-03/01-source-video-contact-sheet.jpg) + +This is a visual-development archive rather than a runtime bundle or final +compositing contract. Current live-game integration is not asserted. + [![Warpkeep — The Core faction crest](previews/the-core-faction-crest-2026-08-03/00-the-core-faction-crest-showcase.jpg)](https://github.com/ael-dev3/Warpkeep-Assets/releases/tag/the-core-faction-crest-2026-08-03) ## The Core faction crest @@ -163,6 +186,7 @@ Large masters do not live in normal Git history. They are published as immutable ## Asset releases +- [`background-video-reference-pack-2026-08-03`](https://github.com/ael-dev3/Warpkeep-Assets/releases/tag/background-video-reference-pack-2026-08-03) — one verified reference ZIP preserving the supplied 10.08-second castle/Core MP4 and four PNG references byte-for-byte, with internal and release-level checksums, [public provenance](provenance/background-video-reference-pack-2026-08-03.md), a visual overview, and a six-frame video contact sheet - [`the-core-faction-crest-2026-08-03`](https://github.com/ael-dev3/Warpkeep-Assets/releases/tag/the-core-faction-crest-2026-08-03) — exact supplied 1024px transparent master for The Core faction, three individually downloadable safe-padded runtime PNGs, a complete 15-file source/runtime kit, checksums, [public provenance](provenance/the-core-faction-crest-2026-08-03.md), and a two-image Git-tracked gallery - [`hegemony-citizens-keep-services-2026-08-03`](https://github.com/ael-dev3/Warpkeep-Assets/releases/tag/hegemony-citizens-keep-services-2026-08-03) — eight game-ready Hegemony keep citizens, including two civic orders and two exotic mounted roles, with 32 four-LOD runtime GLBs, 9 privacy-sanitized editable Blender sources, 21 PNGs, 73/73 QA checks, package manifests, nested checksums, [public provenance](provenance/hegemony-citizens-keep-services-2026-08-03.md), and a Git-tracked two-image release gallery - [`hegemony-unit-corps-2026-08-03`](https://github.com/ael-dev3/Warpkeep-Assets/releases/tag/hegemony-unit-corps-2026-08-03) — twelve game-ready Hegemony infantry, ranged, and cavalry units with 48 four-LOD runtime GLBs, 15 privacy-sanitized editable Blender sources, 39 PNGs, package manifests, nested checksums and license notices, [public provenance](provenance/hegemony-unit-corps-2026-08-03.md), and a Git-tracked four-image gallery diff --git a/manifests/background-video-reference-pack-2026-08-03.source.json b/manifests/background-video-reference-pack-2026-08-03.source.json new file mode 100644 index 0000000..ee7e4ec --- /dev/null +++ b/manifests/background-video-reference-pack-2026-08-03.source.json @@ -0,0 +1,151 @@ +{ + "schemaVersion": 1, + "assetId": "warpkeep.references.background-video.2026-08-03", + "archivePurpose": "Preserve future-reference media for Warpkeep menu-background and cinematic video creation.", + "snapshotDate": "2026-08-03", + "designation": { + "name": "Warpkeep background-video creation reference pack", + "role": "future menu-background and cinematic video visual development", + "runtimeIntegration": "reference-only; current integration not asserted" + }, + "source": { + "suppliedBy": "Ael", + "authorization": "Ael explicitly requested packaging and public upload to Warpkeep-Assets.", + "preservation": "All source files are byte-exact; archive paths alone were renamed descriptively." + }, + "licensePolicy": { + "spdx": null, + "status": "public-archive-authorized-no-separate-open-license", + "scope": "Public archival and GitHub Release distribution are authorized for this named reference pack. No separate open-license, trademark, or canonical-identity grant is asserted." + }, + "sourceFiles": [ + { + "path": "source/video/warpkeep-castle-core-background-concept-vertical.mp4", + "suppliedBasename": "019fc883-7004-7794-bd80-5574b1ff16c1.mp4", + "role": "animated castle-and-Core skyline concept", + "bytes": 4490052, + "sha256": "37677f9b872687336f54f76b126ccfe6570a208c974c6f2240ad028e8c4b592f", + "media": { + "programs": [], + "stream_groups": [], + "streams": [ + { + "index": 0, + "codec_name": "h264", + "codec_type": "video", + "width": 834, + "height": 1112, + "pix_fmt": "yuv420p", + "r_frame_rate": "60/1", + "avg_frame_rate": "60/1" + }, + { + "index": 1, + "codec_name": "aac", + "codec_type": "audio", + "sample_rate": "44100", + "channels": 2, + "r_frame_rate": "0/0", + "avg_frame_rate": "0/0" + } + ], + "format": { + "format_name": "mov,mp4,m4a,3gp,3g2,mj2", + "duration": "10.080000", + "size": "4490052", + "bit_rate": "3563533" + } + } + }, + { + "path": "source/images/core-spire-low-poly-reference.png", + "suppliedBasename": "4a494e95-df4f-4ab9-8b9b-2b0a99b04035.png", + "role": "low-poly Core spire reference", + "bytes": 826486, + "sha256": "4189749ab815e7316ea67be0d922684d26fe6c7eea5a960876beb0cc8b5d47a1", + "image": { + "width": 1920, + "height": 1080, + "mode": "RGB", + "format": "PNG", + "alpha": false + } + }, + { + "path": "source/images/core-crest-dark-reference.png", + "suppliedBasename": "1bd84fd6-1393-45a9-ad4b-be9144d6930d.png", + "role": "dark-background Core crest reference", + "bytes": 2598550, + "sha256": "aee6f1193bfc23e99e4ee4adccb538fb0d72c36a10e1f0723248bd6a6fd6b438", + "image": { + "width": 1600, + "height": 1600, + "mode": "RGBA", + "format": "PNG", + "alpha": true + } + }, + { + "path": "source/images/core-crest-green-screen-reference.png", + "suppliedBasename": "6e186778-821b-4ce3-a4db-97b4c49968c5.png", + "role": "green-screen Core crest reference", + "bytes": 2926322, + "sha256": "1a35c7eca7c20f6935d975705be215d457fb1a8b5040b79a661a52ee9a48500d", + "image": { + "width": 1254, + "height": 1254, + "mode": "RGBA", + "format": "PNG", + "alpha": true + } + }, + { + "path": "source/images/warpkeep-menu-castle-reference.png", + "suppliedBasename": "Screenshot 2026-08-03 at 6.23.10\u202fPM.png", + "role": "Warpkeep title-menu castle reference", + "bytes": 6408550, + "sha256": "bb83aa18e8ad8d43351c81755fe53ffc19b0139e84f1e4b59d35ab9d7b94f0e8", + "image": { + "width": 2548, + "height": 1474, + "mode": "RGBA", + "format": "PNG", + "alpha": true + } + } + ], + "release": { + "tag": "background-video-reference-pack-2026-08-03", + "attachments": [ + { + "name": "warpkeep-background-video-reference-pack-2026-08-03-v1.zip", + "bytes": 18005477, + "sha256": "e2b834f7016c7b08d4f37cdd366c2db859eb4b98f698f813ce52176581a32b24" + } + ] + }, + "previews": [ + { + "file": "00-background-video-reference-overview.jpg", + "title": "Warpkeep background-video reference overview", + "source": "deterministic composite of all supplied references and a source-video frame", + "bytes": 416359, + "sha256": "eafed58c9a1a6debaf681b56b0334ad7a186e96cab2f309c5692b37854bd9ec0", + "dimensions": [ + 2400, + 1500 + ] + }, + { + "file": "01-source-video-contact-sheet.jpg", + "title": "Source video contact sheet", + "source": "six deterministic time samples from the supplied MP4", + "bytes": 405485, + "sha256": "6115fb49d9b2be3229ecdefc23af2f78f56da1c81a04d38192360b34d9ef2374", + "dimensions": [ + 1800, + 1500 + ] + } + ] +} diff --git a/previews/background-video-reference-pack-2026-08-03/00-background-video-reference-overview.jpg b/previews/background-video-reference-pack-2026-08-03/00-background-video-reference-overview.jpg new file mode 100644 index 0000000..1952829 Binary files /dev/null and b/previews/background-video-reference-pack-2026-08-03/00-background-video-reference-overview.jpg differ diff --git a/previews/background-video-reference-pack-2026-08-03/01-source-video-contact-sheet.jpg b/previews/background-video-reference-pack-2026-08-03/01-source-video-contact-sheet.jpg new file mode 100644 index 0000000..d28937a Binary files /dev/null and b/previews/background-video-reference-pack-2026-08-03/01-source-video-contact-sheet.jpg differ diff --git a/previews/background-video-reference-pack-2026-08-03/gallery.json b/previews/background-video-reference-pack-2026-08-03/gallery.json new file mode 100644 index 0000000..3e4d34e --- /dev/null +++ b/previews/background-video-reference-pack-2026-08-03/gallery.json @@ -0,0 +1,28 @@ +{ + "schema": "warpkeep.preview-gallery.v1", + "releaseTag": "background-video-reference-pack-2026-08-03", + "images": [ + { + "file": "00-background-video-reference-overview.jpg", + "title": "Warpkeep background-video reference overview", + "source": "deterministic composite of all supplied references and a source-video frame", + "bytes": 416359, + "sha256": "eafed58c9a1a6debaf681b56b0334ad7a186e96cab2f309c5692b37854bd9ec0", + "dimensions": [ + 2400, + 1500 + ] + }, + { + "file": "01-source-video-contact-sheet.jpg", + "title": "Source video contact sheet", + "source": "six deterministic time samples from the supplied MP4", + "bytes": 405485, + "sha256": "6115fb49d9b2be3229ecdefc23af2f78f56da1c81a04d38192360b34d9ef2374", + "dimensions": [ + 1800, + 1500 + ] + } + ] +} diff --git a/provenance/background-video-reference-pack-2026-08-03.md b/provenance/background-video-reference-pack-2026-08-03.md new file mode 100644 index 0000000..96d36e7 --- /dev/null +++ b/provenance/background-video-reference-pack-2026-08-03.md @@ -0,0 +1,60 @@ +# Warpkeep background-video creation reference pack + +- Asset identity: `warpkeep.references.background-video.2026-08-03` +- Release tag: `background-video-reference-pack-2026-08-03` +- Snapshot date: 2026-08-03 +- Supplied by: Ael +- Public deposit: explicitly requested and authorized by Ael + +## Purpose + +This archive preserves a compact visual-development set for future Warpkeep +menu-background and cinematic-video creation. It is a reference archive, not a +runtime package, a final compositing contract, or evidence that every depicted +design is currently integrated in Warpkeep. + +## Byte-exact sources + +All five supplied files are present inside the release ZIP with exact source +bytes. Descriptive archive paths replace opaque or screenshot-oriented source +basenames; the original basenames remain recorded in the source manifest. + +| Archive role | Bytes | SHA-256 | +| --- | ---: | --- | +| 10.08-second castle-and-Core MP4 | 4,490,052 | `37677f9b872687336f54f76b126ccfe6570a208c974c6f2240ad028e8c4b592f` | +| Low-poly Core spire PNG | 826,486 | `4189749ab815e7316ea67be0d922684d26fe6c7eea5a960876beb0cc8b5d47a1` | +| Dark Core crest PNG | 2,598,550 | `aee6f1193bfc23e99e4ee4adccb538fb0d72c36a10e1f0723248bd6a6fd6b438` | +| Green-screen Core crest PNG | 2,926,322 | `1a35c7eca7c20f6935d975705be215d457fb1a8b5040b79a661a52ee9a48500d` | +| Warpkeep title-menu castle PNG | 6,408,550 | `bb83aa18e8ad8d43351c81755fe53ffc19b0139e84f1e4b59d35ab9d7b94f0e8` | + +The MP4 decodes as 834×1112 H.264 video at 60 fps with 44.1 kHz stereo AAC +audio. The PNG sources are respectively 1920×1080 RGB, 1600×1600 RGBA, +1254×1254 RGBA, and 2548×1474 RGBA. + +## Derived discovery media + +Two deterministic JPEG previews are tracked in Git and repeated inside the +ZIP: a 2400×1500 overview of the entire set and an 1800×1500 six-frame contact +sheet sampled from the supplied video. These are discovery aids only; future +production should begin from the exact sources. + +No source image was repainted or generatively altered during packaging. No +absolute local source path is included in the public manifests or archive. + +## Designation and boundaries + +The visual material connects the Hegemony castle/menu atmosphere with The +Core's distant spire, violet energy, and machine-gothic crest language. The +green background is retained as supplied because it may be useful for future +keying tests; it is not designated as a canonical presentation background. + +The package records supplied reference media and public distribution only. +Current live-game integration, canonical status of every treatment, and final +background-video direction are not asserted. + +## License boundary + +Public archival and GitHub Release distribution of this named package are +authorized. No separate open-license, trademark, or canonical-identity grant +is asserted. Repository presence does not relicense third-party tools, +services, settings, names, or unrelated Warpkeep material. diff --git a/releases/background-video-reference-pack-2026-08-03/PACKAGE-NOTICE.md b/releases/background-video-reference-pack-2026-08-03/PACKAGE-NOTICE.md new file mode 100644 index 0000000..90fdb3e --- /dev/null +++ b/releases/background-video-reference-pack-2026-08-03/PACKAGE-NOTICE.md @@ -0,0 +1,16 @@ +# Package notice — Warpkeep background-video creation references + +This release preserves five Ael-supplied files for future Warpkeep +menu-background and cinematic-video visual development. + +- All five source media files are byte-exact inside the ZIP. +- Descriptive archive paths replace opaque source filenames; original + basenames remain recorded in the source manifest. +- The overview and six-frame video contact sheet are deterministic discovery + derivatives and are not source replacements. +- The package is reference-only. Current runtime integration and final + production status are not asserted. + +Public archival and GitHub Release distribution of this named package are +authorized. No separate open-license, trademark, or canonical-identity grant +is asserted. diff --git a/releases/background-video-reference-pack-2026-08-03/RELEASE-NOTES.md b/releases/background-video-reference-pack-2026-08-03/RELEASE-NOTES.md new file mode 100644 index 0000000..a006e9c --- /dev/null +++ b/releases/background-video-reference-pack-2026-08-03/RELEASE-NOTES.md @@ -0,0 +1,32 @@ +# Warpkeep background-video creation reference pack + +Future-reference media for Warpkeep menu-background and cinematic-video +production, preserved as one verified ZIP. + +## Included source media + +- 10.08-second vertical castle-and-Core concept video — 834×1112, 60 fps H.264, stereo AAC +- Low-poly Core spire reference — 1920×1080 PNG +- Dark Core crest reference — 1600×1600 PNG +- Green-screen Core crest reference — 1254×1254 PNG +- Warpkeep title-menu castle reference — 2548×1474 PNG + +All five supplied files are byte-exact in the archive. The ZIP also contains a +visual overview, a six-frame video contact sheet, source metadata, internal +checksums, and a usage guide. + +## Verification + +- Release ZIP: 18,005,477 bytes +- SHA-256: `e2b834f7016c7b08d4f37cdd366c2db859eb4b98f698f813ce52176581a32b24` +- ZIP entries: 10 +- Source byte comparisons: 5/5 exact +- Repository release tests: 35/35 passed +- Independent rebuild: byte-identical ZIP + +This is a visual-development reference set. Current runtime integration and +final production status are not asserted. + +Public archival and GitHub Release distribution of this named package are +authorized. No separate open-license, trademark, or canonical-identity grant +is asserted. diff --git a/releases/background-video-reference-pack-2026-08-03/SHA256SUMS.txt b/releases/background-video-reference-pack-2026-08-03/SHA256SUMS.txt new file mode 100644 index 0000000..1dbec83 --- /dev/null +++ b/releases/background-video-reference-pack-2026-08-03/SHA256SUMS.txt @@ -0,0 +1 @@ +e2b834f7016c7b08d4f37cdd366c2db859eb4b98f698f813ce52176581a32b24 warpkeep-background-video-reference-pack-2026-08-03-v1.zip diff --git a/releases/background-video-reference-pack-2026-08-03/manifest.json b/releases/background-video-reference-pack-2026-08-03/manifest.json new file mode 100644 index 0000000..f767316 --- /dev/null +++ b/releases/background-video-reference-pack-2026-08-03/manifest.json @@ -0,0 +1,109 @@ +{ + "schemaVersion": 1, + "repository": "ael-dev3/Warpkeep-Assets", + "tag": "background-video-reference-pack-2026-08-03", + "source": { + "suppliedBy": "Ael", + "authorization": "Ael explicitly requested packaging and public upload to Warpkeep-Assets.", + "privateWorkflowMetadata": "intentionally omitted" + }, + "designation": { + "name": "Warpkeep background-video creation reference pack", + "role": "future menu-background and cinematic video visual development", + "runtimeIntegration": "reference-only; current integration not asserted" + }, + "license": { + "spdx": null, + "status": "public-archive-authorized-no-separate-open-license", + "scope": "Public archival and GitHub Release distribution are authorized for this named reference pack. No separate open-license, trademark, or canonical-identity grant is asserted." + }, + "attachments": [ + { + "name": "warpkeep-background-video-reference-pack-2026-08-03-v1.zip", + "variant": "complete-byte-exact-reference-pack", + "bytes": 18005477, + "sha256": "e2b834f7016c7b08d4f37cdd366c2db859eb4b98f698f813ce52176581a32b24", + "mediaType": "application/zip", + "packageRoot": "Warpkeep_Background_Video_Reference_2026-08-03", + "entries": [ + { + "path": "Warpkeep_Background_Video_Reference_2026-08-03/README.md", + "bytes": 1197, + "sha256": "1c3edaf2ffb9ffb5b10d970222b357506052b266e184709709d42d3e3f31965c", + "mediaType": "application/octet-stream", + "compressedBytes": 681 + }, + { + "path": "Warpkeep_Background_Video_Reference_2026-08-03/SHA256SUMS.txt", + "bytes": 986, + "sha256": "a77ff3efe26bd2c9bc1ea8d98e2c9fcbcaad81e64ce3e674b6f3df693a92ef2e", + "mediaType": "text/plain", + "compressedBytes": 564 + }, + { + "path": "Warpkeep_Background_Video_Reference_2026-08-03/manifest.json", + "bytes": 4232, + "sha256": "b18ac34b0aa6144b246be1a175e43a4ca496744feb5c77882d10a7923ca46f66", + "mediaType": "application/json", + "compressedBytes": 1546 + }, + { + "path": "Warpkeep_Background_Video_Reference_2026-08-03/previews/background-video-reference-overview-2400x1500.jpg", + "bytes": 416359, + "sha256": "eafed58c9a1a6debaf681b56b0334ad7a186e96cab2f309c5692b37854bd9ec0", + "mediaType": "image/jpeg", + "compressedBytes": 388673 + }, + { + "path": "Warpkeep_Background_Video_Reference_2026-08-03/previews/source-video-contact-sheet-1800x1500.jpg", + "bytes": 405485, + "sha256": "6115fb49d9b2be3229ecdefc23af2f78f56da1c81a04d38192360b34d9ef2374", + "mediaType": "image/jpeg", + "compressedBytes": 380453 + }, + { + "path": "Warpkeep_Background_Video_Reference_2026-08-03/source/images/core-crest-dark-reference.png", + "bytes": 2598550, + "sha256": "aee6f1193bfc23e99e4ee4adccb538fb0d72c36a10e1f0723248bd6a6fd6b438", + "mediaType": "image/png", + "compressedBytes": 2592795 + }, + { + "path": "Warpkeep_Background_Video_Reference_2026-08-03/source/images/core-crest-green-screen-reference.png", + "bytes": 2926322, + "sha256": "1a35c7eca7c20f6935d975705be215d457fb1a8b5040b79a661a52ee9a48500d", + "mediaType": "image/png", + "compressedBytes": 2927117 + }, + { + "path": "Warpkeep_Background_Video_Reference_2026-08-03/source/images/core-spire-low-poly-reference.png", + "bytes": 826486, + "sha256": "4189749ab815e7316ea67be0d922684d26fe6c7eea5a960876beb0cc8b5d47a1", + "mediaType": "image/png", + "compressedBytes": 826454 + }, + { + "path": "Warpkeep_Background_Video_Reference_2026-08-03/source/images/warpkeep-menu-castle-reference.png", + "bytes": 6408550, + "sha256": "bb83aa18e8ad8d43351c81755fe53ffc19b0139e84f1e4b59d35ab9d7b94f0e8", + "mediaType": "image/png", + "compressedBytes": 6404878 + }, + { + "path": "Warpkeep_Background_Video_Reference_2026-08-03/source/video/warpkeep-castle-core-background-concept-vertical.mp4", + "bytes": 4490052, + "sha256": "37677f9b872687336f54f76b126ccfe6570a208c974c6f2240ad028e8c4b592f", + "mediaType": "video/mp4", + "compressedBytes": 4479800 + } + ], + "url": "https://github.com/ael-dev3/Warpkeep-Assets/releases/download/background-video-reference-pack-2026-08-03/warpkeep-background-video-reference-pack-2026-08-03-v1.zip" + } + ], + "verification": { + "sourceCount": 5, + "sourcePreservation": "Every supplied source file is present byte-exact inside the ZIP.", + "checksums": "The release attachment and every ZIP entry are SHA-256 addressed.", + "videoAudit": "The supplied MP4 decodes as a 10.08-second 834\u00d71112 H.264 60 fps video with stereo AAC audio." + } +} diff --git a/scripts/build_background_video_reference_pack.py b/scripts/build_background_video_reference_pack.py new file mode 100644 index 0000000..9012406 --- /dev/null +++ b/scripts/build_background_video_reference_pack.py @@ -0,0 +1,420 @@ +#!/usr/bin/env python3 +"""Build the Warpkeep background-video reference archive and release metadata.""" + +from __future__ import annotations + +import argparse +import hashlib +import json +import mimetypes +import shutil +import subprocess +import tempfile +import zipfile +from pathlib import Path + +from PIL import Image, ImageDraw, ImageFont + + +TAG = "background-video-reference-pack-2026-08-03" +PACKAGE_ROOT = "Warpkeep_Background_Video_Reference_2026-08-03" +ZIP_NAME = "warpkeep-background-video-reference-pack-2026-08-03-v1.zip" +RELEASE_URL = f"https://github.com/ael-dev3/Warpkeep-Assets/releases/download/{TAG}/{ZIP_NAME}" + + +def sha256(path: Path) -> str: + digest = hashlib.sha256() + with path.open("rb") as handle: + for chunk in iter(lambda: handle.read(1024 * 1024), b""): + digest.update(chunk) + return digest.hexdigest() + + +def font(size: int, bold: bool = False) -> ImageFont.FreeTypeFont | ImageFont.ImageFont: + names = [ + "/System/Library/Fonts/Supplemental/Arial Bold.ttf" if bold else "/System/Library/Fonts/Supplemental/Arial.ttf", + "/System/Library/Fonts/SFNS.ttf", + "/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf" if bold else "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", + ] + for name in names: + if Path(name).exists(): + return ImageFont.truetype(name, size=size) + return ImageFont.load_default() + + +def fit_image(source: Image.Image, size: tuple[int, int], background=(8, 5, 18)) -> Image.Image: + source = source.convert("RGBA") + source.thumbnail(size, Image.Resampling.LANCZOS) + result = Image.new("RGB", size, background) + x = (size[0] - source.width) // 2 + y = (size[1] - source.height) // 2 + result.paste(source.convert("RGB"), (x, y)) + return result + + +def extract_frame(video: Path, time_seconds: float, target: Path) -> None: + subprocess.run( + [ + "ffmpeg", + "-hide_banner", + "-loglevel", + "error", + "-ss", + f"{time_seconds:.3f}", + "-i", + str(video), + "-frames:v", + "1", + "-y", + str(target), + ], + check=True, + ) + + +def ffprobe(video: Path) -> dict: + result = subprocess.run( + [ + "ffprobe", + "-v", + "error", + "-show_entries", + "format=duration,size,bit_rate,format_name:stream=index,codec_name,codec_type,width,height,pix_fmt,r_frame_rate,avg_frame_rate,sample_rate,channels", + "-of", + "json", + str(video), + ], + check=True, + capture_output=True, + text=True, + ) + return json.loads(result.stdout) + + +def image_info(path: Path) -> dict: + with Image.open(path) as image: + return { + "width": image.width, + "height": image.height, + "mode": image.mode, + "format": image.format, + "alpha": "A" in image.mode, + } + + +def make_video_contact_sheet(video: Path, target: Path) -> None: + times = [0.5, 2.3, 4.1, 5.9, 7.7, 9.5] + canvas = Image.new("RGB", (1800, 1500), (10, 6, 22)) + draw = ImageDraw.Draw(canvas) + draw.text((70, 45), "SOURCE VIDEO CONTACT SHEET", font=font(58, True), fill=(238, 202, 111)) + draw.text((72, 112), "10.08 s · 834×1112 · 60 fps · H.264/AAC", font=font(28), fill=(202, 191, 220)) + cell_w, cell_h = 520, 610 + with tempfile.TemporaryDirectory(prefix="warpkeep-video-frames-") as temp_dir: + temp = Path(temp_dir) + for index, timestamp in enumerate(times): + frame_path = temp / f"frame-{index:02d}.png" + extract_frame(video, timestamp, frame_path) + with Image.open(frame_path) as image: + tile = fit_image(image, (cell_w, cell_h), (4, 3, 10)) + col = index % 3 + row = index // 3 + x = 70 + col * 570 + y = 180 + row * 640 + canvas.paste(tile, (x, y)) + draw.rounded_rectangle((x, y, x + cell_w, y + cell_h), radius=14, outline=(112, 78, 145), width=3) + draw.text((x + 18, y + cell_h - 46), f"{timestamp:04.1f} s", font=font(24, True), fill=(245, 229, 192)) + canvas.save(target, "JPEG", quality=88, optimize=True, progressive=True) + + +def make_overview(video: Path, images: list[tuple[Path, str]], target: Path) -> None: + canvas = Image.new("RGB", (2400, 1500), (10, 6, 22)) + draw = ImageDraw.Draw(canvas) + draw.text((90, 58), "WARPKEEP — BACKGROUND VIDEO REFERENCE PACK", font=font(64, True), fill=(238, 202, 111)) + draw.text((94, 136), "Exact source media preserved for future cinematic and menu-background production", font=font(30), fill=(202, 191, 220)) + + with tempfile.TemporaryDirectory(prefix="warpkeep-overview-") as temp_dir: + hero_frame = Path(temp_dir) / "hero.png" + extract_frame(video, 5.9, hero_frame) + with Image.open(hero_frame) as image: + hero = fit_image(image, (650, 1120), (4, 3, 10)) + canvas.paste(hero, (90, 250)) + draw.rounded_rectangle((90, 250, 740, 1370), radius=16, outline=(112, 78, 145), width=4) + draw.rectangle((90, 1285, 740, 1370), fill=(13, 8, 28)) + draw.text((116, 1304), "ANIMATED CASTLE + CORE SKYLINE", font=font(25, True), fill=(245, 229, 192)) + + panel_positions = [(800, 250), (1580, 250), (800, 820), (1580, 820)] + for (source_path, label), (x, y) in zip(images, panel_positions): + with Image.open(source_path) as image: + panel = fit_image(image, (700, 480), (4, 3, 10)) + canvas.paste(panel, (x, y)) + draw.rounded_rectangle((x, y, x + 700, y + 530), radius=16, outline=(112, 78, 145), width=4) + draw.rectangle((x, y + 480, x + 700, y + 530), fill=(13, 8, 28)) + draw.text((x + 22, y + 492), label, font=font(23, True), fill=(245, 229, 192)) + + draw.text((92, 1430), "5 byte-exact supplied files · checksums · provenance · visual index", font=font(27), fill=(163, 148, 184)) + canvas.save(target, "JPEG", quality=88, optimize=True, progressive=True) + + +def write_json(path: Path, value: object) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(json.dumps(value, indent=2, sort_keys=False) + "\n", encoding="utf-8") + + +def zip_entry(path: Path, root: Path) -> dict: + media_type = mimetypes.guess_type(path.name)[0] or "application/octet-stream" + return { + "path": f"{PACKAGE_ROOT}/{path.relative_to(root).as_posix()}", + "bytes": path.stat().st_size, + "sha256": sha256(path), + "mediaType": media_type, + } + + +def main() -> None: + parser = argparse.ArgumentParser() + parser.add_argument("--video", type=Path, required=True) + parser.add_argument("--spire", type=Path, required=True) + parser.add_argument("--crest-dark", type=Path, required=True) + parser.add_argument("--crest-green", type=Path, required=True) + parser.add_argument("--menu", type=Path, required=True) + parser.add_argument("--output", type=Path, required=True) + args = parser.parse_args() + + output = args.output.resolve() + package = output / PACKAGE_ROOT + source_video = package / "source" / "video" / "warpkeep-castle-core-background-concept-vertical.mp4" + source_images = package / "source" / "images" + source_images.mkdir(parents=True, exist_ok=True) + source_video.parent.mkdir(parents=True, exist_ok=True) + preview_dir = package / "previews" + preview_dir.mkdir(parents=True, exist_ok=True) + + copies = [ + (args.video, source_video, "animated castle-and-Core skyline concept"), + (args.spire, source_images / "core-spire-low-poly-reference.png", "low-poly Core spire reference"), + (args.crest_dark, source_images / "core-crest-dark-reference.png", "dark-background Core crest reference"), + (args.crest_green, source_images / "core-crest-green-screen-reference.png", "green-screen Core crest reference"), + (args.menu, source_images / "warpkeep-menu-castle-reference.png", "Warpkeep title-menu castle reference"), + ] + for supplied, destination, _ in copies: + if not supplied.is_file(): + raise FileNotFoundError(supplied) + shutil.copyfile(supplied, destination) + + overview = preview_dir / "background-video-reference-overview-2400x1500.jpg" + contact_sheet = preview_dir / "source-video-contact-sheet-1800x1500.jpg" + image_cards = [ + (copies[1][1], "LOW-POLY CORE SPIRE"), + (copies[2][1], "CORE CREST — DARK"), + (copies[3][1], "CORE CREST — GREEN SCREEN"), + (copies[4][1], "WARPKEEP MENU CASTLE"), + ] + make_overview(source_video, image_cards, overview) + make_video_contact_sheet(source_video, contact_sheet) + + video_probe = ffprobe(source_video) + source_records = [] + for supplied, destination, role in copies: + record = { + "path": destination.relative_to(package).as_posix(), + "suppliedBasename": supplied.name, + "role": role, + "bytes": destination.stat().st_size, + "sha256": sha256(destination), + } + if destination.suffix.lower() == ".png": + record["image"] = image_info(destination) + else: + record["media"] = video_probe + source_records.append(record) + + readme = package / "README.md" + readme.write_text( + "# Warpkeep background-video reference pack\n\n" + "Snapshot: 2026-08-03\n\n" + "This archive preserves five supplied visual references for future Warpkeep " + "menu-background and cinematic video creation. All files in `source/` retain " + "the exact supplied bytes; only their archive paths are made descriptive.\n\n" + "## Contents\n\n" + "- `source/video/` — 10.08-second vertical H.264/AAC castle-and-Core concept clip\n" + "- `source/images/` — Core spire, two Core crest treatments, and Warpkeep menu-castle references\n" + "- `previews/` — derived overview and time-sampled contact sheet for quick browsing\n" + "- `manifest.json` — source names, roles, dimensions, encoding metadata, bytes, and SHA-256 hashes\n" + "- `SHA256SUMS.txt` — integrity checks for every file except itself\n\n" + "## Intended use\n\n" + "Use this as a visual-development reference set. It is not a runtime bundle, " + "a final compositing contract, or evidence that every depicted design is live in game. " + "Prefer the exact source files for new production and the previews only for discovery.\n\n" + "## Rights boundary\n\n" + "Ael explicitly requested public archival and GitHub Release distribution of this named pack. " + "No separate open-license, trademark, or canonical-identity grant is asserted.\n", + encoding="utf-8", + ) + + internal_manifest = { + "schemaVersion": 1, + "assetId": "warpkeep.references.background-video.2026-08-03", + "name": "Warpkeep background-video creation reference pack", + "snapshotDate": "2026-08-03", + "purpose": "Future Warpkeep menu-background and cinematic video visual development.", + "designation": "reference-only; current runtime integration and final production status are not asserted", + "source": { + "suppliedBy": "Ael", + "authorization": "Ael explicitly requested packaging and public upload to Warpkeep-Assets.", + "preservation": "All source files are byte-exact; archive paths alone were renamed descriptively.", + }, + "license": { + "spdx": None, + "status": "public-archive-authorized-no-separate-open-license", + }, + "sourceFiles": source_records, + "derivedPreviews": [ + { + "path": overview.relative_to(package).as_posix(), + "bytes": overview.stat().st_size, + "sha256": sha256(overview), + "dimensions": [2400, 1500], + }, + { + "path": contact_sheet.relative_to(package).as_posix(), + "bytes": contact_sheet.stat().st_size, + "sha256": sha256(contact_sheet), + "dimensions": [1800, 1500], + }, + ], + } + internal_manifest_path = package / "manifest.json" + write_json(internal_manifest_path, internal_manifest) + + checksummed = sorted(path for path in package.rglob("*") if path.is_file() and path.name != "SHA256SUMS.txt") + checksum_path = package / "SHA256SUMS.txt" + checksum_path.write_text( + "".join(f"{sha256(path)} {path.relative_to(package).as_posix()}\n" for path in checksummed), + encoding="utf-8", + ) + + zip_path = output / ZIP_NAME + with zipfile.ZipFile(zip_path, "w", compression=zipfile.ZIP_DEFLATED, compresslevel=9) as archive: + for path in sorted(package.rglob("*")): + if not path.is_file(): + continue + relative = f"{PACKAGE_ROOT}/{path.relative_to(package).as_posix()}" + info = zipfile.ZipInfo(relative, date_time=(2026, 8, 3, 12, 0, 0)) + info.compress_type = zipfile.ZIP_DEFLATED + info.external_attr = 0o100644 << 16 + archive.writestr(info, path.read_bytes(), compress_type=zipfile.ZIP_DEFLATED, compresslevel=9) + + entries = [] + with zipfile.ZipFile(zip_path) as archive: + for item in sorted(archive.infolist(), key=lambda value: value.filename): + extracted = package / Path(item.filename).relative_to(PACKAGE_ROOT) + entry = zip_entry(extracted, package) + entry["compressedBytes"] = item.compress_size + entries.append(entry) + + release_manifest = { + "schemaVersion": 1, + "repository": "ael-dev3/Warpkeep-Assets", + "tag": TAG, + "source": { + "suppliedBy": "Ael", + "authorization": "Ael explicitly requested packaging and public upload to Warpkeep-Assets.", + "privateWorkflowMetadata": "intentionally omitted", + }, + "designation": { + "name": "Warpkeep background-video creation reference pack", + "role": "future menu-background and cinematic video visual development", + "runtimeIntegration": "reference-only; current integration not asserted", + }, + "license": { + "spdx": None, + "status": "public-archive-authorized-no-separate-open-license", + "scope": "Public archival and GitHub Release distribution are authorized for this named reference pack. No separate open-license, trademark, or canonical-identity grant is asserted.", + }, + "attachments": [ + { + "name": ZIP_NAME, + "variant": "complete-byte-exact-reference-pack", + "bytes": zip_path.stat().st_size, + "sha256": sha256(zip_path), + "mediaType": "application/zip", + "packageRoot": PACKAGE_ROOT, + "entries": entries, + "url": RELEASE_URL, + } + ], + "verification": { + "sourceCount": 5, + "sourcePreservation": "Every supplied source file is present byte-exact inside the ZIP.", + "checksums": "The release attachment and every ZIP entry are SHA-256 addressed.", + "videoAudit": "The supplied MP4 decodes as a 10.08-second 834×1112 H.264 60 fps video with stereo AAC audio.", + }, + } + + source_manifest = { + "schemaVersion": 1, + "assetId": "warpkeep.references.background-video.2026-08-03", + "archivePurpose": "Preserve future-reference media for Warpkeep menu-background and cinematic video creation.", + "snapshotDate": "2026-08-03", + "designation": release_manifest["designation"], + "source": internal_manifest["source"], + "licensePolicy": release_manifest["license"], + "sourceFiles": source_records, + "release": { + "tag": TAG, + "attachments": [ + { + "name": ZIP_NAME, + "bytes": zip_path.stat().st_size, + "sha256": sha256(zip_path), + } + ], + }, + "previews": [ + { + "file": "00-background-video-reference-overview.jpg", + "title": "Warpkeep background-video reference overview", + "source": "deterministic composite of all supplied references and a source-video frame", + "bytes": overview.stat().st_size, + "sha256": sha256(overview), + "dimensions": [2400, 1500], + }, + { + "file": "01-source-video-contact-sheet.jpg", + "title": "Source video contact sheet", + "source": "six deterministic time samples from the supplied MP4", + "bytes": contact_sheet.stat().st_size, + "sha256": sha256(contact_sheet), + "dimensions": [1800, 1500], + }, + ], + } + + metadata = output / "repo-metadata" + write_json(metadata / "source-manifest.json", source_manifest) + write_json(metadata / "release-manifest.json", release_manifest) + shutil.copyfile(overview, metadata / "00-background-video-reference-overview.jpg") + shutil.copyfile(contact_sheet, metadata / "01-source-video-contact-sheet.jpg") + write_json( + metadata / "gallery.json", + { + "schema": "warpkeep.preview-gallery.v1", + "releaseTag": TAG, + "images": source_manifest["previews"], + }, + ) + (metadata / "SHA256SUMS.txt").write_text(f"{sha256(zip_path)} {ZIP_NAME}\n", encoding="utf-8") + write_json( + output / "build-report.json", + { + "zip": str(zip_path), + "zipBytes": zip_path.stat().st_size, + "zipSha256": sha256(zip_path), + "sourceFiles": source_records, + "entryCount": len(entries), + }, + ) + + +if __name__ == "__main__": + main()