Happy Birthday Prime!

With coffee in hand and code on your side,
ThePrimeagen Spire’s a treacherous ride.
Gremlins await and errors conspire,
But cake lies ahead at the top of the Spire.

How to Navigate the Spire

  • Click a node to climb the way
  • Choose your battles night or day
  • Rest at fires, heal or train
  • Each new card will grow your gain.
  • At the summit face the fight
  • Defeat the boss, win the night

Courage, dear heart.

Act I
I'm doing a startup!
Act II
Look dad, we made it!
Legend
Rest Rest
Battle Enemy
Battle Elite
Battle Boss
Event Events
Shop Shop
${(() => { // Use positions directly from the map data const getNodePos = (nodeId) => { const node = m.nodes.find(n => n.id === nodeId); return node ? { x: node.x, y: node.y } : null; }; return m.nodes.map(node => { if (!node.next || node.next.length === 0) return ''; return node.next.map(nextId => { const fromPos = { x: node.x, y: node.y }; const toPos = getNodePos(nextId); if (!fromPos || !toPos) return ''; const isActivePath = (node.id === currentId && nextIds.includes(nextId)) || (parseInt(nextId.replace('n', '')) <= parseInt(currentId.replace('n', ''))); return ``; }).join(''); }).join(''); })()}
${(() => { // Use positions directly from map data return m.nodes.map(n => { const isNext = nextIds.includes(n.id); const isCurrent = n.id === currentId; const isCompleted = root.completedNodes.includes(n.id); const locked = (!isNext && !isCurrent && !isCompleted); const pos = { x: n.x, y: n.y }; if (!pos.x || !pos.y) return ''; const leftPercent = (pos.x / 1000) * 100; const topPercent = (pos.y / 800) * 100; const tooltipData = getNodeTooltipData(n); return `
${getNodeEmoji(n.kind)}
${isCurrent ? '
' : ''}
`; }).join(''); })()}
Your deck
${Object.entries( root.player.deck.reduce((acc, cardId) => { acc[cardId] = (acc[cardId] || 0) + 1; return acc; }, {}) ).map(([cardId, count], index) => { const card = CARDS[cardId]; if (!card) return ''; const cardType = card.type === 'attack' ? 'attack' : card.type === 'skill' ? 'skill' : 'power'; return `
${card.name}
${card.cost}
${getCardArt(cardId, CARDS)}
${card.text}
${count > 1 ? `
×${count}
` : ''}
`; }).join('')}