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