feat: add equipment, achievements, and visual polish

- Equipment system: 12 items across weapon/armour/trinket slots with
  common/rare/epic/legendary rarities; starter commons auto-equipped,
  higher tiers drop from boss victories
- Achievement system: 15 milestones with typed conditions; checked
  each tick and crystal rewards applied automatically
- Achievement toast: slide-in notification, auto-dismisses after 4s
- Floating click text: +X gold floats on each manual click
- Expanded quests (9 total) and upgrades (12 total)
- Upgrade panel now shows locked upgrades so players can see their
  progression path
- formatNumber utility (K/M/B/T) used consistently across all panels
- Backfill logic for existing saves to add new content gracefully
- types package now emits .d.ts declarations
This commit is contained in:
2026-03-06 13:27:48 -08:00
committed by Naomi Carrigan
parent a3daed1683
commit e9e0df31fd
33 changed files with 2066 additions and 133 deletions
+127
View File
@@ -0,0 +1,127 @@
import type { Equipment } from "@elysium/types";
export const DEFAULT_EQUIPMENT: Equipment[] = [
// Weapons — drop from bosses; common starts owned
{
id: "rusty_sword",
name: "Rusty Sword",
description: "A battered blade, but still sharp enough to draw blood.",
type: "weapon",
rarity: "common",
bonus: { combatMultiplier: 1.1 },
owned: true,
equipped: true,
},
{
id: "iron_sword",
name: "Iron Sword",
description: "A sturdy weapon issued to veterans of the guild.",
type: "weapon",
rarity: "rare",
bonus: { combatMultiplier: 1.25 },
owned: false,
equipped: false,
},
{
id: "enchanted_blade",
name: "Enchanted Blade",
description: "A sword imbued with ancient magic that makes every strike count.",
type: "weapon",
rarity: "epic",
bonus: { combatMultiplier: 1.5 },
owned: false,
equipped: false,
},
{
id: "vorpal_sword",
name: "Vorpal Sword",
description: "A legendary blade that severs even the strongest bonds.",
type: "weapon",
rarity: "legendary",
bonus: { combatMultiplier: 2.0 },
owned: false,
equipped: false,
},
// Armour — drop from bosses; common starts owned
{
id: "leather_armour",
name: "Leather Armour",
description: "Simple protection that keeps your adventurers moving efficiently.",
type: "armour",
rarity: "common",
bonus: { goldMultiplier: 1.1 },
owned: true,
equipped: true,
},
{
id: "chainmail",
name: "Chainmail",
description: "Interlocked rings that guard against most mundane threats.",
type: "armour",
rarity: "rare",
bonus: { goldMultiplier: 1.25 },
owned: false,
equipped: false,
},
{
id: "plate_armour",
name: "Plate Armour",
description: "Full plate protection that inspires confidence — and gold.",
type: "armour",
rarity: "epic",
bonus: { goldMultiplier: 1.5 },
owned: false,
equipped: false,
},
{
id: "dragon_scale",
name: "Dragon Scale Armour",
description: "Armour forged from the scales of a defeated elder dragon.",
type: "armour",
rarity: "legendary",
bonus: { goldMultiplier: 2.0 },
owned: false,
equipped: false,
},
// Trinkets — drop from bosses; common starts owned
{
id: "lucky_coin",
name: "Lucky Coin",
description: "A coin that always lands on the side you need.",
type: "trinket",
rarity: "common",
bonus: { clickMultiplier: 1.1 },
owned: true,
equipped: true,
},
{
id: "mages_focus",
name: "Mage's Focus",
description: "A crystal lens that sharpens magical precision.",
type: "trinket",
rarity: "rare",
bonus: { clickMultiplier: 1.25 },
owned: false,
equipped: false,
},
{
id: "arcane_orb",
name: "Arcane Orb",
description: "An orb humming with concentrated arcane energy.",
type: "trinket",
rarity: "epic",
bonus: { clickMultiplier: 1.5 },
owned: false,
equipped: false,
},
{
id: "philosophers_stone",
name: "Philosopher's Stone",
description: "The legendary stone that grants mastery over gold and combat alike.",
type: "trinket",
rarity: "legendary",
bonus: { clickMultiplier: 2.0, goldMultiplier: 1.25 },
owned: false,
equipped: false,
},
];