diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua
index d55cda1f3e9970f4678e8fc1b70ad70da763ffd4..f98658a5c05ae4921729bae961f853a2527345c9 100644
--- a/game/modules/tome/class/Actor.lua
+++ b/game/modules/tome/class/Actor.lua
@@ -1468,10 +1468,7 @@ function _M:onTakeHit(value, src)
 		else
 			drain = 2
 		end
-		if self:getPositive() <= 0 then
-			self:forceUseTalent(self.T_SHIELD_OF_LIGHT, {ignore_energy=true})
-			game.logSeen(self, "%s's shield of light spell has crumbled under the attack!", self.name:capitalize())
-		else
+		if self:getPositive() >= drain then
 			self:incPositive(- drain)
 			self:heal(self:combatTalentSpellDamage(self.T_SHIELD_OF_LIGHT, 5, 25), self)
 		end
diff --git a/game/modules/tome/class/interface/Combat.lua b/game/modules/tome/class/interface/Combat.lua
index 5a918b37290caaf8cbd005bdbe998e42a3471127..8f015b9ef91cb348e0e741850a672c5d6a0028fb 100644
--- a/game/modules/tome/class/interface/Combat.lua
+++ b/game/modules/tome/class/interface/Combat.lua
@@ -454,11 +454,10 @@ function _M:attackTargetWith(target, weapon, damtype, mult, force_dam)
 
 	-- Weapon of light cast
 	if hitted and not target.dead and self:knowTalent(self.T_WEAPON_OF_LIGHT) and self:isTalentActive(self.T_WEAPON_OF_LIGHT) then
-		local dam = 7 + self:getTalentLevel(self.T_WEAPON_OF_LIGHT) * self:combatSpellpower(0.092)
-		DamageType:get(DamageType.LIGHT).projector(self, target.x, target.y, DamageType.LIGHT, dam)
-		self:incPositive(-3)
-		if self:getPositive() <= 0 then
-			self:forceUseTalent(self.T_WEAPON_OF_LIGHT, {ignore_energy=true})
+		if self:getPositive() >= 3 then
+			local dam = 7 + self:getTalentLevel(self.T_WEAPON_OF_LIGHT) * self:combatSpellpower(0.092)
+			DamageType:get(DamageType.LIGHT).projector(self, target.x, target.y, DamageType.LIGHT, dam)
+			self:incPositive(-3)
 		end
 	end
 
diff --git a/game/modules/tome/data/talents/celestial/combat.lua b/game/modules/tome/data/talents/celestial/combat.lua
index ae8751de9d928ba3cc8ac8a21dd82fed23b74fd6..6da0ff0b3bc425a2c92a498b25857a610c780c4f 100644
--- a/game/modules/tome/data/talents/celestial/combat.lua
+++ b/game/modules/tome/data/talents/celestial/combat.lua
@@ -39,8 +39,8 @@ newTalent{
 	end,
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
-		return ([[Infuse your weapon of the power of the Sun, doing %0.2f light damage with each hit.
-		Each hit will drain 3 positive energy. The spell ends when energy reaches 0.
+		return ([[Infuse your weapon of the power of the Sun, doing %0.2f light damage with each hit and costing 3 positive energy.
+		If you do not have enough positive energy, the effect will not trigger.
 		The damage will increase with the Magic stat]]):
 		format(damDesc(self, DamageType.LIGHT, damage))
 	end,
diff --git a/game/modules/tome/data/talents/celestial/guardian.lua b/game/modules/tome/data/talents/celestial/guardian.lua
index e530c582a2bb07c2c9127aa6360a72f5d42b268b..71e54a8fcbe7ff4f030d573ef4c2dc7967f7beb0 100644
--- a/game/modules/tome/data/talents/celestial/guardian.lua
+++ b/game/modules/tome/data/talents/celestial/guardian.lua
@@ -45,8 +45,8 @@ newTalent{
 	end,
 	info = function(self, t)
 		local heal = t.getHeal(self, t)
-		return ([[Infuse your shield with light energy, healing you for %0.2f each time you take damage.
-		Each heal will drain up to 2 positive energy. The spell ends when energy reaches 0.
+		return ([[Infuse your shield with light energy, healing you for %0.2f each time you take damage and costing up to 2 positive energy.
+		If you do not have enough positive energy, the effect will not trigger.
 		The healing done will increase with the Magic stat]]):
 		format(heal)
 	end,
diff --git a/game/modules/tome/data/talents/celestial/hymns.lua b/game/modules/tome/data/talents/celestial/hymns.lua
index 3121c254892ddbb188ac436ac4c270d9957fbdbe..6ca9ca4a9be720a9506cad5af2f66f23ecc6e242 100644
--- a/game/modules/tome/data/talents/celestial/hymns.lua
+++ b/game/modules/tome/data/talents/celestial/hymns.lua
@@ -178,13 +178,7 @@ newTalent{
 	getTargetCount = function(self, t) return math.floor(self:getTalentLevel(t)) end,
 	getNegativeDrain = function(self, t) return 9 - self:getTalentLevelRaw(t) end,
 	do_beams = function(self, t)
-		if self:getNegative() <= 0 then
-			local old = self.energy.value
-			self.energy.value = 100000
-			self:useTalent(self.T_HYMN_OF_MOONLIGHT)
-			self.energy.value = old
-			return
-		end
+		if self:getNegative() < t.getNegativeDrain(self, t) then return end
 
 		local tgts = {}
 		local grids = core.fov.circle_grids(self.x, self.y, 5, true)