From 6198dc2cb1eb0bb6426e1880eb1a19c609c222d8 Mon Sep 17 00:00:00 2001
From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54>
Date: Fri, 28 May 2010 23:50:59 +0000
Subject: [PATCH] all sustained talents deactivate if the ressoruce they depend
 on reaches 0 changed all speed mods to be a percent and compute them right
 (+100% means twice as fast not infinitely faster)

git-svn-id: http://svn.net-core.org/repos/t-engine4@711 51575b47-30f0-44d4-a5cc-537603b46e54
---
 game/modules/tome/class/Actor.lua                   | 13 +++++++++++++
 game/modules/tome/class/Game.lua                    |  6 +++---
 game/modules/tome/class/Store.lua                   |  2 ++
 game/modules/tome/data/talents/spells/temporal.lua  | 12 ++++++------
 .../tome/data/talents/techniques/archery.lua        |  8 ++++----
 .../data/talents/techniques/combat-techniques.lua   |  8 ++++----
 .../tome/data/talents/techniques/dualweapon.lua     |  4 ++--
 7 files changed, 34 insertions(+), 19 deletions(-)

diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua
index 8bf01481a5..1daa10e984 100644
--- a/game/modules/tome/class/Actor.lua
+++ b/game/modules/tome/class/Actor.lua
@@ -131,6 +131,19 @@ function _M:act()
 
 	self.changed = true
 
+	-- If ressources are too low, disable sustains
+	if self.mana < 1 or self.stamina < 1 then
+		for tid, _ in pairs(self.sustain_talents) do
+			local t = self:getTalentFromId(tid)
+			if (t.sustain_mana and self.mana < 1) or (t.sustain_stamina and self.stamina < 1) then
+				local old = self.energy.value
+				self.energy.value = 100000
+				self:useTalent(tid)
+				self.energy.value = old
+			end
+		end
+	end
+
 	-- Cooldown talents
 	self:cooldownTalents()
 	-- Regen resources
diff --git a/game/modules/tome/class/Game.lua b/game/modules/tome/class/Game.lua
index 3d2e21b4f0..6419623c6d 100644
--- a/game/modules/tome/class/Game.lua
+++ b/game/modules/tome/class/Game.lua
@@ -280,9 +280,9 @@ function _M:changeLevel(lev, zone)
 	self.zone:getLevel(self, lev, old_lev)
 
 	-- Decay level ?
-	if self.level.last_turn and self.level.data.decay and self.level.last_turn + self.level.data.decay[1] < game.turn then
-		local nb_actor, remain_actor = self.level:decay(Map.ACTOR, function(e) return not e.unique and self.level.last_turn + rng.range(self.level.data.decay[1], self.level.data.decay[2]) < game.turn end)
-		local nb_object, remain_object = self.level:decay(Map.OBJECT, function(e) return not e.unique and self.level.last_turn + rng.range(self.level.data.decay[1], self.level.data.decay[2]) < game.turn end)
+	if self.level.last_turn and self.level.data.decay and self.level.last_turn + self.level.data.decay[1] < game.turn * 10 then
+		local nb_actor, remain_actor = self.level:decay(Map.ACTOR, function(e) return not e.unique and self.level.last_turn + rng.range(self.level.data.decay[1], self.level.data.decay[2]) < game.turn * 10 end)
+		local nb_object, remain_object = self.level:decay(Map.OBJECT, function(e) return not e.unique and self.level.last_turn + rng.range(self.level.data.decay[1], self.level.data.decay[2]) < game.turn * 10 end)
 
 		local gen = self.zone:getGenerator("actor", self.level)
 		if gen.regenFrom then gen:regenFrom(remain_actor) end
diff --git a/game/modules/tome/class/Store.lua b/game/modules/tome/class/Store.lua
index 221eff0706..14050d1423 100644
--- a/game/modules/tome/class/Store.lua
+++ b/game/modules/tome/class/Store.lua
@@ -33,6 +33,8 @@ function _M:init(t, no_default)
 	t.buy_percent = t.buy_percent or 10
 	t.sell_percent = t.sell_percent or 100
 	Store.init(self, t, no_default)
+
+	if self.store and self.store.restock_after then self.store.restock_after = self.store.restock_after * 10 end
 end
 
 --- Called on object purchase
diff --git a/game/modules/tome/data/talents/spells/temporal.lua b/game/modules/tome/data/talents/spells/temporal.lua
index ab2c408bb0..f282343d6b 100644
--- a/game/modules/tome/data/talents/spells/temporal.lua
+++ b/game/modules/tome/data/talents/spells/temporal.lua
@@ -58,13 +58,13 @@ newTalent{
 		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.SLOW, util.bound((self:combatSpellpower(0.15) * self:getTalentLevel(t)) / 100, 0.1, 0.4), {type="manathrust"})
+		self:project(tg, x, y, DamageType.SLOW, -1 + 1 / (1 + self:getTalentLevel(t) * 0.07), {type="manathrust"})
 		game:playSoundNear(self, "talents/spell_generic")
 		return true
 	end,
 	info = function(self, t)
-		return ([[Decreases the target's global speed by %.2f for 7 turns.
-		The speed decrease improves with the Magic stat]]):format(util.bound((self:combatSpellpower(0.15) * self:getTalentLevel(t)) / 100, 0.1, 0.4))
+		return ([[Decreases the target's global speed by %d%% for 7 turns.
+		The speed decrease improves with the Magic stat]]):format(self:getTalentLevel(t) * 7)
 	end,
 }
 
@@ -81,7 +81,7 @@ newTalent{
 	},
 	activate = function(self, t)
 		game:playSoundNear(self, "talents/spell_generic")
-		local power = util.bound((self:combatSpellpower(0.5) * self:getTalentLevel(t)) / 100, 0.1, 2)
+		local power = 1 - 1 / (1 + self:getTalentLevel(t) * 0.07)
 		return {
 			speed = self:addTemporaryValue("energy", {mod=power}),
 		}
@@ -91,8 +91,8 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Increases the caster's global speed by %.2f.
-		The speed increase improves with the Magic stat]]):format(util.bound((self:combatSpellpower(0.5) * self:getTalentLevel(t)) / 100, 0.1, 2))
+		return ([[Increases the caster's global speed by %d%%.
+		The speed increase improves with the Magic stat]]):format(self:getTalentLevel(t) * 7)
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/techniques/archery.lua b/game/modules/tome/data/talents/techniques/archery.lua
index 2068d1c817..a5e0b8941f 100644
--- a/game/modules/tome/data/talents/techniques/archery.lua
+++ b/game/modules/tome/data/talents/techniques/archery.lua
@@ -73,7 +73,7 @@ newTalent{
 
 		return {
 			move = self:addTemporaryValue("never_move", 1),
-			speed = self:addTemporaryValue("combat_physspeed", self:combatSpeed(weapon.combat) * (self:getTalentLevelRaw(t) * 0.1)),
+			speed = self:addTemporaryValue("combat_physspeed", self:combatSpeed(weapon.combat) - 1 / (1 + self:getTalentLevel(t) * 0.1)),
 			crit = self:addTemporaryValue("combat_physcrit", 7 + self:getTalentLevel(t) * self:getDex(10)),
 			atk = self:addTemporaryValue("combat_dam", 4 + self:getTalentLevel(t) * self:getDex(10)),
 			dam = self:addTemporaryValue("combat_atk", 4 + self:getTalentLevel(t) * self:getDex(10)),
@@ -90,7 +90,7 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[You enter a calm, focused stance, increasing your damage(+%d), attack(+%d), armor peneration(+%d), and critical chance(+%d%%)---but reducing your firing speed by %d%% and making you unable to move.]]):
+		return ([[You enter a calm, focused stance, increasing your damage(+%d), attack(+%d), armor peneration(+%d), and critical chance(+%d%%) but reducing your firing speed by %d%% and making you unable to move.]]):
 		format(4 + self:getTalentLevel(t) * self:getDex(10), 4 + self:getTalentLevel(t) * self:getDex(10),
 		3 + self:getTalentLevel(t) * self:getDex(10), 7 + self:getTalentLevel(t) * self:getDex(10),
 		self:getTalentLevelRaw(t) * 10)
@@ -113,7 +113,7 @@ newTalent{
 		end
 
 		return {
-			speed = self:addTemporaryValue("combat_physspeed", -self:combatSpeed(weapon.combat) * (self:getTalentLevelRaw(t) * 0.14)),
+			speed = self:addTemporaryValue("combat_physspeed", -self:combatSpeed(weapon.combat) + 1 / (1 + self:getTalentLevel(t) * 0.09)),
 			atk = self:addTemporaryValue("combat_dam", -8 - self:getTalentLevelRaw(t) * 2.4),
 			dam = self:addTemporaryValue("combat_atk", -8 - self:getTalentLevelRaw(t) * 2.4),
 			crit = self:addTemporaryValue("combat_physcrit", -8 - self:getTalentLevelRaw(t) * 2.4),
@@ -128,7 +128,7 @@ newTalent{
 	end,
 	info = function(self, t)
 		return ([[You switch to a fluid and fast battle stance, increasing your firing speed by %d%% at the cost of your accuracy(%d), damage(%d), and critical chance(%d).]]):
-		format(self:getTalentLevelRaw(t) * 14, -8 - self:getTalentLevelRaw(t) * 2.4, -8 - self:getTalentLevelRaw(t) * 2.4, -8 - self:getTalentLevelRaw(t) * 2.4)
+		format(self:getTalentLevelRaw(t) * 9, -8 - self:getTalentLevelRaw(t) * 2.4, -8 - self:getTalentLevelRaw(t) * 2.4, -8 - self:getTalentLevelRaw(t) * 2.4)
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/techniques/combat-techniques.lua b/game/modules/tome/data/talents/techniques/combat-techniques.lua
index 739e2ccdbd..759813ebb1 100644
--- a/game/modules/tome/data/talents/techniques/combat-techniques.lua
+++ b/game/modules/tome/data/talents/techniques/combat-techniques.lua
@@ -30,7 +30,7 @@ newTalent{
 	sustain_stamina = 30,
 	activate = function(self, t)
 		return {
-			speed = self:addTemporaryValue("combat_physspeed", self:combatSpeed() * (self:getTalentLevel(t) * 0.08)),
+			speed = self:addTemporaryValue("combat_physspeed", self:combatSpeed() - 1 / (1 + self:getTalentLevel(t) * 0.08)),
 			atk = self:addTemporaryValue("combat_atk", 4 + (self:getTalentLevel(t) * self:getDex()) / 15),
 			crit = self:addTemporaryValue("combat_physcrit", 4 + (self:getTalentLevel(t) * self:getDex()) / 25),
 		}
@@ -43,7 +43,7 @@ newTalent{
 	end,
 	info = function(self, t)
 		return ([[You focus your strikes, reducing your attack speed by %d%% and increasing your attack by %d and critical chance by %d%%.]]):
-		format(self:combatSpeed() * (self:getTalentLevel(t) * 8), 4 + (self:getTalentLevel(t) * self:getDex()) / 15, 4 + (self:getTalentLevel(t) * self:getDex()) / 25)
+		format((self:getTalentLevel(t) * 8), 4 + (self:getTalentLevel(t) * self:getDex()) / 15, 4 + (self:getTalentLevel(t) * self:getDex()) / 25)
 	end,
 }
 
@@ -55,11 +55,11 @@ newTalent{
 	stamina = 25,
 	require = techs_strdex_req2,
 	action = function(self, t)
-		self:setEffect(self.EFF_SPEED, 5, {power=1 + self:getTalentLevel(t) / 7})
+		self:setEffect(self.EFF_SPEED, 5, {power=1 - (1 / (1 + self:getTalentLevel(t) * 0.06))})
 		return true
 	end,
 	info = function(self, t)
-		return ([[Through rigorous training you have learned to focus your actions for a short while, increasing your speed by %0.2f for 5 turns.]]):format(1 + self:getTalentLevel(t) / 7)
+		return ([[Through rigorous training you have learned to focus your actions for a short while, increasing your speed by %d%% for 5 turns.]]):format(self:getTalentLevel(t) * 6)
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/techniques/dualweapon.lua b/game/modules/tome/data/talents/techniques/dualweapon.lua
index 68b9e33523..da9b4bc119 100644
--- a/game/modules/tome/data/talents/techniques/dualweapon.lua
+++ b/game/modules/tome/data/talents/techniques/dualweapon.lua
@@ -83,7 +83,7 @@ newTalent{
 		end
 
 		return {
-			combat_physspeed = self:addTemporaryValue("combat_physspeed", -self:combatSpeed(weapon.combat) * (self:getTalentLevel(t) * 0.14)),
+			combat_physspeed = self:addTemporaryValue("combat_physspeed", -self:combatSpeed(weapon.combat) + 1 / (1 + self:getTalentLevel(t) * 0.09)),
 			stamina_regen = self:addTemporaryValue("stamina_regen", -6),
 		}
 	end,
@@ -95,7 +95,7 @@ newTalent{
 	info = function(self, t)
 		local weapon, offweapon = self:hasDualWeapon()
 		weapon = weapon or {}
-		return ([[Increases attack speed by %d%%, but drains stamina quickly.]]):format(self:combatSpeed(weapon.combat) * (self:getTalentLevel(t) * 14))
+		return ([[Increases attack speed by %d%%, but drains stamina quickly.]]):format(self:combatSpeed(weapon.combat) * (self:getTalentLevel(t) * 9))
 	end,
 }
 
-- 
GitLab