114 lines
6.4 KiB
Markdown
114 lines
6.4 KiB
Markdown
# 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.
|