From c09777199aa1691a453bf77c679ba649cd559dd6 Mon Sep 17 00:00:00 2001 From: Hikari Date: Mon, 13 Apr 2026 12:01:40 -0700 Subject: [PATCH] feat: add Goddess expansion type definitions Adds all TypeScript interfaces for the Goddess expansion to packages/types: GoddessState, GoddessZone, GoddessBoss, GoddessQuest, GoddessDisciple, GoddessEquipment, GoddessUpgrade, ConsecrationData, EnlightenmentData, GoddessExplorationState, GoddessAchievement. Extends Resource with optional goddess currencies (prayers, divinity, stardust) and GameState with optional goddess field. Also adds goddess-todo.md implementation tracker. --- goddess-todo.md | 83 ++++++++++++ packages/types/src/index.ts | 54 ++++++++ packages/types/src/interfaces/gameState.ts | 6 + .../src/interfaces/goddessAchievement.ts | 45 +++++++ packages/types/src/interfaces/goddessBoss.ts | 69 ++++++++++ .../src/interfaces/goddessConsecration.ts | 75 +++++++++++ .../types/src/interfaces/goddessDisciple.ts | 46 +++++++ .../src/interfaces/goddessEnlightenment.ts | 79 +++++++++++ .../types/src/interfaces/goddessEquipment.ts | 64 +++++++++ .../src/interfaces/goddessExploration.ts | 123 ++++++++++++++++++ packages/types/src/interfaces/goddessQuest.ts | 71 ++++++++++ packages/types/src/interfaces/goddessState.ts | 76 +++++++++++ .../types/src/interfaces/goddessUpgrade.ts | 37 ++++++ packages/types/src/interfaces/goddessZone.ts | 28 ++++ packages/types/src/interfaces/resource.ts | 7 + 15 files changed, 863 insertions(+) create mode 100644 goddess-todo.md create mode 100644 packages/types/src/interfaces/goddessAchievement.ts create mode 100644 packages/types/src/interfaces/goddessBoss.ts create mode 100644 packages/types/src/interfaces/goddessConsecration.ts create mode 100644 packages/types/src/interfaces/goddessDisciple.ts create mode 100644 packages/types/src/interfaces/goddessEnlightenment.ts create mode 100644 packages/types/src/interfaces/goddessEquipment.ts create mode 100644 packages/types/src/interfaces/goddessExploration.ts create mode 100644 packages/types/src/interfaces/goddessQuest.ts create mode 100644 packages/types/src/interfaces/goddessState.ts create mode 100644 packages/types/src/interfaces/goddessUpgrade.ts create mode 100644 packages/types/src/interfaces/goddessZone.ts diff --git a/goddess-todo.md b/goddess-todo.md new file mode 100644 index 0000000..cff4ef1 --- /dev/null +++ b/goddess-todo.md @@ -0,0 +1,83 @@ +# Goddess Expansion — Implementation Tracker + +Branch: `feat/goddess` + +## Chunk 1 — Types ✅ COMPLETE +- [x] Add `GoddessZone`, `GoddessBoss`, `GoddessQuest` interfaces +- [x] Add `GoddessDisciple` (Disciples) interface +- [x] Add `GoddessEquipment`, `GoddessUpgrade` interfaces +- [x] Add `GoddessExplorationState` interface +- [x] Add `ConsecrationData` + `ConsecrationUpgrade` (Prestige) interfaces +- [x] Add `EnlightenmentData` + `EnlightenmentUpgrade` (Transcendence) interfaces +- [x] Add `GoddessAchievement` interface +- [x] Add goddess currency fields (prayers, divinity, stardust) to `Resource` +- [x] Add top-level `GoddessState` container + add `goddess?` to `GameState` +- [x] Export all new types from `packages/types` +- Lint ✅ · Build ✅ · Tests ✅ (100% coverage) + +## Chunk 2 — Data +- [ ] `goddess-zones.ts` — goddess zone definitions +- [ ] `goddess-bosses.ts` — goddess boss definitions +- [ ] `goddess-quests.ts` — goddess quest definitions +- [ ] `goddess-disciples.ts` — disciple (adventurer) tier definitions +- [ ] `goddess-equipment.ts` — goddess equipment definitions +- [ ] `goddess-upgrades.ts` — goddess upgrade definitions +- [ ] `goddess-prestige-upgrades.ts` — consecration upgrade definitions +- [ ] `goddess-transcendence-upgrades.ts` — enlightenment upgrade definitions +- [ ] `goddess-crafting.ts` — goddess materials + recipes +- [ ] `goddess-explorations.ts` — goddess exploration areas +- [ ] `goddess-achievements.ts` — goddess achievement definitions + +## Chunk 3 — Sync / Sanitize +- [ ] Update `validateAndSanitize` to inject goddess state defaults for existing saves +- [ ] Update force-sync (`syncNewContent`) to inject missing goddess fields +- [ ] Add apotheosis unlock flag handling + +## Chunk 4 — API Routes +- [ ] Goddess boss fight route +- [ ] Consecration (goddess prestige) route +- [ ] Enlightenment (goddess transcendence) route +- [ ] Goddess upgrade purchase route +- [ ] Goddess crafting route +- [ ] Goddess exploration route + +## Chunk 5 — UI: Resource Bar + Tab Row +- [ ] Add goddess currencies to resource bar dropdown (greyed pre-apotheosis) +- [ ] Add second tab row to nav (always visible, locked pre-apotheosis) +- [ ] `.goddess-mode` CSS class toggle on root when goddess tab active +- [ ] 300ms CSS fade transition between base and goddess themes + +## Chunk 6 — UI: Goddess Panels +- [ ] `GoddessZonesPanel` — zones with lock states +- [ ] `GoddessBossPanel` — boss fights +- [ ] `GoddessQuestsPanel` — quests +- [ ] `DisciplesPanel` — goddess adventurers +- [ ] `GoddessEquipmentPanel` — equipment +- [ ] `GoddessUpgradesPanel` — upgrades +- [ ] `ConsecrationPanel` — goddess prestige +- [ ] `EnlightenmentPanel` — goddess transcendence +- [ ] `GoddessCraftingPanel` — crafting +- [ ] `GoddessExplorationPanel` — exploration +- [ ] `GoddessAchievementsPanel` — achievements + +## Chunk 7 — Tick Engine +- [ ] Goddess passive income (prayers, divinity accumulation) +- [ ] Disciple passive income logic +- [ ] Lock state checks (no goddess income pre-apotheosis) +- [ ] Goddess quest timer logic + +## Chunk 8 — CSS Theme +- [ ] Define goddess CSS variables (soft blue primary, gold/white accents) +- [ ] Apply `.goddess-mode` overrides to all themed elements +- [ ] Verify logo stays unchanged during theme shift +- [ ] Test fade transition smoothness + +## Chunk 9 — About Page +- [ ] Update `HOW_TO_PLAY` array in `aboutPanel.tsx` with Goddess expansion documentation + +## Notes +- Apotheosis = the unlock gate for all goddess content (replaces original "Transcendence 20" concept — verify exact trigger) +- Goddess currencies always visible in resource bar, greyed pre-apotheosis +- All goddess tabs always visible in second row, content locked internally pre-apotheosis +- Vampire Mode will follow same pattern as third tab row (future work, not this PR) +- Sync new content must inject goddess defaults for all existing saves diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index 64464a1..8271a72 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -97,6 +97,60 @@ export type { } from "./interfaces/equipmentSet.js"; export { computeSetBonuses } from "./interfaces/equipmentSet.js"; export type { GameState } from "./interfaces/gameState.js"; +export type { + GoddessAchievement, + GoddessAchievementCondition, + GoddessAchievementConditionType, + GoddessAchievementReward, +} from "./interfaces/goddessAchievement.js"; +export type { + GoddessBoss, + GoddessBossStatus, +} from "./interfaces/goddessBoss.js"; +export type { + ConsecrationData, + ConsecrationUpgrade, + ConsecrationUpgradeCategory, +} from "./interfaces/goddessConsecration.js"; +export type { + GoddessDisciple, + GoddessDiscipleClass, +} from "./interfaces/goddessDisciple.js"; +export type { + EnlightenmentData, + EnlightenmentUpgrade, + EnlightenmentUpgradeCategory, +} from "./interfaces/goddessEnlightenment.js"; +export type { + GoddessEquipment, + GoddessEquipmentBonus, + GoddessEquipmentRarity, + GoddessEquipmentType, +} from "./interfaces/goddessEquipment.js"; +export type { + GoddessExplorationArea, + GoddessExplorationAreaState, + GoddessExplorationEvent, + GoddessExplorationEventEffect, + GoddessExplorationEventEffectType, + GoddessExplorationMaterialDrop, + GoddessExplorationState, +} from "./interfaces/goddessExploration.js"; +export type { + GoddessQuest, + GoddessQuestReward, + GoddessQuestRewardType, + GoddessQuestStatus, +} from "./interfaces/goddessQuest.js"; +export type { GoddessState } from "./interfaces/goddessState.js"; +export type { + GoddessUpgrade, + GoddessUpgradeTarget, +} from "./interfaces/goddessUpgrade.js"; +export type { + GoddessZone, + GoddessZoneStatus, +} from "./interfaces/goddessZone.js"; export type { Player } from "./interfaces/player.js"; export type { PrestigeData } from "./interfaces/prestige.js"; export type { diff --git a/packages/types/src/interfaces/gameState.ts b/packages/types/src/interfaces/gameState.ts index 4cf3dcb..69af434 100644 --- a/packages/types/src/interfaces/gameState.ts +++ b/packages/types/src/interfaces/gameState.ts @@ -13,6 +13,7 @@ import type { CompanionState } from "./companion.js"; import type { DailyChallengeState } from "./dailyChallenge.js"; import type { Equipment } from "./equipment.js"; import type { ExplorationState } from "./exploration.js"; +import type { GoddessState } from "./goddessState.js"; import type { Player } from "./player.js"; import type { PrestigeData } from "./prestige.js"; import type { Quest } from "./quest.js"; @@ -94,6 +95,11 @@ interface GameState { */ story?: StoryState; + /** + * Goddess expansion state — optional for backwards compatibility with pre-goddess saves. + */ + goddess?: GoddessState; + /** * Schema version — used to detect saves from older game versions. */ diff --git a/packages/types/src/interfaces/goddessAchievement.ts b/packages/types/src/interfaces/goddessAchievement.ts new file mode 100644 index 0000000..2611787 --- /dev/null +++ b/packages/types/src/interfaces/goddessAchievement.ts @@ -0,0 +1,45 @@ +/** + * @file Goddess Achievement types for the Elysium game. + * @copyright nhcarrigan + * @license Naomi's Public License + * @author Naomi Carrigan + */ + +type GoddessAchievementConditionType = + | "totalPrayersEarned" + | "goddessBossesDefeated" + | "goddessQuestsCompleted" + | "discipleTotal" + | "consecrationCount" + | "goddessEquipmentOwned"; + +interface GoddessAchievementCondition { + type: GoddessAchievementConditionType; + amount: number; +} + +interface GoddessAchievementReward { + divinity?: number; + stardust?: number; +} + +interface GoddessAchievement { + id: string; + name: string; + description: string; + icon: string; + condition: GoddessAchievementCondition; + reward?: GoddessAchievementReward; + + /** + * Unix timestamp when unlocked, null if not yet unlocked. + */ + unlockedAt: number | null; +} + +export type { + GoddessAchievement, + GoddessAchievementCondition, + GoddessAchievementConditionType, + GoddessAchievementReward, +}; diff --git a/packages/types/src/interfaces/goddessBoss.ts b/packages/types/src/interfaces/goddessBoss.ts new file mode 100644 index 0000000..7aa7c90 --- /dev/null +++ b/packages/types/src/interfaces/goddessBoss.ts @@ -0,0 +1,69 @@ +/** + * @file Goddess Boss types for the Elysium game. + * @copyright nhcarrigan + * @license Naomi's Public License + * @author Naomi Carrigan + */ + +type GoddessBossStatus = "locked" | "available" | "in_progress" | "defeated"; + +interface GoddessBoss { + id: string; + name: string; + description: string; + status: GoddessBossStatus; + maxHp: number; + currentHp: number; + + /** + * Damage dealt to disciples per second whilst the fight is active. + */ + damagePerSecond: number; + + /** + * Prayers reward on defeat. + */ + prayersReward: number; + + /** + * Divinity reward on defeat. + */ + divinityReward: number; + + /** + * Stardust reward on defeat. + */ + stardustReward: number; + + /** + * IDs of goddess upgrades unlocked on defeat. + */ + upgradeRewards: Array; + + /** + * IDs of goddess equipment items granted on defeat. + */ + equipmentRewards: Array; + + /** + * Minimum consecration level required to access this boss. + */ + consecrationRequirement: number; + + /** + * Goddess zone this boss belongs to. + */ + zoneId: string; + + /** + * One-time divinity bounty awarded on first-ever defeat. + */ + bountyDivinity: number; + + /** + * Whether the first-kill divinity bounty has already been claimed. + */ + bountyDivinityClaimed?: boolean; +} + +export type { GoddessBoss, GoddessBossStatus }; diff --git a/packages/types/src/interfaces/goddessConsecration.ts b/packages/types/src/interfaces/goddessConsecration.ts new file mode 100644 index 0000000..362bfde --- /dev/null +++ b/packages/types/src/interfaces/goddessConsecration.ts @@ -0,0 +1,75 @@ +/** + * @file Goddess Consecration (prestige) types for the Elysium game. + * @copyright nhcarrigan + * @license Naomi's Public License + * @author Naomi Carrigan + */ + +type ConsecrationUpgradeCategory = + | "prayers" + | "disciples" + | "combat" + | "divinity" + | "utility"; + +interface ConsecrationUpgrade { + id: string; + name: string; + description: string; + category: ConsecrationUpgradeCategory; + divinityCost: number; + + /** + * Multiplier applied when this upgrade is purchased. + */ + multiplier: number; +} + +interface ConsecrationData { + + /** + * Number of times the player has consecrated (goddess prestige). + */ + count: number; + + /** + * Divinity carried over between consecrations. + */ + divinity: number; + + /** + * Multiplier applied to all prayers/s production (based on consecration count). + */ + productionMultiplier: number; + + /** + * IDs of consecration upgrades purchased with divinity. + */ + purchasedUpgradeIds: Array; + + /** + * Unix timestamp of last consecration. + */ + lastConsecratedAt?: number; + + /** + * Pre-computed multiplier from "prayers" divinity upgrades. + */ + divinityPrayersMultiplier?: number; + + /** + * Pre-computed multiplier from "disciples" divinity upgrades. + */ + divinityDisciplesMultiplier?: number; + + /** + * Pre-computed multiplier from "combat" divinity upgrades. + */ + divinityCombatMultiplier?: number; +} + +export type { + ConsecrationData, + ConsecrationUpgrade, + ConsecrationUpgradeCategory, +}; diff --git a/packages/types/src/interfaces/goddessDisciple.ts b/packages/types/src/interfaces/goddessDisciple.ts new file mode 100644 index 0000000..c5f3043 --- /dev/null +++ b/packages/types/src/interfaces/goddessDisciple.ts @@ -0,0 +1,46 @@ +/** + * @file Goddess Disciple types for the Elysium game. + * @copyright nhcarrigan + * @license Naomi's Public License + * @author Naomi Carrigan + */ + +type GoddessDiscipleClass = + | "oracle" + | "seraph" + | "invoker" + | "templar" + | "warden" + | "herald"; + +interface GoddessDisciple { + id: string; + name: string; + class: GoddessDiscipleClass; + level: number; + + /** + * Base cost for the first purchase of this tier (scales by 1.15× per count). + * Paid in prayers. + */ + baseCost: number; + + /** + * Base prayers generated per second. + */ + prayersPerSecond: number; + + /** + * Base divinity generated per second. + */ + divinityPerSecond: number; + + /** + * Combat power per unit — used in goddess boss battle simulation. + */ + combatPower: number; + count: number; + unlocked: boolean; +} + +export type { GoddessDisciple, GoddessDiscipleClass }; diff --git a/packages/types/src/interfaces/goddessEnlightenment.ts b/packages/types/src/interfaces/goddessEnlightenment.ts new file mode 100644 index 0000000..0a30753 --- /dev/null +++ b/packages/types/src/interfaces/goddessEnlightenment.ts @@ -0,0 +1,79 @@ +/** + * @file Goddess Enlightenment (transcendence) types for the Elysium game. + * @copyright nhcarrigan + * @license Naomi's Public License + * @author Naomi Carrigan + */ + +type EnlightenmentUpgradeCategory = + | "prayers" + | "combat" + | "consecration_threshold" + | "consecration_divinity" + | "stardust_meta"; + +interface EnlightenmentUpgrade { + id: string; + name: string; + description: string; + category: EnlightenmentUpgradeCategory; + + /** + * Stardust cost to purchase. + */ + cost: number; + + /** + * Multiplicative effect of this upgrade. + */ + multiplier: number; +} + +interface EnlightenmentData { + + /** + * Number of times the player has achieved Enlightenment. + */ + count: number; + + /** + * Stardust accumulated across all enlightenments. + */ + stardust: number; + + /** + * IDs of stardust upgrades purchased. + */ + purchasedUpgradeIds: Array; + + /** + * Pre-computed: multiplier applied to all passive prayers income. + */ + stardustPrayersMultiplier: number; + + /** + * Pre-computed: multiplier applied to disciple DPS in goddess boss fights. + */ + stardustCombatMultiplier: number; + + /** + * Pre-computed: multiplier applied to the consecration prayers threshold (< 1 lowers requirement). + */ + stardustConsecrationThresholdMultiplier: number; + + /** + * Pre-computed: multiplier applied to divinity earned per consecration. + */ + stardustConsecrationDivinityMultiplier: number; + + /** + * Pre-computed: multiplier applied to stardust yield on future enlightenments. + */ + stardustMetaMultiplier: number; +} + +export type { + EnlightenmentData, + EnlightenmentUpgrade, + EnlightenmentUpgradeCategory, +}; diff --git a/packages/types/src/interfaces/goddessEquipment.ts b/packages/types/src/interfaces/goddessEquipment.ts new file mode 100644 index 0000000..413f39f --- /dev/null +++ b/packages/types/src/interfaces/goddessEquipment.ts @@ -0,0 +1,64 @@ +/** + * @file Goddess Equipment types for the Elysium game. + * @copyright nhcarrigan + * @license Naomi's Public License + * @author Naomi Carrigan + */ + +type GoddessEquipmentType = "relic" | "vestment" | "sigil"; + +type GoddessEquipmentRarity = "common" | "rare" | "epic" | "legendary"; + +interface GoddessEquipmentBonus { + + /** + * Multiplier applied to all prayers/s income (e.g. 1.1 = +10%). + */ + prayersMultiplier?: number; + + /** + * Multiplier applied to all disciple combat power (e.g. 1.25 = +25%). + */ + combatMultiplier?: number; + + /** + * Multiplier applied to divinity earned per consecration (e.g. 1.5 = +50%). + */ + divinityMultiplier?: number; +} + +interface GoddessEquipment { + id: string; + name: string; + description: string; + type: GoddessEquipmentType; + rarity: GoddessEquipmentRarity; + bonus: GoddessEquipmentBonus; + + /** + * Whether the player has acquired this item. + */ + owned: boolean; + + /** + * Whether this item is currently equipped (only one per type can be equipped). + */ + equipped: boolean; + + /** + * If set, this item can be purchased directly rather than obtained via goddess boss drops. + */ + cost?: { prayers: number; divinity: number; stardust: number }; + + /** + * Goddess equipment set this item belongs to, if any. + */ + setId?: string; +} + +export type { + GoddessEquipment, + GoddessEquipmentBonus, + GoddessEquipmentRarity, + GoddessEquipmentType, +}; diff --git a/packages/types/src/interfaces/goddessExploration.ts b/packages/types/src/interfaces/goddessExploration.ts new file mode 100644 index 0000000..8916a05 --- /dev/null +++ b/packages/types/src/interfaces/goddessExploration.ts @@ -0,0 +1,123 @@ +/** + * @file Goddess Exploration types for the Elysium game. + * @copyright nhcarrigan + * @license Naomi's Public License + * @author Naomi Carrigan + */ + +type GoddessExplorationEventEffectType = + | "prayers_gain" + | "prayers_loss" + | "divinity_gain" + | "sacred_material_gain" + | "disciple_loss"; + +interface GoddessExplorationEventEffect { + type: GoddessExplorationEventEffectType; + + /** + * Prayers amount for prayers_gain / prayers_loss. + */ + amount?: number; + + /** + * Sacred material ID for sacred_material_gain. + */ + materialId?: string; + + /** + * Quantity for sacred_material_gain. + */ + quantity?: number; + + /** + * Fraction (0–1) of total disciples lost for disciple_loss. + */ + fraction?: number; +} + +interface GoddessExplorationEvent { + id: string; + text: string; + effect: GoddessExplorationEventEffect; +} + +interface GoddessExplorationMaterialDrop { + materialId: string; + minQuantity: number; + maxQuantity: number; + + /** + * Relative probability weight — higher = more likely. + */ + weight: number; +} + +interface GoddessExplorationArea { + id: string; + name: string; + description: string; + zoneId: string; + durationSeconds: number; + possibleMaterials: Array; + events: Array; +} + +interface GoddessExplorationAreaState { + id: string; + status: "locked" | "available" | "in_progress" | "completed"; + + /** + * Unix timestamp when exploration started (set when status becomes in_progress). + */ + startedAt?: number; + + /** + * Unix timestamp when the exploration will complete. + */ + endsAt?: number; + + /** + * True after the first successful collect — used for codex unlock detection. + */ + completedOnce?: boolean; +} + +interface GoddessExplorationState { + areas: Array; + + /** + * Current sacred material inventory. + */ + materials: Array<{ materialId: string; quantity: number }>; + + /** + * IDs of goddess crafting recipes that have been crafted (resets on consecration). + */ + craftedRecipeIds: Array; + + /** + * Pre-computed prayers income multiplier from all crafted goddess recipes. + */ + craftedPrayersMultiplier: number; + + /** + * Pre-computed divinity income multiplier from all crafted goddess recipes. + */ + craftedDivinityMultiplier: number; + + /** + * Pre-computed combat power multiplier from all crafted goddess recipes. + */ + craftedCombatMultiplier: number; +} + +export type { + GoddessExplorationArea, + GoddessExplorationAreaState, + GoddessExplorationEvent, + GoddessExplorationEventEffect, + GoddessExplorationEventEffectType, + GoddessExplorationMaterialDrop, + GoddessExplorationState, +}; diff --git a/packages/types/src/interfaces/goddessQuest.ts b/packages/types/src/interfaces/goddessQuest.ts new file mode 100644 index 0000000..c3d66c7 --- /dev/null +++ b/packages/types/src/interfaces/goddessQuest.ts @@ -0,0 +1,71 @@ +/** + * @file Goddess Quest types for the Elysium game. + * @copyright nhcarrigan + * @license Naomi's Public License + * @author Naomi Carrigan + */ + +type GoddessQuestStatus = "locked" | "available" | "active" | "completed"; + +type GoddessQuestRewardType = + | "prayers" + | "divinity" + | "stardust" + | "upgrade" + | "disciple" + | "equipment"; + +interface GoddessQuestReward { + type: GoddessQuestRewardType; + amount?: number; + + /** + * ID of the goddess upgrade or disciple to unlock (if applicable). + */ + targetId?: string; +} + +interface GoddessQuest { + id: string; + name: string; + description: string; + status: GoddessQuestStatus; + + /** + * Unix timestamp when quest was started (if active). + */ + startedAt?: number; + + /** + * Duration in seconds. + */ + durationSeconds: number; + rewards: Array; + + /** + * IDs of goddess quests that must be completed before this one unlocks. + */ + prerequisiteIds: Array; + + /** + * Goddess zone this quest belongs to. + */ + zoneId: string; + + /** + * Minimum disciple combat power required to start this quest. + */ + combatPowerRequired?: number; + + /** + * Unix timestamp of the most recent failed attempt (if any). + */ + lastFailedAt?: number; +} + +export type { + GoddessQuest, + GoddessQuestReward, + GoddessQuestRewardType, + GoddessQuestStatus, +}; diff --git a/packages/types/src/interfaces/goddessState.ts b/packages/types/src/interfaces/goddessState.ts new file mode 100644 index 0000000..f1712fd --- /dev/null +++ b/packages/types/src/interfaces/goddessState.ts @@ -0,0 +1,76 @@ +/** + * @file Goddess expansion state types for the Elysium game. + * @copyright nhcarrigan + * @license Naomi's Public License + * @author Naomi Carrigan + */ +import type { GoddessAchievement } from "./goddessAchievement.js"; +import type { GoddessBoss } from "./goddessBoss.js"; +import type { ConsecrationData } from "./goddessConsecration.js"; +import type { GoddessDisciple } from "./goddessDisciple.js"; +import type { EnlightenmentData } from "./goddessEnlightenment.js"; +import type { GoddessEquipment } from "./goddessEquipment.js"; +import type { GoddessExplorationState } from "./goddessExploration.js"; +import type { GoddessQuest } from "./goddessQuest.js"; +import type { GoddessUpgrade } from "./goddessUpgrade.js"; +import type { GoddessZone } from "./goddessZone.js"; + +interface GoddessState { + zones: Array; + bosses: Array; + quests: Array; + disciples: Array; + equipment: Array; + upgrades: Array; + achievements: Array; + consecration: ConsecrationData; + enlightenment: EnlightenmentData; + exploration: GoddessExplorationState; + + /** + * Total prayers earned in the current consecration run (resets on consecration). + */ + totalPrayersEarned: number; + + /** + * Total prayers earned across all time (never resets — used for achievements and unlock thresholds). + */ + lifetimePrayersEarned: number; + + /** + * Total goddess bosses defeated across all time. + */ + lifetimeBossesDefeated: number; + + /** + * Total goddess quests completed across all time. + */ + lifetimeQuestsCompleted: number; + + /** + * Click power for the goddess realm (prayers per click, before upgrades). + */ + baseClickPower: number; + + /** + * Unix timestamp of the last goddess-side client tick. + */ + lastTickAt: number; + + /** + * When true, the tick engine automatically starts the highest-zone available goddess quest. + */ + autoQuest?: boolean; + + /** + * When true, the tick engine automatically challenges the highest available goddess boss. + */ + autoBoss?: boolean; + + /** + * When true, the tick engine automatically purchases the highest-tier affordable disciple. + */ + autoDisciple?: boolean; +} + +export type { GoddessState }; diff --git a/packages/types/src/interfaces/goddessUpgrade.ts b/packages/types/src/interfaces/goddessUpgrade.ts new file mode 100644 index 0000000..cd24f82 --- /dev/null +++ b/packages/types/src/interfaces/goddessUpgrade.ts @@ -0,0 +1,37 @@ +/** + * @file Goddess Upgrade types for the Elysium game. + * @copyright nhcarrigan + * @license Naomi's Public License + * @author Naomi Carrigan + */ + +type GoddessUpgradeTarget = + | "prayers" + | "disciple" + | "global" + | "consecration" + | "boss"; + +interface GoddessUpgrade { + id: string; + name: string; + description: string; + target: GoddessUpgradeTarget; + + /** + * ID of the disciple this applies to (if target is "disciple"). + */ + discipleId?: string; + + /** + * Multiplier applied to the target's output. + */ + multiplier: number; + costPrayers: number; + costDivinity: number; + costStardust: number; + purchased: boolean; + unlocked: boolean; +} + +export type { GoddessUpgrade, GoddessUpgradeTarget }; diff --git a/packages/types/src/interfaces/goddessZone.ts b/packages/types/src/interfaces/goddessZone.ts new file mode 100644 index 0000000..a15249f --- /dev/null +++ b/packages/types/src/interfaces/goddessZone.ts @@ -0,0 +1,28 @@ +/** + * @file Goddess Zone types for the Elysium game. + * @copyright nhcarrigan + * @license Naomi's Public License + * @author Naomi Carrigan + */ + +type GoddessZoneStatus = "locked" | "unlocked"; + +interface GoddessZone { + id: string; + name: string; + description: string; + emoji: string; + status: GoddessZoneStatus; + + /** + * Goddess boss ID whose defeat is required to unlock this zone (null for the starter zone). + */ + unlockBossId: string | null; + + /** + * Goddess quest ID that must be completed to unlock this zone (null for the starter zone). + */ + unlockQuestId: string | null; +} + +export type { GoddessZone, GoddessZoneStatus }; diff --git a/packages/types/src/interfaces/resource.ts b/packages/types/src/interfaces/resource.ts index 2b3af1b..068eb8c 100644 --- a/packages/types/src/interfaces/resource.ts +++ b/packages/types/src/interfaces/resource.ts @@ -10,6 +10,13 @@ interface Resource { essence: number; crystals: number; runestones: number; + + /** + * Goddess expansion currencies — optional for backwards compatibility with pre-goddess saves. + */ + prayers?: number; + divinity?: number; + stardust?: number; } export type { Resource };