From 5839a25cf7a2b25c65aeb38986cb76afc54fbb5e Mon Sep 17 00:00:00 2001
From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54>
Date: Wed, 29 Sep 2010 12:18:34 +0000
Subject: [PATCH] Multiple fixes to the Cursed class

git-svn-id: http://svn.net-core.org/repos/t-engine4@1328 51575b47-30f0-44d4-a5cc-537603b46e54
---
 .../tome/data/talents/cursed/cursed-form.lua  | 123 ++++++------------
 .../tome/data/talents/cursed/dark-figure.lua  |  10 +-
 .../tome/data/talents/cursed/endless-hunt.lua |   4 +-
 .../tome/data/talents/cursed/gloom.lua        |  23 ++--
 .../tome/data/talents/cursed/rampage.lua      |  18 ++-
 .../tome/data/talents/cursed/slaughter.lua    |   4 +-
 6 files changed, 69 insertions(+), 113 deletions(-)

diff --git a/game/modules/tome/data/talents/cursed/cursed-form.lua b/game/modules/tome/data/talents/cursed/cursed-form.lua
index acb8c38c18..c079d2514e 100644
--- a/game/modules/tome/data/talents/cursed/cursed-form.lua
+++ b/game/modules/tome/data/talents/cursed/cursed-form.lua
@@ -28,86 +28,47 @@ newTalent{
 	require = cursed_str_req1,
 	points = 5,
 	on_learn = function(self, t)
-		-- assume on only learning one point at a time (true when this was written)
-		local level = self:getTalentLevelRaw(t)
-		if level == 1 then
-			-- baseline
-			self.resists[DamageType.FIRE] = (self.resists[DamageType.FIRE] or 0) - 25
-			self.combat_spellresist = self.combat_spellresist - 10
-			self.max_life = self.max_life + 15
-		elseif level == 2 then
-			self.resists[DamageType.FIRE] = (self.resists[DamageType.FIRE] or 0) + 5
-			self.combat_spellresist = self.combat_spellresist + 2
-			self.max_life = self.max_life + 15
-		elseif level == 3 then
-			self.resists[DamageType.FIRE] = (self.resists[DamageType.FIRE] or 0) + 5
-			self.combat_spellresist = self.combat_spellresist + 2
-			self.max_life = self.max_life + 15
-		elseif level == 4 then
-			self.resists[DamageType.FIRE] = (self.resists[DamageType.FIRE] or 0) + 5
-			self.combat_spellresist = self.combat_spellresist + 2
-			self.max_life = self.max_life + 15
-		elseif level == 5 then
-			self.resists[DamageType.FIRE] = (self.resists[DamageType.FIRE] or 0) + 5
-			self.combat_spellresist = self.combat_spellresist + 2
-			self.max_life = self.max_life + 15
-		end
 		return true
 	end,
 	on_unlearn = function(self, t)
-		-- assume on only learning one point at a time (true when this was written)
-		local level = self:getTalentLevelRaw(t)
-		if not level or level == 0 then
-			-- baseline
-			self.resists[DamageType.FIRE] = (self.resists[DamageType.FIRE] or 0) + 25
-			self.combat_spellresist = self.combat_spellresist + 10
-			self.max_life = self.max_life - 15
-		elseif level == 1 then
-			self.resists[DamageType.FIRE] = (self.resists[DamageType.FIRE] or 0) - 5
-			self.combat_spellresist = self.combat_spellresist - 2
-			self.max_life = self.max_life - 15
-		elseif level == 2 then
-			self.resists[DamageType.FIRE] = (self.resists[DamageType.FIRE] or 0) - 5
-			self.combat_spellresist = self.combat_spellresist - 2
-			self.max_life = self.max_life - 15
-		elseif level == 3 then
-			self.resists[DamageType.FIRE] = (self.resists[DamageType.FIRE] or 0) - 5
-			self.combat_spellresist = self.combat_spellresist - 2
-			self.max_life = self.max_life - 15
-		elseif level == 4 then
-			self.resists[DamageType.FIRE] = (self.resists[DamageType.FIRE] or 0) - 5
-			self.combat_spellresist = self.combat_spellresist - 2
-			self.max_life = self.max_life - 15
-		end
-
 		return true
 	end,
+	getHealPerKill = function(self, t)
+		return math.sqrt(self:getTalentLevel(t)) * 10
+	end,
+	getRegenRate = function(self, t)
+		return math.sqrt(self:getTalentLevel(t) * 2) * self.max_life * 0.004
+	end,
 	do_regenLife  = function(self, t)
-		heal = math.sqrt(self:getTalentLevel(t) * 2) * self.max_life * 0.0027
-		if heal > 0 then
+		-- heal
+		local maxHeal = self.unnatural_body_heal or 0
+		if maxHeal > 0 then
+			local heal = math.min(t.getRegenRate(self, t), maxHeal)
 			self:heal(heal)
+		
+			self.unnatural_body_heal = math.max(0, (self.unnatural_body_heal or 0) - heal)
 		end
+		
+		-- update resists as well
+		local oldResist = self.unnatural_body_resist or 0
+		local newResist = -15 + (15 * getHateMultiplier(self, 0, 1))
+		self.resists.all = (self.resists.all or 0) - oldResist + newResist
+		self.unnatural_body_resist = newResist
 	end,
-	info = function(self, t)
-		heal = math.sqrt(self:getTalentLevel(t) * 2) * self.max_life * 0.0027
-		local level = self:getTalentLevelRaw(t)
-		if level == 1 then
-			return ([[The curse has twisted your body into an unnatural form.
-			(-25%% fire resistance, -10 spell save, +15 maximum life, +%0.1f life per turn).]]):format(heal)
-		elseif level == 2 then
-			return ([[The curse has twisted your body into an unnatural form.
-			(-20%% fire resistance, -8 spell save, +15 maximum life, +%0.1f life per turn).]]):format(heal)
-		elseif level == 3 then
-			return ([[The curse has twisted your body into an unnatural form.
-			(-15%% fire resistance, -6 spell save, +15 maximum life, +%0.1f life per turn).]]):format(heal)
-		elseif level == 4 then
-			return ([[The curse has twisted your body into an unnatural form.
-			(-10%% fire resistance, -4 spell save, +15 maximum life, +%0.1f life per turn).]]):format(heal)
-		else
-			return ([[The curse has twisted your body into an unnatural form.
-			(-5%% fire resistance, -2 spell save, +15 maximum life, +%0.1f life per turn).]]):format(heal)
+	on_kill = function(self, t, target)
+		if target and target.max_life then
+			heal = t.getHealPerKill(self, t) * 0.01 * target.max_life
+			if heal > 0 then
+				self.unnatural_body_heal = math.min(self.life, (self.unnatural_body_heal or 0) + heal)
+			end
 		end
 	end,
+	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)
+	end,
 }
 
 --newTalent{
@@ -158,17 +119,17 @@ newTalent{
 	require = cursed_str_req2,
 	points = 5,
 	on_learn = function(self, t)
-		self.fear_immune = self.stun_immune or 0 + 0.15
-		self.confusion_immune = self.stun_immune or 0 + 0.15
-		self.knockback_immune = self.knockback_immune or 0 + 0.15
-		self.stun_immune = self.stun_immune or 0 + 0.15
+		self:attr("fear_immune", 0.15)
+		self:attr("confusion_immune", 0.15)
+		self:attr("knockback_immune", 0.15)
+		self:attr("stun_immune", 0.15)
 		return true
 	end,
 	on_unlearn = function(self, t)
-		self.fear_immune = self.stun_immune or 0 + 0.15
-		self.confusion_immune = self.stun_immune or 0 + 0.15
-		self.knockback_immune = self.knockback_immune or 0 + 0.15
-		self.stun_immune = self.stun_immune or 0 + 0.15
+		self:attr("fear_immune", -0.15)
+		self:attr("confusion_immune", -0.15)
+		self:attr("knockback_immune", -0.15)
+		self:attr("stun_immune", -0.15)
 		return true
 	end,
 	info = function(self, t)
@@ -184,13 +145,11 @@ newTalent{
 	points = 5,
 	cooldown = 400,
 	action = function(self, t)
-		local increase = 2 + self:getTalentLevel(t) * 0.9
-		self.hate = math.min(self.max_hate, self.hate + increase)
-		self:incHate(hate)
+		self:incHate(2 + self:getTalentLevel(t) * 0.9)
 
 		local damage = self.max_life * 0.25
-		self:project({type="hit"}, self.x, self.y, DamageType.BLIGHT, damage)
-		game.level.map:particleEmitter(self.x, self.y, 5, "fireflash", {radius=5, tx=self.x, ty=self.y})
+		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,
diff --git a/game/modules/tome/data/talents/cursed/dark-figure.lua b/game/modules/tome/data/talents/cursed/dark-figure.lua
index 0f9fe85e6e..22beadcbf2 100644
--- a/game/modules/tome/data/talents/cursed/dark-figure.lua
+++ b/game/modules/tome/data/talents/cursed/dark-figure.lua
@@ -35,7 +35,7 @@ newTalent{
 		local tg = {type="hit", range=self:getTalentRange(t), talent=t}
 		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)) > self:getTalentRange(t) then
 			game.logPlayer(self, "You are too far to from the target!")
 			return nil
@@ -43,9 +43,9 @@ newTalent{
 
 		local radius = t.getRadius(self, t)
 		local duration = t.getDuration(self, t)
-		
+
 		target:setEffect(target.EFF_RADIANT_FEAR, duration, { radius = radius, knockback = 1, source = self })
-		
+
 		return true
 	end,
 	info = function(self, t)
@@ -68,7 +68,7 @@ newTalent{
 	getPercent = function(self, t) return 15 + math.floor(self:getTalentLevel(t) * 10) end,
 	info = function(self, t)
 		local percent = t.getPercent(self, t)
-		return ([[The time you have spent suppressing the curse has taught you self control. The duration of most non-magical effects (physical, mental, poisons, diseases, hexes and curses) are reduced by %d%%.]]):format(percent)
+		return ([[The time you have spent supressing the curse has taught you self control. The duration of most non-magical effects are reduced by %d%%.]]):format(percent)
 	end,
 }
 
@@ -127,7 +127,7 @@ newTalent{
 	end,
 	on_unlearn = function(self, t)
 	end,
-	range = function(self, t) return 16 - math.floor(self:getTalentLevel(t) * 2) end,
+	range = function(self, t) return 18 - math.floor(self:getTalentLevel(t) * 2) end,
 	info = function(self, t)
 		local range = t.range(self, t)
 		return ([[You hide your terrible nature behind a pitiful figure. Those that see you from a distance of %d will ignore you.]]):format(range)
diff --git a/game/modules/tome/data/talents/cursed/endless-hunt.lua b/game/modules/tome/data/talents/cursed/endless-hunt.lua
index f75cb80c81..2ae88b2123 100644
--- a/game/modules/tome/data/talents/cursed/endless-hunt.lua
+++ b/game/modules/tome/data/talents/cursed/endless-hunt.lua
@@ -56,7 +56,7 @@ newTalent{
 
 		-- attempt domination
 		if checkWillFailure(self, target, 15, 85, 1) then
-			local damMult = 1 + self:combatTalentWeaponDamage(t, 0.1, 0.4)
+			local damMult = 1 + self:combatTalentWeaponDamage(t, 0.1, 0.5)
 			target:setEffect(target.EFF_DOMINATED, 4, { dominatedSource = self, dominatedDamMult = damMult })
 		else
 			game.logSeen(target, "%s resists the domination!", target.name:capitalize())
@@ -68,7 +68,7 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		local damMult = self:combatTalentWeaponDamage(t, 0.1, 0.4)
+		local damMult = self:combatTalentWeaponDamage(t, 0.1, 0.5)
 		return ([[Combine strength and will to overpower your opponent. A failed save versus will will add %d%% melee damage to your attacks for 4 turns.]]):format(damMult * 100)
 	end,
 }
diff --git a/game/modules/tome/data/talents/cursed/gloom.lua b/game/modules/tome/data/talents/cursed/gloom.lua
index 9b82a0ef87..2a71403717 100644
--- a/game/modules/tome/data/talents/cursed/gloom.lua
+++ b/game/modules/tome/data/talents/cursed/gloom.lua
@@ -73,8 +73,8 @@ newTalent{
 		-- all gloom effects are handled here
 		local tWeakness = self:getTalentFromId(self.T_WEAKNESS)
 		local tTorment = self:getTalentFromId(self.T_TORMENT)
-		local tAbsorbLife = self:getTalentFromId(self.T_ABSORB_LIFE)
-		local lifeAbsorbed = 0
+		local tLifeLeech = self:getTalentFromId(self.T_LIFE_LEECH)
+		local lifeLeeched = 0
 		local attackStrength = 0.3 + self:getTalentLevel(tGloom) * 0.12
 		local tormentHit = false
 
@@ -162,13 +162,12 @@ newTalent{
 						end
 					end
 
-					-- Absorb Life
-					if tAbsorbLife and self:getTalentLevelRaw(tAbsorbLife) > 0 then
-						local fraction = self:getTalentLevel(tAbsorbLife) * 0.002
+					-- Life Leech
+					if tLifeLeech and self:getTalentLevelRaw(tLifeLeech) > 0 then
+						local fraction = self:getTalentLevel(tLifeLeech) * 0.002
 						local damage = math.min(target.max_life * fraction, self.max_life * fraction * 2)
-						local actualDamage = DamageType:get(DamageType.ABSORB_LIFE).projector(self, target.x, target.y, DamageType.ABSORB_LIFE, damage)
-						lifeAbsorbed = lifeAbsorbed + actualDamage
-						--game.logSeen(target, "#F53CBE#You absorb %.2f life from %s!", actualDamage, target.name:capitalize())
+						local actualDamage = DamageType:get(DamageType.LIFE_LEECH).projector(self, target.x, target.y, DamageType.LIFE_LEECH, damage)
+						lifeLeeched = lifeLeeched + actualDamage
 					end
 				end
 			end
@@ -178,10 +177,10 @@ newTalent{
 			self.torment_turns = 20
 		end
 
-		-- absorb life
-		if lifeAbsorbed > 0 then
-			self:heal(lifeAbsorbed)
-			game.logPlayer(self, "#F53CBE#You absorb %0.1f life from your foes.", lifeAbsorbed)
+		-- life leech
+		if lifeLeeched > 0 then
+			self:heal(lifeLeeched)
+			game.logPlayer(self, "#F53CBE#You leech %0.1f life from your foes.", lifeLeeched)
 		end
 	end,
 	info = function(self, t)
diff --git a/game/modules/tome/data/talents/cursed/rampage.lua b/game/modules/tome/data/talents/cursed/rampage.lua
index 484876fb36..e0c5a1c1ad 100644
--- a/game/modules/tome/data/talents/cursed/rampage.lua
+++ b/game/modules/tome/data/talents/cursed/rampage.lua
@@ -26,7 +26,7 @@ newTalent{
 	type = {"cursed/rampage", 1},
 	require = cursed_str_req1,
 	points = 5,
-	cooldown = 475,
+	cooldown = 150,
 	hate = 0.1,
 	action = function(self, t, hateLoss)
 		local hateLoss = 0
@@ -65,8 +65,8 @@ newTalent{
 
 		return true
 	end,
-	getHateLoss = function(self, t) return 0.5 - 0.1 * self:getTalentLevelRaw(t) end,
-	getCritical = function(self, t) return 8 * self:getTalentLevel(t) end,
+	getHateLoss = function(self, t) return 0.25 - 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
 		if self:hasEffect(self.EFF_RAMPAGE) 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, +%d%% to %d%% hate-based critical chance)]]):format(duration, hateLoss, critical * 0.3, critical * 1.0)
+		(%0.1f 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 10 + 10 * self:getTalentLevel(t) end,
+	getDamage = function(self, t) return 20 + 10 * self:getTalentLevel(t) end,
 	info = function(self, t)
 		local duration = t.getDuration(self, t)
 		local damage = t.getDamage(self, t)
@@ -117,15 +117,13 @@ newTalent{
 	on_learn = function(self, t)
 		local tRampage = self:getTalentFromId(self.T_RAMPAGE)
 		tRampage.cooldown = tRampage.cooldown - 25
-		print("* cooldown:", tRampage.cooldown)
 	end,
 	on_unlearn = function(self, t)
 		local tRampage = self:getTalentFromId(self.T_RAMPAGE)
 		tRampage.cooldown = tRampage.cooldown + 25
-		print("* cooldown:", tRampage.cooldown)
 	end,
-	getCooldown = function(self, t) return 475 - math.floor(25 * self:getTalentLevelRaw(t)) end,
-	getSpeed = function(self, t) return 15 + 15 * self:getTalentLevel(t) end,
+	getCooldown = function(self, t) return 150 - math.floor(10 * self:getTalentLevelRaw(t)) end,
+	getSpeed = function(self, t) return 15 * self:getTalentLevel(t) end,
 	info = function(self, t)
 		local cooldown = t.getCooldown(self, t)
 		local speed = t.getSpeed(self, t)
@@ -144,7 +142,7 @@ newTalent{
 	end,
 	on_unlearn = function(self, t)
 	end,
-	getAttack = function(self, t) return 10 + 10 * self:getTalentLevel(t) end,
+	getAttack = function(self, t) return 20 + 10 * self:getTalentLevel(t) end,
 	getEvasion = function(self, t) return 6 * self:getTalentLevel(t) end,
 	info = function(self, t)
 		local attack = t.getAttack(self, t)
diff --git a/game/modules/tome/data/talents/cursed/slaughter.lua b/game/modules/tome/data/talents/cursed/slaughter.lua
index 757ea02a06..9cc06402c2 100644
--- a/game/modules/tome/data/talents/cursed/slaughter.lua
+++ b/game/modules/tome/data/talents/cursed/slaughter.lua
@@ -42,13 +42,13 @@ newTalent{
 		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 multiplier = 1 + (0.15 + .2 * self:getTalentLevel(t)) * getHateMultiplier(self, 0, 1)
+		local multiplier = 1 + (0.17 + .23 * self:getTalentLevel(t)) * getHateMultiplier(self, 0, 1)
 		local hit = self:attackTarget(target, nil, multiplier, true)
 
 		return true
 	end,
 	info = function(self, t)
-		local multiplier = (0.15 + .2 * self:getTalentLevel(t))
+		local multiplier = (0.17 + .23 * self:getTalentLevel(t))
 		return ([[Slashes wildly at your target adding up to %d%% hate-based damage.]]):format(multiplier * 100)
 	end,
 }
-- 
GitLab