Tages- und Wochenmissionen: ein Grund wiederzukommen
Jede beendete Partie bewegt jetzt eine Reihe von Tages- und Wochenmissionen, schreibt XP gut, sobald du eine abschließt, und speist eine frische Wochen-Bestenliste.

Kurz gesagt
Bisher bestand der ganze Fortschritt in opolyx aus einer einmaligen Belohnung fürs Gewinnen. Es gab nichts, dem man Tag für Tag nachjagen konnte. Missionen ändern das: eine kleine Auswahl täglicher und wöchentlicher Ziele, die jedes Mal weiterzählen, wenn du eine Partie beendest – ob gewonnen oder verloren.
Du musst nichts abholen und es gibt keine Schaltfläche zu drücken – in dem Moment, in dem eine Partie endet, prüft der Server deine Missionen, schreibt die abgeschlossenen gut und rechnet die XP direkt auf dein Level an. Sechs Missionen laufen gleichzeitig:
- Täglich – 1 Partie spielen, 3 Partien spielen, 1 Partie gewinnen.
- Wöchentlich – 10 Partien spielen, 3 Partien gewinnen, 3 Speed-Partien gewinnen.
- Tagesmissionen werden jeden Tag zurückgesetzt, Wochenmissionen jeden Montag.
| Mission | Takt | Ziel | Belohnung |
|---|---|---|---|
| Eine Partie spielen | Täglich | 1 | +50 XP |
| Dranbleiben | Täglich | 3 | +150 XP |
| Eine Partie gewinnen | Täglich | 1 | +250 XP |
| Stammgast | Wöchentlich | 10 Partien | +400 XP |
| Im Lauf | Wöchentlich | 3 Siege | +600 XP |
| Speed-Teufel | Wöchentlich | 3 Speed-Siege | +500 XP |
Beendete Partien bringen außerdem Punkte für die Wochen-Bestenliste – je mehr du spielst, desto höher steigst du. Die Liste wird jede Woche zurückgesetzt und gibt Montagmorgen allen eine saubere Chance auf die Spitze.
Für technisch Neugierige
Das Schema für eine vollständige Bindungsschleife existierte bereits, lag aber brach und ungelesen da – missions / user_missions (Takt, Ziel, Fortschritt, xp_reward) und weekly_top (week_start, points). Migration 0031 hat es in den bestehenden Belohnungspfad am Partieende eingehängt, statt etwas Neues zu erfinden.
Bei einem echten Partieende geht der Daemon jeden menschlichen Spieler durch und ruft eine einzige RPC mit Service-Rolle auf. Sie zählt jede Mission weiter, die das Partieende erfüllt, schreibt die XP beim ersten Überschreiten eines Ziels gut und erhöht den Wochenpunktestand:
-- grant_play_rewards(p_game, p_user, p_won): security definer, service-role only
-- daily cadence = current_date; weekly = date_trunc('week', now())
-- weekly_top.points += 20 (play) + (won ? 200 : 0) + mission_xp_earned
-- idempotent per (game_id, user_id) via the game_play_grants guard; bots skipped| Ereignistreffer | Zählt weiter für | Punkte |
|---|---|---|
| {"event":"play"} | Jedes Partieende | +20 |
| {"event":"win"} | Nur Siege | +200 |
| {"event":"play","mode":"speed"} | Nur Speed-Partien | +20 |
Die Idempotenz ist eine Wächterzeile pro (Partie, Spieler), ein wiederholter Commit zahlt also nie doppelt. Beim Anwenden trat eine Falle für Rechteausweitung zutage: Postgres-Standardrechte vergeben EXECUTE auf neue Funktionen an anon/authenticated, und revoke … from public nimmt das nicht zurück. Eine SECURITY-DEFINER-Belohnungsfunktion, die jeder angemeldete Nutzer aufrufen kann, ist eine XP-Farm – behoben mit revoke … from public, anon, authenticated, sodass nur noch {postgres, service_role} sie aufrufen können, passend zu award_game_winner.
Belohnungen gibt es vorerst nur in XP – Münzen gehören zur Monetarisierung, die zuerst eine Ausgabemöglichkeit braucht. Die Leiste auf der Spielseite und die Bestenliste lesen den Fortschritt des laufenden Zyklus im Browser, wobei die Woche an derselben Montagsgrenze verankert ist, die Postgres benutzt – so können die beiden nie auseinanderlaufen.
