diff --git a/game/modules/tome/data/damage_types.lua b/game/modules/tome/data/damage_types.lua
index 8929b3b35e8b697397449f8f36891354230f101d..cb1c8cf1e54e38c9d7dc3b6f43c4e27d8774dfa5 100644
--- a/game/modules/tome/data/damage_types.lua
+++ b/game/modules/tome/data/damage_types.lua
@@ -1034,6 +1034,29 @@ newDamageType{
 		return init_dam
 	end,
 }
+
+-- Fire damage + DOT + 25% chance of Fireflash
+newDamageType{
+	name = "stunning fire", type = "FIRE_STUN", text_color = "#LIGHT_RED#",
+	projector = function(src, x, y, type, dam)
+		local chance = 25
+		local dur = 3
+		local perc = 50
+		if _G.type(dam) == "table" then dam, dur, perc = dam.dam, dam.dur, (dam.initial or perc) end
+		local init_dam = dam * perc / 100
+		if init_dam > 0 then DamageType:get(DamageType.FIRE).projector(src, x, y, DamageType.FIRE, init_dam) end
+		local target = game.level.map(x, y, Map.ACTOR)
+		if target then
+			dam = dam - init_dam
+			target:setEffect(target.EFF_BURNING, dur, {src=src, power=dam / dur, no_ct_effect=true})
+				if rng.percent(chance) then
+					DamageType:get(DamageType.FLAMESHOCK).projector(src, x, y, DamageType.FLAMESHOCK, {dur=3, dam=15, apply_power=src:combatMindpower()})
+			end
+		end
+		return init_dam
+	end,
+}
+
 newDamageType{
 	name = "fire burn", type = "GOLEM_FIREBURN",
 	projector = function(src, x, y, type, dam)
@@ -1046,6 +1069,21 @@ newDamageType{
 	end,
 }
 
+-- Drain Life... with fire!
+newDamageType{
+	name = "devouring flames", type = "FIRE_DRAIN", text_color = "#LIGHT_RED#",
+	projector = function(src, x, y, type, dam)
+		if _G.type(dam) == "number" then dam = {dam=dam, healfactor=0.1} end
+		local target = game.level.map(x, y, Map.ACTOR) -- Get the target first to make sure we heal even on kill
+		local realdam = DamageType:get(DamageType.FIRE).projector(src, x, y, DamageType.FIRE, dam.dam)
+		if target and realdam > 0 then
+			src:heal(realdam * dam.healfactor, target)
+			src:logCombat(target, "#Source# drains life from #Target#!")
+		end
+		return realdam
+	end,
+}
+
 -- Darkness + Fire
 newDamageType{
 	name = "shadowflame", type = "SHADOWFLAME",
@@ -1141,6 +1179,24 @@ newDamageType{
 	end,
 }
 
+-- Cold damage + freeze chance + 20% slow
+newDamageType{
+	name = "slowing ice", type = "ICE_SLOW", text_color = "#1133F3#",
+	projector = function(src, x, y, type, dam)
+		local chance = 25
+		local target = game.level.map(x, y, Map.ACTOR)
+		if _G.type(dam) == "table" then chance, dam = dam.chance, dam.dam end
+		local realdam = DamageType:get(DamageType.COLD).projector(src, x, y, DamageType.COLD, dam)
+		if target then
+			target:setEffect(target.EFF_SLOW, 3, {power=0.2, no_ct_effect=true})
+			if rng.percent(chance) then
+				DamageType:get(DamageType.FREEZE).projector(src, x, y, DamageType.FREEZE, {dur=2, hp=70+dam*1.5})
+			end
+		end
+		return realdam
+	end,
+}
+
 -- Cold damage + freeze chance, increased if wet
 newDamageType{
 	name = "ice storm", type = "ICE_STORM", text_color = "#1133F3#",
diff --git a/game/modules/tome/data/talents/gifts/cold-drake.lua b/game/modules/tome/data/talents/gifts/cold-drake.lua
index e8502c980551ede85854d9be2fea2bcd23cd3f80..fa66f8f980d9a6060c8c1918c29baab4d1a25ccf 100644
--- a/game/modules/tome/data/talents/gifts/cold-drake.lua
+++ b/game/modules/tome/data/talents/gifts/cold-drake.lua
@@ -27,24 +27,45 @@ newTalent{
 	random_ego = "attack",
 	equilibrium = 3,
 	cooldown = 7,
-	range = 1,
+	range = 0,
+	radius = function(self, t) return math.floor(self:combatTalentScale(t, 1, 3)) end,
+	direct_hit = true,
+	requires_target = true,
 	tactical = { ATTACK = { COLD = 2 } },
 	requires_target = true,
-	on_learn = function(self, t) self.resists[DamageType.COLD] = (self.resists[DamageType.COLD] or 0) + 1 end,
-	on_unlearn = function(self, t) self.resists[DamageType.COLD] = (self.resists[DamageType.COLD] or 0) - 1 end,
-	damagemult = function(self, t) return self:combatTalentScale(t, 1.525, 2.025) end,
+	on_learn = function(self, t) 
+		self.combat_physresist = self.combat_physresist + 4
+		self.combat_spellresist = self.combat_spellresist + 4
+		self.combat_mentalresist = self.combat_mentalresist + 4
+		self.resists[DamageType.COLD] = (self.resists[DamageType.COLD] or 0) + 1 
+	end,
+	on_unlearn = function(self, t) 
+		self.combat_physresist = self.combat_physresist - 4
+		self.combat_spellresist = self.combat_spellresist - 4	
+		self.combat_mentalresist = self.combat_mentalresist - 4
+		self.resists[DamageType.COLD] = (self.resists[DamageType.COLD] or 0) - 1 
+	end,
+	damagemult = function(self, t) return self:combatTalentScale(t, 1.6, 2.3) end,
+	target = function(self, t)
+		return {type="cone", range=self:getTalentRange(t), selffire=false, radius=self:getTalentRadius(t)}
+	end,
 	action = function(self, t)
-		local tg = {type="hit", range=self:getTalentRange(t)}
-		local x, y, target = self:getTarget(tg)
-		if not x or not y or not target then return nil end
-		if core.fov.distance(self.x, self.y, x, y) > 1 then return nil end
-		self:attackTarget(target, (self:getTalentLevel(t) >= 4) and DamageType.ICE or DamageType.COLD, t.damagemult(self, t), true)
+		local tg = self:getTalentTarget(t)
+		local x, y = self:getTarget(tg)
+		if not x or not y then return nil end
+		self:project(tg, x, y, function(px, py, tg, self)
+			local target = game.level.map(px, py, Map.ACTOR)
+			if target and target ~= self then
+				local hit = self:attackTarget(target, DamageType.ICE, self:combatTalentWeaponDamage(t, 1.6, 2.3), true)
+			end
+		end)
+		game:playSoundNear(self, "talents/breath")
 		return true
 	end,
 	info = function(self, t)
-		return ([[You call upon the mighty claw of a cold drake, doing %d%% weapon damage as cold damage.
-		At level 4, the attack becomes pure ice, giving a chance to freeze the target.
-		Each point in cold drake talents also increases your cold resistance by 1%%.]]):format(100 * t.damagemult(self, t))
+		return ([[You call upon the mighty claw of a cold drake and rake a wave of freezing cold in front of you, doing %d%% weapon damage as Ice damage in a cone of %d. Ice damage gives a chance of freezing the target.
+		Every level in Ice Claw additionally raises your Physical, Mental and Spell Saves by 4.
+		Each point in cold drake talents also increases your cold resistance by 1%%.]]):format(100 * t.damagemult(self, t), self:getTalentRadius(t))
 	end,
 }
 
@@ -55,28 +76,33 @@ newTalent{
 	mode = "sustained",
 	points = 5,
 	cooldown = 10,
-	sustain_equilibrium = 30,
+	sustain_equilibrium = 10,
 	range = 10,
 	tactical = { ATTACK = { COLD = 1 }, DEFEND = 2 },
 	on_learn = function(self, t) self.resists[DamageType.COLD] = (self.resists[DamageType.COLD] or 0) + 1 end,
 	on_unlearn = function(self, t) self.resists[DamageType.COLD] = (self.resists[DamageType.COLD] or 0) - 1 end,
-	getDamage = function(self, t) return self:combatTalentStatDamage(t, "wil", 10, 700) / 10 end,
-	getArmor = function(self, t) return self:combatTalentStatDamage(t, "wil", 6, 600) / 10 end,
+	getArmor = function(self, t) return self:combatTalentMindDamage(t, 5, 25) end,
+	getLifePct = function(self, t) return self:combatTalentLimit(t, 1, 0.02, 0.10) end, -- Limit < 100% bonus
+	getDamageOnMeleeHit = function(self, t) return 10 +  self:combatTalentMindDamage(t, 10, 30) end,
 	activate = function(self, t)
 		return {
-			onhit = self:addTemporaryValue("on_melee_hit", {[DamageType.COLD]=t.getDamage(self, t)}),
+			onhit = self:addTemporaryValue("on_melee_hit", {[DamageType.COLD]=t.getDamageOnMeleeHit(self, t)}),
+			life = self:addTemporaryValue("max_life", t.getLifePct(self, t)*self.max_life),
 			armor = self:addTemporaryValue("combat_armor", t.getArmor(self, t)),
 		}
 	end,
 	deactivate = function(self, t, p)
-		self:removeTemporaryValue("on_melee_hit", p.onhit)
+		self:removeTemporaryValue("max_life", p.life)
 		self:removeTemporaryValue("combat_armor", p.armor)
+		self:removeTemporaryValue("on_melee_hit", p.onhit)
 		return true
 	end,
 	info = function(self, t)
-		return ([[Your skin forms icy scales, damaging anyone that hits you for %0.2f cold damage and increasing your Armour by %d.
+		local life = t.getLifePct(self, t)
+		return ([[Your skin forms icy scales and your flesh toughens, increasing your Maximum Life by %d%% and your Armour by %d.
+		You also deal %0.2f cold damage to any enemies that physically strike you.
 		Each point in cold drake talents also increases your cold resistance by 1%%.
-		The damage and Armor will scale with your Willpower.]]):format(damDesc(self, DamageType.COLD, t.getDamage(self, t)), t.getArmor(self, t))
+		The life increase will scale with your Talent Level, and your Armour and retaliation cold damage will scale with Mindpower.]]):format(life * 100, t.getArmor(self, t), damDesc(self, DamageType.COLD, t.getDamageOnMeleeHit(self, t)))
 	end,
 }
 
@@ -87,7 +113,7 @@ newTalent{
 	points = 5,
 	random_ego = "defensive",
 	equilibrium = 10,
-	cooldown = 30,
+	cooldown = function(self, t) return math.ceil(self:combatTalentLimit(t, 5, 30, 10)) end,
 	range = 10,
 	tactical = { DISABLE = 2 },
 	requires_target = true,
@@ -95,6 +121,8 @@ newTalent{
 	on_unlearn = function(self, t) self.resists[DamageType.COLD] = (self.resists[DamageType.COLD] or 0) - 1 end,
 	getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9)) end,
 	getLength = function(self, t) return 1 + math.floor(self:combatTalentScale(t, 3, 7)/2)*2 end,
+	getIceDamage = function(self, t) return self:combatTalentMindDamage(t, 3, 15) end,
+	getIceRadius = function(self, t) return math.floor(self:combatTalentScale(t, 1, 2)) end,
 	action = function(self, t)
 		local halflength = math.floor(t.getLength(self,t)/2)
 		local block = function(_, lx, ly)
@@ -103,6 +131,8 @@ newTalent{
 		local tg = {type="wall", range=self:getTalentRange(t), halflength=halflength, talent=t, halfmax_spots=halflength+1, block_radius=block}
 		local x, y = self:getTarget(tg)
 		if not x or not y then return nil end
+		local ice_damage = self:mindCrit(t.getIceDamage(self, t))
+		local ice_radius = t.getIceRadius(self, t)
 		local _ _, _, _, x, y = self:canProject(tg, x, y)
 		if game.level.map:checkEntity(x, y, Map.TERRAIN, "block_move") then return nil end
 
@@ -123,9 +153,15 @@ newTalent{
 				block_move = true,
 				block_sight = false,
 				temporary = 4 + self:getTalentLevel(t),
-				x =px, y = py,
+				x = px, y = py,
 				canAct = false,
+				dam = ice_damage,
+				radius = ice_radius,
 				act = function(self)
+					local tg = {type="ball", range=0, radius=ice_radius, friendlyfire=false, talent=t, x=self.x, y=self.y}
+					self.summoner.__project_source = self
+					self.summoner:project(tg, self.x, self.y, engine.DamageType.ICE, self.dam)
+					self.summoner.__project_source = nil
 					self:useEnergy()
 					self.temporary = self.temporary - 1
 					if self.temporary <= 0 then
@@ -151,8 +187,11 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Summons an icy wall of %d length for %d turns. Ice walls are transparent.
-		Each point in cold drake talents also increases your cold resistance by 1%%.]]):format(3 + math.floor(self:getTalentLevel(t) / 2) * 2, t.getDuration(self, t))
+		local icerad = t.getIceRadius(self, t)
+		local icedam = t.getIceDamage(self, t)
+		return ([[Summons an icy wall of %d length for %d turns. Ice walls are transparent, but block projectiles and enemies.
+		Ice walls also emit freezing cold, dealing %0.2f damage for each ice wall within radius %d of an enemy, and with each wall giving a 25%% chance to freeze an enemy. This cold cannot hurt the talent user or their allies.
+		Each point in cold drake talents also increases your cold resistance by 1%%.]]):format(3 + math.floor(self:getTalentLevel(t) / 2) * 2, t.getDuration(self, t), damDesc(self, DamageType.COLD, icedam),  icerad)
 	end,
 }
 
@@ -179,7 +218,7 @@ newTalent{
 		local tg = self:getTalentTarget(t)
 		local x, y = self:getTarget(tg)
 		if not x or not y then return nil end
-		self:project(tg, x, y, DamageType.ICE, self:mindCrit(self:combatTalentStatDamage(t, "str", 30, 430)))
+		self:project(tg, x, y, DamageType.ICE_SLOW, self:mindCrit(self:combatTalentStatDamage(t, "str", 30, 500)))
 		game.level.map:particleEmitter(self.x, self.y, tg.radius, "breath_cold", {radius=tg.radius, tx=x-self.x, ty=y-self.y})
 		game:playSoundNear(self, "talents/breath")
 		
@@ -190,9 +229,9 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[You breathe ice in a frontal cone of radius %d. Any target caught in the area will take %0.2f cold damage, and has a 25%% to be frozen for a few turns (higher rank enemies will be frozen for a shorter time).
+		return ([[You breathe ice in a frontal cone of radius %d. Any target caught in the area will take %0.2f cold damage, will be slowed 20%% for three turns, and has a 25%% to be frozen for a few turns (higher rank enemies will be frozen for a shorter time).
 		The damage will increase with your Strength, and the critical chance is based on your Mental crit rate.
-		Each point in cold drake talents also increases your cold resistance by 1%%.]]):format(self:getTalentRadius(t), damDesc(self, DamageType.COLD, self:combatTalentStatDamage(t, "str", 30, 430)))
+		Each point in cold drake talents also increases your cold resistance by 1%%.]]):format(self:getTalentRadius(t), damDesc(self, DamageType.COLD, self:combatTalentStatDamage(t, "str", 30, 500)))
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/gifts/fire-drake.lua b/game/modules/tome/data/talents/gifts/fire-drake.lua
index 5dee77ded242ecbe391dddb6a631cf8f490ee4b7..c0539d81a19db623df712a50da70b2d20f88bb2c 100644
--- a/game/modules/tome/data/talents/gifts/fire-drake.lua
+++ b/game/modules/tome/data/talents/gifts/fire-drake.lua
@@ -17,79 +17,95 @@
 -- Nicolas Casalini "DarkGod"
 -- darkgod@te4.org
 
+
 newTalent{
-	name = "Bellowing Roar",
+	name = "Wing Buffet",
 	type = {"wild-gift/fire-drake", 1},
 	require = gifts_req1,
 	points = 5,
 	random_ego = "attack",
-	message = "@Source@ roars!",
-	equilibrium = 3,
-	cooldown = 20,
+	equilibrium = 5,
+	cooldown = 8,
 	range = 0,
-	on_learn = function(self, t) self.resists[DamageType.FIRE] = (self.resists[DamageType.FIRE] or 0) + 1 end,
-	on_unlearn = function(self, t) self.resists[DamageType.FIRE] = (self.resists[DamageType.FIRE] or 0) - 1 end,
-	radius = function(self, t) return math.floor(self:combatTalentScale(t, 3, 7)) end,
+	on_learn = function(self, t) 
+		self.resists[DamageType.FIRE] = (self.resists[DamageType.FIRE] or 0) + 1 
+		self.combat_atk = self.combat_atk + 4
+		self.combat_dam = self.combat_dam + 4
+	end,
+	on_unlearn = function(self, t) 
+		self.resists[DamageType.FIRE] = (self.resists[DamageType.FIRE] or 0) - 1 
+		self.combat_atk = self.combat_atk - 4
+		self.combat_dam = self.combat_dam - 4
+	end,
+	getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1.1, 1.6) end,
+	radius = function(self, t) return math.floor(self:combatTalentScale(t, 3, 6)) end,
+	direct_hit = true,
+	tactical = { DEFEND = { knockback = 2 }, ESCAPE = { knockback = 2 } },
+	requires_target = true,
 	target = function(self, t)
-		return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), friendlyfire=false, talent=t}
+		return {type="cone", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=false, talent=t}
 	end,
-	tactical = { DEFEND = 1, DISABLE = { confusion = 3 } },
 	action = function(self, t)
 		local tg = self:getTalentTarget(t)
-		self:project(tg, self.x, self.y, DamageType.PHYSICAL, self:mindCrit(self:combatTalentStatDamage(t, "str", 40, 400)))
-		self:project(tg, self.x, self.y, DamageType.CONFUSION, {
-			dur=3,
-			dam=40 + 6 * self:getTalentLevel(t),
-			power_check=function() return self:combatPhysicalpower() end,
-			resist_check=self.combatPhysicalResist,
-		})
-		game.level.map:particleEmitter(self.x, self.y, self:getTalentRadius(t), "shout", {additive=true, life=10, size=3, distorion_factor=0.5, radius=self:getTalentRadius(t), nb_circles=8, rm=0.8, rM=1, gm=0, gM=0, bm=0.1, bM=0.2, am=0.4, aM=0.6})
+		local x, y = self:getTarget(tg)
+		if not x or not y then return nil end
+		self:project(tg, x, y, function(px, py, tg, self)
+			local target = game.level.map(px, py, Map.ACTOR)
+			if target and target ~= self then
+				local hit = self:attackTarget(target, DamageType.PHYSKNOCKBACK, self:combatTalentWeaponDamage(t, 1.1, 1.6), true)
+			end
+		end)
+		game:playSoundNear(self, "talents/breath")
+
+		if core.shader.active(4) then
+			local bx, by = self:attachementSpot("back", true)
+			self:addParticles(Particles.new("shader_wings", 1, {life=18, x=bx, y=by, fade=-0.006, deploy_speed=14}))
+		end
 		return true
 	end,
 	info = function(self, t)
-		local radius = self:getTalentRadius(t)
-		return ([[You let out a powerful roar that sends your foes into utter confusion for 3 turns in a radius of %d.
-		The sound wave is so strong, your foes also take %0.2f physical damage.
-		The damage improves with your Strength.
-		Each point in fire drake talents also increases your fire resistance by 1%%.]]):format(radius, self:combatTalentStatDamage(t, "str", 40, 400))
+		local damage = t.getDamage(self, t)
+		return ([[You summon a powerful gust of wind, knocking back your foes within a radius of %d up to 3 tiles away and damaging them for %d%% weapon damage.
+		Every level in Wing Buffet additionally raises your Physical Power and Accuracy by 4, passively.
+		Each point in fire drake talents also increases your fire resistance by 1%%.]]):format(self:getTalentRadius(t),damage*100)
 	end,
 }
 
 newTalent{
-	name = "Wing Buffet",
+	name = "Bellowing Roar",
 	type = {"wild-gift/fire-drake", 2},
 	require = gifts_req2,
 	points = 5,
 	random_ego = "attack",
-	equilibrium = 7,
-	cooldown = 10,
+	message = "@Source@ roars!",
+	equilibrium = 8,
+	cooldown = 20,
 	range = 0,
 	on_learn = function(self, t) self.resists[DamageType.FIRE] = (self.resists[DamageType.FIRE] or 0) + 1 end,
 	on_unlearn = function(self, t) self.resists[DamageType.FIRE] = (self.resists[DamageType.FIRE] or 0) - 1 end,
-	radius = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9)) end,
-	direct_hit = true,
-	tactical = { DEFEND = { knockback = 2 }, ESCAPE = { knockback = 2 } },
-	requires_target = true,
+	radius = function(self, t) return math.floor(self:combatTalentScale(t, 3, 7)) end,
 	target = function(self, t)
-		return {type="cone", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=false, talent=t}
+		return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), friendlyfire=false, talent=t}
 	end,
+	tactical = { DEFEND = 1, DISABLE = { confusion = 3 } },
 	action = function(self, t)
 		local tg = self:getTalentTarget(t)
-		local x, y = self:getTarget(tg)
-		if not x or not y then return nil end
-		self:project(tg, x, y, DamageType.PHYSKNOCKBACK, {dam=self:mindCrit(self:combatTalentStatDamage(t, "str", 15, 90)), dist=4})
-		game:playSoundNear(self, "talents/breath")
-
-		if core.shader.active(4) then
-			local bx, by = self:attachementSpot("back", true)
-			self:addParticles(Particles.new("shader_wings", 1, {life=18, x=bx, y=by, fade=-0.006, deploy_speed=14}))
-		end
+		self:project(tg, self.x, self.y, DamageType.PHYSICAL, self:mindCrit(self:combatTalentStatDamage(t, "str", 30, 380)))
+		self:project(tg, self.x, self.y, DamageType.CONFUSION, {
+			dur=3,
+			dam=20 + 6 * self:getTalentLevel(t),
+			power_check=function() return self:combatPhysicalpower() end,
+			resist_check=self.combatPhysicalResist,
+		})
+		game.level.map:particleEmitter(self.x, self.y, self:getTalentRadius(t), "shout", {additive=true, life=10, size=3, distorion_factor=0.5, radius=self:getTalentRadius(t), nb_circles=8, rm=0.8, rM=1, gm=0, gM=0, bm=0.1, bM=0.2, am=0.4, aM=0.6})
 		return true
 	end,
 	info = function(self, t)
-		return ([[You summon a powerful gust of wind, knocking back your foes within a radius of %d up to 4 tiles away and damaging them for %d.
-		The damage will increase with your Strength.
-		Each point in fire drake talents also increases your fire resistance by 1%%.]]):format(self:getTalentRadius(t), self:combatTalentStatDamage(t, "str", 15, 90))
+		local radius = self:getTalentRadius(t)
+		return ([[You let out a powerful roar that sends your foes into utter confusion for 3 turns in a radius of %d.
+		The sound wave is so strong, your foes also take %0.2f physical damage.
+		The damage improves with your Strength.
+		Each point in fire drake talents also increases your fire resistance by 1%%.]]):format(radius, self:combatTalentStatDamage(t, "str", 30, 380))
 	end,
 }
 
@@ -99,26 +115,26 @@ newTalent{
 	require = gifts_req3,
 	points = 5,
 	random_ego = "attack",
-	equilibrium = 10,
-	cooldown = 35,
+	equilibrium = 6,
+	cooldown = 20,
 	tactical = { ATTACKAREA = { FIRE = 2 } },
 	range = 10,
-	radius = 2,
+	radius = function(self, t) return math.floor(self:combatTalentScale(t, 2, 5)) end,
 	direct_hit = true,
 	requires_target = true,
 	on_learn = function(self, t) self.resists[DamageType.FIRE] = (self.resists[DamageType.FIRE] or 0) + 1 end,
 	on_unlearn = function(self, t) self.resists[DamageType.FIRE] = (self.resists[DamageType.FIRE] or 0) - 1 end,
 	target = function(self, t)
-		return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t)}
+		return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), friendlyfire=false}
 	end,
 	getDamage = function(self, t)
-		return self:combatTalentStatDamage(t, "wil", 15, 120)
+		return self:combatTalentMindDamage(t, 15, 60)
 	end,
-	getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 3, 7)) end,
+	getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9)) end,
 	action = function(self, t)
 		local duration = t.getDuration(self, t)
 		local radius = self:getTalentRadius(t)
-		local dam = self:mindCrit(t.getDamage(self, t))
+		local damage = self:mindCrit(t.getDamage(self, t))
 		local tg = self:getTalentTarget(t)
 		local x, y = self:getTarget(tg)
 		if not x or not y then return nil end
@@ -126,11 +142,11 @@ newTalent{
 		-- Add a lasting map effect
 		game.level.map:addEffect(self,
 			x, y, duration,
-			DamageType.FIRE, dam,
+			DamageType.FIRE_DRAIN, {dam=damage, healfactor=0.1},
 			radius,
 			5, nil,
 			{type="inferno"},
-			nil, true
+			nil, false
 		)
 		game:playSoundNear(self, "talents/devouringflame")
 		return true
@@ -140,7 +156,8 @@ newTalent{
 		local radius = self:getTalentRadius(t)
 		local duration = t.getDuration(self, t)
 		return ([[Spit a cloud of flames, doing %0.2f fire damage in a radius of %d each turn for %d turns.
-		The damage will increase with your Willpower, and can critical.
+		The flames will ignore the caster, and will drain 10%% of the damage dealt as the flames consume enemies life force and transfer it to the user.
+		The damage will increase with your Mindpower, and can critical.
 		Each point in fire drake talents also increases your fire resistance by 1%%.]]):format(damDesc(self, DamageType.FIRE, dam), radius, duration)
 	end,
 }
@@ -168,7 +185,7 @@ newTalent{
 		local tg = self:getTalentTarget(t)
 		local x, y = self:getTarget(tg)
 		if not x or not y then return nil end
-		self:project(tg, x, y, DamageType.FIREBURN, {dam=self:mindCrit(self:combatTalentStatDamage(t, "str", 30, 550)), dur=3, initial=70})
+		self:project(tg, x, y, DamageType.FIRE_STUN, {dam=self:mindCrit(self:combatTalentStatDamage(t, "str", 30, 650)), dur=3, initial=70})
 		game.level.map:particleEmitter(self.x, self.y, tg.radius, "breath_fire", {radius=tg.radius, tx=x-self.x, ty=y-self.y})
 
 		if core.shader.active(4) then
@@ -179,8 +196,8 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[You breathe fire in a frontal cone of radius %d. Any target caught in the area will take %0.2f fire damage over 3 turns.
+		return ([[You breathe fire in a frontal cone of radius %d. Any target caught in the area will take %0.2f fire damage over 3 turns, and has a 25%% chance of being Flameshocked for 3 turns, stunning them.
 		The damage will increase with your Strength, and the critical chance is based on your Mental crit rate.
-		Each point in fire drake talents also increases your fire resistance by 1%%.]]):format(self:getTalentRadius(t), damDesc(self, DamageType.FIRE, self:combatTalentStatDamage(t, "str", 30, 550)))
+		Each point in fire drake talents also increases your fire resistance by 1%%.]]):format(self:getTalentRadius(t), damDesc(self, DamageType.FIRE, self:combatTalentStatDamage(t, "str", 30, 650)))
 	end,
 }
diff --git a/game/modules/tome/data/talents/gifts/higher-draconic.lua b/game/modules/tome/data/talents/gifts/higher-draconic.lua
index d47e0ea5b4bbd7f2c3392cee8382a98b69b46f9f..0edb7c37c892307f2a781cf81bef784519eb17d0 100644
--- a/game/modules/tome/data/talents/gifts/higher-draconic.lua
+++ b/game/modules/tome/data/talents/gifts/higher-draconic.lua
@@ -23,23 +23,18 @@ newTalent{
 	require = gifts_req_high1,
 	points = 5,
 	random_ego = "attack",
-	equilibrium = 20,
-	cooldown = 16,
+	equilibrium = 10,
+	cooldown = 12,
 	range = 1,
 	tactical = { ATTACK = { PHYSICAL = 1, COLD = 1, FIRE = 1, LIGHTNING = 1, ACID = 1 } },
 	requires_target = true,
-	getWeaponDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1.2, 2.0) end,
+	getWeaponDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1.6, 2.3) end,
 	getBurstDamage = function(self, t) return self:combatTalentMindDamage(t, 20, 230) end,
+	getPassiveSpeed = function(self, t) return (self:combatTalentScale(t, 2, 10, 0.5)/100) end,
 	radius = function(self, t) return math.floor(self:combatTalentScale(t, 1.5, 3.5)) end,
-	on_learn = function(self, t) 
-		self.combat_physresist = self.combat_physresist + 1
-		self.combat_spellresist = self.combat_spellresist + 1
-		self.combat_mentalresist = self.combat_mentalresist + 1
-	end,
-	on_unlearn = function(self, t) 
-		self.combat_physresist = self.combat_physresist - 1
-		self.combat_spellresist = self.combat_spellresist - 1
-		self.combat_mentalresist = self.combat_mentalresist - 1
+	passives = function(self, t, p)
+		self:talentTemporaryValue(p, "combat_physspeed", t.getPassiveSpeed(self, t))
+		self:talentTemporaryValue(p, "combat_mindspeed", t.getPassiveSpeed(self, t))
 	end,
 	action = function(self, t)
 
@@ -59,13 +54,13 @@ newTalent{
 			elseif elem == "cold" then
 				self:attackTarget(target, DamageType.ICE, t.getWeaponDamage(self, t), true)
 				local tg = {type="ball", range=1, selffire=false, radius=self:getTalentRadius(t), talent=t}
-				local grids = self:project(tg, x, y, DamageType.ICE, self:mindCrit(t.getBurstDamage(self, t)))
+				local grids = self:project(tg, x, y, DamageType.ICE_SLOW, self:mindCrit(t.getBurstDamage(self, t)))
 				game.level.map:particleEmitter(x, y, tg.radius, "ball_ice", {radius=tg.radius, grids=grids, tx=x, ty=y, max_alpha=80})
 				game:playSoundNear(self, "talents/flame")
 			elseif elem == "fire" then
 				self:attackTarget(target, DamageType.FIREBURN, t.getWeaponDamage(self, t), true)
 				local tg = {type="ball", range=1, selffire=false, radius=self:getTalentRadius(t), talent=t}
-				local grids = self:project(tg, x, y, DamageType.FIREBURN, self:mindCrit(t.getBurstDamage(self, t)))
+				local grids = self:project(tg, x, y, DamageType.FIRE_STUN, self:mindCrit(t.getBurstDamage(self, t)))
 				game.level.map:particleEmitter(x, y, tg.radius, "ball_fire", {radius=tg.radius, grids=grids, tx=x, ty=y, max_alpha=80})
 				game:playSoundNear(self, "talents/flame")
 			elseif elem == "lightning" then
@@ -86,10 +81,11 @@ newTalent{
 	info = function(self, t)
 		local burstdamage = t.getBurstDamage(self, t)
 		local radius = self:getTalentRadius(t)
+		local speed = t.getPassiveSpeed(self, t)
 		return ([[Unleash raw, chaotic elemental damage upon your enemy.
-		You strike your enemy for %d%% weapon damage in one of blinding sand, disarming acid, freezing ice, stunning lightning or burning flames, with equal odds.
+		You strike your enemy for %d%% weapon damage in one of blinding sand, disarming acid, freezing and slowing ice, dazing lightning or stunning flames, with equal odds.
 		Additionally, you will cause a burst that deals %0.2f of that damage to enemies in radius %d, regardless of if you hit with the blow.
-		Each point in Prismatic Slash increase your Physical, Spell and Mind Saves by 1.]]):format(100 * self:combatTalentWeaponDamage(t, 1.2, 2.0), burstdamage, radius)
+		Levels in Prismatic Slash increase your Physical and Mental attack speeds by %d%%.]]):format(100 * self:combatTalentWeaponDamage(t, 1.2, 2.0), burstdamage, radius, 100*speed)
 	end,
 }
 
@@ -105,12 +101,17 @@ newTalent{
 	tactical = { ATTACKAREA = { poison = 2 } },
 	range = 0,
 	radius = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9)) end,
-	direct_hit = true,
 	requires_target = true,
-	getDamage = function(self, t) return self:combatTalentStatDamage(t, "str", 60, 650) end,
-	getEffect = function(self, t) return self:combatTalentLimit(t, 100, 18, 50) end, -- Limit < 100%
-	on_learn = function(self, t) self.resists[DamageType.NATURE] = (self.resists[DamageType.NATURE] or 0) + 2 end,
-	on_unlearn = function(self, t) self.resists[DamageType.NATURE] = (self.resists[DamageType.NATURE] or 0) - 2 end,
+	getDamage = function(self, t) return self:combatTalentStatDamage(t, "str", 60, 750) end,
+	getEffect = function(self, t) return math.ceil(self:combatTalentLimit(t, 50, 10, 20)) end,
+	on_learn = function(self, t) 
+		self.resists[DamageType.NATURE] = (self.resists[DamageType.NATURE] or 0) + 3 
+		self.inc_damage[DamageType.NATURE] = (self.inc_damage[DamageType.NATURE] or 0) + 4
+		end,
+	on_unlearn = function(self, t) 
+		self.resists[DamageType.NATURE] = (self.resists[DamageType.NATURE] or 0) - 3 
+		self.inc_damage[DamageType.NATURE] = (self.inc_damage[DamageType.NATURE] or 0) - 4
+		end,
 	target = function(self, t)
 		return {type="cone", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=false, talent=t}
 	end,
@@ -118,7 +119,14 @@ newTalent{
 		local tg = self:getTalentTarget(t)
 		local x, y = self:getTarget(tg)
 		if not x or not y then return nil end
-		self:project(tg, x, y, DamageType.INSIDIOUS_POISON, {dam=self:mindCrit(t.getDamage(self,t)), dur=6, heal_factor=t.getEffect(self,t)})
+		local dam = self:mindCrit(t.getDamage(self, t))
+		self:project(tg, x, y, function(px, py)
+			local target = game.level.map(px, py, Map.ACTOR)
+			if target and target:canBe("poison") then
+				target:setEffect(self.EFF_CRIPPLING_POISON, 6, {src=self, power=dam/6, fail=math.ceil(self:combatTalentLimit(t, 100, 10, 20))})
+			end
+		end)
+
 		game.level.map:particleEmitter(self.x, self.y, tg.radius, "breath_slime", {radius=tg.radius, tx=x-self.x, ty=y-self.y})
 		game:playSoundNear(self, "talents/breath")
 		
@@ -130,10 +138,10 @@ newTalent{
 	end,
 	info = function(self, t)
 		local effect = t.getEffect(self, t)
-		return ([[You breathe insidious poison in a frontal cone of radius %d. Any target caught in the area will take %0.2f nature damage each turn for 6 turns.
-		The poison also reduces the healing of enemies poisoned by %d%% while it is in effect.
+		return ([[You breathe crippling poison in a frontal cone of radius %d. Any target caught in the area will take %0.2f nature damage each turn for 6 turns.
+		The poison also gives enemies a %d%% chance to fail actions more complicated than basic attacks and movement, while it is in effect.
 		The damage will increase with your Strength, and the critical chance is based on your Mental crit rate.
-		Each point in Venomous Breath also increases your nature resistance by 2%%.]]):format(self:getTalentRadius(t), damDesc(self, DamageType.NATURE, t.getDamage(self,t)/6), effect)
+		Each point in Venomous Breath also increases your nature resistance by 3%%, and your nature damage by 4%%.]] ):format(self:getTalentRadius(t), damDesc(self, DamageType.NATURE, t.getDamage(self,t)/6), effect)
 	end,
 }
 
@@ -145,6 +153,7 @@ newTalent{
 	mode = "passive",
 	resistKnockback = function(self, t) return self:combatTalentLimit(t, 1, .17, .5) end, -- Limit < 100%
 	resistBlindStun = function(self, t) return self:combatTalentLimit(t, 1, .07, .25) end, -- Limit < 100%
+	CDreduce = function(self, t) return math.floor(self:combatTalentLimit(t, 8, 1, 6)) end, -- Limit < 8
 	on_learn = function(self, t)
 		self.inc_stats[self.STAT_CUN] = self.inc_stats[self.STAT_CUN] + 2
 	end,
@@ -152,14 +161,17 @@ newTalent{
 		self.inc_stats[self.STAT_CUN] = self.inc_stats[self.STAT_CUN] - 2
 	end,
 	passives = function(self, t, p)
+		local cdr = t.CDreduce(self, t)
 		self:talentTemporaryValue(p, "knockback_immune", t.resistKnockback(self, t))
 		self:talentTemporaryValue(p, "stun_immune", t.resistBlindStun(self, t))
 		self:talentTemporaryValue(p, "blind_immune", t.resistBlindStun(self, t))
+		self:talentTemporaryValue(p, "talent_cd_reduction",
+{[Talents.T_VENOMOUS_BREATH]=cdr, [Talents.T_ICE_BREATH]=cdr, [Talents.T_FIRE_BREATH]=cdr, [Talents.T_LIGHTNING_BREATH]=cdr, [Talents.T_CORROSIVE_BREATH]=cdr, [Talents.T_SAND_BREATH]=cdr})
 	end,
 	info = function(self, t)
 		return ([[You have the mental prowess of a Wyrm.
-		Your Cunning is increased by %d.
-		You gain %d%% knockback resistance, and your blindness and stun resistances are increased by %d%%.]]):format(2*self:getTalentLevelRaw(t), 100*t.resistKnockback(self, t), 100*t.resistBlindStun(self, t))
+		Your Cunning is increased by %d, and your breath attack cooldowns are reduced by %d.
+		You gain %d%% knockback resistance, and your blindness and stun resistances are increased by %d%%.]]):format(2*self:getTalentLevelRaw(t), t.CDreduce(self, t), 100*t.resistKnockback(self, t), 100*t.resistBlindStun(self, t))
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/gifts/sand-drake.lua b/game/modules/tome/data/talents/gifts/sand-drake.lua
index b1b3a6c61b732a233b4648de2a6dfb40e9059c79..43ccd4120e3a195b1b7ab5e940695a062ca32094 100644
--- a/game/modules/tome/data/talents/gifts/sand-drake.lua
+++ b/game/modules/tome/data/talents/gifts/sand-drake.lua
@@ -23,24 +23,29 @@ newTalent{
 	require = gifts_req1,
 	points = 5,
 	equilibrium = 4,
-	cooldown = 10,
+	cooldown = function(self, t) return math.ceil(self:combatTalentLimit(t, 4, 10, 7)) end,
 	range = 1,
 	no_message = true,
-	tactical = { ATTACK = { NATURE = 0.5 }, EQUILIBRIUM = 0.5},
+	tactical = { ATTACK = { weapon = 1 }, EQUILIBRIUM = 0.5},
 	requires_target = true,
 	no_npc_use = true,
 	maxSwallow = function(self, t, target) return -- Limit < 50%
 		self:combatLimit(self:getTalentLevel(t)*(self.size_category or 3)/(target.size_category or 3), 50, 13, 1, 25, 5)
 	end,
+	getPassiveCrit = function(self, t) return self:combatTalentScale(t, 2, 10, 0.5) end,
 	on_learn = function(self, t) self.resists[DamageType.PHYSICAL] = (self.resists[DamageType.PHYSICAL] or 0) + 0.5 end,
 	on_unlearn = function(self, t) self.resists[DamageType.PHYSICAL] = (self.resists[DamageType.PHYSICAL] or 0) - 0.5 end,
+	passives = function(self, t, p)
+		self:talentTemporaryValue(p, "combat_physcrit", t.getPassiveCrit(self, t))
+		self:talentTemporaryValue(p, "combat_mindcrit", t.getPassiveCrit(self, t))
+	end,
 	action = function(self, t)
 		local tg = {type="hit", range=self:getTalentRange(t)}
 		local x, y, target = self:getTarget(tg)
 		if not x or not y or not target then return nil end
 		if core.fov.distance(self.x, self.y, x, y) > 1 then return nil end
 		self:logCombat(target, "#Source# tries to swallow #Target#!")
-		local hit = self:attackTarget(target, DamageType.NATURE, self:combatTalentWeaponDamage(t, 1, 1.5), true)
+		local hit = self:attackTarget(target, DamageType.NATURE, self:combatTalentWeaponDamage(t, 1.6, 2.5), true)
 		if not hit then return true end
 
 		if (target.life * 100 / target.max_life > t.maxSwallow(self, t, target)) and not target.dead then
@@ -64,11 +69,12 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Attack the target for %d%% nature weapon damage.
+		return ([[Attack the target for %d%% Nature weapon damage.
 		If the attack brings your target below %d%% life or kills it, you can try to swallow it, killing it automatically and regaining life and equilibrium depending on its level.
 		The chance to swallow depends on your talent level and the relative size of the target.
+		Levels in Swallow additionally raises your Physical and Mental critical rate by %d%%, passively.
 		Each point in sand drake talents also increases your physical resistance by 0.5%%.]]):
-		format(100 * self:combatTalentWeaponDamage(t, 1, 1.5), t.maxSwallow(self, t, self))
+		format(100 * self:combatTalentWeaponDamage(t, 1.6, 2.5), t.maxSwallow(self, t, self), t.getPassiveCrit(self, t))
 	end,
 }
 
@@ -80,30 +86,32 @@ newTalent{
 	random_ego = "attack",
 	message = "@Source@ shakes the ground!",
 	equilibrium = 4,
-	cooldown = 30,
+	cooldown = 20,
 	tactical = { ATTACKAREA = { PHYSICAL = 2 }, DISABLE = { knockback = 2 } },
-	range = 10,
+	range = 1,
 	on_learn = function(self, t) self.resists[DamageType.PHYSICAL] = (self.resists[DamageType.PHYSICAL] or 0) + 0.5 end,
 	on_unlearn = function(self, t) self.resists[DamageType.PHYSICAL] = (self.resists[DamageType.PHYSICAL] or 0) - 0.5 end,
 	radius = function(self, t) return math.floor(self:combatTalentScale(t, 2.5, 4.5)) end,
 	no_npc_use = true,
-	getDamage = function(self, t)
-		return self:combatDamage() * 0.8
-	end,
+	getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1.3, 2.1) end,
 	action = function(self, t)
 		local tg = {type="ball", range=0, selffire=false, radius=self:getTalentRadius(t), talent=t, no_restrict=true}
-		self:project(tg, self.x, self.y, DamageType.PHYSKNOCKBACK, {dam=self:mindCrit(t.getDamage(self, t)), dist=4})
+		self:project(tg, self.x, self.y, function(px, py, tg, self)
+			local target = game.level.map(px, py, Map.ACTOR)
+			if target and target ~= self then
+				local hit = self:attackTarget(target, DamageType.PHYSKNOCKBACK, self:combatTalentWeaponDamage(t, 1.3, 2.1), true)
+			end
+		end)
 		self:doQuake(tg, self.x, self.y)
 		return true
 	end,
 	info = function(self, t)
 		local radius = self:getTalentRadius(t)
 		local dam = t.getDamage(self, t)
-		return ([[You slam your foot onto the ground, shaking the area around you in a radius of %d.
-		Creatures caught by the quake will be damaged for %d and knocked back up to 4 tiles away.
-		The terrain will also be moved around within the quake's radius.
-		The damage will increase with your Strength.
-		Each point in sand drake talents also increases your physical resistance by 0.5%%.]]):format(radius, dam)
+		return ([[You slam the ground, shaking the area around you in a radius of %d.
+		Creatures caught by the quake will be damaged for %d%% weapon damage, and knocked back up to 3 tiles away.
+		The terrain will also be moved around within the radius, and the user will be shifted to a random square within the radius.
+		Each point in sand drake talents also increases your physical resistance by 0.5%%.]]):format(radius, dam * 100)
 	end,
 }
 
@@ -112,20 +120,24 @@ newTalent{
 	type = {"wild-gift/sand-drake", 3},
 	require = gifts_req3,
 	points = 5,
-	equilibrium = 50,
-	cooldown = 30,
+	equilibrium = 15,
+	cooldown = function(self, t) return math.ceil(self:combatTalentLimit(t, 10, 40, 15)) end,
 	range = 10,
+	no_energy = function(self, t) if self:getTalentLevel(t) >= 5 then return true else return false end end,
 	tactical = { CLOSEIN = 0.5, ESCAPE = 0.5 },
-	getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 8, 20, 0.5, 0, 2)) end,
+	getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 3, 7, 0.5, 0, 2)) end,
+	getPenetration = function(self, t) return 10 + self:combatTalentMindDamage(t, 15, 30) end,
 	on_learn = function(self, t) self.resists[DamageType.PHYSICAL] = (self.resists[DamageType.PHYSICAL] or 0) + 0.5 end,
 	on_unlearn = function(self, t) self.resists[DamageType.PHYSICAL] = (self.resists[DamageType.PHYSICAL] or 0) - 0.5 end,
 	action = function(self, t)
-		self:setEffect(self.EFF_BURROW, t.getDuration(self, t), {})
+		self:setEffect(self.EFF_BURROW, t.getDuration(self, t), {power=t.getPenetration(self, t)})
 		return true
 	end,
 	info = function(self, t)
-		return ([[Allows you to burrow into walls for %d turns.
-		Each point in sand drake talents also increases your physical resistance by 0.5%%.]]):format(t.getDuration(self, t))
+		return ([[Allows you to burrow into earthen walls for %d turns.
+		Your powerful digging abilities also allow you to exploit and smash through enemy defensive weaknesses; You ignore %d of target armor and %d%% of enemy physical damage resistance while this is in effect.
+		At Talent Level 5, this talent can be used instantly, and the cooldown will reduce with levels.
+		Each point in sand drake talents also increases your physical resistance by 0.5%%.]]):format(t.getDuration(self, t), t.getPenetration(self, t), t.getPenetration(self, t) / 2)
 	end,
 }
 
@@ -149,9 +161,9 @@ newTalent{
 		return {type="cone", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=false, talent=t}
 	end,
 	getDamage = function(self, t)
-		return self:combatTalentStatDamage(t, "str", 30, 400)
+		return self:combatTalentStatDamage(t, "str", 30, 480)
 	end,
-	getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 3, 7)) end,
+	getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 3, 4)) end,
 	action = function(self, t)
 		local tg = self:getTalentTarget(t)
 		local x, y = self:getTarget(tg)
@@ -169,7 +181,7 @@ newTalent{
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
 		local duration = t.getDuration(self, t)
-		return ([[You breathe sand in a frontal cone of radius %d. Any target caught in the area will take %0.2f physical damage, and be blinded for %d turns.
+		return ([[You breathe sand in a frontal cone of radius %d. Any target caught in the area will take %0.2f physical damage, and will be blinded for %d turns.
 		The damage will increase with your Strength, and the critical chance is based on your Mental crit rate.
 		Each point in sand drake talents also increases your physical resistance by 0.5%%.]]):format(self:getTalentRadius(t), damDesc(self, DamageType.PHYSICAL, damage), duration)
 	end,
diff --git a/game/modules/tome/data/talents/gifts/storm-drake.lua b/game/modules/tome/data/talents/gifts/storm-drake.lua
index e3b58b2613057597b8b69b6c3388908b6c6fb252..e00da623cbfd79f2a718051c1369d3efb82f959c 100644
--- a/game/modules/tome/data/talents/gifts/storm-drake.lua
+++ b/game/modules/tome/data/talents/gifts/storm-drake.lua
@@ -25,15 +25,19 @@ newTalent{
 	require = gifts_req1,
 	points = 5,
 	equilibrium = 10,
-	cooldown = 26,
+	cooldown = 25,
 	range = 10,
 	tactical = { CLOSEIN = 2, ESCAPE = 2 },
 	requires_target = true,
 	no_energy = true,
+	getPassiveSpeed = function(self, t) return self:combatTalentScale(t, 0.08, 0.4, 0.7) end,
 	getSpeed = function(self, t) return self:combatTalentScale(t, 470, 750, 0.75) end,
-	getDuration = function(self, t) return math.ceil(self:combatTalentScale(t, 1.1, 2.6)) end,
+	getDuration = function(self, t) return math.ceil(self:combatTalentScale(t, 1.1, 3.1)) end,
 	on_learn = function(self, t) self.resists[DamageType.LIGHTNING] = (self.resists[DamageType.LIGHTNING] or 0) + 1 end,
 	on_unlearn = function(self, t) self.resists[DamageType.LIGHTNING] = (self.resists[DamageType.LIGHTNING] or 0) - 1 end,
+	passives = function(self, t, p)
+		self:talentTemporaryValue(p, "movement_speed", t.getPassiveSpeed(self, t))
+	end,
 	on_pre_use = function(self, t) return not self:attr("never_move") end,
 	action = function(self, t)
 		self:setEffect(self.EFF_LIGHTNING_SPEED, self:mindCrit(t.getDuration(self, t)), {power=t.getSpeed(self, t)})
@@ -44,7 +48,8 @@ newTalent{
 		Also provides 30%% physical damage resistance and 100%% lightning resistance.
 		Any actions other than moving will stop this effect.
 		Note: since you will be moving very fast, game turns will pass very slowly.
-		Each point in storm drake talents also increases your lightning resistance by 1%%.]]):format(t.getSpeed(self, t), t.getDuration(self, t))
+		Levels in Lightning Speed additionally raises your Movement Speed by %d%%, passively.
+		Each point in storm drake talents also increases your lightning resistance by 1%%.]]):format(t.getSpeed(self, t), t.getDuration(self, t), t.getPassiveSpeed(self, t)*100)
 	end,
 }
 
@@ -56,7 +61,7 @@ newTalent{
 	equilibrium = 20,
 	cooldown = 20,
 	range = 0,
-	radius = 1,
+	radius = function(self, t) return math.floor(self:combatTalentScale(t, 1, 6)) end,
 	tactical = { ATTACKAREA = { instakill = 5 } },
 	requires_target = true,
 	on_learn = function(self, t) self.resists[DamageType.LIGHTNING] = (self.resists[DamageType.LIGHTNING] or 0) + 1 end,
@@ -67,8 +72,12 @@ newTalent{
 	getPercent = function(self, t)
 		return self:combatLimit(self:combatTalentMindDamage(t, 10, 45), 90, 0, 0, 31, 31) -- Limit to <90%
 	end,
+	getDamage = function(self, t)
+		return self:combatTalentMindDamage(t, 20, 160)
+	end,
 	action = function(self, t)
 		local tg = self:getTalentTarget(t)
+		local litdam = self:mindCrit(t.getDamage(self, t))
 		self:project(tg, self.x, self.y, function(px, py)
 			local target = game.level.map(px, py, Map.ACTOR)
 			if not target then return end
@@ -80,7 +89,7 @@ newTalent{
 			game.logSeen(target, "%s is caught in the static field!", target.name:capitalize())
 
 			local perc = t.getPercent(self, t)
-			if target.rank >= 5 then perc = perc / 3
+			if target.rank >= 5 then perc = perc / 2.5
 			elseif target.rank >= 3.5 then perc = perc / 2
 			elseif target.rank >= 3 then perc = perc / 1.5
 			end
@@ -88,6 +97,7 @@ newTalent{
 			local dam = target.life * perc / 100
 			if target.life - dam < 0 then dam = target.life end
 			target:takeHit(dam, self)
+			self:project({type="hit", talent=t},target.x,target.y,DamageType.LIGHTNING,litdam)
 
 			game:delayedLogDamage(self, target, dam, ("#PURPLE#%d STATIC#LAST#"):format(math.ceil(dam)))
 		end, nil, {type="lightning_explosion"})
@@ -96,9 +106,11 @@ newTalent{
 	end,
 	info = function(self, t)
 		local percent = t.getPercent(self, t)
-		return ([[Generate an electrical field around you in a radius of 1. Any creature caught inside will lose up to %0.1f%% of its current life (effect decreased for higher creature ranks).
-		This effect cannot kill creatures.  Life loss will increase with your Mindpower.
-		Each point in storm drake talents also increases your lightning resistance by 1%%.]]):format(percent)
+		local litdam = t.getDamage(self, t)
+		return ([[Generate an electrical field around you in a radius of %d. Any creature caught inside will lose up to %0.1f%% of its current life (%0.1f%% if the target is Elite or Rare, %0.1f%% if the target is a Unique or Boss, and %0.1f%% if they are an Elite Boss.). This life drain is irresistable, but can be saved against with physical save.
+		Additionally, it will deal %0.2f lightning damage afterwards, regardless of target rank.
+		Current life loss and lightning damage will increase with your Mindpower, and the lightning damage element can critically hit with mental critical chances.
+		Each point in storm drake talents also increases your lightning resistance by 1%%.]]):format(self:getTalentRadius(t), percent, percent/1.5, percent/2, percent/2.5, damDesc(self, DamageType.LIGHTNING, litdam))
 	end,
 }
 
@@ -109,14 +121,16 @@ newTalent{
 	points = 5,
 	equilibrium = 14,
 	cooldown = 15,
-	proj_speed = 2, -- This is purely indicative
+	proj_speed = 4, -- This is purely indicative
 	tactical = { ATTACK = { LIGHTNING = 2 }, DISABLE = { stun = 2 } },
-	range = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9)) end,
+	range = function(self, t) return math.floor(self:combatTalentScale(t, 3, 6)) end,
 	requires_target = true,
 	on_learn = function(self, t) self.resists[DamageType.LIGHTNING] = (self.resists[DamageType.LIGHTNING] or 0) + 1 end,
 	on_unlearn = function(self, t) self.resists[DamageType.LIGHTNING] = (self.resists[DamageType.LIGHTNING] or 0) - 1 end,
+	getRadius = function(self, t) return math.floor(self:combatTalentScale(t, 2, 4, 0.5, 0, 0, true)) end,
+	getStunDuration = function(self, t) return self:combatTalentScale(t, 3, 6, 0.5, 0, 0, true) end,
 	action = function(self, t)
-		local tg = {type="hit", range=self:getTalentRange(t), talent=t}
+		local tg = {type="hit", range=self:getTalentRange(t), selffire=false, talent=t}
 		local x, y = self:getTarget(tg)
 		if not x or not y then return nil end
 		local _ _, x, y = self:canProject(tg, x, y)
@@ -125,11 +139,13 @@ newTalent{
 
 		local movedam = self:mindCrit(self:combatTalentMindDamage(t, 10, 110))
 		local dam = self:mindCrit(self:combatTalentMindDamage(t, 15, 190))
+		local rad = t.getRadius(self, t)
+		local dur = t.getStunDuration(self, t)
 
 		local proj = require("mod.class.Projectile"):makeHoming(
 			self,
 			{particle="bolt_lightning", trail="lightningtrail"},
-			{speed=2, name="Tornado", dam=dam, movedam=movedam},
+			{speed=4, name="Tornado", dam=dam, movedam=movedam},
 			target,
 			self:getTalentRange(t),
 			function(self, src)
@@ -138,10 +154,10 @@ newTalent{
 			end,
 			function(self, src, target)
 				local DT = require("engine.DamageType")
-				src:project({type="ball", radius=1, x=self.x, y=self.y}, self.x, self.y, DT.LIGHTNING, self.def.dam)
-				src:project({type="ball", radius=1, x=self.x, y=self.y}, self.x, self.y, DT.MINDKNOCKBACK, self.def.dam)
+				src:project({type="ball", radius=rad, selffire=false, x=self.x, y=self.y}, self.x, self.y, DT.LIGHTNING, self.def.dam)
+				src:project({type="ball", radius=rad, selffire=false, x=self.x, y=self.y}, self.x, self.y, DT.MINDKNOCKBACK, self.def.dam)
 				if target:canBe("stun") then
-					target:setEffect(target.EFF_STUNNED, 4, {apply_power=src:combatMindpower()})
+					target:setEffect(target.EFF_STUNNED, dur, {apply_power=src:combatMindpower()})
 				else
 					game.logSeen(target, "%s resists the tornado!", target.name:capitalize())
 				end
@@ -164,15 +180,19 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
+		local rad = t.getRadius(self, t)
+		local duration = t.getStunDuration(self, t)
 		return ([[Summons a tornado that moves slowly toward its target, following it if it changes position.
 		Any foe caught in its path takes %0.2f lightning damage.
-		When it reaches its target, it explodes in a radius of 1 for %0.2f lightning damage and %0.2f physical damage. All affected creatures will be knocked back, and the targeted creature will be stunned for 4 turns.
+		When it reaches its target, it explodes in a radius of %d for %0.2f lightning damage and %0.2f physical damage. All affected creatures will be knocked back, and the targeted creature will be stunned for %d turns. The blast will ignore the talent user.
 		The tornado will last for %d turns, or until it reaches its target.
-		Damage will increase with your Mindpower.
+		Damage will increase with your Mindpower, and the stun chance is based on your Mindpower vs target Physical Save.
 		Each point in storm drake talents also increases your lightning resistance by 1%%.]]):format(
 			damDesc(self, DamageType.LIGHTNING, self:combatTalentMindDamage(t, 10, 110)),
+			rad,
 			damDesc(self, DamageType.LIGHTNING, self:combatTalentMindDamage(t, 15, 190)),
 			damDesc(self, DamageType.PHYSICAL, self:combatTalentMindDamage(t, 15, 190)),
+			duration,
 			self:getTalentRange(t)
 		)
 	end,
@@ -198,14 +218,17 @@ newTalent{
 		return {type="cone", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=false, talent=t}
 	end,
 	getDamage = function(self, t)
-		return self:combatTalentStatDamage(t, "str", 30, 500)
+		return self:combatTalentStatDamage(t, "str", 30, 670)
+	end,
+	getDaze = function(self, t) 
+		return 20+self:combatTalentMindDamage(t, 10, 30) 
 	end,
 	action = function(self, t)
 		local tg = self:getTalentTarget(t)
 		local x, y = self:getTarget(tg)
 		if not x or not y then return nil end
 		local dam = self:mindCrit(t.getDamage(self, t))
-		self:project(tg, x, y, DamageType.LIGHTNING_DAZE, {power_check=self:combatMindpower(), dam=rng.avg(dam / 3, dam, 3)})
+		self:project(tg, x, y, DamageType.LIGHTNING_DAZE, {daze=t.getDaze(self, t), power_check=self:combatMindpower(), dam=rng.avg(dam / 3, dam, 3)})
 
 		if core.shader.active() then game.level.map:particleEmitter(self.x, self.y, tg.radius, "breath_lightning", {radius=tg.radius, tx=x-self.x, ty=y-self.y}, {type="lightning"})
 		else game.level.map:particleEmitter(self.x, self.y, tg.radius, "breath_lightning", {radius=tg.radius, tx=x-self.x, ty=y-self.y})
@@ -221,12 +244,14 @@ newTalent{
 	end,
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
-		return ([[You breathe lightning in a frontal cone of radius %d. Any target caught in the area will take %0.2f to %0.2f lightning damage, and can be dazed for 3 turns.
-		The damage will increase with your Strength, and the critical chance is based on your Mental crit rate.
+		local daze = t.getDaze(self, t)
+		return ([[You breathe lightning in a frontal cone of radius %d. Any target caught in the area will take %0.2f to %0.2f lightning damage, and have a %d%% chance to be dazed for 3 turns.
+		The damage will increase with your Strength, and the critical chance is based on your Mental crit rate. The Daze chance is based on your Mindpower.
 		Each point in storm drake talents also increases your lightning resistance by 1%%.]]):format(
 			self:getTalentRadius(t),
 			damDesc(self, DamageType.LIGHTNING, damage / 3),
-			damDesc(self, DamageType.LIGHTNING, damage)
+			damDesc(self, DamageType.LIGHTNING, damage),
+			daze
 		)
 	end,
 }
diff --git a/game/modules/tome/data/talents/gifts/venom-drake.lua b/game/modules/tome/data/talents/gifts/venom-drake.lua
index 9ab9c7da345c06aebfab5d3a0dfc98599708c7b3..cd5ad1212f80c92aa2417831db4aa4906b855a4d 100644
--- a/game/modules/tome/data/talents/gifts/venom-drake.lua
+++ b/game/modules/tome/data/talents/gifts/venom-drake.lua
@@ -28,8 +28,14 @@ newTalent{
 	cooldown = function(self, t) return math.ceil(self:combatTalentLimit(t, 3, 6.9, 5.5)) end, -- Limit >=3
 	tactical = { ATTACK = { ACID = 2 } },
 	range = function(self, t) return math.floor(self:combatTalentScale(t, 5.5, 7.5)) end,
-	on_learn = function(self, t) self.resists[DamageType.ACID] = (self.resists[DamageType.ACID] or 0) + 1 end,
-	on_unlearn = function(self, t) self.resists[DamageType.ACID] = (self.resists[DamageType.ACID] or 0) - 1 end,
+	on_learn = function(self, t) 
+		self.resists[DamageType.ACID] = (self.resists[DamageType.ACID] or 0) + 1 
+		self.combat_mindpower = self.combat_mindpower + 4
+	end,
+	on_unlearn = function(self, t) 
+		self.resists[DamageType.ACID] = (self.resists[DamageType.ACID] or 0) - 1 
+		self.combat_mindpower = self.combat_mindpower - 4
+	end,
 	direct_hit = function(self, t) if self:getTalentLevel(t) >= 5 then return true else return false end end,
 	requires_target = true,
 	target = function(self, t)
@@ -58,6 +64,7 @@ newTalent{
 		The target will take %0.2f Mindpower-based acid damage.
 		Enemies struck have a 25%% chance to be Disarmed for three turns, as their weapon is rendered useless by an acid coating.
 		At Talent Level 5, this becomes a piercing line of acid.
+		Every level in Acidic Spray additionally raises your Mindpower by 4, passively.
 		Each point in acid drake talents also increases your acid resistance by 1%%.]]):format(damDesc(self, DamageType.ACID, damage))
 	end,
 }
@@ -68,15 +75,15 @@ newTalent{
 	require = gifts_req2,
 	points = 5,
 	random_ego = "attack",
-	equilibrium = 15,
-	cooldown = 25,
+	equilibrium = 10,
+	cooldown = 15,
 	tactical = { ATTACKAREA = { ACID = 2 } },
 	range = 0,
 	on_learn = function(self, t) self.resists[DamageType.ACID] = (self.resists[DamageType.ACID] or 0) + 1 end,
 	on_unlearn = function(self, t) self.resists[DamageType.ACID] = (self.resists[DamageType.ACID] or 0) - 1 end,
 	radius = function(self, t) return math.floor(self:combatTalentScale(t, 2.5, 4.5)) end,
 	requires_target = true,
-	getDamage = function(self, t) return self:combatTalentMindDamage(t, 10, 70) end,
+	getDamage = function(self, t) return self:combatTalentMindDamage(t, 15, 70) end,
 	getDuration = function(self, t) return math.floor(self:combatScale(self:combatMindpower(0.04) + self:getTalentLevel(t)/2, 6, 0, 7.67, 5.67)) end,
 	getCorrodeDur = function(self, t) return math.floor(self:combatTalentScale(t, 2.3, 3.8)) end,
 	getAtk = function(self, t) return self:combatTalentMindDamage(t, 2, 20) end,
@@ -175,11 +182,14 @@ newTalent{
 	target = function(self, t)
 		return {type="cone", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=false, talent=t}
 	end,
+	getDisarm = function(self, t) 
+		return 20+self:combatTalentMindDamage(t, 10, 30) 
+	end,
 	action = function(self, t)
 		local tg = self:getTalentTarget(t)
 		local x, y = self:getTarget(tg)
 		if not x or not y then return nil end
-		self:project(tg, x, y, DamageType.ACID_DISARM, self:mindCrit(self:combatTalentStatDamage(t, "str", 30, 420)))
+		self:project(tg, x, y, DamageType.ACID_DISARM, {dam=self:mindCrit(self:combatTalentStatDamage(t, "str", 30, 520)), chance=t.getDisarm(self, t),})
 		game.level.map:particleEmitter(self.x, self.y, tg.radius, "breath_acid", {radius=tg.radius, tx=x-self.x, ty=y-self.y})
 		game:playSoundNear(self, "talents/breath")
 		
@@ -190,9 +200,10 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
+		local disarm = t.getDisarm(self, t)
 		return ([[You breathe acid in a frontal cone of radius %d. Any target caught in the area will take %0.2f acid damage. 
-		Enemies caught in the acid have a 25%% chance of their weapons becoming useless for three turns.
-		The damage will increase with your Strength, and the critical chance is based on your Mental crit rate.
-		Each point in acid drake talents also increases your acid resistance by 1%%.]]):format(self:getTalentRadius(t), damDesc(self, DamageType.ACID, self:combatTalentStatDamage(t, "str", 30, 420)))
+		Enemies caught in the acid have a %d%% chance of their weapons becoming useless for three turns.
+		The damage will increase with your Strength, and the critical chance is based on your Mental crit rate. The Disarm chance is based on your Mindpower.
+		Each point in acid drake talents also increases your acid resistance by 1%%.]]):format(self:getTalentRadius(t), damDesc(self, DamageType.ACID, self:combatTalentStatDamage(t, "str", 30, 520)), disarm)
 	end,
 }
\ No newline at end of file
diff --git a/game/modules/tome/data/timed_effects/physical.lua b/game/modules/tome/data/timed_effects/physical.lua
index 8b0ba395b50f46cd614738919c635d0206662a9e..62518ff3272f245b018aa62c8f4ec8afb5d8c4da 100644
--- a/game/modules/tome/data/timed_effects/physical.lua
+++ b/game/modules/tome/data/timed_effects/physical.lua
@@ -1025,7 +1025,7 @@ newEffect{
 newEffect{
 	name = "BURROW", image = "talents/burrow.png",
 	desc = "Burrow",
-	long_desc = function(self, eff) return "The target is able to burrow into walls." end,
+	long_desc = function(self, eff) return ("The target is able to burrow into walls, and additionally has %d more APR and %d%% more physical resistance penetration."):format(eff.power, eff.power / 2) end,
 	type = "physical",
 	subtype = { earth=true },
 	status = "beneficial",
@@ -1033,6 +1033,8 @@ newEffect{
 	activate = function(self, eff)
 		eff.pass = self:addTemporaryValue("can_pass", {pass_wall=1})
 		eff.dig = self:addTemporaryValue("move_project", {[DamageType.DIG]=1})
+		self:effectTemporaryValue(eff, "combat_apr", eff.power)
+		self:effectTemporaryValue(eff, "resists_pen", {[DamageType.PHYSICAL]=eff.power / 2 })
 	end,
 	deactivate = function(self, eff)
 		self:removeTemporaryValue("can_pass", eff.pass)