Code snippet from the talent that creates the dark cloud, for now I've just set the damage boost to 100% for testing:
Code: Select all
createDark = function(summoner, x, y, damage, duration)
local e = Object.new{
name = summoner.name:capitalize() .. "'s dark cloud",
canAct = false,
x = x, y = y,
damage = damage,
originalDuration = duration,
duration = duration,
summoner = summoner,
summoner_gain_exp = true,
damageIncrease = 100,
act = function(self)
local Map = require "engine.Map"
self:useEnergy()
-- apply damage to anything inside the darkness
local actor = game.level.map(self.x, self.y, Map.ACTOR)
if actor and actor ~= self.summoner and (not actor.summoner or actor.summoner ~= self.summoner) then
self.projecting = true
self.summoner.__project_source = self
self.summoner:project({type="hit", range=10, talent=self.summoner:getTalentFromId(self.summoner.T_ENSHROUD)}, actor.x, actor.y, engine.DamageType.DARKNESS, self.damage)
self.summoner.__project_source = nil
self.projecting = false
end
if self.duration <= 0 then
-- remove
if self.particles then game.level.map:removeParticleEmitter(self.particles) end
game.level.map:remove(self.x, self.y, Map.TERRAIN+3)
game.level:removeEntity(self, true)
self.darkCloud = nil
game.level.map:scheduleRedisplay()
else
self.duration = self.duration - 1
local tDarkCloud = self.summoner:getTalentFromId(self.summoner.T_ENSHROUD)
end
end,
}
e.darkCloud = e -- used for checkAllEntities to return the dark Object itself
game.level:addEntity(e)
game.level.map(x, y, Map.TERRAIN+3, e)
-- add particles
e.particles = Particles.new("creeping_dark", 1, { })
e.particles.x = x
e.particles.y = y
game.level.map:addParticleEmitter(e.particles)
end,
activate = function(self, t)
local ret = {}
self:talentTemporaryValue(ret, "combat_physcrit", t.getCrit(self, t))
self:talentTemporaryValue(ret, "combat_spellcrit", t.getCrit(self, t))
self:talentTemporaryValue(ret, "combat_apr", t.getDamageIncrease(self, t))
self:talentTemporaryValue(ret, "inc_damage", {[DamageType.DARKNESS] = t.getDamageIncrease(self, t)})
return ret
end,
deactivate = function(self, t, p)
return true
end,
callbackOnCrit = function(self, t, kind, dam, chance, target)
if not self:hasTwoHandedWeapon() then return end
if not target then return end
if self.turn_procs.enshroud then return end
self.turn_procs.enshroud = true
t.createDark(self, target.x, target.y, t.getDamage(self,t), 5)
end,
Code: Select all
class:bindHook("DamageProjector:final", function(self, data)
local target = game.level.map(data.x, data.y, Map.ACTOR)
local source_talent = data.src.__projecting_for and data.src.__projecting_for.project_type and (data.src.__projecting_for.project_type.talent_id or data.src.__projecting_for.project_type.talent) and data.src.getTalentFromId and data.src:getTalentFromId(data.src.__projecting_for.project_type.talent or data.src.__projecting_for.project_type.talent_id)
if not target then return end
...
if data.src and data.src ~= target and game.level.map:checkAllEntities(x, y, "darkCloud") then
local dark = game.level.map:checkAllEntities(x, y, "darkCloud")
if dark.summoner == data.src and dark.damageIncrease > 0 then
local source = data.src.__project_source or data.src
inc = inc + dark.damageIncrease
data.dam = data.dam + (data.dam * inc / 100)
end
end
return data
end)