# Vampire Expansion — Implementation TODO Branch: `feat/expansions` Thematic currency names: - Gold → **Blood** - Essence → **Ichor** - Crystals → **Soul Shards** - Runestones → **Bloodstones** - Echoes → **Whispers** - Click action → **Hunt** - Adventurers → **Thralls** - Prestige → **Siring** (working name) - Transcendence → **The Awakening** (working name) - Apotheosis → **Eternal Sovereignty** (role ID: 1486144657023959180) CDN prefix for all vampire art: `https://cdn.nhcarrigan.com/elysium/vampire//.jpg` Local scratch dir (delete before committing): `img/vampire/` --- ## Phase 1 — Types - [ ] Add `VampireExpansionState` interface to `packages/types/src/interfaces/` mirroring full `GameState` structure (zones, bosses, quests, adventurers, upgrades, equipment, achievements, prestige, transcendence, apotheosis, exploration, resources, baseClickPower, lastTickAt, dailyChallenges, codex, autoQuest, autoBoss, autoAdventurer, companions, story) - [ ] Add `ExpansionsState` interface: `{ vampire?: VampireExpansionState }` - [ ] Add `expansions?: ExpansionsState` field to `GameState` - [ ] Export new types from `packages/types/src/index.ts` --- ## Phase 2 — Data files (vampire content) All data files go in `apps/api/src/data/vampire/`. Same content scale as base game; use vampire theming throughout. - [ ] `zones.ts` — 18 vampire-themed zones (crypts, blood forests, cursed castles, etc.) - [ ] `bosses.ts` — 72 vampire-themed bosses (4 per zone) - [ ] `quests.ts` — match base game quest count (~95); vampire-themed names/descriptions - [ ] `adventurers.ts` — 32 thrall tiers with progressive stats - [ ] `upgrades.ts` — match base game upgrade count (~57); vampire-themed - [ ] `equipment.ts` — match base game equipment count (~53); vampire-themed sets - [ ] `equipmentSets.ts` — vampire equipment sets - [ ] `achievements.ts` — match base game count (~40); vampire-themed conditions - [ ] `explorations.ts` — 72 areas across 18 vampire lore zones - [ ] `materials.ts` — match base game material count (~54); vampire-themed - [ ] `recipes.ts` — match base game recipe count (~36); vampire-themed - [ ] `prestigeUpgrades.ts` — 25 "Siring" upgrades - [ ] `transcendenceUpgrades.ts` — 15 "Awakening" upgrades - [ ] `dailyChallenges.ts` — 10 vampire daily challenges - [ ] `initialState.ts` — `initialVampireState()` function mirroring `initialGameState` structure --- ## Phase 3 — Art generation & CDN upload For each category below, generate images via Gemini API (`gemini-3-pro-image-preview`), save locally to `img/vampire//`, upload to R2, then delete local files. Use soft-shaded anime style; vampire/gothic aesthetic; crimson/black/dark purple palette. - [ ] Zone banners (18) → `img/vampire/zones/` → CDN `vampire/zones/` - [ ] Boss portraits (72) → `img/vampire/bosses/` → CDN `vampire/bosses/` - [ ] Quest banners (match count) → `img/vampire/quests/` → CDN `vampire/quests/` - [ ] Adventurer/thrall portraits (32) → `img/vampire/adventurers/` → CDN `vampire/adventurers/` - [ ] Equipment icons (match count) → `img/vampire/equipment/` → CDN `vampire/equipment/` - [ ] Achievement icons (match count) → `img/vampire/achievements/` → CDN `vampire/achievements/` - [ ] Exploration area art (72) → `img/vampire/explorations/` → CDN `vampire/explorations/` - [ ] Material icons (match count) → `img/vampire/materials/` → CDN `vampire/materials/` - [ ] Story chapter banners (match count) → `img/vampire/story-chapters/` → CDN `vampire/story-chapters/` --- ## Phase 4 — API changes - [ ] Add `inGuild` to Prisma `Player` model → update `initialGameState` if needed (already done in #134 — verify migration) - [ ] Update Prisma schema: no DB changes needed (expansion state is inside the `GameState` JSON blob) - [ ] Update `initialState.ts` to include `expansions: {}` in `initialGameState` - [ ] Update `sync-new-content` debug route to inject/patch vampire expansion content when expansion is unlocked - [ ] Add vampire-specific unlock trigger: when base-game apotheosis count ≥ 1, set `expansions.vampire` to `initialVampireState()` and `unlocked: true` - [ ] Update the load endpoint to pass expansion state through to the client - [ ] Ensure prestige/transcendence/apotheosis routes only reset state for their own expansion (base game routes must NOT touch `expansions.*`) - [ ] Add vampire prestige, transcendence, and apotheosis routes (mirrors of base game routes, scoped to `expansions.vampire`) - [ ] Grant `Eternal Sovereignty` role (ID: `1486144657023959180`) on vampire apotheosis --- ## Phase 5 — Frontend changes ### Expansion switcher - [ ] Add expansion toggle buttons below the Early Access warning in the sidebar - [ ] Always render all expansion buttons; disable any where `unlocked !== true` - [ ] Active expansion stored in React state (not game state); defaults to `"base"` - [ ] Switching expansion updates which data the UI panels display ### Resource bar - [ ] Show ALL currencies from ALL expansions as separate labelled lines - [ ] Vampire currencies use distinct icons/colours (crimson tint for blood, etc.) - [ ] The "expand" button label shows the gold-equivalent currency of the active expansion ### Thematic UI - [ ] When vampire expansion is active, swap labels: gold → Blood, essence → Ichor, etc. - [ ] Apply `.vampire-mode` CSS class to game container when vampire is active - [ ] Vampire colour palette: deep crimsons (`#5C0A1A`), rich crimson (`#C41E3A`), blacks, desaturated purples ### Tick engine - [ ] Update `apps/web/src/engine/tick.ts` to compute passive income for all unlocked expansions every tick (not just base game) - [ ] Offline income calculation must also cover all expansions ### Profile - [ ] Profile panel: tab stats by expansion (base game tab + one tab per unlocked expansion) - [ ] Show correct thematic prestige/transcendence/apotheosis badge names per expansion - [ ] Lifetime stats (gold earned, clicks, etc.) tracked separately per expansion ### About / How to Play - [ ] Update `aboutPanel.tsx` `HOW_TO_PLAY` array to document the expansion system --- ## Phase 6 — Tests & CI - [ ] Unit tests for all new data files (at minimum, validate structure/required fields) - [ ] Unit tests for `initialVampireState()` - [ ] Tests for vampire unlock trigger route - [ ] Tests for vampire prestige/transcendence/apotheosis routes - [ ] Tests for updated tick engine (expansion income) - [ ] Maintain 100% coverage on `apps/api` and `packages/types` - [ ] Full pipeline: lint → build → test passing before PR --- ## Phase 7 — Final - [ ] Delete `img/vampire/` directory before committing - [ ] Update `MEMORY.md` with new content counts - [ ] Open PR → request review