Skip to content
Snippets Groups Projects
Commit a91bfb49 authored by DarkGod's avatar DarkGod
Browse files

Cleansing Flames is now an active that sets yourself on fire to activate the...

Cleansing Flames is now an active that sets yourself on fire to activate the cleansing flames efefcts for yourself and all burning wake/inferno damage as before. This makes it work with Spellcraft
parent 5fc4895b
No related branches found
No related tags found
No related merge requests found
Pipeline #
......@@ -1164,7 +1164,7 @@ function _M:handleEffect(player, eff_id, e, p, x, y, hs, bx, by, is_first, scale
txt.fw, txt.fh = font:size(dur)
end
if e.charges then
local font = e.decrease > 0 or e.charges_smallfont and self.buff_font_smallmed or self.buff_font
local font = (e.decrease > 0 or e.charges_smallfont) and self.buff_font_smallmed or self.buff_font
txt2 = font:draw(charges, 40, colors.WHITE.r, colors.WHITE.g, colors.WHITE.b, true)[1]
txt2.fw, txt2.fh = font:size(charges)
......
-- ToME - Tales of Maj'Eyal
-- Copyright (C) 2009 - 2019 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
MAKE ME!
newTalent{
name = "Illuminate", short_name = "ILLUMINATE2",
type = {"spell/phantasm2",1},
require = spells_req1,
random_ego = "utility",
points = 5,
mana = 5,
cooldown = 14,
range = 0,
radius = function(self, t) return math.floor(self:combatTalentScale(t, 6, 10)) end,
tactical = { DISABLE = function(self, t, aitarget)
if self:getTalentLevel(t) >= 3 and not aitarget:attr("blind") then
return 2
end
return 0
end,
ATTACKAREA = 2,
},
getDamage = function(self, t) return self:combatTalentSpellDamage(t, 28, 210) end,
getBlindPower = function(self, t) if self:getTalentLevel(t) >= 5 then return 4 else return 3 end end,
requires_target = true,
target = function(self, t) return {type="ball", range=self:getTalentRange(t), selffire=false, radius=self:getTalentRadius(t), talent=t} end,
action = function(self, t)
local tg = self:getTalentTarget(t)
game.level.map:particleEmitter(self.x, self.y, tg.radius, "sunburst", {radius=tg.radius, grids=grids, tx=self.x, ty=self.y, max_alpha=80})
if self:getTalentLevel(t) >= 3 then
self:project(tg, self.x, self.y, DamageType.BLIND, t.getBlindPower(self, t))
end
self:project(tg, self.x, self.y, DamageType.LIGHT, self:spellCrit(t.getDamage(self, t)))
tg.selffire = true
self:project(tg, self.x, self.y, DamageType.LITE, 1)
game:playSoundNear(self, "talents/heal")
return true
end,
info = function(self, t)
local radius = self:getTalentRadius(t)
local turn = t.getBlindPower(self, t)
local dam = t.getDamage(self, t)
return ([[Creates a globe of pure light within a radius of %d that illuminates the area and deals %0.2f light damage.
At level 3, it also blinds all who see it (except the caster) for %d turns.]]):
format(radius, damDesc(self, DamageType.LIGHT, dam), turn)
end,
}
newTalent{
name = "Phantasmal Shield", short_name = "PHANTASMAL_SHIELD2",
type = {"spell/phantasm2", 2},
mode = "sustained",
require = spells_req2,
points = 5,
sustain_mana = 30,
cooldown = 10,
tactical = { BUFF = 2 },
getDefense = function(self, t) return self:combatScale(self:getTalentLevel(t)*self:combatSpellpower(), 0, 0, 28.6, 267, 0.75) end,
activate = function(self, t)
game:playSoundNear(self, "talents/heal")
return {
particle = self:addParticles(Particles.new("phantasm_shield", 1)),
def = self:addTemporaryValue("combat_def", t.getDefense(self, t)),
}
end,
deactivate = function(self, t, p)
self:removeParticles(p.particle)
self:removeTemporaryValue("combat_def", p.def)
return true
end,
info = function(self, t)
local defence = t.getDefense(self, t)
return ([[The caster's image blurs, granting a %d bonus to Defense.
The bonus will increase with your Spellpower.]]):
format(defence)
end,
}
newTalent{
name = "Invisibility", short_name = "INVISIBILITY2",
type = {"spell/phantasm2", 3},
mode = "sustained",
require = spells_req3,
points = 5,
sustain_mana = 20,
cooldown = 10,
tactical = { BUFF = 2 },
getDamage = function(self, t) return self:combatTalentSpellDamage(t, 1, 80) end,
activate = function(self, t)
game:playSoundNear(self, "talents/heal")
return {
particle = self:addParticles(Particles.new("phantasm_shield", 1)),
onhit = self:addTemporaryValue("on_melee_hit", {[DamageType.LIGHT]=t.getDamage(self, t)}),
evasion = self:addTemporaryValue("evasion", 10),
}
end,
deactivate = function(self, t, p)
self:removeParticles(p.particle)
self:removeTemporaryValue("on_melee_hit", p.onhit)
self:removeTemporaryValue("evasion", p.evasion)
return true
end,
info = function(self, t)
local damage = t.getDamage(self, t)
return ([[The caster is surrounded by a phantasmal shield granting 10%% chance to evade weapon attacks. If hit in melee, the shield will deal %d light damage to the attacker.
The damage will increase with your Spellpower.]]):
format(damDesc(self, DamageType.LIGHT, damage))
end,
}
newTalent{
name = "Elemental Mirage",
type = {"spell/phantasm2", 4},
mode = "sustained",
require = spells_req4,
points = 5,
sustain_mana = 150,
cooldown = 30,
tactical = { ESCAPE = 2, DEFEND = 2 },
getInvisibilityPower = function(self, t) return self:combatTalentSpellDamage(t, 10, 50) end,
activate = function(self, t)
game:playSoundNear(self, "talents/heal")
local ret = {
invisible = self:addTemporaryValue("invisible", t.getInvisibilityPower(self, t)),
invisible_damage_penalty = self:addTemporaryValue("invisible_damage_penalty", 0.7),
drain = self:addTemporaryValue("mana_regen", -2),
}
if not self.shader then
ret.set_shader = true
self.shader = "invis_edge"
self:removeAllMOs()
game.level.map:updateMap(self.x, self.y)
end
self:resetCanSeeCacheOf()
return ret
end,
deactivate = function(self, t, p)
if p.set_shader then
self.shader = nil
self:removeAllMOs()
game.level.map:updateMap(self.x, self.y)
end
self:removeTemporaryValue("invisible", p.invisible)
self:removeTemporaryValue("invisible_damage_penalty", p.invisible_damage_penalty)
self:removeTemporaryValue("mana_regen", p.drain)
self:resetCanSeeCacheOf()
return true
end,
info = function(self, t)
local invisi = t.getInvisibilityPower(self, t)
return ([[The caster fades from sight, granting %d bonus to invisibility.
Beware -- you should take off your light, or you will still be easily spotted.
As you become invisible, you fade out of phase with reality. All your damage is reduced by 70%%.
This powerful spell constantly drains your mana (2 per turn) while active.
The invisibility bonus will increase with your Spellpower.]]):
format(invisi)
end,
}
......@@ -99,13 +99,46 @@ newTalent{
name = "Cleansing Flames",
type = {"spell/wildfire",3},
require = spells_req_high3,
mode = "passive",
mana = 20,
cooldown = 20,
tactical = { CURE = function(self, t, aitarget)
local nb = 0
for eff_id, p in pairs(self.tmp) do
local e = self.tempeffect_def[eff_id]
if e.type == "magical" and e.status == "detrimental" then nb = nb + 1 end
end
return nb
end,
DISABLE = function(self, t, aitarget)
local nb = 0
for eff_id, p in pairs(aitarget.tmp) do
local e = self.tempeffect_def[eff_id]
if e.type == "magical" and e.status == "beneficial" then nb = nb + 1 end
end
for tid, act in pairs(aitarget.sustain_talents) do
if act then
local talent = aitarget:getTalentFromId(tid)
if talent.is_spell then nb = nb + 1 end
end
end
return nb^0.5
end},
points = 5,
getDamage = function(self, t) return self:combatTalentSpellDamage(t, 10, 55) end,
getDur = function(self, t) return math.ceil(self:combatTalentScale(t, 6, 15)) end,
getChance = function(self, t) return self:getTalentLevelRaw(t) * 10 end,
on_pre_use = function(self, t) return game.level and self.x and game.level.map:hasEffectType(self.x, self.y, DamageType.INFERNO) end,
action = function(self, t)
self:setEffect(self.EFF_CLEANSING_FLAMES, t:_getDur(self), {chance=t:_getChance(self)})
end,
info = function(self, t)
return ([[When your Burning Wake talent is active, your Inferno and Burning Wake effects have a %d%% chance, each turn, to remove a status effect (physical or magical) from the targets.
local damage = t.getDamage(self, t)
return ([[When you stand in your Burning Wake or Inferno ground effect, you can self immolate to trigger Cleansing Flames for %d turns.
While the effect lasts you will take %0.2f fire damage per turn.
Each turn there is a %d%% chance for any creature taking damage from Burning Wake, Inferno or Cleansing Flames to remove a status effect (physical or magical).
If the target is hostile, it will remove a beneficial effect.
If the target is friendly, it will remove a detrimental effect (but still burn).]]):tformat(t.getChance(self, t))
If the target is friendly, it will remove a detrimental effect.]]):
tformat(t:_getDur(self), damDesc(self, DamageType.FIRE, damage), t.getChance(self, t))
end,
}
......
......@@ -5247,3 +5247,22 @@ newEffect{
end
end,
}
newEffect{
name = "CLEANSING_FLAMES", image = "talents/cleansing_flames.png",
desc = _t"Cleansing Flames",
long_desc = function(self, eff) return ("The target is on fire, taking %0.2f fire damage per turn and %d%% chance per turn of removing a physical or magical effect from all targets affected by Inferno, Burning Wake or Cleansing Flames."):tformat(eff.power, eff.chance) end,
charges = function(self, eff) return (math.floor(eff.power)) end,
type = "magical",
subtype = { fire=true, cleanse=true },
status = "beneficial",
parameters = { power=10 },
on_gain = function(self, err) return _t"#Target# bathes in cleansing flames!", true end,
on_lose = function(self, err) return _t"#Target# stops burning.", true end,
activate = function(self, eff)
self:effectTemporaryValue(eff, "cleansing_flames", eff.chance)
end,
on_timeout = function(self, eff)
DamageType:get(DamageType.FIRE).projector(self, self.x, self.y, DamageType.FIRE, eff.power)
end,
}
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