From eb5671d947c1384b5fcba05ce1f7875e21116a8f Mon Sep 17 00:00:00 2001
From: DarkGod <darkgod@net-core.org>
Date: Mon, 22 Jul 2013 14:25:07 +0200
Subject: [PATCH] New Uttercold visuals

---
 game/modules/tome/data/birth/classes/mage.lua |   5 +-
 .../gfx/particles/shader_ring_rotating.lua    |   2 +-
 .../tome/data/gfx/particles/shader_wings.lua  |   4 +-
 .../gfx/particles_images/arcanegeneric.png    | Bin 0 -> 6934 bytes
 .../data/gfx/particles_images/coldgeneric.png | Bin 0 -> 11675 bytes
 .../gfx/particles_images/flamesgeneric.png    | Bin 0 -> 5187 bytes
 .../data/gfx/shaders/circular_flames.frag     | 187 ++++++++++++++++++
 .../tome/data/gfx/shaders/circular_flames.lua |  30 +++
 game/modules/tome/data/talents/spells/ice.lua |  22 ++-
 .../tome/data/talents/spells/wildfire.lua     |   2 +-
 .../modules/tome/data/timed_effects/other.lua |  11 +-
 .../tome/data/zones/town-angolwen/npcs.lua    |   1 +
 12 files changed, 247 insertions(+), 17 deletions(-)
 create mode 100644 game/modules/tome/data/gfx/particles_images/arcanegeneric.png
 create mode 100644 game/modules/tome/data/gfx/particles_images/coldgeneric.png
 create mode 100644 game/modules/tome/data/gfx/particles_images/flamesgeneric.png
 create mode 100644 game/modules/tome/data/gfx/shaders/circular_flames.frag
 create mode 100644 game/modules/tome/data/gfx/shaders/circular_flames.lua

diff --git a/game/modules/tome/data/birth/classes/mage.lua b/game/modules/tome/data/birth/classes/mage.lua
index 786ff5dc95..0a22ca8675 100644
--- a/game/modules/tome/data/birth/classes/mage.lua
+++ b/game/modules/tome/data/birth/classes/mage.lua
@@ -137,7 +137,10 @@ newBirthDescriptor{
 			end
 		end,
 		function(actor)
-			if core.shader.active(4) then actor:addParticles(Particles.new("shader_ring_rotating", 1, {rotation=-0.2, radius=1.1}, {type="sparks", hide_center=0, time_factor=40000, color1={0, 0, 1, 1}, color2={0, 1, 1, 1}, zoom=0.5, xy={0, 0}}))
+			if core.shader.active(4) then 
+				local p1 = actor:addParticles(Particles.new("shader_ring_rotating", 1, {rotation=0, radius=1.1, img="coldgeneric"}, {type="circular_flames", ellipsoidalFactor={1,2}, time_factor=22000, noup=2.0}))
+				p1.toback = true
+				actor:addParticles(Particles.new("shader_ring_rotating", 1, {rotation=0, radius=1.1, img="coldgeneric"}, {type="circular_flames", ellipsoidalFactor={1,2}, time_factor=22000, noup=1.0}))
 			else actor:addParticles(Particles.new("uttercold", 1))
 			end
 		end,
diff --git a/game/modules/tome/data/gfx/particles/shader_ring_rotating.lua b/game/modules/tome/data/gfx/particles/shader_ring_rotating.lua
index a95900ba25..efa58dccb1 100644
--- a/game/modules/tome/data/gfx/particles/shader_ring_rotating.lua
+++ b/game/modules/tome/data/gfx/particles/shader_ring_rotating.lua
@@ -46,4 +46,4 @@ end, },
 function(self)
 	self.ps:emit(1)
 end,
-1, "particles_images/square", true
+1, "particles_images/"..(img or "square"), true
diff --git a/game/modules/tome/data/gfx/particles/shader_wings.lua b/game/modules/tome/data/gfx/particles/shader_wings.lua
index bf804789c4..cfc8ebbf02 100644
--- a/game/modules/tome/data/gfx/particles/shader_wings.lua
+++ b/game/modules/tome/data/gfx/particles/shader_wings.lua
@@ -33,8 +33,8 @@ return { generator = function()
 		life = life or 10,
 		size = 64 * (size_factor or 1), sizev = 0, sizea = 0,
 
-		x = 0, xv = 0, xa = 0,
-		y = -25, yv = 0, ya = 0,
+		x = x or 0, xv = 0, xa = 0,
+		y = y or -25, yv = 0, ya = 0,
 		dir = 0, dirv = dirv, dira = 0,
 		vel = 0, velv = 0, vela = 0,
 
diff --git a/game/modules/tome/data/gfx/particles_images/arcanegeneric.png b/game/modules/tome/data/gfx/particles_images/arcanegeneric.png
new file mode 100644
index 0000000000000000000000000000000000000000..b1adab9a419ce66453e450beb807c2371a84ef07
GIT binary patch
literal 6934
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

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/particles_images/coldgeneric.png b/game/modules/tome/data/gfx/particles_images/coldgeneric.png
new file mode 100644
index 0000000000000000000000000000000000000000..331b605b7625b0577ed873f45a50feda99bfde75
GIT binary patch
literal 11675
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

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/particles_images/flamesgeneric.png b/game/modules/tome/data/gfx/particles_images/flamesgeneric.png
new file mode 100644
index 0000000000000000000000000000000000000000..81ff285cd73ed0e6c405d1a327f7bfc5be9b8fcf
GIT binary patch
literal 5187
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

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/shaders/circular_flames.frag b/game/modules/tome/data/gfx/shaders/circular_flames.frag
new file mode 100644
index 0000000000..26b3491566
--- /dev/null
+++ b/game/modules/tome/data/gfx/shaders/circular_flames.frag
@@ -0,0 +1,187 @@
+uniform sampler2D tex;
+uniform float tick;
+uniform vec3 color;
+uniform float time_factor;
+uniform float noup = 0.0;
+
+uniform vec2 ellipsoidalFactor = vec2(1.0, 1.0); //(1.0, 1.0) is perfect circle, (2.0, 1.0) is vertical ellipse, (1.0, 2.0) is horizontal ellipse
+
+	
+vec4 permute( vec4 x ) {
+
+	return mod( ( ( x * 34.0 ) + 1.0 ) * x, 289.0 );
+
+} 
+
+vec4 taylorInvSqrt( vec4 r ) {
+
+	return 1.79284291400159 - 0.85373472095314 * r;
+
+}
+
+float snoise( vec3 v ) {
+
+	const vec2 C = vec2( 1.0 / 6.0, 1.0 / 3.0 );
+	const vec4 D = vec4( 0.0, 0.5, 1.0, 2.0 );
+
+	// First corner
+
+	vec3 i  = floor( v + dot( v, C.yyy ) );
+	vec3 x0 = v - i + dot( i, C.xxx );
+
+	// Other corners
+
+	vec3 g = step( x0.yzx, x0.xyz );
+	vec3 l = 1.0 - g;
+	vec3 i1 = min( g.xyz, l.zxy );
+	vec3 i2 = max( g.xyz, l.zxy );
+
+	vec3 x1 = x0 - i1 + 1.0 * C.xxx;
+	vec3 x2 = x0 - i2 + 2.0 * C.xxx;
+	vec3 x3 = x0 - 1. + 3.0 * C.xxx;
+
+	// Permutations
+
+	i = mod( i, 289.0 );
+	vec4 p = permute( permute( permute(
+		i.z + vec4( 0.0, i1.z, i2.z, 1.0 ) )
+		+ i.y + vec4( 0.0, i1.y, i2.y, 1.0 ) )
+		+ i.x + vec4( 0.0, i1.x, i2.x, 1.0 ) );
+
+	// Gradients
+	// ( N*N points uniformly over a square, mapped onto an octahedron.)
+
+	float n_ = 1.0 / 7.0; // N=7
+
+	vec3 ns = n_ * D.wyz - D.xzx;
+
+	vec4 j = p - 49.0 * floor( p * ns.z *ns.z );  //  mod(p,N*N)
+
+	vec4 x_ = floor( j * ns.z );
+	vec4 y_ = floor( j - 7.0 * x_ );    // mod(j,N)
+
+	vec4 x = x_ *ns.x + ns.yyyy;
+	vec4 y = y_ *ns.x + ns.yyyy;
+	vec4 h = 1.0 - abs( x ) - abs( y );
+
+	vec4 b0 = vec4( x.xy, y.xy );
+	vec4 b1 = vec4( x.zw, y.zw );
+
+
+	vec4 s0 = floor( b0 ) * 2.0 + 1.0;
+	vec4 s1 = floor( b1 ) * 2.0 + 1.0;
+	vec4 sh = -step( h, vec4( 0.0 ) );
+
+	vec4 a0 = b0.xzyw + s0.xzyw * sh.xxyy;
+	vec4 a1 = b1.xzyw + s1.xzyw * sh.zzww;
+
+	vec3 p0 = vec3( a0.xy, h.x );
+	vec3 p1 = vec3( a0.zw, h.y );
+	vec3 p2 = vec3( a1.xy, h.z );
+	vec3 p3 = vec3( a1.zw, h.w );
+
+	// Normalise gradients
+
+	vec4 norm = taylorInvSqrt( vec4( dot( p0, p0 ), dot( p1, p1 ), dot( p2, p2 ), dot( p3, p3 ) ) );
+	p0 *= norm.x;
+	p1 *= norm.y;
+	p2 *= norm.z;
+	p3 *= norm.w;
+
+	// Mix final noise value
+
+	vec4 m = max( 0.6 - vec4( dot( x0, x0 ), dot( x1, x1 ), dot( x2, x2 ), dot( x3, x3 ) ), 0.0 );
+	m = m * m;
+	return 42.0 * dot( m*m, vec4( dot( p0, x0 ), dot( p1, x1 ),
+		dot( p2, x2 ), dot( p3, x3 ) ) );
+
+}  
+
+vec2 snoise2(vec3 pos)
+{
+	return vec2(snoise(pos), snoise(pos + vec3(0.0, 0.0, 1.0)));
+}
+
+float GetFireDelta(float currTime, vec2 pos, float freqMult, float stretchMult, float scrollSpeed, float evolutionSpeed)
+{
+	//firewall
+	float delta = 0;
+//	pos.y += (1.0 - pos.y) * 0.5;
+	//pos.y += 0.5;
+	pos.y /= stretchMult;
+	pos *= freqMult;
+	pos.y += currTime * scrollSpeed;
+//	pos.y -= currTime * 3.0;
+	
+	delta += snoise(vec3(pos * 1.0, currTime * 1.0 * evolutionSpeed)) * 1.5;
+	delta += snoise(vec3(pos * 2.0, currTime * 2.0 * evolutionSpeed)) * 1.5;
+	delta += snoise(vec3(pos * 4.0, currTime * 4.0 * evolutionSpeed)) * 1.5;	
+	delta += snoise(vec3(pos * 8.0, currTime * 8.0 * evolutionSpeed)) * 1.5;
+	delta += snoise(vec3(pos * 16.0, currTime * 16.0 * evolutionSpeed)) * 0.5;
+
+	return delta;
+}
+vec4 GetFireColor(float currTime, vec2 pos, float freqMult, float stretchMult, float ampMult)
+{
+	float delta = GetFireDelta(currTime, pos, freqMult, stretchMult, 3.0, 0.1);
+	delta *= min(1.0, max(0.0, 1.0 * (1.0 - pos.y)));
+	delta *= min(1.0, max(0.0, 1.0 * (0.0 + pos.y)));
+	vec2 displacedPoint = pos + vec2(0, delta * ampMult);
+	displacedPoint.y = min(0.99, displacedPoint.y);
+	displacedPoint.y = max(0.01, displacedPoint.y);
+	
+	return texture2D(tex, displacedPoint);
+}
+
+vec4 GetFireRingColor(float currTime, vec2 pos, float freqMult, float stretchMult, float ampMult, float power, float radius1, float radius2, float scrollSpeed, float paletteCoord)
+{
+	float pi = 3.141592;
+	float ang = atan(pos.y, pos.x) + pi;
+	
+	vec2 planarPos = vec2(ang / (2.0 * pi), 1.0 - (length(pos) - radius1) / (radius2 - radius1));
+	planarPos.y = pow(abs(planarPos.y), power);
+	
+	float delta =  
+		GetFireDelta(currTime, planarPos + vec2(currTime * scrollSpeed, 0.0), freqMult, stretchMult, 2.5, 0.5) * (1.0 - planarPos.x)	+ 
+		GetFireDelta(currTime, vec2(planarPos.x + currTime * scrollSpeed - 1.0, planarPos.y), freqMult, stretchMult, 2.5, 0.5) * planarPos.x;
+		
+	delta *= min(1.0, max(0.0, 1.0 * (1.0 - planarPos.y)));
+	delta *= min(1.0, max(0.0, 1.0 * (0.0 + planarPos.y)));
+
+	float verticalPos = planarPos.y + delta * ampMult;	
+	verticalPos = min(0.99, verticalPos);
+	verticalPos = max(0.01, verticalPos);
+	
+	return texture2D(tex, vec2(paletteCoord, verticalPos));
+}
+
+void main(void)
+{
+	vec2 radius = gl_TexCoord[0].xy - vec2(0.5, 0.5);
+
+	radius *= ellipsoidalFactor;
+	
+	float radiusLen = length(radius);
+		
+	
+	float ringRadius = 0.3;
+	float ringWidth = 0.2;
+	
+	vec4 c;
+	if(radiusLen > ringRadius - ringWidth && radiusLen < ringRadius)
+	{
+		c = GetFireRingColor(tick / time_factor +  0.0 , radius, 6, 15.0, 1, 2, ringRadius, ringRadius - ringWidth, 0.0, 0.5);
+	}else
+	if(radiusLen < ringRadius + ringWidth && radiusLen >= ringRadius)
+	{
+		c = GetFireRingColor(tick / time_factor + 10.0 , radius, 6, 15.0, 1, 2, ringRadius, ringRadius + ringWidth, 0.0, 0.5);
+	}else
+	{
+		c = vec4(0.0, 0.0, 0.0, 0.0);
+	}
+	c.a *= gl_Color.a;
+	if (noup == 1.0) { if (gl_TexCoord[0].y < 0.5) c.a = 0.0; }
+	else if (noup == 2.0) { if (gl_TexCoord[0].y >= 0.5) c.a = 0.0; }
+		
+	gl_FragColor = c;
+}
diff --git a/game/modules/tome/data/gfx/shaders/circular_flames.lua b/game/modules/tome/data/gfx/shaders/circular_flames.lua
new file mode 100644
index 0000000000..7e6f5b5a02
--- /dev/null
+++ b/game/modules/tome/data/gfx/shaders/circular_flames.lua
@@ -0,0 +1,30 @@
+-- ToME - Tales of Maj'Eyal
+-- Copyright (C) 2009, 2010, 2011, 2012, 2013 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 {
+	frag = "circular_flames",
+	vert = nil,
+	args = {
+		tex = { texture = 0 },
+		time_factor = time_factor or 4000,
+		ellipsoidalFactor = ellipsoidalFactor or {1,1}, --1 is perfect circle, >1 is ellipsoidal
+		noup = noup or 0,
+	},
+	clone = false,
+}
diff --git a/game/modules/tome/data/talents/spells/ice.lua b/game/modules/tome/data/talents/spells/ice.lua
index be62ab0c2f..a03f0982aa 100644
--- a/game/modules/tome/data/talents/spells/ice.lua
+++ b/game/modules/tome/data/talents/spells/ice.lua
@@ -159,22 +159,24 @@ newTalent{
 	activate = function(self, t)
 		game:playSoundNear(self, "talents/ice")
 
-		local particle
-		if core.shader.active(4) then
-			particle = self:addParticles(Particles.new("shader_ring_rotating", 1, {rotation=-0.2, radius=1.1}, {type="sparks", hide_center=0, time_factor=40000, color1={0, 0, 1, 1}, color2={0, 1, 1, 1}, zoom=0.5, xy={self.x, self.y}}))
-		else
-			particle = self:addParticles(Particles.new("uttercold", 1))
-		end
-
-		return {
+		local ret = {
 			dam = self:addTemporaryValue("inc_damage", {[DamageType.COLD] = t.getColdDamageIncrease(self, t)}),
 			resist = self:addTemporaryValue("resists_pen", {[DamageType.COLD] = t.getResistPenalty(self, t)}),
 			pierce = self:addTemporaryValue("iceblock_pierce", t.getPierce(self, t)),
-			particle = particle,
 		}
+		local particle
+		if core.shader.active(4) then
+			ret.particle1 = self:addParticles(Particles.new("shader_ring_rotating", 1, {rotation=0, radius=1.1, img="coldgeneric"}, {type="circular_flames", ellipsoidalFactor={1,2}, time_factor=22000, noup=2.0}))
+			ret.particle1.toback = true
+			ret.particle2 = self:addParticles(Particles.new("shader_ring_rotating", 1, {rotation=0, radius=1.1, img="coldgeneric"}, {type="circular_flames", ellipsoidalFactor={1,2}, time_factor=22000, noup=1.0}))
+		else
+			ret.particle1 = self:addParticles(Particles.new("uttercold", 1))
+		end
+		return ret
 	end,
 	deactivate = function(self, t, p)
-		self:removeParticles(p.particle)
+		if p.particle1 then self:removeParticles(p.particle1) end
+		if p.particle2 then self:removeParticles(p.particle2) end
 		self:removeTemporaryValue("inc_damage", p.dam)
 		self:removeTemporaryValue("resists_pen", p.resist)
 		self:removeTemporaryValue("iceblock_pierce", p.pierce)
diff --git a/game/modules/tome/data/talents/spells/wildfire.lua b/game/modules/tome/data/talents/spells/wildfire.lua
index a3d00bc64e..42a6e791d1 100644
--- a/game/modules/tome/data/talents/spells/wildfire.lua
+++ b/game/modules/tome/data/talents/spells/wildfire.lua
@@ -124,7 +124,7 @@ newTalent{
 
 		local particle
 		if core.shader.active(4) then
-			particle = self:addParticles(Particles.new("shader_wings", 1, {infinite=1}))
+			particle = self:addParticles(Particles.new("shader_wings", 1, {infinite=1, x=self.wings_x, y=self.wings_y}))
 		else
 			particle = self:addParticles(Particles.new("wildfire", 1))
 		end
diff --git a/game/modules/tome/data/timed_effects/other.lua b/game/modules/tome/data/timed_effects/other.lua
index 8fa2b894cc..0e4a205d81 100644
--- a/game/modules/tome/data/timed_effects/other.lua
+++ b/game/modules/tome/data/timed_effects/other.lua
@@ -89,7 +89,13 @@ newEffect{
 		eff.sid = self:addTemporaryValue("time_prison", 1)
 		eff.tid = self:addTemporaryValue("no_timeflow", 1)
 		eff.imid = self:addTemporaryValue("status_effect_immune", 1)
-		eff.particle = self:addParticles(Particles.new("time_prison", 1))
+		if core.shader.active(4) then
+			eff.particle1 = self:addParticles(Particles.new("shader_ring_rotating", 1, {rotation=0, radius=1.1, img="arcanegeneric"}, {type="circular_flames", ellipsoidalFactor={1,2}, time_factor=3000, noup=2.0}))
+			eff.particle1.toback = true
+			eff.particle2 = self:addParticles(Particles.new("shader_ring_rotating", 1, {rotation=0, radius=1.1, img="arcanegeneric"}, {type="circular_flames", ellipsoidalFactor={1,2}, time_factor=3000, noup=1.0}))
+		else
+			eff.particle1 = self:addParticles(Particles.new("time_prison", 1))
+		end
 		self.energy.value = 0
 	end,
 	deactivate = function(self, eff)
@@ -97,7 +103,8 @@ newEffect{
 		self:removeTemporaryValue("time_prison", eff.sid)
 		self:removeTemporaryValue("no_timeflow", eff.tid)
 		self:removeTemporaryValue("status_effect_immune", eff.imid)
-		self:removeParticles(eff.particle)
+		if eff.particle1 then self:removeParticles(eff.particle1) end
+		if eff.particle2 then self:removeParticles(eff.particle2) end
 	end,
 }
 
diff --git a/game/modules/tome/data/zones/town-angolwen/npcs.lua b/game/modules/tome/data/zones/town-angolwen/npcs.lua
index 7ef16064bf..e156b501c4 100644
--- a/game/modules/tome/data/zones/town-angolwen/npcs.lua
+++ b/game/modules/tome/data/zones/town-angolwen/npcs.lua
@@ -94,6 +94,7 @@ newEntity{ define_as = "SUPREME_ARCHMAGE_LINANIIL",
 		[Talents.T_KEEN_SENSES]=5,
 		[Talents.T_PREMONITION]=5,
 	},
+	wings_x = 2, wings_y = -33,
 	resolvers.sustains_at_birth(),
 
 	can_talk = "angolwen-leader",
-- 
GitLab