From 55a521a7591231f33c642bd8bed3c6caa7659b6e Mon Sep 17 00:00:00 2001 From: Hikari Date: Mon, 6 Apr 2026 18:44:44 -0700 Subject: [PATCH] balance: increase runestone yield and reduce income_10/11 costs (closes #166, #170) --- apps/api/src/data/prestigeUpgrades.ts | 4 ++-- apps/api/src/services/prestige.ts | 2 +- apps/api/test/services/prestige.spec.ts | 14 +++++++------- apps/web/src/engine/tick.ts | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/apps/api/src/data/prestigeUpgrades.ts b/apps/api/src/data/prestigeUpgrades.ts index 6d33eb0..d314cbc 100644 --- a/apps/api/src/data/prestigeUpgrades.ts +++ b/apps/api/src/data/prestigeUpgrades.ts @@ -96,7 +96,7 @@ export const defaultPrestigeUpgrades: Array = [ id: "income_10", multiplier: 200, name: "Eternal Rune I", - runestonesCost: 22_500, + runestonesCost: 15_000, }, { category: "income", @@ -105,7 +105,7 @@ export const defaultPrestigeUpgrades: Array = [ id: "income_11", multiplier: 500, name: "Eternal Rune II", - runestonesCost: 60_000, + runestonesCost: 35_000, }, // ── Click Power ─────────────────────────────────────────────────────────── { diff --git a/apps/api/src/services/prestige.ts b/apps/api/src/services/prestige.ts index 4fd106e..6ec8d2b 100644 --- a/apps/api/src/services/prestige.ts +++ b/apps/api/src/services/prestige.ts @@ -15,7 +15,7 @@ import type { } from "@elysium/types"; const basePrestigeGoldThreshold = 1_000_000; -const runestonesPerPrestigeLevel = 15; +const runestonesPerPrestigeLevel = 20; const milestoneInterval = 5; const milestoneRunestonesPerInterval = 25; diff --git a/apps/api/test/services/prestige.spec.ts b/apps/api/test/services/prestige.spec.ts index 90fbddf..95e71bc 100644 --- a/apps/api/test/services/prestige.spec.ts +++ b/apps/api/test/services/prestige.spec.ts @@ -102,25 +102,25 @@ describe("isEligibleForPrestige", () => { describe("calculateRunestones", () => { it("calculates basic runestones formula", () => { - // floor(cbrt(4_000_000 / 1_000_000)) × 15 = floor(cbrt(4)) × 15 = 1 × 15 = 15 + // floor(cbrt(4_000_000 / 1_000_000)) × 20 = floor(cbrt(4)) × 20 = 1 × 20 = 20 const result = calculateRunestones({ totalGoldEarned: 4_000_000, prestigeCount: 0, purchasedUpgradeIds: [] }); - expect(result).toBe(15); + expect(result).toBe(20); }); it("applies echo runestone multiplier", () => { - // floor(cbrt(4)) × 15 = 15; × 2 = 30 + // floor(cbrt(4)) × 20 = 20; × 2 = 40 const result = calculateRunestones({ totalGoldEarned: 4_000_000, prestigeCount: 0, purchasedUpgradeIds: [], echoRunestoneMultiplier: 2 }); - expect(result).toBe(30); + expect(result).toBe(40); }); it("applies purchased runestone upgrade multiplier", () => { - // With "runestone_gain_1" purchased (multiplier 1.25): floor(15 × 1.25) = 18 + // With "runestone_gain_1" purchased (multiplier 1.25): floor(20 × 1.25) = 25 const result = calculateRunestones({ totalGoldEarned: 4_000_000, prestigeCount: 0, purchasedUpgradeIds: ["runestone_gain_1"] }); - expect(result).toBe(18); + expect(result).toBe(25); }); it("caps base runestones before multipliers", () => { - // cbrt(9_261_000_000 / 1_000_000) = cbrt(9261) = 21 → 21 × 10 = 210, capped at 200 + // cbrt(9_261_000_000 / 1_000_000) = cbrt(9261) = 21 → 21 × 20 = 420, capped at 200 const result = calculateRunestones({ totalGoldEarned: 9_261_000_000, prestigeCount: 0, purchasedUpgradeIds: [] }); expect(result).toBe(200); }); diff --git a/apps/web/src/engine/tick.ts b/apps/web/src/engine/tick.ts index 2be1ba7..6596555 100644 --- a/apps/web/src/engine/tick.ts +++ b/apps/web/src/engine/tick.ts @@ -451,7 +451,7 @@ export const computePartyCombatPower = (state: GameState): number => { }; const basePrestigeThreshold = 1_000_000; -const runestonesPerPrestigeLevelClient = 15; +const runestonesPerPrestigeLevelClient = 20; const maxBaseRunestones = 200; /**