Files
zombie-fps/docs/BRANDING.md
T

114 lines
6.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Work-Death Balance — loading screen and favicon
The game is named **Work-Death Balance** in the menu, native window, HTML title,
description and loading screen. **MatGames** remains the studio signature.
The stock Godot boot splash is replaced by the existing nerd-zombie mascot on black. This applies to both surfaces:
- the browser loading screen: the exported `index.png` referenced by
`<img id="status-splash">` in the HTML shell, drawn over `#status`;
- native startup: `application/boot_splash/image` in `project.godot`.
## Asset
`assets/branding/boot_splash.png`, 1024x1315, palette PNG with alpha
(256 colors, antialiased alpha), about 174 KB. Subject: cartoon zombie head and bust,
bald scalp with a sparse hair fringe on the sides, thick nerd glasses, unsettling grin,
thumbs up, with **Work-Death Balance** in the VT323 phosphor-terminal typeface and
the subtitle `MatGames — "...because he was bored..."` beneath it.
Provenance is recorded in `tools/branding/manifest.json`:
- mascot: generated with `agy_generate` (Antigravity direct API, model
`gemini-3.1-flash-image`) on 2026-10-11 from no third-party source material; the
provider terms do not claim ownership of the output. A second AI pass (`agy_edit`)
kept the face, grin, thumbs-up hand, shirt, pose and flat background and changed
only the hair to a bald scalp with a side fringe, then a third pass added thick nerd
glasses while keeping the face, grin, hand, shirt, pose and flat background. All
files and their SHA256 are kept in `tools/branding/raw/` and the chain is recorded
under `mascot_provenance`.
Note that an image generator does not emit real alpha, so the flat magenta
background is keyed out locally;
- lettering: drawn by script, not by the generator, because generated text is
unreliable. Font `tools/branding/fonts/VT323-Regular.ttf`, glyphs of the DEC VT320
terminal, licensed **SIL Open Font License 1.1** (license text kept next to it in
`OFL.txt`, downloaded from the `google/fonts` repository). OFL permits embedding
and redistribution, including commercially, as long as the font is not sold on its
own. SHA256 `cf4de751ada78ceac033dbe16a687742939995b77bc2a052ae17a4957958594d`.
Only the final splash/icon PNGs live under `assets/`, so the raw source and the font are not
packed into the export (`tools/*` is already excluded by the export preset).
## Composition and keying
`tools/make_boot_splash.py`:
1. measures the background color from the four corners (here 250,4,247);
2. builds an anti-aliased mask by distance from that color (transparent below 55,
opaque above 130) and runs a small median filter;
3. removes magenta spill by subtracting `min(r, b) - g`, which does not harm the
pink tongue or the blue shirt because their red and blue are not both above green;
4. crops to the subject, applies a 50 px fade at the bottom to soften the frame cut
of the generated bust, and scales to 1024 px wide with 40 px side padding;
5. draws the title with VT323 in amber over a blurred glow layer, plus an optional
second line. Defaults are `Work-Death Balance` and the subtitle
`MatGames — "...because he was bored..."`; `--title`, `--subtitle` (empty to omit) and
`--subtitle-height` change them. A 30 px `--bottom-padding` band is left under the
text so the shell progress bar does not cross the lettering;
6. quantizes to 256 colors (no dither) and writes the PNG plus the manifest;
7. invokes `tools/make_favicon.py` with the already keyed original 1024×1024 mascot.
A head-only polygon excludes the hand and bust, then draws the face inside a dark
rounded badge with an amber outline. No new AI generation or second chroma key.
The 512×512 RGBA master is `assets/branding/work_death_icon.png`; a 32×32 review
preview is kept in `tools/branding/favicon_preview_32.png`. Provenance and SHA256
are recorded under `favicon` in the same manifest.
```sh
python3 tools/make_boot_splash.py tools/branding/raw/agy_edit_20261011000309_0.jpg \
--provenance tools/branding/raw/agy_generate_20261010234423_0.jpg \
--provenance tools/branding/raw/agy_edit_20261010235510_0.jpg
```
`--colors 0` keeps 32-bit RGBA if a future artwork needs smoother gradients.
## Godot settings
```ini
config/name="Work-Death Balance"
config/icon="res://assets/branding/work_death_icon.png"
boot_splash/bg_color=Color(0, 0, 0, 1)
boot_splash/image="res://assets/branding/boot_splash.png"
boot_splash/show_image=true
boot_splash/use_filter=true
```
The default stretch behavior is kept, so the image is scaled preserving its aspect
ratio; the exported shell confirms the result with the classes
`show-image--true fullsize--true use-filter--true` and `#status` background
`#000000`.
## Verification
- Exported `index.png` has the same 1024×1315 dimensions as the master. Godot
re-encodes palette images to RGBA, so bytes need not match the source PNG.
- Web preset `html/export_icon=true` uses the project icon through Godot's official
exporter. It creates `index.icon.png` (512×512) and `index.apple-touch-icon.png`
(180×180) with the corresponding HTML links. No generated HTML patch or default
Godot favicon remains; both files are included in the immutable release/hash check.
Firefox's runtime favicon is a generated blob URL; decoded pixels were compared
with the exported PNG and match exactly (zero mean/max difference).
- The exported shell contains no "Game engine" text and the splash image has an
empty `alt`.
- The legacy URL `/pub/zombie-fps/`, score API and `zombie_fps_*` localStorage keys
intentionally remain unchanged to preserve bookmarks and browser identity.
- Native `user://` moves with the project name. `player_profile.gd` imports the old
sibling `Zombie Room FPS/zombie_fps_profile.cfg` only when the new profile is
absent, never modifies the source and never replaces an existing new profile.
Name, ID, best score and name-lock flag are retained; migration has isolated tests.
The actual local migration was also verified byte-identical, old file unchanged.
- On a phone in landscape the splash is scaled to fit the height, so the mascot
appears fairly small; a landscape variant (mascot beside the title) would fill
more of the screen if that is wanted.
- `test_rebalance_branding.gd` checks title, icon, export setting and exact damage
values; `test_player_profile.gd` includes five non-destructive migration checks.
Both suites also pass in the GDExtension-free staging project.