From 33d08450bdf55bc67235d65a449a9314d05f8dce Mon Sep 17 00:00:00 2001
From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54>
Date: Sun, 5 Dec 2010 14:34:51 +0000
Subject: [PATCH] plop

git-svn-id: http://svn.net-core.org/repos/t-engine4@2101 51575b47-30f0-44d4-a5cc-537603b46e54
---
 game/modules/tome/data/talents/spells/air.lua |  2 +-
 .../tome/data/talents/spells/explosives.lua   | 12 ++-
 game/modules/tome/data/talents/spells/ice.lua | 36 ++++++---
 .../tome/data/talents/spells/infusion.lua     | 20 ++++-
 .../modules/tome/data/talents/spells/meta.lua | 32 +++++---
 .../tome/data/talents/spells/nature.lua       | 29 ++++---
 .../tome/data/talents/spells/phantasm.lua     | 37 +++++----
 .../tome/data/talents/spells/staff-combat.lua | 29 +++++--
 .../data/talents/spells/stone-alchemy.lua     | 28 +++++--
 .../tome/data/talents/spells/stone.lua        | 76 ++++++++++++-------
 .../tome/data/talents/spells/storm.lua        | 45 +++++++----
 .../tome/data/talents/spells/temporal.lua     | 32 +++++---
 .../tome/data/talents/spells/water.lua        | 55 ++++++++------
 .../tome/data/talents/spells/wildfire.lua     | 32 +++++---
 14 files changed, 307 insertions(+), 158 deletions(-)

diff --git a/game/modules/tome/data/talents/spells/air.lua b/game/modules/tome/data/talents/spells/air.lua
index 4cba2947d4..125735eefb 100644
--- a/game/modules/tome/data/talents/spells/air.lua
+++ b/game/modules/tome/data/talents/spells/air.lua
@@ -236,7 +236,7 @@ newTalent{
 		local manadrain = t.getManaDrain(self, t)
 		return ([[Conjures a furious, raging lightning storm with a radius of 5 that follows you as long as this spell is active.
 		Each turn a random lightning bolt will hit up to %d of your foes for 1 to %0.2f damage.
-		This powerful spell will continuously drain %0.1f mana while active.
+		This powerful spell will continuously drain %0.2f mana while active.
 		The damage will increase with the Magic stat]]):
 		format(targetcount, damDesc(self, DamageType.LIGHTNING, damage),-manadrain)
 	end,
diff --git a/game/modules/tome/data/talents/spells/explosives.lua b/game/modules/tome/data/talents/spells/explosives.lua
index 8ec90060db..611a178dd5 100644
--- a/game/modules/tome/data/talents/spells/explosives.lua
+++ b/game/modules/tome/data/talents/spells/explosives.lua
@@ -33,10 +33,14 @@ newTalent{
 		local inc_dam = 0
 		local damtype = DamageType.FIRE
 		local particle = "ball_fire"
-		if self:isTalentActive(self.T_ACID_INFUSION) then inc_dam = self:getTalentLevel(self.T_ACID_INFUSION) * 0.05; damtype = DamageType.ACID_BLIND; particle = "ball_acid"
-		elseif self:isTalentActive(self.T_LIGHTNING_INFUSION) then inc_dam = self:getTalentLevel(self.T_LIGHTNING_INFUSION) * 0.05; damtype = DamageType.LIGHTNING_DAZE; particle = "ball_lightning"
-		elseif self:isTalentActive(self.T_FROST_INFUSION) then inc_dam = self:getTalentLevel(self.T_FROST_INFUSION) * 0.05; damtype = DamageType.ICE; particle = "ball_ice"
-		else inc_dam = self:getTalentLevel(self.T_FIRE_INFUSION) * 0.07 + (ammo.alchemist_bomb.power or 0) / 100; damtype = self:knowTalent(self.T_FIRE_INFUSION) and DamageType.FIREBURN or DamageType.FIRE
+		local acidi = self:getTalentFromId(Talents.T_ACID_INFUSION)
+		local lightningi = self:getTalentFromId(Talents.T_LIGHTNING_INFUSION)
+		local frosti = self:getTalentFromId(Talents.T_FROST_INFUSION)
+		local fireinf = self:getTalentFromId(Talents.T_FIRE_INFUSION)
+		if self:isTalentActive(self.T_ACID_INFUSION) then inc_dam = acidi.getIncrease(self,acidi); damtype = DamageType.ACID_BLIND; particle = "ball_acid"
+		elseif self:isTalentActive(self.T_LIGHTNING_INFUSION) then inc_dam = lightningi.getIncrease(self,lightningi); damtype = DamageType.LIGHTNING_DAZE; particle = "ball_lightning"
+		elseif self:isTalentActive(self.T_FROST_INFUSION) then inc_dam = frosti.getIncrease(self,frosti); damtype = DamageType.ICE; particle = "ball_ice"
+		else inc_dam = fireinf.getIncrease(self,fireinf) + (ammo.alchemist_bomb.power or 0) / 100; damtype = self:knowTalent(self.T_FIRE_INFUSION) and DamageType.FIREBURN or DamageType.FIRE
 		end
 		local dam = self:combatTalentSpellDamage(t, 15, 150, (ammo.alchemist_power + self:combatSpellpower()) / 2)
 		dam = dam * (1 + inc_dam)
diff --git a/game/modules/tome/data/talents/spells/ice.lua b/game/modules/tome/data/talents/spells/ice.lua
index c1f63a727a..c7ea1f911d 100644
--- a/game/modules/tome/data/talents/spells/ice.lua
+++ b/game/modules/tome/data/talents/spells/ice.lua
@@ -30,6 +30,7 @@ newTalent{
 	range = 20,
 	proj_speed = 3,
 	requires_target = true,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 18, 200) end,
 	action = function(self, t)
 		local tg = {type="ball", range=self:getTalentRange(t), radius=1, talent=t}
 		local x, y = self:getTarget(tg)
@@ -38,7 +39,7 @@ newTalent{
 			local actor = game.level.map(px, py, Map.ACTOR)
 			if actor and actor ~= self then
 				local tg2 = {type="bolt", range=self:getTalentRange(t), talent=t, display={particle="ice_shards"}}
-				self:projectile(tg2, px, py, DamageType.ICE, self:spellCrit(self:combatTalentSpellDamage(t, 18, 200)), {type="freeze"})
+				self:projectile(tg2, px, py, DamageType.ICE, self:spellCrit(t.getDamage(self, t)), {type="freeze"})
 			end
 		end)
 
@@ -46,9 +47,11 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
+		local damage = t.getDamage(self, t)
 		return ([[Invoke ice shards at the targets in the selected area. Each shard travels slowly and does %0.2f ice damage on impact.
 		This spell will never hit the caster.
-		The damage will increase with the Magic stat]]):format(damDesc(self, DamageType.COLD, self:combatTalentSpellDamage(t, 25, 200)))
+		The damage will increase with the Magic stat]]):
+		format(damDesc(self, DamageType.COLD, damage))
 	end,
 }
 
@@ -63,17 +66,19 @@ newTalent{
 		ATTACKAREA = 10,
 	},
 	range = function(self, t) return 1 + self:getTalentLevelRaw(t) end,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 10, 180) end,
 	action = function(self, t)
 		local tg = {type="ball", range=0, radius=self:getTalentRange(t), friendlyfire=false, talent=t}
-		local grids = self:project(tg, self.x, self.y, DamageType.COLDNEVERMOVE, {dur=4, dam=self:spellCrit(self:combatTalentSpellDamage(t, 10, 180))})
+		local grids = self:project(tg, self.x, self.y, DamageType.COLDNEVERMOVE, {dur=4, dam=self:spellCrit(t.getDamage(self, t))})
 		game.level.map:particleEmitter(self.x, self.y, tg.radius, "ball_ice", {radius=tg.radius})
 		game:playSoundNear(self, "talents/ice")
 		return true
 	end,
 	info = function(self, t)
-		return ([[Blast a wave of cold all around you, doing %0.2f cold damage and freezing creatures to the ground for %d turns.
+		local damage = t.getDamage(self, t)
+		return ([[Blast a wave of cold all around you, doing %0.2f cold damage and freezing creatures to the ground for 4 turns.
 		Affected creatures can still act but not move.
-		The damage will increase with the Magic stat]]):format(damDesc(self, DamageType.COLD, self:combatTalentSpellDamage(t, 10, 180)), 4)
+		The damage will increase with the Magic stat]]):format(damDesc(self, DamageType.COLD, damage))
 	end,
 }
 
@@ -88,8 +93,10 @@ newTalent{
 		ATTACKAREA = 10,
 	},
 	range = 20,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 10, 180) end,
+	getTargetCount = function(self, t) return math.ceil(self:getTalentLevel(t) + 2) end,
 	action = function(self, t)
-		local max = math.ceil(self:getTalentLevel(t) + 2)
+		local max = t.getTargetCount(self, t)
 		for i, act in ipairs(self.fov.actors_dist) do
 			if self:reactionToward(act) < 0 then
 				if not act:attr("frozen") then break end
@@ -107,7 +114,7 @@ newTalent{
 					if act.rank == 2 then add_crit = 50
 					elseif act.rank == 3 then add_crit = 10 end
 					local tg = {type="hit", friendlyfire=false, talent=t}
-					local grids = self:project(tg, act.x, act.y, DamageType.COLD, self:spellCrit(self:combatTalentSpellDamage(t, 10, 180), add_crit))
+					local grids = self:project(tg, act.x, act.y, DamageType.COLD, self:spellCrit(t.getDamage(self, t), add_crit))
 					game.level.map:particleEmitter(act.x, act.y, tg.radius, "ball_ice", {radius=1})
 				end
 
@@ -119,13 +126,16 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
+		local damage = t.getDamage(self, t)
+		local targetcount = t.getTargetCount(self, t)
 		return ([[Shatter all frozen targets in your line of sight, doing %0.2f cold damage.
 		Depending on the target rank it will also have an additional effect:
 		* Critters will be instantly killed
 		* Normal rank will get +50%% critical chance
 		* Elites will get +10%% critical chance
 		At most it will affect %d foes.
-		The damage will increase with the Magic stat]]):format(damDesc(self, DamageType.COLD, self:combatTalentSpellDamage(t, 10, 180)), math.ceil(self:getTalentLevel(t) + 2))
+		The damage will increase with the Magic stat]]):
+		format(damDesc(self, DamageType.COLD, damage), targetcount)
 	end,
 }
 
@@ -137,11 +147,13 @@ newTalent{
 	mode = "sustained",
 	sustain_mana = 50,
 	cooldown = 30,
+	getColdDamageIncrease = function(self, t) return self:getTalentLevelRaw(t) * 2 end,
+	getResistPenalty = function(self, t) return self:getTalentLevelRaw(t) * 10 end,
 	activate = function(self, t)
 		game:playSoundNear(self, "talents/ice")
 		return {
-			dam = self:addTemporaryValue("inc_damage", {[DamageType.COLD] = self:getTalentLevelRaw(t) * 2}),
-			resist = self:addTemporaryValue("resists_pen", {[DamageType.COLD] = self:getTalentLevelRaw(t) * 10}),
+			dam = self:addTemporaryValue("inc_damage", {[DamageType.COLD] = t.getColdDamageIncrease(self, t)}),
+			resist = self:addTemporaryValue("resists_pen", {[DamageType.COLD] = t.getResistPenalty(self, t)}),
 			particle = self:addParticles(Particles.new("uttercold", 1)),
 		}
 	end,
@@ -152,7 +164,9 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
+		local damageinc = t.getColdDamageIncrease(self, t)
+		local ressistpen = t.getResistPenalty(self, t)
 		return ([[Surround yourself with Uttercold, increasing all your cold damage by %d%% and ignoring %d%% cold resistance of your targets.]])
-		:format(self:getTalentLevelRaw(t) * 2, self:getTalentLevelRaw(t) * 10)
+		:format(damageinc, ressistpen)
 	end,
 }
diff --git a/game/modules/tome/data/talents/spells/infusion.lua b/game/modules/tome/data/talents/spells/infusion.lua
index 409e575ee8..0d7c4eede1 100644
--- a/game/modules/tome/data/talents/spells/infusion.lua
+++ b/game/modules/tome/data/talents/spells/infusion.lua
@@ -32,8 +32,11 @@ newTalent{
 	mode = "passive",
 	require = spells_req1,
 	points = 5,
+	getIncrease = function(self, t) return self:getTalentLevel(t) * 0.07 end,
 	info = function(self, t)
-		return ([[When you throw your alchemist bombs you infuse them with explosive fire, increasing damage by %d%%, and setting foes ablaze.]]):format(self:getTalentLevel(t) * 7)
+		local daminc = t.getIncrease(self, t)
+		return ([[When you throw your alchemist bombs you infuse them with explosive fire, increasing damage by %d%%, and setting foes ablaze.]]):
+		format(100 * daminc)
 	end,
 }
 
@@ -45,6 +48,7 @@ newTalent{
 	sustain_mana = 30,
 	points = 5,
 	cooldown = 30,
+	getIncrease = function(self, t) return self:getTalentLevel(t) * 0.05 end,
 	activate = function(self, t)
 		cancelInfusions(self)
 		game:playSoundNear(self, "talents/arcane")
@@ -57,7 +61,9 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[When you throw your alchemist bombs you infuse them with explosive acid that can blind, increasing damage by %d%%.]]):format(self:getTalentLevel(t) * 5)
+		local daminc = t.getIncrease(self, t)
+		return ([[When you throw your alchemist bombs you infuse them with explosive acid that can blind, increasing damage by %d%%.]]):
+		format(daminc)
 	end,
 }
 
@@ -69,6 +75,7 @@ newTalent{
 	sustain_mana = 30,
 	points = 5,
 	cooldown = 30,
+	getIncrease = function(self, t) return self:getTalentLevel(t) * 0.05 end,
 	activate = function(self, t)
 		cancelInfusions(self)
 		game:playSoundNear(self, "talents/arcane")
@@ -81,7 +88,9 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[When you throw your alchemist bombs you infuse them with lightning that can daze, increasing damage by %d%%.]]):format(self:getTalentLevel(t) * 5)
+		local daminc = t.getIncrease(self, t)
+		return ([[When you throw your alchemist bombs you infuse them with lightning that can daze, increasing damage by %d%%.]]):
+		format(daminc)
 	end,
 }
 
@@ -93,6 +102,7 @@ newTalent{
 	sustain_mana = 30,
 	points = 5,
 	cooldown = 30,
+	getIncrease = function(self, t) return self:getTalentLevel(t) * 0.05 end,
 	activate = function(self, t)
 		cancelInfusions(self)
 		game:playSoundNear(self, "talents/arcane")
@@ -105,6 +115,8 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[When you throw your alchemist bombs you infuse them with frost that can freeze, increasing damage by %d%%.]]):format(self:getTalentLevel(t) * 5)
+		local daminc = t.getIncrease(self, t)
+		return ([[When you throw your alchemist bombs you infuse them with frost that can freeze, increasing damage by %d%%.]]):
+		format(daminc)
 	end,
 }
diff --git a/game/modules/tome/data/talents/spells/meta.lua b/game/modules/tome/data/talents/spells/meta.lua
index ab26288fd5..17dcf662bd 100644
--- a/game/modules/tome/data/talents/spells/meta.lua
+++ b/game/modules/tome/data/talents/spells/meta.lua
@@ -28,6 +28,7 @@ newTalent{
 	direct_hit = true,
 	requires_target = function(self, t) return self:getTalentLevel(t) >= 3 end,
 	range = 20,
+	getRemoveCount = function(self, t) return math.floor(self:getTalentLevel(t)) end,
 	action = function(self, t)
 		local target = self
 
@@ -55,7 +56,7 @@ newTalent{
 			end
 		end
 
-		for i = 1, math.floor(self:getTalentLevel(t)) do
+		for i = 1, t.getRemoveCount(self, t) do
 			if #effs == 0 then break end
 			local eff = rng.tableRemove(effs)
 
@@ -69,9 +70,10 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
+		local count = t.getRemoveCount(self, t)
 		return ([[Removes up to %d magical effects (both good and bad) from the target.
-		At level 3 it can be targetted.
-		]]):format(self:getTalentLevel(t))
+		At level 3 it can be targetted.]]):
+		format(count)
 	end,
 }
 
@@ -81,9 +83,11 @@ newTalent{
 	require = spells_req2,
 	points = 5,
 	mode = "passive",
+	getChance = function(self, t) return self:getTalentLevelRaw(t) * 20 end,
 	info = function(self, t)
+		local chance = t.getChance(self, t)
 		return ([[You learn to shape your area spells, allowing you to carve a hole in them to avoid damaging yourself.  The chance of success is %d%%.]]):
-		format(self:getTalentLevelRaw(t) * 20)
+		format(chance)
 	end,
 }
 
@@ -98,11 +102,11 @@ newTalent{
 	tactical = {
 		BUFF = 10,
 	},
+	getCooldownReduction = function(self, t) return util.bound(self:getTalentLevelRaw(t) / 15, 0.05, 0.3) end,
 	activate = function(self, t)
 		game:playSoundNear(self, "talents/spell_generic")
-		local power = util.bound(self:getTalentLevelRaw(t) / 15, 0.05, 0.3)
 		return {
-			cd = self:addTemporaryValue("spell_cooldown_reduction", power),
+			cd = self:addTemporaryValue("spell_cooldown_reduction", t.getCooldownReduction(self, t)),
 		}
 	end,
 	deactivate = function(self, t, p)
@@ -110,8 +114,9 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Reduces the cooldown of all spells by %d%%.
-		The reduction increases with the Magic stat]]):format(util.bound(self:getTalentLevelRaw(t) / 15, 0.05, 0.3) * 100)
+		local cooldownred = t.getCooldownReduction(self, t)
+		return ([[Reduces the cooldown of all spells by %d%%.]]):
+		format(cooldownred * 100)
 	end,
 }
 
@@ -122,16 +127,17 @@ newTalent{
 	points = 5,
 	mana = 70,
 	cooldown = 50,
+	getTalentCount = function(self, t) return math.ceil(self:getTalentLevel(t) + 2) end,
+	getMaxLevel = function(self, t) return self:getTalentLevelRaw(t) end,
 	action = function(self, t)
-		local nb = math.ceil(self:getTalentLevel(t) + 2)
 		local tids = {}
 		for tid, _ in pairs(self.talents_cd) do
 			local tt = self:getTalentFromId(tid)
-			if tt.type[2] <= self:getTalentLevelRaw(t) and tt.type[1]:find("^spell/") then
+			if tt.type[2] <= t.getMaxLevel(self, t) and tt.type[1]:find("^spell/") then
 				tids[#tids+1] = tid
 			end
 		end
-		for i = 1, nb do
+		for i = 1, t.getTalentCount(self, t) do
 			if #tids == 0 then break end
 			local tid = rng.tableRemove(tids)
 			self.talents_cd[tid] = nil
@@ -141,7 +147,9 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
+		local talentcount = t.getTalentCount(self, t)
+		local maxlevel = t.getMaxLevel(self, t)
 		return ([[Your mastery of the arcane flows allow you to reset the cooldown of %d of your spells of level %d or less.]]):
-		format(math.ceil(self:getTalentLevel(t) + 2), self:getTalentLevelRaw(t))
+		format(talentcount, maxlevel)
 	end,
 }
diff --git a/game/modules/tome/data/talents/spells/nature.lua b/game/modules/tome/data/talents/spells/nature.lua
index dd6cabaa1d..264f2fad1a 100644
--- a/game/modules/tome/data/talents/spells/nature.lua
+++ b/game/modules/tome/data/talents/spells/nature.lua
@@ -29,14 +29,17 @@ newTalent{
 	tactical = {
 		HEAL = 10,
 	},
+	getRegeneration = function(self, t) return self:combatTalentSpellDamage(t, 5, 25) end,
 	action = function(self, t)
-		self:setEffect(self.EFF_REGENERATION, 10, {power=self:combatTalentSpellDamage(t, 5, 25)})
+		self:setEffect(self.EFF_REGENERATION, 10, {power=t.getRegeneration(self, t)})
 		game:playSoundNear(self, "talents/heal")
 		return true
 	end,
 	info = function(self, t)
+		local regen = t.getRegeneration(self, t)
 		return ([[Call upon the forces of nature to regenerate your body for %d life every turn for 10 turns.
-		The life healed will increase with the Magic stat]]):format(self:combatTalentSpellDamage(t, 5, 25))
+		The life healed will increase with the Magic stat]]):
+		format(regen)
 	end,
 }
 
@@ -51,14 +54,17 @@ newTalent{
 	tactical = {
 		HEAL = 10,
 	},
+	getHeal = function(self, t) return self:combatTalentSpellDamage(t, 40, 220) end,
 	action = function(self, t)
-		self:heal(self:spellCrit(self:combatTalentSpellDamage(t, 40, 220)), self)
+		self:heal(self:spellCrit(t.getHeal(self, t)), self)
 		game:playSoundNear(self, "talents/heal")
 		return true
 	end,
 	info = function(self, t)
+		local heal = t.getHeal(self, t)
 		return ([[Call upon the forces of nature to heal your body for %d life.
-		The life healed will increase with the Magic stat]]):format(self:combatTalentSpellDamage(t, 40, 220))
+		The life healed will increase with the Magic stat]]):
+		format(heal)
 	end,
 }
 
@@ -70,6 +76,7 @@ newTalent{
 	random_ego = "defensive",
 	mana = 30,
 	cooldown = 15,
+	getCureCount = function(self, t) return math.floor(self:getTalentLevel(t)) end,
 	action = function(self, t)
 		local target = self
 		local effs = {}
@@ -82,7 +89,7 @@ newTalent{
 			end
 		end
 
-		for i = 1, math.floor(self:getTalentLevel(t)) do
+		for i = 1, t.getCureCount(self, t) do
 			if #effs == 0 then break end
 			local eff = rng.tableRemove(effs)
 
@@ -95,7 +102,9 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Call upon the forces of nature to cure your body of %d poisons and diseases (at level 3).]]):format(math.floor(self:getTalentLevel(t)))
+		local curecount = t.getCureCount(self, t)
+		return ([[Call upon the forces of nature to cure your body of %d poisons and diseases (at level 3).]]):
+		format(curecount)
 	end,
 }
 
@@ -111,6 +120,7 @@ newTalent{
 		ATTACK = 10,
 	},
 	requires_target = true,
+	getSummonTime = function(self, t) return util.bound(self:getTalentLevel(t) * self:combatSpellpower(0.10), 5, 90) end,
 	action = function(self, t)
 		if not self:canBe("summon") then game.logPlayer(self, "You can not summon, you are suppressed!") return end
 
@@ -150,7 +160,7 @@ newTalent{
 			combat = { dam=resolvers.rngavg(12,25), atk=10, apr=10, physspeed=2 },
 
 			summoner = self,
-			summon_time = util.bound(self:getTalentLevel(t) * self:combatSpellpower(0.10), 5, 90),
+			summon_time = t.getSummonTime(self, t),
 		}
 
 		bear:resolve()
@@ -160,7 +170,8 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Call upon the forces of nature to summon a bear ally for %d turns.
-		The power of the ally will increase with the Magic stat]]):format(util.bound(self:getTalentLevel(t) * self:combatSpellpower(0.10), 5, 90))
+		local summon_time = t.getSummonTime(self, t)
+		return ([[Call upon the forces of nature to summon a bear ally for %d turns.]]):
+		format(summon_time)
 	end,
 }
diff --git a/game/modules/tome/data/talents/spells/phantasm.lua b/game/modules/tome/data/talents/spells/phantasm.lua
index 7f856dc1a5..aef0a3c6e2 100644
--- a/game/modules/tome/data/talents/spells/phantasm.lua
+++ b/game/modules/tome/data/talents/spells/phantasm.lua
@@ -25,20 +25,23 @@ newTalent{
 	points = 5,
 	mana = 5,
 	cooldown = 14,
+	getRadius = function(self, t) return 5 + self:getTalentLevel(t) end,
+	getBlindPower = function(self, t) return 3 + self:getTalentLevel(t) end,
 	action = function(self, t)
-		local tg = {type="ball", range=0, friendlyfire=true, radius=5 + self:getTalentLevel(t), talent=t}
+		local tg = {type="ball", range=0, friendlyfire=true, radius=t.getRadius(self, t), talent=t}
 		self:project(tg, self.x, self.y, DamageType.LITE, 1)
 		if self:getTalentLevel(t) >= 3 then
 			tg.friendlyfire = false
-			self:project(tg, self.x, self.y, DamageType.BLIND, 3 + self:getTalentLevel(t))
+			self:project(tg, self.x, self.y, DamageType.BLIND, t.getBlindPower(self, t))
 		end
 		game:playSoundNear(self, "talents/heal")
 		return true
 	end,
 	info = function(self, t)
+		local radius = t.getRadius(self, t)
 		return ([[Creates a globe of pure light with a radius of %d that illuminates the area.
-		At level 3 it also blinds all who see it (except the caster).
-		The radius will increase with the Magic stat]]):format(5 + self:getTalentLevel(t))
+		At level 3 it also blinds all who see it (except the caster).]]):
+		format(radius)
 	end,
 }
 
@@ -53,12 +56,12 @@ newTalent{
 	tactical = {
 		DEFEND = 10,
 	},
+	getDefense = function(self, t) return self:combatTalentSpellDamage(t, 4, 30) end,
 	activate = function(self, t)
-		local power = self:combatTalentSpellDamage(t, 4, 30)
 		game:playSoundNear(self, "talents/heal")
 		return {
 			particle = self:addParticles(Particles.new("phantasm_shield", 1)),
-			def = self:addTemporaryValue("combat_def", power),
+			def = self:addTemporaryValue("combat_def", t.getDefense(self, t)),
 		}
 	end,
 	deactivate = function(self, t, p)
@@ -67,8 +70,10 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
+		local defence = t.getDefense(self, t)
 		return ([[The caster's image blurs, granting %d bonus to defense.
-		The bonus will increase with the Magic stat]]):format(self:combatTalentSpellDamage(t, 4, 30))
+		The bonus will increase with the Magic stat]]):
+		format(defence)
 	end,
 }
 
@@ -83,12 +88,12 @@ newTalent{
 	tactical = {
 		DEFEND = 10,
 	},
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 10, 50) end,
 	activate = function(self, t)
-		local power = self:combatTalentSpellDamage(t, 10, 50)
 		game:playSoundNear(self, "talents/heal")
 		return {
 			particle = self:addParticles(Particles.new("phantasm_shield", 1)),
-			onhit = self:addTemporaryValue("on_melee_hit", {[DamageType.ARCANE]=power}),
+			onhit = self:addTemporaryValue("on_melee_hit", {[DamageType.ARCANE]=t.getDamage(self, t)}),
 		}
 	end,
 	deactivate = function(self, t, p)
@@ -97,8 +102,10 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
+		local damage = t.getDamage(self, t)
 		return ([[The caster is surrounded by a phantasmal shield. If hit in melee, the shield will deal %d arcane damage to the attacker.
-		The damage will increase with the Magic stat]]):format(damDesc(self, DamageType.ARCANE, self:combatTalentSpellDamage(t, 10, 50)))
+		The damage will increase with the Magic stat]]):
+		format(damDesc(self, DamageType.ARCANE, damage))
 	end,
 }
 
@@ -113,11 +120,11 @@ newTalent{
 	tactical = {
 		DEFEND = 10,
 	},
+	getInvisibilityPower = function(self, t) return self:combatTalentSpellDamage(t, 10, 50) end,
 	activate = function(self, t)
-		local power = self:combatTalentSpellDamage(t, 10, 30)
 		game:playSoundNear(self, "talents/heal")
 		return {
-			invisible = self:addTemporaryValue("invisible", power),
+			invisible = self:addTemporaryValue("invisible", t.getInvisibilityPower(self, t)),
 			drain = self:addTemporaryValue("mana_regen", -5),
 		}
 	end,
@@ -127,9 +134,11 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
+		local invisi = t.getInvisibilityPower(self, t)
 		return ([[The caster fades from sight, granting %d bonus to invisibility.
 		Beware, you should take off your light, otherwise you will still be easily spotted.
-		This powerful spell constantly drains your mana while active.
-		The bonus will increase with the Magic stat]]):format(self:combatTalentSpellDamage(t, 10, 30))
+		This powerful spell constantly drains your 5 mana while active.
+		The bonus will increase with the Magic stat]]):
+		format(invisi)
 	end,
 }
diff --git a/game/modules/tome/data/talents/spells/staff-combat.lua b/game/modules/tome/data/talents/spells/staff-combat.lua
index 3f8fd82291..6028150be0 100644
--- a/game/modules/tome/data/talents/spells/staff-combat.lua
+++ b/game/modules/tome/data/talents/spells/staff-combat.lua
@@ -30,6 +30,7 @@ newTalent{
 	reflectable = true,
 	proj_speed = 20,
 	requires_target = true,
+	getDamageMod = function(self, t) return self:combatTalentWeaponDamage(t, 0.4, 1.1) end,
 	action = function(self, t)
 		local weapon = self:hasStaffWeapon()
 		if not weapon then
@@ -62,7 +63,7 @@ newTalent{
 		local damrange = self:combatDamageRange(combat)
 		dam = rng.range(dam, dam * damrange)
 		dam = self:spellCrit(dam)
-		dam = dam * self:combatTalentWeaponDamage(t, 0.4, 1.1)
+		dam = dam * t.getDamageMod(self, t)
 
 		self:projectile(tg, x, y, damtype, dam, {type=explosion})
 
@@ -70,9 +71,10 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
+		local damagemod = t.getDamageMod(self, t)
 		return ([[Channel raw mana through your staff, projecting a bolt of your staff's damage type doing %d%% staff damage.
 		This attack always has a 100%% chance to hit and ignores target armour.]]):
-		format(self:combatTalentWeaponDamage(t, 0.4, 1.1) * 100)
+		format(damagemod * 100)
 	end,
 }
 
@@ -82,8 +84,11 @@ newTalent{
 	mode = "passive",
 	require = spells_req2,
 	points = 5,
+	getDamage = function(self, t) return math.sqrt(self:getTalentLevel(t) / 10) end,
 	info = function(self, t)
-		return ([[Increases damage done with staves by %d%%.]]):format(100 * (math.sqrt(self:getTalentLevel(t) / 10)))
+		local damage = t.getDamage(self, t)
+		return ([[Increases damage done with staves by %d%%.]]):
+		format(100 * damage)
 	end,
 }
 
@@ -98,6 +103,7 @@ newTalent{
 	tactical = {
 		DEFEND = 20,
 	},
+	getDefense = function(self, t) return self:combatTalentSpellDamage(t, 10, 20) end,
 	activate = function(self, t)
 		local weapon = self:hasStaffWeapon()
 		if not weapon then
@@ -105,7 +111,7 @@ newTalent{
 			return
 		end
 
-		local power = self:combatTalentSpellDamage(t, 10, 20)
+		local power = t.getDefense(self, t)
 		game:playSoundNear(self, "talents/arcane")
 		return {
 			dam = self:addTemporaryValue("combat_dam", -power / 2),
@@ -118,8 +124,9 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
+		local defense = t.getDefense(self, t)
 		return ([[Adopt a defensive posture, reducing your staff attack power by %d and increasing your defense by %d.]]):
-		format(self:combatTalentSpellDamage(t, 10, 20) / 2, self:combatTalentSpellDamage(t, 10, 20))
+		format(defense / 2, defense)
 	end,
 }
 
@@ -134,6 +141,8 @@ newTalent{
 		ATTACK = 10,
 	},
 	requires_target = true,
+	getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1, 1.5) end,
+	getDazeDuration = function(self, t) return 4 + self:getTalentLevel(t) end,
 	action = function(self, t)
 		local weapon = self:hasStaffWeapon()
 		if not weapon then
@@ -145,12 +154,12 @@ newTalent{
 		local x, y, target = self:getTarget(tg)
 		if not x or not y or not target then return nil end
 		if math.floor(core.fov.distance(self.x, self.y, x, y)) > 1 then return nil end
-		local speed, hit = self:attackTargetWith(target, weapon.combat, nil, self:combatTalentWeaponDamage(t, 1, 1.5))
+		local speed, hit = self:attackTargetWith(target, weapon.combat, nil, t.getDamage(self, t))
 
 		-- Try to stun !
 		if hit then
 			if target:checkHit(self:combatAttackStr(weapon.combat), target:combatPhysicalResist(), 0, 95, 5 - self:getTalentLevel(t) / 2) and target:canBe("stun") then
-				target:setEffect(target.EFF_DAZED, 4 + self:getTalentLevel(t), {})
+				target:setEffect(target.EFF_DAZED, t.getDazeDuration(self, t), {})
 			else
 				game.logSeen(target, "%s resists the dazing blow!", target.name:capitalize())
 			end
@@ -159,6 +168,10 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Hit a target for %d%% melee damage and daze it for %d turns.]]):format(100 * self:combatTalentWeaponDamage(t, 1, 1.5), 4 + self:getTalentLevel(t))
+		local damage = t.getDamage(self, t)
+		local dazedur = t.getDazeDuration(self, t)
+		return ([[Hit a target for %d%% melee damage and daze it for %d turns.
+		Daze chance will improve with talent level.]]):
+		format(100 * damage, dazedur)
 	end,
 }
diff --git a/game/modules/tome/data/talents/spells/stone-alchemy.lua b/game/modules/tome/data/talents/spells/stone-alchemy.lua
index 217bca418a..18a0304f0e 100644
--- a/game/modules/tome/data/talents/spells/stone-alchemy.lua
+++ b/game/modules/tome/data/talents/spells/stone-alchemy.lua
@@ -52,8 +52,9 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Carve %d to %d alchemist gems out of natural gems.
-		Alchemists gems are used for lots of other spells.]]):format(40, 80)
+		return ([[Carve 40 to 80 alchemist gems out of natural gems.
+		Alchemists gems are used for lots of other spells.
+		Each gem type posses different effect.]]):format()
 	end,
 }
 
@@ -80,7 +81,14 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Extract magical gems from metal weapons and armours. The higher your skill the higher level items you can work with.]])
+		local material = ""
+		if self:getTalentLevelRaw(t) >=1 then material=material.."	-Iron\n" end
+		if self:getTalentLevelRaw(t) >=2 then material=material.."	-Steel\n" end
+		if self:getTalentLevelRaw(t) >=3 then material=material.."	-Dwarven-steel\n" end
+		if self:getTalentLevelRaw(t) >=4 then material=material.."	-Stralite\n" end
+		if self:getTalentLevelRaw(t) >=5 then material=material.."	-Voratun" end
+		return ([[Extract magical gems from metal weapons and armours. At this skill level you can work with:
+		%s]]):format(material)
 	end,
 }
 
@@ -119,6 +127,7 @@ newTalent{
 	points = 5,
 	range = 1,
 	no_npc_use = true,
+	getRange = function(self, t) return math.floor(4 + self:combatSpellpower(0.06) * self:getTalentLevel(t)) end,
 	action = function(self, t)
 		local ammo = self:hasAlchemistWeapon()
 		if not ammo or ammo:getNumber() < 5 then
@@ -132,15 +141,15 @@ newTalent{
 		local _ _, x, y = self:canProject(tg, x, y)
 
 		for i = 1, 5 do self:removeObject(self:getInven("QUIVER"), 1) end
-		local power = math.floor(4 + self:combatSpellpower(0.06) * self:getTalentLevel(t))
-		self:probabilityTravel(x, y, power)
+		self:probabilityTravel(x, y, t.getRange(self, t))
 		game:playSoundNear(self, "talents/arcane")
 		return true
 	end,
 	info = function(self, t)
+		local range = t.getRange(self, t)
 		return ([[Crush 5 alchemists gems into dust to mark an impassable terrain. You immediately enter it and appear on the other side of the obstacle.
 		Works up to %d grids away.]]):
-		format(math.floor(4 + self:combatSpellpower(0.06) * self:getTalentLevel(t)))
+		format(range)
 	end,
 }
 
@@ -156,6 +165,7 @@ newTalent{
 		else return math.floor(self:getTalentLevel(t)) end
 	end,
 	requires_target = true,
+	getDuration = function(self, t) return math.floor((3 + self:getTalentLevel(t)) / 1.5) end,
 	action = function(self, t)
 		local tg = {type="beam", range=self:getTalentRange(t), talent=t}
 		if self:getTalentLevel(t) >= 3 then tg.type = "beam" end
@@ -166,7 +176,7 @@ newTalent{
 			if not target then return end
 
 			if target:checkHit(self:combatSpellpower(), target:combatSpellResist(), 0, 95, 10) and target:canBe("stone") and target:canBe("instakill") then
-				target:setEffect(target.EFF_STONED, math.floor((3 + self:getTalentLevel(t)) / 1.5), {})
+				target:setEffect(target.EFF_STONED, t.getDuration(self, t), {})
 				game.level.map:particleEmitter(tx, ty, 1, "archery")
 			end
 		end)
@@ -174,10 +184,12 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
+		local duration = t.getDuration(self, t)
 		return ([[Touch your foe and turn it to stone for %d turns.
 		Stoned creatures are unable to act or regen life and are very brittle.
 		If a stoned creature is hit by an attack that deals more than 30%% of its life it will shatter and be destroyed.
 		Stoned creatures are highly resistant to fire and lightning and somewhat resistant to physical attacks.
-		At level 3 it will become a beam.]]):format(math.floor((3 + self:getTalentLevel(t)) / 1.5))
+		At level 3 it will become a beam.]]):
+		format(duration)
 	end,
 }
diff --git a/game/modules/tome/data/talents/spells/stone.lua b/game/modules/tome/data/talents/spells/stone.lua
index ce12361516..077a651b48 100644
--- a/game/modules/tome/data/talents/spells/stone.lua
+++ b/game/modules/tome/data/talents/spells/stone.lua
@@ -33,34 +33,41 @@ newTalent{
 	reflectable = true,
 	proj_speed = 20,
 	requires_target = true,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 15, 120) end,
 	action = function(self, t)
 		local tg = {type="bolt", range=self:getTalentRange(t), talent=t, display={particle="stone_shards", trail="earthtrail"}}
 		local x, y = self:getTarget(tg)
 		if not x or not y then return nil end
-		self:projectile(tg, x, y, DamageType.SPLIT_BLEED, self:spellCrit(self:combatTalentSpellDamage(t, 15, 120)), nil)
+		local damage = t.getDamage(self, t)
+		self:projectile(tg, x, y, DamageType.SPLIT_BLEED, self:spellCrit(damage), nil)
 		game:playSoundNear(self, "talents/earth")
 		--missile #2
 		local tg2 = {type="bolt", range=self:getTalentRange(t), talent=t, display={particle="stone_shards", trail="earthtrail"}}
 		local x, y = self:getTarget(tg2)
 		if x and y then
-			self:projectile(tg2, x, y, DamageType.SPLIT_BLEED, self:spellCrit(self:combatTalentSpellDamage(t, 15, 120)), nil)
+			self:projectile(tg2, x, y, DamageType.SPLIT_BLEED, self:spellCrit(damage), nil)
 			game:playSoundNear(self, "talents/earth")
 		end
-		--missile #3 (Talent Level 4 Bonus Missile)
+		--missile #3 (Talent Level 5 Bonus Missile)
 		if self:getTalentLevel(t) >= 5 then
 			local tg3 = {type="bolt", range=self:getTalentRange(t), talent=t, display={particle="stone_shards", trail="earthtrail"}}
 			local x, y = self:getTarget(tg3)
 			if x and y then
-				self:projectile(tg3, x, y, DamageType.SPLIT_BLEED, self:spellCrit(self:combatTalentSpellDamage(t, 15, 120)), nil)
+				self:projectile(tg3, x, y, DamageType.SPLIT_BLEED, self:spellCrit(damage), nil)
 				game:playSoundNear(self, "talents/earth")
 			end
 		else end
 		return true
 	end,
 	info = function(self, t)
-		return ([[Conjures missile shaped rocks that you target individually at any target or targets in range.  Each missile deals %0.2f physical damage and an additional %0.2f bleeding damage over six turns.
-		At talent level 1 you conjure two missile with an additional missile at talent level 5.
-		The damage will increase with the Magic stat]]):format(damDesc(self, DamageType.PHYSICAL, self:combatTalentSpellDamage(t, 20, 120)/2), damDesc(self, DamageType.PHYSICAL, self:combatTalentSpellDamage(t, 20, 120)/2))
+		local count = 2
+		if self:getTalentLevel(t) >= 5 then
+			count = count + 1
+		end 
+		local damage = t.getDamage(self, t)
+		return ([[Conjures %d missile shaped rocks that you target individually at any target or targets in range.  Each missile deals %0.2f physical damage and an additional %0.2f bleeding damage every turn for 5 turns.
+		At talent level 5 you can conjure one additional missle.
+		The damage will increase with the Magic stat]]):format(count,damDesc(self, DamageType.PHYSICAL, damage/2), damDesc(self, DamageType.PHYSICAL, damage/12))
 	end,
 }
 
@@ -72,27 +79,27 @@ newTalent{
 	mode = "sustained",
 	sustain_mana = 70,
 	cooldown = 12,
+	getFireRes = function(self, t) return self:combatTalentSpellDamage(t, 5, 80) end,
+	getLightningRes = function(self, t) return self:combatTalentSpellDamage(t, 5, 50) end,
+	getPhysicalRes = function(self, t) return self:combatTalentSpellDamage(t, 5, 20) end,
+	getKnockbackRes = function(self, t) return self:getTalentLevel(t)/10 end,
+	getCooldownReduction = function(self, t) return self:getTalentLevel(t)/2 end,
 	activate = function(self, t)
-		local fire = self:combatTalentSpellDamage(t, 5, 80)
-		local light = self:combatTalentSpellDamage(t, 5, 50)
-		local phys = self:combatTalentSpellDamage(t, 5, 20)
-		local kb = self:getTalentLevel(t)/10
-		local cdr = self:getTalentLevel(t)/2
-		local rad = 5 + self:combatSpellpower(0.1) * self:getTalentLevel(t)
+		local cdr = t.getCooldownReduction(self, t)
 		game:playSoundNear(self, "talents/earth")
 		return {
 			particle = self:addParticles(Particles.new("stone_skin", 1)),
 			move = self:addTemporaryValue("never_move", 1),
-			knock = self:addTemporaryValue("knockback_immune", kb),
+			knock = self:addTemporaryValue("knockback_immune", t.getKnockbackRes(self, t)),
 			cdred = self:addTemporaryValue("talent_cd_reduction", {
 				[self.T_EARTHEN_MISSILES] = cdr,
 				[self.T_STRIKE] = cdr,
 				[self.T_EARTHQUAKE] = cdr,
 			}),
 			res = self:addTemporaryValue("resists", {
-				[DamageType.FIRE] = fire,
-				[DamageType.LIGHTNING] = light,
-				[DamageType.PHYSICAL] = phys,
+				[DamageType.FIRE] = t.getFireRes(self, t),
+				[DamageType.LIGHTNING] = t.getLightningRes(self, t),
+				[DamageType.PHYSICAL] = t.getPhysicalRes(self, t),
 			}),
 		}
 	end,
@@ -105,12 +112,17 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
+		local fireres = t.getFireRes(self, t)
+		local lightningres = t.getLightningRes(self, t)
+		local physicalres = t.getPhysicalRes(self, t)
+		local cooldownred = t.getCooldownReduction(self, t)
+		local knockbackres = t.getKnockbackRes(self, t)
 		return ([[You root yourself into the earth and transform your flesh into stone.  While this spell is sustained you may not move and any forced movement will end the effect.
 		Your stoned form and your affinity with the earth while the spell is active has the following effects:
 		* Reduces the cooldown of Earthen Missiles, Earthquake, and Strike by %d
 		* Grants %d%% Fire Resistance, %d%% Lightning Resistance, %d%% Physical Resistance, and %d%% Knockback Resistance
 		Resistances scale with the Magic Stat.]])
-		:format((self:getTalentLevel(t)/2), self:combatTalentSpellDamage(t, 5, 80), self:combatTalentSpellDamage(t, 5, 50), self:combatTalentSpellDamage(t, 5, 20), (self:getTalentLevel(t)*10))
+		:format(cooldownred, fireres, lightningres, physicalres, knockbackres*100)
 	end,
 }
 
@@ -128,19 +140,19 @@ newTalent{
 	range = 20,
 	direct_hit = true,
 	requires_target = true,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 15, 70) end,
+	getDuration = function(self, t) return 3 + self:getTalentLevel(t) end,
+	getRadius = function(self, t) return 2 + (self:getTalentLevel(t)/2) end,
 	action = function(self, t)
-		local duration = 3 + self:getTalentLevel(t)
-		local radius = 2 + (self:getTalentLevel(t)/2)
-		local dam = self:combatTalentSpellDamage(t, 15, 70)
 		local tg = {type="ball", range=self:getTalentRange(t), radius=radius}
 		local x, y = self:getTarget(tg)
 		if not x or not y then return nil end
 		local _ _, x, y = self:canProject(tg, x, y)
 		-- Add a lasting map effect
 		game.level.map:addEffect(self,
-			x, y, duration,
-			DamageType.PHYSICAL_STUN, dam,
-			radius,
+			x, y, t.getDuration(self, t),
+			DamageType.PHYSICAL_STUN, t.getDamage(self, t),
+			t.getRadius(self, t),
 			5, nil,
 			{type="quake"},
 			nil, self:spellFriendlyFire()
@@ -150,8 +162,12 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
+		local damage = t.getDamage(self, t)
+		local radius = t.getRadius(self, t)
+		local duration = t.getDuration(self, t)
 		return ([[Causes a violent earthquake that deals %0.2f physical damage in a radius of %d each turn for %d turns and potentially stuns all creatures it affects.
-		The damage and duration will increase with the Magic stat]]):format(damDesc(self, DamageType.PHYSICAL, self:combatTalentSpellDamage(t, 15, 70)), 2 + (self:getTalentLevel(t)/2), 3 + self:getTalentLevel(t))
+		The damage will increase with the Magic stat]]):
+		format(damDesc(self, DamageType.PHYSICAL, damage), radius, duration)
 	end,
 }
 
@@ -163,11 +179,13 @@ newTalent{
 	mode = "sustained",
 	sustain_mana = 50,
 	cooldown = 30,
+	getPhysicalDamageIncrease = function(self, t) return self:getTalentLevelRaw(t) * 2 end,
+	getResistPenalty = function(self, t) return self:getTalentLevelRaw(t) * 10 end,
 	activate = function(self, t)
 		game:playSoundNear(self, "talents/earth")
 		return {
-			dam = self:addTemporaryValue("inc_damage", {[DamageType.PHYSICAL] = self:getTalentLevelRaw(t) * 2}),
-			resist = self:addTemporaryValue("resists_pen", {[DamageType.PHYSICAL] = self:getTalentLevelRaw(t) * 10}),
+			dam = self:addTemporaryValue("inc_damage", {[DamageType.PHYSICAL] = t.getPhysicalDamageIncrease(self, t)}),
+			resist = self:addTemporaryValue("resists_pen", {[DamageType.PHYSICAL] = t.getResistPenalty(self, t)}),
 			particle = self:addParticles(Particles.new("crystalline_focus", 1)),
 		}
 	end,
@@ -178,7 +196,9 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
+		local damageinc = t.getPhysicalDamageIncrease(self, t)
+		local ressistpen = t.getResistPenalty(self, t)
 		return ([[Concentrate on maintaining a Crystalline Focus, increasing all your physical damage by %d%% and ignoring %d%% physical resistance of your targets.]])
-		:format(self:getTalentLevelRaw(t) * 2, self:getTalentLevelRaw(t) * 10)
+		:format(damageinc, ressistpen)
 	end,
 }
diff --git a/game/modules/tome/data/talents/spells/storm.lua b/game/modules/tome/data/talents/spells/storm.lua
index f3dd7891b0..ca8a704d75 100644
--- a/game/modules/tome/data/talents/spells/storm.lua
+++ b/game/modules/tome/data/talents/spells/storm.lua
@@ -30,9 +30,10 @@ newTalent{
 	},
 	direct_hit = true,
 	range = function(self, t) return math.floor(2 + self:getTalentLevel(t) * 0.7) end,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 28, 170) end,
 	action = function(self, t)
 		local tg = {type="ball", range=0, radius=self:getTalentRange(t), friendlyfire=false, talent=t}
-		local dam = self:spellCrit(self:combatTalentSpellDamage(t, 28, 170))
+		local dam = self:spellCrit(t.getDamage(self, t))
 		self:project(tg, self.x, self.y, DamageType.LIGHTNING_DAZE, rng.avg(dam / 3, dam, 3))
 		local x, y = self.x, self.y
 		-- Lightning ball gets a special treatment to make it look neat
@@ -50,7 +51,7 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		local dam = damDesc(self, DamageType.LIGHTNING, self:combatTalentSpellDamage(t, 28, 170))
+		local dam = damDesc(self, DamageType.LIGHTNING, t.getDamage(self, t))
 		return ([[A lightning emanates from you in a circual wave, doing %0.2f to %0.2f lightning damage and possibly dazing them.
 		The damage will increase with the Magic stat]]):format(dam / 3, dam)
 	end,
@@ -68,18 +69,21 @@ newTalent{
 	},
 	range = 20,
 	reflectable = true,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 25, 200) end,
 	action = function(self, t)
 		local tg = {type="bolt", range=self:getTalentRange(t), talent=t, display={particle="bolt_lightning", trail="lightningtrail"}}
 		local x, y = self:getTarget(tg)
 		if not x or not y then return nil end
-		local dam = self:combatTalentSpellDamage(t, 25, 200)
+		local dam = t.getDamage(self, t)
 		self:projectile(tg, x, y, DamageType.LIGHTNING_DAZE, {daze=100, dam=self:spellCrit(rng.avg(dam / 3, dam, 3))}, {type="lightning_explosion"})
 		game:playSoundNear(self, "talents/lightning")
 		return true
 	end,
 	info = function(self, t)
-		return ([[Conjures up a bolt of lightning, doing %0.2f lightning damage and dazing the target.
-		The damage will increase with the Magic stat]]):format(damDesc(self, DamageType.LIGHTNING, self:combatTalentSpellDamage(t, 25, 200)))
+		local damage = t.getDamage(self, t)
+		return ([[Conjures up a bolt of lightning, doing %0.2f to %0.2f lightning damage and dazing the target for 3 turns.
+		The damage will increase with the Magic stat]]):
+		format(damDesc(self, DamageType.LIGHTNING, damage/3), damDesc(self, DamageType.LIGHTNING, damage))
 	end,
 }
 
@@ -96,12 +100,17 @@ newTalent{
 	},
 	range = 20,
 	direct_hit = true,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 25, 150) end,
+	getChance = function(self, t) return 30 + self:getTalentLevel(t) * 5 end,
+	getRadius = function(self, t) 
+			local radius = 2
+			if self:getTalentLevel(t) >= 3 then radius = 3 end
+			return radius
+		end,
 	do_hurricane = function(self, t, target)
-		if not rng.percent(30 + self:getTalentLevel(t) * 5) then return end
+		if not rng.percent(t.getChance(self, t)) then return end
 
-		local rad = 2
-		if self:getTalentLevel(t) >= 3 then rad = 3 end
-		target:setEffect(target.EFF_HURRICANE, 10, {src=self, dam=self:combatTalentSpellDamage(t, 25, 150), radius=rad})
+		target:setEffect(target.EFF_HURRICANE, 10, {src=self, dam=t.getDamage(self, t), radius=t.getRadius(self, t) })
 		game:playSoundNear(self, "talents/thunderstorm")
 	end,
 	activate = function(self, t)
@@ -111,11 +120,13 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		local dam = damDesc(self, DamageType.LIGHTNING, self:combatTalentSpellDamage(t, 25, 150))
-		return ([[Each time one of your lightning spell dazes a target it has %d%% chances to creates a chain reaction that summons a mighty Hurricane around the target.
+		local damage = t.getDamage(self, t)
+		local chance = t.getChance(self, t)
+		local radius = t.getRadius(self, t) 
+		return ([[Each time one of your lightning spell dazes a target it has %d%% chances to creates a chain reaction that summons a mighty Hurricane that last for 10 turns around the target with radius of %d.
 		Each turn all creatures around it will take %0.2f to %0.2f lightning damage.
 		Only 2 hurricanes can exist at the same time.
-		The damage will increase with the Magic stat]]):format(30 + self:getTalentLevel(t) * 5, dam / 3, dam)
+		The damage will increase with the Magic stat]]):format(chance, radius, damage / 3, damage)
 	end,
 }
 
@@ -127,11 +138,13 @@ newTalent{
 	mode = "sustained",
 	sustain_mana = 50,
 	cooldown = 30,
+	getLightningDamageIncrease = function(self, t) return self:getTalentLevelRaw(t) * 2 end,
+	getResistPenalty = function(self, t) return self:getTalentLevelRaw(t) * 10 end,
 	activate = function(self, t)
 		game:playSoundNear(self, "talents/thunderstorm")
 		return {
-			dam = self:addTemporaryValue("inc_damage", {[DamageType.LIGHTNING] = self:getTalentLevelRaw(t) * 2}),
-			resist = self:addTemporaryValue("resists_pen", {[DamageType.LIGHTNING] = self:getTalentLevelRaw(t) * 10}),
+			dam = self:addTemporaryValue("inc_damage", {[DamageType.LIGHTNING] = t.getLightningDamageIncrease(self, t)}),
+			resist = self:addTemporaryValue("resists_pen", {[DamageType.LIGHTNING] = t.getResistPenalty(self, t)}),
 			particle = self:addParticles(Particles.new("tempest", 1)),
 		}
 	end,
@@ -142,7 +155,9 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
+		local damageinc = t.getLightningDamageIncrease(self, t)
+		local ressistpen = t.getResistPenalty(self, t)
 		return ([[Surround yourself with a Tempest, increasing all your lightning damage by %d%% and ignoring %d%% lightning resistance of your targets.]])
-		:format(self:getTalentLevelRaw(t) * 2, self:getTalentLevelRaw(t) * 10)
+		:format(damageinc, ressistpen)
 	end,
 }
diff --git a/game/modules/tome/data/talents/spells/temporal.lua b/game/modules/tome/data/talents/spells/temporal.lua
index 5a5b566ccd..2b6e4b80a3 100644
--- a/game/modules/tome/data/talents/spells/temporal.lua
+++ b/game/modules/tome/data/talents/spells/temporal.lua
@@ -32,17 +32,20 @@ newTalent{
 	direct_hit = true,
 	reflectable = true,
 	requires_target = true,
+	getDuration = function(self, t) return 4 + self:combatSpellpower(0.03) * self:getTalentLevel(t) end,
 	action = function(self, t)
 		local tg = {type="hit", range=self:getTalentRange(t), talent=t}
 		local x, y = self:getTarget(tg)
 		if not x or not y then return nil end
-		self:project(tg, x, y, DamageType.TIME_PRISON, 4 + self:combatSpellpower(0.03) * self:getTalentLevel(t), {type="manathrust"})
+		self:project(tg, x, y, DamageType.TIME_PRISON, t.getDuration(self, t), {type="manathrust"})
 		game:playSoundNear(self, "talents/spell_generic")
 		return true
 	end,
 	info = function(self, t)
+		local duration = t.getDuration(self, t)
 		return ([[Removes the target from the flow of time for %d turns. In this state the target can neither act nor be harmed.
-		The duration will increase with the Magic stat]]):format(4 + self:combatSpellpower(0.03) * self:getTalentLevel(t))
+		The duration will increase with the Magic stat]]):
+		format(duration)
 	end,
 }
 
@@ -62,16 +65,19 @@ newTalent{
 	range = 10,
 	direct_hit = true,
 	requires_target = true,
+	getSlow = function(self, t) return self:getTalentLevel(t) * 0.07 end,
 	action = function(self, t)
 		local tg = {type="beam", range=self:getTalentRange(t), talent=t, display={particle="bolt_arcane"}}
 		local x, y = self:getTarget(tg)
 		if not x or not y then return nil end
-		self:projectile(tg, x, y, DamageType.SLOW, -1 + 1 / (1 + self:getTalentLevel(t) * 0.07), {type="manathrust"})
+		self:projectile(tg, x, y, DamageType.SLOW, -1 + 1 / (1 + t.getSlow(self, t)), {type="manathrust"})
 		game:playSoundNear(self, "talents/spell_generic")
 		return true
 	end,
 	info = function(self, t)
-		return ([[Project a bolt of time distortion, decreasing the target's global speed by %d%% for 7 turns.]]):format(self:getTalentLevel(t) * 7)
+		local slow = t.getSlow(self, t)
+		return ([[Project a bolt of time distortion, decreasing the target's global speed by %d%% for 7 turns.]]):
+		format(100 * slow)
 	end,
 }
 
@@ -86,9 +92,10 @@ newTalent{
 	tactical = {
 		BUFF = 10,
 	},
+	getHaste = function(self, t) return self:getTalentLevel(t) * 0.07 end,
 	activate = function(self, t)
 		game:playSoundNear(self, "talents/spell_generic")
-		local power = 1 - 1 / (1 + self:getTalentLevel(t) * 0.07)
+		local power = 1 - 1 / (1 + t.getHaste(self, t))
 		return {
 			speed = self:addTemporaryValue("energy", {mod=power}),
 		}
@@ -98,7 +105,9 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Increases the caster's global speed by %d%%.]]):format(self:getTalentLevel(t) * 7)
+		local haste = t.getHaste(self, t)
+		return ([[Increases the caster's global speed by %d%%.]]):
+		format(100 * haste)
 	end,
 }
 
@@ -113,16 +122,19 @@ newTalent{
 		DEFENSE = 10,
 	},
 	range = 20,
+	getMaxAbsorb = function(self, t) return self:combatTalentSpellDamage(t, 50, 170) end,
+	getDuration = function(self, t) return util.bound(5 + math.floor(self:getTalentLevel(t)), 5, 15) end,
 	action = function(self, t)
-		local dur = util.bound(5 + math.floor(self:getTalentLevel(t)), 5, 15)
-		local power = self:combatTalentSpellDamage(t, 50, 170)
-		self:setEffect(self.EFF_TIME_SHIELD, dur, {power=power})
+		self:setEffect(self.EFF_TIME_SHIELD, t.getDuration(self, t), {power=t.getMaxAbsorb(self, t)})
 		game:playSoundNear(self, "talents/spell_generic")
 		return true
 	end,
 	info = function(self, t)
+		local maxabsorb = t.getMaxAbsorb(self, t)
+		local duration = t.getDuration(self, t)
 		return ([[This intricate spell erects a time shield around the caster, preventing any incoming damage and sending it forward in time.
 		Once either the maximum damage (%d) is absorbed, or the time runs out (%d turns), the stored damage will return as self-damage over time (5 turns).
-		The duration and max absorption will increase with the Magic stat]]):format(self:combatTalentSpellDamage(t, 50, 170), util.bound(5 + math.floor(self:getTalentLevel(t)), 5, 15))
+		Max absorption will increase with the Magic stat]]):
+		format(maxabsorb, duration)
 	end,
 }
diff --git a/game/modules/tome/data/talents/spells/water.lua b/game/modules/tome/data/talents/spells/water.lua
index e306d5d90f..12bb3c086d 100644
--- a/game/modules/tome/data/talents/spells/water.lua
+++ b/game/modules/tome/data/talents/spells/water.lua
@@ -31,19 +31,18 @@ newTalent{
 	range = 15,
 	direct_hit = true,
 	requires_target = true,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 4, 50) end,
+	getDuration = function(self, t) return self:getTalentLevel(t) + 2 end,
 	action = function(self, t)
-		local duration = self:getTalentLevel(t) + 2
-		local radius = 3
-		local dam = self:combatTalentSpellDamage(t, 4, 50)
 		local tg = {type="ball", range=self:getTalentRange(t), radius=radius}
 		local x, y = self:getTarget(tg)
 		if not x or not y then return nil end
 		local _ _, x, y = self:canProject(tg, x, y)
 		-- Add a lasting map effect
 		game.level.map:addEffect(self,
-			x, y, duration,
-			DamageType.ACID, dam,
-			radius,
+			x, y, t.getDuration(self, t),
+			DamageType.ACID, t.getDamage(self, t),
+			3,
 			5, nil,
 			{type="vapour"},
 			nil, self:spellFriendlyFire()
@@ -52,8 +51,11 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
+		local damage = t.getDamage(self, t)
+		local duration = t.getDuration(self, t)
 		return ([[Corrosive fumes rise from the ground doing %0.2f acid damage in a radius of 3 each turn for %d turns.
-		The damage and duration will increase with the Magic stat]]):format(damDesc(self, DamageType.ACID, self:combatTalentSpellDamage(t, 4, 50)), self:getTalentLevel(t) + 2)
+		The damage will increase with the Magic stat]]):
+		format(damDesc(self, DamageType.ACID, damage), duration)
 	end,
 }
 
@@ -72,18 +74,20 @@ newTalent{
 	direct_hit = true,
 	reflectable = true,
 	requires_target = true,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 12, 180) end,
 	action = function(self, t)
 		local tg = {type="hit", range=self:getTalentRange(t), talent=t}
 		local x, y = self:getTarget(tg)
 		if not x or not y then return nil end
-		self:project(tg, x, y, DamageType.COLD, self:spellCrit(self:combatTalentSpellDamage(t, 12, 180)), {type="freeze"})
+		self:project(tg, x, y, DamageType.COLD, self:spellCrit(t.getDamage(self, t)), {type="freeze"})
 		self:project(tg, x, y, DamageType.FREEZE, 3)
 		game:playSoundNear(self, "talents/ice")
 		return true
 	end,
 	info = function(self, t)
-		return ([[Condenses ambient water on a target, freezing it for a short while and damaging it for %0.2f.
-		The damage will increase with the Magic stat]]):format(damDesc(self, DamageType.COLD, self:combatTalentSpellDamage(t, 12, 180)))
+		local damage = t.getDamage(self, t)
+		return ([[Condenses ambient water on a target, freezing it for 3 turns and damaging it for %0.2f.
+		The damage will increase with the Magic stat]]):format(damDesc(self, DamageType.COLD, damage))
 	end,
 }
 
@@ -99,15 +103,14 @@ newTalent{
 		ATTACKAREA = 10,
 	},
 	direct_hit = true,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 5, 90) end,
+	getDuration = function(self, t) return 5 + self:combatSpellpower(0.01) * self:getTalentLevel(t) end,
 	action = function(self, t)
-		local duration = 5 + self:combatSpellpower(0.01) * self:getTalentLevel(t)
-		local radius = 1
-		local dam = self:combatTalentSpellDamage(t, 5, 90)
 		-- Add a lasting map effect
 		game.level.map:addEffect(self,
-			self.x, self.y, duration,
-			DamageType.WAVE, dam,
-			radius,
+			self.x, self.y, t.getDuration(self, t),
+			DamageType.WAVE, t.getDamage(self, t),
+			1,
 			5, nil,
 			engine.Entity.new{alpha=100, display='', color_br=30, color_bg=60, color_bb=200},
 			function(e)
@@ -120,8 +123,11 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
+		local damage = t.getDamage(self, t)
+		local duration = t.getDuration(self, t)
 		return ([[A wall of water rushes out from the caster doing %0.2f cold damage and %0.2f physical damage as well as knocking back targets each turn for %d turns.
-	        The damage and duration will increase with the Magic stat]]):format(damDesc(self, DamageType.COLD, self:combatTalentSpellDamage(t, 5, 90)/2), damDesc(self, DamageType.PHYSICAL, self:combatTalentSpellDamage(t, 5, 90)/2), 5 + self:combatSpellpower(0.01) * self:getTalentLevel(t))
+	        The damage and duration will increase with the Magic stat]]):
+			format(damDesc(self, DamageType.COLD, damage/2), damDesc(self, DamageType.PHYSICAL, damage/2), duration)
 	end,
 }
 
@@ -136,15 +142,14 @@ newTalent{
 	tactical = {
 		ATTACKAREA = 20,
 	},
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 5, 90) end,
+	getDuration = function(self, t) return 5 + self:combatSpellpower(0.05) + self:getTalentLevel(t) end,
 	action = function(self, t)
-		local duration = 5 + self:combatSpellpower(0.05) + self:getTalentLevel(t)
-		local radius = 3
-		local dam = self:combatTalentSpellDamage(t, 5, 90)
 		-- Add a lasting map effect
 		game.level.map:addEffect(self,
-			self.x, self.y, duration,
-			DamageType.ICE, dam,
-			radius,
+			self.x, self.y, t.getDuration(self, t),
+			DamageType.ICE, t.getDamage(self, t),
+			3,
 			5, nil,
 			engine.Entity.new{alpha=100, display='', color_br=30, color_bg=60, color_bb=200},
 			function(e)
@@ -158,8 +163,10 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
+		local damage = t.getDamage(self, t)
+		local duration = t.getDuration(self, t)
 		return ([[A furious ice storm rages around the caster doing %0.2f cold damage in a radius of 3 each turn for %d turns.
 		It has 25%% chance to freeze damaged targets.
-		The damage and duration will increase with the Magic stat]]):format(damDesc(self, DamageType.COLD, self:combatTalentSpellDamage(t, 5, 90)), 5 + self:combatSpellpower(0.05) + self:getTalentLevel(t))
+		The damage and duration will increase with the Magic stat]]):format(damDesc(self, DamageType.COLD, damage), duration)
 	end,
 }
diff --git a/game/modules/tome/data/talents/spells/wildfire.lua b/game/modules/tome/data/talents/spells/wildfire.lua
index b9ea474676..ff5ab29e55 100644
--- a/game/modules/tome/data/talents/spells/wildfire.lua
+++ b/game/modules/tome/data/talents/spells/wildfire.lua
@@ -30,16 +30,18 @@ newTalent{
 	},
 	direct_hit = true,
 	range = function(self, t) return 1 + self:getTalentLevelRaw(t) end,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 28, 180) end,
 	action = function(self, t)
 		local tg = {type="ball", range=0, radius=self:getTalentRange(t), friendlyfire=false, talent=t}
-		local grids = self:project(tg, self.x, self.y, DamageType.FIREKNOCKBACK, {dist=3, dam=self:spellCrit(self:combatTalentSpellDamage(t, 28, 180))})
+		local grids = self:project(tg, self.x, self.y, DamageType.FIREKNOCKBACK, {dist=3, dam=self:spellCrit(t.getDamage(self, t))})
 		game.level.map:particleEmitter(self.x, self.y, tg.radius, "ball_fire", {radius=tg.radius})
 		game:playSoundNear(self, "talents/fire")
 		return true
 	end,
 	info = function(self, t)
+		local damage = t.getDamage(self, t)
 		return ([[A wave of fire emanates from you, knocking back anything caught inside and setting them ablaze and doing %0.2f fire damage over 3 turns.
-		The damage will increase with the Magic stat]]):format(damDesc(self, DamageType.FIRE, self:combatTalentSpellDamage(t, 28, 180)))
+		The damage will increase with the Magic stat]]):format(damDesc(self, DamageType.FIRE, damage))
 	end,
 }
 
@@ -54,12 +56,14 @@ newTalent{
 		ATTACKAREA = 40,
 	},
 	range = 20,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 10, 240) end,
+	getTargetCount = function(self, t) return math.ceil(self:getTalentLevel(t) + 2) end,
 	action = function(self, t)
-		local max = math.ceil(self:getTalentLevel(t) + 2)
+		local max = t.getTargetCount(self, t)
 		for i, act in ipairs(self.fov.actors_dist) do
 			if self:reactionToward(act) < 0 then
 				local tg = {type="hit", friendlyfire=false, talent=t}
-				local grids = self:project(tg, act.x, act.y, DamageType.FIREBURN, {dur=8, initial=0, dam=self:spellCrit(self:combatTalentSpellDamage(t, 10, 240))})
+				local grids = self:project(tg, act.x, act.y, DamageType.FIREBURN, {dur=8, initial=0, dam=self:spellCrit(t.getDamage(self, t))})
 				game.level.map:particleEmitter(act.x, act.y, tg.radius, "ball_fire", {radius=1})
 
 				max = max - 1
@@ -70,9 +74,11 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
+		local damage = t.getDamage(self, t)
+		local targetcount = t.getTargetCount(self, t)
 		return ([[Surround yourself in flames, setting all those in your line of sight ablaze and doing %0.2f fire damage over 8 turns.
 		At most it will affect %d foes.
-		The damage will increase with the Magic stat]]):format(damDesc(self, DamageType.FIRE, self:combatTalentSpellDamage(t, 10, 240)), math.ceil(self:getTalentLevel(t) + 2))
+		The damage will increase with the Magic stat]]):format(damDesc(self, DamageType.FIRE, damage), targetcount)
 	end,
 }
 
@@ -88,12 +94,13 @@ newTalent{
 	},
 	range = 14,
 	requires_target = true,
+	getMultiplier = function(self, t) return self:combatTalentWeaponDamage(t, 0.5, 1.5) end,
 	action = function(self, t)
 		local tg = {type="ball", range=self:getTalentRange(t), radius=2, friendlyfire=self:spellFriendlyFire(), talent=t}
 		local x, y = self:getTarget(tg)
 		if not x or not y then return nil end
 
-		local mult = self:combatTalentWeaponDamage(t, 0.5, 1.5)
+		local mult = t.getMultiplier(self, t)
 
 		self:project(tg, x, y, function(tx, ty)
 			local target = game.level.map(tx, ty, Map.ACTOR)
@@ -115,8 +122,9 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
+		local mult = t.getMultiplier(self, t)
 		return ([[Disrupts all fires in a radius. All targets that were burning will combust, doing all the remaining burn damage instantly.
-		The combustion effect will deal %d%% of the normal burn damage.]]):format(self:combatTalentWeaponDamage(t, 0.5, 1.5) * 100)
+		The combustion effect will deal %d%% of the normal burn damage.]]):format(mult * 100)
 	end,
 }
 
@@ -128,11 +136,13 @@ newTalent{
 	mode = "sustained",
 	sustain_mana = 50,
 	cooldown = 30,
+	getFireDamageIncrease = function(self, t) return self:getTalentLevelRaw(t) * 2 end,
+	getResistPenalty = function(self, t) return self:getTalentLevelRaw(t) * 10 end,
 	activate = function(self, t)
 		game:playSoundNear(self, "talents/fire")
 		return {
-			dam = self:addTemporaryValue("inc_damage", {[DamageType.FIRE] = self:getTalentLevelRaw(t) * 2}),
-			resist = self:addTemporaryValue("resists_pen", {[DamageType.FIRE] = self:getTalentLevelRaw(t) * 10}),
+			dam = self:addTemporaryValue("inc_damage", {[DamageType.FIRE] = t.getFireDamageIncrease(self, t)}),
+			resist = self:addTemporaryValue("resists_pen", {[DamageType.FIRE] = t.getMaxAbsorb(self, t)}),
 			particle = self:addParticles(Particles.new("wildfire", 1)),
 		}
 	end,
@@ -143,7 +153,9 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
+		local damageinc = t.getFireDamageIncrease(self, t)
+		local ressistpen = t.getResistPenalty(self, t)
 		return ([[Surround yourself with Wildfire, increasing all your fire damage by %d%% and ignoring %d%% fire resistance of your targets.]])
-		:format(self:getTalentLevelRaw(t) * 2, self:getTalentLevelRaw(t) * 10)
+		:format(damageinc, ressistpen)
 	end,
 }
-- 
GitLab