Files
elysium/TODO.md

6.7 KiB

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/<folder>/<id>.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.tsinitialVampireState() 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/<folder>/, 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