You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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
Blocked by Implement QUIC transport, sessions, and authentication #33. Durable per-character metrics, stable unique-ID collections, atomic persistence, and their event semantics are prerequisite infrastructure. Achievement progress must not depend on the removed UDP/Shelve statistics path.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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
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
scope, but do not launch account-wide achievements merely because Implement QUIC transport, sessions, and authentication #33 stores account metrics./metricsdata 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.Non-failable invariant
Every achievement must be monotonic, non-missable, and non-failable:
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 throughtools/collect.py; do not hand-edit collected output.Each definition should support at least:
story.castaway_no_more.characterinitially;accountreserved for later deliberate use).Definitions must reference stable internal identifiers:
lost_memories::the_journeywhen the achievement intentionally recognizes a mandatory, branch-neutral story resolution rather than every optional part.object::name.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
>=/set containment so skipped values and batched updates still unlock correctly.Persisted character state
Store only achievement-owned facts that cannot be derived safely from the metric store:
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:
QuestManager, using the quest UID. Do not infer success solely from a generic terminal/completed flag if failed quests share that representation.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:
47/100.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
story.castaway_no_moreescaping_deserted_island.story.journey_beginslost_memories::the_journeypart and sail onward with Sam Goodberry. The optionalgear,sorcery, andarcheryoutcomes are irrelevant.story.eyes_on_the_skyconstruction_of_telescope, helping Albar connect the Great Blue Crystal falls and build the Morliana telescope.story.scarlet_and_mythicalcrazymix_alchemical_reagentsby finding the Scarlet Pimpernel for Crimdon Crazymix.story.fort_sether_remedyfort_sether_illness.story.fairy_foundfrevia_tomboyish_fairy.story.old_scores_settledgalann_revenge, settling Galann Strongfist's score with Torathog.story.rhun_alchemygandyld_mana_crystal, using the old enhancement pools and alchemical concoctions to perfect Gandyld's crystal.story.between_the_lineslairwenn_notesin Brynknot Library.story.guiding_lightmelanye_lost_stick, recovering Melanye's enchanted walking stick.story.rescuer_of_lynrenrescuing_lynren.story.beyond_llwyfens_portalportal_of_llwyfen. Hidden until its story is discovered if necessary.story.mushroom_menacemushroom_demon.story.charob_couriershipment_of_charob_beer, delivering Steve Bruck's shipment to the Asterian Arms Tavern.story.letters_through_darktwo_lovers_doomed, carrying Tortwald and Rienn Howell's letters between the Underground City and Fort Ghzal.story.quests_5story.quests_10story.quests_15lost_memories::the_journeyserving 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_memoriesdeliberately fails unchosen optional preparation paths and one side of the ant-resolution choice. Never award achievements for those optional/choice-specific outcomes. Its mandatorythe_presenceandthe_journeyparts 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.
lore.blue_crystal_trailconstruction_of_telescope, completelost_memories::the_presence, readbook_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_chroniclerbook_journal_garlandandbook_diary_dunsor, then completeportal_of_llwyfen. Garland records Brynknot's rumors; Dunsor records the doomed expedition and the amulet of Llwyfen from the other side.lore.speak_friendbook_notes_lothostand discover the repeatably accessible entrance tostrakewood_abandoned_mine. Do not require reading the book before opening the entrance.lore.hierro_two_storiesbook_morliana_bard1(Hierro's Story) andbook_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_edictedict_asteria_templesand 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_completebook_orthrack_1throughbook_orthrack_27. Freeze the set and audit that every volume's library placement remains repeatably accessible.lore.centennial_shelfbook_touhou_01throughbook_touhou_12_8, including the numbered interludes. Exclude the catalog and Eastern Fan Project from this frozen set.lore.three_librarieslore.kobold_connectionsconstruction_of_telescope(Morg'eean),fort_sether_illness(Brownrott),portal_of_llwyfen(Nyhelobo and Talthor Redeye), andlost_memories::the_kobolds.lore.old_allieslyondale_archipelago_wizardand 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_crewescaping_deserted_island, completelost_memories::the_journey, and later take either repeatable Sam Goodberry voyage between Incuna and Brynknot.exploration.war_below_strakewoodstrakewood_abandoned_mine,old_outpost,zechna_temple, andunderground_city, following the surviving traces of King Rhun's forces and the wars surrounding Zechna.exploration.rockforge_depthsrockforge,rockforge_palace,rockforge2, androckforge_mines, including the underground city farm beneath its opening to the sky.exploration.island_hopperstrakewood_island,incuna,lyondale_archipelago,eld_woods_island,promethia_island, anddragons_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
exploration.regions_5exploration.regions_10exploration.regions_20exploration.strakewood_townsbrynknot,greyton,aris,asteria,fort_sether,rockforge, andcentennial.exploration.deep_delverstrakewood_abandoned_mineandunderground_city.exploration.zechna_depthszechna_temple,zechna_temple_b,zechna_temple_c, andzechna_temple_d. Hidden until the temple is discovered.exploration.dragons_islanddragons_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
progress.level_10progress.level_25progress.level_50progress.level_75progress.level_100progress.level_115progress.skill_25progress.skill_50progress.skill_100progress.skills_10Use 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
combat.first_killcombat.kills_100combat.kills_1000combat.kills_10000combat.first_dragoncombat.dragon_familiescombat.zechnaGeneric 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
lore.books_10lore.books_25lore.books_50traps.first_disarmtraps.disarm_25traps.disarm_100craft.inscribe_firstcraft.inscribe_25support.heal_other_10000support.heal_other_100000social.party_bossBook 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
combat.kills_50000combat.kills_100000combat.dragons_100combat.demons_1000combat.archetypes_100combat.bosses_100Training 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
exploration.steps_100000exploration.steps_1000000exploration.steps_10000000exploration.launch_regionsexploration.launch_mapsexploration.transitions_10000exploration.savebeds_10Blocked 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
progress.skills_5_at_100progress.skill_xp_1000000000quests.repeatable_100quests.repeatable_1000quests.charob_25shipment_of_charob_beer.quests.charob_250shipment_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
lore.launch_bookslore.books_250craft.inscribe_1000traps.disarm_1000craft.successes_1000craft.recipe_familiesRandom availability, one-time recipes, and permanently choice-locked recipes cannot belong to required collections.
Support and cooperation
support.heal_other_1000000support.heal_other_10000000social.party_encounters_500social.party_time_500hThese 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:
novelty.food_10000novelty.potions_5000novelty.corpses_10000novelty.items_1000000Additional 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.
secret.bookceptionsecret.pilgrimsecret.hidden_waysecret.master_of_secretssecret.deepest_zechnasecret.full_circlesecret.curiosity_rewardedsecret.region_mapssecret.coin_collectionsecret.balanced_dietsecret.apothecary_notessecret.tools_of_tradesecret.collectors_instinctsecret.banking_on_secretssecret.no_captain_requiredsecret.pipe_dreamsecret.bottomless_volcanosecret.hierro_is_realsecret.know_your_rootsbook_history_crossfireartifact.secret.in_the_beginningbook_binary_bibleartifact.secret.take_it_easybook_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:
These facts can support balancing, operator diagnostics, or carefully designed future criteria without being player-facing raw statistics.
Retroactive unlock policy
Rewards
Keep day-one rewards low-risk:
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
/achievementsaccess and filtering without exposing raw character/account metrics.arch/ormaps/.Documentation
docs/ARCHITECTURE.mdor a linked design document.Acceptance criteria
/achievementsexposes only curated achievement state/progress, never raw metrics or account/operator data.