local ADDON_NAME, RPAL = ...

local ICON_ROOT = "Interface\\AddOns\\ODYN\\Textures\\IconPack\\"
RPAL.ICON_ROOT = ICON_ROOT
RPAL.ICONS = {
    arrowLeft=ICON_ROOT.."arrow_left.tga", arrowRight=ICON_ROOT.."arrow_right.tga",
    badge=ICON_ROOT.."badge.tga", barrel=ICON_ROOT.."barrel.tga", book=ICON_ROOT.."book.tga",
    check=ICON_ROOT.."check.tga", close=ICON_ROOT.."close.tga", customize=ICON_ROOT.."customize.tga",
    delete=ICON_ROOT.."delete.tga", edit=ICON_ROOT.."edit.tga", eye=ICON_ROOT.."eye.tga",
    eyeFocus=ICON_ROOT.."eye_focus.tga", home=ICON_ROOT.."home.tga", info=ICON_ROOT.."info_circle.tga",
    key=ICON_ROOT.."key.tga", keys=ICON_ROOT.."keys.tga", lantern=ICON_ROOT.."lantern.tga",
    link=ICON_ROOT.."link.tga", list=ICON_ROOT.."list.tga", lock=ICON_ROOT.."lock.tga",
    magnify=ICON_ROOT.."magnify.tga", inspect=ICON_ROOT.."inspect.tga",
    map=ICON_ROOT.."map.tga", music=ICON_ROOT.."music.tga",
    pause=ICON_ROOT.."pause.tga", people=ICON_ROOT.."people.tga", person=ICON_ROOT.."person.tga",
    play=ICON_ROOT.."play.tga", plus=ICON_ROOT.."plus.tga", question=ICON_ROOT.."question.tga",
    refresh=ICON_ROOT.."refresh.tga", repair=ICON_ROOT.."repair.tga", replay=ICON_ROOT.."replay.tga",
    save=ICON_ROOT.."save.tga", scroll=ICON_ROOT.."scroll.tga", search=ICON_ROOT.."search.tga",
    settings=ICON_ROOT.."settings.tga", skull=ICON_ROOT.."skull.tga", star=ICON_ROOT.."star.tga",
    token=ICON_ROOT.."token.tga", tools=ICON_ROOT.."tools.tga", trophy=ICON_ROOT.."trophy.tga",
    undo=ICON_ROOT.."undo.tga", wand=ICON_ROOT.."wand.tga", warning=ICON_ROOT.."warning.tga",
    emoteAngry=ICON_ROOT.."emote_angry.tga", emoteCheer=ICON_ROOT.."emote_cheer.tga",
    emoteCry=ICON_ROOT.."emote_cry.tga", emoteFrown=ICON_ROOT.."emote_frown.tga",
    emoteHeart=ICON_ROOT.."emote_heart.tga", emoteNeutral=ICON_ROOT.."emote_neutral.tga",
    emoteNo=ICON_ROOT.."emote_no.tga", emotePeer=ICON_ROOT.."emote_peer.tga",
    emotePet=ICON_ROOT.."emote_pet.tga", emoteFlirt=ICON_ROOT.."emote_flirt.tga",
    emoteGasp=ICON_ROOT.."emote_gasp.tga", emoteBye=ICON_ROOT.."emote_bye.tga",
    emoteYawn=ICON_ROOT.."emote_yawn.tga", emoteShy=ICON_ROOT.."emote_shy.tga",
    emoteSmile=ICON_ROOT.."emote_smile.tga", emoteSmirk=ICON_ROOT.."emote_smirk.tga",
    emoteSnicker=ICON_ROOT.."emote_snicker.tga", emoteSurprised=ICON_ROOT.."emote_surprised.tga",
    emoteWave=ICON_ROOT.."emote_wave.tga",
    emoteGlance=ICON_ROOT.."eye_focus.tga", emoteHiss=ICON_ROOT.."emote_angry.tga",
}

RPAL.TEMPLATE_VERSION = 1

RPAL.RACES = {
    "Human", "Dwarf", "Kaldorei", "Highborne", "Gnome", "Draenei", "Man'ari",
    "Ren'dorei", "Dark Iron Dwarf", "Earthen", "Mechagnome", "Haranir", "Orc",
    "Mag'har Orc", "Troll", "Zandalari Troll", "Undead", "Shu'halo", "Sin'dorei",
    "Goblin", "Shal'dorei",
}

RPAL.EASY_RACES = {
    ["Kaldorei"] = "Night Elf",
    ["Ren'dorei"] = "Void Elf",
    ["Sin'dorei"] = "Blood Elf",
    ["Shal'dorei"] = "Nightborne",
    ["Shu'halo"] = "Tauren",
}

RPAL.RELATIONSHIPS = {
    "Don't Show", "Single", "Taken", "Engaged", "Married", "Divorced", "Widowed",
}


RPAL.GAME_ICONS = {
    { name = "Question Mark", path = RPAL.ICONS.question },
    { name = "Book",          path = RPAL.ICONS.book },
    { name = "Scroll",        path = RPAL.ICONS.scroll },
    { name = "Trophy",        path = RPAL.ICONS.trophy },
    { name = "Badge",         path = RPAL.ICONS.badge },
    { name = "Star",          path = RPAL.ICONS.star },
    { name = "People",        path = RPAL.ICONS.people },
    { name = "Person",        path = RPAL.ICONS.person },
    { name = "Map",           path = RPAL.ICONS.map },
    { name = "Key",           path = RPAL.ICONS.key },
    { name = "Lock",          path = RPAL.ICONS.lock },
    { name = "Check",         path = RPAL.ICONS.check },
    { name = "Heart",         path = RPAL.ICONS.emoteHeart },
    { name = "Smile",         path = RPAL.ICONS.emoteSmile },
    { name = "Skull",         path = RPAL.ICONS.skull },
}

RPAL.ACHIEVEMENT_CATALOG_VERSION = 3
RPAL.ACCOUNT_ACHIEVEMENT_CATALOG_VERSION = 3

local function Achievement(id,name,description,icon,additional)
    return {
        id=id,
        name=name,
        description=description,
        icon=icon or RPAL.ICONS.trophy,
        additional=additional or "",
    }
end

local function Category(id,name,collapsed,badges)
    return {id=id,name=name,collapsed=collapsed and true or false,badges=badges or {}}
end

RPAL.DEFAULT_LIBRARY = {
    Category("starter","Getting Started",false,{
        Achievement("starter-finally-awake","You Are Finally Awake!","*name* has taken the first step into their roleplay journey.",RPAL.ICONS.book,"Manual milestone."),
        Achievement("starter-my-name-is","My Name Is...","*name* has introduced themselves in-character.",RPAL.ICONS.scroll,"Manual milestone."),
        Achievement("starter-first-contact","A New Face","*name* has met their first unique roleplay character.",RPAL.ICONS.people,"Automatic: meet 1 unique character."),
        Achievement("starter-first-session","And So It Begins","*name* has completed their first recorded Session.",RPAL.ICONS.play,"Automatic: complete 1 Session."),
        Achievement("starter-first-memory","Worth Remembering","*name* has saved their first Session memory.",RPAL.ICONS.book,"Automatic: save 1 memory."),
        Achievement("starter-first-plan","Mark the Date","*name* has placed their first RP event on the Calendar.",RPAL.ICONS.scroll,"Automatic: create 1 Calendar event."),
        Achievement("starter-first-campaign","Answering the Call","*name* has joined their first ODYN DM Campaign.",RPAL.ICONS.map,"Automatic: join 1 Campaign."),
        Achievement("starter-level-five","Finding Their Feet","*name* has reached Renown Level 5.",RPAL.ICONS.badge,"Automatic: reach Level 5."),
    }),

    Category("social","Social",true,{
        Achievement("social-met-5","Familiar Faces","*name* has met 5 unique roleplay characters.",RPAL.ICONS.people,"Automatic."),
        Achievement("social-met-10","A Growing Circle","*name* has met 10 unique roleplay characters.",RPAL.ICONS.people,"Automatic."),
        Achievement("social-met-25","Known Around Town","*name* has met 25 unique roleplay characters.",RPAL.ICONS.people,"Automatic."),
        Achievement("social-met-50","A Name People Know","*name* has met 50 unique roleplay characters.",RPAL.ICONS.people,"Automatic."),
        Achievement("social-met-100","Hundred Stories","*name* has met 100 unique roleplay characters.",RPAL.ICONS.people,"Automatic."),
        Achievement("social-events-10","Breaking the Ice","*name* has received 10 tracked social interactions.",RPAL.ICONS.emoteSmile,"Automatic."),
        Achievement("social-events-25","Easy Company","*name* has received 25 tracked social interactions.",RPAL.ICONS.emoteSmile,"Automatic."),
        Achievement("social-events-50","Well Acquainted","*name* has received 50 tracked social interactions.",RPAL.ICONS.emoteSmile,"Automatic."),
        Achievement("social-events-100","Social Butterfly","*name* has received 100 tracked social interactions.",RPAL.ICONS.emoteWave,"Automatic."),
        Achievement("social-events-250","Center of Attention","*name* has received 250 tracked social interactions.",RPAL.ICONS.emoteCheer,"Automatic."),
        Achievement("social-events-500","Everybody Knows Your Name","*name* has received 500 tracked social interactions.",RPAL.ICONS.trophy,"Automatic."),
        Achievement("social-smile-10","Ten Good Reasons","*name* has been smiled at 10 times.",RPAL.ICONS.emoteSmile,"Automatic."),
        Achievement("social-hug-10","Warm Welcome","*name* has received 10 hugs.",RPAL.ICONS.emoteHeart,"Automatic."),
        Achievement("social-cheer-10","Crowd Favourite","*name* has been cheered 10 times.",RPAL.ICONS.emoteCheer,"Automatic."),
        Achievement("social-wave-10","Passing Hellos","*name* has been waved to 10 times.",RPAL.ICONS.emoteWave,"Automatic."),
        Achievement("social-peer-10","Under Observation","*name* has been peered at 10 times.",RPAL.ICONS.emotePeer,"Automatic."),
        Achievement("social-dance-10","Dance Floor Regular","*name* has been the target of 10 dances.",RPAL.ICONS.emoteNeutral,"Automatic."),
        Achievement("social-glance-10","Caught Your Eye","*name* has received 10 glances.",RPAL.ICONS.eyeFocus,"Automatic."),
    }),

    Category("working","Sessions",true,{
        Achievement("session-5","Getting Comfortable","*name* has completed 5 recorded Sessions.",RPAL.ICONS.play,"Automatic."),
        Achievement("session-10","Ten Chapters In","*name* has completed 10 recorded Sessions.",RPAL.ICONS.book,"Automatic."),
        Achievement("session-25","Regular Fixture","*name* has completed 25 recorded Sessions.",RPAL.ICONS.book,"Automatic."),
        Achievement("session-50","Seasoned Roleplayer","*name* has completed 50 recorded Sessions.",RPAL.ICONS.trophy,"Automatic."),
        Achievement("session-time-30m","Half an Hour Later...","*name* has accumulated 30 minutes of recorded Session time.",RPAL.ICONS.pause,"Automatic."),
        Achievement("session-time-2h","Settling In","*name* has accumulated 2 hours of recorded Session time.",RPAL.ICONS.pause,"Automatic."),
        Achievement("session-time-5h","Long Form","*name* has accumulated 5 hours of recorded Session time.",RPAL.ICONS.pause,"Automatic."),
        Achievement("session-time-10h","Many Evenings","*name* has accumulated 10 hours of recorded Session time.",RPAL.ICONS.trophy,"Automatic."),
        Achievement("session-single-hour","Where Did the Time Go?","*name* has completed a Session lasting at least one hour.",RPAL.ICONS.play,"Automatic."),
        Achievement("session-party-3","Small Company","*name* has shared a Session with at least 3 other characters.",RPAL.ICONS.people,"Automatic."),
        Achievement("session-party-5","Full Table","*name* has shared a Session with at least 5 other characters.",RPAL.ICONS.people,"Automatic."),
        Achievement("session-party-10","Crowded Room","*name* has shared a Session with at least 10 other characters.",RPAL.ICONS.people,"Automatic."),
        Achievement("session-interactions-50","Conversation Flow","*name* has accumulated 50 tracked interactions across completed Sessions.",RPAL.ICONS.scroll,"Automatic."),
        Achievement("session-interactions-250","Never a Dull Moment","*name* has accumulated 250 tracked interactions across completed Sessions.",RPAL.ICONS.scroll,"Automatic."),
        Achievement("session-resume-3","Pick Up Where We Left Off","*name* has resumed stored Sessions 3 times.",RPAL.ICONS.replay,"Automatic."),
    }),

    Category("chronicle","Chronicle",true,{
        Achievement("chronicle-memories-5","A Few Good Memories","*name* has saved 5 Session memories.",RPAL.ICONS.book,"Automatic."),
        Achievement("chronicle-memories-10","Personal Archive","*name* has saved 10 Session memories.",RPAL.ICONS.book,"Automatic."),
        Achievement("chronicle-memories-25","The Long Chronicle","*name* has saved 25 Session memories.",RPAL.ICONS.scroll,"Automatic."),
        Achievement("chronicle-memories-50","A Life in Pages","*name* has saved 50 Session memories.",RPAL.ICONS.trophy,"Automatic."),
        Achievement("chronicle-pin-1","One for the Mantel","*name* has pinned a favourite Session memory.",RPAL.ICONS.star,"Automatic."),
        Achievement("chronicle-pin-3","Three to Remember","*name* has filled all three pinned Session memory slots.",RPAL.ICONS.star,"Automatic."),
        Achievement("chronicle-bonds-5","Names to Remember","*name* has formed 5 recorded Bonds.",RPAL.ICONS.people,"Automatic."),
        Achievement("chronicle-bonds-15","A Web of Connections","*name* has formed 15 recorded Bonds.",RPAL.ICONS.people,"Automatic."),
        Achievement("chronicle-bonds-30","Everybody Has a Story","*name* has formed 30 recorded Bonds.",RPAL.ICONS.people,"Automatic."),
        Achievement("chronicle-bonds-50","Living Network","*name* has formed 50 recorded Bonds.",RPAL.ICONS.trophy,"Automatic."),
        Achievement("chronicle-arc-1","Beginning, Middle, End","*name* has completed a Story Arc.",RPAL.ICONS.map,"Automatic."),
        Achievement("chronicle-arc-5","Storyteller","*name* has completed 5 Story Arcs.",RPAL.ICONS.map,"Automatic."),
    }),

    Category("campaigning","Campaigning",true,{
        Achievement("campaign-join-3","Campaign Regular","*name* has joined 3 unique ODYN DM Campaigns.",RPAL.ICONS.map,"Automatic."),
        Achievement("campaign-join-5","Answer Every Call","*name* has joined 5 unique ODYN DM Campaigns.",RPAL.ICONS.map,"Automatic."),
        Achievement("campaign-join-10","Veteran Adventurer","*name* has joined 10 unique ODYN DM Campaigns.",RPAL.ICONS.trophy,"Automatic."),
        Achievement("campaign-finish-1","Seen It Through","*name* has a concluded DM Campaign in their memories.",RPAL.ICONS.check,"Automatic."),
        Achievement("campaign-finish-3","Three Campaigns Later","*name* has concluded 3 ODYN DM Campaigns.",RPAL.ICONS.check,"Automatic."),
        Achievement("campaign-finish-5","Campaign Veteran","*name* has concluded 5 ODYN DM Campaigns.",RPAL.ICONS.trophy,"Automatic."),
        Achievement("campaign-sessions-10","On the Road Again","*name* has accumulated 10 Campaign Sessions across concluded Campaigns.",RPAL.ICONS.play,"Automatic."),
        Achievement("campaign-saved-5","Nobody Left Behind","*name* has helped save 5 NPCs across concluded Campaigns.",RPAL.ICONS.emoteHeart,"Automatic."),
        Achievement("campaign-killed-25","Trail of Trouble","*name* has accumulated 25 NPC kills across concluded Campaigns.",RPAL.ICONS.skull,"Automatic."),
    }),

    Category("progression","Renown",true,{
        Achievement("renown-level-10","Well Established","*name* has reached Renown Level 10.",RPAL.ICONS.badge,"Automatic."),
        Achievement("renown-level-20","Recognized Name","*name* has reached Renown Level 20.",RPAL.ICONS.badge,"Automatic."),
        Achievement("renown-level-30","Veteran Presence","*name* has reached Renown Level 30.",RPAL.ICONS.badge,"Automatic."),
        Achievement("renown-level-40","A Storied Name","*name* has reached Renown Level 40.",RPAL.ICONS.trophy,"Automatic."),
        Achievement("renown-level-50","Living Legend","*name* has reached Renown Level 50.",RPAL.ICONS.trophy,"Automatic."),
        Achievement("renown-level-60","Renowned","*name* has reached Renown Level 60.",RPAL.ICONS.star,"Automatic."),
        Achievement("renown-score-500","Five Hundred Renown","*name* has accumulated 500 total Renown.",RPAL.ICONS.token,"Automatic."),
        Achievement("renown-score-1000","A Thousand Tales","*name* has accumulated 1000 total Renown.",RPAL.ICONS.token,"Automatic."),
        Achievement("renown-cosmetics-10","A Little Flair","*name* has unlocked at least 10 ODYN cosmetics.",RPAL.ICONS.customize,"Automatic."),
        Achievement("renown-cosmetics-25","Wardrobe Department","*name* has unlocked at least 25 ODYN cosmetics.",RPAL.ICONS.customize,"Automatic."),
    }),

    Category("planning","Planning",true,{
        Achievement("planning-3","Plans Within Plans","*name* has 3 RP events on their Calendar.",RPAL.ICONS.scroll,"Automatic."),
        Achievement("planning-5","Busy Week","*name* has 5 RP events on their Calendar.",RPAL.ICONS.scroll,"Automatic."),
        Achievement("planning-10","Booked and Busy","*name* has 10 RP events on their Calendar.",RPAL.ICONS.scroll,"Automatic."),
        Achievement("planning-25","Social Calendar","*name* has 25 RP events on their Calendar.",RPAL.ICONS.book,"Automatic."),
        Achievement("planning-50","Never a Free Evening","*name* has 50 RP events on their Calendar.",RPAL.ICONS.trophy,"Automatic."),
    }),

    Category("health","Health & Recovery",true,{
        Achievement("health-injury-1","That Left a Mark","*name* has recorded an active injury.",RPAL.ICONS.warning,"Automatic."),
        Achievement("health-injury-3","Rough Week","*name* has carried 3 active injury markers at once.",RPAL.ICONS.warning,"Automatic."),
        Achievement("health-injury-5","Held Together Somehow","*name* has carried 5 active injury markers at once.",RPAL.ICONS.warning,"Automatic."),
        Achievement("health-healing","Patch Me Up","*name* has recorded a Healing Status.",RPAL.ICONS.emoteHeart,"Automatic."),
        Achievement("health-recovery-timer","On the Mend","*name* has started a timed recovery.",RPAL.ICONS.refresh,"Automatic."),
    }),

    Category("guild","Guild & Community",true,{
        Achievement("guild-first-event","Representing","*name* has attended an in-character guild event.",RPAL.ICONS.people,"Manual milestone."),
        Achievement("guild-host-event","Open Invitation","*name* has hosted an RP event for their guild or community.",RPAL.ICONS.scroll,"Manual milestone."),
        Achievement("guild-recruit","A New Banner","*name* has helped welcome a new character into a guild or organization.",RPAL.ICONS.people,"Manual milestone."),
        Achievement("guild-responsibility","Trusted With the Keys","*name* has taken on a meaningful in-character responsibility in an organization.",RPAL.ICONS.key,"Manual milestone."),
        Achievement("guild-legacy","Part of Something Bigger","*name* has seen a guild or organization storyline through to a memorable conclusion.",RPAL.ICONS.trophy,"Manual milestone."),
    }),

    Category("pvp","Combat",true,{
        Achievement("combat-first-duel","Draw Steel","*name* has taken part in their first meaningful RP combat encounter.",RPAL.ICONS.skull,"Manual milestone."),
        Achievement("combat-victory","Still Standing","*name* has won an RP combat encounter.",RPAL.ICONS.trophy,"Manual milestone."),
        Achievement("combat-defeat","Live to Fight Another Day","*name* has accepted defeat and lived with the consequences.",RPAL.ICONS.warning,"Manual milestone."),
        Achievement("combat-protect","Not While I'm Here","*name* has put themselves in danger to protect another character.",RPAL.ICONS.emoteHeart,"Manual milestone."),
        Achievement("combat-mercy","Mercy Is a Choice","*name* has spared an opponent when they had the advantage.",RPAL.ICONS.check,"Manual milestone."),
        Achievement("combat-rival","Again?","*name* has faced the same rival across multiple encounters.",RPAL.ICONS.replay,"Manual milestone."),
    }),

    Category("good-deeds","Good Deeds",true,{
        Achievement("good-help-stranger","A Helping Hand","*name* has helped a stranger without asking for payment.",RPAL.ICONS.emoteHeart,"Manual milestone."),
        Achievement("good-return-lost","Found and Returned","*name* has returned something valuable that was not theirs.",RPAL.ICONS.key,"Manual milestone."),
        Achievement("good-keep-promise","My Word Is My Bond","*name* has kept a difficult promise.",RPAL.ICONS.check,"Manual milestone."),
        Achievement("good-forgive","Let It Go","*name* has genuinely forgiven someone who wronged them.",RPAL.ICONS.emoteHeart,"Manual milestone."),
        Achievement("good-sacrifice","The Cost Was Mine","*name* has accepted a real cost so someone else would not have to.",RPAL.ICONS.trophy,"Manual milestone."),
        Achievement("good-peacemaker","Words Before Blades","*name* has prevented a conflict through diplomacy.",RPAL.ICONS.scroll,"Manual milestone."),
    }),

    Category("bad-deeds","Bad Deeds",true,{
        Achievement("bad-lie","A Convenient Truth","*name* has told a consequential in-character lie.",RPAL.ICONS.smirk or RPAL.ICONS.emoteSmirk,"Manual milestone."),
        Achievement("bad-steal","Borrowed Forever","*name* has stolen something that mattered.",RPAL.ICONS.key,"Manual milestone."),
        Achievement("bad-betray","Knife in the Back","*name* has betrayed someone who trusted them.",RPAL.ICONS.skull,"Manual milestone."),
        Achievement("bad-grudge","Never Forgotten","*name* has carried a grudge long enough for it to shape a story.",RPAL.ICONS.emoteAngry,"Manual milestone."),
        Achievement("bad-blackmail","Leverage","*name* has used a secret or threat to force another character's hand.",RPAL.ICONS.warning,"Manual milestone."),
        Achievement("bad-cross-line","No Taking That Back","*name* has crossed a moral line they once believed they would not.",RPAL.ICONS.skull,"Manual milestone."),
    }),

    Category("minigames","Mini Games",true,{
        Achievement("minigame-hs-match-1","Take a Seat","*name* has completed a Hearthstone match.",RPAL.ICONS.play,"Automatic."),
        Achievement("minigame-hs-win-1","Winner's Table","*name* has won a Hearthstone match.",RPAL.ICONS.trophy,"Automatic."),
        Achievement("minigame-hs-win-5","Five on the Board","*name* has won 5 Hearthstone matches.",RPAL.ICONS.trophy,"Automatic."),
        Achievement("minigame-hs-win-10","Tavern Champion","*name* has won 10 Hearthstone matches.",RPAL.ICONS.star,"Automatic."),
        Achievement("minigame-hs-lethal-5","No Concessions Needed","*name* has won 5 Hearthstone matches by lethal damage.",RPAL.ICONS.skull,"Automatic."),
        Achievement("minigame-hs-packs-5","Crack the Seal","*name* has opened 5 Hearthstone card packs.",RPAL.ICONS.badge,"Automatic."),
        Achievement("minigame-hs-packs-25","Pack Habit","*name* has opened 25 Hearthstone card packs.",RPAL.ICONS.badge,"Automatic."),
    }),
}

-- ============================================================
-- Achievement catalogue expansion (2.14)
-- ============================================================
local function AddAchievementToCategory(categoryID,badge)
    for _,category in ipairs(RPAL.DEFAULT_LIBRARY or {}) do
        if category.id==categoryID then
            category.badges=category.badges or {}
            table.insert(category.badges,badge)
            return
        end
    end
end

-- Character/profile achievements remain about the story of this identity.
-- These extend the existing milestones without turning the character book into
-- an account progression checklist.
for _,badge in ipairs({
    Achievement("social-met-150","Long Memory","*name* has met 150 unique roleplay characters.",RPAL.ICONS.people,"Automatic."),
    Achievement("social-met-250","Everyone Has Heard Something","*name* has met 250 unique roleplay characters.",RPAL.ICONS.trophy,"Automatic."),
    Achievement("social-events-1000","Always Someone to Talk To","*name* has received 1,000 tracked social interactions.",RPAL.ICONS.emoteWave,"Automatic."),
    Achievement("social-events-2500","The Room Knows You","*name* has received 2,500 tracked social interactions.",RPAL.ICONS.trophy,"Automatic."),
    Achievement("social-smile-25","Brightening the Room","*name* has been smiled at 25 times.",RPAL.ICONS.emoteSmile,"Automatic."),
    Achievement("social-hug-25","Much Needed","*name* has received 25 hugs.",RPAL.ICONS.emoteHeart,"Automatic."),
    Achievement("social-cheer-25","Well Received","*name* has been cheered 25 times.",RPAL.ICONS.emoteCheer,"Automatic."),
    Achievement("social-wave-25","Recognized in Passing","*name* has been waved to 25 times.",RPAL.ICONS.emoteWave,"Automatic."),
    Achievement("social-peer-25","Hard to Ignore","*name* has been peered at 25 times.",RPAL.ICONS.emotePeer,"Automatic."),
    Achievement("social-dance-25","Keep the Music Going","*name* has been the target of 25 dances.",RPAL.ICONS.music,"Automatic."),
    Achievement("social-glance-25","Second Look","*name* has received 25 glances.",RPAL.ICONS.eyeFocus,"Automatic."),
    Achievement("social-variety-5","Expressive Company","*name* has received at least 5 different kinds of tracked social interaction.",RPAL.ICONS.emoteSmile,"Automatic."),
    Achievement("social-variety-10","A Full Vocabulary","*name* has received at least 10 different kinds of tracked social interaction.",RPAL.ICONS.emoteCheer,"Automatic."),
}) do AddAchievementToCategory("social",badge) end

for _,badge in ipairs({
    Achievement("session-100","A Hundred Chapters","*name* has completed 100 recorded Sessions.",RPAL.ICONS.trophy,"Automatic."),
    Achievement("session-200","No Short Story","*name* has completed 200 recorded Sessions.",RPAL.ICONS.star,"Automatic."),
    Achievement("session-time-25h","Night After Night","*name* has accumulated 25 hours of recorded Session time.",RPAL.ICONS.book,"Automatic."),
    Achievement("session-time-50h","A Long Campaign of Evenings","*name* has accumulated 50 hours of recorded Session time.",RPAL.ICONS.trophy,"Automatic."),
    Achievement("session-time-100h","One Hundred Hours In Character","*name* has accumulated 100 hours of recorded Session time.",RPAL.ICONS.star,"Automatic."),
    Achievement("session-single-2h","One More Scene","*name* has completed a Session lasting at least two hours.",RPAL.ICONS.play,"Automatic."),
    Achievement("session-single-3h","Where Did the Evening Go?","*name* has completed a Session lasting at least three hours.",RPAL.ICONS.play,"Automatic."),
    Achievement("session-party-15","Standing Room Only","*name* has shared a Session with at least 15 other characters.",RPAL.ICONS.people,"Automatic."),
    Achievement("session-interactions-500","Conversation Never Stopped","*name* has accumulated 500 tracked interactions across completed Sessions.",RPAL.ICONS.scroll,"Automatic."),
    Achievement("session-interactions-1000","A Thousand Exchanges","*name* has accumulated 1,000 tracked interactions across completed Sessions.",RPAL.ICONS.trophy,"Automatic."),
    Achievement("session-resume-10","Previously, On...","*name* has resumed stored Sessions 10 times.",RPAL.ICONS.replay,"Automatic."),
    Achievement("session-group-10","Company Kept","*name* has completed 10 Sessions with at least 3 active participants.",RPAL.ICONS.people,"Automatic."),
    Achievement("session-group-25","Never Alone","*name* has completed 25 Sessions with at least 3 active participants.",RPAL.ICONS.people,"Automatic."),
}) do AddAchievementToCategory("working",badge) end

for _,badge in ipairs({
    Achievement("chronicle-memories-100","A Personal Library","*name* has saved 100 Session memories.",RPAL.ICONS.book,"Automatic."),
    Achievement("chronicle-memories-200","The Shelves Are Full","*name* has saved 200 Session memories.",RPAL.ICONS.trophy,"Automatic."),
    Achievement("chronicle-bonds-100","A Hundred Threads","*name* has formed 100 recorded Bonds.",RPAL.ICONS.people,"Automatic."),
    Achievement("chronicle-arc-10","Ten Complete Tales","*name* has completed 10 Story Arcs.",RPAL.ICONS.map,"Automatic."),
    Achievement("chronicle-arc-25","A Life in Volumes","*name* has completed 25 Story Arcs.",RPAL.ICONS.trophy,"Automatic."),
}) do AddAchievementToCategory("chronicle",badge) end

for _,badge in ipairs({
    Achievement("campaign-join-25","Always on the List","*name* has joined 25 unique ODYN DM Campaigns.",RPAL.ICONS.map,"Automatic."),
    Achievement("campaign-finish-10","Ten Roads Home","*name* has concluded 10 ODYN DM Campaigns.",RPAL.ICONS.trophy,"Automatic."),
    Achievement("campaign-finish-25","Campaign Fixture","*name* has concluded 25 ODYN DM Campaigns.",RPAL.ICONS.star,"Automatic."),
    Achievement("campaign-sessions-25","Campaign Regular","*name* has accumulated 25 Campaign Sessions across concluded Campaigns.",RPAL.ICONS.play,"Automatic."),
    Achievement("campaign-sessions-50","Veteran of Many Tables","*name* has accumulated 50 Campaign Sessions across concluded Campaigns.",RPAL.ICONS.trophy,"Automatic."),
    Achievement("campaign-saved-25","Rescue Record","*name* has helped save 25 NPCs across concluded Campaigns.",RPAL.ICONS.emoteHeart,"Automatic."),
    Achievement("campaign-killed-100","A Very Long List","*name* has accumulated 100 NPC kills across concluded Campaigns.",RPAL.ICONS.skull,"Automatic."),
}) do AddAchievementToCategory("campaigning",badge) end

for _,badge in ipairs({
    Achievement("renown-score-2500","Stories Carry","*name* has accumulated 2,500 total Renown.",RPAL.ICONS.token,"Automatic."),
    Achievement("renown-score-5000","A Name With Weight","*name* has accumulated 5,000 total Renown.",RPAL.ICONS.trophy,"Automatic."),
    Achievement("renown-cosmetics-50","A Look for Every Occasion","*name* has unlocked at least 50 ODYN cosmetics.",RPAL.ICONS.customize,"Automatic."),
    Achievement("renown-cosmetics-75","Collector's Cabinet","*name* has unlocked at least 75 ODYN cosmetics.",RPAL.ICONS.customize,"Automatic."),
}) do AddAchievementToCategory("progression",badge) end

AddAchievementToCategory("planning",Achievement("planning-100","The Calendar Needs Another Page","*name* has 100 RP events recorded on their Calendar.",RPAL.ICONS.book,"Automatic."))

-- v3: long-tail automatic milestones.  These are deliberately spread across
-- social, Session, Chronicle and Renown play so the automatic book continues
-- to surface meaningful goals deep into an established character.
for _,badge in ipairs({
    Achievement("social-met-500","A City of Stories","*name* has met 500 unique roleplay characters.",RPAL.ICONS.star,"Automatic."),
    Achievement("social-events-5000","Always in the Conversation","*name* has received 5,000 tracked social interactions.",RPAL.ICONS.star,"Automatic."),
    Achievement("social-variety-15","Every Gesture Has a Story","*name* has received at least 15 different kinds of tracked social interaction.",RPAL.ICONS.emoteCheer,"Automatic."),
}) do AddAchievementToCategory("social",badge) end

for _,badge in ipairs({
    Achievement("session-300","Three Hundred Chapters","*name* has completed 300 recorded Sessions.",RPAL.ICONS.trophy,"Automatic."),
    Achievement("session-500","A Life in Sessions","*name* has completed 500 recorded Sessions.",RPAL.ICONS.star,"Automatic."),
    Achievement("session-time-250h","Two Hundred Fifty Hours IC","*name* has accumulated 250 hours of recorded Session time.",RPAL.ICONS.trophy,"Automatic."),
    Achievement("session-time-500h","Five Hundred Hours IC","*name* has accumulated 500 hours of recorded Session time.",RPAL.ICONS.star,"Automatic."),
    Achievement("session-single-4h","The Long Night","*name* has completed a Session lasting at least four hours.",RPAL.ICONS.play,"Automatic."),
    Achievement("session-single-6h","Sunrise Already?","*name* has completed a Session lasting at least six hours.",RPAL.ICONS.star,"Automatic."),
    Achievement("session-interactions-2500","Words Without End","*name* has accumulated 2,500 tracked interactions across completed Sessions.",RPAL.ICONS.trophy,"Automatic."),
    Achievement("session-interactions-5000","Five Thousand Exchanges","*name* has accumulated 5,000 tracked interactions across completed Sessions.",RPAL.ICONS.star,"Automatic."),
    Achievement("session-resume-25","The Story Continues","*name* has resumed stored Sessions 25 times.",RPAL.ICONS.replay,"Automatic."),
    Achievement("session-group-50","Never a Quiet Table","*name* has completed 50 Sessions with at least 3 active participants.",RPAL.ICONS.people,"Automatic."),
    Achievement("session-group-100","A Hundred Gatherings","*name* has completed 100 Sessions with at least 3 active participants.",RPAL.ICONS.star,"Automatic."),
}) do AddAchievementToCategory("working",badge) end

for _,badge in ipairs({
    Achievement("chronicle-memories-300","Three Hundred Memories","*name* has saved 300 Session memories.",RPAL.ICONS.book,"Automatic."),
    Achievement("chronicle-bonds-150","Threads Everywhere","*name* has formed 150 recorded Bonds.",RPAL.ICONS.people,"Automatic."),
    Achievement("chronicle-bonds-250","A Web of Lives","*name* has formed 250 recorded Bonds.",RPAL.ICONS.star,"Automatic."),
    Achievement("chronicle-arc-50","Fifty Finished Tales","*name* has completed 50 Story Arcs.",RPAL.ICONS.star,"Automatic."),
}) do AddAchievementToCategory("chronicle",badge) end

for _,badge in ipairs({
    Achievement("renown-level-70","Beyond Renowned","*name* has reached Renown Level 70.",RPAL.ICONS.star,"Automatic."),
    Achievement("renown-level-80","Prestige Made Visible","*name* has reached Renown Level 80.",RPAL.ICONS.star,"Automatic."),
    Achievement("renown-level-90","A Name That Endures","*name* has reached Renown Level 90.",RPAL.ICONS.trophy,"Automatic."),
    Achievement("renown-level-100","One Hundred","*name* has reached Renown Level 100.",RPAL.ICONS.star,"Automatic."),
    Achievement("renown-score-10000","Ten Thousand Renown","*name* has accumulated 10,000 total Renown.",RPAL.ICONS.token,"Automatic."),
    Achievement("renown-score-25000","Twenty-Five Thousand Tales","*name* has accumulated 25,000 total Renown.",RPAL.ICONS.trophy,"Automatic."),
    Achievement("renown-score-50000","Fifty Thousand Renown","*name* has accumulated 50,000 total Renown.",RPAL.ICONS.trophy,"Automatic."),
    Achievement("renown-score-100000","A Hundred Thousand Renown","*name* has accumulated 100,000 total Renown.",RPAL.ICONS.star,"Automatic."),
}) do AddAchievementToCategory("progression",badge) end

AddAchievementToCategory("planning",Achievement("planning-250","Plans Upon Plans","*name* has 250 RP events recorded on their Calendar.",RPAL.ICONS.star,"Automatic."))

for _,badge in ipairs({
    Achievement("guild-mentor","Show Them Around","*name* has taken another character under their wing in-character.",RPAL.ICONS.people,"Manual milestone."),
    Achievement("guild-lead-crisis","Keep It Together","*name* has helped lead an organization through an in-character crisis.",RPAL.ICONS.warning,"Manual milestone."),
    Achievement("guild-tradition","Old Habit, New Meaning","*name* has helped establish a recurring guild or community tradition.",RPAL.ICONS.scroll,"Manual milestone."),
    Achievement("guild-diplomat","Between Two Banners","*name* has represented their organization in a meaningful negotiation.",RPAL.ICONS.map,"Manual milestone."),
}) do AddAchievementToCategory("guild",badge) end

for _,badge in ipairs({
    Achievement("combat-outnumbered","Against the Odds","*name* has survived a meaningful RP combat while badly outnumbered.",RPAL.ICONS.skull,"Manual milestone."),
    Achievement("combat-rescue","Dragged From the Fire","*name* has rescued another character during an active combat scene.",RPAL.ICONS.emoteHeart,"Manual milestone."),
    Achievement("combat-disarmed","No Weapon, No Problem","*name* has continued a fight after being disarmed or deprived of their usual advantage.",RPAL.ICONS.warning,"Manual milestone."),
    Achievement("combat-nemesis","This Again","*name* has developed a recurring combat nemesis through roleplay.",RPAL.ICONS.replay,"Manual milestone."),
}) do AddAchievementToCategory("pvp",badge) end

for _,badge in ipairs({
    Achievement("good-second-chance","One More Chance","*name* has given someone a genuine second chance when refusing would have been easier.",RPAL.ICONS.emoteHeart,"Manual milestone."),
    Achievement("good-take-blame","I'll Answer for It","*name* has accepted blame or punishment to protect someone else.",RPAL.ICONS.check,"Manual milestone."),
    Achievement("good-feed-shelter","Room at the Table","*name* has offered food, shelter, or safety to someone in need.",RPAL.ICONS.home,"Manual milestone."),
}) do AddAchievementToCategory("good-deeds",badge) end

for _,badge in ipairs({
    Achievement("bad-frame","Wrong Place, Wrong Person","*name* has deliberately framed someone else for their actions.",RPAL.ICONS.warning,"Manual milestone."),
    Achievement("bad-abandon","Left Behind","*name* has knowingly abandoned someone who depended on them.",RPAL.ICONS.skull,"Manual milestone."),
    Achievement("bad-corrupt","Bad Influence","*name* has convinced another character to cross a line with them.",RPAL.ICONS.emoteSmirk,"Manual milestone."),
}) do AddAchievementToCategory("bad-deeds",badge) end

for _,badge in ipairs({
    Achievement("minigame-hs-match-10","Regular at the Table","*name* has completed 10 Hearthstone matches.",RPAL.ICONS.play,"Automatic."),
    Achievement("minigame-hs-match-25","Card Table Habit","*name* has completed 25 Hearthstone matches.",RPAL.ICONS.badge,"Automatic."),
    Achievement("minigame-hs-match-50","Fifty Games Later","*name* has completed 50 Hearthstone matches.",RPAL.ICONS.trophy,"Automatic."),
    Achievement("minigame-hs-match-100","Table Veteran","*name* has completed 100 Hearthstone matches.",RPAL.ICONS.star,"Automatic."),
    Achievement("minigame-hs-win-25","Twenty-Five Victories","*name* has won 25 Hearthstone matches.",RPAL.ICONS.trophy,"Automatic."),
    Achievement("minigame-hs-win-50","Tavern Terror","*name* has won 50 Hearthstone matches.",RPAL.ICONS.star,"Automatic."),
    Achievement("minigame-hs-packs-50","Just One More Pack","*name* has opened 50 Hearthstone card packs.",RPAL.ICONS.badge,"Automatic."),
    Achievement("minigame-hs-packs-100","Cardboard Treasury","*name* has opened 100 Hearthstone card packs.",RPAL.ICONS.trophy,"Automatic."),
}) do AddAchievementToCategory("minigames",badge) end

-- Account achievements are intentionally a separate meta-progression book.
-- They track the player's RPAL roster and shared legacy rather than duplicating
-- a single character's story milestones.
RPAL.DEFAULT_ACCOUNT_LIBRARY = {
    Category("account-journey","Account Journey",false,{
        Achievement("account-identities-2","Another Point of View","Use ODYN with 2 distinct roleplay identities.",RPAL.ICONS.people,"Automatic account milestone."),
        Achievement("account-identities-3","A Small Cast","Use ODYN with 3 distinct roleplay identities.",RPAL.ICONS.people,"Automatic account milestone."),
        Achievement("account-identities-5","Ensemble Cast","Use ODYN with 5 distinct roleplay identities.",RPAL.ICONS.people,"Automatic account milestone."),
        Achievement("account-identities-10","Dramatis Personae","Use ODYN with 10 distinct roleplay identities.",RPAL.ICONS.trophy,"Automatic account milestone."),
        Achievement("account-main-selected","The Captain","Select an ODYN Main character.",RPAL.ICONS.badge,"Automatic account milestone."),
        Achievement("account-active-3","Three Lives in Motion","Have at least 3 ODYN identities with recorded roleplay activity.",RPAL.ICONS.play,"Automatic account milestone."),
        Achievement("account-active-5","No One Sits Idle","Have at least 5 ODYN identities with recorded roleplay activity.",RPAL.ICONS.play,"Automatic account milestone."),
    }),
    Category("account-chronicle","Shared Chronicle",true,{
        Achievement("account-sessions-25","Twenty-Five Sessions, One Account","Complete 25 recorded Sessions across the account.",RPAL.ICONS.book,"Automatic account milestone."),
        Achievement("account-sessions-50","A Shared Volume","Complete 50 recorded Sessions across the account.",RPAL.ICONS.book,"Automatic account milestone."),
        Achievement("account-sessions-100","One Hundred Sessions","Complete 100 recorded Sessions across the account.",RPAL.ICONS.trophy,"Automatic account milestone."),
        Achievement("account-sessions-250","The Long Chronicle","Complete 250 recorded Sessions across the account.",RPAL.ICONS.trophy,"Automatic account milestone."),
        Achievement("account-sessions-500","Five Hundred Chapters","Complete 500 recorded Sessions across the account.",RPAL.ICONS.star,"Automatic account milestone."),
        Achievement("account-hours-25","Twenty-Five Hours Elsewhere","Record 25 hours of Session time across the account.",RPAL.ICONS.pause,"Automatic account milestone."),
        Achievement("account-hours-50","Fifty Hours In Character","Record 50 hours of Session time across the account.",RPAL.ICONS.pause,"Automatic account milestone."),
        Achievement("account-hours-100","A Hundred Hours of Stories","Record 100 hours of Session time across the account.",RPAL.ICONS.book,"Automatic account milestone."),
        Achievement("account-hours-250","A Serious Archive","Record 250 hours of Session time across the account.",RPAL.ICONS.trophy,"Automatic account milestone."),
        Achievement("account-hours-500","Half a Thousand Hours","Record 500 hours of Session time across the account.",RPAL.ICONS.star,"Automatic account milestone."),
        Achievement("account-memories-25","Shared Keepsakes","Save 25 Session memories across the account.",RPAL.ICONS.book,"Automatic account milestone."),
        Achievement("account-memories-50","Family Archive","Save 50 Session memories across the account.",RPAL.ICONS.book,"Automatic account milestone."),
        Achievement("account-memories-100","A Shelf of Lives","Save 100 Session memories across the account.",RPAL.ICONS.trophy,"Automatic account milestone."),
        Achievement("account-arcs-10","Ten Stories Closed","Complete 10 Story Arcs across the account.",RPAL.ICONS.map,"Automatic account milestone."),
        Achievement("account-arcs-25","Many Lives, Many Endings","Complete 25 Story Arcs across the account.",RPAL.ICONS.trophy,"Automatic account milestone."),
    }),
    Category("account-social","Social Web",true,{
        Achievement("account-contacts-50","Across the Roster","Meet 50 unique roleplay contacts across all recorded identities.",RPAL.ICONS.people,"Automatic account milestone."),
        Achievement("account-contacts-100","A Hundred Names","Meet 100 unique roleplay contacts across all recorded identities.",RPAL.ICONS.people,"Automatic account milestone."),
        Achievement("account-contacts-250","The Wider Community","Meet 250 unique roleplay contacts across all recorded identities.",RPAL.ICONS.people,"Automatic account milestone."),
        Achievement("account-contacts-500","Half a Thousand Stories","Meet 500 unique roleplay contacts across all recorded identities.",RPAL.ICONS.trophy,"Automatic account milestone."),
        Achievement("account-interactions-500","Constant Company","Record 500 social interactions across the account.",RPAL.ICONS.emoteSmile,"Automatic account milestone."),
        Achievement("account-interactions-1000","A Thousand Exchanges","Record 1,000 social interactions across the account.",RPAL.ICONS.emoteWave,"Automatic account milestone."),
        Achievement("account-interactions-2500","Community Regular","Record 2,500 social interactions across the account.",RPAL.ICONS.emoteCheer,"Automatic account milestone."),
        Achievement("account-interactions-5000","Always Someone Around","Record 5,000 social interactions across the account.",RPAL.ICONS.trophy,"Automatic account milestone."),
        Achievement("account-social-roster-3","Social in Every Life","Have 3 ODYN identities that have each met at least 10 unique characters.",RPAL.ICONS.people,"Automatic account milestone."),
        Achievement("account-social-roster-5","Five Circles","Have 5 ODYN identities that have each met at least 10 unique characters.",RPAL.ICONS.people,"Automatic account milestone."),
    }),
    Category("account-roster","Roster Mastery",true,{
        Achievement("account-one-level-20","One Established Life","Reach Renown Level 20 on any ODYN identity.",RPAL.ICONS.badge,"Automatic account milestone."),
        Achievement("account-one-level-40","One Storied Life","Reach Renown Level 40 on any ODYN identity.",RPAL.ICONS.trophy,"Automatic account milestone."),
        Achievement("account-one-level-60","One Living Legend","Reach Renown Level 60 on any ODYN identity.",RPAL.ICONS.star,"Automatic account milestone."),
        Achievement("account-two-level-20","Two Established Lives","Reach Renown Level 20 on 2 ODYN identities.",RPAL.ICONS.badge,"Automatic account milestone."),
        Achievement("account-three-level-20","Three Established Lives","Reach Renown Level 20 on 3 ODYN identities.",RPAL.ICONS.badge,"Automatic account milestone."),
        Achievement("account-three-level-30","A Veteran Trio","Reach Renown Level 30 on 3 ODYN identities.",RPAL.ICONS.trophy,"Automatic account milestone."),
        Achievement("account-five-level-20","Deep Roster","Reach Renown Level 20 on 5 ODYN identities.",RPAL.ICONS.star,"Automatic account milestone."),
        Achievement("account-renown-2500","Shared Reputation","Accumulate 2,500 combined Renown across recorded ODYN identities.",RPAL.ICONS.token,"Automatic account milestone."),
        Achievement("account-renown-5000","A Roster With Weight","Accumulate 5,000 combined Renown across recorded ODYN identities.",RPAL.ICONS.token,"Automatic account milestone."),
        Achievement("account-renown-10000","Ten Thousand Renown","Accumulate 10,000 combined Renown across recorded ODYN identities.",RPAL.ICONS.trophy,"Automatic account milestone."),
    }),
    Category("account-campaigns","Campaign Legacy",true,{
        Achievement("account-campaign-joined-10","Always Answering","Join 10 Campaigns across the account.",RPAL.ICONS.map,"Automatic account milestone."),
        Achievement("account-campaign-joined-25","Campaign Regulars","Join 25 Campaigns across the account.",RPAL.ICONS.map,"Automatic account milestone."),
        Achievement("account-campaign-joined-50","Every Road Leads Somewhere","Join 50 Campaigns across the account.",RPAL.ICONS.trophy,"Automatic account milestone."),
        Achievement("account-campaign-finished-5","Five Endings","Conclude 5 Campaigns across the account.",RPAL.ICONS.check,"Automatic account milestone."),
        Achievement("account-campaign-finished-10","Ten Endings","Conclude 10 Campaigns across the account.",RPAL.ICONS.check,"Automatic account milestone."),
        Achievement("account-campaign-finished-25","Campaign Archive","Conclude 25 Campaigns across the account.",RPAL.ICONS.trophy,"Automatic account milestone."),
        Achievement("account-campaign-sessions-50","Fifty Campaign Nights","Accumulate 50 Campaign Sessions across the account.",RPAL.ICONS.play,"Automatic account milestone."),
        Achievement("account-campaign-saved-25","Rescue Ledger","Help save 25 NPCs across concluded Campaign records on the account.",RPAL.ICONS.emoteHeart,"Automatic account milestone."),
        Achievement("account-campaign-killed-100","The Other Ledger","Accumulate 100 NPC kills across concluded Campaign records on the account.",RPAL.ICONS.skull,"Automatic account milestone."),
    }),
    Category("account-tavern","Tavern Legacy",true,{
        Achievement("account-hs-matches-25","Tavern Regular","Complete 25 Hearthstone matches on the account.",RPAL.ICONS.play,"Automatic account milestone."),
        Achievement("account-hs-matches-100","Table Fixture","Complete 100 Hearthstone matches on the account.",RPAL.ICONS.trophy,"Automatic account milestone."),
        Achievement("account-hs-wins-25","Winning Habit","Win 25 Hearthstone matches on the account.",RPAL.ICONS.trophy,"Automatic account milestone."),
        Achievement("account-hs-wins-100","Tavern Royalty","Win 100 Hearthstone matches on the account.",RPAL.ICONS.star,"Automatic account milestone."),
        Achievement("account-hs-packs-50","Pack Collector","Open 50 Hearthstone card packs on the account.",RPAL.ICONS.badge,"Automatic account milestone."),
        Achievement("account-hs-packs-100","Pack Archivist","Open 100 Hearthstone card packs on the account.",RPAL.ICONS.badge,"Automatic account milestone."),
        Achievement("account-hs-arenas-5","Five Tables","Unlock 5 Hearthstone arenas.",RPAL.ICONS.map,"Automatic account milestone."),
        Achievement("account-hs-backs-10","Back Catalogue","Unlock 10 Hearthstone card backs.",RPAL.ICONS.customize,"Automatic account milestone."),
        Achievement("account-hs-backs-18","Full Back Catalogue","Unlock 18 Hearthstone card backs.",RPAL.ICONS.trophy,"Automatic account milestone."),
    }),
    Category("account-reserve","Shared Reserve",true,{
        Achievement("account-tokens-1000","A Comfortable Purse","Hold 1,000 Tokens in the shared ODYN reserve.",RPAL.ICONS.token,"Automatic account milestone."),
        Achievement("account-tokens-5000","Well Funded","Hold 5,000 Tokens in the shared ODYN reserve.",RPAL.ICONS.token,"Automatic account milestone."),
        Achievement("account-tokens-10000","Treasury","Hold 10,000 Tokens in the shared ODYN reserve.",RPAL.ICONS.trophy,"Automatic account milestone."),
    }),
}

