From 40126350765d7af98d15fa87d823b97e585ae63d Mon Sep 17 00:00:00 2001 From: Hikari Date: Tue, 14 Apr 2026 18:42:47 -0700 Subject: [PATCH] =?UTF-8?q?feat:=20vampire=20expansion=20chunk=202=20(wip)?= =?UTF-8?q?=20=E2=80=94=20content=20data=20and=20grant-apotheosis=20debug?= =?UTF-8?q?=20route?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/api/src/data/vampireAchievements.ts | 297 ++++ apps/api/src/data/vampireAwakeningUpgrades.ts | 136 ++ apps/api/src/data/vampireBosses.ts | 1326 +++++++++++++++++ apps/api/src/data/vampireCrafting.ts | 536 +++++++ apps/api/src/data/vampireEquipment.ts | 624 ++++++++ apps/api/src/data/vampireEquipmentSets.ts | 119 ++ apps/api/src/data/vampireMaterials.ts | 408 +++++ apps/api/src/data/vampireQuests.ts | 1114 ++++++++++++++ apps/api/src/data/vampireSiringUpgrades.ts | 216 +++ apps/api/src/data/vampireThralls.ts | 402 +++++ apps/api/src/data/vampireUpgrades.ts | 725 +++++++++ apps/api/src/data/vampireZones.ts | 191 +++ apps/api/src/routes/debug.ts | 60 +- 13 files changed, 6153 insertions(+), 1 deletion(-) create mode 100644 apps/api/src/data/vampireAchievements.ts create mode 100644 apps/api/src/data/vampireAwakeningUpgrades.ts create mode 100644 apps/api/src/data/vampireBosses.ts create mode 100644 apps/api/src/data/vampireCrafting.ts create mode 100644 apps/api/src/data/vampireEquipment.ts create mode 100644 apps/api/src/data/vampireEquipmentSets.ts create mode 100644 apps/api/src/data/vampireMaterials.ts create mode 100644 apps/api/src/data/vampireQuests.ts create mode 100644 apps/api/src/data/vampireSiringUpgrades.ts create mode 100644 apps/api/src/data/vampireThralls.ts create mode 100644 apps/api/src/data/vampireUpgrades.ts create mode 100644 apps/api/src/data/vampireZones.ts diff --git a/apps/api/src/data/vampireAchievements.ts b/apps/api/src/data/vampireAchievements.ts new file mode 100644 index 0000000..97f0b30 --- /dev/null +++ b/apps/api/src/data/vampireAchievements.ts @@ -0,0 +1,297 @@ +/** + * @file Game data definitions. + * @copyright nhcarrigan + * @license Naomi's Public License + * @author Naomi Carrigan + */ +/* eslint-disable stylistic/max-len -- Data content */ +/* eslint-disable max-lines -- Data file */ +import type { VampireAchievement } from "@elysium/types"; + +export const defaultVampireAchievements: Array = [ + // ── Total Blood Earned milestones ───────────────────────────────────────── + { + condition: { amount: 1_000, type: "totalBloodEarned" }, + description: "Spill the first thousand drops. Every hunt starts here.", + icon: "🩸", + id: "blood_thousand", + name: "First Blood", + reward: { ichor: 5 }, + unlockedAt: null, + }, + { + condition: { amount: 10_000, type: "totalBloodEarned" }, + description: "Ten thousand drops flow through your domain — the hunger becomes familiar.", + icon: "🔴", + id: "blood_ten_thousand", + name: "Crimson Tide", + reward: { ichor: 25 }, + unlockedAt: null, + }, + { + condition: { amount: 100_000, type: "totalBloodEarned" }, + description: "The rivers of blood run deep. Your domain is truly cursed now.", + icon: "🌊", + id: "blood_hundred_thousand", + name: "Rivers of Crimson", + reward: { ichor: 100 }, + unlockedAt: null, + }, + { + condition: { amount: 1_000_000, type: "totalBloodEarned" }, + description: "One million drops — the world bends its neck toward you.", + icon: "👑", + id: "blood_million", + name: "Lord of the Hunt", + reward: { ichor: 300, soulShards: 1 }, + unlockedAt: null, + }, + { + condition: { amount: 10_000_000, type: "totalBloodEarned" }, + description: "Ten million — a tide of crimson that nations would drown in.", + icon: "🌙", + id: "blood_ten_million", + name: "Midnight Sovereign", + reward: { ichor: 750, soulShards: 3 }, + unlockedAt: null, + }, + { + condition: { amount: 100_000_000, type: "totalBloodEarned" }, + description: "A hundred million drops. The darkness remembers your name.", + icon: "⚫", + id: "blood_hundred_million", + name: "The Dark Eternal", + reward: { ichor: 2_000, soulShards: 10 }, + unlockedAt: null, + }, + { + condition: { amount: 1_000_000_000, type: "totalBloodEarned" }, + description: "One billion drops — a millennium of predation made manifest.", + icon: "🕳️", + id: "blood_billion", + name: "Ancient Hunger", + reward: { ichor: 5_000, soulShards: 25 }, + unlockedAt: null, + }, + // ── Vampire Bosses Defeated ─────────────────────────────────────────────── + { + condition: { amount: 1, type: "vampireBossesDefeated" }, + description: "The first challenger falls. This is only the beginning.", + icon: "⚔️", + id: "boss_first", + name: "First Kill", + reward: { ichor: 10 }, + unlockedAt: null, + }, + { + condition: { amount: 5, type: "vampireBossesDefeated" }, + description: "Five enemies put to rest. The name 'hunter' begins to fit.", + icon: "🗡️", + id: "boss_five", + name: "Hunter", + reward: { ichor: 50 }, + unlockedAt: null, + }, + { + condition: { amount: 20, type: "vampireBossesDefeated" }, + description: "Twenty victories — the battlefield has become familiar ground.", + icon: "⚰️", + id: "boss_twenty", + name: "Battle Hardened", + reward: { ichor: 150 }, + unlockedAt: null, + }, + { + condition: { amount: 50, type: "vampireBossesDefeated" }, + description: "Fifty enemies broken. Even ancient horrors pause at your approach.", + icon: "🩸", + id: "boss_fifty", + name: "Dread Predator", + reward: { ichor: 400, soulShards: 2 }, + unlockedAt: null, + }, + { + condition: { amount: 72, type: "vampireBossesDefeated" }, + description: "All 72 vampire realm bosses have been defeated. The realm trembles.", + icon: "🌑", + id: "boss_all", + name: "The Darkness Made Flesh", + reward: { ichor: 1_000, soulShards: 10 }, + unlockedAt: null, + }, + // ── Vampire Quests Completed ────────────────────────────────────────────── + { + condition: { amount: 1, type: "vampireQuestsCompleted" }, + description: "The first mission of many. The domain stirs in response.", + icon: "📜", + id: "quest_first", + name: "Night Errand", + reward: { ichor: 5 }, + unlockedAt: null, + }, + { + condition: { amount: 10, type: "vampireQuestsCompleted" }, + description: "Ten missions carried out without failure. Reliability is its own power.", + icon: "📋", + id: "quest_ten", + name: "Reliable Shadow", + reward: { ichor: 30 }, + unlockedAt: null, + }, + { + condition: { amount: 30, type: "vampireQuestsCompleted" }, + description: "Thirty missions completed — your thralls have grown seasoned in the dark.", + icon: "🕯️", + id: "quest_thirty", + name: "Veteran of the Night", + reward: { ichor: 100 }, + unlockedAt: null, + }, + { + condition: { amount: 60, type: "vampireQuestsCompleted" }, + description: "Sixty missions. Your command reaches across the entire realm.", + icon: "🌑", + id: "quest_sixty", + name: "Shadow Commander", + reward: { ichor: 300, soulShards: 2 }, + unlockedAt: null, + }, + { + condition: { amount: 90, type: "vampireQuestsCompleted" }, + description: "Every quest in the vampire realm completed. The darkness answers your call.", + icon: "👁️", + id: "quest_all", + name: "Voice of the Abyss", + reward: { ichor: 800, soulShards: 8 }, + unlockedAt: null, + }, + // ── Total Thrall Count ──────────────────────────────────────────────────── + { + condition: { amount: 10, type: "thrallTotal" }, + description: "Ten souls bound to your will. The domain begins to take shape.", + icon: "🧟", + id: "thralls_ten", + name: "First Flock", + reward: { ichor: 10 }, + unlockedAt: null, + }, + { + condition: { amount: 50, type: "thrallTotal" }, + description: "Fifty thralls bound — a proper hunting force. The night fears you.", + icon: "🧛", + id: "thralls_fifty", + name: "Pack Leader", + reward: { ichor: 50 }, + unlockedAt: null, + }, + { + condition: { amount: 150, type: "thrallTotal" }, + description: "One hundred and fifty thralls — a blood-drunk army in your service.", + icon: "⚔️", + id: "thralls_hundred_fifty", + name: "Blood Army", + reward: { ichor: 200 }, + unlockedAt: null, + }, + { + condition: { amount: 400, type: "thrallTotal" }, + description: "Four hundred thralls — a force that could drown a city in shadow.", + icon: "🌑", + id: "thralls_four_hundred", + name: "Tide of Darkness", + reward: { ichor: 600, soulShards: 3 }, + unlockedAt: null, + }, + { + condition: { amount: 1_000, type: "thrallTotal" }, + description: "One thousand bound souls. The vampire realm bows to your dominion.", + icon: "👑", + id: "thralls_thousand", + name: "Sovereign of Thralls", + reward: { ichor: 2_000, soulShards: 15 }, + unlockedAt: null, + }, + // ── Siring Count ────────────────────────────────────────────────────────── + { + condition: { amount: 1, type: "siringCount" }, + description: "The first siring. A new bloodline begins.", + icon: "🌕", + id: "siring_first", + name: "The Sire", + reward: { ichor: 50 }, + unlockedAt: null, + }, + { + condition: { amount: 3, type: "siringCount" }, + description: "Three sirings — the bloodline strengthens with each reset.", + icon: "🌑", + id: "siring_three", + name: "Bloodline Builder", + reward: { ichor: 200 }, + unlockedAt: null, + }, + { + condition: { amount: 7, type: "siringCount" }, + description: "Seven sirings — the ichor flows with the weight of accumulated power.", + icon: "🩸", + id: "siring_seven", + name: "Ancient Sire", + reward: { ichor: 500, soulShards: 5 }, + unlockedAt: null, + }, + { + condition: { amount: 15, type: "siringCount" }, + description: "Fifteen sirings. Your bloodline is one of the oldest and most powerful.", + icon: "⚫", + id: "siring_fifteen", + name: "Eternal Bloodline", + reward: { ichor: 1_500, soulShards: 15 }, + unlockedAt: null, + }, + // ── Vampire Equipment Owned ─────────────────────────────────────────────── + { + condition: { amount: 1, type: "vampireEquipmentOwned" }, + description: "The first relic of darkness in your possession. The collection begins.", + icon: "💎", + id: "equipment_first", + name: "First Relic", + reward: { ichor: 15 }, + unlockedAt: null, + }, + { + condition: { amount: 5, type: "vampireEquipmentOwned" }, + description: "Five relics — a proper arsenal for a vampire of note.", + icon: "🗡️", + id: "equipment_five", + name: "Armed and Dangerous", + reward: { ichor: 75 }, + unlockedAt: null, + }, + { + condition: { amount: 15, type: "vampireEquipmentOwned" }, + description: "Fifteen relics — your collection is the envy of lesser vampires.", + icon: "⚰️", + id: "equipment_fifteen", + name: "Collector of Darkness", + reward: { ichor: 300 }, + unlockedAt: null, + }, + { + condition: { amount: 30, type: "vampireEquipmentOwned" }, + description: "Thirty relics — your power radiates through every piece you carry.", + icon: "👑", + id: "equipment_thirty", + name: "Master of Relics", + reward: { ichor: 750, soulShards: 5 }, + unlockedAt: null, + }, + { + condition: { amount: 53, type: "vampireEquipmentOwned" }, + description: "All 53 vampire relics in your possession. The darkness is complete.", + icon: "🌑", + id: "equipment_all", + name: "The Complete Darkness", + reward: { ichor: 2_000, soulShards: 20 }, + unlockedAt: null, + }, +]; diff --git a/apps/api/src/data/vampireAwakeningUpgrades.ts b/apps/api/src/data/vampireAwakeningUpgrades.ts new file mode 100644 index 0000000..c1d2f27 --- /dev/null +++ b/apps/api/src/data/vampireAwakeningUpgrades.ts @@ -0,0 +1,136 @@ +/** + * @file Game data definitions. + * @copyright nhcarrigan + * @license Naomi's Public License + * @author Naomi Carrigan + */ +/* eslint-disable stylistic/max-len -- Data content */ +import type { AwakeningUpgrade } from "@elysium/types"; + +export const defaultVampireAwakeningUpgrades: Array = [ + // ── Blood income (from soul shards) ────────────────────────────────────── + { + category: "blood", + cost: 10, + description: "The awakened soul's hunger amplifies all blood income. All blood/s ×1.5.", + id: "awakening_blood_1", + multiplier: 1.5, + name: "Soul Hunger I", + }, + { + category: "blood", + cost: 50, + description: "A second awakening sharpens the soul's drive to consume. All blood/s ×2.", + id: "awakening_blood_2", + multiplier: 2, + name: "Soul Hunger II", + }, + { + category: "blood", + cost: 200, + description: "The awakened soul transcends ordinary hunger — all blood income triples. All blood/s ×3.", + id: "awakening_blood_3", + multiplier: 3, + name: "Soul Hunger III", + }, + // ── Combat power ────────────────────────────────────────────────────────── + { + category: "combat", + cost: 15, + description: "The awakened soul's predatory edge carries through every thrall. All thrall combat power ×1.5.", + id: "awakening_combat_1", + multiplier: 1.5, + name: "Awakened Predator I", + }, + { + category: "combat", + cost: 75, + description: "Soul shards resonate with battle instinct — combat power doubles. All thrall combat power ×2.", + id: "awakening_combat_2", + multiplier: 2, + name: "Awakened Predator II", + }, + { + category: "combat", + cost: 300, + description: "Apex awakened combat mastery triples every thrall's fighting power. All thrall combat power ×3.", + id: "awakening_combat_3", + multiplier: 3, + name: "Awakened Predator III", + }, + // ── Siring threshold ────────────────────────────────────────────────────── + { + category: "siring_threshold", + cost: 30, + description: "Soul shards carry the memory of past sirings — the threshold lowers by 15%.", + id: "awakening_threshold_1", + multiplier: 0.85, + name: "Soul Memory I", + }, + { + category: "siring_threshold", + cost: 120, + description: "The awakened soul remembers every siring — the threshold drops by a further 20%.", + id: "awakening_threshold_2", + multiplier: 0.8, + name: "Soul Memory II", + }, + { + category: "siring_threshold", + cost: 480, + description: "Perfect soul memory collapses the siring threshold to a fraction of its original. Threshold ×0.7.", + id: "awakening_threshold_3", + multiplier: 0.7, + name: "Soul Memory III", + }, + // ── Siring ichor yield ──────────────────────────────────────────────────── + { + category: "siring_ichor", + cost: 25, + description: "Soul shards amplify the ichor extracted during each siring. Ichor per siring ×1.5.", + id: "awakening_siring_ichor_1", + multiplier: 1.5, + name: "Ichor Resonance I", + }, + { + category: "siring_ichor", + cost: 100, + description: "The resonance deepens — siring yields twice the ichor. Ichor per siring ×2.", + id: "awakening_siring_ichor_2", + multiplier: 2, + name: "Ichor Resonance II", + }, + { + category: "siring_ichor", + cost: 400, + description: "Peak resonance — each siring now yields three times the ichor. Ichor per siring ×3.", + id: "awakening_siring_ichor_3", + multiplier: 3, + name: "Ichor Resonance III", + }, + // ── Soul shards meta ────────────────────────────────────────────────────── + { + category: "soulshards_meta", + cost: 60, + description: "The soul refines itself — future awakenings yield 50% more soul shards.", + id: "awakening_meta_1", + multiplier: 1.5, + name: "Soul Refinement I", + }, + { + category: "soulshards_meta", + cost: 250, + description: "The awakened soul's self-improvement compounds — soul shard yields double.", + id: "awakening_meta_2", + multiplier: 2, + name: "Soul Refinement II", + }, + { + category: "soulshards_meta", + cost: 1_000, + description: "The apex of soul refinement — all future awakenings yield three times the soul shards.", + id: "awakening_meta_3", + multiplier: 3, + name: "Soul Refinement III", + }, +]; diff --git a/apps/api/src/data/vampireBosses.ts b/apps/api/src/data/vampireBosses.ts new file mode 100644 index 0000000..afdb8dc --- /dev/null +++ b/apps/api/src/data/vampireBosses.ts @@ -0,0 +1,1326 @@ +/** + * @file Game data definitions. + * @copyright nhcarrigan + * @license Naomi's Public License + * @author Naomi Carrigan + */ +/* eslint-disable max-lines -- Data file */ +/* eslint-disable stylistic/max-len -- Data content */ +import type { VampireBoss } from "@elysium/types"; + +export const defaultVampireBosses: Array = [ + // ── Haunted Catacombs ───────────────────────────────────────────────────── + { + bloodReward: 50, + bountyIchor: 1, + bountyIchorClaimed: false, + currentHp: 100, + damagePerSecond: 2, + description: "A newly-turned vampire who wandered too deep into the catacombs and never found the way out. They are confused, starving, and will attack anything that moves. Difficult to blame them.", + equipmentRewards: [], + ichorReward: 0, + id: "lost_wanderer", + maxHp: 100, + name: "Lost Wanderer", + siringRequirement: 0, + soulShardsReward: 0, + status: "available", + upgradeRewards: [ "blood_hunt_1" ], + zoneId: "vampire_haunted_catacombs", + }, + { + bloodReward: 250, + bountyIchor: 2, + bountyIchorClaimed: false, + currentHp: 500, + damagePerSecond: 5, + description: "A vampire who died violently and came back wrong — half-memory, half-instinct, entirely hostile. The tomb it guards is empty. It does not seem to know this.", + equipmentRewards: [ "shard_fang" ], + ichorReward: 0, + id: "tomb_revenant", + maxHp: 500, + name: "Tomb Revenant", + siringRequirement: 0, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "blood_hunt_2" ], + zoneId: "vampire_haunted_catacombs", + }, + { + bloodReward: 1_250, + bountyIchor: 5, + bountyIchorClaimed: false, + currentHp: 2_500, + damagePerSecond: 15, + description: "A shadow that learned to feed on its own. It does not have a name — it has forgotten it — but it remembers exactly where the arteries are.", + equipmentRewards: [ "tattered_shroud" ], + ichorReward: 0, + id: "crypt_shade", + maxHp: 2_500, + name: "Crypt Shade", + siringRequirement: 0, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "thrall_fledgling_1" ], + zoneId: "vampire_haunted_catacombs", + }, + { + bloodReward: 6_250, + bountyIchor: 10, + bountyIchorClaimed: false, + currentHp: 12_500, + damagePerSecond: 40, + description: "An ancient vampire who chose these catacombs as a final resting place centuries ago. Unfortunately, 'final resting place' turned out to be a relative concept. It has not enjoyed the interruptions.", + equipmentRewards: [ "bone_talisman" ], + ichorReward: 1, + id: "catacomb_lord", + maxHp: 12_500, + name: "Catacomb Lord", + siringRequirement: 0, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "blood_hunt_3" ], + zoneId: "vampire_haunted_catacombs", + }, + // ── Blood Mire ──────────────────────────────────────────────────────────── + { + bloodReward: 30_000, + bountyIchor: 20, + bountyIchorClaimed: false, + currentHp: 62_500, + damagePerSecond: 100, + description: "Something that rose from the deepest channel of the mire. It is not entirely clear whether it was ever a vampire, or simply what the mire produces when left to its own devices.", + equipmentRewards: [ "blood_fang" ], + ichorReward: 1, + id: "mire_spawn", + maxHp: 62_500, + name: "Mire Spawn", + siringRequirement: 0, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "blood_hunt_4" ], + zoneId: "vampire_blood_mire", + }, + { + bloodReward: 125_000, + bountyIchor: 50, + bountyIchorClaimed: false, + currentHp: 250_000, + damagePerSecond: 300, + description: "A creature that feeds on blood through the skin, moving slowly and patiently through the mire. It has never needed speed. Its prey always comes to it eventually.", + equipmentRewards: [ "blood_shroud" ], + ichorReward: 2, + id: "marsh_leech", + maxHp: 250_000, + name: "Marsh Leech", + siringRequirement: 0, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [], + zoneId: "vampire_blood_mire", + }, + { + bloodReward: 500_000, + bountyIchor: 100, + bountyIchorClaimed: false, + currentHp: 1_000_000, + damagePerSecond: 750, + description: "A wraith that formed in the bloodiest part of the mire over centuries of accumulated slaughter. It has no body, only appetite, and the appetite has had a very long time to grow.", + equipmentRewards: [], + ichorReward: 3, + id: "blood_wraith", + maxHp: 1_000_000, + name: "Blood Wraith", + siringRequirement: 0, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "thrall_fledgling_2" ], + zoneId: "vampire_blood_mire", + }, + { + bloodReward: 2_500_000, + bountyIchor: 200, + bountyIchorClaimed: false, + currentHp: 5_000_000, + damagePerSecond: 2_000, + description: "The absolute ruler of the Blood Mire — an ancient vampire who has merged with the mire itself over millennia of residence. It is not clear where the vampire ends and the swamp begins. It is not clear the vampire cares.", + equipmentRewards: [ "blood_talisman" ], + ichorReward: 5, + id: "mire_sovereign", + maxHp: 5_000_000, + name: "Mire Sovereign", + siringRequirement: 0, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "blood_hunt_5" ], + zoneId: "vampire_blood_mire", + }, + // ── Obsidian Keep ───────────────────────────────────────────────────────── + { + bloodReward: 12_000_000, + bountyIchor: 500, + bountyIchorClaimed: false, + currentHp: 25_000_000, + damagePerSecond: 5_000, + description: "The outermost sentry of the Obsidian Keep — a vampire who has stood this post for so long that the post has become the vampire. It does not leave. It does not need to.", + equipmentRewards: [ "war_fang" ], + ichorReward: 10, + id: "keep_sentry", + maxHp: 25_000_000, + name: "Keep Sentry", + siringRequirement: 1, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "thrall_revenant_1" ], + zoneId: "vampire_obsidian_keep", + }, + { + bloodReward: 50_000_000, + bountyIchor: 1_000, + bountyIchorClaimed: false, + currentHp: 100_000_000, + damagePerSecond: 15_000, + description: "A heavy-set vampire soldier who has served the Keep through three different regimes without finding a reason to change sides. It is not loyal — it simply cannot conceive of anything else.", + equipmentRewards: [ "obsidian_shroud" ], + ichorReward: 20, + id: "obsidian_guard", + maxHp: 100_000_000, + name: "Obsidian Guard", + siringRequirement: 1, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [], + zoneId: "vampire_obsidian_keep", + }, + { + bloodReward: 200_000_000, + bountyIchor: 2_000, + bountyIchorClaimed: false, + currentHp: 400_000_000, + damagePerSecond: 40_000, + description: "The Keep's internal enforcer — the vampire responsible for keeping the walls at their intended standard of impregnability. Its methods are not subtle and are not intended to be.", + equipmentRewards: [ "obsidian_talisman" ], + ichorReward: 30, + id: "iron_warden", + maxHp: 400_000_000, + name: "Iron Warden", + siringRequirement: 1, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "blood_mastery_1" ], + zoneId: "vampire_obsidian_keep", + }, + { + bloodReward: 750_000_000, + bountyIchor: 5_000, + bountyIchorClaimed: false, + currentHp: 1_500_000_000, + damagePerSecond: 100_000, + description: "The absolute master of the Obsidian Keep — a vampire who has ruled here since the building was constructed, and has had time to become indistinguishable from its architecture.", + equipmentRewards: [ "obsidian_fang" ], + ichorReward: 50, + id: "keep_overlord", + maxHp: 1_500_000_000, + name: "Keep Overlord", + siringRequirement: 1, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "hunter_instinct_1" ], + zoneId: "vampire_obsidian_keep", + }, + // ── Crimson Citadel ─────────────────────────────────────────────────────── + { + bloodReward: 3_500_000_000, + bountyIchor: 10_000, + bountyIchorClaimed: false, + currentHp: 7_500_000_000, + damagePerSecond: 250_000, + description: "A knight of the old Citadel order — armoured in blood-bronze, carrying weapons the Citadel has not officially produced in three centuries. The order was supposed to be dissolved. The knight was not informed.", + equipmentRewards: [ "crimson_shroud" ], + ichorReward: 75, + id: "crimson_knight", + maxHp: 7_500_000_000, + name: "Crimson Knight", + siringRequirement: 1, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "hunter_instinct_2" ], + zoneId: "vampire_crimson_citadel", + }, + { + bloodReward: 15_000_000_000, + bountyIchor: 20_000, + bountyIchorClaimed: false, + currentHp: 30_000_000_000, + damagePerSecond: 700_000, + description: "A paladin of the blood faith — a vampire who has elevated feeding to the level of theology. Every attack is both violence and ceremony, and they take both equally seriously.", + equipmentRewards: [ "crimson_talisman" ], + ichorReward: 100, + id: "blood_paladin", + maxHp: 30_000_000_000, + name: "Blood Paladin", + siringRequirement: 1, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [], + zoneId: "vampire_crimson_citadel", + }, + { + bloodReward: 60_000_000_000, + bountyIchor: 50_000, + bountyIchorClaimed: false, + currentHp: 125_000_000_000, + damagePerSecond: 2_000_000, + description: "The champion of the Citadel's arena — a vampire who has fought everything the Citadel's rulers have been willing to throw at it, and has always been willing to go back for more.", + equipmentRewards: [], + ichorReward: 150, + id: "citadel_champion", + maxHp: 125_000_000_000, + name: "Citadel Champion", + siringRequirement: 1, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "thrall_revenant_2" ], + zoneId: "vampire_crimson_citadel", + }, + { + bloodReward: 250_000_000_000, + bountyIchor: 100_000, + bountyIchorClaimed: false, + currentHp: 500_000_000_000, + damagePerSecond: 5_000_000, + description: "The master of the Crimson Citadel — a vampire dynasty unto themselves, who has held court here since before most of the Citadel's stone was quarried. The dynasty operates through fear, tradition, and an absolute certainty that it is owed this.", + equipmentRewards: [ "crimson_fang" ], + ichorReward: 200, + id: "citadel_lord", + maxHp: 500_000_000_000, + name: "Citadel Lord", + siringRequirement: 1, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "blood_mastery_2" ], + zoneId: "vampire_crimson_citadel", + }, + // ── Shadow Court ────────────────────────────────────────────────────────── + { + bloodReward: 1_200_000_000_000, + bountyIchor: 200_000, + bountyIchorClaimed: false, + currentHp: 2_500_000_000_000, + damagePerSecond: 12_000_000, + description: "The Court's official herald — the vampire who announces things and then immediately denies having announced them. Their combat style is the same: every attack is technically deniable.", + equipmentRewards: [ "shadow_shroud" ], + ichorReward: 300, + id: "shadow_herald", + maxHp: 2_500_000_000_000, + name: "Shadow Herald", + siringRequirement: 2, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "vampire_synergy_1" ], + zoneId: "vampire_shadow_court", + }, + { + bloodReward: 5_000_000_000_000, + bountyIchor: 500_000, + bountyIchorClaimed: false, + currentHp: 10_000_000_000_000, + damagePerSecond: 35_000_000, + description: "The Court's blade — a vampire who eliminates problems before the Court acknowledges they exist. Remarkably efficient, completely silent, and officially a chamberlain.", + equipmentRewards: [ "shadow_talisman" ], + ichorReward: 400, + id: "court_assassin", + maxHp: 10_000_000_000_000, + name: "Court Assassin", + siringRequirement: 2, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [], + zoneId: "vampire_shadow_court", + }, + { + bloodReward: 20_000_000_000_000, + bountyIchor: 1_000_000, + bountyIchorClaimed: false, + currentHp: 40_000_000_000_000, + damagePerSecond: 100_000_000, + description: "A noble of the Shadow Court — someone who has survived several centuries of internal politics, which means they have also authored several centuries of the same. Every movement they make is calculated three conversations ahead.", + equipmentRewards: [], + ichorReward: 500, + id: "shadow_noble", + maxHp: 40_000_000_000_000, + name: "Shadow Noble", + siringRequirement: 2, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "thrall_shade_1" ], + zoneId: "vampire_shadow_court", + }, + { + bloodReward: 75_000_000_000_000, + bountyIchor: 2_000_000, + bountyIchorClaimed: false, + currentHp: 150_000_000_000_000, + damagePerSecond: 300_000_000, + description: "The absolute ruler of the Shadow Court — a vampire whose identity is the Court's most closely guarded secret, including from those within it. Their face is known to no one. Their power is felt by everyone.", + equipmentRewards: [ "shadow_fang" ], + ichorReward: 750, + id: "shadow_monarch", + maxHp: 150_000_000_000_000, + name: "Shadow Monarch", + siringRequirement: 2, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "siring_mastery_1" ], + zoneId: "vampire_shadow_court", + }, + // ── Plague Ossuary ──────────────────────────────────────────────────────── + { + bloodReward: 375_000_000_000_000, + bountyIchor: 5_000_000, + bountyIchorClaimed: false, + currentHp: 750_000_000_000_000, + damagePerSecond: 750_000_000, + description: "A vampire who contracted the Ossuary's plague and adapted. The plague did not die. It simply became a feature. The rat-like quality to its movements is new, and is not a problem, from its perspective.", + equipmentRewards: [ "plague_shroud" ], + ichorReward: 1_000, + id: "plague_rat", + maxHp: 750_000_000_000_000, + name: "Plague Rat", + siringRequirement: 2, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "blood_mastery_3" ], + zoneId: "vampire_plague_ossuary", + }, + { + bloodReward: 1_500_000_000_000_000, + bountyIchor: 10_000_000, + bountyIchorClaimed: false, + currentHp: 3_000_000_000_000_000, + damagePerSecond: 2_000_000_000, + description: "A methodical vampire who has spent centuries harvesting bone from the Ossuary's fallen. They have catalogued every piece. They know exactly which ones to use as weapons, and they have a lot of them.", + equipmentRewards: [ "plague_talisman" ], + ichorReward: 1_500, + id: "bone_collector", + maxHp: 3_000_000_000_000_000, + name: "Bone Collector", + siringRequirement: 2, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [], + zoneId: "vampire_plague_ossuary", + }, + { + bloodReward: 6_000_000_000_000_000, + bountyIchor: 25_000_000, + bountyIchorClaimed: false, + currentHp: 12_000_000_000_000_000, + damagePerSecond: 6_000_000_000, + description: "A wraith built from the Ossuary's accumulated pestilence — not a single vampire but a composite of every death the plague has caused, moving as one entity with one hunger.", + equipmentRewards: [], + ichorReward: 2_000, + id: "pestilence_wraith", + maxHp: 12_000_000_000_000_000, + name: "Pestilence Wraith", + siringRequirement: 2, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "hunter_instinct_3" ], + zoneId: "vampire_plague_ossuary", + }, + { + bloodReward: 25_000_000_000_000_000, + bountyIchor: 50_000_000, + bountyIchorClaimed: false, + currentHp: 50_000_000_000_000_000, + damagePerSecond: 18_000_000_000, + description: "The Ossuary's sovereign — a vampire so saturated with plague magic that the disease has become a second body, larger and more dangerous than the original. The original has not been seen in some time.", + equipmentRewards: [ "plague_fang" ], + ichorReward: 3_000, + id: "ossuary_overlord", + maxHp: 50_000_000_000_000_000, + name: "Ossuary Overlord", + siringRequirement: 2, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "vampire_synergy_2" ], + zoneId: "vampire_plague_ossuary", + }, + // ── Ashen Wastes ────────────────────────────────────────────────────────── + { + bloodReward: 125_000_000_000_000_000, + bountyIchor: 100_000_000, + bountyIchorClaimed: false, + currentHp: 250_000_000_000_000_000, + damagePerSecond: 50_000_000_000, + description: "A vampire who has wandered the Wastes since the war that created them. They do not know why they are still here. The Wastes do not offer reasons. They offer only continuation.", + equipmentRewards: [ "ashen_shroud" ], + ichorReward: 4_000, + id: "ash_revenant", + maxHp: 250_000_000_000_000_000, + name: "Ash Revenant", + siringRequirement: 3, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "thrall_shade_2" ], + zoneId: "vampire_ashen_wastes", + }, + { + bloodReward: 500_000_000_000_000_000, + bountyIchor: 200_000_000, + bountyIchorClaimed: false, + currentHp: 1_000_000_000_000_000_000, + damagePerSecond: 150_000_000_000, + description: "A shade that formed from the cinder clouds above the Wastes — denser than ordinary shadow, heat-retaining, and with a grudge that the clouds absorbed from the war and never released.", + equipmentRewards: [ "ashen_talisman" ], + ichorReward: 5_000, + id: "cinder_shade", + maxHp: 1_000_000_000_000_000_000, + name: "Cinder Shade", + siringRequirement: 3, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [], + zoneId: "vampire_ashen_wastes", + }, + { + bloodReward: 2e18, + bountyIchor: 500_000_000, + bountyIchorClaimed: false, + currentHp: 4e18, + damagePerSecond: 500_000_000_000, + description: "A vampire who fought in the original war and chose the Wastes as their territory afterward. Not out of preference — out of the knowledge that nothing else would survive here, and therefore nothing else could challenge them.", + equipmentRewards: [], + ichorReward: 7_000, + id: "ashen_knight", + maxHp: 4e18, + name: "Ashen Knight", + siringRequirement: 3, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "siring_mastery_2" ], + zoneId: "vampire_ashen_wastes", + }, + { + bloodReward: 7.5e18, + bountyIchor: 1_000_000_000, + bountyIchorClaimed: false, + currentHp: 1.5e19, + damagePerSecond: 1_500_000_000_000, + description: "The warden of the Ashen Wastes — a vampire who chose this desolation and has maintained absolute dominance over it for longer than the current political structures of the vampire world have existed.", + equipmentRewards: [ "ashen_fang" ], + ichorReward: 10_000, + id: "wastes_warden", + maxHp: 1.5e19, + name: "Wastes Warden", + siringRequirement: 3, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "blood_mastery_4" ], + zoneId: "vampire_ashen_wastes", + }, + // ── The Iron Gaol ───────────────────────────────────────────────────────── + { + bloodReward: 3.75e19, + bountyIchor: 2_000_000_000, + bountyIchorClaimed: false, + currentHp: 7.5e19, + damagePerSecond: 4_000_000_000_000, + description: "The head warden of the Iron Gaol — a vampire whose entire identity has become the institution of confinement. They do not differentiate between jailor and prisoner. Both are contained, in different ways.", + equipmentRewards: [ "iron_shroud" ], + ichorReward: 12_000, + id: "gaol_warden", + maxHp: 7.5e19, + name: "Gaol Warden", + siringRequirement: 3, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "hunter_instinct_4" ], + zoneId: "vampire_iron_gaol", + }, + { + bloodReward: 1.5e20, + bountyIchor: 5_000_000_000, + bountyIchorClaimed: false, + currentHp: 3e20, + damagePerSecond: 12_000_000_000_000, + description: "The jailor responsible for the Gaol's most dangerous wing. Everything about them is a key — their posture, their voice, their very presence opens and closes things that should stay closed.", + equipmentRewards: [ "iron_talisman" ], + ichorReward: 15_000, + id: "iron_jailor", + maxHp: 3e20, + name: "Iron Jailor", + siringRequirement: 3, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [], + zoneId: "vampire_iron_gaol", + }, + { + bloodReward: 6e20, + bountyIchor: 10_000_000_000, + bountyIchorClaimed: false, + currentHp: 1.2e21, + damagePerSecond: 40_000_000_000_000, + description: "A vampire who, upon learning they could not leave the Gaol, decided to become the chains. There is something philosophically perfect about this that the wraith does not care to examine.", + equipmentRewards: [], + ichorReward: 20_000, + id: "chain_wraith", + maxHp: 1.2e21, + name: "Chain Wraith", + siringRequirement: 3, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "thrall_bloodbound_1" ], + zoneId: "vampire_iron_gaol", + }, + { + bloodReward: 2.5e21, + bountyIchor: 20_000_000_000, + bountyIchorClaimed: false, + currentHp: 5e21, + damagePerSecond: 120_000_000_000_000, + description: "The master of the Iron Gaol — a vampire who was imprisoned here, took over, and decided to stay because the Gaol is exactly as impenetrable from the inside as it is from the outside.", + equipmentRewards: [ "iron_fang" ], + ichorReward: 25_000, + id: "gaol_master", + maxHp: 5e21, + name: "Gaol Master", + siringRequirement: 3, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "vampire_synergy_3" ], + zoneId: "vampire_iron_gaol", + }, + // ── Veilborn Hollow ─────────────────────────────────────────────────────── + { + bloodReward: 1.25e22, + bountyIchor: 50_000_000_000, + bountyIchorClaimed: false, + currentHp: 2.5e22, + damagePerSecond: 350_000_000_000_000, + description: "A specter born in the Veil itself — not quite in the physical world, not quite in the shadow-realm, and not particularly bothered by the ambiguity. It feeds from both sides simultaneously.", + equipmentRewards: [ "veil_shroud" ], + ichorReward: 30_000, + id: "veil_specter", + maxHp: 2.5e22, + name: "Veil Specter", + siringRequirement: 4, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "predator_sense_1" ], + zoneId: "vampire_veilborn_hollow", + }, + { + bloodReward: 5e22, + bountyIchor: 100_000_000_000, + bountyIchorClaimed: false, + currentHp: 1e23, + damagePerSecond: 1_000_000_000_000_000, + description: "A shade that lives in the Hollow's deepest fold of reality. From its perspective, there is only one location, and everything else is a temporary misunderstanding about where things are.", + equipmentRewards: [ "veil_talisman" ], + ichorReward: 40_000, + id: "hollow_shade", + maxHp: 1e23, + name: "Hollow Shade", + siringRequirement: 4, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [], + zoneId: "vampire_veilborn_hollow", + }, + { + bloodReward: 2e23, + bountyIchor: 200_000_000_000, + bountyIchorClaimed: false, + currentHp: 4e23, + damagePerSecond: 3_500_000_000_000_000, + description: "A vampire who has mastered the Veil to the point of weaponising it. Every attack arrives from the wrong direction. Every defence materialises from a direction that does not exist.", + equipmentRewards: [], + ichorReward: 50_000, + id: "veil_weaver", + maxHp: 4e23, + name: "Veil Weaver", + siringRequirement: 4, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "siring_mastery_3" ], + zoneId: "vampire_veilborn_hollow", + }, + { + bloodReward: 7.5e23, + bountyIchor: 500_000_000_000, + bountyIchorClaimed: false, + currentHp: 1.5e24, + damagePerSecond: 10_000_000_000_000_000, + description: "The herald of the Veilborn — a vampire who has been to the other side of the Veil and returned carrying messages from things that did not send them. The messages were not welcoming.", + equipmentRewards: [ "veil_fang" ], + ichorReward: 70_000, + id: "veilborn_herald", + maxHp: 1.5e24, + name: "Veilborn Herald", + siringRequirement: 4, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "crimson_tide_1" ], + zoneId: "vampire_veilborn_hollow", + }, + // ── Moonless Moor ───────────────────────────────────────────────────────── + { + bloodReward: 3.75e24, + bountyIchor: 1_000_000_000_000, + bountyIchorClaimed: false, + currentHp: 7.5e24, + damagePerSecond: 30_000_000_000_000_000, + description: "A vampire that evolved entirely in the moonless dark — no light reflexes, no visual hunting instincts, nothing but bloodscent and the absolute certainty of the kill.", + equipmentRewards: [ "moor_shroud" ], + ichorReward: 90_000, + id: "moor_stalker", + maxHp: 7.5e24, + name: "Moor Stalker", + siringRequirement: 4, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "thrall_bloodbound_2" ], + zoneId: "vampire_moonless_moor", + }, + { + bloodReward: 1.5e25, + bountyIchor: 2_000_000_000_000, + bountyIchorClaimed: false, + currentHp: 3e25, + damagePerSecond: 1e17, + description: "A revenant assembled from the fog itself over centuries — not a single vampire but the moor's accumulated dead, compressed into something that can move with a purpose the individuals never had.", + equipmentRewards: [ "moor_talisman" ], + ichorReward: 120_000, + id: "fog_revenant", + maxHp: 3e25, + name: "Fog Revenant", + siringRequirement: 4, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [], + zoneId: "vampire_moonless_moor", + }, + { + bloodReward: 6e25, + bountyIchor: 5_000_000_000_000, + bountyIchorClaimed: false, + currentHp: 1.2e26, + damagePerSecond: 3.5e17, + description: "A creature that should not exist according to any classification anyone has attempted to apply. The moor created it from materials that were not intended to be combined, and it is deeply uninterested in any classification it does not fit.", + equipmentRewards: [], + ichorReward: 150_000, + id: "moor_beast", + maxHp: 1.2e26, + name: "Moor Beast", + siringRequirement: 4, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "vampire_synergy_4" ], + zoneId: "vampire_moonless_moor", + }, + { + bloodReward: 2.5e26, + bountyIchor: 1e13, + bountyIchorClaimed: false, + currentHp: 5e26, + damagePerSecond: 1e18, + description: "The warden of the Moonless Moor — a vampire who chose this darkness because it was the only place dark enough. It has spent generations learning everything the dark knows, and the dark knows quite a lot.", + equipmentRewards: [ "moonless_fang" ], + ichorReward: 200_000, + id: "moonless_warden", + maxHp: 5e26, + name: "Moonless Warden", + siringRequirement: 4, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "crimson_tide_2" ], + zoneId: "vampire_moonless_moor", + }, + // ── The Sunken Crypt ────────────────────────────────────────────────────── + { + bloodReward: 1.25e27, + bountyIchor: 2e13, + bountyIchorClaimed: false, + currentHp: 2.5e27, + damagePerSecond: 3.5e18, + description: "A vampire shade formed in the deepest submerged chamber — it has never been dry. The water has become part of it, and it has become part of the water, and the whole arrangement is deeply hostile.", + equipmentRewards: [ "sunken_shroud" ], + ichorReward: 250_000, + id: "drowned_shade", + maxHp: 2.5e27, + name: "Drowned Shade", + siringRequirement: 5, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "predator_sense_2" ], + zoneId: "vampire_sunken_crypt", + }, + { + bloodReward: 5e27, + bountyIchor: 5e13, + bountyIchorClaimed: false, + currentHp: 1e28, + damagePerSecond: 1e19, + description: "A vampire who descends regularly to the crypt's deepest sealed chambers and comes back changed each time. Not more damaged — more certain. The certainty is alarming.", + equipmentRewards: [ "sunken_talisman" ], + ichorReward: 300_000, + id: "crypt_diver", + maxHp: 1e28, + name: "Crypt Diver", + siringRequirement: 5, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [], + zoneId: "vampire_sunken_crypt", + }, + { + bloodReward: 2e28, + bountyIchor: 1e14, + bountyIchorClaimed: false, + currentHp: 4e28, + damagePerSecond: 3.5e19, + description: "The guardian of the crypt's deepest gate — a vampire who was sealed in to ensure nothing came out and, over the following centuries, became something nothing should want to come in for.", + equipmentRewards: [], + ichorReward: 400_000, + id: "sunken_warden", + maxHp: 4e28, + name: "Sunken Warden", + siringRequirement: 5, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "siring_mastery_4" ], + zoneId: "vampire_sunken_crypt", + }, + { + bloodReward: 7.5e28, + bountyIchor: 2e14, + bountyIchorClaimed: false, + currentHp: 1.5e29, + damagePerSecond: 1e20, + description: "Something in the lowest chamber of the Sunken Crypt that has been there since before the crypt was built. It is ancient in a way that does not have comfortable vocabulary. It has decided to be called the Crypt Ancient, which is accommodating of it.", + equipmentRewards: [ "sunken_fang" ], + ichorReward: 500_000, + id: "crypt_ancient", + maxHp: 1.5e29, + name: "Crypt Ancient", + siringRequirement: 5, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "thrall_wraith_1" ], + zoneId: "vampire_sunken_crypt", + }, + // ── Desecrated Sanctum ──────────────────────────────────────────────────── + { + bloodReward: 3.75e29, + bountyIchor: 5e14, + bountyIchorClaimed: false, + currentHp: 7.5e29, + damagePerSecond: 3.5e20, + description: "A vampire who participated in the Sanctum's desecration and has stayed to enjoy the results. The sacred architecture distorted around them in ways that enhance rather than diminish their power.", + equipmentRewards: [ "sanctum_shroud" ], + ichorReward: 600_000, + id: "defiler_shade", + maxHp: 7.5e29, + name: "Defiler Shade", + siringRequirement: 5, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "dark_covenant_1" ], + zoneId: "vampire_desecrated_sanctum", + }, + { + bloodReward: 1.5e30, + bountyIchor: 1e15, + bountyIchorClaimed: false, + currentHp: 3e30, + damagePerSecond: 1e21, + description: "A wraith that formed in the Sanctum after the desecration — made from the residual sacred energy that had nowhere to go and nothing to do but evolve.", + equipmentRewards: [ "sanctum_talisman" ], + ichorReward: 750_000, + id: "sanctum_wraith", + maxHp: 3e30, + name: "Sanctum Wraith", + siringRequirement: 5, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [], + zoneId: "vampire_desecrated_sanctum", + }, + { + bloodReward: 6e30, + bountyIchor: 2e15, + bountyIchorClaimed: false, + currentHp: 1.2e31, + damagePerSecond: 3.5e21, + description: "The individual who performed the actual desecration — who systematically stripped the Sanctum of its sacred purpose. They did not do it out of malice. They did it because they needed the space.", + equipmentRewards: [], + ichorReward: 1_000_000, + id: "desecrator", + maxHp: 1.2e31, + name: "The Desecrator", + siringRequirement: 5, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "vampire_synergy_5" ], + zoneId: "vampire_desecrated_sanctum", + }, + { + bloodReward: 2.5e31, + bountyIchor: 5e15, + bountyIchorClaimed: false, + currentHp: 5e31, + damagePerSecond: 1e22, + description: "The sovereign of the Desecrated Sanctum — the vampire who decided what the Sanctum should become, and has spent centuries ensuring it became exactly that. Whatever that is, it is not something the original builders would recognise.", + equipmentRewards: [ "sanctum_fang" ], + ichorReward: 1_500_000, + id: "sanctum_sovereign", + maxHp: 5e31, + name: "Sanctum Sovereign", + siringRequirement: 5, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "crimson_tide_3" ], + zoneId: "vampire_desecrated_sanctum", + }, + // ── Carrion Peaks ───────────────────────────────────────────────────────── + { + bloodReward: 1.25e32, + bountyIchor: 1e16, + bountyIchorClaimed: false, + currentHp: 2.5e32, + damagePerSecond: 3.5e22, + description: "A vampire who hunts the Peaks with a patience measured in decades. It selects its prey from a distance — sometimes a very large distance — and it has never been wrong about the outcome.", + equipmentRewards: [ "carrion_shroud" ], + ichorReward: 2_000_000, + id: "carrion_stalker", + maxHp: 2.5e32, + name: "Carrion Stalker", + siringRequirement: 6, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "thrall_wraith_2" ], + zoneId: "vampire_carrion_peaks", + }, + { + bloodReward: 5e32, + bountyIchor: 2e16, + bountyIchorClaimed: false, + currentHp: 1e33, + damagePerSecond: 1e23, + description: "A revenant that has roamed the Peaks since the peaks were formed. It has watched every civilization that has built things in the lowlands, and it has outlasted all of them. This neither pleases nor displeases it.", + equipmentRewards: [ "carrion_talisman" ], + ichorReward: 2_500_000, + id: "peak_revenant", + maxHp: 1e33, + name: "Peak Revenant", + siringRequirement: 6, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [], + zoneId: "vampire_carrion_peaks", + }, + { + bloodReward: 2e33, + bountyIchor: 5e16, + bountyIchorClaimed: false, + currentHp: 4e33, + damagePerSecond: 3.5e23, + description: "A vampire who evolved wings at some point in the distant past — whether through mutation, blood magic, or sheer persistent need. The wings are not decorative. They are weapons and instruments of the hunt.", + equipmentRewards: [], + ichorReward: 3_000_000, + id: "blood_eagle", + maxHp: 4e33, + name: "Blood Eagle", + siringRequirement: 6, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "predator_sense_3" ], + zoneId: "vampire_carrion_peaks", + }, + { + bloodReward: 7.5e33, + bountyIchor: 1e17, + bountyIchorClaimed: false, + currentHp: 1.5e34, + damagePerSecond: 1e24, + description: "The lord of the Carrion Peaks — a vampire whose domain is everything from the treeline upward, including airspace, and who enforces this boundary with a thoroughness that has made the Peaks one of the most effectively self-defending zones in the vampire realm.", + equipmentRewards: [ "carrion_fang" ], + ichorReward: 4_000_000, + id: "carrion_lord", + maxHp: 1.5e34, + name: "Carrion Lord", + siringRequirement: 6, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "dark_covenant_2" ], + zoneId: "vampire_carrion_peaks", + }, + // ── The Bloodspire ──────────────────────────────────────────────────────── + { + bloodReward: 3.75e34, + bountyIchor: 2e17, + bountyIchorClaimed: false, + currentHp: 7.5e34, + damagePerSecond: 3.5e24, + description: "The sentinel posted at the Spire's outermost entrance — a vampire who has adapted to the building's non-Euclidean logic and can navigate its impossible corridors instinctively.", + equipmentRewards: [ "spire_shroud" ], + ichorReward: 5_000_000, + id: "spire_sentinel", + maxHp: 7.5e34, + name: "Spire Sentinel", + siringRequirement: 6, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "eternal_thirst_1" ], + zoneId: "vampire_bloodspire", + }, + { + bloodReward: 1.5e35, + bountyIchor: 5e17, + bountyIchorClaimed: false, + currentHp: 3e35, + damagePerSecond: 1e25, + description: "The mind behind the Bloodspire's impossible architecture — a vampire who builds in blood and logic simultaneously, producing structures that follow rules they invented and do not share.", + equipmentRewards: [ "spire_talisman" ], + ichorReward: 6_000_000, + id: "blood_architect", + maxHp: 3e35, + name: "Blood Architect", + siringRequirement: 6, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [], + zoneId: "vampire_bloodspire", + }, + { + bloodReward: 6e35, + bountyIchor: 1e18, + bountyIchorClaimed: false, + currentHp: 1.2e36, + damagePerSecond: 3.5e25, + description: "The champion of the Bloodspire — a vampire who has internalized the Spire's impossible logic and weaponised it. Fighting them feels like arguing with the building.", + equipmentRewards: [], + ichorReward: 7_500_000, + id: "spire_champion", + maxHp: 1.2e36, + name: "Spire Champion", + siringRequirement: 6, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "thrall_ancient_1" ], + zoneId: "vampire_bloodspire", + }, + { + bloodReward: 2.5e36, + bountyIchor: 2e18, + bountyIchorClaimed: false, + currentHp: 5e36, + damagePerSecond: 1e26, + description: "The tyrant of the Bloodspire — a vampire who not only built this impossible place but has become its governing principle. The Spire is the Tyrant. The Tyrant is the Spire. One without the other would collapse.", + equipmentRewards: [ "spire_fang" ], + ichorReward: 10_000_000, + id: "bloodspire_tyrant", + maxHp: 5e36, + name: "Bloodspire Tyrant", + siringRequirement: 6, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "bloodline_power_1" ], + zoneId: "vampire_bloodspire", + }, + // ── Shroud of Eternity ──────────────────────────────────────────────────── + { + bloodReward: 1.25e37, + bountyIchor: 5e18, + bountyIchorClaimed: false, + currentHp: 2.5e37, + damagePerSecond: 3.5e26, + description: "A phantom that exists in the Shroud's temporal distortions — experiencing its own existence in a non-linear sequence, which has given it combat instincts that arrive before the decision to use them.", + equipmentRewards: [ "eternity_shroud" ], + ichorReward: 12_000_000, + id: "shroud_phantom", + maxHp: 2.5e37, + name: "Shroud Phantom", + siringRequirement: 7, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "apex_predator_1" ], + zoneId: "vampire_shroud_of_eternity", + }, + { + bloodReward: 5e37, + bountyIchor: 1e19, + bountyIchorClaimed: false, + currentHp: 1e38, + damagePerSecond: 1e27, + description: "A shade born in the Shroud — it has experienced all possible versions of this fight and has arranged to be in the one where it wins. Its confidence is not arrogance. It is mathematics.", + equipmentRewards: [ "eternity_talisman" ], + ichorReward: 15_000_000, + id: "eternity_shade", + maxHp: 1e38, + name: "Eternity Shade", + siringRequirement: 7, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [], + zoneId: "vampire_shroud_of_eternity", + }, + { + bloodReward: 2e38, + bountyIchor: 2e19, + bountyIchorClaimed: false, + currentHp: 4e38, + damagePerSecond: 3.5e27, + description: "The warden of the Shroud — a vampire responsible for maintaining the temporal distortions that give this region its character. Maintaining distortions at this scale has had predictable effects on the warden's own relationship with time.", + equipmentRewards: [], + ichorReward: 20_000_000, + id: "shroud_warden", + maxHp: 4e38, + name: "Shroud Warden", + siringRequirement: 7, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "dark_covenant_3" ], + zoneId: "vampire_shroud_of_eternity", + }, + { + bloodReward: 7.5e38, + bountyIchor: 5e19, + bountyIchorClaimed: false, + currentHp: 1.5e39, + damagePerSecond: 1e28, + description: "The sovereign of the Shroud — a vampire who has been here so long they have outlasted their own concept of how long they have been here. They are not immortal. They simply have not found an ending that fits yet.", + equipmentRewards: [ "shroud_fang" ], + ichorReward: 25_000_000, + id: "eternal_sovereign", + maxHp: 1.5e39, + name: "Eternal Sovereign", + siringRequirement: 7, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "eternal_thirst_2" ], + zoneId: "vampire_shroud_of_eternity", + }, + // ── The Abyssal Vault ───────────────────────────────────────────────────── + { + bloodReward: 3.75e39, + bountyIchor: 1e20, + bountyIchorClaimed: false, + currentHp: 7.5e39, + damagePerSecond: 3.5e28, + description: "The outermost guardian of the Abyssal Vault — a vampire who chose to stand here because the Vault was the one place something truly important was being protected. What the something is, the guardian will not say.", + equipmentRewards: [ "abyss_shroud" ], + ichorReward: 30_000_000, + id: "vault_guardian", + maxHp: 7.5e39, + name: "Vault Guardian", + siringRequirement: 7, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "thrall_ancient_2" ], + zoneId: "vampire_abyssal_vault", + }, + { + bloodReward: 1.5e40, + bountyIchor: 2e20, + bountyIchorClaimed: false, + currentHp: 3e40, + damagePerSecond: 1e29, + description: "A revenant that formed in the Vault's deepest chamber — made from the residue of things that were sealed away and have slowly dissolved into their component existences. It is, technically, several things at once.", + equipmentRewards: [ "abyss_talisman" ], + ichorReward: 40_000_000, + id: "abyss_revenant", + maxHp: 3e40, + name: "Abyss Revenant", + siringRequirement: 7, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [], + zoneId: "vampire_abyssal_vault", + }, + { + bloodReward: 6e40, + bountyIchor: 5e20, + bountyIchorClaimed: false, + currentHp: 1.2e41, + damagePerSecond: 3.5e29, + description: "The keeper of the Vault's inventory — a vampire who knows exactly what is stored here, in what order, and the precise consequences of each item being released. It has no intention of releasing any of them. It has a very strong intention of not being defeated.", + equipmentRewards: [], + ichorReward: 50_000_000, + id: "vault_keeper", + maxHp: 1.2e41, + name: "Vault Keeper", + siringRequirement: 7, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "blood_ascension_1" ], + zoneId: "vampire_abyssal_vault", + }, + { + bloodReward: 2.5e41, + bountyIchor: 1e21, + bountyIchorClaimed: false, + currentHp: 5e41, + damagePerSecond: 1e30, + description: "The absolute warden of the Abyssal Vault — a vampire who has made themselves into the Vault, in the same way the Bloodspire Tyrant became the Spire. The difference is the Vault contains things that should not exist. The warden has adapted to their vicinity.", + equipmentRewards: [ "abyss_fang" ], + ichorReward: 75_000_000, + id: "abyssal_warden", + maxHp: 5e41, + name: "Abyssal Warden", + siringRequirement: 7, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "eternal_thirst_3" ], + zoneId: "vampire_abyssal_vault", + }, + // ── Court of Whispers ───────────────────────────────────────────────────── + { + bloodReward: 1.25e42, + bountyIchor: 2e21, + bountyIchorClaimed: false, + currentHp: 2.5e42, + damagePerSecond: 3.5e30, + description: "A shade that operates as the Court's most deniable asset — it exists only in the peripheral vision of those it observes, and attacks only when it has achieved perfect certainty of the outcome.", + equipmentRewards: [ "whisper_shroud" ], + ichorReward: 100_000_000, + id: "whisper_shade", + maxHp: 2.5e42, + name: "Whisper Shade", + siringRequirement: 8, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "bloodline_power_2" ], + zoneId: "vampire_court_of_whispers", + }, + { + bloodReward: 5e42, + bountyIchor: 5e21, + bountyIchorClaimed: false, + currentHp: 1e43, + damagePerSecond: 1e31, + description: "A phantom that haunts the Court's most sensitive corridors, absorbing and retaining every secret spoken within a three-room radius. It is an archive that can fight back, which makes it significantly more dangerous than an archive.", + equipmentRewards: [ "whisper_talisman" ], + ichorReward: 125_000_000, + id: "court_phantom", + maxHp: 1e43, + name: "Court Phantom", + siringRequirement: 8, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [], + zoneId: "vampire_court_of_whispers", + }, + { + bloodReward: 2e43, + bountyIchor: 1e22, + bountyIchorClaimed: false, + currentHp: 4e43, + damagePerSecond: 3.5e31, + description: "A noble of the Court of Whispers who has survived through a combination of intelligence, perfect information, and the willingness to act on that information before anyone else has finished considering whether acting is appropriate.", + equipmentRewards: [], + ichorReward: 150_000_000, + id: "whisper_noble", + maxHp: 4e43, + name: "Whisper Noble", + siringRequirement: 8, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "apex_predator_2" ], + zoneId: "vampire_court_of_whispers", + }, + { + bloodReward: 7.5e43, + bountyIchor: 2e22, + bountyIchorClaimed: false, + currentHp: 1.5e44, + damagePerSecond: 1e32, + description: "The sovereign of the Court of Whispers — a vampire who is known only by their title, whose face has never been seen by any living observer, and who has been running the Court since before the current intelligence network was established. Possibly before the concept of intelligence was established.", + equipmentRewards: [ "eternal_fang" ], + ichorReward: 200_000_000, + id: "court_sovereign", + maxHp: 1.5e44, + name: "Court Sovereign", + siringRequirement: 8, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "blood_sovereignty_1" ], + zoneId: "vampire_court_of_whispers", + }, + // ── The Eternal Abyss ───────────────────────────────────────────────────── + { + bloodReward: 3.75e44, + bountyIchor: 5e22, + bountyIchorClaimed: false, + currentHp: 7.5e44, + damagePerSecond: 3.5e32, + description: "The Abyss's herald — a vampire or something that used to be a vampire that has been carrying messages from the Abyss's depths for long enough that it is no longer clear which entity is the messenger and which is the message.", + equipmentRewards: [ "eternal_shroud" ], + ichorReward: 250_000_000, + id: "abyss_herald", + maxHp: 7.5e44, + name: "Abyss Herald", + siringRequirement: 9, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "bloodline_power_3" ], + zoneId: "vampire_eternal_abyss", + }, + { + bloodReward: 1.5e45, + bountyIchor: 1e23, + bountyIchorClaimed: false, + currentHp: 3e45, + damagePerSecond: 1e33, + description: "Something that predates vampires, predates the concept of vampires, and has been in the Abyss waiting for something worth engaging with. The wait appears to be over.", + equipmentRewards: [], + ichorReward: 300_000_000, + id: "void_ancient", + maxHp: 3e45, + name: "Void Ancient", + siringRequirement: 9, + soulShardsReward: 1, + status: "locked", + upgradeRewards: [ "blood_sovereignty_2" ], + zoneId: "vampire_eternal_abyss", + }, + { + bloodReward: 6e45, + bountyIchor: 2e23, + bountyIchorClaimed: false, + currentHp: 1.2e46, + damagePerSecond: 3.5e33, + description: "A revenant of the Eternal Abyss — which means something quite different here than it does in ordinary zones. This revenant died at the edge of the Abyss and came back as something the Abyss considers normal.", + equipmentRewards: [], + ichorReward: 400_000_000, + id: "eternal_revenant", + maxHp: 1.2e46, + name: "Eternal Revenant", + siringRequirement: 9, + soulShardsReward: 3, + status: "locked", + upgradeRewards: [ "apex_predator_3" ], + zoneId: "vampire_eternal_abyss", + }, + { + bloodReward: 2.5e46, + bountyIchor: 5e23, + bountyIchorClaimed: false, + currentHp: 5e46, + damagePerSecond: 1e34, + description: "The Eternal Darkness is not a vampire. It is not a creature. It is what the Abyss decided to become when it grew tired of waiting for something worthy of its full attention. The full attention is, by most accounts, worse than the waiting.", + equipmentRewards: [], + ichorReward: 500_000_000, + id: "eternal_darkness", + maxHp: 5e46, + name: "The Eternal Darkness", + siringRequirement: 9, + soulShardsReward: 5, + status: "locked", + upgradeRewards: [ "blood_sovereignty_3", "blood_ascension_2", "bloodline_power_4" ], + zoneId: "vampire_eternal_abyss", + }, +]; diff --git a/apps/api/src/data/vampireCrafting.ts b/apps/api/src/data/vampireCrafting.ts new file mode 100644 index 0000000..03eedde --- /dev/null +++ b/apps/api/src/data/vampireCrafting.ts @@ -0,0 +1,536 @@ +/** + * @file Game data definitions. + * @copyright nhcarrigan + * @license Naomi's Public License + * @author Naomi Carrigan + */ +/* eslint-disable max-lines -- Data file */ +/* eslint-disable stylistic/max-len -- Data content */ +import type { CraftingRecipe } from "@elysium/types"; + +// Note: In vampire context, "gold_income" bonus maps to blood income, +// "essence_income" maps to ichor income, and "combat_power" maps to thrall combat power. +export const defaultVampireCraftingRecipes: Array = [ + // ── Haunted Catacombs ───────────────────────────────────────────────────── + { + bonus: { + type: "gold_income", + value: 1.1, + }, + description: "Bone dust boiled with grave essence produces a thick extract that resonates with the catacombs' ancient hunger. Those who consume it briefly see in total darkness.", + id: "bone_dust_extract", + name: "Bone Dust Extract", + requiredMaterials: [ + { materialId: "bone_dust", quantity: 3 }, + { materialId: "grave_essence", quantity: 2 }, + ], + zoneId: "vampire_haunted_catacombs", + }, + { + bonus: { + type: "combat_power", + value: 1.1, + }, + description: "Catacomb ash worked into a paste with grave essence, then applied to weapons before battle. The ash remembers every fight these tunnels have witnessed.", + id: "catacomb_tonic", + name: "Catacomb Tonic", + requiredMaterials: [ + { materialId: "catacomb_ash", quantity: 2 }, + { materialId: "grave_essence", quantity: 2 }, + ], + zoneId: "vampire_haunted_catacombs", + }, + // ── Blood Mire ──────────────────────────────────────────────────────────── + { + bonus: { + type: "gold_income", + value: 1.1, + }, + description: "Mire sludge filtered through blood moss produces a dense poultice that, when applied correctly, amplifies the feeding reflex across all thralls in range.", + id: "mire_poultice", + name: "Mire Poultice", + requiredMaterials: [ + { materialId: "mire_sludge", quantity: 3 }, + { materialId: "blood_moss", quantity: 2 }, + ], + zoneId: "vampire_blood_mire", + }, + { + bonus: { + type: "combat_power", + value: 1.1, + }, + description: "Blood moss steeped in crimson reed sap makes a foul-smelling brew that is nevertheless extremely popular before fights — it dulls pain and sharpens reflex.", + id: "blood_moss_brew", + name: "Blood Moss Brew", + requiredMaterials: [ + { materialId: "blood_moss", quantity: 3 }, + { materialId: "crimson_reed", quantity: 2 }, + ], + zoneId: "vampire_blood_mire", + }, + // ── Obsidian Keep ───────────────────────────────────────────────────────── + { + bonus: { + type: "combat_power", + value: 1.15, + }, + description: "Obsidian chips ground into a paste with iron shavings make an abrasive compound used to hone weapons. The resulting edge carries a trace of the Keep's blood magic.", + id: "obsidian_edge", + name: "Obsidian Edge Compound", + requiredMaterials: [ + { materialId: "obsidian_chip", quantity: 3 }, + { materialId: "iron_shaving", quantity: 2 }, + ], + zoneId: "vampire_obsidian_keep", + }, + { + bonus: { + type: "gold_income", + value: 1.15, + }, + description: "Keep mortar dissolved into a slurry with iron shavings creates a sealant that, when applied to the feeding chambers, prevents blood loss between hunts.", + id: "keep_mortar_mix", + name: "Keep Mortar Mix", + requiredMaterials: [ + { materialId: "keep_mortar", quantity: 1 }, + { materialId: "iron_shaving", quantity: 3 }, + ], + zoneId: "vampire_obsidian_keep", + }, + // ── Crimson Citadel ─────────────────────────────────────────────────────── + { + bonus: { + type: "gold_income", + value: 1.15, + }, + description: "Citadel stone powder mixed with blood bronze filings creates a seal that, when pressed into the architecture of a feeding ground, amplifies the blood yield of the space.", + id: "citadel_seal", + name: "Citadel Seal", + requiredMaterials: [ + { materialId: "citadel_stone", quantity: 2 }, + { materialId: "blood_bronze", quantity: 2 }, + ], + zoneId: "vampire_crimson_citadel", + }, + { + bonus: { + type: "combat_power", + value: 1.2, + }, + description: "Crimson silk wrapped around weapons before battle absorbs moonlight during the process. Thralls armed with these wrapped weapons fight with unusual composure.", + id: "crimson_silk_wrap", + name: "Crimson Silk Wrap", + requiredMaterials: [ + { materialId: "crimson_silk", quantity: 1 }, + { materialId: "blood_bronze", quantity: 3 }, + ], + zoneId: "vampire_crimson_citadel", + }, + // ── Shadow Court ────────────────────────────────────────────────────────── + { + bonus: { + type: "gold_income", + value: 1.2, + }, + description: "Shadow thread woven into a net and suspended over feeding grounds creates an obscuring field that encourages prey to walk toward the hunter.", + id: "shadow_thread_weave", + name: "Shadow Thread Weave", + requiredMaterials: [ + { materialId: "shadow_thread", quantity: 4 }, + { materialId: "whisper_ink", quantity: 1 }, + ], + zoneId: "vampire_shadow_court", + }, + { + bonus: { + type: "essence_income", + value: 1.2, + }, + description: "Whisper ink recorded with secrets about the ichor trade and sealed with court wax. Reading it reveals techniques for extracting greater ichor yield during the siring rite.", + id: "whisper_ink_tome", + name: "Whisper Ink Tome", + requiredMaterials: [ + { materialId: "whisper_ink", quantity: 2 }, + { materialId: "court_wax", quantity: 1 }, + ], + zoneId: "vampire_shadow_court", + }, + // ── Plague Ossuary ──────────────────────────────────────────────────────── + { + bonus: { + type: "combat_power", + value: 1.2, + }, + description: "Plague ash worked into a paste with ossuary resin and applied to thrall weapons before battle. The pestilence that lingers in the ash makes opponents hesitate.", + id: "plague_ash_remedy", + name: "Plague Ash Weapon Coat", + requiredMaterials: [ + { materialId: "plague_ash", quantity: 3 }, + { materialId: "ossuary_resin", quantity: 1 }, + ], + zoneId: "vampire_plague_ossuary", + }, + { + bonus: { + type: "gold_income", + value: 1.2, + }, + description: "Infected bone ground down and mixed with ossuary resin creates a sealant for feeding vessels that prevents spoilage and stretches each harvest considerably further.", + id: "ossuary_resin_coat", + name: "Ossuary Preservation Coat", + requiredMaterials: [ + { materialId: "infected_bone", quantity: 2 }, + { materialId: "ossuary_resin", quantity: 2 }, + ], + zoneId: "vampire_plague_ossuary", + }, + // ── Ashen Wastes ────────────────────────────────────────────────────────── + { + bonus: { + type: "combat_power", + value: 1.25, + }, + description: "Volatile compounds produced when volcanic ash and cinder crystals are combined make an excellent weapon coating — the resulting strike burns in ways cold steel cannot.", + id: "volcanic_ash_bomb", + name: "Volcanic Ash Bomb", + requiredMaterials: [ + { materialId: "volcanic_ash", quantity: 3 }, + { materialId: "cinder_crystal", quantity: 2 }, + ], + zoneId: "vampire_ashen_wastes", + }, + { + bonus: { + type: "gold_income", + value: 1.25, + }, + description: "Ashen cloth soaked in volcanic ash produces a wrapping for the body that insulates against heat and disperses the blood-scent of the wearer, making them harder to detect.", + id: "ashen_cloth_wrap", + name: "Ashen Cloth Wrapping", + requiredMaterials: [ + { materialId: "ashen_cloth", quantity: 2 }, + { materialId: "volcanic_ash", quantity: 3 }, + ], + zoneId: "vampire_ashen_wastes", + }, + // ── The Iron Gaol ───────────────────────────────────────────────────────── + { + bonus: { + type: "combat_power", + value: 1.3, + }, + description: "Iron rivets combined with a length of chain link produce a weapon wrap that adds both weight and containment glyph resonance to every strike.", + id: "iron_chain_shackle", + name: "Iron Chain Shackle", + requiredMaterials: [ + { materialId: "iron_rivet", quantity: 3 }, + { materialId: "chain_link", quantity: 2 }, + ], + zoneId: "vampire_iron_gaol", + }, + { + bonus: { + type: "gold_income", + value: 1.3, + }, + description: "Gaol stone ground and packed with iron rivets into a floor-sealing mortar. The despair absorbed into the stone makes the feeding ground more effective at producing passive blood.", + id: "gaol_stone_mortar", + name: "Gaol Stone Mortar", + requiredMaterials: [ + { materialId: "gaol_stone", quantity: 1 }, + { materialId: "iron_rivet", quantity: 4 }, + ], + zoneId: "vampire_iron_gaol", + }, + // ── Veilborn Hollow ─────────────────────────────────────────────────────── + { + bonus: { + type: "gold_income", + value: 1.3, + }, + description: "Veil thread woven through the structure of a feeding ground creates small tears in the boundary between worlds. Blood that passes through these tears is somehow more potent.", + id: "veil_thread_weave", + name: "Veil Thread Weave", + requiredMaterials: [ + { materialId: "veil_thread", quantity: 4 }, + { materialId: "hollow_crystal", quantity: 1 }, + ], + zoneId: "vampire_veilborn_hollow", + }, + { + bonus: { + type: "combat_power", + value: 1.3, + }, + description: "Phantom dust mixed with hollow crystal powder creates a potion that, when consumed, allows thralls to partially phase during the first moments of a fight — before the enemy can react.", + id: "phantom_dust_potion", + name: "Phantom Dust Potion", + requiredMaterials: [ + { materialId: "phantom_dust", quantity: 1 }, + { materialId: "hollow_crystal", quantity: 3 }, + ], + zoneId: "vampire_veilborn_hollow", + }, + // ── Moonless Moor ───────────────────────────────────────────────────────── + { + bonus: { + type: "gold_income", + value: 1.35, + }, + description: "Moor peat rendered with fog essence produces a slow-burning fuel that warms the feeding ground whilst simultaneously obscuring its location from outsiders.", + id: "moor_peat_tonic", + name: "Moor Peat Fuel", + requiredMaterials: [ + { materialId: "moor_peat", quantity: 3 }, + { materialId: "fog_essence", quantity: 2 }, + ], + zoneId: "vampire_moonless_moor", + }, + { + bonus: { + type: "combat_power", + value: 1.35, + }, + description: "A brew of night bloom petals steeped in fog essence produces a drink that heightens the predator's senses to impossible levels for a brief, battle-winning window.", + id: "fog_essence_brew", + name: "Fog Essence Brew", + requiredMaterials: [ + { materialId: "fog_essence", quantity: 3 }, + { materialId: "night_bloom", quantity: 1 }, + ], + zoneId: "vampire_moonless_moor", + }, + // ── The Sunken Crypt ────────────────────────────────────────────────────── + { + bonus: { + type: "gold_income", + value: 1.4, + }, + description: "Sunken stone coated in drowned silk becomes a permanent feeding vessel — the silk prevents evaporation and the stone's porous structure allows remarkable volume.", + id: "sunken_stone_seal", + name: "Sunken Stone Vessel", + requiredMaterials: [ + { materialId: "sunken_stone", quantity: 2 }, + { materialId: "drowned_silk", quantity: 2 }, + ], + zoneId: "vampire_sunken_crypt", + }, + { + bonus: { + type: "essence_income", + value: 1.4, + }, + description: "Deep amber dissolved in a solvent derived from sunken stone — the resulting extract amplifies ichor yield during siring by resonating with the amber's preserved fragments.", + id: "deep_amber_extract", + name: "Deep Amber Extract", + requiredMaterials: [ + { materialId: "deep_amber", quantity: 1 }, + { materialId: "sunken_stone", quantity: 3 }, + ], + zoneId: "vampire_sunken_crypt", + }, + // ── Desecrated Sanctum ──────────────────────────────────────────────────── + { + bonus: { + type: "combat_power", + value: 1.4, + }, + description: "Defiled marble carved into a totem and inscribed with dark incense smoke. The desecrated memory in the marble makes it an effective focus for battle rites.", + id: "defiled_marble_totem", + name: "Defiled Marble Totem", + requiredMaterials: [ + { materialId: "defiled_marble", quantity: 3 }, + { materialId: "dark_incense", quantity: 1 }, + ], + zoneId: "vampire_desecrated_sanctum", + }, + { + bonus: { + type: "gold_income", + value: 1.4, + }, + description: "Dark incense burned in a vessel made of sanctum glass creates a ritual smoke that saturates a feeding ground with the hunger of the desecrated, amplifying all blood yield.", + id: "dark_incense_ritual", + name: "Dark Incense Ritual", + requiredMaterials: [ + { materialId: "dark_incense", quantity: 2 }, + { materialId: "sanctum_glass", quantity: 2 }, + ], + zoneId: "vampire_desecrated_sanctum", + }, + // ── Carrion Peaks ───────────────────────────────────────────────────────── + { + bonus: { + type: "combat_power", + value: 1.45, + }, + description: "Carrion bone worked into a talisman and inlaid with peak crystal shards creates a focus for the predator's instinct — thralls carrying it fight with the certainty of the high hunt.", + id: "carrion_bone_talisman", + name: "Carrion Bone Talisman", + requiredMaterials: [ + { materialId: "carrion_bone", quantity: 3 }, + { materialId: "peak_crystal", quantity: 2 }, + ], + zoneId: "vampire_carrion_peaks", + }, + { + bonus: { + type: "gold_income", + value: 1.45, + }, + description: "Blood obsidian edges ground from peak crystal and bonded to carrion bone handles — weapons that are as much ritual object as instrument of predation.", + id: "blood_obsidian_edge", + name: "Blood Obsidian Edge", + requiredMaterials: [ + { materialId: "blood_obsidian", quantity: 1 }, + { materialId: "peak_crystal", quantity: 3 }, + ], + zoneId: "vampire_carrion_peaks", + }, + // ── The Bloodspire ──────────────────────────────────────────────────────── + { + bonus: { + type: "gold_income", + value: 1.5, + }, + description: "Spire stone carved into a seal and inscribed with blood crystal resonance. When placed at the centre of a feeding ground, it draws blood from the surrounding area passively.", + id: "spire_stone_seal", + name: "Spire Stone Seal", + requiredMaterials: [ + { materialId: "spire_stone", quantity: 3 }, + { materialId: "blood_crystal", quantity: 2 }, + ], + zoneId: "vampire_bloodspire", + }, + { + bonus: { + type: "essence_income", + value: 1.5, + }, + description: "Ancient gore dissolved in a blood crystal suspension — a highly potent ichor catalyst that resonates with the Spire's pre-existing blood magic to enhance ichor production dramatically.", + id: "blood_crystal_extract", + name: "Blood Crystal Extract", + requiredMaterials: [ + { materialId: "blood_crystal", quantity: 3 }, + { materialId: "ancient_gore", quantity: 1 }, + ], + zoneId: "vampire_bloodspire", + }, + // ── Shroud of Eternity ──────────────────────────────────────────────────── + { + bonus: { + type: "gold_income", + value: 1.5, + }, + description: "Eternity thread woven through a feeding space creates a temporal fold that causes each feeding to last slightly longer than it should. The blood never quite finishes flowing.", + id: "eternity_thread_weave", + name: "Eternity Thread Weave", + requiredMaterials: [ + { materialId: "eternity_thread", quantity: 4 }, + { materialId: "shroud_dust", quantity: 2 }, + ], + zoneId: "vampire_shroud_of_eternity", + }, + { + bonus: { + type: "combat_power", + value: 1.5, + }, + description: "Timeless amber dissolved and reset in a shroud dust medium creates a capsule that, when broken before battle, briefly accelerates the thrall's perception of time.", + id: "timeless_amber_brew", + name: "Timeless Amber Brew", + requiredMaterials: [ + { materialId: "timeless_amber", quantity: 1 }, + { materialId: "shroud_dust", quantity: 3 }, + ], + zoneId: "vampire_shroud_of_eternity", + }, + // ── The Abyssal Vault ───────────────────────────────────────────────────── + { + bonus: { + type: "gold_income", + value: 1.6, + }, + description: "Abyssal stone inscribed with void crystal dust creates a seal that, when placed in a feeding ground, creates a pocket of absolute silence — prey within it cannot call for help.", + id: "abyssal_stone_seal", + name: "Abyssal Stone Seal", + requiredMaterials: [ + { materialId: "abyssal_stone", quantity: 3 }, + { materialId: "void_crystal", quantity: 2 }, + ], + zoneId: "vampire_abyssal_vault", + }, + { + bonus: { + type: "combat_power", + value: 1.6, + }, + description: "Void crystal ground and bonded to vault iron makes a weapon component that strikes with the force of absolute inevitability — opponents don't question whether they will fall, only when.", + id: "void_crystal_totem", + name: "Void Crystal Weapon Core", + requiredMaterials: [ + { materialId: "void_crystal", quantity: 2 }, + { materialId: "vault_iron", quantity: 2 }, + ], + zoneId: "vampire_abyssal_vault", + }, + // ── Court of Whispers ───────────────────────────────────────────────────── + { + bonus: { + type: "essence_income", + value: 1.6, + }, + description: "Whisper parchment inscribed with silent ink contains the distilled knowledge of the Court's ichor trade. Reading it aloud triggers a resonance that permanently enhances ichor yield.", + id: "whisper_parchment_tome", + name: "Whisper Parchment Tome", + requiredMaterials: [ + { materialId: "whisper_parchment", quantity: 2 }, + { materialId: "silent_ink", quantity: 2 }, + ], + zoneId: "vampire_court_of_whispers", + }, + { + bonus: { + type: "gold_income", + value: 1.6, + }, + description: "Silent ink mixed with court crystal powder creates a medium for a feeding ritual that cannot be detected by anyone not already participating — the blood flows and no one outside knows.", + id: "silent_ink_ritual", + name: "Silent Ink Ritual", + requiredMaterials: [ + { materialId: "silent_ink", quantity: 1 }, + { materialId: "court_crystal", quantity: 3 }, + ], + zoneId: "vampire_court_of_whispers", + }, + // ── The Eternal Abyss ───────────────────────────────────────────────────── + { + bonus: { + type: "gold_income", + value: 1.75, + }, + description: "Void essence rendered in an eternal crystal medium produces a brew of impossible potency. Something about the combination makes every subsequent feeding feel like the first — and the first is always the best.", + id: "void_essence_brew", + name: "Void Essence Brew", + requiredMaterials: [ + { materialId: "void_essence", quantity: 3 }, + { materialId: "eternal_crystal", quantity: 2 }, + ], + zoneId: "vampire_eternal_abyss", + }, + { + bonus: { + type: "essence_income", + value: 1.75, + }, + description: "An eternal crystal seal made with primordial ash creates a focus for ichor resonance that has no upper bound — the older the vampire who sets it, the more it yields.", + id: "eternal_crystal_seal", + name: "Eternal Crystal Seal", + requiredMaterials: [ + { materialId: "eternal_crystal", quantity: 3 }, + { materialId: "primordial_ash", quantity: 1 }, + ], + zoneId: "vampire_eternal_abyss", + }, +]; diff --git a/apps/api/src/data/vampireEquipment.ts b/apps/api/src/data/vampireEquipment.ts new file mode 100644 index 0000000..5fffcba --- /dev/null +++ b/apps/api/src/data/vampireEquipment.ts @@ -0,0 +1,624 @@ +/** + * @file Game data definitions. + * @copyright nhcarrigan + * @license Naomi's Public License + * @author Naomi Carrigan + */ +/* eslint-disable max-lines -- Data file */ +/* eslint-disable stylistic/max-len -- Data content */ +import type { VampireEquipment } from "@elysium/types"; + +export const defaultVampireEquipment: Array = [ + // ── Fangs — Common ──────────────────────────────────────────────────────── + { + bonus: { bloodMultiplier: 1.08 }, + cost: { blood: 200, ichor: 0, soulShards: 0 }, + description: "A fragment of a broken fang, still sharp enough to count. Not impressive, but real.", + equipped: false, + id: "shard_fang", + name: "Shard Fang", + owned: false, + rarity: "common", + setId: "catacombs_hunter", + type: "fang", + }, + { + bonus: { bloodMultiplier: 1.1 }, + cost: { blood: 500, ichor: 0, soulShards: 0 }, + description: "A fang steeped in old blood until the metal absorbed the flavour. Every hunt feels more intentional wearing this.", + equipped: false, + id: "blood_fang", + name: "Blood Fang", + owned: false, + rarity: "common", + setId: "catacombs_hunter", + type: "fang", + }, + { + bonus: { bloodMultiplier: 1.08, combatMultiplier: 1.05 }, + cost: { blood: 1_500, ichor: 0, soulShards: 0 }, + description: "Ground from a warlord's tooth, this fang has seen three centuries of campaigns. Its edge is still perfect.", + equipped: false, + id: "war_fang", + name: "War Fang", + owned: false, + rarity: "common", + setId: "blood_stalker", + type: "fang", + }, + { + bonus: { bloodMultiplier: 1.12 }, + cost: { blood: 4_000, ichor: 0, soulShards: 0 }, + description: "Carved from volcanic obsidian, this fang channels the Keep's stored blood magic into every hunt.", + equipped: false, + id: "obsidian_fang", + name: "Obsidian Fang", + owned: false, + rarity: "common", + setId: "blood_stalker", + type: "fang", + }, + { + bonus: { bloodMultiplier: 1.15 }, + cost: { blood: 12_000, ichor: 2, soulShards: 0 }, + description: "A fang cut from the Citadel's bone-archive. It thrums with the accumulated authority of centuries of dynasty.", + equipped: false, + id: "crimson_fang", + name: "Crimson Fang", + owned: false, + rarity: "common", + setId: "crimson_regent", + type: "fang", + }, + { + bonus: { bloodMultiplier: 1.1, combatMultiplier: 1.08 }, + cost: { blood: 35_000, ichor: 5, soulShards: 0 }, + description: "This fang was honed in shadow — literally. The edge holds a darkness that does not catch light.", + equipped: false, + id: "shadow_fang", + name: "Shadow Fang", + owned: false, + rarity: "common", + setId: "crimson_regent", + type: "fang", + }, + // ── Fangs — Rare ────────────────────────────────────────────────────────── + { + bonus: { bloodMultiplier: 1.18, combatMultiplier: 1.1 }, + description: "Cultivated in a plague environment over a decade. The pestilence in the material amplifies every hunt's yield.", + equipped: false, + id: "plague_fang", + name: "Plague Fang", + owned: false, + rarity: "rare", + setId: "plague_bringer", + type: "fang", + }, + { + bonus: { bloodMultiplier: 1.2, combatMultiplier: 1.12 }, + description: "Hardened in the Ashen Wastes' perpetual fires. The material does not conduct heat. It conducts hunger.", + equipped: false, + id: "ashen_fang", + name: "Ashen Fang", + owned: false, + rarity: "rare", + setId: "plague_bringer", + type: "fang", + }, + { + bonus: { bloodMultiplier: 1.15, combatMultiplier: 1.15 }, + description: "Forged in the Iron Gaol's containment forges. Each containment glyph etched into the metal amplifies combat efficiency.", + equipped: false, + id: "iron_fang", + name: "Iron Fang", + owned: false, + rarity: "rare", + setId: "iron_jailer", + type: "fang", + }, + { + bonus: { bloodMultiplier: 1.22, combatMultiplier: 1.1 }, + description: "A fang woven from veil-thread and bonded crystal. It phases slightly during each hunt, allowing it to feed from multiple layers of existence simultaneously.", + equipped: false, + id: "veil_fang", + name: "Veil Fang", + owned: false, + rarity: "rare", + setId: "iron_jailer", + type: "fang", + }, + { + bonus: { bloodMultiplier: 1.25, combatMultiplier: 1.12 }, + description: "Shaped in absolute darkness and attuned to bloodscent rather than sight. Works twice as well in places where eyes are useless.", + equipped: false, + id: "moonless_fang", + name: "Moonless Fang", + owned: false, + rarity: "rare", + setId: "moonlit_predator", + type: "fang", + }, + { + bonus: { bloodMultiplier: 1.28, combatMultiplier: 1.1 }, + description: "Recovered from a sealed chamber in the sunken depths. The pressure has made it denser than anything forged at surface level.", + equipped: false, + id: "sunken_fang", + name: "Sunken Fang", + owned: false, + rarity: "rare", + setId: "moonlit_predator", + type: "fang", + }, + // ── Fangs — Epic ────────────────────────────────────────────────────────── + { + bonus: { bloodMultiplier: 1.35, combatMultiplier: 1.2 }, + description: "Salvaged from the Desecrated Sanctum's altar chamber. The sacred energy has not dissipated — it has inverted. This fang feeds on faith.", + equipped: false, + id: "sanctum_fang", + name: "Sanctum Fang", + owned: false, + rarity: "epic", + setId: "sanctum_desecrator", + type: "fang", + }, + { + bonus: { bloodMultiplier: 1.4, combatMultiplier: 1.25 }, + description: "Cut from the remains of a great peak-predator. The thing this came from hunted elder vampires for sport. The fang remembers.", + equipped: false, + id: "carrion_fang", + name: "Carrion Fang", + owned: false, + rarity: "epic", + setId: "sanctum_desecrator", + type: "fang", + }, + { + bonus: { bloodMultiplier: 1.45, combatMultiplier: 1.3 }, + description: "Grown from the Bloodspire's crystallised wall material — it is, in a literal sense, a fang of the building itself. The Spire does not stop growing, and neither does this fang's appetite.", + equipped: false, + id: "spire_fang", + name: "Spire Fang", + owned: false, + rarity: "epic", + setId: "eternal_tyrant", + type: "fang", + }, + { + bonus: { bloodMultiplier: 1.5, combatMultiplier: 1.3 }, + description: "A fang shaped from eternity thread and hardened in the Shroud's temporal compression. Strikes made with it land slightly before the target expects them.", + equipped: false, + id: "shroud_fang", + name: "Shroud Fang", + owned: false, + rarity: "epic", + setId: "eternal_tyrant", + type: "fang", + }, + // ── Fangs — Legendary ───────────────────────────────────────────────────── + { + bonus: { bloodMultiplier: 1.6, combatMultiplier: 1.4, ichorMultiplier: 1.2 }, + description: "Forged in the Vault's deepest chamber from void crystal and vault iron. It exists in a state of permanent readiness that does not require sharpening, maintenance, or sleep.", + equipped: false, + id: "abyss_fang", + name: "Abyss Fang", + owned: false, + rarity: "legendary", + setId: "void_sovereign", + type: "fang", + }, + { + bonus: { bloodMultiplier: 1.75, combatMultiplier: 1.5, ichorMultiplier: 1.3 }, + description: "A fang that came from the Eternal Abyss — or rather, from something that has always been there, watching. It feeds on everything and remembers every meal.", + equipped: false, + id: "eternal_fang", + name: "Eternal Fang", + owned: false, + rarity: "legendary", + setId: "void_sovereign", + type: "fang", + }, + // ── Shrouds — Common ────────────────────────────────────────────────────── + { + bonus: { combatMultiplier: 1.08 }, + cost: { blood: 200, ichor: 0, soulShards: 0 }, + description: "A worn burial cloth repurposed as armour. Humble, patched, and surprisingly effective at stopping things that should not be stopped.", + equipped: false, + id: "tattered_shroud", + name: "Tattered Shroud", + owned: false, + rarity: "common", + setId: "catacombs_hunter", + type: "shroud", + }, + { + bonus: { bloodMultiplier: 1.05, combatMultiplier: 1.08 }, + cost: { blood: 500, ichor: 0, soulShards: 0 }, + description: "A cloak soaked in old blood until the fabric absorbed properties that new cloth simply does not have.", + equipped: false, + id: "blood_shroud", + name: "Blood Shroud", + owned: false, + rarity: "common", + setId: "catacombs_hunter", + type: "shroud", + }, + { + bonus: { combatMultiplier: 1.1 }, + cost: { blood: 1_500, ichor: 0, soulShards: 0 }, + description: "Cut from volcanic obsidian-fibre and stitched with iron thread. It does not stop blows — it returns them.", + equipped: false, + id: "obsidian_shroud", + name: "Obsidian Shroud", + owned: false, + rarity: "common", + setId: "blood_stalker", + type: "shroud", + }, + { + bonus: { combatMultiplier: 1.12, bloodMultiplier: 1.05 }, + cost: { blood: 4_000, ichor: 0, soulShards: 0 }, + description: "Woven from threads dyed in the Citadel's blood-tanneries. The crimson never fades. Neither does the authority it implies.", + equipped: false, + id: "crimson_shroud", + name: "Crimson Shroud", + owned: false, + rarity: "common", + setId: "blood_stalker", + type: "shroud", + }, + { + bonus: { combatMultiplier: 1.12, bloodMultiplier: 1.08 }, + cost: { blood: 12_000, ichor: 2, soulShards: 0 }, + description: "Woven entirely from shadow thread. A skilled observer would say it moves before the wearer does — a less skilled observer would simply not notice the wearer at all.", + equipped: false, + id: "shadow_shroud", + name: "Shadow Shroud", + owned: false, + rarity: "common", + setId: "crimson_regent", + type: "shroud", + }, + { + bonus: { combatMultiplier: 1.15, bloodMultiplier: 1.08 }, + cost: { blood: 35_000, ichor: 5, soulShards: 0 }, + description: "Treated with plague compounds until the fabric has developed its own kind of patience. Wearing it keeps opponents at arm's length, quite literally.", + equipped: false, + id: "plague_shroud", + name: "Plague Shroud", + owned: false, + rarity: "common", + setId: "crimson_regent", + type: "shroud", + }, + // ── Shrouds — Rare ──────────────────────────────────────────────────────── + { + bonus: { combatMultiplier: 1.2, bloodMultiplier: 1.1 }, + description: "Woven from ashen cloth and cinder-crystal thread. It does not burn. Opponents who try to burn the wearer discover this too late.", + equipped: false, + id: "ashen_shroud", + name: "Ashen Shroud", + owned: false, + rarity: "rare", + setId: "plague_bringer", + type: "shroud", + }, + { + bonus: { combatMultiplier: 1.22, bloodMultiplier: 1.1 }, + description: "Woven from chain-link thread recovered from the Gaol's deepest holding cells. Each link carries a containment glyph that now works against those who attack the wearer.", + equipped: false, + id: "iron_shroud", + name: "Iron Shroud", + owned: false, + rarity: "rare", + setId: "plague_bringer", + type: "shroud", + }, + { + bonus: { combatMultiplier: 1.2, bloodMultiplier: 1.15 }, + description: "Woven from veil thread and phantom-dust infused silk. It flickers between solid and not quite solid, making it very difficult to land a decisive blow against the wearer.", + equipped: false, + id: "veil_shroud", + name: "Veil Shroud", + owned: false, + rarity: "rare", + setId: "iron_jailer", + type: "shroud", + }, + { + bonus: { combatMultiplier: 1.25, bloodMultiplier: 1.12 }, + description: "Made from moor peat-treated fabric, this shroud absorbs and dissipates kinetic energy in ways that no one has been able to explain satisfactorily.", + equipped: false, + id: "moor_shroud", + name: "Moor Shroud", + owned: false, + rarity: "rare", + setId: "iron_jailer", + type: "shroud", + }, + { + bonus: { combatMultiplier: 1.28, bloodMultiplier: 1.12 }, + description: "Woven from drowned silk and sunken stone fibre. The pressure of the depths has been incorporated into every thread — this garment is under constant compression.", + equipped: false, + id: "sunken_shroud", + name: "Sunken Shroud", + owned: false, + rarity: "rare", + setId: "moonlit_predator", + type: "shroud", + }, + { + bonus: { combatMultiplier: 1.3, bloodMultiplier: 1.15 }, + description: "Salvaged from the Sanctum's vestry — garments that were once sacred and have since been repurposed, without apology, into something entirely different.", + equipped: false, + id: "sanctum_shroud", + name: "Sanctum Shroud", + owned: false, + rarity: "rare", + setId: "moonlit_predator", + type: "shroud", + }, + // ── Shrouds — Epic ──────────────────────────────────────────────────────── + { + bonus: { combatMultiplier: 1.35, bloodMultiplier: 1.2 }, + description: "Woven from carrion bone fragments and peak crystal thread. This garment was assembled at altitude, in conditions where most vampires would not survive, by a craftsperson who clearly had opinions about structural integrity.", + equipped: false, + id: "carrion_shroud", + name: "Carrion Shroud", + owned: false, + rarity: "epic", + setId: "sanctum_desecrator", + type: "shroud", + }, + { + bonus: { combatMultiplier: 1.4, bloodMultiplier: 1.25 }, + description: "The Bloodspire's architects would recognise their own work in this garment. It was made from the same crystallised blood-material as the building, and it follows the same impossible logic.", + equipped: false, + id: "spire_shroud", + name: "Spire Shroud", + owned: false, + rarity: "epic", + setId: "sanctum_desecrator", + type: "shroud", + }, + { + bonus: { combatMultiplier: 1.45, bloodMultiplier: 1.3 }, + description: "Woven from eternity thread and shroud dust, this garment exists slightly out of sync with the present moment. Blows land where the wearer was, not where the wearer is.", + equipped: false, + id: "eternity_shroud", + name: "Eternity Shroud", + owned: false, + rarity: "epic", + setId: "eternal_tyrant", + type: "shroud", + }, + { + bonus: { combatMultiplier: 1.5, bloodMultiplier: 1.3, ichorMultiplier: 1.1 }, + description: "The garment of someone who has been to the edge of the known world and found the edge wanting. It absorbs damage from an existential weariness that precedes the arrival of the blow.", + equipped: false, + id: "abyss_shroud", + name: "Abyss Shroud", + owned: false, + rarity: "epic", + setId: "eternal_tyrant", + type: "shroud", + }, + // ── Shrouds — Legendary ─────────────────────────────────────────────────── + { + bonus: { combatMultiplier: 1.55, bloodMultiplier: 1.4, ichorMultiplier: 1.2 }, + description: "Woven from the Court's most closely held thread — shadow and whisper and silence all at once. To wear this is to become genuinely difficult to locate, let alone fight.", + equipped: false, + id: "whisper_shroud", + name: "Whisper Shroud", + owned: false, + rarity: "legendary", + setId: "void_sovereign", + type: "shroud", + }, + { + bonus: { combatMultiplier: 1.7, bloodMultiplier: 1.5, ichorMultiplier: 1.3 }, + description: "A shroud woven from the fabric of the Eternal Abyss — the void itself, shaped into something that can be worn. It does not protect the wearer. It convinces the universe not to bother attacking.", + equipped: false, + id: "eternal_shroud", + name: "Eternal Shroud", + owned: false, + rarity: "legendary", + setId: "void_sovereign", + type: "shroud", + }, + // ── Talismans — Common ──────────────────────────────────────────────────── + { + bonus: { combatMultiplier: 1.06, bloodMultiplier: 1.06 }, + cost: { blood: 200, ichor: 0, soulShards: 0 }, + description: "A talisman carved from catacomb bone. Every vampire starts somewhere. Most of them start here.", + equipped: false, + id: "bone_talisman", + name: "Bone Talisman", + owned: false, + rarity: "common", + setId: "catacombs_hunter", + type: "talisman", + }, + { + bonus: { bloodMultiplier: 1.1 }, + cost: { blood: 500, ichor: 0, soulShards: 0 }, + description: "A talisman sealed with old blood until the material has become as much blood as bone. It resonates with the hunt.", + equipped: false, + id: "blood_talisman", + name: "Blood Talisman", + owned: false, + rarity: "common", + setId: "blood_stalker", + type: "talisman", + }, + { + bonus: { bloodMultiplier: 1.1, combatMultiplier: 1.05 }, + cost: { blood: 1_500, ichor: 0, soulShards: 0 }, + description: "Carved from obsidian chip and iron shaving bonded together. The resulting piece is heavier than it looks and radiates a faint warmth.", + equipped: false, + id: "obsidian_talisman", + name: "Obsidian Talisman", + owned: false, + rarity: "common", + setId: "blood_stalker", + type: "talisman", + }, + { + bonus: { bloodMultiplier: 1.12, combatMultiplier: 1.06 }, + cost: { blood: 4_000, ichor: 0, soulShards: 0 }, + description: "A talisman carrying the Citadel's seal — the weight of centuries of dynasty compressed into a small, heavy object.", + equipped: false, + id: "crimson_talisman", + name: "Crimson Talisman", + owned: false, + rarity: "common", + setId: "crimson_regent", + type: "talisman", + }, + { + bonus: { bloodMultiplier: 1.1, combatMultiplier: 1.1 }, + cost: { blood: 12_000, ichor: 2, soulShards: 0 }, + description: "A talisman sealed with court wax and whisper ink. It carries a secret, but will not tell you what it is.", + equipped: false, + id: "shadow_talisman", + name: "Shadow Talisman", + owned: false, + rarity: "common", + setId: "crimson_regent", + type: "talisman", + }, + // ── Talismans — Rare ────────────────────────────────────────────────────── + { + bonus: { bloodMultiplier: 1.15, combatMultiplier: 1.12 }, + description: "A talisman cultivated in the Ossuary's most contaminated wing. It smells wrong. It works very well.", + equipped: false, + id: "plague_talisman", + name: "Plague Talisman", + owned: false, + rarity: "rare", + setId: "plague_bringer", + type: "talisman", + }, + { + bonus: { bloodMultiplier: 1.18, combatMultiplier: 1.12 }, + description: "A talisman of volcanic ash and cinder crystal, formed in the Wastes' fire. It does not cool down.", + equipped: false, + id: "ashen_talisman", + name: "Ashen Talisman", + owned: false, + rarity: "rare", + setId: "plague_bringer", + type: "talisman", + }, + { + bonus: { bloodMultiplier: 1.15, combatMultiplier: 1.18 }, + description: "Forged from a chain link and an iron rivet, inscribed with every containment glyph used in the Gaol. The talisman contains the wearer's enemies.", + equipped: false, + id: "iron_talisman", + name: "Iron Talisman", + owned: false, + rarity: "rare", + setId: "iron_jailer", + type: "talisman", + }, + { + bonus: { bloodMultiplier: 1.2, combatMultiplier: 1.15 }, + description: "A hollow crystal sealed with phantom dust and veil thread. Looking into it, you see the same location you are standing in, but empty — and something looking back.", + equipped: false, + id: "veil_talisman", + name: "Veil Talisman", + owned: false, + rarity: "rare", + setId: "iron_jailer", + type: "talisman", + }, + { + bonus: { bloodMultiplier: 1.22, combatMultiplier: 1.15 }, + description: "Made from compressed moor peat and night bloom extract. The resulting piece does not emit any light whatsoever, which is somehow more alarming than if it glowed.", + equipped: false, + id: "moor_talisman", + name: "Moor Talisman", + owned: false, + rarity: "rare", + setId: "moonlit_predator", + type: "talisman", + }, + { + bonus: { bloodMultiplier: 1.25, combatMultiplier: 1.18 }, + description: "A deep amber talisman recovered from the Sunken Crypt. The thing preserved inside it is still moving. Very slowly.", + equipped: false, + id: "sunken_talisman", + name: "Sunken Talisman", + owned: false, + rarity: "rare", + setId: "moonlit_predator", + type: "talisman", + }, + // ── Talismans — Epic ────────────────────────────────────────────────────── + { + bonus: { bloodMultiplier: 1.3, combatMultiplier: 1.22, ichorMultiplier: 1.1 }, + description: "A talisman cut from defiled marble and sealed with dark incense. It carries the Sanctum's inverted purpose — it does not protect the wearer from the dark. It amplifies it.", + equipped: false, + id: "sanctum_talisman", + name: "Sanctum Talisman", + owned: false, + rarity: "epic", + setId: "sanctum_desecrator", + type: "talisman", + }, + { + bonus: { bloodMultiplier: 1.35, combatMultiplier: 1.25, ichorMultiplier: 1.1 }, + description: "Blood obsidian carved into a talisman at the summit of Carrion Peaks. Something about altitude and blood obsidian together creates a resonance that neither material possesses alone.", + equipped: false, + id: "carrion_talisman", + name: "Carrion Talisman", + owned: false, + rarity: "epic", + setId: "sanctum_desecrator", + type: "talisman", + }, + { + bonus: { bloodMultiplier: 1.4, combatMultiplier: 1.3, ichorMultiplier: 1.15 }, + description: "A blood crystal and spire stone talisman that pulses in rhythm with the Bloodspire's beating heart — if the Spire has one. It seems, somehow, likely.", + equipped: false, + id: "spire_talisman", + name: "Spire Talisman", + owned: false, + rarity: "epic", + setId: "eternal_tyrant", + type: "talisman", + }, + { + bonus: { bloodMultiplier: 1.45, combatMultiplier: 1.3, ichorMultiplier: 1.2 }, + description: "A timeless amber talisman from the Shroud — the moment sealed inside it is not identifiable because it is from outside of time. The talisman itself has given up waiting for it to end.", + equipped: false, + id: "eternity_talisman", + name: "Eternity Talisman", + owned: false, + rarity: "epic", + setId: "eternal_tyrant", + type: "talisman", + }, + // ── Talismans — Legendary ───────────────────────────────────────────────── + { + bonus: { bloodMultiplier: 1.55, combatMultiplier: 1.4, ichorMultiplier: 1.3 }, + description: "Forged from void crystal in absolute vacuum. The talisman does not interact with the physical world on a philosophical level. On a practical level, it amplifies everything.", + equipped: false, + id: "abyss_talisman", + name: "Abyss Talisman", + owned: false, + rarity: "legendary", + setId: "void_sovereign", + type: "talisman", + }, + { + bonus: { bloodMultiplier: 1.6, combatMultiplier: 1.45, ichorMultiplier: 1.35 }, + description: "Forged from silent ink and court crystal in the Court of Whispers' deepest sanctum. It carries every secret the Court has ever kept, and it will not tell you any of them. But it will use them on your behalf.", + equipped: false, + id: "whisper_talisman", + name: "Whisper Talisman", + owned: false, + rarity: "legendary", + setId: "void_sovereign", + type: "talisman", + }, +]; diff --git a/apps/api/src/data/vampireEquipmentSets.ts b/apps/api/src/data/vampireEquipmentSets.ts new file mode 100644 index 0000000..cdf2e31 --- /dev/null +++ b/apps/api/src/data/vampireEquipmentSets.ts @@ -0,0 +1,119 @@ +/** + * @file Game data definitions. + * @copyright nhcarrigan + * @license Naomi's Public License + * @author Naomi Carrigan + */ +/* eslint-disable stylistic/max-len -- Data content */ +import type { VampireEquipmentSet } from "@elysium/types"; + +export const defaultVampireEquipmentSets: Array = [ + { + bonuses: { + // eslint-disable-next-line @typescript-eslint/naming-convention -- numeric keys + 2: { bloodMultiplier: 1.15 }, + // eslint-disable-next-line @typescript-eslint/naming-convention -- numeric keys + 3: { combatMultiplier: 1.1 }, + }, + description: "The starter relics of a newly awakened vampire — mismatched, imperfect, and entirely adequate for the catacombs. Every legend begins with gear this humble.", + id: "catacombs_hunter", + name: "Catacomb Hunter", + pieces: [ "shard_fang", "blood_fang", "tattered_shroud", "blood_shroud", "bone_talisman" ], + }, + { + bonuses: { + // eslint-disable-next-line @typescript-eslint/naming-convention -- numeric keys + 2: { bloodMultiplier: 1.2 }, + // eslint-disable-next-line @typescript-eslint/naming-convention -- numeric keys + 3: { combatMultiplier: 1.15 }, + }, + description: "Equipment forged in the fires of early conquest — in the mire's depths and the obsidian corridors. Functional, battle-tested, and smelling faintly of old blood.", + id: "blood_stalker", + name: "Blood Stalker", + pieces: [ "war_fang", "obsidian_fang", "obsidian_shroud", "crimson_shroud", "blood_talisman", "obsidian_talisman" ], + }, + { + bonuses: { + // eslint-disable-next-line @typescript-eslint/naming-convention -- numeric keys + 2: { bloodMultiplier: 1.25 }, + // eslint-disable-next-line @typescript-eslint/naming-convention -- numeric keys + 3: { ichorMultiplier: 1.2 }, + }, + description: "The arms of a vampire who has learned to move through courts as easily as through darkness. These pieces announce arrival before the wearer does.", + id: "crimson_regent", + name: "Crimson Regent", + pieces: [ "crimson_fang", "shadow_fang", "shadow_shroud", "plague_shroud", "crimson_talisman", "shadow_talisman" ], + }, + { + bonuses: { + // eslint-disable-next-line @typescript-eslint/naming-convention -- numeric keys + 2: { combatMultiplier: 1.3 }, + // eslint-disable-next-line @typescript-eslint/naming-convention -- numeric keys + 3: { bloodMultiplier: 1.2 }, + }, + description: "Equipment sourced from the most dangerous zones of the middle realm — places where even other vampires refuse to hunt. The gear carries the memory of every survival it enabled.", + id: "plague_bringer", + name: "Plague Bringer", + pieces: [ "plague_fang", "ashen_fang", "ashen_shroud", "iron_shroud", "plague_talisman", "ashen_talisman" ], + }, + { + bonuses: { + // eslint-disable-next-line @typescript-eslint/naming-convention -- numeric keys + 2: { combatMultiplier: 1.35 }, + // eslint-disable-next-line @typescript-eslant/naming-convention -- numeric keys + 3: { bloodMultiplier: 1.25 }, + }, + description: "The arms of a vampire who has broken open prisons and walked through veils. These pieces have seen the inside of places most vampires only hear about in old stories.", + id: "iron_jailer", + name: "Iron Jailer", + pieces: [ "iron_fang", "veil_fang", "veil_shroud", "moor_shroud", "iron_talisman", "veil_talisman" ], + }, + { + bonuses: { + // eslint-disable-next-line @typescript-eslint/naming-convention -- numeric keys + 2: { bloodMultiplier: 1.3 }, + // eslint-disable-next-line @typescript-eslint/naming-convention -- numeric keys + 3: { combatMultiplier: 1.3 }, + }, + description: "Equipment forged in the moonless reaches and recovered from sunken depths. The pieces were each retrieved at significant cost, which they repay with significant interest.", + id: "moonlit_predator", + name: "Moonlit Predator", + pieces: [ "moonless_fang", "sunken_fang", "sunken_shroud", "sanctum_shroud", "moor_talisman", "sunken_talisman" ], + }, + { + bonuses: { + // eslint-disable-next-line @typescript-eslint/naming-convention -- numeric keys + 2: { combatMultiplier: 1.4 }, + // eslint-disable-next-line @typescript-eslint/naming-convention -- numeric keys + 3: { ichorMultiplier: 1.3 }, + }, + description: "The regalia of desecration and apex predation — taken from places where even the concept of sanctuary has been dismantled. Each piece is a monument to the absence of mercy.", + id: "sanctum_desecrator", + name: "Sanctum Desecrator", + pieces: [ "sanctum_fang", "carrion_fang", "carrion_shroud", "spire_shroud", "sanctum_talisman", "carrion_talisman" ], + }, + { + bonuses: { + // eslint-disable-next-line @typescript-eslint/naming-convention -- numeric keys + 2: { bloodMultiplier: 1.4 }, + // eslint-disable-next-line @typescript-eslint/naming-convention -- numeric keys + 3: { combatMultiplier: 1.45 }, + }, + description: "The arms of a vampire who has conquered both time and blood — relics of the Bloodspire and the Shroud. These pieces are older than the zones they came from.", + id: "eternal_tyrant", + name: "Eternal Tyrant", + pieces: [ "spire_fang", "shroud_fang", "eternity_shroud", "abyss_shroud", "spire_talisman", "eternity_talisman" ], + }, + { + bonuses: { + // eslint-disable-next-line @typescript-eslint/naming-convention -- numeric keys + 2: { ichorMultiplier: 1.5 }, + // eslint-disable-next-line @typescript-eslint/naming-convention -- numeric keys + 3: { bloodMultiplier: 1.5 }, + }, + description: "The complete arms of a vampire who has stood at the edge of the void and returned. These pieces no longer belong to any zone. They belong to whatever you have become.", + id: "void_sovereign", + name: "Void Sovereign", + pieces: [ "abyss_fang", "eternal_fang", "whisper_shroud", "eternal_shroud", "abyss_talisman", "whisper_talisman" ], + }, +]; diff --git a/apps/api/src/data/vampireMaterials.ts b/apps/api/src/data/vampireMaterials.ts new file mode 100644 index 0000000..701dd5c --- /dev/null +++ b/apps/api/src/data/vampireMaterials.ts @@ -0,0 +1,408 @@ +/** + * @file Game data definitions. + * @copyright nhcarrigan + * @license Naomi's Public License + * @author Naomi Carrigan + */ +/* eslint-disable max-lines -- Data file */ +/* eslint-disable stylistic/max-len -- Data content */ +import type { Material } from "@elysium/types"; + +export const defaultVampireMaterials: Array = [ + // ── Haunted Catacombs ───────────────────────────────────────────────────── + { + description: "Dust ground from the bones of vampires who rose, fought, and fell in these tunnels. It carries the faintest trace of their hunger.", + id: "bone_dust", + name: "Bone Dust", + rarity: "common", + zoneId: "vampire_haunted_catacombs", + }, + { + description: "The residue of a life that chose darkness. It pools in the lowest reaches of the catacombs, slowly thickening over centuries.", + id: "grave_essence", + name: "Grave Essence", + rarity: "common", + zoneId: "vampire_haunted_catacombs", + }, + { + description: "Fine grey ash that accumulates wherever the undead have spent long centuries in stasis. Not quite earth, not quite flesh. Something in between.", + id: "catacomb_ash", + name: "Catacomb Ash", + rarity: "uncommon", + zoneId: "vampire_haunted_catacombs", + }, + // ── Blood Mire ──────────────────────────────────────────────────────────── + { + description: "Thick, crimson-tinted mud drawn from the deepest channels of the mire. It does not dry out. It does not wash off. It does not forget.", + id: "mire_sludge", + name: "Mire Sludge", + rarity: "common", + zoneId: "vampire_blood_mire", + }, + { + description: "A flat-bladed moss that grows exclusively on surfaces saturated with old blood. Herbalists who have tried to study it have stopped trying.", + id: "blood_moss", + name: "Blood Moss", + rarity: "common", + zoneId: "vampire_blood_mire", + }, + { + description: "A hollow reed that grows where the mire runs deepest, with a faint red tint throughout its stem. If cut, it bleeds.", + id: "crimson_reed", + name: "Crimson Reed", + rarity: "uncommon", + zoneId: "vampire_blood_mire", + }, + // ── Obsidian Keep ───────────────────────────────────────────────────────── + { + description: "A sharp shard of the volcanic stone used to build the Keep. Each chip holds a fragment of the blood magic sealed into the walls during construction.", + id: "obsidian_chip", + name: "Obsidian Chip", + rarity: "common", + zoneId: "vampire_obsidian_keep", + }, + { + description: "Iron filings scraped from the Keep's ancient weapons and restraints. Cold to the touch, even near fire. Even near blood.", + id: "iron_shaving", + name: "Iron Shaving", + rarity: "common", + zoneId: "vampire_obsidian_keep", + }, + { + description: "The bonding agent used to seal the Keep's stones together — mixed with ash, iron powder, and something that should have been left out. It cures permanently.", + id: "keep_mortar", + name: "Keep Mortar", + rarity: "rare", + zoneId: "vampire_obsidian_keep", + }, + // ── Crimson Citadel ─────────────────────────────────────────────────────── + { + description: "Polished stone quarried from the Citadel's foundations. Every piece has been touched by so many vampire lords that it practically radiates authority.", + id: "citadel_stone", + name: "Citadel Stone", + rarity: "common", + zoneId: "vampire_crimson_citadel", + }, + { + description: "An alloy forged in blood-tempered furnaces, harder than ordinary bronze and carrying a subtle crimson sheen. The Citadel's armourers guard the recipe.", + id: "blood_bronze", + name: "Blood Bronze", + rarity: "uncommon", + zoneId: "vampire_crimson_citadel", + }, + { + description: "Silk woven from threads that were dyed with diluted vampire essence and then dried for a century. The fabric changes colour subtly in moonlight.", + id: "crimson_silk", + name: "Crimson Silk", + rarity: "rare", + zoneId: "vampire_crimson_citadel", + }, + // ── Shadow Court ────────────────────────────────────────────────────────── + { + description: "Thread spun from shadow itself — a process that requires both technical skill and a complete willingness to let go of daylight. Woven garments made from it are essentially invisible.", + id: "shadow_thread", + name: "Shadow Thread", + rarity: "common", + zoneId: "vampire_shadow_court", + }, + { + description: "Ink prepared from whispered secrets — literally. The Court's scribes capture spoken confidences in a phial and render them down into pigment. Every document written with it is, technically, a confession.", + id: "whisper_ink", + name: "Whisper Ink", + rarity: "uncommon", + zoneId: "vampire_shadow_court", + }, + { + description: "A heavy black wax used to seal the Court's most sensitive correspondences. Once set, it can only be broken by the vampire who pressed it. Forgeries have been attempted. None have survived the attempt.", + id: "court_wax", + name: "Court Wax", + rarity: "rare", + zoneId: "vampire_shadow_court", + }, + // ── Plague Ossuary ──────────────────────────────────────────────────────── + { + description: "Grey ash remaining after the Ossuary's plague fires have consumed what they were fed. Mildly corrosive. Handle with care, and perhaps with gloves.", + id: "plague_ash", + name: "Plague Ash", + rarity: "common", + zoneId: "vampire_plague_ossuary", + }, + { + description: "Bone harvested from vampires taken by the Ossuary's endemic pestilence. The infection did not die with them. It merely changed hosts.", + id: "infected_bone", + name: "Infected Bone", + rarity: "common", + zoneId: "vampire_plague_ossuary", + }, + { + description: "A thick, pale resin that oozes from the Ossuary's walls in places where plague-magic has been concentrated longest. It hardens into a surprisingly effective sealant.", + id: "ossuary_resin", + name: "Ossuary Resin", + rarity: "rare", + zoneId: "vampire_plague_ossuary", + }, + // ── Ashen Wastes ────────────────────────────────────────────────────────── + { + description: "Ash falling perpetually from the sky above the Wastes — the remains of a war that never finished burning. It is surprisingly good for preservation.", + id: "volcanic_ash", + name: "Volcanic Ash", + rarity: "common", + zoneId: "vampire_ashen_wastes", + }, + { + description: "Crystals formed where magical fire burned long enough to change the nature of the ground beneath it. They retain heat indefinitely.", + id: "cinder_crystal", + name: "Cinder Crystal", + rarity: "uncommon", + zoneId: "vampire_ashen_wastes", + }, + { + description: "Cloth woven in the Wastes and saturated with ash over generations. It does not burn. It does not stain. It does not soften.", + id: "ashen_cloth", + name: "Ashen Cloth", + rarity: "uncommon", + zoneId: "vampire_ashen_wastes", + }, + // ── The Iron Gaol ───────────────────────────────────────────────────────── + { + description: "The iron pins and fasteners used throughout the Gaol's construction. Each one is inscribed with a containment glyph. They do not loosen with time.", + id: "iron_rivet", + name: "Iron Rivet", + rarity: "common", + zoneId: "vampire_iron_gaol", + }, + { + description: "A single link from one of the Gaol's binding chains. Strong enough to hold an elder vampire. Heavier than it looks. Always cold.", + id: "chain_link", + name: "Chain Link", + rarity: "uncommon", + zoneId: "vampire_iron_gaol", + }, + { + description: "The stone quarried to build the Gaol's cells — dense, cold, and impregnated with centuries of accumulated despair. It absorbs magic rather than conducting it.", + id: "gaol_stone", + name: "Gaol Stone", + rarity: "rare", + zoneId: "vampire_iron_gaol", + }, + // ── Veilborn Hollow ─────────────────────────────────────────────────────── + { + description: "Thread spun from the Veil itself — a substance that exists partially in the shadow-realm and partially in the real world. Objects made with it are somewhat difficult to focus on.", + id: "veil_thread", + name: "Veil Thread", + rarity: "common", + zoneId: "vampire_veilborn_hollow", + }, + { + description: "Crystals formed at the point where the Veil touches the physical world — each one containing a frozen moment from the shadow-realm. Looking into them for too long is inadvisable.", + id: "hollow_crystal", + name: "Hollow Crystal", + rarity: "uncommon", + zoneId: "vampire_veilborn_hollow", + }, + { + description: "The physical residue of a spirit that has fully crossed the Veil — fine, weightless particles that drift upward rather than falling. They make excellent catalyst material.", + id: "phantom_dust", + name: "Phantom Dust", + rarity: "rare", + zoneId: "vampire_veilborn_hollow", + }, + // ── Moonless Moor ───────────────────────────────────────────────────────── + { + description: "Dark, saturated peat from the deepest parts of the Moor. It burns slowly and produces a smoke that seems to attract predators rather than repel them.", + id: "moor_peat", + name: "Moor Peat", + rarity: "common", + zoneId: "vampire_moonless_moor", + }, + { + description: "The Moor's perpetual fog condensed and collected. It does not evaporate in warmth, which is how you know it is not ordinary fog.", + id: "fog_essence", + name: "Fog Essence", + rarity: "common", + zoneId: "vampire_moonless_moor", + }, + { + description: "A rare plant that flowers only in absolute darkness. Its bloom is bioluminescent, which is the only way anyone has ever found one.", + id: "night_bloom", + name: "Night Bloom", + rarity: "rare", + zoneId: "vampire_moonless_moor", + }, + // ── The Sunken Crypt ────────────────────────────────────────────────────── + { + description: "Stone recovered from the deepest chambers — porous, dark, and reeking of salt water and old blood. Everything sealed in these chambers has soaked into it.", + id: "sunken_stone", + name: "Sunken Stone", + rarity: "common", + zoneId: "vampire_sunken_crypt", + }, + { + description: "Silk preserved in the crypt's submerged chambers for so long that it has taken on properties of neither cloth nor water. Soft, cold, and permanent.", + id: "drowned_silk", + name: "Drowned Silk", + rarity: "uncommon", + zoneId: "vampire_sunken_crypt", + }, + { + description: "Amber formed from resin that seeped into the crypt's lower levels and hardened around fragments of vampire essence. Each piece traps something that was still alive when it solidified.", + id: "deep_amber", + name: "Deep Amber", + rarity: "rare", + zoneId: "vampire_sunken_crypt", + }, + // ── Desecrated Sanctum ──────────────────────────────────────────────────── + { + description: "Polished marble torn from the Sanctum's original construction — its sacred inscriptions scraped away, but the stone remembers. It resists dark enchantments more than it should.", + id: "defiled_marble", + name: "Defiled Marble", + rarity: "common", + zoneId: "vampire_desecrated_sanctum", + }, + { + description: "Fragments of the Sanctum's original windows — glass that was made to hold sacred light. Now it holds nothing, and the emptiness feels intentional.", + id: "sanctum_glass", + name: "Sanctum Glass", + rarity: "uncommon", + zoneId: "vampire_desecrated_sanctum", + }, + { + description: "Incense burned in rituals designed to invert the Sanctum's sacred purpose. The smoke still rises the wrong way — downward.", + id: "dark_incense", + name: "Dark Incense", + rarity: "rare", + zoneId: "vampire_desecrated_sanctum", + }, + // ── Carrion Peaks ───────────────────────────────────────────────────────── + { + description: "Bone fragments from creatures that have lived and died on the Peaks for generations — stripped clean, bleached white, and still faintly warm.", + id: "carrion_bone", + name: "Carrion Bone", + rarity: "common", + zoneId: "vampire_carrion_peaks", + }, + { + description: "Crystals found only in the Peaks' highest reaches — formed by a convergence of altitude, cold, and old hunting magic. Sharp enough to cut through standard vampire hide.", + id: "peak_crystal", + name: "Peak Crystal", + rarity: "uncommon", + zoneId: "vampire_carrion_peaks", + }, + { + description: "Obsidian that has absorbed vampire blood through direct contact during battles at the Peaks' summits. The two materials have merged into something neither purely mineral nor purely vital.", + id: "blood_obsidian", + name: "Blood Obsidian", + rarity: "rare", + zoneId: "vampire_carrion_peaks", + }, + // ── The Bloodspire ──────────────────────────────────────────────────────── + { + description: "The crystallised blood that forms the Spire's outer walls. Dense as stone, warm as fresh blood. It grows back if broken off.", + id: "spire_stone", + name: "Spire Stone", + rarity: "common", + zoneId: "vampire_bloodspire", + }, + { + description: "Crystals grown at the Spire's interior junctions — formed where the architecture deliberately folds blood-magic into the structure of the building. Each one pulses faintly.", + id: "blood_crystal", + name: "Blood Crystal", + rarity: "uncommon", + zoneId: "vampire_bloodspire", + }, + { + description: "Residue harvested from the Spire's deepest chambers — a thick, dark ichor that predates even the building that contains it. It does not react to any known magical reagent. It reacts to intent.", + id: "ancient_gore", + name: "Ancient Gore", + rarity: "rare", + zoneId: "vampire_bloodspire", + }, + // ── Shroud of Eternity ──────────────────────────────────────────────────── + { + description: "Thread woven from the Shroud's temporal fabric — each strand has already lived through several possible futures and settled on none of them. Things made from it feel slightly out of phase.", + id: "eternity_thread", + name: "Eternity Thread", + rarity: "common", + zoneId: "vampire_shroud_of_eternity", + }, + { + description: "Dust collected from the Shroud's boundary regions — the physical remnant of time that moved too slowly and eventually stopped. It drifts in currents that do not correspond to any wind.", + id: "shroud_dust", + name: "Shroud Dust", + rarity: "uncommon", + zoneId: "vampire_shroud_of_eternity", + }, + { + description: "Amber formed in the Shroud's temporal anomalies — trapping moments that exist outside of normal time. The things preserved inside are still happening.", + id: "timeless_amber", + name: "Timeless Amber", + rarity: "rare", + zoneId: "vampire_shroud_of_eternity", + }, + // ── The Abyssal Vault ───────────────────────────────────────────────────── + { + description: "Stone from the Vault's outer walls — quarried from a place that exists below the normal underground, in a layer of the world that does not have a name.", + id: "abyssal_stone", + name: "Abyssal Stone", + rarity: "common", + zoneId: "vampire_abyssal_vault", + }, + { + description: "Crystals formed in absolute void — places within the Vault where nothing has ever existed. Their interiors are genuinely empty in a way that normal empty space is not.", + id: "void_crystal", + name: "Void Crystal", + rarity: "uncommon", + zoneId: "vampire_abyssal_vault", + }, + { + description: "Iron refined in the Vault's deepest forges — as cold as absolute zero, as hard as any known material. It does not rust. It does not bend. It does not forgive.", + id: "vault_iron", + name: "Vault Iron", + rarity: "rare", + zoneId: "vampire_abyssal_vault", + }, + // ── Court of Whispers ───────────────────────────────────────────────────── + { + description: "Parchment prepared from the skin of failed spies — a Court tradition that serves both as record and deterrent. Every document written on it contains the memory of its source.", + id: "whisper_parchment", + name: "Whisper Parchment", + rarity: "common", + zoneId: "vampire_court_of_whispers", + }, + { + description: "Crystals formed where the Court's intelligence network has concentrated the most secrets in the least space. They vibrate at a frequency only very old vampires can hear.", + id: "court_crystal", + name: "Court Crystal", + rarity: "uncommon", + zoneId: "vampire_court_of_whispers", + }, + { + description: "Ink rendered from secrets so dangerous that even writing them down is a risk. The Court uses it for its most sensitive documents. The ink knows what it says.", + id: "silent_ink", + name: "Silent Ink", + rarity: "rare", + zoneId: "vampire_court_of_whispers", + }, + // ── The Eternal Abyss ───────────────────────────────────────────────────── + { + description: "The primal substance that exists at the bottom of the vampire world — neither matter nor energy, but something that predates both. Handling it requires understanding it, which may be impossible.", + id: "void_essence", + name: "Void Essence", + rarity: "common", + zoneId: "vampire_eternal_abyss", + }, + { + description: "Crystals formed at the intersection of the vampire realm and whatever exists beyond it. Each one contains a fragment of something genuinely ancient — older than the first vampire, older than the concept of blood.", + id: "eternal_crystal", + name: "Eternal Crystal", + rarity: "uncommon", + zoneId: "vampire_eternal_abyss", + }, + { + description: "Ash from things that existed before the concept of fire. It does not look like ordinary ash. It does not behave like ordinary ash. It simply is.", + id: "primordial_ash", + name: "Primordial Ash", + rarity: "rare", + zoneId: "vampire_eternal_abyss", + }, +]; diff --git a/apps/api/src/data/vampireQuests.ts b/apps/api/src/data/vampireQuests.ts new file mode 100644 index 0000000..1b6b7c6 --- /dev/null +++ b/apps/api/src/data/vampireQuests.ts @@ -0,0 +1,1114 @@ +/** + * @file Game data definitions. + * @copyright nhcarrigan + * @license Naomi's Public License + * @author Naomi Carrigan + */ +/* eslint-disable stylistic/max-len -- Data content */ +/* eslint-disable max-lines -- Data file */ +import type { VampireQuest } from "@elysium/types"; + +export const defaultVampireQuests: Array = [ + // ── Zone 1: Haunted Catacombs ───────────────────────────────────────────── + { + description: "You stir from ancient slumber, hunger gnawing like a splinter of ice lodged behind your ribs. The catacombs breathe dust and memory. You rise, and the darkness rises with you.", + durationSeconds: 60, + id: "waking_hunger", + name: "The Waking Hunger", + prerequisiteIds: [], + rewards: [ { amount: 100, type: "blood" } ], + status: "available", + zoneId: "vampire_haunted_catacombs", + }, + { + description: "The catacombs whisper of a mortal grave-robber who stumbled too deep and never returned to the surface. Your thralls track the scent to a sealed burial alcove. What they bring back is still warm.", + durationSeconds: 120, + id: "the_grave_robbers_end", + name: "The Grave-Robber's End", + prerequisiteIds: [ "waking_hunger" ], + rewards: [ { amount: 200, type: "blood" } ], + status: "locked", + zoneId: "vampire_haunted_catacombs", + }, + { + description: "Rival fledglings have carved out a nesting hollow in the eastern ossuary. They have not learned yet who commands these halls. You teach them, in the old way, with tooth and shadow.", + durationSeconds: 300, + id: "culling_the_fledglings", + name: "Culling the Fledglings", + prerequisiteIds: [ "the_grave_robbers_end" ], + rewards: [ { amount: 500, type: "blood" } ], + status: "locked", + zoneId: "vampire_haunted_catacombs", + }, + { + description: "The oldest chamber of the catacombs holds a reliquary the ancient ones sealed before they were destroyed. Your thralls pry it open beneath a moonless night. The contents remember being alive.", + combatPowerRequired: 0, + durationSeconds: 600, + id: "the_reliquary_unsealed", + name: "The Reliquary Unsealed", + prerequisiteIds: [ "culling_the_fledglings" ], + rewards: [ { amount: 1_000, type: "blood" } ], + status: "locked", + zoneId: "vampire_haunted_catacombs", + }, + { + description: "Every hunt has a beginning. Yours ends here, in the deepest vault of the catacombs, where you bind your first true thrall to your will and declare yourself a hunter worthy of the night beyond these walls.", + combatPowerRequired: 0, + durationSeconds: 1_200, + id: "first_hunt", + name: "The First Hunt", + prerequisiteIds: [ "the_reliquary_unsealed" ], + rewards: [ + { amount: 2_500, type: "blood" }, + { targetId: "ghoul", type: "thrall" }, + ], + status: "locked", + zoneId: "vampire_haunted_catacombs", + }, + + // ── Zone 2: Blood Mire ──────────────────────────────────────────────────── + { + description: "The mire offers its blood freely, if you know how to drink from it. Your thralls wade into the red-stained shallows and learn the rhythm of its tides — when the channels swell and when the creatures in the deep grow still.", + durationSeconds: 600, + id: "reading_the_mire", + name: "Reading the Mire", + prerequisiteIds: [], + rewards: [ { amount: 5_000, type: "blood" } ], + status: "locked", + zoneId: "vampire_blood_mire", + }, + { + description: "A clan of blood-drinkers has staked out the northern channels — minor vampires who drank from the mire itself and became something half-feral. They guard a tributary rich enough to flood your coffers. They must be removed.", + combatPowerRequired: 5, + durationSeconds: 1_200, + id: "the_channel_clan", + name: "The Channel Clan", + prerequisiteIds: [ "reading_the_mire" ], + rewards: [ { amount: 12_000, type: "blood" } ], + status: "locked", + zoneId: "vampire_blood_mire", + }, + { + description: "Beneath the mire's surface lies a drowned shrine to a pre-vampire deity — one who demanded blood as tribute. Your thralls dive and retrieve what remains of its offerings. The idol, still slick with ancient red, proves useful.", + combatPowerRequired: 8, + durationSeconds: 2_400, + id: "drowned_shrine", + name: "The Drowned Shrine", + prerequisiteIds: [ "the_channel_clan" ], + rewards: [ { amount: 30_000, type: "blood" } ], + status: "locked", + zoneId: "vampire_blood_mire", + }, + { + description: "The mire breeds its own kind of horror. A blood-leech the size of a cart has been feeding on everything that wanders too close, growing fat on what should have been yours. You send your best thralls to settle the debt.", + combatPowerRequired: 15, + durationSeconds: 3_600, + id: "the_great_leech", + name: "The Great Leech", + prerequisiteIds: [ "drowned_shrine" ], + rewards: [ { amount: 75_000, type: "blood" }, { amount: 1, type: "ichor" } ], + status: "locked", + zoneId: "vampire_blood_mire", + }, + { + description: "You have walked every red channel and tasted every dark tributary. The mire is yours now. You carve your sigil into the ancient oak at its heart, and the creatures beneath the surface go still and bow — in their own way.", + combatPowerRequired: 20, + durationSeconds: 7_200, + id: "mire_mastery", + name: "Mire Mastery", + prerequisiteIds: [ "the_great_leech" ], + rewards: [ + { amount: 200_000, type: "blood" }, + { amount: 3, type: "ichor" }, + { targetId: "shade", type: "thrall" }, + ], + status: "locked", + zoneId: "vampire_blood_mire", + }, + + // ── Zone 3: Obsidian Keep ───────────────────────────────────────────────── + { + description: "The Keep's lower levels are a maze of false floors and pressure-plate traps set by the previous lord, who trusted no one — a reasonable policy, given how he died. Your thralls begin mapping the safe paths, losing only a few to the lesson.", + combatPowerRequired: 25, + durationSeconds: 1_800, + id: "mapping_the_keep", + name: "Mapping the Keep", + prerequisiteIds: [], + rewards: [ { amount: 500_000, type: "blood" } ], + status: "locked", + zoneId: "vampire_obsidian_keep", + }, + { + description: "The Keep's garrison — skeletal soldiers animated by the previous lord's dying spite — still patrols the middle floors. They do not parley. Your thralls dismantle them piece by piece, then stack the pieces in a corner for aesthetic purposes.", + combatPowerRequired: 35, + durationSeconds: 3_600, + id: "the_garrison_of_spite", + name: "Garrison of Spite", + prerequisiteIds: [ "mapping_the_keep" ], + rewards: [ { amount: 1_200_000, type: "blood" } ], + status: "locked", + zoneId: "vampire_obsidian_keep", + }, + { + description: "High in the obsidian spire, a vault holds the previous lord's accumulated ichor — crystallised into dark beads that still pulse with residual hunger. Your thralls crack the vault open and claim what was always yours to take.", + combatPowerRequired: 50, + durationSeconds: 7_200, + id: "the_ichor_vault", + name: "The Ichor Vault", + prerequisiteIds: [ "the_garrison_of_spite" ], + rewards: [ { amount: 3_000_000, type: "blood" }, { amount: 10, type: "ichor" } ], + status: "locked", + zoneId: "vampire_obsidian_keep", + }, + { + description: "The Keep's shadow-passages were carved to allow the old lord to move unseen through his own fortress. You send your thralls through every passage, learning their branching logic, until the entire structure is yours to navigate in perfect darkness.", + combatPowerRequired: 70, + durationSeconds: 14_400, + id: "shadow_passage_rites", + name: "Shadow-Passage Rites", + prerequisiteIds: [ "the_ichor_vault" ], + rewards: [ { amount: 7_500_000, type: "blood" }, { amount: 20, type: "ichor" } ], + status: "locked", + zoneId: "vampire_obsidian_keep", + }, + { + description: "In the throne room of black glass, you face the three trials the Keep's creators built into the stone: trial of hunger, trial of patience, and trial of cruelty. You pass all three. You were made for this.", + combatPowerRequired: 100, + durationSeconds: 28_800, + id: "obsidian_trials", + name: "The Obsidian Trials", + prerequisiteIds: [ "shadow_passage_rites" ], + rewards: [ + { amount: 20_000_000, type: "blood" }, + { amount: 40, type: "ichor" }, + { targetId: "bloodbound", type: "thrall" }, + ], + status: "locked", + zoneId: "vampire_obsidian_keep", + }, + + // ── Zone 4: Crimson Citadel ─────────────────────────────────────────────── + { + description: "The warlords' citadel runs on blood — literally. It powers the torches, the heating, the wards. You tap into a secondary supply line and begin diverting a tithe to your own stores before the quartermaster notices.", + combatPowerRequired: 120, + durationSeconds: 7_200, + id: "the_supply_line", + name: "The Supply Line", + prerequisiteIds: [], + rewards: [ { amount: 50_000_000, type: "blood" }, { amount: 5, type: "ichor" } ], + status: "locked", + zoneId: "vampire_crimson_citadel", + }, + { + description: "Three minor warlords occupy the citadel's outer towers and squabble endlessly over precedence. You deliver written challenges to all three simultaneously and watch from the battlements as they tear each other apart over the insult. Politics.", + combatPowerRequired: 160, + durationSeconds: 14_400, + id: "the_three_insults", + name: "The Three Insults", + prerequisiteIds: [ "the_supply_line" ], + rewards: [ { amount: 125_000_000, type: "blood" }, { amount: 15, type: "ichor" } ], + status: "locked", + zoneId: "vampire_crimson_citadel", + }, + { + description: "The citadel's great chain — a physical structure that binds the warlords' pact together — has rusted through in three places. You arrange to have it repaired in a way that ensures your sigil is worked into every new link.", + combatPowerRequired: 220, + durationSeconds: 28_800, + id: "mending_the_great_chain", + name: "Mending the Great Chain", + prerequisiteIds: [ "the_three_insults" ], + rewards: [ { amount: 350_000_000, type: "blood" }, { amount: 35, type: "ichor" } ], + status: "locked", + zoneId: "vampire_crimson_citadel", + }, + { + description: "The warlord of the southern tower has amassed a private army and is making overtures to the Crimson Citadel's enemies. You send your thralls to remind him of his obligations — in detail — and bring back his standard as proof.", + combatPowerRequired: 300, + durationSeconds: 43_200, + id: "the_southern_reminder", + name: "The Southern Reminder", + prerequisiteIds: [ "mending_the_great_chain" ], + rewards: [ { amount: 750_000_000, type: "blood" }, { amount: 60, type: "ichor" } ], + status: "locked", + zoneId: "vampire_crimson_citadel", + }, + { + description: "The citadel's last warlord, entrenched in the great hall, refuses to kneel. You do not offer him a third chance. When the banners come down and yours go up, even the blood in the walls seems to breathe easier.", + combatPowerRequired: 400, + durationSeconds: 86_400, + id: "citadel_conquest", + name: "Citadel Conquest", + prerequisiteIds: [ "the_southern_reminder" ], + rewards: [ + { amount: 2_000_000_000, type: "blood" }, + { amount: 100, type: "ichor" }, + { targetId: "wraith", type: "thrall" }, + ], + status: "locked", + zoneId: "vampire_crimson_citadel", + }, + + // ── Zone 5: Shadow Court ────────────────────────────────────────────────── + { + description: "Entrance to the Shadow Court is by invitation only. You forge one — convincingly — and attend your first soirée. The bloodwine is excellent. The company is lethal. You survive the evening and consider this a triumph.", + combatPowerRequired: 450, + durationSeconds: 14_400, + id: "the_forged_invitation", + name: "The Forged Invitation", + prerequisiteIds: [], + rewards: [ { amount: 5_000_000_000, type: "blood" }, { amount: 30, type: "ichor" } ], + status: "locked", + zoneId: "vampire_shadow_court", + }, + { + description: "Three courtiers hold secrets that could destroy the Court's most powerful noble. You collect all three, separately, across three different evenings, and hold the completed picture in reserve. Knowledge is the sharpest blade at court.", + combatPowerRequired: 550, + durationSeconds: 28_800, + id: "gathering_the_secrets", + name: "Gathering the Secrets", + prerequisiteIds: [ "the_forged_invitation" ], + rewards: [ { amount: 12_000_000_000, type: "blood" }, { amount: 60, type: "ichor" } ], + status: "locked", + zoneId: "vampire_shadow_court", + }, + { + description: "An elder courtier suspects you of being an outsider. You spend three court sessions carefully dismantling that suspicion — replacing it with the belief that you have been here all along, quietly powerful, too dangerous to challenge.", + combatPowerRequired: 700, + durationSeconds: 57_600, + id: "building_the_alibi", + name: "Building the Alibi", + prerequisiteIds: [ "gathering_the_secrets" ], + rewards: [ { amount: 30_000_000_000, type: "blood" }, { amount: 100, type: "ichor" } ], + status: "locked", + zoneId: "vampire_shadow_court", + }, + { + description: "The Court's Master of Whispers is the most dangerous person in the room — they know every secret, every shadow, every debt. You arrange a private meeting and leave it having acquired an ally, rather than an enemy. Just barely.", + combatPowerRequired: 900, + durationSeconds: 86_400, + id: "the_master_of_whispers", + name: "The Master of Whispers", + prerequisiteIds: [ "building_the_alibi" ], + rewards: [ { amount: 75_000_000_000, type: "blood" }, { amount: 175, type: "ichor" } ], + status: "locked", + zoneId: "vampire_shadow_court", + }, + { + description: "The Court has watched you long enough. Now they invite you — truly — to take a seat among the Great Houses. You accept, and in accepting, bind yourself to their politics. The game has changed. You have changed with it.", + combatPowerRequired: 1_200, + durationSeconds: 172_800, + id: "court_intrigue", + name: "Court Intrigue", + prerequisiteIds: [ "the_master_of_whispers" ], + rewards: [ + { amount: 200_000_000_000, type: "blood" }, + { amount: 300, type: "ichor" }, + { targetId: "nightstalker", type: "thrall" }, + ], + status: "locked", + zoneId: "vampire_shadow_court", + }, + + // ── Zone 6: Plague Ossuary ──────────────────────────────────────────────── + { + description: "The ossuary smells of rot and old blood and something worse beneath both. Your thralls enter wearing cloth soaked in warding unguents, cataloguing what the plague left behind. The bones here are more numerous than the bodies that made them.", + combatPowerRequired: 1_400, + durationSeconds: 28_800, + id: "cataloguing_the_dead", + name: "Cataloguing the Dead", + prerequisiteIds: [], + rewards: [ { amount: 500_000_000_000, type: "blood" }, { amount: 100, type: "ichor" } ], + status: "locked", + zoneId: "vampire_plague_ossuary", + }, + { + description: "The plague-ridden dead are not entirely still. Something in the ossuary's lower vaults has animated them — not with intelligence, just with hunger. Your thralls put them down again, methodically, and take note of what animated them.", + combatPowerRequired: 1_700, + durationSeconds: 57_600, + id: "quieting_the_restless", + name: "Quieting the Restless", + prerequisiteIds: [ "cataloguing_the_dead" ], + rewards: [ { amount: 1_250_000_000_000, type: "blood" }, { amount: 200, type: "ichor" } ], + status: "locked", + zoneId: "vampire_plague_ossuary", + }, + { + description: "A plague-priest left behind a journal detailing ritual methods for distilling blood from plague-corpses — grim work, but efficient. Your thralls follow the steps. The resulting blood is dark and potent and smells of endings.", + combatPowerRequired: 2_200, + durationSeconds: 86_400, + id: "the_distillation_rites", + name: "The Distillation Rites", + prerequisiteIds: [ "quieting_the_restless" ], + rewards: [ { amount: 3_000_000_000_000, type: "blood" }, { amount: 400, type: "ichor" } ], + status: "locked", + zoneId: "vampire_plague_ossuary", + }, + { + description: "At the ossuary's heart stands a bone altar where plague-ridden vampires were once brought to die properly. The altar still remembers how to contain them. You learn the ritual and use it for your own purposes, which are considerably more ambitious.", + combatPowerRequired: 2_800, + durationSeconds: 172_800, + id: "the_bone_altar", + name: "The Bone Altar", + prerequisiteIds: [ "the_distillation_rites" ], + rewards: [ { amount: 7_000_000_000_000, type: "blood" }, { amount: 700, type: "ichor" } ], + status: "locked", + zoneId: "vampire_plague_ossuary", + }, + { + description: "You have learned everything the plague ossuary has to offer — every dark rite, every corpse-distillation, every bone-ward. You claim the tithe the dead have been quietly accumulating and leave the ossuary to its silence.", + combatPowerRequired: 3_500, + durationSeconds: 259_200, + id: "plague_tithe", + name: "The Plague Tithe", + prerequisiteIds: [ "the_bone_altar" ], + rewards: [ + { amount: 20_000_000_000_000, type: "blood" }, + { amount: 1_000, type: "ichor" }, + { targetId: "revenant", type: "thrall" }, + ], + status: "locked", + zoneId: "vampire_plague_ossuary", + }, + + // ── Zone 7: Ashen Wastes ────────────────────────────────────────────────── + { + description: "The wastes were scorched by a war of sunlight and shadow — the kind that leaves no victors, only ash. Your thralls move carefully through the grey expanse, searching for anything that survived the burning. They find more than they expected.", + combatPowerRequired: 4_000, + durationSeconds: 57_600, + id: "surveying_the_ash", + name: "Surveying the Ash", + prerequisiteIds: [], + rewards: [ { amount: 50_000_000_000_000, type: "blood" }, { amount: 300, type: "ichor" } ], + status: "locked", + zoneId: "vampire_ashen_wastes", + }, + { + description: "Packs of ash-walkers — vampires driven feral by exposure to residual sunlight — prowl the wastes in spiralling paths that cover the most ground possible. Your thralls intercept three separate packs and put them down before they can converge.", + combatPowerRequired: 5_000, + durationSeconds: 115_200, + id: "the_ash_walker_packs", + name: "The Ash-Walker Packs", + prerequisiteIds: [ "surveying_the_ash" ], + rewards: [ { amount: 120_000_000_000_000, type: "blood" }, { amount: 600, type: "ichor" } ], + status: "locked", + zoneId: "vampire_ashen_wastes", + }, + { + description: "Buried beneath the ash is a vault from the pre-war era — sealed, intact, protected by wards that only survived because they were too deep for the light to reach them. Your thralls crack the outer wards and drag the contents out.", + combatPowerRequired: 6_500, + durationSeconds: 172_800, + id: "the_buried_vault", + name: "The Buried Vault", + prerequisiteIds: [ "the_ash_walker_packs" ], + rewards: [ { amount: 300_000_000_000_000, type: "blood" }, { amount: 1_200, type: "ichor" } ], + status: "locked", + zoneId: "vampire_ashen_wastes", + }, + { + description: "The ash itself can be refined — it holds trace elements of the sunlight that created it, and also of the blood that was spilled before the burning. Your thralls learn the refinement process and begin working through the waste methodically.", + combatPowerRequired: 8_000, + durationSeconds: 259_200, + id: "ash_refinement", + name: "Ash Refinement", + prerequisiteIds: [ "the_buried_vault" ], + rewards: [ { amount: 700_000_000_000_000, type: "blood" }, { amount: 2_000, type: "ichor" } ], + status: "locked", + zoneId: "vampire_ashen_wastes", + }, + { + description: "You claim the wastes not by conquering something alive, but by outlasting everything dead. You plant your standard in the grey expanse and your sigil burns in the ash for a moment before the wind takes it — but the claim holds regardless.", + combatPowerRequired: 10_000, + durationSeconds: 345_600, + id: "wastes_scourge", + name: "Wastes Scourge", + prerequisiteIds: [ "ash_refinement" ], + rewards: [ + { amount: 2_000_000_000_000_000, type: "blood" }, + { amount: 3_000, type: "ichor" }, + { targetId: "bloodreaver", type: "thrall" }, + ], + status: "locked", + zoneId: "vampire_ashen_wastes", + }, + + // ── Zone 8: Iron Gaol ───────────────────────────────────────────────────── + { + description: "The Iron Gaol was built to hold vampires — its bars are silver-iron alloy, its wards designed to suppress every supernatural ability. Your thralls test the outer perimeter carefully, cataloguing weaknesses the builders did not think to address.", + combatPowerRequired: 12_000, + durationSeconds: 86_400, + id: "testing_the_wards", + name: "Testing the Wards", + prerequisiteIds: [], + rewards: [ { amount: 5_000_000_000_000_000, type: "blood" }, { amount: 1_000, type: "ichor" } ], + status: "locked", + zoneId: "vampire_iron_gaol", + }, + { + description: "The gaol's warden is a mortal — one who has studied vampires so thoroughly that he can anticipate their moves. He is not supernatural, just clever and deeply, bitterly committed to his work. Your thralls neutralise him and his most fanatical lieutenants.", + combatPowerRequired: 15_000, + durationSeconds: 172_800, + id: "the_wardens_fall", + name: "The Warden's Fall", + prerequisiteIds: [ "testing_the_wards" ], + rewards: [ { amount: 12_000_000_000_000_000, type: "blood" }, { amount: 2_000, type: "ichor" } ], + status: "locked", + zoneId: "vampire_iron_gaol", + }, + { + description: "The gaol's prisoners — vampires, mostly, sealed in silver-iron cages with anti-hunger wards — are valuable if you can approach them safely. You open selected cells and offer each prisoner a choice. Most choose wisely.", + combatPowerRequired: 20_000, + durationSeconds: 259_200, + id: "freeing_the_prisoners", + name: "Freeing the Prisoners", + prerequisiteIds: [ "the_wardens_fall" ], + rewards: [ { amount: 30_000_000_000_000_000, type: "blood" }, { amount: 4_000, type: "ichor" } ], + status: "locked", + zoneId: "vampire_iron_gaol", + }, + { + description: "The gaol's forge still burns — it produced the silver-iron alloy that makes up the bars. Your thralls master the forge process and begin producing tools from the alloy for your own use. The irony is appreciated.", + combatPowerRequired: 27_000, + durationSeconds: 345_600, + id: "mastering_the_forge", + name: "Mastering the Forge", + prerequisiteIds: [ "freeing_the_prisoners" ], + rewards: [ { amount: 75_000_000_000_000_000, type: "blood" }, { amount: 7_000, type: "ichor" } ], + status: "locked", + zoneId: "vampire_iron_gaol", + }, + { + description: "Every chain, every bar, every ward — you dismantle them all, not because you need the space, but because the Iron Gaol existing at all is an insult. When it is done, you leave a single silver-iron bar behind as a monument to a failed idea.", + combatPowerRequired: 35_000, + durationSeconds: 432_000, + id: "iron_chains", + name: "Iron Chains", + prerequisiteIds: [ "mastering_the_forge" ], + rewards: [ + { amount: 200_000_000_000_000_000, type: "blood" }, + { amount: 10_000, type: "ichor" }, + { targetId: "shadow_thrall", type: "thrall" }, + ], + status: "locked", + zoneId: "vampire_iron_gaol", + }, + + // ── Zone 9: Veilborn Hollow ─────────────────────────────────────────────── + { + description: "The Hollow exists between where the world is and where it isn't. Your thralls enter it by stepping sideways through a shadow at the right angle. They return speaking in fragments, as though their words have been partially translated. This is expected.", + combatPowerRequired: 40_000, + durationSeconds: 172_800, + id: "first_steps_through_the_veil", + name: "First Steps Through the Veil", + prerequisiteIds: [], + rewards: [ { amount: 500_000_000_000_000_000, type: "blood" }, { amount: 3_000, type: "ichor" }, { amount: 1, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_veilborn_hollow", + }, + { + description: "The Hollow is inhabited by veilborn — things that were never quite alive, who feed on the residual energy of the living world bleeding through. They are territorial but not unreasonable. You make arrangements.", + combatPowerRequired: 50_000, + durationSeconds: 259_200, + id: "the_veilborn_compact", + name: "The Veilborn Compact", + prerequisiteIds: [ "first_steps_through_the_veil" ], + rewards: [ { amount: 1_200_000_000_000_000_000, type: "blood" }, { amount: 6_000, type: "ichor" }, { amount: 3, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_veilborn_hollow", + }, + { + description: "Deep in the Hollow, where the veil thins to nothing, is a pool of raw veil-energy — ancient and pre-personal, neither alive nor dead. Your thralls learn to draw from it without being absorbed. Two are absorbed anyway.", + combatPowerRequired: 65_000, + durationSeconds: 345_600, + id: "the_veil_pool", + name: "The Veil Pool", + prerequisiteIds: [ "the_veilborn_compact" ], + rewards: [ { amount: 3_000_000_000_000_000_000, type: "blood" }, { amount: 12_000, type: "ichor" }, { amount: 8, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_veilborn_hollow", + }, + { + description: "The Hollow's oldest resident is a thing that predates the veil itself — a remnant of whatever existed before the boundary between life and death was established. It has been waiting for something. You are, apparently, that something.", + combatPowerRequired: 85_000, + durationSeconds: 432_000, + id: "the_hollow_elder", + name: "The Hollow Elder", + prerequisiteIds: [ "the_veil_pool" ], + rewards: [ { amount: 7_000_000_000_000_000_000, type: "blood" }, { amount: 20_000, type: "ichor" }, { amount: 15, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_veilborn_hollow", + }, + { + description: "You anchor yourself to the Hollow — not as a visitor, but as a power within it. The passage between the veil and the living world is yours to open and close. You step through for the last time as a guest and back for the first time as a sovereign.", + combatPowerRequired: 110_000, + durationSeconds: 518_400, + id: "veil_passage", + name: "Veil Passage", + prerequisiteIds: [ "the_hollow_elder" ], + rewards: [ + { amount: 18_000_000_000_000_000_000, type: "blood" }, + { amount: 30_000, type: "ichor" }, + { amount: 25, type: "soulShards" }, + { targetId: "blood_knight", type: "thrall" }, + ], + status: "locked", + zoneId: "vampire_veilborn_hollow", + }, + + // ── Zone 10: Moonless Moor ──────────────────────────────────────────────── + { + description: "The moor at moonless nights is absolute dark — the kind that has weight and texture. Your thralls learn to hunt in it by sound alone. The things that live on the moor have always done so. Your thralls are learning.", + combatPowerRequired: 130_000, + durationSeconds: 259_200, + id: "hunting_in_darkness", + name: "Hunting in Darkness", + prerequisiteIds: [], + rewards: [ { amount: 45_000_000_000_000_000_000, type: "blood" }, { amount: 10_000, type: "ichor" }, { amount: 10, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_moonless_moor", + }, + { + description: "The moor's fog carries voices — old ones, from the people who died here before the dark took permanent residence. Most of them are incoherent. A few are useful. Your thralls learn to tell the difference.", + combatPowerRequired: 160_000, + durationSeconds: 345_600, + id: "voices_in_the_fog", + name: "Voices in the Fog", + prerequisiteIds: [ "hunting_in_darkness" ], + rewards: [ { amount: 110_000_000_000_000_000_000, type: "blood" }, { amount: 20_000, type: "ichor" }, { amount: 20, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_moonless_moor", + }, + { + description: "The moor's dark-runners — creatures evolved entirely in the absence of light — have developed senses your thralls lack. You study them rather than destroy them and implement their sensory methods into your thralls' training protocols.", + combatPowerRequired: 200_000, + durationSeconds: 432_000, + id: "studying_the_dark_runners", + name: "Studying the Dark-Runners", + prerequisiteIds: [ "voices_in_the_fog" ], + rewards: [ { amount: 270_000_000_000_000_000_000, type: "blood" }, { amount: 35_000, type: "ichor" }, { amount: 35, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_moonless_moor", + }, + { + description: "Something vast moves through the moor on nights when the dark is deepest — too large to be a creature, too purposeful to be weather. Your thralls track it across three consecutive moonless nights and return with an account that raises more questions than it answers.", + combatPowerRequired: 250_000, + durationSeconds: 518_400, + id: "the_vast_movement", + name: "The Vast Movement", + prerequisiteIds: [ "studying_the_dark_runners" ], + rewards: [ { amount: 650_000_000_000_000_000_000, type: "blood" }, { amount: 55_000, type: "ichor" }, { amount: 55, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_moonless_moor", + }, + { + description: "You harvest the moor's darkness the way others harvest crops — methodically, across its full extent, drawing what it has accumulated over centuries into stores that fuel your expansion. The moor does not resist. It has been waiting for something efficient.", + combatPowerRequired: 320_000, + durationSeconds: 604_800, + id: "moor_harvest", + name: "Moor Harvest", + prerequisiteIds: [ "the_vast_movement" ], + rewards: [ + { amount: 1_600_000_000_000_000_000_000, type: "blood" }, + { amount: 80_000, type: "ichor" }, + { amount: 80, type: "soulShards" }, + { targetId: "umbral_hunter", type: "thrall" }, + ], + status: "locked", + zoneId: "vampire_moonless_moor", + }, + + // ── Zone 11: Sunken Crypt ───────────────────────────────────────────────── + { + description: "The crypt sank beneath a lake centuries ago — no one remembers whether by accident or design. Your thralls dive through freezing black water to reach the outer gates and report that the doors are still sealed from the inside.", + combatPowerRequired: 380_000, + durationSeconds: 345_600, + id: "descent_to_the_crypt", + name: "Descent to the Crypt", + prerequisiteIds: [], + rewards: [ { amount: 4_000_000_000_000_000_000_000, type: "blood" }, { amount: 30_000, type: "ichor" }, { amount: 30, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_sunken_crypt", + }, + { + description: "The crypt's interior is still dry — sealed by wards that kept the water out even as the stone sank. The wards are old and beginning to fail. Your thralls shore them up, not out of preservation instinct, but because a flooded crypt is useless.", + combatPowerRequired: 470_000, + durationSeconds: 432_000, + id: "shoring_the_wards", + name: "Shoring the Wards", + prerequisiteIds: [ "descent_to_the_crypt" ], + rewards: [ { amount: 10_000_000_000_000_000_000_000, type: "blood" }, { amount: 60_000, type: "ichor" }, { amount: 60, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_sunken_crypt", + }, + { + description: "The crypt's occupants — vampires who chose to seal themselves in before the sinking — are still present, in a state of suspended torpor. Some can be woken. Most cannot. The ones that can are disoriented, loyal to no one, and very, very hungry.", + combatPowerRequired: 580_000, + durationSeconds: 518_400, + id: "waking_the_entombed", + name: "Waking the Entombed", + prerequisiteIds: [ "shoring_the_wards" ], + rewards: [ { amount: 25_000_000_000_000_000_000_000, type: "blood" }, { amount: 100_000, type: "ichor" }, { amount: 100, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_sunken_crypt", + }, + { + description: "The crypt's deepest chamber holds the archives of the vampire who commissioned it — centuries of blood-records, debt-ledgers, and territorial claims. Most of the claims are still valid. You collect them and file them under your name.", + combatPowerRequired: 720_000, + durationSeconds: 604_800, + id: "the_crypt_archives", + name: "The Crypt Archives", + prerequisiteIds: [ "waking_the_entombed" ], + rewards: [ { amount: 60_000_000_000_000_000_000_000, type: "blood" }, { amount: 160_000, type: "ichor" }, { amount: 160, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_sunken_crypt", + }, + { + description: "You drain the lake. It takes time and resources and causes an impressive local catastrophe, but when the water is gone, the crypt stands exposed — yours without qualification, its secrets and stores and sleeping occupants all accounted for.", + combatPowerRequired: 900_000, + durationSeconds: 691_200, + id: "sunken_depths", + name: "Sunken Depths", + prerequisiteIds: [ "the_crypt_archives" ], + rewards: [ + { amount: 150_000_000_000_000_000_000_000, type: "blood" }, + { amount: 250_000, type: "ichor" }, + { amount: 250, type: "soulShards" }, + { targetId: "crimson_shade", type: "thrall" }, + ], + status: "locked", + zoneId: "vampire_sunken_crypt", + }, + + // ── Zone 12: Desecrated Sanctum ─────────────────────────────────────────── + { + description: "The sanctum was holy once — devoted to a god whose name no one is careful enough to speak aloud. Something desecrated it before you arrived. You are here to learn what, and to take what was left behind.", + combatPowerRequired: 1_050_000, + durationSeconds: 432_000, + id: "the_first_desecration", + name: "The First Desecration", + prerequisiteIds: [], + rewards: [ { amount: 370_000_000_000_000_000_000_000, type: "blood" }, { amount: 80_000, type: "ichor" }, { amount: 80, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_desecrated_sanctum", + }, + { + description: "The sanctum's corrupted priests — those who stayed after the desecration and were changed by it — still perform their rites in the ruins. The rites they perform now are very different from the ones they began with. Your thralls attend as uninvited witnesses and leave with transcripts.", + combatPowerRequired: 1_300_000, + durationSeconds: 518_400, + id: "witnessing_the_rites", + name: "Witnessing the Rites", + prerequisiteIds: [ "the_first_desecration" ], + rewards: [ { amount: 900_000_000_000_000_000_000_000, type: "blood" }, { amount: 150_000, type: "ichor" }, { amount: 150, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_desecrated_sanctum", + }, + { + description: "The entity that desecrated the sanctum left something of itself behind in the act — a residual impression in the stone, still active, still consuming the remaining consecration. Your thralls learn to draw from the impression before it exhausts itself.", + combatPowerRequired: 1_600_000, + durationSeconds: 604_800, + id: "drawing_from_the_impression", + name: "Drawing from the Impression", + prerequisiteIds: [ "witnessing_the_rites" ], + rewards: [ { amount: 2_200_000_000_000_000_000_000_000, type: "blood" }, { amount: 250_000, type: "ichor" }, { amount: 250, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_desecrated_sanctum", + }, + { + description: "Deep in the sanctum's ruined nave, a holy relic remains intact — refused by the desecration, too pure to be corrupted. Your thralls remove it carefully, and you study it, not for reverence, but for understanding what makes something too pure to break.", + combatPowerRequired: 2_000_000, + durationSeconds: 691_200, + id: "the_intact_relic", + name: "The Intact Relic", + prerequisiteIds: [ "drawing_from_the_impression" ], + rewards: [ { amount: 5_500_000_000_000_000_000_000_000, type: "blood" }, { amount: 380_000, type: "ichor" }, { amount: 380, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_desecrated_sanctum", + }, + { + description: "You complete the desecration — not because you worship what corrupted this place, but because you have decided it is yours now, and a half-desecrated sanctum is neither one thing nor the other. You make the choice absolute.", + combatPowerRequired: 2_500_000, + durationSeconds: 777_600, + id: "sanctum_desecration", + name: "Sanctum Desecration", + prerequisiteIds: [ "the_intact_relic" ], + rewards: [ + { amount: 14_000_000_000_000_000_000_000_000, type: "blood" }, + { amount: 550_000, type: "ichor" }, + { amount: 550, type: "soulShards" }, + { targetId: "veil_walker", type: "thrall" }, + ], + status: "locked", + zoneId: "vampire_desecrated_sanctum", + }, + + // ── Zone 13: Carrion Peaks ──────────────────────────────────────────────── + { + description: "The peaks are named for what circles above them — vast carrion birds with wingspans that blot out the stars, drawn by the accumulated death of centuries of high-altitude vampire warfare. Your thralls climb the lower slopes and take stock of what remains.", + combatPowerRequired: 3_000_000, + durationSeconds: 518_400, + id: "climbing_the_carrion_slopes", + name: "Climbing the Carrion Slopes", + prerequisiteIds: [], + rewards: [ { amount: 35_000_000_000_000_000_000_000_000, type: "blood" }, { amount: 175_000, type: "ichor" }, { amount: 175, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_carrion_peaks", + }, + { + description: "The peaks' vampire war-camps have been abandoned for decades — supplies left mid-use, weapons rusting in racks, blood-stores still sealed in their casks. You send your thralls to collect what time has preserved and clear out what it hasn't.", + combatPowerRequired: 3_700_000, + durationSeconds: 604_800, + id: "looting_the_war_camps", + name: "Looting the War-Camps", + prerequisiteIds: [ "climbing_the_carrion_slopes" ], + rewards: [ { amount: 85_000_000_000_000_000_000_000_000, type: "blood" }, { amount: 330_000, type: "ichor" }, { amount: 330, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_carrion_peaks", + }, + { + description: "The carrion birds are not merely scavengers. The largest of them have been fed on vampire blood for so long that they have developed a secondary appetite — for power itself. You hunt three of the eldest and take what they have accumulated.", + combatPowerRequired: 4_600_000, + durationSeconds: 691_200, + id: "hunting_the_elder_birds", + name: "Hunting the Elder Birds", + prerequisiteIds: [ "looting_the_war_camps" ], + rewards: [ { amount: 210_000_000_000_000_000_000_000_000, type: "blood" }, { amount: 520_000, type: "ichor" }, { amount: 520, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_carrion_peaks", + }, + { + description: "The highest summit of the Carrion Peaks holds a battlefield so old that the blood has turned to a crystallised crust across the stone. Your thralls chip it free and refine it — a process they describe as simultaneously disgusting and meditative.", + combatPowerRequired: 5_800_000, + durationSeconds: 777_600, + id: "the_crystallised_battlefield", + name: "The Crystallised Battlefield", + prerequisiteIds: [ "hunting_the_elder_birds" ], + rewards: [ { amount: 520_000_000_000_000_000_000_000_000, type: "blood" }, { amount: 800_000, type: "ichor" }, { amount: 800, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_carrion_peaks", + }, + { + description: "You stand at the highest point of the Carrion Peaks and let the birds circle. They are not a threat. They are a resource. You establish a protocol by which they deliver what they find to you, and in return you ensure they are never entirely without food.", + combatPowerRequired: 7_200_000, + durationSeconds: 864_000, + id: "carrion_ascent", + name: "Carrion Ascent", + prerequisiteIds: [ "the_crystallised_battlefield" ], + rewards: [ + { amount: 1_300_000_000_000_000_000_000_000_000, type: "blood" }, + { amount: 1_200_000, type: "ichor" }, + { amount: 1_200, type: "soulShards" }, + { targetId: "grave_warden", type: "thrall" }, + ], + status: "locked", + zoneId: "vampire_carrion_peaks", + }, + + // ── Zone 14: Bloodspire ─────────────────────────────────────────────────── + { + description: "The Bloodspire was grown, not built — a tower of crystallised blood that reaches above the cloud line, constructed by a vampire of incomprehensible age who then simply walked away from it. Its owner is listed as unknown in every record. You intend to change that.", + combatPowerRequired: 8_500_000, + durationSeconds: 604_800, + id: "approaching_the_spire", + name: "Approaching the Spire", + prerequisiteIds: [], + rewards: [ { amount: 3_200_000_000_000_000_000_000_000_000, type: "blood" }, { amount: 400_000, type: "ichor" }, { amount: 400, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_bloodspire", + }, + { + description: "The Spire's lower levels are inhabited by self-appointed guardians — vampires who attached themselves to the structure and refuse to admit it has no owner. You disabuse them of this notion and install your own.", + combatPowerRequired: 10_500_000, + durationSeconds: 691_200, + id: "displacing_the_guardians", + name: "Displacing the Guardians", + prerequisiteIds: [ "approaching_the_spire" ], + rewards: [ { amount: 8_000_000_000_000_000_000_000_000_000, type: "blood" }, { amount: 700_000, type: "ichor" }, { amount: 700, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_bloodspire", + }, + { + description: "The Spire grows a few inches per century as blood crystallises onto its surface. Your thralls learn to accelerate the process — feeding it what it needs to grow faster, to your specifications rather than its own slow inclination.", + combatPowerRequired: 13_000_000, + durationSeconds: 777_600, + id: "accelerating_the_growth", + name: "Accelerating the Growth", + prerequisiteIds: [ "displacing_the_guardians" ], + rewards: [ { amount: 20_000_000_000_000_000_000_000_000_000, type: "blood" }, { amount: 1_100_000, type: "ichor" }, { amount: 1_100, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_bloodspire", + }, + { + description: "Near the Spire's apex, the crystallised blood becomes translucent — thin enough that the light of stars filters through it, refracting into something that is neither light nor dark but both simultaneously. Your thralls spend days learning to collect it.", + combatPowerRequired: 16_000_000, + durationSeconds: 864_000, + id: "harvesting_starblood", + name: "Harvesting Starblood", + prerequisiteIds: [ "accelerating_the_growth" ], + rewards: [ { amount: 50_000_000_000_000_000_000_000_000_000, type: "blood" }, { amount: 1_600_000, type: "ichor" }, { amount: 1_600, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_bloodspire", + }, + { + description: "At the Spire's absolute peak, above the clouds and the cold, you claim the structure in its entirety. The crystal recognises you — or you recognise the crystal. The distinction stops mattering at this altitude.", + combatPowerRequired: 20_000_000, + durationSeconds: 950_400, + id: "spire_trials", + name: "Spire Trials", + prerequisiteIds: [ "harvesting_starblood" ], + rewards: [ + { amount: 125_000_000_000_000_000_000_000_000_000, type: "blood" }, + { amount: 2_300_000, type: "ichor" }, + { amount: 2_300, type: "soulShards" }, + { targetId: "soul_drinker", type: "thrall" }, + ], + status: "locked", + zoneId: "vampire_bloodspire", + }, + + // ── Zone 15: Shroud of Eternity ─────────────────────────────────────────── + { + description: "The Shroud is not a place, exactly — it is a condition that has taken on spatial qualities over millennia. Your thralls enter it with anchoring talismans and return somewhat diminished, as though something kept a small part of each of them as a toll.", + combatPowerRequired: 24_000_000, + durationSeconds: 691_200, + id: "entering_the_shroud", + name: "Entering the Shroud", + prerequisiteIds: [], + rewards: [ { amount: 310_000_000_000_000_000_000_000_000_000, type: "blood" }, { amount: 700_000, type: "ichor" }, { amount: 700, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_shroud_of_eternity", + }, + { + description: "The Shroud's memory is long — it has preserved fragments of every significant vampire event that occurred within or near it. Your thralls learn to read the fragments, piecing together a history that no living vampire has assembled.", + combatPowerRequired: 30_000_000, + durationSeconds: 777_600, + id: "reading_the_shrouds_memory", + name: "Reading the Shroud's Memory", + prerequisiteIds: [ "entering_the_shroud" ], + rewards: [ { amount: 780_000_000_000_000_000_000_000_000_000, type: "blood" }, { amount: 1_200_000, type: "ichor" }, { amount: 1_200, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_shroud_of_eternity", + }, + { + description: "The Shroud contains what it calls its Permanent Residents — vampires so old they have become partially integrated with the fabric of eternity itself. They are not hostile. They are barely anything at all. You have careful conversations with a few of them.", + combatPowerRequired: 38_000_000, + durationSeconds: 864_000, + id: "the_permanent_residents", + name: "The Permanent Residents", + prerequisiteIds: [ "reading_the_shrouds_memory" ], + rewards: [ { amount: 2_000_000_000_000_000_000_000_000_000_000, type: "blood" }, { amount: 2_000_000, type: "ichor" }, { amount: 2_000, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_shroud_of_eternity", + }, + { + description: "The Shroud protects something at its centre — a record of every vampire who has ever truly died, not just gone dormant. The record is vast. You read your own absence from it and understand, for the first time, what it means that you are still here.", + combatPowerRequired: 48_000_000, + durationSeconds: 950_400, + id: "the_book_of_endings", + name: "The Book of Endings", + prerequisiteIds: [ "the_permanent_residents" ], + rewards: [ { amount: 5_000_000_000_000_000_000_000_000_000_000, type: "blood" }, { amount: 3_200_000, type: "ichor" }, { amount: 3_200, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_shroud_of_eternity", + }, + { + description: "You weave yourself into the Shroud's fabric — not as a resident, but as a thread it must account for. Eternity makes room for you. It does not have a choice. You have made yourself too large to ignore.", + combatPowerRequired: 60_000_000, + durationSeconds: 1_036_800, + id: "eternal_shroud", + name: "Eternal Shroud", + prerequisiteIds: [ "the_book_of_endings" ], + rewards: [ + { amount: 12_500_000_000_000_000_000_000_000_000_000, type: "blood" }, + { amount: 5_000_000, type: "ichor" }, + { amount: 5_000, type: "soulShards" }, + { targetId: "blood_ancient", type: "thrall" }, + ], + status: "locked", + zoneId: "vampire_shroud_of_eternity", + }, + + // ── Zone 16: Abyssal Vault ──────────────────────────────────────────────── + { + description: "The Vault predates vampires — it was built by something older to contain something it feared. Your thralls breach the outer seals and report that the interior is not empty, but that what inhabits it seems, tentatively, curious rather than hostile.", + combatPowerRequired: 75_000_000, + durationSeconds: 864_000, + id: "breaching_the_outer_seals", + name: "Breaching the Outer Seals", + prerequisiteIds: [], + rewards: [ { amount: 31_000_000_000_000_000_000_000_000_000_000, type: "blood" }, { amount: 1_700_000, type: "ichor" }, { amount: 1_700, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_abyssal_vault", + }, + { + description: "The Vault's inner structure is a series of concentric containment rings, each stronger than the last and each broken from the inside at some point in the deep past. Whatever was contained here broke free long ago. What remains is just the container.", + combatPowerRequired: 95_000_000, + durationSeconds: 950_400, + id: "mapping_the_containment_rings", + name: "Mapping the Containment Rings", + prerequisiteIds: [ "breaching_the_outer_seals" ], + rewards: [ { amount: 78_000_000_000_000_000_000_000_000_000_000, type: "blood" }, { amount: 3_000_000, type: "ichor" }, { amount: 3_000, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_abyssal_vault", + }, + { + description: "The Vault's deepest ring still holds a residual impression of the thing that was contained here — not the thing itself, but its shape in the matter around it. Your thralls learn to read the shape and from it deduce what the original inhabitants feared enough to seal away.", + combatPowerRequired: 120_000_000, + durationSeconds: 1_036_800, + id: "reading_the_impression", + name: "Reading the Impression", + prerequisiteIds: [ "mapping_the_containment_rings" ], + rewards: [ { amount: 195_000_000_000_000_000_000_000_000_000_000, type: "blood" }, { amount: 5_000_000, type: "ichor" }, { amount: 5_000, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_abyssal_vault", + }, + { + description: "The impression contains knowledge — the original inhabitants encoded what they knew into the containment structure itself, as insurance. Your thralls decode sections of it: methods for working with abyssal energy that no living practitioner has used in recorded history.", + combatPowerRequired: 150_000_000, + durationSeconds: 1_123_200, + id: "the_encoded_knowledge", + name: "The Encoded Knowledge", + prerequisiteIds: [ "reading_the_impression" ], + rewards: [ { amount: 490_000_000_000_000_000_000_000_000_000_000, type: "blood" }, { amount: 8_000_000, type: "ichor" }, { amount: 8_000, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_abyssal_vault", + }, + { + description: "You take the Vault's secrets. Not by force — there is nothing left here to resist — but by comprehension. You understand what this place was, what it held, what it feared, and what that fear implies about the abyss that waits further ahead. This understanding is the last key.", + combatPowerRequired: 190_000_000, + durationSeconds: 1_209_600, + id: "vault_secrets", + name: "Vault Secrets", + prerequisiteIds: [ "the_encoded_knowledge" ], + rewards: [ + { amount: 1_230_000_000_000_000_000_000_000_000_000_000, type: "blood" }, + { amount: 12_000_000, type: "ichor" }, + { amount: 12_000, type: "soulShards" }, + { targetId: "eternal_shade", type: "thrall" }, + ], + status: "locked", + zoneId: "vampire_abyssal_vault", + }, + + // ── Zone 17: Court of Whispers ──────────────────────────────────────────── + { + description: "The Court of Whispers has no physical location — it convenes wherever its members agree to meet, which changes each time to prevent ambushes. You receive your first invitation via a message written in blood on a mirror you were not looking at a moment before.", + combatPowerRequired: 230_000_000, + durationSeconds: 1_036_800, + id: "the_first_invitation", + name: "The First Invitation", + prerequisiteIds: [], + rewards: [ { amount: 3_000_000_000_000_000_000_000_000_000_000_000, type: "blood" }, { amount: 4_000_000, type: "ichor" }, { amount: 4_000, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_court_of_whispers", + }, + { + description: "The Court's members are the oldest surviving vampires who still choose to participate in the world. Each meeting is a negotiation of continued existence. You attend three sessions and say almost nothing. The Court takes note. Silence, here, is its own kind of speech.", + combatPowerRequired: 290_000_000, + durationSeconds: 1_123_200, + id: "attending_the_sessions", + name: "Attending the Sessions", + prerequisiteIds: [ "the_first_invitation" ], + rewards: [ { amount: 7_500_000_000_000_000_000_000_000_000_000_000, type: "blood" }, { amount: 7_000_000, type: "ichor" }, { amount: 7_000, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_court_of_whispers", + }, + { + description: "The Court's eldest member approaches you privately and offers a test: resolve a dispute between two other members that has persisted for three hundred years without allowing either party to realise they have been managed. You succeed. It takes seven sessions.", + combatPowerRequired: 360_000_000, + durationSeconds: 1_209_600, + id: "the_three_century_dispute", + name: "The Three-Century Dispute", + prerequisiteIds: [ "attending_the_sessions" ], + rewards: [ { amount: 19_000_000_000_000_000_000_000_000_000_000_000, type: "blood" }, { amount: 11_000_000, type: "ichor" }, { amount: 11_000, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_court_of_whispers", + }, + { + description: "The Court's leadership position — the Chair of the First Whisper — has been vacant for a century, held empty by a collective agreement that no one was ready for it. Three members have begun manoeuvring to fill it. You ensure all three are quietly neutralised.", + combatPowerRequired: 450_000_000, + durationSeconds: 1_296_000, + id: "clearing_the_chair", + name: "Clearing the Chair", + prerequisiteIds: [ "the_three_century_dispute" ], + rewards: [ { amount: 48_000_000_000_000_000_000_000_000_000_000_000, type: "blood" }, { amount: 17_000_000, type: "ichor" }, { amount: 17_000, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_court_of_whispers", + }, + { + description: "The Court votes unanimously — a thing that has not happened in its entire history — to seat you in the Chair of the First Whisper. You accept. The whispers of the Court become yours to direct. Every secret becomes an instrument. The game, at last, is entirely yours.", + combatPowerRequired: 560_000_000, + durationSeconds: 1_382_400, + id: "court_whispers", + name: "Court Whispers", + prerequisiteIds: [ "clearing_the_chair" ], + rewards: [ + { amount: 120_000_000_000_000_000_000_000_000_000_000_000, type: "blood" }, + { amount: 25_000_000, type: "ichor" }, + { amount: 25_000, type: "soulShards" }, + { targetId: "void_revenant", type: "thrall" }, + ], + status: "locked", + zoneId: "vampire_court_of_whispers", + }, + + // ── Zone 18: Eternal Abyss ──────────────────────────────────────────────── + { + description: "The Abyss does not end. Your thralls descend into it and return without being able to say how far they went or how long they were falling. The Abyss does not resist entry. It simply does not acknowledge you yet. This is the beginning of the hardest negotiation of your existence.", + combatPowerRequired: 700_000_000, + durationSeconds: 1_209_600, + id: "the_first_descent", + name: "The First Descent", + prerequisiteIds: [], + rewards: [ { amount: 300_000_000_000_000_000_000_000_000_000_000_000, type: "blood" }, { amount: 8_000_000, type: "ichor" }, { amount: 8_000, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_eternal_abyss", + }, + { + description: "The Abyss has rules — not laws, but patterns that behave like laws if you are strong enough to observe them from the outside. Your thralls spend weeks cataloguing the patterns, losing a handful to ones they failed to observe correctly. The catalogue is worth the cost.", + combatPowerRequired: 880_000_000, + durationSeconds: 1_382_400, + id: "cataloguing_the_patterns", + name: "Cataloguing the Patterns", + prerequisiteIds: [ "the_first_descent" ], + rewards: [ { amount: 760_000_000_000_000_000_000_000_000_000_000_000, type: "blood" }, { amount: 15_000_000, type: "ichor" }, { amount: 15_000, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_eternal_abyss", + }, + { + description: "The Abyss's core — the part of it that is oldest and most itself — contains the residual consciousness of every vampire who ever fell into it and did not return. They have been here long enough to stop being themselves. You speak to the composite that remains.", + combatPowerRequired: 1_100_000_000, + durationSeconds: 1_555_200, + id: "speaking_to_the_composite", + name: "Speaking to the Composite", + prerequisiteIds: [ "cataloguing_the_patterns" ], + rewards: [ { amount: 1_900_000_000_000_000_000_000_000_000_000_000_000, type: "blood" }, { amount: 28_000_000, type: "ichor" }, { amount: 28_000, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_eternal_abyss", + }, + { + description: "The Abyss offers you a choice it has never offered anything before: become part of it, or become its sovereign. The choice has a weight to it that presses against the inside of your chest like a second heartbeat. You consider it for a long time — measured in orbits, not hours.", + combatPowerRequired: 1_400_000_000, + durationSeconds: 1_728_000, + id: "the_sovereigns_choice", + name: "The Sovereign's Choice", + prerequisiteIds: [ "speaking_to_the_composite" ], + rewards: [ { amount: 4_800_000_000_000_000_000_000_000_000_000_000_000, type: "blood" }, { amount: 50_000_000, type: "ichor" }, { amount: 50_000, type: "soulShards" } ], + status: "locked", + zoneId: "vampire_eternal_abyss", + }, + { + description: "You choose sovereignty. The Abyss accepts. The eternal dark bends — not breaks, but yields in the specific way that living things yield to those who have earned the right to ask. You are no longer a creature of the night. You are what the night answers to. This is where eternity begins.", + combatPowerRequired: 1_800_000_000, + durationSeconds: 1_900_800, + id: "abyss_eternal", + name: "Abyss Eternal", + prerequisiteIds: [ "the_sovereigns_choice" ], + rewards: [ + { amount: 12_000_000_000_000_000_000_000_000_000_000_000_000, type: "blood" }, + { amount: 100_000_000, type: "ichor" }, + { amount: 100_000, type: "soulShards" }, + { targetId: "crimson_invoker", type: "thrall" }, + ], + status: "locked", + zoneId: "vampire_eternal_abyss", + }, +]; diff --git a/apps/api/src/data/vampireSiringUpgrades.ts b/apps/api/src/data/vampireSiringUpgrades.ts new file mode 100644 index 0000000..1c16e27 --- /dev/null +++ b/apps/api/src/data/vampireSiringUpgrades.ts @@ -0,0 +1,216 @@ +/** + * @file Game data definitions. + * @copyright nhcarrigan + * @license Naomi's Public License + * @author Naomi Carrigan + */ +/* eslint-disable stylistic/max-len -- Data content */ +import type { SiringUpgrade } from "@elysium/types"; + +export const defaultVampireSiringUpgrades: Array = [ + // ── Blood income ───────────────────────────────────────────────────────── + { + category: "blood", + description: "The first drop of ichor transforms your blood instinct. All blood/s ×1.25.", + ichorCost: 5, + id: "siring_blood_1", + multiplier: 1.25, + name: "Ichor Awakening I", + }, + { + category: "blood", + description: "Sustained siring deepens the hunger that drives every thrall. All blood/s ×1.5.", + ichorCost: 15, + id: "siring_blood_2", + multiplier: 1.5, + name: "Ichor Awakening II", + }, + { + category: "blood", + description: "Each siring sharpens your command over the blood flow. All blood/s ×2.", + ichorCost: 40, + id: "siring_blood_3", + multiplier: 2, + name: "Ichor Awakening III", + }, + { + category: "blood", + description: "The bloodline resonates across every hunt and harvest. All blood/s ×5.", + ichorCost: 120, + id: "siring_blood_4", + multiplier: 5, + name: "Ichor Awakening IV", + }, + { + category: "blood", + description: "Total mastery of the siring-blood bond multiplies all income tenfold. All blood/s ×10.", + ichorCost: 350, + id: "siring_blood_5", + multiplier: 10, + name: "Ichor Awakening V", + }, + { + category: "blood", + description: "The accumulated weight of many sirings floods every vein in your domain. All blood/s ×25.", + ichorCost: 1_000, + id: "siring_blood_6", + multiplier: 25, + name: "Ichor Awakening VI", + }, + // ── Thrall strength ─────────────────────────────────────────────────────── + { + category: "thralls", + description: "Sired blood flows through your thralls, amplifying their natural power. All thrall blood/s ×1.5.", + ichorCost: 8, + id: "siring_thralls_1", + multiplier: 1.5, + name: "Bloodline Bond I", + }, + { + category: "thralls", + description: "The bond between sire and thrall deepens, multiplying their output. All thrall blood/s ×2.", + ichorCost: 25, + id: "siring_thralls_2", + multiplier: 2, + name: "Bloodline Bond II", + }, + { + category: "thralls", + description: "Every thrall in your bloodline fights and works with supernatural coordination. All thrall blood/s ×3.", + ichorCost: 75, + id: "siring_thralls_3", + multiplier: 3, + name: "Bloodline Bond III", + }, + { + category: "thralls", + description: "The siring bond reaches its apex — every thrall becomes an extension of your will. All thrall blood/s ×5.", + ichorCost: 200, + id: "siring_thralls_4", + multiplier: 5, + name: "Bloodline Bond IV", + }, + // ── Combat power ────────────────────────────────────────────────────────── + { + category: "combat", + description: "Sired instincts sharpen your thralls' fighting edge. All thrall combat power ×1.5.", + ichorCost: 12, + id: "siring_combat_1", + multiplier: 1.5, + name: "Dark Predator I", + }, + { + category: "combat", + description: "The predator's cunning passed through siring doubles your combat effectiveness. All thrall combat power ×2.", + ichorCost: 45, + id: "siring_combat_2", + multiplier: 2, + name: "Dark Predator II", + }, + { + category: "combat", + description: "Centuries of accumulated battle memory flood into your line. All thrall combat power ×3.", + ichorCost: 150, + id: "siring_combat_3", + multiplier: 3, + name: "Dark Predator III", + }, + { + category: "combat", + description: "The ultimate expression of vampire combat mastery through the siring ritual. All thrall combat power ×5.", + ichorCost: 500, + id: "siring_combat_4", + multiplier: 5, + name: "Dark Predator IV", + }, + // ── Ichor yield ─────────────────────────────────────────────────────────── + { + category: "ichor", + description: "The ritual of siring becomes more efficient, preserving greater ichor yield. Ichor per siring ×1.5.", + ichorCost: 20, + id: "siring_ichor_1", + multiplier: 1.5, + name: "Refined Siring I", + }, + { + category: "ichor", + description: "Deeper siring mastery extracts twice the ichor from every reset. Ichor per siring ×2.", + ichorCost: 60, + id: "siring_ichor_2", + multiplier: 2, + name: "Refined Siring II", + }, + { + category: "ichor", + description: "The siring ritual refined to its peak triples the ichor yield at reset. Ichor per siring ×3.", + ichorCost: 180, + id: "siring_ichor_3", + multiplier: 3, + name: "Refined Siring III", + }, + // ── Utility ─────────────────────────────────────────────────────────────── + { + category: "utility", + description: "Siring instinct reduces the blood threshold needed for the next siring by 10%.", + ichorCost: 30, + id: "siring_threshold_1", + multiplier: 0.9, + name: "Blood Efficiency I", + }, + { + category: "utility", + description: "Further refinement lowers the siring threshold by an additional 15%.", + ichorCost: 90, + id: "siring_threshold_2", + multiplier: 0.85, + name: "Blood Efficiency II", + }, + { + category: "utility", + description: "The siring rite becomes almost effortless — threshold reduced by another 20%.", + ichorCost: 270, + id: "siring_threshold_3", + multiplier: 0.8, + name: "Blood Efficiency III", + }, + { + category: "utility", + description: "Peak efficiency — the blood threshold for siring is reduced by a further 25%.", + ichorCost: 800, + id: "siring_threshold_4", + multiplier: 0.75, + name: "Blood Efficiency IV", + }, + { + category: "utility", + description: "An ancient siring ritual accelerates the arrival of the first thrall class after each siring.", + ichorCost: 50, + id: "siring_quick_start_1", + multiplier: 1.5, + name: "Quick Fledglings I", + }, + { + category: "utility", + description: "The first fledglings after siring arrive faster and work harder for longer.", + ichorCost: 150, + id: "siring_quick_start_2", + multiplier: 2, + name: "Quick Fledglings II", + }, + { + category: "utility", + description: "Your siring bloodline passively preserves a fraction of your thrall efficiency across resets.", + ichorCost: 250, + id: "siring_persistence_1", + multiplier: 1.25, + name: "Bloodline Memory I", + }, + { + category: "utility", + description: "The bloodline memory deepens — even more efficiency is preserved through each siring.", + ichorCost: 750, + id: "siring_persistence_2", + multiplier: 1.5, + name: "Bloodline Memory II", + }, +]; diff --git a/apps/api/src/data/vampireThralls.ts b/apps/api/src/data/vampireThralls.ts new file mode 100644 index 0000000..4f91361 --- /dev/null +++ b/apps/api/src/data/vampireThralls.ts @@ -0,0 +1,402 @@ +/** + * @file Game data definitions. + * @copyright nhcarrigan + * @license Naomi's Public License + * @author Naomi Carrigan + */ + +/* eslint-disable max-lines -- Data file */ +import type { VampireThrall } from "@elysium/types"; + +export const defaultVampireThralls: Array = [ + // ── Fledgling (5 tiers) ─────────────────────────────────────────────────── + { + baseCost: 1, + bloodPerSecond: 0.1, + class: "fledgling", + combatPower: 1, + count: 0, + ichorPerSecond: 0, + id: "fledgling_1", + level: 1, + name: "Fledgling", + unlocked: true, + }, + { + baseCost: 8, + bloodPerSecond: 0.5, + class: "fledgling", + combatPower: 3, + count: 0, + ichorPerSecond: 0, + id: "fledgling_2", + level: 2, + name: "Hungry Fledgling", + unlocked: false, + }, + { + baseCost: 80, + bloodPerSecond: 2, + class: "fledgling", + combatPower: 8, + count: 0, + ichorPerSecond: 0.01, + id: "fledgling_3", + level: 3, + name: "Feral Fledgling", + unlocked: false, + }, + { + baseCost: 700, + bloodPerSecond: 7, + class: "fledgling", + combatPower: 20, + count: 0, + ichorPerSecond: 0.02, + id: "fledgling_4", + level: 4, + name: "Blooded Fledgling", + unlocked: false, + }, + { + baseCost: 5_000, + bloodPerSecond: 20, + class: "fledgling", + combatPower: 50, + count: 0, + ichorPerSecond: 0.05, + id: "fledgling_5", + level: 5, + name: "Seasoned Fledgling", + unlocked: false, + }, + // ── Revenant (5 tiers) ──────────────────────────────────────────────────── + { + baseCost: 35_000, + bloodPerSecond: 50, + class: "revenant", + combatPower: 120, + count: 0, + ichorPerSecond: 0.1, + id: "revenant_1", + level: 6, + name: "Revenant", + unlocked: false, + }, + { + baseCost: 250_000, + bloodPerSecond: 150, + class: "revenant", + combatPower: 300, + count: 0, + ichorPerSecond: 0.2, + id: "revenant_2", + level: 7, + name: "Battle Revenant", + unlocked: false, + }, + { + baseCost: 2_000_000, + bloodPerSecond: 400, + class: "revenant", + combatPower: 750, + count: 0, + ichorPerSecond: 0.5, + id: "revenant_3", + level: 8, + name: "Ancient Revenant", + unlocked: false, + }, + { + baseCost: 15_000_000, + bloodPerSecond: 1_000, + class: "revenant", + combatPower: 1_800, + count: 0, + ichorPerSecond: 1, + id: "revenant_4", + level: 9, + name: "Elite Revenant", + unlocked: false, + }, + { + baseCost: 120_000_000, + bloodPerSecond: 2_500, + class: "revenant", + combatPower: 4_000, + count: 0, + ichorPerSecond: 2, + id: "revenant_5", + level: 10, + name: "Undying Revenant", + unlocked: false, + }, + // ── Shade (6 tiers) ─────────────────────────────────────────────────────── + { + baseCost: 800_000_000, + bloodPerSecond: 6_000, + class: "shade", + combatPower: 9_000, + count: 0, + ichorPerSecond: 5, + id: "shade_1", + level: 11, + name: "Shade", + unlocked: false, + }, + { + baseCost: 6_000_000_000, + bloodPerSecond: 15_000, + class: "shade", + combatPower: 20_000, + count: 0, + ichorPerSecond: 10, + id: "shade_2", + level: 12, + name: "Shadow Shade", + unlocked: false, + }, + { + baseCost: 45_000_000_000, + bloodPerSecond: 35_000, + class: "shade", + combatPower: 45_000, + count: 0, + ichorPerSecond: 20, + id: "shade_3", + level: 13, + name: "Veil Shade", + unlocked: false, + }, + { + baseCost: 350_000_000_000, + bloodPerSecond: 80_000, + class: "shade", + combatPower: 100_000, + count: 0, + ichorPerSecond: 40, + id: "shade_4", + level: 14, + name: "Phantom Shade", + unlocked: false, + }, + { + baseCost: 2_700_000_000_000, + bloodPerSecond: 180_000, + class: "shade", + combatPower: 220_000, + count: 0, + ichorPerSecond: 80, + id: "shade_5", + level: 15, + name: "Wraith Shade", + unlocked: false, + }, + { + baseCost: 21_000_000_000_000, + bloodPerSecond: 400_000, + class: "shade", + combatPower: 480_000, + count: 0, + ichorPerSecond: 150, + id: "shade_6", + level: 16, + name: "Eternal Shade", + unlocked: false, + }, + // ── Bloodbound (6 tiers) ────────────────────────────────────────────────── + { + baseCost: 160_000_000_000_000, + bloodPerSecond: 900_000, + class: "bloodbound", + combatPower: 1_050_000, + count: 0, + ichorPerSecond: 300, + id: "bloodbound_1", + level: 17, + name: "Bloodbound", + unlocked: false, + }, + { + baseCost: 1_250_000_000_000_000, + bloodPerSecond: 2_000_000, + class: "bloodbound", + combatPower: 2_300_000, + count: 0, + ichorPerSecond: 600, + id: "bloodbound_2", + level: 18, + name: "Crimson Bloodbound", + unlocked: false, + }, + { + baseCost: 10_000_000_000_000_000, + bloodPerSecond: 4_500_000, + class: "bloodbound", + combatPower: 5_000_000, + count: 0, + ichorPerSecond: 1_200, + id: "bloodbound_3", + level: 19, + name: "Elder Bloodbound", + unlocked: false, + }, + { + baseCost: 80_000_000_000_000_000, + bloodPerSecond: 10_000_000, + class: "bloodbound", + combatPower: 11_000_000, + count: 0, + ichorPerSecond: 2_500, + id: "bloodbound_4", + level: 20, + name: "Oath Bloodbound", + unlocked: false, + }, + { + baseCost: 650_000_000_000_000_000, + bloodPerSecond: 22_000_000, + class: "bloodbound", + combatPower: 24_000_000, + count: 0, + ichorPerSecond: 5_000, + id: "bloodbound_5", + level: 21, + name: "Ancient Bloodbound", + unlocked: false, + }, + { + baseCost: 5_200_000_000_000_000_000, + bloodPerSecond: 50_000_000, + class: "bloodbound", + combatPower: 54_000_000, + count: 0, + ichorPerSecond: 10_000, + id: "bloodbound_6", + level: 22, + name: "Eternal Bloodbound", + unlocked: false, + }, + // ── Wraith (5 tiers) ────────────────────────────────────────────────────── + { + baseCost: 4e19, + bloodPerSecond: 110_000_000, + class: "wraith", + combatPower: 120_000_000, + count: 0, + ichorPerSecond: 20_000, + id: "wraith_1", + level: 23, + name: "Wraith", + unlocked: false, + }, + { + baseCost: 3.5e20, + bloodPerSecond: 250_000_000, + class: "wraith", + combatPower: 270_000_000, + count: 0, + ichorPerSecond: 40_000, + id: "wraith_2", + level: 24, + name: "Banshee Wraith", + unlocked: false, + }, + { + baseCost: 2.8e21, + bloodPerSecond: 560_000_000, + class: "wraith", + combatPower: 600_000_000, + count: 0, + ichorPerSecond: 80_000, + id: "wraith_3", + level: 25, + name: "Spectral Wraith", + unlocked: false, + }, + { + baseCost: 2.2e22, + bloodPerSecond: 1_250_000_000, + class: "wraith", + combatPower: 1_350_000_000, + count: 0, + ichorPerSecond: 160_000, + id: "wraith_4", + level: 26, + name: "Elder Wraith", + unlocked: false, + }, + { + baseCost: 1.8e23, + bloodPerSecond: 2_800_000_000, + class: "wraith", + combatPower: 3_000_000_000, + count: 0, + ichorPerSecond: 320_000, + id: "wraith_5", + level: 27, + name: "Eternal Wraith", + unlocked: false, + }, + // ── Ancient (5 tiers) ───────────────────────────────────────────────────── + { + baseCost: 1.5e24, + bloodPerSecond: 6_500_000_000, + class: "ancient", + combatPower: 7_000_000_000, + count: 0, + ichorPerSecond: 650_000, + id: "ancient_1", + level: 28, + name: "Ancient", + unlocked: false, + }, + { + baseCost: 1.2e25, + bloodPerSecond: 15_000_000_000, + class: "ancient", + combatPower: 16_000_000_000, + count: 0, + ichorPerSecond: 1_300_000, + id: "ancient_2", + level: 29, + name: "Bloodline Ancient", + unlocked: false, + }, + { + baseCost: 1e26, + bloodPerSecond: 35_000_000_000, + class: "ancient", + combatPower: 37_000_000_000, + count: 0, + ichorPerSecond: 2_600_000, + id: "ancient_3", + level: 30, + name: "Elder Ancient", + unlocked: false, + }, + { + baseCost: 8e26, + bloodPerSecond: 80_000_000_000, + class: "ancient", + combatPower: 85_000_000_000, + count: 0, + ichorPerSecond: 5_200_000, + id: "ancient_4", + level: 31, + name: "Apex Ancient", + unlocked: false, + }, + { + baseCost: 6.5e27, + bloodPerSecond: 180_000_000_000, + class: "ancient", + combatPower: 200_000_000_000, + count: 0, + ichorPerSecond: 10_000_000, + id: "ancient_5", + level: 32, + name: "Eternal Ancient", + unlocked: false, + }, +]; diff --git a/apps/api/src/data/vampireUpgrades.ts b/apps/api/src/data/vampireUpgrades.ts new file mode 100644 index 0000000..d86e4fa --- /dev/null +++ b/apps/api/src/data/vampireUpgrades.ts @@ -0,0 +1,725 @@ +/** + * @file Game data definitions. + * @copyright nhcarrigan + * @license Naomi's Public License + * @author Naomi Carrigan + */ +/* eslint-disable max-lines -- Data file */ +/* eslint-disable stylistic/max-len -- Data content */ +import type { VampireUpgrade } from "@elysium/types"; + +export const defaultVampireUpgrades: Array = [ + // ── Blood Income (18) ───────────────────────────────────────────────────── + { + costBlood: 50, + costIchor: 0, + costSoulShards: 0, + description: "The first taste of blood sharpens the hunt. All blood/s ×1.25.", + id: "blood_hunt_1", + multiplier: 1.25, + name: "Blood Hunt I", + purchased: false, + target: "blood", + unlocked: true, + }, + { + costBlood: 200, + costIchor: 0, + costSoulShards: 0, + description: "A sustained hunting rhythm doubles the efficiency of every harvest. All blood/s ×1.5.", + id: "blood_hunt_2", + multiplier: 1.5, + name: "Blood Hunt II", + purchased: false, + target: "blood", + unlocked: true, + }, + { + costBlood: 1_000, + costIchor: 1, + costSoulShards: 0, + description: "The hunt becomes ritual — every drop flows with purpose. All blood/s ×2.", + id: "blood_hunt_3", + multiplier: 2, + name: "Blood Hunt III", + purchased: false, + target: "blood", + unlocked: true, + }, + { + costBlood: 5_000, + costIchor: 2, + costSoulShards: 0, + description: "The ritual deepens. Every vein in your domain opens wider. All blood/s ×3.", + id: "blood_hunt_4", + multiplier: 3, + name: "Blood Hunt IV", + purchased: false, + target: "blood", + unlocked: true, + }, + { + costBlood: 25_000, + costIchor: 5, + costSoulShards: 0, + description: "A hunter at full power commands the blood itself to flow. All blood/s ×5.", + id: "blood_hunt_5", + multiplier: 5, + name: "Blood Hunt V", + purchased: false, + target: "blood", + unlocked: true, + }, + { + costBlood: 100_000, + costIchor: 10, + costSoulShards: 0, + description: "Mastery of the hunt makes every moment a moment of feeding. All blood/s ×2.", + id: "blood_mastery_1", + multiplier: 2, + name: "Blood Mastery I", + purchased: false, + target: "blood", + unlocked: false, + }, + { + costBlood: 500_000, + costIchor: 25, + costSoulShards: 0, + description: "The second level of mastery reaches into the blood-flow itself. All blood/s ×3.", + id: "blood_mastery_2", + multiplier: 3, + name: "Blood Mastery II", + purchased: false, + target: "blood", + unlocked: false, + }, + { + costBlood: 2_500_000, + costIchor: 50, + costSoulShards: 1, + description: "The third level of mastery amplifies all income fivefold. All blood/s ×5.", + id: "blood_mastery_3", + multiplier: 5, + name: "Blood Mastery III", + purchased: false, + target: "blood", + unlocked: false, + }, + { + costBlood: 12_500_000, + costIchor: 100, + costSoulShards: 2, + description: "Total blood mastery — the hunger commands and the world obeys. All blood/s ×10.", + id: "blood_mastery_4", + multiplier: 10, + name: "Blood Mastery IV", + purchased: false, + target: "blood", + unlocked: false, + }, + { + costBlood: 75_000_000, + costIchor: 200, + costSoulShards: 3, + description: "A rising tide of crimson engulfs the entire domain. All blood/s ×5.", + id: "crimson_tide_1", + multiplier: 5, + name: "Crimson Tide I", + purchased: false, + target: "blood", + unlocked: false, + }, + { + costBlood: 500_000_000, + costIchor: 500, + costSoulShards: 5, + description: "The tide becomes a flood — no corner of your domain goes unwatered. All blood/s ×10.", + id: "crimson_tide_2", + multiplier: 10, + name: "Crimson Tide II", + purchased: false, + target: "blood", + unlocked: false, + }, + { + costBlood: 3_000_000_000, + costIchor: 1_000, + costSoulShards: 10, + description: "The flood becomes eternal — the blood never stops flowing. All blood/s ×25.", + id: "crimson_tide_3", + multiplier: 25, + name: "Crimson Tide III", + purchased: false, + target: "blood", + unlocked: false, + }, + { + costBlood: 20_000_000_000, + costIchor: 2_000, + costSoulShards: 15, + description: "The eternal thirst drives every thrall beyond their limits. All blood/s ×10.", + id: "eternal_thirst_1", + multiplier: 10, + name: "Eternal Thirst I", + purchased: false, + target: "blood", + unlocked: false, + }, + { + costBlood: 150_000_000_000, + costIchor: 5_000, + costSoulShards: 25, + description: "The second degree of eternal thirst saturates every hunting ground. All blood/s ×25.", + id: "eternal_thirst_2", + multiplier: 25, + name: "Eternal Thirst II", + purchased: false, + target: "blood", + unlocked: false, + }, + { + costBlood: 1_000_000_000_000, + costIchor: 10_000, + costSoulShards: 50, + description: "The final degree — the domain itself becomes a feeding ground. All blood/s ×50.", + id: "eternal_thirst_3", + multiplier: 50, + name: "Eternal Thirst III", + purchased: false, + target: "blood", + unlocked: false, + }, + { + costBlood: 8_000_000_000_000, + costIchor: 25_000, + costSoulShards: 75, + description: "Absolute sovereignty over blood — the vampire's birthright, fully claimed. All blood/s ×25.", + id: "blood_sovereignty_1", + multiplier: 25, + name: "Blood Sovereignty I", + purchased: false, + target: "blood", + unlocked: false, + }, + { + costBlood: 60_000_000_000_000, + costIchor: 50_000, + costSoulShards: 100, + description: "The sovereign's command extends to every drop in every vessel in every corner of the realm. All blood/s ×50.", + id: "blood_sovereignty_2", + multiplier: 50, + name: "Blood Sovereignty II", + purchased: false, + target: "blood", + unlocked: false, + }, + { + costBlood: 500_000_000_000_000, + costIchor: 100_000, + costSoulShards: 150, + description: "The apex of blood sovereignty — creation itself bows to your thirst. All blood/s ×100.", + id: "blood_sovereignty_3", + multiplier: 100, + name: "Blood Sovereignty III", + purchased: false, + target: "blood", + unlocked: false, + }, + // ── Thrall Upgrades (12, 2 per class) ──────────────────────────────────── + { + costBlood: 150, + costIchor: 0, + costSoulShards: 0, + description: "The fledglings learn to hunt more efficiently. Fledgling blood/s ×2.", + id: "thrall_fledgling_1", + multiplier: 2, + name: "Fledgling Training I", + purchased: false, + target: "thrall", + thrallId: "fledgling", + unlocked: true, + }, + { + costBlood: 2_000, + costIchor: 2, + costSoulShards: 0, + description: "Advanced fledgling conditioning multiplies their contribution. Fledgling blood/s ×4.", + id: "thrall_fledgling_2", + multiplier: 4, + name: "Fledgling Training II", + purchased: false, + target: "thrall", + thrallId: "fledgling", + unlocked: false, + }, + { + costBlood: 75_000, + costIchor: 5, + costSoulShards: 0, + description: "The revenant's battle instinct is sharpened to a fine edge. Revenant blood/s ×2.", + id: "thrall_revenant_1", + multiplier: 2, + name: "Revenant Conditioning I", + purchased: false, + target: "thrall", + thrallId: "revenant", + unlocked: false, + }, + { + costBlood: 1_500_000, + costIchor: 15, + costSoulShards: 0, + description: "Elite revenant training doubles their already formidable output. Revenant blood/s ×4.", + id: "thrall_revenant_2", + multiplier: 4, + name: "Revenant Conditioning II", + purchased: false, + target: "thrall", + thrallId: "revenant", + unlocked: false, + }, + { + costBlood: 5_000_000, + costIchor: 30, + costSoulShards: 0, + description: "The shade's shadow-walking technique is refined, producing greater yield. Shade blood/s ×2.", + id: "thrall_shade_1", + multiplier: 2, + name: "Shadow Arts I", + purchased: false, + target: "thrall", + thrallId: "shade", + unlocked: false, + }, + { + costBlood: 100_000_000, + costIchor: 75, + costSoulShards: 1, + description: "The shade's shadow-step accelerates their harvest considerably. Shade blood/s ×4.", + id: "thrall_shade_2", + multiplier: 4, + name: "Shadow Arts II", + purchased: false, + target: "thrall", + thrallId: "shade", + unlocked: false, + }, + { + costBlood: 500_000_000, + costIchor: 150, + costSoulShards: 2, + description: "The bloodbound oath is renewed with greater intensity. Bloodbound blood/s ×2.", + id: "thrall_bloodbound_1", + multiplier: 2, + name: "Oath Renewal I", + purchased: false, + target: "thrall", + thrallId: "bloodbound", + unlocked: false, + }, + { + costBlood: 10_000_000_000, + costIchor: 350, + costSoulShards: 4, + description: "The strongest oath forges an unbreakable bond that multiplies all output. Bloodbound blood/s ×4.", + id: "thrall_bloodbound_2", + multiplier: 4, + name: "Oath Renewal II", + purchased: false, + target: "thrall", + thrallId: "bloodbound", + unlocked: false, + }, + { + costBlood: 50_000_000_000, + costIchor: 700, + costSoulShards: 8, + description: "The wraith's ichor-feeding technique enters a new phase of efficiency. Wraith blood/s ×2.", + id: "thrall_wraith_1", + multiplier: 2, + name: "Wraith Mastery I", + purchased: false, + target: "thrall", + thrallId: "wraith", + unlocked: false, + }, + { + costBlood: 1_000_000_000_000, + costIchor: 1_500, + costSoulShards: 15, + description: "Total wraith mastery — they exist between states, harvesting from both. Wraith blood/s ×4.", + id: "thrall_wraith_2", + multiplier: 4, + name: "Wraith Mastery II", + purchased: false, + target: "thrall", + thrallId: "wraith", + unlocked: false, + }, + { + costBlood: 5_000_000_000_000, + costIchor: 3_000, + costSoulShards: 25, + description: "The ancient thralls remember techniques from before the oldest living vampires. Ancient blood/s ×2.", + id: "thrall_ancient_1", + multiplier: 2, + name: "Ancient Wisdom I", + purchased: false, + target: "thrall", + thrallId: "ancient", + unlocked: false, + }, + { + costBlood: 100_000_000_000_000, + costIchor: 7_500, + costSoulShards: 50, + description: "The ancient thralls operate at the peak of millennia of refinement. Ancient blood/s ×4.", + id: "thrall_ancient_2", + multiplier: 4, + name: "Ancient Wisdom II", + purchased: false, + target: "thrall", + thrallId: "ancient", + unlocked: false, + }, + // ── Global Upgrades (10) ────────────────────────────────────────────────── + { + costBlood: 10_000, + costIchor: 5, + costSoulShards: 0, + description: "All thralls synchronise their feeding — a whole greater than its parts. All blood/s ×1.5.", + id: "vampire_synergy_1", + multiplier: 1.5, + name: "Vampire Synergy I", + purchased: false, + target: "global", + unlocked: false, + }, + { + costBlood: 100_000, + costIchor: 20, + costSoulShards: 0, + description: "The synergy deepens — every domain element reinforces every other. All blood/s ×2.", + id: "vampire_synergy_2", + multiplier: 2, + name: "Vampire Synergy II", + purchased: false, + target: "global", + unlocked: false, + }, + { + costBlood: 1_000_000, + costIchor: 50, + costSoulShards: 1, + description: "Full synchronisation across the vampire domain triples all income. All blood/s ×3.", + id: "vampire_synergy_3", + multiplier: 3, + name: "Vampire Synergy III", + purchased: false, + target: "global", + unlocked: false, + }, + { + costBlood: 10_000_000, + costIchor: 100, + costSoulShards: 3, + description: "Perfect harmonic coordination across all vampire forces. All blood/s ×5.", + id: "vampire_synergy_4", + multiplier: 5, + name: "Vampire Synergy IV", + purchased: false, + target: "global", + unlocked: false, + }, + { + costBlood: 100_000_000, + costIchor: 200, + costSoulShards: 5, + description: "The apex of vampire domain synchronisation — a flawless, unified darkness. All blood/s ×10.", + id: "vampire_synergy_5", + multiplier: 10, + name: "Vampire Synergy V", + purchased: false, + target: "global", + unlocked: false, + }, + { + costBlood: 500_000_000, + costIchor: 500, + costSoulShards: 8, + description: "An ancient covenant between predator and prey amplifies all output. All blood/s ×5.", + id: "dark_covenant_1", + multiplier: 5, + name: "Dark Covenant I", + purchased: false, + target: "global", + unlocked: false, + }, + { + costBlood: 5_000_000_000, + costIchor: 1_500, + costSoulShards: 15, + description: "The covenant deepens into something approaching a law of nature. All blood/s ×10.", + id: "dark_covenant_2", + multiplier: 10, + name: "Dark Covenant II", + purchased: false, + target: "global", + unlocked: false, + }, + { + costBlood: 50_000_000_000, + costIchor: 5_000, + costSoulShards: 30, + description: "The final covenant makes the domain itself hunger on your behalf. All blood/s ×25.", + id: "dark_covenant_3", + multiplier: 25, + name: "Dark Covenant III", + purchased: false, + target: "global", + unlocked: false, + }, + { + costBlood: 500_000_000_000, + costIchor: 15_000, + costSoulShards: 50, + description: "The first step of blood ascension transcends the covenant. All blood/s ×25.", + id: "blood_ascension_1", + multiplier: 25, + name: "Blood Ascension I", + purchased: false, + target: "global", + unlocked: false, + }, + { + costBlood: 5_000_000_000_000, + costIchor: 50_000, + costSoulShards: 100, + description: "The final blood ascension — you become the very concept of the hunt. All blood/s ×50.", + id: "blood_ascension_2", + multiplier: 50, + name: "Blood Ascension II", + purchased: false, + target: "global", + unlocked: false, + }, + // ── Siring Upgrades (8) ─────────────────────────────────────────────────── + { + costBlood: 50_000, + costIchor: 10, + costSoulShards: 0, + description: "The first step toward mastering the siring rite. Siring blood threshold ×0.9.", + id: "siring_mastery_1", + multiplier: 0.9, + name: "Siring Mastery I", + purchased: false, + target: "siring", + unlocked: false, + }, + { + costBlood: 500_000, + costIchor: 30, + costSoulShards: 0, + description: "Deeper mastery of the siring rite reduces the cost further. Siring blood threshold ×0.85.", + id: "siring_mastery_2", + multiplier: 0.85, + name: "Siring Mastery II", + purchased: false, + target: "siring", + unlocked: false, + }, + { + costBlood: 5_000_000, + costIchor: 75, + costSoulShards: 1, + description: "The ritual becomes instinctive, requiring less sacrifice each time. Siring blood threshold ×0.8.", + id: "siring_mastery_3", + multiplier: 0.8, + name: "Siring Mastery III", + purchased: false, + target: "siring", + unlocked: false, + }, + { + costBlood: 50_000_000, + costIchor: 200, + costSoulShards: 3, + description: "Apex siring mastery — the bloodline answers with a fraction of the effort. Siring blood threshold ×0.75.", + id: "siring_mastery_4", + multiplier: 0.75, + name: "Siring Mastery IV", + purchased: false, + target: "siring", + unlocked: false, + }, + { + costBlood: 1_000_000_000, + costIchor: 500, + costSoulShards: 5, + description: "The bloodline's power carries a multiplier into every siring. Siring production multiplier ×1.5.", + id: "bloodline_power_1", + multiplier: 1.5, + name: "Bloodline Power I", + purchased: false, + target: "siring", + unlocked: false, + }, + { + costBlood: 10_000_000_000, + costIchor: 1_500, + costSoulShards: 10, + description: "The bloodline power doubles its influence over each new generation. Siring production multiplier ×2.", + id: "bloodline_power_2", + multiplier: 2, + name: "Bloodline Power II", + purchased: false, + target: "siring", + unlocked: false, + }, + { + costBlood: 100_000_000_000, + costIchor: 5_000, + costSoulShards: 20, + description: "The bloodline power reaches its third stage — threefold production. Siring production multiplier ×3.", + id: "bloodline_power_3", + multiplier: 3, + name: "Bloodline Power III", + purchased: false, + target: "siring", + unlocked: false, + }, + { + costBlood: 1_000_000_000_000, + costIchor: 15_000, + costSoulShards: 40, + description: "The apex bloodline power — fivefold production carries into every generation. Siring production multiplier ×5.", + id: "bloodline_power_4", + multiplier: 5, + name: "Bloodline Power IV", + purchased: false, + target: "siring", + unlocked: false, + }, + // ── Boss Upgrades (10) ──────────────────────────────────────────────────── + { + costBlood: 1_000, + costIchor: 1, + costSoulShards: 0, + description: "The hunter's instinct sharpens with each victory. Thrall combat power ×1.25.", + id: "hunter_instinct_1", + multiplier: 1.25, + name: "Hunter Instinct I", + purchased: false, + target: "boss", + unlocked: false, + }, + { + costBlood: 10_000, + costIchor: 5, + costSoulShards: 0, + description: "The instinct becomes method — every fight becomes a calculated feeding. Thrall combat power ×1.5.", + id: "hunter_instinct_2", + multiplier: 1.5, + name: "Hunter Instinct II", + purchased: false, + target: "boss", + unlocked: false, + }, + { + costBlood: 100_000, + costIchor: 15, + costSoulShards: 0, + description: "Method becomes mastery — the hunt reaches a new precision. Thrall combat power ×2.", + id: "hunter_instinct_3", + multiplier: 2, + name: "Hunter Instinct III", + purchased: false, + target: "boss", + unlocked: false, + }, + { + costBlood: 1_000_000, + costIchor: 40, + costSoulShards: 1, + description: "Peak hunting mastery — every thrall becomes a precision instrument of predation. Thrall combat power ×3.", + id: "hunter_instinct_4", + multiplier: 3, + name: "Hunter Instinct IV", + purchased: false, + target: "boss", + unlocked: false, + }, + { + costBlood: 10_000_000, + costIchor: 100, + costSoulShards: 2, + description: "The predator's sense detects weaknesses no eye can see. Thrall combat power ×2.", + id: "predator_sense_1", + multiplier: 2, + name: "Predator Sense I", + purchased: false, + target: "boss", + unlocked: false, + }, + { + costBlood: 100_000_000, + costIchor: 300, + costSoulShards: 5, + description: "The predator's sense reaches across zones — no prey is truly safe. Thrall combat power ×3.", + id: "predator_sense_2", + multiplier: 3, + name: "Predator Sense II", + purchased: false, + target: "boss", + unlocked: false, + }, + { + costBlood: 1_000_000_000, + costIchor: 1_000, + costSoulShards: 10, + description: "The apex predator sense collapses all opposition with surgical efficiency. Thrall combat power ×5.", + id: "predator_sense_3", + multiplier: 5, + name: "Predator Sense III", + purchased: false, + target: "boss", + unlocked: false, + }, + { + costBlood: 10_000_000_000, + costIchor: 3_000, + costSoulShards: 20, + description: "The first apex predator upgrade transcends ordinary vampire combat. Thrall combat power ×5.", + id: "apex_predator_1", + multiplier: 5, + name: "Apex Predator I", + purchased: false, + target: "boss", + unlocked: false, + }, + { + costBlood: 100_000_000_000, + costIchor: 10_000, + costSoulShards: 40, + description: "The second apex level — the domain produces warriors of legendary power. Thrall combat power ×10.", + id: "apex_predator_2", + multiplier: 10, + name: "Apex Predator II", + purchased: false, + target: "boss", + unlocked: false, + }, + { + costBlood: 1_000_000_000_000, + costIchor: 30_000, + costSoulShards: 75, + description: "The final apex level — combat power that can shatter ancient evils. Thrall combat power ×25.", + id: "apex_predator_3", + multiplier: 25, + name: "Apex Predator III", + purchased: false, + target: "boss", + unlocked: false, + }, +]; diff --git a/apps/api/src/data/vampireZones.ts b/apps/api/src/data/vampireZones.ts new file mode 100644 index 0000000..bc2a7e4 --- /dev/null +++ b/apps/api/src/data/vampireZones.ts @@ -0,0 +1,191 @@ +/** + * @file Game data definitions. + * @copyright nhcarrigan + * @license Naomi's Public License + * @author Naomi Carrigan + */ +/* eslint-disable stylistic/max-len -- Data content */ +import type { VampireZone } from "@elysium/types"; + +export const defaultVampireZones: Array = [ + { + description: + "Ancient burial catacombs stretching deep beneath a forgotten city. The dead here did not rest peacefully — they were turned, bound, and set to guard secrets that no longer have owners. A good place to learn what it means to hunt.", + emoji: "🪦", + id: "vampire_haunted_catacombs", + name: "Haunted Catacombs", + status: "unlocked", + unlockBossId: null, + unlockQuestId: null, + }, + { + description: + "A vast wetland soaked in centuries of spilled blood. The crimson mire never dries. The things that live here have adapted to drink the land itself, and they are not welcoming to rivals.", + emoji: "🩸", + id: "vampire_blood_mire", + name: "Blood Mire", + status: "locked", + unlockBossId: "catacomb_lord", + unlockQuestId: "catacombs_depths", + }, + { + description: + "A fortress carved entirely from volcanic obsidian, its walls absorbing light and returning nothing. The soldiers who garrison it have not needed sleep or food in longer than anyone can remember. The Keep does not fall. It merely waits.", + emoji: "🏯", + id: "vampire_obsidian_keep", + name: "Obsidian Keep", + status: "locked", + unlockBossId: "mire_sovereign", + unlockQuestId: "mire_ritual", + }, + { + description: + "The seat of an ancient vampire dynasty whose lineage predates recorded history. Every stone of the Crimson Citadel has been touched by blood magic. The court still convenes here, conducting business in a language of subtle power that outsiders rarely survive learning.", + emoji: "🏰", + id: "vampire_crimson_citadel", + name: "Crimson Citadel", + status: "locked", + unlockBossId: "keep_overlord", + unlockQuestId: "keep_conquest", + }, + { + description: + "A court that exists entirely in shadow — its members, its politics, its location. Alliances here are written in whispers and sealed with betrayal. The most dangerous thing about the Shadow Court is that you never know you have lost until it is already over.", + emoji: "🌑", + id: "vampire_shadow_court", + name: "Shadow Court", + status: "locked", + unlockBossId: "citadel_lord", + unlockQuestId: "citadel_siege", + }, + { + description: + "A charnel ground where plague vampires inter their dead — not out of respect, but to harvest what remains. The pestilence that festers here is not disease in any mortal sense. It is patient, intelligent, and perpetually hungry for new hosts.", + emoji: "💀", + id: "vampire_plague_ossuary", + name: "Plague Ossuary", + status: "locked", + unlockBossId: "shadow_monarch", + unlockQuestId: "shadow_ascension", + }, + { + description: + "A desolate expanse where ancient vampire wars reduced everything to ash and cinder. Nothing grows here. The revenants who patrol it have forgotten what they were fighting for; they have not forgotten how to fight.", + emoji: "🌋", + id: "vampire_ashen_wastes", + name: "Ashen Wastes", + status: "locked", + unlockBossId: "ossuary_overlord", + unlockQuestId: "ossuary_purification", + }, + { + description: + "An inescapable prison built to contain the most dangerous vampires ever captured. The wards that hold them were set by a power long since dead, and they are beginning to fade. The prisoners have had centuries to plan their response.", + emoji: "⛓️", + id: "vampire_iron_gaol", + name: "The Iron Gaol", + status: "locked", + unlockBossId: "wastes_warden", + unlockQuestId: "ash_domination", + }, + { + description: + "A sunken vale where the boundary between the living world and the shadow-realm grows thin. The creatures born here are neither fully present nor entirely absent — half-real entities that flicker in and out of visibility, leaving cold air and blood in their wake.", + emoji: "🕯️", + id: "vampire_veilborn_hollow", + name: "Veilborn Hollow", + status: "locked", + unlockBossId: "gaol_master", + unlockQuestId: "gaol_liberation", + }, + { + description: + "An endless expanse of fog-shrouded moorland where the moon has not risen in generations. The things that hunt here have evolved to navigate by blood-scent alone. The moor remembers every predator that has ever walked its surface.", + emoji: "🌫️", + id: "vampire_moonless_moor", + name: "Moonless Moor", + status: "locked", + unlockBossId: "veilborn_herald", + unlockQuestId: "veil_mastery", + }, + { + description: + "A vast necropolis built atop a flooded underground sea. The crypts stretch downward into pitch-black water, and the things sealed in the deepest chambers have been there since before the city above them was built. They are waiting for the water to recede.", + emoji: "🌊", + id: "vampire_sunken_crypt", + name: "The Sunken Crypt", + status: "locked", + unlockBossId: "moonless_warden", + unlockQuestId: "moor_conquest", + }, + { + description: + "A temple that was once a place of worship, now systematically stripped of every symbol, every relic, every remnant of its original purpose. The desecrators who occupy it did not destroy these things out of malice. They needed the space for something worse.", + emoji: "⛪", + id: "vampire_desecrated_sanctum", + name: "Desecrated Sanctum", + status: "locked", + unlockBossId: "crypt_ancient", + unlockQuestId: "sunken_conquest", + }, + { + description: + "A range of jagged peaks where great winged predators nest and hunt. The updrafts here carry the scent of blood from miles away. The oldest residents have been here so long that the mountains have shaped themselves around them.", + emoji: "🦅", + id: "vampire_carrion_peaks", + name: "Carrion Peaks", + status: "locked", + unlockBossId: "sanctum_sovereign", + unlockQuestId: "sanctum_subjugation", + }, + { + description: + "An impossible spire of crystallised blood that rises from the earth with no natural explanation. The architecture inside follows no logic familiar to mortal builders — rooms that don't connect to the rooms above them, staircases that lead to walls, windows that look into other windows. It was built this way deliberately.", + emoji: "🗼", + id: "vampire_bloodspire", + name: "The Bloodspire", + status: "locked", + unlockBossId: "carrion_lord", + unlockQuestId: "peaks_conquest", + }, + { + description: + "A region where time moves strangely — not stopped, but reluctant. Vampires who spend too long here find that their memories of the past and their anticipation of the future begin to blur together. Only the present moment retains its edges. The shroud does not let go easily.", + emoji: "⏳", + id: "vampire_shroud_of_eternity", + name: "Shroud of Eternity", + status: "locked", + unlockBossId: "bloodspire_tyrant", + unlockQuestId: "spire_conquest", + }, + { + description: + "An underground treasury sealed by a vampire lord who believed the only way to keep something safe was to make retrieving it more dangerous than it was worth. They were correct. Every soul who has broken in has paid the price. The vault keeps everything it takes.", + emoji: "🔒", + id: "vampire_abyssal_vault", + name: "The Abyssal Vault", + status: "locked", + unlockBossId: "eternal_sovereign", + unlockQuestId: "shroud_conquest", + }, + { + description: + "The seat of the most ancient vampire intelligence network in existence. Nothing that happens in the vampire world goes unreported here. The Court of Whispers does not conduct violence — it simply arranges for others to conduct it at the optimal moment.", + emoji: "🕊️", + id: "vampire_court_of_whispers", + name: "Court of Whispers", + status: "locked", + unlockBossId: "abyssal_warden", + unlockQuestId: "vault_conquest", + }, + { + description: + "The place where the vampire world ends — or rather, where it keeps going into something that has no name. The Eternal Abyss is not empty. It is full of things that predate the first vampire, the first turning, the first death. They are older than the concept of hunger, and they are always hungry.", + emoji: "🌌", + id: "vampire_eternal_abyss", + name: "The Eternal Abyss", + status: "locked", + unlockBossId: "court_sovereign", + unlockQuestId: "court_conquest", + }, +]; diff --git a/apps/api/src/routes/debug.ts b/apps/api/src/routes/debug.ts index b8ec02b..9011b5a 100644 --- a/apps/api/src/routes/debug.ts +++ b/apps/api/src/routes/debug.ts @@ -26,7 +26,7 @@ import { defaultGoddessExplorationAreas } from "../data/goddessExplorations.js"; import { defaultGoddessQuests } from "../data/goddessQuests.js"; import { defaultGoddessUpgrades } from "../data/goddessUpgrades.js"; import { defaultGoddessZones } from "../data/goddessZones.js"; -import { initialGameState } from "../data/initialState.js"; +import { initialGameState, initialGoddessState } from "../data/initialState.js"; import { defaultQuests } from "../data/quests.js"; import { defaultRecipes } from "../data/recipes.js"; import { currentSchemaVersion } from "../data/schemaVersion.js"; @@ -1271,6 +1271,64 @@ debugRouter.post("/sync-new-content", async(context) => { } }); +debugRouter.post("/grant-apotheosis", async(context) => { + try { + const discordId = context.get("discordId"); + + const record = await prisma.gameState.findUnique({ where: { discordId } }); + if (!record) { + return context.json({ error: "No save found" }, 404); + } + + /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- Prisma returns JsonValue; cast to GameState */ + const state = record.state as GameState; + + const updatedState: GameState + = (state.apotheosis?.count ?? 0) >= 1 + ? state + : { + ...state, + apotheosis: { count: 1 }, + goddess: initialGoddessState(), + }; + + if (updatedState !== state) { + const now = Date.now(); + await prisma.gameState.update({ + /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- Prisma requires object */ + data: { state: updatedState as object, updatedAt: now }, + where: { discordId }, + }); + } + + const secret = process.env.ANTI_CHEAT_SECRET; + const signature + = secret === undefined + ? undefined + : computeHmac(JSON.stringify(updatedState), secret); + + return context.json({ + currentSchemaVersion: currentSchemaVersion, + loginBonus: null, + loginStreak: 0, + offlineEssence: 0, + offlineGold: 0, + offlineSeconds: 0, + schemaOutdated: false, + signature: signature, + state: updatedState, + }); + } catch (error) { + void logger.error( + "debug_grant_apotheosis", + error instanceof Error + ? error + : new Error(String(error)), + ); + return context.json({ error: "Internal server error" }, 500); + } +}); + debugRouter.post("/hard-reset", async(context) => { try { const discordId = context.get("discordId");