diff --git a/game/modules/tome/data/timed_effects/other.lua b/game/modules/tome/data/timed_effects/other.lua
index ed107ae9b2cf7fe8747a2d7a55818c29ad8eb38d..825cd1dbda412cdf42ba99d19c8a0363efddcabe 100644
--- a/game/modules/tome/data/timed_effects/other.lua
+++ b/game/modules/tome/data/timed_effects/other.lua
@@ -292,14 +292,14 @@ newEffect{
 		self:effectTemporaryValue(eff, "max_life", 300)
 		self:effectTemporaryValue(eff, "combat_armor", 20)
 		self:effectTemporaryValue(eff, "combat_armor_hardiness", 20)
-		
+
 		self.replace_display = mod.class.Actor.new{
-			image="invis.png", 
-			add_mos = {{image = "npc/giant_treant_wrathroot.png", 
-			display_y = -1, 
+			image="invis.png",
+			add_mos = {{image = "npc/giant_treant_wrathroot.png",
+			display_y = -1,
 			display_h = 2}},
 		}
-		
+
 		self:removeAllMOs()
 		game.level.map:updateMap(self.x, self.y)
 
@@ -424,7 +424,7 @@ newEffect{
 		if core.shader.active(4) then
 			self:removeParticles(eff.particle)
 			eff.particle = self:addParticles(Particles.new("shader_shield", 1, {size_factor=1.3, img="runicshield"}, {type="runicshield", shieldIntensity=0.14, ellipsoidalFactor=1.2, scrollingSpeed=-2, time_factor=4000, bubbleColor={1, 1, 0.3, 1.0}, auraColor={1, 0.8, 0.2, 1}}))
-		end		
+		end
 	end,
 	damage_feedback = function(self, eff, src, value)
 		if eff.particle and eff.particle._shader and eff.particle._shader.shad and src and src.x and src.y then
@@ -664,7 +664,7 @@ newEffect{
 		game:onTickEnd(function()
 			game:chronoClone("see_threads_base")
 		end)
-		
+
 		self:effectTemporaryValue(eff, "ignore_direct_crits", eff.crits)
 		self:effectTemporaryValue(eff, "combat_def", eff.defense)
 	end,
@@ -673,9 +673,9 @@ newEffect{
 		if self ~= game.player then
 			return
 		end
-		
+
 		game:onTickEnd(function()
-			
+
 			if game._chronoworlds == nil then
 				game.logSeen(self, "#LIGHT_RED#The see the threads spell fizzles and cancels, leaving you in this timeline.")
 				return
@@ -847,7 +847,7 @@ newEffect{
 	on_merge = function(self, old_eff, new_eff)
 		self:removeTemporaryValue("inc_damage", old_eff.dmgid)
 		self:removeTemporaryValue("resists", old_eff.rstid)
-		self:removeTemporaryValue("reduce_detrimental_status_effects_time", old_eff.durid)		
+		self:removeTemporaryValue("reduce_detrimental_status_effects_time", old_eff.durid)
 		old_eff.cur_power = (new_eff.power)
 		old_eff.cur_dur = new_eff.durred
 		old_eff.dmgid = self:addTemporaryValue("inc_damage", {all = - old_eff.dur * 2})
@@ -904,10 +904,10 @@ newEffect{
 					if sx then acts[#acts+1] = {act, sx, sy} end
 				end
 			end
-			if #acts == 0 then 
+			if #acts == 0 then
 				self.never_act = nil  -- If there was ever something worth making redundant..
 				self:removeEffect(self.EFF_SHADOW_VEIL)
-				return 
+				return
 			end
 
 			act = rng.table(acts)
@@ -1010,7 +1010,7 @@ newEffect{
 		if bonusLevel < 3 then return end
 		eff.retchHealId = self:addTemporaryValue("retch_heal", 1)
 		eff.retchCooldown = eff.retchCooldown or 0
-		
+
 		-- level 4: Reprieve from Death
 	end,
 	deactivate = function(self, eff)
@@ -1019,7 +1019,7 @@ newEffect{
 		if eff.incStatsId then self:removeTemporaryValue("inc_stats", eff.incStatsId) eff.incStatsId = nil end
 		if eff.retchHealId then self:removeTemporaryValue("retch_heal", eff.retchHealId) eff.retchHealId = nil end
 	end,
-	
+
 	callbackOnTakeDamage = function(self, eff, src, x, y, type, dam, state)
 		local def, level, bonusLevel = self.tempeffect_def[self.EFF_CURSE_OF_CORPSES], eff.level, math.min(eff.unlockLevel, eff.level)
 		if math.min(eff.unlockLevel, eff.level) >= 3 then
@@ -1036,7 +1036,7 @@ newEffect{
 	on_timeout = function(self, eff)
 		if eff.retchCooldown and eff.retchCooldown > 0 then eff.retchCooldown = math.max(0, eff.retchCooldown - 1) end
 	end,
-	
+
 	on_merge = function(self, old_eff, new_eff) return old_eff end,
 	--[[
 	doCorpselight = function(self, eff, target)
@@ -1135,7 +1135,7 @@ newEffect{
 	end,
 	getDexChange = function(level) return -1 + level * 2 end,
 	getConspiratorChance = function(level) return 20 + (level * 10) end,
-	getManiaDamagePercent = function(level) 
+	getManiaDamagePercent = function(level)
 		return Combat:combatLimit(level - 4, 5, 15, 0, 8, 4) -- Limit > 5%
 	end,
 	display_desc = function(self, eff) return ([[Curse of Madness (power %0.1f)]]):format(eff.level) end,
@@ -1183,13 +1183,13 @@ newEffect{
 		if eff.getCombatCriticalPowerChangeId then self:removeTemporaryValue("combat_critical_power", eff.getCombatCriticalPowerChangeId) eff.getCombatCriticalPowerChangeId = nil end
 		if eff.incStatsId then self:removeTemporaryValue("inc_stats", eff.incStatsId) eff.incStatsId = nil end
 	end,
-	
+
 	--cooldown talents on taking damage
-	callbackOnTakeDamage = function(self, eff, src, x, y, type, dam, state) 
+	callbackOnTakeDamage = function(self, eff, src, x, y, type, dam, state)
 		if math.min(eff.unlockLevel, eff.level) >= 4 then
 			local def = self.tempeffect_def[self.EFF_CURSE_OF_MADNESS]
 			if dam > 0 and dam >= self.max_life * (def.getManiaDamagePercent(eff.level) / 100) and not self.turn_procs.CoMania then
-				
+
 				local list = {}
 				for tid, cd in pairs(self.talents_cd) do
 					if cd and cd > 0 then
@@ -1205,14 +1205,14 @@ newEffect{
 						if self.onTalentCooledDown then self:onTalentCooledDown(tid) end
 					end
 				end
-				
+
 				game.logSeen(self, "#F53CBE#%s's mania hastens cooldowns.", self.name:capitalize())
 				self.turn_procs.CoMania = true
 				return {dam = dam}
 			end
 		end
 	end,
-	
+
 	on_merge = function(self, old_eff, new_eff) return old_eff end,
 	--[[
 	--spread a random det mental effect on crit
@@ -1287,7 +1287,7 @@ newEffect{
 			end
 		end
 	end,
-	
+
 	--just confusions
 	--[[
 	doConspirator = function(self, eff, target)
@@ -1550,7 +1550,7 @@ newEffect{
 		if math.min(eff.unlockLevel, eff.level) >= 3 then
 			--if e.status == "detrimental" and not e.subtype["cross tier"] and p.src and p.src._is_actor and not p.src.dead then
 				--local e = self.tempeffect_def[eff_id]
-			if e.status ~= "detrimental" or e.subtype["cross tier"] then return end
+			if e.status ~= "detrimental" or e.type == "other" or e.subtype["cross tier"] then return end
 			local harrowDam = def.getHarrowDam(self, level)
 			if p.src and p.src._is_actor then
 				DamageType:get(DamageType.MIND).projector(self, p.src.x, p.src.y, DamageType.MIND, dam)
@@ -1647,7 +1647,7 @@ newEffect{
 					radius,
 					5, nil,
 					engine.MapEffect.new{alpha=100, color_br=134, color_bg=60, color_bb=134, effect_shader="shader_images/darkness_effect.png"},
-					function(e, update_shape_only) if not update_shape_only then 
+					function(e, update_shape_only) if not update_shape_only then
 						-- attempt one summon per turn
 						if not e.src:canBe("summon") then return end
 
@@ -1683,9 +1683,9 @@ newEffect{
 						return true
 					end end,
 					false, false)
-				
+
 				self.turn_procs.CoNightmare = true
-				
+
 				game.logSeen(self, "#F53CBE#The air around %s grows cold and terrifying shapes begin to coalesce. A nightmare has begun.", self.name:capitalize())
 				game:playSoundNear(self, "talents/cloud")
 			end
@@ -1752,7 +1752,7 @@ newEffect{
 		eff.missedEvasionId = self:addTemporaryValue("evasion", def.getMissedOpportunities(level))
 
 		-- level 4: Unfortunate End - handled in doUnfortunateEnd
-		
+
 	end,
 	deactivate = function(self, eff)
 		if eff.moneyValueMultiplierId then self:removeTemporaryValue("money_value_multiplier", eff.moneyValueMultiplierId) eff.moneyValueMultiplierId = nil end
@@ -1761,7 +1761,7 @@ newEffect{
 		if eff.missedEvasionId then self:removeTemporaryValue("evasion", eff.missedEvasionId) eff.missedEvasionId = nil end
 	end,
 	on_merge = function(self, old_eff, new_eff) return old_eff end,
-	
+
 	-- called by default projector in mod.data.damage_types.lua
 	doUnfortunateEnd = function(self, eff, target, dam)
 		if math.min(eff.unlockLevel, eff.level) >=4 then
@@ -2004,11 +2004,11 @@ newEffect{
 		if not self.on_die then return end
 		-- Dreamscape doesn't cooldown in the dreamscape
 		self.talents_cd[self.T_DREAMSCAPE] = self.talents_cd[self.T_DREAMSCAPE] + 1
-		
+
 		-- Spawn a copy every other turn
 		local spawn_time = 2
 		if eff.dur%spawn_time == 0 then
-		
+
 			-- Find space
 			local x, y = util.findFreeGrid(eff.target.x, eff.target.y, 5, true, {[Map.ACTOR]=true})
 			if not x then
@@ -2032,7 +2032,7 @@ newEffect{
 				m.inc_damage.all = (m.inc_damage.all or 0) - 50
 			end
 			m.lucid_dreamer = 1
-			
+
 			-- Remove some talents
 			local tids = {}
 			for tid, _ in pairs(m.talents) do
@@ -2042,13 +2042,13 @@ newEffect{
 			for i, t in ipairs(tids) do
 				m:unlearnTalentFull(t.id)
 			end
-			
+
 			-- remove imprisonment
 			m:attr("invulnerable", -1)
 			m:attr("time_prison", -1)
 			m:attr("no_timeflow", -1)
 			m:attr("status_effect_immune", -1)
-			
+
 			m:removeParticles(eff.particle)
 			m:removeTimedEffectsOnClone()
 
@@ -2078,12 +2078,12 @@ newEffect{
 				end
 			end
 		end
-		
+
 		-- Try to insure the AI isn't attacking the invulnerable actor
 		if self.ai_target and self.ai_target.actor and self.ai_target.actor:attr("invulnerable") then
 			self:setTarget(nil)
 		end
-		
+
 		-- End the effect early if we've killed enough projections
 		if eff.projections_killed/10 >= eff.target.life/eff.target.max_life then
 			game:onTickEnd(function()
@@ -2108,7 +2108,7 @@ newEffect{
 	deactivate = function(self, eff)
 		-- Clone protection
 		if not self.on_die then return end
-		
+
 		-- Remove the target's invulnerability
 		eff.target:removeTemporaryValue("invulnerable", eff.iid)
 		eff.target:removeTemporaryValue("time_prison", eff.sid)
@@ -2118,7 +2118,7 @@ newEffect{
 		-- Remove the invaders damage bonus
 		self:removeTemporaryValue("inc_damage", eff.pid)
 		self:removeTemporaryValue("lucid_dreamer", eff.did)
-		
+
 		-- Return from the dreamscape
 		game:onTickEnd(function()
 			-- Collect objects
@@ -2524,7 +2524,7 @@ newEffect{
 		self.energy.value = 0
 	end,
 	deactivate = function(self, eff) --wake up vaulted npcs in LOS
-	  self:computeFOV(5, nil, 
+	  self:computeFOV(5, nil,
 		function(x, y, dx, dy, sqdist)
 			local act = game.level.map(x, y, Map.ACTOR)
 			if act then
@@ -2723,7 +2723,7 @@ newEffect{
 	on_lose = function(self, err) return "#Target# rearms.", "-Disarmed" end,
 	activate = function(self, eff)
 		self:removeEffect(self.EFF_COUNTER_ATTACKING) -- Cannot parry or counterattack while disarmed
-		self:removeEffect(self.EFF_DUAL_WEAPON_DEFENSE) 
+		self:removeEffect(self.EFF_DUAL_WEAPON_DEFENSE)
 		eff.tmpid = self:addTemporaryValue("disarmed", 1)
 	end,
 	deactivate = function(self, eff)
@@ -2778,7 +2778,7 @@ newEffect{
 		self:effectTemporaryValue(eff, "timestopping", 1)
 		self.no_leave_control = true
 		core.display.pauseAnims(true)
-		
+
 		-- clone protection
 		if self.player then
 			self:updateMainShader()
@@ -2787,7 +2787,7 @@ newEffect{
 	deactivate = function(self, eff)
 		self.no_leave_control = false
 		core.display.pauseAnims(false)
-		
+
 		-- clone protection
 		if self == game.player then
 			self:updateMainShader()
@@ -2891,7 +2891,7 @@ newEffect{
 	end,
 	callbackOnHit = function(self, eff, cb, src)
 		if cb.value <= 0 then return cb.value end
-		
+
 		local clones = {}
 		-- Find our clones
 		for i = 1, #eff.targets do
@@ -2900,7 +2900,7 @@ newEffect{
 				clones[#clones+1] = target
 			end
 		end
-		
+
 		-- Split the damage
 		if #clones > 0 and not self.turn_procs.temporal_fugue_damage_self and not self.turn_procs.temporal_fugue_damage_target then
 			self.turn_procs.temporal_fugue_damage_self = true
@@ -2915,15 +2915,15 @@ newEffect{
 					target.turn_procs.temporal_fugue_damage_target = nil
 				end
 			end
-			
+
 			self.turn_procs.temporal_fugue_damage_self = nil
 		end
-		
+
 		-- If we're the last clone remove the effect
 		if #clones <= 0 then
 			self:removeEffect(self.EFF_TEMPORAL_FUGUE)
 		end
-		
+
 		return cb.value
 	end,
 	on_timeout = function(self, eff)
@@ -2931,7 +2931,7 @@ newEffect{
 		if self.talents_cd[self.T_TEMPORAL_FUGUE] then
 			self.talents_cd[self.T_TEMPORAL_FUGUE] = self.talents_cd[self.T_TEMPORAL_FUGUE] + 1
 		end
-	
+
 		local alive = false
 		for i = 1, #eff.targets do
 			local target = eff.targets[i]
@@ -3086,11 +3086,11 @@ newEffect{
 newEffect{
 	name = "TWIST_FATE", image = "talents/twist_fate.png",
 	desc = "Twist Fate",
-	long_desc = function(self, eff) 
+	long_desc = function(self, eff)
 		local t = self:getTalentFromId(eff.talent)
-		return 
+		return
 		([[Currently Twisted Anomlay: %s
-		
+
 		%s]]):format(t.name or "none", t.info(self, t) or "none")
 	end,
 	type = "other",
@@ -3113,7 +3113,7 @@ newEffect{
 				-- manually use energy
 				local anom = self:getTalentFromId(eff.talent)
 				self:useEnergy(self:getTalentSpeed(anom) * game.energy_to_act)
-				
+
 				game:playSoundNear(self, "talents/dispel")
 				self:incParadox(-eff.paradox)
 			end
@@ -3464,17 +3464,17 @@ newEffect{
 	parameters = { power=1, dam=10, stacks = 0, max_stacks=10 },
 	on_merge = function(self, old_eff, new_eff)
 		old_eff.dur = new_eff.dur
-		
+
 		local stackCount = old_eff.stacks + new_eff.stacks
-		if stackCount >= old_eff.max_stacks then 
+		if stackCount >= old_eff.max_stacks then
 			stackCount = old_eff.max_stacks
 		end
-		
+
 		self:removeTemporaryValue("scoundrel_failure", old_eff.failid)
 		old_eff.failid = self:addTemporaryValue("scoundrel_failure", old_eff.cur_fail*stackCount)
-		
+
 		old_eff.stacks = stackCount
-		
+
 		return old_eff
 	end,
 	activate = function(self, eff)
@@ -3738,7 +3738,7 @@ newEffect{
 	name = "INTIMIDATED",
 	desc = "Intimidated",
 	long_desc = function(self, eff) return ("The target's morale is weakened, reducing its attack power, mind power, and spellpower by %d."):format(eff.power) end,
-	charges = function(self, eff) return math.round(eff.power) end,	
+	charges = function(self, eff) return math.round(eff.power) end,
 	type = "other",
 	subtype = { },
 	status = "detrimental",
@@ -3749,7 +3749,7 @@ newEffect{
 		eff.damid = self:addTemporaryValue("combat_dam", -eff.power)
 		eff.spellid = self:addTemporaryValue("combat_spellpower", -eff.power)
 		eff.mindid = self:addTemporaryValue("combat_mindpower", -eff.power)
-		game.level.map:particleEmitter(self.x, self.y, 1, "flame")	
+		game.level.map:particleEmitter(self.x, self.y, 1, "flame")
 	end,
 	deactivate = function(self, eff)
 		self:removeTemporaryValue("combat_dam", eff.damid)