More achievements

This commit is contained in:
2026-10-22 12:25:21 -04:00
parent 3b81cae024
commit 84b363b863
4 changed files with 115 additions and 16 deletions
+16 -4
View File
@@ -73,7 +73,7 @@ Chat supports emoji autocomplete: type `:` followed by a name (for example `:sm`
Seasons begin at **00:00 UTC on the UTC date of each astronomical equinox or solstice**, not at the event's exact hour and not on fixed March/June/September/December dates. They are displayed as **Season I, Season II, Season III**, etc., including in the subtitle under **THE BUTTON**. Numbering begins at the earliest saved season (including existing archives on upgrade); its origin is persisted so numbering remains stable across restarts. Each astronomical boundary advances the number, including seasons missed during downtime. Date-based internal IDs and start/end dates remain unchanged. The built-in Meeus equinox/solstice calculation (with periodic and Delta-T corrections) supports 2000–2100 without network access or dependencies. The 2026 boundaries are March 20, June 21, September 23, and December 21; the December 2027 boundary is December 22. Calendar tests check these against USNO data. The far-future calendar is an astronomical estimate; extend/revalidate it before 2101.
At each boundary the server archives the old season and starts a fresh countdown anchored to that midnight. Seasonal points, press history, personal bests, achievements, and milestone progress reset. Accounts, password hashes, login sessions, mailing-list subscriptions, and chat are preserved. Previous press histories remain stored in the season archive; public archives expose only score summaries, not private per-player histories. Old milestone announcements remain visible in chat.
At each boundary the server archives the old season and starts a fresh countdown anchored to that midnight. Seasonal points, press history, personal bests, timing achievements, and milestone progress reset. The four lifetime season awards persist. Accounts, password hashes, login sessions, mailing-list subscriptions, and chat are preserved. Previous press histories remain stored in the season archive; public archives expose only score summaries, not private per-player histories. Old milestone announcements remain visible in chat.
A season finishes when the countdown expires **or** the next seasonal boundary is reached. Pressing cannot extend the timer beyond that boundary. If the timer expires early, pressing and new registrations remain unavailable until the next season; existing players can still log in and chat. The watcher continues running and also catches up boundaries after downtime. A missed season starts at its scheduled midnight, not when the server restarts: without presses its countdown may already be over. Missed seasons have no invented winners.
@@ -90,7 +90,7 @@ The goal is to make waiting social and consequential without rewarding button sp
1. **Optional live presence — implemented.** Show participating players watching the clock and who is viewing Chat. On by default, with a remembered opt-out; ephemeral heartbeats, automatic expiry, and no activity history. See the details below.
2. **Personal bests and rivalries — implemented.** Your score shows closest call, highest-scoring press, leaderboard position, and the player immediately ahead with points needed to catch up. Existing history is credited automatically; no data migration is needed.
3. **Achievements — implemented.** Close call, Full spectrum, and Keeping us alive appear under Your score with unlock dates and progress. Existing press history counts, with no bonus points or press-volume rewards.
4. **Community milestones — implemented.** Eight one-time shared goals post gold announcements in chat. Unlocks persist across restarts, and historical milestones are silently credited on upgrade.
4. **Community milestones — implemented.** Twelve one-time shared goals post gold announcements in chat. Unlocks persist across restarts, and historical milestones are silently credited on upgrade.
5. **Optional zone alerts — implemented.** Choose a scoring zone and opt into a chime, browser notifications, or both in Alerts. Off by default; notifications require explicit permission. Works while the page remains open, not after closing it.
6. **Separate one-life mode — exploratory.** Allow one press per player per round in a separate mode with its own rounds and leaderboard. Never silently change the current game or reset its data.
@@ -104,7 +104,7 @@ Leaderboard positions match the public ordering (points descending, then name al
### Achievements
Your score includes eight private achievements, derived from the game's existing press history:
Your score includes twelve private achievements: eight current-season timing badges and four lifetime awards based on completed seasons. All are credited from existing history:
| Achievement | Requirement |
|-------------|-------------|
@@ -115,6 +115,10 @@ Your score includes eight private achievements, derived from the game's existing
| White knuckle | Press in the white zone. |
| Photo finish | Press with strictly less than ten seconds remaining, and more than zero. |
| Last second | Press with strictly less than one second remaining, and more than zero. |
| Part of the story | Make at least one press in a completed season. |
| Back for another | Participate in two completed seasons. |
| Podium finish | Finish a completed season with competition rank 1, 2, or 3 by points. |
| Season champion | Finish a completed season with the highest score; joint winners qualify. |
| Keeping us alive | Press after a global quiet stretch of at least half the saved game countdown: 12 hours for the standard 24-hour game. Scales with shorter test games. |
Quiet time is measured from the previous press by **any** player, or from game start if there was no previous press. It is not the time since your own last press. The earliest qualifying press determines each unlock date. Progress is based on completed presses, not idle time accumulating while the page is open. These are badges only: they do not change scores, publish chat announcements, or reward repeated resets.
@@ -123,7 +127,11 @@ Historical JSON imports and existing SQLite history are credited automatically.
### Community milestones
There are **eight community milestones**, matching the eight personal achievements. Each posts once to the shared chat, with distinct gold styling:
Lifetime season awards use archived presses and stable player IDs, not display names. They are awarded only after timeout or seasonal rollover, including existing archives. One press (even zero points) qualifies as participation; idle accounts do not. Podium uses competition ranking: rank is one plus the number of participating players with strictly higher points, so tied scores share rank and may expand the podium. Joint top scores all earn champion. Awards retain their first qualifying season's finish timestamp and never change scores. An ongoing leaderboard lead does not unlock a final-result award.
New shared-event definitions already met on upgrade are silently credited individually; unmet goals still announce when reached. Existing milestone unlocks are not reset by adding new definitions.
There are **twelve community milestones**, matching the twelve personal achievements. Each posts once per season to the shared chat, with distinct gold styling:
| Milestone | Community goal |
|-----------|----------------|
@@ -135,6 +143,10 @@ There are **eight community milestones**, matching the eight personal achievemen
| A hundred second chances | Reach 100 presses. |
| A thousand moments | Reach 1,000 presses. |
| Our first photo finish | First successful press with more than zero but less than 10 seconds left. |
| Every shade together | The community visits all six scoring zones this season. |
| A race worth watching | Ten distinct players earn positive points this season. |
| A thousand points together | Reach 1,000 combined seasonal points. |
| A season to remember | Reach 10,000 combined seasonal points. |
Survival milestones use real elapsed time since game start, not scaled countdown durations, and never count time after the game deadline/end. They are checked by the server watcher and normal state requests, even without presses. The photo finish is a single community first, not an announcement for every improved record. No milestone gives bonus points.