generated from nhcarrigan/template
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.
This commit is contained in:
@@ -20,9 +20,18 @@ import { defaultGoddessZones } from "./goddessZones.js";
|
|||||||
import { defaultQuests } from "./quests.js";
|
import { defaultQuests } from "./quests.js";
|
||||||
import { currentSchemaVersion } from "./schemaVersion.js";
|
import { currentSchemaVersion } from "./schemaVersion.js";
|
||||||
import { defaultUpgrades } from "./upgrades.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 { defaultZones } from "./zones.js";
|
||||||
import type {
|
import type {
|
||||||
ApotheosisData,
|
ApotheosisData,
|
||||||
|
AwakeningData,
|
||||||
ConsecrationData,
|
ConsecrationData,
|
||||||
EnlightenmentData,
|
EnlightenmentData,
|
||||||
ExplorationState,
|
ExplorationState,
|
||||||
@@ -30,7 +39,9 @@ import type {
|
|||||||
GoddessState,
|
GoddessState,
|
||||||
Player,
|
Player,
|
||||||
PrestigeData,
|
PrestigeData,
|
||||||
|
SiringData,
|
||||||
TranscendenceData,
|
TranscendenceData,
|
||||||
|
VampireState,
|
||||||
} from "@elysium/types";
|
} from "@elysium/types";
|
||||||
|
|
||||||
const initialPrestige: PrestigeData = {
|
const initialPrestige: PrestigeData = {
|
||||||
@@ -91,6 +102,24 @@ const initialEnlightenment: EnlightenmentData = {
|
|||||||
stardustPrayersMultiplier: 1,
|
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
|
* 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.
|
* 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.
|
* Builds an initial game state for a new player.
|
||||||
* @param player - The player data from Discord OAuth.
|
* @param player - The player data from Discord OAuth.
|
||||||
@@ -175,4 +246,9 @@ const initialGameState = (
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
export { initialExploration, initialGameState, initialGoddessState };
|
export {
|
||||||
|
initialExploration,
|
||||||
|
initialGameState,
|
||||||
|
initialGoddessState,
|
||||||
|
initialVampireState,
|
||||||
|
};
|
||||||
|
|||||||
@@ -5,13 +5,13 @@
|
|||||||
* @author Naomi Carrigan
|
* @author Naomi Carrigan
|
||||||
*/
|
*/
|
||||||
/* eslint-disable stylistic/max-len -- Data content */
|
/* eslint-disable stylistic/max-len -- Data content */
|
||||||
/* eslint-disable max-lines -- Data file */
|
|
||||||
import type { VampireAchievement } from "@elysium/types";
|
import type { VampireAchievement } from "@elysium/types";
|
||||||
|
|
||||||
export const defaultVampireAchievements: Array<VampireAchievement> = [
|
export const defaultVampireAchievements: Array<VampireAchievement> = [
|
||||||
// ── Total Blood Earned milestones ─────────────────────────────────────────
|
// ── 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.",
|
description: "Spill the first thousand drops. Every hunt starts here.",
|
||||||
icon: "🩸",
|
icon: "🩸",
|
||||||
id: "blood_thousand",
|
id: "blood_thousand",
|
||||||
@@ -61,7 +61,7 @@ export const defaultVampireAchievements: Array<VampireAchievement> = [
|
|||||||
icon: "⚫",
|
icon: "⚫",
|
||||||
id: "blood_hundred_million",
|
id: "blood_hundred_million",
|
||||||
name: "The Dark Eternal",
|
name: "The Dark Eternal",
|
||||||
reward: { ichor: 2_000, soulShards: 10 },
|
reward: { ichor: 2000, soulShards: 10 },
|
||||||
unlockedAt: null,
|
unlockedAt: null,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -70,7 +70,7 @@ export const defaultVampireAchievements: Array<VampireAchievement> = [
|
|||||||
icon: "🕳️",
|
icon: "🕳️",
|
||||||
id: "blood_billion",
|
id: "blood_billion",
|
||||||
name: "Ancient Hunger",
|
name: "Ancient Hunger",
|
||||||
reward: { ichor: 5_000, soulShards: 25 },
|
reward: { ichor: 5000, soulShards: 25 },
|
||||||
unlockedAt: null,
|
unlockedAt: null,
|
||||||
},
|
},
|
||||||
// ── Vampire Bosses Defeated ───────────────────────────────────────────────
|
// ── Vampire Bosses Defeated ───────────────────────────────────────────────
|
||||||
@@ -116,7 +116,7 @@ export const defaultVampireAchievements: Array<VampireAchievement> = [
|
|||||||
icon: "🌑",
|
icon: "🌑",
|
||||||
id: "boss_all",
|
id: "boss_all",
|
||||||
name: "The Darkness Made Flesh",
|
name: "The Darkness Made Flesh",
|
||||||
reward: { ichor: 1_000, soulShards: 10 },
|
reward: { ichor: 1000, soulShards: 10 },
|
||||||
unlockedAt: null,
|
unlockedAt: null,
|
||||||
},
|
},
|
||||||
// ── Vampire Quests Completed ──────────────────────────────────────────────
|
// ── Vampire Quests Completed ──────────────────────────────────────────────
|
||||||
@@ -203,12 +203,12 @@ export const defaultVampireAchievements: Array<VampireAchievement> = [
|
|||||||
unlockedAt: null,
|
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.",
|
description: "One thousand bound souls. The vampire realm bows to your dominion.",
|
||||||
icon: "👑",
|
icon: "👑",
|
||||||
id: "thralls_thousand",
|
id: "thralls_thousand",
|
||||||
name: "Sovereign of Thralls",
|
name: "Sovereign of Thralls",
|
||||||
reward: { ichor: 2_000, soulShards: 15 },
|
reward: { ichor: 2000, soulShards: 15 },
|
||||||
unlockedAt: null,
|
unlockedAt: null,
|
||||||
},
|
},
|
||||||
// ── Siring Count ──────────────────────────────────────────────────────────
|
// ── Siring Count ──────────────────────────────────────────────────────────
|
||||||
@@ -245,7 +245,7 @@ export const defaultVampireAchievements: Array<VampireAchievement> = [
|
|||||||
icon: "⚫",
|
icon: "⚫",
|
||||||
id: "siring_fifteen",
|
id: "siring_fifteen",
|
||||||
name: "Eternal Bloodline",
|
name: "Eternal Bloodline",
|
||||||
reward: { ichor: 1_500, soulShards: 15 },
|
reward: { ichor: 1500, soulShards: 15 },
|
||||||
unlockedAt: null,
|
unlockedAt: null,
|
||||||
},
|
},
|
||||||
// ── Vampire Equipment Owned ───────────────────────────────────────────────
|
// ── Vampire Equipment Owned ───────────────────────────────────────────────
|
||||||
@@ -291,7 +291,7 @@ export const defaultVampireAchievements: Array<VampireAchievement> = [
|
|||||||
icon: "🌑",
|
icon: "🌑",
|
||||||
id: "equipment_all",
|
id: "equipment_all",
|
||||||
name: "The Complete Darkness",
|
name: "The Complete Darkness",
|
||||||
reward: { ichor: 2_000, soulShards: 20 },
|
reward: { ichor: 2000, soulShards: 20 },
|
||||||
unlockedAt: null,
|
unlockedAt: null,
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -127,7 +127,7 @@ export const defaultVampireAwakeningUpgrades: Array<AwakeningUpgrade> = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
category: "soulshards_meta",
|
category: "soulshards_meta",
|
||||||
cost: 1_000,
|
cost: 1000,
|
||||||
description: "The apex of soul refinement — all future awakenings yield three times the soul shards.",
|
description: "The apex of soul refinement — all future awakenings yield three times the soul shards.",
|
||||||
id: "awakening_meta_3",
|
id: "awakening_meta_3",
|
||||||
multiplier: 3,
|
multiplier: 3,
|
||||||
|
|||||||
@@ -47,16 +47,16 @@ export const defaultVampireBosses: Array<VampireBoss> = [
|
|||||||
zoneId: "vampire_haunted_catacombs",
|
zoneId: "vampire_haunted_catacombs",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
bloodReward: 1_250,
|
bloodReward: 1250,
|
||||||
bountyIchor: 5,
|
bountyIchor: 5,
|
||||||
bountyIchorClaimed: false,
|
bountyIchorClaimed: false,
|
||||||
currentHp: 2_500,
|
currentHp: 2500,
|
||||||
damagePerSecond: 15,
|
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.",
|
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" ],
|
equipmentRewards: [ "tattered_shroud" ],
|
||||||
ichorReward: 0,
|
ichorReward: 0,
|
||||||
id: "crypt_shade",
|
id: "crypt_shade",
|
||||||
maxHp: 2_500,
|
maxHp: 2500,
|
||||||
name: "Crypt Shade",
|
name: "Crypt Shade",
|
||||||
siringRequirement: 0,
|
siringRequirement: 0,
|
||||||
soulShardsReward: 0,
|
soulShardsReward: 0,
|
||||||
@@ -65,7 +65,7 @@ export const defaultVampireBosses: Array<VampireBoss> = [
|
|||||||
zoneId: "vampire_haunted_catacombs",
|
zoneId: "vampire_haunted_catacombs",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
bloodReward: 6_250,
|
bloodReward: 6250,
|
||||||
bountyIchor: 10,
|
bountyIchor: 10,
|
||||||
bountyIchorClaimed: false,
|
bountyIchorClaimed: false,
|
||||||
currentHp: 12_500,
|
currentHp: 12_500,
|
||||||
@@ -142,7 +142,7 @@ export const defaultVampireBosses: Array<VampireBoss> = [
|
|||||||
bountyIchor: 200,
|
bountyIchor: 200,
|
||||||
bountyIchorClaimed: false,
|
bountyIchorClaimed: false,
|
||||||
currentHp: 5_000_000,
|
currentHp: 5_000_000,
|
||||||
damagePerSecond: 2_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.",
|
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" ],
|
equipmentRewards: [ "blood_talisman" ],
|
||||||
ichorReward: 5,
|
ichorReward: 5,
|
||||||
@@ -161,7 +161,7 @@ export const defaultVampireBosses: Array<VampireBoss> = [
|
|||||||
bountyIchor: 500,
|
bountyIchor: 500,
|
||||||
bountyIchorClaimed: false,
|
bountyIchorClaimed: false,
|
||||||
currentHp: 25_000_000,
|
currentHp: 25_000_000,
|
||||||
damagePerSecond: 5_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.",
|
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" ],
|
equipmentRewards: [ "war_fang" ],
|
||||||
ichorReward: 10,
|
ichorReward: 10,
|
||||||
@@ -176,7 +176,7 @@ export const defaultVampireBosses: Array<VampireBoss> = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
bloodReward: 50_000_000,
|
bloodReward: 50_000_000,
|
||||||
bountyIchor: 1_000,
|
bountyIchor: 1000,
|
||||||
bountyIchorClaimed: false,
|
bountyIchorClaimed: false,
|
||||||
currentHp: 100_000_000,
|
currentHp: 100_000_000,
|
||||||
damagePerSecond: 15_000,
|
damagePerSecond: 15_000,
|
||||||
@@ -194,7 +194,7 @@ export const defaultVampireBosses: Array<VampireBoss> = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
bloodReward: 200_000_000,
|
bloodReward: 200_000_000,
|
||||||
bountyIchor: 2_000,
|
bountyIchor: 2000,
|
||||||
bountyIchorClaimed: false,
|
bountyIchorClaimed: false,
|
||||||
currentHp: 400_000_000,
|
currentHp: 400_000_000,
|
||||||
damagePerSecond: 40_000,
|
damagePerSecond: 40_000,
|
||||||
@@ -212,7 +212,7 @@ export const defaultVampireBosses: Array<VampireBoss> = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
bloodReward: 750_000_000,
|
bloodReward: 750_000_000,
|
||||||
bountyIchor: 5_000,
|
bountyIchor: 5000,
|
||||||
bountyIchorClaimed: false,
|
bountyIchorClaimed: false,
|
||||||
currentHp: 1_500_000_000,
|
currentHp: 1_500_000_000,
|
||||||
damagePerSecond: 100_000,
|
damagePerSecond: 100_000,
|
||||||
@@ -383,7 +383,7 @@ export const defaultVampireBosses: Array<VampireBoss> = [
|
|||||||
damagePerSecond: 750_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.",
|
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" ],
|
equipmentRewards: [ "plague_shroud" ],
|
||||||
ichorReward: 1_000,
|
ichorReward: 1000,
|
||||||
id: "plague_rat",
|
id: "plague_rat",
|
||||||
maxHp: 750_000_000_000_000,
|
maxHp: 750_000_000_000_000,
|
||||||
name: "Plague Rat",
|
name: "Plague Rat",
|
||||||
@@ -401,7 +401,7 @@ export const defaultVampireBosses: Array<VampireBoss> = [
|
|||||||
damagePerSecond: 2_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.",
|
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" ],
|
equipmentRewards: [ "plague_talisman" ],
|
||||||
ichorReward: 1_500,
|
ichorReward: 1500,
|
||||||
id: "bone_collector",
|
id: "bone_collector",
|
||||||
maxHp: 3_000_000_000_000_000,
|
maxHp: 3_000_000_000_000_000,
|
||||||
name: "Bone Collector",
|
name: "Bone Collector",
|
||||||
@@ -419,7 +419,7 @@ export const defaultVampireBosses: Array<VampireBoss> = [
|
|||||||
damagePerSecond: 6_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.",
|
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: [],
|
equipmentRewards: [],
|
||||||
ichorReward: 2_000,
|
ichorReward: 2000,
|
||||||
id: "pestilence_wraith",
|
id: "pestilence_wraith",
|
||||||
maxHp: 12_000_000_000_000_000,
|
maxHp: 12_000_000_000_000_000,
|
||||||
name: "Pestilence Wraith",
|
name: "Pestilence Wraith",
|
||||||
@@ -437,7 +437,7 @@ export const defaultVampireBosses: Array<VampireBoss> = [
|
|||||||
damagePerSecond: 18_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.",
|
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" ],
|
equipmentRewards: [ "plague_fang" ],
|
||||||
ichorReward: 3_000,
|
ichorReward: 3000,
|
||||||
id: "ossuary_overlord",
|
id: "ossuary_overlord",
|
||||||
maxHp: 50_000_000_000_000_000,
|
maxHp: 50_000_000_000_000_000,
|
||||||
name: "Ossuary Overlord",
|
name: "Ossuary Overlord",
|
||||||
@@ -456,7 +456,7 @@ export const defaultVampireBosses: Array<VampireBoss> = [
|
|||||||
damagePerSecond: 50_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.",
|
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" ],
|
equipmentRewards: [ "ashen_shroud" ],
|
||||||
ichorReward: 4_000,
|
ichorReward: 4000,
|
||||||
id: "ash_revenant",
|
id: "ash_revenant",
|
||||||
maxHp: 250_000_000_000_000_000,
|
maxHp: 250_000_000_000_000_000,
|
||||||
name: "Ash Revenant",
|
name: "Ash Revenant",
|
||||||
@@ -474,7 +474,7 @@ export const defaultVampireBosses: Array<VampireBoss> = [
|
|||||||
damagePerSecond: 150_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.",
|
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" ],
|
equipmentRewards: [ "ashen_talisman" ],
|
||||||
ichorReward: 5_000,
|
ichorReward: 5000,
|
||||||
id: "cinder_shade",
|
id: "cinder_shade",
|
||||||
maxHp: 1_000_000_000_000_000_000,
|
maxHp: 1_000_000_000_000_000_000,
|
||||||
name: "Cinder Shade",
|
name: "Cinder Shade",
|
||||||
@@ -492,7 +492,7 @@ export const defaultVampireBosses: Array<VampireBoss> = [
|
|||||||
damagePerSecond: 500_000_000_000,
|
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.",
|
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: [],
|
equipmentRewards: [],
|
||||||
ichorReward: 7_000,
|
ichorReward: 7000,
|
||||||
id: "ashen_knight",
|
id: "ashen_knight",
|
||||||
maxHp: 4e18,
|
maxHp: 4e18,
|
||||||
name: "Ashen Knight",
|
name: "Ashen Knight",
|
||||||
|
|||||||
@@ -8,8 +8,10 @@
|
|||||||
/* eslint-disable stylistic/max-len -- Data content */
|
/* eslint-disable stylistic/max-len -- Data content */
|
||||||
import type { CraftingRecipe } from "@elysium/types";
|
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<CraftingRecipe> = [
|
export const defaultVampireCraftingRecipes: Array<CraftingRecipe> = [
|
||||||
// ── Haunted Catacombs ─────────────────────────────────────────────────────
|
// ── Haunted Catacombs ─────────────────────────────────────────────────────
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ export const defaultVampireEquipment: Array<VampireEquipment> = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
bonus: { bloodMultiplier: 1.08, combatMultiplier: 1.05 },
|
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.",
|
description: "Ground from a warlord's tooth, this fang has seen three centuries of campaigns. Its edge is still perfect.",
|
||||||
equipped: false,
|
equipped: false,
|
||||||
id: "war_fang",
|
id: "war_fang",
|
||||||
@@ -48,7 +48,7 @@ export const defaultVampireEquipment: Array<VampireEquipment> = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
bonus: { bloodMultiplier: 1.12 },
|
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.",
|
description: "Carved from volcanic obsidian, this fang channels the Keep's stored blood magic into every hunt.",
|
||||||
equipped: false,
|
equipped: false,
|
||||||
id: "obsidian_fang",
|
id: "obsidian_fang",
|
||||||
@@ -244,7 +244,7 @@ export const defaultVampireEquipment: Array<VampireEquipment> = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
bonus: { combatMultiplier: 1.1 },
|
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.",
|
description: "Cut from volcanic obsidian-fibre and stitched with iron thread. It does not stop blows — it returns them.",
|
||||||
equipped: false,
|
equipped: false,
|
||||||
id: "obsidian_shroud",
|
id: "obsidian_shroud",
|
||||||
@@ -255,8 +255,8 @@ export const defaultVampireEquipment: Array<VampireEquipment> = [
|
|||||||
type: "shroud",
|
type: "shroud",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
bonus: { combatMultiplier: 1.12, bloodMultiplier: 1.05 },
|
bonus: { bloodMultiplier: 1.05, combatMultiplier: 1.12 },
|
||||||
cost: { blood: 4_000, ichor: 0, soulShards: 0 },
|
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.",
|
description: "Woven from threads dyed in the Citadel's blood-tanneries. The crimson never fades. Neither does the authority it implies.",
|
||||||
equipped: false,
|
equipped: false,
|
||||||
id: "crimson_shroud",
|
id: "crimson_shroud",
|
||||||
@@ -267,7 +267,7 @@ export const defaultVampireEquipment: Array<VampireEquipment> = [
|
|||||||
type: "shroud",
|
type: "shroud",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
bonus: { combatMultiplier: 1.12, bloodMultiplier: 1.08 },
|
bonus: { bloodMultiplier: 1.08, combatMultiplier: 1.12 },
|
||||||
cost: { blood: 12_000, ichor: 2, soulShards: 0 },
|
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.",
|
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,
|
equipped: false,
|
||||||
@@ -279,7 +279,7 @@ export const defaultVampireEquipment: Array<VampireEquipment> = [
|
|||||||
type: "shroud",
|
type: "shroud",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
bonus: { combatMultiplier: 1.15, bloodMultiplier: 1.08 },
|
bonus: { bloodMultiplier: 1.08, combatMultiplier: 1.15 },
|
||||||
cost: { blood: 35_000, ichor: 5, soulShards: 0 },
|
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.",
|
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,
|
equipped: false,
|
||||||
@@ -292,7 +292,7 @@ export const defaultVampireEquipment: Array<VampireEquipment> = [
|
|||||||
},
|
},
|
||||||
// ── Shrouds — Rare ────────────────────────────────────────────────────────
|
// ── 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.",
|
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,
|
equipped: false,
|
||||||
id: "ashen_shroud",
|
id: "ashen_shroud",
|
||||||
@@ -303,7 +303,7 @@ export const defaultVampireEquipment: Array<VampireEquipment> = [
|
|||||||
type: "shroud",
|
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.",
|
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,
|
equipped: false,
|
||||||
id: "iron_shroud",
|
id: "iron_shroud",
|
||||||
@@ -314,7 +314,7 @@ export const defaultVampireEquipment: Array<VampireEquipment> = [
|
|||||||
type: "shroud",
|
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.",
|
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,
|
equipped: false,
|
||||||
id: "veil_shroud",
|
id: "veil_shroud",
|
||||||
@@ -325,7 +325,7 @@ export const defaultVampireEquipment: Array<VampireEquipment> = [
|
|||||||
type: "shroud",
|
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.",
|
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,
|
equipped: false,
|
||||||
id: "moor_shroud",
|
id: "moor_shroud",
|
||||||
@@ -336,7 +336,7 @@ export const defaultVampireEquipment: Array<VampireEquipment> = [
|
|||||||
type: "shroud",
|
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.",
|
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,
|
equipped: false,
|
||||||
id: "sunken_shroud",
|
id: "sunken_shroud",
|
||||||
@@ -347,7 +347,7 @@ export const defaultVampireEquipment: Array<VampireEquipment> = [
|
|||||||
type: "shroud",
|
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.",
|
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,
|
equipped: false,
|
||||||
id: "sanctum_shroud",
|
id: "sanctum_shroud",
|
||||||
@@ -359,7 +359,7 @@ export const defaultVampireEquipment: Array<VampireEquipment> = [
|
|||||||
},
|
},
|
||||||
// ── Shrouds — Epic ────────────────────────────────────────────────────────
|
// ── 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.",
|
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,
|
equipped: false,
|
||||||
id: "carrion_shroud",
|
id: "carrion_shroud",
|
||||||
@@ -370,7 +370,7 @@ export const defaultVampireEquipment: Array<VampireEquipment> = [
|
|||||||
type: "shroud",
|
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.",
|
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,
|
equipped: false,
|
||||||
id: "spire_shroud",
|
id: "spire_shroud",
|
||||||
@@ -381,7 +381,7 @@ export const defaultVampireEquipment: Array<VampireEquipment> = [
|
|||||||
type: "shroud",
|
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.",
|
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,
|
equipped: false,
|
||||||
id: "eternity_shroud",
|
id: "eternity_shroud",
|
||||||
@@ -392,7 +392,7 @@ export const defaultVampireEquipment: Array<VampireEquipment> = [
|
|||||||
type: "shroud",
|
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.",
|
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,
|
equipped: false,
|
||||||
id: "abyss_shroud",
|
id: "abyss_shroud",
|
||||||
@@ -404,7 +404,7 @@ export const defaultVampireEquipment: Array<VampireEquipment> = [
|
|||||||
},
|
},
|
||||||
// ── Shrouds — Legendary ───────────────────────────────────────────────────
|
// ── 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.",
|
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,
|
equipped: false,
|
||||||
id: "whisper_shroud",
|
id: "whisper_shroud",
|
||||||
@@ -415,7 +415,7 @@ export const defaultVampireEquipment: Array<VampireEquipment> = [
|
|||||||
type: "shroud",
|
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.",
|
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,
|
equipped: false,
|
||||||
id: "eternal_shroud",
|
id: "eternal_shroud",
|
||||||
@@ -427,7 +427,7 @@ export const defaultVampireEquipment: Array<VampireEquipment> = [
|
|||||||
},
|
},
|
||||||
// ── Talismans — Common ────────────────────────────────────────────────────
|
// ── Talismans — Common ────────────────────────────────────────────────────
|
||||||
{
|
{
|
||||||
bonus: { combatMultiplier: 1.06, bloodMultiplier: 1.06 },
|
bonus: { bloodMultiplier: 1.06, combatMultiplier: 1.06 },
|
||||||
cost: { blood: 200, ichor: 0, soulShards: 0 },
|
cost: { blood: 200, ichor: 0, soulShards: 0 },
|
||||||
description: "A talisman carved from catacomb bone. Every vampire starts somewhere. Most of them start here.",
|
description: "A talisman carved from catacomb bone. Every vampire starts somewhere. Most of them start here.",
|
||||||
equipped: false,
|
equipped: false,
|
||||||
@@ -452,7 +452,7 @@ export const defaultVampireEquipment: Array<VampireEquipment> = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
bonus: { bloodMultiplier: 1.1, combatMultiplier: 1.05 },
|
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.",
|
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,
|
equipped: false,
|
||||||
id: "obsidian_talisman",
|
id: "obsidian_talisman",
|
||||||
@@ -464,7 +464,7 @@ export const defaultVampireEquipment: Array<VampireEquipment> = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
bonus: { bloodMultiplier: 1.12, combatMultiplier: 1.06 },
|
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.",
|
description: "A talisman carrying the Citadel's seal — the weight of centuries of dynasty compressed into a small, heavy object.",
|
||||||
equipped: false,
|
equipped: false,
|
||||||
id: "crimson_talisman",
|
id: "crimson_talisman",
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ export const defaultVampireEquipmentSets: Array<VampireEquipmentSet> = [
|
|||||||
bonuses: {
|
bonuses: {
|
||||||
// eslint-disable-next-line @typescript-eslint/naming-convention -- numeric keys
|
// eslint-disable-next-line @typescript-eslint/naming-convention -- numeric keys
|
||||||
2: { combatMultiplier: 1.35 },
|
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 },
|
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.",
|
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.",
|
||||||
|
|||||||
@@ -766,7 +766,7 @@ export const defaultVampireExplorationAreas: Array<VampireExplorationArea> = [
|
|||||||
durationSeconds: 540,
|
durationSeconds: 540,
|
||||||
events: [
|
events: [
|
||||||
{
|
{
|
||||||
effect: { amount: 10000, type: "blood_gain" },
|
effect: { amount: 10_000, type: "blood_gain" },
|
||||||
id: "execution_ground_stones",
|
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.",
|
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.",
|
||||||
},
|
},
|
||||||
@@ -863,7 +863,7 @@ export const defaultVampireExplorationAreas: Array<VampireExplorationArea> = [
|
|||||||
durationSeconds: 600,
|
durationSeconds: 600,
|
||||||
events: [
|
events: [
|
||||||
{
|
{
|
||||||
effect: { amount: 12000, type: "blood_gain" },
|
effect: { amount: 12_000, type: "blood_gain" },
|
||||||
id: "veils_heart_confluence",
|
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.",
|
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.",
|
||||||
},
|
},
|
||||||
@@ -960,7 +960,7 @@ export const defaultVampireExplorationAreas: Array<VampireExplorationArea> = [
|
|||||||
durationSeconds: 660,
|
durationSeconds: 660,
|
||||||
events: [
|
events: [
|
||||||
{
|
{
|
||||||
effect: { amount: 14000, type: "blood_gain" },
|
effect: { amount: 14_000, type: "blood_gain" },
|
||||||
id: "moonless_centre_reservoir",
|
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.",
|
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.",
|
||||||
},
|
},
|
||||||
@@ -1057,7 +1057,7 @@ export const defaultVampireExplorationAreas: Array<VampireExplorationArea> = [
|
|||||||
durationSeconds: 720,
|
durationSeconds: 720,
|
||||||
events: [
|
events: [
|
||||||
{
|
{
|
||||||
effect: { amount: 18000, type: "blood_gain" },
|
effect: { amount: 18_000, type: "blood_gain" },
|
||||||
id: "deepmost_chamber_trove",
|
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.",
|
text: "The chamber holds the crypt's founding blood-price — the original offering that consecrated the site. Untouched for centuries. Unmistakably yours now.",
|
||||||
},
|
},
|
||||||
@@ -1130,7 +1130,7 @@ export const defaultVampireExplorationAreas: Array<VampireExplorationArea> = [
|
|||||||
durationSeconds: 585,
|
durationSeconds: 585,
|
||||||
events: [
|
events: [
|
||||||
{
|
{
|
||||||
effect: { amount: 12000, type: "blood_gain" },
|
effect: { amount: 12_000, type: "blood_gain" },
|
||||||
id: "incense_crypts_residue",
|
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.",
|
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.",
|
||||||
},
|
},
|
||||||
@@ -1154,7 +1154,7 @@ export const defaultVampireExplorationAreas: Array<VampireExplorationArea> = [
|
|||||||
durationSeconds: 780,
|
durationSeconds: 780,
|
||||||
events: [
|
events: [
|
||||||
{
|
{
|
||||||
effect: { amount: 24000, type: "blood_gain" },
|
effect: { amount: 24_000, type: "blood_gain" },
|
||||||
id: "altar_of_defilement_reserve",
|
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.",
|
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.",
|
||||||
},
|
},
|
||||||
@@ -1218,7 +1218,7 @@ export const defaultVampireExplorationAreas: Array<VampireExplorationArea> = [
|
|||||||
possibleMaterials: [
|
possibleMaterials: [
|
||||||
{ materialId: "peak_crystal", maxQuantity: 8, minQuantity: 4, weight: 5 },
|
{ materialId: "peak_crystal", maxQuantity: 8, minQuantity: 4, weight: 5 },
|
||||||
{ materialId: "carrion_bone", maxQuantity: 7, minQuantity: 3, weight: 4 },
|
{ materialId: "carrion_bone", maxQuantity: 7, minQuantity: 3, weight: 4 },
|
||||||
{ materialId: "blood_obsidian",maxQuantity: 4, minQuantity: 2, weight: 3 },
|
{ materialId: "blood_obsidian", maxQuantity: 4, minQuantity: 2, weight: 3 },
|
||||||
],
|
],
|
||||||
zoneId: "vampire_carrion_peaks",
|
zoneId: "vampire_carrion_peaks",
|
||||||
},
|
},
|
||||||
@@ -1227,7 +1227,7 @@ export const defaultVampireExplorationAreas: Array<VampireExplorationArea> = [
|
|||||||
durationSeconds: 630,
|
durationSeconds: 630,
|
||||||
events: [
|
events: [
|
||||||
{
|
{
|
||||||
effect: { amount: 15000, type: "blood_gain" },
|
effect: { amount: 15_000, type: "blood_gain" },
|
||||||
id: "bone_slopes_compression",
|
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.",
|
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.",
|
||||||
},
|
},
|
||||||
@@ -1241,7 +1241,7 @@ export const defaultVampireExplorationAreas: Array<VampireExplorationArea> = [
|
|||||||
name: "The Bone Slopes",
|
name: "The Bone Slopes",
|
||||||
possibleMaterials: [
|
possibleMaterials: [
|
||||||
{ materialId: "carrion_bone", maxQuantity: 10, minQuantity: 5, weight: 5 },
|
{ materialId: "carrion_bone", maxQuantity: 10, minQuantity: 5, weight: 5 },
|
||||||
{ materialId: "blood_obsidian",maxQuantity: 7, minQuantity: 3, weight: 4 },
|
{ materialId: "blood_obsidian", maxQuantity: 7, minQuantity: 3, weight: 4 },
|
||||||
{ materialId: "peak_crystal", maxQuantity: 6, minQuantity: 3, weight: 3 },
|
{ materialId: "peak_crystal", maxQuantity: 6, minQuantity: 3, weight: 3 },
|
||||||
],
|
],
|
||||||
zoneId: "vampire_carrion_peaks",
|
zoneId: "vampire_carrion_peaks",
|
||||||
@@ -1251,7 +1251,7 @@ export const defaultVampireExplorationAreas: Array<VampireExplorationArea> = [
|
|||||||
durationSeconds: 840,
|
durationSeconds: 840,
|
||||||
events: [
|
events: [
|
||||||
{
|
{
|
||||||
effect: { amount: 30000, type: "blood_gain" },
|
effect: { amount: 30_000, type: "blood_gain" },
|
||||||
id: "obsidian_summit_vein",
|
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.",
|
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,7 +1264,7 @@ export const defaultVampireExplorationAreas: Array<VampireExplorationArea> = [
|
|||||||
id: "obsidian_summit",
|
id: "obsidian_summit",
|
||||||
name: "The Obsidian Summit",
|
name: "The Obsidian Summit",
|
||||||
possibleMaterials: [
|
possibleMaterials: [
|
||||||
{ materialId: "blood_obsidian",maxQuantity: 11, minQuantity: 5, weight: 5 },
|
{ materialId: "blood_obsidian", maxQuantity: 11, minQuantity: 5, weight: 5 },
|
||||||
{ materialId: "peak_crystal", maxQuantity: 9, minQuantity: 4, weight: 4 },
|
{ materialId: "peak_crystal", maxQuantity: 9, minQuantity: 4, weight: 4 },
|
||||||
{ materialId: "carrion_bone", maxQuantity: 8, minQuantity: 4, weight: 3 },
|
{ materialId: "carrion_bone", maxQuantity: 8, minQuantity: 4, weight: 3 },
|
||||||
],
|
],
|
||||||
@@ -1324,7 +1324,7 @@ export const defaultVampireExplorationAreas: Array<VampireExplorationArea> = [
|
|||||||
durationSeconds: 675,
|
durationSeconds: 675,
|
||||||
events: [
|
events: [
|
||||||
{
|
{
|
||||||
effect: { amount: 20000, type: "blood_gain" },
|
effect: { amount: 20_000, type: "blood_gain" },
|
||||||
id: "gore_chambers_extraction",
|
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.",
|
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.",
|
||||||
},
|
},
|
||||||
@@ -1348,12 +1348,12 @@ export const defaultVampireExplorationAreas: Array<VampireExplorationArea> = [
|
|||||||
durationSeconds: 900,
|
durationSeconds: 900,
|
||||||
events: [
|
events: [
|
||||||
{
|
{
|
||||||
effect: { amount: 40000, type: "blood_gain" },
|
effect: { amount: 40_000, type: "blood_gain" },
|
||||||
id: "spire_apex_convergence",
|
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.",
|
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",
|
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.",
|
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.",
|
||||||
},
|
},
|
||||||
@@ -1411,7 +1411,7 @@ export const defaultVampireExplorationAreas: Array<VampireExplorationArea> = [
|
|||||||
name: "The Amber Groves",
|
name: "The Amber Groves",
|
||||||
possibleMaterials: [
|
possibleMaterials: [
|
||||||
{ materialId: "timeless_amber", maxQuantity: 9, minQuantity: 4, weight: 5 },
|
{ materialId: "timeless_amber", maxQuantity: 9, minQuantity: 4, weight: 5 },
|
||||||
{ materialId: "eternity_thread",maxQuantity: 7, minQuantity: 3, weight: 4 },
|
{ materialId: "eternity_thread", maxQuantity: 7, minQuantity: 3, weight: 4 },
|
||||||
{ materialId: "shroud_dust", maxQuantity: 6, minQuantity: 3, weight: 3 },
|
{ materialId: "shroud_dust", maxQuantity: 6, minQuantity: 3, weight: 3 },
|
||||||
],
|
],
|
||||||
zoneId: "vampire_shroud_of_eternity",
|
zoneId: "vampire_shroud_of_eternity",
|
||||||
@@ -1421,7 +1421,7 @@ export const defaultVampireExplorationAreas: Array<VampireExplorationArea> = [
|
|||||||
durationSeconds: 720,
|
durationSeconds: 720,
|
||||||
events: [
|
events: [
|
||||||
{
|
{
|
||||||
effect: { amount: 25000, type: "blood_gain" },
|
effect: { amount: 25_000, type: "blood_gain" },
|
||||||
id: "dust_wastes_harvest",
|
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.",
|
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.",
|
||||||
},
|
},
|
||||||
@@ -1436,7 +1436,7 @@ export const defaultVampireExplorationAreas: Array<VampireExplorationArea> = [
|
|||||||
possibleMaterials: [
|
possibleMaterials: [
|
||||||
{ materialId: "shroud_dust", maxQuantity: 12, minQuantity: 5, weight: 5 },
|
{ materialId: "shroud_dust", maxQuantity: 12, minQuantity: 5, weight: 5 },
|
||||||
{ materialId: "timeless_amber", maxQuantity: 9, minQuantity: 4, weight: 4 },
|
{ materialId: "timeless_amber", maxQuantity: 9, minQuantity: 4, weight: 4 },
|
||||||
{ materialId: "eternity_thread",maxQuantity: 8, minQuantity: 4, weight: 3 },
|
{ materialId: "eternity_thread", maxQuantity: 8, minQuantity: 4, weight: 3 },
|
||||||
],
|
],
|
||||||
zoneId: "vampire_shroud_of_eternity",
|
zoneId: "vampire_shroud_of_eternity",
|
||||||
},
|
},
|
||||||
@@ -1445,12 +1445,12 @@ export const defaultVampireExplorationAreas: Array<VampireExplorationArea> = [
|
|||||||
durationSeconds: 960,
|
durationSeconds: 960,
|
||||||
events: [
|
events: [
|
||||||
{
|
{
|
||||||
effect: { amount: 50000, type: "blood_gain" },
|
effect: { amount: 50_000, type: "blood_gain" },
|
||||||
id: "eternal_weave_confluence",
|
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.",
|
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",
|
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.",
|
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,7 +1458,7 @@ export const defaultVampireExplorationAreas: Array<VampireExplorationArea> = [
|
|||||||
id: "eternal_weave",
|
id: "eternal_weave",
|
||||||
name: "The Eternal Weave",
|
name: "The Eternal Weave",
|
||||||
possibleMaterials: [
|
possibleMaterials: [
|
||||||
{ materialId: "eternity_thread",maxQuantity: 13, minQuantity: 6, weight: 5 },
|
{ materialId: "eternity_thread", maxQuantity: 13, minQuantity: 6, weight: 5 },
|
||||||
{ materialId: "shroud_dust", maxQuantity: 11, minQuantity: 5, weight: 4 },
|
{ materialId: "shroud_dust", maxQuantity: 11, minQuantity: 5, weight: 4 },
|
||||||
{ materialId: "timeless_amber", maxQuantity: 10, minQuantity: 4, weight: 3 },
|
{ materialId: "timeless_amber", maxQuantity: 10, minQuantity: 4, weight: 3 },
|
||||||
],
|
],
|
||||||
@@ -1518,7 +1518,7 @@ export const defaultVampireExplorationAreas: Array<VampireExplorationArea> = [
|
|||||||
durationSeconds: 765,
|
durationSeconds: 765,
|
||||||
events: [
|
events: [
|
||||||
{
|
{
|
||||||
effect: { amount: 30000, type: "blood_gain" },
|
effect: { amount: 30_000, type: "blood_gain" },
|
||||||
id: "inner_sanctum_reserve",
|
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.",
|
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.",
|
||||||
},
|
},
|
||||||
@@ -1542,12 +1542,12 @@ export const defaultVampireExplorationAreas: Array<VampireExplorationArea> = [
|
|||||||
durationSeconds: 1020,
|
durationSeconds: 1020,
|
||||||
events: [
|
events: [
|
||||||
{
|
{
|
||||||
effect: { amount: 60000, type: "blood_gain" },
|
effect: { amount: 60_000, type: "blood_gain" },
|
||||||
id: "vault_nadir_convergence",
|
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.",
|
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",
|
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.",
|
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.",
|
||||||
},
|
},
|
||||||
@@ -1615,7 +1615,7 @@ export const defaultVampireExplorationAreas: Array<VampireExplorationArea> = [
|
|||||||
durationSeconds: 810,
|
durationSeconds: 810,
|
||||||
events: [
|
events: [
|
||||||
{
|
{
|
||||||
effect: { amount: 40000, type: "blood_gain" },
|
effect: { amount: 40_000, type: "blood_gain" },
|
||||||
id: "deliberation_hall_amplification",
|
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.",
|
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.",
|
||||||
},
|
},
|
||||||
@@ -1639,12 +1639,12 @@ export const defaultVampireExplorationAreas: Array<VampireExplorationArea> = [
|
|||||||
durationSeconds: 1080,
|
durationSeconds: 1080,
|
||||||
events: [
|
events: [
|
||||||
{
|
{
|
||||||
effect: { amount: 80000, type: "blood_gain" },
|
effect: { amount: 80_000, type: "blood_gain" },
|
||||||
id: "verdict_chamber_archive",
|
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.",
|
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",
|
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.",
|
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.",
|
||||||
},
|
},
|
||||||
@@ -1665,7 +1665,7 @@ export const defaultVampireExplorationAreas: Array<VampireExplorationArea> = [
|
|||||||
durationSeconds: 300,
|
durationSeconds: 300,
|
||||||
events: [
|
events: [
|
||||||
{
|
{
|
||||||
effect: { amount: 10000, type: "blood_gain" },
|
effect: { amount: 10_000, type: "blood_gain" },
|
||||||
id: "abyss_threshold_drift",
|
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.",
|
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.",
|
||||||
},
|
},
|
||||||
@@ -1712,7 +1712,7 @@ export const defaultVampireExplorationAreas: Array<VampireExplorationArea> = [
|
|||||||
durationSeconds: 900,
|
durationSeconds: 900,
|
||||||
events: [
|
events: [
|
||||||
{
|
{
|
||||||
effect: { amount: 50000, type: "blood_gain" },
|
effect: { amount: 50_000, type: "blood_gain" },
|
||||||
id: "deep_abyss_pool",
|
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.",
|
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.",
|
||||||
},
|
},
|
||||||
@@ -1736,12 +1736,12 @@ export const defaultVampireExplorationAreas: Array<VampireExplorationArea> = [
|
|||||||
durationSeconds: 1200,
|
durationSeconds: 1200,
|
||||||
events: [
|
events: [
|
||||||
{
|
{
|
||||||
effect: { amount: 100000, type: "blood_gain" },
|
effect: { amount: 100_000, type: "blood_gain" },
|
||||||
id: "abyss_floor_primordial",
|
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.",
|
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",
|
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.",
|
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.",
|
||||||
},
|
},
|
||||||
|
|||||||
+123
-123
@@ -41,25 +41,25 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_haunted_catacombs",
|
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,
|
combatPowerRequired: 0,
|
||||||
|
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,
|
durationSeconds: 600,
|
||||||
id: "the_reliquary_unsealed",
|
id: "the_reliquary_unsealed",
|
||||||
name: "The Reliquary Unsealed",
|
name: "The Reliquary Unsealed",
|
||||||
prerequisiteIds: [ "culling_the_fledglings" ],
|
prerequisiteIds: [ "culling_the_fledglings" ],
|
||||||
rewards: [ { amount: 1_000, type: "blood" } ],
|
rewards: [ { amount: 1000, type: "blood" } ],
|
||||||
status: "locked",
|
status: "locked",
|
||||||
zoneId: "vampire_haunted_catacombs",
|
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,
|
combatPowerRequired: 0,
|
||||||
durationSeconds: 1_200,
|
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",
|
id: "first_hunt",
|
||||||
name: "The First Hunt",
|
name: "The First Hunt",
|
||||||
prerequisiteIds: [ "the_reliquary_unsealed" ],
|
prerequisiteIds: [ "the_reliquary_unsealed" ],
|
||||||
rewards: [
|
rewards: [
|
||||||
{ amount: 2_500, type: "blood" },
|
{ amount: 2500, type: "blood" },
|
||||||
{ targetId: "ghoul", type: "thrall" },
|
{ targetId: "ghoul", type: "thrall" },
|
||||||
],
|
],
|
||||||
status: "locked",
|
status: "locked",
|
||||||
@@ -73,14 +73,14 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
id: "reading_the_mire",
|
id: "reading_the_mire",
|
||||||
name: "Reading the Mire",
|
name: "Reading the Mire",
|
||||||
prerequisiteIds: [],
|
prerequisiteIds: [],
|
||||||
rewards: [ { amount: 5_000, type: "blood" } ],
|
rewards: [ { amount: 5000, type: "blood" } ],
|
||||||
status: "locked",
|
status: "locked",
|
||||||
zoneId: "vampire_blood_mire",
|
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,
|
combatPowerRequired: 5,
|
||||||
durationSeconds: 1_200,
|
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",
|
id: "the_channel_clan",
|
||||||
name: "The Channel Clan",
|
name: "The Channel Clan",
|
||||||
prerequisiteIds: [ "reading_the_mire" ],
|
prerequisiteIds: [ "reading_the_mire" ],
|
||||||
@@ -89,9 +89,9 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_blood_mire",
|
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,
|
combatPowerRequired: 8,
|
||||||
durationSeconds: 2_400,
|
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",
|
id: "drowned_shrine",
|
||||||
name: "The Drowned Shrine",
|
name: "The Drowned Shrine",
|
||||||
prerequisiteIds: [ "the_channel_clan" ],
|
prerequisiteIds: [ "the_channel_clan" ],
|
||||||
@@ -100,9 +100,9 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_blood_mire",
|
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,
|
combatPowerRequired: 15,
|
||||||
durationSeconds: 3_600,
|
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",
|
id: "the_great_leech",
|
||||||
name: "The Great Leech",
|
name: "The Great Leech",
|
||||||
prerequisiteIds: [ "drowned_shrine" ],
|
prerequisiteIds: [ "drowned_shrine" ],
|
||||||
@@ -111,9 +111,9 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_blood_mire",
|
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,
|
combatPowerRequired: 20,
|
||||||
durationSeconds: 7_200,
|
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",
|
id: "mire_mastery",
|
||||||
name: "Mire Mastery",
|
name: "Mire Mastery",
|
||||||
prerequisiteIds: [ "the_great_leech" ],
|
prerequisiteIds: [ "the_great_leech" ],
|
||||||
@@ -128,9 +128,9 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
|
|
||||||
// ── Zone 3: Obsidian Keep ─────────────────────────────────────────────────
|
// ── 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,
|
combatPowerRequired: 25,
|
||||||
durationSeconds: 1_800,
|
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",
|
id: "mapping_the_keep",
|
||||||
name: "Mapping the Keep",
|
name: "Mapping the Keep",
|
||||||
prerequisiteIds: [],
|
prerequisiteIds: [],
|
||||||
@@ -139,9 +139,9 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_obsidian_keep",
|
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,
|
combatPowerRequired: 35,
|
||||||
durationSeconds: 3_600,
|
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",
|
id: "the_garrison_of_spite",
|
||||||
name: "Garrison of Spite",
|
name: "Garrison of Spite",
|
||||||
prerequisiteIds: [ "mapping_the_keep" ],
|
prerequisiteIds: [ "mapping_the_keep" ],
|
||||||
@@ -150,9 +150,9 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_obsidian_keep",
|
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,
|
combatPowerRequired: 50,
|
||||||
durationSeconds: 7_200,
|
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",
|
id: "the_ichor_vault",
|
||||||
name: "The Ichor Vault",
|
name: "The Ichor Vault",
|
||||||
prerequisiteIds: [ "the_garrison_of_spite" ],
|
prerequisiteIds: [ "the_garrison_of_spite" ],
|
||||||
@@ -161,8 +161,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_obsidian_keep",
|
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,
|
combatPowerRequired: 70,
|
||||||
|
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,
|
durationSeconds: 14_400,
|
||||||
id: "shadow_passage_rites",
|
id: "shadow_passage_rites",
|
||||||
name: "Shadow-Passage Rites",
|
name: "Shadow-Passage Rites",
|
||||||
@@ -172,8 +172,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_obsidian_keep",
|
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,
|
combatPowerRequired: 100,
|
||||||
|
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,
|
durationSeconds: 28_800,
|
||||||
id: "obsidian_trials",
|
id: "obsidian_trials",
|
||||||
name: "The Obsidian Trials",
|
name: "The Obsidian Trials",
|
||||||
@@ -189,9 +189,9 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
|
|
||||||
// ── Zone 4: Crimson Citadel ───────────────────────────────────────────────
|
// ── 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,
|
combatPowerRequired: 120,
|
||||||
durationSeconds: 7_200,
|
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",
|
id: "the_supply_line",
|
||||||
name: "The Supply Line",
|
name: "The Supply Line",
|
||||||
prerequisiteIds: [],
|
prerequisiteIds: [],
|
||||||
@@ -200,8 +200,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_crimson_citadel",
|
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,
|
combatPowerRequired: 160,
|
||||||
|
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,
|
durationSeconds: 14_400,
|
||||||
id: "the_three_insults",
|
id: "the_three_insults",
|
||||||
name: "The Three Insults",
|
name: "The Three Insults",
|
||||||
@@ -211,8 +211,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_crimson_citadel",
|
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,
|
combatPowerRequired: 220,
|
||||||
|
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,
|
durationSeconds: 28_800,
|
||||||
id: "mending_the_great_chain",
|
id: "mending_the_great_chain",
|
||||||
name: "Mending the Great Chain",
|
name: "Mending the Great Chain",
|
||||||
@@ -222,8 +222,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_crimson_citadel",
|
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,
|
combatPowerRequired: 300,
|
||||||
|
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,
|
durationSeconds: 43_200,
|
||||||
id: "the_southern_reminder",
|
id: "the_southern_reminder",
|
||||||
name: "The Southern Reminder",
|
name: "The Southern Reminder",
|
||||||
@@ -233,8 +233,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_crimson_citadel",
|
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,
|
combatPowerRequired: 400,
|
||||||
|
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,
|
durationSeconds: 86_400,
|
||||||
id: "citadel_conquest",
|
id: "citadel_conquest",
|
||||||
name: "Citadel Conquest",
|
name: "Citadel Conquest",
|
||||||
@@ -250,8 +250,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
|
|
||||||
// ── Zone 5: Shadow Court ──────────────────────────────────────────────────
|
// ── 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,
|
combatPowerRequired: 450,
|
||||||
|
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,
|
durationSeconds: 14_400,
|
||||||
id: "the_forged_invitation",
|
id: "the_forged_invitation",
|
||||||
name: "The Forged Invitation",
|
name: "The Forged Invitation",
|
||||||
@@ -261,8 +261,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_shadow_court",
|
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,
|
combatPowerRequired: 550,
|
||||||
|
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,
|
durationSeconds: 28_800,
|
||||||
id: "gathering_the_secrets",
|
id: "gathering_the_secrets",
|
||||||
name: "Gathering the Secrets",
|
name: "Gathering the Secrets",
|
||||||
@@ -272,8 +272,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_shadow_court",
|
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,
|
combatPowerRequired: 700,
|
||||||
|
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,
|
durationSeconds: 57_600,
|
||||||
id: "building_the_alibi",
|
id: "building_the_alibi",
|
||||||
name: "Building the Alibi",
|
name: "Building the Alibi",
|
||||||
@@ -283,8 +283,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_shadow_court",
|
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,
|
combatPowerRequired: 900,
|
||||||
|
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,
|
durationSeconds: 86_400,
|
||||||
id: "the_master_of_whispers",
|
id: "the_master_of_whispers",
|
||||||
name: "The Master of Whispers",
|
name: "The Master of Whispers",
|
||||||
@@ -294,8 +294,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_shadow_court",
|
zoneId: "vampire_shadow_court",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
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.",
|
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,
|
durationSeconds: 172_800,
|
||||||
id: "court_intrigue",
|
id: "court_intrigue",
|
||||||
name: "Court Intrigue",
|
name: "Court Intrigue",
|
||||||
@@ -311,8 +311,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
|
|
||||||
// ── Zone 6: Plague Ossuary ────────────────────────────────────────────────
|
// ── Zone 6: 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.",
|
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,
|
durationSeconds: 28_800,
|
||||||
id: "cataloguing_the_dead",
|
id: "cataloguing_the_dead",
|
||||||
name: "Cataloguing the Dead",
|
name: "Cataloguing the Dead",
|
||||||
@@ -322,8 +322,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_plague_ossuary",
|
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.",
|
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,
|
durationSeconds: 57_600,
|
||||||
id: "quieting_the_restless",
|
id: "quieting_the_restless",
|
||||||
name: "Quieting the Restless",
|
name: "Quieting the Restless",
|
||||||
@@ -333,8 +333,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_plague_ossuary",
|
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.",
|
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,
|
durationSeconds: 86_400,
|
||||||
id: "the_distillation_rites",
|
id: "the_distillation_rites",
|
||||||
name: "The Distillation Rites",
|
name: "The Distillation Rites",
|
||||||
@@ -344,8 +344,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_plague_ossuary",
|
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.",
|
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,
|
durationSeconds: 172_800,
|
||||||
id: "the_bone_altar",
|
id: "the_bone_altar",
|
||||||
name: "The Bone Altar",
|
name: "The Bone Altar",
|
||||||
@@ -355,15 +355,15 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_plague_ossuary",
|
zoneId: "vampire_plague_ossuary",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
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.",
|
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,
|
durationSeconds: 259_200,
|
||||||
id: "plague_tithe",
|
id: "plague_tithe",
|
||||||
name: "The Plague Tithe",
|
name: "The Plague Tithe",
|
||||||
prerequisiteIds: [ "the_bone_altar" ],
|
prerequisiteIds: [ "the_bone_altar" ],
|
||||||
rewards: [
|
rewards: [
|
||||||
{ amount: 20_000_000_000_000, type: "blood" },
|
{ amount: 20_000_000_000_000, type: "blood" },
|
||||||
{ amount: 1_000, type: "ichor" },
|
{ amount: 1000, type: "ichor" },
|
||||||
{ targetId: "revenant", type: "thrall" },
|
{ targetId: "revenant", type: "thrall" },
|
||||||
],
|
],
|
||||||
status: "locked",
|
status: "locked",
|
||||||
@@ -372,8 +372,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
|
|
||||||
// ── Zone 7: Ashen Wastes ──────────────────────────────────────────────────
|
// ── Zone 7: 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.",
|
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,
|
durationSeconds: 57_600,
|
||||||
id: "surveying_the_ash",
|
id: "surveying_the_ash",
|
||||||
name: "Surveying the Ash",
|
name: "Surveying the Ash",
|
||||||
@@ -383,8 +383,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_ashen_wastes",
|
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.",
|
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,
|
durationSeconds: 115_200,
|
||||||
id: "the_ash_walker_packs",
|
id: "the_ash_walker_packs",
|
||||||
name: "The Ash-Walker Packs",
|
name: "The Ash-Walker Packs",
|
||||||
@@ -394,37 +394,37 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_ashen_wastes",
|
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.",
|
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,
|
durationSeconds: 172_800,
|
||||||
id: "the_buried_vault",
|
id: "the_buried_vault",
|
||||||
name: "The Buried Vault",
|
name: "The Buried Vault",
|
||||||
prerequisiteIds: [ "the_ash_walker_packs" ],
|
prerequisiteIds: [ "the_ash_walker_packs" ],
|
||||||
rewards: [ { amount: 300_000_000_000_000, type: "blood" }, { amount: 1_200, type: "ichor" } ],
|
rewards: [ { amount: 300_000_000_000_000, type: "blood" }, { amount: 1200, type: "ichor" } ],
|
||||||
status: "locked",
|
status: "locked",
|
||||||
zoneId: "vampire_ashen_wastes",
|
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.",
|
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,
|
durationSeconds: 259_200,
|
||||||
id: "ash_refinement",
|
id: "ash_refinement",
|
||||||
name: "Ash Refinement",
|
name: "Ash Refinement",
|
||||||
prerequisiteIds: [ "the_buried_vault" ],
|
prerequisiteIds: [ "the_buried_vault" ],
|
||||||
rewards: [ { amount: 700_000_000_000_000, type: "blood" }, { amount: 2_000, type: "ichor" } ],
|
rewards: [ { amount: 700_000_000_000_000, type: "blood" }, { amount: 2000, type: "ichor" } ],
|
||||||
status: "locked",
|
status: "locked",
|
||||||
zoneId: "vampire_ashen_wastes",
|
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,
|
combatPowerRequired: 10_000,
|
||||||
|
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,
|
durationSeconds: 345_600,
|
||||||
id: "wastes_scourge",
|
id: "wastes_scourge",
|
||||||
name: "Wastes Scourge",
|
name: "Wastes Scourge",
|
||||||
prerequisiteIds: [ "ash_refinement" ],
|
prerequisiteIds: [ "ash_refinement" ],
|
||||||
rewards: [
|
rewards: [
|
||||||
{ amount: 2_000_000_000_000_000, type: "blood" },
|
{ amount: 2_000_000_000_000_000, type: "blood" },
|
||||||
{ amount: 3_000, type: "ichor" },
|
{ amount: 3000, type: "ichor" },
|
||||||
{ targetId: "bloodreaver", type: "thrall" },
|
{ targetId: "bloodreaver", type: "thrall" },
|
||||||
],
|
],
|
||||||
status: "locked",
|
status: "locked",
|
||||||
@@ -433,52 +433,52 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
|
|
||||||
// ── Zone 8: Iron Gaol ─────────────────────────────────────────────────────
|
// ── 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,
|
combatPowerRequired: 12_000,
|
||||||
|
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,
|
durationSeconds: 86_400,
|
||||||
id: "testing_the_wards",
|
id: "testing_the_wards",
|
||||||
name: "Testing the Wards",
|
name: "Testing the Wards",
|
||||||
prerequisiteIds: [],
|
prerequisiteIds: [],
|
||||||
rewards: [ { amount: 5_000_000_000_000_000, type: "blood" }, { amount: 1_000, type: "ichor" } ],
|
rewards: [ { amount: 5_000_000_000_000_000, type: "blood" }, { amount: 1000, type: "ichor" } ],
|
||||||
status: "locked",
|
status: "locked",
|
||||||
zoneId: "vampire_iron_gaol",
|
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,
|
combatPowerRequired: 15_000,
|
||||||
|
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,
|
durationSeconds: 172_800,
|
||||||
id: "the_wardens_fall",
|
id: "the_wardens_fall",
|
||||||
name: "The Warden's Fall",
|
name: "The Warden's Fall",
|
||||||
prerequisiteIds: [ "testing_the_wards" ],
|
prerequisiteIds: [ "testing_the_wards" ],
|
||||||
rewards: [ { amount: 12_000_000_000_000_000, type: "blood" }, { amount: 2_000, type: "ichor" } ],
|
rewards: [ { amount: 12_000_000_000_000_000, type: "blood" }, { amount: 2000, type: "ichor" } ],
|
||||||
status: "locked",
|
status: "locked",
|
||||||
zoneId: "vampire_iron_gaol",
|
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,
|
combatPowerRequired: 20_000,
|
||||||
|
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,
|
durationSeconds: 259_200,
|
||||||
id: "freeing_the_prisoners",
|
id: "freeing_the_prisoners",
|
||||||
name: "Freeing the Prisoners",
|
name: "Freeing the Prisoners",
|
||||||
prerequisiteIds: [ "the_wardens_fall" ],
|
prerequisiteIds: [ "the_wardens_fall" ],
|
||||||
rewards: [ { amount: 30_000_000_000_000_000, type: "blood" }, { amount: 4_000, type: "ichor" } ],
|
rewards: [ { amount: 30_000_000_000_000_000, type: "blood" }, { amount: 4000, type: "ichor" } ],
|
||||||
status: "locked",
|
status: "locked",
|
||||||
zoneId: "vampire_iron_gaol",
|
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,
|
combatPowerRequired: 27_000,
|
||||||
|
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,
|
durationSeconds: 345_600,
|
||||||
id: "mastering_the_forge",
|
id: "mastering_the_forge",
|
||||||
name: "Mastering the Forge",
|
name: "Mastering the Forge",
|
||||||
prerequisiteIds: [ "freeing_the_prisoners" ],
|
prerequisiteIds: [ "freeing_the_prisoners" ],
|
||||||
rewards: [ { amount: 75_000_000_000_000_000, type: "blood" }, { amount: 7_000, type: "ichor" } ],
|
rewards: [ { amount: 75_000_000_000_000_000, type: "blood" }, { amount: 7000, type: "ichor" } ],
|
||||||
status: "locked",
|
status: "locked",
|
||||||
zoneId: "vampire_iron_gaol",
|
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,
|
combatPowerRequired: 35_000,
|
||||||
|
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,
|
durationSeconds: 432_000,
|
||||||
id: "iron_chains",
|
id: "iron_chains",
|
||||||
name: "Iron Chains",
|
name: "Iron Chains",
|
||||||
@@ -494,30 +494,30 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
|
|
||||||
// ── Zone 9: Veilborn Hollow ───────────────────────────────────────────────
|
// ── 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,
|
combatPowerRequired: 40_000,
|
||||||
|
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,
|
durationSeconds: 172_800,
|
||||||
id: "first_steps_through_the_veil",
|
id: "first_steps_through_the_veil",
|
||||||
name: "First Steps Through the Veil",
|
name: "First Steps Through the Veil",
|
||||||
prerequisiteIds: [],
|
prerequisiteIds: [],
|
||||||
rewards: [ { amount: 500_000_000_000_000_000, type: "blood" }, { amount: 3_000, type: "ichor" }, { amount: 1, type: "soulShards" } ],
|
rewards: [ { amount: 500_000_000_000_000_000, type: "blood" }, { amount: 3000, type: "ichor" }, { amount: 1, type: "soulShards" } ],
|
||||||
status: "locked",
|
status: "locked",
|
||||||
zoneId: "vampire_veilborn_hollow",
|
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,
|
combatPowerRequired: 50_000,
|
||||||
|
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,
|
durationSeconds: 259_200,
|
||||||
id: "the_veilborn_compact",
|
id: "the_veilborn_compact",
|
||||||
name: "The Veilborn Compact",
|
name: "The Veilborn Compact",
|
||||||
prerequisiteIds: [ "first_steps_through_the_veil" ],
|
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" } ],
|
rewards: [ { amount: 1_200_000_000_000_000_000, type: "blood" }, { amount: 6000, type: "ichor" }, { amount: 3, type: "soulShards" } ],
|
||||||
status: "locked",
|
status: "locked",
|
||||||
zoneId: "vampire_veilborn_hollow",
|
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,
|
combatPowerRequired: 65_000,
|
||||||
|
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,
|
durationSeconds: 345_600,
|
||||||
id: "the_veil_pool",
|
id: "the_veil_pool",
|
||||||
name: "The Veil Pool",
|
name: "The Veil Pool",
|
||||||
@@ -527,8 +527,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_veilborn_hollow",
|
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,
|
combatPowerRequired: 85_000,
|
||||||
|
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,
|
durationSeconds: 432_000,
|
||||||
id: "the_hollow_elder",
|
id: "the_hollow_elder",
|
||||||
name: "The Hollow Elder",
|
name: "The Hollow Elder",
|
||||||
@@ -538,8 +538,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_veilborn_hollow",
|
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,
|
combatPowerRequired: 110_000,
|
||||||
|
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,
|
durationSeconds: 518_400,
|
||||||
id: "veil_passage",
|
id: "veil_passage",
|
||||||
name: "Veil Passage",
|
name: "Veil Passage",
|
||||||
@@ -556,8 +556,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
|
|
||||||
// ── Zone 10: Moonless Moor ────────────────────────────────────────────────
|
// ── 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,
|
combatPowerRequired: 130_000,
|
||||||
|
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,
|
durationSeconds: 259_200,
|
||||||
id: "hunting_in_darkness",
|
id: "hunting_in_darkness",
|
||||||
name: "Hunting in Darkness",
|
name: "Hunting in Darkness",
|
||||||
@@ -567,8 +567,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_moonless_moor",
|
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,
|
combatPowerRequired: 160_000,
|
||||||
|
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,
|
durationSeconds: 345_600,
|
||||||
id: "voices_in_the_fog",
|
id: "voices_in_the_fog",
|
||||||
name: "Voices in the Fog",
|
name: "Voices in the Fog",
|
||||||
@@ -578,8 +578,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_moonless_moor",
|
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,
|
combatPowerRequired: 200_000,
|
||||||
|
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,
|
durationSeconds: 432_000,
|
||||||
id: "studying_the_dark_runners",
|
id: "studying_the_dark_runners",
|
||||||
name: "Studying the Dark-Runners",
|
name: "Studying the Dark-Runners",
|
||||||
@@ -589,8 +589,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_moonless_moor",
|
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,
|
combatPowerRequired: 250_000,
|
||||||
|
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,
|
durationSeconds: 518_400,
|
||||||
id: "the_vast_movement",
|
id: "the_vast_movement",
|
||||||
name: "The Vast Movement",
|
name: "The Vast Movement",
|
||||||
@@ -600,8 +600,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_moonless_moor",
|
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,
|
combatPowerRequired: 320_000,
|
||||||
|
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,
|
durationSeconds: 604_800,
|
||||||
id: "moor_harvest",
|
id: "moor_harvest",
|
||||||
name: "Moor Harvest",
|
name: "Moor Harvest",
|
||||||
@@ -618,8 +618,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
|
|
||||||
// ── Zone 11: Sunken Crypt ─────────────────────────────────────────────────
|
// ── 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,
|
combatPowerRequired: 380_000,
|
||||||
|
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,
|
durationSeconds: 345_600,
|
||||||
id: "descent_to_the_crypt",
|
id: "descent_to_the_crypt",
|
||||||
name: "Descent to the Crypt",
|
name: "Descent to the Crypt",
|
||||||
@@ -629,8 +629,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_sunken_crypt",
|
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,
|
combatPowerRequired: 470_000,
|
||||||
|
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,
|
durationSeconds: 432_000,
|
||||||
id: "shoring_the_wards",
|
id: "shoring_the_wards",
|
||||||
name: "Shoring the Wards",
|
name: "Shoring the Wards",
|
||||||
@@ -640,8 +640,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_sunken_crypt",
|
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,
|
combatPowerRequired: 580_000,
|
||||||
|
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,
|
durationSeconds: 518_400,
|
||||||
id: "waking_the_entombed",
|
id: "waking_the_entombed",
|
||||||
name: "Waking the Entombed",
|
name: "Waking the Entombed",
|
||||||
@@ -651,8 +651,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_sunken_crypt",
|
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,
|
combatPowerRequired: 720_000,
|
||||||
|
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,
|
durationSeconds: 604_800,
|
||||||
id: "the_crypt_archives",
|
id: "the_crypt_archives",
|
||||||
name: "The Crypt Archives",
|
name: "The Crypt Archives",
|
||||||
@@ -662,8 +662,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_sunken_crypt",
|
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,
|
combatPowerRequired: 900_000,
|
||||||
|
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,
|
durationSeconds: 691_200,
|
||||||
id: "sunken_depths",
|
id: "sunken_depths",
|
||||||
name: "Sunken Depths",
|
name: "Sunken Depths",
|
||||||
@@ -680,8 +680,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
|
|
||||||
// ── Zone 12: Desecrated Sanctum ───────────────────────────────────────────
|
// ── 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,
|
combatPowerRequired: 1_050_000,
|
||||||
|
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,
|
durationSeconds: 432_000,
|
||||||
id: "the_first_desecration",
|
id: "the_first_desecration",
|
||||||
name: "The First Desecration",
|
name: "The First Desecration",
|
||||||
@@ -691,8 +691,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_desecrated_sanctum",
|
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,
|
combatPowerRequired: 1_300_000,
|
||||||
|
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,
|
durationSeconds: 518_400,
|
||||||
id: "witnessing_the_rites",
|
id: "witnessing_the_rites",
|
||||||
name: "Witnessing the Rites",
|
name: "Witnessing the Rites",
|
||||||
@@ -702,8 +702,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_desecrated_sanctum",
|
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,
|
combatPowerRequired: 1_600_000,
|
||||||
|
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,
|
durationSeconds: 604_800,
|
||||||
id: "drawing_from_the_impression",
|
id: "drawing_from_the_impression",
|
||||||
name: "Drawing from the Impression",
|
name: "Drawing from the Impression",
|
||||||
@@ -713,8 +713,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_desecrated_sanctum",
|
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,
|
combatPowerRequired: 2_000_000,
|
||||||
|
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,
|
durationSeconds: 691_200,
|
||||||
id: "the_intact_relic",
|
id: "the_intact_relic",
|
||||||
name: "The Intact Relic",
|
name: "The Intact Relic",
|
||||||
@@ -724,8 +724,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_desecrated_sanctum",
|
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,
|
combatPowerRequired: 2_500_000,
|
||||||
|
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,
|
durationSeconds: 777_600,
|
||||||
id: "sanctum_desecration",
|
id: "sanctum_desecration",
|
||||||
name: "Sanctum Desecration",
|
name: "Sanctum Desecration",
|
||||||
@@ -742,8 +742,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
|
|
||||||
// ── Zone 13: Carrion Peaks ────────────────────────────────────────────────
|
// ── 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,
|
combatPowerRequired: 3_000_000,
|
||||||
|
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,
|
durationSeconds: 518_400,
|
||||||
id: "climbing_the_carrion_slopes",
|
id: "climbing_the_carrion_slopes",
|
||||||
name: "Climbing the Carrion Slopes",
|
name: "Climbing the Carrion Slopes",
|
||||||
@@ -753,8 +753,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_carrion_peaks",
|
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,
|
combatPowerRequired: 3_700_000,
|
||||||
|
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,
|
durationSeconds: 604_800,
|
||||||
id: "looting_the_war_camps",
|
id: "looting_the_war_camps",
|
||||||
name: "Looting the War-Camps",
|
name: "Looting the War-Camps",
|
||||||
@@ -764,8 +764,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_carrion_peaks",
|
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,
|
combatPowerRequired: 4_600_000,
|
||||||
|
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,
|
durationSeconds: 691_200,
|
||||||
id: "hunting_the_elder_birds",
|
id: "hunting_the_elder_birds",
|
||||||
name: "Hunting the Elder Birds",
|
name: "Hunting the Elder Birds",
|
||||||
@@ -775,8 +775,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_carrion_peaks",
|
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,
|
combatPowerRequired: 5_800_000,
|
||||||
|
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,
|
durationSeconds: 777_600,
|
||||||
id: "the_crystallised_battlefield",
|
id: "the_crystallised_battlefield",
|
||||||
name: "The Crystallised Battlefield",
|
name: "The Crystallised Battlefield",
|
||||||
@@ -786,8 +786,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_carrion_peaks",
|
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,
|
combatPowerRequired: 7_200_000,
|
||||||
|
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,
|
durationSeconds: 864_000,
|
||||||
id: "carrion_ascent",
|
id: "carrion_ascent",
|
||||||
name: "Carrion Ascent",
|
name: "Carrion Ascent",
|
||||||
@@ -795,7 +795,7 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
rewards: [
|
rewards: [
|
||||||
{ amount: 1_300_000_000_000_000_000_000_000_000, type: "blood" },
|
{ amount: 1_300_000_000_000_000_000_000_000_000, type: "blood" },
|
||||||
{ amount: 1_200_000, type: "ichor" },
|
{ amount: 1_200_000, type: "ichor" },
|
||||||
{ amount: 1_200, type: "soulShards" },
|
{ amount: 1200, type: "soulShards" },
|
||||||
{ targetId: "grave_warden", type: "thrall" },
|
{ targetId: "grave_warden", type: "thrall" },
|
||||||
],
|
],
|
||||||
status: "locked",
|
status: "locked",
|
||||||
@@ -804,8 +804,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
|
|
||||||
// ── Zone 14: Bloodspire ───────────────────────────────────────────────────
|
// ── 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,
|
combatPowerRequired: 8_500_000,
|
||||||
|
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,
|
durationSeconds: 604_800,
|
||||||
id: "approaching_the_spire",
|
id: "approaching_the_spire",
|
||||||
name: "Approaching the Spire",
|
name: "Approaching the Spire",
|
||||||
@@ -815,8 +815,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_bloodspire",
|
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,
|
combatPowerRequired: 10_500_000,
|
||||||
|
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,
|
durationSeconds: 691_200,
|
||||||
id: "displacing_the_guardians",
|
id: "displacing_the_guardians",
|
||||||
name: "Displacing the Guardians",
|
name: "Displacing the Guardians",
|
||||||
@@ -826,30 +826,30 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_bloodspire",
|
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,
|
combatPowerRequired: 13_000_000,
|
||||||
|
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,
|
durationSeconds: 777_600,
|
||||||
id: "accelerating_the_growth",
|
id: "accelerating_the_growth",
|
||||||
name: "Accelerating the Growth",
|
name: "Accelerating the Growth",
|
||||||
prerequisiteIds: [ "displacing_the_guardians" ],
|
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" } ],
|
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",
|
status: "locked",
|
||||||
zoneId: "vampire_bloodspire",
|
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,
|
combatPowerRequired: 16_000_000,
|
||||||
|
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,
|
durationSeconds: 864_000,
|
||||||
id: "harvesting_starblood",
|
id: "harvesting_starblood",
|
||||||
name: "Harvesting Starblood",
|
name: "Harvesting Starblood",
|
||||||
prerequisiteIds: [ "accelerating_the_growth" ],
|
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" } ],
|
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",
|
status: "locked",
|
||||||
zoneId: "vampire_bloodspire",
|
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,
|
combatPowerRequired: 20_000_000,
|
||||||
|
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,
|
durationSeconds: 950_400,
|
||||||
id: "spire_trials",
|
id: "spire_trials",
|
||||||
name: "Spire Trials",
|
name: "Spire Trials",
|
||||||
@@ -857,7 +857,7 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
rewards: [
|
rewards: [
|
||||||
{ amount: 125_000_000_000_000_000_000_000_000_000, type: "blood" },
|
{ amount: 125_000_000_000_000_000_000_000_000_000, type: "blood" },
|
||||||
{ amount: 2_300_000, type: "ichor" },
|
{ amount: 2_300_000, type: "ichor" },
|
||||||
{ amount: 2_300, type: "soulShards" },
|
{ amount: 2300, type: "soulShards" },
|
||||||
{ targetId: "soul_drinker", type: "thrall" },
|
{ targetId: "soul_drinker", type: "thrall" },
|
||||||
],
|
],
|
||||||
status: "locked",
|
status: "locked",
|
||||||
@@ -866,8 +866,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
|
|
||||||
// ── Zone 15: Shroud of Eternity ───────────────────────────────────────────
|
// ── 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,
|
combatPowerRequired: 24_000_000,
|
||||||
|
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,
|
durationSeconds: 691_200,
|
||||||
id: "entering_the_shroud",
|
id: "entering_the_shroud",
|
||||||
name: "Entering the Shroud",
|
name: "Entering the Shroud",
|
||||||
@@ -877,41 +877,41 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_shroud_of_eternity",
|
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,
|
combatPowerRequired: 30_000_000,
|
||||||
|
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,
|
durationSeconds: 777_600,
|
||||||
id: "reading_the_shrouds_memory",
|
id: "reading_the_shrouds_memory",
|
||||||
name: "Reading the Shroud's Memory",
|
name: "Reading the Shroud's Memory",
|
||||||
prerequisiteIds: [ "entering_the_shroud" ],
|
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" } ],
|
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",
|
status: "locked",
|
||||||
zoneId: "vampire_shroud_of_eternity",
|
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,
|
combatPowerRequired: 38_000_000,
|
||||||
|
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,
|
durationSeconds: 864_000,
|
||||||
id: "the_permanent_residents",
|
id: "the_permanent_residents",
|
||||||
name: "The Permanent Residents",
|
name: "The Permanent Residents",
|
||||||
prerequisiteIds: [ "reading_the_shrouds_memory" ],
|
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" } ],
|
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",
|
status: "locked",
|
||||||
zoneId: "vampire_shroud_of_eternity",
|
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,
|
combatPowerRequired: 48_000_000,
|
||||||
|
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,
|
durationSeconds: 950_400,
|
||||||
id: "the_book_of_endings",
|
id: "the_book_of_endings",
|
||||||
name: "The Book of Endings",
|
name: "The Book of Endings",
|
||||||
prerequisiteIds: [ "the_permanent_residents" ],
|
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" } ],
|
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",
|
status: "locked",
|
||||||
zoneId: "vampire_shroud_of_eternity",
|
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,
|
combatPowerRequired: 60_000_000,
|
||||||
|
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,
|
durationSeconds: 1_036_800,
|
||||||
id: "eternal_shroud",
|
id: "eternal_shroud",
|
||||||
name: "Eternal Shroud",
|
name: "Eternal Shroud",
|
||||||
@@ -919,7 +919,7 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
rewards: [
|
rewards: [
|
||||||
{ amount: 12_500_000_000_000_000_000_000_000_000_000, type: "blood" },
|
{ amount: 12_500_000_000_000_000_000_000_000_000_000, type: "blood" },
|
||||||
{ amount: 5_000_000, type: "ichor" },
|
{ amount: 5_000_000, type: "ichor" },
|
||||||
{ amount: 5_000, type: "soulShards" },
|
{ amount: 5000, type: "soulShards" },
|
||||||
{ targetId: "blood_ancient", type: "thrall" },
|
{ targetId: "blood_ancient", type: "thrall" },
|
||||||
],
|
],
|
||||||
status: "locked",
|
status: "locked",
|
||||||
@@ -928,52 +928,52 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
|
|
||||||
// ── Zone 16: Abyssal Vault ────────────────────────────────────────────────
|
// ── 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,
|
combatPowerRequired: 75_000_000,
|
||||||
|
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,
|
durationSeconds: 864_000,
|
||||||
id: "breaching_the_outer_seals",
|
id: "breaching_the_outer_seals",
|
||||||
name: "Breaching the Outer Seals",
|
name: "Breaching the Outer Seals",
|
||||||
prerequisiteIds: [],
|
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" } ],
|
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",
|
status: "locked",
|
||||||
zoneId: "vampire_abyssal_vault",
|
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,
|
combatPowerRequired: 95_000_000,
|
||||||
|
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,
|
durationSeconds: 950_400,
|
||||||
id: "mapping_the_containment_rings",
|
id: "mapping_the_containment_rings",
|
||||||
name: "Mapping the Containment Rings",
|
name: "Mapping the Containment Rings",
|
||||||
prerequisiteIds: [ "breaching_the_outer_seals" ],
|
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" } ],
|
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",
|
status: "locked",
|
||||||
zoneId: "vampire_abyssal_vault",
|
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,
|
combatPowerRequired: 120_000_000,
|
||||||
|
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,
|
durationSeconds: 1_036_800,
|
||||||
id: "reading_the_impression",
|
id: "reading_the_impression",
|
||||||
name: "Reading the Impression",
|
name: "Reading the Impression",
|
||||||
prerequisiteIds: [ "mapping_the_containment_rings" ],
|
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" } ],
|
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",
|
status: "locked",
|
||||||
zoneId: "vampire_abyssal_vault",
|
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,
|
combatPowerRequired: 150_000_000,
|
||||||
|
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,
|
durationSeconds: 1_123_200,
|
||||||
id: "the_encoded_knowledge",
|
id: "the_encoded_knowledge",
|
||||||
name: "The Encoded Knowledge",
|
name: "The Encoded Knowledge",
|
||||||
prerequisiteIds: [ "reading_the_impression" ],
|
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" } ],
|
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",
|
status: "locked",
|
||||||
zoneId: "vampire_abyssal_vault",
|
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,
|
combatPowerRequired: 190_000_000,
|
||||||
|
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,
|
durationSeconds: 1_209_600,
|
||||||
id: "vault_secrets",
|
id: "vault_secrets",
|
||||||
name: "Vault Secrets",
|
name: "Vault Secrets",
|
||||||
@@ -990,30 +990,30 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
|
|
||||||
// ── Zone 17: Court of Whispers ────────────────────────────────────────────
|
// ── 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,
|
combatPowerRequired: 230_000_000,
|
||||||
|
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,
|
durationSeconds: 1_036_800,
|
||||||
id: "the_first_invitation",
|
id: "the_first_invitation",
|
||||||
name: "The First Invitation",
|
name: "The First Invitation",
|
||||||
prerequisiteIds: [],
|
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" } ],
|
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",
|
status: "locked",
|
||||||
zoneId: "vampire_court_of_whispers",
|
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,
|
combatPowerRequired: 290_000_000,
|
||||||
|
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,
|
durationSeconds: 1_123_200,
|
||||||
id: "attending_the_sessions",
|
id: "attending_the_sessions",
|
||||||
name: "Attending the Sessions",
|
name: "Attending the Sessions",
|
||||||
prerequisiteIds: [ "the_first_invitation" ],
|
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" } ],
|
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",
|
status: "locked",
|
||||||
zoneId: "vampire_court_of_whispers",
|
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,
|
combatPowerRequired: 360_000_000,
|
||||||
|
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,
|
durationSeconds: 1_209_600,
|
||||||
id: "the_three_century_dispute",
|
id: "the_three_century_dispute",
|
||||||
name: "The Three-Century Dispute",
|
name: "The Three-Century Dispute",
|
||||||
@@ -1023,8 +1023,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_court_of_whispers",
|
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,
|
combatPowerRequired: 450_000_000,
|
||||||
|
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,
|
durationSeconds: 1_296_000,
|
||||||
id: "clearing_the_chair",
|
id: "clearing_the_chair",
|
||||||
name: "Clearing the Chair",
|
name: "Clearing the Chair",
|
||||||
@@ -1034,8 +1034,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_court_of_whispers",
|
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,
|
combatPowerRequired: 560_000_000,
|
||||||
|
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,
|
durationSeconds: 1_382_400,
|
||||||
id: "court_whispers",
|
id: "court_whispers",
|
||||||
name: "Court Whispers",
|
name: "Court Whispers",
|
||||||
@@ -1052,19 +1052,19 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
|
|
||||||
// ── Zone 18: Eternal Abyss ────────────────────────────────────────────────
|
// ── 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,
|
combatPowerRequired: 700_000_000,
|
||||||
|
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,
|
durationSeconds: 1_209_600,
|
||||||
id: "the_first_descent",
|
id: "the_first_descent",
|
||||||
name: "The First Descent",
|
name: "The First Descent",
|
||||||
prerequisiteIds: [],
|
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" } ],
|
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",
|
status: "locked",
|
||||||
zoneId: "vampire_eternal_abyss",
|
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,
|
combatPowerRequired: 880_000_000,
|
||||||
|
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,
|
durationSeconds: 1_382_400,
|
||||||
id: "cataloguing_the_patterns",
|
id: "cataloguing_the_patterns",
|
||||||
name: "Cataloguing the Patterns",
|
name: "Cataloguing the Patterns",
|
||||||
@@ -1074,8 +1074,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_eternal_abyss",
|
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,
|
combatPowerRequired: 1_100_000_000,
|
||||||
|
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,
|
durationSeconds: 1_555_200,
|
||||||
id: "speaking_to_the_composite",
|
id: "speaking_to_the_composite",
|
||||||
name: "Speaking to the Composite",
|
name: "Speaking to the Composite",
|
||||||
@@ -1085,8 +1085,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_eternal_abyss",
|
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,
|
combatPowerRequired: 1_400_000_000,
|
||||||
|
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,
|
durationSeconds: 1_728_000,
|
||||||
id: "the_sovereigns_choice",
|
id: "the_sovereigns_choice",
|
||||||
name: "The Sovereign's Choice",
|
name: "The Sovereign's Choice",
|
||||||
@@ -1096,8 +1096,8 @@ export const defaultVampireQuests: Array<VampireQuest> = [
|
|||||||
zoneId: "vampire_eternal_abyss",
|
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,
|
combatPowerRequired: 1_800_000_000,
|
||||||
|
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,
|
durationSeconds: 1_900_800,
|
||||||
id: "abyss_eternal",
|
id: "abyss_eternal",
|
||||||
name: "Abyss Eternal",
|
name: "Abyss Eternal",
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ export const defaultVampireSiringUpgrades: Array<SiringUpgrade> = [
|
|||||||
{
|
{
|
||||||
category: "blood",
|
category: "blood",
|
||||||
description: "The accumulated weight of many sirings floods every vein in your domain. All blood/s ×25.",
|
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",
|
id: "siring_blood_6",
|
||||||
multiplier: 25,
|
multiplier: 25,
|
||||||
name: "Ichor Awakening VI",
|
name: "Ichor Awakening VI",
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ export const defaultVampireThralls: Array<VampireThrall> = [
|
|||||||
unlocked: false,
|
unlocked: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
baseCost: 5_000,
|
baseCost: 5000,
|
||||||
bloodPerSecond: 20,
|
bloodPerSecond: 20,
|
||||||
class: "fledgling",
|
class: "fledgling",
|
||||||
combatPower: 50,
|
combatPower: 50,
|
||||||
@@ -109,9 +109,9 @@ export const defaultVampireThralls: Array<VampireThrall> = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
baseCost: 15_000_000,
|
baseCost: 15_000_000,
|
||||||
bloodPerSecond: 1_000,
|
bloodPerSecond: 1000,
|
||||||
class: "revenant",
|
class: "revenant",
|
||||||
combatPower: 1_800,
|
combatPower: 1800,
|
||||||
count: 0,
|
count: 0,
|
||||||
ichorPerSecond: 1,
|
ichorPerSecond: 1,
|
||||||
id: "revenant_4",
|
id: "revenant_4",
|
||||||
@@ -121,9 +121,9 @@ export const defaultVampireThralls: Array<VampireThrall> = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
baseCost: 120_000_000,
|
baseCost: 120_000_000,
|
||||||
bloodPerSecond: 2_500,
|
bloodPerSecond: 2500,
|
||||||
class: "revenant",
|
class: "revenant",
|
||||||
combatPower: 4_000,
|
combatPower: 4000,
|
||||||
count: 0,
|
count: 0,
|
||||||
ichorPerSecond: 2,
|
ichorPerSecond: 2,
|
||||||
id: "revenant_5",
|
id: "revenant_5",
|
||||||
@@ -134,9 +134,9 @@ export const defaultVampireThralls: Array<VampireThrall> = [
|
|||||||
// ── Shade (6 tiers) ───────────────────────────────────────────────────────
|
// ── Shade (6 tiers) ───────────────────────────────────────────────────────
|
||||||
{
|
{
|
||||||
baseCost: 800_000_000,
|
baseCost: 800_000_000,
|
||||||
bloodPerSecond: 6_000,
|
bloodPerSecond: 6000,
|
||||||
class: "shade",
|
class: "shade",
|
||||||
combatPower: 9_000,
|
combatPower: 9000,
|
||||||
count: 0,
|
count: 0,
|
||||||
ichorPerSecond: 5,
|
ichorPerSecond: 5,
|
||||||
id: "shade_1",
|
id: "shade_1",
|
||||||
@@ -235,7 +235,7 @@ export const defaultVampireThralls: Array<VampireThrall> = [
|
|||||||
class: "bloodbound",
|
class: "bloodbound",
|
||||||
combatPower: 5_000_000,
|
combatPower: 5_000_000,
|
||||||
count: 0,
|
count: 0,
|
||||||
ichorPerSecond: 1_200,
|
ichorPerSecond: 1200,
|
||||||
id: "bloodbound_3",
|
id: "bloodbound_3",
|
||||||
level: 19,
|
level: 19,
|
||||||
name: "Elder Bloodbound",
|
name: "Elder Bloodbound",
|
||||||
@@ -247,7 +247,7 @@ export const defaultVampireThralls: Array<VampireThrall> = [
|
|||||||
class: "bloodbound",
|
class: "bloodbound",
|
||||||
combatPower: 11_000_000,
|
combatPower: 11_000_000,
|
||||||
count: 0,
|
count: 0,
|
||||||
ichorPerSecond: 2_500,
|
ichorPerSecond: 2500,
|
||||||
id: "bloodbound_4",
|
id: "bloodbound_4",
|
||||||
level: 20,
|
level: 20,
|
||||||
name: "Oath Bloodbound",
|
name: "Oath Bloodbound",
|
||||||
@@ -259,7 +259,7 @@ export const defaultVampireThralls: Array<VampireThrall> = [
|
|||||||
class: "bloodbound",
|
class: "bloodbound",
|
||||||
combatPower: 24_000_000,
|
combatPower: 24_000_000,
|
||||||
count: 0,
|
count: 0,
|
||||||
ichorPerSecond: 5_000,
|
ichorPerSecond: 5000,
|
||||||
id: "bloodbound_5",
|
id: "bloodbound_5",
|
||||||
level: 21,
|
level: 21,
|
||||||
name: "Ancient Bloodbound",
|
name: "Ancient Bloodbound",
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ export const defaultVampireUpgrades: Array<VampireUpgrade> = [
|
|||||||
unlocked: true,
|
unlocked: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
costBlood: 1_000,
|
costBlood: 1000,
|
||||||
costIchor: 1,
|
costIchor: 1,
|
||||||
costSoulShards: 0,
|
costSoulShards: 0,
|
||||||
description: "The hunt becomes ritual — every drop flows with purpose. All blood/s ×2.",
|
description: "The hunt becomes ritual — every drop flows with purpose. All blood/s ×2.",
|
||||||
@@ -47,7 +47,7 @@ export const defaultVampireUpgrades: Array<VampireUpgrade> = [
|
|||||||
unlocked: true,
|
unlocked: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
costBlood: 5_000,
|
costBlood: 5000,
|
||||||
costIchor: 2,
|
costIchor: 2,
|
||||||
costSoulShards: 0,
|
costSoulShards: 0,
|
||||||
description: "The ritual deepens. Every vein in your domain opens wider. All blood/s ×3.",
|
description: "The ritual deepens. Every vein in your domain opens wider. All blood/s ×3.",
|
||||||
@@ -144,7 +144,7 @@ export const defaultVampireUpgrades: Array<VampireUpgrade> = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
costBlood: 3_000_000_000,
|
costBlood: 3_000_000_000,
|
||||||
costIchor: 1_000,
|
costIchor: 1000,
|
||||||
costSoulShards: 10,
|
costSoulShards: 10,
|
||||||
description: "The flood becomes eternal — the blood never stops flowing. All blood/s ×25.",
|
description: "The flood becomes eternal — the blood never stops flowing. All blood/s ×25.",
|
||||||
id: "crimson_tide_3",
|
id: "crimson_tide_3",
|
||||||
@@ -156,7 +156,7 @@ export const defaultVampireUpgrades: Array<VampireUpgrade> = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
costBlood: 20_000_000_000,
|
costBlood: 20_000_000_000,
|
||||||
costIchor: 2_000,
|
costIchor: 2000,
|
||||||
costSoulShards: 15,
|
costSoulShards: 15,
|
||||||
description: "The eternal thirst drives every thrall beyond their limits. All blood/s ×10.",
|
description: "The eternal thirst drives every thrall beyond their limits. All blood/s ×10.",
|
||||||
id: "eternal_thirst_1",
|
id: "eternal_thirst_1",
|
||||||
@@ -168,7 +168,7 @@ export const defaultVampireUpgrades: Array<VampireUpgrade> = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
costBlood: 150_000_000_000,
|
costBlood: 150_000_000_000,
|
||||||
costIchor: 5_000,
|
costIchor: 5000,
|
||||||
costSoulShards: 25,
|
costSoulShards: 25,
|
||||||
description: "The second degree of eternal thirst saturates every hunting ground. All blood/s ×25.",
|
description: "The second degree of eternal thirst saturates every hunting ground. All blood/s ×25.",
|
||||||
id: "eternal_thirst_2",
|
id: "eternal_thirst_2",
|
||||||
@@ -241,7 +241,7 @@ export const defaultVampireUpgrades: Array<VampireUpgrade> = [
|
|||||||
unlocked: true,
|
unlocked: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
costBlood: 2_000,
|
costBlood: 2000,
|
||||||
costIchor: 2,
|
costIchor: 2,
|
||||||
costSoulShards: 0,
|
costSoulShards: 0,
|
||||||
description: "Advanced fledgling conditioning multiplies their contribution. Fledgling blood/s ×4.",
|
description: "Advanced fledgling conditioning multiplies their contribution. Fledgling blood/s ×4.",
|
||||||
@@ -346,7 +346,7 @@ export const defaultVampireUpgrades: Array<VampireUpgrade> = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
costBlood: 1_000_000_000_000,
|
costBlood: 1_000_000_000_000,
|
||||||
costIchor: 1_500,
|
costIchor: 1500,
|
||||||
costSoulShards: 15,
|
costSoulShards: 15,
|
||||||
description: "Total wraith mastery — they exist between states, harvesting from both. Wraith blood/s ×4.",
|
description: "Total wraith mastery — they exist between states, harvesting from both. Wraith blood/s ×4.",
|
||||||
id: "thrall_wraith_2",
|
id: "thrall_wraith_2",
|
||||||
@@ -359,7 +359,7 @@ export const defaultVampireUpgrades: Array<VampireUpgrade> = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
costBlood: 5_000_000_000_000,
|
costBlood: 5_000_000_000_000,
|
||||||
costIchor: 3_000,
|
costIchor: 3000,
|
||||||
costSoulShards: 25,
|
costSoulShards: 25,
|
||||||
description: "The ancient thralls remember techniques from before the oldest living vampires. Ancient blood/s ×2.",
|
description: "The ancient thralls remember techniques from before the oldest living vampires. Ancient blood/s ×2.",
|
||||||
id: "thrall_ancient_1",
|
id: "thrall_ancient_1",
|
||||||
@@ -372,7 +372,7 @@ export const defaultVampireUpgrades: Array<VampireUpgrade> = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
costBlood: 100_000_000_000_000,
|
costBlood: 100_000_000_000_000,
|
||||||
costIchor: 7_500,
|
costIchor: 7500,
|
||||||
costSoulShards: 50,
|
costSoulShards: 50,
|
||||||
description: "The ancient thralls operate at the peak of millennia of refinement. Ancient blood/s ×4.",
|
description: "The ancient thralls operate at the peak of millennia of refinement. Ancient blood/s ×4.",
|
||||||
id: "thrall_ancient_2",
|
id: "thrall_ancient_2",
|
||||||
@@ -458,7 +458,7 @@ export const defaultVampireUpgrades: Array<VampireUpgrade> = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
costBlood: 5_000_000_000,
|
costBlood: 5_000_000_000,
|
||||||
costIchor: 1_500,
|
costIchor: 1500,
|
||||||
costSoulShards: 15,
|
costSoulShards: 15,
|
||||||
description: "The covenant deepens into something approaching a law of nature. All blood/s ×10.",
|
description: "The covenant deepens into something approaching a law of nature. All blood/s ×10.",
|
||||||
id: "dark_covenant_2",
|
id: "dark_covenant_2",
|
||||||
@@ -470,7 +470,7 @@ export const defaultVampireUpgrades: Array<VampireUpgrade> = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
costBlood: 50_000_000_000,
|
costBlood: 50_000_000_000,
|
||||||
costIchor: 5_000,
|
costIchor: 5000,
|
||||||
costSoulShards: 30,
|
costSoulShards: 30,
|
||||||
description: "The final covenant makes the domain itself hunger on your behalf. All blood/s ×25.",
|
description: "The final covenant makes the domain itself hunger on your behalf. All blood/s ×25.",
|
||||||
id: "dark_covenant_3",
|
id: "dark_covenant_3",
|
||||||
@@ -567,7 +567,7 @@ export const defaultVampireUpgrades: Array<VampireUpgrade> = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
costBlood: 10_000_000_000,
|
costBlood: 10_000_000_000,
|
||||||
costIchor: 1_500,
|
costIchor: 1500,
|
||||||
costSoulShards: 10,
|
costSoulShards: 10,
|
||||||
description: "The bloodline power doubles its influence over each new generation. Siring production multiplier ×2.",
|
description: "The bloodline power doubles its influence over each new generation. Siring production multiplier ×2.",
|
||||||
id: "bloodline_power_2",
|
id: "bloodline_power_2",
|
||||||
@@ -579,7 +579,7 @@ export const defaultVampireUpgrades: Array<VampireUpgrade> = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
costBlood: 100_000_000_000,
|
costBlood: 100_000_000_000,
|
||||||
costIchor: 5_000,
|
costIchor: 5000,
|
||||||
costSoulShards: 20,
|
costSoulShards: 20,
|
||||||
description: "The bloodline power reaches its third stage — threefold production. Siring production multiplier ×3.",
|
description: "The bloodline power reaches its third stage — threefold production. Siring production multiplier ×3.",
|
||||||
id: "bloodline_power_3",
|
id: "bloodline_power_3",
|
||||||
@@ -603,7 +603,7 @@ export const defaultVampireUpgrades: Array<VampireUpgrade> = [
|
|||||||
},
|
},
|
||||||
// ── Boss Upgrades (10) ────────────────────────────────────────────────────
|
// ── Boss Upgrades (10) ────────────────────────────────────────────────────
|
||||||
{
|
{
|
||||||
costBlood: 1_000,
|
costBlood: 1000,
|
||||||
costIchor: 1,
|
costIchor: 1,
|
||||||
costSoulShards: 0,
|
costSoulShards: 0,
|
||||||
description: "The hunter's instinct sharpens with each victory. Thrall combat power ×1.25.",
|
description: "The hunter's instinct sharpens with each victory. Thrall combat power ×1.25.",
|
||||||
@@ -676,7 +676,7 @@ export const defaultVampireUpgrades: Array<VampireUpgrade> = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
costBlood: 1_000_000_000,
|
costBlood: 1_000_000_000,
|
||||||
costIchor: 1_000,
|
costIchor: 1000,
|
||||||
costSoulShards: 10,
|
costSoulShards: 10,
|
||||||
description: "The apex predator sense collapses all opposition with surgical efficiency. Thrall combat power ×5.",
|
description: "The apex predator sense collapses all opposition with surgical efficiency. Thrall combat power ×5.",
|
||||||
id: "predator_sense_3",
|
id: "predator_sense_3",
|
||||||
@@ -688,7 +688,7 @@ export const defaultVampireUpgrades: Array<VampireUpgrade> = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
costBlood: 10_000_000_000,
|
costBlood: 10_000_000_000,
|
||||||
costIchor: 3_000,
|
costIchor: 3000,
|
||||||
costSoulShards: 20,
|
costSoulShards: 20,
|
||||||
description: "The first apex predator upgrade transcends ordinary vampire combat. Thrall combat power ×5.",
|
description: "The first apex predator upgrade transcends ordinary vampire combat. Thrall combat power ×5.",
|
||||||
id: "apex_predator_1",
|
id: "apex_predator_1",
|
||||||
|
|||||||
@@ -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 {
|
return {
|
||||||
...incoming,
|
...incoming,
|
||||||
achievements,
|
achievements,
|
||||||
@@ -900,6 +1069,7 @@ const validateAndSanitize = (
|
|||||||
...storySpread,
|
...storySpread,
|
||||||
...dailyChallengesSpread,
|
...dailyChallengesSpread,
|
||||||
...goddessSpread,
|
...goddessSpread,
|
||||||
|
...vampireSpread,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ import type { DailyChallengeState } from "./dailyChallenge.js";
|
|||||||
import type { Equipment } from "./equipment.js";
|
import type { Equipment } from "./equipment.js";
|
||||||
import type { ExplorationState } from "./exploration.js";
|
import type { ExplorationState } from "./exploration.js";
|
||||||
import type { GoddessState } from "./goddessState.js";
|
import type { GoddessState } from "./goddessState.js";
|
||||||
import type { VampireState } from "./vampireState.js";
|
|
||||||
import type { Player } from "./player.js";
|
import type { Player } from "./player.js";
|
||||||
import type { PrestigeData } from "./prestige.js";
|
import type { PrestigeData } from "./prestige.js";
|
||||||
import type { Quest } from "./quest.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 { StoryState } from "./story.js";
|
||||||
import type { TranscendenceData } from "./transcendence.js";
|
import type { TranscendenceData } from "./transcendence.js";
|
||||||
import type { Upgrade } from "./upgrade.js";
|
import type { Upgrade } from "./upgrade.js";
|
||||||
|
import type { VampireState } from "./vampireState.js";
|
||||||
import type { Zone } from "./zone.js";
|
import type { Zone } from "./zone.js";
|
||||||
|
|
||||||
interface GameState {
|
interface GameState {
|
||||||
|
|||||||
@@ -4,8 +4,8 @@
|
|||||||
* @license Naomi's Public License
|
* @license Naomi's Public License
|
||||||
* @author Naomi Carrigan
|
* @author Naomi Carrigan
|
||||||
*/
|
*/
|
||||||
import type { AwakeningData } from "./vampireAwakening.js";
|
|
||||||
import type { VampireAchievement } from "./vampireAchievement.js";
|
import type { VampireAchievement } from "./vampireAchievement.js";
|
||||||
|
import type { AwakeningData } from "./vampireAwakening.js";
|
||||||
import type { VampireBoss } from "./vampireBoss.js";
|
import type { VampireBoss } from "./vampireBoss.js";
|
||||||
import type { VampireEquipment } from "./vampireEquipment.js";
|
import type { VampireEquipment } from "./vampireEquipment.js";
|
||||||
import type { VampireExplorationState } from "./vampireExploration.js";
|
import type { VampireExplorationState } from "./vampireExploration.js";
|
||||||
|
|||||||
Reference in New Issue
Block a user