feat: add titles system with unlock tracking and character sheet display

Titles are earned by reaching milestones (quests, bosses, gold, clicks,
adventurers, guild, prestige, transcendence, apotheosis, achievements,
longevity) and are permanent - never lost on prestige/transcendence/
apotheosis resets. 20 titles available at launch.

Also fixes a pre-existing P2034 write-conflict on the load backfill path
and the exactOptionalPropertyTypes violation in the quest failure handler.
This commit is contained in:
2026-03-07 14:51:30 -08:00
committed by Naomi Carrigan
parent eef807343b
commit b886928e49
13 changed files with 333 additions and 10 deletions
+135
View File
@@ -0,0 +1,135 @@
import type { Title } from "@elysium/types";
export const TITLES: Title[] = [
// Quest milestones
{
id: "the_adventurous",
name: "The Adventurous",
description: "Complete your first quest.",
condition: { type: "questsCompleted", amount: 1 },
},
{
id: "the_persistent",
name: "The Persistent",
description: "Complete 100 quests in a single run.",
condition: { type: "questsCompleted", amount: 100 },
},
// Boss milestones
{
id: "boss_slayer",
name: "Boss Slayer",
description: "Defeat your first boss.",
condition: { type: "bossesDefeated", amount: 1 },
},
{
id: "dungeon_master",
name: "Dungeon Master",
description: "Defeat 10 bosses in a single run.",
condition: { type: "bossesDefeated", amount: 10 },
},
// Gold milestones
{
id: "the_wealthy",
name: "The Wealthy",
description: "Earn 1,000,000 gold in a single run.",
condition: { type: "totalGoldEarned", amount: 1_000_000 },
},
{
id: "the_rich",
name: "The Rich",
description: "Earn 1,000,000,000 gold in a single run.",
condition: { type: "totalGoldEarned", amount: 1_000_000_000 },
},
// Click milestones
{
id: "click_maniac",
name: "Click Maniac",
description: "Click the Guild Hall 10,000 times in a single run.",
condition: { type: "totalClicks", amount: 10_000 },
},
// Adventurer milestones
{
id: "commander",
name: "Commander",
description: "Recruit 100 adventurers.",
condition: { type: "adventurerTotal", amount: 100 },
},
{
id: "warlord",
name: "Warlord",
description: "Recruit 1,000 adventurers.",
condition: { type: "adventurerTotal", amount: 1_000 },
},
// Social
{
id: "guild_founder",
name: "Guild Founder",
description: "Give your guild a name.",
condition: { type: "guildFounded" },
},
// Prestige milestones
{
id: "the_undying",
name: "The Undying",
description: "Achieve your first Prestige.",
condition: { type: "prestigeCount", amount: 1 },
},
{
id: "battle_hardened",
name: "Battle Hardened",
description: "Achieve 5 Prestiges.",
condition: { type: "prestigeCount", amount: 5 },
},
{
id: "legend",
name: "Legend",
description: "Achieve 25 Prestiges.",
condition: { type: "prestigeCount", amount: 25 },
},
// Transcendence milestones
{
id: "transcendent",
name: "Transcendent",
description: "Achieve your first Transcendence.",
condition: { type: "transcendenceCount", amount: 1 },
},
{
id: "beyond_mortal",
name: "Beyond Mortal",
description: "Achieve 5 Transcendences.",
condition: { type: "transcendenceCount", amount: 5 },
},
// Apotheosis milestones
{
id: "apotheosised",
name: "Apotheosised",
description: "Achieve your first Apotheosis.",
condition: { type: "apotheosisCount", amount: 1 },
},
{
id: "ascendant",
name: "Ascendant",
description: "Achieve 5 Apotheoses.",
condition: { type: "apotheosisCount", amount: 5 },
},
// Achievement milestone
{
id: "completionist",
name: "Completionist",
description: "Unlock all achievements.",
condition: { type: "achievementsUnlocked", amount: 40 },
},
// Longevity
{
id: "veteran",
name: "Veteran",
description: "Play Elysium for 30 days.",
condition: { type: "playedDays", amount: 30 },
},
{
id: "timeless",
name: "Timeless",
description: "Play Elysium for a full year.",
condition: { type: "playedDays", amount: 365 },
},
];