From b48d3795edbb2ecddf5c2d1556643c2547fe4981 Mon Sep 17 00:00:00 2001
From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54>
Date: Sun, 29 Jul 2012 19:34:20 +0000
Subject: [PATCH] parts

git-svn-id: http://svn.net-core.org/repos/t-engine4@5388 51575b47-30f0-44d4-a5cc-537603b46e54
---
 game/engines/default/engine/Actor.lua         |   2 +-
 game/modules/tome/class/Actor.lua             |   2 +-
 .../data/gfx/particles/discharge_bolt.lua     |  51 ++++++++++++++++
 .../data/gfx/particles/distortion_trail.lua   |  57 ++++++++++++++++++
 .../tome/data/gfx/particles/generic_blast.lua |  53 ++++++++++++++++
 .../data/gfx/particles/generic_charge.lua     |  51 ++++++++++++++++
 .../data/gfx/particles/generic_discharge.lua  |  50 +++++++++++++++
 .../tome/data/gfx/particles/generic_power.lua |  50 +++++++++++++++
 .../data/gfx/particles/generic_teleport.lua   |  47 +++++++++++++++
 .../data/gfx/particles/generic_vortex.lua     |  48 +++++++++++++++
 .../tome/data/gfx/particles/shader_shield.lua |   2 +-
 .../data/gfx/particles_images/shield3.png     | Bin 0 -> 14285 bytes
 .../modules/tome/data/timed_effects/other.lua |  24 ++++++--
 13 files changed, 428 insertions(+), 9 deletions(-)
 create mode 100644 game/modules/tome/data/gfx/particles/discharge_bolt.lua
 create mode 100644 game/modules/tome/data/gfx/particles/distortion_trail.lua
 create mode 100644 game/modules/tome/data/gfx/particles/generic_blast.lua
 create mode 100644 game/modules/tome/data/gfx/particles/generic_charge.lua
 create mode 100644 game/modules/tome/data/gfx/particles/generic_discharge.lua
 create mode 100644 game/modules/tome/data/gfx/particles/generic_power.lua
 create mode 100644 game/modules/tome/data/gfx/particles/generic_teleport.lua
 create mode 100644 game/modules/tome/data/gfx/particles/generic_vortex.lua
 create mode 100644 game/modules/tome/data/gfx/particles_images/shield3.png

diff --git a/game/engines/default/engine/Actor.lua b/game/engines/default/engine/Actor.lua
index 4a830e6c2a..3aa9db72bd 100644
--- a/game/engines/default/engine/Actor.lua
+++ b/game/engines/default/engine/Actor.lua
@@ -142,7 +142,7 @@ function _M:defineDisplayCallback()
 		end
 	end
 
-	if self._mo == self._last_mo then
+	if self._mo == self._last_mo or not self._last_mo then
 		self._mo:displayCallback(function(x, y, w, h)
 			tactical(x, y, w, h)
 			particles(x, y, w, h)
diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua
index 504099b9fb..f3624c5abe 100644
--- a/game/modules/tome/class/Actor.lua
+++ b/game/modules/tome/class/Actor.lua
@@ -874,7 +874,7 @@ function _M:defineDisplayCallback()
 		end
 	end
 
-	if self._mo == self._last_mo then
+	if self._mo == self._last_mo or not self._last_mo then
 		self._mo:displayCallback(function(x, y, w, h, zoom, on_map)
 			tactical(x, y, w, h, zoom, on_map)
 			particles(x, y, w, h, zoom, on_map)
diff --git a/game/modules/tome/data/gfx/particles/discharge_bolt.lua b/game/modules/tome/data/gfx/particles/discharge_bolt.lua
new file mode 100644
index 0000000000..c2bf2d34d0
--- /dev/null
+++ b/game/modules/tome/data/gfx/particles/discharge_bolt.lua
@@ -0,0 +1,51 @@
+-- ToME - Tales of Maj'Eyal
+-- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+return { generator = function()
+	local radius = 0
+	local sradius = (radius + 0.5) * (engine.Map.tile_w + engine.Map.tile_h) / 2
+	local ad = rng.float(0, 360)
+	local a = math.rad(ad + 180)
+	local r = rng.float(0, sradius / 4)
+	local x = r * math.cos(a)
+	local y = r * math.sin(a)
+	local bx = math.floor(x / engine.Map.tile_w)
+	local by = math.floor(y / engine.Map.tile_h)
+	local static = rng.percent(40)
+
+	return {
+		trail = 1,
+		life = 2,
+		size = 12, sizev = 0, sizea = 0,
+
+		x = x, xv = 0, xa = 0,
+		y = y, yv = 0, ya = 0,
+		dir = a, dirv = 0, dira = 0,
+		vel = sradius / 2 / 24, velv = 0, vela = 0,
+
+		r = rng.range(255, 255)/255,  rv = 0, ra = 0,
+		g = rng.range(180, 230)/255,  gv = 0, ga = 0,
+		b = 0,                        bv = 0, ba = 0,
+		a = rng.range(25, 220)/255,   av = 0, aa = 0,
+	}
+end, },
+function(self)
+	self.ps:emit(5)
+end,
+5*2
\ No newline at end of file
diff --git a/game/modules/tome/data/gfx/particles/distortion_trail.lua b/game/modules/tome/data/gfx/particles/distortion_trail.lua
new file mode 100644
index 0000000000..d7dd3c719c
--- /dev/null
+++ b/game/modules/tome/data/gfx/particles/distortion_trail.lua
@@ -0,0 +1,57 @@
+-- ToME - Tales of Maj'Eyal
+-- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+local nb = 0
+
+return { generator = function()
+	local radius = 0
+	local sradius = (radius + 0.5) * (engine.Map.tile_w + engine.Map.tile_h) / 2
+	local ad = rng.float(0, 360)
+	local a = math.rad(ad)
+	local r = rng.float(0.1, sradius / 2)
+	local x = r * math.cos(a)
+	local y = r * math.sin(a)
+	local bx = math.floor(x / engine.Map.tile_w)
+	local by = math.floor(y / engine.Map.tile_h)
+	local static = rng.percent(40)
+	
+	return {
+		trail = 1,
+		life = 3 + 9 * (sradius - r) / sradius,
+		size = 3, sizev = 0, sizea = 0,
+
+		x = x, xv = 0, xa = 0,
+		y = y, yv = 0, ya = 0,
+		dir = 0, dirv = 0, dira = 0,
+		vel = 0, velv = 0, vela = 0,
+
+
+		r = rng.range(255, 255)/255, 		rv = 0.005, ra = 0.0005,
+		g = rng.range(180, 255)/255,	 	gv = 0.005, ga = 0.0005,
+		b = rng.range(180, 255)/255,		bv = 0.005, ba = 0.0005,
+		a = rng.range(200, 255)/255,  		av = static and -0.034 or 0, aa = 0.005,
+	}
+end, },
+function(self)
+	if nb < 1 then
+		self.ps:emit(40)
+	end
+	nb = nb + 1
+end,
+40
diff --git a/game/modules/tome/data/gfx/particles/generic_blast.lua b/game/modules/tome/data/gfx/particles/generic_blast.lua
new file mode 100644
index 0000000000..c21094610a
--- /dev/null
+++ b/game/modules/tome/data/gfx/particles/generic_blast.lua
@@ -0,0 +1,53 @@
+-- ToME - Tales of Middle-Earth
+-- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+base_size = 32
+
+local first = true
+
+return { generator = function()
+	local life = rng.range(20, 40)
+	local size = rng.range(4, 8)
+	local alpha = rng.range(100, 200) / 255
+	local angle = math.rad(rng.range(0, 360))
+	local distance = engine.Map.tile_w * rng.float(0.5, radius)
+	local vel = distance / life / 0.75
+	
+	return {
+		trail = 1,
+		life = life,
+		size = size, sizev = size / life / 3, sizea = 0,
+
+		x = -size / 2, xv = 0, xa = 0,
+		y = -size / 2, yv = 0, ya = 0,
+		dir = angle, dirv = 0, dira = 0,
+		vel = vel, velv = -vel / life / 2, vela = 0,
+
+		r = rng.range(rm, rM)/255,	rv = 0, ra = 0,
+		g = rng.range(gm, gM)/255,	gv = 0, ga = 0,
+		b = rng.range(bm, bM)/255,	bv = 0, ba = 0,
+		a = rng.range(am, aM)/255,  av = -alpha / life / 2, aa = 0,
+	}
+end, },
+function(self)
+	if first then
+		self.ps:emit(100 * radius)
+		first = false
+	end
+end,
+100 * radius * 60
\ No newline at end of file
diff --git a/game/modules/tome/data/gfx/particles/generic_charge.lua b/game/modules/tome/data/gfx/particles/generic_charge.lua
new file mode 100644
index 0000000000..fb1a5f9861
--- /dev/null
+++ b/game/modules/tome/data/gfx/particles/generic_charge.lua
@@ -0,0 +1,51 @@
+-- ToME - Tales of Maj'Eyal
+-- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+base_size = 32
+
+return { generator = function()
+	local life = rng.range(10, 20)
+	local size = rng.range(15, 20)
+	local angle = math.rad(rng.range(0, 360))
+	local distance = engine.Map.tile_w * rng.float(2, 2.5)
+	local vel = distance / life
+
+	return {
+		trail = 1,
+		life = life,
+		size = size, sizev = 0.2, sizea = 0,
+
+		x = -size / 2 + distance * math.cos(angle), xv = 0, xa = 0,
+		y = -size / 2 + distance * math.sin(angle), yv = 0, ya = 0,
+		dir = angle, dirv = 0, dira = 0,
+		vel = -vel, velv = 0, vela = 0,
+
+		r = rng.range(rm, rM)/255, 		rv = 0, ra = 0,
+		g = rng.range(gm, gM)/255,		gv = 0, ga = 0,
+		b = rng.range(bm, bM)/255,		bv = 0, ba = 0,
+		a = rng.range(am, aM)/255, 		av = 0.01, aa = 0,
+	}
+end, },
+function(self)
+	self.nb = (self.nb or 0) + 1
+	if self.nb < 6 then
+		self.ps:emit(10)
+	end
+end,
+120
diff --git a/game/modules/tome/data/gfx/particles/generic_discharge.lua b/game/modules/tome/data/gfx/particles/generic_discharge.lua
new file mode 100644
index 0000000000..7aa2fd0740
--- /dev/null
+++ b/game/modules/tome/data/gfx/particles/generic_discharge.lua
@@ -0,0 +1,50 @@
+-- ToME - Tales of Maj'Eyal
+-- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+base_size = 32
+
+return { generator = function()
+	local ad = rng.range(0, 360)
+	local a = math.rad(ad + 15)
+	local dir = math.rad(ad)
+	local r = rng.range(12, 20)
+
+	return {
+		trail = 1,
+		life = 5,
+		size = 10, sizev = 0.08, sizea = 0,
+
+		x = r * math.cos(a), xv = 0, xa = 0,
+		y = r * math.sin(a), yv = 0, ya = 0,
+		dir = dir, dirv = math.rad(3), dira = math.rad(3) / 3,
+		vel = 1.4, velv = 0, vela = 0,
+
+		r = rng.range(rm, rM)/255,  rv = 0, ra = 0,
+		g = rng.range(gm, gM)/255,  gv = 0, ga = 0,
+		b = rng.range(bm, bM)/255,  bv = 0, ba = 0,
+		a = rng.range(am, aM)/255,  av = 0, aa = 0,
+	}
+end, },
+function(self)
+	self.nb = (self.nb or 0) + 1
+	if self.nb < 4 then
+		self.ps:emit(20)
+	end
+end,
+800
\ No newline at end of file
diff --git a/game/modules/tome/data/gfx/particles/generic_power.lua b/game/modules/tome/data/gfx/particles/generic_power.lua
new file mode 100644
index 0000000000..75aa564bd0
--- /dev/null
+++ b/game/modules/tome/data/gfx/particles/generic_power.lua
@@ -0,0 +1,50 @@
+-- ToME - Tales of Maj'Eyal
+-- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+base_size = 32
+
+return { generator = function()
+	local ad = rng.range(0, 360)
+	local a = math.rad(ad)
+	local dir = math.rad(90)
+	local r = rng.range(18, 22)
+	local dirchance = rng.chance(2)
+	local x = rng.range(-16, 16)
+	local y = 16 - math.abs(math.sin(x / 16) * 8)
+
+	return {
+		trail = 1,
+		life = rng.range(10, 18),
+		size = rng.range(2, 3), sizev = 0, sizea = 0.005,
+
+		x = x, xv = 0, xa = 0,
+		y = y, yv = 0, ya = -0.2,
+		dir = 0, dirv = 0, dira = 0,
+		vel = 0, velv = 0, vela = 0,
+
+		r = rng.range(rm, rM)/255, 		rv = 0, ra = 0,
+		g = rng.range(gm, gM)/255, 		gv = 0, ga = 0,
+		b = rng.range(bm, bM)/255,  	bv = 0, ba = 0,
+		a = rng.range(am, aM)/255,   	av = 0, aa = 0,
+	}
+end, },
+function(self)
+	self.ps:emit(4)
+end,
+40
diff --git a/game/modules/tome/data/gfx/particles/generic_teleport.lua b/game/modules/tome/data/gfx/particles/generic_teleport.lua
new file mode 100644
index 0000000000..d1c7eb4525
--- /dev/null
+++ b/game/modules/tome/data/gfx/particles/generic_teleport.lua
@@ -0,0 +1,47 @@
+-- ToME - Tales of Maj'Eyal
+-- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+base_size = 32
+
+return { generator = function()
+	local ad = rng.float(0, 360)
+	local dir = math.rad(ad)
+
+	return {
+		x = math.cos(dir) * 5, y = math.sin(dir) * 5,
+		dir = dir, vel = rng.float(1, 3),
+
+		life = rng.range(20, 30),
+		size = rng.range(3, 7), sizev = 0, sizea = 0,
+
+	r = rng.range(rm, rM)/255,	rv = 0, ra = 0,
+	g = rng.range(gm, gM)/255,	gv = 0, ga = 0.,
+	b = rng.range(bm, bM)/255,	bv = 0, ba = 0,
+	a = rng.range(am, aM)/255,	av = 0, aa = 0.005,
+	}
+
+end, },
+function(self)
+	self.nb = (self.nb or 0) + 1
+	if self.nb < 6 then
+		self.ps:emit(50)
+	end
+end,
+300
+
diff --git a/game/modules/tome/data/gfx/particles/generic_vortex.lua b/game/modules/tome/data/gfx/particles/generic_vortex.lua
new file mode 100644
index 0000000000..b79b9a6264
--- /dev/null
+++ b/game/modules/tome/data/gfx/particles/generic_vortex.lua
@@ -0,0 +1,48 @@
+-- ToME - Tales of Maj'Eyal
+-- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+return { generator = function()
+	local radius = radius
+	local sradius = (radius + 0.5) * (engine.Map.tile_w + engine.Map.tile_h) / 2
+	local ad = rng.range(0, 360)
+	local a = math.rad(ad)
+	local dir = math.rad(ad + 60)
+	local r = rng.float(0, sradius)
+	local dirv = math.rad(3)
+
+	return {
+		trail = 1,
+		life = 2,
+		size = 4, sizev = 0, sizea = 0,
+
+		x = r * math.cos(a), xv = 0, xa = 0,
+		y = r * math.sin(a), yv = 0, ya = 0,
+		dir = dir, dirv = 0, dira = 0,
+		vel = -r/8, velv = 0, vela = 0,
+
+		r = rng.range(rm, rM)/255,  		rv = 0.005, ra = 0.0005,
+		g = rng.range(gm, gM)/255, 	 		gv = 0.005, ga = 0.0005,
+		b = rng.range(bm, bM)/255, 			bv = 0.005, ba = 0.0005,
+		a = rng.range(am, aM)/255, 	 	  	av = 0, aa = 0.005,
+	}
+end, },
+function(self)
+	self.ps:emit(500*radius)
+end,
+500*radius*2
\ No newline at end of file
diff --git a/game/modules/tome/data/gfx/particles/shader_shield.lua b/game/modules/tome/data/gfx/particles/shader_shield.lua
index 211fbb36a5..d50e5d57fc 100644
--- a/game/modules/tome/data/gfx/particles/shader_shield.lua
+++ b/game/modules/tome/data/gfx/particles/shader_shield.lua
@@ -45,4 +45,4 @@ function(self)
 	self.ps:emit(1)
 end,
 1,
-"particles_images/shield2"
+"particles_images/"..(img or "shield2")
diff --git a/game/modules/tome/data/gfx/particles_images/shield3.png b/game/modules/tome/data/gfx/particles_images/shield3.png
new file mode 100644
index 0000000000000000000000000000000000000000..5eabed7968e7b8933f834dfb4f1e42ae3bdfe4cd
GIT binary patch
literal 14285
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

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/timed_effects/other.lua b/game/modules/tome/data/timed_effects/other.lua
index 3e5e127155..e365f2d550 100644
--- a/game/modules/tome/data/timed_effects/other.lua
+++ b/game/modules/tome/data/timed_effects/other.lua
@@ -113,6 +113,14 @@ newEffect{
 	on_aegis = function(self, eff, aegis)
 		self.time_shield_absorb = self.time_shield_absorb + eff.power * aegis / 100
 	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
+			local r = -rng.float(0.2, 0.4)
+			local a = math.atan2(src.y - self.y, src.x - self.x)
+			eff.particle._shader:setUniform("impact", {math.cos(a) * r, math.sin(a) * r})
+			eff.particle._shader:setUniform("impact_tick", core.game.getTime())
+		end
+	end,
 	activate = function(self, eff)
 		if self:attr("shield_factor") then eff.power = eff.power * (100 + self:attr("shield_factor")) / 100 end
 		if self:attr("shield_dur") then eff.dur = eff.dur + self:attr("shield_dur") end
@@ -121,7 +129,11 @@ newEffect{
 		--- Warning there can be only one time shield active at once for an actor
 		self.time_shield_absorb = eff.power
 		self.time_shield_absorb_max = eff.power
-		eff.particle = self:addParticles(Particles.new("time_shield_bubble", 1))
+		if core.shader.active() then
+			eff.particle = self:addParticles(Particles.new("shader_shield", 1, {img="shield3"}, {type="shield", time_factor=2000, color={1, 1, 0.3}}))
+		else
+			eff.particle = self:addParticles(Particles.new("time_shield_bubble", 1))
+		end
 	end,
 	deactivate = function(self, eff)
 		self:removeTemporaryValue("reduce_status_effects_time", eff.durid)
@@ -1594,13 +1606,13 @@ newEffect{
 		if eff.target:attr("lucid_dreamer") then
 			spawn_time = 2
 		end
-		if eff.dur%spawn_time == 0 then 
+		if eff.dur%spawn_time == 0 then
 			local x, y = util.findFreeGrid(eff.target.x, eff.target.y, 1, true, {[Map.ACTOR]=true})
 			if not x then
 				game.logPlayer(self, "Not enough space to summon!")
 				return
 			end
-			
+
 			-- Create a clone for later spawning
 			local m = require("mod.class.NPC").new(eff.target:clone{
 				shader = "shadow_simulacrum",
@@ -1642,7 +1654,7 @@ newEffect{
 			m.no_timeflow = m.no_timeflow - 1
 			m.status_effect_immune = m.status_effect_immune - 1
 			m:removeParticles(eff.particle)
-			
+
 			-- track number killed
 			m.on_die = function(self, who)
 				if who then
@@ -1650,7 +1662,7 @@ newEffect{
 					p.projections_killed = p.projections_killed + 1
 				end
 			end
-			
+
 			game.zone:addEntity(game.level, m, "actor", x, y)
 			game.level.map:particleEmitter(x, y, 1, "generic_teleport", {rm=0, rM=0, gm=180, gM=255, bm=180, bM=255, am=35, aM=90})
 
@@ -1756,7 +1768,7 @@ newEffect{
 			game.level.map:recreate()
 
 			game.logPlayer(game.player, "#LIGHT_BLUE#You are brought back from the Dreamscape!")
-			
+
 			-- Apply Dreamscape hit
 			if eff.projections_killed > 0 then
 				eff.target:takeHit(eff.target.max_life/5 * eff.projections_killed, self)
-- 
GitLab