diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua
index 1c1fb340325f4ab39b5afa89cb4a6a308de94a5e..5f3476796f848cfce5aaf56ed27c8dc449b63c20 100644
--- a/game/modules/tome/class/Actor.lua
+++ b/game/modules/tome/class/Actor.lua
@@ -5548,6 +5548,22 @@ function _M:worthExp(target)
 	end
 end
 
+--- Burn arcane resources
+-- @param damage how much to burn
+-- @return how much have been burned
+function _M:burnArcaneResources(damage)
+	local mana = math.min(self:getMana(), damage)
+	local vim = math.min(self:getVim(), damage/2)
+	local pos = math.min(self:getPositive(), damage/4)
+	local neg = math.min(self:getNegative(), damage/4)
+	self:incMana(-mana)
+	self:incVim(-vim)
+	self:incPositive(-pos)
+	self:incNegative(-neg)
+
+	return math.max(mana, vim * 2, pos * 4, neg * 4)
+end
+
 --- Find effects based on a filter, up to nb.
 function _M:effectsFilter(t, nb)
 	local effs = {}
diff --git a/game/modules/tome/data/damage_types.lua b/game/modules/tome/data/damage_types.lua
index e92c651a92e67582ab5402e17ab338478bf70a69..14164a3fc95df7f153ad0abddc8aef250f9ceaef 100644
--- a/game/modules/tome/data/damage_types.lua
+++ b/game/modules/tome/data/damage_types.lua
@@ -2030,23 +2030,7 @@ newDamageType{
 	projector = function(src, x, y, type, dam)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
-			-- Note:  Standardize this conversion somewhere in Actor.lua
-			local mana = dam
-			local vim = dam / 2
-			local positive = dam / 4
-			local negative = dam / 4
-
-			mana = math.min(target:getMana(), mana)
-			vim = math.min(target:getVim(), vim)
-			positive = math.min(target:getPositive(), positive)
-			negative = math.min(target:getNegative(), negative)
-
-			target:incMana(-mana)
-			target:incVim(-vim)
-			target:incPositive(-positive)
-			target:incNegative(-negative)
-
-			local dam = math.max(mana, vim * 2, positive * 4, negative * 4)
+			dam = target.burnArcaneResources and target:burnArcaneResources(dam) or 0
 			return DamageType:get(DamageType.ARCANE).projector(src, x, y, DamageType.ARCANE, dam)
 		end
 		return 0
@@ -3046,22 +3030,7 @@ newDamageType{
 	projector = function(src, x, y, type, dam)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
-			local mana = dam
-			local vim = dam / 2
-			local positive = dam / 4
-			local negative = dam / 4
-
-			mana = math.min(target:getMana(), mana)
-			vim = math.min(target:getVim(), vim)
-			positive = math.min(target:getPositive(), positive)
-			negative = math.min(target:getNegative(), negative)
-
-			target:incMana(-mana)
-			target:incVim(-vim)
-			target:incPositive(-positive)
-			target:incNegative(-negative)
-
-			local dam = math.max(mana, vim * 2, positive * 4, negative * 4)
+			dam = target.burnArcaneResources and target:burnArcaneResources(dam) or 0
 			return DamageType:get(DamageType.ARCANE).projector(src, x, y, DamageType.ARCANE, dam)
 		end
 		return 0