From 7f43dc725e14f3dfd8ad5dfe7a3fd4a42806b568 Mon Sep 17 00:00:00 2001 From: Hikari Date: Thu, 16 Apr 2026 09:26:29 -0700 Subject: [PATCH] feat: vampire mode chunk 3 - sync/sanitize and initial state Add initialVampireState() and vampireSpread validation to mirror the goddess mode pattern. Also lint-fix pre-existing style issues across all Chunk 2 vampire data and type files. --- apps/api/src/data/initialState.ts | 78 +- apps/api/src/data/vampireAchievements.ts | 18 +- apps/api/src/data/vampireAwakeningUpgrades.ts | 2 +- apps/api/src/data/vampireBosses.ts | 2160 ++++++++--------- apps/api/src/data/vampireCrafting.ts | 6 +- apps/api/src/data/vampireEquipment.ts | 44 +- apps/api/src/data/vampireEquipmentSets.ts | 2 +- apps/api/src/data/vampireExplorations.ts | 296 +-- apps/api/src/data/vampireQuests.ts | 1338 +++++----- apps/api/src/data/vampireSiringUpgrades.ts | 2 +- apps/api/src/data/vampireThralls.ts | 20 +- apps/api/src/data/vampireUpgrades.ts | 32 +- apps/api/src/routes/game.ts | 170 ++ packages/types/src/interfaces/gameState.ts | 2 +- .../src/interfaces/vampireEquipmentSet.ts | 4 +- .../types/src/interfaces/vampireSiring.ts | 8 +- packages/types/src/interfaces/vampireState.ts | 2 +- .../types/src/interfaces/vampireUpgrade.ts | 10 +- 18 files changed, 2221 insertions(+), 1973 deletions(-) diff --git a/apps/api/src/data/initialState.ts b/apps/api/src/data/initialState.ts index 9621577..c377243 100644 --- a/apps/api/src/data/initialState.ts +++ b/apps/api/src/data/initialState.ts @@ -20,9 +20,18 @@ import { defaultGoddessZones } from "./goddessZones.js"; import { defaultQuests } from "./quests.js"; import { currentSchemaVersion } from "./schemaVersion.js"; import { defaultUpgrades } from "./upgrades.js"; +import { defaultVampireAchievements } from "./vampireAchievements.js"; +import { defaultVampireBosses } from "./vampireBosses.js"; +import { defaultVampireEquipment } from "./vampireEquipment.js"; +import { defaultVampireExplorationAreas } from "./vampireExplorations.js"; +import { defaultVampireQuests } from "./vampireQuests.js"; +import { defaultVampireThralls } from "./vampireThralls.js"; +import { defaultVampireUpgrades } from "./vampireUpgrades.js"; +import { defaultVampireZones } from "./vampireZones.js"; import { defaultZones } from "./zones.js"; import type { ApotheosisData, + AwakeningData, ConsecrationData, EnlightenmentData, ExplorationState, @@ -30,7 +39,9 @@ import type { GoddessState, Player, PrestigeData, + SiringData, TranscendenceData, + VampireState, } from "@elysium/types"; const initialPrestige: PrestigeData = { @@ -91,6 +102,24 @@ const initialEnlightenment: EnlightenmentData = { stardustPrayersMultiplier: 1, }; +const initialSiring: SiringData = { + count: 0, + ichor: 0, + productionMultiplier: 1, + purchasedUpgradeIds: [], +}; + +const initialAwakening: AwakeningData = { + count: 0, + purchasedUpgradeIds: [], + soulShards: 0, + soulShardsBloodMultiplier: 1, + soulShardsCombatMultiplier: 1, + soulShardsMetaMultiplier: 1, + soulShardsSiringIchorMultiplier: 1, + soulShardsSiringThresholdMultiplier: 1, +}; + /** * Builds a fresh initial goddess state for a player who has just completed their * first Apotheosis. All goddess content is locked until progressed through the realm. @@ -132,6 +161,48 @@ const initialGoddessState = (): GoddessState => { }; }; +/** + * Builds a fresh initial vampire state for a player who has just achieved their + * first Eternal Sovereignty. All vampire content is locked until progressed through the realm. + * @returns A clean VampireState with all default data. + */ +const initialVampireState = (): VampireState => { + return { + achievements: structuredClone(defaultVampireAchievements), + awakening: { ...initialAwakening }, + baseClickPower: 1, + bosses: structuredClone(defaultVampireBosses), + equipment: structuredClone(defaultVampireEquipment), + eternalSovereignty: { count: 0 }, + exploration: { + areas: defaultVampireExplorationAreas.map((area) => { + return { + id: area.id, + status: + area.zoneId === "vampire_haunted_catacombs" + ? ("available" as const) + : ("locked" as const), + }; + }), + craftedBloodMultiplier: 1, + craftedCombatMultiplier: 1, + craftedIchorMultiplier: 1, + craftedRecipeIds: [], + materials: [], + }, + lastTickAt: Date.now(), + lifetimeBloodEarned: 0, + lifetimeBossesDefeated: 0, + lifetimeQuestsCompleted: 0, + quests: structuredClone(defaultVampireQuests), + siring: { ...initialSiring }, + thralls: structuredClone(defaultVampireThralls), + totalBloodEarned: 0, + upgrades: structuredClone(defaultVampireUpgrades), + zones: structuredClone(defaultVampireZones), + }; +}; + /** * Builds an initial game state for a new player. * @param player - The player data from Discord OAuth. @@ -175,4 +246,9 @@ const initialGameState = ( }; }; -export { initialExploration, initialGameState, initialGoddessState }; +export { + initialExploration, + initialGameState, + initialGoddessState, + initialVampireState, +}; diff --git a/apps/api/src/data/vampireAchievements.ts b/apps/api/src/data/vampireAchievements.ts index 97f0b30..d8fb3fe 100644 --- a/apps/api/src/data/vampireAchievements.ts +++ b/apps/api/src/data/vampireAchievements.ts @@ -5,13 +5,13 @@ * @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" }, + condition: { amount: 1000, type: "totalBloodEarned" }, description: "Spill the first thousand drops. Every hunt starts here.", icon: "🩸", id: "blood_thousand", @@ -61,7 +61,7 @@ export const defaultVampireAchievements: Array = [ icon: "⚫", id: "blood_hundred_million", name: "The Dark Eternal", - reward: { ichor: 2_000, soulShards: 10 }, + reward: { ichor: 2000, soulShards: 10 }, unlockedAt: null, }, { @@ -70,7 +70,7 @@ export const defaultVampireAchievements: Array = [ icon: "🕳️", id: "blood_billion", name: "Ancient Hunger", - reward: { ichor: 5_000, soulShards: 25 }, + reward: { ichor: 5000, soulShards: 25 }, unlockedAt: null, }, // ── Vampire Bosses Defeated ─────────────────────────────────────────────── @@ -116,7 +116,7 @@ export const defaultVampireAchievements: Array = [ icon: "🌑", id: "boss_all", name: "The Darkness Made Flesh", - reward: { ichor: 1_000, soulShards: 10 }, + reward: { ichor: 1000, soulShards: 10 }, unlockedAt: null, }, // ── Vampire Quests Completed ────────────────────────────────────────────── @@ -203,12 +203,12 @@ export const defaultVampireAchievements: Array = [ unlockedAt: null, }, { - condition: { amount: 1_000, type: "thrallTotal" }, + condition: { amount: 1000, 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 }, + reward: { ichor: 2000, soulShards: 15 }, unlockedAt: null, }, // ── Siring Count ────────────────────────────────────────────────────────── @@ -245,7 +245,7 @@ export const defaultVampireAchievements: Array = [ icon: "⚫", id: "siring_fifteen", name: "Eternal Bloodline", - reward: { ichor: 1_500, soulShards: 15 }, + reward: { ichor: 1500, soulShards: 15 }, unlockedAt: null, }, // ── Vampire Equipment Owned ─────────────────────────────────────────────── @@ -291,7 +291,7 @@ export const defaultVampireAchievements: Array = [ icon: "🌑", id: "equipment_all", name: "The Complete Darkness", - reward: { ichor: 2_000, soulShards: 20 }, + reward: { ichor: 2000, soulShards: 20 }, unlockedAt: null, }, ]; diff --git a/apps/api/src/data/vampireAwakeningUpgrades.ts b/apps/api/src/data/vampireAwakeningUpgrades.ts index c1d2f27..b25ddca 100644 --- a/apps/api/src/data/vampireAwakeningUpgrades.ts +++ b/apps/api/src/data/vampireAwakeningUpgrades.ts @@ -127,7 +127,7 @@ export const defaultVampireAwakeningUpgrades: Array = [ }, { category: "soulshards_meta", - cost: 1_000, + cost: 1000, description: "The apex of soul refinement — all future awakenings yield three times the soul shards.", id: "awakening_meta_3", multiplier: 3, diff --git a/apps/api/src/data/vampireBosses.ts b/apps/api/src/data/vampireBosses.ts index afdb8dc..53b6e2d 100644 --- a/apps/api/src/data/vampireBosses.ts +++ b/apps/api/src/data/vampireBosses.ts @@ -11,1316 +11,1316 @@ import type { VampireBoss } from "@elysium/types"; export const defaultVampireBosses: Array = [ // ── Haunted Catacombs ───────────────────────────────────────────────────── { - bloodReward: 50, - bountyIchor: 1, + 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", + 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, + 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", + 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, + bloodReward: 1250, + 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", + currentHp: 2500, + 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: 2500, + name: "Crypt Shade", + siringRequirement: 0, + soulShardsReward: 0, + status: "locked", + upgradeRewards: [ "thrall_fledgling_1" ], + zoneId: "vampire_haunted_catacombs", }, { - bloodReward: 6_250, - bountyIchor: 10, + bloodReward: 6250, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + currentHp: 5_000_000, + damagePerSecond: 2000, + 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, + 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", + currentHp: 25_000_000, + damagePerSecond: 5000, + 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, + bloodReward: 50_000_000, + bountyIchor: 1000, 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", + 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, + bloodReward: 200_000_000, + bountyIchor: 2000, 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", + 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, + bloodReward: 750_000_000, + bountyIchor: 5000, 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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: 1000, + 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, + 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", + 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: 1500, + 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, + 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", + 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: 2000, + 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, + 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", + 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: 3000, + 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, + 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", + 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: 4000, + 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, + 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", + 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: 5000, + 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, + 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", + 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: 7000, + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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, + 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", + 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 index 03eedde..17c33e2 100644 --- a/apps/api/src/data/vampireCrafting.ts +++ b/apps/api/src/data/vampireCrafting.ts @@ -8,8 +8,10 @@ /* 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. +/* + * 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 ───────────────────────────────────────────────────── { diff --git a/apps/api/src/data/vampireEquipment.ts b/apps/api/src/data/vampireEquipment.ts index 5fffcba..6c9d5bc 100644 --- a/apps/api/src/data/vampireEquipment.ts +++ b/apps/api/src/data/vampireEquipment.ts @@ -36,7 +36,7 @@ export const defaultVampireEquipment: Array = [ }, { bonus: { bloodMultiplier: 1.08, combatMultiplier: 1.05 }, - cost: { blood: 1_500, ichor: 0, soulShards: 0 }, + cost: { blood: 1500, 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", @@ -48,7 +48,7 @@ export const defaultVampireEquipment: Array = [ }, { bonus: { bloodMultiplier: 1.12 }, - cost: { blood: 4_000, ichor: 0, soulShards: 0 }, + cost: { blood: 4000, 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", @@ -244,7 +244,7 @@ export const defaultVampireEquipment: Array = [ }, { bonus: { combatMultiplier: 1.1 }, - cost: { blood: 1_500, ichor: 0, soulShards: 0 }, + cost: { blood: 1500, 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", @@ -255,8 +255,8 @@ export const defaultVampireEquipment: Array = [ type: "shroud", }, { - bonus: { combatMultiplier: 1.12, bloodMultiplier: 1.05 }, - cost: { blood: 4_000, ichor: 0, soulShards: 0 }, + bonus: { bloodMultiplier: 1.05, combatMultiplier: 1.12 }, + cost: { blood: 4000, 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", @@ -267,7 +267,7 @@ export const defaultVampireEquipment: Array = [ type: "shroud", }, { - bonus: { combatMultiplier: 1.12, bloodMultiplier: 1.08 }, + bonus: { bloodMultiplier: 1.08, combatMultiplier: 1.12 }, 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, @@ -279,7 +279,7 @@ export const defaultVampireEquipment: Array = [ type: "shroud", }, { - bonus: { combatMultiplier: 1.15, bloodMultiplier: 1.08 }, + bonus: { bloodMultiplier: 1.08, combatMultiplier: 1.15 }, 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, @@ -292,7 +292,7 @@ export const defaultVampireEquipment: Array = [ }, // ── Shrouds — Rare ──────────────────────────────────────────────────────── { - bonus: { combatMultiplier: 1.2, bloodMultiplier: 1.1 }, + bonus: { bloodMultiplier: 1.1, combatMultiplier: 1.2 }, 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", @@ -303,7 +303,7 @@ export const defaultVampireEquipment: Array = [ type: "shroud", }, { - bonus: { combatMultiplier: 1.22, bloodMultiplier: 1.1 }, + bonus: { bloodMultiplier: 1.1, combatMultiplier: 1.22 }, 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", @@ -314,7 +314,7 @@ export const defaultVampireEquipment: Array = [ type: "shroud", }, { - bonus: { combatMultiplier: 1.2, bloodMultiplier: 1.15 }, + bonus: { bloodMultiplier: 1.15, combatMultiplier: 1.2 }, 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", @@ -325,7 +325,7 @@ export const defaultVampireEquipment: Array = [ type: "shroud", }, { - bonus: { combatMultiplier: 1.25, bloodMultiplier: 1.12 }, + bonus: { bloodMultiplier: 1.12, combatMultiplier: 1.25 }, 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", @@ -336,7 +336,7 @@ export const defaultVampireEquipment: Array = [ type: "shroud", }, { - bonus: { combatMultiplier: 1.28, bloodMultiplier: 1.12 }, + bonus: { bloodMultiplier: 1.12, combatMultiplier: 1.28 }, 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", @@ -347,7 +347,7 @@ export const defaultVampireEquipment: Array = [ type: "shroud", }, { - bonus: { combatMultiplier: 1.3, bloodMultiplier: 1.15 }, + bonus: { bloodMultiplier: 1.15, combatMultiplier: 1.3 }, 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", @@ -359,7 +359,7 @@ export const defaultVampireEquipment: Array = [ }, // ── Shrouds — Epic ──────────────────────────────────────────────────────── { - bonus: { combatMultiplier: 1.35, bloodMultiplier: 1.2 }, + bonus: { bloodMultiplier: 1.2, combatMultiplier: 1.35 }, 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", @@ -370,7 +370,7 @@ export const defaultVampireEquipment: Array = [ type: "shroud", }, { - bonus: { combatMultiplier: 1.4, bloodMultiplier: 1.25 }, + bonus: { bloodMultiplier: 1.25, combatMultiplier: 1.4 }, 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", @@ -381,7 +381,7 @@ export const defaultVampireEquipment: Array = [ type: "shroud", }, { - bonus: { combatMultiplier: 1.45, bloodMultiplier: 1.3 }, + bonus: { bloodMultiplier: 1.3, combatMultiplier: 1.45 }, 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", @@ -392,7 +392,7 @@ export const defaultVampireEquipment: Array = [ type: "shroud", }, { - bonus: { combatMultiplier: 1.5, bloodMultiplier: 1.3, ichorMultiplier: 1.1 }, + bonus: { bloodMultiplier: 1.3, combatMultiplier: 1.5, 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", @@ -404,7 +404,7 @@ export const defaultVampireEquipment: Array = [ }, // ── Shrouds — Legendary ─────────────────────────────────────────────────── { - bonus: { combatMultiplier: 1.55, bloodMultiplier: 1.4, ichorMultiplier: 1.2 }, + bonus: { bloodMultiplier: 1.4, combatMultiplier: 1.55, 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", @@ -415,7 +415,7 @@ export const defaultVampireEquipment: Array = [ type: "shroud", }, { - bonus: { combatMultiplier: 1.7, bloodMultiplier: 1.5, ichorMultiplier: 1.3 }, + bonus: { bloodMultiplier: 1.5, combatMultiplier: 1.7, 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", @@ -427,7 +427,7 @@ export const defaultVampireEquipment: Array = [ }, // ── Talismans — Common ──────────────────────────────────────────────────── { - bonus: { combatMultiplier: 1.06, bloodMultiplier: 1.06 }, + bonus: { bloodMultiplier: 1.06, combatMultiplier: 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, @@ -452,7 +452,7 @@ export const defaultVampireEquipment: Array = [ }, { bonus: { bloodMultiplier: 1.1, combatMultiplier: 1.05 }, - cost: { blood: 1_500, ichor: 0, soulShards: 0 }, + cost: { blood: 1500, 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", @@ -464,7 +464,7 @@ export const defaultVampireEquipment: Array = [ }, { bonus: { bloodMultiplier: 1.12, combatMultiplier: 1.06 }, - cost: { blood: 4_000, ichor: 0, soulShards: 0 }, + cost: { blood: 4000, 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", diff --git a/apps/api/src/data/vampireEquipmentSets.ts b/apps/api/src/data/vampireEquipmentSets.ts index cdf2e31..3830776 100644 --- a/apps/api/src/data/vampireEquipmentSets.ts +++ b/apps/api/src/data/vampireEquipmentSets.ts @@ -60,7 +60,7 @@ export const defaultVampireEquipmentSets: Array = [ 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 + // eslint-disable-next-line @typescript-eslint/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.", diff --git a/apps/api/src/data/vampireExplorations.ts b/apps/api/src/data/vampireExplorations.ts index bf935ee..38b513b 100644 --- a/apps/api/src/data/vampireExplorations.ts +++ b/apps/api/src/data/vampireExplorations.ts @@ -29,7 +29,7 @@ export const defaultVampireExplorationAreas: Array = [ id: "bone_chapel", name: "The Bone Chapel", possibleMaterials: [ - { materialId: "bone_dust", maxQuantity: 3, minQuantity: 1, weight: 5 }, + { materialId: "bone_dust", maxQuantity: 3, minQuantity: 1, weight: 5 }, { materialId: "grave_essence", maxQuantity: 2, minQuantity: 1, weight: 3 }, ], zoneId: "vampire_haunted_catacombs", @@ -52,8 +52,8 @@ export const defaultVampireExplorationAreas: Array = [ id: "dusty_crypts", name: "The Dusty Crypts", possibleMaterials: [ - { materialId: "bone_dust", maxQuantity: 4, minQuantity: 2, weight: 5 }, - { materialId: "catacomb_ash", maxQuantity: 3, minQuantity: 1, weight: 4 }, + { materialId: "bone_dust", maxQuantity: 4, minQuantity: 2, weight: 5 }, + { materialId: "catacomb_ash", maxQuantity: 3, minQuantity: 1, weight: 4 }, { materialId: "grave_essence", maxQuantity: 2, minQuantity: 1, weight: 2 }, ], zoneId: "vampire_haunted_catacombs", @@ -77,8 +77,8 @@ export const defaultVampireExplorationAreas: Array = [ name: "The Ossuary Hall", possibleMaterials: [ { materialId: "grave_essence", maxQuantity: 4, minQuantity: 2, weight: 5 }, - { materialId: "bone_dust", maxQuantity: 5, minQuantity: 2, weight: 4 }, - { materialId: "catacomb_ash", maxQuantity: 3, minQuantity: 1, weight: 3 }, + { materialId: "bone_dust", maxQuantity: 5, minQuantity: 2, weight: 4 }, + { materialId: "catacomb_ash", maxQuantity: 3, minQuantity: 1, weight: 3 }, ], zoneId: "vampire_haunted_catacombs", }, @@ -100,9 +100,9 @@ export const defaultVampireExplorationAreas: Array = [ id: "deep_vault", name: "The Deep Vault", possibleMaterials: [ - { materialId: "catacomb_ash", maxQuantity: 5, minQuantity: 2, weight: 5 }, + { materialId: "catacomb_ash", maxQuantity: 5, minQuantity: 2, weight: 5 }, { materialId: "grave_essence", maxQuantity: 4, minQuantity: 2, weight: 4 }, - { materialId: "bone_dust", maxQuantity: 6, minQuantity: 3, weight: 3 }, + { materialId: "bone_dust", maxQuantity: 6, minQuantity: 3, weight: 3 }, ], zoneId: "vampire_haunted_catacombs", }, @@ -127,7 +127,7 @@ export const defaultVampireExplorationAreas: Array = [ name: "The Shallow Fens", possibleMaterials: [ { materialId: "mire_sludge", maxQuantity: 3, minQuantity: 1, weight: 5 }, - { materialId: "blood_moss", maxQuantity: 2, minQuantity: 1, weight: 3 }, + { materialId: "blood_moss", maxQuantity: 2, minQuantity: 1, weight: 3 }, ], zoneId: "vampire_blood_mire", }, @@ -150,8 +150,8 @@ export const defaultVampireExplorationAreas: Array = [ name: "The Reed Channels", possibleMaterials: [ { materialId: "crimson_reed", maxQuantity: 4, minQuantity: 2, weight: 5 }, - { materialId: "blood_moss", maxQuantity: 3, minQuantity: 1, weight: 4 }, - { materialId: "mire_sludge", maxQuantity: 3, minQuantity: 1, weight: 3 }, + { materialId: "blood_moss", maxQuantity: 3, minQuantity: 1, weight: 4 }, + { materialId: "mire_sludge", maxQuantity: 3, minQuantity: 1, weight: 3 }, ], zoneId: "vampire_blood_mire", }, @@ -173,8 +173,8 @@ export const defaultVampireExplorationAreas: Array = [ id: "crimson_bog", name: "The Crimson Bog", possibleMaterials: [ - { materialId: "blood_moss", maxQuantity: 5, minQuantity: 2, weight: 5 }, - { materialId: "mire_sludge", maxQuantity: 5, minQuantity: 2, weight: 4 }, + { materialId: "blood_moss", maxQuantity: 5, minQuantity: 2, weight: 5 }, + { materialId: "mire_sludge", maxQuantity: 5, minQuantity: 2, weight: 4 }, { materialId: "crimson_reed", maxQuantity: 4, minQuantity: 2, weight: 3 }, ], zoneId: "vampire_blood_mire", @@ -197,8 +197,8 @@ export const defaultVampireExplorationAreas: Array = [ id: "sanguine_depths", name: "The Sanguine Depths", possibleMaterials: [ - { materialId: "mire_sludge", maxQuantity: 6, minQuantity: 3, weight: 5 }, - { materialId: "blood_moss", maxQuantity: 6, minQuantity: 3, weight: 4 }, + { materialId: "mire_sludge", maxQuantity: 6, minQuantity: 3, weight: 5 }, + { materialId: "blood_moss", maxQuantity: 6, minQuantity: 3, weight: 4 }, { materialId: "crimson_reed", maxQuantity: 5, minQuantity: 2, weight: 3 }, ], zoneId: "vampire_blood_mire", @@ -224,7 +224,7 @@ export const defaultVampireExplorationAreas: Array = [ name: "The Gatehouse", possibleMaterials: [ { materialId: "obsidian_chip", maxQuantity: 3, minQuantity: 1, weight: 5 }, - { materialId: "iron_shaving", maxQuantity: 2, minQuantity: 1, weight: 3 }, + { materialId: "iron_shaving", maxQuantity: 2, minQuantity: 1, weight: 3 }, ], zoneId: "vampire_obsidian_keep", }, @@ -247,8 +247,8 @@ export const defaultVampireExplorationAreas: Array = [ name: "The Outer Walls", possibleMaterials: [ { materialId: "obsidian_chip", maxQuantity: 5, minQuantity: 2, weight: 5 }, - { materialId: "keep_mortar", maxQuantity: 3, minQuantity: 1, weight: 4 }, - { materialId: "iron_shaving", maxQuantity: 4, minQuantity: 2, weight: 3 }, + { materialId: "keep_mortar", maxQuantity: 3, minQuantity: 1, weight: 4 }, + { materialId: "iron_shaving", maxQuantity: 4, minQuantity: 2, weight: 3 }, ], zoneId: "vampire_obsidian_keep", }, @@ -270,9 +270,9 @@ export const defaultVampireExplorationAreas: Array = [ id: "great_hall", name: "The Great Hall", possibleMaterials: [ - { materialId: "keep_mortar", maxQuantity: 5, minQuantity: 2, weight: 5 }, + { materialId: "keep_mortar", maxQuantity: 5, minQuantity: 2, weight: 5 }, { materialId: "obsidian_chip", maxQuantity: 6, minQuantity: 3, weight: 4 }, - { materialId: "iron_shaving", maxQuantity: 5, minQuantity: 2, weight: 3 }, + { materialId: "iron_shaving", maxQuantity: 5, minQuantity: 2, weight: 3 }, ], zoneId: "vampire_obsidian_keep", }, @@ -295,8 +295,8 @@ export const defaultVampireExplorationAreas: Array = [ name: "The Black Spire", possibleMaterials: [ { materialId: "obsidian_chip", maxQuantity: 7, minQuantity: 3, weight: 5 }, - { materialId: "keep_mortar", maxQuantity: 6, minQuantity: 3, weight: 4 }, - { materialId: "iron_shaving", maxQuantity: 6, minQuantity: 2, weight: 3 }, + { materialId: "keep_mortar", maxQuantity: 6, minQuantity: 3, weight: 4 }, + { materialId: "iron_shaving", maxQuantity: 6, minQuantity: 2, weight: 3 }, ], zoneId: "vampire_obsidian_keep", }, @@ -320,7 +320,7 @@ export const defaultVampireExplorationAreas: Array = [ id: "bronze_gate", name: "The Bronze Gate", possibleMaterials: [ - { materialId: "blood_bronze", maxQuantity: 3, minQuantity: 1, weight: 5 }, + { materialId: "blood_bronze", maxQuantity: 3, minQuantity: 1, weight: 5 }, { materialId: "citadel_stone", maxQuantity: 2, minQuantity: 1, weight: 3 }, ], zoneId: "vampire_crimson_citadel", @@ -343,8 +343,8 @@ export const defaultVampireExplorationAreas: Array = [ id: "silk_quarters", name: "The Silk Quarters", possibleMaterials: [ - { materialId: "crimson_silk", maxQuantity: 5, minQuantity: 2, weight: 5 }, - { materialId: "blood_bronze", maxQuantity: 4, minQuantity: 2, weight: 4 }, + { materialId: "crimson_silk", maxQuantity: 5, minQuantity: 2, weight: 5 }, + { materialId: "blood_bronze", maxQuantity: 4, minQuantity: 2, weight: 4 }, { materialId: "citadel_stone", maxQuantity: 3, minQuantity: 1, weight: 2 }, ], zoneId: "vampire_crimson_citadel", @@ -367,9 +367,9 @@ export const defaultVampireExplorationAreas: Array = [ id: "blood_forge", name: "The Blood Forge", possibleMaterials: [ - { materialId: "blood_bronze", maxQuantity: 6, minQuantity: 3, weight: 5 }, + { materialId: "blood_bronze", maxQuantity: 6, minQuantity: 3, weight: 5 }, { materialId: "citadel_stone", maxQuantity: 5, minQuantity: 2, weight: 4 }, - { materialId: "crimson_silk", maxQuantity: 4, minQuantity: 2, weight: 3 }, + { materialId: "crimson_silk", maxQuantity: 4, minQuantity: 2, weight: 3 }, ], zoneId: "vampire_crimson_citadel", }, @@ -392,8 +392,8 @@ export const defaultVampireExplorationAreas: Array = [ name: "The Crimson Throne", possibleMaterials: [ { materialId: "citadel_stone", maxQuantity: 7, minQuantity: 3, weight: 5 }, - { materialId: "blood_bronze", maxQuantity: 6, minQuantity: 3, weight: 4 }, - { materialId: "crimson_silk", maxQuantity: 5, minQuantity: 2, weight: 3 }, + { materialId: "blood_bronze", maxQuantity: 6, minQuantity: 3, weight: 4 }, + { materialId: "crimson_silk", maxQuantity: 5, minQuantity: 2, weight: 3 }, ], zoneId: "vampire_crimson_citadel", }, @@ -418,7 +418,7 @@ export const defaultVampireExplorationAreas: Array = [ name: "The Antechamber", possibleMaterials: [ { materialId: "shadow_thread", maxQuantity: 3, minQuantity: 1, weight: 5 }, - { materialId: "court_wax", maxQuantity: 2, minQuantity: 1, weight: 3 }, + { materialId: "court_wax", maxQuantity: 2, minQuantity: 1, weight: 3 }, ], zoneId: "vampire_shadow_court", }, @@ -440,9 +440,9 @@ export const defaultVampireExplorationAreas: Array = [ id: "ink_library", name: "The Ink Library", possibleMaterials: [ - { materialId: "whisper_ink", maxQuantity: 5, minQuantity: 2, weight: 5 }, + { materialId: "whisper_ink", maxQuantity: 5, minQuantity: 2, weight: 5 }, { materialId: "shadow_thread", maxQuantity: 4, minQuantity: 2, weight: 4 }, - { materialId: "court_wax", maxQuantity: 3, minQuantity: 1, weight: 3 }, + { materialId: "court_wax", maxQuantity: 3, minQuantity: 1, weight: 3 }, ], zoneId: "vampire_shadow_court", }, @@ -464,8 +464,8 @@ export const defaultVampireExplorationAreas: Array = [ id: "wax_sanctum", name: "The Wax Sanctum", possibleMaterials: [ - { materialId: "court_wax", maxQuantity: 6, minQuantity: 3, weight: 5 }, - { materialId: "whisper_ink", maxQuantity: 5, minQuantity: 2, weight: 4 }, + { materialId: "court_wax", maxQuantity: 6, minQuantity: 3, weight: 5 }, + { materialId: "whisper_ink", maxQuantity: 5, minQuantity: 2, weight: 4 }, { materialId: "shadow_thread", maxQuantity: 5, minQuantity: 2, weight: 3 }, ], zoneId: "vampire_shadow_court", @@ -489,8 +489,8 @@ export const defaultVampireExplorationAreas: Array = [ name: "The Throne of Whispers", possibleMaterials: [ { materialId: "shadow_thread", maxQuantity: 7, minQuantity: 3, weight: 5 }, - { materialId: "court_wax", maxQuantity: 6, minQuantity: 3, weight: 4 }, - { materialId: "whisper_ink", maxQuantity: 6, minQuantity: 2, weight: 3 }, + { materialId: "court_wax", maxQuantity: 6, minQuantity: 3, weight: 4 }, + { materialId: "whisper_ink", maxQuantity: 6, minQuantity: 2, weight: 3 }, ], zoneId: "vampire_shadow_court", }, @@ -514,7 +514,7 @@ export const defaultVampireExplorationAreas: Array = [ id: "charnel_entry", name: "The Charnel Entry", possibleMaterials: [ - { materialId: "plague_ash", maxQuantity: 3, minQuantity: 1, weight: 5 }, + { materialId: "plague_ash", maxQuantity: 3, minQuantity: 1, weight: 5 }, { materialId: "infected_bone", maxQuantity: 2, minQuantity: 1, weight: 3 }, ], zoneId: "vampire_plague_ossuary", @@ -537,7 +537,7 @@ export const defaultVampireExplorationAreas: Array = [ id: "ash_pits", name: "The Ash Pits", possibleMaterials: [ - { materialId: "plague_ash", maxQuantity: 6, minQuantity: 3, weight: 5 }, + { materialId: "plague_ash", maxQuantity: 6, minQuantity: 3, weight: 5 }, { materialId: "infected_bone", maxQuantity: 4, minQuantity: 2, weight: 4 }, { materialId: "ossuary_resin", maxQuantity: 3, minQuantity: 1, weight: 3 }, ], @@ -563,7 +563,7 @@ export const defaultVampireExplorationAreas: Array = [ possibleMaterials: [ { materialId: "ossuary_resin", maxQuantity: 6, minQuantity: 3, weight: 5 }, { materialId: "infected_bone", maxQuantity: 6, minQuantity: 3, weight: 4 }, - { materialId: "plague_ash", maxQuantity: 5, minQuantity: 2, weight: 3 }, + { materialId: "plague_ash", maxQuantity: 5, minQuantity: 2, weight: 3 }, ], zoneId: "vampire_plague_ossuary", }, @@ -587,7 +587,7 @@ export const defaultVampireExplorationAreas: Array = [ possibleMaterials: [ { materialId: "infected_bone", maxQuantity: 7, minQuantity: 4, weight: 5 }, { materialId: "ossuary_resin", maxQuantity: 7, minQuantity: 3, weight: 4 }, - { materialId: "plague_ash", maxQuantity: 6, minQuantity: 3, weight: 3 }, + { materialId: "plague_ash", maxQuantity: 6, minQuantity: 3, weight: 3 }, ], zoneId: "vampire_plague_ossuary", }, @@ -611,7 +611,7 @@ export const defaultVampireExplorationAreas: Array = [ id: "cinder_fields", name: "The Cinder Fields", possibleMaterials: [ - { materialId: "volcanic_ash", maxQuantity: 4, minQuantity: 2, weight: 5 }, + { materialId: "volcanic_ash", maxQuantity: 4, minQuantity: 2, weight: 5 }, { materialId: "cinder_crystal", maxQuantity: 2, minQuantity: 1, weight: 3 }, ], zoneId: "vampire_ashen_wastes", @@ -634,8 +634,8 @@ export const defaultVampireExplorationAreas: Array = [ id: "cloth_ruins", name: "The Cloth Ruins", possibleMaterials: [ - { materialId: "ashen_cloth", maxQuantity: 6, minQuantity: 3, weight: 5 }, - { materialId: "volcanic_ash", maxQuantity: 5, minQuantity: 2, weight: 4 }, + { materialId: "ashen_cloth", maxQuantity: 6, minQuantity: 3, weight: 5 }, + { materialId: "volcanic_ash", maxQuantity: 5, minQuantity: 2, weight: 4 }, { materialId: "cinder_crystal", maxQuantity: 3, minQuantity: 1, weight: 3 }, ], zoneId: "vampire_ashen_wastes", @@ -659,8 +659,8 @@ export const defaultVampireExplorationAreas: Array = [ name: "The Crystal Caverns", possibleMaterials: [ { materialId: "cinder_crystal", maxQuantity: 7, minQuantity: 3, weight: 5 }, - { materialId: "volcanic_ash", maxQuantity: 6, minQuantity: 3, weight: 4 }, - { materialId: "ashen_cloth", maxQuantity: 4, minQuantity: 2, weight: 2 }, + { materialId: "volcanic_ash", maxQuantity: 6, minQuantity: 3, weight: 4 }, + { materialId: "ashen_cloth", maxQuantity: 4, minQuantity: 2, weight: 2 }, ], zoneId: "vampire_ashen_wastes", }, @@ -682,9 +682,9 @@ export const defaultVampireExplorationAreas: Array = [ id: "smouldering_core", name: "The Smouldering Core", possibleMaterials: [ - { materialId: "volcanic_ash", maxQuantity: 8, minQuantity: 4, weight: 5 }, + { materialId: "volcanic_ash", maxQuantity: 8, minQuantity: 4, weight: 5 }, { materialId: "cinder_crystal", maxQuantity: 7, minQuantity: 3, weight: 4 }, - { materialId: "ashen_cloth", maxQuantity: 5, minQuantity: 2, weight: 3 }, + { materialId: "ashen_cloth", maxQuantity: 5, minQuantity: 2, weight: 3 }, ], zoneId: "vampire_ashen_wastes", }, @@ -766,7 +766,7 @@ export const defaultVampireExplorationAreas: Array = [ durationSeconds: 540, events: [ { - effect: { amount: 10000, type: "blood_gain" }, + effect: { amount: 10_000, type: "blood_gain" }, id: "execution_ground_stones", text: "Centuries of executions have saturated the gaol-stone to its core. Your thralls crack the paving stones apart and wring blood from them like cloth. The yield is extraordinary.", }, @@ -805,8 +805,8 @@ export const defaultVampireExplorationAreas: Array = [ id: "gossamer_entry", name: "The Gossamer Entry", possibleMaterials: [ - { materialId: "veil_thread", maxQuantity: 4, minQuantity: 2, weight: 5 }, - { materialId: "phantom_dust", maxQuantity: 3, minQuantity: 1, weight: 3 }, + { materialId: "veil_thread", maxQuantity: 4, minQuantity: 2, weight: 5 }, + { materialId: "phantom_dust", maxQuantity: 3, minQuantity: 1, weight: 3 }, ], zoneId: "vampire_veilborn_hollow", }, @@ -829,8 +829,8 @@ export const defaultVampireExplorationAreas: Array = [ name: "The Crystal Grove", possibleMaterials: [ { materialId: "hollow_crystal", maxQuantity: 7, minQuantity: 3, weight: 5 }, - { materialId: "veil_thread", maxQuantity: 5, minQuantity: 2, weight: 4 }, - { materialId: "phantom_dust", maxQuantity: 4, minQuantity: 2, weight: 3 }, + { materialId: "veil_thread", maxQuantity: 5, minQuantity: 2, weight: 4 }, + { materialId: "phantom_dust", maxQuantity: 4, minQuantity: 2, weight: 3 }, ], zoneId: "vampire_veilborn_hollow", }, @@ -852,9 +852,9 @@ export const defaultVampireExplorationAreas: Array = [ id: "phantom_fen", name: "The Phantom Fen", possibleMaterials: [ - { materialId: "phantom_dust", maxQuantity: 8, minQuantity: 4, weight: 5 }, + { materialId: "phantom_dust", maxQuantity: 8, minQuantity: 4, weight: 5 }, { materialId: "hollow_crystal", maxQuantity: 6, minQuantity: 3, weight: 4 }, - { materialId: "veil_thread", maxQuantity: 6, minQuantity: 3, weight: 3 }, + { materialId: "veil_thread", maxQuantity: 6, minQuantity: 3, weight: 3 }, ], zoneId: "vampire_veilborn_hollow", }, @@ -863,7 +863,7 @@ export const defaultVampireExplorationAreas: Array = [ durationSeconds: 600, events: [ { - effect: { amount: 12000, type: "blood_gain" }, + effect: { amount: 12_000, type: "blood_gain" }, id: "veils_heart_confluence", text: "At the heart of the hollow, blood from both sides of the veil pools freely — the dead giving back what the living lost, the living giving what the dead still need. You take all of it.", }, @@ -876,9 +876,9 @@ export const defaultVampireExplorationAreas: Array = [ id: "veils_heart", name: "The Veil's Heart", possibleMaterials: [ - { materialId: "veil_thread", maxQuantity: 9, minQuantity: 4, weight: 5 }, + { materialId: "veil_thread", maxQuantity: 9, minQuantity: 4, weight: 5 }, { materialId: "hollow_crystal", maxQuantity: 8, minQuantity: 4, weight: 4 }, - { materialId: "phantom_dust", maxQuantity: 8, minQuantity: 3, weight: 3 }, + { materialId: "phantom_dust", maxQuantity: 8, minQuantity: 3, weight: 3 }, ], zoneId: "vampire_veilborn_hollow", }, @@ -902,7 +902,7 @@ export const defaultVampireExplorationAreas: Array = [ id: "boggy_fringe", name: "The Boggy Fringe", possibleMaterials: [ - { materialId: "moor_peat", maxQuantity: 4, minQuantity: 2, weight: 5 }, + { materialId: "moor_peat", maxQuantity: 4, minQuantity: 2, weight: 5 }, { materialId: "fog_essence", maxQuantity: 3, minQuantity: 1, weight: 3 }, ], zoneId: "vampire_moonless_moor", @@ -926,7 +926,7 @@ export const defaultVampireExplorationAreas: Array = [ name: "The Fog Bank", possibleMaterials: [ { materialId: "fog_essence", maxQuantity: 7, minQuantity: 3, weight: 5 }, - { materialId: "moor_peat", maxQuantity: 6, minQuantity: 3, weight: 4 }, + { materialId: "moor_peat", maxQuantity: 6, minQuantity: 3, weight: 4 }, { materialId: "night_bloom", maxQuantity: 4, minQuantity: 2, weight: 3 }, ], zoneId: "vampire_moonless_moor", @@ -951,7 +951,7 @@ export const defaultVampireExplorationAreas: Array = [ possibleMaterials: [ { materialId: "night_bloom", maxQuantity: 8, minQuantity: 4, weight: 5 }, { materialId: "fog_essence", maxQuantity: 6, minQuantity: 3, weight: 4 }, - { materialId: "moor_peat", maxQuantity: 6, minQuantity: 3, weight: 3 }, + { materialId: "moor_peat", maxQuantity: 6, minQuantity: 3, weight: 3 }, ], zoneId: "vampire_moonless_moor", }, @@ -960,7 +960,7 @@ export const defaultVampireExplorationAreas: Array = [ durationSeconds: 660, events: [ { - effect: { amount: 14000, type: "blood_gain" }, + effect: { amount: 14_000, type: "blood_gain" }, id: "moonless_centre_reservoir", text: "Below the warm peat, your thralls find a buried reservoir — blood pressed into the earth over centuries by the weight above it. The moor has been collecting on your behalf for a very long time.", }, @@ -973,7 +973,7 @@ export const defaultVampireExplorationAreas: Array = [ id: "moonless_centre", name: "The Moonless Centre", possibleMaterials: [ - { materialId: "moor_peat", maxQuantity: 9, minQuantity: 4, weight: 5 }, + { materialId: "moor_peat", maxQuantity: 9, minQuantity: 4, weight: 5 }, { materialId: "night_bloom", maxQuantity: 8, minQuantity: 4, weight: 4 }, { materialId: "fog_essence", maxQuantity: 7, minQuantity: 3, weight: 3 }, ], @@ -1000,7 +1000,7 @@ export const defaultVampireExplorationAreas: Array = [ name: "The Flooded Entry", possibleMaterials: [ { materialId: "sunken_stone", maxQuantity: 4, minQuantity: 2, weight: 5 }, - { materialId: "deep_amber", maxQuantity: 3, minQuantity: 1, weight: 3 }, + { materialId: "deep_amber", maxQuantity: 3, minQuantity: 1, weight: 3 }, ], zoneId: "vampire_sunken_crypt", }, @@ -1024,7 +1024,7 @@ export const defaultVampireExplorationAreas: Array = [ possibleMaterials: [ { materialId: "drowned_silk", maxQuantity: 7, minQuantity: 3, weight: 5 }, { materialId: "sunken_stone", maxQuantity: 6, minQuantity: 3, weight: 4 }, - { materialId: "deep_amber", maxQuantity: 4, minQuantity: 2, weight: 3 }, + { materialId: "deep_amber", maxQuantity: 4, minQuantity: 2, weight: 3 }, ], zoneId: "vampire_sunken_crypt", }, @@ -1046,7 +1046,7 @@ export const defaultVampireExplorationAreas: Array = [ id: "amber_vaults", name: "The Amber Vaults", possibleMaterials: [ - { materialId: "deep_amber", maxQuantity: 8, minQuantity: 4, weight: 5 }, + { materialId: "deep_amber", maxQuantity: 8, minQuantity: 4, weight: 5 }, { materialId: "drowned_silk", maxQuantity: 6, minQuantity: 3, weight: 4 }, { materialId: "sunken_stone", maxQuantity: 7, minQuantity: 3, weight: 3 }, ], @@ -1057,7 +1057,7 @@ export const defaultVampireExplorationAreas: Array = [ durationSeconds: 720, events: [ { - effect: { amount: 18000, type: "blood_gain" }, + effect: { amount: 18_000, type: "blood_gain" }, id: "deepmost_chamber_trove", text: "The chamber holds the crypt's founding blood-price — the original offering that consecrated the site. Untouched for centuries. Unmistakably yours now.", }, @@ -1071,8 +1071,8 @@ export const defaultVampireExplorationAreas: Array = [ name: "The Deepmost Chamber", possibleMaterials: [ { materialId: "sunken_stone", maxQuantity: 10, minQuantity: 5, weight: 5 }, - { materialId: "deep_amber", maxQuantity: 9, minQuantity: 4, weight: 4 }, - { materialId: "drowned_silk", maxQuantity: 7, minQuantity: 3, weight: 3 }, + { materialId: "deep_amber", maxQuantity: 9, minQuantity: 4, weight: 4 }, + { materialId: "drowned_silk", maxQuantity: 7, minQuantity: 3, weight: 3 }, ], zoneId: "vampire_sunken_crypt", }, @@ -1097,7 +1097,7 @@ export const defaultVampireExplorationAreas: Array = [ name: "The Broken Nave", possibleMaterials: [ { materialId: "defiled_marble", maxQuantity: 4, minQuantity: 2, weight: 5 }, - { materialId: "dark_incense", maxQuantity: 3, minQuantity: 1, weight: 3 }, + { materialId: "dark_incense", maxQuantity: 3, minQuantity: 1, weight: 3 }, ], zoneId: "vampire_desecrated_sanctum", }, @@ -1119,9 +1119,9 @@ export const defaultVampireExplorationAreas: Array = [ id: "glass_chapel", name: "The Glass Chapel", possibleMaterials: [ - { materialId: "sanctum_glass", maxQuantity: 7, minQuantity: 3, weight: 5 }, + { materialId: "sanctum_glass", maxQuantity: 7, minQuantity: 3, weight: 5 }, { materialId: "defiled_marble", maxQuantity: 6, minQuantity: 3, weight: 4 }, - { materialId: "dark_incense", maxQuantity: 5, minQuantity: 2, weight: 3 }, + { materialId: "dark_incense", maxQuantity: 5, minQuantity: 2, weight: 3 }, ], zoneId: "vampire_desecrated_sanctum", }, @@ -1130,7 +1130,7 @@ export const defaultVampireExplorationAreas: Array = [ durationSeconds: 585, events: [ { - effect: { amount: 12000, type: "blood_gain" }, + effect: { amount: 12_000, type: "blood_gain" }, id: "incense_crypts_residue", text: "The incense smoke has been condensing on the crypt walls for decades, forming a resinous dark residue that your thralls scrape loose. It is potent in ways the original incense was not.", }, @@ -1143,8 +1143,8 @@ export const defaultVampireExplorationAreas: Array = [ id: "incense_crypts", name: "The Incense Crypts", possibleMaterials: [ - { materialId: "dark_incense", maxQuantity: 9, minQuantity: 4, weight: 5 }, - { materialId: "sanctum_glass", maxQuantity: 7, minQuantity: 3, weight: 4 }, + { materialId: "dark_incense", maxQuantity: 9, minQuantity: 4, weight: 5 }, + { materialId: "sanctum_glass", maxQuantity: 7, minQuantity: 3, weight: 4 }, { materialId: "defiled_marble", maxQuantity: 7, minQuantity: 3, weight: 3 }, ], zoneId: "vampire_desecrated_sanctum", @@ -1154,7 +1154,7 @@ export const defaultVampireExplorationAreas: Array = [ durationSeconds: 780, events: [ { - effect: { amount: 24000, type: "blood_gain" }, + effect: { amount: 24_000, type: "blood_gain" }, id: "altar_of_defilement_reserve", text: "The altar has been collecting since the desecration — blood offered by those who came after, compounding over generations. The reservoir beneath it is staggering. You take it all.", }, @@ -1168,8 +1168,8 @@ export const defaultVampireExplorationAreas: Array = [ name: "The Altar of Defilement", possibleMaterials: [ { materialId: "defiled_marble", maxQuantity: 10, minQuantity: 5, weight: 5 }, - { materialId: "dark_incense", maxQuantity: 9, minQuantity: 4, weight: 4 }, - { materialId: "sanctum_glass", maxQuantity: 8, minQuantity: 4, weight: 3 }, + { materialId: "dark_incense", maxQuantity: 9, minQuantity: 4, weight: 4 }, + { materialId: "sanctum_glass", maxQuantity: 8, minQuantity: 4, weight: 3 }, ], zoneId: "vampire_desecrated_sanctum", }, @@ -1193,8 +1193,8 @@ export const defaultVampireExplorationAreas: Array = [ id: "scavenger_trails", name: "The Scavenger Trails", possibleMaterials: [ - { materialId: "carrion_bone", maxQuantity: 5, minQuantity: 2, weight: 5 }, - { materialId: "peak_crystal", maxQuantity: 3, minQuantity: 1, weight: 3 }, + { materialId: "carrion_bone", maxQuantity: 5, minQuantity: 2, weight: 5 }, + { materialId: "peak_crystal", maxQuantity: 3, minQuantity: 1, weight: 3 }, ], zoneId: "vampire_carrion_peaks", }, @@ -1216,9 +1216,9 @@ export const defaultVampireExplorationAreas: Array = [ id: "crystal_ridges", name: "The Crystal Ridges", possibleMaterials: [ - { materialId: "peak_crystal", maxQuantity: 8, minQuantity: 4, weight: 5 }, - { materialId: "carrion_bone", maxQuantity: 7, minQuantity: 3, weight: 4 }, - { materialId: "blood_obsidian",maxQuantity: 4, minQuantity: 2, weight: 3 }, + { materialId: "peak_crystal", maxQuantity: 8, minQuantity: 4, weight: 5 }, + { materialId: "carrion_bone", maxQuantity: 7, minQuantity: 3, weight: 4 }, + { materialId: "blood_obsidian", maxQuantity: 4, minQuantity: 2, weight: 3 }, ], zoneId: "vampire_carrion_peaks", }, @@ -1227,7 +1227,7 @@ export const defaultVampireExplorationAreas: Array = [ durationSeconds: 630, events: [ { - effect: { amount: 15000, type: "blood_gain" }, + effect: { amount: 15_000, type: "blood_gain" }, id: "bone_slopes_compression", text: "The weight of centuries of bone has compressed the lower layers into something almost liquid — the marrow has been pressed free and pooled between the obsidian veins. A remarkable harvest.", }, @@ -1240,9 +1240,9 @@ export const defaultVampireExplorationAreas: Array = [ id: "bone_slopes", name: "The Bone Slopes", possibleMaterials: [ - { materialId: "carrion_bone", maxQuantity: 10, minQuantity: 5, weight: 5 }, - { materialId: "blood_obsidian",maxQuantity: 7, minQuantity: 3, weight: 4 }, - { materialId: "peak_crystal", maxQuantity: 6, minQuantity: 3, weight: 3 }, + { materialId: "carrion_bone", maxQuantity: 10, minQuantity: 5, weight: 5 }, + { materialId: "blood_obsidian", maxQuantity: 7, minQuantity: 3, weight: 4 }, + { materialId: "peak_crystal", maxQuantity: 6, minQuantity: 3, weight: 3 }, ], zoneId: "vampire_carrion_peaks", }, @@ -1251,7 +1251,7 @@ export const defaultVampireExplorationAreas: Array = [ durationSeconds: 840, events: [ { - effect: { amount: 30000, type: "blood_gain" }, + effect: { amount: 30_000, type: "blood_gain" }, id: "obsidian_summit_vein", text: "The obsidian at the summit is not merely stone — it is a convergence point, and blood has been seeping through it from below for centuries. Your thralls tap the convergence with iron tools and collect until their arms give out.", }, @@ -1264,9 +1264,9 @@ export const defaultVampireExplorationAreas: Array = [ id: "obsidian_summit", name: "The Obsidian Summit", possibleMaterials: [ - { materialId: "blood_obsidian",maxQuantity: 11, minQuantity: 5, weight: 5 }, - { materialId: "peak_crystal", maxQuantity: 9, minQuantity: 4, weight: 4 }, - { materialId: "carrion_bone", maxQuantity: 8, minQuantity: 4, weight: 3 }, + { materialId: "blood_obsidian", maxQuantity: 11, minQuantity: 5, weight: 5 }, + { materialId: "peak_crystal", maxQuantity: 9, minQuantity: 4, weight: 4 }, + { materialId: "carrion_bone", maxQuantity: 8, minQuantity: 4, weight: 3 }, ], zoneId: "vampire_carrion_peaks", }, @@ -1290,7 +1290,7 @@ export const defaultVampireExplorationAreas: Array = [ id: "spire_approach", name: "The Spire Approach", possibleMaterials: [ - { materialId: "spire_stone", maxQuantity: 5, minQuantity: 2, weight: 5 }, + { materialId: "spire_stone", maxQuantity: 5, minQuantity: 2, weight: 5 }, { materialId: "blood_crystal", maxQuantity: 3, minQuantity: 1, weight: 3 }, ], zoneId: "vampire_bloodspire", @@ -1313,9 +1313,9 @@ export const defaultVampireExplorationAreas: Array = [ id: "crystal_veins", name: "The Crystal Veins", possibleMaterials: [ - { materialId: "blood_crystal", maxQuantity: 9, minQuantity: 4, weight: 5 }, - { materialId: "spire_stone", maxQuantity: 7, minQuantity: 3, weight: 4 }, - { materialId: "ancient_gore", maxQuantity: 5, minQuantity: 2, weight: 3 }, + { materialId: "blood_crystal", maxQuantity: 9, minQuantity: 4, weight: 5 }, + { materialId: "spire_stone", maxQuantity: 7, minQuantity: 3, weight: 4 }, + { materialId: "ancient_gore", maxQuantity: 5, minQuantity: 2, weight: 3 }, ], zoneId: "vampire_bloodspire", }, @@ -1324,7 +1324,7 @@ export const defaultVampireExplorationAreas: Array = [ durationSeconds: 675, events: [ { - effect: { amount: 20000, type: "blood_gain" }, + effect: { amount: 20_000, type: "blood_gain" }, id: "gore_chambers_extraction", text: "The compression has reduced centuries of accumulated blood to a near-solid mass. Your thralls chip it loose in blocks and melt it down into vessels. The process is efficient and deeply unpleasant.", }, @@ -1337,9 +1337,9 @@ export const defaultVampireExplorationAreas: Array = [ id: "gore_chambers", name: "The Gore Chambers", possibleMaterials: [ - { materialId: "ancient_gore", maxQuantity: 11, minQuantity: 5, weight: 5 }, - { materialId: "blood_crystal", maxQuantity: 8, minQuantity: 4, weight: 4 }, - { materialId: "spire_stone", maxQuantity: 8, minQuantity: 4, weight: 3 }, + { materialId: "ancient_gore", maxQuantity: 11, minQuantity: 5, weight: 5 }, + { materialId: "blood_crystal", maxQuantity: 8, minQuantity: 4, weight: 4 }, + { materialId: "spire_stone", maxQuantity: 8, minQuantity: 4, weight: 3 }, ], zoneId: "vampire_bloodspire", }, @@ -1348,12 +1348,12 @@ export const defaultVampireExplorationAreas: Array = [ durationSeconds: 900, events: [ { - effect: { amount: 40000, type: "blood_gain" }, + effect: { amount: 40_000, type: "blood_gain" }, id: "spire_apex_convergence", text: "The apex is a convergence of everything the spire has ever drawn in — centuries of accumulated blood-force compressed to a single point. Your thralls tap it with every vessel they carry and still cannot take it all.", }, { - effect: { amount: 10000, type: "blood_loss" }, + effect: { amount: 10_000, type: "blood_loss" }, id: "spire_apex_toll", text: "The spire demands something in return for the apex. It does not ask — it simply adjusts the balance. Your thralls descend lighter than they climbed, in more than one sense.", }, @@ -1361,9 +1361,9 @@ export const defaultVampireExplorationAreas: Array = [ id: "spire_apex", name: "The Spire Apex", possibleMaterials: [ - { materialId: "spire_stone", maxQuantity: 12, minQuantity: 5, weight: 5 }, - { materialId: "ancient_gore", maxQuantity: 10, minQuantity: 4, weight: 4 }, - { materialId: "blood_crystal", maxQuantity: 9, minQuantity: 4, weight: 3 }, + { materialId: "spire_stone", maxQuantity: 12, minQuantity: 5, weight: 5 }, + { materialId: "ancient_gore", maxQuantity: 10, minQuantity: 4, weight: 4 }, + { materialId: "blood_crystal", maxQuantity: 9, minQuantity: 4, weight: 3 }, ], zoneId: "vampire_bloodspire", }, @@ -1388,7 +1388,7 @@ export const defaultVampireExplorationAreas: Array = [ name: "The Shroud's Edge", possibleMaterials: [ { materialId: "eternity_thread", maxQuantity: 5, minQuantity: 2, weight: 5 }, - { materialId: "shroud_dust", maxQuantity: 4, minQuantity: 2, weight: 3 }, + { materialId: "shroud_dust", maxQuantity: 4, minQuantity: 2, weight: 3 }, ], zoneId: "vampire_shroud_of_eternity", }, @@ -1410,9 +1410,9 @@ export const defaultVampireExplorationAreas: Array = [ id: "amber_groves", name: "The Amber Groves", possibleMaterials: [ - { materialId: "timeless_amber", maxQuantity: 9, minQuantity: 4, weight: 5 }, - { materialId: "eternity_thread",maxQuantity: 7, minQuantity: 3, weight: 4 }, - { materialId: "shroud_dust", maxQuantity: 6, minQuantity: 3, weight: 3 }, + { materialId: "timeless_amber", maxQuantity: 9, minQuantity: 4, weight: 5 }, + { materialId: "eternity_thread", maxQuantity: 7, minQuantity: 3, weight: 4 }, + { materialId: "shroud_dust", maxQuantity: 6, minQuantity: 3, weight: 3 }, ], zoneId: "vampire_shroud_of_eternity", }, @@ -1421,7 +1421,7 @@ export const defaultVampireExplorationAreas: Array = [ durationSeconds: 720, events: [ { - effect: { amount: 25000, type: "blood_gain" }, + effect: { amount: 25_000, type: "blood_gain" }, id: "dust_wastes_harvest", text: "The dust settles into blood like a catalyst — thickening it, concentrating it, making it something more than it was. Your thralls bleed small amounts into collection vessels and wait. The yield is extraordinary.", }, @@ -1434,9 +1434,9 @@ export const defaultVampireExplorationAreas: Array = [ id: "dust_wastes", name: "The Dust Wastes", possibleMaterials: [ - { materialId: "shroud_dust", maxQuantity: 12, minQuantity: 5, weight: 5 }, - { materialId: "timeless_amber", maxQuantity: 9, minQuantity: 4, weight: 4 }, - { materialId: "eternity_thread",maxQuantity: 8, minQuantity: 4, weight: 3 }, + { materialId: "shroud_dust", maxQuantity: 12, minQuantity: 5, weight: 5 }, + { materialId: "timeless_amber", maxQuantity: 9, minQuantity: 4, weight: 4 }, + { materialId: "eternity_thread", maxQuantity: 8, minQuantity: 4, weight: 3 }, ], zoneId: "vampire_shroud_of_eternity", }, @@ -1445,12 +1445,12 @@ export const defaultVampireExplorationAreas: Array = [ durationSeconds: 960, events: [ { - effect: { amount: 50000, type: "blood_gain" }, + effect: { amount: 50_000, type: "blood_gain" }, id: "eternal_weave_confluence", text: "The threads carry everything — memory, time, blood — in an unbroken loop. Your thralls intercept the loop at a nexus point and draw from it until the vessels shatter from the pressure.", }, { - effect: { amount: 12500, type: "blood_loss" }, + effect: { amount: 12_500, type: "blood_loss" }, id: "eternal_weave_unravelling", text: "The weave does not take kindly to interception. It unravels your thralls in the same way it unravels everything else — slowly, completely, without malice. Simply the nature of eternity.", }, @@ -1458,8 +1458,8 @@ export const defaultVampireExplorationAreas: Array = [ id: "eternal_weave", name: "The Eternal Weave", possibleMaterials: [ - { materialId: "eternity_thread",maxQuantity: 13, minQuantity: 6, weight: 5 }, - { materialId: "shroud_dust", maxQuantity: 11, minQuantity: 5, weight: 4 }, + { materialId: "eternity_thread", maxQuantity: 13, minQuantity: 6, weight: 5 }, + { materialId: "shroud_dust", maxQuantity: 11, minQuantity: 5, weight: 4 }, { materialId: "timeless_amber", maxQuantity: 10, minQuantity: 4, weight: 3 }, ], zoneId: "vampire_shroud_of_eternity", @@ -1484,7 +1484,7 @@ export const defaultVampireExplorationAreas: Array = [ id: "vault_gates", name: "The Vault Gates", possibleMaterials: [ - { materialId: "vault_iron", maxQuantity: 5, minQuantity: 2, weight: 5 }, + { materialId: "vault_iron", maxQuantity: 5, minQuantity: 2, weight: 5 }, { materialId: "abyssal_stone", maxQuantity: 4, minQuantity: 2, weight: 3 }, ], zoneId: "vampire_abyssal_vault", @@ -1507,9 +1507,9 @@ export const defaultVampireExplorationAreas: Array = [ id: "abyssal_corridors", name: "The Abyssal Corridors", possibleMaterials: [ - { materialId: "void_crystal", maxQuantity: 10, minQuantity: 4, weight: 5 }, - { materialId: "abyssal_stone", maxQuantity: 8, minQuantity: 4, weight: 4 }, - { materialId: "vault_iron", maxQuantity: 7, minQuantity: 3, weight: 3 }, + { materialId: "void_crystal", maxQuantity: 10, minQuantity: 4, weight: 5 }, + { materialId: "abyssal_stone", maxQuantity: 8, minQuantity: 4, weight: 4 }, + { materialId: "vault_iron", maxQuantity: 7, minQuantity: 3, weight: 3 }, ], zoneId: "vampire_abyssal_vault", }, @@ -1518,7 +1518,7 @@ export const defaultVampireExplorationAreas: Array = [ durationSeconds: 765, events: [ { - effect: { amount: 30000, type: "blood_gain" }, + effect: { amount: 30_000, type: "blood_gain" }, id: "inner_sanctum_reserve", text: "The Vault's purpose was preservation, and it has done its job. Everything sealed inside the inner sanctum is exactly as it was left — including a blood reserve that was vast when new and has only concentrated since.", }, @@ -1532,8 +1532,8 @@ export const defaultVampireExplorationAreas: Array = [ name: "The Inner Sanctum", possibleMaterials: [ { materialId: "abyssal_stone", maxQuantity: 12, minQuantity: 5, weight: 5 }, - { materialId: "vault_iron", maxQuantity: 10, minQuantity: 4, weight: 4 }, - { materialId: "void_crystal", maxQuantity: 9, minQuantity: 4, weight: 3 }, + { materialId: "vault_iron", maxQuantity: 10, minQuantity: 4, weight: 4 }, + { materialId: "void_crystal", maxQuantity: 9, minQuantity: 4, weight: 3 }, ], zoneId: "vampire_abyssal_vault", }, @@ -1542,12 +1542,12 @@ export const defaultVampireExplorationAreas: Array = [ durationSeconds: 1020, events: [ { - effect: { amount: 60000, type: "blood_gain" }, + effect: { amount: 60_000, type: "blood_gain" }, id: "vault_nadir_convergence", text: "The Vault's nadir is a blood convergence older than the structure above it. It has been drawing from every source within range for an age. Your thralls tap it carefully and fill every vessel they carry twice over.", }, { - effect: { amount: 15000, type: "blood_loss" }, + effect: { amount: 15_000, type: "blood_loss" }, id: "vault_nadir_presence", text: "Something at the nadir notices being drawn from. It does not retaliate — it simply equalises. Whatever your thralls gained, it takes a proportionate share back before they can leave.", }, @@ -1555,8 +1555,8 @@ export const defaultVampireExplorationAreas: Array = [ id: "vault_nadir", name: "The Vault Nadir", possibleMaterials: [ - { materialId: "vault_iron", maxQuantity: 13, minQuantity: 6, weight: 5 }, - { materialId: "void_crystal", maxQuantity: 12, minQuantity: 5, weight: 4 }, + { materialId: "vault_iron", maxQuantity: 13, minQuantity: 6, weight: 5 }, + { materialId: "void_crystal", maxQuantity: 12, minQuantity: 5, weight: 4 }, { materialId: "abyssal_stone", maxQuantity: 11, minQuantity: 5, weight: 3 }, ], zoneId: "vampire_abyssal_vault", @@ -1582,7 +1582,7 @@ export const defaultVampireExplorationAreas: Array = [ name: "The Entrance Hall", possibleMaterials: [ { materialId: "whisper_parchment", maxQuantity: 5, minQuantity: 2, weight: 5 }, - { materialId: "court_crystal", maxQuantity: 4, minQuantity: 2, weight: 3 }, + { materialId: "court_crystal", maxQuantity: 4, minQuantity: 2, weight: 3 }, ], zoneId: "vampire_court_of_whispers", }, @@ -1604,9 +1604,9 @@ export const defaultVampireExplorationAreas: Array = [ id: "records_chamber", name: "The Records Chamber", possibleMaterials: [ - { materialId: "silent_ink", maxQuantity: 10, minQuantity: 4, weight: 5 }, - { materialId: "court_crystal", maxQuantity: 9, minQuantity: 4, weight: 4 }, - { materialId: "whisper_parchment", maxQuantity: 7, minQuantity: 3, weight: 3 }, + { materialId: "silent_ink", maxQuantity: 10, minQuantity: 4, weight: 5 }, + { materialId: "court_crystal", maxQuantity: 9, minQuantity: 4, weight: 4 }, + { materialId: "whisper_parchment", maxQuantity: 7, minQuantity: 3, weight: 3 }, ], zoneId: "vampire_court_of_whispers", }, @@ -1615,7 +1615,7 @@ export const defaultVampireExplorationAreas: Array = [ durationSeconds: 810, events: [ { - effect: { amount: 40000, type: "blood_gain" }, + effect: { amount: 40_000, type: "blood_gain" }, id: "deliberation_hall_amplification", text: "The court crystals in the hall amplify everything, including the residual blood-force of every deliberation ever conducted. Your thralls attune collection vessels to the crystal frequency and draw directly from the amplified field.", }, @@ -1628,9 +1628,9 @@ export const defaultVampireExplorationAreas: Array = [ id: "deliberation_hall", name: "The Deliberation Hall", possibleMaterials: [ - { materialId: "court_crystal", maxQuantity: 12, minQuantity: 5, weight: 5 }, - { materialId: "silent_ink", maxQuantity: 10, minQuantity: 4, weight: 4 }, - { materialId: "whisper_parchment", maxQuantity: 9, minQuantity: 4, weight: 3 }, + { materialId: "court_crystal", maxQuantity: 12, minQuantity: 5, weight: 5 }, + { materialId: "silent_ink", maxQuantity: 10, minQuantity: 4, weight: 4 }, + { materialId: "whisper_parchment", maxQuantity: 9, minQuantity: 4, weight: 3 }, ], zoneId: "vampire_court_of_whispers", }, @@ -1639,12 +1639,12 @@ export const defaultVampireExplorationAreas: Array = [ durationSeconds: 1080, events: [ { - effect: { amount: 80000, type: "blood_gain" }, + effect: { amount: 80_000, type: "blood_gain" }, id: "verdict_chamber_archive", text: "Every verdict rendered in this chamber left a blood-mark — a drop pressed to parchment as seal and signature. Centuries of verdicts. Your thralls harvest the archive methodically. The yield is staggering.", }, { - effect: { amount: 20000, type: "blood_loss" }, + effect: { amount: 20_000, type: "blood_loss" }, id: "verdict_chamber_sentence", text: "The chamber renders its own verdict on your intrusion. The sentence is proportionate to what was taken. Your thralls exit having paid it, whether they agreed to or not.", }, @@ -1653,8 +1653,8 @@ export const defaultVampireExplorationAreas: Array = [ name: "The Verdict Chamber", possibleMaterials: [ { materialId: "whisper_parchment", maxQuantity: 13, minQuantity: 6, weight: 5 }, - { materialId: "court_crystal", maxQuantity: 12, minQuantity: 5, weight: 4 }, - { materialId: "silent_ink", maxQuantity: 11, minQuantity: 5, weight: 3 }, + { materialId: "court_crystal", maxQuantity: 12, minQuantity: 5, weight: 4 }, + { materialId: "silent_ink", maxQuantity: 11, minQuantity: 5, weight: 3 }, ], zoneId: "vampire_court_of_whispers", }, @@ -1665,7 +1665,7 @@ export const defaultVampireExplorationAreas: Array = [ durationSeconds: 300, events: [ { - effect: { amount: 10000, type: "blood_gain" }, + effect: { amount: 10_000, type: "blood_gain" }, id: "abyss_threshold_drift", text: "The upward-drifting ash carries everything that has fallen into the Abyss over the ages — including blood, preserved and concentrated by the long fall. Your thralls collect the ash-fall in upward-facing vessels.", }, @@ -1678,7 +1678,7 @@ export const defaultVampireExplorationAreas: Array = [ id: "abyss_threshold", name: "The Abyss Threshold", possibleMaterials: [ - { materialId: "primordial_ash", maxQuantity: 5, minQuantity: 2, weight: 5 }, + { materialId: "primordial_ash", maxQuantity: 5, minQuantity: 2, weight: 5 }, { materialId: "eternal_crystal", maxQuantity: 4, minQuantity: 2, weight: 3 }, ], zoneId: "vampire_eternal_abyss", @@ -1702,8 +1702,8 @@ export const defaultVampireExplorationAreas: Array = [ name: "The Upper Abyss", possibleMaterials: [ { materialId: "eternal_crystal", maxQuantity: 11, minQuantity: 5, weight: 5 }, - { materialId: "primordial_ash", maxQuantity: 9, minQuantity: 4, weight: 4 }, - { materialId: "void_essence", maxQuantity: 7, minQuantity: 3, weight: 3 }, + { materialId: "primordial_ash", maxQuantity: 9, minQuantity: 4, weight: 4 }, + { materialId: "void_essence", maxQuantity: 7, minQuantity: 3, weight: 3 }, ], zoneId: "vampire_eternal_abyss", }, @@ -1712,7 +1712,7 @@ export const defaultVampireExplorationAreas: Array = [ durationSeconds: 900, events: [ { - effect: { amount: 50000, type: "blood_gain" }, + effect: { amount: 50_000, type: "blood_gain" }, id: "deep_abyss_pool", text: "The void essence pools carry concentrated blood from every age — primordial, ancient, recent, all compressed together into something that predates categories. Your thralls fill every vessel with trembling hands.", }, @@ -1725,9 +1725,9 @@ export const defaultVampireExplorationAreas: Array = [ id: "deep_abyss", name: "The Deep Abyss", possibleMaterials: [ - { materialId: "void_essence", maxQuantity: 13, minQuantity: 6, weight: 5 }, + { materialId: "void_essence", maxQuantity: 13, minQuantity: 6, weight: 5 }, { materialId: "eternal_crystal", maxQuantity: 11, minQuantity: 5, weight: 4 }, - { materialId: "primordial_ash", maxQuantity: 11, minQuantity: 5, weight: 3 }, + { materialId: "primordial_ash", maxQuantity: 11, minQuantity: 5, weight: 3 }, ], zoneId: "vampire_eternal_abyss", }, @@ -1736,12 +1736,12 @@ export const defaultVampireExplorationAreas: Array = [ durationSeconds: 1200, events: [ { - effect: { amount: 100000, type: "blood_gain" }, + effect: { amount: 100_000, type: "blood_gain" }, id: "abyss_floor_primordial", text: "The Abyss floor holds the first blood — the blood that was here before anything else was, compressed by eternity into something that makes every other harvest feel like a prelude. Your thralls collect it in silence, in awe, in haste.", }, { - effect: { amount: 25000, type: "blood_loss" }, + effect: { amount: 25_000, type: "blood_loss" }, id: "abyss_floor_price", text: "The primordial blood exacts a price for being taken. Not from malice — it simply has gravity that everything else lacks. What your thralls carry out, it calls back a portion of. You consider this acceptable. You are not entirely sure you had a choice.", }, @@ -1749,8 +1749,8 @@ export const defaultVampireExplorationAreas: Array = [ id: "abyss_floor", name: "The Abyss Floor", possibleMaterials: [ - { materialId: "primordial_ash", maxQuantity: 15, minQuantity: 7, weight: 5 }, - { materialId: "void_essence", maxQuantity: 14, minQuantity: 6, weight: 4 }, + { materialId: "primordial_ash", maxQuantity: 15, minQuantity: 7, weight: 5 }, + { materialId: "void_essence", maxQuantity: 14, minQuantity: 6, weight: 4 }, { materialId: "eternal_crystal", maxQuantity: 13, minQuantity: 6, weight: 3 }, ], zoneId: "vampire_eternal_abyss", diff --git a/apps/api/src/data/vampireQuests.ts b/apps/api/src/data/vampireQuests.ts index 1b6b7c6..7e2bc66 100644 --- a/apps/api/src/data/vampireQuests.ts +++ b/apps/api/src/data/vampireQuests.ts @@ -41,25 +41,25 @@ export const defaultVampireQuests: Array = [ 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: "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.", + durationSeconds: 600, + id: "the_reliquary_unsealed", + name: "The Reliquary Unsealed", + prerequisiteIds: [ "culling_the_fledglings" ], + rewards: [ { amount: 1000, 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" }, + 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.", + durationSeconds: 1200, + id: "first_hunt", + name: "The First Hunt", + prerequisiteIds: [ "the_reliquary_unsealed" ], + rewards: [ + { amount: 2500, type: "blood" }, { targetId: "ghoul", type: "thrall" }, ], status: "locked", @@ -73,51 +73,51 @@ export const defaultVampireQuests: Array = [ id: "reading_the_mire", name: "Reading the Mire", prerequisiteIds: [], - rewards: [ { amount: 5_000, type: "blood" } ], + rewards: [ { amount: 5000, 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: "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.", + durationSeconds: 1200, + 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: "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.", + durationSeconds: 2400, + 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: "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.", + durationSeconds: 3600, + 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: [ + 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.", + durationSeconds: 7200, + id: "mire_mastery", + name: "Mire Mastery", + prerequisiteIds: [ "the_great_leech" ], + rewards: [ { amount: 200_000, type: "blood" }, { amount: 3, type: "ichor" }, { targetId: "shade", type: "thrall" }, @@ -128,57 +128,57 @@ export const defaultVampireQuests: Array = [ // ── 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 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.", + durationSeconds: 1800, + 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: "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.", + durationSeconds: 3600, + 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: "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.", + durationSeconds: 7200, + 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: "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.", + 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: [ + 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.", + 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" }, @@ -189,57 +189,57 @@ export const defaultVampireQuests: Array = [ // ── 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: "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.", + durationSeconds: 7200, + 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: "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.", + 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 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.", + 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 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.", + 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: [ + 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.", + 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" }, @@ -250,57 +250,57 @@ export const defaultVampireQuests: Array = [ // ── 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: "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.", + 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: "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.", + 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: "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.", + 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'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.", + 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: [ + combatPowerRequired: 1200, + 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.", + 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" }, @@ -311,59 +311,59 @@ export const defaultVampireQuests: Array = [ // ── 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", + combatPowerRequired: 1400, + 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.", + 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", + combatPowerRequired: 1700, + 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.", + 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", + combatPowerRequired: 2200, + 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.", + 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", + combatPowerRequired: 2800, + 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.", + 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: [ + combatPowerRequired: 3500, + 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.", + 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" }, + { amount: 1000, type: "ichor" }, { targetId: "revenant", type: "thrall" }, ], status: "locked", @@ -372,59 +372,59 @@ export const defaultVampireQuests: Array = [ // ── 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", + combatPowerRequired: 4000, + 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.", + 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", + combatPowerRequired: 5000, + 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.", + 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", + combatPowerRequired: 6500, + 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.", + 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: 1200, 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", + combatPowerRequired: 8000, + 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.", + durationSeconds: 259_200, + id: "ash_refinement", + name: "Ash Refinement", + prerequisiteIds: [ "the_buried_vault" ], + rewards: [ { amount: 700_000_000_000_000, type: "blood" }, { amount: 2000, 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: [ + 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.", + 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" }, + { amount: 3000, type: "ichor" }, { targetId: "bloodreaver", type: "thrall" }, ], status: "locked", @@ -433,57 +433,57 @@ export const defaultVampireQuests: Array = [ // ── 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 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.", + durationSeconds: 86_400, + id: "testing_the_wards", + name: "Testing the Wards", + prerequisiteIds: [], + rewards: [ { amount: 5_000_000_000_000_000, type: "blood" }, { amount: 1000, 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 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.", + 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: 2000, 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 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.", + 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: 4000, 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: "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.", + 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: 7000, 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: [ + 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.", + 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" }, @@ -494,57 +494,57 @@ export const defaultVampireQuests: Array = [ // ── 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 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.", + 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: 3000, 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: "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.", + 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: 6000, 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: "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.", + 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: "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.", + 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: [ + 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.", + 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" }, @@ -556,57 +556,57 @@ export const defaultVampireQuests: Array = [ // ── 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 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.", + 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 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.", + 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: "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.", + 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: "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.", + 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: [ + 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.", + 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" }, @@ -618,57 +618,57 @@ export const defaultVampireQuests: Array = [ // ── 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 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.", + 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 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.", + 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 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.", + 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: "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.", + 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: [ + 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.", + 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" }, @@ -680,57 +680,57 @@ export const defaultVampireQuests: Array = [ // ── 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 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.", + 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 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.", + 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: "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.", + 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: "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.", + 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: [ + 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.", + 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" }, @@ -742,60 +742,60 @@ export const defaultVampireQuests: Array = [ // ── 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 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.", + 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 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.", + 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 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.", + 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: "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.", + 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: [ + 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.", + 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" }, + { amount: 1200, type: "soulShards" }, { targetId: "grave_warden", type: "thrall" }, ], status: "locked", @@ -804,60 +804,60 @@ export const defaultVampireQuests: Array = [ // ── 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 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.", + 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'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.", + 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: "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.", + 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: 1100, 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: "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.", + 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: 1600, 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: [ + 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.", + 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" }, + { amount: 2300, type: "soulShards" }, { targetId: "soul_drinker", type: "thrall" }, ], status: "locked", @@ -866,60 +866,60 @@ export const defaultVampireQuests: Array = [ // ── 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 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.", + 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'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.", + 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: 1200, 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 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.", + 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: 2000, 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: "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.", + 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: 3200, 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: [ + 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.", + 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" }, + { amount: 5000, type: "soulShards" }, { targetId: "blood_ancient", type: "thrall" }, ], status: "locked", @@ -928,57 +928,57 @@ export const defaultVampireQuests: Array = [ // ── 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 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.", + 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: 1700, 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 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.", + 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: 3000, 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 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.", + 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: 5000, 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: "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.", + 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: 8000, 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: [ + 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.", + 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" }, @@ -990,57 +990,57 @@ export const defaultVampireQuests: Array = [ // ── 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 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.", + 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: 4000, 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 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.", + 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: 7000, 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 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.", + 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'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.", + 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: [ + 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.", + 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" }, @@ -1052,57 +1052,57 @@ export const defaultVampireQuests: Array = [ // ── 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 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.", + 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: 8000, 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 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.", + 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'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.", + 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: "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.", + 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: [ + 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.", + 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" }, diff --git a/apps/api/src/data/vampireSiringUpgrades.ts b/apps/api/src/data/vampireSiringUpgrades.ts index 1c16e27..5ea60c0 100644 --- a/apps/api/src/data/vampireSiringUpgrades.ts +++ b/apps/api/src/data/vampireSiringUpgrades.ts @@ -52,7 +52,7 @@ export const defaultVampireSiringUpgrades: Array = [ { category: "blood", description: "The accumulated weight of many sirings floods every vein in your domain. All blood/s ×25.", - ichorCost: 1_000, + ichorCost: 1000, id: "siring_blood_6", multiplier: 25, name: "Ichor Awakening VI", diff --git a/apps/api/src/data/vampireThralls.ts b/apps/api/src/data/vampireThralls.ts index 4f91361..c63e1ea 100644 --- a/apps/api/src/data/vampireThralls.ts +++ b/apps/api/src/data/vampireThralls.ts @@ -59,7 +59,7 @@ export const defaultVampireThralls: Array = [ unlocked: false, }, { - baseCost: 5_000, + baseCost: 5000, bloodPerSecond: 20, class: "fledgling", combatPower: 50, @@ -109,9 +109,9 @@ export const defaultVampireThralls: Array = [ }, { baseCost: 15_000_000, - bloodPerSecond: 1_000, + bloodPerSecond: 1000, class: "revenant", - combatPower: 1_800, + combatPower: 1800, count: 0, ichorPerSecond: 1, id: "revenant_4", @@ -121,9 +121,9 @@ export const defaultVampireThralls: Array = [ }, { baseCost: 120_000_000, - bloodPerSecond: 2_500, + bloodPerSecond: 2500, class: "revenant", - combatPower: 4_000, + combatPower: 4000, count: 0, ichorPerSecond: 2, id: "revenant_5", @@ -134,9 +134,9 @@ export const defaultVampireThralls: Array = [ // ── Shade (6 tiers) ─────────────────────────────────────────────────────── { baseCost: 800_000_000, - bloodPerSecond: 6_000, + bloodPerSecond: 6000, class: "shade", - combatPower: 9_000, + combatPower: 9000, count: 0, ichorPerSecond: 5, id: "shade_1", @@ -235,7 +235,7 @@ export const defaultVampireThralls: Array = [ class: "bloodbound", combatPower: 5_000_000, count: 0, - ichorPerSecond: 1_200, + ichorPerSecond: 1200, id: "bloodbound_3", level: 19, name: "Elder Bloodbound", @@ -247,7 +247,7 @@ export const defaultVampireThralls: Array = [ class: "bloodbound", combatPower: 11_000_000, count: 0, - ichorPerSecond: 2_500, + ichorPerSecond: 2500, id: "bloodbound_4", level: 20, name: "Oath Bloodbound", @@ -259,7 +259,7 @@ export const defaultVampireThralls: Array = [ class: "bloodbound", combatPower: 24_000_000, count: 0, - ichorPerSecond: 5_000, + ichorPerSecond: 5000, id: "bloodbound_5", level: 21, name: "Ancient Bloodbound", diff --git a/apps/api/src/data/vampireUpgrades.ts b/apps/api/src/data/vampireUpgrades.ts index d86e4fa..165dad9 100644 --- a/apps/api/src/data/vampireUpgrades.ts +++ b/apps/api/src/data/vampireUpgrades.ts @@ -35,7 +35,7 @@ export const defaultVampireUpgrades: Array = [ unlocked: true, }, { - costBlood: 1_000, + costBlood: 1000, costIchor: 1, costSoulShards: 0, description: "The hunt becomes ritual — every drop flows with purpose. All blood/s ×2.", @@ -47,7 +47,7 @@ export const defaultVampireUpgrades: Array = [ unlocked: true, }, { - costBlood: 5_000, + costBlood: 5000, costIchor: 2, costSoulShards: 0, description: "The ritual deepens. Every vein in your domain opens wider. All blood/s ×3.", @@ -144,7 +144,7 @@ export const defaultVampireUpgrades: Array = [ }, { costBlood: 3_000_000_000, - costIchor: 1_000, + costIchor: 1000, costSoulShards: 10, description: "The flood becomes eternal — the blood never stops flowing. All blood/s ×25.", id: "crimson_tide_3", @@ -156,7 +156,7 @@ export const defaultVampireUpgrades: Array = [ }, { costBlood: 20_000_000_000, - costIchor: 2_000, + costIchor: 2000, costSoulShards: 15, description: "The eternal thirst drives every thrall beyond their limits. All blood/s ×10.", id: "eternal_thirst_1", @@ -168,7 +168,7 @@ export const defaultVampireUpgrades: Array = [ }, { costBlood: 150_000_000_000, - costIchor: 5_000, + costIchor: 5000, costSoulShards: 25, description: "The second degree of eternal thirst saturates every hunting ground. All blood/s ×25.", id: "eternal_thirst_2", @@ -241,7 +241,7 @@ export const defaultVampireUpgrades: Array = [ unlocked: true, }, { - costBlood: 2_000, + costBlood: 2000, costIchor: 2, costSoulShards: 0, description: "Advanced fledgling conditioning multiplies their contribution. Fledgling blood/s ×4.", @@ -346,7 +346,7 @@ export const defaultVampireUpgrades: Array = [ }, { costBlood: 1_000_000_000_000, - costIchor: 1_500, + costIchor: 1500, costSoulShards: 15, description: "Total wraith mastery — they exist between states, harvesting from both. Wraith blood/s ×4.", id: "thrall_wraith_2", @@ -359,7 +359,7 @@ export const defaultVampireUpgrades: Array = [ }, { costBlood: 5_000_000_000_000, - costIchor: 3_000, + costIchor: 3000, costSoulShards: 25, description: "The ancient thralls remember techniques from before the oldest living vampires. Ancient blood/s ×2.", id: "thrall_ancient_1", @@ -372,7 +372,7 @@ export const defaultVampireUpgrades: Array = [ }, { costBlood: 100_000_000_000_000, - costIchor: 7_500, + costIchor: 7500, costSoulShards: 50, description: "The ancient thralls operate at the peak of millennia of refinement. Ancient blood/s ×4.", id: "thrall_ancient_2", @@ -458,7 +458,7 @@ export const defaultVampireUpgrades: Array = [ }, { costBlood: 5_000_000_000, - costIchor: 1_500, + costIchor: 1500, costSoulShards: 15, description: "The covenant deepens into something approaching a law of nature. All blood/s ×10.", id: "dark_covenant_2", @@ -470,7 +470,7 @@ export const defaultVampireUpgrades: Array = [ }, { costBlood: 50_000_000_000, - costIchor: 5_000, + costIchor: 5000, costSoulShards: 30, description: "The final covenant makes the domain itself hunger on your behalf. All blood/s ×25.", id: "dark_covenant_3", @@ -567,7 +567,7 @@ export const defaultVampireUpgrades: Array = [ }, { costBlood: 10_000_000_000, - costIchor: 1_500, + costIchor: 1500, costSoulShards: 10, description: "The bloodline power doubles its influence over each new generation. Siring production multiplier ×2.", id: "bloodline_power_2", @@ -579,7 +579,7 @@ export const defaultVampireUpgrades: Array = [ }, { costBlood: 100_000_000_000, - costIchor: 5_000, + costIchor: 5000, costSoulShards: 20, description: "The bloodline power reaches its third stage — threefold production. Siring production multiplier ×3.", id: "bloodline_power_3", @@ -603,7 +603,7 @@ export const defaultVampireUpgrades: Array = [ }, // ── Boss Upgrades (10) ──────────────────────────────────────────────────── { - costBlood: 1_000, + costBlood: 1000, costIchor: 1, costSoulShards: 0, description: "The hunter's instinct sharpens with each victory. Thrall combat power ×1.25.", @@ -676,7 +676,7 @@ export const defaultVampireUpgrades: Array = [ }, { costBlood: 1_000_000_000, - costIchor: 1_000, + costIchor: 1000, costSoulShards: 10, description: "The apex predator sense collapses all opposition with surgical efficiency. Thrall combat power ×5.", id: "predator_sense_3", @@ -688,7 +688,7 @@ export const defaultVampireUpgrades: Array = [ }, { costBlood: 10_000_000_000, - costIchor: 3_000, + costIchor: 3000, costSoulShards: 20, description: "The first apex predator upgrade transcends ordinary vampire combat. Thrall combat power ×5.", id: "apex_predator_1", diff --git a/apps/api/src/routes/game.ts b/apps/api/src/routes/game.ts index 1c65941..5073397 100644 --- a/apps/api/src/routes/game.ts +++ b/apps/api/src/routes/game.ts @@ -886,6 +886,175 @@ const validateAndSanitize = ( }; } + /* + * Vampire state: preserve server-only currencies (ichor, soul shards, blood) at + * previous values, and apply the same forward-only rules to bosses/quests/achievements + * and exploration materials that the mortal and goddess realms use. + * Blood income will be computed and allowed to grow once Chunk 7 adds vampire tick logic. + */ + // eslint-disable-next-line capitalized-comments -- v8 ignore + /* v8 ignore next 154 -- @preserve */ + let vampireSpread: object = {}; + const previousVampire = previous.vampire; + const incomingVampire = incoming.vampire; + if (!incomingVampire && previousVampire) { + vampireSpread = { vampire: previousVampire }; + } else if (incomingVampire) { + const vampireBosses = incomingVampire.bosses.map((boss) => { + const matchingBoss = previousVampire?.bosses.find((storedBoss) => { + return storedBoss.id === boss.id; + }); + if (!matchingBoss) { + return boss; + } + if (matchingBoss.status === "defeated" && boss.status !== "defeated") { + return { ...boss, currentHp: 0, status: "defeated" as const }; + } + return boss; + }); + const vampireQuests = incomingVampire.quests.map((quest) => { + const matchingQuest = previousVampire?.quests.find((storedQuest) => { + return storedQuest.id === quest.id; + }); + if (!matchingQuest) { + return quest; + } + // eslint-disable-next-line stylistic/max-len -- Long condition; splitting would reduce readability + if (matchingQuest.status === "completed" && quest.status !== "completed") { + return { ...matchingQuest }; + } + return quest; + }); + // eslint-disable-next-line stylistic/max-len -- Long variable name; splitting would reduce readability + const vampireAchievements = incomingVampire.achievements.map((achievement) => { + const matchingAchievement = previousVampire?.achievements.find( + (storedAchievement) => { + return storedAchievement.id === achievement.id; + }, + ); + if (!matchingAchievement) { + return achievement; + } + const wasUnlocked = matchingAchievement.unlockedAt !== null; + const isNowNull = achievement.unlockedAt === null; + if (wasUnlocked && isNowNull) { + return { ...achievement, unlockedAt: matchingAchievement.unlockedAt }; + } + const isFuture + = achievement.unlockedAt !== null && achievement.unlockedAt > now; + if (isFuture) { + const safeUnlockedAt = matchingAchievement.unlockedAt ?? null; + return { ...achievement, unlockedAt: safeUnlockedAt }; + } + return achievement; + }); + const previousVampireExploration = previousVampire?.exploration; + let vampireExploration = incomingVampire.exploration; + if (previousVampireExploration) { + const previousMaterialMap = new Map( + previousVampireExploration.materials.map((mat) => { + return [ mat.materialId, mat.quantity ] as const; + }), + ); + // eslint-disable-next-line stylistic/max-len -- Long variable name; splitting would reduce readability + const materials = incomingVampire.exploration.materials.map((material) => { + const previousQuantity + = previousMaterialMap.get(material.materialId) ?? 0; + return { + ...material, + quantity: Math.min(material.quantity, previousQuantity), + }; + }); + const vampireRecipeIds = [ + ...new Set([ + ...previousVampireExploration.craftedRecipeIds, + ...incomingVampire.exploration.craftedRecipeIds, + ]), + ]; + vampireExploration = { + ...incomingVampire.exploration, + // eslint-disable-next-line stylistic/max-len -- Long field name; splitting would reduce readability + craftedBloodMultiplier: previousVampireExploration.craftedBloodMultiplier, + // eslint-disable-next-line stylistic/max-len -- Long field name; splitting would reduce readability + craftedCombatMultiplier: previousVampireExploration.craftedCombatMultiplier, + // eslint-disable-next-line stylistic/max-len -- Long field name; splitting would reduce readability + craftedIchorMultiplier: previousVampireExploration.craftedIchorMultiplier, + craftedRecipeIds: vampireRecipeIds, + materials: materials, + }; + } + const siring = previousVampire + ? { + ...incomingVampire.siring, + count: Math.min( + incomingVampire.siring.count, + previousVampire.siring.count, + ), + ichor: Math.min( + incomingVampire.siring.ichor, + previousVampire.siring.ichor, + ), + productionMultiplier: previousVampire.siring.productionMultiplier, + } + : incomingVampire.siring; + const awakening = previousVampire + ? { + ...incomingVampire.awakening, + count: Math.min( + incomingVampire.awakening.count, + previousVampire.awakening.count, + ), + soulShards: Math.min( + incomingVampire.awakening.soulShards, + previousVampire.awakening.soulShards, + ), + // eslint-disable-next-line stylistic/max-len -- Long field name; splitting would reduce readability + soulShardsBloodMultiplier: previousVampire.awakening.soulShardsBloodMultiplier, + // eslint-disable-next-line stylistic/max-len -- Long field name; splitting would reduce readability + soulShardsCombatMultiplier: previousVampire.awakening.soulShardsCombatMultiplier, + // eslint-disable-next-line stylistic/max-len -- Long field name; splitting would reduce readability + soulShardsMetaMultiplier: previousVampire.awakening.soulShardsMetaMultiplier, + // eslint-disable-next-line stylistic/max-len -- Long field name; splitting would reduce readability + soulShardsSiringIchorMultiplier: previousVampire.awakening.soulShardsSiringIchorMultiplier, + // eslint-disable-next-line stylistic/max-len -- Long field name; splitting would reduce readability + soulShardsSiringThresholdMultiplier: previousVampire.awakening.soulShardsSiringThresholdMultiplier, + } + : incomingVampire.awakening; + vampireSpread = { + vampire: { + ...incomingVampire, + achievements: vampireAchievements, + awakening: awakening, + bosses: vampireBosses, + eternalSovereignty: { + count: Math.min( + incomingVampire.eternalSovereignty.count, + previousVampire?.eternalSovereignty.count ?? 0, + ), + }, + exploration: vampireExploration, + lifetimeBloodEarned: Math.min( + incomingVampire.lifetimeBloodEarned, + previousVampire?.lifetimeBloodEarned ?? 0, + ), + lifetimeBossesDefeated: Math.min( + incomingVampire.lifetimeBossesDefeated, + previousVampire?.lifetimeBossesDefeated ?? 0, + ), + lifetimeQuestsCompleted: Math.min( + incomingVampire.lifetimeQuestsCompleted, + previousVampire?.lifetimeQuestsCompleted ?? 0, + ), + quests: vampireQuests, + siring: siring, + totalBloodEarned: Math.min( + incomingVampire.totalBloodEarned, + previousVampire?.totalBloodEarned ?? 0, + ), + }, + }; + } + return { ...incoming, achievements, @@ -900,6 +1069,7 @@ const validateAndSanitize = ( ...storySpread, ...dailyChallengesSpread, ...goddessSpread, + ...vampireSpread, }; }; diff --git a/packages/types/src/interfaces/gameState.ts b/packages/types/src/interfaces/gameState.ts index f337092..d5c8386 100644 --- a/packages/types/src/interfaces/gameState.ts +++ b/packages/types/src/interfaces/gameState.ts @@ -14,7 +14,6 @@ import type { DailyChallengeState } from "./dailyChallenge.js"; import type { Equipment } from "./equipment.js"; import type { ExplorationState } from "./exploration.js"; import type { GoddessState } from "./goddessState.js"; -import type { VampireState } from "./vampireState.js"; import type { Player } from "./player.js"; import type { PrestigeData } from "./prestige.js"; import type { Quest } from "./quest.js"; @@ -22,6 +21,7 @@ import type { Resource } from "./resource.js"; import type { StoryState } from "./story.js"; import type { TranscendenceData } from "./transcendence.js"; import type { Upgrade } from "./upgrade.js"; +import type { VampireState } from "./vampireState.js"; import type { Zone } from "./zone.js"; interface GameState { diff --git a/packages/types/src/interfaces/vampireEquipmentSet.ts b/packages/types/src/interfaces/vampireEquipmentSet.ts index 5b2e821..a6ee2b7 100644 --- a/packages/types/src/interfaces/vampireEquipmentSet.ts +++ b/packages/types/src/interfaces/vampireEquipmentSet.ts @@ -54,9 +54,9 @@ const computeVampireSetBonuses = ( for (const threshold of [ 2, 3 ] as const) { if (count >= threshold) { const bonus = set.bonuses[threshold]; - bloodMultiplier = bloodMultiplier * (bonus.bloodMultiplier ?? 1); + bloodMultiplier = bloodMultiplier * (bonus.bloodMultiplier ?? 1); combatMultiplier = combatMultiplier * (bonus.combatMultiplier ?? 1); - ichorMultiplier = ichorMultiplier * (bonus.ichorMultiplier ?? 1); + ichorMultiplier = ichorMultiplier * (bonus.ichorMultiplier ?? 1); } } } diff --git a/packages/types/src/interfaces/vampireSiring.ts b/packages/types/src/interfaces/vampireSiring.ts index 376d923..665198b 100644 --- a/packages/types/src/interfaces/vampireSiring.ts +++ b/packages/types/src/interfaces/vampireSiring.ts @@ -13,11 +13,11 @@ type SiringUpgradeCategory = | "utility"; interface SiringUpgrade { - id: string; - name: string; + id: string; + name: string; description: string; - category: SiringUpgradeCategory; - ichorCost: number; + category: SiringUpgradeCategory; + ichorCost: number; /** * Multiplier applied when this upgrade is purchased. diff --git a/packages/types/src/interfaces/vampireState.ts b/packages/types/src/interfaces/vampireState.ts index 95a26f8..fa699bf 100644 --- a/packages/types/src/interfaces/vampireState.ts +++ b/packages/types/src/interfaces/vampireState.ts @@ -4,8 +4,8 @@ * @license Naomi's Public License * @author Naomi Carrigan */ -import type { AwakeningData } from "./vampireAwakening.js"; import type { VampireAchievement } from "./vampireAchievement.js"; +import type { AwakeningData } from "./vampireAwakening.js"; import type { VampireBoss } from "./vampireBoss.js"; import type { VampireEquipment } from "./vampireEquipment.js"; import type { VampireExplorationState } from "./vampireExploration.js"; diff --git a/packages/types/src/interfaces/vampireUpgrade.ts b/packages/types/src/interfaces/vampireUpgrade.ts index a6fdee3..acba085 100644 --- a/packages/types/src/interfaces/vampireUpgrade.ts +++ b/packages/types/src/interfaces/vampireUpgrade.ts @@ -26,12 +26,12 @@ interface VampireUpgrade { /** * Multiplier applied to the target's output. */ - multiplier: number; - costBlood: number; - costIchor: number; + multiplier: number; + costBlood: number; + costIchor: number; costSoulShards: number; - purchased: boolean; - unlocked: boolean; + purchased: boolean; + unlocked: boolean; } export type { VampireUpgrade, VampireUpgradeTarget };