feat: add daily login bonus system with streak tracking

Awards escalating gold rewards each consecutive day (Day 7 grants bonus
crystals). Streak resets on missed days; a week multiplier boosts all
rewards for longer streaks. Shows a modal on first daily load and
displays the current streak on the character sheet.
This commit is contained in:
2026-03-07 15:18:59 -08:00
committed by Naomi Carrigan
parent 3515de62ee
commit bec972aed1
11 changed files with 367 additions and 6 deletions
+5 -1
View File
@@ -23,6 +23,7 @@ import { DailyChallengePanel } from "./DailyChallengePanel.js";
import { ExplorationPanel } from "./ExplorationPanel.js";
import { CharacterSheetPanel } from "./CharacterSheetPanel.js";
import { CraftingPanel } from "./CraftingPanel.js";
import { LoginBonusModal } from "./LoginBonusModal.js";
type Tab = "adventurers" | "upgrades" | "quests" | "bosses" | "equipment" | "achievements" | "prestige" | "transcendence" | "apotheosis" | "statistics" | "daily" | "codex" | "about" | "exploration" | "crafting" | "character";
@@ -46,7 +47,7 @@ const BASE_TABS: { id: Tab; label: string }[] = [
];
export const GameLayout = (): React.JSX.Element => {
const { state, isLoading, error, battleResult, dismissBattle, lastSavedAt, isSyncing, forceSync, newCodexEntryIds } = useGame();
const { state, isLoading, error, battleResult, dismissBattle, lastSavedAt, isSyncing, forceSync, newCodexEntryIds, loginBonus, dismissLoginBonus } = useGame();
const [activeTab, setActiveTab] = useState<Tab>("adventurers");
const [editingProfile, setEditingProfile] = useState(false);
@@ -87,6 +88,9 @@ export const GameLayout = (): React.JSX.Element => {
<OfflineModal />
<AchievementToast />
<CodexToast />
{loginBonus && (
<LoginBonusModal bonus={loginBonus} onClose={dismissLoginBonus} />
)}
{battleResult && (
<BattleModal battle={battleResult} onDismiss={dismissBattle} />
)}