feat: add daily challenges system

Three PST-midnight-resetting challenges generated deterministically per
day from click, boss, quest, and prestige types. Progress tracked
server-side for bosses and prestige, client-side for clicks and quests.
Crystal rewards awarded on completion and preserved through prestige resets.
This commit is contained in:
2026-03-06 22:22:18 -08:00
committed by Naomi Carrigan
parent a7d4b72805
commit aaeece1a18
15 changed files with 462 additions and 8 deletions
+5
View File
@@ -22,6 +22,11 @@ export type {
UpdateProfileResponse,
} from "./interfaces/Api.js";
export type { Boss, BossStatus } from "./interfaces/Boss.js";
export type {
DailyChallenge,
DailyChallengeState,
DailyChallengeType,
} from "./interfaces/DailyChallenge.js";
export type {
Equipment,
EquipmentBonus,
@@ -0,0 +1,17 @@
export type DailyChallengeType = "clicks" | "bossesDefeated" | "questsCompleted" | "prestige";
export interface DailyChallenge {
id: string;
type: DailyChallengeType;
label: string;
target: number;
progress: number;
completed: boolean;
rewardCrystals: number;
}
export interface DailyChallengeState {
/** ISO date string (e.g. "2026-03-06") used to detect when to reset */
date: string;
challenges: DailyChallenge[];
}
@@ -1,6 +1,7 @@
import type { Achievement } from "./Achievement.js";
import type { Adventurer } from "./Adventurer.js";
import type { Boss } from "./Boss.js";
import type { DailyChallengeState } from "./DailyChallenge.js";
import type { Equipment } from "./Equipment.js";
import type { Player } from "./Player.js";
import type { PrestigeData } from "./Prestige.js";
@@ -24,4 +25,6 @@ export interface GameState {
baseClickPower: number;
/** Unix timestamp of the last client-side tick */
lastTickAt: number;
/** Daily challenge progress — optional for backwards compatibility with old saves */
dailyChallenges?: DailyChallengeState;
}