Feat #15: Errungenschaften — Abzeichen für erreichte Meilensteine #17

Merged
florian.wilde merged 1 commits from feat/15-errungenschaften into main 2026-09-02 11:27:12 +00:00
Owner

Zwanzig feste Abzeichen plus dynamische für vollständig gesehene Filmreihen und abgeschlossene Universen. Sie tauchen auf, wenn etwas erreicht ist, und bleiben dann — keine Streaks, keine Fortschrittsbalken, kein Drängeln.

Errungenschaften

Spider Bro

Für Filmreihen braucht es keine gepflegte Liste: TMDB gruppiert sie selbst, und tmdbCollectionId liegt beim Import schon am Titel. „Alle Spider-Man gesehen" ist damit eine Abfrage, kein Sonderfall.

Umgesetzt ist der Vorschlag aus dem Issue — beides:

  • generisch als Grundlage: „Reihe komplett — Nordlicht Filmreihe", funktioniert für jede Reihe
  • kuratierte Eigennamen obendrauf in src/lib/achievement-names.ts: eine Zeile pro Reihe, sonst nichts

Eine Absicherung, auf die ich bestanden habe

Ich habe die TMDB-Collection-Kennungen aus dem Gedächtnis geschrieben und kann sie hier nicht gegen TMDB prüfen — der Entwicklungsaufbau spricht mit einem Stub. Eine falsch abgeschriebene Kennung würde jemandem das falsche Abzeichen geben: wer Ocean's durchhat, bekäme „Spider Bro".

Deshalb trägt jeder kuratierte Eintrag ein Stück des erwarteten TMDB-Namens:

556: { name: "Spider Bro", symbol: "spinne", erwartet: "Spider-Man" },

Passt der Name der Reihe nicht dazu, wird der Eintrag ignoriert und der generische greift. Ein Tippfehler bleibt folgenlos. Ein Test deckt genau das ab.

Der Katalog

Gruppe Abzeichen
Anfänge Erstkontakt, Abgehakt, Schlüsselmeister, Heimkehrer
Reihen Reihe komplett (dynamisch), Universum vollendet (dynamisch), Chronologe
Ausdauer Serientäter, Vielseher, Ein ganzer Tag, Eine ganze Woche, Marathon, Der lange Atem, Treu geblieben, Wiederholungstäter
Breite Feinschmecker, Zeitreisender, Kritiker, Strenges Urteil
Ordnung Sammler, Aufgeräumt, Durchgemacht

Wie es gerechnet wird

Alle Regeln arbeiten auf einem Datensatz, der einmal geholt wird. Sonst stellte jede Regel ihre eigene Abfrage, und aus zwanzig Abzeichen würden zwanzig Abfragen bei jedem Abhaken.

Ausgewertet wird nach Sichtungsaktionen und einmal täglich. Der erste Lauf eines Kontos ist stumm — eine gewachsene Bibliothek löst sonst zwei Dutzend Meldungen auf einmal aus. Beim ersten Öffnen der Übersicht wird dieser stumme Lauf angestoßen, sonst bliebe sie bis zum nächsten Hintergrundlauf leer.

Einmal erreicht, bleibt erreicht. Wer eine Sichtung zurücknimmt, verliert kein Abzeichen.

Ein Fehler, den der Test gefunden hat

Die Uhrzeit-Regel („zwischen drei und fünf") las die Stunde aus der formatierten Zeichenkette. Auf Deutsch liefert Intl für eine einzelne Stunde aber „03 Uhr", und Number("03 Uhr") ist NaN — das Abzeichen wäre nie vergeben worden. Jetzt über formatToParts.

Der Test war absichtlich so gebaut, dass er den Zeitzonenversatz mitprüft: 01:30 UTC ist 03:30 in Berlin. Wer in Serverzeit rechnet, verpasst es.

Geprüft

88 Tests grün (vorher 78), Typecheck sauber. Zehn neue: Stummschaltung, Entdopplung, „bleibt erreicht", Zeitzone in beide Richtungen, eingefrorene Namen, die Absicherung der kuratierten Einträge.

Screenshot gegen die geseedete Instanz aufgenommen — nebenbei fiel dabei auf, dass die klebende Kopfleiste sich über Ausschnitte legt; das Aufnahmeskript hebt sie jetzt fürs Bild auf. Entwicklungsdatenbank wieder im Ausgangszustand.

Closes #15

Zwanzig feste Abzeichen plus dynamische für vollständig gesehene **Filmreihen** und abgeschlossene **Universen**. Sie tauchen auf, wenn etwas erreicht ist, und bleiben dann — keine Streaks, keine Fortschrittsbalken, kein Drängeln. ![Errungenschaften](https://git.wilde-server.de/florian.wilde/flimmer/raw/branch/feat/15-errungenschaften/docs/screenshots/23-errungenschaften.webp) ## Spider Bro Für Filmreihen braucht es **keine gepflegte Liste**: TMDB gruppiert sie selbst, und `tmdbCollectionId` liegt beim Import schon am Titel. „Alle Spider-Man gesehen" ist damit eine Abfrage, kein Sonderfall. Umgesetzt ist der Vorschlag aus dem Issue — beides: - **generisch als Grundlage**: „Reihe komplett — Nordlicht Filmreihe", funktioniert für jede Reihe - **kuratierte Eigennamen obendrauf** in `src/lib/achievement-names.ts`: eine Zeile pro Reihe, sonst nichts ## Eine Absicherung, auf die ich bestanden habe Ich habe die TMDB-Collection-Kennungen **aus dem Gedächtnis** geschrieben und kann sie hier nicht gegen TMDB prüfen — der Entwicklungsaufbau spricht mit einem Stub. Eine falsch abgeschriebene Kennung würde jemandem das falsche Abzeichen geben: wer Ocean's durchhat, bekäme „Spider Bro". Deshalb trägt jeder kuratierte Eintrag ein Stück des **erwarteten TMDB-Namens**: ```ts 556: { name: "Spider Bro", symbol: "spinne", erwartet: "Spider-Man" }, ``` Passt der Name der Reihe nicht dazu, wird der Eintrag ignoriert und der generische greift. Ein Tippfehler bleibt folgenlos. Ein Test deckt genau das ab. ## Der Katalog | Gruppe | Abzeichen | |---|---| | Anfänge | Erstkontakt, Abgehakt, Schlüsselmeister, Heimkehrer | | Reihen | Reihe komplett *(dynamisch)*, Universum vollendet *(dynamisch)*, Chronologe | | Ausdauer | Serientäter, Vielseher, Ein ganzer Tag, Eine ganze Woche, Marathon, Der lange Atem, Treu geblieben, Wiederholungstäter | | Breite | Feinschmecker, Zeitreisender, Kritiker, Strenges Urteil | | Ordnung | Sammler, Aufgeräumt, Durchgemacht | ## Wie es gerechnet wird **Alle Regeln arbeiten auf einem Datensatz**, der einmal geholt wird. Sonst stellte jede Regel ihre eigene Abfrage, und aus zwanzig Abzeichen würden zwanzig Abfragen bei jedem Abhaken. Ausgewertet wird nach Sichtungsaktionen und einmal täglich. Der **erste Lauf eines Kontos ist stumm** — eine gewachsene Bibliothek löst sonst zwei Dutzend Meldungen auf einmal aus. Beim ersten Öffnen der Übersicht wird dieser stumme Lauf angestoßen, sonst bliebe sie bis zum nächsten Hintergrundlauf leer. **Einmal erreicht, bleibt erreicht.** Wer eine Sichtung zurücknimmt, verliert kein Abzeichen. ## Ein Fehler, den der Test gefunden hat Die Uhrzeit-Regel („zwischen drei und fünf") las die Stunde aus der formatierten Zeichenkette. Auf Deutsch liefert `Intl` für eine einzelne Stunde aber **„03 Uhr"**, und `Number("03 Uhr")` ist `NaN` — das Abzeichen wäre nie vergeben worden. Jetzt über `formatToParts`. Der Test war absichtlich so gebaut, dass er den Zeitzonenversatz mitprüft: 01:30 UTC ist 03:30 in Berlin. Wer in Serverzeit rechnet, verpasst es. ## Geprüft **88 Tests grün** (vorher 78), Typecheck sauber. Zehn neue: Stummschaltung, Entdopplung, „bleibt erreicht", Zeitzone in beide Richtungen, eingefrorene Namen, die Absicherung der kuratierten Einträge. Screenshot gegen die geseedete Instanz aufgenommen — nebenbei fiel dabei auf, dass die klebende Kopfleiste sich über Ausschnitte legt; das Aufnahmeskript hebt sie jetzt fürs Bild auf. Entwicklungsdatenbank wieder im Ausgangszustand. Closes #15
florian.wilde added 1 commit 2026-09-02 10:10:39 +00:00
Errungenschaften: Abzeichen fuer erreichte Meilensteine
CI / pruefen (pull_request) Canceled after 0s
b560ee9c51
Zwanzig feste Abzeichen plus dynamische fuer vollstaendig gesehene Filmreihen
und abgeschlossene Universen. Sie tauchen auf, wenn etwas erreicht ist, und
bleiben — auch wenn die Bedingung spaeter wegfaellt. Eine zurueckgenommene
Sichtung soll kein Abzeichen kosten.

Alle Regeln arbeiten auf *einem* Datensatz, der einmal geholt wird. Sonst
stellte jede Regel ihre eigene Abfrage, und aus zwanzig Abzeichen wuerden
zwanzig Abfragen bei jedem Abhaken. Ausgewertet wird nach Sichtungsaktionen
und einmal taeglich; der erste Lauf eines Kontos ist stumm, weil eine
gewachsene Bibliothek sonst zwei Dutzend Meldungen auf einmal ausloest.

Fuer Filmreihen braucht es keine gepflegte Liste: TMDB gruppiert sie selbst,
und tmdbCollectionId liegt beim Import schon am Titel. Eigennamen wie
"Spider Bro" kommen aus einer kleinen Datendatei obendrauf; fehlt ein Eintrag,
greift der generische Name.

Die kuratierten Eintraege tragen jeweils ein Stueck des erwarteten
TMDB-Namens. Ich habe die Collection-Kennungen aus dem Gedaechtnis
geschrieben und kann sie hier nicht gegen TMDB pruefen — passt der Name
nicht, wird der Eintrag ignoriert und der generische greift. Eine falsch
abgeschriebene Kennung bleibt damit folgenlos statt jemandem das falsche
Abzeichen zu geben.

Die Uhrzeit-Regel liest die Stunde ueber formatToParts statt ueber die
formatierte Zeichenkette: auf Deutsch liefert Intl fuer eine einzelne Stunde
"03 Uhr", und daraus wird beim Umwandeln NaN. Ein Test hat das aufgedeckt.

Beim ersten Oeffnen der Uebersicht wird einmal ausgewertet — sonst bliebe sie
bei einem Bestandskonto leer, bis nachts der Hintergrundlauf kommt.

Zehn Tests, Anleitung mit Screenshot. Symbole als eigene SVG auf einem
gemeinsamen Raster; erreicht und offen unterscheiden sich nicht nur durch
Farbe, sondern auch im Text.

Refs #15
florian.wilde merged commit 6847d08011 into main 2026-09-02 11:27:12 +00:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: florian.wilde/flimmer#17