Remove all skill system files - preparing for fresh design phase
Build and Publish Mana Loop Docker Image / build-and-publish (push) Failing after 32s

This commit is contained in:
2026-05-15 18:50:41 +02:00
parent 5cbe672b8f
commit 1a688394e4
27 changed files with 0 additions and 3750 deletions
@@ -1,39 +0,0 @@
'use client';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import { SKILLS_DEF, SKILL_CATEGORIES } from '@/lib/game/constants';
import { SkillRow } from './SkillRow';
interface SkillCategoryProps {
categoryId: string;
onUpgradeClick: (skillId: string, milestone: 5 | 10) => void;
}
export function SkillCategory({ categoryId, onUpgradeClick }: SkillCategoryProps) {
const cat = SKILL_CATEGORIES.find(c => c.id === categoryId);
if (!cat) return null;
const skillsInCat = Object.entries(SKILLS_DEF).filter(([, def]) => def.cat === cat.id);
if (skillsInCat.length === 0) return null;
return (
<Card className="bg-gray-900/80 border-gray-700">
<CardHeader className="pb-2">
<CardTitle className="text-amber-400 game-panel-title text-xs">
{cat.icon} {cat.name}
</CardTitle>
</CardHeader>
<CardContent>
<div className="space-y-2">
{skillsInCat.map(([id, def]) => (
<SkillRow
key={id}
skillId={id}
onUpgradeClick={onUpgradeClick}
/>
))}
</div>
</CardContent>
</Card>
);
}
-183
View File
@@ -1,183 +0,0 @@
'use client';
import { useSkillStore, useManaStore, useCombatStore, fmt, fmtDec } from '@/lib/game/stores';
import { SKILLS_DEF, SKILL_CATEGORIES } from '@/lib/game/constants';
import { getNextTierSkill, getTierMultiplier } from '@/lib/game/skill-evolution';
import { computeEffects } from '@/lib/game/upgrade-effects';
import { useStudyStats } from '@/lib/game/hooks/useGameDerived';
import { Badge } from '@/components/ui/badge';
import { Button } from '@/components/ui/button';
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';
import { formatStudyTime, hasMilestoneUpgrade, getSkillDisplayInfo } from './skills-utils';
interface SkillRowProps {
skillId: string;
onUpgradeClick: (skillId: string, milestone: 5 | 10) => void;
}
export function SkillRow({ skillId, onUpgradeClick }: SkillRowProps) {
const skillState = useSkillStore((s) => s);
const rawMana = useManaStore((s) => s.rawMana);
const startStudyingSkill = useSkillStore((s) => s.startStudyingSkill);
const tierUpSkill = useSkillStore((s) => s.tierUpSkill);
const { studySpeedMult, studyCostMult } = useStudyStats();
const skillInfo = getSkillDisplayInfo(skillState, skillId);
const {
currentTier,
tieredSkillId,
tierMultiplier,
level,
maxed,
isStudying,
savedProgress,
skillDisplayName,
prereqMet,
def
} = skillInfo;
// Apply skill modifiers
const studyEffects = computeEffects(skillState.skillUpgrades || {}, skillState.skillTiers || {});
const effectiveSpeedMult = studySpeedMult * studyEffects.studySpeedMultiplier;
const tierStudyTime = def.studyTime * currentTier;
const effectiveStudyTime = tierStudyTime / effectiveSpeedMult;
const baseCost = def.base * (level + 1) * currentTier;
const cost = Math.floor(baseCost * studyCostMult);
// Check if any study is in progress (prevent switching topics)
const currentAction = useCombatStore((s) => s.currentAction);
const isAnyStudyInProgress = currentAction === 'study' && skillState.currentStudyTarget;
// Can only study if: not maxed, prereqs met, has mana, and either no study in progress or already studying this skill
const canStudy = !maxed && prereqMet && rawMana >= cost && (!isAnyStudyInProgress || isStudying);
const milestoneInfo = hasMilestoneUpgrade(skillState, tieredSkillId, level);
const nextTierSkill = getNextTierSkill(tieredSkillId);
const canTierUp = maxed && nextTierSkill;
const selectedUpgrades = skillState.skillUpgrades[tieredSkillId] || [];
const selectedL5 = selectedUpgrades.filter(u => u.includes('_l5'));
const selectedL10 = selectedUpgrades.filter(u => u.includes('_l10'));
return (
<div
className={`flex flex-col sm:flex-row sm:items-center justify-between p-3 rounded border gap-2 ${
isStudying ? 'border-purple-500 bg-purple-900/20' :
milestoneInfo ? 'border-amber-500/50 bg-amber-900/10' :
'border-gray-700 bg-gray-800/30'
}`}
>
<div className="flex-1 min-w-0">
<div className="flex items-center gap-2 flex-wrap">
<span className="font-semibold text-sm">{skillDisplayName}</span>
{currentTier > 1 && (
<Badge className="bg-purple-600/50 text-purple-200 text-xs">Tier {currentTier} ({fmtDec(tierMultiplier, 0)}x)</Badge>
)}
{level > 0 && <span className="text-purple-400 text-sm">Lv.{level}</span>}
{selectedUpgrades.length > 0 && (
<div className="flex gap-1">
{selectedL5.length > 0 && (
<Badge className="bg-amber-700/50 text-amber-200 text-xs">L5: {selectedL5.length}</Badge>
)}
{selectedL10.length > 0 && (
<Badge className="bg-purple-700/50 text-purple-200 text-xs">L10: {selectedL10.length}</Badge>
)}
</div>
)}
</div>
<div className="text-xs text-gray-400 italic">{def.desc}{currentTier > 1 && ` (Tier ${currentTier}: ${fmtDec(tierMultiplier, 0)}x effect)`}</div>
{!prereqMet && def.req && (
<div className="text-xs text-red-400 mt-1">
Requires: {Object.entries(def.req).map(([r, rl]) => `${SKILLS_DEF[r]?.name || r} Lv.${rl}`).join(', ')}
</div>
)}
<div className="text-xs text-gray-500 mt-1">
<span className={effectiveSpeedMult > 1 ? 'text-green-400' : ''}>
Study: {formatStudyTime(effectiveStudyTime)}{effectiveSpeedMult > 1 && <span className="text-xs ml-1">({Math.round(effectiveSpeedMult * 100)}% speed)</span>}
</span>
{' • '}
<span className={studyCostMult < 1 ? 'text-green-400' : ''}>
Cost: {fmt(cost)} mana{studyCostMult < 1 && <span className="text-xs ml-1">({Math.round(studyCostMult * 100)}% cost)</span>}
</span>
</div>
{milestoneInfo && (
<div className="text-xs text-amber-400 mt-1 flex items-center gap-1">
Level {milestoneInfo.milestone} milestone: {milestoneInfo.selectedCount}/2 upgrades selected
</div>
)}
</div>
<div className="flex items-center gap-3 flex-wrap sm:flex-nowrap">
{/* Level dots */}
<div className="flex gap-1 shrink-0">
{Array.from({ length: def.max }).map((_, i) => (
<div
key={i}
className={`w-2 h-2 rounded-full border ${
i < level ? 'bg-purple-500 border-purple-400' :
i === 4 || i === 9 ? 'border-amber-500' :
'border-gray-600'
}`}
/>
))}
</div>
{isStudying ? (
<div className="text-xs text-purple-400">
{formatStudyTime(savedProgress || 0)}/{formatStudyTime(tierStudyTime)}
</div>
) : milestoneInfo ? (
<Button
size="sm"
className="bg-amber-600 hover:bg-amber-700"
onClick={() => {
onUpgradeClick(tieredSkillId, milestoneInfo.milestone);
}}
>
Choose Upgrades
</Button>
) : canTierUp ? (
<Button
size="sm"
className="bg-purple-600 hover:bg-purple-700"
onClick={() => tierUpSkill(tieredSkillId)}
>
Tier Up
</Button>
) : maxed ? (
<Badge className="bg-green-900/50 text-green-300">Maxed</Badge>
) : (
<div className="flex gap-1">
<TooltipProvider>
<Tooltip>
<TooltipTrigger asChild>
<Button
size="sm"
variant={canStudy ? 'default' : 'outline'}
disabled={!canStudy}
className={canStudy ? 'bg-purple-600 hover:bg-purple-700' : 'opacity-50'}
onClick={() => startStudyingSkill(tieredSkillId, rawMana)}
>
Study ({fmt(cost)})
</Button>
</TooltipTrigger>
{!canStudy && isAnyStudyInProgress && !isStudying && (
<TooltipContent>
<p>Cannot switch topics while studying {SKILLS_DEF[skillState.currentStudyTarget?.id || '']?.name || 'another skill'}</p>
</TooltipContent>
)}
</Tooltip>
</TooltipProvider>
</div>
)}
</div>
</div>
);
}
SkillRow.displayName = "SkillRow";
@@ -1,47 +0,0 @@
'use client';
import { useSkillStore } from '@/lib/game/stores';
import { SKILLS_DEF } from '@/lib/game/constants';
import { formatStudyTime } from './skills-utils';
import { useStudyStats } from '@/lib/game/hooks/useGameDerived';
import { BookOpen, X } from 'lucide-react';
import { Button } from '@/components/ui/button';
import { Progress } from '@/components/ui/progress';
export function SkillStudyProgress() {
const currentStudyTarget = useSkillStore((s) => s.currentStudyTarget);
const cancelStudy = useSkillStore((s) => s.cancelStudy);
const { studySpeedMult } = useStudyStats();
if (!currentStudyTarget) return null;
const target = currentStudyTarget;
const progressPct = Math.min(100, (target.progress / target.required) * 100);
const def = SKILLS_DEF[target.id] || SKILLS_DEF[target.id.split('_t')[0]];
return (
<div className="p-3 rounded border border-purple-600/50 bg-purple-900/20">
<div className="flex items-center justify-between mb-2">
<div className="flex items-center gap-2">
<BookOpen className="w-4 h-4 text-purple-400" />
<span className="text-sm font-semibold text-purple-300">
{def?.name}
</span>
</div>
<Button
variant="ghost"
size="sm"
className="h-6 w-6 p-0 text-gray-400 hover:text-white"
onClick={() => cancelStudy(0)}
>
<X className="w-4 h-4" />
</Button>
</div>
<Progress value={progressPct} className="h-2 bg-gray-800" />
<div className="flex justify-between text-xs text-gray-400 mt-1">
<span>{formatStudyTime(target.progress)} / {formatStudyTime(target.required)}</span>
<span>{studySpeedMult.toFixed(1)}x speed</span>
</div>
</div>
);
}
@@ -1,130 +0,0 @@
'use client';
import { useState } from 'react';
import { useSkillStore, fmt } from '@/lib/game/stores';
import { SKILLS_DEF } from '@/lib/game/constants';
import { Badge } from '@/components/ui/badge';
import { Button } from '@/components/ui/button';
import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription } from '@/components/ui/dialog';
interface SkillUpgradeDialogProps {
skillId: string | null;
milestone: 5 | 10;
onClose: () => void;
}
export function SkillUpgradeDialog({ skillId, milestone, onClose }: SkillUpgradeDialogProps) {
const getSkillUpgradeChoices = useSkillStore((s) => s.getSkillUpgradeChoices);
const commitSkillUpgrades = useSkillStore((s) => s.commitSkillUpgrades);
const [pendingUpgradeSelections, setPendingUpgradeSelections] = useState<string[]>([]);
if (!skillId) return null;
const skillDef = SKILLS_DEF[skillId];
const { available, selected: alreadySelected } = getSkillUpgradeChoices(skillId, milestone);
const currentSelections = pendingUpgradeSelections.length > 0 ? pendingUpgradeSelections : alreadySelected;
const toggleUpgrade = (upgradeId: string) => {
if (currentSelections.includes(upgradeId)) {
setPendingUpgradeSelections(currentSelections.filter(id => id !== upgradeId));
} else if (currentSelections.length < 2) {
setPendingUpgradeSelections([...currentSelections, upgradeId]);
}
};
const handleDone = () => {
if (currentSelections.length === 2 && skillId) {
commitSkillUpgrades(skillId, currentSelections);
}
setPendingUpgradeSelections([]);
onClose();
};
const handleCancel = () => {
setPendingUpgradeSelections([]);
onClose();
};
return (
<Dialog open={!!skillId} onOpenChange={(open) => {
if (!open) {
setPendingUpgradeSelections([]);
onClose();
}
}}>
<DialogContent className="bg-gray-900 border-gray-700 max-w-lg">
<DialogHeader>
<DialogTitle className="text-amber-400">
Choose Upgrade - {skillDef?.name || skillId}
</DialogTitle>
<DialogDescription className="text-gray-400">
Level {milestone} Milestone - Select 2 upgrades ({currentSelections.length}/2 chosen)
</DialogDescription>
</DialogHeader>
<div className="space-y-2 mt-4">
{available.map((upgrade) => {
const isSelected = currentSelections.includes(upgrade.id);
const canToggle = currentSelections.length < 2 || isSelected;
return (
<div
key={upgrade.id}
className={`p-3 rounded border cursor-pointer transition-all ${
isSelected
? 'border-amber-500 bg-amber-900/30'
: canToggle
? 'border-gray-600 bg-gray-800/50 hover:border-amber-500/50 hover:bg-gray-800'
: 'border-gray-700 bg-gray-800/30 opacity-50 cursor-not-allowed'
}`}
onClick={() => {
if (canToggle) {
toggleUpgrade(upgrade.id);
}
}}
>
<div className="flex items-center justify-between">
<div className="font-semibold text-sm text-amber-300">{upgrade.name}</div>
{isSelected && <Badge className="bg-amber-600 text-amber-100">Selected</Badge>}
</div>
<div className="text-xs text-gray-400 mt-1">{upgrade.desc}</div>
{upgrade.effect.type === 'multiplier' && (
<div className="text-xs text-green-400 mt-1">
+{Math.round((upgrade.effect.value! - 1) * 100)}% {upgrade.effect.stat}
</div>
)}
{upgrade.effect.type === 'bonus' && (
<div className="text-xs text-blue-400 mt-1">
+{upgrade.effect.value} {upgrade.effect.stat}
</div>
)}
{upgrade.effect.type === 'special' && (
<div className="text-xs text-cyan-400 mt-1">
{upgrade.effect.specialDesc || 'Special effect'}
</div>
)}
</div>
);
})}
</div>
<div className="flex justify-end gap-2 mt-4">
<Button
variant="outline"
onClick={handleCancel}
>
Cancel
</Button>
<Button
variant="default"
onClick={handleDone}
disabled={currentSelections.length !== 2}
>
{currentSelections.length < 2 ? `Select ${2 - currentSelections.length} more` : 'Confirm'}
</Button>
</div>
</DialogContent>
</Dialog>
);
}
@@ -1,82 +0,0 @@
import { SKILLS_DEF } from '@/lib/game/constants';
import { SKILL_EVOLUTION_PATHS, getUpgradesForSkillAtMilestone, getTierMultiplier } from '@/lib/game/skill-evolution';
import type { SkillState } from '@/lib/game/stores';
// Format study time
export function formatStudyTime(hours: number): string {
if (hours < 1) return `${Math.round(hours * 60)}m`;
return `${hours.toFixed(1)}h`;
}
// Check if skill has milestone upgrade available
export function hasMilestoneUpgrade(
skillState: SkillState,
skillId: string,
level: number
): { milestone: 5 | 10; hasUpgrades: boolean; selectedCount: number } | null {
const baseSkillId = skillId.includes('_t') ? skillId.split('_t')[0] : skillId;
const path = SKILL_EVOLUTION_PATHS[baseSkillId];
if (!path) return null;
if (level >= 5) {
const upgrades5 = getUpgradesForSkillAtMilestone(skillId, 5, skillState.skillTiers);
const selected5 = (skillState.skillUpgrades[skillId] || []).filter(id => id.includes('_l5'));
if (upgrades5.length > 0 && selected5.length < 2) {
return { milestone: 5, hasUpgrades: true, selectedCount: selected5.length };
}
}
if (level >= 10) {
const upgrades10 = getUpgradesForSkillAtMilestone(skillId, 10, skillState.skillTiers);
const selected10 = (skillState.skillUpgrades[skillId] || []).filter(id => id.includes('_l10'));
if (upgrades10.length > 0 && selected10.length < 2) {
return { milestone: 10, hasUpgrades: true, selectedCount: selected10.length };
}
}
return null;
}
// Get skill display info
export function getSkillDisplayInfo(
skillState: SkillState,
skillId: string
) {
const currentTier = skillState.skillTiers?.[skillId] || 1;
const tieredSkillId = currentTier > 1 ? `${skillId}_t${currentTier}` : skillId;
const def = SKILLS_DEF[skillId];
const tierMultiplier = getTierMultiplier(tieredSkillId);
const level = skillState.skills[tieredSkillId] || skillState.skills[skillId] || 0;
const maxed = level >= (def?.max || 10);
const isStudying = (skillState.currentStudyTarget?.id === skillId || skillState.currentStudyTarget?.id === tieredSkillId) && skillState.currentStudyTarget?.type === 'skill';
const savedProgress = skillState.skillProgress[tieredSkillId] || skillState.skillProgress[skillId] || 0;
const tierDef = SKILL_EVOLUTION_PATHS[skillId]?.tiers.find(t => t.tier === currentTier);
const skillDisplayName = tierDef?.name || def?.name || skillId;
// Check prerequisites
let prereqMet = true;
if (def?.req) {
for (const [r, rl] of Object.entries(def.req)) {
if ((skillState.skills[r] || 0) < rl) {
prereqMet = false;
break;
}
}
}
return {
currentTier,
tieredSkillId,
tierMultiplier,
level,
maxed,
isStudying,
savedProgress,
skillDisplayName,
prereqMet,
def,
};
}
@@ -1,249 +0,0 @@
// ─── Combat Skills Tier Definitions (Part 2) ─────────────────────────────
// Elemental Mastery, Attack Speed, Armor Piercing, Spell Damage
import { createPerk } from './utils';
import type { SkillTierDef } from '../types';
// ─── ELEMENTAL MASTERY TALENT TREE ──────────────────────────────────────────
export const ELEMENTAL_MASTERY_TIERS: SkillTierDef[] = [
{
tier: 1, skillId: 'elementalMastery', name: 'Elemental Mastery', multiplier: 1,
l5Perks: [
createPerk('em_t1_l5_a', 'Elemental Focus', '+15% elemental damage', 'A',
{ type: 'multiplier', stat: 'elementalDamage', value: 0.15 }, false, 1.5, 5),
createPerk('em_t1_l5_b', 'Essence Absorption', 'Spells restore 1% mana per element level', 'B',
{ type: 'special', specialId: 'essenceAbsorption', specialDesc: 'Spells restore mana' }, false, 1.5, 5),
createPerk('em_t1_l5_c', 'Elemental Affinity', '+10% spell damage per unlocked element', 'C',
{ type: 'special', specialId: 'elementalAffinity', specialDesc: '+10% per element' }, false, 1.5, 5),
],
l10Perks: [
createPerk('em_t1_l10_a', 'Greater Elemental Focus', '+25% elemental damage', 'A',
{ type: 'multiplier', stat: 'elementalDamage', value: 0.25 }, false, 2.0, 10),
createPerk('em_t1_l10_b', 'Purification', 'Spells cleanse one negative effect', 'B',
{ type: 'special', specialId: 'purification', specialDesc: 'Cleanse effects' }, false, 2.0, 10),
createPerk('em_t1_l10_c', 'Elemental Unity', '+20% spell damage with all elements', 'C',
{ type: 'special', specialId: 'elementalUnity', specialDesc: '+20% all elements' }, false, 2.0, 10),
],
},
{
tier: 2, skillId: 'elementalMastery_t2', name: 'Greater Elemental Mastery', multiplier: 10,
l5Perks: [
createPerk('em_t2_l5_a', 'Cosmic Elemental', '+40% elemental damage', 'A',
{ type: 'multiplier', stat: 'elementalDamage', value: 0.40 }, false, 2.0, 5),
createPerk('em_t2_l5_b', 'Mana Wellspring', 'Spells restore 2% mana', 'B',
{ type: 'special', specialId: 'manaWellspring', specialDesc: 'Spells restore 2% mana' }, false, 2.0, 5),
createPerk('em_t2_l5_c', 'Elemental Fusion', 'Combine two elements for bonus damage', 'C',
{ type: 'special', specialId: 'elementalFusion', specialDesc: 'Two-element combos' }, false, 2.0, 5),
],
l10Perks: [
createPerk('em_t2_l10_a', 'Elemental Avatar', '+60% elemental damage', 'A',
{ type: 'multiplier', stat: 'elementalDamage', value: 0.60 }, false, 2.5, 10),
createPerk('em_t2_l10_b', 'Mana Deluge', 'Spells restore 3% mana', 'B',
{ type: 'special', specialId: 'manaDeluge', specialDesc: 'Spells restore 3% mana' }, false, 2.5, 10),
createPerk('em_t2_l10_c', 'Primal Fusion', 'Triple-element combos for massive damage', 'C',
{ type: 'special', specialId: 'primalFusion', specialDesc: 'Triple-element combos' }, false, 2.5, 10),
],
},
{
tier: 3, skillId: 'elementalMastery_t3', name: 'Perfect Elemental Mastery', multiplier: 100,
l5Perks: [
createPerk('em_t3_l5_a', 'World Elemental', '+75% elemental damage', 'A',
{ type: 'multiplier', stat: 'elementalDamage', value: 0.75 }, false, 3.0, 5),
createPerk('em_t3_l5_b', 'Elemental Storm', 'All spells become compound elements', 'B',
{ type: 'special', specialId: 'elementalStorm', specialDesc: 'All spells become compound' }, false, 3.0, 5),
createPerk('em_t3_l5_c', 'Master of All Elements', 'All elemental damage +50%', 'C',
{ type: 'multiplier', stat: 'elementalDamage', value: 0.50 }, false, 3.0, 5),
],
l10Perks: [
createPerk('em_t3_l10_a', '[ELITE] ELEMENTAL DEITY', 'Elemental damage is 10x', 'A',
{ type: 'special', specialId: 'elementalDeity', specialDesc: '10x elemental damage' }, true, 5.0, 10),
createPerk('em_t3_l10_b', '[ELITE] PRIMAL CHAOS', 'Spells deal all element types simultaneously', 'B',
{ type: 'special', specialId: 'primalChaos', specialDesc: 'All element types at once' }, true, 5.0, 10),
createPerk('em_t3_l10_c', '[ELITE] WORLD FORGE', 'Create custom compound spells', 'C',
{ type: 'special', specialId: 'worldForge', specialDesc: 'Create custom compound spells' }, true, 5.0, 10),
],
},
];
// ─── ATTACK SPEED TALENT TREE ──────────────────────────────────────────────
export const ATTACK_SPEED_TIERS: SkillTierDef[] = [
{
tier: 1, skillId: 'attackSpeed', name: 'Attack Speed', multiplier: 1,
l5Perks: [
createPerk('as_t1_l5_a', 'Swift Strikes', '+15% attack speed', 'A',
{ type: 'multiplier', stat: 'attackSpeed', value: 0.15 }, false, 1.5, 5),
createPerk('as_t1_l5_b', 'Dual Wield', 'Off-hand attacks deal 20% damage', 'B',
{ type: 'special', specialId: 'dualWield', specialDesc: 'Off-hand damage' }, false, 1.5, 5),
createPerk('as_t1_l5_c', 'Counter Attack', '+5% chance to counter', 'C',
{ type: 'special', specialId: 'counterAttack', specialDesc: 'Counter attack chance' }, false, 1.5, 5),
],
l10Perks: [
createPerk('as_t1_l10_a', 'Blazing Speed', '+25% attack speed', 'A',
{ type: 'multiplier', stat: 'attackSpeed', value: 0.25 }, false, 2.0, 10),
createPerk('as_t1_l10_b', 'Flurry', 'Every 3rd attack hits twice', 'B',
{ type: 'special', specialId: 'flurry', specialDesc: 'Every 3rd attack hits twice' }, false, 2.0, 10),
createPerk('as_t1_l10_c', 'Viper Strike', 'Crits slow enemy by 20%', 'C',
{ type: 'special', specialId: 'viperStrike', specialDesc: 'Crits slow enemy' }, false, 2.0, 10),
],
},
{
tier: 2, skillId: 'attackSpeed_t2', name: 'Rapid Attacks', multiplier: 10,
l5Perks: [
createPerk('as_t2_l5_a', 'Lightning Strikes', '+30% attack speed', 'A',
{ type: 'multiplier', stat: 'attackSpeed', value: 0.30 }, false, 2.0, 5),
createPerk('as_t2_l5_b', 'Tempo', 'Attack speed increases 2% per hit, up to 20%', 'B',
{ type: 'special', specialId: 'tempo', specialDesc: 'Stacking speed per hit' }, false, 2.0, 5),
createPerk('as_t2_l5_c', 'Double Strike', '15% chance to attack twice', 'C',
{ type: 'special', specialId: 'doubleStrike', specialDesc: '15% double strike' }, false, 2.0, 5),
],
l10Perks: [
createPerk('as_t2_l10_a', 'Sonic Speed', '+50% attack speed', 'A',
{ type: 'multiplier', stat: 'attackSpeed', value: 0.50 }, false, 2.5, 10),
createPerk('as_t2_l10_b', 'Rampage', 'Stacking speed is now 3% per hit, up to 30%', 'B',
{ type: 'special', specialId: 'rampage', specialDesc: 'Improved stacking speed' }, false, 2.5, 10),
createPerk('as_t2_l10_c', 'Whirlwind', '25% chance to attack twice', 'C',
{ type: 'special', specialId: 'whirlwind', specialDesc: '25% double strike' }, false, 2.5, 10),
],
},
{
tier: 3, skillId: 'attackSpeed_t3', name: 'Perfect Agility', multiplier: 100,
l5Perks: [
createPerk('as_t3_l5_a', 'Beyond Limits', '+75% attack speed', 'A',
{ type: 'multiplier', stat: 'attackSpeed', value: 0.75 }, false, 3.0, 5),
createPerk('as_t3_l5_b', 'Time Fracture', 'Attacks can trigger between ticks', 'B',
{ type: 'special', specialId: 'timeFracture', specialDesc: 'Extra ticks' }, false, 3.0, 5),
createPerk('as_t3_l5_c', 'Reaper', 'Every 5th attack is a guaranteed crit', 'C',
{ type: 'special', specialId: 'reaper', specialDesc: 'Guaranteed crit every 5th' }, false, 3.0, 5),
],
l10Perks: [
createPerk('as_t3_l10_a', '[ELITE] TIMELESS', 'Attack speed is 5x', 'A',
{ type: 'special', specialId: 'timelessAtk', specialDesc: '5x attack speed' }, true, 5.0, 10),
createPerk('as_t3_l10_b', '[ELITE] REALITY TEAR', 'Attacks happen every second regardless of tick', 'B',
{ type: 'special', specialId: 'realityTear', specialDesc: 'Attacks every second' }, true, 5.0, 10),
createPerk('as_t3_l10_c', '[ELITE] ABSOLUTE VELOCITY', 'Every attack hits 3 times', 'C',
{ type: 'special', specialId: 'absoluteVelocity', specialDesc: 'Triple every attack' }, true, 5.0, 10),
],
},
];
// ─── ARMOR PIERCING TALENT TREE ────────────────────────────────────────────
export const ARMOR_PIERCING_TIERS: SkillTierDef[] = [
{
tier: 1, skillId: 'armorPiercing', name: 'Armor Piercing', multiplier: 1,
l5Perks: [
createPerk('ap_t1_l5_a', 'Sharpened Edge', '+15% armor piercing', 'A',
{ type: 'multiplier', stat: 'armorPierce', value: 0.15 }, false, 1.5, 5),
createPerk('ap_t1_l5_b', 'Rending', 'Armor reduced by 5% per hit, stacks 5x', 'B',
{ type: 'special', specialId: 'rending', specialDesc: 'Stacking armor reduction' }, false, 1.5, 5),
createPerk('ap_t1_l5_c', 'Vulnerability', 'Crits reduce armor by 10%', 'C',
{ type: 'special', specialId: 'vulnerability', specialDesc: 'Crits reduce armor' }, false, 1.5, 5),
],
l10Perks: [
createPerk('ap_t1_l10_a', 'Sundering', '+25% armor piercing', 'A',
{ type: 'multiplier', stat: 'armorPierce', value: 0.25 }, false, 2.0, 10),
createPerk('ap_t1_l10_b', 'Expose Weakness', 'Armor reduced by 10% per hit, stacks 5x', 'B',
{ type: 'special', specialId: 'exposeWeakness', specialDesc: 'Better stacking armor reduction' }, false, 2.0, 10),
createPerk('ap_t1_l10_c', 'Armor Crusher', 'Ignore 20% of total armor', 'C',
{ type: 'special', specialId: 'armorCrusher', specialDesc: 'Flat armor ignore' }, false, 2.0, 10),
],
},
{
tier: 2, skillId: 'armorPiercing_t2', name: 'Devastating Piercing', multiplier: 10,
l5Perks: [
createPerk('ap_t2_l5_a', 'Titan Strike', '+30% armor piercing', 'A',
{ type: 'multiplier', stat: 'armorPierce', value: 0.30 }, false, 2.0, 5),
createPerk('ap_t2_l5_b', 'Shatter Armor', 'Armor reduced by 15% per hit, stacks 5x', 'B',
{ type: 'special', specialId: 'shatterArmor', specialDesc: '15% per hit armor reduction' }, false, 2.0, 5),
createPerk('ap_t2_l5_c', 'Execution', 'Crits ignore 30% of armor', 'C',
{ type: 'special', specialId: 'execution', specialDesc: '30% flat armor ignore on crit' }, false, 2.0, 5),
],
l10Perks: [
createPerk('ap_t2_l10_a', 'Armor Destruction', '+45% armor piercing', 'A',
{ type: 'multiplier', stat: 'armorPierce', value: 0.45 }, false, 2.5, 10),
createPerk('ap_t2_l10_b', 'Total Break', 'Stacking reduces up to 75% armor', 'B',
{ type: 'special', specialId: 'totalBreak', specialDesc: '75% armor cap reduction' }, false, 2.5, 10),
createPerk('ap_t2_l10_c', 'Guillotine', 'Crits ignore 50% of armor', 'C',
{ type: 'special', specialId: 'guillotine', specialDesc: '50% flat armor ignore on crit' }, false, 2.5, 10),
],
},
{
tier: 3, skillId: 'armorPiercing_t3', name: 'Perfect Piercing', multiplier: 100,
l5Perks: [
createPerk('ap_t3_l5_a', 'Absolute Penetration', '+60% armor piercing', 'A',
{ type: 'multiplier', stat: 'armorPierce', value: 0.60 }, false, 3.0, 5),
createPerk('ap_t3_l5_b', 'Disintegrate', 'Each hit permanently reduces enemy armor by 1%', 'B',
{ type: 'special', specialId: 'disintegrate', specialDesc: 'Permanent armor reduction' }, false, 3.0, 5),
createPerk('ap_t3_l5_c', 'Pierce All Defenses', 'Armor piercing is capped at 200%', 'C',
{ type: 'special', specialId: 'pierceAll', specialDesc: '200% armor piercing cap' }, false, 3.0, 5),
],
l10Perks: [
createPerk('ap_t3_l10_a', '[ELITE] ARMOR BREAKER', 'Enemy armor is always 0', 'A',
{ type: 'special', specialId: 'armorBreaker', specialDesc: 'Ignore all armor' }, true, 5.0, 10),
createPerk('ap_t3_l10_b', '[ELITE] VOID EDGE', 'Attacks reduce armor by 3% per hit permanently', 'B',
{ type: 'special', specialId: 'voidEdge', specialDesc: 'Permanent armor shredding' }, true, 5.0, 10),
createPerk('ap_t3_l10_c', '[ELITE] EXECUTIONER', 'Crits deal bonus damage equal to 50% of enemy max HP', 'C',
{ type: 'special', specialId: 'executioner', specialDesc: 'Crit bonus based on enemy HP' }, true, 5.0, 10),
],
},
];
// ─── SPELL DAMAGE TALENT TREE ──────────────────────────────────────────────
export const SPELL_DAMAGE_TIERS: SkillTierDef[] = [
{
tier: 1, skillId: 'spellDamage', name: 'Spell Damage', multiplier: 1,
l5Perks: [
createPerk('sd_t1_l5_a', 'Amplified Magic', '+15% spell damage', 'A',
{ type: 'multiplier', stat: 'spellDamage', value: 0.15 }, false, 1.5, 5),
createPerk('sd_t1_l5_b', 'Elemental Focus', 'Spells cost 5% less mana per element level', 'B',
{ type: 'special', specialId: 'elemFocus', specialDesc: 'Less spell cost per element' }, false, 1.5, 5),
createPerk('sd_t1_l5_c', 'Overcharge', 'Every 5th spell deals 2x damage', 'C',
{ type: 'special', specialId: 'overcharge', specialDesc: 'Every 5th spell does 2x' }, false, 1.5, 5),
],
l10Perks: [
createPerk('sd_t1_l10_a', 'Destructive Magic', '+25% spell damage', 'A',
{ type: 'multiplier', stat: 'spellDamage', value: 0.25 }, false, 2.0, 10),
createPerk('sd_t1_l10_b', 'Efficient Channeling', 'Spells cost 10% less mana', 'B',
{ type: 'special', specialId: 'efficientChanneling', specialDesc: '15% less spell cost' }, false, 2.0, 10),
createPerk('sd_t1_l10_c', 'Critical Spell', 'Spells have 10% chance to crit for 2x damage', 'C',
{ type: 'special', specialId: 'criticalSpell', specialDesc: 'Spell crits' }, false, 2.0, 10),
],
},
{
tier: 2, skillId: 'spellDamage_t2', name: 'Devastating Spells', multiplier: 10,
l5Perks: [
createPerk('sd_t2_l5_a', 'Arcane Devastation', '+35% spell damage', 'A',
{ type: 'multiplier', stat: 'spellDamage', value: 0.35 }, false, 2.0, 5),
createPerk('sd_t2_l5_b', 'Elemental Surge', 'Spells deal bonus damage equal to 5% of max mana', 'B',
{ type: 'special', specialId: 'elemSurge', specialDesc: 'Mana-based bonus damage' }, false, 2.0, 5),
createPerk('sd_t2_l5_c', 'Chain Reaction', 'Every spell hit has 10% chance to deal damage again', 'C',
{ type: 'special', specialId: 'chainReaction', specialDesc: 'Chance for double damage' }, false, 2.0, 5),
],
l10Perks: [
createPerk('sd_t2_l10_a', 'Meteor Magic', '+50% spell damage', 'A',
{ type: 'multiplier', stat: 'spellDamage', value: 0.50 }, false, 2.5, 10),
createPerk('sd_t2_l10_b', 'Arcane Battery', 'Mana contributes +1% spell damage per 100 max mana', 'B',
{ type: 'special', specialId: 'arcaneBattery', specialDesc: 'Mana amplifies damage' }, false, 2.5, 10),
createPerk('sd_t2_l10_c', 'Spell Storm', 'Every cast has 15% chance to cast twice', 'C',
{ type: 'special', specialId: 'spellStorm', specialDesc: '15% double cast' }, false, 2.5, 10),
],
},
{
tier: 3, skillId: 'spellDamage_t3', name: 'Supreme Spell Power', multiplier: 100,
l5Perks: [
createPerk('sd_t3_l5_a', 'Reality Shatter', '+70% spell damage', 'A',
{ type: 'multiplier', stat: 'spellDamage', value: 0.70 }, false, 3.0, 5),
createPerk('sd_t3_l5_b', 'Void Siphon', 'Spells drain 2% of damage as mana', 'B',
{ type: 'special', specialId: 'voidSiphon', specialDesc: 'Mana drain from spells' }, false, 3.0, 5),
createPerk('sd_t3_l5_c', 'Unstable Magic', 'Every spell has a 20% wild surge (0.5x-3x damage)', 'C',
{ type: 'special', specialId: 'unstableMagic', specialDesc: 'Random damage multiplier' }, false, 3.0, 5),
],
l10Perks: [
createPerk('sd_t3_l10_a', '[ELITE SPELLBREAKER]', 'Spell damage is 5x', 'A',
{ type: 'special', specialId: 'spellbreaker', specialDesc: '5x spell damage' }, true, 5.0, 10),
createPerk('sd_t3_l10_b', '[ELITE MANA VORTEX]', 'Every cast pulls 5% of enemy max HP as mana', 'B',
{ type: 'special', specialId: 'manaVortex', specialDesc: 'Mana leech from enemies' }, true, 5.0, 10),
createPerk('sd_t3_l10_c', '[ELITE ARCANE GOD]', 'Spells deal damage to ALL enemies on screen', 'C',
{ type: 'special', specialId: 'arcaneGod', specialDesc: 'AoE all enemies' }, true, 5.0, 10),
],
},
];
@@ -1,188 +0,0 @@
// ─── Combat Skills Tier Definitions (Part 1) ─────────────────────────────
// Arcane Fury, Combat Training, Precision
import { createPerk } from './utils';
import type { SkillTierDef } from '../types';
// ─── ARCANE FURY TALENT TREE ───────────────────────────────────────────────
export const ARCANE_FURY_TIERS: SkillTierDef[] = [
{
tier: 1, skillId: 'arcaneFury', name: 'Arcane Fury', multiplier: 1,
l5Perks: [
createPerk('af_t1_l5_a', 'Shatter', '+15% spell damage', 'A',
{ type: 'multiplier', stat: 'spellDamage', value: 0.15 }, false, 1.5, 5),
createPerk('af_t1_l5_b', 'Chain Lightning', 'Spells have 10% chance to chain', 'B',
{ type: 'special', specialId: 'chainLightning', specialDesc: 'Spells chain on hit' }, false, 1.5, 5),
createPerk('af_t1_l5_c', 'Rift', 'Crits deal 2x damage', 'C',
{ type: 'special', specialId: 'rift', specialDesc: '2x crit damage' }, false, 1.5, 5),
],
l10Perks: [
createPerk('af_t1_l10_a', 'Arcane Devastation', '+25% spell damage', 'A',
{ type: 'multiplier', stat: 'spellDamage', value: 0.25 }, false, 2.0, 10),
createPerk('af_t1_l10_b', 'Overload', 'Spells have 20% chance to chain', 'B',
{ type: 'special', specialId: 'overload', specialDesc: '20% chain chance' }, false, 2.0, 10),
createPerk('af_t1_l10_c', 'Void Tear', 'Crits deal 3x damage', 'C',
{ type: 'special', specialId: 'voidTear', specialDesc: '3x crit damage' }, false, 2.0, 10),
],
},
{
tier: 2, skillId: 'arcaneFury_t2', name: 'Greater Arcane Fury', multiplier: 10,
l5Perks: [
createPerk('af_t2_l5_a', 'Arcane Storm', '+40% spell damage', 'A',
{ type: 'multiplier', stat: 'spellDamage', value: 0.40 }, false, 2.0, 5),
createPerk('af_t2_l5_b', 'Thunderous', 'Chains deal 2x damage', 'B',
{ type: 'special', specialId: 'thunderous', specialDesc: 'Double chain damage' }, false, 2.0, 5),
createPerk('af_t2_l5_c', 'Shatterpoint', 'Crits apply to chained spells', 'C',
{ type: 'special', specialId: 'shatterpoint', specialDesc: 'Crits chain' }, false, 2.0, 5),
],
l10Perks: [
createPerk('af_t2_l10_a', 'Meteor Strike', '+60% spell damage', 'A',
{ type: 'multiplier', stat: 'spellDamage', value: 0.60 }, false, 2.5, 10),
createPerk('af_t2_l10_b', 'Arcane Cascade', '3 chains per spell', 'B',
{ type: 'special', specialId: 'arcaneCascade', specialDesc: 'Triple chains' }, false, 2.5, 10),
createPerk('af_t2_l10_c', 'Devastation', 'Crits deal 5x damage', 'C',
{ type: 'special', specialId: 'devastation', specialDesc: '5x crit damage' }, false, 2.5, 10),
],
},
{
tier: 3, skillId: 'arcaneFury_t3', name: 'Perfect Arcane Fury', multiplier: 100,
l5Perks: [
createPerk('af_t3_l5_a', 'Celestial Fire', '+80% spell damage', 'A',
{ type: 'multiplier', stat: 'spellDamage', value: 0.80 }, false, 3.0, 5),
createPerk('af_t3_l5_b', 'Unstoppable Chains', 'Chains are infinite', 'B',
{ type: 'special', specialId: 'infiniteChains', specialDesc: 'Infinite chains' }, false, 3.0, 5),
createPerk('af_t3_l5_c', 'Annihilation', 'Crits deal 8x damage', 'C',
{ type: 'special', specialId: 'annihilation', specialDesc: '8x crit damage' }, false, 3.0, 5),
],
l10Perks: [
createPerk('af_t3_l10_a', '[ELITE] ARCANE APOCALYPSE', 'Spell damage is 5x', 'A',
{ type: 'special', specialId: 'arcaneApocalypse', specialDesc: '5x spell damage' }, true, 5.0, 10),
createPerk('af_t3_l10_b', '[ELITE] CHAIN SINGULARITY', 'Each chain spawns 3 more', 'B',
{ type: 'special', specialId: 'chainSingularity', specialDesc: 'Branching chains' }, true, 5.0, 10),
createPerk('af_t3_l10_c', '[ELITE] CRIT GOD', 'Every hit is a critical strike', 'C',
{ type: 'special', specialId: 'critGod', specialDesc: '100% crit chance' }, true, 5.0, 10),
],
},
];
// ─── COMBAT TRAINING TALENT TREE ────────────────────────────────────────────
export const COMBAT_TRAINING_TIERS: SkillTierDef[] = [
{
tier: 1, skillId: 'combatTraining', name: 'Combat Training', multiplier: 1,
l5Perks: [
createPerk('ct_t1_l5_a', 'Heavy Strikes', '+15 base damage', 'A',
{ type: 'multiplier', stat: 'baseDamage', value: 0.15 }, false, 1.5, 5),
createPerk('ct_t1_l5_b', 'Toughness', '+10% max HP', 'B',
{ type: 'special', specialId: 'toughness', specialDesc: '+10% max HP' }, false, 1.5, 5),
createPerk('ct_t1_l5_c', 'Battle Instinct', '+5% crit chance', 'C',
{ type: 'multiplier', stat: 'critChance', value: 0.05 }, false, 1.5, 5),
],
l10Perks: [
createPerk('ct_t1_l10_a', 'Warrior Spirit', '+25 base damage', 'A',
{ type: 'multiplier', stat: 'baseDamage', value: 0.25 }, false, 2.0, 10),
createPerk('ct_t1_l10_b', 'Iron Will', '+20% max HP', 'B',
{ type: 'special', specialId: 'ironWill', specialDesc: '+20% max HP' }, false, 2.0, 10),
createPerk('ct_t1_l10_c', 'Eagle Eye', '+10% crit chance', 'C',
{ type: 'multiplier', stat: 'critChance', value: 0.10 }, false, 2.0, 10),
],
},
{
tier: 2, skillId: 'combatTraining_t2', name: 'Advanced Combat', multiplier: 10,
l5Perks: [
createPerk('ct_t2_l5_a', 'Battle Mastery', '+30 base damage', 'A',
{ type: 'multiplier', stat: 'baseDamage', value: 0.30 }, false, 2.0, 5),
createPerk('ct_t2_l5_b', 'Fortress', '+30% max HP', 'B',
{ type: 'special', specialId: 'fortress', specialDesc: '+30% max HP' }, false, 2.0, 5),
createPerk('ct_t2_l5_c', 'Deadly Precision', '+15% crit chance', 'C',
{ type: 'multiplier', stat: 'critChance', value: 0.15 }, false, 2.0, 5),
],
l10Perks: [
createPerk('ct_t2_l10_a', 'Titan Strike', '+45 base damage', 'A',
{ type: 'multiplier', stat: 'baseDamage', value: 0.45 }, false, 2.5, 10),
createPerk('ct_t2_l10_b', 'Immovable Object', '+40% max HP', 'B',
{ type: 'special', specialId: 'immovable', specialDesc: '+40% max HP' }, false, 2.5, 10),
createPerk('ct_t2_l10_c', 'Sniper', '+20% crit chance', 'C',
{ type: 'multiplier', stat: 'critChance', value: 0.20 }, false, 2.5, 10),
],
},
{
tier: 3, skillId: 'combatTraining_t3', name: 'Supreme Combat', multiplier: 100,
l5Perks: [
createPerk('ct_t3_l5_a', 'War Avatar', '+60 base damage', 'A',
{ type: 'multiplier', stat: 'baseDamage', value: 0.60 }, false, 3.0, 5),
createPerk('ct_t3_l5_b', 'Juggernaut', '+50% max HP', 'B',
{ type: 'special', specialId: 'juggernaut', specialDesc: '+50% max HP' }, false, 3.0, 5),
createPerk('ct_t3_l5_c', 'Perfect Aim', '+25% crit chance', 'C',
{ type: 'multiplier', stat: 'critChance', value: 0.25 }, false, 3.0, 5),
],
l10Perks: [
createPerk('ct_t3_l10_a', '[ELITE] WAR MACHINE', 'Base damage is 10x', 'A',
{ type: 'special', specialId: 'warMachine', specialDesc: '10x base damage' }, true, 5.0, 10),
createPerk('ct_t3_l10_b', '[ELITE] UNBREAKABLE', 'HP is infinite', 'B',
{ type: 'special', specialId: 'unbreakable', specialDesc: 'Infinite HP' }, true, 5.0, 10),
createPerk('ct_t3_l10_c', '[ELITE] CRIT DEMIGOD', 'Crits deal 10x damage', 'C',
{ type: 'special', specialId: 'critDemigod', specialDesc: '10x crit damage' }, true, 5.0, 10),
],
},
];
// ─── PRECISION TALENT TREE ──────────────────────────────────────────────────
export const PRECISION_TIERS: SkillTierDef[] = [
{
tier: 1, skillId: 'precision', name: 'Precision', multiplier: 1,
l5Perks: [
createPerk('p_t1_l5_a', 'Sharpshooter', '+10% crit chance', 'A',
{ type: 'multiplier', stat: 'critChance', value: 0.10 }, false, 1.5, 5),
createPerk('p_t1_l5_b', 'Steady Hand', '+10% attack speed', 'B',
{ type: 'multiplier', stat: 'attackSpeed', value: 0.10 }, false, 1.5, 5),
createPerk('p_t1_l5_c', 'Weak Spot', '+15% armor piercing', 'C',
{ type: 'multiplier', stat: 'armorPierce', value: 0.15 }, false, 1.5, 5),
],
l10Perks: [
createPerk('p_t1_l10_a', 'Deadly Aim', '+20% crit chance', 'A',
{ type: 'multiplier', stat: 'critChance', value: 0.20 }, false, 2.0, 10),
createPerk('p_t1_l10_b', 'Rapid Fire', '+20% attack speed', 'B',
{ type: 'multiplier', stat: 'attackSpeed', value: 0.20 }, false, 2.0, 10),
createPerk('p_t1_l10_c', 'Armor Breaker', '+25% armor piercing', 'C',
{ type: 'multiplier', stat: 'armorPierce', value: 0.25 }, false, 2.0, 10),
],
},
{
tier: 2, skillId: 'precision_t2', name: 'Greater Precision', multiplier: 10,
l5Perks: [
createPerk('p_t2_l5_a', 'Sniper', '+25% crit chance', 'A',
{ type: 'multiplier', stat: 'critChance', value: 0.25 }, false, 2.0, 5),
createPerk('p_t2_l5_b', 'Blitz', '+30% attack speed', 'B',
{ type: 'multiplier', stat: 'attackSpeed', value: 0.30 }, false, 2.0, 5),
createPerk('p_t2_l5_c', 'Piercing Shot', '+35% armor piercing', 'C',
{ type: 'multiplier', stat: 'armorPierce', value: 0.35 }, false, 2.0, 5),
],
l10Perks: [
createPerk('p_t2_l10_a', 'Deadeye', '+35% crit chance', 'A',
{ type: 'multiplier', stat: 'critChance', value: 0.35 }, false, 2.5, 10),
createPerk('p_t2_l10_b', 'Lightning Speed', '+40% attack speed', 'B',
{ type: 'multiplier', stat: 'attackSpeed', value: 0.40 }, false, 2.5, 10),
createPerk('p_t2_l10_c', 'Shatter Armor', '+45% armor piercing', 'C',
{ type: 'multiplier', stat: 'armorPierce', value: 0.45 }, false, 2.5, 10),
],
},
{
tier: 3, skillId: 'precision_t3', name: 'Perfect Precision', multiplier: 100,
l5Perks: [
createPerk('p_t3_l5_a', 'Annihilating Aim', '+50% crit chance', 'A',
{ type: 'multiplier', stat: 'critChance', value: 0.50 }, false, 3.0, 5),
createPerk('p_t3_l5_b', 'Time Stop', '+50% attack speed', 'B',
{ type: 'multiplier', stat: 'attackSpeed', value: 0.50 }, false, 3.0, 5),
createPerk('p_t3_l5_c', 'Abyssal Pierce', '+60% armor piercing', 'C',
{ type: 'multiplier', stat: 'armorPierce', value: 0.60 }, false, 3.0, 5),
],
l10Perks: [
createPerk('p_t3_l10_a', '[ELITE] PERFECT CRIT', 'Crit chance is 100%', 'A',
{ type: 'special', specialId: 'perfectCrit', specialDesc: '100% crit' }, true, 5.0, 10),
createPerk('p_t3_l10_b', '[ELITE] TIMELESS', 'Attack speed is 10x', 'B',
{ type: 'special', specialId: 'timeless', specialDesc: '10x speed' }, true, 5.0, 10),
createPerk('p_t3_l10_c', '[ELITE] VOID PIERCE', 'Armor piercing is 100%', 'C',
{ type: 'special', specialId: 'voidPierce', specialDesc: '100% pierce' }, true, 5.0, 10),
],
},
];
@@ -1,183 +0,0 @@
// ─── Element Capacity Skill Tier Definitions ──────────────────────────────
// All element cap skills follow the same tier structure
import { createPerk } from './utils';
import type { SkillTierDef } from '../types';
export const FIRE_MANA_CAP_TIERS: SkillTierDef[] = [
{
tier: 1, skillId: 'fireManaCap', name: 'Fire Mana Capacity', multiplier: 1,
l5Perks: [
createPerk('fmc_t1_l5_a', 'Expanded Fire Cap I', '+15% fire cap', 'A',
{ type: 'multiplier', stat: 'fireCap', value: 0.15 }, false, 1.5, 5),
createPerk('fmc_t1_l5_b', 'Fire Regen', '+10% fire regen', 'B',
{ type: 'special', specialId: 'fireRegen10', specialDesc: '+10% fire regen' }, false, 1.5, 5),
createPerk('fmc_t1_l5_c', 'Fire Efficiency', 'Fire spells cost 5% less', 'C',
{ type: 'special', specialId: 'fireEfficiency', specialDesc: '-5% fire spell cost' }, false, 1.5, 5),
],
l10Perks: [
createPerk('fmc_t1_l10_a', 'Master Fire Cap I', '+25% fire cap', 'A',
{ type: 'multiplier', stat: 'fireCap', value: 0.25 }, false, 2.0, 10),
createPerk('fmc_t1_l10_b', 'Rapid Fire Regen', '+20% fire regen', 'B',
{ type: 'special', specialId: 'fireRegen20', specialDesc: '+20% fire regen' }, false, 2.0, 10),
createPerk('fmc_t1_l10_c', 'Fire Mastery', 'Fire spells cost 10% less', 'C',
{ type: 'special', specialId: 'fireMastery', specialDesc: '-10% fire spell cost' }, false, 2.0, 10),
],
},
{
tier: 2, skillId: 'fireManaCap_t2', name: 'Advanced Fire Capacity', multiplier: 10,
l5Perks: [
createPerk('fmc_t2_l5_a', 'Vast Fire Cap', '+40% fire cap', 'A',
{ type: 'multiplier', stat: 'fireCap', value: 0.40 }, false, 2.0, 5),
createPerk('fmc_t2_l5_b', 'Fire Affinity', 'Fire spells have +15% range', 'B',
{ type: 'special', specialId: 'fireRange', specialDesc: '+15% fire range' }, false, 2.0, 5),
createPerk('fmc_t2_l5_c', 'Burning Resolve', 'Fire damage +10%', 'C',
{ type: 'multiplier', stat: 'elementalDamage', value: 0.10 }, false, 2.0, 5),
],
l10Perks: [
createPerk('fmc_t2_l10_a', 'Infinite Fire Cap', '+60% fire cap', 'A',
{ type: 'multiplier', stat: 'fireCap', value: 0.60 }, false, 2.5, 10),
createPerk('fmc_t2_l10_b', 'Absolute Fire Affinity', 'Fire spells +25% range', 'B',
{ type: 'special', specialId: 'fireRange25', specialDesc: '+25% fire range' }, false, 2.5, 10),
createPerk('fmc_t2_l10_c', 'Scorching', 'Fire damage +20%', 'C',
{ type: 'multiplier', stat: 'elementalDamage', value: 0.20 }, false, 2.5, 10),
],
},
{
tier: 3, skillId: 'fireManaCap_t3', name: 'Master Fire Capacity', multiplier: 100,
l5Perks: [
createPerk('fmc_t3_l5_a', 'Inferno Capacity', '+100% fire cap', 'A',
{ type: 'multiplier', stat: 'fireCap', value: 1.0 }, false, 3.0, 5),
createPerk('fmc_t3_l5_b', 'Magma Core', 'Fire spells pierce 25% resistance', 'B',
{ type: 'special', specialId: 'firePierce', specialDesc: '25% fire resistance pierce' }, false, 3.0, 5),
createPerk('fmc_t3_l5_c', 'Volcanic Fury', 'Fire damage +40%', 'C',
{ type: 'multiplier', stat: 'elementalDamage', value: 0.40 }, false, 3.0, 5),
],
l10Perks: [
createPerk('fmc_t3_l10_a', '[ELITE] COSMIC FIRE', 'Fire cap is 3x', 'A',
{ type: 'special', specialId: 'cosmicFire', specialDesc: '3x fire cap' }, true, 5.0, 10),
createPerk('fmc_t3_l10_b', '[ELITE] FIRE SUPREMACY', 'Fire spells ignore resistance', 'B',
{ type: 'special', specialId: 'fireSupremacy', specialDesc: 'Ignore fire resistance' }, true, 5.0, 10),
createPerk('fmc_t3_l10_c', '[ELITE] ERUPTION', 'Fire damage is 5x', 'C',
{ type: 'special', specialId: 'eruption', specialDesc: '5x fire damage' }, true, 5.0, 10),
],
},
{
tier: 4, skillId: 'fireManaCap_t4', name: 'Transcendent Fire Capacity', multiplier: 1000,
l5Perks: [
createPerk('fmc_t4_l5_a', 'Infinite Inferno', '+200% fire cap', 'A',
{ type: 'multiplier', stat: 'fireCap', value: 2.0 }, false, 4.0, 5),
createPerk('fmc_t4_l5_b', 'Fire Aura', 'Fire spells create persistent burning auras', 'B',
{ type: 'special', specialId: 'fireAura', specialDesc: 'Fire spell auras' }, false, 4.0, 5),
createPerk('fmc_t4_l5_c', 'Wildfire', 'Fire spells have 20% chance to spread', 'C',
{ type: 'special', specialId: 'wildfire', specialDesc: '20% fire spread' }, false, 4.0, 5),
],
l10Perks: [
createPerk('fmc_t4_l10_a', '[ELITE] CORE OF THE SUN', 'Fire cap is 10x', 'A',
{ type: 'special', specialId: 'coreOfSun', specialDesc: '10x fire cap' }, true, 5.0, 10),
createPerk('fmc_t4_l10_b', '[ELITE] ETERNAL FLAME', 'Fire effects never expire', 'B',
{ type: 'special', specialId: 'eternalFlame', specialDesc: 'Permanent fire effects' }, true, 5.0, 10),
createPerk('fmc_t4_l10_c', '[ELITE] CHAOS FIRE', 'Every fire spell has secondary random effect', 'C',
{ type: 'special', specialId: 'chaosFire', specialDesc: 'Chaos fire effects' }, true, 5.0, 10),
],
},
{
tier: 5, skillId: 'fireManaCap_t5', name: 'Godlike Fire Capacity', multiplier: 10000,
l5Perks: [
createPerk('fmc_t5_l5_a', 'Solar Flare Capacity', '+500% fire cap', 'A',
{ type: 'multiplier', stat: 'fireCap', value: 5.0 }, false, 5.0, 5),
createPerk('fmc_t5_l5_b', 'Volcanic Heart', 'Burning enemies drop fire essence', 'B',
{ type: 'special', specialId: 'volcanicHeart', specialDesc: 'Enemies drop fire essence' }, false, 5.0, 5),
createPerk('fmc_t5_l5_c', 'Apocalypse Flame', 'Fire damage is 10x', 'C',
{ type: 'multiplier', stat: 'elementalDamage', value: 1.0 }, false, 5.0, 5),
],
l10Perks: [
createPerk('fmc_t5_l10_a', '[ELITE] GOD OF FIRE', 'Fire cap is infinite', 'A',
{ type: 'special', specialId: 'godOfFire', specialDesc: 'Infinite fire cap' }, true, 10.0, 10),
createPerk('fmc_t5_l10_b', '[ELITE] PHOENIX REBIRTH', 'Immune to fire damage + fire spells cost zero', 'B',
{ type: 'special', specialId: 'phoenixRebirth', specialDesc: 'Immune + free fire spells' }, true, 10.0, 10),
createPerk('fmc_t5_l10_c', '[ELITE] INFERNO', 'All spells become fire with 3x power', 'C',
{ type: 'special', specialId: 'inferno', specialDesc: 'All spells = fire, 3x power' }, true, 10.0, 10),
],
},
];
export const WATER_MANA_CAP_TIERS: SkillTierDef[] = FIRE_MANA_CAP_TIERS.map(t => ({
...t,
skillId: t.skillId.replace(/fire/g, 'water'),
name: t.name.replace(/Fire/g, 'Water'),
l5Perks: t.l5Perks.map(p => ({ ...p, id: p.id.replace(/fmc/g, 'wmc'), desc: p.desc.replace(/fire/gi, 'water').replace(/Fire/g, 'Water') })),
l10Perks: t.l10Perks.map(p => ({ ...p, id: p.id.replace(/fmc/g, 'wmc'), desc: p.desc.replace(/fire/gi, 'water').replace(/Fire/g, 'Water') })),
}));
export const AIR_MANA_CAP_TIERS: SkillTierDef[] = FIRE_MANA_CAP_TIERS.map(t => ({
...t,
skillId: t.skillId.replace(/fire/g, 'air'),
name: t.name.replace(/Fire/g, 'Air'),
l5Perks: t.l5Perks.map(p => ({ ...p, id: p.id.replace(/fmc/g, 'amc'), desc: p.desc.replace(/fire/gi, 'air').replace(/Fire/g, 'Air') })),
l10Perks: t.l10Perks.map(p => ({ ...p, id: p.id.replace(/fmc/g, 'amc'), desc: p.desc.replace(/fire/gi, 'air').replace(/Fire/g, 'Air') })),
}));
export const EARTH_MANA_CAP_TIERS: SkillTierDef[] = FIRE_MANA_CAP_TIERS.map(t => ({
...t,
skillId: t.skillId.replace(/fire/g, 'earth'),
name: t.name.replace(/Fire/g, 'Earth'),
l5Perks: t.l5Perks.map(p => ({ ...p, id: p.id.replace(/fmc/g, 'emc'), desc: p.desc.replace(/fire/gi, 'earth').replace(/Fire/g, 'Earth') })),
l10Perks: t.l10Perks.map(p => ({ ...p, id: p.id.replace(/fmc/g, 'emc'), desc: p.desc.replace(/fire/gi, 'earth').replace(/Fire/g, 'Earth') })),
}));
export const LIGHT_MANA_CAP_TIERS: SkillTierDef[] = FIRE_MANA_CAP_TIERS.map(t => ({
...t,
skillId: t.skillId.replace(/fire/g, 'light'),
name: t.name.replace(/Fire/g, 'Light'),
l5Perks: t.l5Perks.map(p => ({ ...p, id: p.id.replace(/fmc/g, 'lmc'), desc: p.desc.replace(/fire/gi, 'light').replace(/Fire/g, 'Light') })),
l10Perks: t.l10Perks.map(p => ({ ...p, id: p.id.replace(/fmc/g, 'lmc'), desc: p.desc.replace(/fire/gi, 'light').replace(/Fire/g, 'Light') })),
}));
export const DARK_MANA_CAP_TIERS: SkillTierDef[] = FIRE_MANA_CAP_TIERS.map(t => ({
...t,
skillId: t.skillId.replace(/fire/g, 'dark'),
name: t.name.replace(/Fire/g, 'Dark'),
l5Perks: t.l5Perks.map(p => ({ ...p, id: p.id.replace(/fmc/g, 'dmc'), desc: p.desc.replace(/fire/gi, 'dark').replace(/Fire/g, 'Dark') })),
l10Perks: t.l10Perks.map(p => ({ ...p, id: p.id.replace(/fmc/g, 'dmc'), desc: p.desc.replace(/fire/gi, 'dark').replace(/Fire/g, 'Dark') })),
}));
export const DEATH_MANA_CAP_TIERS: SkillTierDef[] = FIRE_MANA_CAP_TIERS.map(t => ({
...t,
skillId: t.skillId.replace(/fire/g, 'death'),
name: t.name.replace(/Fire/g, 'Death'),
l5Perks: t.l5Perks.map(p => ({ ...p, id: p.id.replace(/fmc/g, 'dethmc'), desc: p.desc.replace(/fire/gi, 'death').replace(/Fire/g, 'Death') })),
l10Perks: t.l10Perks.map(p => ({ ...p, id: p.id.replace(/fmc/g, 'dethmc'), desc: p.desc.replace(/fire/gi, 'death').replace(/Fire/g, 'Death') })),
}));
export const METAL_MANA_CAP_TIERS: SkillTierDef[] = FIRE_MANA_CAP_TIERS.map(t => ({
...t,
skillId: t.skillId.replace(/fire/g, 'metal'),
name: t.name.replace(/Fire/g, 'Metal'),
l5Perks: t.l5Perks.map(p => ({ ...p, id: p.id.replace(/fmc/g, 'mmc'), desc: p.desc.replace(/fire/gi, 'metal').replace(/Fire/g, 'Metal') })),
l10Perks: t.l10Perks.map(p => ({ ...p, id: p.id.replace(/fmc/g, 'mmc'), desc: p.desc.replace(/fire/gi, 'metal').replace(/Fire/g, 'Metal') })),
}));
export const SAND_MANA_CAP_TIERS: SkillTierDef[] = FIRE_MANA_CAP_TIERS.map(t => ({
...t,
skillId: t.skillId.replace(/fire/g, 'sand'),
name: t.name.replace(/Fire/g, 'Sand'),
l5Perks: t.l5Perks.map(p => ({ ...p, id: p.id.replace(/fmc/g, 'smc'), desc: p.desc.replace(/fire/gi, 'sand').replace(/Fire/g, 'Sand') })),
l10Perks: t.l10Perks.map(p => ({ ...p, id: p.id.replace(/fmc/g, 'smc'), desc: p.desc.replace(/fire/gi, 'sand').replace(/Fire/g, 'Sand') })),
}));
export const LIGHTNING_MANA_CAP_TIERS: SkillTierDef[] = FIRE_MANA_CAP_TIERS.map(t => ({
...t,
skillId: t.skillId.replace(/fire/g, 'lightning'),
name: t.name.replace(/Fire/g, 'Lightning'),
l5Perks: t.l5Perks.map(p => ({ ...p, id: p.id.replace(/fmc/g, 'ltmc'), desc: p.desc.replace(/fire/gi, 'lightning').replace(/Fire/g, 'Lightning') })),
l10Perks: t.l10Perks.map(p => ({ ...p, id: p.id.replace(/fmc/g, 'ltmc'), desc: p.desc.replace(/fire/gi, 'lightning').replace(/Fire/g, 'Lightning') })),
}));
export const TRANFERENCE_MANA_CAP_TIERS: SkillTierDef[] = FIRE_MANA_CAP_TIERS.map(t => ({
...t,
skillId: t.skillId.replace(/fire/g, 'transference'),
name: t.name.replace(/Fire/g, 'Transference'),
l5Perks: t.l5Perks.map(p => ({ ...p, id: p.id.replace(/fmc/g, 'tmc'), desc: p.desc.replace(/fire/gi, 'transference').replace(/Fire/g, 'Transference') })),
l10Perks: t.l10Perks.map(p => ({ ...p, id: p.id.replace(/fmc/g, 'tmc'), desc: p.desc.replace(/fire/gi, 'transference').replace(/Fire/g, 'Transference') })),
}));
@@ -1,127 +0,0 @@
// ─── Elemental Attunement Skill Tier Definitions ──────────────────────────────
// Base: Increases Elemental Mana Capacity
import { createPerk } from './utils';
import type { SkillTierDef } from '../types';
// ─── ELEMENTAL ATTUNEMENT TALENT TREE ──────────────────────────────────────
// Base: Increases Elemental Mana Capacity
// Paths: A = The Conduit (Capacity), B = The Purifier (Efficiency), C = The Catalyst (Bonus Effects)
export const ELEM_ATTUNE_TIERS: SkillTierDef[] = [
// TIER 1
{
tier: 1,
skillId: 'elemAttune',
name: 'Elemental Attunement',
multiplier: 1,
l5Perks: [
createPerk('ea_t1_l5_a', 'Expanded Capacity', '+50% Elemental Mana Cap', 'A',
{ type: 'multiplier', stat: 'elemManaCap', value: 0.50 }, false, 1.5, 5),
createPerk('ea_t1_l5_b', 'Pure Essence', '+10% Elemental Mana Regen', 'B',
{ type: 'multiplier', stat: 'elemRegen', value: 0.10 }, false, 1.5, 5),
createPerk('ea_t1_l5_c', 'Elemental Affinity', '+5% Damage with all elements', 'C',
{ type: 'multiplier', stat: 'elemDamage', value: 0.05 }, false, 1.5, 5),
],
l10Perks: [
createPerk('ea_t1_l10_a', 'Greater Capacity', '+75% Elemental Mana Cap', 'A',
{ type: 'multiplier', stat: 'elemManaCap', value: 0.75 }, false, 2.0, 10),
createPerk('ea_t1_l10_b', 'Swift Flow', '+15% Elemental Mana Regen', 'B',
{ type: 'multiplier', stat: 'elemRegen', value: 0.15 }, false, 2.0, 10),
createPerk('ea_t1_l10_c', 'Elemental Mastery', '+10% Damage with all elements', 'C',
{ type: 'multiplier', stat: 'elemDamage', value: 0.10 }, false, 2.0, 10),
],
},
// TIER 2
{
tier: 2,
skillId: 'elemAttune_t2',
name: 'Greater Attunement',
multiplier: 10,
l5Perks: [
createPerk('ea_t2_l5_a', 'Vast Reservoir', '+100% Elemental Mana Cap', 'A',
{ type: 'multiplier', stat: 'elemManaCap', value: 1.0 }, false, 2.0, 5),
createPerk('ea_t2_l5_b', 'Crystal Clear', 'Elemental mana costs reduced by 10%', 'B',
{ type: 'special', specialId: 'crystalClear', specialDesc: '10% less elemental mana cost' }, false, 2.0, 5),
createPerk('ea_t2_l5_c', 'Reactive Shield', 'Elemental attacks grant 2% damage reduction for 5s', 'C',
{ type: 'special', specialId: 'reactiveShield', specialDesc: 'Elemental attacks grant DR' }, false, 2.0, 5),
],
l10Perks: [
createPerk('ea_t2_l10_a', 'Infinite Well', '+150% Elemental Mana Cap', 'A',
{ type: 'multiplier', stat: 'elemManaCap', value: 1.50 }, false, 2.5, 10),
createPerk('ea_t2_l10_b', 'Rapid Flux', '+25% Elemental Mana Regen', 'B',
{ type: 'multiplier', stat: 'elemRegen', value: 0.25 }, false, 2.5, 10),
createPerk('ea_t2_l10_c', 'Elemental Fury', '+15% Damage with all elements', 'C',
{ type: 'multiplier', stat: 'elemDamage', value: 0.15 }, false, 2.5, 10),
],
},
// TIER 3
{
tier: 3,
skillId: 'elemAttune_t3',
name: 'Perfect Attunement',
multiplier: 100,
l5Perks: [
createPerk('ea_t3_l5_a', 'Cosmic Reservoir', '+200% Elemental Mana Cap', 'A',
{ type: 'multiplier', stat: 'elemManaCap', value: 2.0 }, false, 3.0, 5),
createPerk('ea_t3_l5_b', 'Elemental Siphon', 'Killing enemies restores 1% elemental mana per 10 max', 'B',
{ type: 'special', specialId: 'elemSiphon', specialDesc: 'Kills restore elemental mana' }, false, 3.0, 5),
createPerk('ea_t3_l5_c', 'Primordial Force', '+20% Damage with all elements', 'C',
{ type: 'multiplier', stat: 'elemDamage', value: 0.20 }, false, 3.0, 5),
],
l10Perks: [
createPerk('ea_t3_l10_a', '[ELITE] ELEMENTAL OCEAN', 'Elemental Mana Cap is tripled', 'A',
{ type: 'special', specialId: 'elemOcean', specialDesc: '3x elemental mana cap' }, true, 5.0, 10),
createPerk('ea_t3_l10_b', '[ELITE] PURE POWER', 'Elemental mana costs are reduced by 50%', 'B',
{ type: 'special', specialId: 'purePower', specialDesc: '50% less elemental mana cost' }, true, 5.0, 10),
createPerk('ea_t3_l10_c', '[ELITE] ELEMENTAL GOD', 'All elemental damage is doubled', 'C',
{ type: 'special', specialId: 'elemGod', specialDesc: '2x all elemental damage' }, true, 5.0, 10),
],
},
// TIER 4
{
tier: 4,
skillId: 'elemAttune_t4',
name: 'Transcendent Attunement',
multiplier: 1000,
l5Perks: [
createPerk('ea_t4_l5_a', 'Astral Capacity', '+300% Elemental Mana Cap', 'A',
{ type: 'multiplier', stat: 'elemManaCap', value: 3.0 }, false, 4.0, 5),
createPerk('ea_t4_l5_b', 'Ethereal Flow', '+50% Elemental Mana Regen', 'B',
{ type: 'multiplier', stat: 'elemRegen', value: 0.50 }, false, 4.0, 5),
createPerk('ea_t4_l5_c', 'Elemental Storm', 'Elemental attacks have 10% chance to cast twice', 'C',
{ type: 'special', specialId: 'elemStorm', specialDesc: '10% chance double elemental cast' }, false, 4.0, 5),
],
l10Perks: [
createPerk('ea_t4_l10_a', 'Galactic Well', '+400% Elemental Mana Cap', 'A',
{ type: 'multiplier', stat: 'elemManaCap', value: 4.0 }, false, 5.0, 10),
createPerk('ea_t4_l10_b', 'Infinite Flow', '+75% Elemental Mana Regen', 'B',
{ type: 'multiplier', stat: 'elemRegen', value: 0.75 }, false, 5.0, 10),
createPerk('ea_t4_l10_c', 'Elemental Dominance', '+30% Damage with all elements', 'C',
{ type: 'multiplier', stat: 'elemDamage', value: 0.30 }, false, 5.0, 10),
],
},
// TIER 5
{
tier: 5,
skillId: 'elemAttune_t5',
name: 'Godlike Attunement',
multiplier: 10000,
l5Perks: [
createPerk('ea_t5_l5_a', 'Divine Capacity', '+500% Elemental Mana Cap', 'A',
{ type: 'multiplier', stat: 'elemManaCap', value: 5.0 }, false, 5.0, 5),
createPerk('ea_t5_l5_b', 'Celestial Flow', '+100% Elemental Mana Regen', 'B',
{ type: 'multiplier', stat: 'elemRegen', value: 1.0 }, false, 5.0, 5),
createPerk('ea_t5_l5_c', 'Elemental Singularity', '+40% Damage with all elements', 'C',
{ type: 'multiplier', stat: 'elemDamage', value: 0.40 }, false, 5.0, 5),
],
l10Perks: [
createPerk('ea_t5_l10_a', '[ELITE] ASCENDED ELEMENT', 'Elemental Mana Cap becomes infinite', 'A',
{ type: 'special', specialId: 'ascendedElem', specialDesc: 'Infinite elemental mana cap' }, true, 10.0, 10),
createPerk('ea_t5_l10_b', '[ELITE] OMNIPOTENT FLOW', 'Elemental Mana Regen is infinite', 'B',
{ type: 'special', specialId: 'omnipotentFlow', specialDesc: 'Infinite elemental regen' }, true, 10.0, 10),
createPerk('ea_t5_l10_c', '[ELITE] ELEMENTAL OMNIPOTENCE', 'All elemental damage is quadrupled', 'C',
{ type: 'special', specialId: 'elemOmnipotence', specialDesc: '4x all elemental damage' }, true, 10.0, 10),
],
},
];
@@ -1,282 +0,0 @@
// ─── Enchanting Skill Tier Definitions ───────────────────────────────
// This file contains: Enchanting, Enchant Speed, Efficient Enchant, Disenchanting (removed)
import { createPerk } from './utils';
import type { SkillTierDef } from '../types';
// ─── ENCHANTING TALENT TREE ────────────────────────────────────────────────────
// Base: Unlocks Enchantment Design
// Paths: A = The Artisan (Enchantment Power), B = The Engineer (Capacity/Efficiency), C = The Magus (Special Effects)
export const ENCHANTING_TIERS: SkillTierDef[] = [
// TIER 1
{
tier: 1,
skillId: 'enchanting',
name: 'Enchanting',
multiplier: 1,
l5Perks: [
createPerk('en_t1_l5_a', 'Artisan\'s Touch', '+10% Enchantment Power', 'A',
{ type: 'multiplier', stat: 'enchantPower', value: 0.10 }, false, 1.5, 5),
createPerk('en_t1_l5_b', 'Efficient Design', '-10% Enchantment Capacity Cost', 'B',
{ type: 'multiplier', stat: 'enchantCost', value: -0.10 }, false, 1.5, 5),
createPerk('en_t1_l5_c', 'Magus Spark', '+5% Spell Damage from Enchantments', 'C',
{ type: 'multiplier', stat: 'enchantSpellDamage', value: 0.05 }, false, 1.5, 5),
],
l10Perks: [
createPerk('en_t1_l10_a', 'Greater Artisan', '+15% Enchantment Power', 'A',
{ type: 'multiplier', stat: 'enchantPower', value: 0.15 }, false, 2.0, 10),
createPerk('en_t1_l10_b', 'Master Engineer', '-15% Enchantment Capacity Cost', 'B',
{ type: 'multiplier', stat: 'enchantCost', value: -0.15 }, false, 2.0, 10),
createPerk('en_t1_l10_c', 'Arch Magus', '+10% Spell Damage from Enchantments', 'C',
{ type: 'multiplier', stat: 'enchantSpellDamage', value: 0.10 }, false, 2.0, 10),
],
},
// TIER 2
{
tier: 2,
skillId: 'enchanting_t2',
name: 'Greater Enchanting',
multiplier: 10,
l5Perks: [
createPerk('en_t2_l5_a', 'Expert Artisan', '+25% Enchantment Power', 'A',
{ type: 'multiplier', stat: 'enchantPower', value: 0.25 }, false, 2.0, 5),
createPerk('en_t2_l5_b', 'Grand Engineer', '-20% Enchantment Capacity Cost', 'B',
{ type: 'multiplier', stat: 'enchantCost', value: -0.20 }, false, 2.0, 5),
createPerk('en_t2_l5_c', 'Supreme Magus', '+15% Spell Damage from Enchantments', 'C',
{ type: 'multiplier', stat: 'enchantSpellDamage', value: 0.15 }, false, 2.0, 5),
],
l10Perks: [
createPerk('en_t2_l10_a', 'Master Artisan', '+35% Enchantment Power', 'A',
{ type: 'multiplier', stat: 'enchantPower', value: 0.35 }, false, 2.5, 10),
createPerk('en_t2_l10_b', 'Divine Engineer', '-25% Enchantment Capacity Cost', 'B',
{ type: 'multiplier', stat: 'enchantCost', value: -0.25 }, false, 2.5, 10),
createPerk('en_t2_l10_c', 'Godly Magus', '+20% Spell Damage from Enchantments', 'C',
{ type: 'multiplier', stat: 'enchantSpellDamage', value: 0.20 }, false, 2.5, 10),
],
},
// TIER 3
{
tier: 3,
skillId: 'enchanting_t3',
name: 'Perfect Enchanting',
multiplier: 100,
l5Perks: [
createPerk('en_t3_l5_a', 'Cosmic Artisan', '+50% Enchantment Power', 'A',
{ type: 'multiplier', stat: 'enchantPower', value: 0.50 }, false, 3.0, 5),
createPerk('en_t3_l5_b', 'Transcendent Engineer', '-30% Enchantment Capacity Cost', 'B',
{ type: 'multiplier', stat: 'enchantCost', value: -0.30 }, false, 3.0, 5),
createPerk('en_t3_l5_c', 'Celestial Magus', '+25% Spell Damage from Enchantments', 'C',
{ type: 'multiplier', stat: 'enchantSpellDamage', value: 0.25 }, false, 3.0, 5),
],
l10Perks: [
createPerk('en_t3_l10_a', '[ELITE] OMNI-ARTISAN', 'Enchantment Power is 2x', 'A',
{ type: 'special', specialId: 'omniArtisan', specialDesc: '2x enchantment power' }, true, 5.0, 10),
createPerk('en_t3_l10_b', '[ELITE] OMNI-ENGINEER', 'Enchantment Capacity Cost is halved', 'B',
{ type: 'special', specialId: 'omniEngineer', specialDesc: '50% less capacity cost' }, true, 5.0, 10),
createPerk('en_t3_l10_c', '[ELITE] OMNI-MAGUS', 'Spell Damage from Enchantments is 2x', 'C',
{ type: 'special', specialId: 'omniMagus', specialDesc: '2x spell damage from enchants' }, true, 5.0, 10),
],
},
// TIER 4
{
tier: 4,
skillId: 'enchanting_t4',
name: 'Transcendent Enchanting',
multiplier: 1000,
l5Perks: [
createPerk('en_t4_l5_a', 'Astral Artisan', '+75% Enchantment Power', 'A',
{ type: 'multiplier', stat: 'enchantPower', value: 0.75 }, false, 4.0, 5),
createPerk('en_t4_l5_b', 'Ethereal Engineer', '-40% Enchantment Capacity Cost', 'B',
{ type: 'multiplier', stat: 'enchantCost', value: -0.40 }, false, 4.0, 5),
createPerk('en_t4_l5_c', 'Divine Magus', '+35% Spell Damage from Enchantments', 'C',
{ type: 'multiplier', stat: 'enchantSpellDamage', value: 0.35 }, false, 4.0, 5),
],
l10Perks: [
createPerk('en_t4_l10_a', 'Galactic Artisan', '+100% Enchantment Power', 'A',
{ type: 'multiplier', stat: 'enchantPower', value: 1.0 }, false, 5.0, 10),
createPerk('en_t4_l10_b', 'Infinite Engineer', '-50% Enchantment Capacity Cost', 'B',
{ type: 'multiplier', stat: 'enchantCost', value: -0.50 }, false, 5.0, 10),
createPerk('en_t4_l10_c', 'Godlike Magus', '+50% Spell Damage from Enchantments', 'C',
{ type: 'multiplier', stat: 'enchantSpellDamage', value: 0.50 }, false, 5.0, 10),
],
},
// TIER 5
{
tier: 5,
skillId: 'enchanting_t5',
name: 'Godlike Enchanting',
multiplier: 10000,
l5Perks: [
createPerk('en_t5_l5_a', 'Divine Artisan', '+150% Enchantment Power', 'A',
{ type: 'multiplier', stat: 'enchantPower', value: 1.50 }, false, 5.0, 5),
createPerk('en_t5_l5_b', 'Transcendent Engineer', '-60% Enchantment Capacity Cost', 'B',
{ type: 'multiplier', stat: 'enchantCost', value: -0.60 }, false, 5.0, 5),
createPerk('en_t5_l5_c', 'Omniscient Magus', '+75% Spell Damage from Enchantments', 'C',
{ type: 'multiplier', stat: 'enchantSpellDamage', value: 0.75 }, false, 5.0, 5),
],
l10Perks: [
createPerk('en_t5_l10_a', '[ELITE] ASCENDED ARTISAN', 'Enchantment Power is 5x', 'A',
{ type: 'special', specialId: 'ascendedArtisan', specialDesc: '5x enchantment power' }, true, 10.0, 10),
createPerk('en_t5_l10_b', '[ELITE] PERFECT ENGINEER', 'Enchantments cost no capacity', 'B',
{ type: 'special', specialId: 'perfectEngineer', specialDesc: '0 capacity cost' }, true, 10.0, 10),
createPerk('en_t5_l10_c', '[ELITE] OMNIPOTENT MAGUS', 'Spell Damage from Enchantments is 5x', 'C',
{ type: 'special', specialId: 'omnipotentMagus', specialDesc: '5x spell damage from enchants' }, true, 10.0, 10),
],
},
];
// ─── ENCHANT SPEED TALENT TREE ────────────────────────────────────────────
export const ENCHANT_SPEED_TIERS: SkillTierDef[] = [
// TIER 1
{
tier: 1,
skillId: 'enchantSpeed',
name: 'Enchant Speed',
multiplier: 1,
l5Perks: [
createPerk('es_t1_l5_a', 'Swift Craft', '-15% Enchantment Time', 'A',
{ type: 'multiplier', stat: 'enchantTime', value: -0.15 }, false, 1.5, 5),
createPerk('es_t1_l5_b', 'Efficient Design', '-10% Enchantment Capacity Cost', 'B',
{ type: 'multiplier', stat: 'enchantCost', value: -0.10 }, false, 1.5, 5),
createPerk('es_t1_l5_c', 'Quick Work', '+5% Enchantment Power', 'C',
{ type: 'multiplier', stat: 'enchantPower', value: 0.05 }, false, 1.5, 5),
],
l10Perks: [
createPerk('es_t1_l10_a', 'Faster Craft', '-20% Enchantment Time', 'A',
{ type: 'multiplier', stat: 'enchantTime', value: -0.20 }, false, 2.0, 10),
createPerk('es_t1_l10_b', 'Thrifty Design', '-15% Enchantment Capacity Cost', 'B',
{ type: 'multiplier', stat: 'enchantCost', value: -0.15 }, false, 2.0, 10),
createPerk('es_t1_l10_c', 'Superior Work', '+10% Enchantment Power', 'C',
{ type: 'multiplier', stat: 'enchantPower', value: 0.10 }, false, 2.0, 10),
],
},
// TIER 2
{
tier: 2,
skillId: 'enchantSpeed_t2',
name: 'Greater Speed',
multiplier: 10,
l5Perks: [
createPerk('es_t2_l5_a', 'Rapid Craft', '-25% Enchantment Time', 'A',
{ type: 'multiplier', stat: 'enchantTime', value: -0.25 }, false, 2.0, 5),
createPerk('es_t2_l5_b', 'Master Design', '-20% Enchantment Capacity Cost', 'B',
{ type: 'multiplier', stat: 'enchantCost', value: -0.20 }, false, 2.0, 5),
createPerk('es_t2_l5_c', 'Expert Work', '+15% Enchantment Power', 'C',
{ type: 'multiplier', stat: 'enchantPower', value: 0.15 }, false, 2.0, 5),
],
l10Perks: [
createPerk('es_t2_l10_a', 'Lightning Craft', '-30% Enchantment Time', 'A',
{ type: 'multiplier', stat: 'enchantTime', value: -0.30 }, false, 2.5, 10),
createPerk('es_t2_l10_b', 'Ultimate Design', '-25% Enchantment Capacity Cost', 'B',
{ type: 'multiplier', stat: 'enchantCost', value: -0.25 }, false, 2.5, 10),
createPerk('es_t2_l10_c', 'Master Work', '+20% Enchantment Power', 'C',
{ type: 'multiplier', stat: 'enchantPower', value: 0.20 }, false, 2.5, 10),
],
},
// TIER 3
{
tier: 3,
skillId: 'enchantSpeed_t3',
name: 'Perfect Speed',
multiplier: 100,
l5Perks: [
createPerk('es_t3_l5_a', 'Instant Craft', '-40% Enchantment Time', 'A',
{ type: 'multiplier', stat: 'enchantTime', value: -0.40 }, false, 3.0, 5),
createPerk('es_t3_l5_b', 'Cosmic Design', '-30% Enchantment Capacity Cost', 'B',
{ type: 'multiplier', stat: 'enchantCost', value: -0.30 }, false, 3.0, 5),
createPerk('es_t3_l5_c', 'Divine Work', '+25% Enchantment Power', 'C',
{ type: 'multiplier', stat: 'enchantPower', value: 0.25 }, false, 3.0, 5),
],
l10Perks: [
createPerk('es_t3_l10_a', '[ELITE] OMNI-SPEED', 'Enchantment Time is halved', 'A',
{ type: 'special', specialId: 'omniSpeedEnchant', specialDesc: '50% less time' }, true, 5.0, 10),
createPerk('es_t3_l10_b', '[ELITE] OMNI-DESIGN', 'Enchantment Capacity Cost is halved', 'B',
{ type: 'special', specialId: 'omniDesign', specialDesc: '50% less capacity cost' }, true, 5.0, 10),
createPerk('es_t3_l10_c', '[ELITE] OMNI-WORK', 'Enchantment Power is 2x', 'C',
{ type: 'special', specialId: 'omniWork', specialDesc: '2x enchantment power' }, true, 5.0, 10),
],
},
];
// ─── EFFICIENT ENCHANT TALENT TREE ────────────────────────────────────────────
// Base: Reduces Enchantment Capacity Cost
// Paths: A = The Thrifty (Cost Reduction), B = The Swift (Speed), C = The Efficient (Bonus Effects)
export const EFFICIENT_ENCHANT_TIERS: SkillTierDef[] = [
// TIER 1
{
tier: 1,
skillId: 'efficientEnchant',
name: 'Efficient Enchant',
multiplier: 1,
l5Perks: [
createPerk('ee_t1_l5_a', 'Thrifty Design', '-10% Enchantment Capacity Cost', 'A',
{ type: 'multiplier', stat: 'enchantCost', value: -0.10 }, false, 1.5, 5),
createPerk('ee_t1_l5_b', 'Swift Crafting', '-10% Enchantment Time', 'B',
{ type: 'multiplier', stat: 'enchantTime', value: -0.10 }, false, 1.5, 5),
createPerk('ee_t1_l5_c', 'Quality Work', '+5% Enchantment Power', 'C',
{ type: 'multiplier', stat: 'enchantPower', value: 0.05 }, false, 1.5, 5),
],
l10Perks: [
createPerk('ee_t1_l10_a', 'Greater Thrift', '-15% Enchantment Capacity Cost', 'A',
{ type: 'multiplier', stat: 'enchantCost', value: -0.15 }, false, 2.0, 10),
createPerk('ee_t1_l10_b', 'Faster Crafting', '-15% Enchantment Time', 'B',
{ type: 'multiplier', stat: 'enchantTime', value: -0.15 }, false, 2.0, 10),
createPerk('ee_t1_l10_c', 'Superior Work', '+10% Enchantment Power', 'C',
{ type: 'multiplier', stat: 'enchantPower', value: 0.10 }, false, 2.0, 10),
],
},
// TIER 2
{
tier: 2,
skillId: 'efficientEnchant_t2',
name: 'Greater Efficiency',
multiplier: 10,
l5Perks: [
createPerk('ee_t2_l5_a', 'Master Thrift', '-20% Enchantment Capacity Cost', 'A',
{ type: 'multiplier', stat: 'enchantCost', value: -0.20 }, false, 2.0, 5),
createPerk('ee_t2_l5_b', 'Rapid Crafting', '-20% Enchantment Time', 'B',
{ type: 'multiplier', stat: 'enchantTime', value: -0.20 }, false, 2.0, 5),
createPerk('ee_t2_l5_c', 'Expert Work', '+15% Enchantment Power', 'C',
{ type: 'multiplier', stat: 'enchantPower', value: 0.15 }, false, 2.0, 5),
],
l10Perks: [
createPerk('ee_t2_l10_a', 'Ultimate Thrift', '-25% Enchantment Capacity Cost', 'A',
{ type: 'multiplier', stat: 'enchantCost', value: -0.25 }, false, 2.5, 10),
createPerk('ee_t2_l10_b', 'Lightning Craft', '-25% Enchantment Time', 'B',
{ type: 'multiplier', stat: 'enchantTime', value: -0.25 }, false, 2.5, 10),
createPerk('ee_t2_l10_c', 'Master Work', '+20% Enchantment Power', 'C',
{ type: 'multiplier', stat: 'enchantPower', value: 0.20 }, false, 2.5, 10),
],
},
// TIER 3
{
tier: 3,
skillId: 'efficientEnchant_t3',
name: 'Perfect Efficiency',
multiplier: 100,
l5Perks: [
createPerk('ee_t3_l5_a', 'Cosmic Thrift', '-30% Enchantment Capacity Cost', 'A',
{ type: 'multiplier', stat: 'enchantCost', value: -0.30 }, false, 3.0, 5),
createPerk('ee_t3_l5_b', 'Instant Crafting', '-30% Enchantment Time', 'B',
{ type: 'multiplier', stat: 'enchantTime', value: -0.30 }, false, 3.0, 5),
createPerk('ee_t3_l5_c', 'Divine Work', '+25% Enchantment Power', 'C',
{ type: 'multiplier', stat: 'enchantPower', value: 0.25 }, false, 3.0, 5),
],
l10Perks: [
createPerk('ee_t3_l10_a', '[ELITE] OMNI-THRIFT', 'Enchantment Capacity Cost is halved', 'A',
{ type: 'special', specialId: 'omniThrift', specialDesc: '50% less capacity cost' }, true, 5.0, 10),
createPerk('ee_t3_l10_b', '[ELITE] OMNI-SPEED', 'Enchantment Time is halved', 'B',
{ type: 'special', specialId: 'omniSpeed', specialDesc: '50% less time' }, true, 5.0, 10),
createPerk('ee_t3_l10_c', '[ELITE] OMNI-POWER', 'Enchantment Power is 2x', 'C',
{ type: 'special', specialId: 'omniPower', specialDesc: '2x enchantment power' }, true, 5.0, 10),
],
},
];
// ─── DISENCHANTING TALENT TREE ────────────────────────────────────────────────
// Disenchanting skill removed - see Bug 13
export const DISENCHANTING_TIERS: SkillTierDef[] = []; // Empty - skill removed
@@ -1,127 +0,0 @@
// ─── Focused Mind Skill Tier Definitions ─────────────────────────────────────
// Base: Reduces Study Mana Cost
import { createPerk } from './utils';
import type { SkillTierDef } from '../types';
// ─── FOCUSED MIND TALENT TREE ─────────────────────────────────────────────────
// Base: Reduces Study Mana Cost
// Paths: A = The Scholar (Study Speed), B = The Economist (Cost Reduction), C = The Sage (Bonus Effects)
export const FOCUSED_MIND_TIERS: SkillTierDef[] = [
// TIER 1
{
tier: 1,
skillId: 'focusedMind',
name: 'Focused Mind',
multiplier: 1,
l5Perks: [
createPerk('fm_t1_l5_a', 'Sharp Focus', '+10% Study Speed', 'A',
{ type: 'multiplier', stat: 'studySpeed', value: 0.10 }, false, 1.5, 5),
createPerk('fm_t1_l5_b', 'Thrifty Mind', '-15% Study Mana Cost', 'B',
{ type: 'multiplier', stat: 'studyCost', value: -0.15 }, false, 1.5, 5),
createPerk('fm_t1_l5_c', 'Insightful Study', '+5% Insight Gain', 'C',
{ type: 'multiplier', stat: 'insightGain', value: 0.05 }, false, 1.5, 5),
],
l10Perks: [
createPerk('fm_t1_l10_a', 'Deep Focus', '+15% Study Speed', 'A',
{ type: 'multiplier', stat: 'studySpeed', value: 0.15 }, false, 2.0, 10),
createPerk('fm_t1_l10_b', 'Economical Mind', '-20% Study Mana Cost', 'B',
{ type: 'multiplier', stat: 'studyCost', value: -0.20 }, false, 2.0, 10),
createPerk('fm_t1_l10_c', 'Enlightened Study', '+10% Insight Gain', 'C',
{ type: 'multiplier', stat: 'insightGain', value: 0.10 }, false, 2.0, 10),
],
},
// TIER 2
{
tier: 2,
skillId: 'focusedMind_t2',
name: 'Greater Focus',
multiplier: 10,
l5Perks: [
createPerk('fm_t2_l5_a', 'Brilliant Focus', '+25% Study Speed', 'A',
{ type: 'multiplier', stat: 'studySpeed', value: 0.25 }, false, 2.0, 5),
createPerk('fm_t2_l5_b', 'Master Economist', '-30% Study Mana Cost', 'B',
{ type: 'multiplier', stat: 'studyCost', value: -0.30 }, false, 2.0, 5),
createPerk('fm_t2_l5_c', 'Scholarly Insight', '+15% Insight Gain', 'C',
{ type: 'multiplier', stat: 'insightGain', value: 0.15 }, false, 2.0, 5),
],
l10Perks: [
createPerk('fm_t2_l10_a', 'Transcendent Focus', '+35% Study Speed', 'A',
{ type: 'multiplier', stat: 'studySpeed', value: 0.35 }, false, 2.5, 10),
createPerk('fm_t2_l10_b', 'Ultimate Economist', '-40% Study Mana Cost', 'B',
{ type: 'multiplier', stat: 'studyCost', value: -0.40 }, false, 2.5, 10),
createPerk('fm_t2_l10_c', 'Divine Insight', '+20% Insight Gain', 'C',
{ type: 'multiplier', stat: 'insightGain', value: 0.20 }, false, 2.5, 10),
],
},
// TIER 3
{
tier: 3,
skillId: 'focusedMind_t3',
name: 'Perfect Focus',
multiplier: 100,
l5Perks: [
createPerk('fm_t3_l5_a', 'Cosmic Focus', '+50% Study Speed', 'A',
{ type: 'multiplier', stat: 'studySpeed', value: 0.50 }, false, 3.0, 5),
createPerk('fm_t3_l5_b', 'Infinite Economy', '-50% Study Mana Cost', 'B',
{ type: 'multiplier', stat: 'studyCost', value: -0.50 }, false, 3.0, 5),
createPerk('fm_t3_l5_c', 'Enlightened Mind', '+25% Insight Gain', 'C',
{ type: 'multiplier', stat: 'insightGain', value: 0.25 }, false, 3.0, 5),
],
l10Perks: [
createPerk('fm_t3_l10_a', '[ELITE] OMNI-FOCUS', 'Study speed is doubled', 'A',
{ type: 'special', specialId: 'omniFocus', specialDesc: '2x study speed' }, true, 5.0, 10),
createPerk('fm_t3_l10_b', '[ELITE] OMNI-ECONOMY', 'Study costs no mana', 'B',
{ type: 'special', specialId: 'omniEconomy', specialDesc: 'Free study' }, true, 5.0, 10),
createPerk('fm_t3_l10_c', '[ELITE] OMNI-INSIGHT', 'Insight gain is tripled', 'C',
{ type: 'special', specialId: 'omniInsight', specialDesc: '3x insight gain' }, true, 5.0, 10),
],
},
// TIER 4
{
tier: 4,
skillId: 'focusedMind_t4',
name: 'Transcendent Focus',
multiplier: 1000,
l5Perks: [
createPerk('fm_t4_l5_a', 'Astral Focus', '+75% Study Speed', 'A',
{ type: 'multiplier', stat: 'studySpeed', value: 0.75 }, false, 4.0, 5),
createPerk('fm_t4_l5_b', 'Divine Economy', '-60% Study Mana Cost', 'B',
{ type: 'multiplier', stat: 'studyCost', value: -0.60 }, false, 4.0, 5),
createPerk('fm_t4_l5_c', 'Celestial Insight', '+30% Insight Gain', 'C',
{ type: 'multiplier', stat: 'insightGain', value: 0.30 }, false, 4.0, 5),
],
l10Perks: [
createPerk('fm_t4_l10_a', 'Galactic Focus', '+100% Study Speed', 'A',
{ type: 'multiplier', stat: 'studySpeed', value: 1.0 }, false, 5.0, 10),
createPerk('fm_t4_l10_b', 'Godly Economy', '-75% Study Mana Cost', 'B',
{ type: 'multiplier', stat: 'studyCost', value: -0.75 }, false, 5.0, 10),
createPerk('fm_t4_l10_c', 'Godlike Insight', '+40% Insight Gain', 'C',
{ type: 'multiplier', stat: 'insightGain', value: 0.40 }, false, 5.0, 10),
],
},
// TIER 5
{
tier: 5,
skillId: 'focusedMind_t5',
name: 'Godlike Focus',
multiplier: 10000,
l5Perks: [
createPerk('fm_t5_l5_a', 'Divine Focus', '+150% Study Speed', 'A',
{ type: 'multiplier', stat: 'studySpeed', value: 1.50 }, false, 5.0, 5),
createPerk('fm_t5_l5_b', 'Transcendent Economy', '-90% Study Mana Cost', 'B',
{ type: 'multiplier', stat: 'studyCost', value: -0.90 }, false, 5.0, 5),
createPerk('fm_t5_l5_c', 'Omniscient Insight', '+50% Insight Gain', 'C',
{ type: 'multiplier', stat: 'insightGain', value: 0.50 }, false, 5.0, 5),
],
l10Perks: [
createPerk('fm_t5_l10_a', '[ELITE] ASCENDED MIND', 'Study speed is 5x', 'A',
{ type: 'special', specialId: 'ascendedMind', specialDesc: '5x study speed' }, true, 10.0, 10),
createPerk('fm_t5_l10_b', '[ELITE] PERFECT ECONOMY', 'Study is completely free', 'B',
{ type: 'special', specialId: 'perfectEconomy', specialDesc: '0% study cost' }, true, 10.0, 10),
createPerk('fm_t5_l10_c', '[ELITE] OMNISCIENT', 'Insight gain is 5x', 'C',
{ type: 'special', specialId: 'omniscient', specialDesc: '5x insight gain' }, true, 10.0, 10),
],
},
];
@@ -1,79 +0,0 @@
// ─── Guardian Skills Tier Definitions ──────────────────────────────
// This file contains: Guardian Bane
import { createPerk } from './utils';
import type { SkillTierDef } from '../types';
// ─── GUARDIAN BANE TALENT TREE ──────────────────────────────────────────
export const GUARDIAN_BANE_TIERS: SkillTierDef[] = [
// TIER 1
{
tier: 1,
skillId: 'guardianBane',
name: 'Guardian Bane',
multiplier: 1,
l5Perks: [
createPerk('gb_t1_l5_a', 'Bane Training', '+20% damage vs guardians', 'A',
{ type: 'multiplier', stat: 'guardianDamage', value: 0.20 }, false, 1.5, 5),
createPerk('gb_t1_l5_b', 'Focused Bane', '+10% crit damage vs guardians', 'B',
{ type: 'multiplier', stat: 'guardianCritDamage', value: 0.10 }, false, 1.5, 5),
createPerk('gb_t1_l5_c', 'Swift Bane', '+10% attack speed vs guardians', 'C',
{ type: 'multiplier', stat: 'guardianAttackSpeed', value: 0.10 }, false, 1.5, 5),
],
l10Perks: [
createPerk('gb_t1_l10_a', 'Greater Bane', '+30% damage vs guardians', 'A',
{ type: 'multiplier', stat: 'guardianDamage', value: 0.30 }, false, 2.0, 10),
createPerk('gb_t1_l10_b', 'Deadly Bane', '+15% crit damage vs guardians', 'B',
{ type: 'multiplier', stat: 'guardianCritDamage', value: 0.15 }, false, 2.0, 10),
createPerk('gb_t1_l10_c', 'Rapid Bane', '+15% attack speed vs guardians', 'C',
{ type: 'multiplier', stat: 'guardianAttackSpeed', value: 0.15 }, false, 2.0, 10),
],
},
// TIER 2
{
tier: 2,
skillId: 'guardianBane_t2',
name: 'Greater Bane',
multiplier: 10,
l5Perks: [
createPerk('gb_t2_l5_a', 'Master Bane', '+40% damage vs guardians', 'A',
{ type: 'multiplier', stat: 'guardianDamage', value: 0.40 }, false, 2.0, 5),
createPerk('gb_t2_l5_b', 'Supreme Crit', '+20% crit damage vs guardians', 'B',
{ type: 'multiplier', stat: 'guardianCritDamage', value: 0.20 }, false, 2.0, 5),
createPerk('gb_t2_l5_c', 'Lightning Bane', '+20% attack speed vs guardians', 'C',
{ type: 'multiplier', stat: 'guardianAttackSpeed', value: 0.20 }, false, 2.0, 5),
],
l10Perks: [
createPerk('gb_t2_l10_a', 'Ultimate Bane', '+50% damage vs guardians', 'A',
{ type: 'multiplier', stat: 'guardianDamage', value: 0.50 }, false, 2.5, 10),
createPerk('gb_t2_l10_b', 'Obliterating Crit', '+25% crit damage vs guardians', 'B',
{ type: 'multiplier', stat: 'guardianCritDamage', value: 0.25 }, false, 2.5, 10),
createPerk('gb_t2_l10_c', 'Blurring Bane', '+25% attack speed vs guardians', 'C',
{ type: 'multiplier', stat: 'guardianAttackSpeed', value: 0.25 }, false, 2.5, 10),
],
},
// TIER 3
{
tier: 3,
skillId: 'guardianBane_t3',
name: 'Perfect Bane',
multiplier: 100,
l5Perks: [
createPerk('gb_t3_l5_a', 'Cosmic Bane', '+60% damage vs guardians', 'A',
{ type: 'multiplier', stat: 'guardianDamage', value: 0.60 }, false, 3.0, 5),
createPerk('gb_t3_l5_b', 'Transcendent Crit', '+30% crit damage vs guardians', 'B',
{ type: 'multiplier', stat: 'guardianCritDamage', value: 0.30 }, false, 3.0, 5),
createPerk('gb_t3_l5_c', 'Instant Bane', '+30% attack speed vs guardians', 'C',
{ type: 'multiplier', stat: 'guardianAttackSpeed', value: 0.30 }, false, 3.0, 5),
],
l10Perks: [
createPerk('gb_t3_l10_a', '[ELITE] OMNI-BANE', 'Damage vs guardians is 2x', 'A',
{ type: 'special', specialId: 'omniBane', specialDesc: '2x damage vs guardians' }, true, 5.0, 10),
createPerk('gb_t3_l10_b', '[ELITE] OMNI-CRIT', 'Crit damage vs guardians is 2x', 'B',
{ type: 'special', specialId: 'omniCrit', specialDesc: '2x crit damage vs guardians' }, true, 5.0, 10),
createPerk('gb_t3_l10_c', '[ELITE] OMNI-SPEED', 'Attack speed vs guardians is 2x', 'C',
{ type: 'special', specialId: 'omniGuardianSpeed', specialDesc: '2x attack speed vs guardians' }, true, 5.0, 10),
],
},
];
@@ -1,372 +0,0 @@
// ─── Hybrid Skill Tier Definitions ───────────────────────────────
// This file contains: Pact-Weaving, Guardian Constructs, Enchanted Golemancy
// Hybrid skills require 2 attunements at level 5+
import { createPerk } from './utils';
import type { SkillTierDef } from '../types';
// ─── PACT-WEAVING TALENT TREE (Invoker + Enchanter Hybrid) ──────────────────
// Base: Weave Guardian essence into weapon enchantments OR world-effects
// Paths: A = The Weaver (Enchantment Power), B = The Warp (Pact Efficiency), C = The World-Weaver (World Effects)
export const PACT_WEAVING_TIERS: SkillTierDef[] = [
// TIER 1
{
tier: 1,
skillId: 'pactWeaving',
name: 'Pact-Weaving',
multiplier: 1,
l5Perks: [
createPerk('pw_t1_l5_a', 'Essence Weave', '+15% enchantment effect power', 'A',
{ type: 'multiplier', stat: 'enchantPower', value: 0.15 }, false, 1.5, 5),
createPerk('pw_t1_l5_b', 'Pact Weave', '+15% pact multiplier', 'B',
{ type: 'multiplier', stat: 'pactMultiplier', value: 0.15 }, false, 1.5, 5),
createPerk('pw_t1_l5_c', 'World Thread', 'Enchantments also apply 5% as world effects', 'C',
{ type: 'special', specialId: 'worldThread', specialDesc: 'Enchantments apply as world effects' }, false, 1.5, 5),
],
l10Perks: [
createPerk('pw_t1_l10_a', 'Greater Weave', '+25% enchantment effect power', 'A',
{ type: 'multiplier', stat: 'enchantPower', value: 0.25 }, false, 2.0, 10),
createPerk('pw_t1_l10_b', 'Greater Pact Weave', '+25% pact multiplier', 'B',
{ type: 'multiplier', stat: 'pactMultiplier', value: 0.25 }, false, 2.0, 10),
createPerk('pw_t1_l10_c', 'World Web', 'Enchantments also apply 10% as world effects', 'C',
{ type: 'special', specialId: 'worldWeb', specialDesc: 'Better enchantment world effects' }, false, 2.0, 10),
],
},
// TIER 2
{
tier: 2,
skillId: 'pactWeaving_t2',
name: 'Greater Pact-Weaving',
multiplier: 10,
l5Perks: [
createPerk('pw_t2_l5_a', 'Soul Weave', 'Enchantments gain +10% power per signed pact', 'A',
{ type: 'special', specialId: 'soulWeave', specialDesc: 'Enchant power scales with pacts' }, false, 2.0, 5),
createPerk('pw_t2_l5_b', 'Warp Weave', 'Pact costs reduced by 15% while enchanted', 'B',
{ type: 'special', specialId: 'warpWeave', specialDesc: 'Enchants reduce pact costs' }, false, 2.0, 5),
createPerk('pw_t2_l5_c', 'Reality Weave', 'World effects apply 15% faster', 'C',
{ type: 'special', specialId: 'realityWeave', specialDesc: 'Faster world effect application' }, false, 2.0, 5),
],
l10Perks: [
createPerk('pw_t2_l10_a', 'Divine Weave', 'Enchantments gain +15% power per signed pact', 'A',
{ type: 'special', specialId: 'divineWeave', specialDesc: 'Better enchant scaling with pacts' }, false, 2.5, 10),
createPerk('pw_t2_l10_b', 'Warp Surge', 'Pact multiplier increased by 0.3x while enchanted', 'B',
{ type: 'special', specialId: 'warpSurge', specialDesc: 'Enchants boost pact multiplier' }, false, 2.5, 10),
createPerk('pw_t2_l10_c', 'World Storm', 'World effects have 20% chance to apply twice', 'C',
{ type: 'special', specialId: 'worldStorm', specialDesc: 'Chance for double world effects' }, false, 2.5, 10),
],
},
// TIER 3
{
tier: 3,
skillId: 'pactWeaving_t3',
name: 'Divine Pact-Weaving',
multiplier: 100,
l5Perks: [
createPerk('pw_t3_l5_a', 'Guardian Weave', 'Enchantments include guardian boons at 25% strength', 'A',
{ type: 'special', specialId: 'guardianWeave', specialDesc: 'Enchants gain guardian boons' }, false, 3.0, 5),
createPerk('pw_t3_l5_b', 'Pact Resonance', 'Signed pacts grant +20% enchantment capacity', 'B',
{ type: 'special', specialId: 'pactResonance', specialDesc: 'Pacts grant enchant capacity' }, false, 3.0, 5),
createPerk('pw_t3_l5_c', 'World Dominance', 'World effects last 30% longer', 'C',
{ type: 'special', specialId: 'worldDominance', specialDesc: 'Longer world effect duration' }, false, 3.0, 5),
],
l10Perks: [
createPerk('pw_t3_l10_a', '[ELITE] ESSENCE ASCENSION', 'Enchantments are 2x powerful when pact is signed', 'A',
{ type: 'special', specialId: 'essenceAscension', specialDesc: '2x enchant power with pact' }, true, 5.0, 10),
createPerk('pw_t3_l10_b', '[ELITE] PACT OMNIPOTENCE', 'Pact multiplier applies to enchantment effects', 'B',
{ type: 'special', specialId: 'pactOmnipotence', specialDesc: 'Pact multiplier boosts enchants' }, true, 5.0, 10),
createPerk('pw_t3_l10_c', '[ELITE] WORLD SINGULARITY', 'World effects apply at 3x strength and never expire', 'C',
{ type: 'special', specialId: 'worldSingularity', specialDesc: '3x permanent world effects' }, true, 5.0, 10),
],
},
// TIER 4
{
tier: 4,
skillId: 'pactWeaving_t4',
name: 'Mythic Pact-Weaving',
multiplier: 1000,
l5Perks: [
createPerk('pw_t4_l5_a', 'Titanic Weave', 'Enchantments gain +25% power per signed pact', 'A',
{ type: 'special', specialId: 'titanicWeave', specialDesc: 'Major enchant scaling with pacts' }, false, 4.0, 5),
createPerk('pw_t4_l5_b', 'Warp Mastery', 'Pact multiplier increased by 0.5x while enchanted', 'B',
{ type: 'special', specialId: 'warpMastery', specialDesc: 'Major pact boost from enchants' }, false, 4.0, 5),
createPerk('pw_t4_l5_c', 'World Tyranny', 'World effects apply to all attacks', 'C',
{ type: 'special', specialId: 'worldTyranny', specialDesc: 'World effects on all attacks' }, false, 4.0, 5),
],
l10Perks: [
createPerk('pw_t4_l10_a', 'Godly Weave', 'Enchantments include guardian boons at 50% strength', 'A',
{ type: 'special', specialId: 'godlyWeave', specialDesc: 'Strong guardian boons in enchants' }, false, 5.0, 10),
createPerk('pw_t4_l10_b', 'Pact Dominance', 'Signed pacts grant +30% enchantment capacity', 'B',
{ type: 'special', specialId: 'pactDominance', specialDesc: 'Pacts grant more enchant capacity' }, false, 5.0, 10),
createPerk('pw_t4_l10_c', 'World Omniscience', 'World effects have 25% chance to apply 3 times', 'C',
{ type: 'special', specialId: 'worldOmniscience', specialDesc: 'Chance for triple world effects' }, false, 5.0, 10),
],
},
// TIER 5
{
tier: 5,
skillId: 'pactWeaving_t5',
name: 'Transcendent Pact-Weaving',
multiplier: 10000,
l5Perks: [
createPerk('pw_t5_l5_a', 'God\'s Weave', 'Enchantments gain +50% power per signed pact', 'A',
{ type: 'special', specialId: 'godsWeave', specialDesc: 'Massive enchant scaling with pacts' }, false, 5.0, 5),
createPerk('pw_t5_l5_b', 'Warp Transcendence', 'Pact multiplier increased by 1.0x while enchanted', 'B',
{ type: 'special', specialId: 'warpTranscendence', specialDesc: 'Massive pact boost from enchants' }, false, 5.0, 5),
createPerk('pw_t5_l5_c', 'World God', 'World effects apply at 2x strength', 'C',
{ type: 'special', specialId: 'worldGod', specialDesc: '2x world effect strength' }, false, 5.0, 5),
],
l10Perks: [
createPerk('pw_t5_l10_a', '[ELITE] WEAVER ASCENDANT', 'All enchantments include ALL guardian boons at full strength', 'A',
{ type: 'special', specialId: 'weaverAscendant', specialDesc: 'Enchants get all guardian boons' }, true, 10.0, 10),
createPerk('pw_t5_l10_b', '[ELITE] PACT SINGULARITY', 'Pact multiplier is 3x and applies to ALL enchantments', 'B',
{ type: 'special', specialId: 'pactSingularity', specialDesc: '3x pact multiplier for all enchants' }, true, 10.0, 10),
createPerk('pw_t5_l10_c', '[ELITE] WORLD CREATOR', 'World effects are permanent and apply at 5x strength', 'C',
{ type: 'special', specialId: 'worldCreator', specialDesc: '5x permanent world effects' }, true, 10.0, 10),
],
},
];
// ─── GUARDIAN CONSTRUCTS TALENT TREE (Fabricator + Invoker Hybrid) ───────────
// Base: Build monumental, singular golems. Only 1 active at a time, vastly more durable, costs less maintenance.
// Paths: A = The Architect (Durability), B = The Monumentalist (Cost Reduction), C = The Eternal (Duration)
export const GUARDIAN_CONSTRUCTS_TIERS: SkillTierDef[] = [
// TIER 1
{
tier: 1,
skillId: 'guardianConstructs',
name: 'Guardian Constructs',
multiplier: 1,
l5Perks: [
createPerk('gc_t1_l5_a', 'Reinforced Frame', '+50% golem durability', 'A',
{ type: 'multiplier', stat: 'golemDurability', value: 0.50 }, false, 1.5, 5),
createPerk('gc_t1_l5_b', 'Efficient Core', '-20% golem maintenance cost', 'B',
{ type: 'multiplier', stat: 'golemMaintenance', value: -0.20 }, false, 1.5, 5),
createPerk('gc_t1_l5_c', 'Extended Runtime', '+3 floor duration for monumental golems', 'C',
{ type: 'special', specialId: 'extendedRuntime', specialDesc: 'Longer golem duration' }, false, 1.5, 5),
],
l10Perks: [
createPerk('gc_t1_l10_a', 'Armored Hull', '+75% golem durability', 'A',
{ type: 'multiplier', stat: 'golemDurability', value: 0.75 }, false, 2.0, 10),
createPerk('gc_t1_l10_b', 'Frugal Core', '-30% golem maintenance cost', 'B',
{ type: 'multiplier', stat: 'golemMaintenance', value: -0.30 }, false, 2.0, 10),
createPerk('gc_t1_l10_c', 'Long-Lasting', '+5 floor duration for monumental golems', 'C',
{ type: 'special', specialId: 'longLasting', specialDesc: 'Much longer golem duration' }, false, 2.0, 10),
],
},
// TIER 2
{
tier: 2,
skillId: 'guardianConstructs_t2',
name: 'Greater Guardian Constructs',
multiplier: 10,
l5Perks: [
createPerk('gc_t2_l5_a', 'Titan\'s Frame', '+100% golem durability', 'A',
{ type: 'multiplier', stat: 'golemDurability', value: 1.0 }, false, 2.0, 5),
createPerk('gc_t2_l5_b', 'Monumental Efficiency', '-40% golem maintenance cost', 'B',
{ type: 'multiplier', stat: 'golemMaintenance', value: -0.40 }, false, 2.0, 5),
createPerk('gc_t2_l5_c', 'Persistent Form', 'Monumental golems last 50% longer', 'C',
{ type: 'special', specialId: 'persistentForm', specialDesc: '50% longer golem duration' }, false, 2.0, 5),
],
l10Perks: [
createPerk('gc_t2_l10_a', 'Impenetrable', '+150% golem durability', 'A',
{ type: 'multiplier', stat: 'golemDurability', value: 1.50 }, false, 2.5, 10),
createPerk('gc_t2_l10_b', 'Resource Attunement', '-50% golem maintenance cost', 'B',
{ type: 'multiplier', stat: 'golemMaintenance', value: -0.50 }, false, 2.5, 10),
createPerk('gc_t2_l10_c', 'Timeless', 'Monumental golems last 75% longer', 'C',
{ type: 'special', specialId: 'timeless', specialDesc: '75% longer golem duration' }, false, 2.5, 10),
],
},
// TIER 3
{
tier: 3,
skillId: 'guardianConstructs_t3',
name: 'Divine Guardian Constructs',
multiplier: 100,
l5Perks: [
createPerk('gc_t3_l5_a', 'God\'s Armor', '+200% golem durability', 'A',
{ type: 'multiplier', stat: 'golemDurability', value: 2.0 }, false, 3.0, 5),
createPerk('gc_t3_l5_b', 'Perfect Efficiency', '-60% golem maintenance cost', 'B',
{ type: 'multiplier', stat: 'golemMaintenance', value: -0.60 }, false, 3.0, 5),
createPerk('gc_t3_l5_c', 'Eternal Spark', 'Monumental golems never degrade', 'C',
{ type: 'special', specialId: 'eternalSpark', specialDesc: 'Golems never degrade' }, false, 3.0, 5),
],
l10Perks: [
createPerk('gc_t3_l10_a', '[ELITE] MONUMENTAL DURABILITY', 'Monumental golems have 5x durability', 'A',
{ type: 'special', specialId: 'monumentalDurability', specialDesc: '5x golem durability' }, true, 5.0, 10),
createPerk('gc_t3_l10_b', '[ELITE] MONUMENTAL THRIFT', 'Monumental golems cost 90% less to maintain', 'B',
{ type: 'special', specialId: 'monumentalThrift', specialDesc: '90% less golem maintenance' }, true, 5.0, 10),
createPerk('gc_t3_l10_c', '[ELITE] MONUMENTAL ETERNITY', 'Monumental golems last forever (infinite duration)', 'C',
{ type: 'special', specialId: 'monumentalEternity', specialDesc: 'Infinite golem duration' }, true, 5.0, 10),
],
},
// TIER 4
{
tier: 4,
skillId: 'guardianConstructs_t4',
name: 'Mythic Guardian Constructs',
multiplier: 1000,
l5Perks: [
createPerk('gc_t4_l5_a', 'Titan\'s Protection', '+300% golem durability', 'A',
{ type: 'multiplier', stat: 'golemDurability', value: 3.0 }, false, 4.0, 5),
createPerk('gc_t4_l5_b', 'Divine Frugality', '-75% golem maintenance cost', 'B',
{ type: 'multiplier', stat: 'golemMaintenance', value: -0.75 }, false, 4.0, 5),
createPerk('gc_t4_l5_c', 'Chronos\' Gift', 'Monumental golems gain +1 floor duration per hour of runtime', 'C',
{ type: 'special', specialId: 'chronosGift', specialDesc: 'Golems gain duration over time' }, false, 4.0, 5),
],
l10Perks: [
createPerk('gc_t4_l10_a', 'God\'s Shield', '+400% golem durability', 'A',
{ type: 'multiplier', stat: 'golemDurability', value: 4.0 }, false, 5.0, 10),
createPerk('gc_t4_l10_b', 'Perfect Thrift', '-85% golem maintenance cost', 'B',
{ type: 'multiplier', stat: 'golemMaintenance', value: -0.85 }, false, 5.0, 10),
createPerk('gc_t4_l10_c', 'Time Lord', 'Monumental golems last 10x longer', 'C',
{ type: 'special', specialId: 'timeLord', specialDesc: '10x golem duration' }, false, 5.0, 10),
],
},
// TIER 5
{
tier: 5,
skillId: 'guardianConstructs_t5',
name: 'Transcendent Guardian Constructs',
multiplier: 10000,
l5Perks: [
createPerk('gc_t5_l5_a', 'God\'s Fortress', '+500% golem durability', 'A',
{ type: 'multiplier', stat: 'golemDurability', value: 5.0 }, false, 5.0, 5),
createPerk('gc_t5_l5_b', 'Ultimate Efficiency', '-90% golem maintenance cost', 'B',
{ type: 'multiplier', stat: 'golemMaintenance', value: -0.90 }, false, 5.0, 5),
createPerk('gc_t5_l5_c', 'Immortal Form', 'Monumental golems are indestructible', 'C',
{ type: 'special', specialId: 'immortalForm', specialDesc: 'Indestructible golems' }, false, 5.0, 5),
],
l10Perks: [
createPerk('gc_t5_l10_a', '[ELITE] THE ARCHITECT', 'Monumental golems have 10x durability and grant 50% damage reduction', 'A',
{ type: 'special', specialId: 'theArchitect', specialDesc: '10x durability + 50% DR' }, true, 10.0, 10),
createPerk('gc_t5_l10_b', '[ELITE] THE MONUMENTALIST', 'Monumental golems are FREE to maintain and build', 'B',
{ type: 'special', specialId: 'theMonumentalist', specialDesc: 'Free golem maintenance and build' }, true, 10.0, 10),
createPerk('gc_t5_l10_c', '[ELITE] THE ETERNAL', 'Monumental golems last forever and persist across loops', 'C',
{ type: 'special', specialId: 'theEternal', specialDesc: 'Infinite golems persist across loops' }, true, 10.0, 10),
],
},
];
// ─── ENCHANTED GOLEMANCY TALENT TREE (Fabricator + Enchanter Hybrid) ────────
// Base: Imbuing golems with elemental spell logic
// Paths: A = The Battle-Smith (Golem Damage), B = The Enchanter-Smith (Enchantment Power), C = The Spell-Smith (Spell Effects)
export const ENCHANTED_GOLEMANCY_TIERS: SkillTierDef[] = [
// TIER 1
{
tier: 1,
skillId: 'enchantedGolemancy',
name: 'Enchanted Golemancy',
multiplier: 1,
l5Perks: [
createPerk('eg_t1_l5_a', 'Battle Forge', '+20% golem damage', 'A',
{ type: 'multiplier', stat: 'golemDamage', value: 0.20 }, false, 1.5, 5),
createPerk('eg_t1_l5_b', 'Mystic Forge', '+15% enchantment effect on golems', 'B',
{ type: 'multiplier', stat: 'golemEnchantPower', value: 0.15 }, false, 1.5, 5),
createPerk('eg_t1_l5_c', 'Spell-Forged', 'Golems have 10% chance to cast spells on attack', 'C',
{ type: 'special', specialId: 'spellForged', specialDesc: 'Golems cast spells on attack' }, false, 1.5, 5),
],
l10Perks: [
createPerk('eg_t1_l10_a', 'War Forge', '+30% golem damage', 'A',
{ type: 'multiplier', stat: 'golemDamage', value: 0.30 }, false, 2.0, 10),
createPerk('eg_t1_l10_b', 'Enchanter\'s Forge', '+25% enchantment effect on golems', 'B',
{ type: 'multiplier', stat: 'golemEnchantPower', value: 0.25 }, false, 2.0, 10),
createPerk('eg_t1_l10_c', 'Arcane Forged', 'Golems have 15% chance to cast spells on attack', 'C',
{ type: 'special', specialId: 'arcaneForged', specialDesc: 'Better spell chance for golems' }, false, 2.0, 10),
],
},
// TIER 2
{
tier: 2,
skillId: 'enchantedGolemancy_t2',
name: 'Greater Enchanted Golemancy',
multiplier: 10,
l5Perks: [
createPerk('eg_t2_l5_a', 'Champion Forge', '+40% golem damage', 'A',
{ type: 'multiplier', stat: 'golemDamage', value: 0.40 }, false, 2.0, 5),
createPerk('eg_t2_l5_b', 'Soul-Enchanter', 'Golem enchantments also boost golem speed by 10%', 'B',
{ type: 'special', specialId: 'soulEnchanter', specialDesc: 'Golem enchants boost speed' }, false, 2.0, 5),
createPerk('eg_t2_l5_c', 'Elemental Forged', 'Golems have 20% chance to cast spells on attack', 'C',
{ type: 'special', specialId: 'elementalForged', specialDesc: '20% spell chance for golems' }, false, 2.0, 5),
],
l10Perks: [
createPerk('eg_t2_l10_a', 'Heroic Forge', '+50% golem damage', 'A',
{ type: 'multiplier', stat: 'golemDamage', value: 0.50 }, false, 2.5, 10),
createPerk('eg_t2_l10_b', 'Grand Enchanter', 'Golem enchantments also boost golem durability by 15%', 'B',
{ type: 'special', specialId: 'grandEnchanter', specialDesc: 'Golem enchants boost durability' }, false, 2.5, 10),
createPerk('eg_t2_l10_c', 'Spell Mastery', 'Golems have 25% chance to cast spells on attack', 'C',
{ type: 'special', specialId: 'spellMastery', specialDesc: '25% spell chance for golems' }, false, 2.5, 10),
],
},
// TIER 3
{
tier: 3,
skillId: 'enchantedGolemancy_t3',
name: 'Divine Enchanted Golemancy',
multiplier: 100,
l5Perks: [
createPerk('eg_t3_l5_a', 'God\'s Forge', '+75% golem damage', 'A',
{ type: 'multiplier', stat: 'golemDamage', value: 0.75 }, false, 3.0, 5),
createPerk('eg_t3_l5_b', 'Divine Enchanter', 'Golem enchantments also boost golem damage by 20%', 'B',
{ type: 'special', specialId: 'divineEnchanter', specialDesc: 'Golem enchants boost damage' }, false, 3.0, 5),
createPerk('eg_t3_l5_c', 'Arcane Smith', 'Golems have 30% chance to cast spells on attack', 'C',
{ type: 'special', specialId: 'arcaneSmith', specialDesc: '30% spell chance for golems' }, false, 3.0, 5),
],
l10Perks: [
createPerk('eg_t3_l10_a', '[ELITE] BATTLE GOD', 'Golem damage is 2x and applies to all attacks', 'A',
{ type: 'special', specialId: 'battleGod', specialDesc: '2x golem damage' }, true, 5.0, 10),
createPerk('eg_t3_l10_b', '[ELITE] ENCHANTER GOD', 'Golem enchantments are 3x powerful', 'B',
{ type: 'special', specialId: 'enchanterGod', specialDesc: '3x golem enchantment power' }, true, 5.0, 10),
createPerk('eg_t3_l10_c', '[ELITE] SPELL GOD', 'Golems always cast spells on attack (100% chance)', 'C',
{ type: 'special', specialId: 'spellGod', specialDesc: 'Golems always cast spells' }, true, 5.0, 10),
],
},
// TIER 4
{
tier: 4,
skillId: 'enchantedGolemancy_t4',
name: 'Mythic Enchanted Golemancy',
multiplier: 1000,
l5Perks: [
createPerk('eg_t4_l5_a', 'Titan\'s Forge', '+100% golem damage', 'A',
{ type: 'multiplier', stat: 'golemDamage', value: 1.0 }, false, 4.0, 5),
createPerk('eg_t4_l5_b', 'Titanic Enchanter', 'Golem enchantments also boost golem regen by 25%', 'B',
{ type: 'special', specialId: 'titanicEnchanter', specialDesc: 'Golem enchants boost regen' }, false, 4.0, 5),
createPerk('eg_t4_l5_c', 'Spell Tyrant', 'Golems have 40% chance to cast 2 spells on attack', 'C',
{ type: 'special', specialId: 'spellTyrant', specialDesc: 'Double spells from golems' }, false, 4.0, 5),
],
l10Perks: [
createPerk('eg_t4_l10_a', 'God\'s Wrath', '+150% golem damage', 'A',
{ type: 'multiplier', stat: 'golemDamage', value: 1.50 }, false, 5.0, 10),
createPerk('eg_t4_l10_b', 'God\'s Enchanter', 'Golem enchantments also boost golem max mana by 30%', 'B',
{ type: 'special', specialId: 'godsEnchanter', specialDesc: 'Golem enchants boost max mana' }, false, 5.0, 10),
createPerk('eg_t4_l10_c', 'Spell Dominance', 'Golems have 50% chance to cast 2 spells on attack', 'C',
{ type: 'special', specialId: 'spellDominance', specialDesc: '50% double spell chance' }, false, 5.0, 10),
],
},
// TIER 5
{
tier: 5,
skillId: 'enchantedGolemancy_t5',
name: 'Transcendent Enchanted Golemancy',
multiplier: 10000,
l5Perks: [
createPerk('eg_t5_l5_a', 'God\'s Battle', '+200% golem damage', 'A',
{ type: 'multiplier', stat: 'golemDamage', value: 2.0 }, false, 5.0, 5),
createPerk('eg_t5_l5_b', 'Transcendent Enchanter', 'Golem enchantments apply at 2x strength', 'B',
{ type: 'special', specialId: 'transcendentEnchanter', specialDesc: '2x golem enchant strength' }, false, 5.0, 5),
createPerk('eg_t5_l5_c', 'Spell Omniscience', 'Golems have 75% chance to cast 2 spells on attack', 'C',
{ type: 'special', specialId: 'spellOmniscience', specialDesc: '75% double spell chance' }, false, 5.0, 5),
],
l10Perks: [
createPerk('eg_t5_l10_a', '[ELITE] THE BATTLE-SMITH', 'Golem damage is 5x and they have 50% crit chance', 'A',
{ type: 'special', specialId: 'theBattleSmith', specialDesc: '5x golem damage + 50% crit' }, true, 10.0, 10),
createPerk('eg_t5_l10_b', '[ELITE] THE ENCHANTER-SMITH', 'Golem enchantments are 5x powerful and apply to all golems', 'B',
{ type: 'special', specialId: 'theEnchanterSmith', specialDesc: '5x golem enchant power' }, true, 10.0, 10),
createPerk('eg_t5_l10_c', '[ELITE] THE SPELL-SMITH', 'Golems always cast 3 spells on attack', 'C',
{ type: 'special', specialId: 'theSpellSmith', specialDesc: 'Golems always cast 3 spells' }, true, 10.0, 10),
],
},
];
@@ -1,229 +0,0 @@
// ─── Skill Evolution System - Main Entry Point ────────────────────────
// NEW ARCHITECTURE: 5-Tier Continuous Talent Tree
//
// Every skill with max level 10 follows this "Talent Tree" structure:
// - 5 Tiers (T1-T5) of mastery
// - Milestone Choices: Player chooses 1 of 3 perks at Level 5 and Level 10 of EVERY Tier
// - Total Milestones: A fully mastered Tier 5 skill has 10 unique perk choices active
// - Compounding Paths: Perks belong to "Paths" (A, B, C columns)
// - Elite Perks: At T3 L10 and T5 L10, choices are "Elite Perks" (game-changing)
// Import types for value usage in function signatures
import type {
SkillPerkChoice,
SkillTierDef,
SkillEvolutionPath,
SkillUpgradeEffect,
SkillUpgradeDef,
} from '../types';
// Re-export types
export type {
SkillPerkChoice,
SkillTierDef,
SkillEvolutionPath,
SkillUpgradeEffect,
SkillUpgradeDef,
CanTierUpResult,
} from './types';
// Re-export all skill tier constants
export {
MANA_WELL_TIERS,
MANA_FLOW_TIERS,
} from './mana-well-flow';
export { ELEM_ATTUNE_TIERS } from './elemental-attunement';
export {
MANA_OVERFLOW_TIERS,
MANA_TAP_TIERS,
MANA_SURGE_TIERS,
MANA_SPRING_TIERS,
} from './mana-utility-skills';
export { QUICK_LEARNER_TIERS } from './quick-learner';
export { FOCUSED_MIND_TIERS } from './focused-mind';
export { KNOWLEDGE_RETENTION_TIERS } from './knowledge-retention';
export { INSIGHT_HARVEST_TIERS } from './insight-harvest';
export {
ENCHANTING_TIERS,
ENCHANT_SPEED_TIERS,
EFFICIENT_ENCHANT_TIERS,
DISENCHANTING_TIERS,
} from './enchanting-skills';
export {
INVOCATION_TIERS,
PACT_MASTERY_TIERS,
GUARDIAN_LORE_TIERS,
} from './invocation-skills';
export {
GUARDIAN_BANE_TIERS,
} from './guardian-skills';
export {
PACT_WEAVING_TIERS,
GUARDIAN_CONSTRUCTS_TIERS,
ENCHANTED_GOLEMANCY_TIERS,
} from './hybrid-skills';
export {
ARCANE_FURY_TIERS,
COMBAT_TRAINING_TIERS,
PRECISION_TIERS,
ELEMENTAL_MASTERY_TIERS,
ATTACK_SPEED_TIERS,
ARMOR_PIERCING_TIERS,
SPELL_DAMAGE_TIERS,
} from './combat-skills';
export {
MEDITATION_TIERS,
DEEP_TRANCE_TIERS,
VOID_MEDITATION_TIERS,
} from './meditation-skills';
export {
EFF_CRAFTING_TIERS,
FIELD_REPAIR_TIERS,
} from './crafting-skills';
export {
ESSENCE_REFINING_TIERS,
} from './essence-refining';
export {
GOLEM_MASTERY_TIERS,
GOLEM_EFFICIENCY_TIERS,
GOLEM_LONGEVITY_TIERS,
} from './golem-skills';
// Re-export helper functions
export { createPerk, createUpgrade } from './utils';
// Import all skill tier definitions for SKILL_EVOLUTION_PATHS
import { MANA_WELL_TIERS } from './mana-well-flow';
import { MANA_FLOW_TIERS } from './mana-well-flow';
import { ELEM_ATTUNE_TIERS } from './elemental-attunement';
import {
MANA_OVERFLOW_TIERS,
MANA_TAP_TIERS,
MANA_SURGE_TIERS,
MANA_SPRING_TIERS,
} from './mana-utility-skills';
import { QUICK_LEARNER_TIERS } from './quick-learner';
import { FOCUSED_MIND_TIERS } from './focused-mind';
import { KNOWLEDGE_RETENTION_TIERS } from './knowledge-retention';
import { INSIGHT_HARVEST_TIERS } from './insight-harvest';
import {
ENCHANTING_TIERS,
ENCHANT_SPEED_TIERS,
EFFICIENT_ENCHANT_TIERS,
DISENCHANTING_TIERS,
} from './enchanting-skills';
import {
INVOCATION_TIERS,
PACT_MASTERY_TIERS,
GUARDIAN_LORE_TIERS,
} from './invocation-skills';
import { GUARDIAN_BANE_TIERS } from './guardian-skills';
import {
PACT_WEAVING_TIERS,
GUARDIAN_CONSTRUCTS_TIERS,
ENCHANTED_GOLEMANCY_TIERS,
} from './hybrid-skills';
import {
ARCANE_FURY_TIERS,
COMBAT_TRAINING_TIERS,
PRECISION_TIERS,
ELEMENTAL_MASTERY_TIERS,
ATTACK_SPEED_TIERS,
ARMOR_PIERCING_TIERS,
SPELL_DAMAGE_TIERS,
} from './combat-skills';
import {
MEDITATION_TIERS,
DEEP_TRANCE_TIERS,
VOID_MEDITATION_TIERS,
} from './meditation-skills';
import {
EFF_CRAFTING_TIERS,
FIELD_REPAIR_TIERS,
} from './crafting-skills';
import {
ESSENCE_REFINING_TIERS,
} from './essence-refining';
import {
GOLEM_MASTERY_TIERS,
GOLEM_EFFICIENCY_TIERS,
GOLEM_LONGEVITY_TIERS,
} from './golem-skills';
// Helper to create element cap tiers
function createElementCapTier(
skillId: string, baseSkillId: string, name: string,
tiers: SkillTierDef[]
): SkillEvolutionPath {
return { baseSkillId, tiers };
}
// ─── Export Skill Evolution Paths ─────────────────────────────────
export const SKILL_EVOLUTION_PATHS: Record<string, SkillEvolutionPath> = {
// Core Mana Skills
manaWell: { baseSkillId: 'manaWell', tiers: MANA_WELL_TIERS },
manaFlow: { baseSkillId: 'manaFlow', tiers: MANA_FLOW_TIERS },
elemAttune: { baseSkillId: 'elemAttune', tiers: ELEM_ATTUNE_TIERS },
manaOverflow: { baseSkillId: 'manaOverflow', tiers: MANA_OVERFLOW_TIERS },
quickLearner: { baseSkillId: 'quickLearner', tiers: QUICK_LEARNER_TIERS },
focusedMind: { baseSkillId: 'focusedMind', tiers: FOCUSED_MIND_TIERS },
knowledgeRetention: { baseSkillId: 'knowledgeRetention', tiers: KNOWLEDGE_RETENTION_TIERS },
meditation: { baseSkillId: 'meditation', tiers: MEDITATION_TIERS },
deepTrance: { baseSkillId: 'deepTrance', tiers: DEEP_TRANCE_TIERS },
voidMeditation: { baseSkillId: 'voidMeditation', tiers: VOID_MEDITATION_TIERS },
insightHarvest: { baseSkillId: 'insightHarvest', tiers: INSIGHT_HARVEST_TIERS },
// Enchanting Skills
enchanting: { baseSkillId: 'enchanting', tiers: ENCHANTING_TIERS },
efficientEnchant: { baseSkillId: 'efficientEnchant', tiers: EFFICIENT_ENCHANT_TIERS },
essenceRefining: { baseSkillId: 'essenceRefining', tiers: ESSENCE_REFINING_TIERS },
enchantSpeed: { baseSkillId: 'enchantSpeed', tiers: ENCHANT_SPEED_TIERS },
// Combat Skills
arcaneFury: { baseSkillId: 'arcaneFury', tiers: ARCANE_FURY_TIERS },
combatTraining: { baseSkillId: 'combatTraining', tiers: COMBAT_TRAINING_TIERS },
precision: { baseSkillId: 'precision', tiers: PRECISION_TIERS },
elementalMastery: { baseSkillId: 'elementalMastery', tiers: ELEMENTAL_MASTERY_TIERS },
attackSpeed: { baseSkillId: 'attackSpeed', tiers: ATTACK_SPEED_TIERS },
armorPiercing: { baseSkillId: 'armorPiercing', tiers: ARMOR_PIERCING_TIERS },
spellDamage: { baseSkillId: 'spellDamage', tiers: SPELL_DAMAGE_TIERS },
// Mana tap/surge/spring
manaTap: { baseSkillId: 'manaTap', tiers: MANA_TAP_TIERS },
manaSurge: { baseSkillId: 'manaSurge', tiers: MANA_SURGE_TIERS },
manaSpring: { baseSkillId: 'manaSpring', tiers: MANA_SPRING_TIERS },
// Invocation / Pact
invocation: { baseSkillId: 'invocation', tiers: INVOCATION_TIERS },
pactMastery: { baseSkillId: 'pactMastery', tiers: PACT_MASTERY_TIERS },
guardianLore: { baseSkillId: 'guardianLore', tiers: GUARDIAN_LORE_TIERS },
// Guardian
guardianBane: { baseSkillId: 'guardianBane', tiers: GUARDIAN_BANE_TIERS },
// Crafting
effCrafting: { baseSkillId: 'effCrafting', tiers: EFF_CRAFTING_TIERS },
fieldRepair: { baseSkillId: 'fieldRepair', tiers: FIELD_REPAIR_TIERS },
// Golem Skills
golemMastery: { baseSkillId: 'golemMastery', tiers: GOLEM_MASTERY_TIERS },
golemEfficiency: { baseSkillId: 'golemEfficiency', tiers: GOLEM_EFFICIENCY_TIERS },
golemLongevity: { baseSkillId: 'golemLongevity', tiers: GOLEM_LONGEVITY_TIERS },
// Hybrid Skills
pactWeaving: { baseSkillId: 'pactWeaving', tiers: PACT_WEAVING_TIERS },
guardianConstructs: { baseSkillId: 'guardianConstructs', tiers: GUARDIAN_CONSTRUCTS_TIERS },
enchantedGolemancy: { baseSkillId: 'enchantedGolemancy', tiers: ENCHANTED_GOLEMANCY_TIERS },
};
@@ -1,127 +0,0 @@
// ─── Insight Harvest Skill Tier Definitions ──────────────────────────────────
// Base: Increases Insight Gain
import { createPerk } from './utils';
import type { SkillTierDef } from '../types';
// ─── INSIGHT HARVEST TALENT TREE ──────────────────────────────────────────
// Base: Increases Insight Gain
// Paths: A = The Harvester (Insight Gain), B = The Scholar (Study Insight), C = The Hunter (Kill Insight)
export const INSIGHT_HARVEST_TIERS: SkillTierDef[] = [
// TIER 1
{
tier: 1,
skillId: 'insightHarvest',
name: 'Insight Harvest',
multiplier: 1,
l5Perks: [
createPerk('ih_t1_l5_a', 'Basic Harvest', '+10% insight gain', 'A',
{ type: 'multiplier', stat: 'insightGain', value: 0.10 }, false, 1.5, 5),
createPerk('ih_t1_l5_b', 'Rich Harvest', '+15% insight from study', 'B',
{ type: 'multiplier', stat: 'studyInsight', value: 0.15 }, false, 1.5, 5),
createPerk('ih_t1_l5_c', 'Bountiful Harvest', '+5% insight from kills', 'C',
{ type: 'multiplier', stat: 'killInsight', value: 0.05 }, false, 1.5, 5),
],
l10Perks: [
createPerk('ih_t1_l10_a', 'Greater Harvest', '+15% insight gain', 'A',
{ type: 'multiplier', stat: 'insightGain', value: 0.15 }, false, 2.0, 10),
createPerk('ih_t1_l10_b', 'Abundant Harvest', '+20% insight from study', 'B',
{ type: 'multiplier', stat: 'studyInsight', value: 0.20 }, false, 2.0, 10),
createPerk('ih_t1_l10_c', 'Overflowing Harvest', '+10% insight from kills', 'C',
{ type: 'multiplier', stat: 'killInsight', value: 0.10 }, false, 2.0, 10),
],
},
// TIER 2
{
tier: 2,
skillId: 'insightHarvest_t2',
name: 'Greater Harvest',
multiplier: 10,
l5Perks: [
createPerk('ih_t2_l5_a', 'Master Harvest', '+20% insight gain', 'A',
{ type: 'multiplier', stat: 'insightGain', value: 0.20 }, false, 2.0, 5),
createPerk('ih_t2_l5_b', 'Supreme Study', '+25% insight from study', 'B',
{ type: 'multiplier', stat: 'studyInsight', value: 0.25 }, false, 2.0, 5),
createPerk('ih_t2_l5_c', 'Bountiful Kills', '+15% insight from kills', 'C',
{ type: 'multiplier', stat: 'killInsight', value: 0.15 }, false, 2.0, 5),
],
l10Perks: [
createPerk('ih_t2_l10_a', 'Ultimate Harvest', '+25% insight gain', 'A',
{ type: 'multiplier', stat: 'insightGain', value: 0.25 }, false, 2.5, 10),
createPerk('ih_t2_l10_b', 'Divine Study', '+30% insight from study', 'B',
{ type: 'multiplier', stat: 'studyInsight', value: 0.30 }, false, 2.5, 10),
createPerk('ih_t2_l10_c', 'Godly Kills', '+20% insight from kills', 'C',
{ type: 'multiplier', stat: 'killInsight', value: 0.20 }, false, 2.5, 10),
],
},
// TIER 3
{
tier: 3,
skillId: 'insightHarvest_t3',
name: 'Perfect Harvest',
multiplier: 100,
l5Perks: [
createPerk('ih_t3_l5_a', 'Cosmic Harvest', '+30% insight gain', 'A',
{ type: 'multiplier', stat: 'insightGain', value: 0.30 }, false, 3.0, 5),
createPerk('ih_t3_l5_b', 'Transcendent Study', '+40% insight from study', 'B',
{ type: 'multiplier', stat: 'studyInsight', value: 0.40 }, false, 3.0, 5),
createPerk('ih_t3_l5_c', 'Enlightened Kills', '+25% insight from kills', 'C',
{ type: 'multiplier', stat: 'killInsight', value: 0.25 }, false, 3.0, 5),
],
l10Perks: [
createPerk('ih_t3_l10_a', '[ELITE] OMNI-HARVEST', 'Insight gain is 2x', 'A',
{ type: 'special', specialId: 'omniHarvest', specialDesc: '2x insight gain' }, true, 5.0, 10),
createPerk('ih_t3_l10_b', '[ELITE] OMNI-STUDY', 'Insight from study is 3x', 'B',
{ type: 'special', specialId: 'omniStudyInsight', specialDesc: '3x insight from study' }, true, 5.0, 10),
createPerk('ih_t3_l10_c', '[ELITE] OMNI-KILLS', 'Insight from kills is 5x', 'C',
{ type: 'special', specialId: 'omniKills', specialDesc: '5x insight from kills' }, true, 5.0, 10),
],
},
// TIER 4
{
tier: 4,
skillId: 'insightHarvest_t4',
name: 'Transcendent Harvest',
multiplier: 1000,
l5Perks: [
createPerk('ih_t4_l5_a', 'Astral Harvest', '+40% insight gain', 'A',
{ type: 'multiplier', stat: 'insightGain', value: 0.40 }, false, 4.0, 5),
createPerk('ih_t4_l5_b', 'Ethereal Study', '+50% insight from study', 'B',
{ type: 'multiplier', stat: 'studyInsight', value: 0.50 }, false, 4.0, 5),
createPerk('ih_t4_l5_c', 'Divine Kills', '+30% insight from kills', 'C',
{ type: 'multiplier', stat: 'killInsight', value: 0.30 }, false, 4.0, 5),
],
l10Perks: [
createPerk('ih_t4_l10_a', 'Galactic Harvest', '+50% insight gain', 'A',
{ type: 'multiplier', stat: 'insightGain', value: 0.50 }, false, 5.0, 10),
createPerk('ih_t4_l10_b', 'Infinite Study', '+60% insight from study', 'B',
{ type: 'multiplier', stat: 'studyInsight', value: 0.60 }, false, 5.0, 10),
createPerk('ih_t4_l10_c', 'Godlike Kills', '+40% insight from kills', 'C',
{ type: 'multiplier', stat: 'killInsight', value: 0.40 }, false, 5.0, 10),
],
},
// TIER 5
{
tier: 5,
skillId: 'insightHarvest_t5',
name: 'Godlike Harvest',
multiplier: 10000,
l5Perks: [
createPerk('ih_t5_l5_a', 'Divine Harvest', '+75% insight gain', 'A',
{ type: 'multiplier', stat: 'insightGain', value: 0.75 }, false, 5.0, 5),
createPerk('ih_t5_l5_b', 'Celestial Study', '+80% insight from study', 'B',
{ type: 'multiplier', stat: 'studyInsight', value: 0.80 }, false, 5.0, 5),
createPerk('ih_t5_l5_c', 'Omniscient Kills', '+50% insight from kills', 'C',
{ type: 'multiplier', stat: 'killInsight', value: 0.50 }, false, 5.0, 5),
],
l10Perks: [
createPerk('ih_t5_l10_a', '[ELITE] ASCENDED HARVEST', 'Insight gain is 5x', 'A',
{ type: 'special', specialId: 'ascendedHarvest', specialDesc: '5x insight gain' }, true, 10.0, 10),
createPerk('ih_t5_l10_b', '[ELITE] PERFECT STUDY', 'Insight from study is 5x', 'B',
{ type: 'special', specialId: 'perfectStudy', specialDesc: '5x insight from study' }, true, 10.0, 10),
createPerk('ih_t5_l10_c', '[ELITE] OMNIPOTENT KILLS', 'Insight from kills is 10x', 'C',
{ type: 'special', specialId: 'omnipotentKills', specialDesc: '10x insight from kills' }, true, 10.0, 10),
],
},
];
@@ -1,249 +0,0 @@
// ─── Invocation/Pact Skill Tier Definitions ────────────────────────
// This file contains: Invocation, Pact Mastery
import { createPerk } from './utils';
import type { SkillTierDef } from '../types';
// ─── INVOCATION TALENT TREE (Invoker Attunement) ──────────────────────────────
// Base: Enhances spell invocation and guardian pacts
// Paths: A = The Summoner (Guardian Powers), B = The Channeler (Spell Amplification), C = The Pact Keeper (Pact Efficiency)
export const INVOCATION_TIERS: SkillTierDef[] = [
// TIER 1
{
tier: 1,
skillId: 'invocation',
name: 'Invocation',
multiplier: 1,
l5Perks: [
createPerk('inv_t1_l5_a', 'Guardian\'s Touch', '+10% guardian boon effectiveness', 'A',
{ type: 'multiplier', stat: 'guardianBoon', value: 0.10 }, false, 1.5, 5),
createPerk('inv_t1_l5_b', 'Amplified Cast', '+10% spell damage', 'B',
{ type: 'multiplier', stat: 'spellDamage', value: 0.10 }, false, 1.5, 5),
createPerk('inv_t1_l5_c', 'Swift Pact', '-10% pact ritual time', 'C',
{ type: 'multiplier', stat: 'pactTime', value: -0.10 }, false, 1.5, 5),
],
l10Perks: [
createPerk('inv_t1_l10_a', 'Guardian\'s Embrace', '+15% guardian boon effectiveness', 'A',
{ type: 'multiplier', stat: 'guardianBoon', value: 0.15 }, false, 2.0, 10),
createPerk('inv_t1_l10_b', 'Empowered Chant', '+15% spell damage', 'B',
{ type: 'multiplier', stat: 'spellDamage', value: 0.15 }, false, 2.0, 10),
createPerk('inv_t1_l10_c', 'Efficient Pact', '-15% pact mana cost', 'C',
{ type: 'multiplier', stat: 'pactCost', value: -0.15 }, false, 2.0, 10),
],
},
// TIER 2
{
tier: 2,
skillId: 'invocation_t2',
name: 'Greater Invocation',
multiplier: 10,
l5Perks: [
createPerk('inv_t2_l5_a', 'Guardian\'s Shield', 'Signed pacts grant +5% damage reduction', 'A',
{ type: 'special', specialId: 'guardianShield', specialDesc: 'Pacts grant damage reduction' }, false, 2.0, 5),
createPerk('inv_t2_l5_b', 'Spell Echo', 'Spells have 10% chance to cast twice', 'B',
{ type: 'special', specialId: 'spellEcho', specialDesc: 'Chance for double cast' }, false, 2.0, 5),
createPerk('inv_t2_l5_c', 'Pact Boon', 'Each pact signed reduces all pact costs by 5%', 'C',
{ type: 'special', specialId: 'pactBoon', specialDesc: 'Scaling pact cost reduction' }, false, 2.0, 5),
],
l10Perks: [
createPerk('inv_t2_l10_a', 'Guardian\'s Wrath', 'Signed pacts grant +10% damage vs guardian type', 'A',
{ type: 'special', specialId: 'guardianWrath', specialDesc: 'Pacts grant guardian damage' }, false, 2.5, 10),
createPerk('inv_t2_l10_b', 'Arcane Surge', 'Spells have 15% chance to cast twice', 'B',
{ type: 'special', specialId: 'arcaneSurge', specialDesc: 'Better chance for double cast' }, false, 2.5, 10),
createPerk('inv_t2_l10_c', 'Grand Pact', 'Pact multiplier increased by 0.2x', 'C',
{ type: 'special', specialId: 'grandPact', specialDesc: 'Increased pact multiplier' }, false, 2.5, 10),
],
},
// TIER 3
{
tier: 3,
skillId: 'invocation_t3',
name: 'Divine Invocation',
multiplier: 100,
l5Perks: [
createPerk('inv_t3_l5_a', 'Guardian\'s Dominance', 'Signed pacts grant +15% damage vs guardian type', 'A',
{ type: 'special', specialId: 'guardianDominance', specialDesc: 'Enhanced guardian damage' }, false, 3.0, 5),
createPerk('inv_t3_l5_b', 'Mystic Focus', 'Spells have 20% chance to cast twice', 'B',
{ type: 'special', specialId: 'mysticFocus', specialDesc: '20% chance double cast' }, false, 3.0, 5),
createPerk('inv_t3_l5_c', 'Pact Mastery', 'Pact multiplier increased by 0.3x', 'C',
{ type: 'special', specialId: 'pactMastery', specialDesc: 'Greater pact multiplier' }, false, 3.0, 5),
],
l10Perks: [
createPerk('inv_t3_l10_a', '[ELITE] GUARDIAN LORD', 'All guardian boons are doubled while their pact is signed', 'A',
{ type: 'special', specialId: 'guardianLord', specialDesc: '2x boons when pact signed' }, true, 5.0, 10),
createPerk('inv_t3_l10_b', '[ELITE] ARCANE AVALANCHE', 'Spells have 25% chance to cast 3 times simultaneously', 'B',
{ type: 'special', specialId: 'arcaneAvalanche', specialDesc: '25% chance triple cast' }, true, 5.0, 10),
createPerk('inv_t3_l10_c', '[ELITE] ETERNAL COVENANT', 'Signed pacts persist across loops', 'C',
{ type: 'special', specialId: 'eternalCovenant', specialDesc: 'Pacts never expire' }, true, 5.0, 10),
],
},
// TIER 4
{
tier: 4,
skillId: 'invocation_t4',
name: 'Mythic Invocation',
multiplier: 1000,
l5Perks: [
createPerk('inv_t4_l5_a', 'Titan\'s Protection', 'All signed pacts grant +10% max mana', 'A',
{ type: 'special', specialId: 'titansProtection', specialDesc: 'Pacts grant max mana' }, false, 4.0, 5),
createPerk('inv_t4_l5_b', 'Spell Fury', 'Casting speed increased by 25% for 5s after pact signed', 'B',
{ type: 'special', specialId: 'spellFury', specialDesc: 'Pact boosts cast speed' }, false, 4.0, 5),
createPerk('inv_t4_l5_c', 'Pact Amplification', 'Pact multiplier increased by 0.5x', 'C',
{ type: 'special', specialId: 'pactAmplification', specialDesc: 'Major pact multiplier boost' }, false, 4.0, 5),
],
l10Perks: [
createPerk('inv_t4_l10_a', 'Divine Aegis', 'All signed pacts grant +15% damage reduction', 'A',
{ type: 'special', specialId: 'divineAegis', specialDesc: 'Pacts grant more damage reduction' }, false, 5.0, 10),
createPerk('inv_t4_l10_b', 'Arcane Tempest', 'Spell damage increased by 25% for 10s after pact signed', 'B',
{ type: 'special', specialId: 'arcaneTempest', specialDesc: 'Pact boosts spell damage' }, false, 5.0, 10),
createPerk('inv_t4_l10_c', 'Supreme Pact', 'Pact multiplier increased by 0.75x', 'C',
{ type: 'special', specialId: 'supremePact', specialDesc: 'Massive pact multiplier boost' }, false, 5.0, 10),
],
},
// TIER 5
{
tier: 5,
skillId: 'invocation_t5',
name: 'Transcendent Invocation',
multiplier: 10000,
l5Perks: [
createPerk('inv_t5_l5_a', 'God\'s Shield', 'All signed pacts grant +20% damage reduction and +20% max mana', 'A',
{ type: 'special', specialId: 'godsShield', specialDesc: 'Pacts grant DR and max mana' }, false, 5.0, 5),
createPerk('inv_t5_l5_b', 'Reality Warp', 'Spells have 30% chance to cast 3 times simultaneously', 'B',
{ type: 'special', specialId: 'realityWarp', specialDesc: '30% chance triple cast' }, false, 5.0, 5),
createPerk('inv_t5_l5_c', 'Pact of the Gods', 'Pact multiplier increased by 1.0x', 'C',
{ type: 'special', specialId: 'pactOfGods', specialDesc: 'Massive 1.0x pact multiplier' }, false, 5.0, 5),
],
l10Perks: [
createPerk('inv_t5_l10_a', '[ELITE] ASCENDED GUARDIAN', 'All guardian boons are tripled and apply at double strength', 'A',
{ type: 'special', specialId: 'ascendedGuardian', specialDesc: '3x boons at 2x strength' }, true, 10.0, 10),
createPerk('inv_t5_l10_b', '[ELITE] ARCANE SINGULARITY', 'All spells cast 4 times simultaneously with 50% damage each', 'B',
{ type: 'special', specialId: 'arcaneSingularity', specialDesc: '4x cast at 50% damage' }, true, 10.0, 10),
createPerk('inv_t5_l10_c', '[ELITE] OMNIPACT', 'All pacts are permanently signed and multiplier is doubled', 'C',
{ type: 'special', specialId: 'omnipact', specialDesc: 'All pacts signed, 2x multiplier' }, true, 10.0, 10),
],
},
];
// ─── PACT MASTERY TALENT TREE (Invoker Attunement) ───────────────────────────
// Base: Enhances pact signing and guardian bonuses
// Paths: A = The Binder (Pact Power), B = The Harvester (Boon Collection), C = The Soul Forge (Soul Effects)
export const PACT_MASTERY_TIERS: SkillTierDef[] = [
// TIER 1
{
tier: 1,
skillId: 'pactMastery',
name: 'Pact Mastery',
multiplier: 1,
l5Perks: [
createPerk('pm_t1_l5_a', 'Pact Bond', '+10% pact multiplier', 'A',
{ type: 'multiplier', stat: 'pactMultiplier', value: 0.10 }, false, 1.5, 5),
createPerk('pm_t1_l5_b', 'Boon Hunter', '+1% boon effectiveness per pact signed', 'B',
{ type: 'special', specialId: 'boonHunter', specialDesc: 'Scaling boon effectiveness' }, false, 1.5, 5),
createPerk('pm_t1_l5_c', 'Soul Tether', 'Signed pacts restore 5% mana when entering combat', 'C',
{ type: 'special', specialId: 'soulTether', specialDesc: 'Pacts restore mana on combat' }, false, 1.5, 5),
],
l10Perks: [
createPerk('pm_t1_l10_a', 'Strong Bond', '+15% pact multiplier', 'A',
{ type: 'multiplier', stat: 'pactMultiplier', value: 0.15 }, false, 2.0, 10),
createPerk('pm_t1_l10_b', 'Boon Collector', '+2% boon effectiveness per pact signed', 'B',
{ type: 'special', specialId: 'boonCollector', specialDesc: 'Better scaling boon effectiveness' }, false, 2.0, 10),
createPerk('pm_t1_l10_c', 'Soul Link', 'Signed pacts restore 10% mana when entering combat', 'C',
{ type: 'special', specialId: 'soulLink', specialDesc: 'Better mana restore from pacts' }, false, 2.0, 10),
],
},
// TIER 2
{
tier: 2,
skillId: 'pactMastery_t2',
name: 'Greater Pact Mastery',
multiplier: 10,
l5Perks: [
createPerk('pm_t2_l5_a', 'Unbreakable Bond', '+25% pact multiplier', 'A',
{ type: 'multiplier', stat: 'pactMultiplier', value: 0.25 }, false, 2.0, 5),
createPerk('pm_t2_l5_b', 'Boon Saturation', 'Each boon type grants +5% to all stats', 'B',
{ type: 'special', specialId: 'boonSaturation', specialDesc: 'Boons grant all stat bonuses' }, false, 2.0, 5),
createPerk('pm_t2_l5_c', 'Soul Harvest', 'Killing enemies restores 1% mana per signed pact', 'C',
{ type: 'special', specialId: 'soulHarvest', specialDesc: 'Kills restore mana based on pacts' }, false, 2.0, 5),
],
l10Perks: [
createPerk('pm_t2_l10_a', 'Ultimate Bond', '+35% pact multiplier', 'A',
{ type: 'multiplier', stat: 'pactMultiplier', value: 0.35 }, false, 2.5, 10),
createPerk('pm_t2_l10_b', 'Boon Overflow', 'Boons have 10% chance to apply twice', 'B',
{ type: 'special', specialId: 'boonOverflow', specialDesc: 'Chance for double boon effect' }, false, 2.5, 10),
createPerk('pm_t2_l10_c', 'Soul Siphon', 'Dealing damage restores 0.5% mana per signed pact', 'C',
{ type: 'special', specialId: 'soulSiphon', specialDesc: 'Damage restores mana from pacts' }, false, 2.5, 10),
],
},
// TIER 3
{
tier: 3,
skillId: 'pactMastery_t3',
name: 'Divine Pact Mastery',
multiplier: 100,
l5Perks: [
createPerk('pm_t3_l5_a', 'Godly Bond', '+50% pact multiplier', 'A',
{ type: 'multiplier', stat: 'pactMultiplier', value: 0.50 }, false, 3.0, 5),
createPerk('pm_t3_l5_b', 'Boon Symphony', 'Each active boon increases others by 5%', 'B',
{ type: 'special', specialId: 'boonSymphony', specialDesc: 'Boons amplify each other' }, false, 3.0, 5),
createPerk('pm_t3_l5_c', 'Soul Forge', 'Signed pacts increase max mana by 5% each', 'C',
{ type: 'special', specialId: 'soulForge', specialDesc: 'Pacts grant max mana' }, false, 3.0, 5),
],
l10Perks: [
createPerk('pm_t3_l10_a', '[ELITE] ETERNAL BOND', 'Pact multiplier is doubled and applies to all stats', 'A',
{ type: 'special', specialId: 'eternalBond', specialDesc: '2x pact multiplier, all stats' }, true, 5.0, 10),
createPerk('pm_t3_l10_b', '[ELITE] BOON GOD', 'All boons are 3x effective and apply at double strength', 'B',
{ type: 'special', specialId: 'boonGod', specialDesc: '3x boon effectiveness' }, true, 5.0, 10),
createPerk('pm_t3_l10_c', '[ELITE] SOUL ASCENSION', 'Each signed pact grants +10% to all damage types', 'C',
{ type: 'special', specialId: 'soulAscension', specialDesc: 'Pacts grant all damage' }, true, 5.0, 10),
],
},
// TIER 4
{
tier: 4,
skillId: 'pactMastery_t4',
name: 'Mythic Pact Mastery',
multiplier: 1000,
l5Perks: [
createPerk('pm_t4_l5_a', 'Titan\'s Bond', '+75% pact multiplier', 'A',
{ type: 'multiplier', stat: 'pactMultiplier', value: 0.75 }, false, 4.0, 5),
createPerk('pm_t4_l5_b', 'Boon Dominance', 'Boons also grant +10% crit chance', 'B',
{ type: 'special', specialId: 'boonDominance', specialDesc: 'Boons grant crit chance' }, false, 4.0, 5),
createPerk('pm_t4_l5_c', 'Soul Empowerment', 'Signed pacts increase spell damage by 10% each', 'C',
{ type: 'special', specialId: 'soulEmpowerment', specialDesc: 'Pacts grant spell damage' }, false, 4.0, 5),
],
l10Perks: [
createPerk('pm_t4_l10_a', 'Divine Bond', '+100% pact multiplier', 'A',
{ type: 'multiplier', stat: 'pactMultiplier', value: 1.0 }, false, 5.0, 10),
createPerk('pm_t4_l10_b', 'Boon Paragon', 'Boons also grant +15% cast speed', 'B',
{ type: 'special', specialId: 'boonParagon', specialDesc: 'Boons grant cast speed' }, false, 5.0, 10),
createPerk('pm_t4_l10_c', 'Soul Transcendence', 'Signed pacts increase regen by 10% each', 'C',
{ type: 'special', specialId: 'soulTranscendence', specialDesc: 'Pacts grant regen' }, false, 5.0, 10),
],
},
// TIER 5
{
tier: 5,
skillId: 'pactMastery_t5',
name: 'Transcendent Pact Mastery',
multiplier: 10000,
l5Perks: [
createPerk('pm_t5_l5_a', 'God\'s Bond', '+150% pact multiplier', 'A',
{ type: 'multiplier', stat: 'pactMultiplier', value: 1.50 }, false, 5.0, 5),
createPerk('pm_t5_l5_b', 'Boon Omniscience', 'Boons also grant +20% to all damage types', 'B',
{ type: 'special', specialId: 'boonOmniscience', specialDesc: 'Boons grant all damage' }, false, 5.0, 5),
createPerk('pm_t5_l5_c', 'Soul Omnipotence', 'Signed pacts increase all stats by 15% each', 'C',
{ type: 'special', specialId: 'soulOmnipotence', specialDesc: 'Pacts grant all stats' }, false, 5.0, 5),
],
l10Perks: [
createPerk('pm_t5_l10_a', '[ELITE] PACT OF THE GODS', 'Pact multiplier is 5x and applies to everything', 'A',
{ type: 'special', specialId: 'pactOfGods2', specialDesc: '5x pact multiplier, universal' }, true, 10.0, 10),
createPerk('pm_t5_l10_b', '[ELITE] BOON SINGULARITY', 'All boons are 5x effective and never expire', 'B',
{ type: 'special', specialId: 'boonSingularity', specialDesc: '5x boons, permanent' }, true, 10.0, 10),
createPerk('pm_t5_l10_c', '[ELITE] SOUL OMNIPOTENCE', 'Each pact grants +25% to ALL stats permanently', 'C',
{ type: 'special', specialId: 'soulOmnipotenceElite', specialDesc: 'Pacts grant 25% all stats' }, true, 10.0, 10),
],
},
];
@@ -1,81 +0,0 @@
// ─── Knowledge Retention Skill Tier Definitions ─────────────────────────────
// Base: Study Progress Saved on Cancel
import { createPerk } from './utils';
import type { SkillTierDef } from '../types';
// ─── KNOWLEDGE RETENTION TALENT TREE ──────────────────────────────────────────
// Base: Study Progress Saved on Cancel
// Paths: A = The Scholar (Retention), B = The Scribe (Efficiency), C = The Archivist (Bonus Effects)
export const KNOWLEDGE_RETENTION_TIERS: SkillTierDef[] = [
// TIER 1
{
tier: 1,
skillId: 'knowledgeRetention',
name: 'Knowledge Retention',
multiplier: 1,
l5Perks: [
createPerk('kr_t1_l5_a', 'Memory Palace', '+10% Retention', 'A',
{ type: 'multiplier', stat: 'retention', value: 0.10 }, false, 1.5, 5),
createPerk('kr_t1_l5_b', 'Quick Notes', '+10% Study Speed', 'B',
{ type: 'multiplier', stat: 'studySpeed', value: 0.10 }, false, 1.5, 5),
createPerk('kr_t1_l5_c', 'Ancient Wisdom', '+5% Insight Gain', 'C',
{ type: 'multiplier', stat: 'insightGain', value: 0.05 }, false, 1.5, 5),
],
l10Perks: [
createPerk('kr_t1_l10_a', 'Greater Retention', '+15% Retention', 'A',
{ type: 'multiplier', stat: 'retention', value: 0.15 }, false, 2.0, 10),
createPerk('kr_t1_l10_b', 'Efficient Study', '+15% Study Speed', 'B',
{ type: 'multiplier', stat: 'studySpeed', value: 0.15 }, false, 2.0, 10),
createPerk('kr_t1_l10_c', 'Enlightened Mind', '+10% Insight Gain', 'C',
{ type: 'multiplier', stat: 'insightGain', value: 0.10 }, false, 2.0, 10),
],
},
// TIER 2
{
tier: 2,
skillId: 'knowledgeRetention_t2',
name: 'Greater Retention',
multiplier: 10,
l5Perks: [
createPerk('kr_t2_l5_a', 'Vast Memory', '+20% Retention', 'A',
{ type: 'multiplier', stat: 'retention', value: 0.20 }, false, 2.0, 5),
createPerk('kr_t2_l5_b', 'Swift Study', '+20% Study Speed', 'B',
{ type: 'multiplier', stat: 'studySpeed', value: 0.20 }, false, 2.0, 5),
createPerk('kr_t2_l5_c', 'Scholarly Wisdom', '+15% Insight Gain', 'C',
{ type: 'multiplier', stat: 'insightGain', value: 0.15 }, false, 2.0, 5),
],
l10Perks: [
createPerk('kr_t2_l10_a', 'Perfect Memory', '+25% Retention', 'A',
{ type: 'multiplier', stat: 'retention', value: 0.25 }, false, 2.5, 10),
createPerk('kr_t2_l10_b', 'Master Study', '+25% Study Speed', 'B',
{ type: 'multiplier', stat: 'studySpeed', value: 0.25 }, false, 2.5, 10),
createPerk('kr_t2_l10_c', 'Divine Wisdom', '+20% Insight Gain', 'C',
{ type: 'multiplier', stat: 'insightGain', value: 0.20 }, false, 2.5, 10),
],
},
// TIER 3
{
tier: 3,
skillId: 'knowledgeRetention_t3',
name: 'Perfect Retention',
multiplier: 100,
l5Perks: [
createPerk('kr_t3_l5_a', 'Cosmic Memory', '+30% Retention', 'A',
{ type: 'multiplier', stat: 'retention', value: 0.30 }, false, 3.0, 5),
createPerk('kr_t3_l5_b', 'Transcendent Study', '+30% Study Speed', 'B',
{ type: 'multiplier', stat: 'studySpeed', value: 0.30 }, false, 3.0, 5),
createPerk('kr_t3_l5_c', 'Enlightened Wisdom', '+25% Insight Gain', 'C',
{ type: 'multiplier', stat: 'insightGain', value: 0.25 }, false, 3.0, 5),
],
l10Perks: [
createPerk('kr_t3_l10_a', '[ELITE] OMNI-RETENTION', 'Retention is 50%', 'A',
{ type: 'special', specialId: 'omniRetention', specialDesc: '50% retention always' }, true, 5.0, 10),
createPerk('kr_t3_l10_b', '[ELITE] OMNI-STUDY', 'Study speed is 50% faster', 'B',
{ type: 'special', specialId: 'omniStudy', specialDesc: '50% faster study' }, true, 5.0, 10),
createPerk('kr_t3_l10_c', '[ELITE] OMNI-WISDOM', 'Insight gain is 50% higher', 'C',
{ type: 'special', specialId: 'omniWisdom', specialDesc: '50% more insight' }, true, 5.0, 10),
],
},
];
@@ -1,11 +0,0 @@
// ─── Learning/Study Skill Tier Definitions ─────────────────────────────
// This file now re-exports from the split module files:
// - quick-learner.ts: Quick Learner
// - focused-mind.ts: Focused Mind
// - knowledge-retention.ts: Knowledge Retention
// - insight-harvest.ts: Insight Harvest
export { QUICK_LEARNER_TIERS } from './quick-learner';
export { FOCUSED_MIND_TIERS } from './focused-mind';
export { KNOWLEDGE_RETENTION_TIERS } from './knowledge-retention';
export { INSIGHT_HARVEST_TIERS } from './insight-harvest';
@@ -1,9 +0,0 @@
// ─── Magic/Mana Skill Tier Definitions ──────────────────────────────────
// This file now re-exports from the split module files:
// - mana-well-flow.ts: Mana Well, Mana Flow
// - elemental-attunement.ts: Elemental Attunement
// - mana-utility-skills.ts: Mana Overflow, Mana Tap, Mana Surge, Mana Spring
export { MANA_WELL_TIERS, MANA_FLOW_TIERS } from './mana-well-flow';
export { ELEM_ATTUNE_TIERS } from './elemental-attunement';
export { MANA_OVERFLOW_TIERS, MANA_TAP_TIERS, MANA_SURGE_TIERS, MANA_SPRING_TIERS } from './mana-utility-skills';
@@ -1,139 +0,0 @@
// ─── Mana Utility Skills Tier Definitions ─────────────────────────────────────
// Contains: Mana Overflow, Mana Tap, Mana Surge, Mana Spring
import { createPerk } from './utils';
import type { SkillTierDef } from '../types';
// ─── MANA OVERFLOW TALENT TREE ───────────────────────────────────────────────
// Base: Increases Mana from Clicks
// Paths: A = The Basin (Capacity), B = The Fountain (Regen), C = The Battery (Spell Damage)
export const MANA_OVERFLOW_TIERS: SkillTierDef[] = [
// TIER 1
{
tier: 1,
skillId: 'manaOverflow',
name: 'Mana Overflow',
multiplier: 1,
l5Perks: [
createPerk('mo_t1_l5_a', 'Overflow Basin', '+25% Mana from clicks', 'A',
{ type: 'multiplier', stat: 'clickMana', value: 0.25 }, false, 1.5, 5),
createPerk('mo_t1_l5_b', 'Rushing Fountain', '+10% Regen', 'B',
{ type: 'multiplier', stat: 'regen', value: 0.10 }, false, 1.5, 5),
createPerk('mo_t1_l5_c', 'Spark Charge', '+5% Spell Damage', 'C',
{ type: 'multiplier', stat: 'spellDamage', value: 0.05 }, false, 1.5, 5),
],
l10Perks: [
createPerk('mo_t1_l10_a', 'Greater Basin', '+35% Mana from clicks', 'A',
{ type: 'multiplier', stat: 'clickMana', value: 0.35 }, false, 2.0, 10),
createPerk('mo_t1_l10_b', 'Flowing Spring', '+15% Regen', 'B',
{ type: 'multiplier', stat: 'regen', value: 0.15 }, false, 2.0, 10),
createPerk('mo_t1_l10_c', 'Charged Power', '+10% Spell Damage', 'C',
{ type: 'multiplier', stat: 'spellDamage', value: 0.10 }, false, 2.0, 10),
],
},
// TIER 2
{
tier: 2,
skillId: 'manaOverflow_t2',
name: 'Greater Overflow',
multiplier: 10,
l5Perks: [
createPerk('mo_t2_l5_a', 'Vast Basin', '+50% Mana from clicks', 'A',
{ type: 'multiplier', stat: 'clickMana', value: 0.50 }, false, 2.0, 5),
createPerk('mo_t2_l5_b', 'Tidal Spring', 'Regen cannot drop below 80% of base', 'B',
{ type: 'special', specialId: 'tidalSpring', specialDesc: 'Regen floor at 80%' }, false, 2.0, 5),
createPerk('mo_t2_l5_c', 'Capacitor Charge', 'Spells cost 5% less mana per 1000 max mana', 'C',
{ type: 'special', specialId: 'capacitorCharge', specialDesc: 'Capacity reduces spell cost' }, false, 2.0, 5),
],
l10Perks: [
createPerk('mo_t2_l10_a', 'Infinite Basin', '+75% Mana from clicks', 'A',
{ type: 'multiplier', stat: 'clickMana', value: 0.75 }, false, 2.5, 10),
createPerk('mo_t2_l10_b', 'Eternal Spring', '+25% Regen', 'B',
{ type: 'multiplier', stat: 'regen', value: 0.25 }, false, 2.5, 10),
createPerk('mo_t2_l10_c', 'Powered Surge', '+15% Spell Damage', 'C',
{ type: 'multiplier', stat: 'spellDamage', value: 0.15 }, false, 2.5, 10),
],
},
];
// ─── MANA TAP ─────────────────────────────────────────────────────────────
export const MANA_TAP_TIERS: SkillTierDef[] = [
{
tier: 1,
skillId: 'manaTap',
name: 'Mana Tap',
multiplier: 1,
l5Perks: [
createPerk('mt_t1_l5_a', 'Basic Tap', '+1 mana/click', 'A',
{ type: 'multiplier', stat: 'clickMana', value: 1 }, false, 1.5, 5),
createPerk('mt_t1_l5_b', 'Swift Tap', '+10% click speed', 'B',
{ type: 'multiplier', stat: 'clickSpeed', value: 0.10 }, false, 1.5, 5),
createPerk('mt_t1_l5_c', 'Dual Tap', '2x mana per click, but 10% slower', 'C',
{ type: 'special', specialId: 'dualTap', specialDesc: '2x mana, 10% slower clicks' }, false, 1.5, 5),
],
l10Perks: [
createPerk('mt_t1_l10_a', 'Better Tap', '+2 mana/click', 'A',
{ type: 'multiplier', stat: 'clickMana', value: 2 }, false, 2.0, 10),
createPerk('mt_t1_l10_b', 'Rapid Tap', '+15% click speed', 'B',
{ type: 'multiplier', stat: 'clickSpeed', value: 0.15 }, false, 2.0, 10),
createPerk('mt_t1_l10_c', 'Triple Tap', '3x mana per click, but 20% slower', 'C',
{ type: 'special', specialId: 'tripleTap', specialDesc: '3x mana, 20% slower clicks' }, false, 2.0, 10),
],
},
];
// ─── MANA SURGE ──────────────────────────────────────────────────────────
export const MANA_SURGE_TIERS: SkillTierDef[] = [
{
tier: 1,
skillId: 'manaSurge',
name: 'Mana Surge',
multiplier: 1,
l5Perks: [
createPerk('ms_t1_l5_a', 'Basic Surge', '+3 mana/click', 'A',
{ type: 'multiplier', stat: 'clickMana', value: 3 }, false, 1.5, 5),
createPerk('ms_t1_l5_b', 'Charged Surge', '+10% mana from surges', 'B',
{ type: 'multiplier', stat: 'surgePower', value: 0.10 }, false, 1.5, 5),
createPerk('ms_t1_l5_c', 'Chain Surge', 'Surges have 10% chance to trigger twice', 'C',
{ type: 'special', specialId: 'chainSurge', specialDesc: '10% chance double surge' }, false, 1.5, 5),
],
l10Perks: [
createPerk('ms_t1_l10_a', 'Greater Surge', '+5 mana/click', 'A',
{ type: 'multiplier', stat: 'clickMana', value: 5 }, false, 2.0, 10),
createPerk('ms_t1_l10_b', 'Powerful Surge', '+15% mana from surges', 'B',
{ type: 'multiplier', stat: 'surgePower', value: 0.15 }, false, 2.0, 10),
createPerk('ms_t1_l10_c', 'Mega Surge', 'Surges have 20% chance to trigger twice', 'C',
{ type: 'special', specialId: 'megaSurge', specialDesc: '20% chance double surge' }, false, 2.0, 10),
],
},
];
// ─── MANA SPRING ─────────────────────────────────────────────────────────
export const MANA_SPRING_TIERS: SkillTierDef[] = [
{
tier: 1,
skillId: 'manaSpring',
name: 'Mana Spring',
multiplier: 1,
l5Perks: [
createPerk('msp_t1_l5_a', 'Basic Spring', '+2 mana regen', 'A',
{ type: 'multiplier', stat: 'regen', value: 2 }, false, 1.5, 5),
createPerk('msp_t1_l5_b', 'Pure Spring', '+10% regen quality', 'B',
{ type: 'multiplier', stat: 'regenQuality', value: 0.10 }, false, 1.5, 5),
createPerk('msp_t1_l5_c', 'Gushing Spring', 'Regen is 10% more effective below 50% mana', 'C',
{ type: 'special', specialId: 'gushingSpring', specialDesc: 'Better regen at low mana' }, false, 1.5, 5),
],
l10Perks: [
createPerk('msp_t1_l10_a', 'Greater Spring', '+3 mana regen', 'A',
{ type: 'multiplier', stat: 'regen', value: 3 }, false, 2.0, 10),
createPerk('msp_t1_l10_b', 'Perfect Spring', '+15% regen quality', 'B',
{ type: 'multiplier', stat: 'regenQuality', value: 0.15 }, false, 2.0, 10),
createPerk('msp_t1_l10_c', 'Flooding Spring', 'Regen is 20% more effective below 50% mana', 'C',
{ type: 'special', specialId: 'floodingSpring', specialDesc: '20% better regen at low mana' }, false, 2.0, 10),
],
},
];
@@ -1,250 +0,0 @@
// ─── Mana Well & Mana Flow Skill Tier Definitions ──────────────────────────────
// Mana Well: Increases Max Mana
// Mana Flow: Increases Mana Regen
import { createPerk } from './utils';
import type { SkillTierDef } from '../types';
// ─── MANA WELL TALENT TREE ────────────────────────────────────────────────────
// Base: Increases Max Mana
// Paths: A = The Reservoir (Capacity), B = The Filter (Regen), C = The Battery (Spell Damage)
export const MANA_WELL_TIERS: SkillTierDef[] = [
// TIER 1
{
tier: 1,
skillId: 'manaWell',
name: 'Mana Well',
multiplier: 1,
l5Perks: [
createPerk('mw_t1_l5_a', 'Deep Basin', '+20% Max Mana', 'A',
{ type: 'multiplier', stat: 'maxMana', value: 1.20 }, false, 1.5, 5),
createPerk('mw_t1_l5_b', 'Pure Stream', '+10% Regen', 'B',
{ type: 'multiplier', stat: 'regen', value: 1.10 }, false, 1.5, 5),
createPerk('mw_t1_l5_c', 'Spark Gap', '+5% Spell Damage', 'C',
{ type: 'multiplier', stat: 'spellDamage', value: 1.05 }, false, 1.5, 5),
],
l10Perks: [
createPerk('mw_t1_l10_a', 'Expanded Volume', '+30% Max Mana', 'A',
{ type: 'multiplier', stat: 'maxMana', value: 1.30 }, false, 2.0, 10),
createPerk('mw_t1_l10_b', 'Rapid Flow', '+15% Regen', 'B',
{ type: 'multiplier', stat: 'regen', value: 1.15 }, false, 2.0, 10),
createPerk('mw_t1_l10_c', 'Overcharge', '+10% Spell Damage', 'C',
{ type: 'multiplier', stat: 'spellDamage', value: 1.10 }, false, 2.0, 10),
],
},
// TIER 2
{
tier: 2,
skillId: 'manaWell_t2',
name: 'Deep Reservoir',
multiplier: 10,
l5Perks: [
createPerk('mw_t2_l5_a', 'Pressure Valve', 'Mana Capacity also increases Regen by 2% of total.', 'A',
{ type: 'special', specialId: 'pressureValve', specialDesc: 'Capacity grants 2% of total as regen' }, false, 2.0, 5),
createPerk('mw_t2_l5_b', 'Fine Mesh', 'Regen is 20% more effective while below 25% Mana.', 'B',
{ type: 'special', specialId: 'fineMesh', specialDesc: 'Low mana boosts regen effectiveness' }, false, 2.0, 5),
createPerk('mw_t2_l5_c', 'Stored Potential', '+1% Crit chance per 1000 Max Mana.', 'C',
{ type: 'special', specialId: 'storedPotential', specialDesc: 'Capacity grants crit chance' }, false, 2.0, 5),
],
l10Perks: [
createPerk('mw_t2_l10_a', 'Oceanic Reach', '+50% Max Mana.', 'A',
{ type: 'multiplier', stat: 'maxMana', value: 1.50 }, false, 2.5, 10),
createPerk('mw_t2_l10_b', 'Unstoppable Current', 'Regen cannot be reduced below 50% of base by Incursion.', 'B',
{ type: 'special', specialId: 'unstoppableCurrent', specialDesc: 'Regen floor at 50% base' }, false, 2.5, 10),
createPerk('mw_t2_l10_c', 'Discharge', 'Expending 50% of your tank in one spell triples its power.', 'C',
{ type: 'special', specialId: 'discharge', specialDesc: 'Big spells get 3x power' }, false, 2.5, 10),
],
},
// TIER 3
{
tier: 3,
skillId: 'manaWell_t3',
name: 'Abyssal Pool',
multiplier: 100,
l5Perks: [
createPerk('mw_t3_l5_a', 'Abyssal Depth', 'Max Mana bonus from all sources increased by 1.5x.', 'A',
{ type: 'special', specialId: 'abyssalDepth', specialDesc: 'All max mana bonuses multiplied by 1.5x' }, false, 3.0, 5),
createPerk('mw_t3_l5_b', 'Osmosis', 'Passive mana gain based on current floor height.', 'B',
{ type: 'special', specialId: 'osmosis', specialDesc: 'Floor-based passive mana gain' }, false, 3.0, 5),
createPerk('mw_t3_l5_c', 'Capacitor', 'Spells cost 0 mana if your tank is above 90%.', 'C',
{ type: 'special', specialId: 'capacitor', specialDesc: 'Free spells at high mana' }, false, 3.0, 5),
],
l10Perks: [
createPerk('mw_t3_l10_a', '[ELITE] SINGULARITY', 'Max Mana is doubled, but Regen is halved.', 'A',
{ type: 'special', specialId: 'singularity', specialDesc: '2x max mana, 0.5x regen' }, true, 5.0, 10),
createPerk('mw_t3_l10_b', '[ELITE] PERPETUALITY', 'Incursion penalties no longer affect this skill\'s Regen bonuses.', 'B',
{ type: 'special', specialId: 'perpetuity', specialDesc: 'Immune to incursion penalties' }, true, 5.0, 10),
createPerk('mw_t3_l10_c', '[ELITE] RESONANCE', 'Weapon enchantments scale 1:1 with your current Max Mana.', 'C',
{ type: 'special', specialId: 'resonance', specialDesc: 'Enchantments scale with max mana' }, true, 5.0, 10),
],
},
// TIER 4
{
tier: 4,
skillId: 'manaWell_t4',
name: 'Ocean of Power',
multiplier: 1000,
l5Perks: [
createPerk('mw_t4_l5_a', 'Grand Reservoir', '+100% Max Mana.', 'A',
{ type: 'multiplier', stat: 'maxMana', value: 1.0 }, false, 4.0, 5),
createPerk('mw_t4_l5_b', 'Tidal Force', 'Every 60 seconds, instantly restore 10% Mana.', 'B',
{ type: 'special', specialId: 'tidalForce', specialDesc: 'Periodic 10% mana restore' }, false, 4.0, 5),
createPerk('mw_t4_l5_c', 'Voltage Spike', '+50% Enchantment potency.', 'C',
{ type: 'multiplier', stat: 'enchantPotency', value: 0.50 }, false, 4.0, 5),
],
l10Perks: [
createPerk('mw_t4_l10_a', 'Pressure Mastery', 'Regen bonus from Capacity (T2 L5) is doubled.', 'A',
{ type: 'special', specialId: 'pressureMastery', specialDesc: 'Doubles T2 L5 regen bonus' }, false, 5.0, 10),
createPerk('mw_t4_l10_b', 'Floodgates', 'While at 0 Mana, gain a 5x Regen boost for 10 seconds.', 'B',
{ type: 'special', specialId: 'floodgates', specialDesc: '5x regen at empty mana' }, false, 5.0, 10),
createPerk('mw_t4_l10_c', 'Arc Flash', 'Enchanted weapons have a 20% chance to not consume mana.', 'C',
{ type: 'special', specialId: 'arcFlash', specialDesc: '20% chance free weapon enchant' }, false, 5.0, 10),
],
},
// TIER 5
{
tier: 5,
skillId: 'manaWell_t5',
name: 'Infinite Reservoir',
multiplier: 10000,
l5Perks: [
createPerk('mw_t5_l5_a', 'Void Vessel', '+200% Max Mana.', 'A',
{ type: 'multiplier', stat: 'maxMana', value: 2.0 }, false, 5.0, 5),
createPerk('mw_t5_l5_b', 'Aetheric Breath', 'Regen is calculated based on Max Mana instead of Base.', 'B',
{ type: 'special', specialId: 'aethericBreath', specialDesc: 'Regen based on max mana' }, false, 5.0, 5),
createPerk('mw_t5_l5_c', 'God-Slayer Logic', 'Critical hits grant 1% permanent (this loop) Spell Power.', 'C',
{ type: 'special', specialId: 'godSlayerLogic', specialDesc: 'Crits grant permanent spell power' }, false, 5.0, 5),
],
l10Perks: [
createPerk('mw_t5_l10_a', '[ELITE] ASCENSION', 'Your Max Mana becomes infinite for the first 5 minutes of every Floor.', 'A',
{ type: 'special', specialId: 'ascension', specialDesc: 'Infinite mana at floor start' }, true, 10.0, 10),
createPerk('mw_t5_l10_b', '[ELITE] NIRVANA', 'The Incursion penalty is inverted; the more it should slow you, the faster you regenerate.', 'B',
{ type: 'special', specialId: 'nirvana', specialDesc: 'Incursion inverts to boost regen' }, true, 10.0, 10),
createPerk('mw_t5_l10_c', '[ELITE] OMNIPOTENCE', 'You can equip an additional Enchantment on every weapon slot.', 'C',
{ type: 'special', specialId: 'omnipotence', specialDesc: 'Extra enchantment slot per weapon' }, true, 10.0, 10),
],
},
];
// ─── MANA FLOW TALENT TREE ─────────────────────────────────────────────────────
// Base: Increases Mana Regen
// Paths: A = The River (Raw Regen), B = The Cycle (Regen Scaling), C = The Storm (Burst Regen)
export const MANA_FLOW_TIERS: SkillTierDef[] = [
// TIER 1
{
tier: 1,
skillId: 'manaFlow',
name: 'Mana Flow',
multiplier: 1,
l5Perks: [
createPerk('mf_t1_l5_a', 'Gentle Stream', '+15% Regen', 'A',
{ type: 'multiplier', stat: 'regen', value: 0.15 }, false, 1.5, 5),
createPerk('mf_t1_l5_b', 'Flowing Cycle', 'Regen +1% per 10 max mana', 'B',
{ type: 'special', specialId: 'flowingCycle', specialDesc: 'Scaling regen with max mana' }, false, 1.5, 5),
createPerk('mf_t1_l5_c', 'Sprint Burst', '+50% regen for 10s after casting a spell', 'C',
{ type: 'special', specialId: 'sprintBurst', specialDesc: 'Burst regen after casting' }, false, 1.5, 5),
],
l10Perks: [
createPerk('mf_t1_l10_a', 'Rushing River', '+25% Regen', 'A',
{ type: 'multiplier', stat: 'regen', value: 0.25 }, false, 2.0, 10),
createPerk('mf_t1_l10_b', 'Eddy Current', 'Regen +2% per 10 max mana', 'B',
{ type: 'special', specialId: 'eddyCurrent', specialDesc: 'Enhanced scaling regen' }, false, 2.0, 10),
createPerk('mf_t1_l10_c', 'Monsoon', '+100% regen for 5s after taking damage', 'C',
{ type: 'special', specialId: 'monsoon', specialDesc: 'Defensive regen burst' }, false, 2.0, 10),
],
},
// TIER 2
{
tier: 2,
skillId: 'manaFlow_t2',
name: 'Rushing Stream',
multiplier: 10,
l5Perks: [
createPerk('mf_t2_l5_a', 'River Basin', '+40% Regen', 'A',
{ type: 'multiplier', stat: 'regen', value: 0.40 }, false, 2.0, 5),
createPerk('mf_t2_l5_b', 'Full Spigot', 'Regen cannot drop below 75% of base from any source', 'B',
{ type: 'special', specialId: 'fullSpigot', specialDesc: 'Regen floor at 75%' }, false, 2.0, 5),
createPerk('mf_t2_l5_c', 'Lightning Strike', '3% chance for instant 10% mana restore on regen tick', 'C',
{ type: 'special', specialId: 'lightningStrike', specialDesc: 'Chance instant mana restore' }, false, 2.0, 5),
],
l10Perks: [
createPerk('mf_t2_l10_a', 'Mighty Torrent', '+60% Regen', 'A',
{ type: 'multiplier', stat: 'regen', value: 0.60 }, false, 2.5, 10),
createPerk('mf_t2_l10_b', 'Whirlpool', 'Regen rate doubles when below 50% mana', 'B',
{ type: 'special', specialId: 'whirlpool', specialDesc: 'Low mana doubles regen' }, false, 2.5, 10),
createPerk('mf_t2_l10_c', 'Thunderclap', 'Spells have 10% chance to trigger 50% regen for 3 seconds', 'C',
{ type: 'special', specialId: 'thunderclap', specialDesc: 'Spell-triggered regen' }, false, 2.5, 10),
],
},
// TIER 3
{
tier: 3,
skillId: 'manaFlow_t3',
name: 'Eternal River',
multiplier: 100,
l5Perks: [
createPerk('mf_t3_l5_a', 'Endless Spring', '+80% Regen', 'A',
{ type: 'multiplier', stat: 'regen', value: 0.80 }, false, 3.0, 5),
createPerk('mf_t3_l5_b', 'Siphon Field', 'Regen also restores 1% of max mana every 10 seconds', 'B',
{ type: 'special', specialId: 'siphonField', specialDesc: 'Passive % max mana restore' }, false, 3.0, 5),
createPerk('mf_t3_l5_c', 'Chain Reaction', 'Each spell cast increases regen by 5% for 5 seconds, stacks 5x', 'C',
{ type: 'special', specialId: 'chainReaction', specialDesc: 'Casting builds regen' }, false, 3.0, 5),
],
l10Perks: [
createPerk('mf_t3_l10_a', '[ELITE] ETERNAL FLOW', 'Regen is permanently doubled and cannot be reduced below 100% of base', 'A',
{ type: 'special', specialId: 'eternalFlow', specialDesc: '2x regen, unreducible' }, true, 5.0, 10),
createPerk('mf_t3_l10_b', '[ELITE] MANA HEART', 'Your regen is added to your max mana value for all capacity calculations', 'B',
{ type: 'special', specialId: 'manaHeart', specialDesc: 'Regen counts as capacity' }, true, 5.0, 10),
createPerk('mf_t3_l10_c', '[ELITE] STORM CENTER', 'Every 30 seconds, gain 3 seconds of 5x regen speed', 'C',
{ type: 'special', specialId: 'stormCenter', specialDesc: 'Periodic 5x regen burst' }, true, 5.0, 10),
],
},
// TIER 4
{
tier: 4,
skillId: 'manaFlow_t4',
name: 'Cosmic Torrent',
multiplier: 1000,
l5Perks: [
createPerk('mf_t4_l5_a', 'Galactic Stream', '+150% Regen', 'A',
{ type: 'multiplier', stat: 'regen', value: 1.50 }, false, 4.0, 5),
createPerk('mf_t4_l5_b', 'Nebula', 'Regen provides a shield equal to 10% of regen value', 'B',
{ type: 'special', specialId: 'nebula', specialDesc: 'Regen grants shielding' }, false, 4.0, 5),
createPerk('mf_t4_l5_c', 'Supernova', 'When mana drops below 10%, all regen is tripled for 10 seconds', 'C',
{ type: 'special', specialId: 'supernova', specialDesc: 'Emergency regen tripling' }, false, 4.0, 5),
],
l10Perks: [
createPerk('mf_t4_l10_a', 'Infinite River', '+200% Regen', 'A',
{ type: 'multiplier', stat: 'regen', value: 2.0 }, false, 5.0, 10),
createPerk('mf_t4_l10_b', 'Event Horizon', 'Regen continues for 10 seconds after taking damage', 'B',
{ type: 'special', specialId: 'eventHorizon', specialDesc: 'Regen persists after damage' }, false, 5.0, 10),
createPerk('mf_t4_l10_c', 'Pulsar', 'Every 5th spell cast instantly restores 15% mana', 'C',
{ type: 'special', specialId: 'pulsar', specialDesc: 'Every 5th spell restores mana' }, false, 5.0, 10),
],
},
// TIER 5
{
tier: 5,
skillId: 'manaFlow_t5',
name: 'Infinite Cascade',
multiplier: 10000,
l5Perks: [
createPerk('mf_t5_l5_a', 'Cosmic Flow', '+300% Regen', 'A',
{ type: 'multiplier', stat: 'regen', value: 3.0 }, false, 5.0, 5),
createPerk('mf_t5_l5_b', 'Stellar Wind', 'Regen increases by 1% per second during combat, up to 100%', 'B',
{ type: 'special', specialId: 'stellarWind', specialDesc: 'Combat ramps regen up to 2x' }, false, 5.0, 5),
createPerk('mf_t5_l5_c', 'Quasar', 'Critical hits restore 2% mana instantly', 'C',
{ type: 'special', specialId: 'quasar', specialDesc: 'Crits restore mana' }, false, 5.0, 5),
],
l10Perks: [
createPerk('mf_t5_l10_a', '[ELITE] TRANSCENDENCE', 'Regen is infinite, but max mana is capped at 1000', 'A',
{ type: 'special', specialId: 'transcendence', specialDesc: 'Infinite regen, 1000 max mana cap' }, true, 10.0, 10),
createPerk('mf_t5_l10_b', '[ELITE] EQUILIBRIUM', 'Regen and Max Mana are shared - increasing one decreases the other', 'B',
{ type: 'special', specialId: 'equilibrium', specialDesc: 'Trade regen for capacity or vice versa' }, true, 10.0, 10),
createPerk('mf_t5_l10_c', '[ELITE] OMNIPRESENCE', 'All regen effects apply to all mana types simultaneously', 'C',
{ type: 'special', specialId: 'omnipresence', specialDesc: 'Regen applies to all mana types' }, true, 10.0, 10),
],
},
];
@@ -1,127 +0,0 @@
// ─── Quick Learner Skill Tier Definitions ──────────────────────────────────
// Base: Increases Study Speed
import { createPerk } from './utils';
import type { SkillTierDef } from '../types';
// ─── QUICK LEARNER TALENT TREE ─────────────────────────────────────────────────
// Base: Increases Study Speed
// Paths: A = The Scholar (Study Speed), B = The Strategist (Efficiency), C = The Genius (Instant/Chance)
export const QUICK_LEARNER_TIERS: SkillTierDef[] = [
// TIER 1
{
tier: 1,
skillId: 'quickLearner',
name: 'Quick Learner',
multiplier: 1,
l5Perks: [
createPerk('ql_t1_l5_a', 'Focused Study', '+15% Study Speed', 'A',
{ type: 'multiplier', stat: 'studySpeed', value: 0.15 }, false, 1.5, 5),
createPerk('ql_t1_l5_b', 'Efficient Mind', '-10% Study Mana Cost', 'B',
{ type: 'multiplier', stat: 'studyCost', value: -0.10 }, false, 1.5, 5),
createPerk('ql_t1_l5_c', 'Lucky Break', '5% chance for instant study completion', 'C',
{ type: 'special', specialId: 'luckyBreak', specialDesc: 'Chance for instant study' }, false, 1.5, 5),
],
l10Perks: [
createPerk('ql_t1_l10_a', 'Deep Focus', '+25% Study Speed', 'A',
{ type: 'multiplier', stat: 'studySpeed', value: 0.25 }, false, 2.0, 10),
createPerk('ql_t1_l10_b', 'Thrifty Scholar', '-15% Study Mana Cost', 'B',
{ type: 'multiplier', stat: 'studyCost', value: -0.15 }, false, 2.0, 10),
createPerk('ql_t1_l10_c', 'Eureka Moment', '10% chance for instant study completion', 'C',
{ type: 'special', specialId: 'eurekaMoment', specialDesc: 'Better chance for instant study' }, false, 2.0, 10),
],
},
// TIER 2
{
tier: 2,
skillId: 'quickLearner_t2',
name: 'Swift Scholar',
multiplier: 10,
l5Perks: [
createPerk('ql_t2_l5_a', 'Rapid Learning', '+40% Study Speed', 'A',
{ type: 'multiplier', stat: 'studySpeed', value: 0.40 }, false, 2.0, 5),
createPerk('ql_t2_l5_b', 'Resourceful', 'Study costs reduced by 1% per level of this skill', 'B',
{ type: 'special', specialId: 'resourceful', specialDesc: 'Scaling cost reduction' }, false, 2.0, 5),
createPerk('ql_t2_l5_c', 'Parallel Thoughts', 'Can study 2 items at once at 75% speed each', 'C',
{ type: 'special', specialId: 'parallelThoughts', specialDesc: 'Dual study at 75% speed' }, false, 2.0, 5),
],
l10Perks: [
createPerk('ql_t2_l10_a', 'Accelerated Mind', '+60% Study Speed', 'A',
{ type: 'multiplier', stat: 'studySpeed', value: 0.60 }, false, 2.5, 10),
createPerk('ql_t2_l10_b', 'Frugal', 'Refund 15% mana when study completes', 'B',
{ type: 'special', specialId: 'frugal', specialDesc: 'Mana refund on completion' }, false, 2.5, 10),
createPerk('ql_t2_l10_c', 'Multitasking', 'Can study 3 items at once at 50% speed each', 'C',
{ type: 'special', specialId: 'multitasking', specialDesc: 'Triple study at 50% speed' }, false, 2.5, 10),
],
},
// TIER 3
{
tier: 3,
skillId: 'quickLearner_t3',
name: 'Sage Mind',
multiplier: 100,
l5Perks: [
createPerk('ql_t3_l5_a', 'Brilliant Mind', '+80% Study Speed', 'A',
{ type: 'multiplier', stat: 'studySpeed', value: 0.80 }, false, 3.0, 5),
createPerk('ql_t3_l5_b', 'Mana Siphon', 'Study costs also restore 1% max mana per hour studied', 'B',
{ type: 'special', specialId: 'manaSiphon', specialDesc: 'Study restores mana' }, false, 3.0, 5),
createPerk('ql_t3_l5_c', 'Intuition', '20% chance for instant study completion', 'C',
{ type: 'special', specialId: 'intuition', specialDesc: '20% chance instant study' }, false, 3.0, 5),
],
l10Perks: [
createPerk('ql_t3_l10_a', '[ELITE] ENLIGHTENMENT', 'Study speed is tripled and costs no mana', 'A',
{ type: 'special', specialId: 'enlightenment', specialDesc: '3x speed, free study' }, true, 5.0, 10),
createPerk('ql_t3_l10_b', '[ELITE] KNOWLEDGE VAULT', 'All studied items retain 50% progress when cancelled', 'B',
{ type: 'special', specialId: 'knowledgeVault', specialDesc: '50% progress retained on cancel' }, true, 5.0, 10),
createPerk('ql_t3_l10_c', '[ELITE] EUREKA', 'All study has a 25% chance to complete instantly', 'C',
{ type: 'special', specialId: 'eureka', specialDesc: '25% chance instant study' }, true, 5.0, 10),
],
},
// TIER 4
{
tier: 4,
skillId: 'quickLearner_t4',
name: 'Transcendent Scholar',
multiplier: 1000,
l5Perks: [
createPerk('ql_t4_l5_a', 'Mastermind', '+120% Study Speed', 'A',
{ type: 'multiplier', stat: 'studySpeed', value: 1.20 }, false, 4.0, 5),
createPerk('ql_t4_l5_b', 'Scholar\'s Grace', 'Study grants 1 insight per hour studied', 'B',
{ type: 'special', specialId: 'scholarsGrace', specialDesc: 'Study grants insight' }, false, 4.0, 5),
createPerk('ql_t4_l5_c', 'Genius Strike', '30% chance for instant study completion', 'C',
{ type: 'special', specialId: 'geniusStrike', specialDesc: '30% chance instant study' }, false, 4.0, 5),
],
l10Perks: [
createPerk('ql_t4_l10_a', 'Grand Library', '+150% Study Speed', 'A',
{ type: 'multiplier', stat: 'studySpeed', value: 1.50 }, false, 5.0, 10),
createPerk('ql_t4_l10_b', 'Wisdom', 'Study also increases max mana by 10 per hour', 'B',
{ type: 'special', specialId: 'wisdom', specialDesc: 'Study increases max mana' }, false, 5.0, 10),
createPerk('ql_t4_l10_c', 'Brilliance', '40% chance for instant study completion', 'C',
{ type: 'special', specialId: 'brilliance', specialDesc: '40% chance instant study' }, false, 5.0, 10),
],
},
// TIER 5
{
tier: 5,
skillId: 'quickLearner_t5',
name: 'Omniscient',
multiplier: 10000,
l5Perks: [
createPerk('ql_t5_l5_a', 'Cosmic Knowledge', '+200% Study Speed', 'A',
{ type: 'multiplier', stat: 'studySpeed', value: 2.0 }, false, 5.0, 5),
createPerk('ql_t5_l5_b', 'Universal Truth', 'All skills/spells start at 25% progress', 'B',
{ type: 'special', specialId: 'universalTruth', specialDesc: 'All new study starts at 25%' }, false, 5.0, 5),
createPerk('ql_t5_l5_c', 'Divine Insight', '50% chance for instant study completion', 'C',
{ type: 'special', specialId: 'divineInsight', specialDesc: '50% chance instant study' }, false, 5.0, 5),
],
l10Perks: [
createPerk('ql_t5_l10_a', '[ELITE] OMNISCIENCE', 'All study completes instantly and costs no mana', 'A',
{ type: 'special', specialId: 'omniscience', specialDesc: 'Instant, free study' }, true, 10.0, 10),
createPerk('ql_t5_l10_b', '[ELITE] ARCHIVE', 'Study progress is permanent across all loops', 'B',
{ type: 'special', specialId: 'archive', specialDesc: 'Study progress never resets' }, true, 10.0, 10),
createPerk('ql_t5_l10_c', '[ELITE] INFINITE WISDOM', 'All study has 100% chance to complete instantly', 'C',
{ type: 'special', specialId: 'infiniteWisdom', specialDesc: 'Always instant study' }, true, 10.0, 10),
],
},
];
@@ -1,16 +0,0 @@
// ─── Type Re-exports ─────────────────────────────────────────────────────────
// Re-export types from the main types file for convenience
export type {
SkillPerkChoice,
SkillTierDef,
SkillEvolutionPath,
SkillUpgradeEffect,
SkillUpgradeDef,
} from '../types';
// Additional types used by skill evolution
export interface CanTierUpResult {
canTierUp: boolean;
reason?: string;
}
@@ -1,29 +0,0 @@
// ─── Helper Functions for Skill Evolution ───────────────────────────────────
import type { SkillPerkChoice, SkillUpgradeDef, SkillUpgradeEffect } from '../types';
// ─── Helper to create perk choices ──────────────────────────────────────────────
export function createPerk(
id: string,
name: string,
desc: string,
path: 'A' | 'B' | 'C',
effect: SkillUpgradeEffect,
isElite: boolean = false,
pathCompoundBonus?: number,
milestone?: 5 | 10
): SkillPerkChoice & { milestone?: 5 | 10 } {
return { id, name, desc, path, effect, isElite, pathCompoundBonus, milestone };
}
// ─── Helper to create upgrade definitions (for test compatibility) ─────────────
export function createUpgrade(
id: string,
name: string,
desc: string,
skillId: string,
milestone: 5 | 10,
effect: SkillUpgradeEffect
): SkillUpgradeDef {
return { id, name, desc, skillId, milestone, effect };
}
-24
View File
@@ -1,24 +0,0 @@
// ─── Skill Evolution System ───────────────────────────────────────────────────────
// NEW ARCHITECTURE: 5-Tier Continuous Talent Tree
//
// Every skill with max level 10 follows this "Talent Tree" structure:
// - 5 Tiers (T1-T5) of mastery
// - Milestone Choices: Player chooses 1 of 3 perks at Level 5 and Level 10 of EVERY Tier
// - Total Milestones: A fully mastered Tier 5 skill has 10 unique perk choices active
// - Compounding Paths: Perks belong to "Paths" (A, B, C columns)
// - Elite Perks: At T3 L10 and T5 L10, choices are "Elite Perks" (game-changing)
//
// This file is now a re-export wrapper from the modularized skill-evolution-modules.
// The actual implementation has been split into:
// - types.ts: Type definitions
// - utils.ts: Helper functions (createPerk, createUpgrade)
// - magic-skills.ts: Mana Well, Mana Flow, Elemental Attunement, Mana Overflow, etc.
// - learning-skills.ts: Quick Learner, Focused Mind, Knowledge Retention, Insight Harvest
// - enchanting-skills.ts: Enchanting, Enchant Speed, Efficient Enchant
// - invocation-skills.ts: Invocation, Pact Mastery
// - guardian-skills.ts: Guardian Bane
// - hybrid-skills.ts: Pact-Weaving, Guardian Constructs, Enchanted Golemancy
// - index.ts: Main entry point with SKILL_EVOLUTION_PATHS and helper functions
// Re-export everything from the modularized structure
export * from './skill-evolution-modules';
-343
View File
@@ -1,343 +0,0 @@
// ─── Skill Store ──────────────────────────────────────────────────────────────
// Handles skills, upgrades, tiers, and study progress
import { create } from 'zustand';
import { persist } from 'zustand/middleware';
import { SKILLS_DEF, getStudySpeedMultiplier, getStudyCostMultiplier } from '../constants';
import type { StudyTarget, SkillUpgradeChoice } from '../types';
import { SKILL_EVOLUTION_PATHS, getBaseSkillId } from '../skill-evolution';
import { useCombatStore } from './combatStore';
import { useManaStore } from './manaStore';
export interface SkillState {
// Skills
skills: Record<string, number>;
skillProgress: Record<string, number>; // Saved study progress for skills
skillUpgrades: Record<string, string[]>; // Selected upgrade IDs per skill
skillTiers: Record<string, number>; // Current tier for each base skill
paidStudySkills: Record<string, number>; // skillId -> level that was paid for
// Study
currentStudyTarget: StudyTarget | null;
parallelStudyTarget: StudyTarget | null;
// Actions - Skills
setSkillLevel: (skillId: string, level: number) => void;
incrementSkillLevel: (skillId: string) => void;
clearPaidStudySkill: (skillId: string) => void;
setPaidStudySkill: (skillId: string, level: number) => void;
// Actions - Study
startStudyingSkill: (skillId: string, rawMana: number) => { started: boolean; cost: number };
startStudyingSpell: (spellId: string, rawMana: number, studyTime: number) => { started: boolean; cost: number };
updateStudyProgress: (progressGain: number) => { completed: boolean; target: StudyTarget | null };
cancelStudy: (retentionBonus: number) => void;
setStudyTarget: (target: StudyTarget | null) => void;
setCurrentStudyTarget: (target: StudyTarget | null) => void;
// Actions - Upgrades
selectSkillUpgrade: (skillId: string, upgradeId: string) => void;
deselectSkillUpgrade: (skillId: string, upgradeId: string) => void;
commitSkillUpgrades: (skillId: string, upgradeIds: string[]) => void;
tierUpSkill: (skillId: string) => void;
// Computed
getSkillUpgradeChoices: (skillId: string, milestone: 5 | 10) => { available: SkillUpgradeChoice[]; selected: string[] };
// Reset
resetSkills: (
skills?: Record<string, number>,
skillUpgrades?: Record<string, string[]>,
skillTiers?: Record<string, number>
) => void;
}
export const useSkillStore = create<SkillState>()(
persist(
(set, get) => ({
skills: {},
skillProgress: {},
skillUpgrades: {},
skillTiers: {},
paidStudySkills: {},
currentStudyTarget: null,
parallelStudyTarget: null,
setSkillLevel: (skillId: string, level: number) => {
set((state) => ({
skills: { ...state.skills, [skillId]: level },
}));
},
incrementSkillLevel: (skillId: string) => {
set((state) => ({
skills: { ...state.skills, [skillId]: (state.skills[skillId] || 0) + 1 },
skillProgress: { ...state.skillProgress, [skillId]: 0 },
}));
},
clearPaidStudySkill: (skillId: string) => {
set((state) => {
const { [skillId]: _, ...remaining } = state.paidStudySkills;
return { paidStudySkills: remaining };
});
},
setPaidStudySkill: (skillId: string, level: number) => {
set((state) => ({
paidStudySkills: { ...state.paidStudySkills, [skillId]: level },
}));
},
startStudyingSkill: (skillId: string, rawMana: number) => {
const state = get();
const sk = SKILLS_DEF[skillId];
if (!sk) return { started: false, cost: 0 };
const currentLevel = state.skills[skillId] || 0;
if (currentLevel >= sk.max) return { started: false, cost: 0 };
// Check prerequisites
if (sk.req) {
for (const [r, rl] of Object.entries(sk.req)) {
if ((state.skills[r] || 0) < rl) return { started: false, cost: 0 };
}
}
// Check if already paid for this level
const paidForLevel = state.paidStudySkills[skillId];
const isAlreadyPaid = paidForLevel === currentLevel;
// Calculate cost
const costMult = getStudyCostMultiplier(state.skills);
const cost = Math.floor(sk.base * (currentLevel + 1) * costMult);
if (!isAlreadyPaid && rawMana < cost) return { started: false, cost };
// Get saved progress
const savedProgress = state.skillProgress[skillId] || 0;
// Mark as paid (this is done here so resume works for free)
const newPaidSkills = isAlreadyPaid
? state.paidStudySkills
: { ...state.paidStudySkills, [skillId]: currentLevel };
// Start studying
set({
paidStudySkills: newPaidSkills,
currentStudyTarget: {
type: 'skill',
id: skillId,
progress: savedProgress,
required: sk.studyTime,
},
});
useCombatStore.getState().setAction('study');
if (!isAlreadyPaid && cost > 0) {
useManaStore.getState().spendRawMana(cost);
}
return { started: true, cost: isAlreadyPaid ? 0 : cost };
},
startStudyingSpell: (spellId: string, rawMana: number, studyTime: number) => {
const state = get();
// Start studying the spell
set({
currentStudyTarget: {
type: 'spell',
id: spellId,
progress: 0,
required: studyTime,
},
});
useCombatStore.getState().setAction('study');
// Spell study has no mana cost upfront - cost is paid via study time
return { started: true, cost: 0 };
},
updateStudyProgress: (progressGain: number) => {
const state = get();
if (!state.currentStudyTarget) return { completed: false, target: null };
const newProgress = state.currentStudyTarget.progress + progressGain;
const completed = newProgress >= state.currentStudyTarget.required;
const newTarget = completed ? null : {
...state.currentStudyTarget,
progress: newProgress,
};
set({ currentStudyTarget: newTarget });
return {
completed,
target: completed ? state.currentStudyTarget : null
};
},
cancelStudy: (retentionBonus: number) => {
const state = get();
if (!state.currentStudyTarget) return;
// Save progress with retention bonus
const savedProgress = Math.min(
state.currentStudyTarget.progress,
state.currentStudyTarget.required * retentionBonus
);
if (state.currentStudyTarget.type === 'skill') {
set({
currentStudyTarget: null,
skillProgress: {
...state.skillProgress,
[state.currentStudyTarget.id]: savedProgress,
},
});
} else {
set({ currentStudyTarget: null });
}
},
setStudyTarget: (target: StudyTarget | null) => {
set({ currentStudyTarget: target });
},
setCurrentStudyTarget: (target: StudyTarget | null) => {
set({ currentStudyTarget: target });
},
selectSkillUpgrade: (skillId: string, upgradeId: string) => {
set((state) => {
const current = state.skillUpgrades?.[skillId] || [];
if (current.includes(upgradeId)) return state;
if (current.length >= 2) return state; // Max 2 upgrades per milestone
return {
skillUpgrades: {
...state.skillUpgrades,
[skillId]: [...current, upgradeId],
},
};
});
},
deselectSkillUpgrade: (skillId: string, upgradeId: string) => {
set((state) => {
const current = state.skillUpgrades?.[skillId] || [];
return {
skillUpgrades: {
...state.skillUpgrades,
[skillId]: current.filter(id => id !== upgradeId),
},
};
});
},
commitSkillUpgrades: (skillId: string, upgradeIds: string[]) => {
set((state) => {
// Determine which milestone we're committing
const isL5 = upgradeIds.some(id => id.includes('_l5'));
const isL10 = upgradeIds.some(id => id.includes('_l10'));
const existingUpgrades = state.skillUpgrades?.[skillId] || [];
let preservedUpgrades: string[];
if (isL5) {
preservedUpgrades = existingUpgrades.filter(id => id.includes('_l10'));
} else if (isL10) {
preservedUpgrades = existingUpgrades.filter(id => id.includes('_l5'));
} else {
preservedUpgrades = [];
}
const mergedUpgrades = [...preservedUpgrades, ...upgradeIds];
return {
skillUpgrades: {
...state.skillUpgrades,
[skillId]: mergedUpgrades,
},
};
});
},
tierUpSkill: (skillId: string) => {
const state = get();
const baseSkillId = skillId.includes('_t') ? skillId.split('_t')[0] : skillId;
const currentTier = state.skillTiers?.[baseSkillId] || 1;
const nextTier = currentTier + 1;
if (nextTier > 5) return;
const nextTierSkillId = `${baseSkillId}_t${nextTier}`;
const currentLevel = state.skills[skillId] || 0;
set({
skillTiers: {
...state.skillTiers,
[baseSkillId]: nextTier,
},
skills: {
...state.skills,
[nextTierSkillId]: currentLevel,
[skillId]: 0,
},
skillUpgrades: {
...state.skillUpgrades,
[nextTierSkillId]: [],
},
});
},
getSkillUpgradeChoices: (skillId: string, milestone: 5 | 10) => {
const state = get();
const baseSkillId = getBaseSkillId(skillId);
const tier = state.skillTiers?.[baseSkillId] || 1;
const path = SKILL_EVOLUTION_PATHS[baseSkillId];
if (!path) return { available: [], selected: [] };
const tierDef = path.tiers.find(t => t.tier === tier);
if (!tierDef) return { available: [], selected: [] };
const available = tierDef.upgrades.filter(u => u.milestone === milestone);
const selected = state.skillUpgrades?.[skillId]?.filter(id =>
available.some(u => u.id === id)
) || [];
return { available, selected };
},
resetSkills: (
skills: Record<string, number> = {},
skillUpgrades: Record<string, string[]> = {},
skillTiers: Record<string, number> = {}
) => {
set({
skills,
skillProgress: {},
skillUpgrades,
skillTiers,
paidStudySkills: {},
currentStudyTarget: null,
parallelStudyTarget: null,
});
},
}),
{
name: 'mana-loop-skills',
partialize: (state) => ({
skills: state.skills,
skillProgress: state.skillProgress,
skillUpgrades: state.skillUpgrades,
skillTiers: state.skillTiers,
paidStudySkills: state.paidStudySkills,
}),
}
)
);