Achievements

Achievements authored as assets, unlocked by conditions instead of code, stored where you choose and synced with Steam through a wizard that signs in by QR code.

What the system is for

Almost every game ships achievements, and almost every project builds them the same way: a static list in code, unlock calls scattered across gameplay scripts, and a second copy of every name, description and icon typed by hand into the storefront's partner site. When a name changes in one place and not the other, nobody notices until a player does.

The Achievements module in Serenity turns each achievement into an asset, lets conditions decide when it unlocks, and keeps the local unlock record independent from any storefront. The Achievement Platform Sync wizard then closes the loop with Steam: it brings Steam's copy of your achievements into the project for review and sends yours back out, so you write each achievement once.

The Unity problem

Hand-rolled achievements couple unlock logic to gameplay code. Every new achievement means finding the right script, adding a counter, saving that counter somewhere and remembering to reset it. Progress bars, hidden achievements and point totals each add another piece of bespoke state, and the result is hard to test and harder to hand to a designer.

Storefronts add a second source of truth. Names, descriptions, hidden flags, icons and every translation live in Steamworks as well as in your project, and Steam offers no friendly way to author them in bulk. Keeping the two in step by hand is slow, easy to get wrong, and gets worse with every language you add.

How Serenity approaches it

Serenity models each achievement as its own asset: the text the player reads, the points it awards, whether it is hidden, an optional progress target and the storefront identifiers it maps to. The Achievements Studio lists them all in one window, and the Create Achievements wizard stands the module up with settings, a backend and an achievements view that opens like any other menu. An optional condition tree on each achievement unlocks it with no code at all, from signals, score thresholds, global progress, durations and accumulated amounts, combined with And, Or, Not and Sequence. An achievement with no tree unlocks from a single code call or from a no-code signal.

Achievement Platform Sync pulls a storefront's copy of your achievements into the project through a six-step wizard — Platform, Connect, Scope, Review, Apply and Done. In Review you accept or skip every field and every language, nothing is written until you confirm, and a backup of the current manifest can be taken first. For Steam you sign in by scanning a QR code with the Steam Mobile App, and a pull brings names and descriptions into your localization tables, one entry per language you accept, together with the icons. A push sends yours back out, and every pushed field lands unpublished, so publishing stays a deliberate step on the Steam partner site. Copilot mode offers a one-field-at-a-time checklist for Steam's own editor whenever a push cannot complete.

How it fits into Serenity

Achievements is built around a local store that is always present: every unlock is written to a persistence backend keyed by player and achievement, so a game that ships on no storefront still has working achievements. The backend is the same pluggable structured store the Leaderboard and Game Saves use — device storage by default, or local files, SQLite, HTTP, Postgres, MySQL or MongoDB — and choosing a different one is a configuration change. Unlock points are mirrored into Score, and an unlock is never held up by a screenshot capture or a storefront call.

Storefronts are sync targets, not the source of truth. A platform gateway pushes unlocks outward and reads the account back to reconcile, and a failed query is never mistaken for an empty account. The Steam gateway ships as real code, and the Xbox, Epic and PlayStation definitions ship as templates for licensed SDKs. Unlocking and showing achievements work through the Event Dispatcher, so a SignalEmitterComponent can award an achievement or open the achievements view with no game code.

Practical workflow

  1. Run Create Achievements to set up the module: settings, a backend and an achievements view.
  2. Open the Achievements Studio and author each achievement — text, points, hidden flag, progress target and, where you want it, an unlock condition.
  3. Unlock from code through the achievement service, or dispatch the no-code unlock signal from a SignalEmitterComponent.
  4. Show the achievements view from a menu, and let unlock toasts and the optional unlock screenshot appear automatically.
  5. Open Tools ▸ Serenity ▸ Browse ▸ Achievements ▸ Achievement Platform Sync and sign in to Steam by scanning the QR code with the Steam Mobile App.
  6. Pull to review Steam's copy with its translations and icons, apply what you accept, and push yours back out; publish on the Steam partner site when you are ready.

What you get

  • One asset per achievement, with text, points, hidden flag, progress target and storefront identifiers
  • Achievements Studio for authoring and reviewing every achievement in a single window
  • Create Achievements wizard for the module settings, a backend and an achievements view
  • Unlock conditions authored without code — signals, score, global progress, durations and accumulated amounts, combined with And, Or, Not and Sequence
  • Local unlock records on a pluggable backend, independent from any storefront, with points mirrored into Score
  • Achievement Platform Sync wizard that pulls and pushes definitions with a review step, an optional backup and a Snapshot file option for rehearsing
  • Steam sign-in by QR code, with translations and icons pulled in and Copilot mode as a step-by-step fallback
  • No-code unlock and show-view signals, plus unlock toasts and optional unlock screenshots

When to use this

  • Games that ship on Steam and want to author achievements once instead of typing them twice.
  • Teams where designers define achievements and unlock rules without touching gameplay code.
  • Projects that need progress bars, hidden achievements and point totals without bespoke state for each.
  • Games that want local achievements today and a storefront or a server backend later, without changing game code.

Related systems

Use Serenity when you want achievements that are authored as assets, unlocked by rules instead of scattered code, and kept in step with Steam from a single wizard.

Back to the home page