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
+6
View File
@@ -10,6 +10,8 @@ export type {
AuthResponse,
BossChallengeRequest,
BossChallengeResponse,
BuyPrestigeUpgradeRequest,
BuyPrestigeUpgradeResponse,
LoadResponse,
PrestigeRequest,
PrestigeResponse,
@@ -29,6 +31,10 @@ export type {
export type { GameState } from "./interfaces/GameState.js";
export type { Player } from "./interfaces/Player.js";
export type { PrestigeData } from "./interfaces/Prestige.js";
export type {
PrestigeUpgrade,
PrestigeUpgradeCategory,
} from "./interfaces/PrestigeUpgrade.js";
export type {
Quest,
QuestReward,
+15
View File
@@ -24,6 +24,8 @@ export interface LoadResponse {
state: GameState;
/** Offline gold earned since last save (server-calculated) */
offlineGold: number;
/** Offline essence earned since last save (server-calculated) */
offlineEssence: number;
/** Seconds the player was offline (capped at 8 hours) */
offlineSeconds: number;
/** HMAC-SHA256 signature of the loaded state — store and include in next save request */
@@ -72,6 +74,19 @@ export interface PrestigeResponse {
newPrestigeCount: number;
}
export interface BuyPrestigeUpgradeRequest {
upgradeId: string;
}
export interface BuyPrestigeUpgradeResponse {
runestonesRemaining: number;
purchasedUpgradeIds: string[];
runestonesIncomeMultiplier: number;
runestonesClickMultiplier: number;
runestonesEssenceMultiplier: number;
runestonesCrystalMultiplier: number;
}
export interface PublicProfileResponse {
characterName: string;
username: string;
@@ -9,4 +9,12 @@ export interface PrestigeData {
purchasedUpgradeIds: string[];
/** Unix timestamp of last prestige */
lastPrestigedAt?: number;
/** Pre-computed multiplier from "income" runestone upgrades */
runestonesIncomeMultiplier?: number;
/** Pre-computed multiplier from "click" runestone upgrades */
runestonesClickMultiplier?: number;
/** Pre-computed multiplier from "essence" runestone upgrades */
runestonesEssenceMultiplier?: number;
/** Pre-computed multiplier from "crystals" runestone upgrades */
runestonesCrystalMultiplier?: number;
}
@@ -0,0 +1,16 @@
export type PrestigeUpgradeCategory =
| "income"
| "click"
| "essence"
| "crystals"
| "runestones";
export interface PrestigeUpgrade {
id: string;
name: string;
description: string;
category: PrestigeUpgradeCategory;
runestonesCost: number;
/** Multiplier applied when this upgrade is purchased */
multiplier: number;
}
+2
View File
@@ -23,4 +23,6 @@ export interface Quest {
prerequisiteIds: string[];
/** Zone this quest belongs to */
zoneId: string;
/** Minimum party combat power required to start this quest */
combatPowerRequired?: number;
}