Remove all skill system files - preparing for fresh design phase
Build and Publish Mana Loop Docker Image / build-and-publish (push) Failing after 32s
Build and Publish Mana Loop Docker Image / build-and-publish (push) Failing after 32s
This commit is contained in:
@@ -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>
|
||||
);
|
||||
}
|
||||
@@ -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 };
|
||||
}
|
||||
@@ -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';
|
||||
@@ -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,
|
||||
}),
|
||||
}
|
||||
)
|
||||
);
|
||||
Reference in New Issue
Block a user