Files

6.4 KiB
Raw Permalink Blame History

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.
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

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.