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