From a89944387d7cc1c6351d08c770634b316c01ab62 Mon Sep 17 00:00:00 2001
From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54>
Date: Wed, 27 Jun 2012 16:58:29 +0000
Subject: [PATCH] Spinning beam trap now does not increase damage when stepped
 upon but instead switches damage type. All possible damage types now have a
 special effect

git-svn-id: http://svn.net-core.org/repos/t-engine4@5304 51575b47-30f0-44d4-a5cc-537603b46e54
---
 game/modules/tome/data/damage_types.lua       | 18 ++++++++++++++
 .../tome/data/general/traps/complex.lua       | 24 +++++++++++++++----
 2 files changed, 37 insertions(+), 5 deletions(-)

diff --git a/game/modules/tome/data/damage_types.lua b/game/modules/tome/data/damage_types.lua
index bc2ee0fbac..f43952c8cb 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 6ef1c6ca6e..f7c404c271 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,
-- 
GitLab