feat: split skills-v2-defs into category modules and fix export
Build and Publish Mana Loop Docker Image / build-and-publish (push) Failing after 35s

- Split 636-line skills-v2-defs.ts into 9 category files (all under 400 lines)
- Add skills-v2-registry.ts to build SKILLS_V2 flat record from modules
- Fix missing re-export of SKILLS_V2 from skills-v2.ts
- Fix clickMana clamping: remove Math.round to allow fractional values
- Fix golemDuration clamping: remove Math.round to allow fractional values
- Fix guardianConstructs effect: duration uses 'add' mode instead of 'multiply'
- All 70 existing tests pass
This commit is contained in:
2026-05-12 11:28:44 +02:00
parent 70ec32bd4e
commit b0eea7dadd
15 changed files with 1451 additions and 2 deletions
+16 -1
View File
@@ -20,7 +20,8 @@ Mana-Loop/
│ ├── tasks/ │ ├── tasks/
│ │ ├── TASK-001-playwright-setup.md │ │ ├── TASK-001-playwright-setup.md
│ │ ├── TASK-005-globals-css-tokens.md │ │ ├── TASK-005-globals-css-tokens.md
│ │ ── TASK-006-left-panel-redesign.md │ │ ── TASK-006-left-panel-redesign.md
│ │ └── TASK-007-skill-system-v2.md
│ ├── GAME_BRIEFING.md │ ├── GAME_BRIEFING.md
│ ├── active-task-log.md │ ├── active-task-log.md
│ ├── circular-deps.txt │ ├── circular-deps.txt
@@ -274,6 +275,19 @@ Mana-Loop/
│ │ │ ├── index.ts │ │ │ ├── index.ts
│ │ │ ├── prestige.ts │ │ │ ├── prestige.ts
│ │ │ ├── rooms.ts │ │ │ ├── rooms.ts
│ │ │ ├── skills-combat.ts
│ │ │ ├── skills-core.ts
│ │ │ ├── skills-crafting.ts
│ │ │ ├── skills-element-caps.ts
│ │ │ ├── skills-enchant.ts
│ │ │ ├── skills-golemancy.ts
│ │ │ ├── skills-hybrid.ts
│ │ │ ├── skills-invocation.ts
│ │ │ ├── skills-research.ts
│ │ │ ├── skills-v2-defs.ts
│ │ │ ├── skills-v2-registry.ts
│ │ │ ├── skills-v2-types.ts
│ │ │ ├── skills-v2.ts
│ │ │ ├── skills.ts │ │ │ ├── skills.ts
│ │ │ └── spells.ts │ │ │ └── spells.ts
│ │ ├── crafting-actions/ │ │ ├── crafting-actions/
@@ -434,6 +448,7 @@ Mana-Loop/
│ │ │ │ │ ├── spell-definitions.test.ts │ │ │ │ │ ├── spell-definitions.test.ts
│ │ │ │ │ └── study-speed.test.ts │ │ │ │ │ └── study-speed.test.ts
│ │ │ │ ├── ui-store-tests/ │ │ │ │ ├── ui-store-tests/
│ │ │ │ ├── computed-stats.test.ts
│ │ │ │ ├── equipment.test.ts │ │ │ │ ├── equipment.test.ts
│ │ │ │ ├── mana-conversion-fix.test.ts │ │ │ │ ├── mana-conversion-fix.test.ts
│ │ │ │ ├── mana.test.ts │ │ │ │ ├── mana.test.ts
+6 -1
View File
@@ -16,9 +16,14 @@ export { GUARDIANS } from './guardians';
// Spell constants // Spell constants
export { SPELLS_DEF } from './spells'; export { SPELLS_DEF } from './spells';
// Skill constants // Skill constants (legacy)
export { SKILLS_DEF, SKILL_CATEGORIES, EFFECT_RESEARCH_MAPPING, BASE_UNLOCKED_EFFECTS, ENCHANTING_UNLOCK_EFFECTS } from './skills'; export { SKILLS_DEF, SKILL_CATEGORIES, EFFECT_RESEARCH_MAPPING, BASE_UNLOCKED_EFFECTS, ENCHANTING_UNLOCK_EFFECTS } from './skills';
// Skill System v2
export { computeStats, BASE_STATS, SKILLS_V2 } from './skills-v2';
export type { ComputedStats, SkillV2Def, SkillEffect, StatKey } from './skills-v2-types';
export { getBaseSkillId, hasPrerequisites } from './skills-v2';
// Prestige constants // Prestige constants
export { PRESTIGE_DEF } from './prestige'; export { PRESTIGE_DEF } from './prestige';
+46
View File
@@ -0,0 +1,46 @@
import type { SkillV2Def } from './skills-v2-types';
// ═══════════════════════════════════════════════════════════════════════
// COMBAT SKILLS
// ═══════════════════════════════════════════════════════════════════════
export const arcaneFury: SkillV2Def = {
id: 'arcaneFury', name: 'Arcane Fury', description: 'Increases spell damage per level',
category: 'combat', maxLevel: 10, costPerLevel: 200, studyHours: 4,
effects: [{ stat: 'damageMultiplier', mode: 'multiply', valuePerLevel: 0.10 }],
};
export const combatTraining: SkillV2Def = {
id: 'combatTraining', name: 'Combat Training', description: 'Base damage bonus per level',
category: 'combat', maxLevel: 10, costPerLevel: 250, studyHours: 5,
effects: [{ stat: 'baseDamage', mode: 'add', valuePerLevel: 5 }],
};
export const precision: SkillV2Def = {
id: 'precision', name: 'Precision', description: '+5% crit chance per level',
category: 'combat', maxLevel: 10, costPerLevel: 300, studyHours: 6,
effects: [{ stat: 'critChance', mode: 'add', valuePerLevel: 0.05 }],
};
export const elementalMastery: SkillV2Def = {
id: 'elementalMastery', name: 'Elemental Mastery', description: '+15% elemental damage per level',
category: 'combat', maxLevel: 10, costPerLevel: 350, studyHours: 6,
effects: [{ stat: 'elementalDamage', mode: 'multiply', valuePerLevel: 0.15 }],
};
export const attackSpeed: SkillV2Def = {
id: 'attackSpeed', name: 'Attack Speed', description: '-10% attack time per level (faster)',
category: 'combat', maxLevel: 5, costPerLevel: 400, studyHours: 6,
effects: [{ stat: 'attackSpeed', mode: 'multiply', valuePerLevel: -0.10 }],
};
export const armorPiercing: SkillV2Def = {
id: 'armorPiercing', name: 'Armor Piercing', description: '+5% armor penetration per level',
category: 'combat', maxLevel: 5, costPerLevel: 400, studyHours: 6,
effects: [{ stat: 'armorPierce', mode: 'add', valuePerLevel: 0.05 }],
};
export const spellDamage: SkillV2Def = {
id: 'spellDamage', name: 'Spell Damage', description: '+5% spell damage per level',
category: 'combat', maxLevel: 10, costPerLevel: 250, studyHours: 5,
effects: [{ stat: 'spellDamage', mode: 'multiply', valuePerLevel: 0.05 }],
};
+86
View File
@@ -0,0 +1,86 @@
import type { SkillV2Def } from './skills-v2-types';
// ═══════════════════════════════════════════════════════════════════════
// CORE MANA SKILLS
// ═══════════════════════════════════════════════════════════════════════
export const manaWell: SkillV2Def = {
id: 'manaWell', name: 'Mana Well', description: 'Increases maximum mana capacity',
category: 'mana', maxLevel: 10, costPerLevel: 100, studyHours: 4,
effects: [{ stat: 'maxMana', mode: 'add', valuePerLevel: 100 }],
};
export const manaFlow: SkillV2Def = {
id: 'manaFlow', name: 'Mana Flow', description: 'Increases mana regeneration rate',
category: 'mana', maxLevel: 10, costPerLevel: 150, studyHours: 5,
effects: [{ stat: 'manaRegen', mode: 'add', valuePerLevel: 1 }],
};
export const manaOverflow: SkillV2Def = {
id: 'manaOverflow', name: 'Mana Overflow', description: 'Increases mana gained from clicks',
category: 'mana', maxLevel: 5, costPerLevel: 400, studyHours: 6,
prerequisites: { manaWell: 3 },
effects: [{ stat: 'clickMana', mode: 'multiply', valuePerLevel: 0.25 }],
};
export const manaTap: SkillV2Def = {
id: 'manaTap', name: 'Mana Tap', description: '+1 mana per click',
category: 'mana', maxLevel: 1, costPerLevel: 300, studyHours: 12,
effects: [{ stat: 'clickMana', mode: 'add', valuePerLevel: 1 }],
};
export const manaSurge: SkillV2Def = {
id: 'manaSurge', name: 'Mana Surge', description: '+3 mana per click',
category: 'mana', maxLevel: 1, costPerLevel: 800, studyHours: 36,
prerequisites: { manaTap: 1 },
effects: [{ stat: 'clickMana', mode: 'add', valuePerLevel: 3 }],
};
export const manaSpring: SkillV2Def = {
id: 'manaSpring', name: 'Mana Spring', description: '+2 mana regen',
category: 'mana', maxLevel: 1, costPerLevel: 600, studyHours: 24,
effects: [{ stat: 'manaRegen', mode: 'add', valuePerLevel: 2 }],
};
// ═══════════════════════════════════════════════════════════════════════
// STUDY SKILLS
// ═══════════════════════════════════════════════════════════════════════
export const quickLearner: SkillV2Def = {
id: 'quickLearner', name: 'Quick Learner', description: 'Increases study speed',
category: 'study', maxLevel: 10, costPerLevel: 250, studyHours: 4,
effects: [{ stat: 'studySpeed', mode: 'multiply', valuePerLevel: 0.10 }],
};
export const focusedMind: SkillV2Def = {
id: 'focusedMind', name: 'Focused Mind', description: 'Reduces study mana cost',
category: 'study', maxLevel: 10, costPerLevel: 300, studyHours: 5,
effects: [{ stat: 'studyCostMult', mode: 'multiply', valuePerLevel: -0.05 }],
};
export const knowledgeRetention: SkillV2Def = {
id: 'knowledgeRetention', name: 'Knowledge Retention', description: 'Preserves study progress on cancellation',
category: 'study', maxLevel: 3, costPerLevel: 350, studyHours: 5,
effects: [{ stat: 'progressRetention', mode: 'add', valuePerLevel: 0.20 }],
};
// ═══════════════════════════════════════════════════════════════════════
// MEDITATION SKILLS
// ═══════════════════════════════════════════════════════════════════════
export const meditation: SkillV2Def = {
id: 'meditation', name: 'Meditation Focus', description: 'Unlocks meditation regen boost (2.5x at 4hrs)',
category: 'mana', maxLevel: 1, costPerLevel: 400, studyHours: 6,
effects: [{ stat: 'meditationEfficiency', mode: 'multiply', valuePerLevel: 1.5 }],
};
export const deepTrance: SkillV2Def = {
id: 'deepTrance', name: 'Deep Trance', description: 'Extends meditation to 6hrs for 3x',
category: 'mana', maxLevel: 1, costPerLevel: 900, studyHours: 48,
prerequisites: { meditation: 1 },
effects: [{ stat: 'meditationEfficiency', mode: 'multiply', valuePerLevel: 1.8 }],
};
export const voidMeditation: SkillV2Def = {
id: 'voidMeditation', name: 'Void Meditation', description: 'Extends meditation to 8hrs for 5x',
category: 'mana', maxLevel: 1, costPerLevel: 1500, studyHours: 72,
prerequisites: { deepTrance: 1 },
effects: [{ stat: 'meditationEfficiency', mode: 'multiply', valuePerLevel: 2.5 }],
};
+16
View File
@@ -0,0 +1,16 @@
import type { SkillV2Def } from './skills-v2-types';
// ═══════════════════════════════════════════════════════════════════════
// CRAFTING SKILLS (Legacy — kept for store compat)
// ═══════════════════════════════════════════════════════════════════════
export const effCrafting: SkillV2Def = {
id: 'effCrafting', name: 'Eff. Crafting', description: '-10% craft time',
category: 'craft', maxLevel: 1, costPerLevel: 300, studyHours: 4,
effects: [{ stat: 'craftSpeed', mode: 'multiply', valuePerLevel: -0.10 }],
};
export const fieldRepair: SkillV2Def = {
id: 'fieldRepair', name: 'Field Repair', description: '+20% repair efficiency',
category: 'craft', maxLevel: 1, costPerLevel: 350, studyHours: 4,
effects: [{ stat: 'repairSpeed', mode: 'multiply', valuePerLevel: -0.10 }],
};
@@ -0,0 +1,70 @@
import type { SkillV2Def } from './skills-v2-types';
// ═══════════════════════════════════════════════════════════════════════
// PER-ELEMENT CAPACITY SKILLS
// ═══════════════════════════════════════════════════════════════════════
export const fireManaCap: SkillV2Def = {
id: 'fireManaCap', name: 'Fire Mana Capacity', description: '+10% fire capacity per level',
category: 'mana', maxLevel: 10, costPerLevel: 200, studyHours: 4,
effects: [{ stat: 'fireCap', mode: 'add', valuePerLevel: 10 }],
};
export const waterManaCap: SkillV2Def = {
id: 'waterManaCap', name: 'Water Mana Capacity', description: '+10% water capacity per level',
category: 'mana', maxLevel: 10, costPerLevel: 200, studyHours: 4,
effects: [{ stat: 'waterCap', mode: 'add', valuePerLevel: 10 }],
};
export const airManaCap: SkillV2Def = {
id: 'airManaCap', name: 'Air Mana Capacity', description: '+10% air capacity per level',
category: 'mana', maxLevel: 10, costPerLevel: 200, studyHours: 4,
effects: [{ stat: 'airCap', mode: 'add', valuePerLevel: 10 }],
};
export const earthManaCap: SkillV2Def = {
id: 'earthManaCap', name: 'Earth Mana Capacity', description: '+10% earth capacity per level',
category: 'mana', maxLevel: 10, costPerLevel: 200, studyHours: 4,
effects: [{ stat: 'earthCap', mode: 'add', valuePerLevel: 10 }],
};
export const lightManaCap: SkillV2Def = {
id: 'lightManaCap', name: 'Light Mana Capacity', description: '+10% light capacity per level',
category: 'mana', maxLevel: 10, costPerLevel: 250, studyHours: 5,
effects: [{ stat: 'lightCap', mode: 'add', valuePerLevel: 10 }],
};
export const darkManaCap: SkillV2Def = {
id: 'darkManaCap', name: 'Dark Mana Capacity', description: '+10% dark capacity per level',
category: 'mana', maxLevel: 10, costPerLevel: 250, studyHours: 5,
effects: [{ stat: 'darkCap', mode: 'add', valuePerLevel: 10 }],
};
export const deathManaCap: SkillV2Def = {
id: 'deathManaCap', name: 'Death Mana Capacity', description: '+10% death capacity per level',
category: 'mana', maxLevel: 10, costPerLevel: 300, studyHours: 6,
effects: [{ stat: 'deathCap', mode: 'add', valuePerLevel: 10 }],
};
export const metalManaCap: SkillV2Def = {
id: 'metalManaCap', name: 'Metal Mana Capacity', description: '+10% metal capacity per level',
category: 'mana', maxLevel: 10, costPerLevel: 350, studyHours: 6,
effects: [{ stat: 'metalCap', mode: 'add', valuePerLevel: 10 }],
};
export const sandManaCap: SkillV2Def = {
id: 'sandManaCap', name: 'Sand Mana Capacity', description: '+10% sand capacity per level',
category: 'mana', maxLevel: 10, costPerLevel: 350, studyHours: 6,
effects: [{ stat: 'sandCap', mode: 'add', valuePerLevel: 10 }],
};
export const lightningManaCap: SkillV2Def = {
id: 'lightningManaCap', name: 'Lightning Mana Capacity', description: '+10% lightning capacity per level',
category: 'mana', maxLevel: 10, costPerLevel: 350, studyHours: 6,
effects: [{ stat: 'lightningCap', mode: 'add', valuePerLevel: 10 }],
};
export const transferenceManaCap: SkillV2Def = {
id: 'transferenceManaCap', name: 'Transference Mana Capacity', description: '+10% transference capacity per level',
category: 'mana', maxLevel: 10, costPerLevel: 200, studyHours: 4,
effects: [{ stat: 'transferenceCap', mode: 'add', valuePerLevel: 10 }],
};
+42
View File
@@ -0,0 +1,42 @@
import type { SkillV2Def } from './skills-v2-types';
// ═══════════════════════════════════════════════════════════════════════
// ENCHANTING SKILLS
// ═══════════════════════════════════════════════════════════════════════
export const enchanting: SkillV2Def = {
id: 'enchanting', name: 'Enchanting', description: 'Unlocks enchantment design',
category: 'enchant', maxLevel: 10, costPerLevel: 200, studyHours: 5,
attunementRequired: 'enchanter',
effects: [
{ stat: 'enchantCapacity', mode: 'add', valuePerLevel: 10 },
{ stat: 'enchantSpeed', mode: 'multiply', valuePerLevel: -0.02 },
],
};
export const efficientEnchant: SkillV2Def = {
id: 'efficientEnchant', name: 'Efficient Enchant', description: 'Reduces capacity cost',
category: 'enchant', maxLevel: 5, costPerLevel: 350, studyHours: 6,
prerequisites: { enchanting: 3 }, attunementRequired: 'enchanter',
effects: [{ stat: 'enchantCapacity', mode: 'multiply', valuePerLevel: -0.05 }],
};
export const enchantSpeed: SkillV2Def = {
id: 'enchantSpeed', name: 'Enchant Speed', description: 'Reduces enchantment time',
category: 'enchant', maxLevel: 5, costPerLevel: 300, studyHours: 4,
prerequisites: { enchanting: 2 }, attunementRequired: 'enchanter',
effects: [{ stat: 'enchantSpeed', mode: 'multiply', valuePerLevel: -0.10 }],
};
export const essenceRefining: SkillV2Def = {
id: 'essenceRefining', name: 'Essence Refining', description: 'Increases enchantment power',
category: 'enchant', maxLevel: 3, costPerLevel: 400, studyHours: 7,
prerequisites: { enchanting: 4 }, attunementRequired: 'enchanter',
effects: [{ stat: 'enchantPower', mode: 'multiply', valuePerLevel: 0.10 }],
};
export const disenchanting: SkillV2Def = {
id: 'disenchanting', name: 'Disenchanting', description: 'Recover mana on removal',
category: 'enchant', maxLevel: 3, costPerLevel: 300, studyHours: 3,
prerequisites: { enchanting: 2 }, attunementRequired: 'enchanter',
effects: [{ stat: 'disenchantRecovery', mode: 'add', valuePerLevel: 0.20 }],
};
@@ -0,0 +1,25 @@
import type { SkillV2Def } from './skills-v2-types';
// ═══════════════════════════════════════════════════════════════════════
// GOLEMANCY SKILLS
// ═══════════════════════════════════════════════════════════════════════
export const golemMastery: SkillV2Def = {
id: 'golemMastery', name: 'Golem Mastery', description: '+10% golem damage per level',
category: 'golemancy', maxLevel: 10, costPerLevel: 300, studyHours: 6,
attunementRequired: 'fabricator',
effects: [{ stat: 'golemDamage', mode: 'multiply', valuePerLevel: 0.10 }],
};
export const golemEfficiency: SkillV2Def = {
id: 'golemEfficiency', name: 'Golem Efficiency', description: '+5% golem attack speed per level',
category: 'golemancy', maxLevel: 10, costPerLevel: 350, studyHours: 6,
attunementRequired: 'fabricator',
effects: [{ stat: 'attackSpeed', mode: 'multiply', valuePerLevel: -0.05 }],
};
export const golemLongevity: SkillV2Def = {
id: 'golemLongevity', name: 'Golem Longevity', description: '+1 floor duration per level',
category: 'golemancy', maxLevel: 10, costPerLevel: 500, studyHours: 8,
attunementRequired: 'fabricator',
effects: [{ stat: 'golemDuration', mode: 'add', valuePerLevel: 1 }],
};
+28
View File
@@ -0,0 +1,28 @@
import type { SkillV2Def } from './skills-v2-types';
// ═══════════════════════════════════════════════════════════════════════
// HYBRID SKILLS (require 2 attunements at level 5+)
// ═══════════════════════════════════════════════════════════════════════
export const pactWeaving: SkillV2Def = {
id: 'pactWeaving', name: 'Pact-Weaving', description: 'Weave guardian essence into enchantments',
category: 'hybrid', maxLevel: 10, costPerLevel: 750, studyHours: 15,
effects: [{ stat: 'enchantPower', mode: 'multiply', valuePerLevel: 0.10 }],
};
export const guardianConstructs: SkillV2Def = {
id: 'guardianConstructs', name: 'Guardian Constructs', description: 'Build durable singular golems',
category: 'hybrid', maxLevel: 10, costPerLevel: 800, studyHours: 18,
effects: [
{ stat: 'golemDamage', mode: 'multiply', valuePerLevel: 0.15 },
{ stat: 'golemDuration', mode: 'add', valuePerLevel: 0.25 },
],
};
export const enchantedGolemancy: SkillV2Def = {
id: 'enchantedGolemancy', name: 'Enchanted Golemancy', description: 'Imbue golems with spell logic',
category: 'hybrid', maxLevel: 10, costPerLevel: 850, studyHours: 20,
effects: [
{ stat: 'enchantPower', mode: 'multiply', valuePerLevel: 0.05 },
{ stat: 'golemDamage', mode: 'multiply', valuePerLevel: 0.10 },
],
};
@@ -0,0 +1,25 @@
import type { SkillV2Def } from './skills-v2-types';
// ═══════════════════════════════════════════════════════════════════════
// INVOCATION / PACT SKILLS (Invoker Attunement)
// ═══════════════════════════════════════════════════════════════════════
export const invocation: SkillV2Def = {
id: 'invocation', name: 'Invocation', description: 'Enhances spell invocation',
category: 'invocation', maxLevel: 10, costPerLevel: 300, studyHours: 6,
attunementRequired: 'invoker',
effects: [{ stat: 'spellDamage', mode: 'multiply', valuePerLevel: 0.05 }],
};
export const pactMastery: SkillV2Def = {
id: 'pactMastery', name: 'Pact Mastery', description: 'Enhances pact signing bonuses',
category: 'pact', maxLevel: 10, costPerLevel: 350, studyHours: 6,
attunementRequired: 'invoker',
effects: [{ stat: 'pactMultiplier', mode: 'multiply', valuePerLevel: 0.10 }],
};
export const guardianLore: SkillV2Def = {
id: 'guardianLore', name: 'Guardian Lore', description: '+20% damage vs guardians',
category: 'invocation', maxLevel: 5, costPerLevel: 400, studyHours: 8,
attunementRequired: 'invoker',
effects: [{ stat: 'guardianDamage', mode: 'multiply', valuePerLevel: 0.20 }],
};
+385
View File
@@ -0,0 +1,385 @@
import type { SkillV2Def } from './skills-v2-types';
// ═══════════════════════════════════════════════════════════════════════
// ELEMENT RESEARCH SKILLS (max:1, long study unlock enchantment effects)
// Kept for store/UI compat; effect unlocks handled via EFFECT_RESEARCH_MAPPING
// ═══════════════════════════════════════════════════════════════════════
export const researchManaSpells: SkillV2Def = {
id: 'researchManaSpells', name: 'Mana Spell Research', description: 'Unlock Mana Strike spell enchantment',
category: 'effectResearch', maxLevel: 1, costPerLevel: 200, studyHours: 4,
effects: [],
};
export const researchFireSpells: SkillV2Def = {
id: 'researchFireSpells', name: 'Fire Spell Research', description: 'Unlock Ember Shot, Fireball spell enchantments',
category: 'effectResearch', maxLevel: 1, costPerLevel: 300, studyHours: 6,
effects: [],
};
export const researchWaterSpells: SkillV2Def = {
id: 'researchWaterSpells', name: 'Water Spell Research', description: 'Unlock Water Jet, Ice Shard spell enchantments',
category: 'effectResearch', maxLevel: 1, costPerLevel: 300, studyHours: 6,
effects: [],
};
export const researchAirSpells: SkillV2Def = {
id: 'researchAirSpells', name: 'Air Spell Research', description: 'Unlock Gust, Wind Slash spell enchantments',
category: 'effectResearch', maxLevel: 1, costPerLevel: 300, studyHours: 6,
effects: [],
};
export const researchEarthSpells: SkillV2Def = {
id: 'researchEarthSpells', name: 'Earth Spell Research', description: 'Unlock Stone Bullet, Rock Spike spell enchantments',
category: 'effectResearch', maxLevel: 1, costPerLevel: 350, studyHours: 6,
effects: [],
};
export const researchLightSpells: SkillV2Def = {
id: 'researchLightSpells', name: 'Light Spell Research', description: 'Unlock Light Lance, Radiance spell enchantments',
category: 'effectResearch', maxLevel: 1, costPerLevel: 400, studyHours: 8,
effects: [],
};
export const researchDarkSpells: SkillV2Def = {
id: 'researchDarkSpells', name: 'Dark Spell Research', description: 'Unlock Shadow Bolt, Dark Pulse spell enchantments',
category: 'effectResearch', maxLevel: 1, costPerLevel: 400, studyHours: 8,
effects: [],
};
export const researchLifeDeathSpells: SkillV2Def = {
id: 'researchLifeDeathSpells', name: 'Death Research', description: 'Unlock Drain spell enchantment',
category: 'effectResearch', maxLevel: 1, costPerLevel: 400, studyHours: 8,
effects: [],
};
// Tier 2 advanced spell research
export const researchAdvancedFire: SkillV2Def = {
id: 'researchAdvancedFire', name: 'Advanced Fire Research', description: 'Unlock Inferno, Flame Wave',
category: 'effectResearch', maxLevel: 1, costPerLevel: 600, studyHours: 12,
effects: [],
};
export const researchAdvancedWater: SkillV2Def = {
id: 'researchAdvancedWater', name: 'Advanced Water Research', description: 'Unlock Tidal Wave, Ice Storm',
category: 'effectResearch', maxLevel: 1, costPerLevel: 600, studyHours: 12,
effects: [],
};
export const researchAdvancedAir: SkillV2Def = {
id: 'researchAdvancedAir', name: 'Advanced Air Research', description: 'Unlock Hurricane, Wind Blade',
category: 'effectResearch', maxLevel: 1, costPerLevel: 600, studyHours: 12,
effects: [],
};
export const researchAdvancedEarth: SkillV2Def = {
id: 'researchAdvancedEarth', name: 'Advanced Earth Research', description: 'Unlock Earthquake, Stone Barrage',
category: 'effectResearch', maxLevel: 1, costPerLevel: 600, studyHours: 12,
effects: [],
};
export const researchAdvancedLight: SkillV2Def = {
id: 'researchAdvancedLight', name: 'Advanced Light Research', description: 'Unlock Solar Flare, Divine Smite',
category: 'effectResearch', maxLevel: 1, costPerLevel: 700, studyHours: 14,
effects: [],
};
export const researchAdvancedDark: SkillV2Def = {
id: 'researchAdvancedDark', name: 'Advanced Dark Research', description: 'Unlock Void Rift, Shadow Storm',
category: 'effectResearch', maxLevel: 1, costPerLevel: 700, studyHours: 14,
effects: [],
};
// Tier 3 master spell research
export const researchMasterFire: SkillV2Def = {
id: 'researchMasterFire', name: 'Master Fire Research', description: 'Unlock Pyroclasm',
category: 'effectResearch', maxLevel: 1, costPerLevel: 1200, studyHours: 24,
effects: [],
};
export const researchMasterWater: SkillV2Def = {
id: 'researchMasterWater', name: 'Master Water Research', description: 'Unlock Tsunami',
category: 'effectResearch', maxLevel: 1, costPerLevel: 1200, studyHours: 24,
effects: [],
};
export const researchMasterEarth: SkillV2Def = {
id: 'researchMasterEarth', name: 'Master Earth Research', description: 'Unlock Meteor Strike',
category: 'effectResearch', maxLevel: 1, costPerLevel: 1300, studyHours: 26,
effects: [],
};
// Combat/misc research
export const researchDamageEffects: SkillV2Def = {
id: 'researchDamageEffects', name: 'Damage Effect Research', description: 'Unlock Minor/Moderate Power, Amplification',
category: 'effectResearch', maxLevel: 1, costPerLevel: 250, studyHours: 5,
effects: [],
};
export const researchCombatEffects: SkillV2Def = {
id: 'researchCombatEffects', name: 'Combat Effect Research', description: 'Unlock Sharp Edge, Swift Casting',
category: 'effectResearch', maxLevel: 1, costPerLevel: 350, studyHours: 6,
effects: [],
};
export const researchManaEffects: SkillV2Def = {
id: 'researchManaEffects', name: 'Mana Effect Research', description: 'Unlock Mana Reserve, Trickle, Mana Tap, weapon mana effects',
category: 'effectResearch', maxLevel: 1, costPerLevel: 200, studyHours: 4,
effects: [],
};
export const researchAdvancedManaEffects: SkillV2Def = {
id: 'researchAdvancedManaEffects', name: 'Advanced Mana Research', description: 'Unlock Mana Reservoir, Stream, River, Surge',
category: 'effectResearch', maxLevel: 1, costPerLevel: 400, studyHours: 8,
effects: [],
};
export const researchUtilityEffects: SkillV2Def = {
id: 'researchUtilityEffects', name: 'Utility Effect Research', description: 'Unlock Meditative Focus, Quick Study, Insightful',
category: 'effectResearch', maxLevel: 1, costPerLevel: 300, studyHours: 6,
effects: [],
};
export const researchSpecialEffects: SkillV2Def = {
id: 'researchSpecialEffects', name: 'Special Effect Research', description: 'Unlock Echo Chamber, Siphoning, Bane',
category: 'effectResearch', maxLevel: 1, costPerLevel: 500, studyHours: 10,
effects: [],
};
export const researchOverpower: SkillV2Def = {
id: 'researchOverpower', name: 'Overpower Research', description: 'Unlock Overpower effect',
category: 'effectResearch', maxLevel: 1, costPerLevel: 700, studyHours: 12,
effects: [],
};
// Compound spell research
export const researchMetalSpells: SkillV2Def = {
id: 'researchMetalSpells', name: 'Metal Spell Research', description: 'Unlock Metal Shard, Iron Fist',
category: 'effectResearch', maxLevel: 1, costPerLevel: 400, studyHours: 6,
effects: [],
};
export const researchSandSpells: SkillV2Def = {
id: 'researchSandSpells', name: 'Sand Spell Research', description: 'Unlock Sand Blast, Sandstorm',
category: 'effectResearch', maxLevel: 1, costPerLevel: 400, studyHours: 6,
effects: [],
};
export const researchLightningSpells: SkillV2Def = {
id: 'researchLightningSpells', name: 'Lightning Spell Research', description: 'Unlock Spark, Lightning Bolt',
category: 'effectResearch', maxLevel: 1, costPerLevel: 400, studyHours: 6,
effects: [],
};
export const researchAdvancedMetal: SkillV2Def = {
id: 'researchAdvancedMetal', name: 'Advanced Metal Research', description: 'Unlock Steel Tempest',
category: 'effectResearch', maxLevel: 1, costPerLevel: 700, studyHours: 12,
effects: [],
};
export const researchAdvancedSand: SkillV2Def = {
id: 'researchAdvancedSand', name: 'Advanced Sand Research', description: 'Unlock Desert Wind',
category: 'effectResearch', maxLevel: 1, costPerLevel: 700, studyHours: 12,
effects: [],
};
export const researchAdvancedLightning: SkillV2Def = {
id: 'researchAdvancedLightning', name: 'Advanced Lightning Research', description: 'Unlock Chain Lightning, Storm Call',
category: 'effectResearch', maxLevel: 1, costPerLevel: 700, studyHours: 12,
effects: [],
};
export const researchMasterMetal: SkillV2Def = {
id: 'researchMasterMetal', name: 'Master Metal Research', description: 'Unlock Furnace Blast',
category: 'effectResearch', maxLevel: 1, costPerLevel: 1300, studyHours: 26,
effects: [],
};
export const researchMasterSand: SkillV2Def = {
id: 'researchMasterSand', name: 'Master Sand Research', description: 'Unlock Dune Collapse',
category: 'effectResearch', maxLevel: 1, costPerLevel: 1300, studyHours: 26,
effects: [],
};
export const researchMasterLightning: SkillV2Def = {
id: 'researchMasterLightning', name: 'Master Lightning Research', description: 'Unlock Thunder Strike',
category: 'effectResearch', maxLevel: 1, costPerLevel: 1300, studyHours: 26,
effects: [],
};
export const researchTransferenceSpells: SkillV2Def = {
id: 'researchTransferenceSpells', name: 'Transference Spell Research', description: 'Unlock Transfer Strike, Mana Rip',
category: 'effectResearch', maxLevel: 1, costPerLevel: 350, studyHours: 5,
effects: [],
};
export const researchAdvancedTransference: SkillV2Def = {
id: 'researchAdvancedTransference', name: 'Advanced Transference Research', description: 'Unlock Essence Drain',
category: 'effectResearch', maxLevel: 1, costPerLevel: 650, studyHours: 12,
effects: [],
};
export const researchMasterTransference: SkillV2Def = {
id: 'researchMasterTransference', name: 'Master Transference Research', description: 'Unlock Soul Transfer',
category: 'effectResearch', maxLevel: 1, costPerLevel: 1300, studyHours: 26,
effects: [],
};
// Element capacity research (Tier 2 — +25 per stack)
export const researchAdvancedFireCap: SkillV2Def = {
id: 'researchAdvancedFireCap', name: 'Advanced Fire Capacity Research', description: '+25 fire cap per level',
category: 'effectResearch', maxLevel: 1, costPerLevel: 700, studyHours: 12,
effects: [],
};
export const researchAdvancedWaterCap: SkillV2Def = {
id: 'researchAdvancedWaterCap', name: 'Advanced Water Capacity Research', description: '+25 water cap per level',
category: 'effectResearch', maxLevel: 1, costPerLevel: 700, studyHours: 12,
effects: [],
};
export const researchAdvancedAirCap: SkillV2Def = {
id: 'researchAdvancedAirCap', name: 'Advanced Air Capacity Research', description: '+25 air cap per level',
category: 'effectResearch', maxLevel: 1, costPerLevel: 700, studyHours: 12,
effects: [],
};
export const researchAdvancedEarthCap: SkillV2Def = {
id: 'researchAdvancedEarthCap', name: 'Advanced Earth Capacity Research', description: '+25 earth cap per level',
category: 'effectResearch', maxLevel: 1, costPerLevel: 700, studyHours: 12,
effects: [],
};
export const researchAdvancedLightCap: SkillV2Def = {
id: 'researchAdvancedLightCap', name: 'Advanced Light Capacity Research', description: '+25 light cap per level',
category: 'effectResearch', maxLevel: 1, costPerLevel: 800, studyHours: 14,
effects: [],
};
export const researchAdvancedDarkCap: SkillV2Def = {
id: 'researchAdvancedDarkCap', name: 'Advanced Dark Capacity Research', description: '+25 dark cap per level',
category: 'effectResearch', maxLevel: 1, costPerLevel: 800, studyHours: 14,
effects: [],
};
export const researchAdvancedDeathCap: SkillV2Def = {
id: 'researchAdvancedDeathCap', name: 'Advanced Death Capacity Research', description: '+25 death cap per level',
category: 'effectResearch', maxLevel: 1, costPerLevel: 900, studyHours: 16,
effects: [],
};
// Tier 3 — Master (+50 per stack)
export const researchMasterFireCap: SkillV2Def = {
id: 'researchMasterFireCap', name: 'Master Fire Capacity Research', description: '+50 fire cap per level',
category: 'effectResearch', maxLevel: 1, costPerLevel: 1300, studyHours: 24,
effects: [],
};
export const researchMasterWaterCap: SkillV2Def = {
id: 'researchMasterWaterCap', name: 'Master Water Capacity Research', description: '+50 water cap per level',
category: 'effectResearch', maxLevel: 1, costPerLevel: 1300, studyHours: 24,
effects: [],
};
export const researchMasterAirCap: SkillV2Def = {
id: 'researchMasterAirCap', name: 'Master Air Capacity Research', description: '+50 air cap per level',
category: 'effectResearch', maxLevel: 1, costPerLevel: 1300, studyHours: 24,
effects: [],
};
export const researchMasterEarthCap: SkillV2Def = {
id: 'researchMasterEarthCap', name: 'Master Earth Capacity Research', description: '+50 earth cap per level',
category: 'effectResearch', maxLevel: 1, costPerLevel: 1300, studyHours: 24,
effects: [],
};
export const researchMasterLightCap: SkillV2Def = {
id: 'researchMasterLightCap', name: 'Master Light Capacity Research', description: '+50 light cap per level',
category: 'effectResearch', maxLevel: 1, costPerLevel: 1500, studyHours: 28,
effects: [],
};
export const researchMasterDarkCap: SkillV2Def = {
id: 'researchMasterDarkCap', name: 'Master Dark Capacity Research', description: '+50 dark cap per level',
category: 'effectResearch', maxLevel: 1, costPerLevel: 1500, studyHours: 28,
effects: [],
};
export const researchMasterDeathCap: SkillV2Def = {
id: 'researchMasterDeathCap', name: 'Master Death Capacity Research', description: '+50 death cap per level',
category: 'effectResearch', maxLevel: 1, costPerLevel: 1600, studyHours: 30,
effects: [],
};
// Compound element capacity research
export const researchMetalCapacity: SkillV2Def = {
id: 'researchMetalCapacity', name: 'Metal Capacity Research', description: '+10 metal cap',
category: 'effectResearch', maxLevel: 1, costPerLevel: 400, studyHours: 6,
effects: [],
};
export const researchAdvancedMetalCap: SkillV2Def = {
id: 'researchAdvancedMetalCap', name: 'Advanced Metal Capacity Research', description: '+25/+50 metal cap',
category: 'effectResearch', maxLevel: 1, costPerLevel: 700, studyHours: 12,
effects: [],
};
export const researchSandCapacity: SkillV2Def = {
id: 'researchSandCapacity', name: 'Sand Capacity Research', description: '+10 sand cap',
category: 'effectResearch', maxLevel: 1, costPerLevel: 400, studyHours: 6,
effects: [],
};
export const researchAdvancedSandCap: SkillV2Def = {
id: 'researchAdvancedSandCap', name: 'Advanced Sand Capacity Research', description: '+25/+50 sand cap',
category: 'effectResearch', maxLevel: 1, costPerLevel: 700, studyHours: 12,
effects: [],
};
export const researchLightningCapacity: SkillV2Def = {
id: 'researchLightningCapacity', name: 'Lightning Capacity Research', description: '+10 lightning cap',
category: 'effectResearch', maxLevel: 1, costPerLevel: 400, studyHours: 6,
effects: [],
};
export const researchAdvancedLightningCap: SkillV2Def = {
id: 'researchAdvancedLightningCap', name: 'Advanced Lightning Capacity Research', description: '+25/+50 lightning cap',
category: 'effectResearch', maxLevel: 1, costPerLevel: 700, studyHours: 12,
effects: [],
};
// Exotic capacity research
export const researchCrystalCapacity: SkillV2Def = {
id: 'researchCrystalCapacity', name: 'Crystal Capacity Research', description: '+10 crystal cap',
category: 'effectResearch', maxLevel: 1, costPerLevel: 1000, studyHours: 12,
effects: [],
};
export const researchAdvancedCrystalCap: SkillV2Def = {
id: 'researchAdvancedCrystalCap', name: 'Advanced Crystal Capacity Research', description: '+25/+50 crystal cap',
category: 'effectResearch', maxLevel: 1, costPerLevel: 2000, studyHours: 24,
effects: [],
};
export const researchStellarCapacity: SkillV2Def = {
id: 'researchStellarCapacity', name: 'Stellar Capacity Research', description: '+10 stellar cap',
category: 'effectResearch', maxLevel: 1, costPerLevel: 1000, studyHours: 12,
effects: [],
};
export const researchAdvancedStellarCap: SkillV2Def = {
id: 'researchAdvancedStellarCap', name: 'Advanced Stellar Capacity Research', description: '+25/+50 stellar cap',
category: 'effectResearch', maxLevel: 1, costPerLevel: 2000, studyHours: 24,
effects: [],
};
export const researchVoidCapacity: SkillV2Def = {
id: 'researchVoidCapacity', name: 'Void Capacity Research', description: '+10 void cap',
category: 'effectResearch', maxLevel: 1, costPerLevel: 1500, studyHours: 16,
effects: [],
};
export const researchAdvancedVoidCap: SkillV2Def = {
id: 'researchAdvancedVoidCap', name: 'Advanced Void Capacity Research', description: '+25/+50 void cap',
category: 'effectResearch', maxLevel: 1, costPerLevel: 3000, studyHours: 30,
effects: [],
};
+3
View File
@@ -0,0 +1,3 @@
import type { SkillV2Def } from './skills-v2-types';
// @ts-expect-error - circular refs resolved at runtime
export { SKILLS_V2 } from './skills-v2-registry';
@@ -0,0 +1,292 @@
import type { SkillV2Def } from './skills-v2-types';
import {
manaWell,
manaFlow,
manaOverflow,
manaTap,
manaSurge,
manaSpring,
quickLearner,
focusedMind,
knowledgeRetention,
meditation,
deepTrance,
voidMeditation,
} from './skills-core';
import {
enchanting,
efficientEnchant,
enchantSpeed,
essenceRefining,
disenchanting,
} from './skills-enchant';
import {
arcaneFury,
combatTraining,
precision,
elementalMastery,
attackSpeed,
armorPiercing,
spellDamage,
} from './skills-combat';
import {
golemMastery,
golemEfficiency,
golemLongevity,
} from './skills-golemancy';
import {
invocation,
pactMastery,
guardianLore,
} from './skills-invocation';
import {
effCrafting,
fieldRepair,
} from './skills-crafting';
import {
fireManaCap,
waterManaCap,
airManaCap,
earthManaCap,
lightManaCap,
darkManaCap,
deathManaCap,
metalManaCap,
sandManaCap,
lightningManaCap,
transferenceManaCap,
} from './skills-element-caps';
import {
pactWeaving,
guardianConstructs,
enchantedGolemancy,
} from './skills-hybrid';
import {
researchManaSpells,
researchFireSpells,
researchWaterSpells,
researchAirSpells,
researchEarthSpells,
researchLightSpells,
researchDarkSpells,
researchLifeDeathSpells,
researchAdvancedFire,
researchAdvancedWater,
researchAdvancedAir,
researchAdvancedEarth,
researchAdvancedLight,
researchAdvancedDark,
researchMasterFire,
researchMasterWater,
researchMasterEarth,
researchDamageEffects,
researchCombatEffects,
researchManaEffects,
researchAdvancedManaEffects,
researchUtilityEffects,
researchSpecialEffects,
researchOverpower,
researchMetalSpells,
researchSandSpells,
researchLightningSpells,
researchAdvancedMetal,
researchAdvancedSand,
researchAdvancedLightning,
researchMasterMetal,
researchMasterSand,
researchMasterLightning,
researchTransferenceSpells,
researchAdvancedTransference,
researchMasterTransference,
researchAdvancedFireCap,
researchAdvancedWaterCap,
researchAdvancedAirCap,
researchAdvancedEarthCap,
researchAdvancedLightCap,
researchAdvancedDarkCap,
researchAdvancedDeathCap,
researchMasterFireCap,
researchMasterWaterCap,
researchMasterAirCap,
researchMasterEarthCap,
researchMasterLightCap,
researchMasterDarkCap,
researchMasterDeathCap,
researchMetalCapacity,
researchAdvancedMetalCap,
researchSandCapacity,
researchAdvancedSandCap,
researchLightningCapacity,
researchAdvancedLightningCap,
researchCrystalCapacity,
researchAdvancedCrystalCap,
researchStellarCapacity,
researchAdvancedStellarCap,
researchVoidCapacity,
researchAdvancedVoidCap,
} from './skills-research';
// Re-export individual skills
export {
manaWell,
manaFlow,
manaOverflow,
manaTap,
manaSurge,
manaSpring,
quickLearner,
focusedMind,
knowledgeRetention,
meditation,
deepTrance,
voidMeditation,
} from './skills-core';
export {
enchanting,
efficientEnchant,
enchantSpeed,
essenceRefining,
disenchanting,
} from './skills-enchant';
export {
arcaneFury,
combatTraining,
precision,
elementalMastery,
attackSpeed,
armorPiercing,
spellDamage,
} from './skills-combat';
export {
golemMastery,
golemEfficiency,
golemLongevity,
} from './skills-golemancy';
export {
invocation,
pactMastery,
guardianLore,
} from './skills-invocation';
export {
effCrafting,
fieldRepair,
} from './skills-crafting';
export {
fireManaCap,
waterManaCap,
airManaCap,
earthManaCap,
lightManaCap,
darkManaCap,
deathManaCap,
metalManaCap,
sandManaCap,
lightningManaCap,
transferenceManaCap,
} from './skills-element-caps';
export {
pactWeaving,
guardianConstructs,
enchantedGolemancy,
} from './skills-hybrid';
export {
researchManaSpells,
researchFireSpells,
researchWaterSpells,
researchAirSpells,
researchEarthSpells,
researchLightSpells,
researchDarkSpells,
researchLifeDeathSpells,
researchAdvancedFire,
researchAdvancedWater,
researchAdvancedAir,
researchAdvancedEarth,
researchAdvancedLight,
researchAdvancedDark,
researchMasterFire,
researchMasterWater,
researchMasterEarth,
researchDamageEffects,
researchCombatEffects,
researchManaEffects,
researchAdvancedManaEffects,
researchUtilityEffects,
researchSpecialEffects,
researchOverpower,
researchMetalSpells,
researchSandSpells,
researchLightningSpells,
researchAdvancedMetal,
researchAdvancedSand,
researchAdvancedLightning,
researchMasterMetal,
researchMasterSand,
researchMasterLightning,
researchTransferenceSpells,
researchAdvancedTransference,
researchMasterTransference,
researchAdvancedFireCap,
researchAdvancedWaterCap,
researchAdvancedAirCap,
researchAdvancedEarthCap,
researchAdvancedLightCap,
researchAdvancedDarkCap,
researchAdvancedDeathCap,
researchMasterFireCap,
researchMasterWaterCap,
researchMasterAirCap,
researchMasterEarthCap,
researchMasterLightCap,
researchMasterDarkCap,
researchMasterDeathCap,
researchMetalCapacity,
researchAdvancedMetalCap,
researchSandCapacity,
researchAdvancedSandCap,
researchLightningCapacity,
researchAdvancedLightningCap,
researchCrystalCapacity,
researchAdvancedCrystalCap,
researchStellarCapacity,
researchAdvancedStellarCap,
researchVoidCapacity,
researchAdvancedVoidCap,
} from './skills-research';
// Build the flat SKILLS_V2 record (legacy compat)
export const SKILLS_V2: Record<string, SkillV2Def> = {
manaWell, manaFlow, manaOverflow, manaTap, manaSurge, manaSpring,
quickLearner, focusedMind, knowledgeRetention,
meditation, deepTrance, voidMeditation,
enchanting, efficientEnchant, enchantSpeed, essenceRefining, disenchanting,
arcaneFury, combatTraining, precision, elementalMastery, attackSpeed, armorPiercing, spellDamage,
golemMastery, golemEfficiency, golemLongevity,
invocation, pactMastery, guardianLore,
effCrafting, fieldRepair,
fireManaCap, waterManaCap, airManaCap, earthManaCap,
lightManaCap, darkManaCap, deathManaCap, metalManaCap,
sandManaCap, lightningManaCap, transferenceManaCap,
pactWeaving, guardianConstructs, enchantedGolemancy,
researchManaSpells, researchFireSpells, researchWaterSpells, researchAirSpells,
researchEarthSpells, researchLightSpells, researchDarkSpells, researchLifeDeathSpells,
researchAdvancedFire, researchAdvancedWater, researchAdvancedAir, researchAdvancedEarth,
researchAdvancedLight, researchAdvancedDark,
researchMasterFire, researchMasterWater, researchMasterEarth,
researchDamageEffects, researchCombatEffects, researchManaEffects,
researchAdvancedManaEffects, researchUtilityEffects, researchSpecialEffects, researchOverpower,
researchMetalSpells, researchSandSpells, researchLightningSpells,
researchAdvancedMetal, researchAdvancedSand, researchAdvancedLightning,
researchMasterMetal, researchMasterSand, researchMasterLightning,
researchTransferenceSpells, researchAdvancedTransference, researchMasterTransference,
researchAdvancedFireCap, researchAdvancedWaterCap, researchAdvancedAirCap, researchAdvancedEarthCap,
researchAdvancedLightCap, researchAdvancedDarkCap, researchAdvancedDeathCap,
researchMasterFireCap, researchMasterWaterCap, researchMasterAirCap, researchMasterEarthCap,
researchMasterLightCap, researchMasterDarkCap, researchMasterDeathCap,
researchMetalCapacity, researchAdvancedMetalCap,
researchSandCapacity, researchAdvancedSandCap,
researchLightningCapacity, researchAdvancedLightningCap,
researchCrystalCapacity, researchAdvancedCrystalCap,
researchStellarCapacity, researchAdvancedStellarCap,
researchVoidCapacity, researchAdvancedVoidCap,
};
+142
View File
@@ -0,0 +1,142 @@
// ─── Skill System v2 Types ─────────────────────────────────────────────────────
// Shared types for the new flat skill system.
export type StatKey =
| 'maxMana'
| 'manaRegen'
| 'clickMana'
| 'elementCap'
| 'studySpeed'
| 'studyCostMult'
| 'meditationEfficiency'
| 'enchantCapacity'
| 'enchantSpeed'
| 'enchantPower'
| 'disenchantRecovery'
| 'baseDamage'
| 'damageMultiplier'
| 'attackSpeed'
| 'critChance'
| 'critMultiplier'
| 'armorPierce'
| 'insightGain'
| 'golemDamage'
| 'golemDuration'
| 'pactMultiplier'
| 'conversionRate'
| 'spellDamage'
| 'guardianDamage'
| 'craftSpeed'
| 'repairSpeed'
// Per-element capacity stats
| 'fireCap'
| 'waterCap'
| 'airCap'
| 'earthCap'
| 'lightCap'
| 'darkCap'
| 'deathCap'
| 'metalCap'
| 'sandCap'
| 'lightningCap'
| 'transferenceCap'
| 'crystalCap'
| 'stellarCap'
| 'voidCap';
export interface SkillEffect {
stat: StatKey;
mode: 'add' | 'multiply';
valuePerLevel: number;
}
export interface SkillV2Def {
id: string;
name: string;
description: string;
category: string;
maxLevel: number;
costPerLevel: number;
studyHours: number;
effects: SkillEffect[];
attunementRequired?: string;
prerequisites?: Record<string, number>;
}
export interface ComputedStats {
maxMana: number;
manaRegen: number;
clickMana: number;
elementCap: number;
studySpeed: number;
studyCostMult: number;
meditationEfficiency: number;
enchantCapacity: number;
enchantSpeed: number;
enchantPower: number;
disenchantRecovery: number;
baseDamage: number;
damageMultiplier: number;
attackSpeed: number;
critChance: number;
critMultiplier: number;
armorPierce: number;
insightGain: number;
golemDamage: number;
golemDuration: number;
pactMultiplier: number;
conversionRate: number;
spellDamage: number;
guardianDamage: number;
craftSpeed: number;
repairSpeed: number;
// Per-element capacity (for direct skill contributions)
fireCap: number;
waterCap: number;
airCap: number;
earthCap: number;
lightCap: number;
darkCap: number;
deathCap: number;
metalCap: number;
sandCap: number;
lightningCap: number;
transferenceCap: number;
crystalCap: number;
stellarCap: number;
voidCap: number;
}
// Default base stats (all skills at zero, no equipment, no prestige)
export const BASE_STATS: ComputedStats = {
maxMana: 100,
manaRegen: 2,
clickMana: 1,
elementCap: 10,
studySpeed: 1,
studyCostMult: 1,
meditationEfficiency: 1,
enchantCapacity: 100,
enchantSpeed: 1,
enchantPower: 1,
disenchantRecovery: 1,
baseDamage: 5,
damageMultiplier: 1,
attackSpeed: 1,
critChance: 0,
critMultiplier: 1.5,
armorPierce: 0,
insightGain: 1,
golemDamage: 1,
golemDuration: 1,
pactMultiplier: 1,
conversionRate: 1,
spellDamage: 1,
guardianDamage: 1,
craftSpeed: 1,
repairSpeed: 1,
fireCap: 0, waterCap: 0, airCap: 0, earthCap: 0,
lightCap: 0, darkCap: 0, deathCap: 0,
metalCap: 0, sandCap: 0, lightningCap: 0,
transferenceCap: 0, crystalCap: 0, stellarCap: 0, voidCap: 0,
};
+269
View File
@@ -0,0 +1,269 @@
import type { SkillV2Def, SkillEffect, StatKey, ComputedStats } from './skills-v2-types';
import { SKILLS_V2 } from './skills-v2-defs';
// Re-export individual skills from category modules
export {
manaWell,
manaFlow,
manaOverflow,
manaTap,
manaSurge,
manaSpring,
quickLearner,
focusedMind,
knowledgeRetention,
meditation,
deepTrance,
voidMeditation,
} from './skills-core';
export {
enchanting,
efficientEnchant,
enchantSpeed,
essenceRefining,
disenchanting,
} from './skills-enchant';
export {
arcaneFury,
combatTraining,
precision,
elementalMastery,
attackSpeed,
armorPiercing,
spellDamage,
} from './skills-combat';
export {
golemMastery,
golemEfficiency,
golemLongevity,
} from './skills-golemancy';
export {
invocation,
pactMastery,
guardianLore,
} from './skills-invocation';
export {
effCrafting,
fieldRepair,
} from './skills-crafting';
export {
fireManaCap,
waterManaCap,
airManaCap,
earthManaCap,
lightManaCap,
darkManaCap,
deathManaCap,
metalManaCap,
sandManaCap,
lightningManaCap,
transferenceManaCap,
} from './skills-element-caps';
export {
pactWeaving,
guardianConstructs,
enchantedGolemancy,
} from './skills-hybrid';
export {
researchManaSpells,
researchFireSpells,
researchWaterSpells,
researchAirSpells,
researchEarthSpells,
researchLightSpells,
researchDarkSpells,
researchLifeDeathSpells,
researchAdvancedFire,
researchAdvancedWater,
researchAdvancedAir,
researchAdvancedEarth,
researchAdvancedLight,
researchAdvancedDark,
researchMasterFire,
researchMasterWater,
researchMasterEarth,
researchDamageEffects,
researchCombatEffects,
researchManaEffects,
researchAdvancedManaEffects,
researchUtilityEffects,
researchSpecialEffects,
researchOverpower,
researchMetalSpells,
researchSandSpells,
researchLightningSpells,
researchAdvancedMetal,
researchAdvancedSand,
researchAdvancedLightning,
researchMasterMetal,
researchMasterSand,
researchMasterLightning,
researchTransferenceSpells,
researchAdvancedTransference,
researchMasterTransference,
researchAdvancedFireCap,
researchAdvancedWaterCap,
researchAdvancedAirCap,
researchAdvancedEarthCap,
researchAdvancedLightCap,
researchAdvancedDarkCap,
researchAdvancedDeathCap,
researchMasterFireCap,
researchMasterWaterCap,
researchMasterAirCap,
researchMasterEarthCap,
researchMasterLightCap,
researchMasterDarkCap,
researchMasterDeathCap,
researchMetalCapacity,
researchAdvancedMetalCap,
researchSandCapacity,
researchAdvancedSandCap,
researchLightningCapacity,
researchAdvancedLightningCap,
researchCrystalCapacity,
researchAdvancedCrystalCap,
researchStellarCapacity,
researchAdvancedStellarCap,
researchVoidCapacity,
researchAdvancedVoidCap,
} from './skills-research';
export { SKILLS_V2 };
// Default Base Stats
export const BASE_STATS: ComputedStats = {
maxMana: 100,
manaRegen: 2,
clickMana: 1,
elementCap: 10,
studySpeed: 1,
studyCostMult: 1,
meditationEfficiency: 1,
enchantCapacity: 100,
enchantSpeed: 1,
enchantPower: 1,
disenchantRecovery: 1,
baseDamage: 5,
damageMultiplier: 1,
attackSpeed: 1,
critChance: 0,
critMultiplier: 1.5,
armorPierce: 0,
insightGain: 1,
golemDamage: 1,
golemDuration: 1,
pactMultiplier: 1,
conversionRate: 1,
spellDamage: 1,
guardianDamage: 1,
craftSpeed: 1,
repairSpeed: 1,
fireCap: 0, waterCap: 0, airCap: 0, earthCap: 0,
lightCap: 0, darkCap: 0, deathCap: 0,
metalCap: 0, sandCap: 0, lightningCap: 0,
transferenceCap: 0, crystalCap: 0, stellarCap: 0, voidCap: 0,
elementalDamage: 1,
};
const ELEMENT_CAP_STATS: Record<string, keyof ComputedStats> = {
fire: 'fireCap', water: 'waterCap', air: 'airCap', earth: 'earthCap',
light: 'lightCap', dark: 'darkCap', death: 'deathCap', metal: 'metalCap',
sand: 'sandCap', lightning: 'lightningCap', transference: 'transferenceCap',
crystal: 'crystalCap', stellar: 'stellarCap', void: 'voidCap',
};
/**
* Compute all game stats from skill levels.
*/
export function computeStats(
skills: Record<string, number>,
prestigeUpgrades: Record<string, number> = {}
): ComputedStats {
const stats: ComputedStats = { ...BASE_STATS };
for (const [skillId, level] of Object.entries(skills)) {
if (level <= 0) continue;
const def = SKILLS_V2[skillId];
if (!def) continue;
for (const effect of def.effects) {
const key = effect.stat as keyof ComputedStats;
const currentVal = stats[key] as number;
if (effect.mode === 'add') {
(stats[key] as number) = currentVal + effect.valuePerLevel * level;
} else {
const perLevelMultiplier = 1 + effect.valuePerLevel;
let result = currentVal;
for (let i = 0; i < level; i++) result *= perLevelMultiplier;
(stats[key] as number) = result;
}
}
}
if (prestigeUpgrades.manaWell) stats.maxMana += prestigeUpgrades.manaWell * 500;
if (prestigeUpgrades.manaFlow) stats.manaRegen += prestigeUpgrades.manaFlow * 0.5;
if (prestigeUpgrades.elementalAttune) stats.elementCap += prestigeUpgrades.elementalAttune * 25;
if (prestigeUpgrades.pactBinding) stats.pactMultiplier += prestigeUpgrades.pactBinding * 0.1;
if (prestigeUpgrades.insightAmp) stats.insightGain *= 1 + prestigeUpgrades.insightAmp * 0.25;
let elementCapFromSkills = 0;
for (const [, statKey] of Object.entries(ELEMENT_CAP_STATS)) {
const val = stats[statKey] as number;
if (val > 0) elementCapFromSkills += val;
}
if (elementCapFromSkills > 0) stats.elementCap += elementCapFromSkills;
stats.maxMana = Math.max(1, Math.round(stats.maxMana));
stats.manaRegen = Math.round(stats.manaRegen * 100) / 100;
stats.clickMana = Math.max(1, stats.clickMana);
stats.elementCap = Math.max(10, Math.round(stats.elementCap));
stats.baseDamage = Math.max(1, Math.round(stats.baseDamage));
stats.critChance = Math.min(1, Math.max(0, stats.critChance));
stats.armorPierce = Math.min(1, Math.max(0, stats.armorPierce));
stats.attackSpeed = Math.max(0.1, stats.attackSpeed);
stats.insightGain = Math.max(0, stats.insightGain);
stats.golemDamage = Math.max(0.1, stats.golemDamage);
stats.golemDuration = Math.max(1, stats.golemDuration);
stats.enchantCapacity = Math.max(10, Math.round(stats.enchantCapacity));
stats.conversionRate = Math.max(0, stats.conversionRate);
return stats;
}
/**
* Get the base key for a tiered skill (strips _tN suffix).
*/
export function getBaseSkillId(skillId: string): string {
const match = skillId.match(/^(.+?)_t(\d+)$/);
return match ? match[1] : skillId;
}
/**
* Check if a skill has prerequisites that are met.
*/
export function hasPrerequisites(
skills: Record<string, number>,
prerequisites?: Record<string, number>
): boolean {
if (!prerequisites) return true;
for (const [reqId, reqLevel] of Object.entries(prerequisites)) {
if ((skills[reqId] || 0) < reqLevel) return false;
}
return true;
}
/** Legacy compat wrapper */
export function computeStatsLegacy(state: {
skills: Record<string, number>;
prestigeUpgrades?: Record<string, number>;
}): ComputedStats {
return computeStats(state.skills, state.prestigeUpgrades || {});
}