{skill.title}
{skill.description}
import { useEffect, useState } from 'react'; import { Navigate } from 'react-router-dom'; import { api, formatCredits } from '../api'; import { useAuth } from '../AuthContext'; function formatSkillValue(skill, value) { const prefix = skill.prefix || ''; if (skill.unit === 'cr-cents') { return `${prefix}${formatCredits(value)} cr`.replace(/^\+\+/, '+'); } if (skill.unit === '%') return `${prefix || '+'}${value}%`; if (skill.unit === 's') return `${prefix || '−'}${value}s`; if (skill.unit === ' osu') return `${prefix || '+'}${value} osu`; if (skill.prefix === '−') return `−${value}`; if (value === 0 && !prefix) return `${value}`; return `${prefix || '+'}${value}`; } export default function PrestigePage() { const { user, loading, patchUser, refresh } = useAuth(); const [data, setData] = useState(null); const [error, setError] = useState(''); const [message, setMessage] = useState(''); const [busy, setBusy] = useState(false); const load = async () => { const result = await api.prestige(); setData(result); }; useEffect(() => { if (!user || user.role === 'admin') return undefined; let cancelled = false; (async () => { try { const result = await api.prestige(); if (!cancelled) setData(result); } catch (err) { if (!cancelled) setError(err.message); } })(); return () => { cancelled = true; }; }, [user?.id, user?.role]); if (loading) return
Loading…
; if (!user) returnLoading…
; if (data && data.pageVisible === false) { returnReset your progress for Pr, then spend Pr on permanent skills.
{formatCredits(cost)} cr from your balance
+{p?.prBaseReward ?? 1000} base, more if you are over the cost
Permanent bonuses — they survive every reset
Reward: +{p?.prBaseReward ?? 1000} Pr base. Every{' '} {formatCredits(p?.excessChunkCents ?? 0)} cr above the cost adds ~{p?.prPerExcessChunk ?? 1000}{' '} Pr.
Spend Pr on permanent branches. Costs rise with each purchase.
{skill.description}