Skip to content

Implement data-driven per-character achievements #31

Description

@zoeyrose

Important

This issue is implemented in the fresh MIT-licensed Go server under the replacement program. Its gameplay and content-design decisions remain authoritative. C, CPython, classic packet, file-path, and enum details in the preserved specification are historical evidence only; do not copy, translate, or structurally port GPL implementation code.

Replacement implementation contract

Keep this as the full achievements catalog/migration epic. Implement the non-failable Go engine and a small first-slice catalog as an M3 child. CEL is permitted only for checked pure compound predicates.

The server remains authoritative, consumes versioned compiled content, and exposes bounded generated Game Protocol 1 messages. Pure rules may use a specifically approved typed CEL environment. Starlark is not part of this issue unless the separate residual-scripting decision explicitly approves it.

Required verification

  • Preserve every observable rule, balance decision, disclosure boundary, and anti-exploit invariant from the specification below.
  • Add deterministic Go unit/property tests and wrapper-managed scenario coverage at the appropriate integration boundary.
  • Add bounded malformed-input and persistence-failure cases where this feature accepts content, network, or stored data.
  • Add Go/Rust protocol conformance fixtures for every new cross-process field; the client must not reconstruct authoritative rules from prose.
  • Demonstrate that implementation and tests contain no copied GPL source/test material and execute no runtime Python.
Preserved product/design specification and historical implementation notes

Summary

Implement a data-driven, server-authoritative achievement system for the legacy game, beginning with a curated per-character catalog tied to Atrinik's existing quests, regions, levels, skills, monsters, books, traps, healing, and party play.

Achievements should recognize meaningful milestones without exposing the underlying raw metrics catalog to players. The server remains authoritative for criteria, unlocks, timestamps, and rewards; clients or player commands receive only curated achievement definitions and allowed progress.

Dependencies

This issue should start after #33's metric registry and persistence APIs are stable enough to consume. Add a backlink from #33 to this issue so the prerequisite/follow-up relationship is visible from both directions.

Scope decisions

  • Day-one achievements are per-character. Quest progress, skill progression, exploration, combat identity, and cooperative milestones belong to the character that performed them.
  • Design the definition schema with an explicit scope, but do not launch account-wide achievements merely because Implement QUIC transport, sessions, and authentication #33 stores account metrics.
  • Account-wide achievements can be proposed later for deliberate cross-character goals such as playing multiple races or account-wide cosmetic collections. Never combine partial character progress into a character achievement.
  • Raw /metrics data remains operator-only as specified by Implement QUIC transport, sessions, and authentication #33. Players may see achievement names, descriptions, unlocked state, and only the progress explicitly declared visible by an achievement definition.
  • Achievements are permanent milestones, not daily tasks, repeatable quests, seasonal challenges, or leaderboards.
  • The initial catalog should avoid PvP achievements until anti-farming and eligible-opponent semantics are designed.

Non-failable invariant

Every achievement must be monotonic, non-missable, and non-failable:

  • Progress may only increase or become complete; it never decreases or enters a failed state.
  • No choice, death, quest branch, discarded item, elapsed session, content order, or earlier action may permanently prevent a character from unlocking an achievement later.
  • Criteria must be cumulative thresholds, durable set membership, current/highest progression snapshots, or positive events that remain repeatably obtainable.
  • Do not add criteria phrased as “before,” “without,” “in one session,” “in the correct order,” “never,” “every party member survives,” or other limited-window/perfect-run conditions.
  • An unsuccessful attempt simply does nothing. It must not record failure, consume the opportunity, hide the achievement forever, or invalidate accumulated progress.
  • Frozen collection achievements may contain only entries that remain repeatably reachable/obtainable for every eligible character. Remove ineligible entries from the authored collection before release rather than creating exceptions at runtime.
  • Quest achievements may reference only quests that cannot be permanently failed. Branch-specific outcomes and optional objectives are ineligible unless every character can retry them indefinitely.
  • Definition review and tests must reject or flag criteria whose unlock opportunity can be consumed permanently.

Secret means “the criterion is initially undisclosed,” not “the player gets only one chance.”

Authored definitions

Keep the catalog in a version-controlled, data-driven authored registry rather than hardcoding every achievement in C or scattering definitions through map scripts. Select and document the owning source path, collection step, and generated/runtime boundary. If definitions are collected into server/lib, edit the authored input and regenerate it through tools/collect.py; do not hand-edit collected output.

Each definition should support at least:

  • Stable achievement ID, such as story.castaway_no_more.
  • Scope (character initially; account reserved for later deliberate use).
  • Category and display order.
  • Player-facing title and description.
  • Hidden/spoiler status.
  • Whether numeric/set progress is visible before unlock.
  • Criteria expressed through registered metric IDs, stable subject IDs, and/or explicit achievement events.
  • Threshold or required set.
  • Optional prerequisite achievement IDs for tiered or story-dependent achievements.
  • Points/badge value if an achievement score is desired.
  • Optional cosmetic/title reward ID.
  • Optional icon/face; the first version should not require new artwork.

Definitions must reference stable internal identifiers:

  • Quest UIDs, not quest display names. A definition may reference a fully qualified nested part UID such as lost_memories::the_journey when the achievement intentionally recognizes a mandatory, branch-neutral story resolution rather than every optional part.
  • Region IDs, not long names.
  • Skill IDs, not localized skill labels or enum numbers serialized directly.
  • Monster archetype/family IDs or explicit boss tags, not object::name.
  • Stable book/content IDs for unique-book collections.
  • Explicit stable lore-topic/landmark IDs for dialogue and world-lore discoveries. Do not match rendered dialogue text, NPC display names, map paths, or generic dialog names such as hello; add authored tags where the content has no suitable stable identifier.

Add a validation tool/test that rejects duplicate achievement IDs, invalid metric/quest/region/skill/boss references, impossible thresholds, missing prerequisites, dependency cycles, invalid scopes, and malformed rewards. Collection achievements must list or reference a frozen named set so later content additions do not silently change an already published requirement.

Runtime model

Evaluation

  • Provide one central achievement service/API; gameplay callers emit authoritative events or update Implement QUIC transport, sessions, and authentication #33 metrics rather than directly granting achievement IDs.
  • Index definitions by the metrics/events they consume so a movement step or damage update does not scan the entire catalog.
  • Evaluate threshold and set criteria with >=/set containment so skipped values and batched updates still unlock correctly.
  • Make unlocking idempotent. Repeating an event, reloading a save, or reconciling at login must never duplicate the unlock, reward, sound, or announcement.
  • Evaluate newly added definitions and changed thresholds against durable metrics during login/reconciliation, without replaying historical events.
  • Achievement criteria should normally be derived from monotonic Implement QUIC transport, sessions, and authentication #33 metrics and durable sets. Do not add per-attempt failure state or perfect-run encounter tracking.

Persisted character state

Store only achievement-owned facts that cannot be derived safely from the metric store:

  • Unlocked achievement ID.
  • Unlock timestamp.
  • Whether the player has been notified, if notification delivery is persisted.
  • Reward grant/claim state when rewards exist.
  • Minimal bounded temporary or criterion state for achievements that cannot be represented by Implement QUIC transport, sessions, and authentication #33.

Do not represent achievements as generic objects inside the quest container or overload unrelated object fields. Save definitions remain authored server data; character saves retain stable IDs and state. Handle unknown/removed IDs safely and document whether they are retained as historical tombstones or omitted from presentation.

Save an unlock and any reward in the same logical atomic checkpoint. A crash must not retain a reward while losing the corresponding unlock, or grant the reward again after reload.

Authoritative event hooks

At minimum, integrate with:

  • Explicit successful quest completion in QuestManager, using the quest UID. Do not infer success solely from a generic terminal/completed flag if failed quests share that representation.
  • Explicit successful completion of qualified quest-part UIDs for the small number of branch-neutral story achievements that need them. A failed sibling branch must not suppress an achievement tied to the shared mandatory resolution.
  • Character and skill level transitions.
  • First entry into stable regions/landmarks.
  • Monster death credit, summon ownership, monster family, and explicit boss tags.
  • Successful book reading/unique book discovery.
  • Successful activation of explicitly tagged lore topics and examination of tagged lore objects; record discovery once regardless of which response path reached the topic.
  • Trap discovery/disarm results.
  • Effective healing of another eligible player/friendly creature.
  • Party membership and tagged cooperative encounter completion.

For ordinary kills, use the same documented owner attribution as progression. For named/group bosses, credit all eligible participating party members rather than only the final hitter. Define participation, range/map, disconnect, death, summon, and anti-leech semantics before rewards depend on them.

Player presentation

Start with a server-rendered player command that does not expose the raw metrics registry:

/achievements [category|completed|incomplete]
  • Render a book/text view using existing infrastructure where practical, avoiding a new wire protocol for the first version.
  • Show title, description, category, completion state, unlock timestamp, and declared progress such as 47/100.
  • Do not show unrelated raw metric values, account metrics, internal-only metrics, or operator diagnostics.
  • Hidden achievements appear as an undisclosed entry or are omitted until unlocked, according to their definition.
  • Send a concise private unlock notification with a sound and achievement title.
  • Do not broadcast every unlock server-wide. A later opt-in party/guild announcement policy can be designed separately.
  • Other players cannot inspect a character's achievements initially.
  • Keep presentation ordering deterministic and paginate/category-filter the list.

A graphical client browser, public profile, protocol synchronization, icon art, and account achievement view can be follow-up work after the server model is proven.

Day-one achievement catalog

Names are proposals and may be refined during content review. Stable IDs and exact criteria must be fixed before release.

Story and quests

ID Proposed title Criterion
story.castaway_no_more Castaway No More Successfully complete escaping_deserted_island.
story.journey_begins The Journey Begins Complete the mandatory lost_memories::the_journey part and sail onward with Sam Goodberry. The optional gear, sorcery, and archery outcomes are irrelevant.
story.eyes_on_the_sky Eyes on the Sky Successfully complete construction_of_telescope, helping Albar connect the Great Blue Crystal falls and build the Morliana telescope.
story.scarlet_and_mythical Scarlet and Mythical Successfully complete crazymix_alchemical_reagents by finding the Scarlet Pimpernel for Crimdon Crazymix.
story.fort_sether_remedy A Remedy for Fort Sether Successfully complete fort_sether_illness.
story.fairy_found Found by the Lake Successfully complete frevia_tomboyish_fairy.
story.old_scores_settled Old Scores Settled Successfully complete galann_revenge, settling Galann Strongfist's score with Torathog.
story.rhun_alchemy King Rhun's Recipe Successfully complete gandyld_mana_crystal, using the old enhancement pools and alchemical concoctions to perfect Gandyld's crystal.
story.between_the_lines Found Between the Lines Successfully complete lairwenn_notes in Brynknot Library.
story.guiding_light A Guiding Light Successfully complete melanye_lost_stick, recovering Melanye's enchanted walking stick.
story.rescuer_of_lynren Rescuer of Lynren Successfully complete rescuing_lynren.
story.beyond_llwyfens_portal Beyond Llwyfen's Portal Successfully complete portal_of_llwyfen. Hidden until its story is discovered if necessary.
story.mushroom_menace Mushroom Menace Successfully complete mushroom_demon.
story.charob_courier Charob Courier Successfully complete one instance of shipment_of_charob_beer, delivering Steve Bruck's shipment to the Asterian Arms Tavern.
story.letters_through_dark Letters Through the Dark Successfully complete two_lovers_doomed, carrying Tortwald and Rienn Howell's letters between the Underground City and Fort Ghzal.
story.quests_5 Helping Hand Successfully complete five distinct quest UIDs.
story.quests_10 Seasoned Adventurer Successfully complete ten distinct quest UIDs.
story.quests_15 A World of Stories Successfully complete all 15 frozen, eligible launch quest UIDs, with lost_memories::the_journey serving as the branch-neutral success marker for that story.

Only explicitly eligible, permanently completable quest UIDs count toward quest achievements. The current authored quest catalog has 15 UIDs. Fourteen have straightforward completion candidates; lost_memories deliberately fails unchosen optional preparation paths and one side of the ant-resolution choice. Never award achievements for those optional/choice-specific outcomes. Its mandatory the_presence and the_journey parts are branch-neutral candidates because every route converges on them. Validate restart, abandon, and terminal-state behavior for every listed quest in the runtime before freezing the launch set; remove any quest whose successful route can be permanently lost.

Lore-linked collections from existing content

These candidates deliberately combine existing quest UIDs, artifact-book IDs, region IDs, and newly authored lore-topic/landmark tags. Criteria are cumulative and order-independent: reading a journal before visiting its location must work exactly like visiting first and reading later.

ID Proposed title Criterion
lore.blue_crystal_trail Blue Streaks in the Sky Complete construction_of_telescope, complete lost_memories::the_presence, read book_morliana_bard3 (History of the Founding of Morliana), and discover the frozen crystal-lore topics for Achetran and Morliana's researchers. This follows the Great Blue Crystal from Incuna's presence, through the Brynknot crater, to Morliana.
lore.portal_chronicler No Way Back Read book_journal_garland and book_diary_dunsor, then complete portal_of_llwyfen. Garland records Brynknot's rumors; Dunsor records the doomed expedition and the amulet of Llwyfen from the other side.
lore.speak_friend Speak Friend and Enter Read book_notes_lothost and discover the repeatably accessible entrance to strakewood_abandoned_mine. Do not require reading the book before opening the entrance.
lore.hierro_two_stories Every Story Has Two Sides Read book_morliana_bard1 (Hierro's Story) and book_morliana_bard2 (About Hierro), and discover Olbar's tagged Hierro-rumor topic. Do not require killing Hierro: his per-player spawn is removed after death and needs separate group-credit/non-missability review.
lore.by_royal_edict By Royal Edict Read edict_asteria_temples and visit a frozen set of the twelve repeatably accessible deity landmarks represented by the existing temple interfaces: Dalosha, Drolaxi, Elathiel, Grumthar, Grunhilde, Jotarl, Rashindel, Rogroth, Shaligar, Terria, Tylowyn, and Zechna. Visiting is sufficient; never require applying an altar or changing deity.
lore.orthrack_complete A Tale of Kings, Queens and Heroes Read all 27 stable artifacts book_orthrack_1 through book_orthrack_27. Freeze the set and audit that every volume's library placement remains repeatably accessible.
lore.centennial_shelf Centennial Bibliophile Read the 18 main Eastern Project volumes from book_touhou_01 through book_touhou_12_8, including the numbered interludes. Exclude the catalog and Eastern Fan Project from this frozen set.
lore.three_libraries Three Libraries, No Late Fees Visit the tagged Brynknot Library, Asterian Royal Library, and Centennial Witch Academy library landmarks and read at least one eligible stable-ID book in each.
lore.kobold_connections Kobold Connections Complete the frozen branch-neutral set construction_of_telescope (Morg'eean), fort_sether_illness (Brownrott), portal_of_llwyfen (Nyhelobo and Talthor Redeye), and lost_memories::the_kobolds.
lore.old_allies Old Allies Reach lyondale_archipelago_wizard and discover Teldach's tagged account of the Thelras joining the Thraal army against Zechna. The achievement records the topic, not a particular response sequence.
lore.goodberry_crew Goodberry's Crew Complete escaping_deserted_island, complete lost_memories::the_journey, and later take either repeatable Sam Goodberry voyage between Incuna and Brynknot.
exploration.war_below_strakewood The War Below Strakewood Visit the frozen region set strakewood_abandoned_mine, old_outpost, zechna_temple, and underground_city, following the surviving traces of King Rhun's forces and the wars surrounding Zechna.
exploration.rockforge_depths Stone, Steel, and Sky Visit rockforge, rockforge_palace, rockforge2, and rockforge_mines, including the underground city farm beneath its opening to the sky.
exploration.island_hopper Island Hopper Visit a frozen set of repeatably reachable island regions such as strakewood_island, incuna, lyondale_archipelago, eld_woods_island, promethia_island, and dragons_island. Exclude the one-way Deserted Island tutorial unless a permanent return route is added.

The lore-topic IDs above do not exist as a complete registry today. Add explicit authored IDs only for the selected topics, emit a single discovery event when the player reaches the information, and validate them like quest/book/region references. Do not turn every dialog response into a metric or require exhaustive dialogue trees; some responses are alternatives and implementation text is not a durable content contract.

Exploration

ID Proposed title Criterion
exploration.regions_5 Finding Your Bearings Visit five distinct eligible regions.
exploration.regions_10 Wayfarer Visit ten distinct eligible regions.
exploration.regions_20 Worldly Traveller Visit twenty distinct eligible regions.
exploration.strakewood_towns Strakewood Tour Visit brynknot, greyton, aris, asteria, fort_sether, rockforge, and centennial.
exploration.deep_delver Deep Delver Visit strakewood_abandoned_mine and underground_city.
exploration.zechna_depths Into the Grave Visit the four Temple of Zechna depth regions: zechna_temple, zechna_temple_b, zechna_temple_c, and zechna_temple_d. Hidden until the temple is discovered.
exploration.dragons_island Here Be Dragons Reach dragons_island. Hidden until unlocked.

Exclude administrative, creation/testing, jail-only, transient, and implementation-only regions from generic region-count achievements through explicit eligibility metadata.

Character and skill progression

ID Proposed title Criterion
progress.level_10 Getting Started Reach character level 10.
progress.level_25 Adventurer Reach character level 25.
progress.level_50 Veteran Reach character level 50.
progress.level_75 Hero Reach character level 75.
progress.level_100 Living Legend Reach character level 100.
progress.level_115 At the Summit Reach the current maximum character level, 115.
progress.skill_25 Apprentice No More Reach level 25 in any eligible skill.
progress.skill_50 Specialist Reach level 50 in any eligible skill.
progress.skill_100 Master of the Craft Reach level 100 in any eligible skill.
progress.skills_10 Versatile Learn ten distinct eligible skills.

Use a definition/reference for “current maximum level” if this value can change, while preserving the meaning of already unlocked achievements. Exclude internal/system skill objects from learned-skill collections.

Combat and bosses

ID Proposed title Criterion
combat.first_kill First Victory Receive valid credit for the first monster kill.
combat.kills_100 Monster Hunter Defeat 100 monsters.
combat.kills_1000 Monster Slayer Defeat 1,000 monsters.
combat.kills_10000 Scourge of Monsters Defeat 10,000 monsters.
combat.first_dragon Dragon Slayer Defeat an eligible monster tagged with the dragon family.
combat.dragon_families Dragon Scholar Defeat one member of each frozen eligible launch dragon family.
combat.zechna Defy the Grave Receive eligible encounter credit for defeating the named Zechna boss. Hidden until unlocked. Add an explicit stable boss tag rather than matching the display name.

Generic summoned/training/test monsters should be excluded where appropriate. Do not award boss achievements from administrative spawns unless the spawn is explicitly eligible.

Lore, traps, support, and cooperation

ID Proposed title Criterion
lore.books_10 Reader Read ten distinct eligible books.
lore.books_25 Bookworm Read 25 distinct eligible books.
lore.books_50 Scholar Read 50 distinct eligible books.
traps.first_disarm Careful Now Successfully disarm the first trap.
traps.disarm_25 Trapper Successfully disarm 25 eligible traps.
traps.disarm_100 Safe Passage Successfully disarm 100 eligible traps.
craft.inscribe_first Putting Quill to Page Successfully inscribe the first book.
craft.inscribe_25 Scribe Successfully inscribe 25 books.
support.heal_other_10000 Helping Hands Perform 10,000 points of effective healing on eligible friendly targets other than self.
support.heal_other_100000 Lifesaver Perform 100,000 points of effective healing on eligible friendly targets other than self.
social.party_boss Fellowship Complete an eligible tagged boss encounter as a participating party member.

Book uniqueness must use stable IDs. Healing thresholds count effective healing rather than overhealing and must exclude controllable self-owned targets if they permit trivial farming. Trap, inscription, and party criteria need success events, not mere command attempts.

Additional non-failable long-term achievements

These are intentionally grindy, visible milestones. They should show progress and generally sit beyond the day-one introductory tiers. Every content collection below must be frozen and limited to repeatably obtainable/accessible eligible entries.

Combat longevity

ID Proposed title Criterion
combat.kills_50000 Relentless Hunter Defeat 50,000 eligible monsters.
combat.kills_100000 Scourge of Monsters Defeat 100,000 eligible monsters.
combat.dragons_100 Dragonbane Defeat 100 eligible dragons.
combat.demons_1000 Demon's Bane Defeat 1,000 eligible demons.
combat.archetypes_100 Know Your Enemy Defeat at least one monster from 100 distinct eligible archetype/family IDs.
combat.bosses_100 Boss Hunter Receive valid encounter credit for 100 repeatably available tagged boss defeats.

Training monsters, administrative spawns, self-created farming targets, and unbounded summons do not count. Content eligibility is explicit rather than inferred from display names.

Exploration longevity

ID Proposed title Criterion
exploration.steps_100000 Well Travelled Take 100,000 successful voluntary steps.
exploration.steps_1000000 Road-Worn Take 1,000,000 successful voluntary steps.
exploration.steps_10000000 There and Back Again Take 10,000,000 successful voluntary steps.
exploration.launch_regions Cartographer Visit every repeatably accessible region in a frozen eligible launch set.
exploration.launch_maps No Stone Unturned Visit every repeatably accessible authored map in a frozen eligible launch set.
exploration.transitions_10000 Frequent Traveller Perform 10,000 legitimate map transitions.
exploration.savebeds_10 Home Away from Home Activate save beds/checkpoints in ten distinct eligible regions.

Blocked movement, forced movement, knockback, administrative teleportation, and repeatedly crossing a synthetic/test exit must not inflate these totals. Map and region collections must exclude one-time, unreachable, administrative, creation/testing, jail-only, and implementation-only locations.

Progression and quests

ID Proposed title Criterion
progress.skills_5_at_100 Master of Many Reach level 100 in five eligible skills, using durable highest-level values.
progress.skill_xp_1000000000 Lifetime of Learning Gain one billion eligible skill experience after the metrics epoch.
quests.repeatable_100 Quest Eternal Complete 100 eligible repeatable quest instances.
quests.repeatable_1000 Always Something to Do Complete 1,000 eligible repeatable quest instances.
quests.charob_25 Reliable Supplier Complete 25 instances of shipment_of_charob_beer.
quests.charob_250 Charob's Finest Complete 250 instances of shipment_of_charob_beer.

Only repeatable quests whose completion opportunity cannot be exhausted count toward the repeatable totals. If the content catalog is too small, retain the generic totals as future definitions rather than making one trivial delivery the optimal generic grind. The Charob milestones are intentionally quest-specific and can exist independently because the authored quest explicitly repeats after its cooldown.

Lore, traps, and crafting

ID Proposed title Criterion
lore.launch_books Bibliophile Read every repeatably obtainable book in a frozen eligible launch collection.
lore.books_250 Walking Library Read 250 distinct eligible books.
craft.inscribe_1000 Master Scribe Successfully inscribe 1,000 books.
traps.disarm_1000 Trap Whisperer Successfully disarm 1,000 eligible traps.
craft.successes_1000 Artisan Complete 1,000 eligible successful crafting/construction actions.
craft.recipe_families Master Artisan Successfully craft from every repeatably available recipe family in a frozen eligible set.

Random availability, one-time recipes, and permanently choice-locked recipes cannot belong to required collections.

Support and cooperation

ID Proposed title Criterion
support.heal_other_1000000 Guardian Angel Perform 1,000,000 points of effective healing on eligible targets other than self.
support.heal_other_10000000 Miracle Worker Perform 10,000,000 points of effective healing on eligible targets other than self.
social.party_encounters_500 Comrade in Arms Complete 500 repeatably available eligible encounters while participating in a party.
social.party_time_500h Seasoned Company Accumulate 500 hours of active play while in a party.

These are cumulative. They must not require a perfect party run, uninterrupted session, surviving party roster, or other attempt-level condition.

Optional novelty grinds

These can be zero-point feats excluded from any “complete all achievements” total because they intentionally reward silly persistence:

ID Proposed title Criterion
novelty.food_10000 Bottomless Stomach Consume 10,000 eligible food items.
novelty.potions_5000 Potion Problem Use 5,000 eligible potions.
novelty.corpses_10000 Grave Robber Search 10,000 eligible unique corpses.
novelty.items_1000000 It Was Probably Valuable Pick up 1,000,000 eligible item units.

Additional non-failable secret achievements

Secret achievements use hidden descriptions/progress until unlock, but every criterion remains repeatably obtainable and has no failure state. If content review finds that a prerequisite can be lost permanently, omit that achievement or make the underlying opportunity repeatable before shipping it.

ID Proposed title Criterion
secret.bookception Bookception Read a book personally inscribed by the same character. The character can always inscribe another qualifying book and try later.
secret.pilgrim Pilgrim Visit every repeatably accessible altar/deity landmark in a frozen eligible set. Visiting is sufficient; deity choice or worship state must not lock progress.
secret.hidden_way Now You See It Discover any explicitly tagged, repeatably discoverable secret passage or location.
secret.master_of_secrets Master of Secrets Discover a frozen collection of repeatably accessible tagged secret locations.
secret.deepest_zechna The Bottom of the World Reach the deepest repeatably accessible Temple of Zechna region.
secret.full_circle Full Circle At level 100 or higher, revisit an explicitly tagged early-game landmark that remains permanently accessible.
secret.curiosity_rewarded Curiosity Rewarded Examine every repeatably accessible tagged lore object in a frozen eligible set.
secret.region_maps The Bigger Picture Acquire/discover every repeatably obtainable region-map ID in a frozen eligible set. Progress records discovery permanently, so later item loss cannot undo it.
secret.coin_collection All That Glitters Possess at least one coin of every repeatably obtainable denomination at the same time. No earlier spending choice can prevent another attempt.
secret.balanced_diet Balanced Diet Cumulatively consume at least one eligible item from every repeatably obtainable food category.
secret.apothecary_notes Apothecary's Notes Cumulatively use at least one eligible potion from every repeatably obtainable effect category.
secret.tools_of_trade Tools of the Trade Successfully use at least one skill from every major skill family available to that character. Eligibility must adapt to the character so an unavailable skill cannot make it impossible.
secret.collectors_instinct Collector's Instinct Cumulatively pick up at least one eligible item from every major repeatably obtainable item category.
secret.banking_on_secrets Banking on Secrets Discover the repeatably accessible illusionary wall hiding Orlney Silvertongue and speak with the president of Banks Inc. Use a tagged landmark/NPC encounter, not the wall or NPC display name.
secret.no_captain_required No Captain Required Travel aboard Morg'eean's enchanted self-steering ship on both repeatable routes between Asteria and Brynknot.
secret.pipe_dream A Dragon with a Smoking Pipe Discover Daril's tagged rumor and later acquire the stable artifact for Scursaur's legendary smoking pipe, in either order. Ship only after auditing that both Scursaur and the pipe remain repeatably obtainable for every character.
secret.bottomless_volcano How Deep Does It Go? Reach a repeatably accessible tagged deep landmark beneath Promethia's volcano, echoing Ixovolth's claim that it has an almost infinite depth.
secret.hierro_is_real Probably Just a Myth Discover Olbar's Hierro rumor and enter Hierro's Lair. Ship only if the Season of the Blizzard recurs predictably and entry cannot be permanently lost; defeating Hierro is not required.
secret.know_your_roots Know Your Roots Read the stable book_history_crossfire artifact.
secret.in_the_beginning In the Beginning Read the stable book_binary_bible artifact.
secret.take_it_easy Take It Easy Read the stable book_yukkuri (Eastern Fan Project: Take it Easy) artifact.

Do not add secret achievements based on arriving before a quest, reading something in a particular order, completing a boss without damage/consumables/death, ending combat at a precise HP value, keeping a unique item forever, preserving every party member, or doing anything within one session. Those conditions create failed attempts, missable windows, or permanently consumed opportunities.

Metrics deliberately stored but not achievements at launch

#33 may persist steps taken, AFK toggles/time, spells cast, arrows fired, items picked up/dropped, consumables used, emotes, deaths, damage totals, and similar facts. Do not create achievements merely because a counter exists.

In particular, omit launch achievements that encourage:

  • Walking in circles.
  • Remaining logged in or AFK.
  • Spamming harmless spells, emotes, arrows, item drops, or consumables.
  • Repeatedly dying.
  • Trading kills between players.
  • Inflating currency/item transfer totals without creating real value.

These facts can support balancing, operator diagnostics, or carefully designed future criteria without being player-facing raw statistics.

Retroactive unlock policy

  • On first login after launch, evaluate facts that are authoritative in existing character state: current character/skill levels and successfully completed quest UIDs where success can be distinguished.
  • Use Implement QUIC transport, sessions, and authentication #33's durable sets/counters for achievements added after the metrics epoch.
  • Do not fabricate historical kills, regions visited, books read, healing, traps, or other facts that were not durably recorded.
  • Display or document the metrics/achievement epoch so newly introduced lifetime-looking counters are not misleading.
  • If a one-time legacy import is ever performed, achievement evaluation happens from the validated imported Implement QUIC transport, sessions, and authentication #33 metrics; the achievement subsystem must not read Shelve files itself.

Rewards

Keep day-one rewards low-risk:

  • Achievement points/badges and the permanent unlock record.
  • Private notification and sound.
  • Optional cosmetic titles only if there is one stable title ownership/equip path.

Do not grant combat power, permanent stats, currency, or valuable items in the first implementation. Gameplay rewards introduce balance, duplication, inventory-capacity, rollback, and atomicity concerns that should be designed separately.

Testing and validation

  • Definition parsing and validation, including every launch ID and content reference.
  • Duplicate IDs, invalid references, dependency cycles, malformed criteria, invalid scopes, and collection membership.
  • Non-failable policy checks: monotonic progress, no persistent failure state, no permanently consumed unlock window, and repeatable reachability/obtainability for every required collection entry.
  • Threshold crossing, batched increments, set completion, and compound prerequisites.
  • Idempotent unlock/reward/notification across repeated events and save/reload.
  • Character scope isolation: progress on one account character never completes another character's achievement.
  • Login reconciliation and retroactive policy, including no invented pre-epoch progress.
  • Successful completion of eligible non-failable quests versus failed/abandoned/terminal quests; failable quest UIDs must be rejected from definitions and required collections.
  • Stable region entry and excluded/system regions.
  • Direct, summon, party, boss, disconnect, death, and anti-leech kill credit.
  • Effective healing and exclusion of self-owned/trivial farming targets.
  • Hidden and visible-progress presentation.
  • /achievements access and filtering without exposing raw character/account metrics.
  • Save failure behavior proving unlock and reward consistency.
  • Collection/regeneration validation if definitions are authored under arch/ or maps/.
  • Focused server build/tests and content audit for every referenced quest, region, monster, skill, and book identifier.

Documentation

  • Document definition ownership, collection, runtime loading, event flow, character persistence, and metric dependency in docs/ARCHITECTURE.md or a linked design document.
  • Document how content authors add and validate an achievement without editing C.
  • Document exact group/boss, quest-success, eligibility, hidden-progress, retroactive, and reward semantics.
  • Keep achievement content references aligned with ADS-1 quest UIDs and the region/content registries.

Acceptance criteria

  • Implement QUIC transport, sessions, and authentication #33's durable metric registry and persistence prerequisites are complete and used as the sole progress source.
  • A validated authored registry defines achievements with stable IDs, explicit scopes, criteria, visibility, and optional rewards.
  • Every achievement is monotonic, non-missable, and non-failable; no player action or unsuccessful attempt can permanently prevent a later unlock.
  • Day-one achievements are per-character; progress cannot leak or aggregate across account characters.
  • Server-side evaluation is indexed, authoritative, idempotent, and uses stable quest/region/skill/monster/book IDs.
  • Unlocks and reward state persist atomically with the character.
  • Explicit successful quest completion and eligible group/boss credit are correctly distinguished.
  • The initial catalog covers meaningful story, exploration, progression, combat, lore, trap, support, and cooperative milestones.
  • Additional visible grind tiers and hidden-but-repeatably-obtainable secret achievements are defined without perfect-run, ordering, session, survival, or one-chance conditions.
  • /achievements exposes only curated achievement state/progress, never raw metrics or account/operator data.
  • Hidden achievements, retroactive evaluation, metric epochs, and removed definitions have documented behavior.
  • Day-one rewards are cosmetic/non-power or limited to points and notifications.
  • Definitions, persistence, evaluation, presentation, and exploit-sensitive attribution have focused automated tests.
  • Architecture and content-author documentation describe the complete workflow.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Fields

    No fields configured for Initiative.

    Projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions