feat: initial prototype — core game systems (#30)
Security Scan and Upload / Security & DefectDojo Upload (push) Successful in 1m1s
CI / Lint, Build & Test (push) Successful in 1m6s

## Summary

This PR represents the full v1 prototype, implementing the core game systems for Elysium.

- Full idle/clicker RPG loop: resource collection, crafting, boss fights, exploration, and quests
- Adventurer hiring with batch size selector and progressive tier cost scaling
- Prestige, transcendence, and apotheosis systems with auto-prestige support
- Character sheet, titles, leaderboards, companion system, and daily login bonuses
- Auto-quest and auto-boss toggles
- Discord webhook notifications on prestige/transcendence/apotheosis
- Discord role awarded on apotheosis
- Responsive design and overarching story/lore system
- In-game sound effects and browser notifications for key events
- Support link button in the resource bar
- Full test coverage (100% on `apps/api` and `packages/types`)
- CI pipeline: lint → build → test

## Closes

Closes #1
Closes #2
Closes #3
Closes #4
Closes #5
Closes #6
Closes #7
Closes #8
Closes #9
Closes #10
Closes #11
Closes #12
Closes #13
Closes #14
Closes #16
Closes #19
Closes #20
Closes #21
Closes #22
Closes #23
Closes #24
Closes #25
Closes #26
Closes #27
Closes #29

 This issue was created with help from Hikari~ 🌸

Co-authored-by: Naomi Carrigan <commits@nhcarrigan.com>
Reviewed-on: #30
Co-authored-by: Hikari <hikari@nhcarrigan.com>
Co-committed-by: Hikari <hikari@nhcarrigan.com>
This commit was merged in pull request #30.
This commit is contained in:
2026-03-08 15:53:39 -07:00
committed by Naomi Carrigan
parent c69e155de3
commit 29c817230d
172 changed files with 50706 additions and 0 deletions
File diff suppressed because it is too large Load Diff
+111
View File
@@ -0,0 +1,111 @@
/**
* @file Equipment set data for Elysium.
* @copyright nhcarrigan
* @license Naomi's Public License
* @author Naomi Carrigan
*/
/* eslint-disable @typescript-eslint/naming-convention -- Snake_case IDs and numeric keys are conventional for game data */
/* eslint-disable stylistic/max-len -- Long description strings cannot be split */
import type { EquipmentSet } from "@elysium/types";
export const EQUIPMENT_SETS: Array<EquipmentSet> = [
{
bonuses: {
2: { goldMultiplier: 1.1 },
3: { combatMultiplier: 1.1 },
},
description:
"The armaments of a seasoned guild soldier — proven steel, reliable gold.",
id: "iron_vanguard",
name: "Iron Vanguard",
pieces: [ "iron_sword", "chainmail", "mages_focus" ],
},
{
bonuses: {
2: { goldMultiplier: 1.15 },
3: { clickMultiplier: 1.2 },
},
description:
"Gear forged from the Shadow Marshes themselves — unseen, unstoppable.",
id: "shadow_infiltrator",
name: "Shadow Infiltrator",
pieces: [ "shadow_dagger", "void_shroud", "void_compass" ],
},
{
bonuses: {
2: { combatMultiplier: 1.15 },
3: { goldMultiplier: 1.15 },
},
description:
"Weapons and armour tempered in the depths of the Volcanic Reaches.",
id: "volcanic_forger",
name: "Volcanic Forger",
pieces: [ "flame_lance", "volcanic_plate", "crystal_shard" ],
},
{
bonuses: {
2: { combatMultiplier: 1.2 },
3: { goldMultiplier: 1.2 },
},
description:
"Relics of the Celestial Reaches — divine power made manifest.",
id: "celestial_guardian",
name: "Celestial Guardian",
pieces: [ "seraph_wing", "celestial_armour", "angels_halo" ],
},
{
bonuses: {
2: { goldMultiplier: 1.2 },
3: { clickMultiplier: 1.25 },
},
description:
"Trophies reclaimed from the deepest trenches of the Abyssal Reaches.",
id: "abyssal_predator",
name: "Abyssal Predator",
pieces: [ "depth_blade", "pressure_plate", "leviathan_eye" ],
},
{
bonuses: {
2: { combatMultiplier: 1.25 },
3: { goldMultiplier: 1.25 },
},
description:
"Forged in the heart of the Infernal Court from the essence of the defeated.",
id: "infernal_conqueror",
name: "Infernal Conqueror",
pieces: [ "hellfire_edge", "demon_hide", "soul_gem" ],
},
{
bonuses: {
2: { clickMultiplier: 1.25 },
3: { goldMultiplier: 1.25 },
},
description:
"Instruments of the Crystalline Spire — reality refracted into absolute efficiency.",
id: "crystal_domain",
name: "Crystal Domain",
pieces: [ "prism_blade", "faceted_armour", "prism_eye" ],
},
{
bonuses: {
2: { goldMultiplier: 1.3 },
3: { combatMultiplier: 1.3 },
},
description:
"The regalia of the Void Sanctum's lord — power carved from absolute nothingness.",
id: "void_emperor",
name: "Void Emperor",
pieces: [ "void_annihilator", "eternal_shroud", "void_heart_gem" ],
},
{
bonuses: {
2: { combatMultiplier: 1.35, goldMultiplier: 1.25 },
3: { clickMultiplier: 1.35 },
},
description:
"The armaments of the Eternal Throne — weapons and armour that have endured all of time.",
id: "eternal_throne",
name: "Eternal Throne",
pieces: [ "throne_blade", "eternal_armour", "eternity_stone" ],
},
];
+630
View File
@@ -0,0 +1,630 @@
/**
* @file Exploration area data for Elysium.
* @copyright nhcarrigan
* @license Naomi's Public License
* @author Naomi Carrigan
*/
/* eslint-disable @typescript-eslint/naming-convention -- Snake_case IDs are conventional for game data */
/* eslint-disable stylistic/max-len -- Long description strings cannot be split */
/* eslint-disable max-lines -- Data file necessarily exceeds line limit */
export interface ExplorationAreaSummary {
id: string;
name: string;
description: string;
zoneId: string;
durationSeconds: number;
}
export const EXPLORATION_AREAS: Array<ExplorationAreaSummary> = [
// Zone 1: verdant_vale
{
description:
"Rolling fields of wildflowers at the edge of the guild's territory. Travellers pass through often, and occasionally leave things behind.",
durationSeconds: 3600,
id: "verdant_meadow",
name: "The Verdant Meadow",
zoneId: "verdant_vale",
},
{
description:
"Ancient trees whose canopy blocks out most of the light. The forest whispers things your scouts swear they understand, just not when they try to remember later.",
durationSeconds: 7200,
id: "whispering_forest",
name: "The Whispering Forest",
zoneId: "verdant_vale",
},
{
description:
"A circle of trees so old they predate the kingdom. Druids once held ceremonies here. The trees remember, and their bark holds echoes of old power.",
durationSeconds: 10_800,
id: "ancient_grove",
name: "The Ancient Grove",
zoneId: "verdant_vale",
},
{
description:
"A clearing the locals will not enter after dark. Something about the bark of the trees here is different. Your scouts feel watched the entire time.",
durationSeconds: 14_400,
id: "forbidden_glen",
name: "The Forbidden Glen",
zoneId: "verdant_vale",
},
// Zone 2: shattered_ruins
{
description:
"What was once a military garrison, now half-buried in rubble and wild growth. The previous occupants left in a hurry and did not take everything.",
durationSeconds: 7200,
id: "collapsed_outpost",
name: "The Collapsed Outpost",
zoneId: "shattered_ruins",
},
{
description:
"The water here reflects things that aren't there. Something is at the bottom that doesn't want to be found, which means your scouts want very much to find it.",
durationSeconds: 14_400,
id: "cursed_lake",
name: "The Cursed Lake",
zoneId: "shattered_ruins",
},
{
description:
"Buried walls covered in script no living scholar can read. The knowledge is lost but the enchantments remain, faded but still murmuring in the stone.",
durationSeconds: 21_600,
id: "runic_archive",
name: "The Runic Archive",
zoneId: "shattered_ruins",
},
{
description:
"The chamber the elder dragon called his own before your guild deposed him. He won't be back soon. Probably. The heat of his presence lingers in the stone.",
durationSeconds: 28_800,
id: "dragon_throne",
name: "The Dragon's Throne",
zoneId: "shattered_ruins",
},
// Zone 3: frozen_peaks
{
description:
"A cave carved by a glacier over thousands of years. The ice walls are so clear you can see things preserved within them from before the kingdom existed.",
durationSeconds: 10_800,
id: "glacial_cave",
name: "The Glacial Cave",
zoneId: "frozen_peaks",
},
{
description:
"Flat, white, and vast. The tundra looks featureless until you know what to look for. Under the ice, there are things that were buried with intent.",
durationSeconds: 21_600,
id: "frozen_tundra",
name: "The Frozen Tundra",
zoneId: "frozen_peaks",
},
{
description:
"A tear in reality that appeared after the Void Titan's defeat, miles above the world. Something leaks through it constantly. Mostly harmless. Mostly.",
durationSeconds: 32_400,
id: "void_rift",
name: "The Void Rift",
zoneId: "frozen_peaks",
},
{
description:
"At the absolute peak, a shrine nobody remembers building. The prayers still tied to its poles are in a language no scholar has identified. Offerings remain.",
durationSeconds: 43_200,
id: "summit_shrine",
name: "The Summit Shrine",
zoneId: "frozen_peaks",
},
// Zone 4: shadow_marshes
{
description:
"A depression in the marsh where the fog never fully lifts. Sound behaves differently here. Your scouts can hear things they probably should not.",
durationSeconds: 18_000,
id: "fog_hollow",
name: "The Fog Hollow",
zoneId: "shadow_marshes",
},
{
description:
"A cave system beneath the marsh floor. The water drips through the ceiling in patterns that look deliberate. Nothing down here needs eyes to find you.",
durationSeconds: 36_000,
id: "dark_grotto",
name: "The Dark Grotto",
zoneId: "shadow_marshes",
},
{
description:
"A burial mound. Something was interred here that should not have been — or perhaps something interred itself, which is a different and more troubling problem.",
durationSeconds: 54_000,
id: "cursed_barrow",
name: "The Cursed Barrow",
zoneId: "shadow_marshes",
},
{
description:
"The bottommost point of the Shadow Marshes, where the water is perfectly still and perfectly black. Your scouts can see the bottom. The bottom is very far down.",
durationSeconds: 72_000,
id: "marsh_depths",
name: "The Marsh Depths",
zoneId: "shadow_marshes",
},
// Zone 5: volcanic_depths
{
description:
"A natural tunnel cut by ancient lava flows. Still warm. The walls glow faintly orange in some sections, which is either residual heat or something else.",
durationSeconds: 25_200,
id: "magma_tunnel",
name: "The Magma Tunnel",
zoneId: "volcanic_depths",
},
{
description:
"An ancient workshop space, built into the volcano by whoever the fire elementals served before they served no one. The fires here never went out.",
durationSeconds: 50_400,
id: "forge_chamber",
name: "The Forge Chamber",
zoneId: "volcanic_depths",
},
{
description:
"A place of worship for entities that have never met a god but found the general idea appealing and decided to be worshipped instead. The fire elementals receive visitors here.",
durationSeconds: 75_600,
id: "fire_temple",
name: "The Fire Temple",
zoneId: "volcanic_depths",
},
{
description:
"The lowest point your guild can reach — close enough to the planet's core that the rocks bleed metal and the air shimmers with heat haze that never quite resolves into anything.",
durationSeconds: 100_800,
id: "core_descent",
name: "The Core Descent",
zoneId: "volcanic_depths",
},
// Zone 6: astral_void
{
description:
"Open void between reality and whatever lies beyond it. Stars in various states of life and death drift past. Your scouts learn very quickly not to touch them.",
durationSeconds: 36_000,
id: "star_field",
name: "The Star Field",
zoneId: "astral_void",
},
{
description:
"A region where every possible outcome is equally real and they jostle each other for space. Your scouts exist in several states simultaneously here and find it disorienting.",
durationSeconds: 72_000,
id: "probability_sea",
name: "The Probability Sea",
zoneId: "astral_void",
},
{
description:
"A river of nothing flowing through the void. It carries things from everywhere to nowhere. Some of those things are valuable, if you know how to fish from a river of nothing.",
durationSeconds: 108_000,
id: "void_current",
name: "The Void Current",
zoneId: "astral_void",
},
{
description:
"The highest point of the astral void, where nothing exists so thoroughly that it becomes a kind of substance. Your scouts feel, for a moment, what it is like to be absolutely alone in all of existence.",
durationSeconds: 144_000,
id: "null_zenith",
name: "The Null Zenith",
zoneId: "astral_void",
},
// Zone 7: celestial_reaches
{
description:
"A tower of compressed light older than the concept of architecture. The celestial host uses it as a marker. Your guild uses it as a starting point.",
durationSeconds: 43_200,
id: "light_spire",
name: "The Light Spire",
zoneId: "celestial_reaches",
},
{
description:
"Where the celestial choir rehearses, continuously, for a performance that has been ongoing since before your world had an audience. The harmonics do things to objects in the vicinity.",
durationSeconds: 86_400,
id: "choir_hall",
name: "The Choir Hall",
zoneId: "celestial_reaches",
},
{
description:
"Where the celestial host adjudicates disputes that have been ongoing since before your sun was lit. The proceedings are extremely formal. Interrupting them is inadvisable.",
durationSeconds: 129_600,
id: "divine_court",
name: "The Divine Court",
zoneId: "celestial_reaches",
},
{
description:
"Where the celestial host stores things they consider too valuable to use and too important to discard. Your guild has different ideas about what 'valuable' means.",
durationSeconds: 172_800,
id: "celestial_vault",
name: "The Celestial Vault",
zoneId: "celestial_reaches",
},
// Zone 8: abyssal_trench
{
description:
"The lip of the trench, where the shelf drops away into depths that swallow light entirely. Your scouts can hear something breathing, very slowly, from far below.",
durationSeconds: 50_400,
id: "trench_entrance",
name: "The Trench Entrance",
zoneId: "abyssal_trench",
},
{
description:
"An underwater river at a depth that should be impossible to survive. Your scouts have learned, by necessity, to survive it anyway.",
durationSeconds: 100_800,
id: "deep_current",
name: "The Deep Current",
zoneId: "abyssal_trench",
},
{
description:
"A space at the bottom of the trench so far from light that light has no meaning here. Something has been in this chamber for so long it no longer needs to breathe.",
durationSeconds: 151_200,
id: "sunless_chamber",
name: "The Sunless Chamber",
zoneId: "abyssal_trench",
},
{
description:
"The absolute bottom of the trench. Something is here. It has been here since before your world was made. It is, today, patient. Your scouts are not sure this is always the case.",
durationSeconds: 201_600,
id: "the_waiting_place",
name: "The Waiting Place",
zoneId: "abyssal_trench",
},
// Zone 9: infernal_court
{
description:
"An open-air market in the court's outer districts. The vendors sell things that were not legally obtained, in exchange for things that should not legally exist.",
durationSeconds: 57_600,
id: "demon_market",
name: "The Demon Market",
zoneId: "infernal_court",
},
{
description:
"Where the court processes those who lost their cases. Your scouts move through it quickly and look at nothing. They still hear everything.",
durationSeconds: 115_200,
id: "torment_hall",
name: "The Torment Hall",
zoneId: "infernal_court",
},
{
description:
"The court's industrial district, where deals are processed and the residue of completed contracts is extracted. The machinery runs on something the court considers renewable.",
durationSeconds: 172_800,
id: "soul_forge",
name: "The Soul Forge",
zoneId: "infernal_court",
},
{
description:
"The inner sanctum of the infernal court, where the demon lords make decisions that echo across aeons. Your guild should not be here. Your guild is here anyway.",
durationSeconds: 230_400,
id: "lords_chamber",
name: "The Lords' Chamber",
zoneId: "infernal_court",
},
// Zone 10: crystalline_spire
{
description:
"The outer surface of the spire, where thousands of crystal facets reflect realities that are not the one you arrived in. Your scouts learn to focus on the ground in front of them.",
durationSeconds: 64_800,
id: "facet_approach",
name: "The Facet Approach",
zoneId: "crystalline_spire",
},
{
description:
"A room inside the spire where the intelligence runs its oldest and most complex calculations. The numbers on the walls change too fast to read. The calculations are always correct.",
durationSeconds: 129_600,
id: "calculation_chamber",
name: "The Calculation Chamber",
zoneId: "crystalline_spire",
},
{
description:
"A corridor of perfect mirrors that show not reflections but what might have been. Your scouts avoid eye contact with their alternates. The alternates do not always extend the same courtesy.",
durationSeconds: 194_400,
id: "mirror_hall",
name: "The Mirror Hall",
zoneId: "crystalline_spire",
},
{
description:
"The deepest point of the spire, where the intelligence's primary substrate runs continuously. The hum of calculation is felt in the bones. Numbers that have never been numbers drift past.",
durationSeconds: 259_200,
id: "core_access",
name: "The Core Access",
zoneId: "crystalline_spire",
},
// Zone 11: void_sanctum
{
description:
"The entrance to the void sanctum, where the rules of existence become suggestions. Your scouts describe the crossing as like stepping sideways and arriving somewhere that was always there.",
durationSeconds: 72_000,
id: "threshold",
name: "The Threshold",
zoneId: "void_sanctum",
},
{
description:
"A place inside the sanctum where everything is perfectly quiet because nothing exists to make noise. Your scouts can hear their own thoughts very clearly here. Some of them find this unsettling.",
durationSeconds: 144_000,
id: "inner_silence",
name: "The Inner Silence",
zoneId: "void_sanctum",
},
{
description:
"A space inside the sanctum where something is calling out, continuously, to something that has not yet answered. The call is beautiful and deeply wrong.",
durationSeconds: 216_000,
id: "resonance_chamber",
name: "The Resonance Chamber",
zoneId: "void_sanctum",
},
{
description:
"The source of the call. Something here has been reaching out for so long it no longer remembers what it is reaching toward. Your guild's arrival is, perhaps, an answer.",
durationSeconds: 288_000,
id: "sanctum_heart",
name: "The Sanctum Heart",
zoneId: "void_sanctum",
},
// Zone 12: eternal_throne
{
description:
"The long road to the eternal throne. Countless beings have walked it, seeking audience, seeking power, seeking something the throne has always already decided about them.",
durationSeconds: 79_200,
id: "throne_approach",
name: "The Throne Approach",
zoneId: "eternal_throne",
},
{
description:
"The ante-chamber of absolute power. Records are kept here of everything that has ever been ruled and everything that has ever been lost. The records go back further than memory.",
durationSeconds: 158_400,
id: "dominion_hall",
name: "The Dominion Hall",
zoneId: "eternal_throne",
},
{
description:
"Where things are stored that have nowhere else to go. Objects of power that cannot be used, secrets that cannot be shared, and wealth that belongs to entities that stopped existing before your world was born.",
durationSeconds: 237_600,
id: "eternity_vault",
name: "The Eternity Vault",
zoneId: "eternal_throne",
},
{
description:
"The eternal throne itself. Whoever sits here has sat here since the beginning. They observe your guild's presence with neither surprise nor emotion. They have been expecting you. They have been expecting everyone.",
durationSeconds: 316_800,
id: "the_seat",
name: "The Seat",
zoneId: "eternal_throne",
},
// Zone 13: primordial_chaos
{
description:
"A permanent storm at the edge of the chaos zone where things are constantly being made and unmade simultaneously. Your scouts move through it quickly and try not to look at what they might become.",
durationSeconds: 86_400,
id: "creation_storm",
name: "The Creation Storm",
zoneId: "primordial_chaos",
},
{
description:
"A vast ocean of something that is exactly the opposite of matter. Your scouts cross it by not thinking too hard about what they are standing on.",
durationSeconds: 172_800,
id: "unmaking_sea",
name: "The Unmaking Sea",
zoneId: "primordial_chaos",
},
{
description:
"A space where all possible outcomes already happened and none of them mattered. Your scouts find this philosophically challenging and practically navigable.",
durationSeconds: 259_200,
id: "probability_void",
name: "The Probability Void",
zoneId: "primordial_chaos",
},
{
description:
"The centre of all primordial chaos. Everything is here and nothing is here and both statements are entirely accurate. Your scouts report the experience as indescribable, then describe it for three hours.",
durationSeconds: 345_600,
id: "chaos_core",
name: "The Chaos Core",
zoneId: "primordial_chaos",
},
// Zone 14: infinite_expanse
{
description:
"The first horizon you reach in the infinite expanse, which looks exactly like the starting point from behind but is provably, mathematically, somewhere else. Your scouts are sceptical but cannot argue with the math.",
durationSeconds: 93_600,
id: "first_horizon",
name: "The First Horizon",
zoneId: "infinite_expanse",
},
{
description:
"There is no centre of the infinite expanse. This is the centre of the infinite expanse. Both things are true. Your scouts have stopped asking questions and started collecting samples.",
durationSeconds: 187_200,
id: "middle_nowhere",
name: "The Middle of Nowhere",
zoneId: "infinite_expanse",
},
{
description:
"The road toward the edge that the expanse does not have. Your scouts know it does not exist. They are getting closer to it anyway.",
durationSeconds: 280_800,
id: "edge_approach",
name: "The Edge Approach",
zoneId: "infinite_expanse",
},
{
description:
"As far as any being has ever gone in the infinite expanse. Your scouts hold this record now. They are not entirely sure whether to be proud or frightened.",
durationSeconds: 374_400,
id: "the_furthest",
name: "The Furthest",
zoneId: "infinite_expanse",
},
// Zone 15: reality_forge
{
description:
"The outer area of the reality forge, where the overflow of unrealised realities pools and cools. Things that never quite existed are everywhere here, and some of them are extremely useful.",
durationSeconds: 100_800,
id: "workshop_entrance",
name: "The Workshop Entrance",
zoneId: "reality_forge",
},
{
description:
"Where realities are assembled from the raw components of existence. The work here is continuous and has been going on since before your universe was queued.",
durationSeconds: 201_600,
id: "creation_floor",
name: "The Creation Floor",
zoneId: "reality_forge",
},
{
description:
"The primary forging station, where major realities are hammered into their final shape. The hammers are larger than planets. The anvil has never been named because no one has ever successfully described it.",
durationSeconds: 302_400,
id: "master_forge",
name: "The Master Forge",
zoneId: "reality_forge",
},
{
description:
"The energy source that powers the entire reality forge. It has been running since before time was a meaningful concept. What powers it is not a question that has been answered by anyone who came here to ask it.",
durationSeconds: 403_200,
id: "forge_core",
name: "The Forge Core",
zoneId: "reality_forge",
},
// Zone 16: cosmic_maelstrom
{
description:
"The outermost spiral of the cosmic maelstrom, where the forces are at their most navigable — which still means they routinely shatter planets that wander too close.",
durationSeconds: 108_000,
id: "outer_current",
name: "The Outer Current",
zoneId: "cosmic_maelstrom",
},
{
description:
"The accumulated wreckage of everything the maelstrom has consumed, compressed into a navigable (mostly) field. Your scouts move through it quickly. Things in debris fields become part of the debris field.",
durationSeconds: 216_000,
id: "debris_field",
name: "The Debris Field",
zoneId: "cosmic_maelstrom",
},
{
description:
"Where the fundamental forces of the cosmos intersect inside the maelstrom. Gravity and electromagnetism and things that do not have names yet jostle each other here with consequences that exceed polite description.",
durationSeconds: 324_000,
id: "force_confluence",
name: "The Force Confluence",
zoneId: "cosmic_maelstrom",
},
{
description:
"The path to the maelstrom's impossible centre — the one point of absolute calm surrounded by forces that make galaxies look fragile. Your scouts have never been so far in. They are doing this anyway.",
durationSeconds: 432_000,
id: "eye_approach",
name: "The Eye Approach",
zoneId: "cosmic_maelstrom",
},
// Zone 17: primeval_sanctum
{
description:
"The entrance to the oldest place. The floor here was walked before walking was invented, which is philosophically impossible and physically evident.",
durationSeconds: 115_200,
id: "first_steps",
name: "The First Steps",
zoneId: "primeval_sanctum",
},
{
description:
"A collection of records that predate the concept of records. The information stored here concerns things that no longer exist, but the records persist because the sanctum will not let them stop.",
durationSeconds: 230_400,
id: "ancient_archive",
name: "The Ancient Archive",
zoneId: "primeval_sanctum",
},
{
description:
"Where the sanctum stores the memory of the first moment of existence. The memory is perfect, complete, and overwhelming. Your scouts spend the minimum time here and speak little for some time after.",
durationSeconds: 345_600,
id: "memory_chamber",
name: "The Memory Chamber",
zoneId: "primeval_sanctum",
},
{
description:
"There is nothing older than this. The sanctum's deepest point, where the very first thing that ever was still is, unchanged, because nothing in the universe has had long enough to change it.",
durationSeconds: 460_800,
id: "the_oldest_place",
name: "The Oldest Place",
zoneId: "primeval_sanctum",
},
// Zone 18: the_absolute
{
description:
"The boundary between existence and non-existence. On one side: everything there is. On the other: everything there isn't. The view from here is indescribable and has been described by your scouts at length.",
durationSeconds: 129_600,
id: "edge_of_everything",
name: "The Edge of Everything",
zoneId: "the_absolute",
},
{
description:
"The road to the final truth, which your guild has been walking toward since the first step in the Verdant Vale. It looks like every other road your guild has walked. It feels different.",
durationSeconds: 259_200,
id: "truth_approach",
name: "The Truth Approach",
zoneId: "the_absolute",
},
{
description:
"One step from the absolute. The door ahead is the last door. Your guild has opened every other door. This one opens when you are ready, which is something only the absolute can determine.",
durationSeconds: 388_800,
id: "final_antechamber",
name: "The Final Antechamber",
zoneId: "the_absolute",
},
{
description:
"The final truth, at the end of all things. There is nothing beyond this. Your guild stands here, at the end, and finds that the end is not empty. It has been waiting for you specifically.",
durationSeconds: 518_400,
id: "the_absolute_heart",
name: "The Absolute Heart",
zoneId: "the_absolute",
},
];
+480
View File
@@ -0,0 +1,480 @@
/**
* @file Crafting material data for Elysium.
* @copyright nhcarrigan
* @license Naomi's Public License
* @author Naomi Carrigan
*/
/* eslint-disable @typescript-eslint/naming-convention -- Snake_case IDs are conventional for game data */
/* eslint-disable stylistic/max-len -- Long description strings cannot be split */
/* eslint-disable max-lines -- Data file necessarily exceeds line limit */
import type { Material } from "@elysium/types";
export const MATERIALS: Array<Material> = [
// Zone 1: verdant_vale
{
description:
"Sticky resin tapped from ancient heartwood trees. Smells faintly of spring rain and something older beneath.",
id: "verdant_sap",
name: "Verdant Sap",
rarity: "common",
zoneId: "verdant_vale",
},
{
description:
"A translucent gem found buried near the roots of old-growth trees. Pulses with gentle life energy when held.",
id: "forest_crystal",
name: "Forest Crystal",
rarity: "uncommon",
zoneId: "verdant_vale",
},
{
description:
"Bark from a tree that has stood since before the kingdom. Harder than iron and warmer to the touch than it has any right to be.",
id: "elder_bark",
name: "Elder Bark",
rarity: "rare",
zoneId: "verdant_vale",
},
// Zone 2: shattered_ruins
{
description:
"Fine powder ground from fallen masonry. Still carries traces of the civilisation it once was — if you know how to read the patterns.",
id: "ruin_dust",
name: "Ruin Dust",
rarity: "common",
zoneId: "shattered_ruins",
},
{
description:
"A shard of enchanted stonework. The enchantment is broken, but something lingers in the grain of the stone, waiting.",
id: "cursed_fragment",
name: "Cursed Fragment",
rarity: "uncommon",
zoneId: "shattered_ruins",
},
{
description:
"A fragment of scale shed during the elder dragon's long reign over the ruins. Resistant to fire and magic alike.",
id: "dragonscale_chip",
name: "Dragonscale Chip",
rarity: "rare",
zoneId: "shattered_ruins",
},
// Zone 3: frozen_peaks
{
description:
"Ice from a glacier that has not moved in ten thousand years. Impossibly cold and perfectly clear, with something almost visible within.",
id: "glacial_ice",
name: "Glacial Ice",
rarity: "common",
zoneId: "frozen_peaks",
},
{
description:
"A crystal that formed inside the glacier itself over millennia. It never melts, not even near fire.",
id: "frost_crystal",
name: "Frost Crystal",
rarity: "uncommon",
zoneId: "frozen_peaks",
},
{
description:
"A fragment of the reality tear. It hums with wrongness that the fingers instinctively recognise before the mind does.",
id: "void_shard",
name: "Void Shard",
rarity: "rare",
zoneId: "frozen_peaks",
},
// Zone 4: shadow_marshes
{
description:
"Roots from the strangler plants that thrive in the fog-choked depths. Toxic without extensive preparation. Worth it, usually.",
id: "marsh_root",
name: "Marsh Root",
rarity: "common",
zoneId: "shadow_marshes",
},
{
description:
"Distilled darkness, caught in a vial before it could dissipate. Heavy and cold, and absolutely lightless.",
id: "shadow_essence",
name: "Shadow Essence",
rarity: "uncommon",
zoneId: "shadow_marshes",
},
{
description:
"Bone from something that died in the marsh so long ago it has become part of it. The curse runs deep through the marrow.",
id: "cursed_bone",
name: "Cursed Bone",
rarity: "rare",
zoneId: "shadow_marshes",
},
// Zone 5: volcanic_depths
{
description:
"Cooled lava that retained its internal heat. Warm to the touch even centuries after solidifying from whatever it once was.",
id: "magma_stone",
name: "Magma Stone",
rarity: "common",
zoneId: "volcanic_depths",
},
{
description:
"A crystal grown in the heart of a cooling magma chamber. Burns without being consumed, endlessly.",
id: "ember_crystal",
name: "Ember Crystal",
rarity: "uncommon",
zoneId: "volcanic_depths",
},
{
description:
"Ore from a seam that the fire elementals guard jealously. What it forges into is extraordinary by any measure.",
id: "legendary_ore",
name: "Legendary Ore",
rarity: "rare",
zoneId: "volcanic_depths",
},
// Zone 6: astral_void
{
description:
"Particulate matter from dying stars, collected from the void between worlds. Glitters even in total darkness.",
id: "stardust",
name: "Stardust",
rarity: "common",
zoneId: "astral_void",
},
{
description:
"Filaments of solidified probability. Handle with care — they remember every possible future they passed through.",
id: "astral_thread",
name: "Astral Thread",
rarity: "uncommon",
zoneId: "astral_void",
},
{
description:
"A crystal that formed in the spaces between spaces. Technically exists in several places simultaneously. Don't think too hard about it.",
id: "void_crystal",
name: "Void Crystal",
rarity: "rare",
zoneId: "astral_void",
},
// Zone 7: celestial_reaches
{
description:
"Residue from the celestial host's passing. Warm as sunlight and infinitely patient, as if waiting for something to happen.",
id: "celestial_dust",
name: "Celestial Dust",
rarity: "common",
zoneId: "celestial_reaches",
},
{
description:
"A chip of something the celestials discarded as imperfect. By mortal standards, it is extraordinary beyond measure.",
id: "divine_fragment",
name: "Divine Fragment",
rarity: "uncommon",
zoneId: "celestial_reaches",
},
{
description:
"A crystallised harmonic from the celestial choir. Resonates with a sound felt in the chest rather than heard with the ears.",
id: "choir_shard",
name: "Choir Shard",
rarity: "rare",
zoneId: "celestial_reaches",
},
// Zone 8: abyssal_trench
{
description:
"Coral from the deepest trenches where no light reaches and no warmth remains. Black as the water around it.",
id: "trench_coral",
name: "Trench Coral",
rarity: "common",
zoneId: "abyssal_trench",
},
{
description:
"A gem compressed by aeons of unimaginable pressure at the bottom of all things. Impossibly dense for its size.",
id: "pressure_gem",
name: "Pressure Gem",
rarity: "uncommon",
zoneId: "abyssal_trench",
},
{
description:
"A tooth from whatever has been waiting in the trench since before your world was made. It is very large.",
id: "ancient_tooth",
name: "Ancient Tooth",
rarity: "rare",
zoneId: "abyssal_trench",
},
// Zone 9: infernal_court
{
description:
"Sulphur residue from the court's perpetual fires. The smell never fully fades, no matter how carefully it is stored.",
id: "brimstone_flake",
name: "Brimstone Flake",
rarity: "common",
zoneId: "infernal_court",
},
{
description:
"Extracted from the court's refuse. Corrosive, powerful, and deeply unpleasant in every measurable way.",
id: "demon_ichor",
name: "Demon Ichor",
rarity: "uncommon",
zoneId: "infernal_court",
},
{
description:
"What remains after a soul has been fully processed by the court. Carries faint echoes of what it was before.",
id: "soul_residue",
name: "Soul Residue",
rarity: "rare",
zoneId: "infernal_court",
},
// Zone 10: crystalline_spire
{
description:
"Ground from the spire's outer facets. Each particle contains a compressed possibility that has not yet resolved.",
id: "prism_dust",
name: "Prism Dust",
rarity: "common",
zoneId: "crystalline_spire",
},
{
description:
"A fragment of the spire's core intelligence. Still running calculations on something that may or may not have an answer.",
id: "calculation_shard",
name: "Calculation Shard",
rarity: "uncommon",
zoneId: "crystalline_spire",
},
{
description:
"A crystal that contains a future that never happened. Treat carefully. The future remembers being possible.",
id: "possibility_crystal",
name: "Possibility Crystal",
rarity: "rare",
zoneId: "crystalline_spire",
},
// Zone 11: void_sanctum
{
description:
"Matter that exists in the space between spaces. Lacks most standard properties in ways that should not be possible.",
id: "null_matter",
name: "Null Matter",
rarity: "common",
zoneId: "void_sanctum",
},
{
description:
"A shard of the call that drew your guild here. Still resonant, still reaching toward something none of you can name.",
id: "resonance_fragment",
name: "Resonance Fragment",
rarity: "uncommon",
zoneId: "void_sanctum",
},
{
description:
"From the heart of the sanctum itself. What it does is undefined. What it is cannot be satisfactorily described.",
id: "sanctum_core",
name: "Sanctum Core",
rarity: "rare",
zoneId: "void_sanctum",
},
// Zone 12: eternal_throne
{
description:
"Residue from the base of the eternal throne. Old beyond any measurement that applies to things your guild understands.",
id: "throne_dust",
name: "Throne Dust",
rarity: "common",
zoneId: "eternal_throne",
},
{
description:
"A chip from one of the throne's crown-like spires. Authority made into something your hands can hold.",
id: "crown_fragment",
name: "Crown Fragment",
rarity: "uncommon",
zoneId: "eternal_throne",
},
{
description:
"From the throne's arm. Carries the weight of every decision ever made here, compressed into splinter-form.",
id: "eternity_splinter",
name: "Eternity Splinter",
rarity: "rare",
zoneId: "eternal_throne",
},
// Zone 13: primordial_chaos
{
description:
"A solidified moment of chaos. Still undecided about its own properties, which change depending on how you look at it.",
id: "chaos_fragment",
name: "Chaos Fragment",
rarity: "common",
zoneId: "primordial_chaos",
},
{
description:
"A fragment from when something was being made here. What was being made is unclear. Something important, probably.",
id: "creation_shard",
name: "Creation Shard",
rarity: "uncommon",
zoneId: "primordial_chaos",
},
{
description:
"The raw stuff of creation, before it became anything specific. Handle with care. It wants to become things.",
id: "primordial_essence",
name: "Primordial Essence",
rarity: "rare",
zoneId: "primordial_chaos",
},
// Zone 14: infinite_expanse
{
description:
"Gathered from somewhere in the expanse. Direction is uncertain. Distance from the collection point is uncertain.",
id: "expanse_dust",
name: "Expanse Dust",
rarity: "common",
zoneId: "infinite_expanse",
},
{
description:
"A crystal that contains compressed distance. It weighs more than its size suggests. Much more. Do not drop it.",
id: "distance_crystal",
name: "Distance Crystal",
rarity: "uncommon",
zoneId: "infinite_expanse",
},
{
description:
"A fragment of the expanse's edge, which the expanse does not technically have. This should not exist. It does anyway.",
id: "infinity_shard",
name: "Infinity Shard",
rarity: "rare",
zoneId: "infinite_expanse",
},
// Zone 15: reality_forge
{
description:
"Ash from the forge's fires. Contains fragments of unrealised realities that never quite made it to existence.",
id: "forge_ash",
name: "Forge Ash",
rarity: "common",
zoneId: "reality_forge",
},
{
description:
"A worn tool left by whatever worked here before your universe existed. Still functional in ways that are difficult to explain.",
id: "creation_tool",
name: "Creation Tool",
rarity: "uncommon",
zoneId: "reality_forge",
},
{
description:
"A flawed reality, discarded by the forge as below standard. Still contains everything a universe needs.",
id: "reality_shard",
name: "Reality Shard",
rarity: "rare",
zoneId: "reality_forge",
},
// Zone 16: cosmic_maelstrom
{
description:
"Debris from a galaxy that got too close to the maelstrom. Compressed to a size your guild can actually carry.",
id: "maelstrom_debris",
name: "Maelstrom Debris",
rarity: "common",
zoneId: "cosmic_maelstrom",
},
{
description:
"A crystal that formed at the intersection of several fundamental forces that should never have been in the same place.",
id: "force_crystal",
name: "Force Crystal",
rarity: "uncommon",
zoneId: "cosmic_maelstrom",
},
{
description:
"A fragment from the maelstrom's eye. Impossibly calm. Whatever is at the centre has been there since the beginning.",
id: "cosmic_fragment",
name: "Cosmic Fragment",
rarity: "rare",
zoneId: "cosmic_maelstrom",
},
// Zone 17: primeval_sanctum
{
description:
"Dust from the oldest place. Has been here since before the concept of 'here' had been invented.",
id: "ancient_dust",
name: "Ancient Dust",
rarity: "common",
zoneId: "primeval_sanctum",
},
{
description:
"A shard of something that remembers the moment before the first moment. The memory is in the material itself.",
id: "memory_shard",
name: "Memory Shard",
rarity: "uncommon",
zoneId: "primeval_sanctum",
},
{
description:
"An artefact from the first thing to exist in this place. What it did is unknown. That it mattered is beyond doubt.",
id: "primeval_relic",
name: "Primeval Relic",
rarity: "rare",
zoneId: "primeval_sanctum",
},
// Zone 18: the_absolute
{
description:
"A fragment of the final truth. It is difficult to look at directly, and impossible to look away from once you start.",
id: "absolute_fragment",
name: "Absolute Fragment",
rarity: "common",
zoneId: "the_absolute",
},
{
description:
"From the edge of everything. On one side: everything. On the other: nothing. This is from the very boundary between them.",
id: "boundary_shard",
name: "Boundary Shard",
rarity: "uncommon",
zoneId: "the_absolute",
},
{
description:
"The last crystal. After this, there are no more. It knows this. You can tell from the way it sits in your hand.",
id: "omega_crystal",
name: "Omega Crystal",
rarity: "rare",
zoneId: "the_absolute",
},
];
+252
View File
@@ -0,0 +1,252 @@
/**
* @file Prestige upgrade data for Elysium.
* @copyright nhcarrigan
* @license Naomi's Public License
* @author Naomi Carrigan
*/
/* eslint-disable @typescript-eslint/naming-convention -- Snake_case IDs and SCREAMING_SNAKE are conventional for game data */
/* eslint-disable stylistic/max-len -- Long description strings cannot be split */
/* eslint-disable import/group-exports -- Multiple exports are required for this data module */
import type { PrestigeUpgrade } from "@elysium/types";
export const PRESTIGE_UPGRADES: Array<PrestigeUpgrade> = [
// ── Global Income Tiers ───────────────────────────────────────────────────
{
category: "income",
description:
"The first runestone awakens dormant power in your guild. All production ×1.25.",
id: "income_1",
multiplier: 1.25,
name: "Runestone Blessing I",
runestonesCost: 10,
},
{
category: "income",
description:
"Deeper runestone resonance amplifies your workforce. All production ×1.5.",
id: "income_2",
multiplier: 1.5,
name: "Runestone Blessing II",
runestonesCost: 25,
},
{
category: "income",
description: "The runes sing with accumulated wisdom. All production ×2.",
id: "income_3",
multiplier: 2,
name: "Runestone Blessing III",
runestonesCost: 60,
},
{
category: "income",
description:
"Runestone energy surges through your guild's operations. All production ×3.",
id: "income_4",
multiplier: 3,
name: "Runic Surge I",
runestonesCost: 150,
},
{
category: "income",
description:
"The surge intensifies, pushing limits thought impossible. All production ×5.",
id: "income_5",
multiplier: 5,
name: "Runic Surge II",
runestonesCost: 350,
},
{
category: "income",
description:
"An overwhelming tide of runic energy floods your operations. All production ×10.",
id: "income_6",
multiplier: 10,
name: "Runic Surge III",
runestonesCost: 800,
},
{
category: "income",
description:
"You decipher ancient runic inscriptions that unlock vast potential. All production ×25.",
id: "income_7",
multiplier: 25,
name: "Ancient Inscription I",
runestonesCost: 2000,
},
{
category: "income",
description:
"Deeper inscriptions reveal secrets of primordial power. All production ×50.",
id: "income_8",
multiplier: 50,
name: "Ancient Inscription II",
runestonesCost: 5000,
},
{
category: "income",
description:
"The full inscription blazes with world-shaping power. All production ×100.",
id: "income_9",
multiplier: 100,
name: "Ancient Inscription III",
runestonesCost: 12_000,
},
{
category: "income",
description:
"The oldest runes, carved before memory began, yield their secrets at last. All production ×500.",
id: "income_10",
multiplier: 500,
name: "Eternal Rune I",
runestonesCost: 30_000,
},
{
category: "income",
description:
"Eternal runes resonate with the heartbeat of creation itself. All production ×1,000.",
id: "income_11",
multiplier: 1000,
name: "Eternal Rune II",
runestonesCost: 80_000,
},
// ── Click Power ───────────────────────────────────────────────────────────
{
category: "click",
description:
"Infuse your personal strikes with runestone energy. Click power ×2.",
id: "click_power_1",
multiplier: 2,
name: "Runic Strike I",
runestonesCost: 15,
},
{
category: "click",
description:
"Your strikes crackle with compounded runic force. Click power ×5.",
id: "click_power_2",
multiplier: 5,
name: "Runic Strike II",
runestonesCost: 75,
},
{
category: "click",
description:
"Every click channels the weight of all your past lives. Click power ×20.",
id: "click_power_3",
multiplier: 20,
name: "Runic Strike III",
runestonesCost: 400,
},
{
category: "click",
description:
"A single click now carries the force of a falling empire. Click power ×100.",
id: "click_power_4",
multiplier: 100,
name: "World-Breaker Click",
runestonesCost: 2500,
},
// ── Essence Production ────────────────────────────────────────────────────
{
category: "essence",
description:
"Runestone resonance amplifies your essence gathering. Essence production ×2.",
id: "essence_1",
multiplier: 2,
name: "Essence Attunement I",
runestonesCost: 20,
},
{
category: "essence",
description:
"Deep attunement draws essence from previously invisible sources. Essence production ×5.",
id: "essence_2",
multiplier: 5,
name: "Essence Attunement II",
runestonesCost: 120,
},
{
category: "essence",
description:
"Your guild breathes essence as naturally as air. Essence production ×20.",
id: "essence_3",
multiplier: 20,
name: "Essence Attunement III",
runestonesCost: 700,
},
{
category: "essence",
description:
"Essence flows in torrents from every corner of every world. Essence production ×100.",
id: "essence_4",
multiplier: 100,
name: "Essence Attunement IV",
runestonesCost: 4000,
},
// ── Crystal Production ────────────────────────────────────────────────────
{
category: "crystals",
description:
"Runestones vibrate in harmony with crystal structures. Crystal rewards ×2.",
id: "crystal_1",
multiplier: 2,
name: "Crystal Resonance I",
runestonesCost: 30,
},
{
category: "crystals",
description:
"The resonance deepens, shattering crystal barriers. Crystal rewards ×5.",
id: "crystal_2",
multiplier: 5,
name: "Crystal Resonance II",
runestonesCost: 200,
},
{
category: "crystals",
description:
"Pure resonance crystallises reality into abundance. Crystal rewards ×25.",
id: "crystal_3",
multiplier: 25,
name: "Crystal Resonance III",
runestonesCost: 1200,
},
// ── Utility Unlocks ───────────────────────────────────────────────────────
{
category: "utility",
description:
"Unlock the Auto-Prestige toggle. When enabled, you will automatically ascend the moment you reach the prestige threshold — using your current character name.",
id: "auto_prestige",
multiplier: 1,
name: "Autonomous Ascension",
runestonesCost: 100,
},
// ── Runestone Meta-Upgrades ───────────────────────────────────────────────
{
category: "runestones",
description:
"Your runestone attunement grows with each prestige. Earn 25% more runestones from future prestiges.",
id: "runestone_gain_1",
multiplier: 1.25,
name: "Runic Legacy",
runestonesCost: 50,
},
{
category: "runestones",
description:
"Your legend transcends individual lifetimes. Earn 50% more runestones from future prestiges.",
id: "runestone_gain_2",
multiplier: 1.5,
name: "Eternal Legacy",
runestonesCost: 500,
},
];
export const PRESTIGE_UPGRADE_CATEGORY_LABELS: Record<string, string> = {
click: "👆 Click Power",
crystals: "💎 Crystal Rewards",
essence: "✨ Essence Production",
income: "🪙 Global Income",
runestones: "🔮 Runestone Gain",
utility: "⚙️ Utility",
};
+480
View File
@@ -0,0 +1,480 @@
/**
* @file Crafting recipe data for Elysium.
* @copyright nhcarrigan
* @license Naomi's Public License
* @author Naomi Carrigan
*/
/* eslint-disable @typescript-eslint/naming-convention -- Snake_case IDs are conventional for game data */
/* eslint-disable stylistic/max-len -- Long description strings cannot be split */
/* eslint-disable max-lines -- Data file necessarily exceeds line limit */
import type { CraftingRecipe } from "@elysium/types";
export const RECIPES: Array<CraftingRecipe> = [
// Zone 1: verdant_vale
{
bonus: { type: "gold_income", value: 1.05 },
description:
"Sap from ancient heartwood trees, refined and bound with forest crystal. The resulting tincture accelerates the flow of wealth through your guild in ways the alchemists cannot fully explain.",
id: "heartwood_tincture",
name: "Heartwood Tincture",
requiredMaterials: [
{ materialId: "verdant_sap", quantity: 5 },
{ materialId: "forest_crystal", quantity: 3 },
],
zoneId: "verdant_vale",
},
{
bonus: { type: "combat_power", value: 1.08 },
description:
"A ward fashioned from bark older than the kingdom. Its presence on the battlefield is not merely physical — something ancient watches through it.",
id: "elder_bark_shield",
name: "Elder Bark Shield",
requiredMaterials: [
{ materialId: "elder_bark", quantity: 2 },
{ materialId: "verdant_sap", quantity: 8 },
],
zoneId: "verdant_vale",
},
// Zone 2: shattered_ruins
{
bonus: { type: "essence_income", value: 1.05 },
description:
"The ruin dust and cursed fragments, carefully worked into a binding that borrows the essence-drawing power of the fallen civilisation's final enchantments.",
id: "runic_binding",
name: "Runic Binding",
requiredMaterials: [
{ materialId: "ruin_dust", quantity: 8 },
{ materialId: "cursed_fragment", quantity: 4 },
],
zoneId: "shattered_ruins",
},
{
bonus: { type: "gold_income", value: 1.08 },
description:
"A charm set with a chip of the elder dragon's scale. The dragon would be furious if he knew. He would also be impressed.",
id: "dragon_scale_charm",
name: "Dragon Scale Charm",
requiredMaterials: [
{ materialId: "dragonscale_chip", quantity: 2 },
{ materialId: "ruin_dust", quantity: 10 },
],
zoneId: "shattered_ruins",
},
// Zone 3: frozen_peaks
{
bonus: { type: "click_power", value: 1.08 },
description:
"Glacial ice ground and shaped into a lens that clarifies and focuses. Holding it, your guild's actions become sharper, more precise, more effective per motion.",
id: "glacial_lens",
name: "Glacial Lens",
requiredMaterials: [
{ materialId: "glacial_ice", quantity: 8 },
{ materialId: "frost_crystal", quantity: 4 },
],
zoneId: "frozen_peaks",
},
{
bonus: { type: "gold_income", value: 1.1 },
description:
"The void shard set in frost crystal, creating something that should not be possible: a stable window into the spaces between spaces. Profitable beyond what physics suggests.",
id: "void_fragment_amulet",
name: "Void Fragment Amulet",
requiredMaterials: [
{ materialId: "void_shard", quantity: 2 },
{ materialId: "frost_crystal", quantity: 6 },
],
zoneId: "frozen_peaks",
},
// Zone 4: shadow_marshes
{
bonus: { type: "essence_income", value: 1.08 },
description:
"Marsh roots processed with shadow essence into a refined compound that somehow makes the essence of things flow more freely toward your guild hall.",
id: "shadow_extract",
name: "Shadow Extract",
requiredMaterials: [
{ materialId: "marsh_root", quantity: 8 },
{ materialId: "shadow_essence", quantity: 4 },
],
zoneId: "shadow_marshes",
},
{
bonus: { type: "combat_power", value: 1.1 },
description:
"The cursed bone and shadow essence combined into a focus that doesn't so much help your party fight as make things afraid of them before the battle begins.",
id: "cursed_focus",
name: "Cursed Focus",
requiredMaterials: [
{ materialId: "cursed_bone", quantity: 2 },
{ materialId: "shadow_essence", quantity: 6 },
],
zoneId: "shadow_marshes",
},
// Zone 5: volcanic_depths
{
bonus: { type: "gold_income", value: 1.1 },
description:
"A seal forged in the volcanic depths, using the eternal heat of the magma stone and ember crystal to create something that burns wealth into existence continuously.",
id: "magma_core_seal",
name: "Magma Core Seal",
requiredMaterials: [
{ materialId: "magma_stone", quantity: 8 },
{ materialId: "ember_crystal", quantity: 4 },
],
zoneId: "volcanic_depths",
},
{
bonus: { type: "combat_power", value: 1.12 },
description:
"The legendary ore, smelted in the volcanic forges with magma stone as fuel. What emerges is something the fire elementals recognise — and fear slightly.",
id: "elemental_ore_ingot",
name: "Elemental Ore Ingot",
requiredMaterials: [
{ materialId: "legendary_ore", quantity: 2 },
{ materialId: "magma_stone", quantity: 10 },
],
zoneId: "volcanic_depths",
},
// Zone 6: astral_void
{
bonus: { type: "click_power", value: 1.12 },
description:
"Stardust arranged along astral threads into a map of the void that somehow, impossibly, shows your guild where to press and how to press it for maximum effect.",
id: "star_chart",
name: "Star Chart",
requiredMaterials: [
{ materialId: "stardust", quantity: 10 },
{ materialId: "astral_thread", quantity: 4 },
],
zoneId: "astral_void",
},
{
bonus: { type: "gold_income", value: 1.12 },
description:
"A void crystal suspended in a matrix of stardust — something that exists in several places simultaneously and draws gold from all of them at once.",
id: "void_crystal_matrix",
name: "Void Crystal Matrix",
requiredMaterials: [
{ materialId: "void_crystal", quantity: 2 },
{ materialId: "stardust", quantity: 12 },
],
zoneId: "astral_void",
},
// Zone 7: celestial_reaches
{
bonus: { type: "essence_income", value: 1.12 },
description:
"Celestial dust and divine fragments ground into a lens that sees the essence in all things and draws a portion of it — gently, as the celestials would prefer.",
id: "celestial_lens",
name: "Celestial Lens",
requiredMaterials: [
{ materialId: "celestial_dust", quantity: 10 },
{ materialId: "divine_fragment", quantity: 4 },
],
zoneId: "celestial_reaches",
},
{
bonus: { type: "gold_income", value: 1.15 },
description:
"A choir shard set in divine fragments, still humming with the celestial harmonic. The resonance makes gold flow in its direction — not compelled, simply invited.",
id: "choir_resonator",
name: "Choir Resonator",
requiredMaterials: [
{ materialId: "choir_shard", quantity: 2 },
{ materialId: "divine_fragment", quantity: 6 },
],
zoneId: "celestial_reaches",
},
// Zone 8: abyssal_trench
{
bonus: { type: "combat_power", value: 1.15 },
description:
"Trench coral and pressure gem combined under conditions that should have destroyed both. The result is something that survived conditions nothing should survive, which is ideal for combat.",
id: "pressure_forged_core",
name: "Pressure-Forged Core",
requiredMaterials: [
{ materialId: "trench_coral", quantity: 10 },
{ materialId: "pressure_gem", quantity: 4 },
],
zoneId: "abyssal_trench",
},
{
bonus: { type: "click_power", value: 1.15 },
description:
"A talisman set with the ancient tooth, suspended in trench coral carvings. Your party fights differently with this at their chest. More deliberately. More completely.",
id: "ancient_fang_talisman",
name: "Ancient Fang Talisman",
requiredMaterials: [
{ materialId: "ancient_tooth", quantity: 2 },
{ materialId: "trench_coral", quantity: 12 },
],
zoneId: "abyssal_trench",
},
// Zone 9: infernal_court
{
bonus: { type: "gold_income", value: 1.15 },
description:
"A seal of infernal court authority, forged from brimstone and ichor. The court doesn't know you have this. It's better that way. It does make trade extremely efficient.",
id: "court_seal",
name: "Court Seal",
requiredMaterials: [
{ materialId: "brimstone_flake", quantity: 10 },
{ materialId: "demon_ichor", quantity: 5 },
],
zoneId: "infernal_court",
},
{
bonus: { type: "essence_income", value: 1.15 },
description:
"Soul residue and demon ichor worked into a catalyst that draws the essence from everything around it — gently, without drawing the court's attention. Usually.",
id: "soul_bound_catalyst",
name: "Soul-Bound Catalyst",
requiredMaterials: [
{ materialId: "soul_residue", quantity: 2 },
{ materialId: "demon_ichor", quantity: 8 },
],
zoneId: "infernal_court",
},
// Zone 10: crystalline_spire
{
bonus: { type: "click_power", value: 1.18 },
description:
"Prism dust and calculation shards assembled into an array that the spire's intelligence would call elegant, if it had aesthetic preferences, which it might.",
id: "prism_array",
name: "Prism Array",
requiredMaterials: [
{ materialId: "prism_dust", quantity: 10 },
{ materialId: "calculation_shard", quantity: 4 },
],
zoneId: "crystalline_spire",
},
{
bonus: { type: "gold_income", value: 1.18 },
description:
"A possibility crystal contained within a calculation shard framework. It runs through every possible outcome of every guild action and finds the one with the highest gold yield.",
id: "possibility_engine",
name: "Possibility Engine",
requiredMaterials: [
{ materialId: "possibility_crystal", quantity: 2 },
{ materialId: "calculation_shard", quantity: 6 },
],
zoneId: "crystalline_spire",
},
// Zone 11: void_sanctum
{
bonus: { type: "combat_power", value: 1.18 },
description:
"Null matter and resonance fragments assembled into something that generates a field where the laws governing how hard things are to kill become negotiable.",
id: "null_field_generator",
name: "Null Field Generator",
requiredMaterials: [
{ materialId: "null_matter", quantity: 10 },
{ materialId: "resonance_fragment", quantity: 4 },
],
zoneId: "void_sanctum",
},
{
bonus: { type: "essence_income", value: 1.18 },
description:
"A sanctum core and resonance fragments shaped into a key to something. The essence flows through it like it was designed to carry essence, which it may have been.",
id: "sanctum_key",
name: "Sanctum Key",
requiredMaterials: [
{ materialId: "sanctum_core", quantity: 2 },
{ materialId: "resonance_fragment", quantity: 6 },
],
zoneId: "void_sanctum",
},
// Zone 12: eternal_throne
{
bonus: { type: "gold_income", value: 1.2 },
description:
"Throne dust pressed into throne dust-lacquered crown fragments, shaped into a circlet. Wearing it — metaphorically — makes gold accumulate with the inevitability of authority.",
id: "crown_circlet",
name: "Crown Circlet",
requiredMaterials: [
{ materialId: "throne_dust", quantity: 10 },
{ materialId: "crown_fragment", quantity: 4 },
],
zoneId: "eternal_throne",
},
{
bonus: { type: "combat_power", value: 1.2 },
description:
"An eternity splinter set into crown fragments, shaped into a ring. What it binds is unclear. Whatever it is, it makes your party significantly harder to kill.",
id: "eternity_bound_ring",
name: "Eternity-Bound Ring",
requiredMaterials: [
{ materialId: "eternity_splinter", quantity: 2 },
{ materialId: "crown_fragment", quantity: 6 },
],
zoneId: "eternal_throne",
},
// Zone 13: primordial_chaos
{
bonus: { type: "click_power", value: 1.2 },
description:
"Chaos fragments and creation shards arranged into a lens that hasn't decided what it wants to focus on yet, which somehow makes every click land harder than it should.",
id: "chaos_lens",
name: "Chaos Lens",
requiredMaterials: [
{ materialId: "chaos_fragment", quantity: 10 },
{ materialId: "creation_shard", quantity: 4 },
],
zoneId: "primordial_chaos",
},
{
bonus: { type: "gold_income", value: 1.22 },
description:
"Primordial essence held in a creation shard framework. It hums constantly. Gold flows toward it with the enthusiasm of something that wants to become something.",
id: "creation_core",
name: "Creation Core",
requiredMaterials: [
{ materialId: "primordial_essence", quantity: 2 },
{ materialId: "creation_shard", quantity: 6 },
],
zoneId: "primordial_chaos",
},
// Zone 14: infinite_expanse
{
bonus: { type: "essence_income", value: 1.2 },
description:
"Expanse dust wound around distance crystals into a coil that draws essence from distances too vast to measure, compressing it into something your guild can actually use.",
id: "distance_coil",
name: "Distance Coil",
requiredMaterials: [
{ materialId: "expanse_dust", quantity: 10 },
{ materialId: "distance_crystal", quantity: 4 },
],
zoneId: "infinite_expanse",
},
{
bonus: { type: "gold_income", value: 1.22 },
description:
"An infinity shard mounted in a distance crystal frame. The prism reflects gold from an infinite number of directions simultaneously. The math works out favourably.",
id: "infinity_prism",
name: "Infinity Prism",
requiredMaterials: [
{ materialId: "infinity_shard", quantity: 2 },
{ materialId: "distance_crystal", quantity: 6 },
],
zoneId: "infinite_expanse",
},
// Zone 15: reality_forge
{
bonus: { type: "combat_power", value: 1.22 },
description:
"Forge ash smelted with creation tools into an ingot of compressed reality. Your party hits harder when carrying it. Reality does not enjoy being concentrated like this.",
id: "reality_ingot",
name: "Reality Ingot",
requiredMaterials: [
{ materialId: "forge_ash", quantity: 10 },
{ materialId: "creation_tool", quantity: 4 },
],
zoneId: "reality_forge",
},
{
bonus: { type: "click_power", value: 1.22 },
description:
"A reality shard carefully shaped with creation tools into something that could, theoretically, become a universe. Instead it makes your clicks unreasonably effective.",
id: "universe_seed",
name: "Universe Seed",
requiredMaterials: [
{ materialId: "reality_shard", quantity: 2 },
{ materialId: "creation_tool", quantity: 6 },
],
zoneId: "reality_forge",
},
// Zone 16: cosmic_maelstrom
{
bonus: { type: "gold_income", value: 1.25 },
description:
"Maelstrom debris and force crystals ground into a lens at the intersection of fundamental forces. Gold flows toward it with the same inevitability that galaxies flow toward gravity.",
id: "force_lens",
name: "Force Lens",
requiredMaterials: [
{ materialId: "maelstrom_debris", quantity: 10 },
{ materialId: "force_crystal", quantity: 4 },
],
zoneId: "cosmic_maelstrom",
},
{
bonus: { type: "essence_income", value: 1.22 },
description:
"A cosmic fragment suspended in a force crystal matrix — a piece of the maelstrom's impossible calm, holding the eye of the storm. Essence accumulates in its vicinity.",
id: "maelstrom_eye",
name: "Maelstrom Eye",
requiredMaterials: [
{ materialId: "cosmic_fragment", quantity: 2 },
{ materialId: "force_crystal", quantity: 6 },
],
zoneId: "cosmic_maelstrom",
},
// Zone 17: primeval_sanctum
{
bonus: { type: "combat_power", value: 1.25 },
description:
"Ancient dust and memory shards arranged into something that remembers how to fight before fighting was invented. Your party benefits from this instinct enormously.",
id: "ancient_memory_array",
name: "Ancient Memory Array",
requiredMaterials: [
{ materialId: "ancient_dust", quantity: 10 },
{ materialId: "memory_shard", quantity: 4 },
],
zoneId: "primeval_sanctum",
},
{
bonus: { type: "click_power", value: 1.25 },
description:
"The primeval relic, set into a memory shard framework. What function it originally served is unknowable. In your guild's hands, it makes every action more deliberate and more powerful.",
id: "first_artefact",
name: "First Artefact",
requiredMaterials: [
{ materialId: "primeval_relic", quantity: 2 },
{ materialId: "memory_shard", quantity: 6 },
],
zoneId: "primeval_sanctum",
},
// Zone 18: the_absolute
{
bonus: { type: "gold_income", value: 1.3 },
description:
"Absolute fragments and boundary shards ground into a lens that sees to the end of all things — and in seeing, draws the wealth inherent in finality toward your guild.",
id: "final_truth_lens",
name: "Final Truth Lens",
requiredMaterials: [
{ materialId: "absolute_fragment", quantity: 10 },
{ materialId: "boundary_shard", quantity: 4 },
],
zoneId: "the_absolute",
},
{
bonus: { type: "combat_power", value: 1.3 },
description:
"The last omega crystal, set at the convergence of boundary shards in the precise arrangement of an ending. What it does to combat is what endings do to everything: make it final.",
id: "omega_convergence",
name: "Omega Convergence",
requiredMaterials: [
{ materialId: "omega_crystal", quantity: 2 },
{ materialId: "boundary_shard", quantity: 6 },
],
zoneId: "the_absolute",
},
];
+166
View File
@@ -0,0 +1,166 @@
/**
* @file Transcendence upgrade data for Elysium.
* @copyright nhcarrigan
* @license Naomi's Public License
* @author Naomi Carrigan
*/
/* eslint-disable @typescript-eslint/naming-convention -- Snake_case IDs and SCREAMING_SNAKE are conventional for game data */
/* eslint-disable stylistic/max-len -- Long description strings cannot be split */
/* eslint-disable import/group-exports -- Multiple exports are required for this data module */
import type { TranscendenceUpgrade } from "@elysium/types";
export const DEFAULT_TRANSCENDENCE_UPGRADES: Array<TranscendenceUpgrade> = [
// ── Income multipliers ──────────────────────────────────────────────────────
{
category: "income",
cost: 5,
description:
"The echoes of past runs linger, amplifying your guild's income by 25%.",
id: "echo_income_1",
multiplier: 1.25,
name: "Whisper of Power",
},
{
category: "income",
cost: 10,
description:
"Your transcendent experience resonates through your guild, boosting income by 50%.",
id: "echo_income_2",
multiplier: 1.5,
name: "Resonance",
},
{
category: "income",
cost: 20,
description:
"The harmony of multiple timelines surges through your guild, doubling its income.",
id: "echo_income_3",
multiplier: 2,
name: "Harmonic Surge",
},
{
category: "income",
cost: 40,
description:
"Ethereal energy overflows from your transcendence, tripling your guild's income.",
id: "echo_income_4",
multiplier: 3,
name: "Ethereal Overflow",
},
{
category: "income",
cost: 80,
description:
"The infinite chorus of every run you've ever played amplifies your guild fivefold.",
id: "echo_income_5",
multiplier: 5,
name: "Infinite Chorus",
},
// ── Combat multipliers ──────────────────────────────────────────────────────
{
category: "combat",
cost: 5,
description:
"Memories of countless battles harden your adventurers, increasing party DPS by 25%.",
id: "echo_combat_1",
multiplier: 1.25,
name: "Battle-Hardened",
},
{
category: "combat",
cost: 15,
description:
"Veterans of transcendence know how to fight smarter, boosting party DPS by 50%.",
id: "echo_combat_2",
multiplier: 1.5,
name: "Veteran's Edge",
},
{
category: "combat",
cost: 35,
description:
"Your warriors carry the strength of every fallen timeline, doubling party DPS.",
id: "echo_combat_3",
multiplier: 2,
name: "Transcendent Warrior",
},
// ── Prestige threshold reductions ──────────────────────────────────────────
{
category: "prestige_threshold",
cost: 8,
description:
"Experience from past lives shortens the road to prestige — threshold reduced by 10%.",
id: "echo_prestige_threshold_1",
multiplier: 0.9,
name: "Accelerated Path",
},
{
category: "prestige_threshold",
cost: 20,
description:
"You've walked this path so many times you know every shortcut — threshold reduced by 20%.",
id: "echo_prestige_threshold_2",
multiplier: 0.8,
name: "Shortcut Through Time",
},
// ── Prestige runestone multipliers ─────────────────────────────────────────
{
category: "prestige_runestones",
cost: 8,
description:
"Transcendent insight attunes you to the runestones, earning 50% more per prestige.",
id: "echo_prestige_runestones_1",
multiplier: 1.5,
name: "Runic Attunement",
},
{
category: "prestige_runestones",
cost: 20,
description:
"You have mastered the art of runestone crafting, doubling your prestige runestone yield.",
id: "echo_prestige_runestones_2",
multiplier: 2,
name: "Master Runesmith",
},
// ── Echo meta multipliers ───────────────────────────────────────────────────
{
category: "echo_meta",
cost: 10,
description:
"Your transcendence resonates deeper, amplifying future echo yields by 25%.",
id: "echo_meta_1",
multiplier: 1.25,
name: "Resonant Awakening",
},
{
category: "echo_meta",
cost: 25,
description:
"Each loop of existence makes the next more powerful — future echo yields +50%.",
id: "echo_meta_2",
multiplier: 1.5,
name: "Transcendent Loop",
},
{
category: "echo_meta",
cost: 50,
description:
"You have mastered the infinite spiral of transcendence, doubling all future echo yields.",
id: "echo_meta_3",
multiplier: 2,
name: "Infinite Spiral",
},
];
export const TRANSCENDENCE_UPGRADES = DEFAULT_TRANSCENDENCE_UPGRADES;
export const TRANSCENDENCE_UPGRADE_CATEGORY_LABELS: Record<string, string> = {
combat: "⚔️ Combat Multipliers",
echo_meta: "🌌 Echo Meta Upgrades",
income: "✨ Income Multipliers",
prestige_runestones: "🔮 Prestige Quality of Life — Runestones",
prestige_threshold: "🎯 Prestige Quality of Life — Threshold",
};