Misi harian dan mingguan — alasan untuk kembali
Kini setiap game yang selesai menggerakkan sekumpulan misi harian dan mingguan, memberikan XP begitu kamu menyelesaikan satu, dan mengisi papan peringkat mingguan yang baru.

Dengan bahasa sederhana
Selama ini satu-satunya progres di opolyx adalah hadiah sekali jalan karena memenangkan sebuah game. Tidak ada yang bisa dikejar dari hari ke hari. Misi mengubah itu: sekumpulan kecil target harian dan mingguan yang bergerak maju setiap kali kamu menyelesaikan sebuah game, menang maupun kalah.
Kamu tidak perlu mengeklaim apa pun dan tidak ada tombol yang harus ditekan — begitu sebuah game berakhir, server memeriksa misimu, mengkreditkan yang kamu selesaikan, dan menambahkan XP langsung ke levelmu. Enam misi berjalan sekaligus:
- Harian — main 1 game, main 3 game, menang 1 game.
- Mingguan — main 10 game, menang 3 game, menang 3 game di mode Cepat.
- Misi harian direset setiap hari; misi mingguan direset setiap Senin.
| Misi | Frekuensi | Target | Hadiah |
|---|---|---|---|
| Main satu game | Harian | 1 | +50 XP |
| Terus bermain | Harian | 3 | +120 XP |
| Menangkan satu game | Harian | 1 | +150 XP |
| Rutin | Mingguan | 10 game | +300 XP |
| Sedang menang beruntun | Mingguan | 3 kemenangan | +400 XP |
| Setan kecepatan | Mingguan | 3 kemenangan Cepat | +400 XP |
Menyelesaikan game juga menghasilkan poin papan peringkat mingguan, jadi makin banyak kamu bermain, makin tinggi kamu naik. Papan direset setiap minggu, memberi semua orang peluang bersih menuju puncak pada Senin pagi.
Untuk yang ingin tahu teknisnya
Skema untuk loop retensi penuh sebenarnya sudah ada tetapi tergeletak tidak terpakai dan tak terbaca — missions / user_missions (frekuensi, target, progres, xp_reward) dan weekly_top (week_start, poin). Migrasi 0031 menyambungkannya ke jalur hadiah akhir-game yang sudah ada alih-alih menciptakan sesuatu yang baru.
Pada akhir game yang sebenarnya, daemon menelusuri setiap pemain manusia dan memanggil satu RPC service-role. Ia memajukan setiap misi yang dipenuhi oleh akhir game itu untuk siklus saat ini, memberikan XP saat sebuah target pertama kali dilampaui, dan menambahkan ke hitungan poin mingguan:
-- 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| Kecocokan event | Memajukan | Poin |
|---|---|---|
| {"event":"play"} | Setiap game selesai | +20 |
| {"event":"win"} | Hanya kemenangan | +200 |
| {"event":"play","mode":"speed"} | Hanya game Cepat | +20 |
Idempotensi berupa satu baris penjaga per (game, pengguna), sehingga commit yang diulang tidak pernah membayar dua kali. Sebuah jebakan eskalasi hak istimewa muncul saat penerapan: hak istimewa bawaan Postgres memberikan EXECUTE pada fungsi baru kepada anon/authenticated, dan revoke … from public tidak menghapusnya. Fungsi hadiah SECURITY DEFINER yang bisa dipanggil oleh pengguna mana pun yang login adalah ladang XP — diperbaiki dengan revoke … from public, anon, authenticated agar hanya {postgres, service_role} yang bisa memanggilnya, sama seperti award_game_winner.
Untuk saat ini hadiah hanya berupa XP — koin masuk ke jalur monetisasi, yang lebih dulu butuh saluran pengeluaran. Panel halaman Main dan Papan peringkat sama-sama membaca progres siklus saat ini di sisi klien, dengan minggu dipatok ke batas Senin yang sama seperti yang dipakai Postgres sehingga keduanya tidak pernah berbeda.
