diff --git a/game/modules/tome/data/damage_types.lua b/game/modules/tome/data/damage_types.lua
index bc2ee0fbac04bbd89ad4b936bfe9b5512d96f7c4..f43952c8cb5294313aaac901d9bc86e18d7b748e 100644
--- a/game/modules/tome/data/damage_types.lua
+++ b/game/modules/tome/data/damage_types.lua
@@ -534,6 +534,23 @@ newDamageType{
 	end,
 }
 
+-- Silence
+newDamageType{
+	name = "arcane silence", type = "ARCANE_SILENCE",
+	projector = function(src, x, y, type, dam)
+		local target = game.level.map(x, y, Map.ACTOR)
+		local realdam = DamageType:get(DamageType.ARCANE).projector(src, x, y, DamageType.ARCANE, dam)
+		if target then
+			if target:canBe("silence") then
+				target:setEffect(target.EFF_SILENCED, 3, {apply_power=src:combatSpellpower()})
+			else
+				game.logSeen(target, "%s resists!", target.name:capitalize())
+			end
+		end
+		return realdam
+	end,
+}
+
 -- Silence
 newDamageType{
 	name = "% chance to silence target", type = "RANDOM_SILENCE",
@@ -738,6 +755,7 @@ newDamageType{
 newDamageType{
 	name = "coldnevermove", type = "COLDNEVERMOVE",
 	projector = function(src, x, y, type, dam)
+		if _G.type(dam) == "number" then dam = {dam=dam, dur=4} end
 		DamageType:get(DamageType.COLD).projector(src, x, y, DamageType.COLD, dam.dam)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
diff --git a/game/modules/tome/data/general/traps/complex.lua b/game/modules/tome/data/general/traps/complex.lua
index 6ef1c6ca6ed0de4399a0d47890caad0e4bb696ac..f7c404c2714c8d1b10265d6ee8386b1cde02e441 100644
--- a/game/modules/tome/data/general/traps/complex.lua
+++ b/game/modules/tome/data/general/traps/complex.lua
@@ -17,6 +17,8 @@
 -- Nicolas Casalini "DarkGod"
 -- darkgod@te4.org
 
+local DamageType = require "engine.DamageType"
+
 newEntity{ define_as = "TRAP_COMPLEX",
 	type = "complex", id_by_type=true, unided_name = "trap",
 	display = '^',
@@ -73,11 +75,10 @@ newEntity{ base = "TRAP_COMPLEX",
 	detect_power = resolvers.mbonus(40, 5), disarm_power = resolvers.mbonus(50, 10),
 	rarity = 3, level_range = {1, nil},
 	color=colors.PURPLE,
-	message = "@Target@ walks on a trap, the beam intensifies.",
+	message = "@Target@ walks on a trap, the beam changes.",
 	on_added = function(self, level, x, y)
 		self.x, self.y = x, y
 		self.rad = rng.range(2, 8)
-		self.max_dam = self.dam * 2.5
 		local tries = {}
 		local list = {i=1}
 		local sa = rng.range(0, 359)
@@ -94,10 +95,17 @@ newEntity{ base = "TRAP_COMPLEX",
 		game.level:addEntity(self)
 		self.on_added = nil
 	end,
+	dammode = rng.table{engine.DamageType.ARCANE_SILENCE, engine.DamageType.DARKSTUN, engine.DamageType.COLDNEVERMOVE},
 	all_know = true,
 	dam = resolvers.mbonus_level(300, 5),
+	mag = resolvers.mbonus(200, 30),
+	combatSpellpower = function(self) return mod.class.interface.Combat:rescaleCombatStats(self.mag) end,
 	triggered = function(self, x, y, who)
-		if self:reactionToward(who) < 0 and not who.summoner then self.dam = math.min(self.dam * 1.5, self.max_dam) end
+		if self:reactionToward(who) < 0 then
+			local dammode = self.dammode
+			while dammode == self.dammode do dammode = rng.table{engine.DamageType.ARCANE_SILENCE, engine.DamageType.DARKSTUN, engine.DamageType.COLDNEVERMOVE} end
+			self.dammode = dammode
+		end
 		return true
 	end,
 	disarmed = function(self, x, y, who)
@@ -110,9 +118,15 @@ newEntity{ base = "TRAP_COMPLEX",
 		self.list.i = util.boundWrap(self.list.i + 1, 1, #self.list)
 
 		local tg = {type="beam", range=self.rad, friendlyfire=false}
-		self:project(tg, x, y, engine.DamageType.ARCANE, self.dam, nil)
+		self:project(tg, x, y, self.dammode, self.dam, nil)
 		local _ _, x, y = self:canProject(tg, x, y)
-		game.level.map:particleEmitter(self.x, self.y, math.max(math.abs(x-self.x), math.abs(y-self.y)), "mana_beam", {tx=x-self.x, ty=y-self.y})
+		if self.dammode == engine.DamageType.ARCANE_SILENCE then
+			game.level.map:particleEmitter(self.x, self.y, math.max(math.abs(x-self.x), math.abs(y-self.y)), "mana_beam", {tx=x-self.x, ty=y-self.y})
+		elseif self.dammode == engine.DamageType.DARKSTUN then
+			game.level.map:particleEmitter(self.x, self.y, math.max(math.abs(x-self.x), math.abs(y-self.y)), "dark_lightning", {tx=x-self.x, ty=y-self.y})
+		elseif self.dammode == engine.DamageType.COLDNEVERMOVE then
+			game.level.map:particleEmitter(self.x, self.y, math.max(math.abs(x-self.x), math.abs(y-self.y)), "icebeam", {tx=x-self.x, ty=y-self.y})
+		end
 
 		self:useEnergy()
 	end,