'use client'; import { GameCard, StatRow, ElementBadge, ActionButton } from '@/components/ui'; import { ScrollArea } from '@/components/ui/scroll-area'; import { Separator } from '@/components/ui/separator'; import { Mountain, Zap, Clock, Swords, Sparkles, Lock, Check, X, Info, HelpCircle } from 'lucide-react'; import { GOLEMS_DEF, getGolemSlots, isGolemUnlocked, getGolemDamage, getGolemAttackSpeed, getGolemFloorDuration } from '@/lib/game/data/golems'; import { ELEMENTS } from '@/lib/game/constants'; import { useManaStore, useSkillStore, useCombatStore, useAttunementStore } from '@/lib/game/stores'; export function GolemancyTab() { const attunements = useAttunementStore((s) => s.attunements); const elements = useManaStore((s) => s.elements); const skills = useSkillStore((s) => s.skills); const golemancy = useCombatStore((s) => s.golemancy); const currentFloor = useCombatStore((s) => s.currentFloor); const currentRoom = useCombatStore((s) => s.currentRoom); const toggleGolem = useCombatStore((s) => s.toggleGolem); const rawMana = useManaStore((s) => s.rawMana); // Get Fabricator level and golem slots const fabricatorLevel = attunements.fabricator?.level || 0; const fabricatorActive = attunements.fabricator?.active || false; const maxSlots = getGolemSlots(fabricatorLevel); // Get unlocked elements const unlockedElements = Object.entries(elements) .filter(([, e]) => e.unlocked) .map(([id]) => id); // Get all unlocked golems const unlockedGolems = Object.values(GOLEMS_DEF || {}).filter(golem => isGolemUnlocked(golem.id, attunements, unlockedElements) ); // Check if golemancy is available const hasGolemancy = fabricatorActive && fabricatorLevel >= 2; // Check if currently in combat (not puzzle) const inCombat = currentRoom?.roomType !== 'puzzle'; // Get element info helper const getElementInfo = (elementId: string) => { return ELEMENTS[elementId]; }; // Render a golem card const renderGolemCard = (golemId: string, isUnlocked: boolean) => { const golem = GOLEMS_DEF[golemId]; if (!golem) return null; const isEnabled = golemancy.enabledGolems.includes(golemId); const isSelected = golemancy.summonedGolems.some(g => g.golemId === golemId); // Calculate effective stats const damage = getGolemDamage(golemId, skills); const attackSpeed = getGolemAttackSpeed(golemId, skills); const floorDuration = getGolemFloorDuration(skills); // Get element color const primaryElement = getElementInfo(golem.baseManaType); const elementId = golem.baseManaType; if (!isUnlocked) { // Locked golem card return (

???

{golem.unlockCondition.type === 'attunement_level' && (
Requires Fabricator Level {golem.unlockCondition.level}
)} {golem.unlockCondition.type === 'mana_unlocked' && (
Requires {ELEMENTS[golem.unlockCondition.manaType || '']?.name || golem.unlockCondition.manaType} Mana
)} {golem.unlockCondition.type === 'dual_attunement' && (
Requires Enchanter & Fabricator Level 5
)}
); } return ( toggleGolem(golemId)} aria-label={`${isEnabled ? 'Disable' : 'Enable'} ${golem.name}`} role="button" tabIndex={0} >

{golem.name}
{golem.isAoe && ( AOE {golem.aoeTargets} )} {golem.tier} {isEnabled ? ( ) : ( )}

{golem.description}

{/* Summon Cost */}
Summon Cost:
{golem.summonCost.map((cost, idx) => { const elem = getElementInfo(cost.element || ''); const available = cost.type === 'raw' ? rawMana : elements[cost.element || '']?.current || 0; const canAfford = available >= cost.amount; return ( {cost.element && } {' '}{cost.amount} ); })}
{/* Maintenance Cost */}
Maintenance/hr:
{golem.maintenanceCost.map((cost, idx) => { return ( {cost.element && } {' '}{cost.amount}/hr ); })}
{/* Status */} {isSelected && (
Active on Floor {currentFloor}
)}
); }; return (
{/* Header */}

Golemancy

{!hasGolemancy ? (

Unlock the Fabricator attunement and reach Level 2 to summon golems.

) : ( <> 0 ? 'success' : undefined} />

Golems are automatically summoned at the start of each combat floor. They cost mana to maintain and will be dismissed if you run out.

)}
{/* Active Golems - Empty State */} {hasGolemancy && golemancy.summonedGolems.length === 0 && (

No golems summoned

Enable golems below to summon them at the start of combat

)} {/* Active Golems */} {hasGolemancy && golemancy.summonedGolems.length > 0 && (

Active Golems ({golemancy.summonedGolems.length})

{golemancy.summonedGolems.map(sg => { const golem = GOLEMS_DEF[sg.golemId]; if (!golem) return null; return ( {golem.name} ); })}
)} {/* Golem Selection */} {hasGolemancy && (

Select Golems to Summon

{/* Unlocked Golems */} {unlockedGolems.map(golem => renderGolemCard(golem.id, true))} {/* Locked Golems */} {Object.values(GOLEMS_DEF || {}) .filter(g => !isGolemUnlocked(g.id, attunements, unlockedElements)) .map(golem => renderGolemCard(golem.id, false))}
)} {/* Golemancy Skills Info */}

Golemancy Skills

); } GolemancyTab.displayName = "GolemancyTab";