Intro gegen echte DOSBox-Referenz korrigiert + Leertaste-Skip

Referenzaufnahmen aus DOSBox (Xvfb) gemacht und danach:

- Rauser-Aufloesung gefixt: die nativen PCC-Assets werden jetzt EINMAL direkt
  auf Endgroesse hochskaliert (Nearest) und der Screen direkt in Fenster-
  aufloesung gerendert -- statt vorher 0.5x-Downscale (verwirft Pixel) + x3-
  Upscale ueber eine 320er-Zwischenleinwand. Gleiche Groesse wie bisher (~33%
  Bildbreite, gegen Referenz gemessen), aber gestochen scharf. Zusaetzlich das
  tuerkise "!"-Kaestchen nachgebaut (im Original Engine-gezeichnet, in keinem
  Asset enthalten).
- Titelbild-Reveal: Grau/Entsaettigung raus (Stefan "das gray raus"); die
  Scanlines auf der unteren Haelfte loesen sich jetzt von der Mitte nach unten
  auf ("scanlines ab der mitte getrennt weg") statt gleichmaessig auszufaden.
- Factor5: Logo haelt exakt so lange wie sein Sound (TITEL2 Song 1) spielt,
  dann weiter zu Kellogg's.
- Leertaste ueberspringt jetzt den aktuellen Intro-Screen, ESC beendet das
  ganze Intro (wait_or_skip gibt 'quit'/'skip'/None; run_once ist in Scenes
  zerlegt).

HANG-FIX (dabei gefunden): das kompilierte render_tfmx-Binary war veraltet
(vor dem Song-Index-Feature aus render_tfmx.c gebaut) und renderte TITEL2 Song1
mit 180s statt 2.4s -- gekoppelt an die neue "Factor5-Dauer = Songlaenge"-Logik
haette das Intro 3 Minuten eingefroren. Fixes: audio._ensure_binary() baut jetzt
neu, wenn die Quelle neuer ist als das Binary (verhindert stale Binary nach git
pull); zusaetzlich FACTOR5_MAX_SECONDS als Sicherheits-Obergrenze.

Verifiziert: python -m game --once (headless) exit 0 in ~30s; Rauser/Titelbild
visuell gegen die DOSBox-Referenz gegengeprueft.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
duffyduck
2026-07-24 01:39:28 +02:00
co-authored by Claude Opus 4.8
parent e7d95190eb
commit 7aea2fac26
3 changed files with 227 additions and 149 deletions
+11 -1
View File
@@ -47,8 +47,18 @@ _CACHE_DIR = os.environ.get('KELLOGG_AUDIO_CACHE', os.path.join(_PROJECT_ROOT, '
def _ensure_binary():
'''Baut render_tfmx, wenn das Binary fehlt ODER aelter ist als eine der
Quelldateien. Das "aelter als die Quelle"-Kriterium ist wichtig: nach einem
git pull (z.B. dem Song-Index-Feature in render_tfmx.c) blieb sonst ein
veraltetes Binary liegen, das falsche/zu lange WAVs rendert -- das hat am
24.07.2026 einen 180s-statt-2.4s-Render und damit einen Intro-Hang
verursacht (Factor5-Dauer haengt an der Songlaenge).'''
srcs = [os.path.join(_PLAYER_DIR, f)
for f in ('render_tfmx.c', 'tfmx.h', 'paula.h', 'player_api.h')]
if os.path.exists(_BINARY):
return
bmtime = os.path.getmtime(_BINARY)
if all(not os.path.exists(s) or os.path.getmtime(s) <= bmtime for s in srcs):
return # Binary ist aktuell
subprocess.run(['bash', os.path.join(_PLAYER_DIR, 'build.sh')], check=True)