1 Commits

Author SHA1 Message Date
hikari 666a5b2d6d fix: runestone formula, prestige/transcendence rebalance, exploration fixes, and comprehensive balance audit (#135)
Security Scan and Upload / Security & DefectDojo Upload (push) Successful in 1m12s
CI / Lint, Build & Test (push) Successful in 1m13s
## What changed and why

### Runestone formula (`prestige.ts`)
- Swapped `sqrt` for `cbrt` — much stronger diminishing returns for large gold values
- Added base cap of **200** (→ ~1,125 max with all upgrades at 5.625× multiplier)
- Prevents extended AFK sessions from producing runestone windfalls that allow immediate upgrade purchasing and rapid prestige chaining

### Prestige threshold formula (`prestige.ts`)
- Old: `1,000,000 × 5^n` — exponential, grows impossibly fast, prestige 10+ takes years
- New: `1,000,000 × (n+1)²` — polynomial, peaks at ~1 day/run around P8–10, then gets *easier* as the production multiplier overtakes it
- Removed `thresholdScaleFactor` constant (no longer needed)

### Production multiplier (`prestige.ts`)
- Old: `1.15^n`
- New: `1.25^n` — compounds faster, ensures the polynomial threshold eventually gets easy in the late game

### Boss prestige requirements (`bosses.ts`)
- Rescaled proportionally from 0–88 range to 0–20 range
- The Absolute One now requires prestige **20** (was 88), making transcendence reachable in a few weeks of idle play

### Echo formula (`transcendence.ts`)
- Constant changed from 853 → **224**
- At the target prestige of 20: `floor(224 / sqrt(20)) = 50 echoes` per transcendence (no meta upgrades)
- With all echo_meta upgrades (3.75× total): up to **187 echoes** per transcendence

### Transcendence upgrade costs (`transcendenceUpgrades.ts`)
- Old total: **866 echoes** → New total: **400 echoes** (roughly halved across all categories)
- Apotheosis still requires **all 15 upgrades** purchased

### Balance fixes (closes #141, #142, #143, #144, #145)
- Equipment: `philosophers_stone` click multiplier 2.25→2.5, `crystal_shard` 1.55→1.65 (#144)
- Recipes: added `primal_omega_lens` cross-zone click_power recipe at 1.38× (#142)
- Adventurers: `celestial_guard` base cost adjusted to smooth tier 14→15→16 cost curve (#145)

### Quest reward rebalancing (closes #136, #137)
- Shadow Marshes: buffed `shadow_mere`, `witch_coven`, `plague_ruins` rewards to match combat requirements (#136)
- Astral Void: added gold to `void_rift`, increased rewards across all Astral Void quests (#137)

### Boss reward additions (closes #138, #139, #140)
- Assigned 9 unassigned adventurer-specific upgrades to Crystalline Spire through Eternal Throne bosses that had empty `upgradeRewards` arrays (#140)

### Combat power documentation (closes #153)
- Expanded JSDoc on `computePartyCombatPower` to clarify companion `bossDamage` multiplier behaviour

### Effective adventurer stats (closes #154)
- Added `computeEffectiveAdventurerStats` to `tick.ts` and updated `AdventurerCard` to display effective post-multiplier stats

### Adventurer upgrade timing (closes #158)
- Audited every adventurer-specific upgrade reward — upgrades now land within the same progression window where that adventurer tier is still a meaningful contributor

### Sync and save fixes (closes #147, #148, #151)
- Fixed sync new content count to report only genuinely changed items (#147)
- Fixed signature mismatch after first auto-boss completion (#148)
- Added auto-buy cap (100) on non-max-tier adventurers (#151)

### Auto-adventurer persistence (closes #156)
- Auto-buy preference now preserved across prestige resets

### Broken CDN image (closes #159)
- Uploaded missing `auto_adventurer.jpg` to CDN

### Codex unlock hints (closes #146)
- Locked codex entries now display a hint generated from `sourceType` and `sourceId`

### Exploration bug fixes (closes #160, #161)
- Fixed auto-save race condition discarding exploration materials collected mid-tick (#160)
- Fixed exploration areas failing to unlock when zone was unlocked via boss kill or quest completion (#161)

### Concurrent prestige fix (closes #162)
- Added optimistic locking via `updatedAt` — concurrent prestige requests return 409

### Prestige UX (closes #163)
- Added `reloadSilent` to game context — no loading screen flash after prestige

### Balance adjustments (closes #164, #165, #166, #167)
- Reduced `shadow_mere` CP requirement 5,000,000 → 2,000,000 (#164)
- Buffed crystal drops from Shadow Marshes bosses and quests (#165)
- Increased runestone yield from 10 → 15 per prestige level (#166)
- Daily challenge set always includes a clicks challenge (#167)

### Progression QoL (closes #168, #169)
- Added `computeProjectedRunestones()` and persistent `+N On Prestige` resource bar row (#168)
- Added `enablePrestigeAnnouncements` setting per player (#169)

---

## Comprehensive balance audit (closes #187, #191, #192, #193, #194, #195, #196, #197, #198)

### Crystal economy fixes
- Zeroed crystal rewards for all Zone 7+ boss drops (Celestial Reaches onwards) — crystals are an early/mid-game currency and should not flow freely into the endgame (#187)
- Zeroed crystal rewards for all Zone 9+ quest rewards (Infernal Court onwards) — same rationale (#191)

### Achievement additions and fixes
- Added quest milestone achievements at 75 quests (10,000 crystals) and 100 quests (15,000 crystals)
- Added boss milestone achievement at 50 bosses (15,000 crystals)
- Added prestige milestone achievements at P50, P100, P150, P200 — rewarding **runestones** rather than crystals to match the late-game economy
- Added gold milestone achievements through 1e90 gold earned
- Fixed `quest_eternal` condition from 122 → **112** (actual quest count) — was permanently impossible (#197)
- Fixed `fully_equipped` condition from 65 → **78** (actual equipment count after new items) (#197)
- Fixed `devourer_slayer` description to remove incorrect zone reference

### Upgrade balance
- Fixed Essence Guild multiplier 1.5× → **2×** — was identical to the cheaper Merchant Alliance for 5× the cost (#194)
- Raised Void Ascendancy crystal cost 10M → **50M** — was trivially cheap compared to the parallel Celestial Mandate upgrade (100B essence + 50T gold) (#195)
- Fixed Sunken Temple quest rewards (gold 2M → 60M, essence 1,500 → 25,000, crystals 75 → 400) — was rewarding less than its easier prerequisite Witch Coven (#193)

### Equipment balance
- Buffed Eternal Prism stats to click 5×, combat **3×**, gold **2.5×** — was only marginally better than the free Eternity Stone boss drop for 100M crystals (#196)

### Missing content
- Created **13 missing equipment items** for Zones 15–18 (primordial_chaos through the_absolute) that were referenced by late-game boss `equipmentRewards` arrays but never existed in `equipment.ts` (#198):
  - `chaos_mantle`, `titan_core` (Primordial Chaos)
  - `expanse_blade`, `void_armour_mk2` (Infinite Expanse)
  - `cosmos_blade`, `reality_plate` (Reality Forge)
  - `maelstrom_edge`, `cosmic_plate` (Cosmic Maelstrom)
  - `primeval_blade`, `ancient_aegis` (Primeval Sanctum)
  - `absolute_blade`, `eternity_plate`, `omniversal_core` (The Absolute)
- Stats scale from combat 14× / gold 9× (Zone 15) up to combat 28× / gold 20× for the final boss drops

### Type system
- Extended `AchievementReward` type to support `runestones` field
- Updated tick engine achievement processing to award both crystals and runestones

---

## Target progression timeline (optimal play, ~16h/day idle)
- First cycle to P20: ~375h (~3.3 weeks)
- Each subsequent cycle gets faster as echo upgrades boost income/combat/threshold
- Expected **~5 transcendences** before apotheosis at 50–187 echoes/transcendence
- **~6 months** to apotheosis for a dedicated player

## Test plan
- [ ] Lint, build, and test pipeline passes (100% coverage maintained)
- [ ] Prestige threshold at P0 is still 1,000,000 gold
- [ ] Prestige runs feel ~1 day long around P8–10 and get easier after
- [ ] The Absolute One is locked until prestige 20
- [ ] Transcendence at P20 awards 50 echoes (no meta upgrades)
- [ ] All 15 transcendence upgrades cost 400 echoes total
- [ ] Bosses in Zones 7+ drop 0 crystals; Zones 1–6 retain crystal drops
- [ ] Quests in Zones 9+ reward 0 crystals; Zones 1–8 retain crystal rewards
- [ ] Sunken Temple rewards more gold/essence/crystals than Witch Coven
- [ ] Essence Guild gives 2× income (stronger than Merchant Alliance 1.5×)
- [ ] Void Ascendancy costs 50M crystals
- [ ] Eternal Prism stats are click 5×, combat 3×, gold 2.5×
- [ ] Late-game bosses (primordial_titan through the_absolute_one) drop equipment on kill
- [ ] `quest_eternal` achievement requires 112 quests
- [ ] `fully_equipped` achievement requires 78 equipment pieces
- [ ] P50/P100/P150/P200 prestige achievements reward runestones
- [ ] Adventurer cards show effective post-multiplier stats
- [ ] Exploration areas unlock correctly when their zone is unlocked
- [ ] Concurrent prestige requests return 409
- [ ] No loading screen flash after prestige
- [ ] Daily challenge set always includes a clicks challenge
- [ ] Resource bar shows `+N On Prestige` runestone preview

 This PR was crafted with help from Hikari~ 🌸

Reviewed-on: #135
Co-authored-by: Hikari <hikari@nhcarrigan.com>
Co-committed-by: Hikari <hikari@nhcarrigan.com>
2026-03-31 19:57:53 -07:00
7 changed files with 404 additions and 146 deletions
+95 -5
View File
@@ -149,7 +149,7 @@ export const defaultAchievements: Array<Achievement> = [
},
{
condition: { amount: 18, type: "bossesDefeated" },
description: "Defeat all 18 bosses across the first six zones.",
description: "Defeat the 18 bosses of the mortal realms.",
icon: "🌟",
id: "devourer_slayer",
name: "World Saver",
@@ -223,8 +223,8 @@ export const defaultAchievements: Array<Achievement> = [
unlockedAt: null,
},
{
condition: { amount: 65, type: "equipmentOwned" },
description: "Own all 65 pieces of equipment.",
condition: { amount: 78, type: "equipmentOwned" },
description: "Own all 78 pieces of equipment.",
icon: "🛡️",
id: "fully_equipped",
name: "Fully Equipped",
@@ -269,6 +269,33 @@ export const defaultAchievements: Array<Achievement> = [
reward: { crystals: 50_000 },
unlockedAt: null,
},
{
condition: { amount: 1e30, type: "totalGoldEarned" },
description: "Earn 1 nonillion gold in total.",
icon: "🌌",
id: "cosmic_wealthy",
name: "Cosmic Wealthy",
reward: { crystals: 100_000 },
unlockedAt: null,
},
{
condition: { amount: 1e60, type: "totalGoldEarned" },
description: "Earn a vigintillion gold in total.",
icon: "♾️",
id: "infinite_hoarder",
name: "Infinite Hoarder",
reward: { crystals: 250_000 },
unlockedAt: null,
},
{
condition: { amount: 1e90, type: "totalGoldEarned" },
description: "Earn a trigintillion gold in total.",
icon: "🔮",
id: "omniversal_tycoon",
name: "Omniversal Tycoon",
reward: { crystals: 1_000_000 },
unlockedAt: null,
},
// Higher quest milestones
{
condition: { amount: 30, type: "questsCompleted" },
@@ -289,8 +316,26 @@ export const defaultAchievements: Array<Achievement> = [
unlockedAt: null,
},
{
condition: { amount: 95, type: "questsCompleted" },
description: "Complete all 95 quests across the known multiverse.",
condition: { amount: 75, type: "questsCompleted" },
description: "Complete 75 quests.",
icon: "🌠",
id: "quest_hero",
name: "Quest Hero",
reward: { crystals: 10_000 },
unlockedAt: null,
},
{
condition: { amount: 100, type: "questsCompleted" },
description: "Complete 100 quests.",
icon: "💫",
id: "quest_legend",
name: "Quest Legend",
reward: { crystals: 15_000 },
unlockedAt: null,
},
{
condition: { amount: 112, type: "questsCompleted" },
description: "Complete all 112 quests across the known multiverse.",
icon: "🌌",
id: "quest_eternal",
name: "Quest Eternal",
@@ -316,6 +361,15 @@ export const defaultAchievements: Array<Achievement> = [
reward: { crystals: 5000 },
unlockedAt: null,
},
{
condition: { amount: 50, type: "bossesDefeated" },
description: "Defeat 50 bosses.",
icon: "⚡",
id: "boss_legend",
name: "Legendary Vanquisher",
reward: { crystals: 15_000 },
unlockedAt: null,
},
{
condition: { amount: 72, type: "bossesDefeated" },
description: "Defeat all 72 bosses across every plane of existence.",
@@ -363,4 +417,40 @@ export const defaultAchievements: Array<Achievement> = [
reward: { crystals: 25_000 },
unlockedAt: null,
},
{
condition: { amount: 50, type: "prestigeCount" },
description: "Prestige 50 times.",
icon: "✨",
id: "prestige_transcendent",
name: "Transcendent",
reward: { runestones: 100 },
unlockedAt: null,
},
{
condition: { amount: 100, type: "prestigeCount" },
description: "Prestige 100 times.",
icon: "💎",
id: "prestige_eternal",
name: "Eternal Looper",
reward: { runestones: 500 },
unlockedAt: null,
},
{
condition: { amount: 150, type: "prestigeCount" },
description: "Prestige 150 times.",
icon: "🌟",
id: "prestige_immortal",
name: "Immortal Cycler",
reward: { runestones: 2000 },
unlockedAt: null,
},
{
condition: { amount: 200, type: "prestigeCount" },
description: "Prestige 200 times.",
icon: "👑",
id: "prestige_absolute",
name: "Absolute Champion",
reward: { runestones: 10_000 },
unlockedAt: null,
},
];
+53 -53
View File
@@ -360,7 +360,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 40,
crystalReward: 40_000,
crystalReward: 0,
currentHp: 2_000_000_000,
damagePerSecond: 120_000,
description:
@@ -378,7 +378,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 50,
crystalReward: 100_000,
crystalReward: 0,
currentHp: 8_000_000_000,
damagePerSecond: 350_000,
description:
@@ -396,7 +396,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 60,
crystalReward: 300_000,
crystalReward: 0,
currentHp: 30_000_000_000,
damagePerSecond: 1_000_000,
description:
@@ -414,7 +414,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 75,
crystalReward: 800_000,
crystalReward: 0,
currentHp: 100_000_000_000,
damagePerSecond: 3_000_000,
description:
@@ -433,7 +433,7 @@ export const defaultBosses: Array<Boss> = [
// ── Abyssal Trench ────────────────────────────────────────────────────────
{
bountyRunestones: 40,
crystalReward: 1_500_000,
crystalReward: 0,
currentHp: 250_000_000_000,
damagePerSecond: 5_000_000,
description:
@@ -451,7 +451,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 55,
crystalReward: 4_000_000,
crystalReward: 0,
currentHp: 1_000_000_000_000,
damagePerSecond: 15_000_000,
description:
@@ -469,7 +469,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 70,
crystalReward: 12_000_000,
crystalReward: 0,
currentHp: 4_000_000_000_000,
damagePerSecond: 50_000_000,
description:
@@ -487,7 +487,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 85,
crystalReward: 40_000_000,
crystalReward: 0,
currentHp: 15_000_000_000_000,
damagePerSecond: 150_000_000,
description:
@@ -505,7 +505,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 100,
crystalReward: 150_000_000,
crystalReward: 0,
currentHp: 50_000_000_000_000,
damagePerSecond: 500_000_000,
description:
@@ -524,7 +524,7 @@ export const defaultBosses: Array<Boss> = [
// ── Infernal Court ────────────────────────────────────────────────────────
{
bountyRunestones: 55,
crystalReward: 350_000_000,
crystalReward: 0,
currentHp: 120_000_000_000_000,
damagePerSecond: 800_000_000,
description:
@@ -542,7 +542,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 70,
crystalReward: 1_000_000_000,
crystalReward: 0,
currentHp: 500_000_000_000_000,
damagePerSecond: 2_500_000_000,
description:
@@ -560,7 +560,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 90,
crystalReward: 3_000_000_000,
crystalReward: 0,
currentHp: 2_000_000_000_000_000,
damagePerSecond: 8_000_000_000,
description:
@@ -578,7 +578,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 110,
crystalReward: 10_000_000_000,
crystalReward: 0,
currentHp: 6_000_000_000_000_000,
damagePerSecond: 25_000_000_000,
description:
@@ -596,7 +596,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 135,
crystalReward: 30_000_000_000,
crystalReward: 0,
currentHp: 8_000_000_000_000_000,
damagePerSecond: 80_000_000_000,
description:
@@ -615,7 +615,7 @@ export const defaultBosses: Array<Boss> = [
// ── Crystalline Spire ─────────────────────────────────────────────────────
{
bountyRunestones: 70,
crystalReward: 8e10,
crystalReward: 0,
currentHp: 2e16,
damagePerSecond: 120_000_000_000,
description:
@@ -633,7 +633,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 90,
crystalReward: 3e11,
crystalReward: 0,
currentHp: 8e16,
damagePerSecond: 4e11,
description:
@@ -651,7 +651,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 115,
crystalReward: 1e12,
crystalReward: 0,
currentHp: 3e17,
damagePerSecond: 1.2e12,
description:
@@ -669,7 +669,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 140,
crystalReward: 4e12,
crystalReward: 0,
currentHp: 1e18,
damagePerSecond: 4e12,
description:
@@ -687,7 +687,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 175,
crystalReward: 1.5e13,
crystalReward: 0,
currentHp: 4e18,
damagePerSecond: 1.5e13,
description:
@@ -706,7 +706,7 @@ export const defaultBosses: Array<Boss> = [
// ── Void Sanctum ──────────────────────────────────────────────────────────
{
bountyRunestones: 90,
crystalReward: 4e13,
crystalReward: 0,
currentHp: 1e19,
damagePerSecond: 4e13,
description:
@@ -724,7 +724,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 115,
crystalReward: 1.5e14,
crystalReward: 0,
currentHp: 5e19,
damagePerSecond: 1.5e14,
description:
@@ -742,7 +742,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 145,
crystalReward: 5e14,
crystalReward: 0,
currentHp: 2e20,
damagePerSecond: 5e14,
description:
@@ -760,7 +760,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 180,
crystalReward: 2e15,
crystalReward: 0,
currentHp: 8e20,
damagePerSecond: 2e15,
description:
@@ -778,7 +778,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 225,
crystalReward: 8e15,
crystalReward: 0,
currentHp: 3e21,
damagePerSecond: 8e15,
description:
@@ -797,7 +797,7 @@ export const defaultBosses: Array<Boss> = [
// ── Eternal Throne ────────────────────────────────────────────────────────
{
bountyRunestones: 115,
crystalReward: 2e16,
crystalReward: 0,
currentHp: 1e22,
damagePerSecond: 2e16,
description:
@@ -815,7 +815,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 150,
crystalReward: 8e16,
crystalReward: 0,
currentHp: 5e22,
damagePerSecond: 8e16,
description:
@@ -833,7 +833,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 190,
crystalReward: 3e17,
crystalReward: 0,
currentHp: 2e23,
damagePerSecond: 3e17,
description:
@@ -851,7 +851,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 235,
crystalReward: 1.2e18,
crystalReward: 0,
currentHp: 8e23,
damagePerSecond: 1.2e18,
description:
@@ -869,7 +869,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 295,
crystalReward: 5e18,
crystalReward: 0,
currentHp: 3e24,
damagePerSecond: 5e18,
description:
@@ -888,7 +888,7 @@ export const defaultBosses: Array<Boss> = [
// ── Primordial Chaos ──────────────────────────────────────────────────────
{
bountyRunestones: 150,
crystalReward: 2e20,
crystalReward: 0,
currentHp: 1e26,
damagePerSecond: 2e20,
description:
@@ -906,7 +906,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 200,
crystalReward: 8e21,
crystalReward: 0,
currentHp: 5e27,
damagePerSecond: 8e21,
description:
@@ -924,7 +924,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 265,
crystalReward: 4e23,
crystalReward: 0,
currentHp: 2e29,
damagePerSecond: 4e23,
description:
@@ -942,7 +942,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 350,
crystalReward: 2e25,
crystalReward: 0,
currentHp: 8e30,
damagePerSecond: 2e25,
description:
@@ -961,7 +961,7 @@ export const defaultBosses: Array<Boss> = [
// ── Infinite Expanse ──────────────────────────────────────────────────────
{
bountyRunestones: 200,
crystalReward: 8e27,
crystalReward: 0,
currentHp: 3e33,
damagePerSecond: 8e27,
description:
@@ -979,7 +979,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 265,
crystalReward: 3e31,
crystalReward: 0,
currentHp: 2e35,
damagePerSecond: 3e31,
description:
@@ -997,7 +997,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 350,
crystalReward: 1e35,
crystalReward: 0,
currentHp: 5e37,
damagePerSecond: 1e35,
description:
@@ -1015,7 +1015,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 465,
crystalReward: 5e38,
crystalReward: 0,
currentHp: 3e39,
damagePerSecond: 5e38,
description:
@@ -1034,7 +1034,7 @@ export const defaultBosses: Array<Boss> = [
// ── Reality Forge ─────────────────────────────────────────────────────────
{
bountyRunestones: 265,
crystalReward: 2e42,
crystalReward: 0,
currentHp: 8e47,
damagePerSecond: 2e42,
description:
@@ -1052,7 +1052,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 350,
crystalReward: 1e47,
crystalReward: 0,
currentHp: 4e52,
damagePerSecond: 1e47,
description:
@@ -1070,7 +1070,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 465,
crystalReward: 6e51,
crystalReward: 0,
currentHp: 2e57,
damagePerSecond: 6e51,
description:
@@ -1088,7 +1088,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 615,
crystalReward: 2e56,
crystalReward: 0,
currentHp: 8e61,
damagePerSecond: 2e56,
description:
@@ -1107,7 +1107,7 @@ export const defaultBosses: Array<Boss> = [
// ── Cosmic Maelstrom ──────────────────────────────────────────────────────
{
bountyRunestones: 350,
crystalReward: 1e60,
crystalReward: 0,
currentHp: 4e65,
damagePerSecond: 1e60,
description:
@@ -1125,7 +1125,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 465,
crystalReward: 6e65,
crystalReward: 0,
currentHp: 2e71,
damagePerSecond: 6e65,
description:
@@ -1143,7 +1143,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 615,
crystalReward: 3e71,
crystalReward: 0,
currentHp: 1e77,
damagePerSecond: 3e71,
description:
@@ -1161,7 +1161,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 815,
crystalReward: 1e77,
crystalReward: 0,
currentHp: 5e82,
damagePerSecond: 1e77,
description:
@@ -1180,7 +1180,7 @@ export const defaultBosses: Array<Boss> = [
// ── Primeval Sanctum ──────────────────────────────────────────────────────
{
bountyRunestones: 465,
crystalReward: 5e82,
crystalReward: 0,
currentHp: 2e88,
damagePerSecond: 5e82,
description:
@@ -1198,7 +1198,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 615,
crystalReward: 3e89,
crystalReward: 0,
currentHp: 1e95,
damagePerSecond: 3e89,
description:
@@ -1216,7 +1216,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 815,
crystalReward: 2e96,
crystalReward: 0,
currentHp: 8e101,
damagePerSecond: 2e96,
description:
@@ -1234,7 +1234,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 1080,
crystalReward: 1e103,
crystalReward: 0,
currentHp: 5e108,
damagePerSecond: 1e103,
description:
@@ -1253,7 +1253,7 @@ export const defaultBosses: Array<Boss> = [
// ── The Absolute ──────────────────────────────────────────────────────────
{
bountyRunestones: 615,
crystalReward: 5e110,
crystalReward: 0,
currentHp: 2e116,
damagePerSecond: 5e110,
description:
@@ -1271,7 +1271,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 815,
crystalReward: 3e119,
crystalReward: 0,
currentHp: 1e125,
damagePerSecond: 3e119,
description:
@@ -1289,7 +1289,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 1080,
crystalReward: 1e129,
crystalReward: 0,
currentHp: 5e134,
damagePerSecond: 1e129,
description:
@@ -1307,7 +1307,7 @@ export const defaultBosses: Array<Boss> = [
},
{
bountyRunestones: 1430,
crystalReward: 5e139,
crystalReward: 0,
currentHp: 2e145,
damagePerSecond: 5e139,
description:
+163 -1
View File
@@ -695,6 +695,168 @@ export const defaultEquipment: Array<Equipment> = [
setId: "eternal_throne",
type: "trinket",
},
// ── Primordial Chaos ──────────────────────────────────────────────────────
{
bonus: { goldMultiplier: 9 },
description:
"The Primordial Titan's carapace — formed before the concept of armour existed. It simply is what armour aspires to be.",
equipped: false,
id: "chaos_mantle",
name: "The Chaos Mantle",
owned: false,
rarity: "legendary",
setId: "primordial_chaos",
type: "armour",
},
{
bonus: { clickMultiplier: 5, combatMultiplier: 2, goldMultiplier: 2.5 },
description:
"The crystallised core of the Titan itself — the first stable thing to emerge from chaos. It radiates in every direction simultaneously.",
equipped: false,
id: "titan_core",
name: "The Titan Core",
owned: false,
rarity: "legendary",
setId: "primordial_chaos",
type: "trinket",
},
// ── Infinite Expanse ──────────────────────────────────────────────────────
{
bonus: { combatMultiplier: 14 },
description:
"Forged from the Expanse Sovereign's own reach — a blade that has no beginning and no end, only edge.",
equipped: false,
id: "expanse_blade",
name: "The Expanse Blade",
owned: false,
rarity: "legendary",
setId: "infinite_expanse",
type: "weapon",
},
{
bonus: { goldMultiplier: 10 },
description:
"A second iteration of the void's armour — the first was not enough. This one has never been tested to its limit.",
equipped: false,
id: "void_armour_mk2",
name: "Void Armour Mk. II",
owned: false,
rarity: "legendary",
setId: "infinite_expanse",
type: "armour",
},
// ── Reality Forge ─────────────────────────────────────────────────────────
{
bonus: { combatMultiplier: 16 },
description:
"The Reality Architect's primary instrument — a sword that does not cut through things but rewrites what they are.",
equipped: false,
id: "cosmos_blade",
name: "The Cosmos Blade",
owned: false,
rarity: "legendary",
setId: "reality_forge",
type: "weapon",
},
{
bonus: { goldMultiplier: 12 },
description:
"Plated from the substance of reality itself — wearing it makes you feel slightly more real than everything around you.",
equipped: false,
id: "reality_plate",
name: "The Reality Plate",
owned: false,
rarity: "legendary",
setId: "reality_forge",
type: "armour",
},
// ── Cosmic Maelstrom ──────────────────────────────────────────────────────
{
bonus: { combatMultiplier: 18 },
description:
"Torn from the eye of the Cosmic Annihilator — a weapon that carries the force of an ending universe in every swing.",
equipped: false,
id: "maelstrom_edge",
name: "The Maelstrom Edge",
owned: false,
rarity: "legendary",
setId: "cosmic_maelstrom",
type: "weapon",
},
{
bonus: { goldMultiplier: 14 },
description:
"Armour that has weathered the destruction of countless realities. It has learned not to flinch.",
equipped: false,
id: "cosmic_plate",
name: "The Cosmic Plate",
owned: false,
rarity: "legendary",
setId: "cosmic_maelstrom",
type: "armour",
},
// ── Primeval Sanctum ──────────────────────────────────────────────────────
{
bonus: { combatMultiplier: 22 },
description:
"The first weapon — older than the concept of war, older than the concept of a weapon. It remembers what it was made for.",
equipped: false,
id: "primeval_blade",
name: "The Primeval Blade",
owned: false,
rarity: "legendary",
setId: "primeval_sanctum",
type: "weapon",
},
{
bonus: { goldMultiplier: 17 },
description:
"The shield-form of the Primeval God — absolute protection from before the concept of harm existed.",
equipped: false,
id: "ancient_aegis",
name: "The Ancient Aegis",
owned: false,
rarity: "legendary",
setId: "primeval_sanctum",
type: "armour",
},
// ── The Absolute ──────────────────────────────────────────────────────────
{
bonus: { combatMultiplier: 28 },
description:
"There is no name for what this was before it became a sword. There is no name for what it is now. It ends things.",
equipped: false,
id: "absolute_blade",
name: "The Absolute Blade",
owned: false,
rarity: "legendary",
setId: "the_absolute",
type: "weapon",
},
{
bonus: { goldMultiplier: 20 },
description:
"Eternity given the shape of armour — it has always existed, it will always exist, and it has always protected its wearer.",
equipped: false,
id: "eternity_plate",
name: "The Eternity Plate",
owned: false,
rarity: "legendary",
setId: "the_absolute",
type: "armour",
},
{
bonus: { clickMultiplier: 6, combatMultiplier: 3, goldMultiplier: 3 },
description:
"The heart of everything — a thing so fundamental that its removal from the Absolute One ended all things, briefly. Briefly.",
equipped: false,
id: "omniversal_core",
name: "The Omniversal Core",
owned: false,
rarity: "legendary",
setId: "the_absolute",
type: "trinket",
},
// ── Purchasable endgame sinks ─────────────────────────────────────────────
{
bonus: { clickMultiplier: 4.25 },
@@ -757,7 +919,7 @@ export const defaultEquipment: Array<Equipment> = [
type: "armour",
},
{
bonus: { clickMultiplier: 5, combatMultiplier: 1.75, goldMultiplier: 2 },
bonus: { clickMultiplier: 5, combatMultiplier: 3, goldMultiplier: 2.5 },
cost: { crystals: 100_000_000, essence: 0, gold: 0 },
description:
"An artifact from beyond all known planes — it refracts power through all dimensions simultaneously.",
+68 -68
View File
@@ -265,9 +265,9 @@ export const defaultQuests: Array<Quest> = [
name: "The Sunken Temple",
prerequisiteIds: [ "witch_coven" ],
rewards: [
{ amount: 2_000_000, type: "gold" },
{ amount: 1500, type: "essence" },
{ amount: 75, type: "crystals" },
{ amount: 60_000_000, type: "gold" },
{ amount: 25_000, type: "essence" },
{ amount: 400, type: "crystals" },
],
status: "locked",
zoneId: "shadow_marshes",
@@ -643,7 +643,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 2_000_000_000_000_000, type: "gold" },
{ amount: 600_000_000_000, type: "essence" },
{ amount: 1_000_000_000, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "infernal_court",
@@ -659,7 +659,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 6_000_000_000_000_000, type: "gold" },
{ amount: 2_000_000_000_000, type: "essence" },
{ amount: 3_000_000_000, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "infernal_court",
@@ -675,7 +675,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 2e16, type: "gold" },
{ amount: 6_000_000_000_000, type: "essence" },
{ amount: 8_000_000_000, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "infernal_court",
@@ -691,7 +691,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 6e16, type: "gold" },
{ amount: 2e13, type: "essence" },
{ amount: 2.5e10, type: "crystals" },
{ amount: 0, type: "crystals" },
{ targetId: "infernal_warden_1", type: "upgrade" },
],
status: "locked",
@@ -708,7 +708,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 2e17, type: "gold" },
{ amount: 6e13, type: "essence" },
{ amount: 8e10, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "infernal_court",
@@ -741,7 +741,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 2e18, type: "gold" },
{ amount: 8e14, type: "essence" },
{ amount: 3e12, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "crystalline_spire",
@@ -757,7 +757,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 8e18, type: "gold" },
{ amount: 3e15, type: "essence" },
{ amount: 1e13, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "crystalline_spire",
@@ -773,7 +773,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 3e19, type: "gold" },
{ amount: 1e16, type: "essence" },
{ amount: 4e13, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "crystalline_spire",
@@ -789,7 +789,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 1e20, type: "gold" },
{ amount: 4e16, type: "essence" },
{ amount: 1.5e14, type: "crystals" },
{ amount: 0, type: "crystals" },
{ targetId: "crystal_sage_1", type: "upgrade" },
],
status: "locked",
@@ -806,7 +806,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 4e20, type: "gold" },
{ amount: 1.5e17, type: "essence" },
{ amount: 5e14, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "crystalline_spire",
@@ -839,7 +839,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 5e21, type: "gold" },
{ amount: 2e18, type: "essence" },
{ amount: 2e15, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "void_sanctum",
@@ -855,7 +855,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 2e22, type: "gold" },
{ amount: 8e18, type: "essence" },
{ amount: 8e15, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "void_sanctum",
@@ -871,7 +871,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 8e22, type: "gold" },
{ amount: 3e19, type: "essence" },
{ amount: 3e16, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "void_sanctum",
@@ -887,7 +887,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 3e23, type: "gold" },
{ amount: 1e20, type: "essence" },
{ amount: 1e17, type: "crystals" },
{ amount: 0, type: "crystals" },
{ targetId: "void_sentinel_1", type: "upgrade" },
],
status: "locked",
@@ -904,7 +904,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 1e24, type: "gold" },
{ amount: 4e20, type: "essence" },
{ amount: 4e17, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "void_sanctum",
@@ -937,7 +937,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 1e25, type: "gold" },
{ amount: 4e21, type: "essence" },
{ amount: 1.5e18, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "eternal_throne",
@@ -953,7 +953,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 4e25, type: "gold" },
{ amount: 1.5e22, type: "essence" },
{ amount: 5e18, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "eternal_throne",
@@ -969,7 +969,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 1.5e26, type: "gold" },
{ amount: 6e22, type: "essence" },
{ amount: 2e19, type: "crystals" },
{ amount: 0, type: "crystals" },
{ targetId: "eternal_champion_1", type: "upgrade" },
],
status: "locked",
@@ -986,7 +986,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 6e26, type: "gold" },
{ amount: 2.5e23, type: "essence" },
{ amount: 8e19, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "eternal_throne",
@@ -1002,7 +1002,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 3e27, type: "gold" },
{ amount: 1e24, type: "essence" },
{ amount: 4e20, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "eternal_throne",
@@ -1035,7 +1035,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 4e28, type: "gold" },
{ amount: 1.5e25, type: "essence" },
{ amount: 5e21, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "primordial_chaos",
@@ -1051,7 +1051,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 2e29, type: "gold" },
{ amount: 8e25, type: "essence" },
{ amount: 2e22, type: "crystals" },
{ amount: 0, type: "crystals" },
{ targetId: "titan_warrior", type: "adventurer" },
],
status: "locked",
@@ -1068,7 +1068,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 1e30, type: "gold" },
{ amount: 4e26, type: "essence" },
{ amount: 8e22, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "primordial_chaos",
@@ -1084,7 +1084,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 6e30, type: "gold" },
{ amount: 2e27, type: "essence" },
{ amount: 4e23, type: "crystals" },
{ amount: 0, type: "crystals" },
{ targetId: "titan_warrior_1", type: "upgrade" },
],
status: "locked",
@@ -1101,7 +1101,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 3e31, type: "gold" },
{ amount: 1e28, type: "essence" },
{ amount: 2e24, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "primordial_chaos",
@@ -1134,7 +1134,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 6e34, type: "gold" },
{ amount: 2e31, type: "essence" },
{ amount: 5e27, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "infinite_expanse",
@@ -1150,7 +1150,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 3e36, type: "gold" },
{ amount: 1e33, type: "essence" },
{ amount: 2.5e29, type: "crystals" },
{ amount: 0, type: "crystals" },
{ targetId: "cosmos_knight", type: "adventurer" },
],
status: "locked",
@@ -1167,7 +1167,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 1.5e38, type: "gold" },
{ amount: 5e34, type: "essence" },
{ amount: 1e31, type: "crystals" },
{ amount: 0, type: "crystals" },
{ targetId: "nexus_sage_1", type: "upgrade" },
],
status: "locked",
@@ -1184,7 +1184,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 8e39, type: "gold" },
{ amount: 2.5e36, type: "essence" },
{ amount: 5e32, type: "crystals" },
{ amount: 0, type: "crystals" },
{ targetId: "cosmos_knight_1", type: "upgrade" },
],
status: "locked",
@@ -1201,7 +1201,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 4e41, type: "gold" },
{ amount: 1.2e38, type: "essence" },
{ amount: 2.5e34, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "infinite_expanse",
@@ -1234,7 +1234,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 1e46, type: "gold" },
{ amount: 3e42, type: "essence" },
{ amount: 2e38, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "reality_forge",
@@ -1250,7 +1250,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 5e47, type: "gold" },
{ amount: 1.5e44, type: "essence" },
{ amount: 1e40, type: "crystals" },
{ amount: 0, type: "crystals" },
{ targetId: "primordial_mage", type: "adventurer" },
],
status: "locked",
@@ -1267,7 +1267,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 2.5e49, type: "gold" },
{ amount: 8e45, type: "essence" },
{ amount: 5e41, type: "crystals" },
{ amount: 0, type: "crystals" },
{ targetId: "primordial_mage_1", type: "upgrade" },
],
status: "locked",
@@ -1284,7 +1284,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 1.2e51, type: "gold" },
{ amount: 4e47, type: "essence" },
{ amount: 2.5e43, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "reality_forge",
@@ -1300,7 +1300,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 6e52, type: "gold" },
{ amount: 2e49, type: "essence" },
{ amount: 1.2e45, type: "crystals" },
{ amount: 0, type: "crystals" },
{ targetId: "astral_sovereign_1", type: "upgrade" },
],
status: "locked",
@@ -1317,7 +1317,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 5e62, type: "gold" },
{ amount: 1.5e59, type: "essence" },
{ amount: 8e54, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "reality_forge",
@@ -1333,7 +1333,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 2e67, type: "gold" },
{ amount: 6e63, type: "essence" },
{ amount: 3e59, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "reality_forge",
@@ -1349,7 +1349,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 1e72, type: "gold" },
{ amount: 3e68, type: "essence" },
{ amount: 1.5e64, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "reality_forge",
@@ -1382,7 +1382,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 1.5e58, type: "gold" },
{ amount: 5e54, type: "essence" },
{ amount: 3e50, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "cosmic_maelstrom",
@@ -1398,7 +1398,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 8e60, type: "gold" },
{ amount: 2.5e57, type: "essence" },
{ amount: 1.5e53, type: "crystals" },
{ amount: 0, type: "crystals" },
{ targetId: "infinity_ranger", type: "adventurer" },
],
status: "locked",
@@ -1415,7 +1415,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 4e63, type: "gold" },
{ amount: 1.2e60, type: "essence" },
{ amount: 7e55, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "cosmic_maelstrom",
@@ -1431,7 +1431,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 2e66, type: "gold" },
{ amount: 6e62, type: "essence" },
{ amount: 3.5e58, type: "crystals" },
{ amount: 0, type: "crystals" },
{ targetId: "reality_warden_1", type: "upgrade" },
],
status: "locked",
@@ -1448,7 +1448,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 1e69, type: "gold" },
{ amount: 3e65, type: "essence" },
{ amount: 1.8e61, type: "crystals" },
{ amount: 0, type: "crystals" },
{ targetId: "infinity_ranger_1", type: "upgrade" },
],
status: "locked",
@@ -1465,7 +1465,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 5e76, type: "gold" },
{ amount: 1.5e73, type: "essence" },
{ amount: 8e68, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "cosmic_maelstrom",
@@ -1481,7 +1481,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 2e83, type: "gold" },
{ amount: 6e79, type: "essence" },
{ amount: 3e75, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "cosmic_maelstrom",
@@ -1497,7 +1497,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 1e90, type: "gold" },
{ amount: 3e86, type: "essence" },
{ amount: 1.5e82, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "cosmic_maelstrom",
@@ -1530,7 +1530,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 2.5e76, type: "gold" },
{ amount: 7e72, type: "essence" },
{ amount: 4e68, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "primeval_sanctum",
@@ -1546,7 +1546,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 1.2e80, type: "gold" },
{ amount: 3.5e76, type: "essence" },
{ amount: 2e72, type: "crystals" },
{ amount: 0, type: "crystals" },
{ targetId: "transcendent_rogue", type: "adventurer" },
],
status: "locked",
@@ -1563,7 +1563,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 6e83, type: "gold" },
{ amount: 1.8e80, type: "essence" },
{ amount: 1e76, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "primeval_sanctum",
@@ -1579,7 +1579,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 3e87, type: "gold" },
{ amount: 9e83, type: "essence" },
{ amount: 5e79, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "primeval_sanctum",
@@ -1595,7 +1595,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 1.5e91, type: "gold" },
{ amount: 4.5e87, type: "essence" },
{ amount: 2.5e83, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "primeval_sanctum",
@@ -1611,7 +1611,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 8e95, type: "gold" },
{ amount: 2.5e92, type: "essence" },
{ amount: 1e88, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "primeval_sanctum",
@@ -1627,7 +1627,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 4e102, type: "gold" },
{ amount: 1.2e99, type: "essence" },
{ amount: 5e94, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "primeval_sanctum",
@@ -1643,7 +1643,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 2e109, type: "gold" },
{ amount: 6e105, type: "essence" },
{ amount: 2.5e101, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "primeval_sanctum",
@@ -1676,7 +1676,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 4e101, type: "gold" },
{ amount: 1.2e98, type: "essence" },
{ amount: 6e93, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "the_absolute",
@@ -1692,7 +1692,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 2e108, type: "gold" },
{ amount: 6e104, type: "essence" },
{ amount: 3e100, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "the_absolute",
@@ -1708,7 +1708,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 1e115, type: "gold" },
{ amount: 3e111, type: "essence" },
{ amount: 1.5e107, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "the_absolute",
@@ -1724,7 +1724,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 5e121, type: "gold" },
{ amount: 1.5e118, type: "essence" },
{ amount: 7e113, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "the_absolute",
@@ -1740,7 +1740,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 3e130, type: "gold" },
{ amount: 9e126, type: "essence" },
{ amount: 4e122, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "the_absolute",
@@ -1756,7 +1756,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 1e118, type: "gold" },
{ amount: 3e114, type: "essence" },
{ amount: 1.5e110, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "the_absolute",
@@ -1772,7 +1772,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 5e124, type: "gold" },
{ amount: 1.5e121, type: "essence" },
{ amount: 7e116, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "the_absolute",
@@ -1788,7 +1788,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 2e131, type: "gold" },
{ amount: 6e127, type: "essence" },
{ amount: 3e123, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "the_absolute",
@@ -1804,7 +1804,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 1e137, type: "gold" },
{ amount: 3e133, type: "essence" },
{ amount: 1.5e129, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "the_absolute",
@@ -1820,7 +1820,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 5e143, type: "gold" },
{ amount: 1.5e140, type: "essence" },
{ amount: 7e135, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "the_absolute",
@@ -1836,7 +1836,7 @@ export const defaultQuests: Array<Quest> = [
rewards: [
{ amount: 2e150, type: "gold" },
{ amount: 6e146, type: "essence" },
{ amount: 3e142, type: "crystals" },
{ amount: 0, type: "crystals" },
],
status: "locked",
zoneId: "the_absolute",
+2 -2
View File
@@ -104,7 +104,7 @@ export const defaultUpgrades: Array<Upgrade> = [
description:
"Forge partnerships with mage guilds across the realm. All income +50%.",
id: "essence_guild",
multiplier: 1.5,
multiplier: 2,
name: "Essence Guild",
purchased: false,
target: "global",
@@ -459,7 +459,7 @@ export const defaultUpgrades: Array<Upgrade> = [
unlocked: false,
},
{
costCrystals: 10_000_000,
costCrystals: 50_000_000,
costEssence: 0,
costGold: 0,
description: "Transcend mortal limits through void energy. All income x3.",
+16 -11
View File
@@ -11,7 +11,6 @@
/* eslint-disable max-lines -- Engine file necessarily exceeds line limit */
/* eslint-disable import/group-exports -- Exports appear alongside their definitions for readability */
/* eslint-disable import/exports-last -- Exports appear alongside their definitions for readability */
/* eslint-disable unicorn/no-array-reduce -- reduce is the most readable approach for multiplier chains */
/* eslint-disable max-nested-callbacks -- Tick engine requires nested array operations for game logic */
import {
type Achievement,
@@ -476,8 +475,8 @@ export const computeProjectedRunestones = (state: GameState): number => {
? 1.5
: 1;
const runestoneMult = gain1Mult * gain2Mult;
/* eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- optional chained game state field */
const echoMult: number = state.transcendence?.echoPrestigeRunestoneMultiplier ?? 1;
const echoMult: number
= state.transcendence?.echoPrestigeRunestoneMultiplier ?? 1;
return Math.floor(base * runestoneMult * echoMult);
};
@@ -818,23 +817,29 @@ export const applyTick = (
zones: updatedZones,
};
// Check achievements and apply crystal rewards for newly unlocked ones
// Check achievements and apply crystal and runestone rewards for newly unlocked ones
const updatedAchievements = checkAchievements(partialState);
const crystalsFromAchievements = updatedAchievements.reduce(
(sum, achievement, index) => {
let crystalsFromAchievements = 0;
let runestonesFromAchievements = 0;
for (const [ index, achievement ] of updatedAchievements.entries()) {
const wasLocked = state.achievements[index]?.unlockedAt === null;
const isNowUnlocked = achievement.unlockedAt !== null;
if (wasLocked && isNowUnlocked) {
return sum + (achievement.reward?.crystals ?? 0);
crystalsFromAchievements
= crystalsFromAchievements + (achievement.reward?.crystals ?? 0);
runestonesFromAchievements
= runestonesFromAchievements + (achievement.reward?.runestones ?? 0);
}
}
return sum;
},
0,
);
return {
...partialState,
achievements: updatedAchievements,
prestige: {
...partialState.prestige,
runestones:
partialState.prestige.runestones + runestonesFromAchievements,
},
resources: {
...partialState.resources,
crystals: capResource(
@@ -21,6 +21,7 @@ interface AchievementCondition {
interface AchievementReward {
crystals?: number;
runestones?: number;
}
interface Achievement {