Skip to content

Achievements on arcade via tak.arcade (RFC 0014) - #11

Merged
dmccoystephenson merged 1 commit into
mainfrom
feat/arcade-achievements
Oct 3, 2026
Merged

dmccoystephenson merged 1 commit into
mainfrom
feat/arcade-achievements

Conversation

@dmccoystephenson

Copy link
Copy Markdown
Member

Overwinter is given nine achievements on arcade, reported through tak.arcade.unlock (tak PR #21, Stephenson-Software RFC 0014). Since knowledge is the progression here, the achievements follow facts and endings:

id title description hidden unlocked when
counted Counted Count the station's store for yourself no THE_STORE learned
signed-for Signed For Find out what was landed in September no THE_MANIFEST learned
old-stores Old Stores Find what an earlier winter left behind no THE_DEPOT learned
the-answer The Answer to the Count Find out where the missing food went no THE_FIFTH learned
the-whole-winter The Whole Winter Learn everything the station can tell you no every non-ending fact known
remembered They Will Remember That Make a choice someone will hold you to no Scene.remember
twentieth-morning The Twentieth Morning See the winter through to the plane no FIVE_OUT (ending)
in-the-dark In the Dark End the winter before the plane was due no THE_DARK_FLIGHT (ending)
his-choice His Choice Let Aksel stay on the island yes AKSEL_STAYED (ending)

How it works:

  • src/overwinter/achievements.py holds the declarations and the hooks. Game.learn reports a fact only when it is newly learned (endings are facts, learned at the moment the winter ends), and Scene.remember reports the remembered choice.
  • A loaded save is credited once, after load, with what it already implies (achievements.catchUp), so a winter played before this change still counts. It only reads the state.
  • Nothing is written to the save and the schema is unchanged. Every call goes through one helper that swallows exceptions; tak.arcade is itself a no-op off arcade, signed out, and in tests.
  • tak is pinned at 963cd3c (adds tak.arcade; the only change since the previous pin).
  • The ids are declared for overwinter in the gateway's config/play/boards.yaml separately; that snippet was checked with arcade-social's own boards.load.

Verification:

  • tests/test_achievements.py (10 tests) runs the existing scripted routes with tak.arcade.unlock mocked: five on the plane with everything known, Aksel staying, and the dark flight each report the expected ids, and together they cover every declared id. A new game reports nothing; loading a save reports what it earned and leaves the save unchanged. Full suite: 55 passed.
  • In Chromium (Playwright), the built bundle was served as https://overwinter.play.danielstephenson.dev with arcade-social mocked. A day-19 save written by origin/main code loaded from IndexedDB ("Load Slot 1 (Day 19, 14 known)"). Playing on to the plane posted counted, signed-for, old-stores, the-answer, remembered, remembered, twentieth-morning to /v1/achievements/<id>, with X-Play-Client: 1 and the game origin. With /v1/session answering 401, no unlock POST was made. There were no page errors in either run.

drafted by Claude on behalf of Daniel Stephenson

🤖 Generated with Claude Code

Nine achievements, reported with tak.arcade.unlock at the moment they
happen: four discoveries (the count, the manifest, the old depot, the
answer to the count), everything the station can tell you, the first
remembered choice, and one per ending (Aksel staying is hidden).
Game.learn reports a newly learned fact, Scene.remember the remembered
choice, and a loaded save reports what it already earned. Nothing is
written to the save. tak pinned at 963cd3c, which adds tak.arcade.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0116e9DMUhtNXM5bHUdMhDAn
@dmccoystephenson
dmccoystephenson merged commit f2ebf2a into main Oct 3, 2026
3 checks passed
@dmccoystephenson
dmccoystephenson deleted the feat/arcade-achievements branch October 3, 2026 20:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant