feat: add apotheosis third prestige layer and remove IDEAS.md

Apotheosis is the ultimate reset — wipes absolutely everything
including prestige and transcendence — in exchange for a pure
bragging-rights badge. No mechanical benefit whatsoever.

Unlock condition: all 15 Transcendence echo upgrades purchased.
Can be achieved multiple times; each cycle requires repurchasing
all Transcendence upgrades again.

What survives: Codex lore entries and lifetime profile statistics.
What is wiped: resources, prestige, runestones, transcendence data
(echoes, echo upgrades, multipliers), equipment, upgrades, bosses,
quests, zones, adventurers, achievements.

New files: Apotheosis.ts type, apotheosis service, apotheosis route,
ApotheosisPanel.tsx component.

Modified: GameState (apotheosis field), Api.ts, types/index.ts,
prestige service (carry apotheosis), transcendence service (carry
apotheosis), game.ts anti-cheat (cap apotheosis count), API client,
GameContext (apotheosis() function), GameLayout (new tab), ResourceBar
(gold apotheosis badge shown above transcendence and prestige badges),
styles.css, AboutPanel how-to-play.

Also removes IDEAS.md — all planned features are now implemented!
This commit is contained in:
2026-03-07 02:37:08 -08:00
committed by Naomi Carrigan
parent e8881a81d5
commit a6f9844120
18 changed files with 365 additions and 51 deletions
+81
View File
@@ -2441,3 +2441,84 @@ body {
cursor: not-allowed;
opacity: 0.4;
}
/* ── Apotheosis ─────────────────────────────────────────────────────────── */
.apotheosis-badge {
background: linear-gradient(135deg, #78350f, #d97706, #fbbf24);
border-radius: 999px;
color: #1c1917;
font-size: 0.85rem;
font-weight: 700;
padding: 0.25rem 0.75rem;
}
.apotheosis-panel .apotheosis-intro {
color: var(--colour-text-muted);
font-size: 0.95rem;
margin-bottom: 0.75rem;
}
.apotheosis-reward {
background: linear-gradient(135deg, rgba(120, 53, 15, 0.2), rgba(217, 119, 6, 0.2));
border: 1px solid #d97706;
border-radius: var(--radius);
font-size: 1rem;
margin: 1rem 0;
padding: 0.75rem 1rem;
text-align: center;
}
.apotheosis-count {
background: var(--colour-surface);
border: 1px solid #d97706;
border-radius: var(--radius);
margin: 0.75rem 0;
padding: 0.75rem 1rem;
text-align: center;
}
.apotheosis-status {
background: var(--colour-surface);
border: 1px solid #d97706;
border-radius: var(--radius);
margin: 1rem 0;
padding: 1rem;
}
.apotheosis-status p {
margin: 0.25rem 0;
}
.apotheosis-missing {
color: var(--colour-text-muted);
font-size: 0.9rem;
}
.apotheosis-ready {
color: #fbbf24;
font-weight: 600;
}
.apotheosis-button {
background: linear-gradient(135deg, #78350f, #d97706);
border: none;
border-radius: var(--radius);
color: #fff;
cursor: pointer;
font-size: 1rem;
font-weight: 700;
margin-top: 0.5rem;
padding: 0.75rem 2rem;
transition: opacity 0.2s;
width: 100%;
}
.apotheosis-button:hover:not(:disabled) {
opacity: 0.85;
}
.apotheosis-button:disabled {
cursor: not-allowed;
opacity: 0.4;
}