feat: add exploration and crafting systems

Adds two new game systems: Exploration (scouts collect materials from
timed area runs) and Crafting (combine materials into permanent
multipliers). Includes 72 exploration areas, 54 materials, 36 recipes,
and 108 new Codex lore entries. Removes unused characterName requirement
from prestige/transcendence/apotheosis reset flows.
This commit is contained in:
2026-03-07 04:14:04 -08:00
committed by Naomi Carrigan
parent 2aa6362ad6
commit 6ddf8e0b43
35 changed files with 4722 additions and 94 deletions
+331
View File
@@ -2543,3 +2543,334 @@ body {
cursor: not-allowed;
opacity: 0.4;
}
/* ── Exploration Panel ───────────────────────────────────────────────────── */
.exploration-panel .panel-header {
margin-bottom: 0.5rem;
}
.exploration-list {
display: flex;
flex-direction: column;
gap: 0.75rem;
margin-top: 0.75rem;
}
.exploration-card {
align-items: center;
background: var(--colour-surface);
border: 1px solid var(--colour-border);
border-radius: var(--radius);
display: flex;
gap: 1rem;
justify-content: space-between;
padding: 0.75rem 1rem;
}
.exploration-card.exploration-locked {
opacity: 0.55;
}
.exploration-info h3 {
font-size: 1rem;
font-weight: 600;
margin: 0 0 0.25rem;
}
.exploration-info p {
color: var(--colour-text-muted);
font-size: 0.85rem;
margin: 0 0 0.25rem;
}
.exploration-duration {
color: var(--colour-text-muted);
font-size: 0.8rem;
}
.exploration-discovered {
font-size: 0.85rem;
margin-left: 0.25rem;
}
.exploration-action {
flex-shrink: 0;
}
.start-quest-button,
.collect-button {
background: var(--colour-accent);
border: none;
border-radius: var(--radius);
color: #fff;
cursor: pointer;
font-size: 0.85rem;
font-weight: 600;
padding: 0.45rem 1rem;
transition: opacity 0.2s;
white-space: nowrap;
}
.collect-button {
background: #16a34a;
}
.start-quest-button:hover:not(:disabled),
.collect-button:hover:not(:disabled) {
opacity: 0.85;
}
.start-quest-button:disabled,
.collect-button:disabled {
cursor: not-allowed;
opacity: 0.4;
}
.exploration-result {
background: var(--colour-surface);
border: 1px solid var(--colour-accent);
border-radius: var(--radius);
margin-bottom: 0.75rem;
padding: 0.75rem 1rem;
position: relative;
}
.exploration-result-close {
background: transparent;
border: none;
color: var(--colour-text-muted);
cursor: pointer;
font-size: 1rem;
padding: 0;
position: absolute;
right: 0.75rem;
top: 0.6rem;
}
.exploration-result-close:hover {
color: var(--colour-text);
}
.exploration-nothing {
color: var(--colour-text-muted);
font-style: italic;
margin: 0;
}
.exploration-event-text {
font-style: italic;
margin: 0 0 0.5rem;
}
.exploration-rewards {
display: flex;
flex-wrap: wrap;
gap: 0.4rem;
margin-top: 0.25rem;
}
.reward-tag {
background: #14532d;
border-radius: 999px;
color: #4ade80;
font-size: 0.8rem;
font-weight: 600;
padding: 0.2rem 0.65rem;
}
.reward-tag.negative {
background: #450a0a;
color: #f87171;
}
.reward-tag.material-tag {
background: #1e3a5f;
color: #93c5fd;
}
/* ── Crafting Panel ───────────────────────────────────────────────────────── */
.crafting-panel .panel-header {
margin-bottom: 0.5rem;
}
.crafting-content {
display: flex;
flex-direction: column;
gap: 1.5rem;
margin-top: 0.75rem;
}
.materials-section h3,
.recipes-section h3 {
font-size: 1rem;
font-weight: 700;
margin: 0 0 0.5rem;
}
.materials-list {
display: flex;
flex-direction: column;
gap: 0.4rem;
}
.material-card {
align-items: center;
background: var(--colour-surface);
border: 1px solid var(--colour-border);
border-left-width: 3px;
border-radius: var(--radius);
display: flex;
justify-content: space-between;
padding: 0.4rem 0.75rem;
}
.material-card.rarity-common {
border-left-color: #6b7280;
}
.material-card.rarity-uncommon {
border-left-color: #16a34a;
}
.material-card.rarity-rare {
border-left-color: #7c3aed;
}
.material-card.material-empty {
opacity: 0.45;
}
.material-info {
display: flex;
flex-direction: column;
gap: 0.1rem;
}
.material-name {
font-size: 0.9rem;
font-weight: 600;
}
.material-rarity {
color: var(--colour-text-muted);
font-size: 0.75rem;
text-transform: capitalize;
}
.material-quantity {
font-size: 0.95rem;
font-weight: 700;
}
.recipes-list {
display: flex;
flex-direction: column;
gap: 0.75rem;
}
.recipe-card {
align-items: flex-start;
background: var(--colour-surface);
border: 1px solid var(--colour-border);
border-radius: var(--radius);
display: flex;
gap: 1rem;
justify-content: space-between;
padding: 0.75rem 1rem;
}
.recipe-card.recipe-crafted {
border-color: #16a34a;
opacity: 0.75;
}
.recipe-card.recipe-unaffordable {
opacity: 0.55;
}
.recipe-info {
flex: 1;
min-width: 0;
}
.recipe-info h4 {
font-size: 0.95rem;
font-weight: 700;
margin: 0 0 0.2rem;
}
.recipe-description {
color: var(--colour-text-muted);
font-size: 0.82rem;
margin: 0 0 0.4rem;
}
.recipe-bonus {
align-items: center;
display: flex;
font-size: 0.85rem;
font-weight: 600;
gap: 0.4rem;
margin-bottom: 0.4rem;
}
.bonus-value {
color: #fbbf24;
}
.recipe-requirements {
display: flex;
flex-wrap: wrap;
gap: 0.35rem;
}
.req-tag {
border-radius: 999px;
font-size: 0.75rem;
font-weight: 600;
padding: 0.15rem 0.55rem;
}
.req-tag.req-met {
background: #14532d;
color: #4ade80;
}
.req-tag.req-missing {
background: #450a0a;
color: #f87171;
}
.recipe-action {
flex-shrink: 0;
padding-top: 0.15rem;
}
.craft-button {
background: #7c3aed;
border: none;
border-radius: var(--radius);
color: #fff;
cursor: pointer;
font-size: 0.85rem;
font-weight: 600;
padding: 0.45rem 1rem;
transition: opacity 0.2s;
white-space: nowrap;
}
.craft-button:hover:not(:disabled) {
opacity: 0.85;
}
.craft-button:disabled {
cursor: not-allowed;
opacity: 0.4;
}
.empty-zone {
color: var(--colour-text-muted);
font-size: 0.9rem;
}