timerIncDec beendete den Timer auch beim Hinzufuegen von Zeit: die Pruefung
verglich den Betrag des Werts mit der Restzeit, ohne die Richtung zu beachten.
Bei 5s Restzeit fuehrte "+10s" damit zum Spielende statt zu 15s. Die Pruefung
gilt jetzt nur noch fuer negative Werte. Beim Verringern unter 0 wird die
Restzeit zusaetzlich sauber auf 00:00 gesetzt, sonst blieb sie stehen und der
Timer war trotz "ENDE" auf dem Monitor wieder startbar.
Im Debugfenster zeigten alle drei Label auf scoreSwitchEnable. Ein Klick auf
den Text "Teamanzeige spiegeln" oder "Splashscreen anzeigen" blendete damit das
Scoreboard aus. Jede Beschriftung zeigt jetzt auf ihren eigenen Schalter.
scoreSetScore sendet den neuen Stand jetzt wie alterScore und clearScore an die
Monitore; der Endpunkt wird vom Panel nicht verwendet, ist aber dokumentiert.
alterScore laesst den Spielstand nicht mehr unter 0 laufen.
Die toten Funktionsprototypen in timer.js und score.js sind entfernt: sie wurden
durch Hoisting ohnehin ueberschrieben und listeten toggleReferenceMirrored und
print schon nicht mehr auf. Ebenso die Wert-Snapshots duration, durationLeft und
isPaused aus module.exports, die dauerhaft die Startwerte lieferten.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Ergaenzt: Splashscreen als dritte Monitoransicht und Standard beim Start,
Team-Datenbank, Debugfenster, Spiegelung des Adminpanels, Steuerung des
Kiosk-Browsers, die zugehoerigen etc-, db- und score-Endpunkte sowie der
Hinweis zur PORT-Variable. Korrigiert: Portangabe, Projektstruktur,
Antwortformate und die Abhaengigkeitsliste.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Die Datei war leer, wodurch der Splashscreen den weissen Browser-Hintergrund
zeigte statt des Blaus der uebrigen Monitoransichten. Scrollbalken auf dem
Beamer unterdrueckt.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Port 80 stammt aus dem Kiosk-Setup auf dem Pi, wo Chromium die Seite ohne
Portangabe unter http://localhost oeffnet. Als Default erzwingt er lokal
erhoehte Rechte. Auf dem Pi stattdessen PORT=80 setzen.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Mit dem Verschieben der +1/-1-Buttons in das Score-Panel blieb der alte
Block darunter als leere Karte stehen. Dadurch existierten teamAcolName und
teamBcolName jeweils zweimal im Dokument; getElementById traf nur die erste
Instanz, die zweite blieb dauerhaft leer.
Karte entfernt und die verbleibende Zeile zentriert.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
lowdb v7 ist ESM-only, das Projekt ist CommonJS. Der bisherige Umweg ueber
eine async IIFE mit await import() hatte zur Folge, dass db bei einem sehr
fruehen Request noch undefined sein konnte.
Fuer eine Liste von Teamnamen genuegt fs: read/write lesen und schreiben
db.json direkt und synchron, die Race-Condition entfaellt und lowdb kann als
Abhaengigkeit raus. Die exportierte API bleibt unveraendert, score.js und
routes/admin.js brauchen keine Anpassung.
Der Pfad zu db.json wird jetzt ueber __dirname aufgeloest statt relativ zum
Arbeitsverzeichnis, damit die Datei unabhaengig vom Startverzeichnis immer
an derselben Stelle liegt. Fehlt oder bricht die Datei, wird auf eine leere
Teamliste zurueckgefallen.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Konflikt in scoreboard/controllers/cli.js zugunsten der Remote-Version
aufgeloest: openBrowser()/killBrowser() bleiben erhalten, da routes/admin.js
sie verwendet. Der lokale Testcode wurde verworfen (er rief zudem das
child_process-Modul faelschlich als Funktion auf).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>