diff --git a/game/engines/default/engine/ai/talented.lua b/game/engines/default/engine/ai/talented.lua
index 70aa9dd3315a2decdf23e21baf5f9315d24c2e14..08ea1eef15774b518b1fe406634b7fd8f8d6c27f 100644
--- a/game/engines/default/engine/ai/talented.lua
+++ b/game/engines/default/engine/ai/talented.lua
@@ -27,7 +27,7 @@ newAI("dumb_talented", function(self)
 	for tid, _ in pairs(self.talents) do
 		local t = self:getTalentFromId(tid)
 --		print(self.name, self.uid, "dumb ai talents can try use", t.name, tid, "::", t.mode, not self:isTalentCoolingDown(t), target_dist <= self:getTalentRange(t), self:preUseTalent(t, true), self:canProject({type="bolt"}, self.ai_target.actor.x, self.ai_target.actor.y))
-		if t.mode == "activated" and not self:isTalentCoolingDown(t) and target_dist <= self:getTalentRange(t) and self:preUseTalent(t, true, true) and self:canProject({type="bolt"}, self.ai_target.actor.x, self.ai_target.actor.y) and self:hasLOS(self.ai_target.actor.x, self.ai_target.actor.y) then
+		if t.mode == "activated" and not self:isTalentCoolingDown(t) and target_dist <= self:getTalentRange(t) and self:preUseTalent(t, true, true) and self:canProject({type=t.direct_hit and "hit" or "bolt"}, self.ai_target.actor.x, self.ai_target.actor.y) and self:hasLOS(self.ai_target.actor.x, self.ai_target.actor.y) then
 			avail[#avail+1] = tid
 			print(self.name, self.uid, "dumb ai talents can use", t.name, tid)
 		elseif t.mode == "sustained" and not self:isTalentCoolingDown(t) and not self:isTalentActive(t.id) and self:preUseTalent(t, true, true) then
diff --git a/game/modules/tome/data/talents/corruptions/bone.lua b/game/modules/tome/data/talents/corruptions/bone.lua
index 32aa99c7fe161b312905b37c2d84939b642c6cd1..0d29f143491f93c5be9b0b597482ddcafdedc10c 100644
--- a/game/modules/tome/data/talents/corruptions/bone.lua
+++ b/game/modules/tome/data/talents/corruptions/bone.lua
@@ -26,6 +26,7 @@ newTalent{
 	cooldown = 4,
 	range = 20,
 	random_ego = "attack",
+	direct_hit = true,
 	action = function(self, t)
 		local tg = {type="beam", range=self:getTalentRange(t), talent=t}
 		local x, y = self:getTarget(tg)
@@ -115,6 +116,7 @@ newTalent{
 	tactical = {
 		DEFEND = 10,
 	},
+	direct_hit = true,
 	absorb = function(self, t, p)
 		game.logPlayer(self, "Your bone shield absorbs the damage!")
 		self:removeParticles(table.remove(p.particles))
diff --git a/game/modules/tome/data/talents/corruptions/curses.lua b/game/modules/tome/data/talents/corruptions/curses.lua
index c36be2053fccbe6f650040ac5d55a8886400cef8..c160aeda69b2295cf5a2b09079b94c05eb7bf7a1 100644
--- a/game/modules/tome/data/talents/corruptions/curses.lua
+++ b/game/modules/tome/data/talents/corruptions/curses.lua
@@ -25,6 +25,7 @@ newTalent{
 	cooldown = 20,
 	vim = 20,
 	range = 20,
+	direct_hit = true,
 	action = function(self, t)
 		local tg = {type="hit", range=self:getTalentRange(t), talent=t}
 		local x, y = self:getTarget(tg)
@@ -53,6 +54,7 @@ newTalent{
 	cooldown = 20,
 	vim = 20,
 	range = 20,
+	direct_hit = true,
 	action = function(self, t)
 		local tg = {type="hit", range=self:getTalentRange(t), talent=t}
 		local x, y = self:getTarget(tg)
@@ -81,6 +83,7 @@ newTalent{
 	cooldown = 20,
 	vim = 20,
 	range = 20,
+	direct_hit = true,
 	action = function(self, t)
 		local tg = {type="hit", range=self:getTalentRange(t), talent=t}
 		local x, y = self:getTarget(tg)
@@ -109,6 +112,7 @@ newTalent{
 	cooldown = 20,
 	vim = 20,
 	range = 20,
+	direct_hit = true,
 	action = function(self, t)
 		local tg = {type="hit", range=self:getTalentRange(t), talent=t}
 		local x, y = self:getTarget(tg)
diff --git a/game/modules/tome/data/talents/corruptions/hexes.lua b/game/modules/tome/data/talents/corruptions/hexes.lua
index a230c0725602cba1c850160adfa1baa2a82fdc2f..4aa7df115ee1f10b1c2cb5cde890f05d28a17321 100644
--- a/game/modules/tome/data/talents/corruptions/hexes.lua
+++ b/game/modules/tome/data/talents/corruptions/hexes.lua
@@ -25,6 +25,7 @@ newTalent{
 	cooldown = 20,
 	vim = 30,
 	range = 30,
+	direct_hit = true,
 	action = function(self, t)
 		local tg = {type="hit", range=self:getTalentRange(t), talent=t}
 		local x, y = self:getTarget(tg)
@@ -53,6 +54,7 @@ newTalent{
 	cooldown = 20,
 	vim = 30,
 	range = 30,
+	direct_hit = true,
 	action = function(self, t)
 		local tg = {type="hit", range=self:getTalentRange(t), talent=t}
 		local x, y = self:getTarget(tg)
@@ -81,6 +83,7 @@ newTalent{
 	cooldown = 20,
 	vim = 30,
 	range = 30,
+	direct_hit = true,
 	action = function(self, t)
 		local tg = {type="hit", range=self:getTalentRange(t), talent=t}
 		local x, y = self:getTarget(tg)
@@ -109,6 +112,7 @@ newTalent{
 	cooldown = 20,
 	vim = 30,
 	range = 30,
+	direct_hit = true,
 	action = function(self, t)
 		local tg = {type="hit", range=self:getTalentRange(t), talent=t}
 		local x, y = self:getTarget(tg)
diff --git a/game/modules/tome/data/talents/corruptions/plague.lua b/game/modules/tome/data/talents/corruptions/plague.lua
index 4d0bfe819ef8bad91eb7b52d8cf543ad19afb11a..0ffce44f7e77ffb47a59808fba673cfbb9c364e2 100644
--- a/game/modules/tome/data/talents/corruptions/plague.lua
+++ b/game/modules/tome/data/talents/corruptions/plague.lua
@@ -122,6 +122,7 @@ newTalent{
 	vim = 35,
 	cooldown = 15,
 	range = 10,
+	direct_hit = true,
 	action = function(self, t)
 		local tg = {type="ball", range=self:getTalentRange(t), radius=2}
 		local x, y = self:getTarget(tg)
diff --git a/game/modules/tome/data/talents/cunning/shadow-magic.lua b/game/modules/tome/data/talents/cunning/shadow-magic.lua
index ee13dcf70af187e8568effeef8ff1e18c8d44693..852394b3ab89f7fcc4a2388c46355a2108cd8662 100644
--- a/game/modules/tome/data/talents/cunning/shadow-magic.lua
+++ b/game/modules/tome/data/talents/cunning/shadow-magic.lua
@@ -76,6 +76,7 @@ newTalent{
 	stamina = 100,
 	require = cuns_req4,
 	range = function(self, t) return math.floor(5 + self:getTalentLevel(t)) end,
+	direct_hit = true,
 	action = function(self, t)
 		local tg = {type="hit", range=self:getTalentRange(t)}
 		local x, y, target = self:getTarget(tg)
diff --git a/game/modules/tome/data/talents/divine/star-fury.lua b/game/modules/tome/data/talents/divine/star-fury.lua
index d8eb8321f31dfebd71be72bfb06fdc4662c3b3ee..1afac7b4018e9e8715fd6ceafcdf8092c29c9bcc 100644
--- a/game/modules/tome/data/talents/divine/star-fury.lua
+++ b/game/modules/tome/data/talents/divine/star-fury.lua
@@ -29,6 +29,7 @@ newTalent{
 		ATTACK = 10,
 	},
 	range = 20,
+	direct_hit = true,
 	reflectable = true,
 	action = function(self, t)
 		local tg = {type="beam", range=self:getTalentRange(t), talent=t}
@@ -58,6 +59,7 @@ newTalent{
 		ATTACK = 10,
 	},
 	range = 6,
+	direct_hit = true,
 	action = function(self, t)
 		local duration = self:getTalentLevel(t) + 2
 		local radius = 3
@@ -106,6 +108,7 @@ newTalent{
 		ATTACK = 10,
 	},
 	range = 2,
+	direct_hit = true,
 	action = function(self, t)
 		local tg = {type="ball", range=0, radius=self:getTalentRange(t), talent=t, friendlyfire=false}
 		local grids = self:project(tg, self.x, self.y, DamageType.LIGHT, self:spellCrit(10 + self:combatSpellpower(0.2) * self:getTalentLevel(t)))
@@ -139,6 +142,7 @@ newTalent{
 		ATTACKAREA = 10,
 	},
 	range = 10,
+	direct_hit = true,
 	action = function(self, t)
 		local tg = {type="ball", range=self:getTalentRange(t), radius=1 + math.floor(self:getTalentLevelRaw(t) / 3), friendlyfire=self:spellFriendlyFire(), talent=t}
 		local x, y = self:getTarget(tg)
diff --git a/game/modules/tome/data/talents/divine/sun.lua b/game/modules/tome/data/talents/divine/sun.lua
index 4a7f9f442dd1df5791d2cd3f38985c86b85c21da..194c395db3d8eeb55351c8d62a49e7074a62dece 100644
--- a/game/modules/tome/data/talents/divine/sun.lua
+++ b/game/modules/tome/data/talents/divine/sun.lua
@@ -29,6 +29,7 @@ newTalent{
 		ATTACK = 10,
 	},
 	range = 10,
+	direct_hit = true,
 	reflectable = true,
 	action = function(self, t)
 		local tg = {type="hit", range=self:getTalentRange(t), talent=t}
@@ -68,6 +69,7 @@ newTalent{
 		ATTACK = 10,
 	},
 	range = 6,
+	direct_hit = true,
 	action = function(self, t)
 		local tg = {type="ball", range=0, friendlyfire=true, radius=2 + self:getTalentLevel(t) / 2, talent=t}
 		self:project(tg, self.x, self.y, DamageType.LITE, 1)
@@ -102,6 +104,7 @@ newTalent{
 		ATTACK = 10,
 	},
 	range = 10,
+	direct_hit = true,
 	action = function(self, t)
 		local tg = {type="beam", range=self:getTalentRange(t), talent=t}
 		local x, y = self:getTarget(tg)
@@ -132,6 +135,7 @@ newTalent{
 		ATTACKAREA = 10,
 	},
 	range = 3,
+	direct_hit = true,
 	action = function(self, t)
 		local tg = {type="ball", range=0, radius=3, friendlyfire=false, talent=t}
 		local grids = self:project(tg, self.x, self.y, DamageType.LIGHT, self:spellCrit(self:combatTalentSpellDamage(t, 10, 160)))
diff --git a/game/modules/tome/data/talents/divine/twilight.lua b/game/modules/tome/data/talents/divine/twilight.lua
index c983380212d66fcc3923e7742d0251c37b2867fc..d26a306a7221d8f828c3eebafc57f05859b5639c 100644
--- a/game/modules/tome/data/talents/divine/twilight.lua
+++ b/game/modules/tome/data/talents/divine/twilight.lua
@@ -126,6 +126,7 @@ newTalent{
 		ATTACKAREA = 10,
 	},
 	range = 3,
+	direct_hit = true,
 	action = function(self, t)
 		local tg = {type="ball", range=0, radius=self:getTalentRange(t), talent=t, friendlyfire=false}
 		self:project(tg, self.x, self.y, DamageType.CONFUSION, {
diff --git a/game/modules/tome/data/talents/gifts/cold-drake.lua b/game/modules/tome/data/talents/gifts/cold-drake.lua
index a040e4d51cb7c345882b88bc236410ef9cdd3ca3..91976e3b11f1e0a879c86d4baf75b767192f8e07 100644
--- a/game/modules/tome/data/talents/gifts/cold-drake.lua
+++ b/game/modules/tome/data/talents/gifts/cold-drake.lua
@@ -133,6 +133,7 @@ newTalent{
 		ATTACKAREA = 10,
 	},
 	range = function(self, t) return 4 + self:getTalentLevelRaw(t) end,
+	direct_hit = true,
 	action = function(self, t)
 		local tg = {type="cone", range=0, radius=self:getTalentRange(t), friendlyfire=false, talent=t}
 		local x, y = self:getTarget(tg)
diff --git a/game/modules/tome/data/talents/gifts/fire-drake.lua b/game/modules/tome/data/talents/gifts/fire-drake.lua
index d07ff40b331d66a209752375bddb578bc9539bca..146e329b40deccb7430d4ed1191a2fda99dc684e 100644
--- a/game/modules/tome/data/talents/gifts/fire-drake.lua
+++ b/game/modules/tome/data/talents/gifts/fire-drake.lua
@@ -49,6 +49,7 @@ newTalent{
 	equilibrium = 7,
 	cooldown = 10,
 	range = 5,
+	direct_hit = true,
 	tactical = {
 		DEFEND = 10,
 	},
@@ -77,6 +78,7 @@ newTalent{
 		ATTACKAREA = 10,
 	},
 	range = 20,
+	direct_hit = true,
 	action = function(self, t)
 		local duration = 2 + self:getTalentLevelRaw(t)
 		local radius = 2
@@ -116,6 +118,7 @@ newTalent{
 		ATTACKAREA = 10,
 	},
 	range = function(self, t) return 4 + self:getTalentLevelRaw(t) end,
+	direct_hit = true,
 	action = function(self, t)
 		local tg = {type="cone", range=0, radius=self:getTalentRange(t), friendlyfire=false, talent=t}
 		local x, y = self:getTarget(tg)
diff --git a/game/modules/tome/data/talents/gifts/sand-drake.lua b/game/modules/tome/data/talents/gifts/sand-drake.lua
index 380a8e2adfdeb473e18d7e9c07753def32653865..da111433c4ccd6e27b8dd00dfcf6c1bfdfb5e2e4 100644
--- a/game/modules/tome/data/talents/gifts/sand-drake.lua
+++ b/game/modules/tome/data/talents/gifts/sand-drake.lua
@@ -109,6 +109,7 @@ newTalent{
 		ATTACKAREA = 10,
 	},
 	range = function(self, t) return 4 + self:getTalentLevelRaw(t) end,
+	direct_hit = true,
 	action = function(self, t)
 		local tg = {type="cone", range=0, radius=self:getTalentRange(t), friendlyfire=false, talent=t}
 		local x, y = self:getTarget(tg)
diff --git a/game/modules/tome/data/talents/gifts/slime.lua b/game/modules/tome/data/talents/gifts/slime.lua
index a91cdcefeedd48b9996324befd52f57f54d79c97..a5c779b9020f5f2bbcf20c842ea5a80c71460b64 100644
--- a/game/modules/tome/data/talents/gifts/slime.lua
+++ b/game/modules/tome/data/talents/gifts/slime.lua
@@ -87,6 +87,7 @@ newTalent{
 		ATTACK = 10,
 	},
 	range = 20,
+	direct_hit = true,
 	proj_speed = 8,
 	action = function(self, t)
 		local tg = {type="bolt", range=self:getTalentRange(t), display={particle="bolt_arcane"}}
diff --git a/game/modules/tome/data/talents/misc/npcs.lua b/game/modules/tome/data/talents/misc/npcs.lua
index 7eabd18d62820d8a574e01858dc915952f54b4ad..5646ee6f08854c5d24c464307f90022b7daf5b10 100644
--- a/game/modules/tome/data/talents/misc/npcs.lua
+++ b/game/modules/tome/data/talents/misc/npcs.lua
@@ -292,6 +292,7 @@ newTalent{
 	type = {"other/other", 1},
 	cooldown = 4,
 	range = 20,
+	direct_hit = true,
 	action = function(self, t)
 		local filters = self.summon or {{type=self.type, subtype=self.subtype, number=1, hasxp=true, lastfor=20}}
 		if #filters == 0 then return end
@@ -425,6 +426,7 @@ newTalent{
 	cooldown = 10,
 	mana = 16,
 	range = 20,
+	direct_hit = true,
 	action = function(self, t)
 		local tg = {type="hit", range=self:getTalentRange(t), talent=t}
 		local x, y = self:getTarget(tg)
@@ -472,6 +474,7 @@ newTalent{
 		ATTACK = 10,
 	},
 	range = 20,
+	direct_hit = true,
 	reflectable = true,
 	action = function(self, t)
 		local tg = {type="hit", range=self:getTalentRange(t), talent=t}
@@ -529,6 +532,7 @@ newTalent{
 		DEFEND = 5,
 	},
 	range = 4,
+	direct_hit = true,
 	action = function(self, t)
 		local tg = {type="cone", range=0, radius=4 + self:getTalentLevelRaw(t), friendlyfire=false, talent=t}
 		local x, y = self:getTarget(tg)
@@ -575,6 +579,7 @@ newTalent{
 		ATTACK = 10,
 	},
 	range = 20,
+	direct_hit = true,
 	action = function(self, t)
 		local tg = {type="ball", range=self:getTalentRange(t), radius=2}
 		local x, y = self:getTarget(tg)
@@ -640,6 +645,7 @@ newTalent{
 		ATTACK = 10,
 	},
 	range = 20,
+	direct_hit = true,
 	action = function(self, t)
 		local tg = {type="ball", range=0, radius=2 + self:getTalentLevelRaw(t), talent=t}
 		local x, y = self:getTarget(tg)
@@ -670,6 +676,7 @@ newTalent{
 		ATTACK = 10,
 	},
 	range = 20,
+	direct_hit = true,
 	action = function(self, t)
 		local tg = {type="ball", range=self:getTalentRange(t), radius=1, talent=t}
 		local x, y = self:getTarget(tg)
@@ -695,6 +702,7 @@ newTalent{
 	},
 	message = "@Source@ howls",
 	range = 20,
+	direct_hit = true,
 	action = function(self, t)
 		local rad = self:getTalentLevel(t) + 5
 		for i = self.x - rad, self.x + rad do for j = self.y - rad, self.y + rad do if game.level.map:isBound(i, j) then
@@ -728,6 +736,7 @@ newTalent{
 	},
 	message = "@Source@ shrieks.",
 	range = 20,
+	direct_hit = true,
 	action = function(self, t)
 		local rad = self:getTalentLevel(t) + 5
 		for i = self.x - rad, self.x + rad do for j = self.y - rad, self.y + rad do if game.level.map:isBound(i, j) then
@@ -793,6 +802,7 @@ newTalent{
 	cooldown = 2,
 	equilibrium = 5,
 	range = 15,
+	direct_hit = true,
 	action = function(self, t)
 		local tg = {type="beam", range=self:getTalentRange(t), talent=t}
 		local x, y = self:getTarget(tg)
@@ -814,6 +824,7 @@ newTalent{
 	cooldown = 10,
 	equilibrium = 5,
 	range = 15,
+	direct_hit = true,
 	action = function(self, t)
 		local tg = {type="hit", range=self:getTalentRange(t), talent=t}
 		local x, y = self:getTarget(tg)
@@ -834,6 +845,7 @@ newTalent{
 	cooldown = 2,
 	equilibrium = 5,
 	range = 15,
+	direct_hit = true,
 	action = function(self, t)
 		local tg = {type="beam", range=self:getTalentRange(t), talent=t}
 		local x, y = self:getTarget(tg)
@@ -877,6 +889,7 @@ newTalent{
 	cooldown = 13,
 	vim = 27,
 	range = 20,
+	direct_hit = true,
 	action = function(self, t)
 		local duration = self:getTalentLevel(t) + 2
 		local radius = 4
@@ -931,6 +944,7 @@ newTalent{
 	cooldown = 7,
 	vim = 24,
 	range = function(self, t) return math.ceil(3 + self:getTalentLevel(t)) end,
+	direct_hit = true,
 	action = function(self, t)
 		local tg = {type="cone", range=0, radius=self:getTalentRange(t), talent=t}
 		local x, y = self:getTarget(tg)
diff --git a/game/modules/tome/data/talents/spells/air.lua b/game/modules/tome/data/talents/spells/air.lua
index 946907b4ee8cd3b01d0f6e063fa5a22a5b1c42f4..88c29bc8a8177f75444c040fe13e93387e70b0f1 100644
--- a/game/modules/tome/data/talents/spells/air.lua
+++ b/game/modules/tome/data/talents/spells/air.lua
@@ -29,6 +29,7 @@ newTalent{
 		ATTACK = 10,
 	},
 	range = 20,
+	direct_hit = true,
 	reflectable = true,
 	action = function(self, t)
 		local tg = {type="beam", range=self:getTalentRange(t), talent=t}
@@ -59,6 +60,7 @@ newTalent{
 		ATTACK = 10,
 	},
 	range = 20,
+	direct_hit = true,
 	reflectable = true,
 	action = function(self, t)
 		local tg = {type="bolt", range=self:getTalentRange(t), talent=t}
@@ -173,6 +175,7 @@ newTalent{
 		ATTACKAREA = 10,
 	},
 	range = 5,
+	direct_hit = true,
 	do_storm = function(self, t)
 		if self:getMana() <= 0 then
 			local old = self.energy.value
diff --git a/game/modules/tome/data/talents/spells/arcane.lua b/game/modules/tome/data/talents/spells/arcane.lua
index de56da559c7a6d87f1878e779b33757b669dd14a..088db362852f8ee33fac53337b49ae6c97250de6 100644
--- a/game/modules/tome/data/talents/spells/arcane.lua
+++ b/game/modules/tome/data/talents/spells/arcane.lua
@@ -56,6 +56,7 @@ newTalent{
 		ATTACK = 10,
 	},
 	range = 20,
+	direct_hit = true,
 	reflectable = true,
 	action = function(self, t)
 		local tg = {type="bolt", range=self:getTalentRange(t), talent=t}
diff --git a/game/modules/tome/data/talents/spells/explosives.lua b/game/modules/tome/data/talents/spells/explosives.lua
index 6df0b2006822278746fe2d9a300fc6a213b7f1a8..6cdf0da9f258f2270b1c09467742aefcd6ef4016 100644
--- a/game/modules/tome/data/talents/spells/explosives.lua
+++ b/game/modules/tome/data/talents/spells/explosives.lua
@@ -27,6 +27,7 @@ newTalent{
 	range = function(self, t)
 		return math.ceil(5 + self:getDex(12))
 	end,
+	direct_hit = true,
 	computeDamage = function(self, t, ammo)
 		local inc_dam = 0
 		local damtype = DamageType.FIRE
@@ -159,6 +160,7 @@ newTalent{
 	range = function(self, t)
 		return math.ceil(5 + self:getDex(12))
 	end,
+	direct_hit = true,
 	computeDamage = function(self, t, ammo)
 		local inc_dam = 0
 		local damtype = DamageType.SPELLKNOCKBACK
diff --git a/game/modules/tome/data/talents/spells/fire-alchemy.lua b/game/modules/tome/data/talents/spells/fire-alchemy.lua
index 48e995d5ef942b3090c8ea3eddc82f34ac66ef85..4ce400c10394342adf6fe7136adce1cc89949724 100644
--- a/game/modules/tome/data/talents/spells/fire-alchemy.lua
+++ b/game/modules/tome/data/talents/spells/fire-alchemy.lua
@@ -28,6 +28,7 @@ newTalent{
 	random_ego = "attack",
 	refectable = true,
 	proj_speed = 20,
+	direct_hit = true,
 	action = function(self, t)
 		local tg = {type="hit", range=self:getTalentRange(t), talent=t}
 		local x, y = self:getTarget(tg)
@@ -50,6 +51,7 @@ newTalent{
 	mana = 80,
 	cooldown = 34,
 	range = 10,
+	direct_hit = true,
 	action = function(self, t)
 		local tg = {type="ball", range=self:getTalentRange(t), radius=1, talent=t}
 		local x, y = self:getTarget(tg)
diff --git a/game/modules/tome/data/talents/spells/fire.lua b/game/modules/tome/data/talents/spells/fire.lua
index fa4480cb8df68b3ac8c4102e26197e92cc887b68..543b5a767b986bbbddce10aff9341e0840598c78 100644
--- a/game/modules/tome/data/talents/spells/fire.lua
+++ b/game/modules/tome/data/talents/spells/fire.lua
@@ -84,6 +84,7 @@ newTalent{
 	},
 	range = 15,
 	proj_speed = 4,
+	direct_hit = true,
 	action = function(self, t)
 		local tg = {type="ball", range=self:getTalentRange(t), radius=1 + self:getTalentLevelRaw(t), friendlyfire=self:spellFriendlyFire(), talent=t, display={particle="bolt_fire", trail="firetrail"}}
 		local x, y = self:getTarget(tg)
@@ -112,6 +113,7 @@ newTalent{
 		ATTACKAREA = 40,
 	},
 	range = 20,
+	direct_hit = true,
 	action = function(self, t)
 		local duration = 5 + self:getTalentLevel(t)
 		local radius = 5
diff --git a/game/modules/tome/data/talents/spells/meta.lua b/game/modules/tome/data/talents/spells/meta.lua
index ac884989501f5f415eae83b29c1ede5f24e9099f..f3a00ed7dce3040ca8b89628638457ef8917608e 100644
--- a/game/modules/tome/data/talents/spells/meta.lua
+++ b/game/modules/tome/data/talents/spells/meta.lua
@@ -25,6 +25,7 @@ newTalent{
 	random_ego = "utility",
 	mana = 40,
 	cooldown = 7,
+	direct_hit = true,
 	action = function(self, t)
 		local target = self
 
diff --git a/game/modules/tome/data/talents/spells/temporal.lua b/game/modules/tome/data/talents/spells/temporal.lua
index 4be0cfe3e87707443d30fee0772212cf32489812..2085e9a6af6b1c8c560c47b154d68cfee46fcac8 100644
--- a/game/modules/tome/data/talents/spells/temporal.lua
+++ b/game/modules/tome/data/talents/spells/temporal.lua
@@ -29,6 +29,7 @@ newTalent{
 		DEFENSE = 10,
 	},
 	range = 20,
+	direct_hit = true,
 	reflectable = true,
 	action = function(self, t)
 		local tg = {type="hit", range=self:getTalentRange(t), talent=t}
@@ -58,6 +59,7 @@ newTalent{
 	reflectable = true,
 	proj_speed = 2,
 	range = 10,
+	direct_hit = true,
 	action = function(self, t)
 		local tg = {type="beam", range=self:getTalentRange(t), talent=t, display={particle="bolt_arcane"}}
 		local x, y = self:getTarget(tg)
diff --git a/game/modules/tome/data/talents/spells/water.lua b/game/modules/tome/data/talents/spells/water.lua
index 8962e7f3e202fa08e3cc943d0a33f34ca9be724d..00d6f73251912638b958bc695b0a04cb9faf46bc 100644
--- a/game/modules/tome/data/talents/spells/water.lua
+++ b/game/modules/tome/data/talents/spells/water.lua
@@ -29,6 +29,7 @@ newTalent{
 		ATTACKAREA = 10,
 	},
 	range = 15,
+	direct_hit = true,
 	action = function(self, t)
 		local duration = self:getTalentLevel(t) + 2
 		local radius = 3
@@ -67,6 +68,7 @@ newTalent{
 		ATTACK = 10,
 	},
 	range = 20,
+	direct_hit = true,
 	reflectable = true,
 	action = function(self, t)
 		local tg = {type="hit", range=self:getTalentRange(t), talent=t}
@@ -94,6 +96,7 @@ newTalent{
 	tactical = {
 		ATTACKAREA = 10,
 	},
+	direct_hit = true,
 	action = function(self, t)
 		local duration = 5 + self:combatSpellpower(0.01) * self:getTalentLevel(t)
 		local radius = 1
diff --git a/game/modules/tome/data/talents/spells/wildfire.lua b/game/modules/tome/data/talents/spells/wildfire.lua
index cf66c8debb4dc5aad8097ab38960b2e206e072ea..93eb2a95134678914b5a80db4493f59aa3272bba 100644
--- a/game/modules/tome/data/talents/spells/wildfire.lua
+++ b/game/modules/tome/data/talents/spells/wildfire.lua
@@ -28,6 +28,7 @@ newTalent{
 		ATTACKAREA = 10,
 		DEFEND = 4,
 	},
+	direct_hit = true,
 	range = function(self, t) return 1 + self:getTalentLevelRaw(t) end,
 	action = function(self, t)
 		local tg = {type="ball", range=0, radius=self:getTalentRange(t), friendlyfire=false, talent=t}
diff --git a/game/modules/tome/data/talents/techniques/bow.lua b/game/modules/tome/data/talents/techniques/bow.lua
index edfa4f4685ee8c2ddc1c984f0397bd54a68c811c..7fc1720aee0363775756e6590c056e7eabd30bc6 100644
--- a/game/modules/tome/data/talents/techniques/bow.lua
+++ b/game/modules/tome/data/talents/techniques/bow.lua
@@ -78,6 +78,7 @@ newTalent{
 	stamina = 35,
 	require = techs_dex_req4,
 	range = 20,
+	direct_hit = true,
 	action = function(self, t)
 		local tg = {type="ball", radius=2 + self:getTalentLevel(t)/3, friendlyfire=false}
 		local targets = self:archeryAcquireTargets(tg)
diff --git a/game/modules/tome/data/talents/undeads/ghoul.lua b/game/modules/tome/data/talents/undeads/ghoul.lua
index 67043ef083876873a2eee3956d5817d3b4cf7ace..0958fa70c183d6b19683ec67fb82653a047424b2 100644
--- a/game/modules/tome/data/talents/undeads/ghoul.lua
+++ b/game/modules/tome/data/talents/undeads/ghoul.lua
@@ -45,6 +45,7 @@ newTalent{
 	tactical = {
 		ATTACK = 10,
 	},
+	direct_hit = true,
 	range = function(self, t) return math.floor(5 + self:getTalentLevel(t) * 1.2) end,
 	action = function(self, t)
 		local tg = {type="hit", range=self:getTalentRange(t)}