From ae9e33c99c9fadf58d57fe77036a63c2df5455da Mon Sep 17 00:00:00 2001
From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54>
Date: Sat, 4 May 2013 23:30:14 +0000
Subject: [PATCH]       plop

git-svn-id: http://svn.net-core.org/repos/t-engine4@6687 51575b47-30f0-44d4-a5cc-537603b46e54
---
 game/engines/default/engine/interface/ActorTalents.lua | 10 ++++++++++
 game/modules/tome/class/interface/Archery.lua          |  9 +++++++--
 game/modules/tome/class/interface/Combat.lua           |  4 ++++
 3 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/game/engines/default/engine/interface/ActorTalents.lua b/game/engines/default/engine/interface/ActorTalents.lua
index dfeb0ad72f..41049e62e7 100644
--- a/game/engines/default/engine/interface/ActorTalents.lua
+++ b/game/engines/default/engine/interface/ActorTalents.lua
@@ -806,3 +806,13 @@ function _M:callTalent(tid, name, ...)
 	name = name or "trigger"
 	if t[name] then return t[name](self, t, ...) end
 end
+
+--- Trigger all talents matching
+function _M:talentCallbackOn(on, ...)
+	for tid, _ in pairs(self.sustain_talents) do
+		local t = self:getTalentFromId(tid)
+		if t and t[on] then
+			self:callTalent(tid, on, ...)
+		end
+	end
+end
\ No newline at end of file
diff --git a/game/modules/tome/class/interface/Archery.lua b/game/modules/tome/class/interface/Archery.lua
index c2d5397147..4683fee426 100644
--- a/game/modules/tome/class/interface/Archery.lua
+++ b/game/modules/tome/class/interface/Archery.lua
@@ -62,7 +62,8 @@ function _M:archeryAcquireTargets(tg, params)
 	if offweapon then wtravel_speed = math.ceil(((weapon.travel_speed or 0) + (offweapon.travel_speed or 0)) / 2) end
 	tg.speed = (tg.speed or 10) + (ammo.combat.travel_speed or 0) + (wtravel_speed or 0) + (self.travel_speed or 0)
 	print("[PROJECTILE SPEED] ::", tg.speed)
-	local x, y = self:getTarget(tg)
+	local x, y = params.x, params.y
+	if not x or not y then x, y = self:getTarget(tg) end
 	if not x or not y then return nil end
 
 	-- Find targets to know how many ammo we use
@@ -139,7 +140,7 @@ function _M:archeryAcquireTargets(tg, params)
 
 		local speed = self:combatSpeed(weapon)
 		print("[SHOOT] speed", speed or 1, "=>", game.energy_to_act * (speed or 1))
-		self:useEnergy(game.energy_to_act * (speed or 1))
+		if not params.no_energy then self:useEnergy(game.energy_to_act * (speed or 1)) end
 
 		if sound then game:playSoundNear(self, sound) end
 
@@ -259,11 +260,15 @@ local function archery_projectile(tx, ty, tg, self, tmp)
 		hitted = true
 
 		if talent.archery_onhit then talent.archery_onhit(self, talent, target, target.x, target.y) end
+
+		target:talentCallbackOn("callbackOnArcheryHit", self)
 	else
 		local srcname = game.level.map.seens(self.x, self.y) and self.name:capitalize() or "Something"
 		game.logSeen(target, "%s misses %s.", srcname, target.name)
 
 		if talent.archery_onmiss then talent.archery_onmiss(self, talent, target, target.x, target.y) end
+
+		target:talentCallbackOn("callbackOnArcheryMiss", self)
 	end
 
 	-- cross-tier effect for accuracy vs. defense
diff --git a/game/modules/tome/class/interface/Combat.lua b/game/modules/tome/class/interface/Combat.lua
index f74adc89a4..cde50e8af7 100644
--- a/game/modules/tome/class/interface/Combat.lua
+++ b/game/modules/tome/class/interface/Combat.lua
@@ -457,10 +457,14 @@ function _M:attackTargetWith(target, weapon, damtype, mult, force_dam)
 			dam = dam + total_conversion
 		end
 
+		target:talentCallbackOn("callbackOnMeleeHit", self)
+
 		hitted = true
 	else
 		local srcname = game.level.map.seens(self.x, self.y) and self.name:capitalize() or "Something"
 		game.logSeen(target, "%s misses %s.", srcname, target.name)
+
+		target:talentCallbackOn("callbackOnMeleeMiss", self)
 	end
 
 	-- cross-tier effect for accuracy vs. defense
-- 
GitLab