feature: add new composite and exotic mana types (ticket #202)
Build and Publish Mana Loop Docker Image / build-and-publish (push) Failing after 17s

This commit is contained in:
2026-05-29 21:51:45 +02:00
parent 7bd28e2085
commit e3ce18c601
31 changed files with 1279 additions and 170 deletions
+22 -1
View File
@@ -32,10 +32,18 @@ export const ELEMENTS: Record<string, ElementDef> = {
sand: { name: "Sand", sym: "⏳", color: "#D4AC0D", glow: "#D4AC0D40", cat: "composite", recipe: ["earth", "water"] },
lightning: { name: "Lightning", sym: "⚡", color: "#FFEB3B", glow: "#FFEB3B40", cat: "composite", recipe: ["fire", "air"] },
frost: { name: "Frost", sym: "❄️", color: "#A8D8EA", glow: "#A8D8EA40", cat: "composite", recipe: ["air", "water"] },
blackflame: { name: "BlackFlame", sym: "🌋", color: "#8B2500", glow: "#8B250040", cat: "composite", recipe: ["dark", "fire"] },
radiantflames: { name: "Radiant Flames", sym: "🌟", color: "#FFAA33", glow: "#FFAA3340", cat: "composite", recipe: ["light", "fire"] },
miasma: { name: "Miasma", sym: "☁️", color: "#6B8E23", glow: "#6B8E2340", cat: "composite", recipe: ["air", "death"] },
shadowglass: { name: "Shadow Glass", sym: "🖤", color: "#2C2C54", glow: "#2C2C5440", cat: "composite", recipe: ["earth", "dark"] },
// Exotic Elements
crystal: { name: "Crystal", sym: "💎", color: "#85C1E9", glow: "#85C1E940", cat: "exotic", recipe: ["sand", "sand", "light"] },
stellar: { name: "Stellar", sym: "⭐", color: "#F0E68C", glow: "#F0E68C40", cat: "exotic", recipe: ["fire", "fire", "light"] },
stellar: { name: "Stellar", sym: "⭐", color: "#F0E68C", glow: "#F0E68C40", cat: "exotic", recipe: ["plasma", "light", "fire"] },
void: { name: "Void", sym: "🕳️", color: "#4A235A", glow: "#4A235A40", cat: "exotic", recipe: ["dark", "dark", "death"] },
soul: { name: "Soul", sym: "💫", color: "#E8D5F5", glow: "#E8D5F540", cat: "exotic", recipe: ["light", "dark", "transference"] },
time: { name: "Time", sym: "⏱️", color: "#C5B99A", glow: "#C5B99A40", cat: "exotic", recipe: ["soul", "sand", "transference"] },
plasma: { name: "Plasma", sym: "⚡", color: "#FF6B9D", glow: "#FF6B9D40", cat: "exotic", recipe: ["lightning", "fire", "transference"] },
};
// NOTE: Life, Blood, Wood, Mental, and Force mana types have been removed.
@@ -50,6 +58,11 @@ export const ELEMENT_OPPOSITES: Record<string, string> = {
air: 'earth', earth: 'air',
light: 'dark', dark: 'light',
lightning: 'earth', // Lightning is weak to earth (grounding)
frost: 'fire', // Frost is weak to fire (melting)
blackflame: 'light', // BlackFlame is weak to light (purification)
radiantflames: 'dark', // Radiant Flames are weak to dark (extinguishing)
miasma: 'air', // Miasma is weak to air (dispersion)
shadowglass: 'light', // Shadow Glass is weak to light (shattering)
};
// ─── Element Icon Mapping (Lucide Icons) ──────────────────────────────────────
@@ -71,6 +84,14 @@ export const ELEMENT_ICON_NAMES: Record<string, string> = {
stellar: 'Star',
void: 'CircleDot',
raw: 'Circle',
frost: 'Snowflake',
blackflame: 'Flame',
radiantflames: 'Sun',
miasma: 'Cloud',
shadowglass: 'EyeOff',
soul: 'Ghost',
time: 'Clock',
plasma: 'Zap',
};
// ─── Base Unlocked Elements ───────────────────────────────────────────────────
@@ -0,0 +1,72 @@
// ─── BlackFlame Spells ───────────────────────────────────────────────────────
// BlackFlame magic - Dark + Fire compound, curse/DoT focus
import type { SpellDef } from '../../types';
import { elemCost } from '../elements';
export const BLACKFLAME_SPELLS: Record<string, SpellDef> = {
// Tier 1 - Basic BlackFlame
blackFire: {
name: "Black Fire",
elem: "blackflame",
dmg: 12,
cost: elemCost("blackflame", 2),
tier: 1,
castSpeed: 2.2,
unlock: 200,
studyTime: 3,
desc: "Dark fire that burns with cursed flames. Applies curse DoT.",
effects: [{ type: 'burn', value: 0.15 }, { type: 'curse', value: 0.1 }]
},
shadowEmber: {
name: "Shadow Ember",
elem: "blackflame",
dmg: 20,
cost: elemCost("blackflame", 3),
tier: 1,
castSpeed: 1.8,
unlock: 320,
studyTime: 4,
desc: "Embers of shadow fire. Reduces enemy resistances.",
effects: [{ type: 'curse', value: 0.15 }]
},
// Tier 2 - Advanced BlackFlame
darkInferno: {
name: "Dark Inferno",
elem: "blackflame",
dmg: 38,
cost: elemCost("blackflame", 6),
tier: 2,
castSpeed: 1.3,
unlock: 1000,
studyTime: 9,
desc: "A cursed inferno that weakens and burns.",
effects: [{ type: 'burn', value: 0.25 }, { type: 'curse', value: 0.2 }]
},
umbralBlaze: {
name: "Umbral Blaze",
elem: "blackflame",
dmg: 55,
cost: elemCost("blackflame", 8),
tier: 2,
castSpeed: 1,
unlock: 1500,
studyTime: 12,
desc: "Flames from the abyss. Stacks curse on enemies.",
effects: [{ type: 'curse', value: 0.3 }, { type: 'burn', value: 0.2 }]
},
// Tier 3 - Master BlackFlame
hellfireCurse: {
name: "Hellfire Curse",
elem: "blackflame",
dmg: 140,
cost: elemCost("blackflame", 20),
tier: 3,
castSpeed: 0.5,
unlock: 15000,
studyTime: 30,
desc: "Ultimate cursed flames. Devastating DoT and resistance shred.",
effects: [{ type: 'burn', value: 0.35 }, { type: 'curse', value: 0.35 }]
},
};
@@ -0,0 +1,74 @@
// ─── Frost Spells ────────────────────────────────────────────────────────────
// Frost magic - Air + Water compound, freeze/slow focus
import type { SpellDef } from '../../types';
import { elemCost } from '../elements';
export const FROST_SPELLS: Record<string, SpellDef> = {
// Tier 1 - Basic Frost
frostBite: {
name: "Frost Bite",
elem: "frost",
dmg: 10,
cost: elemCost("frost", 2),
tier: 1,
castSpeed: 2.5,
unlock: 180,
studyTime: 3,
desc: "A chilling bite of frost. Fast casting with freeze chance.",
effects: [{ type: 'freeze', value: 0.15 }]
},
iceShard: {
name: "Ice Shard",
elem: "frost",
dmg: 18,
cost: elemCost("frost", 3),
tier: 1,
castSpeed: 2,
unlock: 250,
studyTime: 4,
desc: "A sharp shard of ice. Moderate speed, freeze effect.",
effects: [{ type: 'freeze', value: 0.2 }]
},
// Tier 2 - Advanced Frost
frostNova: {
name: "Frost Nova",
elem: "frost",
dmg: 30,
cost: elemCost("frost", 5),
tier: 2,
castSpeed: 1.5,
unlock: 800,
studyTime: 8,
desc: "An explosion of freezing cold. Slows all enemies.",
isAoe: true,
aoeTargets: 3,
effects: [{ type: 'slow', value: 0.3 }, { type: 'freeze', value: 0.15 }]
},
glacialSpike: {
name: "Glacial Spike",
elem: "frost",
dmg: 45,
cost: elemCost("frost", 7),
tier: 2,
castSpeed: 1.2,
unlock: 1200,
studyTime: 10,
desc: "A massive spike of ice. High damage with guaranteed freeze.",
effects: [{ type: 'freeze', value: 0.35 }]
},
// Tier 3 - Master Frost
absoluteZero: {
name: "Absolute Zero",
elem: "frost",
dmg: 120,
cost: elemCost("frost", 18),
tier: 3,
castSpeed: 0.6,
unlock: 12000,
studyTime: 28,
desc: "Freeze the very air. Devastating cold that stops all movement.",
effects: [{ type: 'freeze', value: 0.5 }, { type: 'slow', value: 0.4 }]
},
};
@@ -14,7 +14,7 @@ export const LEGENDARY_SPELLS: Record<string, SpellDef> = {
castSpeed: 0.4,
unlock: 50000,
studyTime: 48,
desc: "A nova of stellar energy."
desc: "A nova of stellar energy. Blinding and devastating."
},
voidCollapse: {
name: "Void Collapse",
@@ -0,0 +1,76 @@
// ─── Miasma Spells ────────────────────────────────────────────────────────────
// Miasma magic - Air + Death compound, toxic/plague/armor corrosion focus
import type { SpellDef } from '../../types';
import { elemCost } from '../elements';
export const MIASMA_SPELLS: Record<string, SpellDef> = {
// Tier 1 - Basic Miasma
toxicCloud: {
name: "Toxic Cloud",
elem: "miasma",
dmg: 9,
cost: elemCost("miasma", 2),
tier: 1,
castSpeed: 2.8,
unlock: 190,
studyTime: 3,
desc: "A cloud of toxic gas. Spreads to nearby enemies.",
effects: [{ type: 'poison', value: 0.12 }]
},
plagueTouch: {
name: "Plague Touch",
elem: "miasma",
dmg: 16,
cost: elemCost("miasma", 3),
tier: 1,
castSpeed: 2.2,
unlock: 280,
studyTime: 4,
desc: "Touch of plague. Corrodes armor and poisons.",
effects: [{ type: 'poison', value: 0.15 }, { type: 'armor_corrode', value: 0.1 }]
},
// Tier 2 - Advanced Miasma
miasmaBurst: {
name: "Miasma Burst",
elem: "miasma",
dmg: 32,
cost: elemCost("miasma", 5),
tier: 2,
castSpeed: 1.6,
unlock: 900,
studyTime: 8,
desc: "A burst of toxic miasma. Hits all enemies in swarm rooms.",
isAoe: true,
aoeTargets: 4,
effects: [{ type: 'poison', value: 0.2 }, { type: 'armor_corrode', value: 0.15 }]
},
pestilence: {
name: "Pestilence",
elem: "miasma",
dmg: 48,
cost: elemCost("miasma", 7),
tier: 2,
castSpeed: 1.2,
unlock: 1300,
studyTime: 11,
desc: "Spreading plague. Reduces armor and stacks poison.",
effects: [{ type: 'poison', value: 0.25 }, { type: 'armor_corrode', value: 0.2 }]
},
// Tier 3 - Master Miasma
deathMiasma: {
name: "Death Miasma",
elem: "miasma",
dmg: 130,
cost: elemCost("miasma", 18),
tier: 3,
castSpeed: 0.5,
unlock: 14000,
studyTime: 28,
desc: "Ultimate toxic cloud. Melts armor and spreads deadly plague.",
isAoe: true,
aoeTargets: 5,
effects: [{ type: 'poison', value: 0.35 }, { type: 'armor_corrode', value: 0.3 }]
},
};
@@ -0,0 +1,34 @@
// ─── Plasma Spells ────────────────────────────────────────────────────────────
// Plasma magic - Lightning + Fire + Transference exotic, high raw damage
import type { SpellDef } from '../../types';
import { elemCost } from '../elements';
export const PLASMA_SPELLS: Record<string, SpellDef> = {
// Tier 4 - Plasma Spells (raw energy devastation)
plasmaBolt: {
name: "Plasma Bolt",
elem: "plasma",
dmg: 320,
cost: elemCost("plasma", 10),
tier: 4,
castSpeed: 0.65,
unlock: 40000,
studyTime: 38,
desc: "A bolt of superheated plasma. Extremely high raw damage.",
effects: [{ type: 'raw_damage', value: 0.3 }]
},
plasmaStorm: {
name: "Plasma Storm",
elem: "plasma",
dmg: 600,
cost: elemCost("plasma", 18),
tier: 4,
castSpeed: 0.35,
unlock: 75000,
studyTime: 55,
desc: "A storm of plasma energy. Devastating area damage.",
isAoe: true,
aoeTargets: 4,
effects: [{ type: 'raw_damage', value: 0.4 }, { type: 'chain', value: 2 }]
},
};
@@ -0,0 +1,74 @@
// ─── Radiant Flames Spells ───────────────────────────────────────────────────
// Radiant Flames magic - Light + Fire compound, blinding/heavy DoT focus
import type { SpellDef } from '../../types';
import { elemCost } from '../elements';
export const RADIANTFLAMES_SPELLS: Record<string, SpellDef> = {
// Tier 1 - Basic Radiant Flames
radiantBurst: {
name: "Radiant Burst",
elem: "radiantflames",
dmg: 14,
cost: elemCost("radiantflames", 2),
tier: 1,
castSpeed: 2,
unlock: 210,
studyTime: 3,
desc: "A burst of blinding holy fire. Chance to blind enemies.",
effects: [{ type: 'burn', value: 0.18 }, { type: 'blind', value: 0.1 }]
},
holyFlame: {
name: "Holy Flame",
elem: "radiantflames",
dmg: 22,
cost: elemCost("radiantflames", 3),
tier: 1,
castSpeed: 1.7,
unlock: 340,
studyTime: 4,
desc: "Sacred fire that sears the unholy. Heavy burn effect.",
effects: [{ type: 'burn', value: 0.22 }]
},
// Tier 2 - Advanced Radiant Flames
blindingSun: {
name: "Blinding Sun",
elem: "radiantflames",
dmg: 40,
cost: elemCost("radiantflames", 6),
tier: 2,
castSpeed: 1.2,
unlock: 1100,
studyTime: 10,
desc: "Summon a miniature sun. Blinds and burns all enemies.",
isAoe: true,
aoeTargets: 3,
effects: [{ type: 'blind', value: 0.25 }, { type: 'burn', value: 0.25 }]
},
purifyingFire: {
name: "Purifying Fire",
elem: "radiantflames",
dmg: 58,
cost: elemCost("radiantflames", 8),
tier: 2,
castSpeed: 0.9,
unlock: 1600,
studyTime: 12,
desc: "Holy flames that purify. Highest burn damage.",
effects: [{ type: 'burn', value: 0.35 }]
},
// Tier 3 - Master Radiant Flames
supernovaBlast: {
name: "Supernova Blast",
elem: "radiantflames",
dmg: 150,
cost: elemCost("radiantflames", 20),
tier: 3,
castSpeed: 0.5,
unlock: 16000,
studyTime: 30,
desc: "Unleash the fury of a supernova. Blinds and incinerates.",
effects: [{ type: 'blind', value: 0.4 }, { type: 'burn', value: 0.4 }]
},
};
@@ -0,0 +1,74 @@
// ─── Shadow Glass Spells ─────────────────────────────────────────────────────
// Shadow Glass magic - Earth + Dark compound, spike/armor pierce focus
import type { SpellDef } from '../../types';
import { elemCost } from '../elements';
export const SHADOWGLASS_SPELLS: Record<string, SpellDef> = {
// Tier 1 - Basic Shadow Glass
shadowSpike: {
name: "Shadow Spike",
elem: "shadowglass",
dmg: 15,
cost: elemCost("shadowglass", 2),
tier: 1,
castSpeed: 2,
unlock: 220,
studyTime: 3,
desc: "A spike of shadow glass erupts from the ground. Sharp and fast.",
effects: [{ type: 'armor_pierce', value: 0.2 }]
},
darkShard: {
name: "Dark Shard",
elem: "shadowglass",
dmg: 24,
cost: elemCost("shadowglass", 3),
tier: 1,
castSpeed: 1.6,
unlock: 360,
studyTime: 4,
desc: "A shard of pure shadow glass. High armor pierce.",
effects: [{ type: 'armor_pierce', value: 0.28 }]
},
// Tier 2 - Advanced Shadow Glass
obsidianStorm: {
name: "Obsidian Storm",
elem: "shadowglass",
dmg: 42,
cost: elemCost("shadowglass", 6),
tier: 2,
castSpeed: 1.3,
unlock: 1000,
studyTime: 9,
desc: "A storm of shadow glass shards. Hits multiple enemies.",
isAoe: true,
aoeTargets: 3,
effects: [{ type: 'armor_pierce', value: 0.3 }]
},
voidBlade: {
name: "Void Blade",
elem: "shadowglass",
dmg: 60,
cost: elemCost("shadowglass", 9),
tier: 2,
castSpeed: 0.9,
unlock: 1700,
studyTime: 12,
desc: "A blade of condensed shadow. Ignores most armor.",
effects: [{ type: 'armor_pierce', value: 0.42 }]
},
// Tier 3 - Master Shadow Glass
shadowGlassCataclysm: {
name: "Shadow Glass Cataclysm",
elem: "shadowglass",
dmg: 155,
cost: elemCost("shadowglass", 20),
tier: 3,
castSpeed: 0.5,
unlock: 17000,
studyTime: 30,
desc: "Shatter the earth into a storm of shadow glass. Ignores all armor.",
effects: [{ type: 'armor_pierce', value: 0.55 }]
},
};
@@ -0,0 +1,32 @@
// ─── Soul Spells ──────────────────────────────────────────────────────────────
// Soul magic - Light + Dark + Transference exotic, bypasses defenses
import type { SpellDef } from '../../types';
import { elemCost } from '../elements';
export const SOUL_SPELLS: Record<string, SpellDef> = {
// Tier 4 - Soul Spells (defense bypass)
soulPierce: {
name: "Soul Pierce",
elem: "soul",
dmg: 350,
cost: elemCost("soul", 10),
tier: 4,
castSpeed: 0.6,
unlock: 30000,
studyTime: 36,
desc: "Strike at the soul. Bypasses all armor and resistances.",
effects: [{ type: 'defense_bypass', value: 1.0 }]
},
spiritBlast: {
name: "Spirit Blast",
elem: "soul",
dmg: 550,
cost: elemCost("soul", 16),
tier: 4,
castSpeed: 0.4,
unlock: 60000,
studyTime: 50,
desc: "A blast of pure soul energy. Ignores all defenses entirely.",
effects: [{ type: 'defense_bypass', value: 1.0 }, { type: 'resist_ignore', value: 0.5 }]
},
};
@@ -0,0 +1,32 @@
// ─── Time Spells ──────────────────────────────────────────────────────────────
// Time magic - Soul + Sand + Transference exotic, slow/temporal focus
import type { SpellDef } from '../../types';
import { elemCost } from '../elements';
export const TIME_SPELLS: Record<string, SpellDef> = {
// Tier 4 - Time Spells (temporal manipulation)
temporalWarp: {
name: "Temporal Warp",
elem: "time",
dmg: 280,
cost: elemCost("time", 10),
tier: 4,
castSpeed: 0.7,
unlock: 45000,
studyTime: 40,
desc: "Warp time around enemies. Slows speed, reduces dodge.",
effects: [{ type: 'slow', value: 0.5 }, { type: 'temporal_dodge_reduction', value: 0.4 }]
},
chronoStasis: {
name: "Chrono Stasis",
elem: "time",
dmg: 500,
cost: elemCost("time", 18),
tier: 4,
castSpeed: 0.35,
unlock: 70000,
studyTime: 55,
desc: "Freeze enemies in time. Stops mage room recast entirely.",
effects: [{ type: 'slow', value: 0.7 }, { type: 'temporal_dodge_reduction', value: 0.6 }, { type: 'mage_lock', value: 1.0 }]
},
};
+24
View File
@@ -12,6 +12,14 @@ export { LEGENDARY_SPELLS } from './spells-modules/legendary-spells';
export { ENCHANTMENT_SPELLS } from './spells-modules/enchantment-spells';
export { COMPOUND_SPELLS } from './spells-modules/compound-spells';
export { UTILITY_SPELLS } from './spells-modules/utility-spells';
export { FROST_SPELLS } from './spells-modules/frost-spells';
export { BLACKFLAME_SPELLS } from './spells-modules/blackflame-spells';
export { RADIANTFLAMES_SPELLS } from './spells-modules/radiantflames-spells';
export { MIASMA_SPELLS } from './spells-modules/miasma-spells';
export { SHADOWGLASS_SPELLS } from './spells-modules/shadowglass-spells';
export { SOUL_SPELLS } from './spells-modules/soul-spells';
export { TIME_SPELLS } from './spells-modules/time-spells';
export { PLASMA_SPELLS } from './spells-modules/plasma-spells';
// Convenience: export combined SPELLS_DEF for backward compatibility
import { RAW_SPELLS } from './spells-modules/raw-spells';
@@ -24,6 +32,14 @@ import { LEGENDARY_SPELLS } from './spells-modules/legendary-spells';
import { ENCHANTMENT_SPELLS } from './spells-modules/enchantment-spells';
import { COMPOUND_SPELLS } from './spells-modules/compound-spells';
import { UTILITY_SPELLS } from './spells-modules/utility-spells';
import { FROST_SPELLS } from './spells-modules/frost-spells';
import { BLACKFLAME_SPELLS } from './spells-modules/blackflame-spells';
import { RADIANTFLAMES_SPELLS } from './spells-modules/radiantflames-spells';
import { MIASMA_SPELLS } from './spells-modules/miasma-spells';
import { SHADOWGLASS_SPELLS } from './spells-modules/shadowglass-spells';
import { SOUL_SPELLS } from './spells-modules/soul-spells';
import { TIME_SPELLS } from './spells-modules/time-spells';
import { PLASMA_SPELLS } from './spells-modules/plasma-spells';
export const SPELLS_DEF: Record<string, import('../types').SpellDef> = {
...RAW_SPELLS,
@@ -36,4 +52,12 @@ export const SPELLS_DEF: Record<string, import('../types').SpellDef> = {
...ENCHANTMENT_SPELLS,
...COMPOUND_SPELLS,
...UTILITY_SPELLS,
...FROST_SPELLS,
...BLACKFLAME_SPELLS,
...RADIANTFLAMES_SPELLS,
...MIASMA_SPELLS,
...SHADOWGLASS_SPELLS,
...SOUL_SPELLS,
...TIME_SPELLS,
...PLASMA_SPELLS,
};