feat(launcher): copy disc art and icon during setup

Merged
NO
5d ago
+207-8

Summary

A fresh install starts on a plain sea backdrop with the default Windows icon,
because private/launcher and private/doaxbv.ico are gitignored and nothing
created them.

Setup now copies the launcher art and cuts the program icon from the player's own
disc on Windows builds. tools/launcher_art.py finds four textures in the disc's
AFS archives by their runtime replacement key, so no game file names are
recorded, and writes only files that are missing. tools/build_game.py runs it
before CMake configure, which is when private/doaxbv.ico is embedded in the
runner. A failed extraction prints Skipped launcher art: ... and does not
block the build.

The launcher falls back to the extracted beach.png, a sunny location preview
scaled to fill the window, when no player background.png exists, so a supplied
island map frame still wins. The icon is the wave emblem cropped square from the
logo at 256/48/32/16; the runner and the launcher window both use it. Setup never
overwrites private/launcher/*.png or private/doaxbv.ico.

Independent of #149: both edit tools/launcher.ps1, in different places.

Verification

  • python -m unittest discover -s tools -p "test_*.py" — 66 tests OK, 1 skipped
    (adds test_launcher_art, which builds a synthetic AFS/XPR disc).
  • python tools/public_export.py verify --require-public-tree and
    verify-archive — passed.
  • powershell and pwsh -File tools\test_launcher.ps1 — passed on 5.1.26100.9711
    and 7.6.8.
  • python tools\launcher_art.py <extracted disc> — wrote 5 files in 1.5 s; the
    extracted logo and A/B prompts are pixel-identical to the existing art, and the
    ICO reads back with all four sizes.
  • MSVC Debug ctest — 47/47 passed. clang/MinGW ctest — 45/45 passed.
  • Offscreen launcher render with the extracted art shows the beach backdrop with
    the logo and prompts.
  • Not run: a full ISO build through the launcher's build button. The new call sits
    before configure and was exercised directly against the disc, and no gameplay
    or runtime code changed.

Contribution checklist

  • The change follows AGENTS.md and CONTRIBUTING.md.
  • No XBE, generated game C, retail instruction bytes, extracted assets or
    filenames, saves, BIOS data, private paths, or run evidence are included.
  • Third-party material and its license are identified, if applicable.