Skip to content
Snippets Groups Projects
Commit 4ec0e2e6 authored by dg's avatar dg
Browse files

Wildfire talent line

git-svn-id: http://svn.net-core.org/repos/t-engine4@922 51575b47-30f0-44d4-a5cc-537603b46e54
parent 06bf905c
No related branches found
No related tags found
No related merge requests found
......@@ -91,8 +91,17 @@ function _M:setEffect(eff_id, dur, p, silent)
-- Beware, setting to 0 means removing
if dur <= 0 then return self:removeEffect(eff_id) end
-- If we already have it, we remove it and re-add it
if self:hasEffect(eff_id) then self:removeEffect(eff_id, true) end
-- If we already have it, we check if it knows how to "merge", or else we remove it and re-add it
if self:hasEffect(eff_id) then
if _M.tempeffect_def[eff_id].on_merge then
p.dur = dur
self.tmp[eff_id] = _M.tempeffect_def[eff_id].on_merge(self, self.tmp[eff_id], p)
self.changed = true
return
else
self:removeEffect(eff_id, true)
end
end
for k, e in pairs(_M.tempeffect_def[eff_id].parameters) do
if not p[k] then p[k] = e end
......
......@@ -99,6 +99,7 @@ function _M:init(t, no_default)
-- Resistances
t.resists = t.resists or {}
t.resists_pen = t.resists_pen or {}
-- % Increase damage
t.inc_damage = t.inc_damage or {}
......
......@@ -42,9 +42,12 @@ setDefaultProjector(function(src, x, y, type, dam)
-- Reduce damage with resistance
if target.resists then
local pen = (src.resists_pen.all or 0) + (src.resists_pen[type] or 0)
local res = (target.resists.all or 0) + (target.resists[type] or 0)
res = res * (100 - pen) / 100
print("[PROJECTOR] res", res, (100 - res) / 100, " on dam", dam)
if res >= 100 then dam = 0
elseif res <= 0 then dam = dam
else dam = dam * ((100 - res) / 100)
end
end
......@@ -210,12 +213,16 @@ newDamageType{
newDamageType{
name = "fireburn", type = "FIREBURN",
projector = function(src, x, y, type, dam)
DamageType:get(DamageType.FIRE).projector(src, x, y, DamageType.FIRE, dam / 2)
local dur = 3
local perc = 50
if _G.type(dam) == "table" then dam, dur, perc = dam.dam, dam.dur, (dam.initial or perc) end
local init_dam = dam * perc / 100
if init_dam > 0 then DamageType:get(DamageType.FIRE).projector(src, x, y, DamageType.FIRE, init_dam) end
local target = game.level.map(x, y, Map.ACTOR)
if target then
-- Set on fire!
dam = dam / 2
target:setEffect(target.EFF_BURNING, 3, {src=src, power=dam / 3})
dam = dam - init_dam
target:setEffect(target.EFF_BURNING, dur, {src=src, power=dam / dur})
end
end,
}
......
-- ToME - Tales of Middle-Earth
-- Copyright (C) 2009, 2010 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 ad = rng.range(0, 360)
local a = math.rad(ad)
local dir = math.rad(ad)
local r = rng.range(18, 22)
local dirchance = rng.chance(2)
return {
life = 20,
size = 4, sizev = -0.05, sizea = 0,
x = r * math.cos(a), xv = 0, xa = 0,
y = r * math.sin(a), yv = 0, ya = 0,
dir = dir, dirv = 0.1, dira = 0,
vel = dirchance and 0.2 or -0.2, velv = 0, vela = dirchance and -0.02 or 0.02,
r = rng.range(180, 250)/255, rv = rng.range(0, 10)/100, ra = 0,
g = rng.range(80, 110)/255, gv = 0.005, ga = 0.0005,
b = 0, bv = 0, ba = 0,
a = rng.range(70, 255)/255, av = 0, aa = 0,
}
end, },
function(self)
self.ps:emit(4)
end,
80
......@@ -23,7 +23,7 @@ newTalent{
require = spells_req1,
points = 5,
mana = 12,
cooldown = 3,
cooldown = 5,
tactical = {
ATTACKAREA = 10,
DEFEND = 4,
......@@ -31,14 +31,14 @@ newTalent{
range = function(self, t) return 1 + self:getTalentLevelRaw(t) end,
action = function(self, t)
local tg = {type="ball", range=0, radius=self:getTalentRange(t), friendlyfire=false, talent=t}
local grids = self:project(tg, self.x, self.y, DamageType.FIREKNOCKBACK, {dist=3, dam=self:spellCrit(self:combatTalentSpellDamage(t, 28, 150))})
game.level.map:particleEmitter(self.x, self.y, tg.radius, "ball_fire", {radius=tg.radius, grids=grids, tx=self.x, ty=self.y})
local grids = self:project(tg, self.x, self.y, DamageType.FIREKNOCKBACK, {dist=3, dam=self:spellCrit(self:combatTalentSpellDamage(t, 28, 180))})
game.level.map:particleEmitter(self.x, self.y, tg.radius, "ball_fire", {radius=tg.radius})
game:playSoundNear(self, "talents/fire")
return true
end,
info = function(self, t)
return ([[A wave of fire emanates from you, knocking back anything caught inside and setting them ablaze and doing %0.2f fire damage over 3 turns.
The damage will increase with the Magic stat]]):format(self:combatTalentSpellDamage(t, 25, 250))
The damage will increase with the Magic stat]]):format(self:combatTalentSpellDamage(t, 28, 180))
end,
}
......@@ -47,20 +47,32 @@ newTalent{
type = {"spell/wildfire",2},
require = spells_req2,
points = 5,
mana = 12,
cooldown = 3,
mana = 50,
cooldown = 16,
tactical = {
ATTACK = 10,
ATTACKAREA = 40,
},
range = 20,
reflectable = true,
action = function(self, t)
local max = math.ceil(self:getTalentLevel(t) + 2)
for i, act in ipairs(self.fov.actors_dist) do
if self:reactionToward(act) < 0 then
local tg = {type="hit", friendlyfire=false, talent=t}
local grids = self:project(tg, act.x, act.y, DamageType.FIREBURN, {dur=8, initial=0, dam=self:spellCrit(self:combatTalentSpellDamage(t, 10, 240))})
game.level.map:particleEmitter(act.x, act.y, tg.radius, "ball_fire", {radius=1})
max = max - 1
if max <= 0 then break end
end
end
game:playSoundNear(self, "talents/fire")
return true
end,
info = function(self, t)
return ([[Conjures up a bolt of fire, setting the target ablaze and doing %0.2f fire damage over 3 turns.
The damage will increase with the Magic stat]]):format(self:combatTalentSpellDamage(t, 25, 290))
return ([[Surround yourself in flames, setting all those in your line of sight ablaze and doing %0.2f fire damage over 8 turns.
At most it will affect %d foes.
The damage will increase with the Magic stat]]):format(self:combatTalentSpellDamage(t, 10, 240), math.ceil(self:getTalentLevel(t) + 2))
end,
}
......@@ -69,20 +81,42 @@ newTalent{
type = {"spell/wildfire",3},
require = spells_req3,
points = 5,
mana = 12,
cooldown = 3,
mana = 50,
cooldown = 14,
tactical = {
ATTACK = 10,
ATTACKAREA = 10,
},
range = 20,
range = 14,
reflectable = true,
action = function(self, t)
game:playSoundNear(self, "talents/fire")
local tg = {type="ball", range=self:getTalentRange(t), radius=2, friendlyfire=self:spellFriendlyFire(), talent=t}
local x, y = self:getTarget(tg)
if not x or not y then return nil end
local mult = self:combatTalentWeaponDamage(t, 0.5, 1.5)
self:project(tg, x, y, function(tx, ty)
local target = game.level.map(tx, ty, Map.ACTOR)
if not target then return end
if not target:hasEffect(target.EFF_BURNING) then return end
local p = target:hasEffect(target.EFF_BURNING)
local dam = p.dur * p.power
target:removeEffect(target.EFF_BURNING)
-- Kaboom!
dam = dam * mult
DamageType:get(DamageType.FIRE).projector(self, tx, ty, DamageType.FIRE, dam)
end)
local _ _, x, y = self:canProject(tg, x, y)
game.level.map:particleEmitter(x, y, tg.radius, "fireflash", {radius=tg.radius, tx=x, ty=y})
game:playSoundNear(self, "talents/fireflash")
return true
end,
info = function(self, t)
return ([[Conjures up a bolt of fire, setting the target ablaze and doing %0.2f fire damage over 3 turns.
The damage will increase with the Magic stat]]):format(self:combatTalentSpellDamage(t, 25, 290))
return ([[Disrupts all fires in a radius, all targets that where burning will combust, doing all the remaining burn damage instantly.
The combustion effect will deal %d%% of the normal burn damage.]]):format(self:combatTalentWeaponDamage(t, 0.5, 1.5) * 100)
end,
}
......@@ -91,19 +125,25 @@ newTalent{
type = {"spell/wildfire",4},
require = spells_req4,
points = 5,
mana = 12,
cooldown = 3,
tactical = {
ATTACK = 10,
},
range = 20,
reflectable = true,
action = function(self, t)
mode = "sustained",
sustain_mana = 80,
cooldown = 30,
activate = function(self, t)
game:playSoundNear(self, "talents/fire")
return {
dam = self:addTemporaryValue("inc_damage", {[DamageType.FIRE] = self:getTalentLevelRaw(t) * 2}),
resist = self:addTemporaryValue("resists_pen", {[DamageType.FIRE] = self:getTalentLevelRaw(t) * 10}),
particle = self:addParticles(Particles.new("wildfire", 1)),
}
end,
deactivate = function(self, t, p)
self:removeParticles(p.particle)
self:removeTemporaryValue("inc_damage", p.dam)
self:removeTemporaryValue("resists_pen", p.resist)
return true
end,
info = function(self, t)
return ([[Conjures up a bolt of fire, setting the target ablaze and doing %0.2f fire damage over 3 turns.
The damage will increase with the Magic stat]]):format(self:combatTalentSpellDamage(t, 25, 290))
return ([[Surround yourself with Wildfire, increasing all your fire damage by %d%% and ignoring %d%% fire resistance of your targets.]])
:format(self:getTalentLevelRaw(t) * 2, self:getTalentLevelRaw(t) * 10)
end,
}
......@@ -28,6 +28,15 @@ newEffect{
parameters = { power=1 },
on_gain = function(self, err) return "#Target# starts to bleed.", "+Bleeds" end,
on_lose = function(self, err) return "#Target# stops bleeding.", "-Bleeds" end,
on_merge = function(self, old_eff, new_eff)
-- Merge the flames!
local olddam = old_eff.power * old_eff.dur
local newdam = new_eff.power * new_eff.dur
local dur = math.ceil((old_eff.dur + new_eff.dur) / 2)
old_eff.dur = dur
old_eff.power = (olddam + newdam) / dur
return old_eff
end,
on_timeout = function(self, eff)
DamageType:get(DamageType.PHYSICAL).projector(eff.src or self, self.x, self.y, DamageType.PHYSICAL, eff.power)
end,
......@@ -73,6 +82,15 @@ newEffect{
parameters = { power=10 },
on_gain = function(self, err) return "#Target# is on fire!", "+Burn" end,
on_lose = function(self, err) return "#Target# stops burning.", "-Burn" end,
on_merge = function(self, old_eff, new_eff)
-- Merge the flames!
local olddam = old_eff.power * old_eff.dur
local newdam = new_eff.power * new_eff.dur
local dur = math.ceil((old_eff.dur + new_eff.dur) / 2)
old_eff.dur = dur
old_eff.power = (olddam + newdam) / dur
return old_eff
end,
on_timeout = function(self, eff)
DamageType:get(DamageType.FIRE).projector(eff.src, self.x, self.y, DamageType.FIRE, eff.power)
end,
......@@ -86,6 +104,15 @@ newEffect{
parameters = { power=10 },
on_gain = function(self, err) return "#Target# is poisoned!", "+Poison" end,
on_lose = function(self, err) return "#Target# stops being poisoned.", "-Poison" end,
on_merge = function(self, old_eff, new_eff)
-- Merge the poison
local olddam = old_eff.power * old_eff.dur
local newdam = new_eff.power * new_eff.dur
local dur = math.ceil((old_eff.dur + new_eff.dur) / 2)
old_eff.dur = dur
old_eff.power = (olddam + newdam) / dur
return old_eff
end,
on_timeout = function(self, eff)
DamageType:get(DamageType.NATURE).projector(eff.src, self.x, self.y, DamageType.NATURE, eff.power)
end,
......
No preview for this file type
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment