diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua
index 4ecaed951f6f038c3f7a90f9810793cef359f3c2..83cfb9225b132c4a9037e36cb91fb9b35664661c 100644
--- a/game/modules/tome/class/Actor.lua
+++ b/game/modules/tome/class/Actor.lua
@@ -661,7 +661,7 @@ function _M:onTakeHit(value, src)
 		if hateGain >= 0.1 then
 			self.hate = math.min(self.max_hate, self.hate + hateGain)
 			if hateMessage then
-				game.logSeen(self, hateMessage.." (+%0.1f hate)", hateGain)
+				game.logPlayer(self, hateMessage.." (+%0.1f hate)", hateGain)
 			end
 		end
 	end
@@ -678,7 +678,7 @@ function _M:onTakeHit(value, src)
 		if hateGain >= 0.1 then
 			src.hate = math.min(src.max_hate, src.hate + hateGain)
 			if hateMessage then
-				game.logSeen(src, hateMessage.." (+%0.1f hate)", hateGain)
+				game.logPlayer(src, hateMessage.." (+%0.1f hate)", hateGain)
 			end
 		end
 	end
@@ -785,7 +785,7 @@ function _M:die(src)
 
 		src.hate = math.min(src.max_hate, src.hate + hateGain)
 		if hateMessage then
-			game.logSeen(src, hateMessage.." (+%0.1f hate)", hateGain - src.hate_per_kill)
+			game.logPlayer(src, hateMessage.." (+%0.1f hate)", hateGain - src.hate_per_kill)
 		end
 	end
 
diff --git a/game/modules/tome/data/talents/cursed/cursed-form.lua b/game/modules/tome/data/talents/cursed/cursed-form.lua
index f947b533dff2c099517c2b7d73bfa2362d40fd94..81719599af5eb154b2d94c6fa2ef8c081dc84bf2 100644
--- a/game/modules/tome/data/talents/cursed/cursed-form.lua
+++ b/game/modules/tome/data/talents/cursed/cursed-form.lua
@@ -34,11 +34,14 @@ newTalent{
 		return true
 	end,
 	getHealPerKill = function(self, t)
-		return math.sqrt(self:getTalentLevel(t)) * 10
+		return math.sqrt(self:getTalentLevel(t)) * 15
 	end,
 	getRegenRate = function(self, t)
 		return math.sqrt(self:getTalentLevel(t) * 2) * self.max_life * 0.008
 	end,
+	getResist = function(self, t)
+		return -18 + (self:getTalentLevel(t) * 3) + (18 * getHateMultiplier(self, 0, 1))
+	end,
 	do_regenLife  = function(self, t)
 		-- heal
 		local maxHeal = self.unnatural_body_heal or 0
@@ -51,7 +54,7 @@ newTalent{
 		
 		-- update resists as well
 		local oldResist = self.unnatural_body_resist or 0
-		local newResist = -15 + (15 * getHateMultiplier(self, 0, 1))
+		local newResist = t.getResist(self, t)
 		self.resists.all = (self.resists.all or 0) - oldResist + newResist
 		self.unnatural_body_resist = newResist
 	end,
@@ -66,8 +69,8 @@ newTalent{
 	info = function(self, t)
 		local healPerKill = t.getHealPerKill(self, t)
 		local regenRate = t.getRegenRate(self, t)
-		
-		return ([[Your body is now fed by your hatred. With each kill, you regenerate %d%% of your victim's life at a rate of %0.1f life per turn. As your hate fades your body weakens taking up to 15%% extra damage.]]):format(healPerKill, regenRate)
+		local resist = -18 + (self:getTalentLevel(t) * 3)
+		return ([[Your body is now fed by your hatred. With each kill, you regenerate %d%% of your victim's life at a rate of %0.1f life per turn. As your hate fades and grows the damage you sustain is adjusted by %d%% to %d%%.]]):format(healPerKill, regenRate, resist, resist + 18)
 	end,
 }
 
@@ -113,11 +116,34 @@ newTalent{
 --}
 
 newTalent{
-	name = "Relentless",
+	name = "Seethe",
 	type = {"cursed/cursed-form", 2},
-	mode = "passive",
+	random_ego = "utility",
 	require = cursed_str_req2,
 	points = 5,
+	cooldown = 400,
+	action = function(self, t)
+		self:incHate(2 + self:getTalentLevel(t) * 0.9)
+
+		local damage = self.max_life * 0.25
+		self:takeHit(damage, self)
+		game.level.map:particleEmitter(self.x, self.y, 5, "fireflash", {radius=2, tx=self.x, ty=self.y})
+		game:playSoundNear(self, "talents/fireflash")
+		return true
+	end,
+	info = function(self, t)
+		local increase = 2 + self:getTalentLevel(t) * 0.9
+		local damage = self.max_life * 0.25
+		return ([[Focus your rage gaining %0.1f hate at the cost of %d life.]]):format(increase, damage)
+	end,
+}
+
+newTalent{
+	name = "Relentless",
+	type = {"cursed/cursed-form", 3},
+	mode = "passive",
+	require = cursed_str_req3,
+	points = 5,
 	on_learn = function(self, t)
 		self:attr("fear_immune", 0.15)
 		self:attr("confusion_immune", 0.15)
@@ -137,29 +163,6 @@ newTalent{
 	end,
 }
 
-newTalent{
-	name = "Seethe",
-	type = {"cursed/cursed-form", 3},
-	random_ego = "utility",
-	require = cursed_str_req3,
-	points = 5,
-	cooldown = 400,
-	action = function(self, t)
-		self:incHate(2 + self:getTalentLevel(t) * 0.9)
-
-		local damage = self.max_life * 0.25
-		self:takeHit(damage, self)
-		game.level.map:particleEmitter(self.x, self.y, 5, "fireflash", {radius=2, tx=self.x, ty=self.y})
-		game:playSoundNear(self, "talents/fireflash")
-		return true
-	end,
-	info = function(self, t)
-		local increase = 2 + self:getTalentLevel(t) * 0.9
-		local damage = self.max_life * 0.25
-		return ([[Focus your rage gaining %0.1f hate at the cost of %d life.]]):format(increase, damage)
-	end,
-}
-
 newTalent{
 	name = "Enrage",
 	type = {"cursed/cursed-form", 4},
diff --git a/game/modules/tome/data/talents/cursed/endless-hunt.lua b/game/modules/tome/data/talents/cursed/endless-hunt.lua
index 612b21505dbebffbd3e563f82ef1da231990b607..2b709d1299c56d8c4e63fe95128fee28f5fd986a 100644
--- a/game/modules/tome/data/talents/cursed/endless-hunt.lua
+++ b/game/modules/tome/data/talents/cursed/endless-hunt.lua
@@ -95,7 +95,7 @@ newTalent{
 	points = 5,
 	random_ego = "attack",
 	cooldown = 10,
-	hate = 0.1,
+	hate = 0.3,
 	range = 10,
 	requires_target = true,
 	action = function(self, t)
@@ -113,7 +113,7 @@ newTalent{
 					and not game.level.map.attrs(x, y, "no_teleport") then
 				self:move(x, y, true)
 				game:playSoundNear(self, "talents/teleport")
-				local multiplier = self:combatTalentWeaponDamage(t, 0.9, 1.9) * getHateMultiplier(self, 0.3, 1.0)
+				local multiplier = self:combatTalentWeaponDamage(t, 0.7, 1.9) * getHateMultiplier(self, 0.3, 1.0)
 				self:attackTarget(target, nil, multiplier, true)
 				return true
 			end
@@ -122,8 +122,8 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		local multiplier = self:combatTalentWeaponDamage(t, 1.1, 1.9)
-		return ([[With blinding speed you suddenly appear next to a target up to %d spaces away and attack for %d%% to %d%% rage-based damage.]]):format(self:getTalentRange(t), multiplier * 30, multiplier * 100)
+		local multiplier = self:combatTalentWeaponDamage(t, 0.7, 1.9)
+		return ([[With blinding speed you suddenly appear next to a target up to %d spaces away and attack for %d%% to %d%% hate-based damage.]]):format(self:getTalentRange(t), multiplier * 30, multiplier * 100)
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/cursed/rampage.lua b/game/modules/tome/data/talents/cursed/rampage.lua
index ec33f144759abb7439867efd19856f5b052aef2a..b826cca8ed6e4223d06d92d546a53aa98fa6c798 100644
--- a/game/modules/tome/data/talents/cursed/rampage.lua
+++ b/game/modules/tome/data/talents/cursed/rampage.lua
@@ -27,7 +27,7 @@ newTalent{
 	require = cursed_str_req1,
 	points = 5,
 	cooldown = 150,
-	hate = 0.1,
+	hate = 0.5,
 	action = function(self, t, hateLoss)
 		local hateLoss = 0
 		local critical = 0
@@ -65,7 +65,7 @@ newTalent{
 
 		return true
 	end,
-	getHateLoss = function(self, t) return 0.25 - 0.05 * self:getTalentLevelRaw(t) end,
+	getHateLoss = function(self, t) return 0.5 - 0.05 * self:getTalentLevelRaw(t) end,
 	getCritical = function(self, t) return 10 + 8 * self:getTalentLevel(t) end,
 	onTakeHit = function(t, self, percentDamage)
 		if percentDamage < 10 then return false end
@@ -84,7 +84,7 @@ newTalent{
 		local hateLoss = t.getHateLoss(self, t)
 		local critical = t.getCritical(self, t)
 		return ([[You enter into a terrible rampage for %d turns, destroying everything in your path. There is a small chance you will rampage when you take significant damage.
-		(%0.1f hate loss per turn, +%d%% to %d%% hate-based critical chance)]]):format(duration, hateLoss, critical * 0.3, critical * 1.0)
+		(%0.2f hate loss per turn, +%d%% to %d%% hate-based critical chance)]]):format(duration, hateLoss, critical * 0.3, critical * 1.0)
 	end,
 }
 
@@ -99,7 +99,7 @@ newTalent{
 	on_unlearn = function(self, t)
 	end,
 	getDuration = function(self, t) return 5 + math.floor(2 * self:getTalentLevel(t)) end,
-	getDamage = function(self, t) return 20 + 10 * self:getTalentLevel(t) end,
+	getDamage = function(self, t) return 10 * self:getTalentLevel(t) end,
 	info = function(self, t)
 		local duration = t.getDuration(self, t)
 		local damage = t.getDamage(self, t)
@@ -116,14 +116,14 @@ newTalent{
 	mode = "passive",
 	on_learn = function(self, t)
 		local tRampage = self:getTalentFromId(self.T_RAMPAGE)
-		tRampage.cooldown = tRampage.cooldown - 25
+		tRampage.cooldown = tRampage.cooldown - 10
 	end,
 	on_unlearn = function(self, t)
 		local tRampage = self:getTalentFromId(self.T_RAMPAGE)
-		tRampage.cooldown = tRampage.cooldown + 25
+		tRampage.cooldown = tRampage.cooldown + 10
 	end,
 	getCooldown = function(self, t) return 150 - math.floor(10 * self:getTalentLevelRaw(t)) end,
-	getSpeed = function(self, t) return 15 * self:getTalentLevel(t) end,
+	getSpeed = function(self, t) return 10 * self:getTalentLevel(t) end,
 	info = function(self, t)
 		local cooldown = t.getCooldown(self, t)
 		local speed = t.getSpeed(self, t)
diff --git a/game/modules/tome/data/talents/cursed/slaughter.lua b/game/modules/tome/data/talents/cursed/slaughter.lua
index bb52f8febe21da325e78f224d70d38f77d53335b..dfb11de52b7991bf8efa4125a6c0c28fd0093a48 100644
--- a/game/modules/tome/data/talents/cursed/slaughter.lua
+++ b/game/modules/tome/data/talents/cursed/slaughter.lua
@@ -60,7 +60,7 @@ newTalent{
 	points = 5,
 	random_ego = "attack",
 	cooldown = 15,
-	hate = 0.1,
+	hate = 0.2,
 	action = function(self, t)
 		local weapon = self:hasAxeWeapon()
 		if not weapon then
@@ -94,7 +94,7 @@ newTalent{
 	end,
 	info = function(self, t)
 		local multiplier = self:combatTalentWeaponDamage(t, 0.2, 0.7)
-		return ([[Assault nearby foes with 4 fast attacks for %d%% to %d%% rage-based damage each.]]):format(multiplier * 50, multiplier * 100)
+		return ([[Assault nearby foes with 4 fast attacks for %d%% to %d%% hate-based damage each.]]):format(multiplier * 50, multiplier * 100)
 	end,
 }
 
@@ -105,7 +105,7 @@ newTalent{
 	points = 5,
 	random_ego = "attack",
 	cooldown = 20,
-	hate = 0.1,
+	hate = 0.5,
 	range = 4,
 	requires_target = true,
 	action = function(self, t)
@@ -198,7 +198,7 @@ newTalent{
 		else
 			size = "Small"
 		end
-		return ([[Charge through your opponents, attacking anyone near your path for %d%% to %d%% rage-based damage. %s opponents may be knocked from your path.]]):format(multiplier * 30, multiplier * 100, size)
+		return ([[Charge through your opponents, attacking anyone near your path for %d%% to %d%% hate-based damage. %s opponents may be knocked from your path.]]):format(multiplier * 30, multiplier * 100, size)
 	end,
 }
 
diff --git a/game/modules/tome/data/timed_effects.lua b/game/modules/tome/data/timed_effects.lua
index 5628b79216fcb9e224af66ceaf6330989d3688f3..65886844043bc0b6959a36a0fea1c29d0c955e49 100644
--- a/game/modules/tome/data/timed_effects.lua
+++ b/game/modules/tome/data/timed_effects.lua
@@ -1546,7 +1546,7 @@ newEffect{
 	on_timeout = function(self, eff)
 		self:project({type="ball", radius=eff.radius, friendlyfire=false}, self.x, self.y, function(xx, yy)
 			local target = game.level.map(xx, yy, game.level.map.ACTOR)
-			if target and target ~= self and target ~= eff.source and target:canBe("knockback") then
+			if target and target ~= self and target ~= eff.source and target:canBe("knockback") and (target.never_move or 0) ~= 1 then
 				-- attempt to move target away from self
 				local currentDistance = core.fov.distance(self.x, self.y, xx, yy)
 				local bestDistance, bestX, bestY