feat: content expansion, prestige shop, and offline earnings improvements

- Expand content to 18 zones, 72 bosses, 95 quests, 32 adventurer tiers
- Add prestige shop with 24 runestone upgrades across 5 categories
- Add PrestigeUpgrade type, data files, API routes, and frontend panel
- Fix offline earnings to include equipment and runestone multipliers
- Add offline essence calculation alongside offline gold
- Update OfflineModal to display both gold and essence earned
- Add IDEAS.md for tracking planned features
This commit is contained in:
2026-03-06 21:55:42 -08:00
committed by Naomi Carrigan
parent 6bc116a86a
commit 5b4661b398
23 changed files with 2288 additions and 91 deletions
+16 -2
View File
@@ -57,6 +57,10 @@ export const applyTick = (state: GameState, deltaSeconds: number): GameState =>
1,
);
const runestonesIncome = state.prestige.runestonesIncomeMultiplier ?? 1;
const runestonesEssence = state.prestige.runestonesEssenceMultiplier ?? 1;
const runestonesCrystal = state.prestige.runestonesCrystalMultiplier ?? 1;
let goldGained = 0;
let essenceGained = 0;
@@ -81,6 +85,7 @@ export const applyTick = (state: GameState, deltaSeconds: number): GameState =>
adventurer.count *
upgradeMultiplier *
prestige *
runestonesIncome *
equipmentGoldMultiplier *
deltaSeconds;
@@ -89,6 +94,7 @@ export const applyTick = (state: GameState, deltaSeconds: number): GameState =>
adventurer.count *
upgradeMultiplier *
prestige *
runestonesEssence *
deltaSeconds;
}
@@ -117,7 +123,7 @@ export const applyTick = (state: GameState, deltaSeconds: number): GameState =>
} else if (reward.type === "essence" && reward.amount != null) {
questEssence += reward.amount;
} else if (reward.type === "crystals" && reward.amount != null) {
questCrystals += reward.amount;
questCrystals += reward.amount * runestonesCrystal;
} else if (reward.type === "upgrade" && reward.targetId != null) {
updatedUpgrades = updatedUpgrades.map((u) =>
u.id === reward.targetId ? { ...u, unlocked: true } : u,
@@ -250,5 +256,13 @@ export const calculateClickPower = (state: GameState): number => {
.filter((e) => e.equipped && e.bonus.clickMultiplier != null)
.reduce((mult, e) => mult * (e.bonus.clickMultiplier ?? 1), 1);
return state.baseClickPower * clickMultiplier * state.prestige.productionMultiplier * equipmentClickMultiplier;
const runestonesClick = state.prestige.runestonesClickMultiplier ?? 1;
return (
state.baseClickPower *
clickMultiplier *
state.prestige.productionMultiplier *
runestonesClick *
equipmentClickMultiplier
);
};