From 4e7f5a114cd6bc9a09369a9cc6fce01a437f864d Mon Sep 17 00:00:00 2001
From: Alexander Sedov <alex0player@gmail.com>
Date: Fri, 30 Jan 2015 12:33:15 +0300
Subject: [PATCH] Moved some object-related stuff around.

---
 .../engine/interface/ObjectActivable.lua      | 45 +++++-----
 game/modules/tome/class/Object.lua            | 82 +++++++++++++++++++
 2 files changed, 102 insertions(+), 25 deletions(-)

diff --git a/game/engines/default/engine/interface/ObjectActivable.lua b/game/engines/default/engine/interface/ObjectActivable.lua
index accff32910..54caa3bb0c 100644
--- a/game/engines/default/engine/interface/ObjectActivable.lua
+++ b/game/engines/default/engine/interface/ObjectActivable.lua
@@ -65,26 +65,17 @@ function _M:useObject(who, ...)
 	-- Make sure the object is registered with the game, if need be
 	if not game:hasEntity(self) then game:addEntity(self) end
 
-	local reduce = 100 - util.bound(who:attr("use_object_cooldown_reduce") or 0, 0, 100)
-	local usepower = function(power) return math.ceil(power * reduce / 100) end
-
 	if self.use_power then
-		if (self.talent_cooldown and not who:isTalentCoolingDown(self.talent_cooldown)) or (not self.talent_cooldown and self.power >= usepower(self.use_power.power)) then
+		if self.power >= self.use_power.power then
 		
 			local ret = self.use_power.use(self, who, ...) or {}
 			local no_power = not ret.used or ret.no_power
 			if not no_power then 
-				if self.talent_cooldown then
-					who.talents_cd[self.talent_cooldown] = usepower(self.use_power.power)
-					local t = who:getTalentFromId(self.talent_cooldown)
-					if t.cooldownStart then t.cooldownStart(who, t, self) end
-				else
-					self.power = self.power - usepower(self.use_power.power)
-				end
+				self.power = self.power - self.use_power.power
 			end
 			return ret
 		else
-			if self.talent_cooldown or (self.power_regen and self.power_regen ~= 0) then
+			if self.power_regen and self.power_regen ~= 0 then
 				game.logPlayer(who, "%s is still recharging.", self:getName{no_count=true})
 			else
 				game.logPlayer(who, "%s can not be used anymore.", self:getName{no_count=true})
@@ -94,7 +85,7 @@ function _M:useObject(who, ...)
 	elseif self.use_simple then
 		return self.use_simple.use(self, who, ...) or {}
 	elseif self.use_talent then
-		if (self.talent_cooldown and not who:isTalentCoolingDown(self.talent_cooldown)) or (not self.talent_cooldown and (not self.use_talent.power or self.power >= usepower(self.use_talent.power))) then
+		if not self.use_talent.power or self.power >= self.use_talent.power then
 		
 			local id = self.use_talent.id
 			local ab = self:getTalentFromId(id)
@@ -103,23 +94,27 @@ function _M:useObject(who, ...)
 			who.talents[id] = old_level
 
 			if ret then 
-				if self.talent_cooldown then
-					who.talents_cd[self.talent_cooldown] = usepower(self.use_talent.power)
-					local t = who:getTalentFromId(self.talent_cooldown)
-					if t.cooldownStart then t.cooldownStart(who, t, self) end
-				else
-					self.power = self.power - usepower(self.use_talent.power)
-				end
+				self.power = self.power - self.use_talent.power
 			end
 
 			return {used=ret}
 		else
-			if self.talent_cooldown or (self.power_regen and self.power_regen ~= 0) then
-				game.logPlayer(who, "%s is still recharging.", self:getName{no_count=true})
-			else
-				game.logPlayer(who, "%s can not be used anymore.", self:getName{no_count=true})
-			end
+			game.logPlayer(who, "%s can not be used anymore.", self:getName{no_count=true})
 			return {}
 		end
 	end
 end
+
+function _M:getObjectCooldown()
+	local need = (self.use_power and self.use_power.power) or (self.use_talent and self.use_talent.power) or 0
+	if not self.power then return end
+	if self.power < need then
+		if self.power_regen and self.power_regen > 0 then
+			return math.ceil((need - self.power)/self.power_regen)
+		else
+			return nil
+		end
+	else
+		return 0
+	end
+end
diff --git a/game/modules/tome/class/Object.lua b/game/modules/tome/class/Object.lua
index 4ee91e8c69..274d6bd474 100644
--- a/game/modules/tome/class/Object.lua
+++ b/game/modules/tome/class/Object.lua
@@ -114,6 +114,88 @@ function _M:canUseObject()
 	return engine.interface.ObjectActivable.canUseObject(self)
 end
 
+function _M:useObject(who, ...)
+	-- Make sure the object is registered with the game, if need be
+	if not game:hasEntity(self) then game:addEntity(self) end
+
+	local reduce = 100 - util.bound(who:attr("use_object_cooldown_reduce") or 0, 0, 100)
+	local usepower = function(power) return math.ceil(power * reduce / 100) end
+
+	if self.use_power then
+		if (self.talent_cooldown and not who:isTalentCoolingDown(self.talent_cooldown)) or (not self.talent_cooldown and self.power >= usepower(self.use_power.power)) then
+		
+			local ret = self.use_power.use(self, who, ...) or {}
+			local no_power = not ret.used or ret.no_power
+			if not no_power then 
+				if self.talent_cooldown then
+					who.talents_cd[self.talent_cooldown] = usepower(self.use_power.power)
+					local t = who:getTalentFromId(self.talent_cooldown)
+					if t.cooldownStart then t.cooldownStart(who, t, self) end
+				else
+					self.power = self.power - usepower(self.use_power.power)
+				end
+			end
+			return ret
+		else
+			if self.talent_cooldown or (self.power_regen and self.power_regen ~= 0) then
+				game.logPlayer(who, "%s is still recharging.", self:getName{no_count=true})
+			else
+				game.logPlayer(who, "%s can not be used anymore.", self:getName{no_count=true})
+			end
+			return {}
+		end
+	elseif self.use_simple then
+		return self.use_simple.use(self, who, ...) or {}
+	elseif self.use_talent then
+		if (self.talent_cooldown and not who:isTalentCoolingDown(self.talent_cooldown)) or (not self.talent_cooldown and (not self.use_talent.power or self.power >= usepower(self.use_talent.power))) then
+		
+			local id = self.use_talent.id
+			local ab = self:getTalentFromId(id)
+			local old_level = who.talents[id]; who.talents[id] = self.use_talent.level
+			local ret = ab.action(who, ab)
+			who.talents[id] = old_level
+
+			if ret then 
+				if self.talent_cooldown then
+					who.talents_cd[self.talent_cooldown] = usepower(self.use_talent.power)
+					local t = who:getTalentFromId(self.talent_cooldown)
+					if t.cooldownStart then t.cooldownStart(who, t, self) end
+				else
+					self.power = self.power - usepower(self.use_talent.power)
+				end
+			end
+
+			return {used=ret}
+		else
+			if self.talent_cooldown or (self.power_regen and self.power_regen ~= 0) then
+				game.logPlayer(who, "%s is still recharging.", self:getName{no_count=true})
+			else
+				game.logPlayer(who, "%s can not be used anymore.", self:getName{no_count=true})
+			end
+			return {}
+		end
+	end
+end
+
+function _M:getObjectCooldown(who)
+	if not self.power then return end
+	if self.talent_cooldown then
+		return (who and who:isTalentCoolingDown(self.talent_cooldown)) or 0
+	end
+	local reduce = 100 - util.bound(who:attr("use_object_cooldown_reduce") or 0, 0, 100)
+	local usepower = function(power) return math.ceil(power * reduce / 100) end
+	local need = (self.use_power and usepower(self.use_power.power)) or (self.use_talent and usepower(self.use_talent.power)) or 0
+	if self.power < need then
+		if self.power_regen and self.power_regen > 0 then
+			return math.ceil((need - self.power)/self.power_regen)
+		else
+			return nil
+		end
+	else
+		return 0
+	end
+end
+
 --- Use the object (quaff, read, ...)
 function _M:use(who, typ, inven, item)
 	inven = who:getInven(inven)
-- 
GitLab